Guide Pratique de Kimi K3 : Nouveaux Paramètres et Matrice de Support API

AIHubMix8 min de lecture
Guide Pratique de Kimi K3 : Nouveaux Paramètres et Matrice de Support API

Cet article couvre les nouveaux paramètres et notes d'utilisation pour Kimi K3. Sur AIHubMix, K3 est disponible via les API de Chat Completions, Responses et Messages compatibles avec Claude. Voir aussi : documentation officielle de la plateforme Moonshot.

Les conclusions et réponses d'exemple "Vérifiées" dans chaque section proviennent d'appels réels effectués le 2026-07-17 via les API AIHubMix (Chat Completions / Responses / Messages).

1. Spécifications du Modèle en Un Coup d'Œil

Élément Valeur
Fenêtre de contexte 1M tokens
Sortie max max_completion_tokens par défaut à 131,072, jusqu'à 1,048,576
Modalités d'entrée Texte, images (pour l'entrée vidéo, voir la documentation officielle de Moonshot)
Mode de réflexion Activé par défaut ; reasoning_effort ne supporte que "max"
Séquences d'arrêt stop autorise au maximum 5 entrées, chacune ne dépassant pas 32 octets
Vérifié : les deux limites de stop sont validées, et dépasser l'une d'elles renvoie 400 ; l'API Messages applique la même validation aux stop_sequences.

Lorsqu'une séquence d'arrêt est atteinte, l'API Messages ne suit pas la sémantique d'Anthropic : lors des tests, stop_reason est "end_turn" (plutôt que "stop_sequence"), stop_sequence est null, et le texte visible avant le mot d'arrêt peut être vide. Les clients qui s'appuient sur ces deux champs pour détecter la troncature doivent en tenir compte.
# arrêt avec 6 entrées / une entrée de 33 octets -> HTTP 400
"Requête invalide : tableau d'arrêt trop long. Un tableau d'une longueur maximale de 5 était attendu, mais un tableau d'une longueur de 6 a été reçu à la place"
"Requête invalide : la séquence d'arrêt ne doit pas dépasser 32, mais a reçu 33 à la place"

2. Mode de Réflexion : reasoning_effort Ne Supporte Que max

La réflexion de K3 est activée par défaut, et reasoning_effort ne supporte qu'un seul niveau : "max".

Les conversations multi-tours doivent renvoyer l'historique de pensée tel quel : selon la documentation officielle de Moonshot, K3 est entraîné avec une pensée préservée, donc dans les conversations multi-tours, le message précédent de l'assistant doit être renvoyé complet et non modifié (y compris le contenu de réflexion). Un historique de pensée manquant entraîne une qualité de sortie instable. Si vous utilisez un cadre de gestion de session ou une couche proxy, confirmez que le contenu de réflexion est renvoyé sans être tronqué.
Chat Completions

Le contenu de réflexion est renvoyé dans le champ reasoning_content de la réponse ; dans les conversations multi-tours, renvoyez le message précédent de l'assistant (y compris reasoning_content) tel quel.

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": "Un escargot est au fond d'un puits de 10 mètres. Chaque jour, il grimpe de 3 mètres, mais chaque nuit, il glisse de 2 mètres. Combien de jours lui faut-il pour atteindre le sommet ?"}
    ],
)

print(completion.choices[0].message.reasoning_content)
print(completion.choices[0].message.content)
# Multi-tours : renvoyez le message précédent de l'assistant tel quel
messages = [
    {"role": "user", "content": "Quelle est la capitale de la France ?"},
    {"role": "assistant", "content": "Paris.", "reasoning_content": "<reasoning_content de la réponse précédente>"},
    {"role": "user", "content": "Et sa population ?"},
]
Vérifié : la réponse renvoie reasoning_content ; après avoir renvoyé le message précédent de l'assistant (y compris reasoning_content) tel quel, les tours suivants répondent normalement.
Réponses

Le contenu de réflexion est renvoyé en tant qu'élément de sortie reasoning ; dans les conversations multi-tours, ajoutez les éléments de sortie du tour précédent (reasoning + message) dans input tel quel.

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="Répondez en un mot : capitale de la France",
)

# Types d'éléments de réponse.output observés : ["reasoning", "message"]; texte : "Paris"
# Multi-tours : input = [premier message utilisateur] + response.output + [prochain message utilisateur]
# Réponse observée au deuxième tour avec éléments de sortie renvoyés : "Berlin"

Messages

Le contenu de réflexion est renvoyé sous forme de blocs de contenu thinking natifs ; dans les conversations multi-tours, renvoyez les blocs de contenu précédents de l'assistant (y compris les blocs de réflexion) tel quel.

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": "Répondez en un mot : capitale de la France"}
    ],
)

# Types de blocs de réponse.content observés : ["thinking", "text"]; texte : "Paris"
# Multi-tours : renvoyez response.content tel quel comme message de l'assistant

3. Les Paramètres d'Échantillonnage Sont Fixes

Les paramètres d'échantillonnage de K3 sont fixés par le fournisseur de modèle : temperature 1.0, top_p 0.95, n 1, et presence_penalty / frequency_penalty 0. La recommandation officielle est d'omettre ces paramètres des requêtes.

Remarque : les valeurs d'échantillonnage fixes font partie de la spécification officielle et ne peuvent pas être vérifiées à partir des signaux de réponse ; suivez la recommandation officielle et omettez ces paramètres.

4. Appel d'Outils et Chargement Dynamique d'Outils

tools prend en charge jusqu'à 128 outils ; tool_choice permet de forcer et de désactiver les appels d'outils. K3 prend également en charge le chargement dynamique d'outils : injection de nouveaux outils en cours de conversation via le champ tools d'un message système (une forme de message spécifique à l'API Chat).
Chat Completions

tool_choice prend en charge auto / none / required ; required force le modèle à appeler un outil. Chargement dynamique d'outils : le message système injectant l'outil ne contient pas de content, les outils injectés prennent effet pour les tours suivants, et le message doit être inclus à nouveau dans chaque requête.

messages = [
    {"role": "system", "content": "Vous êtes un assistant utile."},
    {"role": "user", "content": "Bonjour."},
    {"role": "assistant", "content": "Salut, comment puis-je vous aider ?"},
    # Injecter un nouvel outil en cours de conversation : champ tools uniquement, pas de contenu
    {
        "role": "system",
        "tools": [
            {
                "type": "function",
                "function": {
                    "name": "get_time",
                    "description": "Obtenir l'heure actuelle",
                    "parameters": {"type": "object", "properties": {}},
                },
            }
        ],
    },
    {"role": "user", "content": "Quelle heure est-il maintenant ?"},
]
# tool_choice="required" avec l'invite "Bonjour" -> le modèle est forcé d'appeler l'outil
"finish_reason": "tool_calls",
"tool_calls": [{"function": {"name": "get_weather", "arguments": "{\"city\":\"New York\"}"}}]
Vérifié : tool_choice: "required" force un appel d'outil même pour des invites non liées ; "none" supprime les appels d'outils ; les outils injectés en cours de conversation via un message système sans content peuvent être appelés normalement.
Réponses

Les définitions d'outils utilisent une structure plate (name au niveau supérieur) ; forcer un appel utilise également tool_choice: "required", et les appels sont renvoyés en tant qu'éléments de sortie function_call. Le support pour le chargement dynamique d'outils est en cours ; pour l'instant, déclarez tous les outils dans le paramètre tools de niveau supérieur.

response = client.responses.create(
    model="kimi-k3",
    input="Bonjour",
    tools=[{
        "type": "function",
        "name": "get_weather",
        "description": "Obtenir la météo pour une ville",
        "parameters": {"type": "object", "properties": {"city": {"type": "string"}}, "required": ["city"]},
    }],
    tool_choice="required",
)

# La sortie observée contient : {"type": "function_call", "name": "get_weather", "arguments": "{\"city\":\"London\"}"}

Messages

Les outils utilisent le format d'Anthropic (input_schema) ; forcez un appel avec tool_choice: {"type": "any"} et désactivez les appels avec {"type": "none"}. ❗ L'endpoint officiel Messages de Kimi K3 (compatible avec Anthropic) ne prend pas en charge le chargement dynamique d'outils : lors des tests, le message d'injection renvoie 200, mais l'outil injecté n'a aucun effet (le modèle ne peut pas l'appeler). Déclarez tous les outils dans le paramètre tools de niveau supérieur.

response = client.messages.create(
    model="kimi-k3",
    max_tokens=4096,
    tools=[{
        "name": "get_weather",
        "description": "Obtenir la météo pour une ville",
        "input_schema": {"type": "object", "properties": {"city": {"type": "string"}}, "required": ["city"]},
    }],
    tool_choice={"type": "any"},
    messages=[{"role": "user", "content": "Bonjour"}],
)

# Observé : stop_reason "tool_use"; le contenu contient un bloc tool_use appelant get_weather

5. Sortie Structurée

La sortie structurée permet au modèle de renvoyer un contenu qui respecte strictement un schéma JSON donné.
Chat Completions

response_format prend en charge json_schema avec le mode strict.

completion = client.chat.completions.create(
    model="kimi-k3",
    messages=[
        {"role": "user", "content": "Paris est la capitale de la France. Extraire le nom de la ville."}
    ],
    response_format={
        "type": "json_schema",
        "json_schema": {
            "name": "extract",
            "strict": True,
            "schema": {
                "type": "object",
                "properties": {"city": {"type": "string"}},
                "required": ["city"],
            },
        },
    },
)

# Contenu de réponse observé : {"city":"Paris"}
Vérifié : la sortie est un JSON valide conforme au schéma.
Réponses

La sortie structurée est déclarée via text.format.

response = client.responses.create(
    model="kimi-k3",
    input="Paris est la capitale de la France. Extraire le nom de la ville.",
    text={
        "format": {
            "type": "json_schema",
            "name": "extract",
            "strict": True,
            "schema": {"type": "object", "properties": {"city": {"type": "string"}}, "required": ["city"]},
        }
    },
)

# Texte de sortie observé : {"city":"Paris"}

Messages

L'endpoint officiel Messages de Kimi K3 (compatible avec Anthropic) ne prend pas en charge la sortie structurée : les champs de sortie structurée sont silencieusement ignorés : la requête renvoie HTTP 200 avec du texte libre, sans erreur ni avis de repli, et l'analyse JSON en aval échouera. Lorsque vous avez besoin d'une sortie structurée, utilisez l'API Chat Completions ou Responses.

6. La Mise en Cache du Contexte est Automatique

La mise en cache du contexte de K3 est activée automatiquement, sans paramètres requis. Lorsqu'un préfixe long répété touche le cache, le montant de l'atteinte est signalé dans l'utilisation (le nom du champ varie selon l'API). Les prix de cache sont sur la page du modèle.
Chat Completions

# utilisation du deuxième appel avec un préfixe long identique
"prompt_tokens_details": {"cached_tokens": 1536}
Vérifié : la deuxième requête avec un préfixe long identique signale l'atteinte dans usage.prompt_tokens_details.cached_tokens.
Réponses
# utilisation du deuxième appel Responses avec des instructions longues identiques
"input_tokens_details": {"cached_tokens": 1536}

Messages

# utilisation du deuxième appel Messages avec un message système long identique
"cache_read_input_tokens": 1536

7. Complétion de Préfixe partial

La complétion de préfixe permet au modèle de continuer à générer à partir d'un préfixe donné, bien adapté à la complétion de code et à la sortie contrôlée par format.
Chat Completions

Passer "partial": true dans le dernier message de l'assistant.

messages = [
    {"role": "user", "content": "Écrivez un haïku sur la mer."},
    {"role": "assistant", "content": "Les vagues se plient en mousse,", "partial": True},
]

# Préfixe : "Les vagues se plient en mousse," -> continuation renvoyée par le modèle
# le sel flotte dans l'air—
# la lune tire la marée chez elle.
Vérifié : la génération continue à partir du préfixe donné sans le répéter.
Réponses

Passer le préfixe comme un message d'assistant à la fin du tableau input ; aucun paramètre partial n'est nécessaire.

response = client.responses.create(
    model="kimi-k3",
    input=[
        {"role": "user", "content": "Écrivez un haïku sur la mer."},
        {"role": "assistant", "content": "Les vagues se plient en mousse,"},
    ],
)

# Continuation observée : "le sel flotte dans l'air— / la lune tire la marée chez elle."

Messages

La même capacité est réalisée avec le préremplissage natif de l'assistant du protocole, sans paramètre partial : passez le préfixe comme le dernier message de l'assistant.

response = client.messages.create(
    model="kimi-k3",
    max_tokens=4096,
    messages=[
        {"role": "user", "content": "Écrivez un haïku sur la mer."},
        {"role": "assistant", "content": "Les vagues se plient en mousse,"},
    ],
)

# Continuation observée : "le vent salé porte le cri des mouettes— / la marée tire ..."

8. Entrée Visuelle

Les images sont passées en tant que base64 ; le format de bloc de contenu varie selon l'API.
Chat Completions

messages = [
    {
        "role": "user",
        "content": [
            {"type": "text", "text": "Quelle est la couleur dominante de cette image ? Un mot."},
            {"type": "image_url", "image_url": {"url": "data:image/png;base64,<BASE64>"}},
        ],
    }
]

# Contenu de réponse observé : "Rouge"  (entrée : un PNG rouge solide de 64x64)
Vérifié : l'entrée d'image base64 fonctionne, et le modèle décrit correctement l'image de test.
Réponses
input = [
    {
        "role": "user",
        "content": [
            {"type": "input_text", "text": "Quelle est la couleur dominante de cette image ? Un mot."},
            {"type": "input_image", "image_url": "data:image/png;base64,<BASE64>"},
        ],
    }
]

# Texte de sortie observé : "Rouge"

Messages

messages = [
    {
        "role": "user",
        "content": [
            {"type": "text", "text": "Quelle est la couleur dominante de cette image ? Un mot."},
            {"type": "image", "source": {"type": "base64", "media_type": "image/png", "data": "<BASE64>"}},
        ],
    }
]

# Texte de réponse observé : "Rouge"

9. Référence Vérifiée : Latence et Utilisation d'une Tâche Longue en Un Seul Appel

La réflexion de K3 est fixée au niveau max, donc les demandes uniques pour des tâches complexes prennent beaucoup plus de temps que sur des modèles typiques. Données mesurées d'une tâche de génération de jeu HTML à fichier unique (une invite avec une image de référence, générée en une seule fois sans itération) : la demande unique a pris 2,541 secondes (environ 42 minutes), avec 74,994 tokens de complétion, dont 54,486 (73%) étaient des tokens de réflexion ; la sortie finale était de 1,275 lignes de code directement exécutable, avec finish_reason stop.

Recommandations côté client :

  • Définissez les délais d'attente du client à plusieurs minutes ou plus, et préférez le streaming pour les longues tâches ;
  • Laissez une marge suffisante dans max_completion_tokens : dans ce cas, la réflexion seule a consommé 54,486 tokens.

10. Matrice de Support des Capacités × API

Chaque cellule du tableau ci-dessous a été vérifiée le 2026-07-17 via des appels réels aux API de production AIHubMix ; chaque cellule montre la syntaxe des paramètres / champs pour l'API correspondante.

Capacité Chat Completions Responses Messages
Contenu de réflexion dans la réponse ✅ champ reasoning_content ✅ élément de sortie reasoning ✅ bloc de contenu thinking
Passage de l'historique de réflexion ✅ message de l'assistant renvoyé tel quel ✅ éléments de sortie renvoyés tel quel ✅ blocs de contenu renvoyés tel quel
Forcer / désactiver les appels d'outils tool_choice: "required" / "none" tool_choice: "required" {"type": "any"} / {"type": "none"}
Chargement dynamique d'outils ✅ message système avec tools (sans content) ➖ Support en cours ❗ Non pris en charge sur l'endpoint officiel Messages (compatible avec Anthropic)
Sortie structurée response_format (json_schema + strict) text.format (json_schema) ❗ Non pris en charge sur l'endpoint officiel ; les champs sont silencieusement ignorés (200 + texte libre) ; utilisez Chat / Responses à la place
Mesure automatique des atteintes de cache usage.prompt_tokens_details.cached_tokens usage.input_tokens_details.cached_tokens usage.cache_read_input_tokens
Complétion de préfixe "partial": true ✅ préremplissage de l'assistant ✅ préremplissage de l'assistant (natif au protocole)
Entrée visuelle image_url (base64) input_image (base64) ✅ bloc de contenu image (base64)
Séquences d'arrêt stop (limites validées) ➖ Support en cours ❗ les limites de stop_sequences validées de manière identique, mais lors d'une atteinte, ni stop_reason: "stop_sequence" ni la valeur de stop_sequence ne sont renvoyées

FAQ

Quelles API K3 prend-elle en charge sur AIHubMix ?
Chat Completions (/v1/chat/completions), Responses (/v1/responses), et l'API Messages compatible avec Claude (/v1/messages).

La réflexion peut-elle être désactivée ou réduite ?
Non. La réflexion de K3 est activée par défaut, et reasoning_effort ne supporte que le niveau unique "max".

Pourquoi reasoning_content doit-il être renvoyé dans les conversations multi-tours ?
K3 est entraîné avec une pensée préservée ; Moonshot exige que le message précédent de l'assistant soit renvoyé complet et non modifié. Un historique de pensée manquant entraîne une qualité de sortie instable.

Quelles sont les limites sur le paramètre stop ?
Au maximum 5 séquences d'arrêt, chacune ne dépassant pas 32 octets ; dépasser l'une des limites renvoie une erreur 400.

L'API Messages prend-elle en charge la sortie structurée ?
❗ Non. L'endpoint officiel Messages de Kimi K3 (compatible avec Anthropic) ignore silencieusement les champs de sortie structurée (renvoyant 200 avec du texte libre et sans erreur). Pour une sortie structurée, utilisez response_format sur Chat Completions ou text.format sur Responses.

Pourquoi les demandes uniques de K3 prennent-elles autant de temps ?
La réflexion de K3 est fixée au niveau max, et les tokens de réflexion représentent une grande part des tâches complexes (73 % des tokens de complétion dans le cas mesuré). Définissez les délais d'attente du client à plusieurs minutes ou plus et utilisez le streaming.


Pour les prix et l'état en temps réel, consultez la page du modèle Kimi K3 ; pour plus de modèles, visitez la galerie de modèles.

Dernière mise à jour : 2026-07-17