Joan edukira
Irteera egituratuak

Irteera egituratuak

Eskatu erantzuna JSON gisa: edozein JSON objektu, edo zuk bidaltzen duzun eskema jarraitzen duen JSON. Erabili programa batek, ez pertsona batek, erantzuna irakurtzen duenean.

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 erantzunaren testua da, choices[0].message.content-en:

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}
  }
}

response_format-en moduak

response_format /v1/chat/completions-en eremu bat da. Hori gabe erantzuna testu arrunta da.

Modua Balioa Zer jasotzen duzun
JSON objektua {"type": "json_object"} Erantzuna forma zehaztugabeko JSON da. Esan prompt-ean zer gako nahi dituzun.
JSON eskema {"type": "json_schema", "json_schema": {"name": "…", "schema": {…}}} Erantzunak bidaltzen duzun eskema jarraitzen du: bere gakoak, motak eta derrigorrezko eremuak.
Strict "strict": true json_schema-ren eremu bat, ez hirugarren modu bat. true da, false bidaltzen ez baduzu.
Eremua Mota Lehenetsia Deskribapena Aplikatzen duena
type string json_object edo json_schema. Derrigorrezkoa response_format-en barruan. text onartzen da eta testu-erantzun arrunta ematen du. Modua onartzen duen modelo guztiak
json_schema.schema object Erantzunak jarraitzen duen JSON Schema. Bidali type json_schema denean. Modua onartzen duen modelo guztiak
json_schema.name string Eskemaren etiketa bat, OpenAI formatuan bezala. Pisu irekiko modelo ostatatuak
json_schema.strict boolean true Erantzunak eskema zehatz-mehatz jarraitu behar duen ala ez. Shannon modeloek eskema guztiak strict gisa aplikatzen dituzte. Pisu irekiko modelo ostatatuak

JSON objektu moduak ez du eskemarik behar. Izendatu gakoak prompt-ean:

Eskaeraren gorputza
{
  "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"}
}

Modelo bakoitzaren euskarria

Modeloa json_object json_schema
Shannon modelo guztiak (shannon-*) Bai Bai
Pisu irekiko modelo ostatatuak, behean izendatutakoak izan ezik Bai Bai
Laguna-S-2.1-W4A16-AUTOROUND-REAP — —
inkling-W4A16-AUTOROUND-REAP Bai —

GET /v1/models-ek gauza bera jakinarazten du id bakoitzeko: capabilities.json_schema modelo guztietan, eta capabilities.response_format pisu irekiko modelo ostatatuetan. Modeloak eta prezioak

Onartutako eskema-gako-hitzak

Modelo batek zure eskematik jasotzen duena modeloaren eta endpointaren araberakoa da:

Modeloak /v1/chat/completions /v1/responses
Shannon modeloak Beheko gako-hitzen azpimultzoa, strict gisa aplikatua. Eskema bidaltzen duzun bezala, strict gisa aplikatua.
Pisu irekiko modelo ostatatuak Eskema bidaltzen duzun bezala. strict true da, zuk bidaltzen ez baduzu. Eskema bidaltzen duzun bezala. strict true da, zuk bidaltzen ez baduzu.

Shannon modeloen gako-hitzen azpimultzoa /v1/chat/completions-en:

Gako-hitza Nola irakurtzen den
Irakurtzen diren gako-hitzak type, format, title, description, nullable, enum, items, properties, required, minItems, maxItems, minimum, maximum, minLength, maxLength, pattern, anyOf, default
$ref Eskemaren goiko mailako $defs edo definitions-etik ebazten da. $ref-aren ondoan idatzitako gako-hitzak, adibidez description, mantentzen dira. Definizio egokirik gabeko erreferentzia bat {"type": "object"} gisa irakurtzen da.
allOf Kideak eskema bakarrean bateratzen dira. Bi kidek gako-hitz bera ezartzen dutenean, azkenak balio du.
oneOf anyOf gisa irakurtzen da.
Beren buruari erreferentzia egiten dioten eskemak 24 mailatara zabaltzen dira. Maila sakonago bat {"type": "object"} gisa irakurtzen da.
Azpimultzotik kanpo Gainerako gako-hitz guztiak, adibidez additionalProperties, const, multipleOf, uniqueItems, exclusiveMinimum, exclusiveMaximum, patternProperties, prefixItems, minProperties, maxProperties, not eta if / then / else. Hauek ez dira modeloak jasotzen duen eskemaren parte.

/v1/responses-en: text.format

/v1/responses-ek eskaera bera text.format gisa idazten du. Eskema zuzenean format-ean dago, name eta strict-en ondoan, ez json_schema gako baten azpian. JSON objektu modurako bidali {"format": {"type": "json_object"}}.

Eskaeraren gorputza
{
  "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 message elementuaren output_text zatiaren text da:

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": []
        }
      ]
    }
  ]
}

Modelo bakoitzaren euskarria eta erroreak /v1/chat/completions-en berberak dira. Responses API-a

/v1/messages-en: tresna bat eskema gisa

Messages formatuak ez du irteera egituratuko eremurik. Modelo berberen JSON lortzeko, deitu /v1/chat/completions edo /v1/responses giltza berarekin.

/v1/messages-en jarraitzeko, deskribatu objektua tresna gisa: jarri zure eskema input_schema-n eta izendatu tresna tool_choice-n. tool_use blokearen input-a orduan zure objektua da, dagoeneko parseatua. Izendatutako tool_choice bat pisu irekiko modelo ostatatuek aplikatzen dute.

Eskaeraren gorputza
{
  "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"}
    }
  ]
}

Egiaztatu stop_reason tool_use dela blokea irakurri aurretik. Funtzio-deiak

JSON nola iristen den

  • JSON kate bat da. Erantzunak ez du parseatutako objekturik ondoan: exekutatu zure JSON parserra message.content-en gainean.
  • stream: true-rekin JSON delta.content zatietan iristen da. Elkartu eta parseatu streama amaitu ondoren; zati bakar bat ez da JSON baliozkoa.
  • Pisu irekiko modelo ostatatu batek response_format eskaera bati arrazonamendu-testurik gabe erantzuten dio: reasoning_content null da.

Egiaztatu jasotzen duzuna

Eskemak modeloak nola idazten duen gidatzen du. APIak ez du amaitutako erantzuna zure eskemarekin alderatzen, beraz zure kodeak egiten du azken egiaztapena:

  • Parseatu errore-kudeatzaile baten barruan, goiko adibideak egiten duen bezala.
  • Balidatu parseatutako objektua eskema berarekin zure kodean, adibidez JSON Schema liburutegi batekin, Pydantic-ekin edo Zod-ekin.
  • Erantzun luze bat JSON osatu aurretik amaitu daiteke. Streamean ez doan erantzun batek finish_reason stop edo tool_calls gisa bakarrik jakinarazten du, beraz parse-errore bat da seinalea. Eskatu berriro, edo eskatu objektu txikiago bat.

Erroreak

Egoera Mota Mezua Noiz
400 invalid_request_error <id> does not accept response_format Modeloak ez du modurik onartzen.
400 invalid_request_error <id> does not accept response_format json_schema; use json_object Modeloak json_object onartzen du eta zuk json_schema bidali duzu.
422 invalid_request_error Failed to deserialize the JSON body into the target type: … response_format-ek ez du type-rik, edo ez da JSON objektu bat.

Bi 400 erantzunak zure saldotik ezer kendu aurretik bidaltzen dira. Errore‑kudeaketa