Skip to content

refactor(agents): sorties structurées pour le scoreur de sévérité - #3

Merged
BazanJeremy merged 1 commit into
mainfrom
chore/structured-outputs
Sep 28, 2026
Merged

BazanJeremy merged 1 commit into
mainfrom
chore/structured-outputs

Conversation

@BazanJeremy

Copy link
Copy Markdown
Owner

Le scoreur de sévérité (severity_scorer.py) obtenait son JSON par la prose du prompt, puis nettoyait la réponse à la regex. Cette PR confie le format à l'API.

Avant / après

Avant Après
Format de sortie « Return ONLY the JSON object. No markdown, no explanation. » dans le prompt output_config.format : schéma JSON strict, valeurs autorisées imposées pour les quatre dimensions
Nettoyage re.sub des balises Markdown avant json.loads retiré : la réponse est du JSON par construction
Arrêt anormal (max_tokens, refusal) non détecté, finissait en erreur de parsing RuntimeError explicite ; score() bascule sur le calcul par règles, comme avant pour toute erreur de l'API

Le reste du prompt (la liste des champs et leur sens) ne change pas : c'est du contexte, pas une consigne de format.

Compatibilité du modèle

claude-sonnet-4-6 figure dans la liste des modèles compatibles avec les sorties structurées de la documentation Anthropic, consultée le 28.09.2026. Le modèle ne change pas.

Hors périmètre

Les deux autres agents qui forcent le JSON par le prompt restent tels quels :

  • report_enricher.py : son champ environment est un dictionnaire libre, forme que les sorties structurées n'acceptent pas (additionalProperties doit valoir false) ;
  • compliance_tagger.py : psd2_article peut être nul, cas que la documentation ne mentionne pas.

Vérifié

  • python -m pytest → 144 passed
  • ruff check src/ tests/ (0.15.20, la version épinglée en CI) → aucune erreur ; ruff format --check sur le fichier modifié → OK
  • Contrôle avec un faux client Anthropic (aucune suite ne passe par l'appel au modèle) : le schéma est bien envoyé, la réponse est bien lue (réponse simulée full / always / single / new → 8,1, critical), un arrêt max_tokens lève l'erreur attendue.

Non vérifié : un vrai appel à l'API, faute de clé sur la machine.

Le prompt imposait le format par la prose (« Return ONLY the JSON
object ») et le code retirait d'éventuelles balises Markdown à la regex
avant json.loads. Le format est maintenant garanti par l'API
(output_config.format, schéma JSON avec les valeurs autorisées de chaque
dimension) : la consigne et la regex deviennent inutiles et sont retirées.

Un arrêt autre que end_turn (max_tokens, refusal) lève désormais une
erreur explicite ; score() bascule alors sur le calcul par règles, comme
pour toute autre erreur de l'API.

claude-sonnet-4-6 figure dans la liste des modèles compatibles avec les
sorties structurées (documentation Anthropic, consultée le 28.09.2026).

Co-Authored-By: Claude Opus 5.5 <[email protected]>
@BazanJeremy
BazanJeremy merged commit b979a91 into main Sep 28, 2026
5 checks passed
@BazanJeremy
BazanJeremy deleted the chore/structured-outputs branch September 28, 2026 06:17
BazanJeremy added a commit that referenced this pull request Sep 28, 2026
…ompliance Tagger (#4)

Même changement que pour le Severity Scorer (#3) : le format JSON est
garanti par l'API (output_config.format) au lieu de « Return ONLY the
JSON object », et le retrait des balises Markdown à la regex disparaît.
Un arrêt autre que end_turn lève une erreur explicite ; les deux agents
basculent alors sur leurs règles, comme pour toute erreur de l'API.

- Report Enricher : environment était un dictionnaire libre, forme que
  les sorties structurées refusent. Il arrive en liste de paires
  (key, value), reconstruite en dictionnaire.
- Compliance Tagger : un schéma par secteur, valeurs fermées imposées
  (classe IEC 62304, niveau DORA) ; psd2_article accepte null via anyOf.

EnrichmentResult et ComplianceResult ne changent pas.

Co-authored-by: Claude Opus 5.5 <[email protected]>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant