跨 harness 对比:可观测性(日志 / trace 格式)

总览:五条设计谱系

把 61 个 harness 的”你怎么知道 agent 刚才干了什么”这件事拆开看,实质只有五种底层选择,而且大部分 harness 是几种叠着用:

  1. OpenTelemetry / GenAI semconv 派 —— 把可观测性外包给业界标准。近两年新一代框架的默认答案:不自造 trace schema,直接用 OTel 的 gen_ai.* 语义约定,span 埋 LLM 调用 / 工具 / agent 三级,导出到用户自选后端(Jaeger、Datadog、Langfuse、Cloud Trace…)。代表是 Semantic Kernel(有一份 ADR 0044 明文拍板”用 OTel semconv、不自造”)、Pydantic AIGoogle ADKAgentScopeAutoGenGemini CLIQwen Code

  2. 自研事件溯源 / JSONL transcript 派 —— 会话本身就是可回放的轨迹。每步/每事件一行 JSON 落盘,这份文件既是记忆、又是审计日志、又是回放源。代表是 Claude Code~/.claude/projects/**.jsonlCopilot Agentevents.jsonlKimi Codewire.jsonl + records、SWE-agent.traj。这一派往往还配一个专门的可视化调试器。

  3. 托管 SaaS trace 派 —— 埋点直连某个商业/自家后端。Langfuse 是开源侧的事实标准(GooseCAMELQwenPawbrowser-useOpenHands 走 Laminar,DeerFlow 二选一);LangSmith 是 LangChain 生态的绑定(LangGraphdeepagentsGPT-Researcher);也有自建 SaaS 的(CrewAI AMP、OpenAI Agents SDK 的 OpenAI 后端、Agno 落自家 DB)。

  4. Hook / 事件总线即 trace 派 —— 不给你一份 trace 文件,而给你一个稳定的结构化事件接口,让你自己接。Qoder(22 事件)、Factory AIJunie 的 hook stdin JSON,Hermes 的带版本号 observer 契约,Roo Code/CrewAI 的类型化事件总线都属此类。

  5. 纯文本日志派(无 trace) —— 可观测性 = 人读日志文件。OpenManus(loguru)、Plandex(Go log.Printf)、GPT-PilotCodeGeeX 的滚动文件日志。emoji 前缀几乎是这一派的通用审美(SWE-agent 的具名 emoji logger、browser-useOpenManusGPT-Researcher 都用)。

两条正交的线贯穿所有派系:产品分析遥测(PostHog/Datadog/自家 BQ,统计”用了多少”而非”怎么执行的”)几乎人人有一份,且刻意与调试 trace 分开;PII/脱敏纪律在成熟 harness 里是一等设计(Claude Code 用类型系统强制、多家 OTel 派提供 trace_include_content opt-out)。

对比表

Harness结构化 trace 机制落盘/传输格式产品遥测(独立线)脱敏/隐私设计
Claude Codeheadless 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 AIOTel GenAI semconv,InstrumentedModelLogfire(自家托管)+ 任意 OTLPtrace_include_content;AGENTS.md 禁夹私货防 spec drift
Google ADKOTel GenAI semconv,stable/experimental 分层sqlite / Cloud Trace / Agent Engineenv 开关禁 PII span 属性
AgentScopeTracingMiddleware reply/LLM/tool 三级 span,OTel GenAI任意 OTLP;no-op 时零开销
Semantic KernelOTel GenAI(ADR 0044 拍板),装饰器 span任意 OTLPADR 要求 prompt/completion 遥测必须可 opt-out
AutoGenTraceHelper + OTel GenAI;JSON 事件类任意 OTLP;AUTOGEN_DISABLE_RUNTIME_TRACING
LettaOTel(@trace_method)+ LLM trace 写 ClickHouseOTLP gRPC + ClickHouse row + StepMetrics
Gemini CLIOTel(日志+指标+trace),gen_ai.*GCP 直导 / OTLP / 本地文件Clearcut(Google 内部管道)prompt/response trace 内容 opt-in
Qwen CodeOTel(coreToolScheduler 每工具 span)任意 OTLP;chatRecordingService JSONLqwen-logger 子目录
Goosetracing::info_span! 语义 span + Langfuse LayerOTLP(otel feature)+ Langfuse POSTPostHog(硬编码 key)独立 rate limiter
CAMELLangfuse @observe,agent_id 作 session 分组Langfuse + AgentOps 自动埋点_sanitize_messages_for_logging()
OpenHandsLaminar @observe 包主循环各阶段OTLP/Laminar;log_completions 落原始 JSON
browser-useLaminar span(每 action span_type='TOOL')+ bubus 事件总线云 sync POST + agent_history.gifPostHog(eu,匿名 device_id)
OpenManus无(纯 loguru emoji 日志)logs/{name_ts}.log沙箱内显式关 ANONYMIZED_TELEMETRY
smolagents委托 OTel(openinference 插桩)Phoenix/MLflow/Langfuse
LangGraphstream_mode="debug" 事件 + LangSmithTaskPayload/CheckpointPayload;LangSmith SaaSLangChainTracer anonymizer 脱敏
deepagentsLangSmith(ls_agent_type=root/subagent)+ hooks.jsonLangSmith;/conversation_history/{thread}.md
GPT-Researcher_log_event 三类事件 + LangSmith(多 agent)research_<ts>.json 结构化事件流
DeerFlowRunJournal(LangChain callback→RunEvent)可插拔 RunEventStore + Langfuse/LangSmith中间件级 guardrail 审计
CrewAI中心事件总线 + TraceEvent(带 DAG 关联字段)自家 SaaS(app.crewai.com,需 crewai login
AgnoOTel span → DatabaseSpanExporter 落自家 DB自家 DB(配 AgentOS UI)+ 可外接 collector
Roo CodeRooCodeEventName 事件总线(~25 型,Zod schema)ui_messages.jsonClineMessage[]本快照未找到
ClineOTel 仅 metrics+logs(明文不支持分布式 trace)OTLP gRPC/HTTP,远程配置面板内置 telemetry 路径数据匿名化、不含代码/路径
opencodeEffect withSpan + OTel(OTEL_* 触发)SQLite event-sourced session 存储
Kilo CodeEffect withSpan(继承 opencode)+ v2 事件系统OTLP;/global/event SSEkilo-telemetry(PostHog)
MiMo CodeEffect withSpan + metrics.* bus 事件内部 Bus(后端未知,疑小米自有)metrics/subscriberdata: URL 摘要
Codex CLIOTel + 本地 rollout-trace(observe-first 归约器)trace.jsonl+payloads→语义图 state.jsonTurnProfile/TokenUsage factrollout-trace 明文”not telemetry”,从不上传
Open InterpreterCodex 底座:OTel + rollout-trace + SQLite state_db同 Codex;prompt_debug 可 dump 最终 promptanalytics crate
SWE-agent具名 emoji logger + .traj 每步写JSON .traj(trajectory/history/info),配 inspector web UIInstanceStats/GlobalStats 成本
ByteDance TraeTrajectoryRecorder 增量写 + Lakeview(第二模型摘要打标)JSON trajectory(llm_interactions+agent_steps)API key 不记录
Kimi Coderecords(带版本迁移)+ wire.jsonl + apps/vis 调试器JSONL wire(主/子 agent 各一份)TelemetryEvent(磁盘缓冲+重试)
Copilot Agentevents.jsonl + 原生 OTel + W3C Trace Context 双向传播JSONL 会话事件 / OTLP;GenAI+MCP semconvassistant.usage 事件区分 API 协议captureContent 开关
Cursorhook 统一信封 + stream-json(CLI headless)stream-json(system/assistant/tool_call/result)Cursor Cloud MCP(诊断)
Sourcegraph Amp--stream-json(Claude Code 兼容)+ 插件 spanstream-json union;parent_tool_use_id 嵌套 subagent审计日志 ≥30 天诊断 bundle 7 天删
Qoder22 事件 hook(含 InstructionsLoaded/ConfigChange)+ stream-jsonhook stdin/stdout JSON;Cloud Agents SSEmaskSensitiveData() 递归脱敏
Juniehook stdin JSON(显式兼容 Claude Code 线协议本地 junie.log/usage 成本分解
Factory AIhook .jsonl transcript(公共字段+事件专属字段)JSONL ~/.factory/**;Analytics API 5 端点Analytics API(token/tools/hooks 调用数)/verify anti-fabrication rules
KiroACP 会话 .jsonl 事件日志JSONL ~/.kiro/sessions/**;企业 CSV→S3使用/性能遥测(可 opt-out)每 hook 单独遥测
Hermes带版本号 observer-hook 契约(hermes.observer.v1后端中立(Langfuse/OTel/NeMo Relay)payload 脱敏;关联 ID 表
QwenPawSQLite audit.db(治理决策)+ 可选 Langfuse + 插件 middlewareSQLite audit_events + trace.log
Agent Zero结构化 LogItem(type/heading/kvps)→ WebSocket随 chat JSON 存盘,可重放_mask_recursive 递归遮蔽 secret
WarpAITelemetryEvent(点分名+contains_ugc)+ 四五重关联 IDOz web(Runs/Sub-agents 页)+ API + 会话分享链接类型化遥测事件contains_ugc 标记决定脱敏
Zeddev: Open ACP Logs(JSON-RPC 检查器)+ telemetry::event!Snowflake 后端(与对话内容分离)产品分析事件
Amazon QRust tracing + 类型化遥测事件构建器文件日志(10MB 轮转);amzn-toolkit-telemetryCognito 匿名 identity pool逐工具遥测(AWS 服务名)
Devin类型化 session 事件 API(devin_session_events审计日志 API + Metrics API(ACU 计价)DAU/WAU/MAU 等guardrail 违规带 reasoning+confidence
ReplitTelescope(Clio 式失败聚类)+ Backer ETL 管线BigQuery(执行日志/LSP/OT 动作)→ 训练+分析A/B 实验基础设施
v0消息 content-part 流即 trace + WebhooksMessageBinaryFormat(自研元组+jsondiffpatch)继承 Vercel 平台可观测性
AutoGPTSentry scope(逐节点 tag)+ Copilot 层三套 tracingGCP 结构化 JSON 日志;OTel+Langfuse+LangSmithTELEMETRY_OPT_IN(Sentry)
MetaGPTResourceReporter(BlockType 打标 JSON)→ 自家 UIPOST 到 callback_url(HTTP/Unix-socket)
GPT-PilotPython logging + LLMRequestLog/ExecLog 持久化pythagora.log;phone-home 聚合计数opt-in telemetry(trace_code_event)崩溃只截最内 3 帧
ContinueOTel 仅 metrics(无 trace span 树)winston cn.log;OTLP(需显式配 endpoint)CONTINUE_METRICS_ENABLED
UI-TARSAgent Event Stream(记忆+UI)+ Agio 运维监控协议Agio 事件(ttft/tps/loop);message dumper
Aider扁平事件遥测(无 span 模型)PostHog;--analytics-log JSONL;chat history md10% 采样弹窗确认
Plandex无 OTel;log.Printf 密集打点stdout;stream-message 协议驱动 TUI;git log 重建无(grep=0)
CodeGeeX三路滚动文件日志(inference logger 独立)logs/{info,error,inference}/;OTel 脚手架休眠
Claude FlowTrajectory trace({steps:[{action,result}]})→ memory nsstderr 结构化日志;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 插桩包。AutoGenGemini CLI/Qwen Code 也在这一派,后两者把每个 gen_ai.* 属性名都在文档里枚举并与代码交叉核对,文档完成度罕见地高。

三家 CLI 大厂的实现里,Copilot Agent 是唯一把 W3C Trace Context 在 SDK 与闭源 CLI 之间双向传播做出来的——宿主 app 的 span 能和 CLI 内部 span 串成一条真正的分布式 trace,且显式对齐 OTel 的 GenAI + MCP semconv,这是把 agent 可观测性做到生产 APM 级别的少数案例。反面教材是 ClineContinue:都接了 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 供人浏览,这套”轨迹文件 + 检视器”范式后来被反复复刻。TraeTrajectoryRecorder 结构几乎是同一思路的工程加强版(增量写、崩溃可保留、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)是个别处少见的巧思。Copilotevents.jsonlassistant.turn_start/turn_end 成对、可 grep -c 数 LLM 调用)、Kiro 的 ACP 会话 .jsonlFactory 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 AIQoderAugment 的 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 CodeRooCodeEventName(~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-useOpenHands 走 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 单独写 ClickHouseLLMTraceWriter.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 的类型化工具延伸到可观测性:Instrumentation capability + 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-ResearcherJSONResearchHandler 双通道(标准 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(AiderGoosebrowser-useKilo Code 都硬编码公开 key)、Sentry(AutoGPTAugment)、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_contentOpenAI Agents SDK trace_include_sensitive_data + ZDR 组织不产 trace、Semantic Kernel ADR 强制可 opt-out);Warp 给每个遥测事件打 contains_ugc() 布尔决定是否需更严处理;QodermaskSensitiveData()Agent Zero_mask_recursiveCAMEL_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 协议、v0MessageBinaryFormat)都锁死在自家 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 任务价值极高,值得单独借鉴。