Aperçu
Détails du point de terminaison
/otel/v1/traces
Méthode : POST
Content-Type : application/x-protobuf
URL de base : l’URL de base du point de terminaison de trace OTel dépend de votre type de déploiement W&B :
-
Cloud mutualisé :
https://trace.wandb.ai/otel/v1/traces -
Instances Cloud dédié et Autogéré :
https://<your-subdomain>.wandb.io/traces/otel/v1/traces
<your-subdomain> par le domaine W&B unique de votre organisation, par exemple acme.wandb.io.
Authentification et routage
wandb-api-key, puis spécifiez les clés suivantes comme attributs de ressource OpenTelemetry dans votre classe TracerProvider :
wandb.entity: Le nom de votre équipe W&B ou de votre utilisateur.wandb.project: Le nom du projet vers lequel envoyer les traces.
Exemples
WANDB_API_KEY: vous pouvez l’obtenir dans les Paramètres utilisateur.- Entité : vous ne pouvez consigner des traces que dans le projet d’une entité à laquelle vous avez accès. Vous pouvez trouver le nom de votre entité en consultant votre tableau de bord W&B à l’adresse [https://wandb.ai/home], puis en vérifiant le champ Teams dans la barre latérale gauche.
- Nom du projet : choisissez un nom sympa !
OPENAI_API_KEY: vous pouvez l’obtenir depuis le tableau de bord OpenAI.
Instrumentation OpenInference
- Python
- TypeScript
- Python
- TypeScript
Collez le code suivant dans un fichier Python, par exemple Exécutez le code :
openinference_example.py :Instrumentation OpenLLMetry
- Python
- TypeScript
- Python
- TypeScript
Collez le code suivant dans un fichier Python, par exemple Exécutez le code :
openllmetry_example.py. Notez qu’il s’agit du même code que ci-dessus, sauf que OpenAIInstrumentor est importé depuis opentelemetry.instrumentation.openai plutôt que depuis openinference.instrumentation.openai :Sans instrumentation
- Python
- TypeScript
- Python
- TypeScript
Collez le code suivant dans un fichier Python, par exemple Exécutez le code :
opentelemetry_example.py :gen_ai et openinference sont utilisés pour déterminer, le cas échéant, quelle convention appliquer lors de l’interprétation de la trace. Si aucune de ces deux clés n’est détectée, tous les attributs de span sont visibles dans la vue de trace. Le span complet est disponible dans le panneau latéral lorsque vous sélectionnez une trace.
Utiliser un collecteur OpenTelemetry
Configurer un collecteur
- Configurer un fichier de configuration pour Docker qui déploie un serveur local (collecteur) à l’écoute des traces OTLP, les regroupe par lots et les achemine vers Weave.
- Exécuter localement le collecteur avec Docker.
- Envoyer une requête simple à OpenAI qui transfère les traces au collecteur exécuté dans le conteneur Docker.
collector-config.yaml qui configure le collecteur pour recevoir des traces OTLP et les exporter vers Weave :
collector-config.yaml
- Écoute les traces OTLP sur le port
4318(HTTP). - Exporte les traces vers le point de terminaison OTLP de Weave à l’aide de l’en-tête
wandb-api-key, en lisant l’URL du point de terminaison depuisWANDB_OTLP_ENDPOINTet la clé API depuisWANDB_API_KEY. - Définit
wandb.entityetwandb.projectcomme attributs de ressource à l’aide du processeurresource, en lisant les valeurs depuisDEFAULT_WANDB_ENTITYetDEFAULT_WANDB_PROJECT. L’actioninsertinjecte ces attributs uniquement si le code de votre application ne les définit pas déjà. - Active la
sending_queueintégrée de l’exportateur avec le traitement par lots afin de réduire la surcharge réseau.
OTEL_EXPORTER_OTLP_ENDPOINT. Le SDK OTel lit automatiquement cette variable, vous n’avez donc pas besoin de fournir le point de terminaison à l’exportateur.
Si vous définissez wandb.entity ou wandb.project comme attributs de ressource dans le TracerProvider de votre application, ils priment sur les valeurs par défaut définies dans la configuration du collecteur.
OpenAIInstrumentor intercepte automatiquement les appels OpenAI, crée des traces et les exporte vers le collecteur. Le collecteur gère l’authentification et l’acheminement vers Weave.
Après avoir exécuté le script, vous pouvez consulter les traces dans Weave UI.
Pour envoyer des traces vers des backends supplémentaires, ajoutez d’autres exportateurs et incluez-les dans la liste service.pipelines.traces.exporters. Par exemple, vous pouvez exporter vers Weave et Jaeger depuis la même instance du Collector.
Organiser les traces OTel en threads
wandb.thread_id: regroupe les spans dans un thread donnéwandb.is_turn: marque un span comme un tour de conversation (il apparaît comme une ligne dans la vue thread)
wandb.thread_id pour regrouper les opérations associées et wandb.is_turn pour marquer les opérations de haut niveau qui apparaissent comme des lignes dans la vue thread.
Configuration initiale
Configuration initiale
Utilisez cette configuration pour exécuter ces exemples :
- Python
- TypeScript
Tracer un thread simple en un seul tour
Tracer un thread simple en un seul tour
- Python
- TypeScript
Tracer une conversation à plusieurs tours avec le même ID de thread
Tracer une conversation à plusieurs tours avec le même ID de thread
- Python
- TypeScript
Tracer des opérations profondément imbriquées et marquer uniquement le span le plus externe comme turn
Tracer des opérations profondément imbriquées et marquer uniquement le span le plus externe comme turn
- Python
- TypeScript
Tracer les opérations en arrière-plan qui appartiennent à un thread mais ne sont pas des tours
Tracer les opérations en arrière-plan qui appartiennent à un thread mais ne sont pas des tours
- Python
- TypeScript
thread_id, et chaque tour apparaîtra sur une ligne distincte.
Correspondance des attributs
Frameworks pris en charge
- OpenTelemetry GenAI: conventions sémantiques standard pour l’IA générative (
gen_ai.*) - OpenInference: bibliothèque d’instrumentation d’Arize AI (
input.value,output.value,llm.*,openinference.*) - Vercel AI SDK: attributs du SDK d’IA de Vercel (
ai.prompt,ai.response,ai.model.*,ai.usage.*) - MLflow: attributs de tracking de MLflow (
mlflow.spanInputs,mlflow.spanOutputs) - Traceloop: instrumentation OpenLLMetry (
traceloop.entity.*,traceloop.span.kind) - Google Vertex AI: attributs d’agent de Vertex AI (
gcp.vertex.agent.*) - OpenLit: attributs d’observabilité d’OpenLit (
gen_ai.content.completion) - Langfuse: attributs de tracing de Langfuse (
langfuse.startTime,langfuse.endTime)
Référence des attributs
| Nom du champ d’attribut | Correspondance W&B | Description | Type | Exemple |
|---|---|---|---|---|
ai.prompt | inputs | Texte ou messages de la requête utilisateur. | Chaîne, liste, dict | "Écris un court haïku sur l’été." |
gen_ai.prompt | inputs | Prompt du modèle d’IA ou liste de messages. | Liste, dict, chaîne | [{"role":"user","content":"abc"}] |
input.value | inputs | Valeur d’entrée pour l’appel du modèle. | Chaîne, liste, dict | {"text":"Raconte une blague"} |
mlflow.spanInputs | inputs | Données d’entrée du span. | Chaîne, liste, dict | ["texte d’invite"] |
traceloop.entity.input | inputs | Données d’entrée de l’entité. | Chaîne, liste, dict | "Traduisez ceci en français" |
gcp.vertex.agent.tool_call_args | inputs | Arguments de l’appel à l’outil. | Dict | {"args":{"query":"météo à SF"}} |
gcp.vertex.agent.llm_request | inputs | Corps de la requête LLM. | Dict | {"contents":[{"role":"user","parts":[...]}]} |
input | inputs | Valeur d’entrée générique. | Chaîne, liste, dict | "Résume ce texte" |
inputs | inputs | Liste d’entrée générique. | Liste, dict, chaîne | ["Résume ce texte"] |
ai.response | outputs | Texte ou données de réponse du modèle. | Chaîne, liste, dict | "Voici un haïku..." |
gen_ai.completion | outputs | Résultat de génération de l’IA. | Chaîne, liste, dict | "Texte de complétion" |
output.value | outputs | Valeur de sortie du modèle. | Chaîne, liste, dict | {"text":"Texte de réponse"} |
mlflow.spanOutputs | outputs | Données de sortie du span. | String, liste, dict | ["answer"] |
gen_ai.content.completion | outputs | Résultat de complétion de contenu. | String | "Texte de réponse" |
traceloop.entity.output | outputs | Données de sortie de l’entité. | String, liste, dict | "Texte de réponse" |
gcp.vertex.agent.tool_response | outputs | Réponse d’exécution de l’outil. | dict, chaîne | {"toolResponse":"ok"} |
gcp.vertex.agent.llm_response | outputs | Charge utile de la réponse du LLM. | dict, chaîne | {"candidates":[...]} |
output | outputs | Valeur de sortie générique. | Chaîne, liste, dict | "Texte de réponse" |
outputs | outputs | Tableau de sortie générique. | liste, dict, chaîne de caractères | ["Texte de réponse"] |
gen_ai.usage.input_tokens | usage.input_tokens | Nombre de tokens d’entrée consommés. | Int | 42 |
gen_ai.usage.prompt_tokens | usage.prompt_tokens | Nombre de tokens de prompt consommés. | Int | 30 |
llm.token_count.prompt | usage.prompt_tokens | Nombre de tokens de prompt. | Int | 30 |
ai.usage.promptTokens | usage.prompt_tokens | Tokens de prompt consommés. | Int | 30 |
gen_ai.usage.completion_tokens | usage.completion_tokens | Nombre de tokens de complétion générés. | Int | 40 |
llm.token_count.completion | usage.completion_tokens | Nombre de tokens de complétion. | Int | 40 |
ai.usage.completionTokens | usage.completion_tokens | Tokens de complétion générés. | Int | 40 |
llm.usage.total_tokens | usage.total_tokens | Nombre total de tokens utilisés dans la requête. | Int | 70 |
llm.token_count.total | usage.total_tokens | Nombre total de tokens. | Entier | 70 |
gen_ai.system | attributes.system | Prompt système ou consignes. | Chaîne de caractères | "Vous êtes un assistant utile." |
llm.system | attributes.system | Prompt système ou consignes. | Chaîne de caractères | "Vous êtes un assistant serviable." |
weave.span.kind | attributes.kind | Type ou catégorie du span. | Chaîne de caractères | "llm" |
traceloop.span.kind | attributes.kind | Type ou catégorie du span. | String | "llm" |
openinference.span.kind | attributes.kind | Type ou catégorie du span. | String | "llm" |
gen_ai.response.model | attributes.model | Identifiant du modèle. | String | "gpt-4o" |
llm.model_name | attributes.model | Identifiant du modèle. | Chaîne | "gpt-4o-mini" |
ai.model.id | attributes.model | Identifiant du modèle. | Chaîne | "gpt-4o" |
llm.provider | attributes.provider | Nom du fournisseur du modèle. | Chaîne | "openai" |
ai.model.provider | attributes.provider | Nom du fournisseur du modèle. | String | "openai" |
gen_ai.request | attributes.model_parameters | Paramètres de génération du modèle. | Dict | {"temperature":0.7,"max_tokens":256} |
llm.invocation_parameters | attributes.model_parameters | Paramètres d’appel du modèle. | Dict | {"temperature":0.2} |
wandb.display_name | display_name | Nom d’affichage personnalisé pour l’UI. | Chaîne de caractères | "Message utilisateur" |
gcp.vertex.agent.session_id | thread_id | Identifiant de session ou de fil. | Chaîne de caractères | "thread_123" |
wandb.thread_id | thread_id | Identifiant de fil pour les conversations. | Chaîne de caractères | "thread_123" |
wb_run_id | wb_run_id | Identifiant du run W&B associé. | Chaîne | "abc123" |
wandb.wb_run_id | wb_run_id | Identifiant du run W&B associé. | Chaîne | "abc123" |
gcp.vertex.agent.session_id | is_turn | Indique que le span correspond à un tour de conversation. | Booléen | true |
wandb.is_turn | is_turn | Indique que le span correspond à un tour de conversation. | Booléen | true |
langfuse.startTime | start_time (remplace) | Remplacer l’horodatage de début du span. | Horodatage (ISO8601/unix ns) | "2024-01-01T12:00:00Z" |
langfuse.endTime | end_time (override) | Remplacer l’horodatage de fin du span. | Horodatage (ISO8601/unix ns) | "2024-01-01T12:00:01Z" |
Limites
- Weave UI ne prend pas en charge le rendu des appels d’outil de trace OTel dans la vue Chat. Ils s’affichent à la place sous forme de JSON brut.