Ce produit n'est pas pris en charge par le site Datadog que vous avez sélectionné. ().
Présentation
Les SDK Agent Observability fournissent une instrumentation automatique ainsi que des API d’instrumentation manuelle pour offrir de l’observabilité et des insights sur vos applications LLM.
Variables d’environnement pour la configuration en ligne de commande
DD_SITE
requis - chaîne Site Datadog de destination pour la soumission de données LLM. Votre site est .
DD_LLMOBS_ENABLED
requis - entier ou chaîne Basculez pour activer la soumission de données à Agent Observability. Doit être défini sur 1 ou true.
DD_LLMOBS_ML_APP
optionnel - chaîne Le nom de votre application, service ou projet LLM, sous lequel toutes les traces et tous les spans sont regroupés. Cela permet de distinguer les différentes applications ou expériences. Consultez les directives de nommage des applications pour connaître les caractères autorisés et les autres contraintes. Pour remplacer cette valeur pour un span racine donné, consultez Tracer plusieurs applications. Si elle n’est pas fournie, cette valeur prend par défaut celle de DD_SERVICE, ou la valeur d’un DD_LLMOBS_ML_APP propagé depuis un service en amont. Remarque: Avant la version ddtrace==3.14.0, il s’agit d’un champ obligatoire.
DD_LLMOBS_AGENTLESS_ENABLED
facultatif - entier ou chaîne - par défaut: false Requis uniquement si vous n’utilisez pas le Datadog Agent, auquel cas cela doit être défini sur 1 ou true.
DD_LLMOBS_SAMPLE_RATE
facultatif - nombre à virgule flottante - par défaut : 1.0 La fraction de traces conservée par Agent Observability. Voir Échantillonnage de traces.
DD_API_KEY
optionnel - _ chaîne_ Votre clé d’API Datadog. Requis uniquement si vous n’utilisez pas le Datadog Agent.
DD_MCP_CAPTURE_INTENT
facultatif - entier ou chaîne - par défaut : false Lorsqu’il est défini sur 1 ou true, ajoute un argument à chaque outil de serveur MCP demandant au modèle appelant de décrire pourquoi il a choisi d’appeler l’outil. L’intention est enregistrée sur le span de l’outil.
Activez Agent Observability en exécutant votre application avec NODE_OPTIONS="--import dd-trace/initialize.mjs" et en spécifiant les variables d’environnement requises.
Remarque: dd-trace/initialize.mjs active automatiquement toutes les intégrations APM.
Variables d’environnement pour la configuration en ligne de commande
DD_SITE
requis - chaîne Le site Datadog vers lequel soumettre vos données LLM. Votre site est .
DD_LLMOBS_ENABLED
requis - entier ou chaîne Basculez pour activer la soumission de données à Agent Observability. Doit être défini sur 1 ou true.
DD_LLMOBS_ML_APP
optionnel - chaîne Le nom de votre application, service ou projet LLM, sous lequel toutes les traces et tous les spans sont regroupés. Cela permet de distinguer les différentes applications ou expériences. Consultez les directives de nommage des applications pour connaître les caractères autorisés et les autres contraintes. Pour remplacer cette valeur pour un span racine donné, consultez Tracer plusieurs applications. Si elle n’est pas fournie, cette valeur prend par défaut celle de DD_SERVICE, ou la valeur d’un DD_LLMOBS_ML_APP propagé depuis un service en amont. Remarque: Avant la version dd-trace@5.66.0, il s’agit d’un champ obligatoire.
DD_LLMOBS_AGENTLESS_ENABLED
facultatif - entier ou chaîne - par défaut: false Requis uniquement si vous n’utilisez pas le Datadog Agent, auquel cas cela doit être défini sur 1 ou true.
DD_LLMOBS_SAMPLE_RATE
facultatif - nombre à virgule flottante - par défaut : 1.0 La fraction de traces conservée par Agent Observability. Voir Échantillonnage de traces.
DD_API_KEY
optionnel - _ chaîne_ Votre clé d’API Datadog. Requis uniquement si vous n’utilisez pas le Datadog Agent.
Activez Agent Observability en exécutant votre application avec dd-trace-java et en spécifiant les paramètres requis sous forme de variables d’environnement ou de propriétés système.
Vous pouvez fournir les paramètres suivants sous forme de variables d’environnement (par exemple, DD_LLMOBS_ENABLED) ou de propriétés système Java (par exemple, dd.llmobs_enabled).
DD_SITE ou dd.site
requis - chaîne Site Datadog de destination pour la soumission de données LLM. Votre site est .
DD_LLMOBS_ENABLED ou dd.llmobs.enabled
requis - entier ou chaîne Basculez pour activer la soumission de données à Agent Observability. Doit être défini sur 1 ou true.
DD_LLMOBS_ML_APP ou dd.llmobs.ml.app
optionnel - chaîne Le nom de votre application, service ou projet LLM, sous lequel toutes les traces et tous les spans sont regroupés. Cela permet de distinguer les différentes applications ou expériences. Consultez les directives de nommage des applications pour connaître les caractères autorisés et les autres contraintes. Pour remplacer cette valeur pour un span racine donné, consultez Tracer plusieurs applications. Si elle n’est pas fournie, cette valeur prend par défaut celle de DD_SERVICE, ou la valeur d’un DD_LLMOBS_ML_APP propagé depuis un service en amont. Remarque: Avant la version 1.54.0 de dd-trace-java, il s’agit d’un champ obligatoire.
DD_LLMOBS_AGENTLESS_ENABLED ou dd.llmobs.agentless.enabled
facultatif - entier ou chaîne de caractères - par défaut : false Requis uniquement si vous n’utilisez pas le Datadog Agent, auquel cas cela doit être défini sur 1 ou true.
DD_API_KEY ou dd.api.key
optionnel - _ chaîne_ Votre clé d’API Datadog. Requis uniquement si vous n’utilisez pas le Datadog Agent.
Configuration dans le code
Au lieu d’utiliser la configuration en ligne de commande , vous pouvez également activer Agent Observability par programmation.
Utilisez la fonction LLMObs.enable() pour activer Agent Observability.
N'utilisez pas cette méthode de configuration avec la commande. ddtrace-run N'utilisez pas cette méthode de configuration avec la commande.
optionnel - chaîne Le nom de votre application, service ou projet LLM, sous lequel toutes les traces et tous les spans sont regroupés. Cela permet de distinguer les différentes applications ou expériences. Consultez les directives de nommage des applications pour connaître les caractères autorisés et les autres contraintes. Pour remplacer cette valeur pour une trace donnée, consultez Tracer plusieurs applications. Si aucune valeur n’est fournie, la valeur par défaut est DD_LLMOBS_ML_APP.
integrations_enabled - par défaut: true
optionnel - booléen Un indicateur pour activer automatiquement le traçage des appels LLM pour les intégrations LLM prises en charge par Datadog. Si aucune valeur n’est fournie, toutes les intégrations LLM prises en charge sont activées par défaut. Pour éviter d’utiliser les intégrations LLM, définissez cette valeur sur false.
agentless_enabled
optionnel - booléen - par défaut : false Requis uniquement si vous n’utilisez pas le Datadog Agent, auquel cas cela doit être défini sur True. Ceci configure la bibliothèque ddtrace pour ne pas envoyer de données nécessitant le Datadog Agent. S’il n’est pas fourni, la valeur par défaut est celle de DD_LLMOBS_AGENTLESS_ENABLED.
site
optionnel - _ chaîne_ Le site Datadog vers lequel soumettre vos données LLM. Votre site est . S’il n’est pas fourni, la valeur par défaut est celle de DD_SITE.
api_key
optionnel - chaîne Votre clé d’API Datadog. Requis uniquement si vous n’utilisez pas le Datadog Agent. S’il n’est pas fourni, la valeur par défaut est celle de DD_API_KEY.
env
optionnel - chaîne Le nom de l’environnement de votre application (exemples: prod, pre-prod, staging). S’il n’est pas fourni, la valeur par défaut est celle de DD_ENV.
service
optionnel - chaîne Le nom du service utilisé pour votre application. S’il n’est pas fourni, la valeur par défaut est celle de DD_SERVICE.
sample_rate
optionnel - float La fraction de traces conservée par Agent Observability. Nécessite ddtrace 4.12.0 ou une version ultérieure. Lorsqu’il est défini, ceci prévaut sur DD_LLMOBS_SAMPLE_RATE. Voir Échantillonnage de traces.
capture_intent
optionnel - booléen - par défaut : false Lorsqu’il est défini sur True, ajoute un argument à chaque outil de serveur MCP demandant au modèle appelant de décrire pourquoi il a choisi d’appeler l’outil. L’intention est enregistrée sur le span de l’outil. S’il n’est pas fourni, la valeur par défaut est celle de DD_MCP_CAPTURE_INTENT.
N'utilisez pas cette méthode de configuration avec la dd-trace/initialize.mjs commande.
Utilisez la fonction init() pour activer Agent Observability.
optionnel - chaîne Le nom de votre application, service ou projet LLM, sous lequel toutes les traces et tous les spans sont regroupés. Cela permet de distinguer les différentes applications ou expériences. Consultez les directives de nommage des applications pour connaître les caractères autorisés et les autres contraintes. Pour remplacer cette valeur pour une trace donnée, consultez le traçage de plusieurs applications. S’il n’est pas fourni, la valeur par défaut est DD_LLMOBS_ML_APP.
agentlessEnabled
optionnel - booléen - par défaut: false Uniquement requis si vous n’utilisez pas le Datadog Agent, auquel cas il doit être défini sur true. Ceci configure la bibliothèque dd-trace pour ne pas envoyer de données nécessitant le Datadog Agent. S’il n’est pas fourni, la valeur par défaut est DD_LLMOBS_AGENTLESS_ENABLED.
sampleRate
optionnel - nombre La fraction de traces conservée par Agent Observability. Nécessite dd-trace 5.110.0 ou une version ultérieure. Lorsqu’il est défini, ceci prévaut sur DD_LLMOBS_SAMPLE_RATE. Voir Échantillonnage de traces.
Options de configuration générale du traceur :
site
optionnel - _ chaîne_ Le site Datadog vers lequel soumettre vos données LLM. Votre site est . S’il n’est pas fourni, la valeur par défaut est celle de DD_SITE.
env
optionnel - chaîne Le nom de l’environnement de votre application (exemples: prod, pre-prod, staging). S’il n’est pas fourni, la valeur par défaut est DD_ENV.
service
optionnel - chaîne Le nom du service utilisé pour votre application. S’il n’est pas fourni, la valeur par défaut est celle de DD_SERVICE.
Variables d’environnement
Définissez les valeurs suivantes en tant que variables d’environnement. Elles ne peuvent pas être configurées par programmation.
DD_API_KEY
optionnel - _ chaîne_ Votre clé d’API Datadog. Requis uniquement si vous n’utilisez pas le Datadog Agent.
Configuration d’AWS Lambda
Pour instrumenter une fonction AWS Lambda existante avec Agent Observability, vous pouvez utiliser l’extension Datadog et les couches de langage respectives.
Appelez votre fonction Lambda et vérifiez que les traces Agent Observability sont visibles dans l’interface utilisateur Datadog.
Videz manuellement les traces Agent Observability en utilisant la méthode flush avant que la fonction Lambda ne renvoie une valeur.
fromddtrace.llmobsimportLLMObsdefhandler():# function bodyLLMObs.flush()
importtracerfrom'dd-trace';constllmobs=tracer.llmobs;exportconsthandler=async(event)=>{// your function body
llmobs.flush();};
Après avoir installé le SDK et exécuté votre application, vous devriez voir des données dans Agent Observability provenant de l’auto-instrumentation. L’instrumentation manuelle peut être utilisée pour capturer des frameworks personnalisés ou des opérations provenant de bibliothèques qui ne sont pas encore prises en charge.
Échantillonnage des traces
L'échantillonnage des traces est disponible dans le SDK Python (ddtrace 4.12.0 ou version ultérieure) et le SDK Node.js (dd-trace 5.110.0 ou version ultérieure). Le SDK Java ne prend pas en charge l'échantillonnage des traces.
L’échantillonnage des traces définit la fraction de traces qu’Agent Observability conserve. Comme la facturation d’Agent Observability est basée sur le volume de spans que vous envoyez, définir un taux d’échantillonnage est un moyen de contrôler vos coûts liés à Agent Observability. Le SDK prend la décision d’échantillonnage sur le span racine et l’applique à tous les spans enfants de ce span racine, y compris les spans créés dans les services en aval via le distributed tracing.
L’échantillonnage n’affecte pas vos métriques d’Agent Observability, y compris les métriques de token et de coût. Comme les spans non échantillonnés sont supprimés après que Datadog a ingéré vos traces, ces métriques restent basées sur 100 % du trafic instrumenté de votre application, quel que soit le taux d’échantillonnage spécifié. L’échantillonnage des traces est également indépendant des contrôles intégrés à l’application tels que les règles d’automatisation et l’échantillonnage des traces APM, qui s’appliquent après l’ingestion.
Configurez le taux d’échantillonnage via l’un des deux mécanismes suivants :
Paramètre dans le code (sample_rate en Python, sampleRate en Node.js) : transmis à LLMObs.enable() en Python, ou sous llmobs en Node.js, lorsque vous activez le SDK avec la configuration dans le code. Lorsqu’il est défini, il prévaut sur DD_LLMOBS_SAMPLE_RATE.
Le taux d’échantillonnage est un nombre à virgule flottante compris entre 0.0 (aucune trace conservée) et 1.0 (toutes les traces conservées). La valeur par défaut est 1.0. Les valeurs hors plage sont ignorées.
Définissez le taux d’échantillonnage avec la variable d’environnement :
Pour tracer un span, utilisez llmobs.wrap(options, function) comme wrapper de fonction pour la fonction que vous souhaitez tracer. Pour obtenir une liste des types de spans disponibles, consultez la documentation sur les types de spans. Pour un traçage plus granulaire des opérations au sein des fonctions, consultez Traçage des spans à l’aide de méthodes en ligne.
Types de span
Les types de span sont requis et sont spécifiés sur l’objet options passé aux fonctions de traçage llmobs (trace, wrap et decorate). Consultez la documentation sur les types de span pour obtenir une liste des types de span pris en charge.
Remarque : Les spans avec un type de span non valide ne sont pas soumis à Agent Observability.
Capture automatique des arguments/sorties/noms de fonction
llmobs.wrap (ainsi que llmobs.decorate pour TypeScript) tente de capturer automatiquement les entrées, les sorties et le nom de la fonction en cours de traçage. Si vous devez annoter manuellement un span, consultez Enrichissement des spans. Les entrées et sorties que vous annotez remplaceront la capture automatique. De plus, pour remplacer le nom de la fonction, passez la propriété name sur l’objet d’options à la fonction llmobs.wrap :
functionprocessMessage(){...// user application logic
return}processMessage=llmobs.wrap({kind:'workflow',name:'differentFunctionName'},processMessage)
Conditions de fin d’un span pour une fonction enveloppée
llmobs.wrap étend le comportement sous-jacent de tracer.wrap. Le span sous-jacent créé lors de l’appel de la fonction est terminé dans les conditions suivantes :
Si la fonction renvoie une promesse, le span se termine lorsque la promesse est résolue ou rejetée.
Si la fonction prend une fonction de rappel comme dernier paramètre, le span se termine lorsque cette fonction de rappel est appelée.
Si la fonction n’accepte pas de fonction de rappel et ne renvoie pas de promesse, le span se termine à la fin de l’exécution de la fonction.
L’exemple suivant illustre la deuxième condition, où le dernier argument est une fonction de rappel :
Exemple
constexpress=require('express')constapp=express()functionmyAgentMiddleware(req,res,next){consterr=...// user application logic
// the span for this function is finished when `next` is called
next(err)}myAgentMiddleware=llmobs.wrap({kind:'agent'},myAgentMiddleware)app.use(myAgentMiddleware)
Si l’application n’utilise pas la fonction de rappel, il est recommandé d’utiliser un bloc tracé en ligne à la place. Consultez Traçage des spans à l’aide de méthodes en ligne pour plus d’informations.
constexpress=require('express')constapp=express()functionmyAgentMiddleware(req,res){// the `next` callback is not being used here
returnllmobs.trace({kind:'agent',name:'myAgentMiddleware'},()=>{returnres.status(200).send('Hello World!')})}app.use(myAgentMiddleware)
Démarrage d’un span
Il existe plusieurs méthodes pour démarrer un span, selon le type de span que vous démarrez. Consultez la documentation sur les types de span pour obtenir une liste des types de span pris en charge.
Tous les spans sont démarrés en tant qu’instance d’objet de LLMObsSpan. Chaque span possède des méthodes que vous pouvez utiliser pour interagir avec le span et enregistrer des données.
Terminer un span
Les spans doivent être terminés pour que la trace soit soumise et visible dans l’application Datadog.
Pour terminer un span, appelez finish() sur une instance d’objet de span. Si possible, enveloppez le span dans un bloc try/finally pour vous assurer que le span est soumis même si une exception se produit.
Exemple
try{LLMObsSpanworkflowSpan=LLMObs.startWorkflowSpan("my-workflow-span-name","ml-app-override","session-141");// user logic// interact with started span}finally{workflowSpan.finish();}
Appels LLM
Si vous utilisez des fournisseurs ou des frameworks LLM pris en charge par les intégrations LLM de Datadog, vous n'avez pas besoin de démarrer manuellement un span LLM pour tracer ces opérations.
Si vous instrumentez manuellement un span LLM, vous devez enregistrer les nombres de jetons (tels que input_tokens, output_tokens, et total_tokens) en annotant le span. Consultez Enrichissement des spans pour plus d'informations.
Pour tracer un appel LLM, utilisez le décorateur de fonction ddtrace.llmobs.decorators.llm().
Arguments
model_name
requis - chaîne Le nom du LLM appelé.
name
optionnel - chaîne Le nom de l’opération. S’il n’est pas fourni, name prend par défaut le nom de la fonction tracée.
model_provider
optionnel - chaîne - par défaut: "custom" Le nom du fournisseur de modèle. Remarque: Pour afficher le coût estimé en dollars américains, définissez model_provider sur l’une des valeurs suivantes : openai, azure_openai ou anthropic.
session_id
optionnel - _ chaîne_ L’identifiant de la session utilisateur sous-jacente. Consultez Suivi des sessions utilisateur pour plus d’informations.
ml_app
optionnel - _ chaîne_ Le nom de l’application ML à laquelle appartient l’opération. Consultez Traçage de plusieurs applications pour plus d’informations.
Exemple
fromddtrace.llmobsimportLLMObsfromddtrace.llmobs.decoratorsimportllm@llm(model_name="claude",name="invoke_llm",model_provider="anthropic")defllm_call(prompt):completion=...# user application logic to invoke LLMLLMObs.annotate(input_data=[{"role":"user","content":prompt}],output_data=[{"role":"assistant","content":completion}],metrics={"input_tokens":4,"output_tokens":6,"total_tokens":10},)returncompletion
Pour tracer un appel LLM, spécifiez le type de span comme llm, et spécifiez éventuellement les arguments suivants sur l’objet options.
Arguments
modelName
optionnel - chaîne - par défaut: "custom" Le nom du LLM appelé.
name
optionnel - chaîne Le nom de l’opération. S’il n’est pas fourni, name prend par défaut le nom de la fonction tracée.
modelProvider
optionnel - chaîne - par défaut: "custom" Le nom du fournisseur de modèle. Remarque : Pour afficher le coût estimé en dollars américains, définissez modelProvider sur l’une des valeurs suivantes : openai, azure_openai ou anthropic.
sessionId
optionnel - _ chaîne_ L’identifiant de la session utilisateur sous-jacente. Consultez Suivi des sessions utilisateur pour plus d’informations.
mlApp
optionnel - _ chaîne_ Le nom de l’application ML à laquelle appartient l’opération. Consultez Traçage de plusieurs applications pour plus d’informations.
Exemple
functionllmCall(prompt){constcompletion=...// user application logic to invoke LLM
llmobs.annotate({inputData:[{role:"user",content:prompt}],outputData:[{role:"assistant",content:completion}],metrics:{input_tokens:4,output_tokens:6,total_tokens:10}})returncompletion}llmCall=llmobs.wrap({kind:'llm',name:'invokeLLM',modelName:'claude',modelProvider:'anthropic'},llmCall)
Pour tracer un appel LLM, importez et appelez la méthode suivante avec les arguments listés ci-dessous :
optionnel - chaîne Le nom de l’opération. S’il n’est pas fourni, spanName prend par défaut le type de span.
modelName
optionnel - chaîne - par défaut: "custom" Le nom du LLM appelé.
modelProvider
optionnel - chaîne - par défaut: "custom" Le nom du fournisseur de modèle. Remarque : Pour afficher le coût estimé en dollars américains, définissez modelProvider sur l’une des valeurs suivantes : openai, azure_openai ou anthropic.
mlApp
optionnel - chaîne Le nom de l’application ML à laquelle appartient l’opération. La fourniture d’une valeur non nulle remplace le nom de l’application ML fourni au démarrage de l’application. Consultez Traçage de plusieurs applications pour plus d’informations.
sessionId
optionnel - chaîne L’identifiant de la session utilisateur sous-jacente. Consultez Suivi des sessions utilisateur pour plus d’informations.
Exemple
importdatadog.trace.api.llmobs.LLMObs;publicclassMyJavaClass{publicStringinvokeModel(){LLMObsSpanllmSpan=LLMObs.startLLMSpan("my-llm-span-name","my-llm-model","my-company","maybe-ml-app-override","session-141");Stringinference=...// user application logic to invoke LLMllmSpan.annotateIO(...);// record the input and outputllmSpan.setMetrics(Map.of("input_tokens",617,"output_tokens",338,"total_tokens",955));llmSpan.finish();returninference;}}
Workflows
Pour tracer un span de workflow, utilisez le décorateur de fonction ddtrace.llmobs.decorators.workflow().
Arguments
name
optionnel - chaîne Le nom de l’opération. S’il n’est pas fourni, name prend par défaut le nom de la fonction tracée.
session_id
optionnel - chaîne L’identifiant de la session utilisateur sous-jacente. Consultez Suivi des sessions utilisateur pour plus d’informations.
ml_app
optionnel - chaîne Le nom de l’application ML à laquelle appartient l’opération. Consultez Traçage de plusieurs applications pour plus d’informations.
Exemple
fromddtrace.llmobs.decoratorsimportworkflow@workflowdefprocess_message():...# user application logicreturn
Pour tracer un span de workflow, spécifiez le type de span comme workflow et spécifiez éventuellement des arguments sur l’objet options.
Arguments
name
optionnel - chaîne Le nom de l’opération. S’il n’est pas fourni, name prend par défaut le nom de la fonction tracée.
sessionId
optionnel - chaîne L’identifiant de la session utilisateur sous-jacente. Consultez Suivi des sessions utilisateur pour plus d’informations.
mlApp
optionnel - chaîne Le nom de l’application ML à laquelle appartient l’opération. Consultez Traçage de plusieurs applications pour plus d’informations.
Exemple
functionprocessMessage(){...// user application logic
return}processMessage=llmobs.wrap({kind:'workflow'},processMessage)
Pour tracer un span de workflow, importez et appelez la méthode suivante avec les arguments listés ci-dessous :
optionnel - chaîne Le nom de l’opération. S’il n’est pas fourni, spanName prend par défaut le type de span.
mlApp
optionnel - chaîne Le nom de l’application ML à laquelle appartient l’opération. La fourniture d’une valeur non nulle remplace le nom de l’application ML fourni au démarrage de l’application. Consultez Traçage de plusieurs applications pour plus d’informations.
sessionId
optionnel - chaîne L’identifiant de la session utilisateur sous-jacente. Consultez Suivi des sessions utilisateur pour plus d’informations.
Exemple
importdatadog.trace.api.llmobs.LLMObs;publicclassMyJavaClass{publicStringexecuteWorkflow(){LLMObsSpanworkflowSpan=LLMObs.startWorkflowSpan("my-workflow-span-name",null,"session-141");StringworkflowResult=workflowFn();// user application logicworkflowSpan.annotateIO(...);// record the input and outputworkflowSpan.finish();returnworkflowResult;}}
Agents
Pour tracer l’exécution d’un agent, utilisez le décorateur de fonction ddtrace.llmobs.decorators.agent().
Arguments
name
optionnel - chaîne Le nom de l’opération. S’il n’est pas fourni, name prend par défaut le nom de la fonction tracée.
session_id
optionnel - chaîne L’identifiant de la session utilisateur sous-jacente. Consultez Suivi des sessions utilisateur pour plus d’informations.
ml_app
optionnel - chaîne Le nom de l’application ML à laquelle appartient l’opération. Consultez Traçage de plusieurs applications pour plus d’informations.
Exemple
fromddtrace.llmobs.decoratorsimportagent@agentdefreact_agent():...# user application logicreturn
Pour tracer l’exécution d’un agent, spécifiez le type de span comme agent et spécifiez éventuellement des arguments sur l’objet options.
Arguments
name
optionnel - chaîne Le nom de l’opération. S’il n’est pas fourni, name prend par défaut le nom de la fonction tracée.
sessionId
optionnel - chaîne L’identifiant de la session utilisateur sous-jacente. Consultez Suivi des sessions utilisateur pour plus d’informations.
mlApp
optionnel - chaîne Le nom de l’application ML à laquelle appartient l’opération. Consultez Traçage de plusieurs applications pour plus d’informations.
Exemple
functionreactAgent(){...// user application logic
return}reactAgent=llmobs.wrap({kind:'agent'},reactAgent)
Pour tracer l’exécution d’un agent, importez et appelez la méthode suivante avec les arguments listés ci-dessous
optionnel - chaîne Le nom de l’opération. S’il n’est pas fourni, spanName prend par défaut le nom de la fonction tracée.
mlApp
optionnel - chaîne Le nom de l’application ML à laquelle appartient l’opération. La fourniture d’une valeur non nulle remplace le nom de l’application ML fourni au démarrage de l’application. Consultez Traçage de plusieurs applications pour plus d’informations.
sessionId
optionnel - chaîne L’identifiant de la session utilisateur sous-jacente. Consultez Suivi des sessions utilisateur pour plus d’informations.
Appels d’outils
Pour tracer un appel d’outil, utilisez le décorateur de fonction ddtrace.llmobs.decorators.tool().
Arguments
name
optionnel - chaîne Le nom de l’opération. S’il n’est pas fourni, name prend par défaut le nom de la fonction tracée.
session_id
optionnel - chaîne L’identifiant de la session utilisateur sous-jacente. Consultez Suivi des sessions utilisateur pour plus d’informations.
ml_app
optionnel - chaîne Le nom de l’application ML à laquelle appartient l’opération. Consultez Traçage de plusieurs applications pour plus d’informations.
Exemple
fromddtrace.llmobs.decoratorsimporttool@tooldefcall_weather_api():...# user application logicreturn
Pour tracer un appel d’outil, spécifiez le type de span comme tool et, éventuellement, spécifiez des arguments sur l’objet options.
Arguments
name
optionnel - chaîne Le nom de l’opération. S’il n’est pas fourni, name prend par défaut le nom de la fonction tracée.
sessionId
optionnel - chaîne L’identifiant de la session utilisateur sous-jacente. Consultez Suivi des sessions utilisateur pour plus d’informations.
mlApp
optionnel - chaîne Le nom de l’application ML à laquelle appartient l’opération. Consultez Traçage de plusieurs applications pour plus d’informations.
Exemple
functioncallWeatherApi(){...// user application logic
return}callWeatherApi=llmobs.wrap({kind:'tool'},callWeatherApi)
Pour tracer un appel d’outil, importez et appelez la méthode suivante avec les arguments listés ci-dessous :
optionnel - chaîne Le nom de l’opération. S’il n’est pas fourni, spanName prend par défaut le nom de la fonction tracée.
mlApp
optionnel - chaîne Le nom de l’application ML à laquelle appartient l’opération. La fourniture d’une valeur non nulle remplace le nom de l’application ML fourni au démarrage de l’application. Consultez Traçage de plusieurs applications pour plus d’informations.
sessionId
optionnel - chaîne L’identifiant de la session utilisateur sous-jacente. Consultez Suivi des sessions utilisateur pour plus d’informations.
Tâches
Pour tracer un span de tâche, utilisez le décorateur de fonction LLMObs.task().
Arguments
name
optionnel - chaîne Le nom de l’opération. S’il n’est pas fourni, name prend par défaut le nom de la fonction tracée.
session_id
optionnel - chaîne L’identifiant de la session utilisateur sous-jacente. Consultez Suivi des sessions utilisateur pour plus d’informations.
ml_app
optionnel - chaîne Le nom de l’application ML à laquelle appartient l’opération. Consultez Traçage de plusieurs applications pour plus d’informations.
Exemple
fromddtrace.llmobs.decoratorsimporttask@taskdefsanitize_input():...# user application logicreturn
Pour tracer un span de tâche, spécifiez le span kind comme task et, éventuellement, spécifiez des arguments sur l’objet options.
Arguments
name
optionnel - chaîne Le nom de l’opération. S’il n’est pas fourni, name prend par défaut le nom de la fonction tracée.
sessionId
optionnel - chaîne L’identifiant de la session utilisateur sous-jacente. Consultez Suivi des sessions utilisateur pour plus d’informations.
mlApp
optionnel - chaîne Le nom de l’application ML à laquelle appartient l’opération. Consultez Traçage de plusieurs applications pour plus d’informations.
Exemple
functionsanitizeInput(){...// user application logic
return}sanitizeInput=llmobs.wrap({kind:'task'},sanitizeInput)
Pour tracer un task span, importez et appelez la méthode suivante avec les arguments listés ci-dessous :
optionnel - chaîne Le nom de l’opération. S’il n’est pas fourni, spanName prend par défaut le nom de la fonction tracée.
mlApp
optionnel - chaîne Le nom de l’application ML à laquelle appartient l’opération. La fourniture d’une valeur non nulle remplace le nom de l’application ML fourni au démarrage de l’application. Consultez Traçage de plusieurs applications pour plus d’informations.
sessionId
optionnel - chaîne L’identifiant de la session utilisateur sous-jacente. Consultez Suivi des sessions utilisateur pour plus d’informations.
Embeddings
Pour tracer une embedding operation, utilisez le décorateur de fonction LLMObs.embedding().
Remarque : L’annotation de l’entrée d’un span embedding nécessite un formatage différent de celui des autres types de span. Consultez Enrichissement des spans pour plus de détails sur la façon de spécifier les entrées d’embedding.
Arguments
model_name
requis - chaîne Le nom du LLM appelé.
name
optionnel - chaîne Le nom de l’opération. S’il n’est pas fourni, name est défini sur le nom de la fonction tracée.
model_provider
optionnel - chaîne - par défaut: "custom"
session_id
optionnel - chaîne L’identifiant de la session utilisateur sous-jacente. Consultez Suivi des sessions utilisateur pour plus d’informations.
ml_app
optionnel - _ chaîne_ Le nom de l’application ML à laquelle appartient l’opération. Consultez Traçage de plusieurs applications pour plus d’informations.
Exemple
fromddtrace.llmobs.decoratorsimportembedding@embedding(model_name="text-embedding-3",model_provider="openai")defperform_embedding():...# user application logicreturn
Pour tracer une embedding operation, spécifiez le span kind comme embedding, et spécifiez éventuellement des arguments sur l’objet options.
Remarque : L’annotation de l’entrée d’un span embedding nécessite un formatage différent de celui des autres types de span. Consultez Enrichissement des spans pour plus de détails sur la façon de spécifier les entrées d’embedding.
Arguments
modelName
optionnel - String - par défaut: "custom" Le nom du LLM invoqué.
name
optionnel - chaîne Le nom de l’opération. S’il n’est pas fourni, name est défini sur le nom de la fonction tracée.
modelProvider
optionnel - String - par défaut: "custom" Le nom du fournisseur de modèle.
sessionId
optionnel - _ chaîne_ L’identifiant de la session utilisateur sous-jacente. Consultez Suivi des sessions utilisateur pour plus d’informations.
mlApp
optionnel - _ chaîne_ Le nom de l’application ML à laquelle appartient l’opération. Consultez Traçage de plusieurs applications pour plus d’informations.
Exemple
functionperformEmbedding(){...// user application logic
return}performEmbedding=llmobs.wrap({kind:'embedding',modelName:'text-embedding-3',modelProvider:'openai'},performEmbedding)
Retrievals
Pour tracer un span de récupération, utilisez le décorateur de fonction ddtrace.llmobs.decorators.retrieval().
Remarque : L’annotation de la sortie d’un retrieval span nécessite un formatage différent de celui des autres types de span. Consultez Enrichissement des spans pour plus de détails sur la façon de spécifier les sorties de récupération.
Arguments
name
optionnel - chaîne Le nom de l’opération. S’il n’est pas fourni, name prend par défaut le nom de la fonction tracée.
session_id
optionnel - chaîne L’identifiant de la session utilisateur sous-jacente. Consultez Suivi des sessions utilisateur pour plus d’informations.
ml_app
optionnel - chaîne Le nom de l’application ML à laquelle appartient l’opération. Consultez Traçage de plusieurs applications pour plus d’informations.
Exemple
fromddtrace.llmobs.decoratorsimportretrieval@retrievaldefget_relevant_docs(question):context_documents=...# user application logicLLMObs.annotate(input_data=question,output_data=[{"id":doc.id,"score":doc.score,"text":doc.text,"name":doc.name}fordocincontext_documents])return
Pour tracer un span de récupération, spécifiez le type de span comme retrieval, et spécifiez éventuellement les arguments suivants sur l’objet options.
Remarque : L’annotation de la sortie d’un retrieval span nécessite un formatage différent de celui des autres types de span. Consultez Enrichissement des spans pour plus de détails sur la façon de spécifier les sorties de récupération.
Arguments
name
optionnel - chaîne Le nom de l’opération. S’il n’est pas fourni, name prend par défaut le nom de la fonction tracée.
sessionId
optionnel - chaîne L’identifiant de la session utilisateur sous-jacente. Consultez Suivi des sessions utilisateur pour plus d’informations.
mlApp
optionnel - chaîne Le nom de l’application ML à laquelle appartient l’opération. Consultez Traçage de plusieurs applications pour plus d’informations.
Exemple
Ce qui suit inclut également un exemple d’annotation d’un span. Consultez Enrichissement des spans pour plus d’informations.
functiongetRelevantDocs(question){constcontextDocuments=...// user application logic
llmobs.annotate({inputData:question,outputData:contextDocuments.map(doc=>({id:doc.id,score:doc.score,text:doc.text,name:doc.name}))})return}getRelevantDocs=llmobs.wrap({kind:'retrieval'},getRelevantDocs)
Imbrication des spans
Le démarrage d’un nouveau span avant que le span actuel ne soit terminé trace automatiquement une relation parent-enfant entre les deux spans. Le span parent représente l’opération plus large, tandis que le span enfant représente une sous-opération imbriquée plus petite au sein de celui-ci.
fromddtrace.llmobs.decoratorsimporttask,workflow@workflowdefextract_data(document):preprocess_document(document)...# performs data extraction on the documentreturn@taskdefpreprocess_document(document):...# preprocesses a document for data extractionreturn
functionpreprocessDocument(document){...// preprocesses a document for data extraction
return}preprocessDocument=llmobs.wrap({kind:'task'},preprocessDocument)functionextractData(document){preprocessDocument(document)...// performs data extraction on the document
return}extractData=llmobs.wrap({kind:'workflow'},extractData)
importdatadog.trace.api.llmobs.LLMObs;importdatadog.trace.api.llmobs.LLMObsSpan;publicclassMyJavaClass{publicvoidpreprocessDocument(Stringdocument){LLMObsSpantaskSpan=LLMObs.startTaskSpan("preprocessDocument",null,"session-141");...// preprocess document for data extractiontaskSpan.annotateIO(...);// record the input and outputtaskSpan.finish();}publicStringextractData(Stringdocument){LLMObsSpanworkflowSpan=LLMObs.startWorkflowSpan("extractData",null,"session-141");preprocessDocument(document);...// perform data extraction on the documentworkflowSpan.annotateIO(...);// record the input and outputworkflowSpan.finish();}}
Enrichissement des spans
Le metrics Le paramètre ici fait référence aux valeurs numériques jointes en tant qu'attributs sur des spans individuels — et non aux métriques de la plateforme Datadog. Pour certaines clés reconnues telles que input_tokens, output_tokens, et total_tokens, Datadog utilise ces attributs de span pour générer les métriques de plateforme correspondantes (telles que ml_obs.span.llm.input.tokens) pour une utilisation dans les dashboards et les moniteurs.
Le SDK fournit la méthode LLMObs.annotate() pour enrichir les spans avec des entrées, des sorties et des métadonnées.
La méthode LLMObs.annotate() accepte les arguments suivants :
Arguments
span
optionnel - Span - par défaut: le span actif actuel Le span à annoter. Si span n’est pas fourni (comme lors de l’utilisation de décorateurs de fonction), le SDK annote le span actif actuel.
input_data
optionnel - JSON serializable type or list of dictionaries Either a JSON serializable type (for non-LLM spans) or a list of dictionaries with this format: {"content": \"...\", \"role\": \"...\", \"tool_calls\": ..., \"tool_results\": ..., \"audio_parts\": ..., \"image_parts\": ...}, où "tool_calls" est une liste optionnelle de dictionnaires d’appels d’outils avec les clés requises : "name", "arguments", et "tool_id" , "type" et "tool_results" est une liste optionnelle de dictionnaires de résultats d’outils avec la clé requise : "result", et les clés optionnelles : "name", "tool_id", "type" pour les scénarios d’appel de fonction. "audio_parts" et "image_parts" sont des listes facultatives de dictionnaires de médias pour les spans multimodaux, chacun avec un "mime_type" requis et exactement l’un des suivants : "content" (média encodé en base64, inclus en ligne) ou "attachment_key". Note : Les spans d’embedding sont un cas particulier et nécessitent une chaîne ou un dictionnaire (ou une liste de dictionnaires) avec ce format : {"text": "..."}.
output_data
a: facultatif - type sérialisable en JSON ou liste de dictionnaires Soit un type sérialisable en JSON (pour les spans non-LLM), soit une liste de dictionnaires avec ce format : {"content": "...", "role": "...", "tool_calls": ..., "audio_parts": ..., "image_parts": ...}, où "tool_calls" est une liste facultative de dictionnaires d’appels d’outils avec les clés requises : "name", "arguments", et les clés facultatives : "tool_id", "type" pour les scénarios d’appel de fonction. "audio_parts" et "image_parts" sont des listes facultatives de dictionnaires de médias pour les spans multimodaux, chacun avec un "mime_type" requis et exactement l’un des suivants : "content" (média encodé en base64, inclus en ligne) ou "attachment_key". Note : Les spans de récupération sont un cas particulier et nécessitent une chaîne ou un dictionnaire (ou une liste de dictionnaires) avec ce format : {"text": "...", "name": "...", "score": float, "id": "..."}.
tool_definitions
a: facultatif - liste de dictionnaires Liste de dictionnaires de définition d’outils pour les scénarios d’appel de fonction. Chaque définition d’outil doit avoir une clé "name": "..." requise et des clés "description": "..." et "schema": {...} facultatives.
metadata
a: facultatif - dictionnaire Un dictionnaire de paires clé-valeur sérialisables en JSON que les utilisateurs peuvent ajouter en tant qu’informations de métadonnées pertinentes pour l’opération d’entrée ou de sortie décrite par le span (model_temperature, max_tokens, top_k, etc.).
metrics
a: facultatif - dictionnaire Un dictionnaire de clés sérialisables en JSON et de valeurs numériques que les utilisateurs peuvent ajouter en tant que métriques pertinentes pour l’opération décrite par le span (input_tokens, output_tokens, total_tokens, time_to_first_token, etc.). L’unité pour time_to_first_token est en secondes, similaire à la métrique duration qui est émise par défaut.
tags
a: facultatif - dictionnaire Un dictionnaire de paires clé-valeur sérialisables en JSON que les utilisateurs peuvent ajouter en tant que tags sur le span. Exemples de clés : session, env, system et version. Pour plus d’informations sur les tags, consultez Getting Started with Tags.
cost_tags
a: facultatif - liste de chaînes Une liste de clés de tag (déjà définies avec tags ou annotées précédemment sur le même span) à propager en tant que tags personnalisés sur les métriques de coût et de jeton LLM générées. Les entrées qui ne font pas référence à une clé de tag existante sont ignorées. Voir Suivi des coûts pour plus de détails.
Exemple
fromddtrace.llmobsimportLLMObsfromddtrace.llmobs.decoratorsimportembedding,llm,retrieval,workflow@llm(model_name="model_name",model_provider="model_provider")defllm_call(prompt):resp=...# llm call hereLLMObs.annotate(span=None,input_data=[{"role":"user","content":"Hello world!"}],output_data=[{"role":"assistant","content":"How can I help?"}],metadata={"temperature":0,"max_tokens":200},metrics={"input_tokens":4,"output_tokens":6,"total_tokens":10},tags={"host":"host_name"},)returnresp@workflowdefextract_data(document):resp=llm_call(document)LLMObs.annotate(input_data=document,output_data=resp,tags={"host":"host_name"},)returnresp@embedding(model_name="text-embedding-3",model_provider="openai")defperform_embedding():...# user application logicLLMObs.annotate(span=None,input_data={"text":"Hello world!"},output_data=[0.0023064255,-0.009327292,...],metrics={"input_tokens":4},tags={"host":"host_name"},)return@retrieval(name="get_relevant_docs")defsimilarity_search():...# user application logicLLMObs.annotate(span=None,input_data="Hello world!",output_data=[{"text":"Hello world is ...","name":"Hello, World! program","id":"document_id","score":0.9893}],tags={"host":"host_name"},)return@llm(model_name="gpt-realtime",model_provider="openai")defvoice_turn(user_audio_bytes):importbase64resp=...# multimodal (audio) llm call hereLLMObs.annotate(span=None,input_data=[{"role":"user","content":"Hey, how are you?",# transcript of the input audio"audio_parts":[{"mime_type":"audio/wav","content":base64.b64encode(user_audio_bytes).decode("utf-8")}],}],output_data=[{"role":"assistant","content":"Hey! I'm doing great, thanks for asking. How about you?","audio_parts":[{"mime_type":"audio/wav","content":base64.b64encode(resp.audio_bytes).decode("utf-8")}],}],)returnresp@llm(model_name="gpt-4o",model_provider="openai")defdescribe_image(image_bytes):importbase64resp=...# multimodal (vision) llm call hereLLMObs.annotate(span=None,input_data=[{"role":"user","content":"What is in this image?","image_parts":[{"mime_type":"image/png","content":base64.b64encode(image_bytes).decode("utf-8")}],}],output_data=[{"role":"assistant","content":"The image shows a golden retriever puppy."}],)returnresp
Les messages annotés avec audio_parts ou image_parts s’affichent sous forme de lecteurs audio et d’images intégrés dans la vue de trace :
Le SDK fournit la méthode llmobs.annotate() pour annoter les spans avec des entrées, des sorties et des métadonnées.
La méthode LLMObs.annotate() accepte les arguments suivants :
Arguments
span
optionnel - Span - par défaut: le span actif actuel Le span à annoter. Si span n’est pas fourni (comme lors de l’utilisation de wrappers de fonction), le SDK annote le span actif.
annotationOptions
requis - objet Un objet de différents types de données pour annoter le span.
L’objet annotationOptions peut contenir les éléments suivants :
inputData
facultatif - type sérialisable en JSON ou liste d’objets Soit un type sérialisable en JSON (pour les spans non-LLM), soit une liste de dictionnaires avec ce format: {role: \"...\", content: \"...\", audioParts: [...], imageParts: [...]} (pour les spans LLM). audioParts et imageParts sont des listes facultatives d’objets multimédias pour les spans multimodaux, chacun avec un mimeType requis et exactement un élément parmi content (média encodé en base64, transporté en ligne) ou attachmentKey. Remarque : Les spans d’embedding sont un cas particulier et nécessitent une chaîne ou un objet (ou une liste d’objets) avec ce format : {text: "..."}.
outputData
facultatif - type sérialisable en JSON ou liste d’objets Soit un type sérialisable en JSON (pour les spans non-LLM), soit une liste d’objets avec ce format : {role: "...", content: "...", audioParts: [...], imageParts: [...]} (pour les spans LLM). audioParts et imageParts sont des listes facultatives d’objets multimédias pour les spans multimodaux, chacun avec un mimeType requis et exactement un élément parmi content (média encodé en base64, transporté en ligne) ou attachmentKey. Remarque : Les spans de récupération sont un cas particulier et nécessitent une chaîne ou un objet (ou une liste d’objets) avec ce format : {text: "...", name: "...", score: number, id: "..."}.
metadata
facultatif - objet Un objet de paires clé-valeur sérialisables en JSON que les utilisateurs peuvent ajouter en tant qu’informations de métadonnées pertinentes pour l’opération d’entrée ou de sortie décrite par le span (model_temperature, max_tokens, top_k, etc.).
metrics
facultatif - objet Un objet de clés sérialisables en JSON et de valeurs numériques que les utilisateurs peuvent ajouter en tant que métriques pertinentes pour l’opération décrite par le span (input_tokens, output_tokens, total_tokens, etc.).
tags
facultatif - objet Un objet de paires clé-valeur sérialisables en JSON que les utilisateurs peuvent ajouter en tant que tags concernant le contexte du span (session, environment, system, versioning, etc.). Pour plus d’informations sur les tags, consultez Getting Started with Tags.
costTags
facultatif - tableau de chaînes Une liste de clés de tag (déjà définies avec tags ou annotées précédemment sur le même span) à propager en tant que tags personnalisés sur les métriques de coût et de jeton LLM générées. Les entrées qui ne font pas référence à une clé de tag existante sont ignorées. Voir Suivi des coûts pour plus de détails.
Exemple
functionllmCall(prompt){constcompletion=...// user application logic to invoke LLM
llmobs.annotate({inputData:[{role:"user",content:"Hello world!"}],outputData:[{role:"assistant",content:"How can I help?"}],metadata:{temperature:0,max_tokens:200},metrics:{input_tokens:4,output_tokens:6,total_tokens:10},tags:{host:"host_name"}})returncompletion}llmCall=llmobs.wrap({kind:'llm',modelName:'modelName',modelProvider:'modelProvider'},llmCall)functionextractData(document){constresp=llmCall(document)llmobs.annotate({inputData:document,outputData:resp,tags:{host:"host_name"}})returnresp}extractData=llmobs.wrap({kind:'workflow'},extractData)functionperformEmbedding(){...// user application logic
llmobs.annotate(undefined,{// this can be set to undefined or left out entirely
inputData:{text:"Hello world!"},outputData:[0.0023064255,-0.009327292,...],metrics:{input_tokens:4},tags:{host:"host_name"}})}performEmbedding=llmobs.wrap({kind:'embedding',modelName:'text-embedding-3',modelProvider:'openai'},performEmbedding)functionsimilaritySearch(){...// user application logic
llmobs.annotate(undefined,{inputData:"Hello world!",outputData:[{text:"Hello world is ...",name:"Hello, World! program",id:"document_id",score:0.9893}],tags:{host:"host_name"}})return}similaritySearch=llmobs.wrap({kind:'retrieval',name:'getRelevantDocs'},similaritySearch)functionvoiceTurn(userAudioBytes){constresp=...// multimodal (audio) llm call here
llmobs.annotate({inputData:[{role:"user",content:"Hey, how are you?",// transcript of the input audio
audioParts:[{mimeType:"audio/wav",content:userAudioBytes.toString("base64")}]}],outputData:[{role:"assistant",content:"Hey! I'm doing great, thanks for asking. How about you?",audioParts:[{mimeType:"audio/wav",content:resp.audioBuffer.toString("base64")}]}]})returnresp}voiceTurn=llmobs.wrap({kind:'llm',modelName:'gpt-audio',modelProvider:'openai'},voiceTurn)functiondescribeImage(imageBytes){constresp=...// multimodal (vision) llm call here
llmobs.annotate({inputData:[{role:"user",content:"What is in this image?",imageParts:[{mimeType:"image/png",content:imageBytes.toString("base64")}]}],outputData:[{role:"assistant",content:"The image shows a golden retriever puppy."}]})returnresp}describeImage=llmobs.wrap({kind:'llm',modelName:'gpt-4o',modelProvider:'openai'},describeImage)
Les messages annotés avec audioParts ou imageParts s’affichent sous forme de lecteurs audio et d’images intégrés dans la vue de trace :
Pour les complétions de chat audio OpenAI, audioParts sont également capturés automatiquement par les intégrations LLM de Datadog—aucune annotation manuelle n’est requise. Contrairement à audioParts, imageParts ne sont actuellement pas capturés automatiquement et doivent être annotés manuellement ; une capture automatique est prévue pour une version ultérieure.
Le SDK fournit plusieurs méthodes pour annoter les spans avec des entrées, des sorties, des métriques et des métadonnées.
Annotation des entrées et des sorties
Utilisez la méthode membre annotateIO() de l’interface LLMObsSpan pour ajouter des données d’entrée et de sortie structurées à un LLMObsSpan. Cela inclut les arguments optionnels et les objets de message LLM.
Arguments
Si un argument est nul ou vide, rien ne se passe. Par exemple, si inputData est une chaîne non vide alors que outputData est nul, seul inputData est enregistré.
inputData
optionnel - Chaîne ou Liste<LLMObs.LLMMessage> Soit une chaîne (pour les spans non-LLM), soit une liste de LLMObs.LLMMessage pour les spans LLM.
outputData
optionnel - Chaîne ou Liste<LLMObs.LLMMessage> Soit une chaîne (pour les spans non-LLM), soit une liste de LLMObs.LLMMessage pour les spans LLM.
Messages LLM
Les spans LLM doivent être annotés avec des messages LLM en utilisant l’objet LLMObs.LLMMessage.
L’objet LLMObs.LLMMessage peut être instancié en appelant LLMObs.LLMMessage.from() avec les arguments suivants :
role
requis - String Une chaîne décrivant le rôle de l’auteur du message.
content
requis - String Une chaîne contenant le contenu du message.
Exemple
importdatadog.trace.api.llmobs.LLMObs;publicclassMyJavaClass{publicStringinvokeChat(StringuserInput){LLMObsSpanllmSpan=LLMObs.startLLMSpan("my-llm-span-name","my-llm-model","my-company","maybe-ml-app-override","session-141");StringsystemMessage="You are a helpful assistant";ResponsechatResponse=...// user application logic to invoke LLMllmSpan.annotateIO(Arrays.asList(LLMObs.LLMMessage.from("user",userInput),LLMObs.LLMMessage.from("system",systemMessage)),Arrays.asList(LLMObs.LLMMessage.from(chatResponse.role,chatResponse.content)));llmSpan.finish();returnchatResponse;}}
Attacher des métriques
Attacher plusieurs métriques en masse
La méthode membre setMetrics() de l’interface LLMObsSpan accepte les arguments suivants pour attacher plusieurs métriques en masse :
Arguments
metrics
requis - Map<String, Number> Une carte de clés sérialisables en JSON et de valeurs numériques que les utilisateurs peuvent ajouter pour enregistrer des métriques pertinentes pour l’opération décrite par le span (par exemple, input_tokens, output_tokens ou total_tokens).
Attacher une seule métrique
La méthode membre setMetric() de l’interface LLMObsSpan accepte les arguments suivants pour attacher une métrique unique :
Arguments
key
requis - CharSequence Le nom de la métrique.
value
requis - int, long ou double La valeur de la métrique.
Exemples
importdatadog.trace.api.llmobs.LLMObs;publicclassMyJavaClass{publicStringinvokeChat(StringuserInput){LLMObsSpanllmSpan=LLMObs.startLLMSpan("my-llm-span-name","my-llm-model","my-company","maybe-ml-app-override","session-141");StringchatResponse=...// user application logic to invoke LLMllmSpan.setMetrics(Map.of("input_tokens",617,"output_tokens",338,"time_per_output_token",0.1773));llmSpan.setMetric("total_tokens",955);llmSpan.setMetric("time_to_first_token",0.23);llmSpan.finish();returnchatResponse;}}
La méthode membre setTags() de l’interface LLMObsSpan accepte les arguments suivants pour attacher plusieurs tags en masse :
Arguments
tags
requis - Map<String, Object> Une carte de paires clé-valeur sérialisables en JSON que les utilisateurs peuvent attacher en tant que tags pour décrire le contexte du span (par exemple, session, environment, system, ou version).
Attacher un seul tag
La méthode membre setTag() de l’interface LLMObsSpan accepte les arguments suivants pour attacher un seul tag :
Arguments
key
requis - String La clé du tag.
value
requis - int, long, double, booléen ou String La valeur du tag.
Exemples
importdatadog.trace.api.llmobs.LLMObs;publicclassMyJavaClass{publicStringinvokeChat(StringuserInput){LLMObsSpanllmSpan=LLMObs.startLLMSpan("my-llm-span-name","my-llm-model","my-company","maybe-ml-app-override","session-141");StringchatResponse=...// user application logic to invoke LLMllmSpan.setTags(Map.of("chat_source","web","users_in_chat",3));llmSpan.setTag("is_premium_user",true);llmSpan.finish();returnchatResponse;}}
Annotation des erreurs
Attacher un Throwable (recommandé)
La méthode membre addThrowable() de l’interface LLMObsSpan accepte l’argument suivant pour attacher un throwable avec une trace de pile :
Arguments
throwable
requis - Throwable Le throwable/l’exception qui s’est produit.
Attacher un message d’erreur
La méthode membre setErrorMessage() de l’interface LLMObsSpan accepte l’argument suivant pour attacher une chaîne d’erreur :
Arguments
errorMessage
requis - String Le message de l’erreur.
Définir un indicateur d’erreur
La méthode membre setError() de l’interface LLMObsSpan accepte l’argument suivant pour indiquer une erreur lors de l’opération :
Arguments
error
requis - booléen true si le span a rencontré une erreur.
Exemples
importdatadog.trace.api.llmobs.LLMObs;publicclassMyJavaClass{publicStringinvokeChat(StringuserInput){LLMObsSpanllmSpan=LLMObs.startLLMSpan("my-llm-span-name","my-llm-model","my-company","maybe-ml-app-override","session-141");StringchatResponse="N/A";try{chatResponse=...// user application logic to invoke LLM}catch(Exceptione){llmSpan.addThrowable(e);thrownewRuntimeException(e);}finally{llmSpan.finish();}returnchatResponse;}}
Annotation des métadonnées
La méthode membre setMetadata() de l’interface LLMObsSpan accepte les arguments suivants :
metadata
requis - Map<String, Object> Une map de paires clé-valeur sérialisables en JSON qui contient des métadonnées pertinentes pour l’opération d’entrée ou de sortie décrite par le span.
Exemple
importdatadog.trace.api.llmobs.LLMObs;publicclassMyJavaClass{publicStringinvokeChat(StringuserInput){LLMObsSpanllmSpan=LLMObs.startLLMSpan("my-llm-span-name","my-llm-model","my-company","maybe-ml-app-override","session-141");llmSpan.setMetadata(Map.of("temperature",0.5,"is_premium_member",true,"class","e1"));StringchatResponse=...// user application logic to invoke LLMreturnchatResponse;}}
Annotation des spans auto-instrumentés
La méthode LLMObs.annotation_context() du SDK renvoie un gestionnaire de contexte qui peut être utilisé pour modifier tous les spans auto-instrumentés démarrés pendant que le contexte d’annotation est actif.
La méthode LLMObs.annotation_context() accepte les arguments suivants :
Arguments
name
optionnel - str Nom qui remplace le nom du span pour tous les spans auto-instrumentés démarrés dans le contexte d’annotation.
prompt
optionnel - dictionnaire Un dictionnaire qui représente le prompt utilisé pour un appel LLM. Consultez la documentation de l’objet Prompt pour obtenir le schéma complet et les clés prises en charge. Vous pouvez également importer l’objet Prompt depuis ddtrace.llmobs.utils et le transmettre en tant qu’argument prompt. Remarque: Cet argument s’applique uniquement aux spans LLM.
tags
optionnel - dictionnaire Un dictionnaire de paires clé-valeur sérialisables en JSON que les utilisateurs peuvent ajouter en tant que tags sur le span. Exemples de clés : session, env, system et version. Pour plus d’informations sur les tags, consultez Getting Started with Tags.
cost_tags
a: facultatif - liste de chaînes Une liste de clés de tag à propager en tant que tags personnalisés sur les métriques de coût et de jetons LLM générées. Chaque entrée doit faire référence à une clé présente dans tags au début du span (fournie au même contexte ou à un contexte parent); les clés de tag ajoutées ultérieurement avec LLMObs.annotate() ne sont pas conservées. Voir Suivi des coûts pour plus de détails.
Exemple
fromddtrace.llmobsimportLLMObsfromddtrace.llmobs.decoratorsimportworkflow@workflowdefrag_workflow(user_question):context_str=retrieve_documents(user_question).join(" ")withLLMObs.annotation_context(prompt=Prompt(id="chatbot_prompt",version="1.0.0",template="Please answer the question using the provided context: {{question}}\n\nContext:\n{{context}}",variables={"question":user_question,"context":context_str,}),tags={"retrieval_strategy":"semantic_similarity"},name="augmented_generation"):completion=openai_client.chat.completions.create(...)returncompletion.choices[0].message.content
Le llmobs.annotationContext() du SDK accepte une fonction de rappel qui peut être utilisée pour modifier tous les spans auto-instrumentés démarrés dans le périmètre de la fonction de rappel.
La méthode llmobs.annotationContext() accepte les options suivantes sur le premier argument:
Options
name
optionnel - str Nom qui remplace le nom du span pour tous les spans auto-instrumentés démarrés dans le contexte d’annotation.
tags
optionnel - object Un objet de paires clé-valeur sérialisables en JSON que les utilisateurs peuvent attacher en tant que tags sur le span. Exemples de clés: session, env, system et version. Pour plus d’informations sur les tags, consultez Getting Started with Tags.
costTags
facultatif - tableau de chaînes Une liste de clés de tag à propager en tant que tags personnalisés sur les métriques de coût et de jetons LLM générées. Chaque entrée doit faire référence à une clé présente dans tags au début du span (fournie au même contexte ou à un contexte parent); les clés de tag ajoutées ultérieurement avec llmobs.annotate() ne sont pas conservées. Voir Suivi des coûts pour plus de détails.
Attachez des métadonnées de prompt structurées au span LLM afin de pouvoir reproduire les résultats, auditer les modifications et comparer les performances du prompt entre les versions. Lors de l’utilisation de templates, Agent Observability fournit également un version tracking basé sur les modifications du contenu du template.
Utilisez LLMObs.annotation_context(prompt=...) pour attacher des métadonnées de prompt avant l’appel LLM. Pour plus de détails sur l’annotation des spans, voir Enriching spans.
Arguments
Arguments
prompt
requis - dictionary Un typed dictionary qui suit le schéma de Prompt ci-dessous.
Prompt structure
Clés prises en charge :
id (str) : Identifiant logique pour ce prompt. Doit être unique par ml_app. Par défaut à {ml_app}-unnamed_prompt
version (str) : Tag de version pour le prompt (par exemple, « 1.0.0 »). Voir version tracking pour plus de détails.
variables (Dict[str, str]) : Variables utilisées pour remplir les template placeholders.
template (str) : Template string with placeholders (for example, "Translate {{text}} to {{lang}}").
chat_template (List[Message]) : Multi-message template form. Fournissez une liste d’objets { "role": "<role>", "content": "<template string with placeholders>" }.
tags (Dict[str, str]) : Tags à attacher à l’exécution du prompt.
rag_context_variables (List[str]) : Clés de variables contenant le contenu ground-truth/context. Utilisé pour hallucination detection.
rag_query_variables (List[str]) : Clés de variable contenant la requête de l’utilisateur. Utilisé pour hallucination detection.
Exemple : invite à modèle unique
fromddtrace.llmobsimportLLMObsdefanswer_question(text):# Attach prompt metadata to the upcoming LLM span using LLMObs.annotation_context()withLLMObs.annotation_context(prompt={"id":"translation-template","version":"1.0.0","chat_template":[{"role":"user","content":"Translate to {{lang}}: {{text}}"}],"variables":{"lang":"fr","text":text},"tags":{"team":"nlp"}}):# Example provider call (replace with your client)completion=openai_client.chat.completions.create(model="gpt-4o",messages=[{"role":"user","content":f"Translate to fr: {text}"}])returncompletion
Exemple : modèles d’invite LangChain
Lorsque vous utilisez le modèle d’invite de LangChain avec l’auto-instrumentation, assignez des modèles aux variables avec des noms significatifs. L’auto-instrumentation utilise ces noms pour identifier les invites.
# "translation_template" will be used to identify the template in Datadogtranslation_template=PromptTemplate.from_template("Translate {text} to {language}")chain=translation_template|llm
Utilisez llmobs.annotationContext({ prompt: ... }, () => { ... }) pour joindre des métadonnées de prompt avant l’appel LLM. Pour plus de détails sur l’annotation des spans, voir Enriching spans.
Arguments
Options
prompt
requis - objet Un objet qui suit le schéma d’invite ci-dessous.
Prompt structure
Propriétés prises en charge :
id (chaîne) : Identifiant logique pour cette invite. Doit être unique par ml_app. Par défaut à {ml_app}-unnamed_prompt
version (chaîne) : Tag de version pour l’invite (par exemple, « 1.0.0 »). Voir version tracking pour plus de détails.
variables (Record<string, string>) : Variables utilisées pour remplir les espaces réservés du modèle.
template (chaîne | List[Message]) : Chaîne de modèle avec des espaces réservés (par exemple, "Translate {{text}} to {{lang}}"). Alternatively, a list of { “role”: “”, “content”: “” }` objets.
tags (Record<string, string>) : Tags à joindre à l’exécution de l’invite.
contextVariables (string[]) : Clés de variable contenant le contenu de référence/contexte. Utilisé pour hallucination detection.
queryVariables (string[]) : Clés de variable contenant la requête de l’utilisateur. Utilisé pour hallucination detection.
Exemple : invite à modèle unique
const{llmobs}=require('dd-trace');functionanswerQuestion(text){// Attach prompt metadata to the upcoming LLM span using LLMObs.annotation_context()
returnllmobs.annotationContext({prompt:{id:"translation-template",version:"1.0.0",chat_template:[{"role":"user","content":"Translate to {{lang}}: {{text}}"}],variables:{"lang":"fr","text":text},tags:{"team":"nlp"}}},()=>{// Example provider call (replace with your client)
returnopenaiClient.chat.completions.create({model:"gpt-4o",messages:[{"role":"user","content":f"Translate to fr: {text}"}]});});}
Notes
L’annotation d’un prompt n’est disponible que sur les spans LLM.
Placez l’annotation immédiatement avant l’appel au fournisseur afin qu’elle s’applique au span LLM correct.
Utilisez un prompt unique id pour distinguer les différents prompts au sein de votre application.
Gardez les modèles statiques en utilisant la syntaxe d’espace réservé (comme {{variable_name}}) and define dynamic content in the section variables`.
Pour plusieurs appels LLM auto-instrumentés au sein d’un bloc, utilisez un contexte d’annotation pour appliquer les mêmes métadonnées de prompt à tous les appels. Voir Annotation des spans auto-instrumentés.
Suivi de version
Agent Observability fournit un versionnage automatique pour vos prompts lorsqu’aucune version explicite n’est spécifiée. Lorsque vous fournissez un template ou chat_template dans les métadonnées de votre prompt sans tag version, le système génère automatiquement une version en calculant un hash du contenu du modèle. Si vous fournissez un tag version, Agent Observability utilise l’étiquette de version que vous avez spécifiée au lieu d’en générer une automatiquement.
Le système de versionnage fonctionne comme suit :
Versionnage automatique : Lorsqu’aucun tag version n’est fourni, Agent Observability calcule un hash du contenu template ou chat_template pour générer automatiquement un identifiant de version numérique
Versionnage manuel : Lorsqu’un tag version est fourni, Agent Observability utilise l’étiquette de version que vous avez spécifiée exactement telle qu’elle a été fournie
Historique des versions : Les versions générées automatiquement et manuelles sont conservées dans l’historique des versions pour suivre l’évolution du prompt au fil du temps
Cela vous donne la flexibilité de vous appuyer sur une gestion automatique des versions basée sur les modifications du contenu du modèle, ou de garder un contrôle total sur le versionnage avec vos propres étiquettes de version.
Capture d’intention MCP
Pour comprendre pourquoi vos outils MCP ont été appelés, activez la capture d’intention sur votre serveur MCP. Une fois activé, le SDK ajoute un argument à chaque outil de serveur MCP demandant au modèle appelant de décrire pourquoi il a choisi d’appeler l’outil. L’intention est enregistrée sur le span de l’outil, ce qui vous aide à améliorer vos définitions et descriptions d’outils.
Activez la capture d’intention MCP avec la variable d’environnement DD_MCP_CAPTURE_INTENT :
Attachez des métriques de jetons (pour le suivi automatique des coûts) ou des métriques de coûts (pour le suivi manuel des coûts) à vos spans LLM/d’embedding. Les métriques de jetons permettent à Datadog de calculer les coûts en utilisant la tarification du fournisseur, tandis que les métriques de coûts vous permettent de fournir votre propre tarification lors de l’utilisation de modèles personnalisés ou non pris en charge. Pour plus de détails, consultez Coûts.
Si vous utilisez l’instrumentation automatique, les métriques de jetons et de coûts apparaissent automatiquement sur vos spans. Si vous effectuez une instrumentation manuelle, suivez les conseils ci-dessous.
Dans ce contexte, « métriques de jetons » et « métriques de coûts » font référence à des paires clé-valeur numériques que vous attachez aux spans via le metrics paramètre du LLMObs.annotate() méthode. Ceux-ci sont distincts des métriques d'Agent Observability de la plateforme Datadog. Pour les clés reconnues telles que input_tokens, output_tokens, input_cost, et output_cost, Datadog utilise ces attributs de span pour générer les métriques de plateforme correspondantes (telles que ml_obs.span.llm.input.cost) pour une utilisation dans les dashboards et les moniteurs.
Cas d’utilisation : Utilisation d’un fournisseur de modèles courant
Datadog prend en charge les fournisseurs de modèles courants tels qu’OpenAI, Azure OpenAI, Anthropic et Google Gemini. Lorsque vous utilisez ces fournisseurs, il vous suffit d’annoter votre requête LLM avec le nom du modèle, le fournisseur du modèle et l’utilisation des jetons. Datadog calcule automatiquement le coût estimé en fonction de la tarification du fournisseur.
Ajout de tags personnalisés aux métriques de coût et de jetons
Par défaut, les métriques de coût et de jetons LLM comportent un ensemble fixe de tags OOTB tels que model_name, model_provider et ml_app. Pour ventiler les dépenses LLM par attributs spécifiques à votre application — tels que l’équipe, le client ou la fonctionnalité — marquez un sous-ensemble des clés de tag existantes du span pour les propager à ces métriques en tant que tags personnalisés. Pour des exemples de cas d’utilisation comme les dashboards et les moniteurs personnalisés, consultez Tags personnalisés sur les métriques de coût et de jetons.
Chaque entrée doit être une chaîne de caractères et doit faire référence à une clé déjà fournie via le paramètre tags du span au moment où l’annotation est appliquée. Lors de l’annotation d’un seul span, la clé peut être fournie via tags dans le même appel d’annotation ou dans une annotation antérieure sur le même span. Lors de l’utilisation d’un contexte d’annotation, seules les clés présentes dans tags au début du span sont qualifiées — les clés ajoutées ultérieurement via des annotations de span individuelles ne sont pas conservées. Les entrées qui ne font pas référence à une clé de tag existante sont ignorées.
functionllmCall(prompt){constresp=...// llm call here
llmobs.annotate({metrics:{input_tokens:50,output_tokens:120,total_tokens:170},tags:{team:'nlp',customer_tier:'enterprise',host:'host_name'},costTags:['team','customer_tier']})returnresp}llmCall=llmobs.wrap({kind:'llm',modelName:'gpt-5.1',modelProvider:'openai'},llmCall)
Vous pouvez également propager des tags de cette manière via un contexte d’annotation pour les appliquer à tous les spans auto-instrumentés démarrés à l’intérieur du contexte.
withLLMObs.annotation_context(tags={"team":"nlp","customer_tier":"enterprise"},cost_tags=["team","customer_tier"],):resp=...# llm call here
llmobs.annotationContext({tags:{team:'nlp',customer_tier:'enterprise'},costTags:['team','customer_tier']},()=>{constresp=...// llm call here
})
Évaluations
Le Agent Observability SDK fournit des méthodes pour exporter et soumettre vos évaluations à Datadog.
Pour créer des évaluateurs réutilisables basés sur des classes (BaseEvaluator, BaseSummaryEvaluator) avec des métadonnées de résultat enrichies, consultez le Guide du développeur d'évaluations.
Les évaluations doivent être jointes à un seul span. Vous pouvez identifier le span cible en utilisant l’une de ces deux méthodes :
Jointure basée sur des tags - Joignez une évaluation en utilisant une paire clé-valeur de tag unique définie sur un seul span. L’évaluation ne pourra pas être jointe si la paire clé-valeur du tag correspond à plusieurs spans ou à aucun span.
Référence directe au span - Joignez une évaluation en utilisant la combinaison de l’ID de trace et de l’ID de span uniques du span.
Exportation d’un span
LLMObs.export_span() peut être utilisé pour extraire le contexte de span à partir d’un span. Cette méthode est utile pour associer votre évaluation au span correspondant.
Arguments
La méthode LLMObs.export_span() accepte l’argument suivant :
span
optionnel - Span Le span à partir duquel extraire le contexte de span (ID de span et de trace). S’il n’est pas fourni (comme lors de l’utilisation de décorateurs de fonction), le SDK exporte le span actif actuel.
Exemple
fromddtrace.llmobsimportLLMObsfromddtrace.llmobs.decoratorsimportllm@llm(model_name="claude",name="invoke_llm",model_provider="anthropic")defllm_call():completion=...# user application logic to invoke LLMspan_context=LLMObs.export_span(span=None)returncompletion
llmobs.exportSpan() peut être utilisé pour extraire le contexte de span à partir d’un span. Vous devrez utiliser cette méthode pour associer votre évaluation au span correspondant.
Arguments
La méthode llmobs.exportSpan() accepte l’argument suivant :
span
optionnel - Span Le span à partir duquel extraire le contexte de span (ID de span et de trace). S’il n’est pas fourni (comme lors de l’utilisation de wrappers de fonction), le SDK exporte le span actif actuel.
Exemple
functionllmCall(){constcompletion=...// user application logic to invoke LLM
constspanContext=llmobs.exportSpan()returncompletion}llmCall=llmobs.wrap({kind:'llm',name:'invokeLLM',modelName:'claude',modelProvider:'anthropic'},llmCall)
Soumission des évaluations
LLMObs.submit_evaluation() peut être utilisé pour soumettre votre évaluation personnalisée associée à un span donné.
LLMObs.submit_evaluation_for est obsolète et sera supprimé dans la prochaine version majeure de ddtrace (4.0). Pour migrer, renommez votre LLMObs.submit_evaluation_for appels avec LLMObs.submit_evaluation.
Remarque : Les évaluations personnalisées sont des évaluateurs que vous implémentez et hébergez vous-même. Celles-ci diffèrent des évaluations prêtes à l’emploi, qui sont automatiquement calculées par Datadog à l’aide d’évaluateurs intégrés. Pour configurer les évaluations prêtes à l’emploi pour votre application, utilisez la page Agent Observability > Settings > Evaluations dans Datadog.
La méthode LLMObs.submit_evaluation() accepte les arguments suivants :
Arguments
label
requis - chaîne Le nom de l’évaluation.
metric_type
requis - chaîne Le type de l’évaluation. Doit être categorical, score, boolean ou json.
value
requis - chaîne, type numérique ou dict La valeur de l’évaluation. Doit être une chaîne (metric_type==categorical), un entier/flottant (metric_type==score), un booléen (metric_type==boolean) ou un dictionnaire (metric_type==json).
span
optionnel - dictionnaire Un dictionnaire qui identifie de manière unique le span associé à cette évaluation. Doit contenir span_id (chaîne) et trace_id (chaîne). Utilisez LLMObs.export_span() pour générer ce dictionnaire.
span_with_tag_value
optionnel - dictionnaire Un dictionnaire qui identifie de manière unique le span associé à cette évaluation. Doit contenir tag_key (chaîne) et tag_value (chaîne).
Remarque: Exactement l’un des éléments span ou span_with_tag_value est requis. Fournir les deux, ou aucun des deux, déclenche une ValueError.
ml_app
requis - chaîne Le nom de l’application ML.
timestamp_ms
facultatif - entier L’horodatage unix en millisecondes au moment où le résultat de la métrique d’évaluation a été généré. S’il n’est pas fourni, la valeur par défaut est l’heure actuelle.
tags
optionnel - dictionnaire Un dictionnaire de paires clé-valeur de type chaîne que les utilisateurs peuvent ajouter en tant que tags concernant l’évaluation. Pour plus d’informations sur les tags, consultez Getting Started with Tags.
assessment
optionnel - chaîne Une évaluation de cette évaluation. Les valeurs acceptées sont pass et fail.
reasoning
optionnel - chaîne Une explication textuelle du résultat de l’évaluation.
metadata
a: facultatif - dictionnaire Un dictionnaire contenant des métadonnées structurées arbitraires associées au résultat de l’évaluation.
Exemple
fromddtrace.llmobsimportLLMObsfromddtrace.llmobs.decoratorsimportllm@llm(model_name="claude",name="invoke_llm",model_provider="anthropic")defllm_call():completion=...# user application logic to invoke LLM# joining an evaluation to a span via a tag key-value pairmsg_id=get_msg_id()LLMObs.annotate(tags={'msg_id':msg_id})LLMObs.submit_evaluation(span_with_tag_value={"tag_key":"msg_id","tag_value":msg_id},ml_app="chatbot",label="harmfulness",metric_type="score",value=10,tags={"evaluation_provider":"ragas"},assessment="fail",reasoning="Malicious intent was detected in the user instructions.",metadata={"details":["jailbreak","SQL injection"]})# joining an evaluation to a span via span ID and trace IDspan_context=LLMObs.export_span(span=None)LLMObs.submit_evaluation(span_context=span_context,ml_app="chatbot",label="harmfulness",metric_type="score",value=10,tags={"evaluation_provider":"ragas"},assessment="fail",reasoning="Malicious intent was detected in the user instructions.",metadata={"details":["jailbreak","SQL injection"]})returncompletion
llmobs.submitEvaluation() peut être utilisé pour soumettre votre évaluation personnalisée associée à un span donné.
La méthode llmobs.submitEvaluation() accepte les arguments suivants :
Arguments
span_context
requis - dictionnaire Le contexte du span à associer à l’évaluation. Il doit s’agir de la sortie de LLMObs.export_span().
evaluationOptions
requis - objet Un objet des données d’évaluation.
L’objet evaluationOptions peut contenir les éléments suivants :
label
requis - chaîne Le nom de l’évaluation.
metricType
requis - chaîne Le type de l’évaluation. Doit être l’une des valeurs suivantes : « categorical », « score », « boolean » ou « json ».
value
requis - type chaîne ou numérique La valeur de l’évaluation. Doit être une chaîne (pour categorical metric_type), un nombre (pour score metric_type), un booléen (pour boolean metric_type) ou un objet JSON (pour json metric_type).
tags
optionnel - dictionnaire Un dictionnaire de paires clé-valeur de type chaîne que les utilisateurs peuvent ajouter en tant que tags concernant l’évaluation. Pour plus d’informations sur les tags, consultez Getting Started with Tags.
assessment
optionnel - chaîne Une évaluation de cette évaluation. Les valeurs acceptées sont pass et fail.
reasoning
optionnel - chaîne Une explication textuelle du résultat de l’évaluation.
metadata
optionnel - dictionnaire Un objet JSON contenant des métadonnées structurées arbitraires associées au résultat de l’évaluation.
Exemple
functionllmCall(){constcompletion=...// user application logic to invoke LLM
constspanContext=llmobs.exportSpan()llmobs.submitEvaluation(spanContext,{label:"harmfulness",metricType:"score",value:10,tags:{evaluationProvider:"ragas"}})returncompletion}llmCall=llmobs.wrap({kind:'llm',name:'invokeLLM',modelName:'claude',modelProvider:'anthropic'},llmCall)
Utilisez LLMObs.SubmitEvaluation() pour soumettre votre évaluation personnalisée associée à un span donné.
La méthode LLMObs.SubmitEvaluation() accepte les arguments suivants :
Arguments
llmObsSpan
requis - LLMObsSpan Le contexte du span à associer à l’évaluation.
label
requis - String Le nom de l’évaluation.
categoricalValue ou scoreValue
requis - Chaîne ou double La valeur de l’évaluation. Doit être une chaîne (pour les évaluations catégorielles) ou un double (pour les évaluations de score).
tags
optionnel - Map<String, Object> Un dictionnaire de paires clé-valeur sous forme de chaînes utilisé pour ajouter des tags à l’évaluation. Pour plus d’informations sur les tags, consultez Getting Started with Tags.
Exemple
importdatadog.trace.api.llmobs.LLMObs;publicclassMyJavaClass{publicStringinvokeChat(StringuserInput){LLMObsSpanllmSpan=LLMObs.startLLMSpan("my-llm-span-name","my-llm-model","my-company","maybe-ml-app-override","session-141");StringchatResponse="N/A";try{chatResponse=...// user application logic to invoke LLM}catch(Exceptione){llmSpan.addThrowable(e);thrownewRuntimeException(e);}finally{llmSpan.finish();// submit evaluationsLLMObs.SubmitEvaluation(llmSpan,"toxicity","toxic",Map.of("language","english"));LLMObs.SubmitEvaluation(llmSpan,"f1-similarity",0.02,Map.of("provider","f1-calculator"));}returnchatResponse;}}
Soumission du feedback de l’utilisateur final
Le feedback de l’utilisateur final recueille les retours des utilisateurs de votre application LLM, tels que des évaluations par pouce levé ou pouce baissé, si un utilisateur a accepté le changement d’un agent, et des commentaires en texte libre. Contrairement à une évaluation, le feedback porte l’identité du soumetteur et peut cibler un span, une trace, une session ou une entité définie par le client. Pour plus d’informations, consultez Feedback de l’utilisateur final.
Utilisez LLMObs.submit_feedback() pour soumettre un feedback de l’utilisateur final associé à un span, une trace, une session ou une entité définie par le client.
La méthode LLMObs.submit_feedback() accepte les arguments suivants :
Arguments
label
requis - chaîne Le nom de la métrique de feedback. Ne doit pas contenir de ..
metric_type
requis - chaîne Le type de feedback. Doit être categorical, score, boolean, json ou text.
value
requis - chaîne, type numérique, booléen ou dict La valeur du feedback. Doit être une chaîne (metric_type==categorical ou metric_type==text), un entier ou un nombre à virgule flottante (metric_type==score), un booléen (metric_type==boolean) ou dict (metric_type==json).
submitter
requis - dictionnaire Un dictionnaire qui identifie qui a soumis le feedback. Doit contenir un id non vide (chaîne), et peut contenir un type optionnel (chaîne), tel que user.
span
optionnel - dictionnaire Un dictionnaire qui identifie le span associé à ce feedback. Utilisez LLMObs.export_span() pour générer ce dictionnaire.
span_id
optionnel - chaîne L’identifiant du span associé à ce feedback.
trace_id
optionnel - chaîne L’identifiant de la trace associée à ce retour d’information.
session_id
optionnel - chaîne L’identifiant de la session associée à ce retour d’information.
feedback_join_key
optionnel - chaîne Une clé définie par le client associée à ce feedback, telle qu’un incident ID ou un ticket ID. Pour connecter le feedback à vos spans, annotez-les d’abord avec un tag feedback_join_key contenant la même valeur. Voir Enriching spans.
Remarque: Exactement l’un des éléments span, span_id, trace_id, session_id ou feedback_join_key est requis. En fournir plus d’un, ou aucun, déclenche une ValueError.
ml_app
optionnel - chaîne Le nom de l’application ML. S’il n’est pas fourni, il prend par défaut la valeur de l’application ML configurée pour le SDK.
timestamp_ms
facultatif - entier L’horodatage Unix en millisecondes au moment où le feedback a été généré. S’il n’est pas fourni, la valeur par défaut est l’heure actuelle.
tags
optionnel - dictionnaire Un dictionnaire de paires clé-valeur sous forme de chaînes que les utilisateurs peuvent ajouter en tant que tags concernant le feedback. Pour plus d’informations sur les tags, consultez Getting Started with Tags.
assessment
optionnel - chaîne Une appréciation de ce feedback. Les valeurs acceptées sont pass et fail.
reasoning
optionnel - _ chaîne_ Une explication textuelle du feedback.
Exemple
fromddtrace.llmobsimportLLMObsfromddtrace.llmobs.decoratorsimportllm@llm(model_name="claude",name="invoke_llm",model_provider="anthropic")defllm_call():completion=...# user application logic to invoke LLMspan_context=LLMObs.export_span(span=None)# submitting feedback for a traceLLMObs.submit_feedback(label="thumbs",metric_type="categorical",value="down",submitter={"id":"user-123","type":"user"},trace_id=span_context["trace_id"],assessment="fail",)# connecting the span to a customer-defined entityLLMObs.annotate(tags={"feedback_join_key":"incident-123"})# submitting feedback for that entityLLMObs.submit_feedback(label="user_comment",metric_type="text",value="The investigation missed the customer impact.",submitter={"id":"user-123","type":"user"},feedback_join_key="incident-123",)returncompletion
Utilisez llmobs.submitFeedback() pour soumettre un feedback de l’utilisateur final associé à un span, une trace, une session ou une entité définie par le client.
La méthode llmobs.submitFeedback() accepte un objet d’options avec les propriétés suivantes :
Arguments
label
requis - chaîne Le nom de la métrique de feedback. Ne doit pas contenir de ..
metricType
requis - chaîne Le type de feedback. Doit être l’un des categorical, score, boolean, json ou text.
value
requis - chaîne, nombre, booléen ou objet La valeur du feedback. Doit être une chaîne (pour les types de métriques categorical et text), un nombre (pour score), un booléen (pour boolean) ou un objet JSON (pour json).
submitter
requis - objet Un objet qui identifie qui a soumis le retour d’information. Doit contenir un id non vide (chaîne), et peut contenir un type optionnel (chaîne), tel que user.
span
optionnel - object Le contexte de span du span auquel associer le feedback. Ceci doit être la sortie de llmobs.exportSpan().
spanId
optionnel - chaîne L’ID du span auquel associer le feedback.
traceId
optionnel - chaîne L’ID de la trace à laquelle associer le feedback.
sessionId
optionnel - chaîne L’ID de la session à laquelle associer le feedback.
feedbackJoinKey
optionnel - chaîne Une clé définie par le client à laquelle associer le feedback, telle qu’un incident ID ou un ticket ID. Définissez la même clé sur vos spans pour y associer le feedback.
Remarque: Exactement un des éléments span, spanId, traceId, sessionId ou feedbackJoinKey est requis. En fournir plus d’un, ou aucun, génère une erreur.
mlApp
optionnel - chaîne Le nom de l’application ML. S’il n’est pas fourni, il prend par défaut la valeur de l’application ML configurée pour le SDK.
timestampMs
optionnel - nombre L’horodatage Unix en millisecondes au moment où le feedback a été généré. S’il n’est pas fourni, la valeur par défaut est l’heure actuelle.
tags
optionnel - object Un objet de paires clé-valeur sous forme de chaîne que les utilisateurs peuvent ajouter en tant que tags concernant le feedback. Pour plus d’informations sur les tags, consultez Getting Started with Tags.
assessment
optionnel - chaîne Une appréciation de ce feedback. Les valeurs acceptées sont pass et fail.
reasoning
optionnel - _ chaîne_ Une explication textuelle du feedback.
Exemple
functionllmCall(){constcompletion=...// user application logic to invoke LLM
constspanContext=llmobs.exportSpan()// submitting feedback for a trace
llmobs.submitFeedback({label:'thumbs',metricType:'boolean',value:true,submitter:{id:'user-123',type:'user'},traceId:spanContext.traceId,assessment:'pass'})// connecting the span to a customer-defined entity
llmobs.annotate({tags:{feedback_join_key:'incident-123'}})// submitting feedback for that entity
llmobs.submitFeedback({label:'user_comment',metricType:'text',value:'This answer was helpful.',submitter:{id:'user-123',type:'user'},feedbackJoinKey:'incident-123'})returncompletion}llmCall=llmobs.wrap({kind:'llm',name:'invokeLLM',modelName:'claude',modelProvider:'anthropic'},llmCall)
Utilisez LLMObs.submitFeedback() pour soumettre un feedback de l’utilisateur final associé à un span, une trace, une session ou une entité définie par le client. Construisez le feedback avec LLMObs.Feedback.builder().
Le constructeur accepte les méthodes suivantes :
Arguments
label(String label)
requis Le nom de la métrique de feedback. Ne doit pas contenir de ..
categoricalValue(String), scoreValue(double), booleanValue(boolean), jsonValue(Map<String, Object>) ou textValue(String)
requis La valeur du feedback. Définissez exactement l’une de ces méthodes, ce qui détermine également le type de métrique.
submitter(String id, String type) ou submitter(Submitter submitter)
requis Identifie qui a soumis le feedback. Le id doit être une chaîne non vide. Le type est un qualificateur optionnel, tel que user.
span(LLMObsSpan span), spanId(String), traceId(String), sessionId(String) ou feedbackJoinKey(String)
requis L’entité à laquelle rattacher le feedback. Définissez exactement l’une de ces méthodes. Utilisez feedbackJoinKey pour une entité définie par le client, telle qu’un ID d’incident ou un ID de ticket, et définissez la même clé sur vos spans pour y connecter le feedback.
mlApp(String mlApp)
facultatif Le nom de l’application ML. S’il n’est pas fourni, la valeur par défaut est l’application ML configurée pour le traceur.
timestampMs(long timestampMs)
facultatif L’horodatage Unix en millisecondes au moment où le feedback a été généré. S’il n’est pas fourni, la valeur par défaut est l’heure actuelle.
tags(Map<String, Object> tags) ou tag(String key, Object value)
facultatif Paires clé-valeur utilisées pour taguer les commentaires. Pour plus d’informations sur les tags, consultez Getting Started with Tags.
assessment(Assessment assessment)
facultatif Une appréciation de ce feedback. Les valeurs acceptées sont LLMObs.Feedback.Assessment.PASS et LLMObs.Feedback.Assessment.FAIL.
reasoning(String reasoning)
facultatif Une explication textuelle du feedback.
Note: LLMObs.submitFeedback() valide le commentaire et génère une IllegalArgumentException lorsque l’Agent Observability est activé et que le commentaire est invalide, par exemple lorsque la cible, la valeur ou l’expéditeur est manquant. Lorsque l’Agent Observability est désactivé, ou que l’Agent n’est pas attaché, l’appel est un no-op.
Exemple
importdatadog.trace.api.llmobs.LLMObs;publicclassMyJavaClass{publicStringinvokeChat(StringuserInput){LLMObsSpanllmSpan=LLMObs.startLLMSpan("my-llm-span-name","my-llm-model","my-company","maybe-ml-app-override","session-141");StringchatResponse="N/A";try{chatResponse=...// user application logic to invoke LLM}catch(Exceptione){llmSpan.addThrowable(e);thrownewRuntimeException(e);}finally{// connecting the span to a customer-defined entityllmSpan.setTag("feedback_join_key","incident-123");llmSpan.finish();// submitting feedback for a traceLLMObs.submitFeedback(LLMObs.Feedback.builder().traceId(llmSpan.getTraceId().toString()).label("thumbs").booleanValue(true).submitter("user-123","end_user").assessment(LLMObs.Feedback.Assessment.PASS).reasoning("answered the question").build());// submitting feedback for that entityLLMObs.submitFeedback(LLMObs.Feedback.builder().feedbackJoinKey("incident-123").label("user_comment").textValue("The answer missed the customer impact.").submitter("user-123","end_user").assessment(LLMObs.Feedback.Assessment.FAIL).build());}returnchatResponse;}}
Traitement des spans
Pour modifier les données d’entrée et de sortie sur les spans, vous pouvez configurer une fonction de processeur. La fonction de processeur a accès aux tags span pour permettre la modification conditionnelle des entrées/sorties. Les fonctions de processeur peuvent soit renvoyer le span modifié pour l’émettre, soit renvoyer None/null pour empêcher totalement l’émission du span. Ceci est utile pour filtrer les spans qui contiennent des données sensibles ou qui répondent à certains critères.
Exemple
fromddtrace.llmobsimportLLMObsfromddtrace.llmobsimportLLMObsSpandefredact_processor(span:LLMObsSpan)->LLMObsSpan:ifspan.get_tag("no_output")=="true":formessageinspan.output:message["content"]=""returnspan# If using LLMObs.enable()LLMObs.enable(...span_processor=redact_processor,)# else when using `ddtrace-run`LLMObs.register_processor(redact_processor)withLLMObs.llm("invoke_llm_with_no_output"):LLMObs.annotate(tags={"no_output":"true"})
Exemple : modification conditionnelle avec auto-instrumentation
Lors de l’utilisation de l’auto-instrumentation, le span n’est pas toujours accessible contextuellement. Pour modifier conditionnellement les entrées et les sorties sur des spans auto-instrumentés, annotation_context() peut être utilisé en plus d’un processeur de span.
fromddtrace.llmobsimportLLMObsfromddtrace.llmobsimportLLMObsSpandefredact_processor(span:LLMObsSpan)->LLMObsSpan:ifspan.get_tag("no_input")=="true":formessageinspan.input:message["content"]=""returnspanLLMObs.register_processor(redact_processor)defcall_openai():withLLMObs.annotation_context(tags={"no_input":"true"}):# make call to openai...
Exemple : empêcher l’émission de spans
fromddtrace.llmobsimportLLMObsfromddtrace.llmobsimportLLMObsSpanfromtypingimportOptionaldeffilter_processor(span:LLMObsSpan)->Optional[LLMObsSpan]:# Skip spans that are marked as internal or contain sensitive dataifspan.get_tag("internal")=="true"orspan.get_tag("sensitive")=="true":returnNone# This span will not be emitted# Process and return the span normallyreturnspanLLMObs.register_processor(filter_processor)# This span will be filtered out and not sent to DatadogwithLLMObs.workflow("internal_workflow"):LLMObs.annotate(tags={"internal":"true"})# ... workflow logic
Exemple : modification conditionnelle avec auto-instrumentation
Lors de l’utilisation de l’auto-instrumentation, le span n’est pas toujours accessible contextuellement. Pour modifier conditionnellement les entrées et les sorties sur des spans auto-instrumentés, llmobs.annotationContext() peut être utilisé en plus d’un processeur de span.
const{llmobs}=require('dd-trace');functionredactProcessor(span){if(span.getTag("no_input")=="true"){for(constmessageofspan.input){message.content="";}}returnspan;}llmobs.registerProcessor(redactProcessor);asyncfunctioncallOpenai(){awaitllmobs.annotationContext({tags:{no_input:"true"}},async()=>{// make call to openai
});}
Exemple : empêcher l’émission de spans
consttracer=require('dd-trace').init({llmobs:{mlApp:"<YOUR_ML_APP_NAME>"}})constllmobs=tracer.llmobsfunctionfilterProcessor(span){// Skip spans that are marked as internal or contain sensitive data
if(span.getTag("internal")==="true"||span.getTag("sensitive")==="true"){returnnull// This span will not be emitted
}// Process and return the span normally
returnspan}llmobs.registerProcessor(filterProcessor)// This span will be filtered out and not sent to Datadog
functioninternalWorkflow(){returnllmobs.trace({kind:'workflow',name:'internalWorkflow'},(span)=>{llmobs.annotate({tags:{internal:"true"}})// ... workflow logic
})}
Suivi des sessions utilisateur
Le suivi des sessions vous permet d’associer plusieurs interactions à un utilisateur donné.
Lors du démarrage d’un span racine pour une nouvelle trace ou un nouveau span dans un nouveau processus, spécifiez l’argument session_id avec l’ID de chaîne de la session utilisateur sous-jacente, qui est soumis en tant que tag sur le span. En option, vous pouvez également spécifier les tags user_handle, user_name et user_id.
L’ID représentant une session utilisateur unique, par exemple, une session de chat.
user_handle
L’handle de l’utilisateur de la session de chat.
user_name
Le nom de l’utilisateur de la session de chat.
user_id
L’ID de l’utilisateur de la session de chat.
Lors du démarrage d’un span racine pour une nouvelle trace ou un nouveau span dans un nouveau processus, spécifiez l’argument sessionId avec l’ID de chaîne de la session utilisateur sous-jacente :
Lors du démarrage d’un span racine pour une nouvelle trace ou un nouveau span dans un nouveau processus, spécifiez l’argument sessionId avec l’ID de chaîne de la session utilisateur sous-jacente :
importdatadog.trace.api.llmobs.LLMObs;publicclassMyJavaClass{publicStringprocessChat(intuserID){LLMObsSpanworkflowSpan=LLMObs.startWorkflowSpan("incoming-chat",null,"session-"+System.currentTimeMillis()+"-"+userID);StringchatResponse=answerChat();// user application logicworkflowSpan.annotateIO(...);// record the input and outputworkflowSpan.finish();returnchatResponse;}}
Traçage distribué
Le SDK prend en charge le traçage entre des services ou des hosts distribués. Le traçage distribué fonctionne en propageant les informations de span à travers les requêtes web.
La bibliothèque ddtrace fournit des intégrations prêtes à l’emploi qui prennent en charge le traçage distribué pour les frameworks web 1 et les bibliothèques HTTP populaires. Si votre application effectue des requêtes en utilisant ces bibliothèques prises en charge, vous pouvez activer le traçage distribué en exécutant :
Si votre application n’utilise aucune de ces bibliothèques prises en charge, vous pouvez activer le traçage distribué en propageant manuellement les informations de span vers et depuis les en-têtes HTTP. Le SDK fournit les méthodes d’assistance LLMObs.inject_distributed_headers() et LLMObs.activate_distributed_headers() pour injecter et activer les contextes de traçage dans les en-têtes de requête.
Injection des en-têtes distribués
La méthode LLMObs.inject_distributed_headers() prend un span et injecte son contexte dans les en-têtes HTTP pour qu’ils soient inclus dans la requête. Cette méthode accepte les arguments suivants :
request_headers
requis - dictionnaire Les en-têtes HTTP à étendre avec les attributs de contexte de traçage.
span
optionnel - Span - par défaut: The current active span. Le span dont le contexte doit être injecté dans les en-têtes de requête fournis. Pour tout span (y compris ceux utilisant des décorateurs de fonction), par défaut le span actif est utilisé.
Activation des en-têtes distribués
La méthode LLMObs.activate_distributed_headers() prend des en-têtes HTTP et extrait les attributs de contexte de traçage pour les activer dans le nouveau service.
Remarque : Vous devez appeler LLMObs.activate_distributed_headers() avant de démarrer tout span dans votre service en aval. Les spans démarrés auparavant (y compris les spans de décorateur de fonction) ne sont pas capturés dans la trace distribuée.
Cette méthode accepte l’argument suivant :
request_headers
requis - dictionnaire Les en-têtes HTTP à partir desquels extraire les attributs de contexte de traçage.
fromddtrace.llmobsimportLLMObsdefserver_process_request(request):LLMObs.activate_distributed_headers(request.headers)withLLMObs.task(name="process_request")asspan:pass# arbitrary server work
La bibliothèque dd-trace fournit des intégrations prêtes à l’emploi qui prennent en charge le traçage distribué pour les frameworks web populaires. L’importation du traceur active automatiquement ces intégrations, mais vous pouvez les désactiver en option avec :
consttracer=require('dd-trace').init({llmobs:{...},})tracer.use('http',false)// disable the http integration
Traçage avancé
Traçage des spans à l’aide de méthodes en ligne
Pour chaque type de span, la classe ddtrace.llmobs.LLMObs fournit une méthode en ligne correspondante pour tracer automatiquement l’opération qu’implique un bloc de code donné. Ces méthodes ont la même signature d’argument que leurs homologues décorateurs de fonction, avec l’ajout que name prend par défaut le type de span (llm, workflow, etc.) s’il n’est pas fourni. Ces méthodes peuvent être utilisées comme gestionnaires de contexte pour terminer automatiquement le span une fois le bloc de code inclus terminé.
Exemple
fromddtrace.llmobsimportLLMObsdefprocess_message():withLLMObs.workflow(name="process_message",session_id="<SESSION_ID>",ml_app="<ML_APP>")asworkflow_span:...# user application logicreturn
Persistance d’un span entre les contextes
Pour démarrer et arrêter manuellement un span entre différents contextes ou périmètres :
Démarrez un span manuellement en utilisant les mêmes méthodes (par exemple, la méthode LLMObs.workflow pour un span de workflow), mais en tant qu’appel de fonction simple plutôt qu’en tant que gestionnaire de contexte.
Passez l’objet span en tant qu’argument à d’autres fonctions.
Arrêtez le span manuellement avec la méthode span.finish(). Remarque : le span doit être terminé manuellement, sinon il n’est pas soumis.
Exemple
fromddtrace.llmobsimportLLMObsdefprocess_message():workflow_span=LLMObs.workflow(name="process_message")...# user application logicseparate_task(workflow_span)returndefseparate_task(workflow_span):...# user application logicworkflow_span.finish()return
Forcer le vidage dans les environnements sans serveur
LLMObs.flush() est une fonction bloquante qui soumet toutes les données d’Agent Observability mises en mémoire tampon au backend Datadog. Cela peut être utile dans les environnements sans serveur pour empêcher une application de quitter avant que toutes les traces Agent Observability ne soient soumises.
Traçage de plusieurs applications
Le SDK prend en charge le traçage de plusieurs applications LLM à partir du même service.
Vous pouvez configurer une variable d’environnement DD_LLMOBS_ML_APP sur le nom de votre application LLM, dans laquelle tous les spans générés sont regroupés par défaut.
Pour remplacer cette configuration et utiliser un nom d’application LLM différent pour un span racine donné, transmettez l’argument ml_app avec le nom sous forme de chaîne de l’application LLM sous-jacente lors du démarrage d’un span racine pour une nouvelle trace ou d’un span dans un nouveau processus.
fromddtrace.llmobs.decoratorsimportworkflow@workflow(name="process_message",ml_app="<NON_DEFAULT_ML_APP_NAME>")defprocess_message():...# user application logicreturn
Traçage des spans à l’aide de méthodes en ligne
Le SDK llmobs fournit une méthode en ligne correspondante pour tracer automatiquement l’opération qu’implique un bloc de code donné. Ces méthodes ont la même signature d’argument que leurs équivalents wrapper de fonction, avec l’ajout que name est requis, car le nom ne peut pas être déduit d’un rappel anonyme. Cette méthode terminera le span dans les conditions suivantes :
Si la fonction renvoie une promesse, le span se termine lorsque la promesse est résolue ou rejetée.
Si la fonction prend une fonction de rappel comme dernier paramètre, le span se termine lorsque cette fonction de rappel est appelée.
Si la fonction n’accepte pas de rappel et ne renvoie pas de promesse, le span se termine à la fin de l’exécution de la fonction.
Exemple sans rappel
functionprocessMessage(){returnllmobs.trace({kind:'workflow',name:'processMessage',sessionId:'<SESSION_ID>',mlApp:'<ML_APP>'},workflowSpan=>{...// user application logic
return})}
Exemple avec un rappel
functionprocessMessage(){returnllmobs.trace({kind:'workflow',name:'processMessage',sessionId:'<SESSION_ID>',mlApp:'<ML_APP>'},(workflowSpan,cb)=>{...// user application logic
letmaybeError=...cb(maybeError)// the span will finish here, and tag the error if it is not null or undefined
return})}
Le type de retour de cette fonction correspond au type de retour de la fonction tracée :
functionprocessMessage(){constresult=llmobs.trace({kind:'workflow',name:'processMessage',sessionId:'<SESSION_ID>',mlApp:'<ML_APP>'},workflowSpan=>{...// user application logic
return'hello world'})console.log(result)// 'hello world'
returnresult}
Décorateurs de fonction en TypeScript
Le SDK Agent Observability Node.js propose une fonction llmobs.decorate qui sert de décorateur de fonction pour les applications TypeScript. Le comportement de traçage de cette fonction est identique à llmobs.wrap.
Exemple
// index.ts
importtracerfrom'dd-trace';tracer.init({llmobs:{mlApp:"<YOUR_ML_APP_NAME>",},});const{llmobs}=tracer;classMyAgent{@llmobs.decorate({kind:'agent'})asyncrunChain(){...// user application logic
return}}
Forcer le vidage dans les environnements sans serveur
llmobs.flush() est une fonction bloquante qui soumet toutes les données d’Agent Observability mises en mémoire tampon au backend Datadog. Cela peut être utile dans les environnements sans serveur pour empêcher une application de quitter avant que toutes les traces Agent Observability ne soient soumises.
Traçage de plusieurs applications
Le SDK prend en charge le traçage de plusieurs applications LLM à partir du même service.
Vous pouvez configurer une variable d’environnement DD_LLMOBS_ML_APP sur le nom de votre application LLM, dans laquelle tous les spans générés sont regroupés par défaut.
Pour remplacer cette configuration et utiliser un nom d’application LLM différent pour un span racine donné, transmettez l’argument mlApp avec le nom sous forme de chaîne de l’application LLM sous-jacente lors du démarrage d’un span racine pour une nouvelle trace ou d’un span dans un nouveau processus.
functionprocessMessage(){...// user application logic
return}processMessage=llmobs.wrap({kind:'workflow',name:'processMessage',mlApp:'<NON_DEFAULT_ML_APP_NAME>'},processMessage)
Directives de nommage des applications
Le nom de votre application (la valeur de DD_LLMOBS_ML_APP) doit respecter ces directives :
Doit être une chaîne Unicode en minuscules
Peut comporter jusqu’à 193 caractères
Ne peut pas contenir de traits de soulignement contigus ou finaux
Peut contenir les caractères suivants :
Alphanumériques
Traits de soulignement
Tirets
Deux-points
Points
Barres obliques
Pour aller plus loin
Documentation, liens et articles supplémentaires utiles: