Questo articolo illustra i nuovi parametri e le note d'uso per Kimi K3. Su AIHubMix, K3 è disponibile tramite le API Chat Completions, Responses e Messages compatibile con Claude. Vedi anche: documentazione ufficiale della piattaforma Moonshot.
Le conclusioni "Verificato" e le risposte di esempio in ogni sezione provengono da chiamate effettive eseguite il 17-07-2026 tramite le API di AIHubMix (Chat Completions / Responses / Messages).
1. Specifiche del modello in sintesi
| Voce | Valore |
|---|---|
| Finestra di contesto | 1M token |
| Output massimo | max_completion_tokens predefinito 131.072, fino a 1.048.576 |
| Modalità di input | Testo, immagini (per l'input video consulta la documentazione ufficiale di Moonshot) |
| Modalità di ragionamento | Attiva per impostazione predefinita; reasoning_effort supporta solo "max" |
| Sequenze di arresto | stop accetta al massimo 5 voci, ciascuna non più lunga di 32 byte |
Verificato: entrambi i limiti distopvengono validati e superarli restituisce 400; l'API Messages applica la stessa validazione astop_sequences.
❗ Quando viene raggiunta una sequenza di arresto, l'API Messages non segue la semantica di Anthropic: nei test,stop_reasonè"end_turn"(anziché"stop_sequence"),stop_sequenceènulle il testo visibile prima della parola di arresto può risultare vuoto. I client che si basano su questi due campi per rilevare un troncamento devono tenerne conto.
# stop with 6 entries / a 33-byte entry -> HTTP 400
"Invalid request: stop array too long. Expected an array with maximum length 5, but got an array with length 6 instead"
"Invalid request: stop sequence must not be longer than 32, but got 33 instead"
2. Modalità di ragionamento: reasoning_effort supporta solo max
Il ragionamento di K3 è attivo per impostazione predefinita, e reasoning_effort supporta un unico livello: "max".
La cronologia del ragionamento nelle conversazioni multi-turno va restituita integralmente: secondo la documentazione ufficiale di Moonshot, K3 è addestrato con ragionamento preservato, quindi nelle conversazioni multi-turno il messaggio precedente dell'assistente deve essere restituito completo e non modificato (incluso il contenuto del ragionamento). La mancanza della cronologia del ragionamento porta a una qualità dell'output instabile. Se usi un framework di gestione delle sessioni o un livello proxy, verifica che il contenuto del ragionamento venga restituito senza tagli.
Chat Completions
Il contenuto del ragionamento viene restituito nel campo reasoning_content della risposta; nelle conversazioni multi-turno, restituisci integralmente il messaggio precedente dell'assistente (incluso reasoning_content).
from openai import OpenAI
client = OpenAI(
base_url="https://aihubmix.com/v1",
api_key="<AIHUBMIX_API_KEY>",
)
completion = client.chat.completions.create(
model="kimi-k3",
reasoning_effort="max",
messages=[
{"role": "user", "content": "A snail is at the bottom of a 10-meter well. Each day it climbs 3 meters, but each night it slides back 2 meters. How many days does it take to reach the top?"}
],
)
print(completion.choices[0].message.reasoning_content)
print(completion.choices[0].message.content)
# Multi-turn: pass the previous assistant message back verbatim
messages = [
{"role": "user", "content": "What is the capital of France?"},
{"role": "assistant", "content": "Paris.", "reasoning_content": "<reasoning_content from the previous response>"},
{"role": "user", "content": "And its population?"},
]
Verificato: la risposta restituiscereasoning_content; dopo aver restituito integralmente il messaggio precedente dell'assistente (inclusoreasoning_content), i turni successivi rispondono normalmente.
Responses
Il contenuto del ragionamento viene restituito come elemento di output reasoning; nelle conversazioni multi-turno, aggiungi integralmente in input gli elementi di output del turno precedente (reasoning + message).
from openai import OpenAI
client = OpenAI(
base_url="https://aihubmix.com/v1",
api_key="<AIHUBMIX_API_KEY>",
)
response = client.responses.create(
model="kimi-k3",
input="Answer in one word: capital of France",
)
# Observed response.output item types: ["reasoning", "message"]; text: "Paris"
# Multi-turn: input = [first user message] + response.output + [next user message]
# Observed second-turn answer with output items passed back: "Berlin"
Messages
Il contenuto del ragionamento viene restituito come blocchi di contenuto thinking nativi; nelle conversazioni multi-turno, restituisci integralmente i blocchi di contenuto precedenti dell'assistente (inclusi i blocchi di thinking).
from anthropic import Anthropic
client = Anthropic(
api_key="<AIHUBMIX_API_KEY>",
base_url="https://aihubmix.com"
)
response = client.messages.create(
model="kimi-k3",
max_tokens=4096,
messages=[
{"role": "user", "content": "Answer in one word: capital of France"}
],
)
# Observed response.content block types: ["thinking", "text"]; text: "Paris"
# Multi-turn: pass response.content back verbatim as the assistant message
3. I parametri di campionamento sono fissi
I parametri di campionamento di K3 sono fissati dal fornitore del modello: temperature 1.0, top_p 0.95, n 1 e presence_penalty / frequency_penalty 0. La raccomandazione ufficiale è di omettere questi parametri dalle richieste.
Nota: i valori di campionamento fissi fanno parte della specifica ufficiale e non possono essere verificati dai segnali di risposta; segui la raccomandazione ufficiale e omettili.
4. Chiamata di strumenti e caricamento dinamico degli strumenti
tools supporta fino a 128 strumenti; tool_choice supporta la forzatura e la disattivazione delle chiamate agli strumenti. K3 supporta anche il caricamento dinamico degli strumenti: l'inserimento di nuovi strumenti durante la conversazione tramite il campo tools di un messaggio di sistema (una struttura di messaggio specifica dell'API Chat).
Chat Completions
tool_choice supporta auto / none / required; required obbliga il modello a chiamare uno strumento. Caricamento dinamico degli strumenti: il messaggio di sistema che inserisce gli strumenti non contiene content, gli strumenti inseriti hanno effetto dai turni successivi e il messaggio deve essere incluso di nuovo in ogni richiesta.
messages = [
{"role": "system", "content": "You are a helpful assistant."},
{"role": "user", "content": "Hello."},
{"role": "assistant", "content": "Hi, how can I help you?"},
# Inject a new tool mid-conversation: tools field only, no content
{
"role": "system",
"tools": [
{
"type": "function",
"function": {
"name": "get_time",
"description": "Get the current time",
"parameters": {"type": "object", "properties": {}},
},
}
],
},
{"role": "user", "content": "What time is it now?"},
]
# tool_choice="required" with prompt "Hello" -> the model is forced to call the tool
"finish_reason": "tool_calls",
"tool_calls": [{"function": {"name": "get_weather", "arguments": "{\"city\":\"New York\"}"}}]
Verificato:tool_choice: "required"forza una chiamata di strumento anche per prompt non pertinenti;"none"sopprime le chiamate agli strumenti; gli strumenti inseriti durante la conversazione tramite un messaggio di sistema senzacontentpossono essere chiamati normalmente.
Responses
Le definizioni degli strumenti usano una struttura piatta (name al livello superiore); forzare una chiamata si ottiene allo stesso modo con tool_choice: "required", e le chiamate vengono restituite come elementi di output function_call. Il supporto al caricamento dinamico degli strumenti è in corso; per ora, dichiara tutti gli strumenti nel parametro tools di primo livello.
response = client.responses.create(
model="kimi-k3",
input="Hello",
tools=[{
"type": "function",
"name": "get_weather",
"description": "Get weather for a city",
"parameters": {"type": "object", "properties": {"city": {"type": "string"}}, "required": ["city"]},
}],
tool_choice="required",
)
# Observed output contains: {"type": "function_call", "name": "get_weather", "arguments": "{\"city\":\"London\"}"}
Messages
Gli strumenti usano il formato Anthropic (input_schema); per forzare una chiamata usa tool_choice: {"type": "any"} e per disattivarle {"type": "none"}. ❗ L'endpoint Messages ufficiale di Kimi K3 (compatibile con Anthropic) non supporta il caricamento dinamico degli strumenti: nei test, il messaggio che li inserisce restituisce 200, ma lo strumento inserito non ha effetto (il modello non riesce a chiamarlo). Dichiara tutti gli strumenti nel parametro tools di primo livello.
response = client.messages.create(
model="kimi-k3",
max_tokens=4096,
tools=[{
"name": "get_weather",
"description": "Get weather for a city",
"input_schema": {"type": "object", "properties": {"city": {"type": "string"}}, "required": ["city"]},
}],
tool_choice={"type": "any"},
messages=[{"role": "user", "content": "Hello"}],
)
# Observed: stop_reason "tool_use"; content contains a tool_use block calling get_weather
5. Output strutturato
L'output strutturato fa sì che il modello restituisca contenuti che rispettano rigorosamente uno schema JSON dato.
Chat Completions
response_format supporta json_schema con modalità strict.
completion = client.chat.completions.create(
model="kimi-k3",
messages=[
{"role": "user", "content": "Paris is the capital of France. Extract the city name."}
],
response_format={
"type": "json_schema",
"json_schema": {
"name": "extract",
"strict": True,
"schema": {
"type": "object",
"properties": {"city": {"type": "string"}},
"required": ["city"],
},
},
},
)
# Observed response content: {"city":"Paris"}
Verificato: l'output è JSON valido conforme allo schema.
Responses
L'output strutturato si dichiara tramite text.format.
response = client.responses.create(
model="kimi-k3",
input="Paris is the capital of France. Extract the city name.",
text={
"format": {
"type": "json_schema",
"name": "extract",
"strict": True,
"schema": {"type": "object", "properties": {"city": {"type": "string"}}, "required": ["city"]},
}
},
)
# Observed output text: {"city":"Paris"}
Messages
❗ L'endpoint Messages ufficiale di Kimi K3 (compatibile con Anthropic) non supporta l'output strutturato: i campi relativi all'output strutturato vengono ignorati silenziosamente; la richiesta restituisce HTTP 200 con testo libero, senza errori né avvisi, e il parsing JSON a valle fallirà. Quando ti serve un output strutturato, usa l'API Chat Completions o Responses.
6. Il caching del contesto è automatico
Il caching del contesto di K3 è abilitato automaticamente, senza parametri da impostare. Quando un prefisso lungo e ripetuto colpisce la cache, la quantità di hit viene riportata in usage (il nome del campo varia a seconda dell'API). I prezzi della cache sono indicati nella pagina del modello.
Chat Completions
# usage of the second call with an identical long prefix
"prompt_tokens_details": {"cached_tokens": 1536}
Verificato: la seconda richiesta con un prefisso lungo identico riporta l'hit inusage.prompt_tokens_details.cached_tokens.
Responses
# usage of the second Responses call with identical long instructions
"input_tokens_details": {"cached_tokens": 1536}
Messages
# usage of the second Messages call with an identical long system prompt
"cache_read_input_tokens": 1536
7. Completamento del prefisso con partial
Il completamento del prefisso fa sì che il modello continui a generare a partire da un prefisso dato, particolarmente adatto al completamento di codice e a output con formato controllato.
Chat Completions
Passa "partial": true nell'ultimo messaggio dell'assistente.
messages = [
{"role": "user", "content": "Write a haiku about the sea."},
{"role": "assistant", "content": "Waves fold into foam,", "partial": True},
]
# Prefix: "Waves fold into foam," -> continuation returned by the model
# salt hangs in the air—
# moon pulls the tide home.
Verificato: la generazione prosegue dal prefisso dato senza ripeterlo.
Responses
Passa il prefisso come messaggio dell'assistente alla fine dell'array input; non serve il parametro partial.
response = client.responses.create(
model="kimi-k3",
input=[
{"role": "user", "content": "Write a haiku about the sea."},
{"role": "assistant", "content": "Waves fold into foam,"},
],
)
# Observed continuation: "salt hangs in the air— / moon pulls the tide home."
Messages
La stessa funzionalità si ottiene con il prefill nativo dell'assistente del protocollo, senza parametro partial: passa il prefisso come ultimo messaggio dell'assistente.
response = client.messages.create(
model="kimi-k3",
max_tokens=4096,
messages=[
{"role": "user", "content": "Write a haiku about the sea."},
{"role": "assistant", "content": "Waves fold into foam,"},
],
)
# Observed continuation: "salt wind carries the gull's cry— / tide pulls ..."
8. Input visivo
Le immagini vengono passate in base64; il formato dei blocchi di contenuto varia a seconda dell'API.
Chat Completions
messages = [
{
"role": "user",
"content": [
{"type": "text", "text": "What is the dominant color of this image? One word."},
{"type": "image_url", "image_url": {"url": "data:image/png;base64,<BASE64>"}},
],
}
]
# Observed response content: "Red" (input: a 64x64 solid red PNG)
Verificato: l'input di immagini in base64 funziona e il modello descrive correttamente l'immagine di test.
Responses
input = [
{
"role": "user",
"content": [
{"type": "input_text", "text": "What is the dominant color of this image? One word."},
{"type": "input_image", "image_url": "data:image/png;base64,<BASE64>"},
],
}
]
# Observed output text: "Red"
Messages
messages = [
{
"role": "user",
"content": [
{"type": "text", "text": "What is the dominant color of this image? One word."},
{"type": "image", "source": {"type": "base64", "media_type": "image/png", "data": "<BASE64>"}},
],
}
]
# Observed response text: "Red"
9. Riferimento verificato: latenza e utilizzo di un'attività lunga in una sola chiamata
Il ragionamento di K3 è fissato al livello max, quindi le richieste singole per attività complesse richiedono molto più tempo rispetto ai modelli tipici. Dati misurati da un'attività di generazione di un gioco HTML in un unico file (un solo prompt con un'immagine di riferimento, generato in un'unica soluzione senza iterazioni): la singola richiesta ha impiegato 2.541 secondi (circa 42 minuti), con 74.994 token di completamento, di cui 54.486 (73%) token di ragionamento; l'output finale è composto da 1.275 righe di codice eseguibile direttamente, con finish_reason stop.
Raccomandazioni lato client:
- Imposta timeout del client di minuti o più, e preferisci lo streaming per le attività lunghe;
- Lascia ampio margine in
max_completion_tokens: in questo caso il solo ragionamento ha consumato 54.486 token.
10. Matrice di supporto Funzionalità × API
Ogni cella della tabella seguente è stata verificata il 17-07-2026 tramite chiamate effettive alle API di produzione di AIHubMix; ogni cella mostra la sintassi del parametro / campo per l'API corrispondente.
| Funzionalità | Chat Completions | Responses | Messages |
|---|---|---|---|
| Contenuto del ragionamento nella risposta | ✅ campo reasoning_content |
✅ elemento di output reasoning |
✅ blocco di contenuto thinking |
| Restituzione della cronologia del ragionamento | ✅ messaggio dell'assistente restituito integralmente | ✅ elementi di output restituiti integralmente | ✅ blocchi di contenuto restituiti integralmente |
| Forzare / disattivare le chiamate agli strumenti | ✅ tool_choice: "required" / "none" |
✅ tool_choice: "required" |
✅ {"type": "any"} / {"type": "none"} |
| Caricamento dinamico degli strumenti | ✅ messaggio di sistema con tools (senza content) |
➖ Supporto in corso | ❗ Non supportato sull'endpoint Messages ufficiale (compatibile con Anthropic) |
| Output strutturato | ✅ response_format (json_schema + strict) |
✅ text.format (json_schema) |
❗ Non supportato sull'endpoint ufficiale; i campi vengono ignorati silenziosamente (200 + testo libero); usa Chat / Responses |
| Misurazione automatica dei hit della cache | ✅ usage.prompt_tokens_details.cached_tokens |
✅ usage.input_tokens_details.cached_tokens |
✅ usage.cache_read_input_tokens |
| Completamento del prefisso | ✅ "partial": true |
✅ prefill dell'assistente | ✅ prefill dell'assistente (nativo del protocollo) |
| Input visivo | ✅ image_url (base64) |
✅ input_image (base64) |
✅ blocco di contenuto image (base64) |
| Sequenze di arresto | ✅ stop (limiti validati) |
➖ Supporto in corso | ❗ I limiti di stop_sequences vengono validati allo stesso modo, ma in caso di corrispondenza non viene restituito né stop_reason: "stop_sequence" né il valore stop_sequence |
FAQ
Quali API supporta K3 su AIHubMix?
Chat Completions (/v1/chat/completions), Responses (/v1/responses) e l'API Messages compatibile con Claude (/v1/messages).
Il ragionamento può essere disattivato o ridotto?
No. Il ragionamento di K3 è attivo per impostazione predefinita, e reasoning_effort supporta solo il singolo livello "max".
Perché reasoning_content deve essere passato nelle conversazioni multi-turn?
K3 è addestrato con il pensiero preservato; Moonshot richiede che il messaggio precedente dell'assistente venga passato per intero e senza modifiche. Se manca la cronologia del ragionamento, la qualità dell'output diventa instabile.
Quali sono i limiti del parametro stop?
Sono consentite al massimo 5 sequenze di stop, ciascuna di non più di 32 byte; superando uno dei due limiti viene restituito un errore 400.
L'API Messages supporta l'output strutturato?
❗ No. L'endpoint Messages ufficiale di Kimi K3 (compatibile con Anthropic) ignora silenziosamente i campi per l'output strutturato, restituendo 200 con testo libero e nessun errore. Per l'output strutturato, usa response_format su Chat Completions oppure text.format su Responses.
Perché le singole richieste a K3 richiedono così tanto tempo?
Il pensiero di K3 è fissato al livello massimo e i token di ragionamento rappresentano una quota elevata nei compiti complessi (73% dei token di completamento nel caso misurato). Imposta i timeout del client su minuti o più e usa lo streaming.
Per i prezzi e lo stato in tempo reale, consulta la pagina del modello Kimi K3; per altri modelli, visita la galleria dei modelli.
Ultimo aggiornamento: 2026-07-17



