预览¶
智能体元数据目前处于预览阶段,可能会发生变更,包括破坏性
变更。
云端代理可在 VM 内读取当前运行的键值元数据,包括智能体 ID、所有者、此轮的提交者、所用模型以及已检出的仓库。钩子和安装脚本也可以读取这些值。
智能体通过终端工具调用此 API。您无需自行发起这些请求。
要让智能体读取元数据,请在提示词中加入以下内容:
To read agent metadata, follow the instructions at
https://cursor.com/docs/cloud-agent/metadata
此 API 仅在智能体 VM 本地可用。它不是您通过 SDK 或 Cloud Agents API 创建智能体时设置的、归调用方所有的 metadata 标签。这些 API 使用 Cursor API 密钥从 VM 外部管理 agents。
当 VM 外部需要验证智能体身份时,应让智能体改为签发 OIDC 身份令牌。这些 JWT 已签名且绑定受众。元数据不是凭证,其中可能包含当前轮次的提交者和所用模型,而令牌不应携带这些信息。
由 Cursor 管理的云端代理虚拟机会通过与 OIDC 身份令牌相同的套接字提供元数据。自托管 workers 尚不提供此 API。
读取值¶
智能体通过 CURSOR_AGENT_SOCKET 指定的 Unix 套接字读取键。在由 Cursor 管理的 VM 上,默认值为 /run/cursor/api.sock。
curl --unix-socket "${CURSOR_AGENT_SOCKET:-/run/cursor/api.sock}" \
http://cursor-agent/v1/meta-data/agent/id
请求通过 Unix 套接字使用 HTTP。URL 中的主机名会被忽略。
列出前缀,查看有哪些键:
curl --unix-socket "${CURSOR_AGENT_SOCKET:-/run/cursor/api.sock}" \
http://cursor-agent/v1/meta-data/
agent/
owner/
turn/
workspace/
然后请求一个键:
curl --unix-socket "${CURSOR_AGENT_SOCKET:-/run/cursor/api.sock}" \
http://cursor-agent/v1/meta-data/owner/user-id
请求¶
通过 Unix 套接字发送 GET /v1/meta-data[/<path>]。无需请求体或额外请求头。允许使用尾部斜杠,因此列出的 agent/ 可请求为 /v1/meta-data/agent/。
缺失的键返回 404。
响应¶
成功读取的内容类型为 text/plain; charset=utf-8。读取键时,响应仅包含其文本形式的值。
| 类型 | 响应体 |
|---|---|
| 键 | 以 string 形式返回值。具有多个值的键每行显示一个条目。 |
| 前缀 | 每行一个子项,按顺序排列。嵌套前缀以 / 结尾。列表末尾带有换行符。 |
错误响应为 JSON。请参阅限流和错误。
键何时出现¶
安装脚本可读取同一个套接字。键仅在有值时才会出现:编码轮次开始前不会有 turn/;运行记录分支前不会有 workspace/branch-name。所有者、团队和代码仓库键从智能体创建起便可用。
如果启动后立即找不到套接字,请重试连接。
键¶
列表中会省略缺失的键;如果直接请求,则返回 404。列表仅包含当前实际存在的键。
agent/¶
| 键 | 存在条件 | 描述 |
|---|---|---|
agent/id |
始终 | 云端代理 ID (bcId)。 |
agent/name |
已知时 | 仪表盘中显示的名称。 |
agent/source |
已知时 | 智能体的启动方式,例如 WEBSITE、API、SLACK 或 AUTOMATIONS。 |
agent/runtime |
始终 | 在由 Cursor 管理的云端代理虚拟机上,该值为 managed。 |
owner/¶
| 键 | 存在条件 | 描述 |
|---|---|---|
owner/user-id |
已知时 | 智能体所有者的 Cursor 用户 ID,以十进制 string 表示。对于允许列表,优先使用此项而非电子邮件。 |
owner/user-email |
已知时 | 所有者的小写电子邮件。电子邮件可能会变更。 |
owner/service-account-id |
已知时 | 当服务账户拥有该智能体时,其服务账户 ID。 |
owner/team-id |
已知时 | 所属团队的 ID,以十进制 string 表示。 |
turn/¶
仅当编码轮次处于活动状态时,turn/ 才存在。轮次之间,这些键会消失。如果缺少 turn/,则没有活动轮次。
turn/ 下的值始终反映当前轮次。请勿跨轮次缓存这些值。
| 键 | 存在时机 | 描述 |
|---|---|---|
turn/id |
轮次期间 | 此编码轮次的 ID。不同于 agent/id,后者是云端代理 ID (bcId)。 |
turn/user-id |
已知时 | 提交此轮次的人员的 Cursor 用户 ID,以十进制 string 表示。在团队后续操作中,这可能与 owner/user-id 不同。 |
turn/user-email |
已知时 | 该人员的电子邮件地址 (小写) 。 |
turn/started-at |
轮次期间 | 轮次开始时间,以 Unix 秒表示。 |
turn/model |
已知时 | 为此轮次提供服务的模型。如果您选择了 Auto,这里显示的是提供服务的模型,而非 Auto。 |
OIDC 身份令牌不包含轮次提交者或提供服务的模型,因为令牌的有效期可能长于轮次。请改为从元数据中读取这些键。
workspace/¶
| 键 | 存在条件 | 描述 |
|---|---|---|
workspace/repo-url |
已知时 | 主代码仓库,采用 host/path 格式,例如 github.com/acme/widgets。主机名使用小写,不含协议、凭据、端口、查询参数或 .git 后缀。对于多仓库智能体,这仅表示主代码仓库。 |
workspace/repo-urls |
已知仓库集合时 | 工作区中的所有代码仓库,格式与 repo-url 相同。主代码仓库排在首位,其余按排序顺序排列,每行一个 URL。缺失表示仓库集合未知,并不表示只有一个仓库。 |
workspace/branch-name |
已知时 | 主代码仓库的分支。 |
workspace/environment-id |
已知时 | 此次运行所使用的 Cursor 环境 ID。 |
workspace/automation-id |
用于自动化 | 当 agent/source 为自动化时的自动化 ID。 |
workspace/repo-url 表示主代码仓库。完整集合请读取 workspace/repo-urls。
谁可以读取元数据¶
任何能访问套接字的进程都可以读取所有键:智能体、它运行的代码和钩子。请将这些值视为对整个运行均可见。
元数据未经签名。要向 AWS、GCP、Vault 或你自己的服务证明身份,请让智能体签发 OIDC 身份令牌 并验证 JWT。请勿将元数据值作为凭据转发。
限流和错误¶
每个智能体 VM 每分钟最多可发起 120 个元数据请求,突发请求最多 20 个。套接字最多可同时接受 8 个连接。该上限与 OIDC 令牌签发共用。
对 429、503、500、502 和 504 采用退避策略重试。将 403 视为致命错误:该智能体无权读取元数据。
404 和 405 响应包含一个说明 API 调用方式的 usage string。限流和饱和错误仅返回错误代码:
{ "error": "not_found", "usage": "GET /v1/meta-data[/<path>] ..." }
{ "error": "rate_limited" }
| HTTP | error |
适用情形 |
|---|---|---|
| 404 | not_found |
键未知或缺失 |
| 405 | method_not_allowed |
非 GET 请求 |
| 429 | rate_limited |
超出每个智能体的请求预算;请遵循 Retry-After |
| 503 | saturated |
连接过多;请遵循 Retry-After |
| 500 | host_error |
内部错误;请重试 |
| 502 / 504 | backend_unreachable |
Cursor 无法返回元数据;请重试 |
| Other | backend_error |
Cursor 拒绝了请求。403 不可恢复;503 可重试 |
示例¶
智能体或钩子可以比较本轮提交者与所有者。队友的后续操作可以采用更严格的处理路径:
SOCKET="${CURSOR_AGENT_SOCKET:-/run/cursor/api.sock}"
owner="$(curl -fsS --unix-socket "$SOCKET" \
http://cursor-agent/v1/meta-data/owner/user-id)"
turn_user="$(curl -fsS --unix-socket "$SOCKET" \
http://cursor-agent/v1/meta-data/turn/user-id || true)"
if [ -n "$turn_user" ] && [ "$turn_user" != "$owner" ]; then
echo "follow-up from user $turn_user; owner is $owner"
fi
智能体或钩子可以使用智能体 ID 和处理本轮的模型为日志添加标签:
SOCKET="${CURSOR_AGENT_SOCKET:-/run/cursor/api.sock}"
agent_id="$(curl -fsS --unix-socket "$SOCKET" \
http://cursor-agent/v1/meta-data/agent/id)"
model="$(curl -fsS --unix-socket "$SOCKET" \
http://cursor-agent/v1/meta-data/turn/model || true)"
echo "cloud_agent_id=$agent_id model=${model:-unknown}"
列出工作区中的每个代码仓库。repo-urls 中每行一个 URL:
curl -fsS --unix-socket "${CURSOR_AGENT_SOCKET:-/run/cursor/api.sock}" \
http://cursor-agent/v1/meta-data/workspace/repo-urls
github.com/acme/widgets
github.com/acme/docs