gen_ai.agent.name et gen_ai.conversation.id.
Si vous tracez des fonctions individuelles en tant qu’opérations avec le décorateur @weave.op, consultez plutôt Tracer des applications LLM.
Avant de commencer
weave 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 W&B et [YOUR-PROJECT] par le nom de votre projet W&B.weave.init() avant tout appel à start_conversation(), start_turn(), start_llm(), start_tool() ou start_subagent(). Toutes les fonctions de traçage des agents ne font silencieusement rien lorsque le traçage est désactivé ou que l’appel à init est absent. Vous pouvez donc laisser l’instrumentation dans le code de production et la contrôler via la configuration.Le modèle de données des agents
| Concept | classe du SDK Weave | type de span OTel | Description | Page de référence |
|---|---|---|---|---|
| Agent | (aucune classe) | (aucun span, regroupé par l’attribut agent_name) | Une application agentique dans l’onglet Agents qui contient une ou plusieurs conversations. | |
| Conversation | Conversation | (aucun span, les tours de conversation sont regroupés par l’attribut conversation_id) | Une conversation ou une exécution qui contient un ou plusieurs tours de conversation. | Python TypeScript |
| Tour de conversation | Turn | invoke_agent | Un message utilisateur et la réponse complète de l’agent. | Python TypeScript |
| appel LLM | LLM | chat | Un appel à une API de modèle de langage. | Python TypeScript |
| appel d’outil | Tool | execute_tool | Un appel d’outil déclenché par une réponse LLM. | Python TypeScript |
| appel de sous-agent | SubAgent | invoke_agent | Un appel d’agent imbriqué, généralement lorsqu’un agent délègue à un autre. | Python TypeScript |
conversation_id partagé plutôt que d’un span parent. Ainsi, chaque tour de conversation démarre sa propre trace OTel. Cette conception prend en charge le traçage distribué et l’exécution en parallèle. Le client envoie les spans directement au collecteur OTel, sans agrégation côté serveur.
API de traçage des agents
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 Agents. Si vous fournissez un conversation_id / conversationId, il doit rester stable pendant toute la durée 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 AsyncLocalStorage de Node.js). Ainsi, tout code exécuté dans le même contexte asynchrone peut la récupérer avec weave.get_current_conversation() / weave.getCurrentConversation() sans passer 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 :
- Comme fonction autonome (
weave.start_turn(...)/weave.startTurn(...)), comme illustré dans les exemples ci-dessous. Elle détermine 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 d’autres tours de conversation. - Comme méthode d’instance sur une conversation dont vous détenez une référence (
conversation.start_turn(...)/conversation.startTurn(...)). Cela est utile lorsque vous avez un objet conversation explicite 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. Voir le tableau du modèle de données ci-dessus pour des liens directs vers les pages de référenceConversation,Turn,LLM,TooletSubAgentdans les deux SDKs.
- Python
- TypeScript
Démarrer un appel LLM
start_llm() / startLLM() crée un span chat imbriqué sous 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 qu’il ne se ferme :
- Python
- TypeScript
provider_name / providerName explicitement. 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. Le 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).
- Python
- TypeScript
- Python
- TypeScript
Schémas d’utilisation pour le traçage des agents
Message(Python · TypeScript) représente une seule entrée dans une conversation : une entrée de l’utilisateur, une réponse de l’assistant, un prompt système ou le résultat d’un outil. Affectez 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 dans la réponse du LLM et doit être affecté àllm.usage.
Gestionnaire de contexte ou schéma try-finally
start_llm() / startLLM() ou start_tool() / startTool() sans avoir à conserver de référence explicite au parent. Cela 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 point 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
Démarrage et arrêt manuels
.end() explicitement lorsque vous ne pouvez pas recourir à des blocs with ou à try/finally. Par exemple, lorsque des spans sont ouverts et fermés dans des appels de fonction distincts, ou lorsque vous gérez le 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 se ferment et soient envoyés au collecteur.
- Python
- TypeScript
Conventions sémantiques
Comment les données apparaissent dans l’interface Weave
https://wandb.ai/[YOUR-TEAM]/[YOUR-PROJECT]/weave/agents.
- L’onglet Conversations affiche toutes les conversations avec une mini-carte de l’activité des tours de conversation.
- La vue détaillée de la conversation s’ouvre lorsque vous cliquez sur une conversation et affiche tous les tours de conversation, les appels LLM, les exécutions d’outils, le nombre de jetons et tout feedback joint.