Suggestions
BetaWe just launched Apps: hosted models, actions and pages, on the same bill as your inference.Read the Apps docs

Get a suggestion

POSThttps://api.inferencebureau.com/v1/suggest

Pre-flight confirmation for mixed-model sessions. Send the turn you are about to send; get back the least expensive pool model that meets the project's quality floor for it, with a token. Send the turn with ib.suggestion set to that token to run it on the suggested model, or without it to stay on the requested model.

Body

application/json
  • modelstringrequired

    The model you would request for this turn. Suggestions are issued against it, and the turn must request the same model to use the token.

  • messagesarrayrequired

    The turn exactly as you will send it. A Messages body (with system or Anthropic content blocks, or an anthropic-version header) is read as a Messages turn, and only suggests models that endpoint serves.

  • input, instructionsstring | arrayoptional

    Instead of messages, for a Responses turn: the body you will send to /v1/responses. It is read as a Responses turn, and only suggests models that endpoint serves. max_output_tokens is used for the estimate.

  • toolsarrayoptional

    Sent so only models that support tools are suggested.

  • response_formatobjectoptional

    Sent so only models that support structured output are suggested.

  • max_tokensintegeroptional

    Used for the cost estimate. max_completion_tokens is accepted too.

  • userstringoptional

    Your end user, as on the turn (metadata.user_id in a Messages body). Recorded on the classifier call for attribution and per-end-user Directives, and not forwarded.

  • ibobjectoptional

    session groups the call with its conversation. task skips the classifier and is not charged. tags tags the classifier call, as on the turn. See the ib object.

Response

  • suggestionstring | nullrequired

    The token to send as ib.suggestion. null when no cheaper model fits; then send the turn as usual.

  • modelstringrequired

    The model the turn would run on: the suggested one, or the requested one when there is no suggestion.

  • taskClassstring | nullrequired

    One of extraction, summarization, rewriting, translation, general_qa, coding, complex_reasoning, unknown.

  • confidencenumber | nullrequired

    Classifier confidence, 0 to 1.

  • reasonstring | nullrequired

    Why this was or wasn't suggested, e.g. cheapest_passing, no_passing_model, low_confidence. See reasons.

  • estimateobjectrequired

    Estimated USD for the turn on the requested model (baselineUsd) and on the suggested one (suggestedUsd), and the classifier charge (classifierUsd). Estimates use a typical reply length.

  • expiresIninteger | nullrequired

    Seconds until the token expires. Pre-flight tokens last 2 minutes.

  • requestIdstringoptional

    The receipt for the classifier call, in Logs. Absent when no call was made.

Headers

  • Authorizationstringrequired

    Bearer ib_live_… for a key set to Suggest under mixed-model sessions.

  • ib-sessionstringoptional

    Same as ib.session.

  • ib-userstringoptional

    Your end user, up to 256 characters; wins over the body's. See End users and tags.

  • ib-tagsstringoptional

    Comma-separated tags, such as inference-bureau-search, at most ten with ib.tags. Never sent upstream.

When it's available

The key must be set to Suggest, and the project must use Pre-flight confirmation. Otherwise:

  • 403 policy_denied when the key is Off or in Shadow.
  • 400 invalid_request when the project confirms inline. Read the suggestion from the chat response instead.

Billing

Each call that reaches the classifier is its own request, billed at Jev's input-token price plus the platform fee, with a receipt. No charge when a tool cycle is open (the response says tool_cycle_open and carries ib-pinned: tool_cycle), when you send ib.task, or when nothing can be sent to the classifier. The classifier call counts against your Directives like any request: per-end-user limits and budgets for the end user it names, and tag budgets for its tags. endUser.required refuses a call that names no end user.

Calls have 3 seconds, including one retry if the classifier is at capacity. A timeout returns no suggestion rather than an error, so the turn can go ahead on the requested model.