Skip to main content

Installation

Versions supportées : crewai 1.13 à 2.0. La version 1.13 est celle qui a introduit started_event_id et normalisé l’utilisation des tokens, deux éléments dont l’adaptateur dépend pour associer les événements et rapporter les tokens.

Instrumentation

instrument() enregistre un écouteur sur le bus d’événements de niveau module de CrewAI et abonne un gestionnaire par classe d’événement. Votre crew, vos agents, vos tâches et vos outils restent inchangés.

Ce qui est enregistré

Une tâche n’émet délibérément aucun événement. Une tâche CrewAI est un sous-ensemble de l’exécution de l’agent qui la traite ; émettre les deux doublerait chaque ligne et les rendrait comme des éléments frères. L’identifiant et le nom de la tâche sont transmis avec les propres événements de l’agent. Les opérations de mémoire et de connaissance sont enregistrées comme des outils, nommés selon la surface qu’elles touchent, afin d’apparaître à côté de vos vrais outils et de permettre la comparaison de leur latence. Dans un crew hiérarchique, l’imbrication est ce qui rend la trace lisible :
CrewAI rattache une exécution déléguée à l’événement d’outil delegate_work_to_coworker, et non directement au manager ; l’adaptateur suit donc ce lien. Sans cela, chaque agent apparaîtrait comme frère de tous les autres et la structure de délégation serait perdue.

Exemple

La passation est visible dans la trace : le span analyst se ferme, le span writer s’ouvre, et les deux se trouvent à l’intérieur d’un même span crew.

Nommez vos spans

agent_id provient de Agent(role=...), ce qui en fait une facette lisible dans le tableau de bord.
agent_id est une colonne à faible cardinalité. Un rôle contenant un identifiant d’exécution ou un horodatage la dégrade pour toutes les requêtes. Si un rôle ressemble à un identifiant, l’adaptateur le refuse et place la valeur réelle dans un champ de payload.

Contrôler la session

Résolution dans cet ordre, avec le premier résultat retenu :
  1. instrument("crewai", session_id=...)
  2. Le scope failproofai_sdk.session() englobant
  3. Un uuid4().hex généré, une fois par crew ou flow
Enveloppez le kickoff pour le contrôler par exécution :

Options

session_id est la seule option que cet adaptateur prend en compte. Les prompts et les complétions sont toujours enregistrés, tronqués selon le budget du payload.

Humain dans la boucle

CrewAI dispose de deux surfaces d’interaction humaine dans la boucle, toutes deux enregistrées sous les quatre mêmes événements. @human_feedback sur une méthode de flow passe par le bus d’événements de CrewAI : le runtime émet un événement avant de bloquer en attendant une réponse humaine, puis un autre après. Task(human_input=True) ne le fait pas. Cette option appelle input() dans le propre fournisseur d’entrée de CrewAI sans émettre aucun événement, c’est pourquoi l’adaptateur enveloppe directement ce fournisseur — sans quoi l’attente humaine était invisible et comptée comme du temps actif de l’agent. Dans les deux cas, vous obtenez :
La paire agent_pause / agent_resume est la seule qui alimente le temps en pause. Sans elle, une attente humaine de dix minutes est comptabilisée comme dix minutes de temps actif de l’agent.
CrewAI n’associe aucun identifiant de corrélation aux événements de retour humain ; l’adaptateur les apparie donc sur le nom du flow et de la méthode, en se rabattant sur la pause ouverte la plus récente. Cela est fiable car une invite console bloque l’exécution. Si vous construisez un fournisseur de retour concurrent, définissez request_id sur les deux événements.
Comme le chemin Task(human_input=True) est un wrapper autour du fournisseur d’entrée de CrewAI plutôt qu’un abonnement à un événement, il est restauré lors de uninstrument() et propage telles quelles toutes les exceptions levées par input(), y compris KeyboardInterrupt.

Problèmes courants

Un role contient un UUID, un horodatage ou un suffixe propre à une exécution. Utilisez un rôle humain stable et placez l’identifiant spécifique à l’exécution dans la description de la tâche.
Le bus d’événements est asynchrone et kickoff() retourne avant que les derniers gestionnaires aient été exécutés. Videz-le d’abord :
Il s’agit d’un comportement propre à CrewAI, non au SDK.
agent_end force la fermeture des pauses ouvertes, mais pas des outils ni des modèles ; une exécution qui se termine au milieu d’un appel d’outil laisse donc ce span ouvert. Un arrêt normal ferme tout ce qui est encore ouvert et le marque comme incomplet. Seul un SIGKILL laisse un span en suspens, car rien ne peut s’exécuter.
Vérifiez dans cet ordre : instrument() a été appelé avant kickoff() ; un with failproofai_sdk.session(): l’englobe ; crewai est en version 1.13 ou supérieure ; FAILPROOFAI_SDK_STRICT=1 est défini pour qu’un hook dégradé lève une exception plutôt que d’être ignoré silencieusement.

Étapes suivantes

Fonctionnement

Paires, identifiants, cycle de vie des sessions et livraison.

Lire une trace

Suivez la causalité dans la session que vous venez de capturer.

Autres frameworks

LangGraph, LlamaIndex, Pydantic AI et agents personnalisés.