gen_ai.agent.name et gen_ai.conversation.id.
Si vous tracez des fonctions individuelles en tant qu’ops avec le décorateur @weave.op, consultez plutôt Tracer des applications LLM.
Avant de commencer
Pour commencer, installez le packageweave et initialisez votre projet. Cette étape enregistre votre équipe et votre projet auprès de Weave afin que le SDK achemine les spans vers le bon emplacement dans l’interface utilisateur.
- Python
- TypeScript
[YOUR-TEAM] par le nom de votre équipe CoreWeave Forge et [YOUR-PROJECT] par le nom de votre projet Weights & Biases.weave.init() avant tout appel à start_conversation(), start_turn(), start_llm(), start_tool() ou start_subagent(). Lorsque le traçage est désactivé ou que l’appel d’initialisation est absent, toutes les fonctions de traçage d’agent se comportent silencieusement comme des no-ops. Vous pouvez donc conserver l’instrumentation dans votre code de production et la piloter via la configuration.Le modèle de données des agents
Weave 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 contenir 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 commun plutôt que 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.
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. Weave expose les fonctions de premier niveau suivantes. Chaque fonction renvoie un objet qui peut servir de gestionnaire de contexte (avecwith 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) appose un attribut conversation_id sur chaque span enfant afin que les tours de conversation soient regroupés dans l’onglet Agents. 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 ne le transmettez pas, le SDK génère automatiquement un UUID.
La conversation active est stockée dans le contexte (une ContextVar Python ou un AsyncLocalStorage Node.js). Ainsi, tout code s’exécutant dans le même contexte asynchrone peut la récupérer avec weave.get_current_conversation() / weave.getCurrentConversation() sans avoir à transmettre explicitement l’objet conversation.
- Python
- TypeScript
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. Weave 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 (
weave.start_turn(...)/weave.startTurn(...)), comme dans les exemples ci-dessous. Elle résout 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éé sansconversation_idet n’est pas regroupé avec les autres tours de conversation. - En tant que méthode d’instance sur une conversation dont vous détenez une référence (
conversation.start_turn(...)/conversation.startTurn(...)). Cette forme est utile lorsqu’un objet conversation explicite est disponible dans la portée, par exemple à l’intérieur d’un bloc de gestionnaire de contexte. L’exemple « Gestionnaire de contexte ou schéma try-finally » ci-dessous utilise cette forme. Consultez le tableau du modèle de données ci-dessus pour accéder directement aux pages de référenceConversation,Turn,LLM,TooletSubAgentdes deux SDK.
- Python
- TypeScript
Démarrer un appel LLM
start_llm() / startLLM() crée un span chat imbriqué dans le tour de conversation en cours. Weave utilise ce span pour afficher l’utilisation des jetons, le nom du modèle, les messages d’entrée et de sortie ainsi que le raisonnement dans la vue Agents.
- Python
- TypeScript
llm avant sa fermeture :
- Python
- TypeScript
provider_name / providerName. Weave 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 à l’origine de l’appel d’outil).
- Python
- TypeScript
- Python
- TypeScript
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 Weave :Message(Python · TypeScript) représente une entrée unique d’une conversation : une saisie de l’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.inputMessagespour enregistrer ce que le modèle a reçu, et àllm.output_messages/llm.outputMessagespour enregistrer ce qu’il a produit.Usage(Python · TypeScript) capture le nombre de jetons indiqué dans la réponse du LLM et est attribué àllm.usage.
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é puis envoyé à la fin du bloc, même en cas d’exception. Weave conserve dans le contexte la conversation, le tour de conversation et l’appel LLM actifs. Ainsi, toute fonction appelée dans un bloc peut appelerstart_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 weave.get_current_conversation() / weave.getCurrentConversation(), weave.get_current_turn() / weave.getCurrentTurn() et weave.get_current_llm() / weave.getCurrentLLM().
- Python
- TypeScript
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 le cycle de vie asynchrone en dehors d’une coroutine. Il vous appartient d’appeler .end() sur chaque objet que vous créez, afin que les spans soient fermés et transmis au collecteur.
- Python
- TypeScript
Conventions sémantiques
Le SDK Weave émet des spans OTel conformes aux conventions sémantiques GenAI et aux conventions de spans d’agent GenAI. Weave accepte n’importe quel span OTel, en stocke tous les attributs et permet de les interroger par requête. Vous pouvez ajouter des attributs personnalisés aux spans à l’aide de l’API de span OTel standard, en complément des objets de traçage de Weave.Affichage des données dans l’interface Weights & Biases
Une fois votre agent instrumenté à l’aide des modèles précédents puis exécuté, vos traces apparaissent dans l’onglet Agents de votre projet Weave, à l’adressehttps://forge.coreweave.com/wandb/[YOUR-TEAM]/[YOUR-PROJECT]/weave/agents.
- 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.