SYS_PQ_1 — Procédure d'orchestration des appels LLM
Procédure légère (Direction technique déjà construite). Le comment détaillé vit dans les workflows n8n et les ADR — cette procédure cadre les responsabilités et renvoie aux textes. [CORPUS]
Objet
Décrire comment VESICA exécute, de façon homogène et tracée, tout appel à un modèle de langage, en passant par l'orchestrateur unique agent_call. [CORPUS]
Domaine d'application
S'applique à tout appel LLM du système, quels que soient la Direction appelante, l'agent et le fournisseur de modèle. Exclusions : les appels Mistral d'ingestion documentaire (OCR, transcription Voxtral) ne sont pas des appels d'agent et ne passent pas par agent_call (cf. 07 B2bis ; ils ne sont pas télémétrés). [CORPUS]
Références
- Workflows :
agent_call(orchestrateur),prepare_agent_call(assemblage),get_agent_config(DAL config). Contrats :07_Reference_Systeme.md§B2.11 / §B2.3 / §B2.3ter. [CORPUS] - ADR-028 — sortie structurée « Voie A robuste » : plancher (schéma injecté dans le prompt, tous modèles) + plafond (
response_format: json_schemanatif si modèle capable). [CORPUS] - ADR-029 — télémétrie LLM souveraine, capture synchrone non bloquante, coût natif OpenRouter. [CORPUS]
- ADR-033 — magasin cible Postgres ; lecture config via DAL
get_*(aucune lecture fichier directe par l'orchestrateur). [CORPUS] - ADR-039 — pattern T (transactionnel,
agent_calltélémétré) vs C (conversationnel, wrapper mémoire — jamais le nœud agent natif n8n). [CORPUS] - Pas de norme AFNOR ni de procédure franchiseur applicable (processus purement technique interne). [STANDARD]
Définitions
agent_key: clé canonique d'un agent au formatCODE-NN(Direction + matricule local). [CORPUS]- Plancher : injection du schéma de sortie dans le message système (déterminisme du format, tous modèles). [CORPUS]
- Plafond :
response_format: json_schema strict:trueenvoyé à OpenRouter quand le modèle supportestructured_outputs. [CORPUS] - Fire-and-forget : l'écriture de télémétrie ne peut jamais bloquer ni corrompre la sortie de l'appel (
onError:continueRegularOutput). [CORPUS] - Soft-error (D2) : réponse HTTP 200 mais corps invalide (
body.errorprésent ouchoicesvide) → routée vers la branche d'échec. [CORPUS]
Responsabilités (RACI)
| Activité | agent_call | prepare_agent_call | get_agent_config | Workflow appelant | Gérant |
|---|---|---|---|---|---|
Fournir agent_key + message | — | — | — | R | C |
| Résoudre config + modèle (DAL) | A | C | R | — | — |
| Assembler messages + plancher | A | R | C | — | — |
| Exécuter l'appel HTTP OpenRouter | R | — | — | — | — |
Appliquer le plafond response_format | R | C | C | — | — |
| Capturer la télémétrie | R (via log_llm_call) | — | — | I | I |
| Gérer l'échec (notif + sortie propre) | R | — | — | I | I |
| Maintenir les workflows / credentials | C | — | — | — | R/A |
Déroulement (qui/quoi/quand/où)
- Qui : workflow appelant — Quoi : appelle
agent_callenExecute Workflowavec le contrat d'entrée — Où : n8n (main/worker). [CORPUS] - agent_call valide l'input (exige
agent_key), pose les défautsdossier_id/task_type=null. [CORPUS] - agent_call délègue à
prepare_agent_call, qui délègue lui-même àget_agent_config(DAL) la résolution config/modèle/capacité/schéma, puis assemblemessages[system,user](+ plancher si schéma actif). [CORPUS] - agent_call route sur
type_agent:chain→ appel HTTP ;agent_tools→ throw (Lot 11). [CORPUS] - agent_call pose
t0, exécutePOST openrouter.ai/api/v1/chat/completions(avecusage:{include:true}et le plafondresponse_formatsi capable), parse la réponse. [CORPUS] - agent_call appelle
log_llm_call(fire-and-forget) puis renvoie la sortie succès. [CORPUS] - En cas d'échec (HTTP non-2xx ou soft-error D2) : convergence vers
Build error log payload→log_llm_call(success=false)→ notifllm_error→Error output { success:false }sans throw (cf.SYS_PQ_5). [CORPUS]
Enregistrements associés
telemetrie.appels_llm(1 ligne / appel) — cf.SYS_FQ_2(enregistrement partagé, propriétéSYS_PRO_2). [CORPUS]
Annexes
- Topologie complète des nœuds + IDs réels :
07_Reference_Systeme.md§B2.11. [CORPUS] - Décisions de conception : ADR-028, ADR-029 (D1–D5), ADR-033. [CORPUS]