> ## Documentation Index
> Fetch the complete documentation index at: https://docs.getbifrost.ai/llms.txt
> Use this file to discover all available pages before exploring further.

# Evaluate a decision (OpenAI format)

> OpenAI's Decisions API: asks an ordered list of questions about an input
and returns one answer per question, in order. Any decision model can
answer: OpenAI's decisions models such as `gpt-6-luna`, Typesafe's jev
models, or any chat model through structured output. The request is
OpenAI's: a top-level `state` and a field a question, choice, or level
does not define (such as `criteria`) are rejected rather than
translated, while other top-level fields are forwarded unchanged.
Answers come back in OpenAI's response shape, with `name: null` for a
question sent without a name, plus Bifrost's `extra_fields` as on the
other OpenAI routes; when raw responses are enabled and OpenAI served
the request, OpenAI's own response body is returned instead.

**Note:** This endpoint also works without the `/v1` prefix (e.g., `/openai/decisions`).




## OpenAPI

````yaml /openapi/openapi.json post /openai/v1/decisions
openapi: 3.1.0
info:
  title: Bifrost API
  description: >
    Bifrost HTTP Transport API for AI model inference and gateway management.


    This API provides a unified interface for interacting with multiple AI
    providers

    including OpenAI, Anthropic, Bedrock, Gemini, and more through a single API,

    along with comprehensive management APIs for configuring and monitoring the
    gateway.


    ## API Structure


    ### Unified Inference API (`/v1/*`)

    The primary API using Bifrost's unified format. Model parameters use the
    format

    `provider/model` (e.g., `openai/gpt-4`, `anthropic/claude-3-opus`).


    ### Async Inference API (`/v1/async/*`)

    Submit inference requests for asynchronous execution. Returns a job ID
    immediately

    and allows polling for results. Supports all inference types except batches,
    files,

    and containers.


    ### Provider Integration APIs

    Native provider-format APIs for drop-in compatibility:

    - `/openai/*` - OpenAI-compatible API

    - `/anthropic/*` - Anthropic-compatible API

    - `/genai/*` - Google GenAI (Gemini) compatible API

    - `/bedrock/*` - AWS Bedrock compatible API

    - `/cohere/*` - Cohere compatible API


    ### Framework Integration APIs

    Multi-provider proxy endpoints for AI frameworks:

    - `/litellm/*` - LiteLLM proxy with all provider formats

    - `/langchain/*` - LangChain compatible endpoints

    - `/pydanticai/*` - PydanticAI compatible endpoints


    ### Management APIs (`/api/*`)

    APIs for managing and monitoring the Bifrost gateway:

    - `/api/config` - Configuration management

    - `/api/providers` - Provider and API key management

    - `/api/plugins` - Plugin management

    - `/api/governance/*` - Virtual keys, teams, customers, budgets, rate
    limits, routing rules, and pricing overrides

    - `/api/logs` - Log search and analytics

    - `/api/mcp/*` - MCP (Model Context Protocol) client management

    - `/api/session/*` - Authentication and session management

    - `/api/cache/*` - Cache management

    - `/health` - Health check endpoint


    ## Fallbacks

    Requests can include fallback models that will be tried if the primary model
    fails.
  version: 1.0.0
  contact:
    name: Contact Us
    url: https://getmaxim.ai/bifrost
  license:
    name: Apache 2.0
    url: https://opensource.org/licenses/Apache-2.0
servers:
  - url: '{baseUrl}'
    description: Your Bifrost instance
    variables:
      baseUrl:
        default: http://localhost:8080
        description: >-
          Base URL of your Bifrost instance (e.g. https://bifrost.mycompany.com,
          or https://mycompany.com/bifrost when served under server.base_path)
security:
  - BearerAuth: []
  - BasicAuth: []
  - ApiKeyAuth: []
tags:
  - name: Agent Gateway
    description: >-
      Agent registrations, A2A protocol calls, push callbacks, and operation
      history
  - name: Models
    description: Model listing and information
  - name: Chat Completions
    description: Chat-based text generation
  - name: Text Completions
    description: Text completion generation
  - name: Responses
    description: OpenAI Responses API compatible endpoints
  - name: OCR
    description: Optical character recognition for documents and images
  - name: Rerank
    description: Document reranking by relevance to a query
  - name: Decisions
    description: Structured decisions evaluated against annotated function-tool definitions
  - name: Embeddings
    description: Text embedding generation
  - name: Images
    description: Image generations, editing, and variations
  - name: Videos
    description: Video generation and management
  - name: Audio
    description: Speech synthesis and transcription
  - name: Count Tokens
    description: Token counting utilities
  - name: Batch
    description: Batch processing operations
  - name: Files
    description: File management operations
  - name: Containers
    description: Container management operations
  - name: Async Jobs
    description: Asynchronous job submission and retrieval endpoints
  - name: Realtime
    description: Realtime WebSocket and WebRTC endpoints
  - name: OpenAI Integration
    description: OpenAI-compatible API endpoints (/openai/*)
  - name: Azure Integration
    description: Azure OpenAI integration endpoints
  - name: Anthropic Integration
    description: Anthropic-compatible API endpoints (/anthropic/*)
  - name: GenAI Integration
    description: Google GenAI (Gemini) compatible API endpoints (/genai/*)
  - name: Bedrock Integration
    description: AWS Bedrock compatible API endpoints (/bedrock/*)
  - name: Cohere Integration
    description: Cohere compatible API endpoints (/cohere/*)
  - name: Typesafe Integration
    description: Typesafe compatible API endpoints (/typesafe/*)
  - name: LiteLLM Integration
    description: LiteLLM proxy endpoints with multi-provider support (/litellm/*)
  - name: LangChain Integration
    description: LangChain compatible endpoints with multi-provider support (/langchain/*)
  - name: PydanticAI Integration
    description: >-
      PydanticAI compatible endpoints with multi-provider support
      (/pydanticai/*)
  - name: Health
    description: Health check endpoints
  - name: Configuration
    description: Configuration management endpoints
  - name: Session
    description: Session and authentication endpoints
  - name: Providers
    description: Provider management endpoints
  - name: Plugins
    description: Plugin management endpoints
  - name: MCP
    description: Model Context Protocol endpoints
  - name: Governance
    description: Virtual keys, teams, and customers management
  - name: Routing
    description: Routing rules and complexity analyzer configuration
  - name: Logging
    description: Log search and management endpoints
  - name: Cache
    description: Cache management endpoints
  - name: Vault
    description: Vault secret management endpoints
  - name: Skills
    description: Skills Repository management, marketplace, and download endpoints
  - name: Audit Logs
    description: >-
      CADF-compliant audit log search, export, and signature verification
      endpoints
  - name: Webhooks
    description: Webhook endpoint management and signed async-job delivery history
  - name: Notifications
    description: >-
      Role-targeted dashboard notifications, delivered over the dashboard
      WebSocket
  - name: News Feeds
    description: >-
      RSS and Atom news sources shown in the News tab of the dashboard
      notification tray
  - name: Background Jobs
    description: >-
      Status, progress and cancellation of durable background jobs (cost
      recalculation, Warp log indexing, and others)
  - name: Warp
    description: >-
      Configuration for Warp, the dashboard agent that answers questions about
      the deployment's own telemetry
  - name: Relays
    description: >-
      Relays to non-LLM HTTP APIs - endpoint management, usage preview, Relay
      Logs and the /relay data plane
paths:
  /openai/v1/decisions:
    post:
      tags:
        - OpenAI Integration
      summary: Evaluate a decision (OpenAI format)
      description: >
        OpenAI's Decisions API: asks an ordered list of questions about an input

        and returns one answer per question, in order. Any decision model can

        answer: OpenAI's decisions models such as `gpt-6-luna`, Typesafe's jev

        models, or any chat model through structured output. The request is

        OpenAI's: a top-level `state` and a field a question, choice, or level

        does not define (such as `criteria`) are rejected rather than

        translated, while other top-level fields are forwarded unchanged.

        Answers come back in OpenAI's response shape, with `name: null` for a

        question sent without a name, plus Bifrost's `extra_fields` as on the

        other OpenAI routes; when raw responses are enabled and OpenAI served

        the request, OpenAI's own response body is returned instead.


        **Note:** This endpoint also works without the `/v1` prefix (e.g.,
        `/openai/decisions`).
      operationId: openaiCreateDecision
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/OpenAIDecisionRequest'
      responses:
        '200':
          description: Successful response
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/OpenAIDecisionResponse'
        '400':
          description: Bad request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/BifrostError'
        '500':
          description: Internal server error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/BifrostError'
      security:
        - BearerAuth: []
        - VirtualKeyAuth: []
        - ApiKeyAuth: []
components:
  schemas:
    OpenAIDecisionRequest:
      type: object
      description: >-
        OpenAI's Decisions request. A field OpenAI's question, choice, or level
        does not define (such as Typesafe's `criteria`), instructions that are
        neither a string nor a list of parts, a top-level `state`, and a
        structured or null `input` are rejected with a 400; any other top-level
        field is forwarded to the provider unchanged, so a field a newer SDK
        sends still reaches it.
      required:
        - model
        - input
        - questions
      properties:
        model:
          type: string
          description: >-
            Model in provider/model format; a model without a provider prefix is
            OpenAI's
          example: gpt-6-luna
        input:
          description: >-
            A string of text, or a conversation of messages (with text, JSON,
            and image parts), function and custom tool calls, and their outputs
          oneOf:
            - type: string
            - type: array
              items:
                $ref: '#/components/schemas/DecisionInputItem'
        questions:
          type: array
          minItems: 1
          description: Questions in the order asked. Answers follow the same order.
          items:
            $ref: '#/components/schemas/OpenAIDecisionQuestion'
        safety_identifier:
          type:
            - string
            - 'null'
          description: Stable end-user identifier, forwarded to OpenAI
        prompt_cache_key:
          type:
            - string
            - 'null'
          description: >-
            Partitions prompt-cache reuse by a caller-chosen key, forwarded to
            OpenAI
        prompt_cache_options:
          $ref: '#/components/schemas/DecisionPromptCacheOptions'
        fallbacks:
          type: array
          items:
            type: string
          description: >-
            Bifrost fallback models in provider/model format; never sent
            upstream
    OpenAIDecisionResponse:
      type: object
      description: >-
        OpenAI's Decision object, plus Bifrost's extra_fields as on the other
        OpenAI routes. Every model's answers are returned in this shape, and it
        carries no id. When raw responses are enabled and OpenAI served the
        request, OpenAI's own response body is returned instead, as on the other
        OpenAI routes.
      required:
        - model
        - answers
      properties:
        model:
          type: string
          description: Model that performed the decision
        answers:
          type: array
          description: One answer per question, in question order
          items:
            $ref: '#/components/schemas/DecisionAnswer'
        usage:
          type: object
          properties:
            input_tokens:
              type: integer
            input_tokens_details:
              type: object
              description: Present when the provider reports it
              properties:
                cached_tokens:
                  type: integer
                cache_write_tokens:
                  type: integer
            output_tokens:
              type: integer
            output_tokens_details:
              type: object
              description: Present when the provider reports it
              properties:
                reasoning_tokens:
                  type: integer
            total_tokens:
              type: integer
            state_tokens:
              type: integer
              description: Laya only
            state_tokens_dropped:
              type: integer
              description: Laya only
            truncated:
              type: boolean
              description: Laya only
            truncated_questions:
              type: array
              items:
                type: string
              description: Laya only
        routing:
          type: object
          description: >-
            Laya only. The checkpoint that answered and why, passed through
            untouched
        extra_fields:
          $ref: '#/components/schemas/BifrostResponseExtraFields'
          description: >-
            Bifrost's response metadata (provider, latency, routing info, and
            the raw provider body when raw responses are on), as on the other
            OpenAI routes
    BifrostError:
      type: object
      description: Error response from Bifrost
      properties:
        event_id:
          type: string
        type:
          type: string
        is_bifrost_error:
          type: boolean
        status_code:
          type: integer
        error:
          $ref: '#/components/schemas/ErrorField'
        extra_fields:
          $ref: '#/components/schemas/BifrostErrorExtraFields'
    DecisionInputItem:
      description: One item of a conversation input
      oneOf:
        - $ref: '#/components/schemas/DecisionInputMessage'
        - $ref: '#/components/schemas/DecisionFunctionCall'
        - $ref: '#/components/schemas/DecisionFunctionCallOutput'
        - $ref: '#/components/schemas/DecisionCustomToolCall'
        - $ref: '#/components/schemas/DecisionCustomToolCallOutput'
    OpenAIDecisionQuestion:
      type: object
      additionalProperties: false
      required:
        - type
        - instructions
      properties:
        type:
          type: string
          enum:
            - predicate
            - choice
            - score
        name:
          type: string
        instructions:
          description: >-
            A string, or a list of text, image, and JSON parts that give the
            question its own images
          oneOf:
            - type: string
            - type: array
              minItems: 1
              items:
                $ref: '#/components/schemas/DecisionInstructionPart'
        choices:
          type: array
          description: Choice only
          items:
            type: object
            additionalProperties: false
            required:
              - value
            properties:
              value:
                oneOf:
                  - type: string
                  - type: boolean
              description:
                type: string
        levels:
          type: array
          description: Score only, in order
          items:
            type: object
            additionalProperties: false
            required:
              - label
            properties:
              label:
                type: string
              description:
                type: string
    DecisionPromptCacheOptions:
      type: object
      description: Prompt-caching options, forwarded to OpenAI; other providers drop them.
      properties:
        mode:
          type: string
          enum:
            - implicit
            - explicit
          description: >-
            `implicit` (the default) adds a breakpoint at the end of the shared
            input; `explicit` uses only the parts marked with
            `prompt_cache_breakpoint`
        ttl:
          type: string
          enum:
            - 30m
          description: Minimum lifetime of every breakpoint the request writes
    DecisionAnswer:
      type: object
      required:
        - type
      properties:
        type:
          type: string
          description: The question's type, or `refusal` when the model declined to answer
          example: choice
        name:
          type:
            - string
            - 'null'
          description: >-
            The question's name, when it had one. OpenAI sends null for an
            unnamed question
        probability:
          type: number
          description: Predicate answers. Probability in [0,1] that the condition is true
        choice:
          description: Choice answers. The chosen value
          oneOf:
            - type: string
            - type: boolean
        score:
          type: number
          description: Score answers. Probability-weighted level index
        box:
          type: object
          description: >-
            Box answers. Each edge is a fraction from 0 to 1 of the image's
            height (`top`, `bottom`) or width (`left`, `right`), measured from
            its top-left
          required:
            - top
            - bottom
            - left
            - right
          properties:
            top:
              type: number
            bottom:
              type: number
            left:
              type: number
            right:
              type: number
        probabilities:
          type: array
          description: >-
            Distribution over choices or levels, in question order, when
            supplied
          items:
            type: object
            properties:
              value:
                description: The choice value, or the level index
                oneOf:
                  - type: string
                  - type: boolean
                  - type: number
              label:
                type: string
                description: Score answers. The level's label
              probability:
                type: number
        confidence:
          type: number
          description: Model confidence for this answer, when supplied
        legend:
          type: object
          additionalProperties: {}
          description: Score answers. Level index to description, when supplied
        answer_confidence:
          type: number
          description: Laya only. Calibrated probability of the reported answer
        action:
          type: object
          description: Laya only. Action head output, passed through untouched
        abstention:
          type: string
          enum:
            - passed
            - abstained
            - unevaluated
          description: Laya only, when `min_confidence` is set
        abstention_threshold:
          type: number
          description: Laya only, when `min_confidence` is set
        low_confidence:
          type: boolean
          description: Laya only, when `min_confidence` is set
    BifrostResponseExtraFields:
      type: object
      description: Additional fields included in responses
      properties:
        request_type:
          type: string
          description: Type of request that was made
        pricing_request_type:
          type: string
          description: Request type used for pricing, when it differs from request_type
        routing_info:
          $ref: '#/components/schemas/RoutingInfo'
        provider:
          $ref: '#/components/schemas/ModelProvider'
          deprecated: true
          description: 'Deprecated: use routing_info.provider.'
        original_model_requested:
          type: string
          deprecated: true
          description: >-
            Deprecated: use routing_info.primary_model when
            routing_info.is_fallback is true, otherwise routing_info.model. For
            the model the caller asked for, read routing_info.requested_model.
        resolved_model_used:
          type: string
          deprecated: true
          description: >-
            Deprecated: use routing_info.resolved_key_alias.model_id when an
            alias matched, otherwise routing_info.model.
        latency:
          type: integer
          format: int64
          description: >-
            Request latency in milliseconds. On a stream each chunk carries its
            own latency and the last chunk the total.
        upstream_latency:
          type: integer
          format: int64
          description: >-
            Milliseconds spent waiting on the provider, summed over every
            attempt, retry and fallback. Absent when unknown.
        chunk_index:
          type: integer
          description: Index of the chunk for streaming responses, 0 otherwise
        raw_request:
          description: Raw provider request, when raw request capture is enabled
        raw_response:
          description: Raw provider response, when raw response capture is enabled
        cache_debug:
          $ref: '#/components/schemas/BifrostCacheDebug'
        routing_metadata:
          type: object
          description: >-
            Billable internal calls the routing plugin made while classifying
            the request's complexity
          properties:
            calls:
              type: array
              items:
                type: object
                properties:
                  request_type:
                    type: string
                  provider_used:
                    type: string
                  model_used:
                    type: string
                  input_tokens:
                    type: integer
                  output_tokens:
                    type: integer
                  count_toward_budgets:
                    type: boolean
        guardrail_debug:
          $ref: '#/components/schemas/BifrostGuardrailMetadata'
        parse_errors:
          type: array
          description: Errors hit while parsing JSONL batch results
          items:
            type: object
            properties:
              code:
                type: string
              message:
                type: string
              param:
                type: string
              line:
                type: integer
        converted_request_type:
          type: string
        dropped_compat_plugin_params:
          type: array
          description: >-
            Parameters the compat plugin dropped because the model does not
            support them
          items:
            type: string
        dropped_unsupported_tools:
          type: array
          description: Tool types removed because the target model does not support them
          items:
            type: string
        provider_response_headers:
          type: object
          description: >-
            The provider's HTTP response headers, without transport-level
            headers
          additionalProperties:
            type: string
        passthrough_path:
          type: string
          description: Provider path of a passthrough request
    ErrorField:
      type: object
      properties:
        type:
          type: string
        code:
          type: string
        message:
          type: string
        param:
          type: string
        event_id:
          type: string
    BifrostErrorExtraFields:
      type: object
      properties:
        routing_info:
          $ref: '#/components/schemas/RoutingInfo'
        provider:
          $ref: '#/components/schemas/ModelProvider'
          deprecated: true
          description: 'Deprecated: use routing_info.provider.'
        original_model_requested:
          type: string
          deprecated: true
          description: >-
            Deprecated: use routing_info.primary_model when
            routing_info.is_fallback is true, otherwise routing_info.model. For
            the model the caller asked for, read routing_info.requested_model.
        resolved_model_used:
          type: string
          deprecated: true
          description: >-
            Deprecated: use routing_info.resolved_key_alias.model_id when an
            alias matched, otherwise routing_info.model.
        request_type:
          type: string
        mcp_request_type:
          type: string
        a2a_request_type:
          type: string
          description: Agent Gateway operation, for A2A errors
        a2a_agent_name:
          type: string
        error_type:
          type: string
          description: >-
            Normalized, low-cardinality classification of why the request
            failed, declared by whichever component refused it. Prefixed by
            fault domain (caller_, policy_, provider_, bifrost_). Absent on
            failures that were not classified at source.
        retry_after_ms:
          type: integer
          format: int64
          minimum: 1000
          maximum: 300000
          description: >-
            The provider's hint for how long to wait before retrying, in
            milliseconds, read from its retry-after-ms or Retry-After header or
            its google.rpc.RetryInfo error detail, and clamped to between 1000
            and 300000. Absent when the provider gave no explicit hint.
        raw_request:
          description: Raw provider request, when raw request capture is enabled
        raw_response:
          description: Raw provider response, when raw response capture is enabled
        converted_request_type:
          type: string
        dropped_compat_plugin_params:
          type: array
          items:
            type: string
        latency:
          type: integer
          format: int64
          description: Latency in milliseconds
        key_statuses:
          type: array
          description: >-
            Per-key results, for requests that ran on every key such as listing
            models
          items:
            type: object
            properties:
              key_id:
                type: string
              status:
                type: string
                enum:
                  - success
                  - list_models_failed
              provider:
                $ref: '#/components/schemas/ModelProvider'
              error:
                $ref: '#/components/schemas/BifrostError'
        mcp_auth_required:
          type: object
          description: >-
            Set when a per-user MCP tool needs the caller to complete an inline
            auth flow
          properties:
            kind:
              type: string
            mcp_client_id:
              type: string
            mcp_client_name:
              type: string
            message:
              type: string
            authorize_url:
              type: string
            session_id:
              type: string
            subject_token_missing:
              type: boolean
              description: >-
                token_exchange only. True when there was nothing to exchange,
                including when the caller's Bifrost sign-in has expired; message
                says which
            exchange_error:
              type: string
              description: >-
                token_exchange only. The identity provider's error code and
                description when it refused the exchange
        billed_usage:
          $ref: '#/components/schemas/BifrostLLMUsage'
          description: >-
            Usage the provider reported and billed even though the request
            failed
    DecisionInputMessage:
      type: object
      required:
        - role
        - content
      properties:
        type:
          type: string
          enum:
            - message
          description: Optional item type, as OpenAI's SDKs send it
        role:
          type: string
          example: user
        content:
          description: Text, or an array of parts
          oneOf:
            - type: string
            - type: array
              items:
                $ref: '#/components/schemas/DecisionInputPart'
        phase:
          type: string
          enum:
            - commentary
            - final_answer
          description: An assistant message's phase
    DecisionFunctionCall:
      type: object
      required:
        - type
        - call_id
        - name
        - arguments
      properties:
        type:
          type: string
          enum:
            - function_call
        call_id:
          type: string
          description: The call's ID, which its output names
        name:
          type: string
        arguments:
          type: string
          description: The call's arguments, as JSON text
        namespace:
          type: string
        id:
          type: string
        status:
          type: string
          enum:
            - in_progress
            - completed
            - incomplete
    DecisionFunctionCallOutput:
      type: object
      required:
        - type
        - call_id
        - output
      properties:
        type:
          type: string
          enum:
            - function_call_output
        call_id:
          type: string
          description: The call this output answers
        output:
          $ref: '#/components/schemas/DecisionToolOutput'
        id:
          type: string
        status:
          type: string
          enum:
            - in_progress
            - completed
            - incomplete
    DecisionCustomToolCall:
      type: object
      required:
        - type
        - call_id
        - name
        - input
      properties:
        type:
          type: string
          enum:
            - custom_tool_call
        call_id:
          type: string
          description: The call's ID, which its output names
        name:
          type: string
        input:
          type: string
          description: The call's freeform input
        namespace:
          type: string
        id:
          type: string
        status:
          type: string
          enum:
            - in_progress
            - completed
            - incomplete
    DecisionCustomToolCallOutput:
      type: object
      required:
        - type
        - call_id
        - output
      properties:
        type:
          type: string
          enum:
            - custom_tool_call_output
        call_id:
          type: string
          description: The call this output answers
        output:
          $ref: '#/components/schemas/DecisionToolOutput'
        id:
          type: string
        status:
          type: string
          enum:
            - in_progress
            - completed
            - incomplete
    DecisionInstructionPart:
      description: One part of a question's instructions
      oneOf:
        - type: object
          required:
            - type
            - text
          properties:
            type:
              type: string
              enum:
                - input_text
            text:
              type: string
        - type: object
          required:
            - type
            - image_url
          properties:
            type:
              type: string
              enum:
                - input_image
            image_url:
              type: string
              description: A base64 data URL or an HTTP(S) URL
            detail:
              type: string
              enum:
                - low
                - high
                - auto
                - original
        - $ref: '#/components/schemas/DecisionInputJSON'
    RoutingInfo:
      type: object
      description: >-
        Which provider, model and key handled the attempt that produced this
        response or error, and what the caller asked for. Also sent as
        x-bifrost-routing-info-* response headers.
      properties:
        provider:
          $ref: '#/components/schemas/ModelProvider'
          description: Provider that ran the attempt
        model:
          type: string
          description: Model sent to that provider
        key:
          type: string
          description: Name of the stored key used, never its ID or secret
        resolved_key_alias:
          $ref: '#/components/schemas/ResolvedKeyAlias'
        is_fallback:
          type: boolean
          description: >-
            True when a fallback served the request or returned the error.
            Omitted when false.
        primary_provider:
          $ref: '#/components/schemas/ModelProvider'
          description: The primary attempt's provider. Set only when a fallback ran.
        primary_model:
          type: string
          description: The primary attempt's model. Set only when a fallback ran.
        requested_provider:
          $ref: '#/components/schemas/ModelProvider'
          description: >-
            Provider the caller asked for, before routing rules, load balancing
            or session affinity changed it. Omitted when the caller sent a bare
            model.
        requested_model:
          type: string
          description: Model the caller asked for, before anything changed it
        server_side_fallback_model:
          type: string
          description: Model that answered when Anthropic switched models inside one call
    ModelProvider:
      type: string
      description: AI model provider identifier
      enum:
        - anthropic
        - azure
        - bedrock
        - bedrock_mantle
        - sagemaker
        - cerebras
        - cohere
        - deepseek
        - gemini
        - groq
        - mistral
        - ollama
        - opencode-go
        - opencode-zen
        - openai
        - parasail
        - perplexity
        - sgl
        - vertex
        - openrouter
        - elevenlabs
        - huggingface
        - nebius
        - xai
        - replicate
        - vllm
        - runway
        - runware
        - fireworks
        - sarvam
        - wafer
        - databricks
        - cloudflare
        - typesafe
        - minimax
        - byteplus
    BifrostCacheDebug:
      type: object
      properties:
        cache_hit:
          type: boolean
        cache_id:
          type: string
        hit_type:
          type: string
        requested_provider:
          type: string
        requested_model:
          type: string
        provider_used:
          type: string
        model_used:
          type: string
        input_tokens:
          type: integer
        threshold:
          type: number
        similarity:
          type: number
        cache_hit_latency:
          type: integer
          format: int64
          description: Milliseconds spent serving a cache hit. Set only on a hit.
    BifrostGuardrailMetadata:
      type: object
      description: Guardrail judge calls and matches recorded for a request.
      properties:
        judge_calls:
          type: array
          description: >-
            Billable guardrail judge invocations (LLM-backed guardrail
            providers)
          items:
            $ref: '#/components/schemas/BifrostGuardrailJudgeCall'
        detections:
          type: array
          description: >-
            Guardrail matches. Enforced rules record detect-only matches;
            output-monitor rules record every match they see, with the action
            enforcement would have taken.
          items:
            $ref: '#/components/schemas/BifrostGuardrailDetection'
    BifrostLLMUsage:
      type: object
      description: Token usage information
      properties:
        prompt_tokens:
          type: integer
          description: >
            Total input tokens including any prompt-cache tokens (read + write).
            Subtract prompt_tokens_details.cached_read_tokens and
            prompt_tokens_details.cached_write_tokens to get the non-cached
            portion.
        prompt_tokens_details:
          $ref: '#/components/schemas/ChatPromptTokensDetails'
        completion_tokens:
          type: integer
          description: Number of output/completion tokens generated.
        completion_tokens_details:
          $ref: '#/components/schemas/ChatCompletionTokensDetails'
        total_tokens:
          type: integer
        tool_usage:
          type: object
          description: |
            Counts of provider-hosted (server-side) tool calls billed per call.
          properties:
            web_search:
              type: object
              properties:
                num_requests:
                  type: integer
                  description: Number of billable web search calls.
        cost:
          $ref: '#/components/schemas/BifrostCost'
    DecisionInputPart:
      description: >-
        One part of a message's content. User messages take text, JSON, and
        image parts; assistant messages take output text and refusals.
      oneOf:
        - $ref: '#/components/schemas/DecisionInputText'
        - $ref: '#/components/schemas/DecisionInputJSON'
        - $ref: '#/components/schemas/DecisionInputImage'
        - $ref: '#/components/schemas/DecisionInputImageAsset'
        - $ref: '#/components/schemas/DecisionOutputText'
        - $ref: '#/components/schemas/DecisionRefusal'
    DecisionToolOutput:
      description: A tool's output, as text or as text and image parts
      oneOf:
        - type: string
        - type: array
          items:
            oneOf:
              - $ref: '#/components/schemas/DecisionInputText'
              - $ref: '#/components/schemas/DecisionInputImage'
    DecisionInputJSON:
      type: object
      description: Structured evidence, read as JSON
      required:
        - type
        - data
      properties:
        type:
          type: string
          enum:
            - input_json
        data:
          description: A JSON object, or an array
          oneOf:
            - type: object
              additionalProperties: true
            - type: array
              items: {}
    ResolvedKeyAlias:
      type: object
      description: Set only when the requested model matched a model alias on the key
      required:
        - model_id
      properties:
        model_id:
          type: string
          description: Model ID sent to the provider
        model_name:
          type: string
          description: Canonical model name, used for pricing and logs
        model_family:
          type: string
          description: Resolved model family
    BifrostGuardrailJudgeCall:
      type: object
      properties:
        phase:
          type: string
        rule_id:
          type: integer
        rule_name:
          type: string
        guardrail_name:
          type: string
        guardrail_provider:
          type: string
        action:
          type: string
        reason:
          type: string
        judge_provider:
          type: string
        judge_model:
          type: string
        judge_request_type:
          type: string
        prompt_tokens:
          type: integer
        prompt_tokens_details:
          type: object
          additionalProperties: true
        completion_tokens:
          type: integer
        completion_tokens_details:
          type: object
          additionalProperties: true
        total_tokens:
          type: integer
    BifrostGuardrailDetection:
      type: object
      properties:
        phase:
          type: string
          description: Phase the match was found in (input, output, or mcp-<source>)
        rule_id:
          type: integer
        rule_name:
          type: string
        guardrail_name:
          type: string
          description: Guardrail profile that matched
        guardrail_provider:
          type: string
          description: >-
            Guardrail provider type of the profile (for example regex or
            bedrock)
        reason:
          type: string
        assessments:
          type: array
          description: Sanitized policy categories; never the matched text
          items:
            type: string
        action:
          type: string
          enum:
            - detect
            - block
            - redact
            - transform
          description: >-
            What the guardrail did, or would have done when the rule only
            monitors
        enforced:
          type: boolean
          description: >-
            False when an output-monitor rule recorded the match without acting
            on it
    ChatPromptTokensDetails:
      type: object
      properties:
        text_tokens:
          type: integer
        audio_tokens:
          type: integer
        image_tokens:
          type: integer
        cached_read_tokens:
          type: integer
          description: >
            Tokens served from the prompt cache (cache hit). These tokens are
            already included in prompt_tokens and are billed at the reduced
            cache-read rate. Populated for all providers that support prompt
            caching (Anthropic, Bedrock, OpenAI, Gemini, xAI, etc.).
        cached_write_tokens:
          type: integer
          description: >
            Tokens written to the prompt cache on this request (cache creation /
            write). These tokens are already included in prompt_tokens and are
            billed at the cache-creation rate. Populated for providers that
            separately report cache write tokens (Anthropic, Bedrock).
    ChatCompletionTokensDetails:
      type: object
      properties:
        text_tokens:
          type: integer
        accepted_prediction_tokens:
          type: integer
        audio_tokens:
          type: integer
        citation_tokens:
          type: integer
        num_search_queries:
          type: integer
          deprecated: true
          description: >-
            Deprecated, use tool_usage.web_search.num_requests. Will be removed
            in 3.0.0.
        reasoning_tokens:
          type: integer
        image_tokens:
          type: integer
        rejected_prediction_tokens:
          type: integer
    BifrostCost:
      type: object
      description: Cost breakdown for the request
      properties:
        input_tokens_cost:
          type: number
        output_tokens_cost:
          type: number
        reasoning_tokens_cost:
          type: number
          description: Cost for reasoning/thinking tokens (reasoning models)
        citation_tokens_cost:
          type: number
          description: Cost for citation tokens
        search_queries_cost:
          type: number
          description: Cost for web search queries
        request_cost:
          type: number
        total_cost:
          type: number
    DecisionInputText:
      type: object
      required:
        - type
        - text
      properties:
        type:
          type: string
          enum:
            - input_text
        text:
          description: >-
            A string, or structured data that Typesafe-based models read as is
            and OpenAI receives as JSON text
          oneOf:
            - type: string
            - type: object
              additionalProperties: true
            - type: array
              items: {}
        prompt_cache_breakpoint:
          $ref: '#/components/schemas/DecisionPromptCacheBreakpoint'
    DecisionInputImage:
      type: object
      description: An inline image, read as evidence
      required:
        - type
        - image_url
      properties:
        type:
          type: string
          enum:
            - input_image
        image_url:
          type: string
          description: A base64 data URL or an HTTP(S) URL
        detail:
          type: string
          enum:
            - low
            - high
            - auto
            - original
          description: >-
            Image detail level, forwarded to models that read images (OpenAI's
            defaults to `auto`)
        prompt_cache_breakpoint:
          $ref: '#/components/schemas/DecisionPromptCacheBreakpoint'
    DecisionInputImageAsset:
      type: object
      description: >-
        Typesafe only. An image sent by reference, as one of Typesafe's
        `assets`, placed wherever its ID is written in the input, instructions,
        or criteria instead of as evidence itself. Other providers reject it.
      required:
        - type
        - id
      anyOf:
        - required:
            - data
        - required:
            - name
      properties:
        type:
          type: string
          enum:
            - input_image
        id:
          type: string
          description: The reference written where the image belongs
        data:
          type: string
          format: byte
          description: >-
            The image file, base64-encoded, without a `data:` prefix; its format
            is read from the bytes
        name:
          type: string
          description: >-
            In a multipart request, the name of the file part that holds the
            image. A JSON request cannot use it.
    DecisionOutputText:
      type: object
      description: An assistant message's text
      required:
        - type
        - text
      properties:
        type:
          type: string
          enum:
            - output_text
        text:
          type: string
    DecisionRefusal:
      type: object
      description: An assistant message's refusal
      required:
        - type
        - refusal
      properties:
        type:
          type: string
          enum:
            - refusal
        refusal:
          type: string
    DecisionPromptCacheBreakpoint:
      type: object
      description: >-
        Marks the end of a reusable prompt prefix on a text or image part of the
        input. Forwarded to OpenAI.
      properties:
        mode:
          type: string
          enum:
            - explicit
  securitySchemes:
    BearerAuth:
      type: http
      scheme: bearer
      description: >
        Bearer token authentication. Use your provider API key or Bifrost
        authentication token.

        Virtual keys (prefixed with `sk-bf-`) can also be passed here.
    BasicAuth:
      type: http
      scheme: basic
      description: >
        Basic authentication using the Bifrost admin username and password

        (`auth_config.admin_username` / `auth_config.admin_password`).

        Accepted on management APIs (`/api/*`, `/metrics`, `/ws`) only - the
        inference

        middleware never validates Basic credentials.
    ApiKeyAuth:
      type: apiKey
      in: header
      name: x-api-key
      description: |
        API key authentication via the `x-api-key` header.
        Virtual keys (prefixed with `sk-bf-`) can also be passed here.
    VirtualKeyAuth:
      type: apiKey
      in: header
      name: x-bf-vk
      description: >
        Bifrost Virtual Key for governance, routing, and access control.
        Supported on all inference endpoints (`/v1/*`, `/openai/*`,
        `/anthropic/*`, `/bedrock/*`, `/cohere/*`, `/genai/*`, `/langchain/*`,
        `/litellm/*`, `/pydanticai/*`, `/mcp`), not on management APIs
        (`/api/*`) - with the single

        exception of the self-service `GET /api/governance/virtual-keys/quota`,
        where the virtual key is the credential.

        Example: `sk-bf-*` prefixed keys.

````

This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.