观测与评测

数据追踪

火山引擎云平台提供了多种 Tracing 平台

VeADK 提供可观测(Tracing)的能力,用于记录 Agent 执行过程中的关键路径与中间状态。支持将 Trace 数据输出至本地文件,或通过不同的 Exporter 上报至火山引擎平台,包括 CozeLoop、APMPlus、TLS,有助于开发者进行调试、性能分析、行为追踪等任务。

本地观测

通过如下方式开启本地观测,并且在 runner 的运行函数中指定 save_tracing_data=True 来将运行时数据保存至本地:

import asyncio

from veadk import Agent, Runner
from veadk.memory.short_term_memory import ShortTermMemory
from veadk.tracing.telemetry.opentelemetry_tracer import OpentelemetryTracer

tracer = OpentelemetryTracer()
agent = Agent(tracers=[tracer])

session_id = "session_id"

runner = Runner(agent=agent, short_term_memory=ShortTermMemory())

prompt = "How is the weather like in Beijing? Besides, tell me which tool you invoked."

# 设置 `save_tracing_data` 来保存运行时的 Tracing 数据
asyncio.run(runner.run(messages=prompt, session_id=session_id, save_tracing_data=True))

print(f"Tracing file path: {tracer._trace_file_path}")

Tracing 保存后的文件格式样例如下:

[
    {
        "name": "execute_tool get_city_weather",
        "span_id": 7791923691033028744,
        "trace_id": 219596633571878926828580094409810266267,
        "start_time": 1758693545943618000,
        "end_time": 1758693545943896000,
        "attributes": {
            "gen_ai.system": "openai",
            "gen_ai.system.version": "0.2.8",
            "gen_ai.agent.name": "veAgent",
            "openinference.instrumentation.veadk": "0.2.8",
            "gen_ai.app.name": "veadk_default_app",
            "gen_ai.user.id": "veadk_default_user",
            "gen_ai.session.id": "session_id",
            "agent_name": "veAgent",
            "agent.name": "veAgent",
            "app_name": "veadk_default_app",
            "app.name": "veadk_default_app",
            "user.id": "veadk_default_user",
            "session.id": "session_id",
            "cozeloop.report.source": "veadk",
            "cozeloop.call_type": "",
            "gen_ai.operation.name": "execute_tool",
            "gen_ai.tool.name": "get_city_weather",
            "gen_ai.tool.input": "{\"name\": \"get_city_weather\", \"description\": \"Retrieves the weather information of a given city. the args must in English\", \"parameters\": {\"city\": \"Beijing\"}}",
            "gen_ai.tool.output": "{\"id\": \"call_opas0vkohuzcaevluv06sewk\", \"name\": \"get_city_weather\", \"response\": {\"result\": \"Sunny, 25°C\"}}",
            "cozeloop.input": "{\"name\": \"get_city_weather\", \"description\": \"Retrieves the weather information of a given city. the args must in English\", \"parameters\": {\"city\": \"Beijing\"}}",
            "cozeloop.output": "{\"id\": \"call_opas0vkohuzcaevluv06sewk\", \"name\": \"get_city_weather\", \"response\": {\"result\": \"Sunny, 25°C\"}}"
        },
        "parent_span_id": 7552931582864344016
    },
    {
        "name": "call_llm",
        "span_id": 7552931582864344016,
        "trace_id": 219596633571878926828580094409810266267,
        "start_time": 1758693533476592000,
        "end_time": 1758693545956432000,
        "attributes": {
            "gen_ai.system": "openai",
            "gen_ai.system.version": "0.2.8",
            "gen_ai.agent.name": "veAgent",
            "openinference.instrumentation.veadk": "0.2.8",
            "gen_ai.app.name": "veadk_default_app",
            "gen_ai.user.id": "veadk_default_user",
            "gen_ai.session.id": "session_id",
            "agent_name": "veAgent",
            "agent.name": "veAgent",
            "app_name": "veadk_default_app",
            "app.name": "veadk_default_app",
            "user.id": "veadk_default_user",
            "session.id": "session_id",
            "cozeloop.report.source": "veadk",
            "cozeloop.call_type": "",
            "gen_ai.request.model": "openai/doubao-seed-1.6-250615",
            "gen_ai.request.type": "chat",
            "gen_ai.request.functions.0.name": "get_city_weather",
            "gen_ai.request.functions.0.description": "Retrieves the weather information of a given city. the args must in English",
            "gen_ai.request.functions.0.parameters": "{'properties': {'city': {'type': <Type.STRING: 'STRING'>}}, 'required': ['city'], 'type': <Type.OBJECT: 'OBJECT'>}",
            "gen_ai.response.model": "openai/doubao-seed-1.6-250615",
            "gen_ai.response.stop_reason": "<no_stop_reason_provided>",
            "gen_ai.response.finish_reason": "<no_finish_reason_provided>",
            "gen_ai.operation.name": "chat",
            "gen_ai.prompt.0.role": "user",
            "gen_ai.prompt.0.content": "How is the weather like in Beijing? Besides, tell me which tool you invoked.",
            "gen_ai.completion.0.role": "model",
            "gen_ai.completion.0.tool_calls.0.id": "call_opas0vkohuzcaevluv06sewk",
            "gen_ai.completion.0.tool_calls.0.type": "function",
            "gen_ai.completion.0.tool_calls.0.function.name": "get_city_weather",
            "gen_ai.completion.0.tool_calls.0.function.arguments": "{\"city\": \"Beijing\"}",
            "gen_ai.usage.input_tokens": 630,
            "gen_ai.usage.output_tokens": 497,
            "gen_ai.usage.total_tokens": 1127
        },
        "parent_span_id": 772582603144924992
    },
    {
        "name": "call_llm",
        "span_id": 455911132604421388,
        "trace_id": 219596633571878926828580094409810266267,
        "start_time": 1758693545956907000,
        "end_time": 1758693550432795000,
        "attributes": {
            "gen_ai.system": "openai",
            "gen_ai.system.version": "0.2.8",
            "gen_ai.agent.name": "veAgent",
            "openinference.instrumentation.veadk": "0.2.8",
            "gen_ai.app.name": "veadk_default_app",
            "gen_ai.user.id": "veadk_default_user",
            "gen_ai.session.id": "session_id",
            "agent_name": "veAgent",
            "agent.name": "veAgent",
            "app_name": "veadk_default_app",
            "app.name": "veadk_default_app",
            "user.id": "veadk_default_user",
            "session.id": "session_id",
            "cozeloop.report.source": "veadk",
            "cozeloop.call_type": "",
            "gen_ai.request.model": "openai/doubao-seed-1.6-250615",
            "gen_ai.request.type": "chat",
            "gen_ai.request.functions.0.name": "get_city_weather",
            "gen_ai.request.functions.0.description": "Retrieves the weather information of a given city. the args must in English",
            "gen_ai.request.functions.0.parameters": "{'properties': {'city': {'type': <Type.STRING: 'STRING'>}}, 'required': ['city'], 'type': <Type.OBJECT: 'OBJECT'>}",
            "gen_ai.response.model": "openai/doubao-seed-1.6-250615",
            "gen_ai.response.stop_reason": "<no_stop_reason_provided>",
            "gen_ai.response.finish_reason": "<no_finish_reason_provided>",
            "gen_ai.operation.name": "chat",
            "gen_ai.prompt.0.role": "user",
            "gen_ai.prompt.0.content": "How is the weather like in Beijing? Besides, tell me which tool you invoked.",
            "gen_ai.prompt.1.tool_calls.0.id": "call_opas0vkohuzcaevluv06sewk",
            "gen_ai.prompt.1.tool_calls.0.type": "function",
            "gen_ai.prompt.1.tool_calls.0.function.name": "get_city_weather",
            "gen_ai.prompt.1.tool_calls.0.function.arguments": "{\"city\": \"Beijing\"}",
            "gen_ai.prompt.2.role": "user",
            "gen_ai.prompt.2.content": "{'result': 'Sunny, 25°C'}",
            "gen_ai.completion.0.role": "model",
            "gen_ai.completion.0.content": "The weather in Beijing is Sunny with a temperature of 25°C. The tool invoked is \"get_city_weather\".",
            "gen_ai.usage.input_tokens": 690,
            "gen_ai.usage.output_tokens": 175,
            "gen_ai.usage.total_tokens": 865
        },
        "parent_span_id": 772582603144924992
    },
    {
        "name": "agent_run [veAgent]",
        "span_id": 772582603144924992,
        "trace_id": 219596633571878926828580094409810266267,
        "start_time": 1758693533476273000,
        "end_time": 1758693550432953000,
        "attributes": {
            "gen_ai.operation.name": "agent",
            "gen_ai.system": "openai",
            "gen_ai.system.version": "0.2.8",
            "gen_ai.agent.name": "veAgent",
            "openinference.instrumentation.veadk": "0.2.8",
            "gen_ai.app.name": "veadk_default_app",
            "gen_ai.user.id": "veadk_default_user",
            "gen_ai.session.id": "session_id",
            "agent_name": "veAgent",
            "agent.name": "veAgent",
            "app_name": "veadk_default_app",
            "app.name": "veadk_default_app",
            "user.id": "veadk_default_user",
            "session.id": "session_id",
            "cozeloop.report.source": "veadk",
            "cozeloop.call_type": ""
        },
        "parent_span_id": 13555911686149146924
    },
    {
        "name": "invocation",
        "span_id": 13555911686149146924,
        "trace_id": 219596633571878926828580094409810266267,
        "start_time": 1758693533476140000,
        "end_time": 1758693550432995000,
        "attributes": {
            "gen_ai.operation.name": "chain",
            "gen_ai.system": "openai",
            "gen_ai.system.version": "0.2.8",
            "gen_ai.agent.name": "veAgent",
            "openinference.instrumentation.veadk": "0.2.8",
            "gen_ai.app.name": "veadk_default_app",
            "gen_ai.user.id": "veadk_default_user",
            "gen_ai.session.id": "session_id",
            "agent_name": "veAgent",
            "agent.name": "veAgent",
            "app_name": "veadk_default_app",
            "app.name": "veadk_default_app",
            "user.id": "veadk_default_user",
            "session.id": "session_id",
            "cozeloop.report.source": "veadk",
            "cozeloop.call_type": "",
            "gen_ai.usage.total_tokens": 1992
        },
        "parent_span_id": null
    }
]

火山引擎云观测

通过设置不同的云端上报器exporter,可以将观测数据上传到对应平台:

示例:配置多个云端 exporter

import asyncio

from veadk import Agent, Runner
from veadk.memory.short_term_memory import ShortTermMemory
from veadk.tools.demo_tools import get_city_weather
from veadk.tracing.telemetry.exporters.apmplus_exporter import APMPlusExporter
from veadk.tracing.telemetry.exporters.cozeloop_exporter import CozeloopExporter
from veadk.tracing.telemetry.exporters.tls_exporter import TLSExporter
from veadk.tracing.telemetry.opentelemetry_tracer import OpentelemetryTracer

# 通过加载不同的 exporters 来上报到不同云平台
exporters = [CozeloopExporter(), APMPlusExporter(), TLSExporter()]
tracer = OpentelemetryTracer(exporters=exporters)

agent = Agent(tools=[get_city_weather], tracers=[tracer])

session_id = "session_id"

runner = Runner(agent=agent, short_term_memory=ShortTermMemory())

prompt = "How is the weather like in Beijing? Besides, tell me which tool you invoked."

# 设置 `save_tracing_data` 来保存运行时的 Tracing 数据
asyncio.run(runner.run(messages=prompt, session_id=session_id, save_tracing_data=True))

print(f"Tracing file path: {tracer._trace_file_path}")

Cozeloop 平台可视化界面:

APMPlus 平台可视化界面:

TLS 平台可视化界面: