OpenTelemetry 导出协议参考
OpenTelemetry 导出的配套文档。完整传输协议:涵盖每项指标、日志事件、属性、枚举值和存在性规则。
传输协议仅以新增方式演进。可兼容未知的属性、事件和枚举值。如有重命名或移除,将明确通知。
传输协议和范围
- OTLP/HTTP 二进制 Protobuf (
application/x-protobuf) ,POST - 端点:
<base>/v1/metrics和<base>/v1/logs - 范围:
cursor.telemetry/0.1.0
资源属性
每个 (团队、用户、来源、入口点、来源版本) 组合对应一个资源。
| 属性 | 类型 | 是否存在 | 值 / 说明 |
|---|---|---|---|
service.name | string | 始终 | 固定为 cursor |
service.version | string | 可选 | 来源为桌面端/命令行界面时的客户端版本;cloud_agent / bugbot 通常不包含此项 |
cursor.team.id | int | 始终 | 你的团队 ID |
cursor.surface | string | 始终 | unspecified |
cursor.entrypoint | string | 始终 | unspecified |
cursor.user.id | int | 可选 | 如果来源提供用户 ID,则为不透明的团队范围用户 ID。在 cloud_agent.* 日志中,此项表示该 run 的所有者。使用团队 API 密钥或服务账户发起的 run 没有所有者,也不包含任何用户属性。请勿要求此项必须存在。 |
cursor.user.account_id | string | 可选 | 成员的 user_... ID,即 Admin API 中 GET /teams/members 以 id 返回的值。一条记录要么同时包含此项和 cursor.user.id,要么两者都不包含。 |
cursor.user.email | string | 可选 | 成员的电子邮件。当 cursor.user.id 存在且该成员有电子邮件时包含此项。启用隐私模式 (旧版) 的团队不会导出此项。请勿要求此项必须存在。 |
系列
系列 id 与团队设置中的开关一一对应。新建导出目标时,除 conversation_content 外,所有系列均默认开启;conversation_content 默认关闭,需团队启用,并在导出目标中为每种内容类型分别打开开关后才会生效 (参见 对话内容)。
| 系列 id | 信号 | 默认值 | 涵盖内容 |
|---|---|---|---|
model_usage | 指标 + 日志 | 开启 | token.usage、cost.usage;api.request、api.error、api.correction |
tool_calls | 指标 | 开启 | tool.calls |
skills_hooks_plugins | 日志 | 开启 | skill.activated (所有来源,包括 Cherri Bot) 、hook.execution_complete、plugin.installed |
cloud_agents | 日志 | 开启 | cloud_agent.pull_request、cloud_agent.setup、cloud_agent.artifact、cloud_agent.mcp_auth_error |
grok_bot_agent_actions | 日志 | 开启 (需启用操作录制) | grok_bot.mcp_tool_call、grok_bot.shell_command、grok_bot.browser_navigation、grok_bot.computer_use_session、grok_bot.tool_result、grok_bot.tool_decision、grok_bot.file_transfer、grok_bot.message_delivery、grok_bot.routine_run、grok_bot.guardrail、grok_bot.delegation |
conversation_content | 日志 | 关闭 (需团队启用 + 在导出目标中按内容类型分别打开开关) | conversation.user_message、conversation.assistant_message、conversation.tool_io |
grok_bot_agent_actions 系列,以及由 Bot 发出的 skill.activated,均包含操作录制数据。只有在团队管理员于仪表盘的 Cherri Bot 页面开启 操作录制 后,这些数据才会开始导出。隐私模式 (旧版) 会强制关闭录制。
指标
所有指标均为单调递增的 delta 总和。指标数据点不包含关联 ID;关联 ID 仅存在于日志中。
应将指标视为每个序列的 delta 总和。一个序列由资源、指标名称和完全一致的数据点属性集定义。同一序列的时间窗口可能会跨多次 flush 重叠。
cursor.token.usage
单位:{token}。系列:model_usage。
| 属性 | 类型 | 是否存在 | 值 / 说明 | |||
|---|---|---|---|---|---|---|
cursor.token.type | string | 始终存在 | input | output | cache_read | cache_creation |
cursor.model.name | string | 可选 | 路由意图归并后的请求公有模型 (auto: 映射为 Auto,thinking: 映射为 Thinking,pro: 映射为 Pro,premium: 映射为 Premium;否则原样保留) 。Bugbot 或源数据中没有模型时不包含此字段。 | |||
cursor.api.status | string | 可选 | success | errored | aborted | |
cursor.api.billable | bool | 可选 |
cursor.tool.calls
单位 {call}。系列 tool_calls。每次成功完成工具调用时取值为 1。
| 属性 | 类型 | 是否存在 | 值 / 说明 |
|---|---|---|---|
cursor.tool.kind | string | 始终 | builtin |
cursor.tool.name | string | 始终 | 内置 ID (例如 read、shell) 或客户 MCP 工具名称 (开放) |
cursor.tool.status | string | 始终 | success |
cursor.mcp.server.name | string | 仅 MCP | 客户定义的服务器显示名称 (开放) |
cursor.cost.usage
单位:USD (double) 。系列:model_usage。事件发生时的尽力估算费用,并非发票。可能会受 cursor.api.correction 修正。对于 BYOK (自带密钥),这仅为 Cherri Code Token 费率,不含 provider 支出。
| 属性 | 类型 | 是否存在 | 值 / 说明 |
|---|---|---|---|
cursor.model.name | string | 可选 | 与 token.usage 相同的折叠规则 |
日志事件
严重级别:INFO=9、WARN=13、ERROR=17。
通用日志属性
| 属性 | 类型 | 是否存在 | 说明 |
|---|---|---|---|
cursor.event.id | string | 始终 | **去重键。**不透明。在重试、worker 重新启动以及 Cherri Code Kafka 重放期间保持确定性。前缀 customer-telemetry:v1:... 是稳定的;请将整个字符串视为不透明值。 |
cursor.source_event.id | string | 始终 | 不透明的内部源标识。多个信号可能共用一个值。 |
cursor.request.id | string | 可选 | 适用于 api.request、api.error、skill.activated (Bot 激活除外) 、hook.execution_complete、plugin.installed。绝不适用于 api.correction、cloud_agent.* 或 grok_bot.*。请勿在 conversation.* 上依赖该属性。 |
cursor.conversation.id | string | 可选 | IDE/命令行界面:composer UUID。云端代理:客户可见的 bc-... 智能体 ID。Cherri Bot (grok_bot.*,以及任何带 cursor.surface=grok_bot 的日志) :该 Bot 的标识符,此值即为该 Bot 的对话 ID。用于跨 api、skill/hook、cloud_agent、grok_bot 和 conversation 日志重建会话的关联键。 |
cursor.usage_event.id | string | 可选 | 仅适用于 api.request / api.error / api.correction。用于关联 Cherri Code 用量和计费导出的请求粒度键。 |
cursor.api.request
INFO,响应体为 api_request。系列为 model_usage。
| 属性 | 类型 | 是否存在 | 说明 |
|---|---|---|---|
cursor.api.request.input_tokens | int | 始终 | |
cursor.api.request.output_tokens | int | 始终 | |
cursor.api.request.cache_read_tokens | int | 始终 | |
cursor.api.request.cache_creation_tokens | int | 始终 | |
cursor.model.name | string | 可选 | |
cursor.api.billable | bool | 可选 | |
cursor.grok_bot.turn.id | string | 仅限 grok_bot 来源 | 值与 cursor.request.id 相同,表示发起此次模型调用的 Bot 轮次。可用它关联该轮次的 grok_bot.* 操作记录。在轮次之外发起的 Cherri Bot 模型调用 (如头像生成) 也会在此处带有 id,但该 id 无法关联到任何操作记录。其他来源中不会出现 |
cursor.api.error
ERROR,响应体为 api_error。系列为 model_usage。无原始错误消息。低基数的 kind 和 status 属性已规划;暂勿依赖这些属性。
| 属性 | 类型 | 是否存在 | 说明 |
|---|---|---|---|
cursor.model.name | string | 可选 | |
cursor.api.billable | bool | 可选 | |
cursor.grok_bot.turn.id | string | 仅限 grok_bot 来源 | 与 cursor.request.id 的值相同;参见 api.request |
cursor.api.correction
WARN,响应体为 api_correction_<kind>。系列为 model_usage。计费结算:该用量事件被追溯为不计费。按 cursor.usage_event.id 关联,并将整个群组排除在计费之外。特意不包含 cursor.model.name。
| 属性 | 类型 | 是否存在 | 值 | |
|---|---|---|---|---|
cursor.api.correction.kind | string | 始终 | not_billed_errored | not_billed_aborted_before_timeout |
cursor.skill.activated
INFO,响应体为 skill_activated。系列为 skills_hooks_plugins。
| 属性 | 类型 | 是否存在 | 值 / 说明 |
|---|---|---|---|
cursor.skill.name | string | 始终 | 客户自定义 (开放) |
cursor.skill.trigger | string | 始终 | agent_read |
cursor.skill.source | string | 始终 | unspecified |
cursor.plugin.name | string | 可选 | 当技能来自插件时。目前 Cherri Bot 激活时不会导出此属性 |
Bot 读取 SKILL.md 时也会导出同一事件,并带有 cursor.surface=grok_bot;该记录还会携带共享的 grok_bot.* 属性,以便与该轮次中的其他操作关联。cursor.skill.name 为技能的文件夹 slug;cursor.skill.trigger 为 agent_read 或 skill_name_in_prompt (通过 / 或 @ 调用的技能暂不记录) ;cursor.skill.source 的取值规则为:Cherri Code 托管的技能为 builtin,已安装的插件技能为 plugin,Bot 自有技能为 user,其余情况的分类方式与其他来源一致。cursor.grok_bot.tool_call.id 是激活该技能的 Read 调用的 id,可用于关联对应的 tool_result 行。Bot 激活事件携带 cursor.conversation.id,但从不携带 cursor.request.id,且仅在开启操作录制时才会上报。
cursor.hook.execution_complete
INFO (failed / timeout 时为 ERROR) ,响应体为 hook_execution_complete。系列:skills_hooks_plugins。
| 属性 | 类型 | 是否必填 | 值 / 说明 |
|---|---|---|---|
cursor.hook.name | string | 始终 | 由客户配置 (开放) |
cursor.hook.type | string | 始终 | pre_tool_use |
cursor.hook.outcome | string | 始终 | success |
cursor.hook.duration_ms | int | 始终 | |
cursor.plugin.name | string | 可选 | 钩子来自插件时 |
cursor.plugin.installed
INFO,响应体为 plugin_installed。系列为 skills_hooks_plugins。不含 conversation.id (安装不属于对话范围) 。
| 属性 | 类型 | 是否存在 | 值 / 说明 |
|---|---|---|---|
cursor.plugin.name | string | 始终 | 打开 |
cursor.plugin.scope | string | 始终 | unspecified |
cursor.cloud_agent.pull_request
INFO (opened) / WARN (creation_failed) ,响应体为 cloud_agent_pull_request_<kind>。系列为 cloud_agents。conversation.id = bc-...。
| 属性 | 类型 | 是否存在 | 值 / 说明 | |
|---|---|---|---|---|
cursor.cloud_agent.pull_request.kind | string | 始终 | opened | creation_failed |
cursor.cloud_agent.pull_request.number | int | 仅 opened | ||
cursor.cloud_agent.pull_request.draft | bool | 仅 opened |
creation_failed 已启用。生产者逐步推出期间,opened 可能只包含部分字段。
cursor.cloud_agent.setup
INFO (started / completed) / ERROR (failed) ,响应体为 cloud_agent_setup_<kind>。模型系列为 cloud_agents。conversation.id = bc-...。
| 属性 | 类型 | 是否存在 | 值 / 说明 |
|---|---|---|---|
cursor.cloud_agent.setup.kind | string | 始终存在 | started |
cursor.cloud_agent.setup.duration_ms | int | 终止类型中存在时 | completed / failed |
cursor.cloud_agent.setup.reason | string | 仅 failed | 开放词汇 (如 install_command_failed) |
cursor.cloud_agent.artifact
INFO,响应体 cloud_agent_artifact_created。模型系列 cloud_agents。conversation.id = bc-...。
| 属性 | 类型 | 是否必填 | 值 / 说明 |
|---|---|---|---|
cursor.cloud_agent.artifact.file_name | string | 始终 | Open |
cursor.cloud_agent.artifact.content_type | string | 可选 | MIME |
cursor.cloud_agent.mcp_auth_error
ERROR,响应体为 cloud_agent_mcp_auth_error。系列为 cloud_agents。conversation.id = bc-...。
你连接的 MCP 服务器拒绝了本次运行的凭据。运行仍会继续,但该服务器的工具调用将失败。由于只有你能修复此集成,因此记为 ERROR;请针对该 ERROR 设置告警,以便及时发现自动化和云端代理在无提示的情况下失去 MCP 服务器。
| 属性 | 类型 | 是否存在 | 值 / 说明 |
|---|---|---|---|
cursor.mcp.server.name | string | 始终 | 用户定义的服务器显示名称 (开放) ,例如 github。取值范围与 cursor.tool.calls 数据点属性相同。 |
共享的 grok_bot.* 属性
每条 grok_bot.* 记录都通过 cursor.conversation.id 标识 Bot 本身,其值即为 Bot 的对话 ID;当有子智能体执行操作时,cursor.grok_bot.subagent.id 会指明该子智能体。grok_bot.* 事件承载来自操作录制的 Bot 操作,所属系列为 grok_bot_agent_actions。每条记录都带有 cursor.surface=grok_bot。
每个事件都只是关于操作的元数据,绝不包含操作内容。工具参数和结果、文件路径和文件名、消息正文和收件人、凭据、银行卡信息,以及 Auto-review 模式分类器的推理过程均不会在这些事件中导出;MCP 参数和结果仅通过需主动启用的 cursor.conversation.tool_io 记录发送。例外情况会在各事件中单独说明:shell 命令文本 (经机密信息清理,上限 8 KiB) 、规范化后的浏览器 URL 和页面标题,以及纯主机名。所有自由文本字段在到达你的收集器之前,都会清除其中疑似凭据的内容、支付卡号和 OAuth 令牌。
每个事件还携带以下属性:
| 属性 | 类型 | 是否存在 | 取值 / 说明 |
|---|---|---|---|
cursor.grok_bot.provenance | string | 始终 | client (由 Bot 的计算机上报;尽力而为) |
cursor.grok_bot.turn.id | string | 可选 | 执行该操作的 Bot 轮次 (或子智能体请求) 的请求 ID。该轮次的 api.request 和 api.error 记录中的 cursor.grok_bot.turn.id 也是同一个值 |
cursor.grok_bot.root_turn.id | string | 可选 | 该操作所服务的面向用户轮次的请求 ID。在子智能体之外与 turn.id 相同;对于子智能体的操作,则为派生该子智能体的轮次。server 来源时不存在 |
cursor.grok_bot.subagent.id | string | 可选 | 执行该操作的子智能体的对话 ID。由顶层 Bot 执行时不存在,server 来源时也不存在 |
cursor.grok_bot.box.id | string | 可选 | Cherri Bot 电脑 ID。server 来源时不存在 |
cursor.grok_bot.event.sequence | int | 可选 | 按轮次单调递增的序号,以 turn.id 为键。请按此序号 (而非客户端时钟) 对同一轮次的操作排序。序号不连续:等待批准后恢复的轮次会从其最后一个序号之后继续编号,重试则从其自身的号段继续,因此重试的行仍会排在首次运行之后。较早的 Cherri Bot 版本中不存在 |
cursor.grok_bot.tool_call.id | string | 可选 | 该操作的工具调用 ID。同一工具调用产生的所有行 (其 tool_result、tool_decision 行,以及 mcp_tool_call 等特定于工具的行) 都携带相同的值,因此可据此关联。当操作不归属于任何工具调用时 (如浏览器导航、shell 命令) 不存在 |
cursor.grok_bot.initiated_by | string | 可选 | 该操作所属轮次的发起方:user (输入的消息或语音通话) |
cursor.grok_bot.mcp_tool_call
INFO (failure 状态时为 ERROR) ,响应体 grok_bot_mcp_tool_call。系列为 grok_bot_agent_actions。表示 Bot 发起的一次 MCP 工具调用。此行绝不会包含工具参数或结果。对于 http 调用,已启用工具 I/O 的团队会以两条 cursor.conversation.tool_io 记录的形式收到这些内容,并通过 cursor.grok_bot.tool_call.id 与此行关联。
| 属性 | 类型 | 是否存在 | 值 / 说明 |
|---|---|---|---|
cursor.tool.name | string | 始终 | 客户定义的 MCP 工具名称 (开放取值) |
cursor.tool.status | string | 始终 | success |
cursor.grok_bot.mcp.transport | string | 始终 | http (服务器侧观测) |
cursor.grok_bot.mcp.duration_ms | int | 始终 | |
cursor.mcp.server.name | string | 可选 | 客户定义的服务器显示名称 (开放取值) |
每次 MCP 调用都会包含 cursor.grok_bot.tool_call.id。连接器调用 (包括 Bot 计算机上的浏览器工具) 均记录在此事件中,而不会记录为 tool_result,因此每次工具调用只会记录一次。
cursor.grok_bot.shell_command
INFO(被阻止时为 WARN),响应体 grok_bot_shell_command。系列 grok_bot_agent_actions。Bot 已运行或被阻止运行的 shell 命令。该记录在命令结束时写入,并以命令发出时间作为时间戳,因此长时间运行的命令,其记录会在时间戳之后很久才到达。
| 属性 | 类型 | 是否存在 | 值 / 说明 |
|---|---|---|---|
cursor.grok_bot.shell.command | string | 始终 | 经机密信息清理的命令文本,最多 8 KiB(open) |
cursor.grok_bot.shell.command_truncated | bool | 始终 | 源命令超出上限时为 True |
cursor.grok_bot.shell.kind | string | 始终 | foreground |
cursor.grok_bot.shell.target | string | 始终 | box(Cherri Bot 电脑) |
cursor.grok_bot.shell.allowed | bool | 始终 | shell 策略判定结果 |
cursor.grok_bot.shell.blocked_reason | string | 可选 | 被阻止时的策略原因;经机密信息清理(open) |
cursor.grok_bot.shell.classification_reasons | string[] | 可选 | 最多 10 条策略分类原因;经机密信息清理(open) |
cursor.grok_bot.shell.machine_id | string | 可选 | 仅适用于 user_machine 目标:运行该命令的已注册用户机器(open)。仅标明在轮次开始时已注册的机器 |
cursor.grok_bot.shell.exit_code | int | 可选 | 进程退出码;被信号终止或中止时为 -1。background 命令以及命令未产生退出结果(连接断开、运行前被拒绝)时不包含此字段 |
cursor.grok_bot.shell.duration_ms | int | 可选 | 从发出到结束的实际耗时,包括连接到计算机的时间以及进程启动前的所有等待时间。每条 foreground 记录均包含,background 记录不包含 |
cursor.grok_bot.browser_navigation
INFO,响应体 grok_bot_browser_navigation。系列 grok_bot_agent_actions。conversation.id 为该 Bot 的标识符。
| 属性 | 类型 | 是否存在 | 值 / 说明 |
|---|---|---|---|
cursor.grok_bot.browser.url | string | 始终 | 规范化后的 scheme://host/path (open) 。非层级式 scheme 从不导出 |
cursor.grok_bot.browser.page_title | string | 可选 | 经机密信息清理 (open) |
cursor.grok_bot.computer_use_session
INFO,响应体 grok_bot_computer_use_session。系列 grok_bot_agent_actions。单个计算机使用子智能体会话的摘要:仅包含次数和实际耗时,不含坐标、输入文本或屏幕截图。cursor.grok_bot.turn.id 为调用该子智能体的父轮次,cursor.grok_bot.subagent.id 为子智能体本身,cursor.grok_bot.tool_call.id 为此次调用,cursor.grok_bot.initiated_by 始终为 subagent。
| 属性 | 类型 | 是否存在 | 值 / 说明 |
|---|---|---|---|
cursor.grok_bot.computer_use.action_count | int | 始终 | |
cursor.grok_bot.computer_use.duration_ms | int | 始终 | |
cursor.grok_bot.computer_use.screenshot_count | int | 始终 | |
cursor.grok_bot.computer_use.action_counts.<kind> | int | 可选 | 计数大于 0 的每种操作类型各对应一个属性。<kind> 为 click、drag、key、mouse_move、screenshot、scroll、type、wait 之一 |
cursor.grok_bot.tool_result
INFO (success / cancelled) 、WARN (denied) 、ERROR (error) ,body 为 grok_bot_tool_result。系列:grok_bot_agent_actions。表示 Bot 发起的一次已结束的内置工具调用 (read、web_search、send_to_user、task、shell 等) 。每个内置工具都会生成这一行,因此 Bot 可调用的任何工具都不会漏记。连接器 (MCP) 调用记录为 mcp_tool_call 行,不会出现在此处。
cursor.grok_bot.tool_call.id 用于将该行与同一调用的 tool_decision 行关联。如果调用在模型流出现瞬时故障后重新运行,同一 id 可能对应两条 tool_result 行,因此统计调用次数时请按去重后的 id 计数。
| 属性 | 类型 | 是否存在 | 取值 / 说明 |
|---|---|---|---|
cursor.tool.name | string | 始终 | 内置工具 id,小写;取值空间与 cursor.tool.calls 的内置 tool.name 维度相同 (read、shell、web_search 等) |
cursor.grok_bot.tool_result.outcome | string | 始终 | success (工具已返回,包括以文本形式向模型返回拒绝的工具;操作是否实际发生,以该调用的 tool_decision 行为准) |
cursor.grok_bot.tool_result.duration_ms | int | 始终 | |
cursor.grok_bot.tool_result.error_category | string | 可选 | outcome 不为 success 时的编码原因:invalid_args、user_rejected、timeout、provider_error、hook_denied,或 TimeoutError 等错误类名 (开放) |
cursor.grok_bot.tool_result.target_host | string | 可选 | 对于以站点为目标的工具,表示其作用的纯主机名:list_credentials 报告凭据查找所限定的站点,request_virtual_card 报告商户。小写,不含 www.、端口、路径、查询参数或 userinfo。其他所有工具、调用未指定站点或调用从未运行时,该字段不存在 (开放) |
请将 outcome 理解为“调用如何返回”,而非“操作是否发生”。对于 shell、浏览器和计算机操作,以及被用户拒绝的本地工具请求,拒绝会报告为 denied,且 error_category 为 user_rejected。邮件、例程写入、连接器文件传输、子智能体启动以及云端代理操作则以文本形式将拒绝返回给模型,因此其 tool_result 显示为 success,拒绝信息由 tool_decision 行记录。
cursor.grok_bot.tool_decision
INFO (allowed / held) ,WARN (denied / timed_out) ,body 为 grok_bot_tool_decision。系列为 grok_bot_agent_actions。记录 Bot 的某次工具调用能否运行的一项决定:由谁做出、通过哪种批准模式、结果是什么。一次调用可能包含多项决定 (例如 Auto-review 模式拒绝自动放行,随后由人员回应卡片) ,每项决定各自对应一条记录。这些记录通过 cursor.grok_bot.tool_call.id 与该调用的 tool_result、mcp_tool_call 或 computer_use_session 行关联。分类器的判断依据、卡片文案和参数均不会出现在此处。
| 属性 | 类型 | 是否存在 | 取值 / 说明 |
|---|---|---|---|
cursor.grok_bot.decision.id | string | 始终 | 在做出决定时生成的 id,早于任何人员看到卡片。对于 human 决定,它是人员所回应的卡片或权限请求的 id,也是同一调用的 guardrail 升级行所携带的值 (开放) |
cursor.tool.name | string | 始终 | 内置工具 id,小写;与该调用的 tool_result 取值相同。连接器调用的决定携带 mcp,而其 mcp_tool_call 行携带服务器的工具名称 |
cursor.grok_bot.decision.source | string | 始终 | human |
cursor.grok_bot.decision.approval_mode | string | 始终 | auto_allow |
cursor.grok_bot.decision.outcome | string | 始终 | allowed |
cursor.grok_bot.decision.rule_id | string | 可选 | 做出决定的 Auto-review 模式规则的不透明 id;在分类器将其决定归因于某条规则之前不存在 (开放) |
各来源的含义:
policy表示在任何来源上执行的每一次 Auto-review 模式分类,无论结果是allowed还是denied,涵盖 shell、连接器调用、邮件、例程写入,以及云端代理和子智能体的启动。分类器失败或超时记为policydenied;评审规则未经分类就将调用转交人员处理时,同样如此记录。human表示 Auto-review 模式卡片的最终结果 (分类器升级时approval_mode为auto_review;来源始终需要询问时为ask_human,例如产品反馈、认领邮件收件箱、拨打电话或导入 Chrome Cookie) ,或人员在其本人计算机上回应的本地工具权限请求 (local_tool_permission) 。“始终”和“从不”的回答与一次性回答相同,分别记为allowed和denied。hook表示工具前钩子的拒绝。automatic表示没有任何关卡介入的调用,因此其余所有已完成的内置调用都至少带有一项决定。有三类调用不带任何决定:在任何关卡运行前就被工具本身拒绝的调用 (其tool_result显示为denied) ;人员在轮次结束后才回应的卡片 (凭据填写请求、机密信息请求或虚拟卡请求) ,因为回应会在后续轮次中才到达;以及在任何关卡介入前就被取消的调用,因为cancelled调用只带有被中断前已记录的放行和挂起决定。此外,虚拟卡请求会在其自身调用内部结束轮次,因此其tool_result显示为cancelled。
若调用先被 Auto-review 模式拒绝、随后由人员回应,则会同时带有两行,按 event.sequence 顺序依次为 policy denied 和 human。没有审批人属性:Bot 的卡片只能由其所有者回应,即该记录的 cursor.user.id。
cursor.grok_bot.file_transfer
INFO (success) 、WARN (denied) 、ERROR (error) ,body 为 grok_bot_file_transfer。系列为 grok_bot_agent_actions。表示 Bot 尝试在其计算机与另一端点之间进行的一次文件传输:另一端可以是用户的机器,已连接的 Google Drive、OneDrive 或 Gmail 账户,也可以是将用户机器上的文件直接读入 Bot 的上下文。仅包含元数据:传输方向、对端、传输字节数以及最终结果。路径、文件名和文件内容一律不会导出。读取 Bot 自身计算机上的文件会记录为 tool_result 行,而不是此事件。cursor.grok_bot.tool_call.id 将该行关联到对应调用的 tool_result;若传输被拒绝,还会关联到其 tool_decision。
| 属性 | 类型 | 是否存在 | 取值 / 说明 |
|---|---|---|---|
cursor.grok_bot.file.direction | string | 始终 | 以 Bot 的计算机为视角:download (字节写入该计算机) |
cursor.grok_bot.file.target | string | 始终 | user_machine (用户的计算机) |
cursor.grok_bot.file.outcome | string | 始终 | success |
cursor.grok_bot.file.bytes | int | 可选 | 传输的字节数;仅在传输完成时存在 (空文件导出 0) 。对于 read,表示交给 Bot 的字节数,因此范围读取统计的是实际输出量,而非文件大小 |
cursor.grok_bot.file.error_category | string | 可选 | outcome 为 error 时的编码原因:source_missing、too_large、read_failed、write_failed、invalid_file,连接器结果 (如 needs_auth 或 not_found) ,errno (如 ECONNRESET) ,或错误类名。始终为单个标记,绝不会是消息文本 (开放) |
cursor.grok_bot.file.machine_id | string | 可选 | target 为 user_machine 时对端的用户机器:即 Bot 机器列表中报告的不透明 id (开放) 。仅标识在轮次开始时已注册的机器 |
cursor.grok_bot.message_delivery
INFO (sent / held) ,ERROR (failed) ,响应体为 grok_bot_message_delivery。系列为 grok_bot_agent_actions。表示 Bot 发出的一条出站消息,目标可以是:Cherri Bot 聊天中的所属用户、该用户的另一个 Bot、触达该 Bot 时所在的 Slack 或 Discord 对话、外部电子邮件收件人、用户 Mac 上的“信息”应用,或由用户自行发送或丢弃的草稿卡片。该行只记录消息发往何处以及是否送达,绝不记录消息内容或收件人姓名:不含正文、主题、收件人、附件名称或长度。cursor.grok_bot.tool_call.id 将该行与同一次发送调用的 tool_result 关联起来。
| 属性 | 类型 | 是否存在 | 取值 / 说明 |
|---|---|---|---|
cursor.grok_bot.message_delivery.destination_type | string | 始终 | user (该 Bot 的所属用户,位于聊天或语音通话中) |
cursor.grok_bot.message_delivery.destination_id | string | 可选 | agent:目标 Bot 的不透明 id;若该 Bot 无法解析出 id,则不包含此字段。channel:<platform>:<chat>[:<thread>] 的 SHA-256 值的前 32 个十六进制字符 (例如 slack:C0123ABC:1699999999.000100) 。因此,发往同一对话的所有行都带有同一个值,你可以根据自己掌握的地址算出该值,而地址本身绝不会外传。user、draft、email 和 apple_messages 不包含该字段,因此电子邮件地址、电话号码或聊天 id 无论是否经过哈希,都绝不会被导出 (开放) |
cursor.grok_bot.message_delivery.result | string | 始终 | sent |
cursor.grok_bot.message_delivery.failure_category | string | 可选 | result 不为 sent 时的编码原因,例如 awaiting_user、blocked、target_not_found、forbidden、no_inbox、sender_not_owned、not_approved、route_unverified、declined、permission_denied,或错误类名 (开放) |
cursor.conversation.message.id | string | 可选 | 存在时,表示 user、channel 和 draft 行中已发送消息的 id,格式与该系列消息记录所用的格式一致 (<sessionId>/g<generation>/<entryId>,例如 g0/t3s1) ,因此投递行可通过同一个键与该系列的 assistant_message 记录关联。agent、email 和 apple_messages 行中绝不包含此字段 |
cursor.grok_bot.routine_run
INFO (success / cancelled) 、ERROR (error) ,响应体为 grok_bot_routine_run。系列为 grok_bot_agent_actions。表示 Bot 完成的一次例程 run:触发了哪个例程、触发原因、结束方式以及耗时。Cherri Code 在关闭该 run 时记录此行 (来源为 server) ,因此无论 Bot 的计算机是否在监听,run 都会被记录,该行也不包含 box.id、event.sequence 或 tool_call.id。该行始终包含 cursor.grok_bot.initiated_by=routine 和 cursor.entrypoint=automation,但绝不包含例程的提示词、名称或该轮次的文本。
cursor.grok_bot.turn.id 表示该 run 执行时所在的轮次,因此该 run 自身的 tool_result、shell_command 和 mcp_tool_call 行可通过它关联。以例程子智能体方式执行的 run,或在规划轮次之前就已失败的 run,不包含 turn.id。
| 属性 | 类型 | 是否存在 | 取值 / 说明 |
|---|---|---|---|
cursor.grok_bot.routine.id | string | 始终 | 例程的稳定 ID (不透明) |
cursor.grok_bot.routine_run.id | string | 始终 | run 的 ID,与例程运行历史中显示的值相同 (不透明) |
cursor.grok_bot.routine_run.trigger | string | 始终 | schedule (由 cron 计划触发) |
cursor.grok_bot.routine_run.outcome | string | 始终 | success (轮次已完成或已暂停等待用户操作) |
cursor.grok_bot.routine_run.duration_ms | int | 始终 | 从触发到结束的实际耗时 |
因等待批准而暂停、之后由恢复的轮次完成的 run,以及在任何轮次开始前就已失败的 run,均不会被记录。操作录制是团队功能,因此与其他所有 Bot 操作一样,个人 (无团队) 所有者的 run 会被跳过。
cursor.grok_bot.guardrail
INFO (continued) 、WARN (warned / stopped) ,响应体 grok_bot_guardrail。系列 grok_bot_agent_actions。表示护栏在 Bot 轮次中介入:循环检测器因重复输出或重复工具调用而触发、站点的机器人防护拒绝了 Bot 的浏览器,或 Auto-review 模式拦下某个工具调用以请求人工确认,以及随后的等待过程。仅导出编码字段;classifier 的判定理由和卡片文案均不会导出。决策本身 (Auto-review 模式的拒绝、人工的答复) 记录为 tool_decision 行,不会在此重复记录;升级行通过 cursor.grok_bot.decision.id 与其关联。
若护栏改变了轮次 (提示纠偏、停止,或以拒绝或无人答复告终的等待) ,则该行记为 WARN;若护栏仅作观察或轮次照常继续,则记为 INFO。每次触发记录一行:同一拦截墙在一次事件中只计一次,因此页面多次重新加载后仍停留在同一拦截墙上时,只记录一行。
一次升级对应同一张卡片的两行,按发生顺序排列。tool_escalation 行表示请求:评审中的调用须经人工处理才能运行,因此发出了卡片。pause 行表示等待结束:人工允许 (resumed) 或拒绝 (denied) 了该操作,或在卡片过期或被撤回前无人答复 (abandoned) 。若等待是因有人停止或重定向轮次 (而非作出答复) 而结束,则第二行为 interrupted。两行均包含被升级工具的 cursor.tool.name、该调用的 cursor.grok_bot.tool_call.id,以及作为 cursor.grok_bot.decision.id 的卡片 id;该值与此调用的 human tool_decision 行中的值相同,因此请求、等待和答复可通过同一个键关联。
| 属性 | 类型 | 是否存在 | 取值 / 说明 |
|---|---|---|---|
cursor.grok_bot.guardrail.kind | string | 始终 | loop_detected |
cursor.grok_bot.guardrail.detector | string | 始终 | 触发的检测项,以单个 snake_case 标记表示:循环类型 (single_message_single_line、multi_message、multi_message_outbound_flood 等) 、Bot 拦截系列 (cloudflare_challenge、recaptcha、datadome、akamai 等) ,或在升级类中表示发起询问的 Auto-review 模式来源 (host_shell、box_shell、mcp、computer、automation_write、cloud_agent、subagent、feedback、bot_share) (开放) |
cursor.grok_bot.guardrail.action | string | 始终 | warned (Bot 收到提醒后继续执行) |
cursor.grok_bot.guardrail.source | string | 始终 | runtime (检测器:loop_detected、bot_blocked) |
cursor.grok_bot.guardrail.count | int | 可选 | 触发检测器的计数:loop_detected 行检测到的重复次数。检测器不计数时不存在 |
cursor.grok_bot.guardrail.target_host | string | 可选 | 仅限 bot_blocked:拒绝 Bot 访问的主机,已转为小写并去除 www.、端口、路径、查询和 userinfo (开放) |
cursor.tool.name | string | 可选 | 仅限升级类:被升级调用的内置工具 id,与其 tool_decision 和 tool_result 行中的值相同 |
cursor.grok_bot.guardrail.resolution | string | 可选 | 仅限 pause 和 interrupted:resumed (人工允许该操作) |
cursor.grok_bot.guardrail.duration_ms | int | 可选 | 仅限 pause 和 interrupted:等待时长,从卡片创建到收到答复或卡片失效。不会为负值 |
cursor.grok_bot.decision.id | string | 可选 | 仅限升级类:卡片 id,即同一调用最终对应的 human tool_decision 行的 decision.id (开放) |
cursor.grok_bot.tool_call.id 仅出现在升级类中,检测类中不存在,因为检测类不归属于某个具体的工具调用。若调用被 Auto-review 模式拒绝且无人可询问,则不会发起卡片,仅带有其 tool_decision。
cursor.grok_bot.delegation
INFO (dispatched,以及结果为 success 或 stopped 的 completed) ,ERROR (结果为 error 的 completed) ,响应体 grok_bot_delegation。系列 grok_bot_agent_actions。记录 Bot 移交给另一个智能体的工作及其返回结果:可以是它派发的后台子智能体,也可以是它启动或回复的 Cherri Code 云端代理。仅包含 ID 和结果,绝不包含提示词、结果文本或被委派方自身的操作。子智能体的工具调用会单独记录为 grok_bot.* 行,并带有 initiated_by=subagent;云端代理的 run 归入 cloud_agents 系列。
每次委派会产生两条共享同一 target_id 的记录:工作移交时记录 dispatched,结果返回给 Bot 时记录 completed。completed 记录的 turn.id 取自接收结果的轮次,而非派发时的轮次。cursor.grok_bot.tool_call.id 指派发调用 (在 subagent_stop 记录中则指停止调用) ;它出现在 dispatched 记录和子智能体的 completed 记录中,云端代理的完成记录中则没有该字段。
| 属性 | 类型 | 是否存在 | 取值 / 说明 |
|---|---|---|---|
cursor.grok_bot.delegation.direction | string | 始终 | dispatched |
cursor.grok_bot.delegation.kind | string | 始终 | cloud_agent_launch |
cursor.grok_bot.delegation.target | string | 始终 | cloud_agent |
cursor.grok_bot.delegation.target_id | string | 始终 | 云端代理的 ID (bc-...,与 cloud_agents 系列导出为 cursor.conversation.id 的值相同) 或子智能体的对话 ID (sand-subagent-...) 。不透明值 |
cursor.grok_bot.delegation.outcome | string | 仅 completed | success |
cursor.grok_bot.delegation.duration_ms | int | 可选 | completed 记录上从派发到返回结果的实际耗时。若被委派方在接收轮次之外运行,则不含该字段;所有 dispatched 记录中也均不含 |
已知限制:
- 以下情况不会记录:注入云端代理进行中轮次的引导 (不产生新 run) 、被 Cherri Code 拒绝的启动或回复、云端代理取消、由他人启动且 Bot 仅负责监视的 run,以及例程的子智能体唤醒其父级。
- 已停止的子智能体之后仍可能产生
error完成记录,因此同一target_id可能同时对应stopped和error两条记录。 - 云端代理的
completed记录为尽力而为:当 Bot 重新监视它在之前轮次中启动的智能体时,完成记录的 kind 可能为cloud_agent_launch;在 run 中途被重新监视的启动,可能只有dispatched而没有对应的completed。请按target_id配对两条记录,并允许完成记录缺失。 - 与所有
grok_bot.*行一样,投递保证至少一次:崩溃后重试的启动、回复或完成,可能为同一target_id记录两次。请先按cursor.event.id去重。
对话内容
系列 conversation_content。conversation.* 事件是唯一一类响应体为负载 (消息文本或 MCP 工具调用的某一端) 而非固定事件名称的日志记录。与其他系列一样,请按日志事件名称进行路由。cursor.conversation.user_message 表示提示词,cursor.conversation.assistant_message 表示响应,cursor.conversation.tool_io 表示 MCP 工具调用的参数或结果;请勿通过解析响应体来区分它们。
响应体。 已脱敏的文本。消息上限为 32 KiB,工具调用每一端上限为 8 KiB。只要导出的响应体是脱敏后文本的前缀,都会设置 cursor.conversation.content_truncated,无论是源文本本身超过上限,还是脱敏导致其超出上限;对于 tool_io,如果响应体未超出上限但脱敏后无法解析,也会设置该属性。
身份。 记录携带通用日志属性。通过 cursor.conversation.id 可将其与该对话的 api.request、skill.activated、hook.execution_complete、cloud_agent.* 和 grok_bot.* 日志关联。唯一的用户标识符是可选的 cursor.user.* 资源属性;日志属性中不包含任何用户标识符。请勿依赖 cursor.request.id、cursor.usage_event.id,也不要依赖消息记录上的 cursor.grok_bot.turn.id;tool_io 会将 turn.id 作为共享的 grok_bot.* 属性携带。
来源界面。 仅限云端代理和 Cherri Bot。云端代理对话的 resource 上带有 cursor.surface=cloud_agent。Cherri Bot 对话带有 cursor.surface=grok_bot,开启操作录制时还会附带该 Bot 的 grok_bot.* 操作日志。tool_io 仅适用于 Cherri Bot。IDE、命令行界面和桌面端对话暂未纳入此系列。请按 cursor.surface 进行过滤或路由。
开关。 只有在团队启用且导出目标上的对应开关已开启时,各事件才会被导出:user_message 需要开启 Prompts,assistant_message 需要开启 Responses,tool_io 需要开启 Tool I/O。有关这些开关的说明,请参阅设置页面。
这三个事件均为 INFO 级别,并携带以下属性:
| 属性 | 类型 | 是否存在 | 取值 / 说明 |
|---|---|---|---|
cursor.conversation.provenance | string | 始终 | server (由 Cherri Code 观测) 。client 为保留值,请兼容处理。 |
cursor.conversation.message.id | string | 始终 | 对话内的消息 id |
cursor.conversation.turn.id | string | 可选 | 对话内的轮次 id。在消息记录上与 cursor.grok_bot.turn.id 相互独立;在 tool_io 上与其相同。 |
cursor.conversation.content_truncated | bool | 始终 | 响应体为脱敏后文本的前缀时为 True;对于 tool_io,脱敏后无法解析时也为 True |
cursor.conversation.user_message
INFO。响应体:经过脱敏处理的用户提示词文本。
cursor.conversation.assistant_message
INFO。响应体:该响应经过脱敏处理的最终助手文本。
cursor.conversation.tool_io
INFO。响应体:MCP 工具调用某一侧经脱敏处理的紧凑 JSON,最大 8 KiB。每次通过 http transport 执行的 Cherri Bot MCP 工具调用会生成两条记录:arguments 记录包含 Bot 发送的 JSON 对象,result 记录包含连接器的回复。调用成功时,回复为工具返回的文本和结构化内容;调用失败时,则为错误、拒绝或否决消息。图像字节会被替换为其 MIME 类型。Bot 的计算机上的 stdio 调用仅上报元数据,不会生成 tool_io 记录。除团队启用外,还需开启导出目标的 Tool I/O 开关。
两条记录都带有共享的 grok_bot.* 关联属性 (provenance、turn.id、tool_call.id、event.sequence) ,因此 cursor.grok_bot.tool_call.id 始终存在,可用于将这两条记录与该调用的 cursor.grok_bot.mcp_tool_call 和 cursor.grok_bot.tool_decision 行关联。cursor.tool.name、cursor.tool.status 和 cursor.mcp.server.name 会重复元数据行中的值,使每条记录都可单独解读。
| 属性 | 类型 | 是否存在 | 取值 / 说明 |
|---|---|---|---|
cursor.conversation.tool_io.direction | string | 始终 | arguments |
cursor.tool.name | string | 始终 | MCP 工具名称 (开放) |
cursor.tool.status | string | 始终 | success |
cursor.mcp.server.name | string | 可选 | 客户定义的服务器显示名称 (开放) |
cursor.grok_bot.provenance | string | 始终 | server |
cursor.grok_bot.tool_call.id | string | 始终 | 用于关联该调用的 mcp_tool_call 和 tool_decision 行的键 |
cursor.grok_bot.turn.id | string | 可选 | 与此记录上的 cursor.conversation.turn.id 取值相同 |
cursor.grok_bot.event.sequence | int | 可选 | 该调用在所属轮次内的序号;旧版 Cherri Bot 不提供此属性 |
当 cursor.conversation.content_truncated 为 true 时,响应体无法解析为 JSON:它要么是脱敏后文本的前缀,要么因脱敏而无法解析,此时 Cherri Code 会为其加上标志后导出,而不会导出脱敏程度更低的响应体。解析前请先检查该标志。两侧都会经过与消息文本相同的脱敏器,另外还会执行一轮基于键的处理:凡是键名指向凭据的 JSON 成员或赋值 (password、passphrase、token、api_key、secret、secret_key、access_key、authorization、cookie、private_key、credentials,以及 client_secret、x-api-key 等复合形式) ,无论其值形式如何,都会被脱敏。请求头键值对同样适用:在 [{"name":"Authorization","value":"Basic ..."}] 中,若同级的 name、key 或 header 成员在上述列表中,则 value 会被脱敏;若双元素数组的第一项在列表中,其第二项也会被脱敏 (["password","..."]) 。以数字形式保存的银行卡字段 ("cvc": 123) 会变为 [REDACTED: Card],ASCII \uXXXX 转义会在脱敏前先行解码。分散在同一数组各项中的私钥块 (如文件的各行、结果的各文本块) 会从 BEGIN 行到 END 行整体脱敏;分散在不相关字段中的则不会。基于键的处理只会深入字符串值中嵌套的 JSON 一层;更深层的重新编码文档仅按值的形态脱敏。有关脱敏器无法识别的内容,请参阅 MCP 工具 I/O。
标识与关联
| 目标 | 字段 | 覆盖范围 |
|---|---|---|
| 日志去重 | cursor.event.id | 每条日志记录 |
| 按会话或 Bot 分组 | cursor.conversation.id | 存在该字段时的日志。对于 Cherri Bot,此值即该 Bot 的标识符 (其对话 id) 。 |
| 按轮次分组 Cherri Bot 活动 | cursor.grok_bot.turn.id | 存在该字段时的 grok_bot.* 日志、Bot 的 skill.activated 日志、conversation.tool_io 日志,以及 cursor.surface=grok_bot 的 api.request / api.error 日志。请勿在 conversation.user_message 或 conversation.assistant_message 上依赖它。 |
| 对 Bot 轮次中的操作排序 | cursor.grok_bot.event.sequence | 当前 Cherri Bot 版本产生的 grok_bot.* 和 conversation.tool_io 日志。请按此字段排序;不要假定其值连续 |
| 对同一 Bot 工具调用的各行分组 | cursor.grok_bot.tool_call.id | tool_result、tool_decision、mcp_tool_call、computer_use_session、file_transfer、message_delivery、delegation、护栏升级、Bot 的 skill.activated,以及启用工具 I/O 时 conversation.tool_io 的输入和输出两侧记录 |
| 将批准请求与其答复关联 | cursor.grok_bot.decision.id | tool_decision,以及同一调用中 tool_escalation / pause / interrupted 的 guardrail 行 |
| 将子智能体的操作汇总到其父级 | cursor.grok_bot.root_turn.id | 来源为 client 的 grok_bot.* 日志;cursor.grok_bot.subagent.id 标识该子智能体 |
| 将提示词与响应关联到会话 | cursor.conversation.id | conversation.* 日志 (云端代理和 Cherri Bot) ,仅在启用 conversation_content 后可用 |
| 按轮次分组提示词与响应 | cursor.conversation.turn.id | 存在该字段时的 conversation.* 日志 |
| 按用户分组 | 资源属性 cursor.user.account_id | 存在该字段时的日志和指标。可与 Admin API GET /teams/members 响应中的 id 关联。同一资源上的 cursor.user.email 可直接标识对应成员。 |
| 核对计费 | cursor.usage_event.id | api.request、api.error 和 api.correction 日志 |
导出的日志不含 OpenTelemetry 的 trace_id 或 span_id 字段。请使用 cursor.conversation.id 和 cursor.grok_bot.turn.id 来关联 Bot 与轮次。指标不含关联 id;如需按对话统计 token 总量,请使用 api.request 日志。
具体方法请参阅设置页面中的 Joining sessions。
传递语义
- 日志采用至少一次传递。瞬时故障会在约 7 天内自动恢复;按
event.id去重。终止性拒绝 (持续性 4xx、无效负载) 不会重放。 - 指标采用至多一次传递。失败的指标请求不会重试或重放。
- **不保证顺序。**更正内容可能会在其所修正的请求之后到达;请按记录时间戳排序。
- 支持 OTLP 部分成功。被拒绝的条目不会重新发送。
- 不会回填目标激活前的数据。导出上游的源数据保留期也约为 7 天 (与传递重试窗口分开) 。