Skip to content

refactor(agents): sorties structurées pour le Report Enricher et le Compliance Tagger - #4

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

BazanJeremy merged 1 commit into
mainfrom
chore/structured-outputs-agents

Conversation

@BazanJeremy

Copy link
Copy Markdown
Owner

Suite de #3 : les deux derniers agents qui appellent le modèle passent aux sorties structurées.

Ce qui change

Comme pour le Severity Scorer dans #3 :

  • le format JSON est garanti par l'API (output_config.format) ;
  • « Return ONLY the JSON object » et le retrait des balises Markdown à la regex disparaissent ;
  • un arrêt max_tokens ou refusal lève une RuntimeError explicite ; les deux agents basculent alors sur leurs règles, comme pour toute autre erreur de l'API.
Agent Point particulier
Report Enricher environment était un dictionnaire libre, forme que les sorties structurées refusent (additionalProperties doit valoir false). Il arrive en liste de paires key / value, reconstruite en dictionnaire. Le prompt précise de ne rien renvoyer pour ce que le rapport ne mentionne pas.
Compliance Tagger Un schéma par secteur, avec les valeurs fermées imposées (classe IEC 62304 A/B/C, niveau DORA). psd2_article peut valoir null grâce à anyOf (types acceptés d'après la documentation Anthropic, consultée le 28.09.2026).

EnrichmentResult, ComplianceResult et le reste du pipeline ne changent pas. Les consignes de contenu des prompts (longueurs, format Given/When/Then, sens de chaque champ) restent.

Vérifié

  • python -m pytest → 144 passed
  • ruff check src/ tests/ (0.15.20, version épinglée en CI) → OK
  • mypy src/ : 33 erreurs, le même nombre que sur main (le job est non bloquant). Mes lignes n'en ajoutent pas.
  • Seules mes lignes changent : aucun reformatage du code existant.
  • Les quatre schémas de testscribe (dont celui du Severity Scorer, mergé dans refactor(agents): sorties structurées pour le scoreur de sévérité #3) contrôlés contre les règles documentées : objets fermés, toutes les propriétés requises, pas de contraintes numériques ni de longueur.
  • Contrôle avec un faux client Anthropic (aucune suite ne passe par l'appel au modèle) :
    • Compliance Tagger, fintech avec psd2_article: null et medtech en classe C → bien lus ;
    • un refus du modèle → bascule sur rule-based-fallback par la méthode publique tag() ;
    • Report Enricher : les paires environment sont bien reconstruites en dictionnaire, et un arrêt max_tokens lève l'erreur attendue.

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

…ompliance Tagger

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]>
@BazanJeremy
BazanJeremy merged commit 7d978c2 into main Sep 28, 2026
5 checks passed
@BazanJeremy
BazanJeremy deleted the chore/structured-outputs-agents branch September 28, 2026 12:35
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