Idee en 30 secondes
Tool Execution Layer est la couche de controle entre la decision de l agent et l action reelle.
L agent n execute pas les outils directement. Il propose seulement tool_call. Ensuite Tool Execution Layer verifie cet appel, applique les regles d acces, execute l outil et renvoie un resultat dans un format unique.
Quand c est utile : quand l agent travaille avec API, bases de donnees, fichiers ou code, ou la securite, la stabilite et le controle des side effects (changements d etat) sont importants.
LLM n a pas d acces direct aux side effects (changements d etat). Elle propose seulement tool_call, et le systeme decide si cette action peut etre executee.
Probleme
Quand l agent appelle les outils directement, des pannes typiques apparaissent vite :
- le modele genere des arguments invalides ;
- le mauvais outil est appele ;
- l outil se bloque ou renvoie un format imprevisible ;
- la meme action est lancee a nouveau et casse l etat du systeme ;
- l outil execute un side effect (changement d etat) qui ne peut pas etre repete en securite ;
- le modele essaie d executer une action que le systeme devait seulement proposer pour approbation.
Au final, l agent "fonctionne" formellement, mais le systeme devient fragile et dangereux.
Solution
Ajouter Tool Execution Layer comme gateway controle separe pour tous les tool_call.
Elle centralise les verifications, les policies et la gestion des erreurs avant de donner a l agent l acces a une action externe.
Analogie : comme un controle de securite a l aeroport.
Le passager ne monte pas immediatement dans l avion. D abord viennent les verifications de documents, bagages et regles d acces.
Tool Execution Layer, de la meme facon, ne laisse pas l agent executer une action arbitraire sans verification.
Comment Fonctionne Tool Execution Layer
Tool Execution Layer recoit la requete du Runtime, passe une sequence de verifications, puis execute l outil en mode controle.
Description du flow complet : Validate → Authorize → Execute → Normalize → Return
Validate
La couche verifie si l outil existe, s il est dans allowlist, et si les arguments respectent le schema.
Authorize
Les policies d acces sont appliquees : role, environnement, niveau de droits et limites d appels.
Execute
L outil est execute avec timeout et isolation la ou c est necessaire. retry est active seulement pour les operations idempotent, read-only ou specialement protegees.
Normalize
Le resultat est ramene a un format stable : ok, data, error_code, message, retryable.
Return
Runtime recoit une reponse structuree et decide de continuer ou de terminer la boucle.
Cette approche donne un comportement previsible meme quand certains outils sont instables.
Dans le Code, Cela Ressemble a Ceci
class ToolExecutionLayer:
def __init__(self, registry, policy, max_retries=1, timeout_s=8):
self.registry = registry
self.policy = policy
self.max_retries = max_retries
self.timeout_s = timeout_s
def execute(self, call, run_context):
tool_name = call["tool"]
args = call.get("args", {})
tool = self.registry.get(tool_name)
if tool is None:
return {"ok": False, "data": None, "error_code": "tool_not_found", "message": tool_name, "retryable": False}
if not self.policy.allowed(tool_name, run_context):
return {"ok": False, "data": None, "error_code": "tool_not_allowed", "message": tool_name, "retryable": False}
if not tool.validate_args(args):
return {"ok": False, "data": None, "error_code": "invalid_arguments", "message": "schema_mismatch", "retryable": False}
try:
# Retry only for idempotent/read-only/protected operations.
retries = self.max_retries if tool.retry_safe else 0
raw = tool.run(args, timeout_s=self.timeout_s, retries=retries)
return {
"ok": True,
"data": tool.normalize(raw),
"error_code": None,
"message": None,
"retryable": False,
}
except TimeoutError:
return {"ok": False, "data": None, "error_code": "tool_timeout", "message": tool_name, "retryable": True}
except Exception:
return {"ok": False, "data": None, "error_code": "tool_failed", "message": tool_name, "retryable": False}
Comment Cela se Voit Pendant l Execution
Requete : "Mets a jour le statut de commande #4821 et prepare une reponse client"
Step 1
Agent Runtime : appelle LLM.decide(...)
LLM : renvoie -> tool_call(update_order_status, {"order_id": 4821, "status": "shipped"})
Runtime : transmet tool_call a Tool Execution Layer
Step 2
Tool Execution Layer : Validate -> outil existe, arguments valides
Tool Execution Layer : Authorize -> role support_agent a l acces
Tool Execution Layer : Execute -> appelle API de mise a jour de statut
Tool Execution Layer: Normalize -> {"ok": true, "data": {"updated": true}, "error_code": null, "message": null, "retryable": false}
Runtime : ajoute le resultat a l etat et passe a l etape suivante
Runtime ne travaille plus avec des appels "bruts". Tous les outils passent par une couche controlee unique.
Quand c est Adapte - et Quand Ce Ne l est Pas
Tool Execution Layer est necessaire la ou le controle d acces, la stabilite et un format de reponse previsible sont importants. Pour un prototype avec un seul outil sur, elle peut etre excessive.
Adapte
| Situation | Pourquoi Tool Execution Layer est adaptee | |
|---|---|---|
| ✅ | L agent appelle plusieurs API externes avec des regles d acces differentes | Une couche unique de policy et validation supprime le chaos des verifications. |
| ✅ | Il y a des state-changing tools | Il faut controler les side effects (changements d etat) : droits, confirmation, idempotence et audit. |
| ✅ | Les erreurs outils ne doivent pas casser toute la boucle agent | La couche renvoie des codes d erreur controles et permet au Runtime de continuer ou d arreter. |
Non adaptee
| Situation | Pourquoi Tool Execution Layer n est pas adaptee | |
|---|---|---|
| ❌ | Chatbot one-shot avec un seul outil read-only sur | Execution layer complete apporte souvent plus de complexite que de benefice pratique. |
| ❌ | Pas d exigences sur policies, audit et gestion des echecs | La couche supplementaire complexifie le systeme sans gain pratique visible. |
Dans ces cas, un appel simple suffit :
result = tool.run(args)
Problemes et Echecs Typiques
| Probleme | Ce qui se passe | Comment prevenir |
|---|---|---|
| Arguments invalides | L outil echoue ou renvoie un resultat inutile | Validation de schema avant execution |
| Timeout outil | L etape agent se bloque et bloque execution loop | timeout, retry controle (seulement pour operations idempotent) et logique fallback |
| Action dangereuse | L agent execute une operation sans droits d acces | Allowlist, role-based policy et deny by default |
| Side effect non repetable | Un appel repete modifie l etat systeme une seconde fois (double debit, update duplique) | Cles d idempotence, deduplication, confirmation avant actions de mutation |
| Format de reponse instable | Runtime ne peut pas traiter le resultat correctement | Normaliser la reponse vers un contrat unique |
Une Tool Execution Layer stable reduit le risque d echecs silencieux et rend le comportement agent previsible en environnement production.
Comment Cela se Combine avec les Autres Patterns
Tool Execution Layer ne prend pas de decision a la place de l agent. Elle est responsable de la facon dont l action est executee apres la decision du modele.
- Agent Runtime - Runtime pilote la boucle, Tool Execution Layer execute
tool_callen securite. - Guarded-Policy Agent - les verifications policy sont en general implementees dans Tool Execution Layer.
- Code-Execution Agent - execution de code avec sandbox et timeout passe par cette couche.
- RAG Agent - les requetes vers les outils de retrieval passent aussi par un gateway unique.
Autrement dit :
- Agent Patterns definissent ce que l agent a decide de faire
- Tool Execution Layer definit comment cette action est executee en securite
En Quoi c est Different de Agent Runtime
| Agent Runtime | Tool Execution Layer | |
|---|---|---|
| Ce que cela controle | Toute la boucle agent | Un tool_call precis |
| Ce que cela decide | Quelle etape faire ensuite | Si l action peut etre executee en securite |
| Quand cela agit | A chaque etape du dialogue | Seulement quand un outil doit etre appele |
| Ce que cela renvoie | Etat suivant ou reponse finale | Resultat outil normalise ou erreur controlee |
Agent Runtime est le "chef d orchestre" de tout le processus.
Tool Execution Layer est le "gateway controle" pour les actions via outils.
En Bref
Tool Execution Layer:
- recoit
tool_calldu Runtime - verifie schema, droits et limites
- execute outil avec timeout ;
retryseulement pour operations sures - renvoie resultat normalise ou erreur controlee
FAQ
Q : Est-ce la meme chose que Agent Runtime ?
A : Non. Runtime pilote toute la boucle agent, tandis que Tool Execution Layer execute seulement les actions outils sous controle de regles.
Q : LLM peut-elle appeler API directement sans cette couche ?
A : Techniquement oui, mais c est risque. Sans Tool Execution Layer, il est difficile de garantir validation, acces, timeouts et format de reponse stable.
Q : Pourquoi ne pas faire les verifications dans chaque outil separement ?
A : C est possible, mais la logique se duplique vite. Une couche centralisee donne des policies unifiees, un audit plus simple et un comportement previsible.
Et Ensuite
Tool Execution Layer prend en charge l execution d action en securite. Ensuite, voyez qui decide quand et pourquoi lancer cette action:
- Policy Boundaries - quelles regles verifier avant execution.
- Agent Runtime - comment runtime controle la boucle et transmet
tool_callau gateway. - Containerizing Agents - comment isoler l execution des outils a risque.
- Production Stack - comment rendre l execution des outils maitrisable en production.