操作场景
LangChain 和 LangGraph 是常用的 Agent 应用开发框架,运行时会产生多轮推理、模型调用、工具调用和子 Agent 调用等数据。安装
tencentcloud-agentobs-sdk-langchain 后,只需调用一次 setup(),即可自动拦截 LangChain 回调与 LangGraph 节点事件,还原完整调用链路,并将 Trace 上报。接入后可以查看以下内容:
每次
invoke() 的完整调用链,以及入口、Agent、推理轮次(Step)、Chain、模型调用和工具调用之间的父子关系。模型调用的请求模型、响应模型、输入/输出 Token、结束原因(finish_reason)和输入/输出消息。
工具名称、调用参数、返回结果、错误类型和错误信息,错误类型自动分类为超时、限流、鉴权失败、参数校验失败等。
LangChain 内部节点(如
RunnableSequence、Prompt、should_continue)的执行情况,以及 ReAct 推理轮次编号。并行工具调用、嵌套子 Agent、
RunnableParallel 等并发场景下的正确调用归属。SDK 支持以下两种接入方式:
接入方式 | 说明 | 推荐场景 |
使用支持 Skill 的 AI 工具,由 AI 创建或复用日志主题,并完成 SDK 安装、配置和验证。 | 希望减少手动配置,并用自然语言分析 Trace | |
安装 SDK,配置 Endpoint、日志主题和访问凭证,在代码中调用 setup() | 需要精细控制参数,或所用工具不支持 Skill |
前提条件
已开通 日志服务 CLS。
已准备具备 CLS 写入权限的访问凭证,例如 CAM 子账号、CAM 角色或临时密钥。可前往 API 密钥管理 页面获取,密钥需对目标主题有写入权限,权限模板参见 采集 Agent 可观测数据。
已获取 CLS 地域接入点。以广州地域为例:
方式一填写地域:
ap-guangzhou。方式二填写域名:内网为
ap-guangzhou.cls.tencentyun.com,外网为 ap-guangzhou.cls.tencentcs.com。已安装 LangChain 或 LangGraph,且应用可以正常运行。版本要求:Python 3.9及以上,
langchain-core 0.2及以上。方式一:通过 Skill 快速接入与分析
使用 tencentcloud-cls-agent-obs Skill,把当前 LangChain 项目接入腾讯云 Agent 可观测,地域为 ap-guangzhou。
接入完成后,可以直接用自然语言提出分析需求,例如:
分析最近 1 小时内耗时最高、Token 消耗最多和失败最多的调用,并给出可能原因。
方式二:手动配置接入
步骤1:创建 Agent 可观测应用
1. 登录 日志服务控制台,在左侧导航栏中选择 Agent 可观测。
2. 单击应用接入,按页面提示创建应用。
3. 在应用右侧单击编辑,复制 Trace 日志主题 ID,用作后续的
CLS_TOPIC_ID。步骤2:安装 SDK
执行以下命令安装 SDK。安装时会自动安装
langchain-core、CLS SDK 等依赖。pip install tencentcloud-agentobs-sdk-langchain
py -m pip install tencentcloud-agentobs-sdk-langchain
说明:
如果使用 LangGraph 构建 Agent,需要额外安装
langgraph;调用模型时需要安装对应的模型集成包,例如 langchain-openai。如果使用 Deep Agents,可以通过
pip install 'tencentcloud-agentobs-sdk-langchain[deepagents]' 一并安装可选依赖。步骤3:配置环境变量
配置 CLS 连接信息和模型服务的 API Key。
# 以广州地域外网接入点为例export CLS_ENDPOINT=ap-guangzhou.cls.tencentcs.comexport CLS_TOPIC_ID=<Trace 日志主题 ID>export CLS_SECRET_ID=<SecretId>export CLS_SECRET_KEY=<SecretKey>export OPENAI_API_KEY=<模型服务 API Key>
# 以广州地域外网接入点为例$env:CLS_ENDPOINT = "ap-guangzhou.cls.tencentcs.com"$env:CLS_TOPIC_ID = "<Trace日志主题ID>"$env:CLS_SECRET_ID = "<SecretId>"$env:CLS_SECRET_KEY = "<SecretKey>"$env:OPENAI_API_KEY = "<模型服务API Key>"
注意:
访问凭证属于敏感信息,建议通过环境变量注入,并使用最小权限、可轮换的临时凭证,避免将 SecretKey 写入代码或提交到代码仓库。
步骤4:初始化采集
在首次调用
invoke() 之前导入并调用 setup(),原有 LangChain / LangGraph 业务代码无需修改。from tencentcloud_agentobs_sdk_langchain import setup# 从环境变量读取 CLS 配置,须在运行任何 Agent 之前调用setup()# 以下为原有 LangChain / LangGraph 代码,无需修改from langchain_core.tools import toolfrom langchain_openai import ChatOpenAIfrom langgraph.prebuilt import create_react_agent@tooldef get_weather(city: str) -> str:"""查询城市天气。"""return {"北京": "晴 26℃"}.get(city, "晴 25℃")agent = create_react_agent(ChatOpenAI(model="gpt-4o-mini"), tools=[get_weather])result = agent.invoke({"messages": [("user", "北京天气怎么样?")]})print(result["messages"][-1].content)
如果需要在代码中显式指定参数,可以传入
CLSConfig,未填写的字段会回退读取环境变量:import osfrom tencentcloud_agentobs_sdk_langchain import setup, CLSConfigsetup(CLSConfig(endpoint=os.environ["CLS_ENDPOINT"],topic_id=os.environ["CLS_TOPIC_ID"],secret_id=os.environ["CLS_SECRET_ID"],secret_key=os.environ["CLS_SECRET_KEY"],service_name="my-langchain-app",content_mode="truncate",))
注意:
setup() 必须在首次运行 Agent 前调用。建议只在应用启动入口调用一次,避免重复注册导致重复 Trace。CLSConfig 支持的参数如下,优先级为:CLSConfig 显式传入的值 > 环境变量 > 默认值。参数 | 环境变量 | 默认值 | 说明 |
endpoint | CLS_ENDPOINT | 无 | CLS 地域接入点域名,必填。 |
topic_id | CLS_TOPIC_ID | 无 | Trace 日志主题 ID,必填。 |
secret_id | CLS_SECRET_ID | 无 | 访问凭证 SecretId,必填。 |
secret_key | CLS_SECRET_KEY | 无 | 访问凭证 SecretKey,必填。 |
service_name | CLS_SERVICE_NAME 或 OTEL_SERVICE_NAME | langchain-app | 服务或应用名称。 |
content_mode | OTEL_INSTRUMENTATION_GENAI_CAPTURE_MESSAGE_CONTENT | full | |
batch_size | CLS_BATCH_SIZE | 32 | 每批上报的 Span 数量,取值范围为1 - 1000。 |
debug | CLS_DEBUG | false | 是否输出详细的 SDK 日志。 |
local_dump | CLS_LOCAL_DUMP | false | 是否同时将每批上报数据写入本地 JSONL 文件,便于排查问题。 |
local_dump_file | CLS_LOCAL_DUMP_FILE | cls_spans.jsonl | 本地 JSONL 文件路径。 |
user_id | CLS_USER_ID | 无 | 终端用户 ID,写入 gen_ai.user.id 字段。 |
说明:
SDK 运行日志默认写入
cls_sdk.log 并自动轮转,可通过环境变量 CLS_SDK_LOG_FILE 和 CLS_SDK_LOG_LEVEL 修改日志文件路径和日志级别。步骤5:运行 Agent 并验证结果
1. 按原方式启动应用,发起一次包含模型调用的请求,建议同时触发工具调用,并等待一个刷新周期。
2. 登录 日志服务控制台,进入 Agent 可观测,打开步骤1中创建的应用。
3. 打开调用链页面,选择包含测试请求的时间范围,打开最新的 Trace。
4. 确认 Trace 中包含 Entry、Agent、Step、Chain、Chat、Tool 等 Span,并点开具体 Span,检查耗时、状态、输入输出、Token 用量和请求参数。
以上述示例代码为例,一次
invoke() 会产生如下调用树:entry enter_application 本轮请求根节点└ agent invoke_agent Agent 执行区间├ step react round_1 第 1 轮推理│ ├ chain call_model LangGraph 节点│ ├ chain RunnableSequence Prompt + LLM 管道│ │ ├ chain Prompt│ │ └ chat gpt-4o-mini 模型调用│ ├ chain should_continue 路由判断│ └ tool get_weather 工具调用(并行调用时每个工具一个 Span)└ step react round_2 第 2 轮推理└ chat gpt-4o-mini 模型调用
采集数据说明
Span 层级与采集属性
SDK 按 LangChain 真实的回调嵌套关系还原调用树,层级为
entry → agent → step → chain → chat / tool。每次进入 LangGraph 的 Agent 节点会开启一个新的 ReAct 推理轮次(Step)。各类 Span 采集的主要属性如下:Span 类型 | 说明 | 采集属性 |
entry | 本轮请求的根节点 | 整次请求的耗时和状态。 |
agent | Agent 执行区间 | Agent 名称、会话 ID(session_id)、轮次 ID(turn_id),汇总 Token 用量和调用次数。 |
step | ReAct 推理轮次 | 推理轮次编号(react.round)、轮次结束原因(react.finish_reason)。 |
chain | LangChain 内部节点 | 节点名称(chain.name)、节点类型(chain.type),例如 RunnableSequence、Prompt、should_continue。 |
chat | 模型调用 | 请求模型、响应模型、结束原因、输入 Token、输出 Token,以及输入/输出消息(受内容采集策略控制)。 |
tool | 工具调用 | 工具名称、调用参数、返回结果、错误类型和错误信息。错误类型自动分类为 timeout、rate_limit、auth_error、validation_error 等。 |
内容采集策略
通过
content_mode 参数或环境变量 OTEL_INSTRUMENTATION_GENAI_CAPTURE_MESSAGE_CONTENT 控制是否采集对话内容和工具参数:取值 | 行为 | 适用场景 |
full | 完整记录对话内容,不截断。默认值。 | 开发调试 |
truncate | 记录对话内容,超长字段截断并添加截断标记。 | 生产环境 |
off | 不记录对话内容,仅上报调用树、Token、耗时和状态等指标。 | 强合规场景 |
常见问题
CLS 中没有 Trace 数据
请依次检查以下内容:
setup() 是否在首次运行 Agent 之前调用。CLS_ENDPOINT 是否不含协议前缀或路径,且与日志主题位于同一地域。填写的是否为 Trace 日志主题 ID,而不是主题名称或应用 ID。
SecretId / SecretKey 是否有效,且具备写入目标日志主题的权限。
当前网络能否访问该接入点。使用内网域名时,需确保应用运行在同地域的腾讯云内网环境中。
是否已等待至少一个刷新周期。
如仍无法定位,可设置
CLS_DEBUG=true 查看 SDK 日志,或设置 CLS_LOCAL_DUMP=true 开启本地落盘:如果本地 JSONL 文件中有 Span 数据,说明采集正常,问题出在上报环节;如果本地也没有数据,说明问题出在采集环节。Trace 中缺少输入输出或工具参数
检查
content_mode 或环境变量 OTEL_INSTRUMENTATION_GENAI_CAPTURE_MESSAGE_CONTENT 是否设置为 off。关闭内容采集后,调用树、Token、耗时和状态仍会正常上报。Trace 中缺少 Token 或部分模型属性
Token 用量、结束原因等数据来自模型服务的返回结果。如果模型服务或对应的 LangChain 集成包未返回 Usage、结束原因等字段,SDK 无法采集。
同一个请求出现重复 Trace
可能重复调用了
setup(),或同时启用了本 SDK 与 LangSmith、Langfuse 等其他 Tracing 组件并上报到同一日志主题。建议同一进程只初始化一次,并且每个应用只保留一条上报路径。并行工具调用或子 Agent 的父子关系是否准确
准确。SDK 根据 LangChain 回调中的
parent_run_id 推导父子关系,不依赖全局状态,并行工具调用、嵌套子 Agent 和 RunnableParallel 都能正确归属到对应的父节点。SDK 异常是否会影响 Agent 运行
不会。配置缺失或初始化异常时,SDK 会自动降级并输出诊断信息;遇到网络或服务端异常时,5xx 错误会自动重试,4xx 错误会丢弃对应数据,并通过缓冲区背压保护避免占用过多内存。