Skip to main content
Découvrez comment instrumenter une application agentique sur plusieurs tours de conversation à l’aide du SDK CoreWeave Forge afin de visualiser, de déboguer et d’évaluer le comportement de votre agent. Ce guide s’adresse aux développeurs qui créent ou intègrent des agents et souhaitent bénéficier d’une visibilité structurée sur les conversations, les tours de conversation, les appels LLM et les exécutions d’outils. Le SDK Agent Lens modélise le cycle de vie complet d’une conversation d’agent sur plusieurs tours de conversation : l’agent, auquel sont rattachées de nombreuses conversations ; la conversation, qui regroupe les tours de conversation ; chaque échange entre l’utilisateur et l’agent (tour de conversation) ; les appels LLM effectués au cours d’un tour de conversation ; et les exécutions d’outils déclenchées par un LLM. Les traces s’affichent dans l’onglet Conversations de votre projet CoreWeave Agent Lens. Chaque conversation présente une chronologie sur plusieurs tours de conversation, avec les appels d’outils imbriqués, l’utilisation des jetons et le feedback. Agent Lens repose sur OpenTelemetry (OTel), la norme ouverte de traçage distribué. Chaque tour de conversation, appel LLM et appel d’outil émet un span OTel (un enregistrement structuré d’une opération). Chaque span est tagué avec des attributs issus des conventions sémantiques GenAI, tels que gen_ai.agent.name et gen_ai.conversation.id.

Avant de commencer

Pour commencer, installez le SDK Agent Lens et initialisez votre projet. Cette étape enregistre votre entity et votre projet auprès d’Agent Lens afin que le SDK achemine les spans vers le bon emplacement dans l’interface utilisateur. Le SDK lit votre clé API dans la variable d’environnement WANDB_API_KEY.
Remplacez [YOUR-TEAM] par le nom de votre entity Forge et [YOUR-PROJECT] par le nom de votre projet. L’entity est requis.
Appelez tracing.init() avant tout appel à start_conversation(), start_turn(), start_llm(), start_tool() ou start_subagent(). Avant l’exécution de init(), ou après shutdown(), les fonctions de traçage n’ont silencieusement aucun effet. Vous pouvez donc laisser l’instrumentation dans le code de production et la piloter par la configuration. Appelez tracing.shutdown() à la fin de votre processus pour procéder au vidage des spans encore en mémoire tampon. Cette fonction est également enregistrée auprès d’atexit.

Le modèle de données des agents

Agent Lens modélise le comportement des agents sous la forme d’une hiérarchie de relations un-à-plusieurs. Chaque agent peut avoir plusieurs conversations, chaque conversation peut comporter plusieurs tours de conversation, chaque tour de conversation peut comporter plusieurs appels LLM, et chaque appel LLM peut déclencher plusieurs appels d’outil. Le diagramme suivant montre comment un agent englobe plusieurs conversations, une conversation plusieurs tours de conversation, et ainsi de suite. Une conversation regroupe les tours de conversation au moyen d’un attribut conversation_id partagé, et non d’un span parent : chaque tour de conversation démarre donc sa propre trace OTel. Cette conception prend en charge le traçage distribué et l’exécution parallèle. Le client envoie les spans directement au collecteur OTel, sans aucune agrégation côté serveur.
Pour intégrer Agent Lens à des SDK d’agent ou à des harness tels que le Claude Agent SDK ou Codex, consultez Choisir une intégration d’agent. Ces intégrations définissent conversation_id à partir de la session du SDK ou du harness : vous n’avez donc pas besoin de start_conversation() pour regrouper leurs tours de conversation. Les intégrations des SDK de fournisseurs de LLM (OpenAI, Anthropic et Google Gen AI) ne créent pas de conversations, et Agent Lens n’affiche que les appels exécutés au sein d’une conversation. Utilisez donc les API décrites sur cette page pour ouvrir une conversation et des tours de conversation autour de ces appels.

API de traçage d’agents

Les sections suivantes décrivent chaque fonction de traçage de premier niveau ainsi que les arguments qu’elle accepte. Utilisez ces fonctions pour instrumenter les couches conversation, tour de conversation, appel LLM et appel d’outil du modèle de données présenté dans la section précédente. Agent Lens expose les fonctions de premier niveau suivantes. Chaque fonction renvoie un objet qui peut s’utiliser comme gestionnaire de contexte (avec with en Python, ou try/finally en TypeScript) ou que vous pouvez fermer manuellement en appelant .end().

Démarrer une conversation

start_conversation() (Python) ou startConversation() (TypeScript) ajoute un attribut conversation_id à chaque span enfant afin que les tours de conversation soient regroupés dans l’onglet Conversations. Si vous transmettez un conversation_id / conversationId, celui-ci doit rester stable pendant toute la durée de vie de la conversation. Réutilisez le même ID pour ajouter de nouveaux tours de conversation à une conversation existante. Si vous l’omettez, le SDK génère automatiquement un UUID. La conversation active est stockée dans le contexte (un ContextVar Python ou un AsyncLocalStorage Node.js). Tout code s’exécutant dans le même contexte asynchrone peut donc la récupérer avec tracing.get_current_conversation() / tracing.getCurrentConversation() sans avoir à transmettre explicitement l’objet conversation.

Démarrer un tour de conversation

start_turn() (Python) et startTurn() (TypeScript) créent un nouveau span invoke_agent qui devient la racine d’une nouvelle trace OTel. Agent Lens utilise ce span pour représenter un échange complet entre l’utilisateur et l’agent dans la vue chronologique.
Vous pouvez l’appeler de deux façons :
  • En tant que fonction de premier niveau (tracing.start_turn(...) / tracing.startTurn(...)), comme dans les exemples ci-dessous. Elle récupère la conversation active à partir du contexte et hérite de son ID de conversation. Si aucune conversation n’est active, le tour de conversation est créé sans conversation_id et n’est regroupé avec aucun autre tour de conversation.
  • En tant que méthode d’instance d’une conversation dont vous détenez une référence (conversation.start_turn(...) / conversation.startTurn(...) ). Cette forme est pratique lorsqu’un objet conversation explicite est disponible dans la portée courante, par exemple à l’intérieur d’un bloc de gestionnaire de contexte. L’exemple « Gestionnaire de contexte ou schéma try-finally », présenté plus loin dans ce guide, utilise cette forme. Consultez le tableau du modèle de données présenté plus haut pour accéder directement aux pages de référence Conversation, Turn, LLM, Tool et SubAgent des deux SDK.

Démarrer un appel LLM

start_llm() / startLLM() crée un span chat imbriqué dans le tour de conversation en cours. Agent Lens utilise ce span pour afficher dans l’interface utilisateur l’utilisation des jetons, le nom du modèle, les messages d’entrée et de sortie, ainsi que le raisonnement.
Une fois l’appel LLM terminé, attribuez les données de la réponse à l’objet llm avant sa fermeture :
Indiquez explicitement provider_name / providerName. Agent Lens ne le déduit pas de la chaîne du modèle.

Démarrer un appel d’outil

start_tool() / startTool() crée un span execute_tool. Ce span devient l’enfant du span OTel actif dans le contexte (généralement le span chat de l’appel LLM qui a généré l’appel d’outil).
Attribuez le résultat de l’outil avant de fermer le span :

Modèles d’utilisation pour le traçage d’agents

Les sections suivantes décrivent comment combiner ces fonctions selon la structure de votre code d’agent. Les exemples suivants utilisent deux types du SDK Agent Lens :
  • Message (Python · TypeScript) représente une entrée individuelle d’une conversation : une entrée utilisateur, une réponse de l’assistant, un prompt système ou le résultat d’un outil. Attribuez une liste de messages à llm.input_messages / llm.inputMessages pour enregistrer ce que le modèle a reçu, et à llm.output_messages / llm.outputMessages pour enregistrer ce qu’il a produit.
  • Usage (Python · TypeScript) capture le nombre de jetons indiqué dans la réponse du LLM et s’attribue à llm.usage.
Agent Lens s’appuie sur ces deux types pour afficher dans l’interface les entrées, les sorties et l’utilisation des jetons de chaque appel LLM.

Gestionnaire de contexte ou schéma try-finally

Pour la plupart des agents, utilisez un gestionnaire de contexte en Python ou un schéma try-finally en TypeScript. Le span est fermé et envoyé à la fin du bloc, même si une exception se produit. Agent Lens stocke dans le contexte la conversation, le tour de conversation et l’appel LLM actifs. Ainsi, toute fonction appelée dans un bloc peut appeler start_llm() / startLLM() ou start_tool() / startTool() sans avoir à conserver de référence explicite au parent. Ce mécanisme fonctionne d’un module à l’autre, tant que le code s’exécute dans le même contexte asynchrone. Pour récupérer les objets actifs depuis n’importe quel niveau de la pile d’appels, utilisez tracing.get_current_conversation() / tracing.getCurrentConversation(), tracing.get_current_turn() / tracing.getCurrentTurn() et tracing.get_current_llm() / tracing.getCurrentLLM().

Modèle de démarrage et de fin manuels

Appelez .end() explicitement lorsque vous ne pouvez pas utiliser de blocs with ni try/finally, par exemple lorsque vous ouvrez et fermez des spans dans des appels de fonction distincts, ou lorsque vous gérez un cycle de vie asynchrone en dehors d’une coroutine. Il vous incombe d’appeler .end() sur chaque objet que vous créez, afin que les spans soient fermés et transmis au collecteur. En TypeScript, terminer un tour de conversation ou une conversation ferme également tous ses descendants encore ouverts.

Conventions sémantiques

Le SDK Agent Lens émet des spans OTel conformes aux conventions sémantiques GenAI et aux conventions de spans d’agent GenAI. Agent Lens accepte n’importe quel span OTel, stocke tous ses attributs et permet de les interroger. Vous pouvez ajouter des attributs personnalisés aux spans avec set_attributes() / setAttributes() sur n’importe quel objet de traçage Agent Lens. Voir Définir des attributs sur les spans d’agent. Le SDK dispose de son propre fournisseur de traceurs OpenTelemetry privé. Il exporte uniquement les spans créés via Agent Lens: il ne remplace pas le fournisseur global de votre application et n’exporte pas les spans issus d’une instrumentation tierce.

Affichage des données dans l’interface Agent Lens

Une fois votre agent instrumenté à l’aide des modèles précédents, puis exécuté, vos traces apparaissent dans l’onglet Conversations de votre projet Agent Lens à l’adresse https://.
  • L’onglet Conversations affiche toutes les conversations, accompagnées d’une mini-carte de l’activité des tours de conversation.
  • La vue détaillée d’une conversation s’ouvre lorsque vous cliquez sur une conversation. Elle affiche tous ses tours de conversation, ses appels LLM, ses exécutions d’outils, le nombre de jetons ainsi que tout feedback joint.
Pour plus de détails sur la consultation des données capturées dans Agent Lens, voir Afficher l’activité de l’agent.
Dernière modification le 30 septembre 2026