---
suivi: 1050
date: 2026-07-29
sujet: Fix tool_use.input objet JSON — consolidation Anthropic 400
chantier: aktor
type: fix
statut: poussé
hash: 53b59be2
fichiers:
  - app/Services/Assistant/AssistantConsolidationAgentService.php
  - tests/Unit/AssistantConsolidation1050ToolUseInputTest.php
  - docs/suivi/SUIVI_1050_fix_tool_use_input_objet.md
---

## PROMPT ENVOYÉ

SUIVI #1050 — rejet Anthropic 400 au 2e tour de consolidation :
`messages.1.content.0.tool_use.input: Input should be an object`.

Cause hypothétique : `json_encode([])` → `[]` au lieu de `{}` pour un outil sans
paramètres (`lister_taches_ouvertes`). Prouver, corriger la sérialisation, messages
d’erreur distincts (API vs note trop courte), test unitaire sans DB/réseau.
Ne pas toucher #1048, bilan, dépôt, prompt système, outils, #1027 (sauf signalement).

## SYNTHÈSE

### Preuve

`json_decode('{"input":{}}', true)` → `input` = `[]` (array PHP vide).
Réinjection dans `messages` (L168–171) puis `Http::post` → `"input":[]` → 400.
Chemin : boucle `executer()` → append assistant contentBlocks → `callAnthropic()` tour N+1.

### Correctif

- `normalizeMessagesForAnthropic()` : force `tool_use.input` vide/absent en `new \stdClass`
  (sérialise `{}`). Appelée dans `callAnthropic` avant POST.
- Pas de `JSON_FORCE_OBJECT` global (casserait messages/content/tools).
- `tool_result.content` reste une string (json_encode du payload) — non concerné.
- Messages UI distincts : erreur API (HTTP + snippet) ≠ note trop courte ≠ quota.
- Clôture forcée : si API null, retourne l’erreur API au lieu de tomber sur « note trop courte ».

### #1027 (fiche escalade)

`AssistantAnthropicService` : un seul appel Messages, **sans tools** dans le body, et sur
`stop_reason === tool_use` la boucle `break` immédiatement sans renvoyer de tool_result.
**Non concerné** — aucun changement.

## DÉPLOIEMENT-TEST

```bash
git pull origin main
php artisan optimize:clear
php artisan view:clear
find app/ -name "*.php" -exec touch {} +
```

Pas de migrate. Pas de npm/composer/optimize. Pas de journal:sync.
Test : clic « Générer une note de consolidation » sur `/aktor/consolidations`.

## LEÇON

En PHP, `json_encode([])` produit `[]` et non `{}`. L’API Anthropic exige un OBJET pour
`tool_use.input`. Un outil sans paramètre casse la boucle au tour suivant si l’input vide
n’est pas forcé en objet. Corollaire : un message utilisateur générique (« note trop courte »)
peut masquer une cause API totalement différente (#1043 / #1050).
