Preskoči na sadržaj
Strukturirani izlazi

Strukturirani izlazi

Tražite odgovor kao JSON: bilo koji JSON objekat, ili JSON koji prati šemu koju pošaljete. Koristite to kada odgovor čita program, a ne osoba.

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 tekst odgovora, u 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}
  }
}

Modovi response_format

response_format je polje /v1/chat/completions. Bez njega je odgovor običan tekst.

Mod Vrijednost Šta dobijate
JSON objekat {"type": "json_object"} Odgovor je JSON bez propisanog oblika. U promptu recite koje ključeve želite.
JSON šema {"type": "json_schema", "json_schema": {"name": "…", "schema": {…}}} Odgovor prati šemu koju pošaljete: njene ključeve, tipove i obavezna polja.
Strogi "strict": true Polje json_schema, a ne treći mod. Jeste true osim ako pošaljete false.
Polje Tip Zadano Opis Primjenjuje
type string json_object ili json_schema. Obavezno unutar response_format. text se prihvata i daje običan tekstualni odgovor. Svaki model koji prima taj mod
json_schema.schema object JSON Schema koju odgovor prati. Pošaljite je kad god je type json_schema. Svaki model koji prima taj mod
json_schema.name string Oznaka za šemu, kao u OpenAI formatu. Hostirani open-weight modeli
json_schema.strict boolean true Mora li odgovor tačno pratiti šemu. Shannon modeli primjenjuju svaku šemu kao strogu. Hostirani open-weight modeli

Mod JSON objekta ne treba šemu. Imenujte ključeve u promptu:

Tijelo zahtjeva
{
  "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"}
}

Podrška po modelu

Model json_object json_schema
Svaki Shannon model (shannon-*) Da Da
Hostirani open-weight modeli, osim onih navedenih ispod Da Da
Laguna-S-2.1-W4A16-AUTOROUND-REAP — —
inkling-W4A16-AUTOROUND-REAP Da —

GET /v1/models prijavljuje isto po id-u: capabilities.json_schema na svakom modelu i capabilities.response_format na hostiranim open-weight modelima. Modeli i cijene

Podržane ključne riječi šeme

Šta model primi od vaše šeme ovisi o modelu i o endpointu:

Modeli /v1/chat/completions /v1/responses
Shannon modeli Podskup ključnih riječi ispod, primijenjen kao strogi. Šema onako kako je pošaljete, primijenjena kao stroga.
Hostirani open-weight modeli Šema onako kako je pošaljete. strict je true osim ako ga pošaljete. Šema onako kako je pošaljete. strict je true osim ako ga pošaljete.

Podskup ključnih riječi Shannon modela na /v1/chat/completions:

Ključna riječ Kako se čita
Čitane ključne riječi type, format, title, description, nullable, enum, items, properties, required, minItems, maxItems, minimum, maximum, minLength, maxLength, pattern, anyOf, default
$ref Razrješava se iz $defs ili definitions na vrhu šeme. Ključne riječi napisane pored $ref, kao description, se zadržavaju. Referenca bez odgovarajuće definicije čita se kao {"type": "object"}.
allOf Članovi se spajaju u jednu šemu. Gdje dva člana postavljaju istu ključnu riječ, vrijedi kasniji.
oneOf Čita se kao anyOf.
Šeme koje upućuju na same sebe Proširuju se do 24 nivoa. Dublji nivo čita se kao {"type": "object"}.
Izvan podskupa Svaka druga ključna riječ, na primjer additionalProperties, const, multipleOf, uniqueItems, exclusiveMinimum, exclusiveMaximum, patternProperties, prefixItems, minProperties, maxProperties, not i if / then / else. One nisu dio šeme koju model prima.

Na /v1/responses: text.format

/v1/responses isti zahtjev piše kao text.format. Šema stoji direktno u format, pored name i strict, a ne pod ključem json_schema. Za mod JSON objekta pošaljite {"format": {"type": "json_object"}}.

Tijelo zahtjeva
{
  "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 dijela output_text stavke 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": []
        }
      ]
    }
  ]
}

Podrška po modelu i greške iste su kao na /v1/chat/completions. Responses API

Na /v1/messages: alat kao šema

Format Messages nema polje za strukturirani izlaz. Za JSON od istih modela pozovite /v1/chat/completions ili /v1/responses s istim ključem.

Da ostanete na /v1/messages, opišite objekat kao alat: stavite svoju šemu u input_schema i imenujte alat u tool_choice. input bloka tool_use tada je vaš objekat, već parsiran. Imenovani tool_choice primjenjuju hostirani open-weight modeli.

Tijelo zahtjeva
{
  "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"}
    }
  ]
}

Provjerite da je stop_reason tool_use prije nego što pročitate blok. Pozivanje funkcija

Kako JSON stiže

  • JSON je string. Odgovor pored njega nema parsiran objekat: pokrenite svoj JSON parser na message.content.
  • Uz stream: true JSON stiže u dijelovima delta.content. Spojite ih i parsirajte tek kad se stream završi; jedan dio sam nije valjan JSON.
  • Hostirani open-weight model odgovara na zahtjev sa response_format bez teksta razmišljanja: reasoning_content je null.

Provjerite šta primate

Šema usmjerava kako model piše. API ne poredi gotov odgovor s vašom šemom, pa konačnu provjeru radi vaš kod:

  • Parsirajte unutar rukovaoca greškama, kao što to radi primjer na vrhu.
  • Validirajte parsirani objekat istom šemom u vlastitom kodu, na primjer pomoću biblioteke za JSON Schema, Pydantica ili Zoda.
  • Dug odgovor može završiti prije nego što je JSON kompletan. Odgovor bez streaminga prijavljuje finish_reason samo kao stop ili tool_calls, pa je greška pri parsiranju signal. Pitajte ponovo, ili tražite manji objekat.

Greške

Status Tip Poruka Kada
400 invalid_request_error <id> does not accept response_format Model ne prima nijedan mod.
400 invalid_request_error <id> does not accept response_format json_schema; use json_object Model prima json_object, a vi ste poslali json_schema.
422 invalid_request_error Failed to deserialize the JSON body into the target type: … response_format nema type, ili nije JSON objekat.

Dva odgovora 400 šalju se prije nego što se išta skine s vašeg stanja. Upravljanje greškama