跳到主要内容

Agent Observability

在 Traces 里读一次 agent 运行

打开 Agent Observability 里的一条 agent run trace:你被允许看到哪些 run、列表与它的过滤器、逐轮时间线、事件 inspector,以及 trace assistant。

/traces 是 Agent Observability blocklet(ARC 仓库里的 blocklets/observability-explorer)回答 dashboard 回答不了的那个问题的地方:这一次 run 内部到底发生了什么?

下面每一条都在活环境 https://observability-explorer.afsd.dev 上核验过:build 35de3a0b,以已注册测试用户的登录态,重走时间 2026-08-20。所有截图都出自那一次会话。

姊妹区是 dashboard——最近跑了什么——和 AI 消耗——消耗了多少容量。trace 与 usage 由不同的写入路径产生,两者不对账。

你能看到哪些 run

一条 trace 里有任务原文、system prompt 和每一次工具结果,所以先读闸,再读列表。只有两条轴放行:

  • 你自己的 run,恒可见——那段数据就是你自己 DID Space 的一部分。
  • 你管理的应用的全部 run——同实例 admin/owner,逐应用判定。

在一个应用上是 owner,在另一个应用上什么也不给。这条从 2026-08-18 才成立:在 ARC #4170 / PR #4269 之前,这里把任意 owner/admin 角色 读成部署级权限,一个应用的 owner 能枚举到所有应用的 run——而同一个调用者在 usage 管理面上 会被逐实例拒绝。如果你跑在更早的 build 上,本节写的不是你实际拥有的边界。

你无权查看的应用与不存在的应用无法区分:列表是空的,不是报错。想从单个账号同时看到这两条轴 在起作用,见 dashboard 页的对照表。

列表

traces 列表:搜索框、blocklet 过滤器、时间过滤器,每条 run 一行,含用户输入、blocklet、状态、模型、输入/输出/缓存 token、时长与开始时间

最新在前,一条 run 一行,三种收窄方式:

控件作用
搜索对任务与状态做全文匹配
BLOCKLETAll blocklets,或指定某个应用
TIMEAll · Today · 7d · 30d

列是 USER INPUT · BLOCKLET · STATUS · MODEL · IN · OUT · CACHE · TIME · STARTED。扫列表之前有两件事要先知道:

  • USER INPUT 是原始 prompt,包含会话历史。 来自聊天界面的行以 <conversation_history> … 开头,所以单元格第一行往往是上一轮对话,而不是发起这次 run 的那句话。完整文本在 trace 里。
  • STATUS 只有 ok 和 interrupted。 没走到模型的 run 显示 interrupted,输入输出都是 0,时长为空——正是 dashboard 记作「failed」的那批。

一条 run

点任意一行,进入它自己的可寻址 URL:

text
/traces/<blocklet>/<date>/<runId>
   例如 /traces/todo/2026-08-16/195318-dd5abfb7

run 详情:头部指标、含 INPUT / USER / ROUND 1 / ROUND 2 / FINAL OUTPUT 的时间线、下方的 trace assistant,以及显示该 run system prompt 的 inspector

头部。 3 rounds · 3 tool calls · 16851→164 tokens · 8153 cached · 50.8s · gemini-2-5-pro,外加 Copy link——run 的 URL 可分享、可硬加载。

时间线(左)。一步一行,每行带 IN / OUT / CACHE / TIME:

行是什么
⚙️ INPUT发起这次 run 的调用:action 路径、工具数、有没有带 system prompt
👤 USERprompt 正文
🔄 ROUND n一轮模型调用,标着这一轮发起的工具调用
🤖 FINAL OUTPUT最终回答,以及产出它花掉的 token

注意这里的算术:头部写 3 rounds 的 run,时间线上是 ROUND 1、ROUND 2 然后 FINAL OUTPUT——最终回答就是第三轮,不是第四步。

Inspector(右)。选中哪一行就展开哪一行:type、time,开场事件还会给出完整的 SYSTEM PROMPT、TOOLS 授权和 INPUT PARAMETERS(含这次 run 的预算:max_rounds、actions_per_round、total_tokens)。

展开一轮

带折叠箭头的轮次可以展开成它内部的步骤:

ROUND 2 展开后露出 TOOL USE 与它下面两条 TOOL RESULT

🛠 TOOL USE 是模型要求做什么;每条 🔧 TOOL RESULT 是一次调用的结果和耗时——截图里是 afs_write … · ok。「agent 做错了事」是在这一层才看得见的。

一条根本没开始的 run

interrupted 的 run:0 rounds、0 tool calls、0→0 tokens,时间线上只有 INPUT 和 USER

interrupted 的 run 保留 INPUT 和 USER 两行,后面什么都没有。inspector 仍然会给出它被授予的工具和拿到的参数,通常足以判断是配置错了,还是根本没连上模型。

Trace assistant

时间线下面挂着一个 assistant,以这条 trace 作为上下文加载。它只在 run 里出现——列表、dashboard、usage 页面都不显示它。

trace assistant 正在回答「token 大头在哪」,答案下方带 token footer

四个预设问题覆盖常见场景(这条 run 哪里有问题? · token 大头在哪?为什么? · 哪几轮可以省? · 总体分析一下),下面的输入框问什么都行。它的回答自带成本 footer——截图里是 7877 tokens | 7393 in | 484 out | gemini-2-5-pro。

问 assistant 本身就是一次 AI 调用,算在你头上,事后会出现在 usage 面的 observability-explorer 这个应用名下。本次走查实测:问了两次,那一行从 5 次调用变成 8 次。

会碰到的失败态

现象它实际上是什么
Sign in to view this content.不是错误——traces 没有匿名投影
inspector 停在 Select a row to inspect点时间线里任意一行就会填上——见下面那条说明
某行第一句是别人的问题USER INPUT 含会话历史;进 run 看真正的 prompt
interrupted 且 token 为 0这条 run 没走到模型
轮次数比 ROUND n 的行数多一最终回答就是最后一轮

空 inspector:现在复现不出来了

在 build 400ce96 上,走完多跳路径——钻进一条 run,去 /dashboard、/usage,再回 /traces 钻一次——inspector 会一直停在 Select a row to inspect(当时 3/3 必现)。在 build 35de3a0b 上复现不出来:同一条跳转序列(含中间那次后退)跑了三遍,inspector 每次都填上了 这条 run 的开场事件。

blocklet 自己的 man 页仍把它记成 OPEN bug,而且引的 issue 号指向一份已关闭的 QA 报告——这条 已回流给 ARC,免得注释活得比缺陷还久。真碰到空 inspector 时,点时间线里任意一行就会填上;出问题 的从来不是 run 本身。