Přeskočit na obsah
Strukturované výstupy

Strukturované výstupy

Požádejte o odpověď jako JSON: libovolný objekt JSON, nebo JSON podle schématu, které pošlete. Použijte to, když odpověď čte program, ne člověk.

POST https://api.shannon-ai.com/v1/chat/completions

import json
from openai import OpenAI

client = OpenAI(api_key="YOUR_API_KEY", base_url="https://api.shannon-ai.com/v1")

response = client.chat.completions.create(
    model="Kimi-K3-3BIT-REAP",
    messages=[
        {"role": "user", "content": "Extract the person: John Doe, 30 years old, engineer."}
    ],
    response_format={
        "type": "json_schema",
        "json_schema": {
            "name": "person",
            "strict": True,
            "schema": {
                "type": "object",
                "properties": {
                    "name": {"type": "string"},
                    "age": {"type": "integer"},
                    "occupation": {"type": "string"},
                },
                "required": ["name", "age", "occupation"],
            },
        },
    },
)

# The JSON arrives as text in message.content: parse it, then check it.
try:
    person = json.loads(response.choices[0].message.content)
except json.JSONDecodeError:
    person = None  # ask again, or report the failure

print(person)

JSON je text odpovědi, v choices[0].message.content:

200 JSON
{
  "id": "chatcmpl-0c4e7a1b9d2f4e6a8b3c5d7e9f1a2b3c",
  "object": "chat.completion",
  "created": 1791590400,
  "model": "Kimi-K3-3BIT-REAP",
  "choices": [
    {
      "index": 0,
      "message": {
        "role": "assistant",
        "content": "{\"name\":\"John Doe\",\"age\":30,\"occupation\":\"engineer\"}",
        "reasoning_content": null
      },
      "finish_reason": "stop"
    }
  ],
  "usage": {
    "prompt_tokens": 96,
    "completion_tokens": 19,
    "total_tokens": 115,
    "prompt_tokens_details": {"cached_tokens": 0},
    "completion_tokens_details": {"reasoning_tokens": 0}
  }
}

Režimy response_format

response_format je pole endpointu /v1/chat/completions. Bez něj je odpověď běžný text.

Režim Hodnota Co dostanete
Objekt JSON {"type": "json_object"} Odpověď je JSON bez předepsaného tvaru. V promptu řekněte, které klíče chcete.
Schéma JSON {"type": "json_schema", "json_schema": {"name": "…", "schema": {…}}} Odpověď se řídí schématem, které pošlete: jeho klíči, typy a povinnými poli.
Striktní "strict": true Pole json_schema, ne třetí režim. Je true, pokud nepošlete false.
Pole Typ Výchozí Popis Uplatňují
type string json_object nebo json_schema. Uvnitř response_format povinné. text se přijímá a dává běžnou textovou odpověď. Každý model, který režim přijímá
json_schema.schema object JSON Schema, kterým se odpověď řídí. Pošlete je vždy, když je type json_schema. Každý model, který režim přijímá
json_schema.name string Označení schématu, jako ve formátu OpenAI. Hostované modely s otevřenými váhami
json_schema.strict boolean true Zda se odpověď musí schématem řídit přesně. Modely Shannon uplatňují každé schéma jako striktní. Hostované modely s otevřenými váhami

Režim objektu JSON schéma nepotřebuje. Klíče pojmenujte v promptu:

Tělo požadavku
{
  "model": "shannon-3",
  "messages": [
    {
      "role": "user",
      "content": "Name the capital of France. Answer as JSON with the keys city and country."
    }
  ],
  "response_format": {"type": "json_object"}
}

Podpora podle modelu

Model json_object json_schema
Každý model Shannon (shannon-*) Ano Ano
Hostované modely s otevřenými váhami, kromě níže uvedených Ano Ano
Laguna-S-2.1-W4A16-AUTOROUND-REAP — —
inkling-W4A16-AUTOROUND-REAP Ano —

GET /v1/models hlásí totéž u každého id: capabilities.json_schema u každého modelu a capabilities.response_format u hostovaných modelů s otevřenými váhami. Modely a ceny

Podporovaná klíčová slova schématu

Co model z vašeho schématu dostane, závisí na modelu a na endpointu:

Modely /v1/chat/completions /v1/responses
Modely Shannon Podmnožina klíčových slov níže, uplatněná jako striktní. Schéma tak, jak je pošlete, uplatněné jako striktní.
Hostované modely s otevřenými váhami Schéma tak, jak je pošlete. strict je true, pokud jej neposíláte. Schéma tak, jak je pošlete. strict je true, pokud jej neposíláte.

Podmnožina klíčových slov modelů Shannon na /v1/chat/completions:

Klíčové slovo Jak se čte
Čtená klíčová slova type, format, title, description, nullable, enum, items, properties, required, minItems, maxItems, minimum, maximum, minLength, maxLength, pattern, anyOf, default
$ref Rozřeší se z $defs nebo definitions na nejvyšší úrovni schématu. Klíčová slova zapsaná vedle $ref, například description, se zachovají. Odkaz bez odpovídající definice se čte jako {"type": "object"}.
allOf Členy se sloučí do jednoho schématu. Kde dva členy nastavují stejné klíčové slovo, platí pozdější.
oneOf Čte se jako anyOf.
Schémata, která odkazují sama na sebe Rozvinou se do 24 úrovní. Hlubší úroveň se čte jako {"type": "object"}.
Mimo podmnožinu Každé další klíčové slovo, například additionalProperties, const, multipleOf, uniqueItems, exclusiveMinimum, exclusiveMaximum, patternProperties, prefixItems, minProperties, maxProperties, not a if / then / else. Nejsou součástí schématu, které model dostane.

Na /v1/responses: text.format

/v1/responses zapisuje stejný požadavek jako text.format. Schéma leží přímo v format, vedle name a strict, ne pod klíčem json_schema. Pro režim objektu JSON pošlete {"format": {"type": "json_object"}}.

Tělo požadavku
{
  "model": "Kimi-K3-3BIT-REAP",
  "input": "Extract the person: John Doe, 30 years old, engineer.",
  "text": {
    "format": {
      "type": "json_schema",
      "name": "person",
      "strict": true,
      "schema": {
        "type": "object",
        "properties": {
          "name": {"type": "string"},
          "age": {"type": "integer"},
          "occupation": {"type": "string"}
        },
        "required": ["name", "age", "occupation"]
      }
    }
  }
}

JSON je text části output_text položky message:

200 JSON
{
  "output": [
    {
      "id": "msg_7e1d3c5b9a2f4d6e8c0b1a3f5e7d9c2b",
      "type": "message",
      "role": "assistant",
      "status": "completed",
      "content": [
        {
          "type": "output_text",
          "text": "{\"name\":\"John Doe\",\"age\":30,\"occupation\":\"engineer\"}",
          "annotations": []
        }
      ]
    }
  ]
}

Podpora podle modelu a chyby jsou stejné jako na /v1/chat/completions. Responses API

Na /v1/messages: nástroj jako schéma

Formát Messages nemá pole pro strukturovaný výstup. Pro JSON od stejných modelů volejte /v1/chat/completions nebo /v1/responses se stejným klíčem.

Chcete-li zůstat na /v1/messages, popište objekt jako nástroj: schéma dejte do input_schema a nástroj pojmenujte v tool_choice. input bloku tool_use je pak váš objekt, už zpracovaný. Pojmenovaný tool_choice uplatňují hostované modely s otevřenými váhami.

Tělo požadavku
{
  "model": "Kimi-K3-3BIT-REAP",
  "max_tokens": 1024,
  "messages": [
    {
      "role": "user",
      "content": "Extract the person: John Doe, 30 years old, engineer."
    }
  ],
  "tools": [
    {
      "name": "record_person",
      "description": "Record the extracted person.",
      "input_schema": {
        "type": "object",
        "properties": {
          "name": {"type": "string"},
          "age": {"type": "integer"},
          "occupation": {"type": "string"}
        },
        "required": ["name", "age", "occupation"]
      }
    }
  ],
  "tool_choice": {"type": "tool", "name": "record_person"}
}
200 JSON
{
  "stop_reason": "tool_use",
  "content": [
    {
      "type": "tool_use",
      "id": "toolu_4b8d2f6a1c3e4a5b9d7f0e2c4a6b8d1f",
      "name": "record_person",
      "input": {"name": "John Doe", "age": 30, "occupation": "engineer"}
    }
  ]
}

Než blok přečtete, ověřte, že stop_reason je tool_use. Volání funkcí

Jak JSON přichází

  • JSON je řetězec. Odpověď vedle něj nemá žádný zpracovaný objekt: spusťte svůj parser JSON na message.content.
  • Se stream: true přichází JSON po kouscích v delta.content. Spojte je a zpracujte až po skončení streamu; samotný kousek není platný JSON.
  • Hostovaný model s otevřenými váhami odpovídá na požadavek s response_format bez textu uvažování: reasoning_content je null.

Zkontrolujte, co dostanete

Schéma vede model při psaní. API hotovou odpověď se schématem neporovnává, takže konečnou kontrolu dělá váš kód:

  • Zpracovávejte uvnitř obsluhy chyb, jako to dělá ukázka nahoře.
  • Zpracovaný objekt ověřte stejným schématem ve vlastním kódu, například knihovnou JSON Schema, Pydantic nebo Zod.
  • Dlouhá odpověď může skončit dřív, než je JSON kompletní. Nestreamovaná odpověď hlásí finish_reason jen jako stop nebo tool_calls, takže signálem je chyba zpracování. Zeptejte se znovu, nebo požádejte o menší objekt.

Chyby

Stav Typ Zpráva Kdy
400 invalid_request_error <id> does not accept response_format Model nepřijímá ani jeden režim.
400 invalid_request_error <id> does not accept response_format json_schema; use json_object Model přijímá json_object a vy jste poslali json_schema.
422 invalid_request_error Failed to deserialize the JSON body into the target type: … response_format nemá type, nebo není objekt JSON.

Obě odpovědi 400 se posílají dřív, než se ze zůstatku cokoli strhne. Zpracování chyb