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

# GPT Decisions - Complete Parameter Reference

> - GPT-6 Luna Decisions (`gpt-6-luna-decisions`) evaluates text, images, or both and returns three types of structured answers: `predicate` returns the probability of “yes”, `choice` selects one of the supplied options, and `score` calculates a probability-weighted score over ordered levels
- Synchronous API: all answers are returned in a single request; no streaming or task polling
- The request body matches the OpenAI Decisions API: with the OpenAI SDK, point `base_url` to EvoLink. This endpoint also accepts the OpenAI model ID `gpt-6-luna`
- Only input tokens are billed: output, cache reads, and cache writes are free. A minimum charge applies to each request; when a single input exceeds 272,000 tokens, the input price for the entire request is 2 times the standard rate. See [Model pricing](https://evolink.ai/pricing) for current prices
- Images must be inline base64 data URLs (`data:image/...;base64,...`); image URLs and `file_id` are not supported. Up to 128 images per request
- This endpoint rejects unknown fields: do not send Chat Completions parameters such as `stream`, `temperature`, or `max_tokens`
- Suitable for content classification, ticket routing, relevance checks, and rule-based scoring. For text generation or custom JSON structures, use the [Responses API](/en/api-manual/language-series/gpt/responses/responses-reference)

<Note>
  **BaseURL**: The default BaseURL is `https://direct.evolink.ai`, which has better support for text models and long-lived connections. `https://api.evolink.ai` is the primary endpoint for multimodal services and serves as a fallback address for text models.
</Note>

<Note>
  **Model ID is exclusive to this endpoint**: `gpt-6-luna-decisions` can only be used on `/v1/decisions`. Using it on Chat Completions, Responses, or other endpoints returns `400 model_endpoint_mismatch`. For conversation or text generation, use `gpt-6-luna` with [Chat Completions](/docs/en/api-manual/language-series/gpt/chat-completions/chat-completions-reference) or the [Responses API](/docs/en/api-manual/language-series/gpt/responses/responses-reference).
</Note>

<Note>
  **Choosing a question type**

  | Type | Suitable questions | How to use the result |
  | - | - | - |
  | `predicate` | Yes/no questions, such as whether a message is a complaint or an image shows damage | `probability` is the probability of “yes”; set your own threshold and treat values above it as a match |
  | `choice` | Select one of several mutually exclusive categories, such as the department to route a ticket to | `choice` is the selected option; consider human review when `confidence` is low |
  | `score` | Evaluate ordered levels, such as issue severity | `score` is the probability-weighted level score (indices start at 0) and may be fractional |

  You can include multiple independent questions in one request; they share the same `input`. If a later question depends on an earlier answer, split them into two requests.
</Note>

<Note>
  **Difference from Chat Completions / Responses**: This endpoint only accepts `model`, `input`, `questions`, and `safety_identifier`. Any additional field returns `400 unknown_parameter`; images must be base64 data URLs; streaming is not supported.
</Note>


## OpenAPI

````yaml en/api-manual/language-series/gpt/decisions/decisions-reference.json POST /v1/decisions
openapi: 3.1.0
info:
  title: GPT Decisions - Complete Parameter Reference
  description: >-
    Use the OpenAI-compatible Decisions API to have GPT-6 Luna make structured
    decisions about text and images: yes/no probabilities, a single choice, or
    scoring on ordered levels.
  license:
    name: MIT
  version: 1.0.0
servers:
  - url: https://direct.evolink.ai
    description: Production (recommended)
  - url: https://api.evolink.ai
    description: Fallback endpoint
security:
  - bearerAuth: []
tags:
  - name: Decisions
    description: 'Structured decisions: classification, routing, and scoring'
paths:
  /v1/decisions:
    post:
      tags:
        - Decisions
      summary: GPT-6 Luna Decisions (structured decisions)
      description: >-
        - GPT-6 Luna Decisions (`gpt-6-luna-decisions`) evaluates text, images,
        or both and returns three types of structured answers: `predicate`
        returns the probability of “yes”, `choice` selects one of the supplied
        options, and `score` calculates a probability-weighted score over
        ordered levels

        - Synchronous API: all answers are returned in a single request; no
        streaming or task polling

        - The request body matches the OpenAI Decisions API: with the OpenAI
        SDK, point `base_url` to EvoLink. This endpoint also accepts the OpenAI
        model ID `gpt-6-luna`

        - Only input tokens are billed: output, cache reads, and cache writes
        are free. A minimum charge applies to each request; when a single input
        exceeds 272,000 tokens, the input price for the entire request is 2
        times the standard rate. See [Model pricing](https://evolink.ai/pricing)
        for current prices

        - Images must be inline base64 data URLs (`data:image/...;base64,...`);
        image URLs and `file_id` are not supported. Up to 128 images per request

        - This endpoint rejects unknown fields: do not send Chat Completions
        parameters such as `stream`, `temperature`, or `max_tokens`

        - Suitable for content classification, ticket routing, relevance checks,
        and rule-based scoring. For text generation or custom JSON structures,
        use the [Responses
        API](/en/api-manual/language-series/gpt/responses/responses-reference)
      operationId: createDecision
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/DecisionRequest'
            examples:
              predicate:
                summary: Yes/no decision
                value:
                  model: gpt-6-luna-decisions
                  input: The package arrived with a broken screen.
                  questions:
                    - type: predicate
                      name: damaged
                      instructions: Does the customer report a damaged item?
              choice:
                summary: Single choice (routing)
                value:
                  model: gpt-6-luna-decisions
                  input: I was charged twice for my order.
                  questions:
                    - type: choice
                      name: department
                      instructions: Which department should handle this complaint?
                      choices:
                        - value: billing
                          description: Payments, invoices, and refunds.
                        - value: technical
                          description: Problems using the product.
                        - value: other
                          description: Requests outside these categories.
              score:
                summary: Scoring on ordered levels
                value:
                  model: gpt-6-luna-decisions
                  input: Export fails in Safari but works in Chrome.
                  questions:
                    - type: score
                      name: severity
                      instructions: How severe is this issue?
                      levels:
                        - label: Cosmetic
                          description: Appearance only; no lost functionality.
                        - label: Workaround available
                          description: A task fails, but another way works.
                        - label: Fully blocked
                          description: A task fails with no workaround.
              multiple:
                summary: Ask multiple questions in one request
                value:
                  model: gpt-6-luna-decisions
                  input: >-
                    I was charged twice for my order and the app crashes when I
                    open the invoice.
                  questions:
                    - type: predicate
                      name: is_billing
                      instructions: Is this about a billing problem?
                    - type: choice
                      name: department
                      instructions: Which department should handle this complaint?
                      choices:
                        - value: billing
                          description: Payments, invoices, and refunds.
                        - value: technical
                          description: Problems using the product.
                        - value: other
                          description: Requests outside these categories.
                    - type: score
                      name: severity
                      instructions: How severe is this issue?
                      levels:
                        - label: Cosmetic
                          description: Appearance only.
                        - label: Workaround available
                          description: A task fails, but another way works.
                        - label: Fully blocked
                          description: A task fails with no workaround.
              image:
                summary: Evaluate an image
                value:
                  model: gpt-6-luna-decisions
                  input:
                    - role: user
                      content:
                        - type: input_text
                          text: Look at the image.
                        - type: input_image
                          image_url: >-
                            data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAIAAAD8GO2jAAAAKklEQVR42mM4ISdHU8QwasGoBaMWjFowasGoBaMWjFowasGoBaMWDBULACXLED1gHZEpAAAAAElFTkSuQmCC
                  questions:
                    - type: predicate
                      name: is_red
                      instructions: Is the image mostly red?
      responses:
        '200':
          description: >-
            One answer per question, in the same order as the questions in the
            request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/DecisionResponse'
              example:
                model: gpt-6-luna
                answers:
                  - type: predicate
                    name: is_billing
                    probability: 1
                  - type: choice
                    name: department
                    choice: billing
                    probabilities:
                      - value: billing
                        probability: 0.98
                      - value: technical
                        probability: 0.01
                      - value: other
                        probability: 0.01
                    confidence: 0.97
                  - type: score
                    name: severity
                    score: 1.34
                    probabilities:
                      - value: 0
                        label: Cosmetic
                        probability: 0.04
                      - value: 1
                        label: Workaround available
                        probability: 0.58
                      - value: 2
                        label: Fully blocked
                        probability: 0.38
                    confidence: 0.37
                usage:
                  input_tokens: 426
                  input_tokens_details:
                    cached_tokens: 0
                    cache_write_tokens: 0
                  output_tokens: 0
                  output_tokens_details:
                    reasoning_tokens: 0
                  total_tokens: 426
        '400':
          description: >-
            Invalid request parameters. `param` identifies the field with the
            error. Common causes: missing `questions`, unknown fields, images
            that are not base64 data URLs, a message `role` other than `user`,
            or duplicate question `name` values. Using this model ID on another
            endpoint also returns 400 (`model_endpoint_mismatch`). Requests that
            fail validation are not billed
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              examples:
                unknown_parameter:
                  summary: Unknown field supplied
                  value:
                    error:
                      message: >-
                        Unknown parameter: 'stream'. (request id:
                        20261007223656995142218QgCDR3TF)
                      type: invalid_request_error
                      param: stream
                      code: unknown_parameter
                image_not_data_url:
                  summary: Image supplied as a URL
                  value:
                    error:
                      message: >-
                        Invalid 'input[0].content[1].image_url': string does not
                        match pattern. Expected a string that matches the
                        pattern '^data:'. (request id:
                        2026100722365642880926evUSStdF)
                      type: invalid_request_error
                      param: input[0].content[1].image_url
                      code: invalid_value
                missing_questions:
                  summary: Missing questions
                  value:
                    error:
                      message: >-
                        Missing required parameter: 'questions'. (request id:
                        20261007223656416678385UfxZWwZD)
                      type: invalid_request_error
                      param: questions
                      code: missing_required_parameter
        '401':
          description: 'Unauthorized: API Key is missing or invalid'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              example:
                error:
                  code: unauthorized
                  message: >-
                    API key is required (request id:
                    202610072235193122631737Nn7cfZ5)
                  param: null
                  type: authentication_error
        '402':
          description: Insufficient balance
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '403':
          description: >-
            This API Key has a model allowlist that includes neither
            `gpt-6-luna-decisions` nor `gpt-6-luna`
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '404':
          description: >-
            This model is not enabled for the Decisions API. Currently only
            `gpt-6-luna-decisions` (or `gpt-6-luna`) is supported
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              example:
                error:
                  code: model_not_found
                  message: >-
                    Model 'gpt-5.5' is not available for the Decisions API (POST
                    /v1/decisions) with this API key. This error is permanent —
                    do not retry with the same model id. Call GET /v1/models:
                    models that support this endpoint are listed with the
                    '-decisions' suffix. (request id:
                    20261007223657322725427OrY2GeLp)
                  param: null
                  retryable: false
                  type: invalid_request_error
        '429':
          description: Rate limit exceeded; retry later
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '500':
          description: Internal server error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '503':
          description: Service temporarily unavailable; retry later
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
components:
  schemas:
    DecisionRequest:
      type: object
      additionalProperties: false
      required:
        - model
        - input
        - questions
      properties:
        model:
          type: string
          description: >-
            Model ID. Use `gpt-6-luna-decisions`; this endpoint also accepts the
            OpenAI model ID `gpt-6-luna`. Both have identical behavior and
            billing; usage and billing records are attributed to
            `gpt-6-luna-decisions`.


            `gpt-6-luna-decisions` is only available on this endpoint. Using it
            on Chat Completions, Responses, or other endpoints returns `400
            model_endpoint_mismatch`.
          enum:
            - gpt-6-luna-decisions
            - gpt-6-luna
          example: gpt-6-luna-decisions
        input:
          description: >-
            The shared basis for all decisions: a text string or an array of
            user messages, which can contain text and inline images.
          oneOf:
            - type: string
              example: I was charged twice for my order.
            - type: array
              minItems: 1
              items:
                $ref: '#/components/schemas/DecisionInputMessage'
        questions:
          type: array
          minItems: 1
          description: >-
            Questions to evaluate; at least 1 is required. Questions are
            independent and can mix different types; question `name` values must
            be unique within a request.


            | Type | Purpose | Main result |

            |---|---|---|

            | `predicate` | Check whether a condition holds | `probability`:
            probability that it holds (0 to 1) |

            | `choice` | Select one of the supplied options | `choice`: the
            selected option |

            | `score` | Score on ordered levels | `score`: probability-weighted
            level score |


            If a later question depends on an earlier answer, split them into
            two requests.
          items:
            oneOf:
              - $ref: '#/components/schemas/PredicateQuestion'
              - $ref: '#/components/schemas/ChoiceQuestion'
              - $ref: '#/components/schemas/ScoreQuestion'
        safety_identifier:
          type: string
          description: >-
            Optional. Your own end-user identifier (an opaque string), forwarded
            unchanged to the model provider for abuse detection
    DecisionResponse:
      type: object
      properties:
        model:
          type: string
          description: The model that actually performed the decisions
          example: gpt-6-luna
        answers:
          type: array
          description: >-
            One answer per question, in the same order as the questions in the
            request. Use `name` to match the question and `type` to distinguish
            answer types
          items:
            oneOf:
              - $ref: '#/components/schemas/PredicateAnswer'
              - $ref: '#/components/schemas/ChoiceAnswer'
              - $ref: '#/components/schemas/ScoreAnswer'
              - $ref: '#/components/schemas/RefusalAnswer'
        usage:
          $ref: '#/components/schemas/DecisionUsage'
    ErrorResponse:
      type: object
      properties:
        error:
          type: object
          properties:
            message:
              type: string
              description: >-
                Error description, ending with `(request id: ...)`. Provide this
                ID when troubleshooting
            type:
              type: string
              description: Error type
            param:
              type:
                - string
                - 'null'
              description: Path to the invalid parameter
            code:
              type:
                - string
                - 'null'
              description: Error code
    DecisionInputMessage:
      type: object
      required:
        - role
        - content
      properties:
        role:
          type: string
          enum:
            - user
          description: Only `user` is accepted
        content:
          description: A text string or an array of text and image blocks
          oneOf:
            - type: string
            - type: array
              items:
                oneOf:
                  - $ref: '#/components/schemas/InputTextPart'
                  - $ref: '#/components/schemas/InputImagePart'
    PredicateQuestion:
      type: object
      required:
        - type
        - instructions
      properties:
        type:
          type: string
          enum:
            - predicate
        name:
          type: string
          description: The question name, returned unchanged in the corresponding answer
        instructions:
          type: string
          description: The condition to evaluate, written as a yes/no question
    ChoiceQuestion:
      type: object
      required:
        - type
        - instructions
        - choices
      properties:
        type:
          type: string
          enum:
            - choice
        name:
          type: string
          description: The question name, returned unchanged in the corresponding answer
        instructions:
          type: string
          description: The question to answer
        choices:
          type: array
          minItems: 1
          description: >-
            Available options. Their meanings should be mutually exclusive; if
            the categories may not cover every case, add a fallback such as
            `other`
          items:
            type: object
            required:
              - value
            properties:
              value:
                description: >-
                  The value returned when this option is selected. Strings and
                  booleans are different types: `true` and `"true"` count as two
                  options
                oneOf:
                  - type: string
                  - type: boolean
              description:
                type: string
                description: When to select this option
    ScoreQuestion:
      type: object
      required:
        - type
        - instructions
        - levels
      properties:
        type:
          type: string
          enum:
            - score
        name:
          type: string
          description: The question name, returned unchanged in the corresponding answer
        instructions:
          type: string
          description: The question to answer
        levels:
          type: array
          minItems: 1
          description: Levels, ordered from lowest to highest; level indices start at 0
          items:
            type: object
            required:
              - label
            properties:
              label:
                type: string
                description: Level name
              description:
                type: string
                description: Criteria for reaching this level
    PredicateAnswer:
      type: object
      properties:
        type:
          type: string
          enum:
            - predicate
        name:
          type:
            - string
            - 'null'
          description: >-
            The name assigned to this question in the request; `null` if no name
            was supplied
        probability:
          type: number
          description: >-
            Estimated probability that the condition holds, from 0 to 1. Set a
            decision threshold using your own business data
    ChoiceAnswer:
      type: object
      properties:
        type:
          type: string
          enum:
            - choice
        name:
          type:
            - string
            - 'null'
          description: >-
            The name assigned to this question in the request; `null` if no name
            was supplied
        choice:
          description: The selected option, with the same type as `value` in the request
          oneOf:
            - type: string
            - type: boolean
        probabilities:
          type: array
          description: Probability for each option
          items:
            type: object
            properties:
              value:
                oneOf:
                  - type: string
                  - type: boolean
              probability:
                type: number
        confidence:
          type: number
          description: Confidence in this choice, from 0 to 1
    ScoreAnswer:
      type: object
      properties:
        type:
          type: string
          enum:
            - score
        name:
          type:
            - string
            - 'null'
          description: >-
            The name assigned to this question in the request; `null` if no name
            was supplied
        score:
          type: number
          description: >-
            The probability-weighted average of the level indices, so it can
            fall between two levels. For example, probabilities of 0.04 / 0.58 /
            0.38 across three levels yield a score of 1.34
        probabilities:
          type: array
          description: Probability for each level
          items:
            type: object
            properties:
              value:
                type: integer
                description: Level index, starting at 0
              label:
                type: string
              probability:
                type: number
        confidence:
          type: number
          description: Confidence in this score, from 0 to 1
    RefusalAnswer:
      type: object
      description: >-
        The model refused to answer this question. Answers to other questions
        are unaffected; the request still returns 200 and is billed as usual
      properties:
        type:
          type: string
          enum:
            - refusal
        name:
          type:
            - string
            - 'null'
          description: >-
            The name assigned to this question in the request; `null` if no name
            was supplied
    DecisionUsage:
      type: object
      description: >-
        Token usage. Only input tokens are billed on this endpoint: output,
        cache reads, and cache writes are free. A minimum charge applies to each
        request; when a single input exceeds 272,000 tokens, the input price for
        the entire request is 2 times the standard rate. See [Model
        pricing](https://evolink.ai/pricing) for current prices.
      properties:
        input_tokens:
          type: integer
          description: >-
            Billable input tokens, including text, images, and fixed overhead
            per request and per question. Reference values: one sentence with
            one `predicate` question uses about 160 tokens; a 1536×1024 image
            uses about 1,540 tokens
          example: 426
        input_tokens_details:
          type: object
          description: >-
            Input token details. Caching is not billed separately on this
            endpoint
          properties:
            cached_tokens:
              type: integer
              example: 0
            cache_write_tokens:
              type: integer
              example: 0
        output_tokens:
          type: integer
          description: Output is not billed on this endpoint
          example: 0
        output_tokens_details:
          type: object
          properties:
            reasoning_tokens:
              type: integer
              example: 0
        total_tokens:
          type: integer
          description: Total tokens
          example: 426
    InputTextPart:
      type: object
      required:
        - type
        - text
      properties:
        type:
          type: string
          enum:
            - input_text
        text:
          type: string
          description: Text content
    InputImagePart:
      type: object
      required:
        - type
        - image_url
      properties:
        type:
          type: string
          enum:
            - input_image
        image_url:
          type: string
          pattern: '^data:'
          description: >-
            An inline base64 data URL, such as `data:image/png;base64,...`.
            `http(s)` image URLs are rejected; up to 128 images per request
  securitySchemes:
    bearerAuth:
      type: http
      scheme: bearer
      description: >-
        ##All endpoints require Bearer Token authentication##


        **Get an API Key:**


        Visit the [API Key management page](https://evolink.ai/dashboard/keys)
        to get your API Key


        **Add it to the request header:**

        ```

        Authorization: Bearer YOUR_API_KEY

        ```

````

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