Skip to content

Exec 子进程需要 Gateway 连接信息和会话归因支持 #29

@kellerman-koh

Description

@kellerman-koh

背景

EC APP(skill)通过 exec 工具运行子进程执行 pipeline。当 pipeline 中包含 LLM step 时,子进程需要回调 Gateway 的 /v1/chat/completions API 来完成 LLM 调用。

目前存在两个问题:

  1. 子进程拿不到 Gateway 的连接信息(URL 和 token),无法调用 API
  2. 即使手动配置了 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 报表中看到完整的调用链。

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions