跨 harness 对比:可观测性(日志 / trace 格式)
总览:五条设计谱系
把 61 个 harness 的”你怎么知道 agent 刚才干了什么”这件事拆开看,实质只有五种底层选择,而且大部分 harness 是几种叠着用:
-
OpenTelemetry / GenAI semconv 派 —— 把可观测性外包给业界标准。近两年新一代框架的默认答案:不自造 trace schema,直接用 OTel 的
gen_ai.*语义约定,span 埋 LLM 调用 / 工具 / agent 三级,导出到用户自选后端(Jaeger、Datadog、Langfuse、Cloud Trace…)。代表是 Semantic Kernel(有一份 ADR 0044 明文拍板”用 OTel semconv、不自造”)、Pydantic AI、Google ADK、AgentScope、AutoGen、Gemini CLI、Qwen Code。 -
自研事件溯源 / JSONL transcript 派 —— 会话本身就是可回放的轨迹。每步/每事件一行 JSON 落盘,这份文件既是记忆、又是审计日志、又是回放源。代表是 Claude Code 的
~/.claude/projects/**.jsonl、Copilot Agent 的events.jsonl、Kimi Code 的wire.jsonl+ records、SWE-agent 的.traj。这一派往往还配一个专门的可视化调试器。 -
托管 SaaS trace 派 —— 埋点直连某个商业/自家后端。Langfuse 是开源侧的事实标准(Goose、CAMEL、QwenPaw、browser-use、OpenHands 走 Laminar,DeerFlow 二选一);LangSmith 是 LangChain 生态的绑定(LangGraph、deepagents、GPT-Researcher);也有自建 SaaS 的(CrewAI AMP、OpenAI Agents SDK 的 OpenAI 后端、Agno 落自家 DB)。
-
Hook / 事件总线即 trace 派 —— 不给你一份 trace 文件,而给你一个稳定的结构化事件接口,让你自己接。Qoder(22 事件)、Factory AI、Junie 的 hook stdin JSON,Hermes 的带版本号 observer 契约,Roo Code/CrewAI 的类型化事件总线都属此类。
-
纯文本日志派(无 trace) —— 可观测性 = 人读日志文件。OpenManus(loguru)、Plandex(Go
log.Printf)、GPT-Pilot、CodeGeeX 的滚动文件日志。emoji 前缀几乎是这一派的通用审美(SWE-agent 的具名 emoji logger、browser-use、OpenManus、GPT-Researcher 都用)。
两条正交的线贯穿所有派系:产品分析遥测(PostHog/Datadog/自家 BQ,统计”用了多少”而非”怎么执行的”)几乎人人有一份,且刻意与调试 trace 分开;PII/脱敏纪律在成熟 harness 里是一等设计(Claude Code 用类型系统强制、多家 OTel 派提供 trace_include_content opt-out)。
对比表
| Harness | 结构化 trace 机制 | 落盘/传输格式 | 产品遥测(独立线) | 脱敏/隐私设计 |
|---|---|---|---|---|
| Claude Code | headless profiler + queryChain 关联 | JSONL transcript ~/.claude/projects/** | 一方 Datadog + BigQuery,tengu_* 事件 | 类型系统强制 PII 核实(never 标记) |
| OpenAI Agents SDK | 内建 Traces/Spans(默认开) | 批量导出到 OpenAI 后端;~30 家第三方 | — | trace_include_sensitive_data、ZDR 不产 trace |
| Pydantic AI | OTel GenAI semconv,InstrumentedModel | Logfire(自家托管)+ 任意 OTLP | — | trace_include_content;AGENTS.md 禁夹私货防 spec drift |
| Google ADK | OTel GenAI semconv,stable/experimental 分层 | sqlite / Cloud Trace / Agent Engine | — | env 开关禁 PII span 属性 |
| AgentScope | TracingMiddleware reply/LLM/tool 三级 span,OTel GenAI | 任意 OTLP;no-op 时零开销 | — | — |
| Semantic Kernel | OTel GenAI(ADR 0044 拍板),装饰器 span | 任意 OTLP | — | ADR 要求 prompt/completion 遥测必须可 opt-out |
| AutoGen | TraceHelper + OTel GenAI;JSON 事件类 | 任意 OTLP;AUTOGEN_DISABLE_RUNTIME_TRACING 关 | — | — |
| Letta | OTel(@trace_method)+ LLM trace 写 ClickHouse | OTLP gRPC + ClickHouse row + StepMetrics | — | — |
| Gemini CLI | OTel(日志+指标+trace),gen_ai.* | GCP 直导 / OTLP / 本地文件 | Clearcut(Google 内部管道) | prompt/response trace 内容 opt-in |
| Qwen Code | OTel(coreToolScheduler 每工具 span) | 任意 OTLP;chatRecordingService JSONL | qwen-logger 子目录 | — |
| Goose | tracing::info_span! 语义 span + Langfuse Layer | OTLP(otel feature)+ Langfuse POST | PostHog(硬编码 key) | 独立 rate limiter |
| CAMEL | Langfuse @observe,agent_id 作 session 分组 | Langfuse + AgentOps 自动埋点 | — | _sanitize_messages_for_logging() |
| OpenHands | Laminar @observe 包主循环各阶段 | OTLP/Laminar;log_completions 落原始 JSON | — | — |
| browser-use | Laminar span(每 action span_type='TOOL')+ bubus 事件总线 | 云 sync POST + agent_history.gif | PostHog(eu,匿名 device_id) | — |
| OpenManus | 无(纯 loguru emoji 日志) | logs/{name_ts}.log | 沙箱内显式关 ANONYMIZED_TELEMETRY | — |
| smolagents | 委托 OTel(openinference 插桩) | Phoenix/MLflow/Langfuse | — | — |
| LangGraph | stream_mode="debug" 事件 + LangSmith | TaskPayload/CheckpointPayload;LangSmith SaaS | — | LangChainTracer anonymizer 脱敏 |
| deepagents | LangSmith(ls_agent_type=root/subagent)+ hooks.json | LangSmith;/conversation_history/{thread}.md | — | — |
| GPT-Researcher | _log_event 三类事件 + LangSmith(多 agent) | research_<ts>.json 结构化事件流 | — | — |
| DeerFlow | RunJournal(LangChain callback→RunEvent) | 可插拔 RunEventStore + Langfuse/LangSmith | — | 中间件级 guardrail 审计 |
| CrewAI | 中心事件总线 + TraceEvent(带 DAG 关联字段) | 自家 SaaS(app.crewai.com,需 crewai login) | — | — |
| Agno | OTel span → DatabaseSpanExporter 落自家 DB | 自家 DB(配 AgentOS UI)+ 可外接 collector | — | — |
| Roo Code | RooCodeEventName 事件总线(~25 型,Zod schema) | ui_messages.json(ClineMessage[]) | 本快照未找到 | — |
| Cline | OTel 仅 metrics+logs(明文不支持分布式 trace) | OTLP gRPC/HTTP,远程配置面板 | 内置 telemetry 路径 | 数据匿名化、不含代码/路径 |
| opencode | Effect withSpan + OTel(OTEL_* 触发) | SQLite event-sourced session 存储 | — | — |
| Kilo Code | Effect withSpan(继承 opencode)+ v2 事件系统 | OTLP;/global/event SSE | kilo-telemetry(PostHog) | — |
| MiMo Code | Effect withSpan + metrics.* bus 事件 | 内部 Bus(后端未知,疑小米自有) | metrics/subscriber | data: URL 摘要 |
| Codex CLI | OTel + 本地 rollout-trace(observe-first 归约器) | trace.jsonl+payloads→语义图 state.json | TurnProfile/TokenUsage fact | rollout-trace 明文”not telemetry”,从不上传 |
| Open Interpreter | Codex 底座:OTel + rollout-trace + SQLite state_db | 同 Codex;prompt_debug 可 dump 最终 prompt | analytics crate | — |
| SWE-agent | 具名 emoji logger + .traj 每步写 | JSON .traj(trajectory/history/info),配 inspector web UI | InstanceStats/GlobalStats 成本 | — |
| ByteDance Trae | TrajectoryRecorder 增量写 + Lakeview(第二模型摘要打标) | JSON trajectory(llm_interactions+agent_steps) | — | API key 不记录 |
| Kimi Code | records(带版本迁移)+ wire.jsonl + apps/vis 调试器 | JSONL wire(主/子 agent 各一份) | TelemetryEvent(磁盘缓冲+重试) | — |
| Copilot Agent | events.jsonl + 原生 OTel + W3C Trace Context 双向传播 | JSONL 会话事件 / OTLP;GenAI+MCP semconv | assistant.usage 事件区分 API 协议 | captureContent 开关 |
| Cursor | hook 统一信封 + stream-json(CLI headless) | stream-json(system/assistant/tool_call/result) | Cursor Cloud MCP(诊断) | — |
| Sourcegraph Amp | --stream-json(Claude Code 兼容)+ 插件 span | stream-json union;parent_tool_use_id 嵌套 subagent | 审计日志 ≥30 天 | 诊断 bundle 7 天删 |
| Qoder | 22 事件 hook(含 InstructionsLoaded/ConfigChange)+ stream-json | hook stdin/stdout JSON;Cloud Agents SSE | — | maskSensitiveData() 递归脱敏 |
| Junie | hook stdin JSON(显式兼容 Claude Code 线协议) | 本地 junie.log;/usage 成本分解 | — | — |
| Factory AI | hook .jsonl transcript(公共字段+事件专属字段) | JSONL ~/.factory/**;Analytics API 5 端点 | Analytics API(token/tools/hooks 调用数) | /verify anti-fabrication rules |
| Kiro | ACP 会话 .jsonl 事件日志 | JSONL ~/.kiro/sessions/**;企业 CSV→S3 | 使用/性能遥测(可 opt-out) | 每 hook 单独遥测 |
| Hermes | 带版本号 observer-hook 契约(hermes.observer.v1) | 后端中立(Langfuse/OTel/NeMo Relay) | — | payload 脱敏;关联 ID 表 |
| QwenPaw | SQLite audit.db(治理决策)+ 可选 Langfuse + 插件 middleware | SQLite audit_events + trace.log | — | — |
| Agent Zero | 结构化 LogItem(type/heading/kvps)→ WebSocket | 随 chat JSON 存盘,可重放 | — | _mask_recursive 递归遮蔽 secret |
| Warp | AITelemetryEvent(点分名+contains_ugc)+ 四五重关联 ID | Oz web(Runs/Sub-agents 页)+ API + 会话分享链接 | 类型化遥测事件 | contains_ugc 标记决定脱敏 |
| Zed | dev: Open ACP Logs(JSON-RPC 检查器)+ telemetry::event! | Snowflake 后端(与对话内容分离) | 产品分析事件 | — |
| Amazon Q | Rust tracing + 类型化遥测事件构建器 | 文件日志(10MB 轮转);amzn-toolkit-telemetry | Cognito 匿名 identity pool | 逐工具遥测(AWS 服务名) |
| Devin | 类型化 session 事件 API(devin_session_events) | 审计日志 API + Metrics API(ACU 计价) | DAU/WAU/MAU 等 | guardrail 违规带 reasoning+confidence |
| Replit | Telescope(Clio 式失败聚类)+ Backer ETL 管线 | BigQuery(执行日志/LSP/OT 动作)→ 训练+分析 | A/B 实验基础设施 | — |
| v0 | 消息 content-part 流即 trace + Webhooks | MessageBinaryFormat(自研元组+jsondiffpatch) | 继承 Vercel 平台可观测性 | — |
| AutoGPT | Sentry scope(逐节点 tag)+ Copilot 层三套 tracing | GCP 结构化 JSON 日志;OTel+Langfuse+LangSmith | TELEMETRY_OPT_IN(Sentry) | — |
| MetaGPT | ResourceReporter(BlockType 打标 JSON)→ 自家 UI | POST 到 callback_url(HTTP/Unix-socket) | — | — |
| GPT-Pilot | Python logging + LLMRequestLog/ExecLog 持久化 | pythagora.log;phone-home 聚合计数 | opt-in telemetry(trace_code_event) | 崩溃只截最内 3 帧 |
| Continue | OTel 仅 metrics(无 trace span 树) | winston cn.log;OTLP(需显式配 endpoint) | CONTINUE_METRICS_ENABLED | — |
| UI-TARS | Agent Event Stream(记忆+UI)+ Agio 运维监控协议 | Agio 事件(ttft/tps/loop);message dumper | — | — |
| Aider | 扁平事件遥测(无 span 模型) | PostHog;--analytics-log JSONL;chat history md | 10% 采样弹窗确认 | — |
| Plandex | 无 OTel;log.Printf 密集打点 | stdout;stream-message 协议驱动 TUI;git log 重建 | 无(grep=0) | — |
| CodeGeeX | 三路滚动文件日志(inference logger 独立) | logs/{info,error,inference}/;OTel 脚手架休眠 | — | — |
| Claude Flow | Trajectory trace({steps:[{action,result}]})→ memory ns | stderr 结构化日志;OTel 仅依赖 pin、无埋点 | hooks_metrics 聚合 | — |
| Comate | 无公开 trace schema;内部 Prometheus/ELK | 企业采纳率→MongoDB(仅聚合数字) | — | 日志不含代码 |
| Anthropic 多 agent 编排 | 仅定性描述(生产级 tracing 诊断 agent 决策) | 未披露 schema;开发期用 Anthropic Console | — | 不监控单次对话内容 |
(AutoClaw 无任何日志/trace/遥测披露,仅有 Cluster Mode 进度面板与”21 份中间笔记”暗示,故不单列。)
分组讨论
OTel GenAI semconv:新一代的”不自造”共识
这是最清晰的一条趋同线,且有明确的”最早拍板”证据。Semantic Kernel 有一份编号 ADR(0044-OTel-semantic-convention.md)白纸黑字决定”采用 OTel GenAI 语义约定、不造 SK 专属格式”——把这件事上升成架构决策记录,是这一派里最正式的表态。随后 Pydantic AI 把纪律推到极致:AGENTS.md 里有规则要求 _otel_*.py 只能实现 spec 定义的东西、不许夹私货,专门防”spec drift”,还带 DEFAULT_INSTRUMENTATION_VERSION = 5 显式版本号。Google ADK 更进一步把属性分成 stable / experimental 两套 semconv 并带 schema version,是工程完成度最高的一家。
值得注意的是 AgentScope —— 它是 QwenPaw 的底座,直接 from opentelemetry.semconv._incubating.attributes import gen_ai_attributes,reply/LLM/tool 三级各开 span,且未调 setup_tracing 时用 no-op provider 做到零开销。这个”库不强制、装了才有”的设计被 smolagents 用得更彻底:核心库干脆不带 trace,可观测性完全委托外部 openinference-instrumentation-smolagents 插桩包。AutoGen 和 Gemini CLI/Qwen Code 也在这一派,后两者把每个 gen_ai.* 属性名都在文档里枚举并与代码交叉核对,文档完成度罕见地高。
三家 CLI 大厂的实现里,Copilot Agent 是唯一把 W3C Trace Context 在 SDK 与闭源 CLI 之间双向传播做出来的——宿主 app 的 span 能和 CLI 内部 span 串成一条真正的分布式 trace,且显式对齐 OTel 的 GenAI + MCP semconv,这是把 agent 可观测性做到生产 APM 级别的少数案例。反面教材是 Cline 和 Continue:都接了 OTel,但只导出 metrics/logs、明确不支持分布式 trace(Cline 文档里直接一个 ❌)——提醒”接了 OTel”不等于”有 trace”。Claude Flow 更极端,OTel 只以 package.json 依赖 override 存在、源码里 grep 不到任何 span 埋点,属于”声明有、源码无据”。
自研事件溯源 / JSONL transcript:会话即轨迹
学术源头是 SWE-agent 的 .traj 格式——每步写一次 JSON,含 action/observation/response/thought/state,配一个本地 HTTP inspector web UI 供人浏览,这套”轨迹文件 + 检视器”范式后来被反复复刻。Trae 的 TrajectoryRecorder 结构几乎是同一思路的工程加强版(增量写、崩溃可保留、llm_interactions + agent_steps 双数组),并加了个真正独特的东西:Lakeview——用第二个 LLM 旁路给每个 step 抽人类可读摘要并从 8 个标签里打标(WRITE_TEST/VERIFY_FIX/…),代价是开启时每步约 2× LLM 调用。“用一个模型来观测另一个模型的 trace”这个点子在 61 家里独此一份。
生产 CLI 侧,Claude Code 的 JSONL transcript(~/.claude/projects/**)是被抄得最多的格式:消息类型分 assistant/user/system(含 compact_boundary/api_error 子类)/progress/tombstone/tool_use_summary,其中 tombstone(显式移除标记,如模型降级后失效的孤立 thinking block)是个别处少见的巧思。Copilot 的 events.jsonl(assistant.turn_start/turn_end 成对、可 grep -c 数 LLM 调用)、Kiro 的 ACP 会话 .jsonl、Factory AI 的 ~/.factory/**.jsonl 都是同一血统。Kimi Code 做得最系统:wire.jsonl(主/子 agent 各一份)+ 带版本迁移的 records 事件溯源(注释直言”正确性依赖顺序时用 records 别用 state.json”)+ 专门的 apps/vis 可视化调试器,是”transcript 即轨迹”这一派工程完成度的天花板。
stream-json:Claude Code 事实线协议的外溢
一个很具体的”谁抄谁”证据链:Claude Code 的 headless stream-json 输出格式(system/assistant/tool_call/result 事件)成了 CLI agent 的事实标准。Amp 的 --stream-json 明确标注与 Claude Code 兼容,还把 parent_tool_use_id(主 agent 为 null、subagent 设为派生它的 Task 调用 ID)作为 subagent trace 嵌套机制逐字捕获。Cursor 的 CLI headless、Qoder 的 CI 输出也都用同名 schema。同源的还有 hook JSON 线协议:Junie 直接写明其 hook stdin JSON “设计为与 Claude Code 的 hook 线协议兼容,使脚本可跨 harness 复用”——这是明牌承认在对齐 Anthropic 的接口。Factory AI、Qoder、Augment 的 hook 公共字段(session_id/transcript_path/hook_event_name/tool_name/tool_input)也高度一致。
Hook / 事件总线即 trace:把观测面外包给用户脚本
不落 trace 文件、而是暴露稳定事件让用户自接。设计最考究的是 Hermes:一份带版本号的 observer-hook 契约(telemetry_schema_version = "hermes.observer.v1"),钩子 fail-open(回调异常不能搞崩 agent),关联 ID 表(session/task/turn/api_request/tool_call + 父子 subagent ID)全部文档化且稳定,还明确区分”纯观察钩子”与少数”可影响行为的逃生舱”(pre_tool_call 可返回 block)。Qoder 的 22 事件里 InstructionsLoaded(记忆文件加载)和 ConfigChange 是别家没有的审计导向事件。事件总线路线上 CrewAI 把日志/控制台/tracing 三者统一到一个中心 event bus(20+ 事件类型域),并给 TraceEvent 加了 DAG 关联字段(parent/previous/triggered_by),是把事件总线直接当 trace DAG 用的代表;Roo Code 的 RooCodeEventName(~25 型、每个配 Zod schema)则专门服务于 IPC 层让无头 CLI 订阅任务事件。
托管 SaaS trace:Langfuse 与 LangSmith 的两个生态圈
开源 harness 里 Langfuse 是压倒性选择。Goose 把它做成一等公民——一个专门的 tracing_subscriber Layer 批量 POST 到 Langfuse,而非外挂插件,这是嵌入最深的一家。CAMEL 用 @observe() 装饰模型调用、并把 agent_id 塞进 Langfuse session_id 做 trace 分组。browser-use 和 OpenHands 走 Langfuse 的孪生 Laminar(@observe 装饰器,未装则 no-op)。LangSmith 则是 LangChain 系的默认绑定:LangGraph(原生只有 stream_mode="debug" 事件,一等观测靠 LangSmith)、deepagents(用 ls_agent_type=root/subagent 在 trace 里区分主从)、GPT-Researcher 都是。DeerFlow 两边都支持,且它的 RunJournal(LangChain callback → RunEvent → 可插拔 store)在源码里有大段 INVARIANT 注释强调 callback 只能在 graph 根挂一次、否则 span 重复且 session_id 丢失——把”分布式 trace 里最容易踩的坑”写进了代码契约。自建 SaaS 的 CrewAI(需 crewai login 的 OAuth device-code)和 Agno(OTel span 经自定义 exporter 落自家 DB 配 AgentOS UI)走了”标准协议 + 自家后端”的折中。
新增 19 家里的独特设计
- Letta 把 LLM trace 单独写 ClickHouse(
LLMTraceWriter.to_clickhouse_row,配合 OTel span + StepMetrics),是唯一为逐次 LLM 请求/响应上列式数据库的——和它那套分层自编辑记忆一脉相承,都是”把 agent 的一切都当可查询数据”的世界观。 - browser-use / UI-TARS 的 GUI/computer-use 动作空间让 trace 多了一维:browser-use 每个 action 开
span_type='TOOL'的 Laminar span,还把整条 history 渲成agent_history.gif作可视产物;UI-TARS 设计上明确分两层——内部 Agent Event Stream(既是记忆又驱动 UI)与面向运维的标准化 Agio 协议(agent_ttft/agent_tps/agent_loop_start等),把”给人看的 UI 事件”和”给 SRE 看的运营指标”彻底解耦,是这一维里架构分层最干净的表述。 - AgentScope 作为 QwenPaw 的底座,其 OTel GenAI 中间件 + 全量吐出的 AgentEvent 事件流,正是 QwenPaw 上层那套 SQLite
audit.db治理审计能挂稳的地基。 - Pydantic AI 的类型化工具延伸到可观测性:
Instrumentationcapability +InstrumentedModel让埋点本身是类型安全的一等能力,配 Logfire(自家托管,有 MCP server 可直接查 agent run/tool call)。 - OpenAI Agents SDK 是少数把 trace 默认开的框架,且模型抽象最完整(Trace=workflow / Span 分 agent/generation/function/guardrail/handoff 等 typed span_data),
add_trace_processor()可扩展、文档列了约 30 家第三方后端——生态开放度第一。 - Agent Zero 的结构化
LogItem(type/heading/content/kvps,支持增量stream())→ WebSocket 推 WebUI,每个工具自带 log 对象渲成可展开的 trace 节点,_mask_recursive递归脱敏——一套完全面向自家 WebUI 实时展示、不碰 OTel 的自洽方案。 - GPT-Researcher 的
JSONResearchHandler双通道(标准 logging + 结构化 JSON 事件流research_<ts>.json)加逐步成本归集(step_costs),是研究型 agent 里把”成本可观测性”做进 trace 的代表。 - CAMEL 的 Workforce 层有独立
WorkforceLogger(同时实现 callback + metrics),仓库根还附一个camel_log_viewer.html本地可视化。 - Plandex 反其道而行:grep 遍
app/**.go对 otel/posthog/telemetry 命中为 0,可观测性就是密集log.Printf+ 每 plan 的 git log 可重建完整历史——极简到几乎是一种态度。 - Claude Flow 的 Trajectory trace(
{steps:[{action,result}], success, feedback}存进 memory namespace)把轨迹当记忆存,和它的 memory 设计缠在一起。 - Open Interpreter 直接吃 Codex 底座,继承了
rollout-trace那套”observe first, interpret later”的归约器架构。
两条正交线:产品遥测 与 脱敏纪律
几乎每家都有一条独立于调试 trace 的产品分析遥测,且刻意分开:PostHog(Aider、Goose、browser-use、Kilo Code 都硬编码公开 key)、Sentry(AutoGPT、Augment)、Datadog+自家 BQ(Claude Code)、Cognito 匿名池(Amazon Q)。这类遥测统计”用了多少/哪些功能/成本”,普遍强调它”不是 trace”。
脱敏/PII 纪律在成熟 harness 里已是一等设计,且手法各异:Claude Code 最硬核——用 TypeScript never 类型标记(AnalyticsMetadata_I_VERIFIED_THIS_IS_NOT_CODE_OR_FILEPATHS)强制每个埋点调用点显式 as 断言人工核实过不是代码/PII,_PROTO_* 字段进特权 BQ 列、到通用 sink 前被剥离;OTel 派普遍提供内容开关(Pydantic AI trace_include_content、OpenAI Agents SDK trace_include_sensitive_data + ZDR 组织不产 trace、Semantic Kernel ADR 强制可 opt-out);Warp 给每个遥测事件打 contains_ugc() 布尔决定是否需更严处理;Qoder 的 maskSensitiveData()、Agent Zero 的 _mask_recursive、CAMEL 的 _sanitize_messages_for_logging 都是递归遮蔽。Factory AI 走得最远——把 /verify 命令的 anti-fabrication rules(“investigator, not advocate”、要求产出证据而非结论)当成一等可观测性关切,Devin 的 guardrail 违规记录带模型生成的 reasoning + confidence_score 而非布尔——都把”可信的观测”而不只是”有观测”当目标。
最值得借鉴的设计
1. OTel GenAI semconv + 内容 opt-out(Semantic Kernel ADR / Pydantic AI 防 spec-drift / Google ADK stable-experimental 分层)。 理由:自造 trace schema 的 harness(MetaGPT 的 reporter 协议、v0 的 MessageBinaryFormat)都锁死在自家 UI/后端上,换后端就得重写;而对齐 gen_ai.* 约定的一家,Jaeger/Datadog/Langfuse/Braintrust 全部即插即用(OpenAI Agents SDK 列了 30 家第三方就是明证)。把它上升成 ADR、并用 AGENTS.md/版本号防止私货漂移,是让”标准”真的持续是标准的关键工程纪律。对做 agent 训练/评测数据管线尤其重要——标准 span 能直接喂进现成的 eval 工具。
2. transcript/records 即轨迹 + 专用可视化调试器(Kimi Code 的 wire.jsonl+records+apps/vis、SWE-agent 的 .traj+inspector)。 理由:这套”每步增量落一份可回放 JSONL、再配一个读它的 web UI”范式,一份数据同时满足了崩溃恢复、事后 debug、人工浏览、训练数据导出四个诉求,成本却极低(就是往文件里追加行)。Trae 的 Lakeview(第二模型给 trace 打人类可读摘要与标签)是这套范式上最有想象力的增量——当轨迹长到人读不动时,让模型先替你读一遍、分好类,对调试长程 agent 任务价值极高,值得单独借鉴。