背景
EC APP(skill)通过 exec 工具运行子进程执行 pipeline。当 pipeline 中包含 LLM step 时,子进程需要回调 Gateway 的 /v1/chat/completions API 来完成 LLM 调用。
目前存在两个问题:
- 子进程拿不到 Gateway 的连接信息(URL 和 token),无法调用 API
- 即使手动配置了 token,子进程通过 HTTP 调用产生的 token 消耗不会归因到原始飞书会话
现状
EC 的 exec 工具(pi-tools.ts)在注入环境变量时,已经提供了:
ENCLAWS_TENANT_ID — 租户 ID
ENCLAWS_TENANT_USER_ID — 用户 ID
ENCLAWS_USER_WORKSPACE — 用户工作区路径
但缺少:
- Gateway 的连接 URL 和认证 token
- 当前会话的 session key
子进程调用 /v1/chat/completions 时,endpoint 不从请求中提取 tenant/session 上下文,buildAgentCommandInput()(openai-http.ts:44-58)不传 tenantId,导致 recordUsage()(attempt.ts:1663)因 params.tenantId 为空而跳过记录。
请求的改动
1. Exec 工具注入 Gateway 连接信息
在 pi-tools.ts 的环境变量注入处(约 196-200 行),增加:
env.ENCLAWS_GATEWAY_URL = `http://127.0.0.1:${gatewayPort}`;
env.ENCLAWS_GATEWAY_TOKEN = resolveGatewayToken();
env.ENCLAWS_SESSION_KEY = options?.sessionKey || "";
这样所有 skill 的子进程都能自动获取 Gateway 连接信息,无需在 SKILL.md 里 hack 读数据库。
2. /v1/chat/completions 支持会话归因
openai-http.ts 的 HTTP endpoint 增加对以下请求头的支持:
x-enclaws-session-key — 关联到原始会话
x-enclaws-tenant-id — 关联到租户
将这些信息传递到 agentCommand() → recordUsage(),使 token 消耗正确归因到发起请求的飞书会话。
无 header 时保持现有行为(生成新 session,不强制归因),保证向后兼容。
使用场景
EC APP 的 pipeline 包含 type: llm 的 step(如生成摘要、评估内容等)。Pipeline runner 作为子进程运行时,需要调用 LLM 完成这些 step。通过本地 Gateway API 调用是最自然的方式——复用已配置的 LLM provider,不需要 APP 自己管理 API key。
改动后,APP 的子进程只需:
import os, urllib.request, json
url = os.environ["ENCLAWS_GATEWAY_URL"] + "/v1/chat/completions"
headers = {
"Authorization": f"Bearer {os.environ['ENCLAWS_GATEWAY_TOKEN']}",
"x-enclaws-session-key": os.environ.get("ENCLAWS_SESSION_KEY", ""),
"x-enclaws-tenant-id": os.environ.get("ENCLAWS_TENANT_ID", ""),
}
# ... 标准 OpenAI 调用
Token 消耗自动归因到飞书会话,管理员可以在 usage 报表中看到完整的调用链。
背景
EC APP(skill)通过 exec 工具运行子进程执行 pipeline。当 pipeline 中包含 LLM step 时,子进程需要回调 Gateway 的
/v1/chat/completionsAPI 来完成 LLM 调用。目前存在两个问题:
现状
EC 的 exec 工具(
pi-tools.ts)在注入环境变量时,已经提供了:ENCLAWS_TENANT_ID— 租户 IDENCLAWS_TENANT_USER_ID— 用户 IDENCLAWS_USER_WORKSPACE— 用户工作区路径但缺少:
子进程调用
/v1/chat/completions时,endpoint 不从请求中提取 tenant/session 上下文,buildAgentCommandInput()(openai-http.ts:44-58)不传tenantId,导致recordUsage()(attempt.ts:1663)因params.tenantId为空而跳过记录。请求的改动
1. Exec 工具注入 Gateway 连接信息
在
pi-tools.ts的环境变量注入处(约 196-200 行),增加:这样所有 skill 的子进程都能自动获取 Gateway 连接信息,无需在 SKILL.md 里 hack 读数据库。
2.
/v1/chat/completions支持会话归因openai-http.ts的 HTTP endpoint 增加对以下请求头的支持:x-enclaws-session-key— 关联到原始会话x-enclaws-tenant-id— 关联到租户将这些信息传递到
agentCommand()→recordUsage(),使 token 消耗正确归因到发起请求的飞书会话。无 header 时保持现有行为(生成新 session,不强制归因),保证向后兼容。
使用场景
EC APP 的 pipeline 包含
type: llm的 step(如生成摘要、评估内容等)。Pipeline runner 作为子进程运行时,需要调用 LLM 完成这些 step。通过本地 Gateway API 调用是最自然的方式——复用已配置的 LLM provider,不需要 APP 自己管理 API key。改动后,APP 的子进程只需:
Token 消耗自动归因到飞书会话,管理员可以在 usage 报表中看到完整的调用链。