← Retour au blog
Analyse

Après la bêta publique Claude Message Threads du 2 novembre 2026 : faut-il renvoyer le JSON Schema des tools à chaque tour d’Agent ?

Publié le 2026-11-03 Mis à jour le 2026-11-03 Environ 11 min JSON Boîte à outils

Où mène cette note

Au 2026-11-03, les notes de version plateforme du 2026-11-02 annoncent la bêta publique de Message Threads pour la Messages API (en-tête bêta message-threads-2026-08-12). Dans une boucle Agent, plus besoin d’envoyer tout le transcript à chaque tour — ce n’est pas « sans contrat d’outils » : le premier tour thread: { "type": "create" } doit inclure chaque input_schema dans tools ; en continue, ne pas renvoyer system / tools (sinon 400) — le serveur garde l’instantané du create. Répartition avec changer le schema outil en session et compaction OpenAI en fin d’article.

Avant, un Agent long POSTait chaque tour toute la bibliothèque tool_result et input_schema — sous 128 Mo, mais TTFT dégradé (voir la note 128 Mo). Message Threads stocke la conversation côté serveur — tools omis sur le fil, schema toujours actif dans le fil.

Ce qu’ajoute le 2 novembre

  • Capacité : la Messages API reçoit le paramètre thread ; disponible sur Claude API, AWS, hébergement Google Cloud Anthropic, Microsoft Foundry.
  • En-tête : chaque requête envoie anthropic-beta: message-threads-2026-08-12.
  • Effet : requêtes suivantes n’envoient que des messages incrémentaux plus previous_message_id ; la doc cite ~35 % de baisse médiane du TTFT sur sessions 500k–1M tokens (scénario Claude Code activé par défaut).
  • Facturation : usage de tokens identique sans fil ; vous économisez bande passante et latence au premier token, pas les octets de schema.

create vs continue

Table doc « What to send on each request » :

  • Create uniquement : system, tools (chaque input_schema, strict: true). Une fois au create.
  • Continue : seulement les nouveaux messages depuis le tour précédent (souvent user ou tool_result), plus thread: { "type": "continue", "previous_message_id": "…" }.
# Tour 1 — create (extrait)
{
  "model": "claude-haiku-5-5",
  "max_tokens": 1024,
  "system": "You are a ticket agent.",
  "tools": [{
    "name": "update_ticket",
    "description": "Update fields",
    "input_schema": {
      "type": "object",
      "properties": { "ticket_id": { "type": "string" }, "status": { "type": "string" } },
      "required": ["ticket_id", "status"],
      "additionalProperties": false
    }
  }],
  "messages": [{ "role": "user", "content": "Close ticket T-9." }],
  "thread": { "type": "create" }
}

# Tour 2 — continue (pas de tools / system)
{
  "model": "claude-haiku-5-5",
  "max_tokens": 1024,
  "messages": [{
    "role": "user",
    "content": [{ "type": "tool_result", "tool_use_id": "…", "content": "ok" }]
  }],
  "thread": { "type": "continue", "previous_message_id": "msg_01..." }
}

En une phrase. Le JSON Schema n’apparaît sur le fil qu’une fois, au create ; continue s’appuie sur l’instantané serveur — ce n’est pas « schema annulé ».

Champs fixes et output_config

Outre les champs create-only, des champs fixes doivent être renvoyés identiques à chaque tour, comme au create, sinon thread_fingerprint_mismatch :

  • model, tool_choice, thinking, output_config, mcp_servers (tokens d’auth exceptés), cache_control de premier niveau, etc.
  • Sortie structurée : JSON Schema dans output_config.format.schema au create ; chaque continue envoie le même output_config — pas create-only.

Les helpers SDK thread omettent create-only et répètent les champs fixes ; en cURL manuel, ne pas oublier output_config.

Changer le schema en cours de fil ?

Fils append-only. Doc : après une réponse, les helpers refusent de modifier system ou tools. Pour changer input_schema :

  1. Nouveau thread: create, rejouer les messages complets stockés localement, attacher de nouveaux tools ; ou
  2. Fork du fil et mise à jour des paramètres au premier tour du fork (doc Message threads, section fork).

Cela diffère de inline-tools qui ajoute ou retire des définitions dans les messages : inline modifie encore le transcript ; Message Threads fige tools de premier niveau au create. Ne pas mélanger les deux mécanismes sur le même champ sans lire la doc.

404 et expiration 5 minutes

  • Les fils expirent 5 minutes après la dernière requête ; si continue renvoie 404, recréer depuis une copie locale complète (avec system, tools, schema).
  • L’application reste source de vérité ; les copies mémoire du helper SDK ne sont pas persistées — rejouer après redémarrage.
  • Les tours tronqués par max_tokens (appels d’outil, etc.) peuvent ne pas être stockés — le continue suivant échoue — rejouer avec définitions d’outils complètes.

Essayer dans JSON Boîte à outils

{
  "create_tools": { "name": "update_ticket", "schema_ref": "turn1.tools[0].input_schema" },
  "continue_wrong": { "includes_tools_array": true, "expect": "400" },
  "tool_result_ok": { "ticket_id": "T-9", "status": "closed" },
  "tool_result_bad": { "ticket_id": "T-9", "status": 9 }
}
  1. Valider tool_result_ok / tool_result_bad contre le schema à create_tools.schema_ref (Validation schema).
  2. continue_wrong est un marqueur d’anti-pattern d’intégration, pas un corps API.
  3. Référence Function Calling : Function Calling.

FAQ

continue peut-il inclure un tableau tools ?

Non — 400.

Message Threads économise des tokens ?

Non — seulement taille de requête et TTFT.

Changer input_schema en cours ?

Nouveau thread create ou fork, puis replay.

output_config.format.schema à chaque tour ?

Oui — champ fixe.

Différence avec compaction OpenAI ?

Compaction = OpenAI Responses ; cette note = Claude Message Threads.

Résumé

Au 2026-11-03, Message Threads du 2026-11-02 permet aux Agents de ne plus renvoyer le JSON Schema des tools dans le corps HTTP aux tours suivants, mais le create doit être correct, et continue ne doit plus envoyer tools/system. Les champs fixes comme output_config doivent rester identiques. Changer le schema exige un nouveau fil ; 404 exige un replay complet avec tools. Facture tokens inchangée — valider localement le JSON des tool_use. Prochaine étape : boucle outil en deux tours avec le helper SDK thread ; continue sans tools, avec le même output_config.