跳到主要内容

可观测功能设计 · 对照表

约 32 分钟9,874 字更新于 2026/10/22

本页逐项对照 coze-loop 与 Langfuse。每项给出状态、事实、限定和源码链接。 「限定」是补充说明,不改变状态。「未覆盖」表示调研没有覆盖该项。 回到 专题总览,或用交互页面筛选和搜索。

1. Trace / Span 模型与成本​

要回答的问题:一次调用在库里长什么样?Token 和钱怎么算?(数据层)

系统组状态结论详细页
coze-loop部分Span 是存储对象。Trace 是按 trace_id 聚合的查询视图。只统计 token,没有金额成本。model-ingest-storage
Langfuse有Trace 在 v4 里是 events_full 按 trace_id 聚合的视图。成本在采集时按模型价格表计算。model-ingest-storage
能力项系统状态事实限定源码
1.1 对象模型与层级coze-loop有存储和查询的主对象是 Span,TraceID 只是字段。没有独立 Trace 表。IDL 的 Trace 只有 trace_id、tokens、size 三个可选字段。父子靠 parent_id,前端组树。parent_id 为 "0" 或空串的 span 当 root;父节点不在当前集合时,该 span 在前端成为根span.go L156-L162 · trace.thrift L3-L11 · observability_spans.sql L1-L36 · span.tsx L18-L70
Langfuse有TraceDomain 带 id、IO、user、session、tags、public 等。Observation 用可空 traceId 和 parentObservationId。v4 的 Trace 由 events_full 按 trace_id 聚合。旧 traces 表仍独立存在;聚合 Trace 的做法在源码注释里被称为迁到只用 events 表之前的临时做法traces.ts L12-L30 · observations.ts L55-L65 · 0039_create_events_full.up.sql L4-L6 · query-fragments.ts L103-L128
1.2 类型与状态coze-loop有16 个 span 类型常量。状态只有 success 和 error,status_code 为 0 即 success。IDL 的状态枚举另有 brokenspan.go L65-L80 · span.go L82-L83 · span.go L386-L390
Langfuse有10 种 ObservationType。Observation 带 level 和 statusMessage。Trace 级 level 按 ERROR、WARNING、DEFAULT、DEBUG 取最高。—observations.ts L5-L17 · observations.ts L66-L100 · event-query-builder.ts L566-L567
1.3 Token 用量coze-loop有只统计 span_type 为 LLMCall 或 model 的 span,读 input_tokens 和 output_tokens 标签。Trace 级汇总只有 input 和 output 两项。—span.go L885-L929 · coze.loop.observability.trace.thrift L55-L63 · otel_convert.go L463-L469
Langfuse有用量按 usage 键存储。用户没给 usage 时,满足条件才本地 tokenize,有 openai 和 claude 两种 tokenizer。events 路径按 span 聚合成 Trace 总量。本地 tokenize 仅在:无 usage、无 cost、模型已匹配、level 非 ERROR、非 AI Gateway 生成时执行index.ts L1491-L1497 · usage.ts L51-L57 · event-query-builder.ts L549-L565
1.4 金额成本与价格表coze-loop无只有 token 数量,没有单价和金额。已搜索 price、usd、currency、money、cost,只命中 TokenCost 和日志耗时。搜索范围:backend/modules/observability、idl/thrift/coze/loop/observability、conf/observability.yamltrace.thrift L8-L11
Langfuse有Model 表带 matchPattern、单价、tokenizer。价格拆成 Price 和 PricingTier。Worker 选价格档再算成本。有模型管理页和公共 models API。用户给了任一成本点后,不再计算其他成本点schema.prisma L912-L932 · schema.prisma L955-L969 · index.ts L1411 · models.tsx L1

差异:

  • 1.1 对象模型与层级:两边都没有「Trace 即一行」。coze-loop 以 span 表为准,Langfuse v4 以 events_full 为准。旧版 Langfuse 另有独立 traces 表。
  • 1.2 类型与状态:Langfuse 的状态是四级 level,coze-loop 只有成功和失败。
  • 1.3 Token 用量:coze-loop 只收 SDK 上报的 token。Langfuse 可在缺失时本地补算。
  • 1.4 金额成本与价格表:最大的单项差距。coze-loop 要做金额统计,必须新增单价配置和计价逻辑。

推断(不是源码直接写明的事实):

  • 【推断】 coze-loop。产品里的一条 Trace 是同一 trace_id 下 span 的查询视图,存储层没有独立 Trace 行。依据:DDL 和 GetTrace。
  • 【推断】 coze-loop。要做金额成本统计,需要新增模型单价配置和计价逻辑。依据:现有只有 token 汇总,没有金额字段。
  • 【推断】 Langfuse。「Trace」在 v4 里是 events_full 行按 trace_id 聚合出来的视图,不是一张表。依据:Postgres 无 Trace 表,is_app_root 和 trace_name 在 events_full。

2. 采集​

要回答的问题:数据怎么进来?有没有队列、鉴权、限流?(数据层)

系统组状态结论详细页
coze-loop部分OpenAPI JSON 和 OTLP 两个入口,RocketMQ 加 collector 批量写 ClickHouse。写入没有限流。model-ingest-storage
Langfuse有默认 OTLP 直写 events_full。旧 SDK 走 S3 加队列,但默认模式下只收 score-create。model-ingest-storage
能力项系统状态事实限定源码
2.1 JSON 写入入口coze-loop有POST /v1/loop/traces/ingest,PAT 鉴权。要求同批 span 的 workspace_id 相同。进程内入口 IngestTracesInner 没有 HTTP 路由。平台自身用 cozeloop-go 加自定义 MultiSpaceSpanExporter,经 IngestTracesInner 上报coze.loop.observability.openapi.thrift L232 · openapi.go L229-L242 · coze.loop.observability.trace.thrift L631
Langfuse有POST /api/public/ingestion 接收 batch。legacy REST 另有 traces、spans、events、generations,包成事件走同一管线。请求体上限 4.5mb。默认 events_only 下该端点只接受 score-create;被拒的非 score 事件返回 400,提示改用 v4 SDK、OTLP,或临时设 dual;legacy 写接口在 events_only 下被拒绝ingestion.ts L56-L70 · ingestion.ts L48-L54 · index.ts L39-L64
2.2 OTLP 写入coze-loop有POST /v1/loop/opentelemetry/v1/traces。按 Content-Encoding 解压,支持 protobuf 与 JSON。用 PartialSuccess.RejectedSpans 报告被拒数量。映射 cozeloop.、gen_ai.、openinference、litellm 等语义约定,session.id 写成 thread_id 标签。Content-Type 只接受含 application/json 或 application/x-protobuf 的值;OTLP 入口没有 span 数量检查coze.loop.observability.openapi.thrift L233 · openapi.go L263-L353 · otel_convert.go L31-L40 · consts.go L133-L145 · otel_convert.go L44-L48
Langfuse有POST /api/public/otel/v1/traces,权限 traces:create。自行读 body,支持 gzip。读 x-langfuse-ingestion-version 头。Python SDK ≥ 4.0.0 或 JS SDK ≥ 5.0.0 等规则决定是否直写 events 表。OTLP metrics 端点 POST /api/public/otel/v1/metrics 的处理函数是空函数index.ts L26-L33 · index.ts L20-L24 · otelIngestionQueue.ts L310-L322 · otelIngestionQueue.ts L65-L66
2.3 异步管线与批量写入coze-loop有producer 压缩后发到 RocketMQ topic trace_ingestion_event。collector 的队列处理器按 1000 条或 1 秒成批,exporter 按 TTL 和 workspace 分组写入 ClickHouse。单条消息超过 10MB 且含多个 span 时拆开重发;插入失败重试 3 次,网络重试可能重复写入trace_producer.go L42-L74 · observability.yaml L330-L355 · clickhouse_exporter.go L30-L54
Langfuse有事件先写 S3,再按 projectId-eventBodyId 分片入队。Worker 合并后交给 ClickhouseWriter,批大小 1000、间隔 1000 ms、重试 3 次。events 路径还有 48 小时 TTL 的暂存表和传播队列。S3 失败则中止,不再入队;入队延迟默认 15 秒processEventBatch.ts L276-L332 · index.ts L61-L63 · env.ts L181-L192 · 0038_create_observations_batch_staging.up.sql L50
2.4 校验与保护coze-loop有trace_id 须为 32 位小写十六进制,span_id 须为 16 位,且都不能全 0。start_time 须在当前时间前 24 小时到后 1 小时之间。过长字段被裁剪,裁剪字段名写入 clip_fields。单批 span 数上限按租户配置。单批上限:默认配置 100,缺配置时常量 500;RMQ receiver 丢弃校验失败的 spanspan.go L537-L556 · span.go L557-L559 · span.go L850-L882 · trace.go L44-L51
Langfuse有ingestion 按 schema 校验,用量超阈值时拒绝。promptName 与 promptVersion 须同时出现或同时为空。环境名会被规范化。—processEventBatch.ts L168-L200 · ingestion.ts L127 · types.ts L535-L539 · types.ts L304-L317
2.5 写入鉴权coze-loop有/v1/loop 路由组挂 PatTokenVerifyMW,校验 Bearer PAT。写入前调 CheckIngestPermission,动作名 ingestLoopTrace。—middleware.go L26-L34 · pat_verify.go L20-L69 · openapi.go L121-L124
Langfuse有Basic(公钥加私钥,完整 scope)与 Bearer(只有公钥,受限 scope)。API Key 有 PROJECT 和 ORGANIZATION 两种 scope。score 事件要 scores:create,其余要 traces:create。—apiAuth.ts L92 · apiAuth.ts L215 · apiAuth.ts L183 · ingestion.ts L384-L390
2.6 写入限流coze-loop无写入没有限流。IngestTraces 与 OtelIngestTraces 函数体内没有调用限流方法。限流只用于查询和标注。查询限流默认每 key 10 QPS(只限查询和标注)openapi.go L108-L176 · openapi.go L263-L353 · openapi.go L1147-L1209
Langfuse有RateLimiterRedis 按「组织、套餐、资源」分桶。资源含 ingestion、media-upload、public-api 等。自托管和没有 Redis 时不限流;限流出错时 ingestion 选择放行(fail open)RateLimitService.ts L47-L50 · rate-limits.ts L4

差异:

  • 2.1 JSON 写入入口:默认配置下,Langfuse 的 JSON 写入口已不收 Trace 事件。coze-loop 的 JSON 入口默认可用。
  • 2.2 OTLP 写入:两边都接 OTLP traces。coze-loop 的映射表更偏 GenAI 语义约定。Langfuse 的 metrics 端点是空实现。
  • 2.3 异步管线与批量写入:两边都是「先落队列或对象存储,再批量写 ClickHouse」。Langfuse 多了一份 S3 原始事件。
  • 2.4 校验与保护:coze-loop 对 ID 格式和时间窗校验更严。Langfuse 更偏 schema 和用量校验。
  • 2.6 写入限流:coze-loop 写入侧无保护。Langfuse 有限流,但自托管默认不生效。

对旧笔记的修正:

  • coze-loop。旧笔记:内部 IngestTracesInner 没有 HTTP 路由。该点成立。补充:平台自身用 cozeloop-go 加自定义 exporter,经该入口上报。 证据:exporter.go L34-L86 · main.go L148-L165

推断(不是源码直接写明的事实):

  • 【推断】 coze-loop。外部 SDK 上报的 span,call_type 恒为 Custom,所以只在 cozeloop 平台列表可见。依据:GetCallType 恒返回 "Custom"。
  • 【推断】 Langfuse。默认 events_only 下,v4 之前的 SDK 不能再用 legacy 写接口上报 Trace。依据:/api/public/ingestion 只收 score-create,legacy 写端点被拒绝。

范围说明:两个仓库都不含外部 SDK 源码。SDK 侧的批量、重试、限流行为未核实。

3. 存储、保留与大字段​

要回答的问题:数据存在哪?保留多久?大字段放哪?(数据层)

系统组状态结论详细页
coze-loop部分ClickHouse 两张表。有 TTL 档位但 DDL 没有 TTL 子句,也没有清理任务。大字段靠 SDK 或 file 服务上传。model-ingest-storage
Langfuse有ClickHouse 存观测数据,Postgres 存配置,S3 存原始事件和媒体。保留由 Worker 清理,但属企业能力。model-ingest-storage
能力项系统状态事实限定源码
3.1 主存储与表结构coze-loop有observability_spans:MergeTree,按 toDate(start_time/1000000) 分区,排序键 start_time。trace_id、space_id、span_type、span_name 有 bloom 索引,input、output 有 tokenbf_v1。标注在 observability_annotations(ReplacingMergeTree)。表里没有 thread_id 列,过滤落到 tags_string['thread_id'];自定义字段映射到 tags_string、tags_long、tags_float、tags_boolobservability_spans.sql L1-L36 · observability_annotations.sql L1-L32
Langfuse有events_full:ReplacingMergeTree,主键 project_id、分钟级 start_time、xxHash32(trace_id),带 input、output、metadata 全文索引。events_core 由物化视图填充并把 input、output 截到 200 字符。旧 traces、observations、scores 表仍在。读取时 truncated 为 true 读 events_core,否则读 events_full;events_full 按月分区且没有表级 TTL0039_create_events_full.up.sql L112-L115 · 0039_create_events_full.up.sql L108-L110 · 0041_create_events_core_mv.up.sql L39-L42 · 0001_traces.up.sql L1-L23
3.2 保留与物理清理coze-loop部分有 TTL 档位(3、7、30、90、180、365 天)和 logic_delete_date 字段。查询窗口被 trace_max_duration_day 限制,开源默认 180 天。读到空结果时,过期处理器返回过期错误码。建表语句里没有 TTL 子句;没有清理任务;查询 SQL 不按 logic_delete_date 过滤;默认配置只给 cozeloop 租户的 365d 配了表span.go L95-L102 · span.go L69-L83 · observability.yaml L74-L79 · expire_error_processor.go L29-L48
Langfuse有Project.retentionDays(最小 3 天)。DataRetentionQueue 调度,处理任务按截止日期删除 traces、observations、scores 并删媒体。批量清理器覆盖 traces、observations、scores、events_full、events_core 五张表。Trace 删除先写 PendingDeletion,延迟后再删 ClickHouse。数据保留属企业能力,设置接口要求 data-retention 权益schema.prisma L139 · handleDataRetentionProcessingJob.ts L154 · index.ts L23-L30 · traceDeletionProcessor.ts L55 · projectsRouter.ts L147
3.3 大字段与对象存储coze-loop部分span 表有 object_storage 列(JSON,含 input_tos_key、output_tos_key 和附件)。查询时 AttrTosProcessor 换成签名下载 URL,TTL 5 小时。上传走 POST /v1/loop/files/upload。observability 模块自己不写对象存储;上传由 SDK 或 looptracer 调 file 服务完成;已搜索 UploadFile、PutObject、SignUpload,无命中span.go L195-L213 · attr_tos_processor.go L23-L72 · file.go L26-L49 · coze.loop.foundation.openapi.thrift L29
Langfuse有原始事件先写 S3。OTLP 的 resourceSpans 以 JSON 文件写入 otel//。Media 表按 sha256Hash 去重,TraceMedia 与 ObservationMedia 做关联。BlobStorageIntegration 可把数据导出到客户自己的桶。—processEventBatch.ts L276-L332 · OtelIngestionProcessor.ts L331 · schema.prisma L1488-L1507 · schema.prisma L1516-L1528 · schema.prisma L1335-L1365
3.4 多租户字段coze-loop有写入时 space_id 是 workspace。租户决定落哪张表。开源默认单租户 cozeloop,读出后把 system_tags_string.tenant 设为 cozeloop。开源版存储名固定为 ckspans.go L83-L88 · trace.go L184-L201 · observability.yaml L85-L93
Langfuse有events_full 与 traces 的排序键都以 project_id 开头。多数 Postgres 业务表带 projectId 并级联删除。—0039_create_events_full.up.sql L112-L115 · 0001_traces.up.sql L28-L29 · schema.prisma L516-L523

差异:

  • 3.1 主存储与表结构:coze-loop 一张宽表加标签 Map。Langfuse 在迁移中,新旧两套表并存。
  • 3.2 保留与物理清理:coze-loop 只记录了保留意图,默认部署的数据会一直增长。Langfuse 真正会删,但需要企业权益。
  • 3.3 大字段与对象存储:Langfuse 的对象存储是采集管线的一部分。coze-loop 把它留给 SDK 和 file 服务。

推断(不是源码直接写明的事实):

  • 【推断】 coze-loop。logic_delete_date 是给外部清理或运维用的标记,开源仓库本身不会据此删除数据。因此默认部署的数据会一直增长,直到运维自行配置 ClickHouse TTL 或清理。依据:DDL 无 TTL,没有清理任务,查询不按该字段过滤。
  • 【推断】 coze-loop。数据保留的「生效」主要体现在查询窗口上限和空结果时的过期报错,而不是物理删除。

4. 查询:列表、详情、过滤与分页​

要回答的问题:怎么找到一条 Trace?能怎么筛、怎么排、怎么翻页?(查询层)

系统组状态结论详细页
coze-loop部分列表、详情、树、批量 token 接口齐全,过滤语法强。排序只有一种,列表没有聚合。query-views
Langfuse有tRPC 有 v3 与 v4 成对过程。详情有树、时间线和图。聚合走统一查询引擎。query-views
能力项系统状态事实限定源码
4.1 列表与详情接口coze-loop有列表 POST /api/observability/v1/spans/list。详情 GET /traces/:trace_id。树 POST /traces/search_tree,上限 10 万 span。批量 token 用 batch_get_advance_info。OpenAPI 另有 traces/search、traces/search_tree、spans/search、pre_span/search、traces/list、traces/trajectory。OpenAPI 的 traces/list 按给定 trace_ids 返回 token 和 size,不返回 span 树coze.loop.observability.trace.thrift L626-L632 · coze.loop.observability.openapi.thrift L234-L239 · trace_service.go L1350-L1390
Langfuse有v4 主入口是 events 路由:all、listCursor、countAll、filterOptions、byTraceId、getAgentGraphData 等。v3 有 traces.all。公共 API v2 observations 支持 cursor 与 fields 字段组。events_only 下公共 v1 读接口返回 404(traces、observations、scores v1 与 v2、sessions、metrics v1、dataset-run-items 的路由都设置了 rejectInEventsOnlyMode);events_only 下可用的读接口:v2 observations、v3 scores、v2 metricseventsRouter.ts L134 · eventsRouter.ts L215 · index.ts L60 · traces.ts L1512-L1516 · index.ts L88 · index.ts L36 · createAuthedProjectAPIRoute.ts L166
4.2 树、时间线与图coze-loop部分详情有 Run Tree。前端按 span_id 去重、按开始时间排序,再用 parent_id 组树。span 详情固定页签是 Run 和 Metadata。图表面板枚举目前只有 runTree。没有时间线视图和图视图span.tsx L18-L70 · tab.ts L2-L4 · index.tsx L38-L41
Langfuse有树用 react-virtual 做虚拟滚动。有 Timeline、Graph、Log、Messages 视图。Graph 用 ELK 布局并支持 LangGraph 元数据。移动端 tab 是 Tree、Timeline、Graph、Info。Graph 视图不可用时回退到 treeVirtualizedTree.tsx L87 · Trace.tsx L305 · README.md L3 · README.md L13
4.3 过滤语法coze-loop有FilterFields 带 query_and_or 和 filter_fields,可嵌套。QueryType 有 12 种,FieldType 有 string、long、double、bool。字段分自定义、系统和超级列。可过滤字段由配置 trace_field_meta_info 描述。按标注过滤用子查询并加 SETTINGS final = 1filter.thrift L5-L54 · spans.go L488-L528 · observability.yaml L96-L208
Langfuse有FilterState 是类型化条件列表,类型含 datetime、string、number、stringOptions、arrayOptions、stringObject 等。有全文匹配操作符 matches,只支持 input、output、metadata。过滤条件可编码进 URL。自然语言过滤在自托管部署里不可用filters.ts L4-L29 · filters.ts L34 · filterQueryEncoding.ts L26
4.4 排序coze-loop部分请求允许 0 或 1 个 order_bys。后端只看是否非空,非空时固定按 start_time DESC, span_id DESC 排序,不读 field 和 is_asc。没有 order_bys 时单表 SQL 不加 ORDER BYtrace.go L217-L225 · spans.go L251-L256
Langfuse有排序状态是 {column, order},ASC 或 DESC。v4 listCursor 固定按 startTime DESC 排序orderBy.ts L3
4.5 分页coze-loop有游标式:多取 1 条判断 has_more,游标编码最后一条的 start_time 和 span_id。页大小上限 1000,默认 100,OpenAPI 上限 200。—trace.go L215-L221 · trace.go L268-L277 · trace.go L44-L51
Langfuse有v3 用 page 加 limit。v4 有 listCursor。公共 API v2 observations 与 v3 scores 用 cursor。—eventsRouter.ts L215 · index.ts L60 · index.ts L8
4.6 聚合与分组coze-loop无列表接口没有 group by 或聚合参数。聚合只出现在指标接口、GetThreadStat 和 ListMetadata 三处。—trace_service.go L3370-L3427 · trace_service.go L1800-L1830
Langfuse有聚合走统一查询引擎。函数有 sum、avg、count、max、min、p50、p75、p90、p95、p99、histogram、uniq。粒度含 auto、minute、hour、day、week、month。—types.ts L4-L18 · types.ts L194-L211

差异:

  • 4.1 列表与详情接口:两边的读取面都很全。Langfuse 的读路径分 v3 和 v4 两套,有迁移成本。
  • 4.2 树、时间线与图:详情页的表达力差距明显:coze-loop 只有树。
  • 4.3 过滤语法:两边都支持组合过滤。Langfuse 多全文匹配和 URL 编码,coze-loop 多嵌套 and/or 和按标注过滤。
  • 4.4 排序:coze-loop 的 order_bys 在开源实现里等价于「是否倒序」开关。
  • 4.6 聚合与分组:Langfuse 的聚合是平台级查询引擎,列表、大盘和告警共用。

对旧笔记的修正:

  • coze-loop。旧笔记:OpenAPI 还有 search、search_tree、list(L234-L238)。这是概括。精确为 L234 traces/search、L235 traces/search_tree、L236 spans/search、L237 pre_span/search、L238 traces/list、L239 traces/trajectory。 证据:coze.loop.observability.openapi.thrift L234-L239
  • Langfuse。旧笔记:v4 读路径只在数据库 flag v4BetaEnabled 为 true 时启用。登录时 session 的 v4BetaEnabled 由写入模式推出。events_only 下恒为 true。dual 下才要求 Cloud 或开启预览,且用户库 flag 为 true。 证据:auth.ts L844-L847

推断(不是源码直接写明的事实):

  • 【推断】 coze-loop。order_bys 在开源实现里等价于一个「是否倒序」开关。依据:只判断是否非空,不读字段名。
  • 【推断】 Langfuse。events_only 下公共 v1 读接口(traces、observations、scores v1 与 v2、sessions、metrics v1、dataset-run-items)全部 404。客户要读数据只能用 v2 observations、v3 scores、v2 metrics。依据:这些路由都设置了 rejectInEventsOnlyMode。

5. 视图预设、列配置与导出​

要回答的问题:筛选条件能保存吗?列能自定义吗?数据能导出吗?(查询层)

系统组状态结论详细页
coze-loop部分保存的视图有,列配置只在浏览器,导出到数据集后端有但前端无入口,没有文件导出。query-views
Langfuse有视图预设存 Postgres,批量导出支持 CSV、JSON、JSONL,批量操作有 9 种动作。query-views
能力项系统状态事实限定源码
5.1 保存的视图 / 预设coze-loop有MySQL 表 observability_view,按创建人隔离,最多返回 100 条。scope:1 列表、2 详情树、3 详情对话。开源默认有 Exceptions(status = error)和 High-latency(duration >= 10000)两个系统视图。前端有创建、更新、删除交互。—observability_view.sql L1-L22 · view.go L59-L74 · observability.yaml L44-L50 · custom-view.tsx L154-L182
Langfuse有TableViewPreset 存 filters、columnOrder、columnVisibility、searchQuery、orderBy。DefaultView 区分项目级和用户级默认。系统预设以 _langfuse 开头。覆盖 traces、observations、sessions 等多种表。—schema.prisma L1704-L1727 · schema.prisma L1731-L1753 · table-view-presets.ts L5-L18 · tableViewPresets.ts L28
5.2 列配置coze-loop部分前端列显示状态存在浏览器 localStorage。后端有 column_extract_config(按 workspace、平台、列表类型、agent 名保存列提取规则),但前端没有调用。已搜索 ColumnExtract、column_extract,前端业务源码无命中use-column.ts L27-L36 · observability_column_extract_config.sql L1-L22 · trace.go L1585-L1643
Langfuse有useColumnVisibility 基于 localStorage。预设里另存 columnVisibility 和 columnOrder。—useColumnVisibility.ts L3 · schema.prisma L1704-L1727
5.3 导出coze-loop部分后端有导出到数据集:POST /traces/export_to_dataset 与 preview_export_to_dataset,要求 exportLoopTrace 权限。成功后异步给 span 回写标注。前端没有入口。没有 CSV、Excel、JSON 文件导出。已搜索 ExportTracesToDataset,前端 frontend/packages、frontend/apps(排除 api-schema)无命中;查看大字段时有 fileDownload,但那不是列表导出coze.loop.observability.trace.thrift L642-L643 · trace.go L1095-L1130 · trace_export_service.go L136-L201
Langfuse有BatchExport 记录任务,状态 QUEUED、PROCESSING、COMPLETED、FAILED、CANCELLED。格式 JSON、CSV、JSONL。可导出 scores、sessions、traces、observations、events、datasets、audit_logs 等表。Worker 流式上传到对象存储。公共 API 没有批量导出端点(已搜索 web/src/pages/api/public/ 顶层目录);下载链接过期后不可用schema.prisma L1435-L1457 · types.ts L14-L26 · tableNames.ts L6-L16 · handleBatchExportJob.ts L295-L298
5.4 批量操作coze-loop未覆盖调研未覆盖此项。——
Langfuse有BatchAction 有 create 和 delete 两种类型,9 个动作:trace-delete、score-delete、dataset-delete、三种加入标注队列、observation-add-to-dataset、observation-run-batched-evaluation、experiment-compare。状态含 PARTIAL。—schema.prisma L1459-L1484 · types.ts L11-L35 · handleBatchActionJob.ts L187

差异:

  • 5.1 保存的视图 / 预设:两边都支持,覆盖面接近。Langfuse 的预设还保存列顺序和排序。
  • 5.3 导出:Langfuse 能把任意表导成文件。coze-loop 只能导到数据集,且页面上看不到入口。
  • 5.4 批量操作:调研未覆盖 coze-loop 的批量操作。

6. Session、thread 与 User 视图​

要回答的问题:多轮对话和终端用户能按会话看吗?(查询层)

系统组状态结论详细页
coze-loop部分后端有 thread 与 chat 四个接口,靠 thread_id 标签聚合。前端没有接入。query-views
Langfuse部分Session 与 User 都靠列聚合,有页面、tRPC 和公共 API。公共 sessions API 在 events_only 下返回 404。query-views
能力项系统状态事实限定源码
6.1 会话聚合(后端)coze-loop有thread_id 是 span 字段名,OTel 的 session.id 写成 thread_id 标签。ListThreadChat 按 thread_id 取 model span。GetThreadStat 汇总开始时间、时长、user、token 和模型。GetAdjacentTrace 在同一 thread 内取相邻 trace,窗口前后各 7 天。ListTraceChat 把 model 与 tool span 拆成对话消息。没有独立的 session 表或 thread 表;IDL 的 Session 只有 user_id,不是 thread 对象;视图 scope 里预留了 trace_detail_chatotel_convert.go L44-L48 · trace_service.go L3016-L3093 · trace_service.go L3102-L3207 · trace_service.go L3370-L3427 · trace_service.go L3297-L3367
Langfuse有Session 不是独立实体,由行上的 session_id 聚合。Postgres 的 TraceSession 只存 bookmarked、public、environment。tRPC sessions 路由有列表、计数、指标、详情、收藏和公开。公共 API 有 GET /api/public/sessions。公共 sessions 两个端点在 events_only 下返回 4040039_create_events_full.up.sql L19 · schema.prisma L501-L514 · sessions.ts L197 · index.ts L13
6.2 会话界面(前端)coze-loop无前端业务源码没有 ListTraceChat、ListThreadChat、GetThreadStat、GetAdjacentTrace 的调用,只在生成的 API 客户端出现。观测页面只有 Trace 一个。搜索范围:observation-components/src、observation-pages/srcapp.tsx L9-L11 · menu-config.tsx L87-L96
Langfuse有页面 /project/[projectId]/sessions 与 /sessions/[sessionId]。详情组件有 SessionDetailPage、ModernSession、SessionReviewWorkspace。相邻 Trace 间隔超过 5 分钟算「空闲间隔」。评论与标注共用评审面板。—index.tsx L1 · SessionDetailPage.tsx L1 · sessionIdleGap.ts L1 · README.md L3
6.3 User 视图coze-loop未覆盖调研未覆盖此项。——
Langfuse部分User 来自 user_id 列。有 /users 与 /users/[userId] 页面,tRPC 有 hasAny、all、metrics、byId 及 FromEvents 版本。没有公共 users API。Postgres 里没有终端用户业务表;已搜索 web/src/pages/api/public/ 顶层目录和 api/public/users,无 users 端点index.tsx L1 · users.ts L43 · events.ts L3038

差异:

  • 6.1 会话聚合(后端):两边都「靠列聚合,无独立会话实体」。
  • 6.2 会话界面(前端):这是 coze-loop「后端先行、前端未接」的典型例子。
  • 6.3 User 视图:调研未覆盖 coze-loop 的 User 视图。

推断(不是源码直接写明的事实):

  • 【推断】 Langfuse。Session 与 User 视图没有专门存储,靠 session_id、user_id 列做聚合。所以对没有设置这两个字段的数据,这两个页面是空的。

7. 评分、标注与自动评估​

要回答的问题:怎么给 Trace 打分?能人工标注吗?能自动评估吗?(反馈层)

系统组状态结论详细页
coze-loop部分后端标注和自动评估任务齐全,标注面板组件也有。Trace 页没挂 Feedback,任务无前端入口,数据回流只有空实现。feedback-metrics
Langfuse有Score 有 5 种数据类型和 3 种来源。标注队列带分配与锁。评估器有 4 种类型,页面和公共 API 都有。feedback-metrics
能力项系统状态事实限定源码
7.1 评分 / 标注模型coze-loop有Annotation 同时带 span_id 与 trace_id。类型有 auto_evaluate、manual_evaluation_set、manual_feedback、coze_feedback、openapi_feedback。自动评估结果含 score、correction、reasoning。手工反馈含 tag key 和 tag value。—annotation.thrift L5-L10 · annotation.thrift L26-L48 · annotation.thrift L50-L53 · span.go L946-L957
Langfuse有Score 来源有 API、EVAL、ANNOTATION。数据类型有 NUMERIC、CATEGORICAL、BOOLEAN、CORRECTION、TEXT。ScoreConfig 定义取值范围和类别。Score 可挂在 Trace、Observation、Session 或 Dataset Run 上。公共创建接口只允许 API 与 ANNOTATION,EVAL 保留给内部评估器;来源为 ANNOTATION 时必须带 configId,CORRECTION 例外scores.ts L4 · scores.ts L46-L52 · schema.prisma L516-L528 · 0003_scores.up.sql L6-L15
7.2 手工标注界面coze-loop部分后端 CRUD 路由在 /api/observability/v1/annotations。前端有手工标注面板(调用 CreateManualAnnotation)和 Feedback 页签(TraceFeedBack)。但 Trace 页没有把 Feedback 页签挂进 span 详情,列表加详情面板默认传空的额外页签。—coze.loop.observability.trace.thrift L637-L641 · label-item.tsx L82 · tab.tsx L9-L20 · trace-list-with-detail-panel.tsx L390
Langfuse有Trace 详情页自带评审面板 TraceReviewPanel。Session 详情页的评论与标注共用评审面板。Comment 可挂在 TRACE、OBSERVATION、SESSION、PROMPT 上。—TraceReviewPanel.tsx L1 · README.md L3 · schema.prisma L751-L756
7.3 标注 APIcoze-loop有POST 与 DELETE /v1/loop/annotations,可按 trace 与 key 创建和删除反馈。有单独的 QPS 限流。改评估分走 POST /traces/change_eval_score。标注写入后向 observability_span_queue 发事件。—coze.loop.observability.openapi.thrift L240-L241 · openapi.go L463-L556 · openapi.go L1189-L1209 · trace.go L1171-L1212
Langfuse有POST /api/public/scores,权限 scores:create。读取有 v1、v2、v3。另有 /api/public/comments。v1 与 v2 在 events_only 下返回 404;v3 没有这个开关index.ts L22 · index.ts L8 · index.ts L1
7.4 标注队列coze-loop未覆盖调研未覆盖此项。——
Langfuse有AnnotationQueue 绑定一组 scoreConfigIds。队列项对象类型 TRACE、OBSERVATION、SESSION,状态 PENDING、COMPLETED,带锁字段。可分配给用户。公共 API 有 queues、assignments、items。页面 /annotation-queues。—schema.prisma L547-L560 · schema.prisma L565-L582 · schema.prisma L602-L614 · index.ts L1
7.5 自动评估(LLM-as-judge)coze-loop部分任务类型 auto_evaluate,含过滤规则、采样器、生效时间窗和回填时间窗。AutoEvaluateProcessor 创建实验并逐 span 评测,结果作为 auto_evaluate 标注写回 span。任务 API 有创建、更新、列表、详情,没有删除。前端业务源码没有任务相关接口的调用;实时触发依赖的 trace_to_task topic 在仓库里没有生产者;SpanTrigger 先读配置键 consumer_listening,默认 observability.yaml 里没有这个键task.thrift L13-L15 · task.thrift L56-L75 · auto_evaluate.go L57-L82 · task_callback.go L115-L145 · coze.loop.observability.task.thrift L80-L84
Langfuse有评估器类型有 LLM_AS_JUDGE、CODE、DECISION_MODEL、FACET。EvaluationRule 带 targetObject(trace、dataset、event、experiment)、filter、sampling、delay。observation 目标由 scheduleObservationEvals 在写入 span 后调度,用 span_id 做确定性采样。页面 /evals,公共 API 有 evaluators 与 evaluation-rules。评估器自己产生的 trace 用内部环境排除,避免评估器评估自己schema.prisma L1089-L1094 · schema.prisma L1156-L1176 · types.ts L116-L121 · processOtelEvents.ts L134 · scheduleObservationEvals.ts L148
7.6 数据回流任务coze-loop无只有 IDL 类型(数据集 id、schema、字段映射)和 Noop 处理器。处理器工厂只注册了 auto_evaluate。—task.thrift L99-L105 · noop.go L12-L30 · wire.go L396-L404
Langfuse未覆盖调研未覆盖此项。——

差异:

  • 7.1 评分 / 标注模型:Langfuse 的 Score 是独立实体,可挂四类对象。coze-loop 的标注挂在 span 上。
  • 7.2 手工标注界面:组件已写好但没接上,是 coze-loop 的第二个典型例子。
  • 7.4 标注队列:调研未覆盖 coze-loop 的标注队列。
  • 7.5 自动评估(LLM-as-judge):最大的完成度差距之一。Langfuse 有页面、API 和队列;coze-loop 只有后端,且实时触发缺链路。
  • 7.6 数据回流任务:Langfuse 没有同名能力,调研未做对照。

推断(不是源码直接写明的事实):

  • 【推断】 coze-loop。默认开源配置下,自动评估任务的实时触发很可能不会运行。依据:trace_to_task 在仓库里没有生产者,且 SpanTrigger 先读配置键 consumer_listening,默认配置里没有这个键。这一条没有实际运行验证。
  • 【推断】 coze-loop。另一条触发路径是「给 span 写入标注后,带标注的 span 事件触发任务匹配」。它不依赖 trace_to_task,但同样受 consumer_listening 影响。
  • 【推断】 coze-loop。Feedback 页签和标注面板是为 Trace 详情预留的,开源 Trace 页没有挂载。
  • 【推断】 Langfuse。评估器自己产生的 Trace 用「内部环境」隔离,是为了避免评估循环。依据:isInternalEvalEnvironment 守卫与 execution_trace_id。

8. 指标与大盘​

要回答的问题:能看延迟、成本、错误率的趋势吗?(反馈层)

系统组状态结论详细页
coze-loop部分指标后端约 55 个,支持粒度、对比和下钻。离线指标是空实现。前端没有大盘页面。feedback-metrics
Langfuse有自定义 Widget、9 种图表、公共 metrics API。Dashboard、Monitor 和公共 API 共用同一个查询引擎。feedback-metrics
能力项系统状态事实限定源码
8.1 指标查询接口coze-loop部分POST /api/observability/v1/metrics/list 与 drill_down_values。请求含 metric_names、granularity、filters、platform_type、drill_down_fields、compare。响应有 summary、pie、time_series 三种形态。同比 yoy 与环比 mom。只配了 cozeloop 与 prompt 两个平台。前端业务源码里没有指标接口的调用;指标权限动作是 readLoopIndictor;已搜索 observabilityMetric、metrics/list,仅在生成的 API 客户端出现coze.loop.observability.metric.thrift L76-L77 · coze.loop.observability.metric.thrift L9-L21 · metric.thrift L15-L29 · observability.yaml L64-L69
Langfuse有公共 GET /api/public/metrics(v1)与 /api/public/v2/metrics,均调用 executeQuery。另有 /metrics/daily 和不稳定的 dashboards API。成本、延迟、用量都是 observation 上的度量。v1 metrics 在 events_only 下返回 404index.ts L11 · metrics.ts L10 · daily.ts L20 · dataModel.ts L82
8.2 聚合、分位与时延coze-loop有指标分 general、model、tool、service、agent、feedback 五组加反馈,共约 55 个。同一指标可套 avg、max、min、pct50、pct90、pct99、sum、time_series。延迟有 model_duration、model_ttft、model_tpot、tool_duration、service_duration。吞吐有 QPS、QPM、TPS、TPM。时间粒度 1min、1hour、1day、1week;下钻维度 model_name、tool_name、inner_model_name、annotation_key、feedback_sourcemetric.go L41-L114 · model_duration_metric.go L55-L57 · metric.go L57-L65
Langfuse有聚合函数 sum、avg、count、max、min、p50、p75、p90、p95、p99、histogram、uniq。views 有 traces、observations、scores-numeric、scores-categorical、scores-boolean。v2 视图声明为 events_*。—types.ts L4-L18 · types.ts L123-L131 · types.ts L164
8.3 离线指标coze-loop无OfflineMetricDaoImpl.GetMetrics 返回 nil, nil,是空实现。开关 support_offline 默认 false,配置读取失败时也返回 false。—metric.go L13-L25 · observability.yaml L71-L72 · trace.go L235-L244
Langfuse未覆盖调研未覆盖此项。——
8.4 大盘页面与自定义图表coze-loop无前端业务源码里没有指标接口的调用,也没有图表页面。路由和菜单里观测只有一个 observation/traces 入口。搜索范围:frontend/packages/loop-pages、observation-components/src、frontend/apps/cozeloop/srcmenu-config.tsx L87-L96 · app.tsx L9-L11
Langfuse有Dashboard 存 definition 与 filters。DashboardWidget 存 view、dimensions、metrics、chartType 等。9 种图表:折线、面积、柱状、横向与纵向条形、饼图、数字、直方图、透视表。项目首页有延迟、模型成本、模型用量、用户预设图表。—schema.prisma L1630-L1652 · schema.prisma L1675-L1703 · schema.prisma L1663-L1674 · home-preset-registry.tsx L1

差异:

  • 8.1 指标查询接口:coze-loop 的指标更细(约 55 个),Langfuse 的更通用(自定义维度加度量)。
  • 8.2 聚合、分位与时延:两边的统计能力都够用。coze-loop 内置 TTFT 与 TPOT。
  • 8.3 离线指标:Langfuse 无同名概念,调研未做对照。
  • 8.4 大盘页面与自定义图表:最直观的差距:Langfuse 有大盘,coze-loop 开源版没有。

对旧笔记的修正:

  • coze-loop。旧笔记没有覆盖指标、任务、告警、数据保留和权限。新调研补齐:指标(本组)、任务(第 7 组)、告警(第 9 组)、数据保留(第 3 组)、权限(第 11 组)。

推断(不是源码直接写明的事实):

  • 【推断】 Langfuse。Dashboard、Monitor、公共 metrics API 共用同一个查询引擎。自定义图表能画的指标,就是 Monitor 能告警的指标(去掉 traces 视图)。依据:三者都调用 executeQuery。

9. 告警与通知​

要回答的问题:指标超阈值时会通知人吗?(反馈层)

系统组状态结论详细页
coze-loop无观测模块、IDL、部署配置、前端均无告警。feedback-metrics
Langfuse部分有指标告警 Monitor 加 Webhook、Slack、GitHub dispatch。没有 Trace 或 Score 创建这类事件源。feedback-metrics
能力项系统状态事实限定源码
9.1 指标告警coze-loop无无。已搜索 backend/modules/observability、idl/thrift/coze/loop/observability、conf、bootstrap、observation-pages、observation-components/src。搜索词:alert、webhook、notif、告警、报警。唯一相关命中是评测配置里的 expt_webhook_notify_event 队列,与 Trace 无关;其余命中是 signal.Notify、UI 通知样式和代码注释evaluation.yaml L80-L84
Langfuse有Monitor 对一个指标做窗口聚合并与阈值比较:view、filters、metric、windowMs、cadenceMs、thresholdOperator、alertThreshold、warningThreshold。严重度 PAUSED、UNKNOWN、NO_DATA、OK、WARNING、ALERT。页面 /alerts。Monitor 的 view 只有 OBSERVATIONS 与三种 SCORES,没有 TRACESschema.prisma L1892-L1922 · schema.prisma L1876-L1883 · processor.ts L17 · index.tsx L1
9.2 事件触发(Trace / Score 创建)coze-loop无无,见 9.1 的搜索清单。——
Langfuse无Trigger 的 eventSource 只有 prompt、monitor、project-notification 三种。没有「Trace 创建」或「Score 创建」事件源。已搜索 automations.ts 的枚举、automation-repository.ts 与 processor.ts 的 eventSource 用法automations.ts L5-L13
9.3 通知渠道coze-loop无无,见 9.1 的搜索清单。——
Langfuse有Action 类型有 WEBHOOK、SLACK、GITHUB_DISPATCH。Webhook 默认最多重试 5 次,指数退避,初始 5 秒。请求头 x-langfuse-signature 带签名。SlackIntegration 存加密 bot token。ProjectNotification 路由平台出错事件。ProjectNotification 事件类型目前有 blob-export-failed、posthog-export-failed、evaluator-blockedschema.prisma L1815-L1820 · webhookQueue.ts L27-L31 · webhooks.ts L686 · schema.prisma L1945-L1957 · automations.ts L30-L34

差异:

  • 9.1 指标告警:最清晰的差距:coze-loop 完全没有告警。
  • 9.2 事件触发(Trace / Score 创建):Langfuse 的告警偏「指标告警」,不是「事件告警」。

推断(不是源码直接写明的事实):

  • 【推断】 Langfuse。Langfuse 的告警能力偏「指标告警」,不是「事件告警」。依据:Monitor 只支持 observation 与 score 视图,Trigger 事件源里没有 trace 或 score 创建。

10. 与 Prompt、评测、数据集联动​

要回答的问题:Trace 能跳到 Prompt、评测、数据集吗?(集成与治理)

系统组状态结论详细页
coze-loop部分Prompt 联动完整。评测联动在后端和实验页,Trace 页没有入口。Trace 到数据集后端齐全,前端无入口。integration-governance
Langfuse有Observation 带 prompt 名与版本。数据集运行项关联 Trace。events_full 带实验字段。integration-governance
能力项系统状态事实限定源码
10.1 链接 Promptcoze-loop有Prompt 调试按场景给 span 设 call_type:PromptPlayground、PromptDebug、PTaaS。执行时把 prompt_key 和版本记到 span,放进 baggage。观测列表有 prompt_key 列。Prompt 页内嵌 Trace 详情。—debug.go L66-L96 · execute.go L338-L379 · prompt_filter.go L20-L33 · index.tsx L60-L62
Langfuse有Observation 记录 prompt_id、prompt_name、prompt_version。OTLP 属性 langfuse.observation.prompt.name 与 .version 带入。Trace 详情有 PromptBadge。Prompt 指标页。Prompt 变更先进入 EntityChangeQueue 再触发自动化。—0039_create_events_full.up.sql L31-L33 · attributes.ts L28 · PromptBadge.tsx L1 · PromptMetricsPage.tsx L1
10.2 评测 / 实验coze-loop部分评估器平台只看 call_type = Evaluator,评测对象平台只看 EvalTarget。实验详情用 actual-output-with-trace 按 traceID 打开 Trace。后端 AutoEvaluateProcessor 创建实验并逐 span 评测。评测目标类型里有 Trace。Trace 页没有评测入口evaluator_filter.go L16-L29 · actual-output-with-trace.tsx L62-L69 · auto_evaluate.go L120-L206 · eval_target.thrift L91
Langfuse有数据集运行项在 ClickHouse dataset_run_items_rmt,带 trace_id 与可空 observation_id。events_full 带 experiment_id、experiment_name、experiment_dataset_id 等字段。实验由 ExperimentCreate 队列创建,页面 /experiments。公共 dataset-run-items 端点在 events_only 下返回 4040024_dataset_run_items.up.sql L8-L9 · 0039_create_events_full.up.sql L69-L74 · app.ts L532 · index.tsx L1
10.3 Trace 到数据集coze-loop部分后端导出与预览齐全,成功后给 span 回写标注。评测集业务分类 from_online_trace 表示数据来自在线 trace。前端没有入口。数据回流任务只有配置结构,没有处理器(见 7.6)coze.loop.observability.trace.thrift L642-L643 · trace_export_service.go L136-L201 · eval_set.thrift L177
Langfuse有批量操作 observation-add-to-dataset 把 observation 批量加入数据集。—types.ts L24-L35

差异:

  • 10.1 链接 Prompt:两边都有。coze-loop 靠 call_type 区分平台,Langfuse 靠 observation 上的列。

推断(不是源码直接写明的事实):

  • 【推断】 coze-loop。Prompt 调试、Evaluator、评测对象和用户 SDK 的 span 都落在同一张 observability_spans 表,靠 call_type 区分平台。依据:默认配置把四个平台都映射到租户 cozeloop,各平台过滤器只比较 call_type。

11. 权限、隔离与公开分享​

要回答的问题:谁能看?项目之间隔离吗?能公开分享吗?(集成与治理)

系统组状态结论详细页
coze-loop部分动作名齐全,但开源版只检查空间成员,不区分角色。查询带 workspace 条件。integration-governance
Langfuse有5 个角色加 scope,Trace 和 Session 可公开,有审计日志。项目隔离主要靠手写 SQL 里的 project_id。integration-governance
能力项系统状态事实限定源码
11.1 权限模型coze-loop部分动作名有 readLoopTrace、ingestLoopTrace、createLoopTraceView、exportLoopTrace、readLoopIndictor 等。但开源版 MCheckPermission 只检查「用户是否属于该 space」,不看 Action 名。所以上面的动作名在开源版里不区分角色auth.go L8-L23 · auth.go L30-L70 · auth.go L26-L70
Langfuse有角色有 OWNER、ADMIN、MEMBER、VIEWER、NONE。权限用 scope 字符串表达,如 traces:read、scores:CUD、dashboards:CUD。服务端用 throwIfNoProjectAccess 检查。公开与收藏有独立 scope。API Key 有项目级与组织级。—schema.prisma L493-L499 · projectAccessRights.ts L105 · checkProjectAccess.ts L25 · apiKeyAccessRights.ts L1
11.2 空间 / 项目隔离coze-loop有所有列表和详情都带 workspace 条件。视图按创建人隔离。租户与空间是两层:租户决定落哪张表,空间是 space_id 字段。开源版 ClipTableByWorkspace 原样返回表列表,没有按空间裁剪表cozeloop_filter.go L16-L30 · view.go L59-L74
Langfuse有排序键以 project_id 开头。Postgres 业务表带 projectId 并级联删除。公共 API 的项目由 API Key 决定。query-ast 编译器强制注入 project_id 条件。query-ast 目前只有 environments.ts 调用,其他仓储仍用手写 SQL0039_create_events_full.up.sql L112-L115 · index.ts L30 · tenancy.ts L67
11.3 公开分享coze-loop未覆盖调研未覆盖此项。——
Langfuse有Trace 与 Session 有 public 标志,由 traces.publish 修改。未登录或非项目成员访问时,只要 Trace 公开或其 Session 公开就放行。公开页面路由 /trace/[traceId] 与 /public/traces/[traceId]。实例管理员读取非自己项目的 Trace 时,会发送管理员访问 webhooktraces.ts L625 · trpc.ts L630-L640 · [traceId].tsx L1
11.4 审计日志coze-loop未覆盖调研未覆盖此项。——
Langfuse有Trace 的收藏、公开、删除等写操作调用 auditLog。AuditLog 的 resourceType 是字符串,不建外键,保证审计记录保留。审计日志也能批量导出。—traces.ts L580 · schema.prisma L980-L1003

差异:

  • 11.1 权限模型:开源 coze-loop 没有角色级权限。
  • 11.2 空间 / 项目隔离:两边都隔离。Langfuse 的强制注入还没推广。
  • 11.3 公开分享:调研未覆盖 coze-loop 的公开分享。
  • 11.4 审计日志:调研未覆盖 coze-loop 的审计日志。

推断(不是源码直接写明的事实):

  • 【推断】 coze-loop。开源版没有角色级权限。依据:MCheckPermission 只看空间成员关系,不看 Action。
  • 【推断】 Langfuse。租户隔离主要靠手写 SQL 里的 project_id 条件,query-ast 的强制注入还没推广。依据:仅 environments.ts 调用 compileClickhouseQuery。

12. 前端页面与组件​

要回答的问题:界面上到底能点出什么?(集成与治理)

系统组状态结论详细页
coze-loop部分只有一个 Trace 页。组件包含列表、详情、选择器、span 渲染。其余后端能力没有页面。integration-governance
Langfuse有Trace、Observation、Session、User、Score、Dashboard、Monitor 等页面齐全。integration-governance
能力项系统状态事实限定源码
12.1 Trace 列表与详情页coze-loop有控制台路由 observation/*,导航文案 Trace。页面渲染 CozeloopTraceListWithDetailPanel,列表数据来自 ListSpans,详情来自 GetTrace。时间范围预设从 5 分钟到 90 天。默认平台 Cozeloop,默认 span 类型 RootSpan。只有 root_span 列表会再请求 BatchGetTracesAdvanceInfo 补 tokenindex.tsx L77 · trace-render.tsx L69-L111 · time.ts L22-L40 · index.tsx L290-L298
Langfuse有Trace 列表页按 isV4 选表:v4 用 ObservationsEventsTable,否则 TracesTable。详情页 TracePage 由 TraceDetailBody、TraceDetailActions 组成。v4 详情 hook 调 events.byTraceId、batchIO、scoresForTrace。—TracesPage.tsx L97-L107 · TracePage.tsx L7 · useEventsTraceData.ts L62
12.2 其他观测页面coze-loop无observation-pages 只有 app.tsx、index.ts、pages/trace 三类源文件。没有 dashboard、task、session 页面。后端有而前端没有调用的:指标、任务、导出到数据集、thread 与 chat、column_extract_config、trajectory、SearchTraceTreeapp.tsx L9-L11
Langfuse有页面路由含 traces、observations、sessions、users、scores、dashboards、widgets、alerts、automations、annotation-queues、datasets、experiments、evals、prompts、models、playground。另有 v4 迁移引导页 /v4-migrationindex.tsx L1 · index.tsx L1 · models.tsx L1
12.3 可复用组件包coze-loop有observation-components 共 281 个文件,导出 CozeloopTraceList、CozeloopTraceDetail、CozeloopTraceDetailPanel、TraceSelector、CozeloopTraceListWithDetailPanel 等。适配接口在 adapter-interfaces,实现在 observation-adapter。span 详情按类型渲染:default、model、prompt、query-span、retriever、user-input。—index.ts L4-L26 · trace.ts L1-L40 · trace-detail.tsx L1-L40
Langfuse未覆盖调研未覆盖此项。——

差异:

  • 12.1 Trace 列表与详情页:两边都有完整的列表加详情。
  • 12.2 其他观测页面:全文最醒目的差距:coze-loop 后端先行,开源前端只露出 Trace。
  • 12.3 可复用组件包:调研未覆盖 Langfuse 的组件复用方式。

推断(不是源码直接写明的事实):

  • 【推断】 coze-loop。指标与任务后端已实现但开源前端未接入,可能是商业版 UI 使用这些接口。依据:生成的 API 客户端有,前端业务源码没有调用。