Installation
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 :
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
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 :instrument("crewai", session_id=...)- Le scope
failproofai_sdk.session()englobant - Un
uuid4().hexgénéré, une fois par crew ou flow
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 :
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
Le filtre d'agents contient des milliers d'entrées
Le filtre d'agents contient des milliers d'entrées
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.Un test ne lit aucun événement, mais le tableau de bord les affiche
Un test ne lit aucun événement, mais le tableau de bord les affiche
Le bus d’événements est asynchrone et Il s’agit d’un comportement propre à CrewAI, non au SDK.
kickoff() retourne avant que les derniers gestionnaires aient été exécutés. Videz-le d’abord :Une session apparaît comme en cours indéfiniment
Une session apparaît comme en cours indéfiniment
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.Rien n'est enregistré
Rien n'est enregistré
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.

