docs: document code agent profile inheritance
This commit is contained in:
@@ -1,6 +1,6 @@
|
||||
# AgentRun Code Agent Dispatch
|
||||
|
||||
本文定义 HWLAB Code Agent 通过 AgentRun `v0.1` 手动调度 API 执行时的装配边界。它只描述稳定的 payload、SecretRef 和 credential 归属,不替代当前 G14 DEV `/v1/agent/chat` 的真实 completed 判定。
|
||||
本文定义 HWLAB Code Agent 通过 AgentRun `v0.1` 调度 API 执行时的装配边界,也是 nested/child Code Agent provider profile 继承语义的唯一权威出处。它只描述稳定的 payload、SecretRef、credential、session/profile 归属和验收判定;CLI/Web 的用户入口只交叉引用本文,不重复定义继承规则。
|
||||
|
||||
## 装配入口
|
||||
|
||||
@@ -15,9 +15,24 @@
|
||||
- HWLAB `conversationId` / `sessionId` / `threadId` 是用户可见业务会话 authority;AgentRun `runId` / `commandId` / `runnerJobId` 是执行尝试 identity;AgentRun `SessionRef` 和 per-session PVC 承载 backend/profile 的续接状态。不要把新建 AgentRun run/job 等同于新建 HWLAB session,也不要把复用 workspace selection 当作 session state。
|
||||
- AgentRun `type=steer` command 是作用在既有 target trace/target command 上的控制命令,不创建新的 HWLAB session,也不改变业务 `conversationId/sessionId/threadId`。HWLAB closeout 和 UI 展示必须同时保留 target command identity 与 `steerCommandId`,并从原 target trace 观察 `agentrun:steer:accepted` / `agentrun:steer:command-created`。steer command 创建成功只证明短连接控制动作已被 AgentRun 接收;目标 turn 后续 terminal 状态按原 command/result 判定。
|
||||
- HWLAB adapter 调 AgentRun 时必须固定使用 AgentRun policy 边界字段:`tenantId=hwlab`、`projectId=pikasTech/HWLAB`、`providerId=G14`。HWLAB Workbench 的 project/workspace 标识只能作为 `metadata.hwlabProjectId`、`metadata.hwlabWorkspaceId` 或 `workspaceRef` 子字段保存,不能写入 AgentRun `projectId`。如果运行面出现 `tenant-policy-denied`、project mismatch 或 workspace project 污染,临时处理是修 adapter 的字段归一化并重放最小真实请求,不放宽 AgentRun tenant policy。
|
||||
- `providerProfile` 由显式 HWLAB session 负责。`client agent session create --provider-profile <profile>` 建立 session 的 provider profile,并映射为 AgentRun `backendProfile`;后续 `client agent send --session-id <sessionId>` 在未显式传 `--provider-profile` 时必须继承该 session 的 `providerProfile`。账号 workspace 的 provider profile 只在 workspace 当前 selected session 与本次目标 session 完全一致时作为 fallback;旧 workspace 状态不得覆盖显式 session。
|
||||
- 显式 HWLAB session 是用户可见 provider profile authority。`client agent session create --provider-profile <profile>` 建立 session 的 `providerProfile`,Cloud API 在 dispatch 时映射为 AgentRun `backendProfile`;后续 `client agent send --session-id <sessionId>` 在未显式传 `--provider-profile` 时继承该 session 的 `providerProfile`。workspace 只记录当前已选 session 和展示 seed,不能作为 child agent profile 继承来源,也不得用旧 workspace 状态覆盖显式 session。
|
||||
- 同一 HWLAB session 的 resume 判定看同一个 `sessionId`、`threadId`、`providerProfile/backendProfile`、AgentRun `SessionRef` 和 PVC,而不是只看是否复用了同一个 AgentRun `runId` 或 runner Job。runner pod 被删、Job 被重建或 lease 失效后的临时恢复可以创建 replacement run/job,但只有在复用同一 `SessionRef`/PVC/thread、没有拼接历史 prompt 且 assistant 能看到前序上下文时,才算 session 持久化恢复证据;它不替代 runner reuse window 内复用同一 run/runner 的长期目标。
|
||||
|
||||
## Provider Profile 与 Child Agent 继承
|
||||
|
||||
Nested/child `hwlab-code-agent spawn` 的 provider profile 继承只走环境变量通道。有效来源和优先级固定为:
|
||||
|
||||
1. 显式 `spawn --profile <profile>`。
|
||||
2. runner 环境变量 `HWLAB_CODE_AGENT_PROVIDER_PROFILE`。
|
||||
|
||||
未提供这两项时,`spawn` 必须 fail fast 返回 `provider_profile_required`。不得从 `skills/hwlab-code-agent/config.json`、账号 workspace、Cloud API 默认值、runner 默认 `deepseek`、历史 session、模型名或 profile 静态 allowlist 推断 child profile;也不得用 silent fallback 掩盖缺失配置。
|
||||
|
||||
Parent -> child 传播链固定如下:外层 HWLAB request/session 解析出 `providerProfile` -> Cloud API/AgentRun adapter 解析当前 AgentRun `backendProfile` -> runner job `transientEnv` 注入 `HWLAB_CODE_AGENT_PROVIDER_PROFILE=<backendProfile>` 和 `HWLAB_CODE_AGENT_PARENT_TRACE_ID=<traceId>` -> runner 内的 `hwlab-code-agent spawn` 在没有显式 `--profile` 时读取该环境变量。`HWLAB_CODE_AGENT_PARENT_TRACE_ID` 只用于 trace/diagnostic 关联,不参与 profile 选择。
|
||||
|
||||
可见性必须跟随同一链路:`spawn` JSON 输出暴露 `resolvedProviderProfile`、`profileSource` 和 `parentTraceId`;child trace/result 必须暴露真实 `providerProfile/backendProfile`、AgentRun infrastructure backend、provider 和 model。CaseRun `d601-f103-v2-leader-review` 使用 `dsflash-go` 时,Leader -> Coder/Reviewer child traces 应落到 `trc_dsflash-go_*`,child result backend 为 `agentrun-v01/dsflash-go`,model 为 `deepseek-v4-flash`,并由 compile check 与 reviewer verdict 形成业务通过证据。
|
||||
|
||||
Provider profile slug 与配置是 AgentRun profile 管理数据,不是 Cloud API/Web 每次新增 slug 都要修改代码的枚举。HWLAB 已鉴权 CLI/Web/API 通过 [spec-v02-provider-management.md](spec-v02-provider-management.md) 委托 AgentRun 管理 profile config/credential/validate;只有共享运行面、bridge、SecretRef 约定或镜像变化才进入 GitOps/CI/CD。
|
||||
|
||||
## 架构混乱处理
|
||||
|
||||
- 临时处理:排查 CLI/Web/Cloud API/AgentRun 对 session、project、provider 或 run/job 的口径不一致时,先收集 HWLAB session status、workspace selection、trace/result、AgentRun run/job env、`SessionRef`、PVC phase 和 command events;以单变量热补丁证明最小链路,再回到源码 PR/CI/CD/原入口复测。不得通过长 prompt、历史 messages、fake `thread/resume:completed`、放宽 tenant policy 或手工改 DB lease 来掩盖缺口。
|
||||
@@ -25,7 +40,7 @@
|
||||
|
||||
## Credential 边界
|
||||
|
||||
- Provider credential 只通过 `executionPolicy.secretScope.providerCredentials[]` 的 AgentRun provider SecretRef 引用,默认随 `backendProfile` 选择 `agentrun-v01-provider-deepseek`、`agentrun-v01-provider-codex` 或 `agentrun-v01-provider-minimax-m3`。
|
||||
- Provider credential 只通过 `executionPolicy.secretScope.providerCredentials[]` 的 AgentRun provider SecretRef 引用。默认 SecretRef 随 `backendProfile` 解析为 `agentrun-v01-provider-<backendProfile>`;历史 alias 只允许表达已有 Secret 命名事实,例如 `codex-api -> codex`。动态 profile(如 `dsflash-go`)不得要求 HWLAB service 代码新增 allowlist 后才能 dispatch。
|
||||
- Provider API Key 的 Web 配置面归属 HWLAB `v0.2` 管理页,HWLAB Cloud API 通过已鉴权的管理接口委托 AgentRun 后端更新 profile Secret/配置;dispatch 路径只消费 AgentRun 返回的 SecretRef,不接收浏览器提交的 API Key 原文。完整管理规格见 [spec-v02-provider-management.md](spec-v02-provider-management.md)。
|
||||
- GitHub PR/issue 能力通过 `toolCredentials[].tool=github` 注入,默认 SecretRef 是 `agentrun-v01-tool-github-pr` key `GH_TOKEN`。
|
||||
- UniDesk SSH passthrough 通过 `toolCredentials[].tool=unidesk-ssh` 注入,默认 SecretRef 是 `agentrun-v01-tool-unidesk-ssh` key `UNIDESK_SSH_CLIENT_TOKEN`。
|
||||
@@ -49,5 +64,5 @@
|
||||
- 源码合同测试:`node --test internal/agent/agentrun-dispatch.test.mjs`。
|
||||
- 语法检查:`node --check internal/agent/agentrun-dispatch.mjs && node --check internal/agent/agentrun-dispatch.test.mjs`。
|
||||
- 合同必须证明 `UNIDESK_SSH_CLIENT_TOKEN` 不出现在 `transientEnv`,GitHub/UniDesk SSH 能力都通过 AgentRun `toolCredentials` SecretRef 装配,且 runner resource bundle 默认暴露 `hwpod`、`unidesk-ssh`、`promptRefs` 和 `skillRefs`。
|
||||
- 真实 CLI 验收默认使用短 prompt 走 `backendProfile=deepseek`:首轮 prompt “不调用工具的情况下,你可见的 skill 有哪些?”应能回答 HWLAB bundle skill;同一会话 continuation 应显示 AgentRun 原生 resume 语义且不重复注入 initial prompt;“检查 HWPOD 状态”应触发 `hwpod inspect` 或等价 HWPOD node-ops 路径,若失败则报告正式 blocker,不切换 fallback。
|
||||
- 如果 DeepSeek profile 的 trace 明确失败为 AgentRun `provider-auth-failed`,且上游错误码或消息是 `INSUFFICIENT_BALANCE` / account balance 不足,则该次 CLI 验收改用 `--provider-profile minimax-m3` 继续执行同一短 prompt 组。这个规则只替换 provider profile,不替换 AgentRun 装配标准:仍必须使用同一个 `ResourceBundleRef`、`promptRefs`、`skillRefs`、`toolAliases`、Codex stdio `thread/start` / `thread/resume`,不得拼接历史上下文,不得切回旧 HWLAB prompt/skill 注入方式,也不得用 codex-api、generic shell、gateway shell 或诊断镜像作为替代验收。
|
||||
- 真实 CLI 验收必须使用目标 profile 显式创建 session,例如 `--provider-profile dsflash-go`,再发送至少一个不传 `--provider-profile` 的 turn,证明 send 继承 session profile;不得因为某个 provider 失败自动切换 profile 并把结果记为原 profile 通过。
|
||||
- Nested profile 继承验收必须覆盖 runner env:父 AgentRun result/trace 显示目标 `backendProfile`,child `spawn` 输出 `resolvedProviderProfile=<profile>`、`profileSource=env`、`parentTraceId=<outerTraceId>`,child trace/result 使用同一个 profile/model/backend。缺少任意字段时先修可见性,不新增旧 fallback、旧门禁或兼容分支。
|
||||
|
||||
@@ -151,8 +151,8 @@ stderr/error 或 turn/status 边界。
|
||||
|
||||
Code Agent 工作台状态必须跨浏览器刷新持久化。前端至少保存
|
||||
`conversationId/sessionId/threadId/sessionStatus`、最近消息、traceId 和必要的 runtime
|
||||
摘要,刷新或重新打开页面后继续使用同一 repo-owned Codex session/thread 和固定
|
||||
workspace;除非 Pod 重建、Codex supervisor 重启、用户显式清空对话或登出,不得把下一轮
|
||||
摘要,刷新或重新打开页面后继续使用同一 HWLAB session/thread 和 AgentRun `SessionRef`/PVC
|
||||
workspace;除非运行面无法恢复或用户显式清空对话或登出,不得把下一轮
|
||||
请求降级成“首轮新会话”。登录态采用 server cookie 与本地 session 双轨:server session
|
||||
可用时优先使用;server 内存 session 因 Pod/replica 切换丢失时,只要本地 session 未过期,
|
||||
刷新页面不得要求用户重新登录。
|
||||
|
||||
@@ -18,11 +18,7 @@ Secret 或 token。
|
||||
|
||||
## Provider 前置条件
|
||||
|
||||
当前 DEV 部署合同中 `hwlab-cloud-api` 的 Code Agent provider 是
|
||||
`HWLAB_CODE_AGENT_PROVIDER=codex-stdio`。运行时必须具备 repo-owned Codex app-server
|
||||
stdio session supervisor,并证明 `/workspace/hwlab` 可读写、`CODEX_HOME=/codex-home`
|
||||
可写、`/app/node_modules/.bin/codex --version` 可执行、`codex app-server --listen stdio://`
|
||||
可创建和复用同一个 Codex thread/session。
|
||||
当前 v0.2 部署合同中,`hwlab-cloud-api` 把 Code Agent 执行委托给 AgentRun `v0.1`。运行时必须具备可用的 AgentRun manager、runner job、`ResourceBundleRef`、`SessionRef`/PVC、profile SecretRef 和目标 backend profile;如果该 backend 使用 Codex app-server,runner 内还必须证明 workspace、`CODEX_HOME`、Codex binary 和 native thread/session continuation 可用。Per-profile config/credential/dynamic slug 管理见 [spec-v02-provider-management.md](spec-v02-provider-management.md),dispatch/session/child inheritance 见 [agentrun-code-agent-dispatch.md](agentrun-code-agent-dispatch.md)。
|
||||
|
||||
Codex token boundary 仍由授权路径把 `OPENAI_API_KEY` 注入到 DEV runtime。DEV Pod
|
||||
不能直接指向 public `api.openai.com`。G14 默认 `deepseek` profile 指向
|
||||
@@ -49,10 +45,7 @@ report、issue、PR 或截图。
|
||||
|
||||
## Provider 切换排查方法论
|
||||
|
||||
Provider/profile 切换故障必须先在目标 pod/host 上打通最小真实闭环,再进入完整 CI/CD、
|
||||
GitOps render 或正式发布。`deepseek`、`codex-api` 和未来 provider 共享 cloud-api 会话与
|
||||
Workbench UI,但排查时必须把 profile overlay、认证、网络、模型、Codex CLI/app-server
|
||||
逐层拆开,避免用一个 profile 的成功掩盖另一个 profile 的退化。
|
||||
Provider/profile 切换故障必须先在目标 pod/host 上打通最小真实闭环。普通 profile config/credential/validate 走 AgentRun 管理 API,不进入 GitOps render 或服务发布;只有共享 bridge/forwarder/runtime/env/SecretRef plumbing 变化才进入 CI/CD。`deepseek`、`dsflash-go`、`codex-api` 和未来 provider 共享 cloud-api 会话与 Workbench UI,但排查时必须把 profile config、SecretRef、认证、网络、模型、AgentRun runner 和 Codex CLI/app-server(若适用)逐层拆开,避免用一个 profile 的成功掩盖另一个 profile 的退化。
|
||||
|
||||
最小闭环按以下顺序分层,任何一层失败都不能跳到正式 CI/CD 试错:
|
||||
|
||||
@@ -73,9 +66,7 @@ Workbench UI,但排查时必须把 profile overlay、认证、网络、模型
|
||||
`network_proxy: None`,必须在同一个目标 Pod 内增加只监听 `127.0.0.1` 的临时 forwarder,使用同一份
|
||||
auth、同一模型和同一 prompt 复测 `codex exec` 与 `/v1/agent/chat`。forwarder 只能把流量转到可配置的
|
||||
hyueapi upstream,不能硬编码 D601 IP,也不能复用 DeepSeek bridge。
|
||||
7. App-server 闭环:最终证据必须来自 repo-owned Codex app-server stdio 或明确批准的等价
|
||||
long-lived runner,返回 `completed` 且 `reply.content` 非空。Node/raw HTTPS、stub、bridge、
|
||||
source-only smoke、前端状态都不能升级成 DEV-LIVE reply pass。
|
||||
7. AgentRun command 闭环:最终证据必须来自真实 AgentRun command result,返回 `completed` 且 final assistant reply 非空,并暴露真实 backend/profile/provider/model。Node/raw HTTPS、stub、bridge、source-only smoke、前端状态都不能升级成 DEV-LIVE reply pass。
|
||||
|
||||
排查记录应保留稳定结论和判定方法,不写 Secret、一次性 trace 全文或日期化流水账。遇到
|
||||
“裸 API 通过但 Codex CLI/app-server 失败”时,优先抓 Codex/Rust transport 日志并与 D601 成功
|
||||
@@ -147,8 +138,7 @@ Forwarder 不需要人工维护长驻进程。正式固化后,它应由 Kubern
|
||||
| 观测结果 | readiness |
|
||||
| --- | --- |
|
||||
| `status: "failed"`,`error.code: "provider_unavailable"`,且 `error.missingEnv` 包含 `OPENAI_API_KEY` | `BLOCKED/credential`;provider 凭证缺失,不能标真实回复通过。 |
|
||||
| `provider: "codex-readonly-runner"` 或 `sessionMode: "controlled-readonly-session-registry"` | 历史只读状态,只能作为 `BLOCKED/not-codex-stdio` 诊断;不能满足当前自然语言单一路由或 DEV-LIVE reply pass。 |
|
||||
| `codexStdioFeasibility.status: "blocked"`,或 blocker 包含 `codex_cli_binary_missing`、`codex_cli_not_executable`、`codex_cli_native_dependency_missing`、`runner_lifecycle_missing`、`stdio_protocol_not_wired`、`workspace_mount_missing`、`workspace_write_boundary_blocked`、`codex_home_missing`、`codex_home_write_blocked`、`provider_token_boundary` | 真实 Codex stdio / 等价 long-lived runner 未具备;必须按 blocker 处理,不能表述为完整 Codex session。 |
|
||||
| AgentRun dispatch/runner/profile blocker,或 blocker 包含 `runner_lifecycle_missing`、`workspace_mount_missing`、`workspace_write_boundary_blocked`、`codex_cli_binary_missing`、`codex_cli_not_executable`、`codex_home_missing`、`provider_token_boundary` | 真实 AgentRun runner / backend profile 未具备;必须按 blocker 处理,不能表述为完整 Code Agent session。 |
|
||||
| `status: "completed"`,但来自 mock、fixture、本地 stub、source-only smoke、浏览器本地回显或人工拼接 | 不是 DEV-LIVE reply pass。 |
|
||||
| 真实 DEV `POST /v1/agent/chat` 返回 `status: "completed"`,且 `reply.content` 是非空 assistant 回复 | 可标 DEV-LIVE reply pass。 |
|
||||
| 传输失败、schema 不完整、HTTP 非预期、`reply.content` 为空或缺失 | `BLOCKED`,按 runtime/schema/transport 分析。 |
|
||||
@@ -156,7 +146,7 @@ Forwarder 不需要人工维护长驻进程。正式固化后,它应由 Kubern
|
||||
只有“真实 DEV 路由 + `completed` + 非空 assistant reply”能作为 DEV-LIVE 回复通过依据。
|
||||
不得把 mock、fixture、本地 echo、source report、静态检查或前端状态当作通过。
|
||||
|
||||
AgentRun 接入后,`agentrun-v01` 只能表示执行基础设施,不等同于真实 provider/model。Code Agent result `completed` 要被 Web 或 CLI 标记为真实完成,必须同时具备 final assistant response、真实 provider/model、`providerTrace`、traceId、conversationId/sessionId 和可回放 trace;否则应显示“完成证据不足”,不能用 SOURCE、fixture、echo、mock 或 stub 补齐。AgentRun adapter 应把真实执行形态暴露为 `codex-stdio` / Codex app-server stdio 等价长会话,把 `agentrun-v01` 保留在 adapter、runner 或 infrastructure 字段里。
|
||||
`agentrun-v01` 只能表示执行基础设施,不等同于真实 provider/model。Code Agent result `completed` 要被 Web 或 CLI 标记为真实完成,必须同时具备 final assistant response、真实 provider/model/backend profile、`providerTrace`、traceId、conversationId/sessionId 和可回放 trace;否则应显示“完成证据不足”,不能用 SOURCE、fixture、echo、mock 或 stub 补齐。AgentRun adapter 应把真实执行形态暴露为具体 backend profile,例如 `dsflash-go`、`deepseek`、`codex-api` 或 `minimax-m3`,把 `agentrun-v01` 保留在 adapter、runner 或 infrastructure 字段里。
|
||||
|
||||
同一 conversation/session 的后续消息必须在 AgentRun runner reuse window 有效时进入既有 run/runner 的新 command/turn,避免每次消息都重新 bundle、重新启动 runner、再把历史 thread 当作新 runner 可 resume 的 rollout。每条消息都重新 bundle 或启动新 runner 是功能缺口,不得只靠 trace 说明包装成通过。只有 run 已 terminal、runner reuse window 过期或 AgentRun manager 明确拒绝复用时才允许新建 runner;trace/result 可以说明原因,但该说明只是诊断证据,不替代复用能力本身。
|
||||
|
||||
@@ -164,18 +154,17 @@ Trace 展示问题按“同源 row 转换优先”排查:先用 `hwlab-cli cli
|
||||
|
||||
## 自然语言单一路由
|
||||
|
||||
`/v1/agent/chat` 的自然语言请求唯一执行路径是 repo-owned Codex stdio long-lived
|
||||
session。cloud-api 不再把自然语言预分类到 M3 Skill CLI、`/v1/m3/io`、
|
||||
`/v1/agent/chat` 的自然语言请求唯一执行路径是 AgentRun v0.1 delegated Code Agent command。cloud-api 不再把自然语言预分类到 M3 Skill CLI、`/v1/m3/io`、
|
||||
`external.network.check`、`session_context`、`security.hardware-boundary`、
|
||||
`hardware.invoke.shell` shortcut 或 OpenAI text fallback。
|
||||
|
||||
自然语言里即使出现 M3、DO/DI、DAP、PWM、gateway、box-simu、patch-panel、Keil、
|
||||
serial-monitor、Windows skill、串口、下载、烧录、启动日志等词,也必须把完整请求交给
|
||||
Codex stdio turn。Codex turn 自己根据仓库、skill 文档和可用工具决定调用 repo wrapper、
|
||||
AgentRun Code Agent turn。Agent turn 自己根据仓库、skill 文档和可用工具决定调用 repo wrapper、
|
||||
Windows skill CLI、项目脚本或其他真实可达路径;cloud-api 只负责 session 生命周期、trace、
|
||||
result 轮询和 schema 化返回。
|
||||
|
||||
如果 Codex stdio 不具备运行条件,`/v1/agent/chat` 只能返回 Codex stdio readiness
|
||||
如果 AgentRun Code Agent 不具备运行条件,`/v1/agent/chat` 只能返回 AgentRun readiness
|
||||
blocker,不能降级到 M3 Skill CLI、受控硬件 shortcut、外网专用检查或普通 OpenAI 文本回复。
|
||||
显式 `/v1/m3/io` 控制面可以作为独立 API 或 UI 控制面继续存在,但聊天自然语言不得自动路由
|
||||
到该 API,也不得保留要求自然语言先满足 M3 白名单的源码检查或测试。该显式控制面也不得在
|
||||
@@ -183,13 +172,12 @@ blocker,不能降级到 M3 Skill CLI、受控硬件 shortcut、外网专用检
|
||||
返回执行失败,但不能由 cloud-api 用旧白名单提前拒绝。
|
||||
|
||||
显式持久 session 是默认合同:用户、Workbench 或 CLI 必须先显式创建或选择 Code Agent
|
||||
session,之后同一个 `conversationId/sessionId` 才能映射到 repo-owned Codex thread 和固定
|
||||
workspace。刷新前端、重新打开页面或短连接 result 轮询只能恢复已显式选中的 session,
|
||||
session,之后同一个 `conversationId/sessionId` 才能映射到 AgentRun `SessionRef`/PVC/thread 和固定 workspace。刷新前端、重新打开页面或短连接 result 轮询只能恢复已显式选中的 session,
|
||||
不得创建新的短期 runner,也不得在无 session 时自动生成 `conversationId/sessionId/threadId`。
|
||||
没有已选 session 时,`/v1/agent/chat` 必须返回 `session_required`;session failed/stale/canceled
|
||||
时必须返回 `session_not_usable` 或等价 blocker。失败 session 保留 trace、thread、partial output
|
||||
和错误证据,不自动滚动、不隐式清理后继续;继续工作前必须显式创建或选择另一个 session。
|
||||
除非 Pod 重建或 Codex supervisor 明确重启,usable session 的 workspace、thread/session 绑定和
|
||||
除非运行面无法恢复,usable session 的 workspace、thread/session 绑定和
|
||||
可见 trace 应持续存在。Workbench 前端可以持久化这些会话标识和最近消息,但只作为显式 session
|
||||
selection 的缓存;用户显式清空对话或登出时才清除该本地状态。
|
||||
|
||||
@@ -213,9 +201,9 @@ Workbench trace 对已知 JSON-RPC gateway 响应应按普通 tool call 展示
|
||||
|
||||
## 短连接 result 轮询
|
||||
|
||||
## Codex app-server stdio 请求处理与 trace 可见性
|
||||
## AgentRun/Codex Runner 请求处理与 trace 可见性
|
||||
|
||||
repo-owned Codex app-server stdio client 必须把 app-server 发来的 JSON-RPC client request 当作一等协议处理,不能只等待 notification。请求 id 可能是数字也可能是字符串;只支持数字 id 会导致 approval/requestUserInput 等请求永远得不到响应,最终表现为已有 assistant partial output 后卡在 `waitingFor=app-server-notification`,直到 idle timeout。
|
||||
当 AgentRun backend 使用 Codex app-server stdio 时,runner client 必须把 app-server 发来的 JSON-RPC client request 当作一等协议处理,不能只等待 notification。请求 id 可能是数字也可能是字符串;只支持数字 id 会导致 approval/requestUserInput 等请求永远得不到响应,最终表现为已有 assistant partial output 后卡在 `waitingFor=app-server-notification`,直到 idle timeout。
|
||||
|
||||
非交互 HWLAB Code Agent 的处理规则如下:
|
||||
|
||||
|
||||
@@ -126,19 +126,7 @@ treat them as desired DEV DB endpoints.
|
||||
|
||||
## Code Agent Provider Contract
|
||||
|
||||
`hwlab-cloud-api` runs the DEV Code Agent provider through repo-owned Codex MCP
|
||||
stdio sessions. Source-controlled manifests must declare only env names, Secret
|
||||
references, and non-secret egress/runtime settings:
|
||||
|
||||
| Field | Value |
|
||||
| --- | --- |
|
||||
| Provider env | `HWLAB_CODE_AGENT_PROVIDER=codex-stdio` |
|
||||
| Model env | `HWLAB_CODE_AGENT_MODEL=gpt-5.5` |
|
||||
| Provider Secret | `OPENAI_API_KEY` from `hwlab-code-agent-provider/openai-api-key` |
|
||||
| DEV egress/base URL | 按 profile 独立配置;`deepseek` 走集群 bridge,`codex-api` 走同 Pod loopback forwarder,forwarder 直连 hyueapi 且必须保留 `NO_PROXY` |
|
||||
| Workspace | `HWLAB_CODE_AGENT_CODEX_WORKSPACE=/workspace/hwlab` with `workspace-write` sandbox |
|
||||
| Codex state | `CODEX_HOME=/codex-home` |
|
||||
| Codex command | `HWLAB_CODE_AGENT_CODEX_COMMAND=/app/node_modules/.bin/codex` |
|
||||
DEV Code Agent execution is delegated to AgentRun `v0.1`; source-controlled manifests declare only shared env names, SecretRef plumbing, workspace/runtime settings and non-secret egress settings. Per-profile config/credential/dynamic slug authority is [spec-v02-provider-management.md](spec-v02-provider-management.md); dispatch/session/child inheritance authority is [agentrun-code-agent-dispatch.md](agentrun-code-agent-dispatch.md). Dynamic profile changes such as `dsflash-go` are AgentRun profile data, not HWLAB service code changes.
|
||||
|
||||
DEV pods must not call `https://api.openai.com/v1/responses` directly. G14
|
||||
`codex-api` must send Codex CLI/app-server traffic to a same-Pod `127.0.0.1`
|
||||
|
||||
@@ -111,19 +111,13 @@ G14 CI/CD 加速的第一判定标准不是 PipelineRun 总耗时单点变短,
|
||||
|
||||
## Code Agent Provider Profiles
|
||||
|
||||
G14 Code Agent 通过同一个 repo-owned Codex app-server stdio runner 承载多个 OpenAI-compatible Responses profile。Cloud Web 每次请求都发送 `providerProfile`,后端按 profile 生成本次请求的 env overlay;不得把某一个模型通道硬写死到全局运行态而删除另一个通道。
|
||||
G14/v0.2 Code Agent 执行委托给 AgentRun `v0.1`。Per-profile config、credential、dynamic slug 和 validate 的唯一管理规格见 [spec-v02-provider-management.md](spec-v02-provider-management.md);session dispatch 与 nested child `spawn` env-only 继承规则见 [agentrun-code-agent-dispatch.md](agentrun-code-agent-dispatch.md)。GitOps 只管理共享运行面、bridge/forwarder、NO_PROXY、SecretRef 约定和镜像;新增或调整普通 provider profile slug 不应为了静态 allowlist 修改 Cloud API/Web 服务代码,也不应因此单独触发 CI/CD。
|
||||
|
||||
| Profile | 默认 | Model | Base URL | 说明 |
|
||||
| --- | --- | --- | --- | --- |
|
||||
| `deepseek` | 是 | `HWLAB_CODE_AGENT_DEEPSEEK_MODEL`,默认 `deepseek-chat` | `HWLAB_CODE_AGENT_DEEPSEEK_BASE_URL`,默认 `http://hwlab-deepseek-proxy.<namespace>.svc.cluster.local:4000/v1/responses` | G14 集群内 DeepSeek Responses bridge;Service 4000 先进入 `hwlab-deepseek-responses-bridge`,再转发到同 Pod 内 Moon Bridge 4001。 |
|
||||
| `codex-api` | 否 | `HWLAB_CODE_AGENT_CODEX_API_MODEL`,默认 `gpt-5.5` | `HWLAB_CODE_AGENT_CODEX_API_BASE_URL`,G14 默认应指向同 Pod `127.0.0.1` loopback forwarder,forwarder upstream 为 hyueapi | 独立 Codex/OpenAI-compatible Responses API 通道;不得依赖 DeepSeek bridge。 |
|
||||
| `minimax-m3` | 否 | `HWLAB_CODE_AGENT_MINIMAX_M3_MODEL`,默认 `MiniMax-M3` | 不由 HWLAB 配置;由 AgentRun `backendProfile=minimax-m3` 的 Secret/profile 承接 | HWLAB 只把该 profile 委托给 AgentRun v0.1,不在 HWLAB 新增 MiniMax API key、base URL、proxy 或 provider 实现。 |
|
||||
|
||||
`hwlab-cloud-api` 仍以 `HWLAB_CODE_AGENT_PROVIDER=codex-stdio` 运行。`HWLAB_CODE_AGENT_MODEL` 与 `HWLAB_CODE_AGENT_OPENAI_BASE_URL` 可作为 runtime-default 兜底,但前端默认 profile 是 `deepseek`,用户可以切到 `codex-api` 或 `minimax-m3`。Codex app-server 启动参数必须同时设置 provider base URL、provider `name`、`model` 和 `review_model`,否则 Codex/DeepSeek 链路可能在模型目录或 `/v1/responses` 阶段退化成 `model=None`。`minimax-m3` 是 AgentRun 委托 profile,HWLAB 只负责把用户选择透传为 AgentRun `backendProfile=minimax-m3`,不得为了该 profile 在 HWLAB 里重新读取 MiniMax Secret 或维护第二套 provider bridge。HWLAB 对外的 conversation/session/thread 合同不随 AgentRun backend 切换而改变;adapter 内部传给 AgentRun 的 `sessionRef.sessionId` 必须按 `backendProfile` 分域,`accessController` 持久化记录仍以 HWLAB 原始 session 归属为准,嵌套 `agentRun.sessionId` 保存 AgentRun scoped sessionRef。G14 cloud-api 的 `NO_PROXY/no_proxy` 必须包含 `hyueapi.com` 和 `.hyueapi.com`;`codex-api` 的 hyueapi upstream 由同 Pod loopback forwarder 直连,不能被 proxy 注入污染。
|
||||
当前 profile 示例不是静态枚举:`deepseek` 通过集群内 DeepSeek Responses bridge/Moon Bridge,`dsflash-go` 等动态 slug 由 AgentRun profile config/SecretRef 承接,`codex-api` 使用同 Pod loopback forwarder 直连 hyueapi,`minimax-m3` 由 AgentRun `backendProfile=minimax-m3` 承接。HWLAB 对外的 conversation/session/thread 合同不随 AgentRun backend 切换而改变;adapter 内部传给 AgentRun 的 `sessionRef.sessionId` 必须按 `backendProfile` 分域,`accessController` 持久化记录仍以 HWLAB 原始 session 归属为准,嵌套 `agentRun.sessionId` 保存 AgentRun scoped sessionRef。G14 cloud-api 的 `NO_PROXY/no_proxy` 必须包含 `hyueapi.com` 和 `.hyueapi.com`;`codex-api` 的 hyueapi upstream 由同 Pod loopback forwarder 直连,不能被 proxy 注入污染。
|
||||
|
||||
G14 `codex-api` 不得把 `http://172.26.26.227:17680/v1/responses` 作为默认 base URL;该地址只保留为 D601 legacy Code Queue runner 或历史 egress 对照线索。G14 上的 `codex-api` 应先进入同 Pod `127.0.0.1` loopback forwarder,再由 forwarder 直连 `hyueapi.com` / `.hyueapi.com`;这两个域名必须同时进入 `NO_PROXY` 和 `no_proxy`。DeepSeek profile 可以通过集群内 bridge/Moon Bridge 转换,`codex-api` 不能用 DeepSeek bridge 伪装通过,也不能因为默认 profile 切到 DeepSeek 而删除或覆盖 `codex-api` 的独立模型、base URL、auth 和最小闭环验证。
|
||||
|
||||
Provider/profile 变更必须按 [Code Agent Chat Readiness Runbook](code-agent-chat-readiness.md) 的分层方法先做目标 pod 最小闭环:env/profile overlay、SecretRef/auth 结构、hyueapi direct NO_PROXY、裸 Responses API、D601 Code Queue runner 对照、loopback forwarder 对照、`codex exec --json`、最终 app-server stdio `completed` + 非空 reply。裸 HTTP/SSE 请求通过只能证明 upstream、认证和模型可用;没有 Codex CLI/app-server 通过前,不得进入正式 GitOps/CI/CD 发布,也不得把 Workbench 状态标成 DEV-LIVE reply pass。
|
||||
共享 bridge/forwarder/runtime 变更必须按 [Code Agent Chat Readiness Runbook](code-agent-chat-readiness.md) 的分层方法先做目标 pod 最小闭环。普通 AgentRun profile config/credential/validate 走 [spec-v02-provider-management.md](spec-v02-provider-management.md),不通过 GitOps render 或服务发布试错。裸 HTTP/SSE 请求通过只能证明 upstream、认证和模型可用;没有 AgentRun command result `completed` + 非空 reply 前,不得把 Workbench 状态标成 DEV-LIVE reply pass。
|
||||
|
||||
Codex app-server 当前要求 provider `wire_api="responses"`,不得把 DeepSeek profile 切到旧 `chat` wire API。DeepSeek profile 的真实 Responses 转换层固定使用 Moon Bridge;不要在 HWLAB 里手写完整 Responses-to-Chat/Anthropic 转换器,因为这会破坏 Moon Bridge 对 prompt cache、tool-result 顺序和模型目录的成熟处理。Codex 发往 `/v1/responses` 的请求体可能带 `Content-Encoding: zstd`,而 Moon Bridge 不负责解压 Codex zstd body。因此 GitOps 中的 `hwlab-deepseek-proxy` Pod 必须包含 repo-owned `hwlab-deepseek-responses-bridge` sidecar:Service 端口 4000 指向 bridge,bridge 只做 zstd request body 解压、删除 `Content-Encoding`/重写 `Content-Length`、丢弃非 `function` tool 类型和 Codex-style `GET /v1/models` 目录适配,再把请求转发给 4001 的 Moon Bridge。DeepSeek API 只接受 `function` tools,bridge 必须在转发前丢弃 Codex Responses 请求里的非 `function` tool 类型(例如 `web_search`、`image_generation`),但不得移除 shell/apply-patch 等 function tools。模型、cache、tool 调用顺序、密钥和真实推理仍由 Moon Bridge 管理;bridge 不新增业务 gate,也不得把兼容失败伪装成 SOURCE/legacy blocker。
|
||||
|
||||
|
||||
@@ -33,7 +33,7 @@ Code Agent 第一版 skill 来源分为两类:预装 skill 读取镜像内只
|
||||
|
||||
## Code Agent 发现路径
|
||||
|
||||
- HWLAB 自有发现路径:`internal/cloud/codex-stdio-session-helpers.ts` 的 `discoverSkillsForStdio()` 读取 `HWLAB_CODE_AGENT_SKILLS_DIRS`,扫描每个目录下直接或一级子目录中的 `SKILL.md`,并把 `Current skills discovery facts` 注入 Codex prompt。
|
||||
- HWLAB 旧自有发现路径只作为历史兼容线索;当前 AgentRun 装配以 `ResourceBundleRef.skillRefs` 为权威,详见 [agentrun-code-agent-dispatch.md](agentrun-code-agent-dispatch.md)。
|
||||
- Codex 原生发现路径:Codex 会从工作区 `.agents/skills` 等标准位置加载 skill;因此 `hwlab-cloud-api` 必须准备 `/workspace/hwlab/.agents/skills` symlink 聚合目录,让 Codex 原生机制也能看到 `/app/skills` 与 `/data/user-skills` 中的 skill。
|
||||
- 两条发现路径都必须保留来源信息;同名 skill 不能因为 HWLAB 侧去重而消失。
|
||||
- AgentRun 装配发现路径:HWLAB v0.2 通过 AgentRun `ResourceBundleRef.skillRefs` 把 repo 内 `skills/hwpod-cli/SKILL.md`、`skills/hwpod-ctl/SKILL.md` 和 `skills/hwlab-agent-runtime/SKILL.md` 装配到 runner 工作区 `.agents/skills`。`GET /v1/skills` 必须额外返回 `agentRunAssembly` 摘要,包含 `skillRefs`、`promptRefs`、`toolAliases`、资源 bundle repo/branch/commit 和 `.agents/skills` 运行时装配目录;Cloud Web skills 面板必须展示该摘要,不能只展示 `/app/skills` 与 `/data/user-skills` 的静态列表。
|
||||
|
||||
@@ -20,7 +20,7 @@ Code Agent session 是显式资源,不再由普通 `client agent send`、Workb
|
||||
|
||||
- 无 Code Agent session 时,必须先显式创建 session,再发送 turn。CLI 目标入口为 `client agent session create`;Web 目标入口为“新建 session”显式动作;Cloud API 目标入口为 `POST /v1/agent/sessions`。session 创建返回 `conversationId/sessionId`,`threadId` 可以在首轮 turn 被 provider/AgentRun 建立后回写。
|
||||
- `client agent session create|select|status` 的默认 JSON 输出必须在顶层直接暴露 `sessionId`、`conversationId`、`threadId`、`providerProfile`、`sessionStatus` 和 `sessionUsable` 这类短连接脚本高频字段;完整原始响应仍保留在 `session` 或 `body` 中。人工和 agent 不应为了拿 sessionId 手写一次性 JSON 深挖脚本,也不应依赖 `sed`/`grep` 解析 JSON。
|
||||
- 显式 session 是 provider profile authority。`client agent session create --provider-profile <profile>` 创建的 session 后,`client agent send --session-id <sessionId>` 在未传 `--provider-profile` 时必须先读取该 session 并继承 `providerProfile`;显式 `--provider-profile` 只作为人工有意覆盖,必须在输出和 trace 中可见。workspace provider profile 只能在 workspace selected session 与本次目标 session 完全一致时作为 fallback,不能用旧 workspace 状态覆盖显式 session。
|
||||
- 显式 session 是用户入口的 provider profile authority。`client agent session create --provider-profile <profile>` 创建 session 后,`client agent send --session-id <sessionId>` 在未传 `--provider-profile` 时必须继承该 session 的 `providerProfile`;显式覆盖必须在输出和 trace 中可见。AgentRun dispatch、dynamic profile slug 和 nested child `spawn` env-only 继承的权威规则见 [agentrun-code-agent-dispatch.md](agentrun-code-agent-dispatch.md)。
|
||||
- `client agent send` 必须携带显式 `--session-id`,或使用此前通过 `client agent session create|select` 明确选中的 workspace session;没有显式或已选 session 时返回结构化 `session_required`,不能自动生成 `conversationId/sessionId/threadId`。
|
||||
- 显式传入新的 `--conversation-id` 时,如果没有同时显式 `--session-id` 或 `--from-trace` 恢复出的 session,CLI 不得从账号 workspace 继承旧 session;这种情况必须返回 `session_required`,提示先为该 conversation 创建或选择 session。只有显式 conversation 与 workspace 当前 conversation 完全一致时,才允许使用 workspace 中已显式选中的 session。
|
||||
- session 失败、`thread-resume-failed`、provider continuation 失效、用户取消或运行面中断时,当前 session 必须保留为 failed/stale/canceled 证据;系统不得自动滚动到新 session、不得隐式清理后继续,也不得把下一条普通消息路由到新 session。继续工作前必须显式创建或选择另一个 session。
|
||||
@@ -83,7 +83,9 @@ Code Agent session 是显式资源,不再由普通 `client agent send`、Workb
|
||||
| `hwlab-cli client access tools grant/revoke USER TOOL` | `PUT/DELETE /v1/admin/access/users/{userId}/tools/{toolId}/can-use` | 授予或撤销 `hwpod`、`unidesk_ssh`、`trans_cmd`、GitHub 写工具等 capability。 |
|
||||
| `hwlab-cli client access check --user USER --relation REL --object OBJECT` | `POST /v1/admin/access/check` | 管理员调试单次 authorization check,输出 decision 和 redacted actor/object。 |
|
||||
| `hwlab-cli client provider-profiles list` | `GET /v1/admin/provider-profiles` | 管理页的非视觉状态入口;输出 actor、profile、SecretRef、resourceVersion、hash 后缀和最近验证结果,不输出 API Key 或 Secret data。 |
|
||||
| `hwlab-cli client provider-profiles remove PROFILE` | `DELETE /v1/admin/provider-profiles/{profile}` | 删除遗留 provider profile;Cloud API 鉴权后委托 AgentRun 删除对应 Secret,内建 profile capability 保留、动态 slug 从列表消失。 |
|
||||
| `hwlab-cli client provider-profiles config PROFILE` | `GET /v1/admin/provider-profiles/{profile}/config` | 显式读取 AgentRun profile config 文本;不输出 credential value。 |
|
||||
| `hwlab-cli client provider-profiles set-config PROFILE --config-file FILE` | `PUT /v1/admin/provider-profiles/{profile}/config` | 写入 AgentRun profile config;新增动态 slug 不要求修改 Cloud API/Web 静态枚举。 |
|
||||
| `hwlab-cli client provider-profiles remove PROFILE` | `DELETE /v1/admin/provider-profiles/{profile}` | 删除遗留 provider profile;Cloud API 鉴权后委托 AgentRun 删除对应 Secret/配置,内建 profile capability 保留、动态 slug 从列表消失。 |
|
||||
| `hwlab-cli client provider-profiles set-key PROFILE --key-stdin` | `PUT /v1/admin/provider-profiles/{profile}/credential` | 从 stdin 写入 provider API Key,Cloud API 鉴权后委托 AgentRun;默认只输出 resourceVersion/hash 后缀和 failureKind。 |
|
||||
| `hwlab-cli client provider-profiles validate PROFILE --wait` | `POST /v1/admin/provider-profiles/{profile}/validate` + `GET /validations/{id}` | 触发 provider canary 并短连接轮询,输出 validationId、runId、commandId、jobName、traceId、status、failureKind 和 redacted bridge 摘要。 |
|
||||
| `hwlab-cli client request POST /v1/hwpod-node-ops` | `POST /v1/hwpod-node-ops` | HWPOD node-ops 同路径 smoke;Code Agent 侧正式业务入口仍是 `hwpod`,由 `hwpod-compiler-cli` 生成 node-ops。 |
|
||||
@@ -121,7 +123,7 @@ Code Agent session 是显式资源,不再由普通 `client agent send`、Workb
|
||||
|
||||
## T3
|
||||
|
||||
阅读 docs/reference/spec-v02-hwlab-cli.md,然后在 `G14:/root/hwlab-v02` 用 cli 手动测试以下内容:先运行 `client agent session create --provider-profile minimax-m3` 显式创建 session,再运行 `client agent send --session-id <sessionId> --message "在吗?" --wait --timeout-ms 120000`,确认 send 未传 `--provider-profile` 也继承 session 的 `providerProfile=minimax-m3`,响应包含 accepted/result/trace 信息和 assistant 回复文本。未先创建或选择 session 时,`client agent send --message "在吗?"` 必须返回结构化 `session_required`,不能自动创建 session。该验收默认使用 MiniMax-M3;如果是 DeepSeek 专项才切换 provider profile。
|
||||
阅读 docs/reference/spec-v02-hwlab-cli.md,然后在 `G14:/root/hwlab-v02` 用 cli 手动测试以下内容:先运行 `client agent session create --provider-profile dsflash-go` 显式创建 session,再运行 `client agent send --session-id <sessionId> --message "在吗?" --wait --timeout-ms 120000`,确认 send 未传 `--provider-profile` 也继承 session 的 `providerProfile=dsflash-go`,响应包含 accepted/result/trace 信息、真实 `deepseek-v4-flash` 模型和 assistant 回复文本。未先创建或选择 session 时,`client agent send --message "在吗?"` 必须返回结构化 `session_required`,不能自动创建 session。Nested child `spawn` 继承验收见 [agentrun-code-agent-dispatch.md](agentrun-code-agent-dispatch.md)。
|
||||
|
||||
## T3.1
|
||||
|
||||
@@ -153,7 +155,7 @@ Code Agent session 是显式资源,不再由普通 `client agent send`、Workb
|
||||
|
||||
## T5
|
||||
|
||||
阅读 docs/reference/spec-v02-hwlab-cli.md,然后在 `G14:/root/hwlab-v02` 用 cli 手动测试以下内容:运行 `client harness health`、`client harness submit --message "你好" --provider-profile deepseek --timeout-ms 120000`、`client harness wait <traceId>` 和 `client harness audit <traceId>`。确认它们全部是短连接 JSON 输出,不创建镜像、Job、CronJob、Deployment 或 hot-sync 写路径。
|
||||
阅读 docs/reference/spec-v02-hwlab-cli.md,然后在 `G14:/root/hwlab-v02` 用 cli 手动测试以下内容:运行 `client harness health`、`client harness submit --message "你好" --provider-profile dsflash-go --timeout-ms 120000`、`client harness wait <traceId>` 和 `client harness audit <traceId>`。确认它们全部是短连接 JSON 输出,不创建镜像、Job、CronJob、Deployment 或 hot-sync 写路径。
|
||||
|
||||
## T6
|
||||
|
||||
@@ -169,7 +171,7 @@ Code Agent session 是显式资源,不再由普通 `client agent send`、Workb
|
||||
|
||||
## T9
|
||||
|
||||
阅读 docs/reference/spec-v02-provider-management.md,然后在 runtime endpoint locked 环境下运行 `client provider-profiles list`、`client provider-profiles set-key deepseek --key-stdin` 和 `client provider-profiles validate deepseek --wait --timeout-ms 120000`。确认全部走 Cloud Web 同源 `19666` path,先由 HWLAB 鉴权再委托 AgentRun,输出 validationId/runId/commandId/jobName/traceId/resourceVersion/hash 后缀,不输出完整 API Key、Codex auth/config、Kubernetes Secret data 或 Authorization header;DeepSeek 验证必须走 Moon Bridge 到官方 upstream,不访问 hyue。
|
||||
阅读 docs/reference/spec-v02-provider-management.md,然后在 runtime endpoint locked 环境下运行 `client provider-profiles list`、`client provider-profiles config dsflash-go`、`client provider-profiles set-config dsflash-go --config-file <config.toml>`、`client provider-profiles set-key dsflash-go --key-stdin` 和 `client provider-profiles validate dsflash-go --wait --timeout-ms 120000`。确认全部走 Cloud Web 同源 `19666` path,先由 HWLAB 鉴权再委托 AgentRun,输出 validationId/runId/commandId/jobName/traceId/resourceVersion/hash 后缀,不输出完整 API Key、Codex auth.json、Kubernetes Secret data 或 Authorization header;显式读取的 config 不得包含 credential value。
|
||||
|
||||
## 规格的实现情况
|
||||
|
||||
|
||||
@@ -19,7 +19,7 @@ Provider API Key 管理属于 Cloud API 的 authenticated admin surface:前端
|
||||
- `internal/cloud/access-control.ts` 负责 `/auth/*`、OIDC callback、Web session、用户 API key、admin/user、tool capability 和 Code Agent owner binding;登录与鉴权 authority 见 [spec-v02-auth.md](spec-v02-auth.md)。当前本地 `/auth/login` 只作为 bootstrap fallback。
|
||||
- `internal/cloud/access-control.ts` 也是账号 workspace authority:`account_workspaces` 记录同一账号的 Workbench 当前 workspace、selected conversation/session、active trace、provider profile 和 revision。
|
||||
- Code Agent session 生命周期必须显式化。Cloud API 目标入口为 `POST /v1/agent/sessions` 创建 session、`GET/PATCH /v1/agent/sessions*` 查询/选择/标记状态;`POST /v1/agent/chat` 只接受显式传入或账号 workspace 中已显式选中的 usable session。没有 session 时返回 `session_required`,session failed/stale/canceled 时返回 `session_not_usable`,不得自动创建、滚动或替换 session。
|
||||
- Code Agent session record 是 provider profile authority。`POST /v1/agent/chat` 带显式 session 且请求未显式给出 provider profile 时,Cloud API 必须继承该 session 的 `providerProfile` 并映射为 AgentRun `backendProfile`;请求显式覆盖 provider profile 时,覆盖必须进入 trace/result 可见字段。账号 workspace 的 provider profile 只能在 selected session 与目标 session 完全一致时作为 fallback,不得让旧 workspace 覆盖显式 session。
|
||||
- Code Agent session record 是用户入口的 provider profile authority。`POST /v1/agent/chat` 带显式 session 且请求未显式给出 provider profile 时,Cloud API 必须继承该 session 的 `providerProfile` 并映射为 AgentRun `backendProfile`;请求显式覆盖 provider profile 时,覆盖必须进入 trace/result 可见字段。AgentRun dispatch、dynamic profile slug 和 nested child `spawn` env-only 继承的权威规则见 [agentrun-code-agent-dispatch.md](agentrun-code-agent-dispatch.md)。
|
||||
- `internal/db/runtime-store.ts` 和 `internal/cloud/db-contract.ts` 负责 Postgres runtime store 与 readiness 分层。
|
||||
- `internal/cloud/code-agent-*.ts` 负责 Codex stdio session、trace store、result cache、provider profile 和取消/轮询。
|
||||
- AgentRun dispatch 的 policy 字段由 Cloud API adapter 固定归一化:`tenantId=hwlab`、`projectId=pikasTech/HWLAB`、`providerId=G14`。Workbench project/workspace 只能作为 HWLAB metadata 或 `workspaceRef` 子字段保存,不能污染 AgentRun `projectId`;出现 project/tenant 混乱时,临时处理是修 adapter 字段映射并用真实运行面最小请求复测,不放宽 AgentRun manager policy。
|
||||
@@ -28,7 +28,7 @@ Provider API Key 管理属于 Cloud API 的 authenticated admin surface:前端
|
||||
- AgentRun completed 轮次续接必须依赖 Codex stdio 原生 session continuation。Cloud API 只把本轮原始 `message/prompt` 和显式 session 的标准 `conversationId/sessionId/threadId` 写入 AgentRun command payload 与 `SessionRef`;不得从请求、account workspace 或 account conversation 生成 `conversationContext`,不得把历史消息拼入 prompt,也不得把请求体里的 `conversationContext/messages` 当作模型上下文。历史 conversation facts 只用于 UI、inspect、trace 和 `--from-trace` 的可见性证据;收到 synthetic context 字段时只能记录 ignored trace 并剥离。`thread/resume` 失败时按 AgentRun `thread-resume-failed` 终止本轮并标记当前 session failed/stale,不自动创建新 session。
|
||||
- Code Agent 不允许存在 turn/session/conversation 总时长 timeout;只允许无新 app-server 响应、无 notification、无 assistant/tool/event activity 的 idle timeout。AgentRun command 失败、provider 失败或 idle timeout 只终结当前 command,并按 session policy 标记当前 session 状态;系统不得自动滚动到新 session。后续消息要么继续同一个 usable session/thread,要么由用户显式创建或选择另一个 session。
|
||||
- runner pod 被删、runner Job 被重建或旧 lease 失效后,同一 HWLAB session 的恢复判定必须基于同一个 `sessionId`、`threadId`、`providerProfile/backendProfile`、AgentRun `SessionRef` 和 PVC。replacement run/job 只能作为恢复执行壳;Cloud API 仍要把它映射为同一业务 session 的后续 turn,并在 trace/result 中分离业务 session identity 与执行 run/job identity。长期目标仍是在 runner reuse window 内复用同一 AgentRun run/runner。
|
||||
- Cloud API 通过 AgentRun v0.1 `runner-jobs.transientEnv` 传递本次 Code Agent turn 的短期上下文,例如 `HWLAB_RUNTIME_*`、`HWLAB_CODE_AGENT_ASSEMBLED_RUNTIME` 和映射到当前 session owner 的 `HWLAB_API_KEY`。`transientEnv` 不设固定 8 项上限,新增短期上下文时必须按 name 去重、只传本次 Job 需要的 value;`HWLAB_RUNTIME_API_URL` 必须指向当前 namespace 内的 `hwlab-cloud-api` Service,`HWLAB_RUNTIME_WEB_URL` 才指向 `hwlab-cloud-web`;`HWLAB_API_KEY` 必须对应当前 `agent_sessions.owner_user_id`,并继续禁止承载 GitHub token、provider key、长期 SSH key 或其他无关 credential;文档、日志和 trace 只允许保留脱敏后的 name、来源或摘要,不打印 Secret 值。
|
||||
- Cloud API 通过 AgentRun v0.1 `runner-jobs.transientEnv` 传递本次 Code Agent turn 的短期上下文,例如 `HWLAB_RUNTIME_*`、`HWLAB_CODE_AGENT_ASSEMBLED_RUNTIME`、`HWLAB_CODE_AGENT_PROVIDER_PROFILE`、`HWLAB_CODE_AGENT_PARENT_TRACE_ID` 和映射到当前 session owner 的 `HWLAB_API_KEY`。`transientEnv` 不设固定 8 项上限,新增短期上下文时必须按 name 去重、只传本次 Job 需要的 value;`HWLAB_RUNTIME_API_URL` 必须指向当前 namespace 内的 `hwlab-cloud-api` Service,`HWLAB_RUNTIME_WEB_URL` 才指向 `hwlab-cloud-web`;`HWLAB_API_KEY` 必须对应当前 `agent_sessions.owner_user_id`,并继续禁止承载 GitHub token、provider key、长期 SSH key 或其他无关 credential;文档、日志和 trace 只允许保留脱敏后的 name、来源或摘要,不打印 Secret 值。
|
||||
- AgentRun runner 工具环境注入必须经过 OpenFGA tool capability check。用户没有 `tool:hwpod#can_use` 时不注入可用 `HWLAB_API_KEY` 给 `hwpod`;没有 `tool:unidesk_ssh#can_use` 时不注入 UniDesk SSH token、route alias 或相关 helper;没有 `tool:trans_cmd#can_use` 时不暴露 trans cmd 透传入口;GitHub issue/PR 写工具也必须独立授权。工具授权不绕过 UniDesk route/operation 边界。
|
||||
- 同 Pod sidecar `hwlab-codex-api-forwarder` 监听 `127.0.0.1:49280/responses`,用于 `codex-api` profile 直连 hyueapi,并保持 hyueapi 在 `NO_PROXY` 中。
|
||||
- `hwlab-code-agent-workspace` PVC 挂载到 `/workspace/hwlab`,用于长会话 workspace;它是 cloud-api 运行资源,不是独立用户入口。
|
||||
@@ -105,7 +105,7 @@ OpenFGA、Access API、工具能力和 shadow/enforce 策略的最终规格见 [
|
||||
| 规格项 | 状态 | 说明 |
|
||||
| --- | --- | --- |
|
||||
| health/readiness | 已实现 | `/health/live` 汇总 DB、runtime、Code Agent 和 blocker。 |
|
||||
| Code Agent 短连接 submit/steer/result/trace/cancel | 已实现 | repo-owned Codex stdio、运行中 steer 和 provider profile 已接入。 |
|
||||
| Code Agent 短连接 submit/steer/result/trace/cancel | 已实现 | AgentRun v0.1 delegated execution、运行中 steer 和 provider profile 已接入。 |
|
||||
| 显式 Code Agent session 生命周期 | 目标状态 | `/v1/agent/sessions*` 管理 session create/select/status;`/v1/agent/chat` 无 session 时返回 `session_required`,失败 session 不自动滚动。 |
|
||||
| Postgres durable runtime | 已实现 | 通过 v02 独立 DB SecretRef 和 migration ledger 判定。 |
|
||||
| gateway outbound poll/result | 已实现 | 支持 gateway 主动轮询和 `hardware.invoke.shell` 分发。 |
|
||||
|
||||
@@ -17,7 +17,7 @@ Provider API Key 配置入口也归属 Cloud Web:左侧顶级导航必须提
|
||||
- Cloud Web 只承担浏览器 UI 和 `hwlab-cli client` 的同源代理。AgentRun runner 内的 `hwpod` 不走 Cloud Web;runner 使用映射到发起用户的 `HWLAB_API_KEY` 直连 Cloud API,Cloud Web 不保留 HWPOD 运行路由。
|
||||
- 浏览器启动后必须从 `GET /v1/workbench/workspace` hydrate 账号 workspace;同一个账号在多个浏览器标签页、多个浏览器或 CLI profile 中应看到同一个 `workspaceId`、selected conversation/session/thread、provider profile 和 active trace。浏览器 localStorage 只能作为短期缓存,并必须绑定 actor,不能作为 workspace authority。
|
||||
- Code Agent session 管理必须全部手动化。Workbench 可以从账号 workspace 恢复“已显式选中”的 session,但不能在普通发送、页面刷新、trace replay、失败恢复或 provider resume 失败时自动创建、滚动或替换 session。没有已选 session 时,composer 必须展示“新建 session/选择 session”的显式动作;session failed/stale/canceled 后必须保留失败证据,继续前由用户显式新建或选择另一个 session。
|
||||
- 显式 session 的 `providerProfile` 优先于账号 workspace provider profile。Workbench 可以展示 workspace 默认 provider,但对已选 session 发送 turn 时必须使用该 session 的 provider profile;用户想切换 provider 时,应显式创建或选择对应 provider 的 session,不能把旧 workspace provider 静默套到当前 session 上。
|
||||
- 显式 session 的 `providerProfile` 优先于账号 workspace provider profile。Workbench 可以展示 workspace 默认 provider,但对已选 session 发送 turn 时必须使用该 session 的 provider profile;用户想切换 provider 时,应显式创建或选择对应 provider 的 session。AgentRun dispatch、dynamic profile slug 和 nested child `spawn` env-only 继承的权威规则见 [agentrun-code-agent-dispatch.md](agentrun-code-agent-dispatch.md)。
|
||||
- Cloud Web trace 展示与 `hwlab-cli client agent trace --render web` 必须共享同一套 trace row 纯转换路径。Web 发生 row 顺序错乱、final response 缺失、assistant 消息被吞、tool call 只显示泛化占位或噪声事件淹没时,先用 CLI 输出同一渲染 row 摘要和 noise event count 复现;CLI 可复现说明是 trace row 转换问题,CLI 不可复现再进入 DOM/CSS/滚动状态调查。默认展示应压制 AgentRun backend echo、token/rate-limit/status/terminal echo 等低价值事件,但原始 trace JSON 仍必须保留用于 `--full`/下载排障。
|
||||
- Cloud Web Code Agent composer 必须无锁:运行中 turn 不得把输入框或发送按钮 disabled。浏览器提交时必须基于已显式选中的 session 工作;没有 session 时返回 `session_required` 并引导用户新建 session,不能自动开 session。存在 active running trace 时,用户显式 steer 动作走 `POST /v1/agent/chat/steer`;空闲且 session usable 时,用户显式发送 turn 走 `POST /v1/agent/chat`。`hwlab-cli client agent composer status` 必须能用同一 policy 输出 `sessionRequired`、`sessionUsable`、`submitMode=turn|steer`、`route` 和 `targetTraceId`。
|
||||
- Steer 是短连接控制动作,不是等待目标 turn terminal 的长请求。`POST /v1/agent/chat/steer` 在 cloud-api 成功创建 AgentRun `type=steer` command 后必须立即以 HTTP 202 返回,并在响应中暴露 `accepted=true`、`shortConnection=true`、`route=/v1/agent/chat/steer`、`traceId`、`steerTraceId`、`agentRun.runId`、`agentRun.targetCommandId` 和 `agentRun.steerCommandId`。接口不得为了 owner/session/workspace/conversation 持久化写回而延迟 202;这些写回失败只能作为后台可观测问题处理,不能把已 accepted 的 steer 重新标成请求失败。
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
# v0.2 Provider API Key 管理规格
|
||||
# v0.2 Provider Profile 管理规格
|
||||
|
||||
本文是 HWLAB `v0.2` 通过 WebUI 配置 AgentRun provider API Key 的长期规格。实施跟踪见 [pikasTech/HWLAB#917](https://github.com/pikasTech/HWLAB/issues/917),AgentRun 后端能力跟踪见 [pikasTech/agentrun#28](https://github.com/pikasTech/agentrun/issues/28)。
|
||||
本文是 HWLAB `v0.2` 通过 WebUI/CLI 配置 AgentRun provider profile、profile config、provider API Key 和 canary 的长期规格。实施跟踪见 [pikasTech/HWLAB#917](https://github.com/pikasTech/HWLAB/issues/917),AgentRun 后端能力跟踪见 [pikasTech/agentrun#28](https://github.com/pikasTech/agentrun/issues/28)。
|
||||
|
||||
## 设计目标
|
||||
|
||||
@@ -8,6 +8,7 @@
|
||||
- 继续使用 HWLAB 现有 Web session 与 CLI/API key 鉴权;浏览器用户不直接登录 AgentRun,也不直接调用 AgentRun。
|
||||
- HWLAB Cloud API 是浏览器同源入口,负责恢复 `AuthPrincipal`、执行业务授权和审计,然后把 provider profile 管理动作委托给 AgentRun 后端。
|
||||
- AgentRun 后端负责 provider profile 的 SecretRef、配置写入、状态查询和 canary 执行能力;AgentRun 信任来自 HWLAB 后端的服务端调用,不重新做用户级鉴权。
|
||||
- 新增或修改 provider profile 是管理面数据变更:已鉴权的 HWLAB Web/CLI/API 委托 AgentRun 写 profile config、credential 和 validate,不因每个新 slug 修改 Cloud API/Web 静态枚举、服务代码或触发专门 CI/CD。
|
||||
- API Key 全程只允许写入,不允许在 Web、CLI、日志、trace、issue、AgentRun event 或 API 响应中回显原文。
|
||||
|
||||
## 职责边界
|
||||
@@ -20,7 +21,7 @@
|
||||
| `hwlab-deepseek-proxy` | 作为 DeepSeek 官方 upstream 的 Moon Bridge;不承载用户管理 UI。 |
|
||||
| `hwlab-cli` | 提供管理页的非视觉同路径验收入口,走 HWLAB Cloud Web/Cloud API 同源 path。 |
|
||||
|
||||
HWLAB 不能代偿 AgentRun 后端缺失能力:如果 AgentRun 没有 provider profile status、write 或 validate API,HWLAB 只能返回清晰 blocker,不能直接写 AgentRun Secret、直接 patch Kubernetes,或伪造成功状态。AgentRun 也不能承接 HWLAB 用户鉴权:用户、角色、Web session、API key 和 OpenFGA 判断仍归 HWLAB。
|
||||
HWLAB 不能代偿 AgentRun 后端缺失能力:如果 AgentRun 没有 provider profile status、config write、credential write 或 validate API,HWLAB 只能返回清晰 blocker,不能直接写 AgentRun Secret、直接 patch Kubernetes,或伪造成功状态。AgentRun 也不能承接 HWLAB 用户鉴权:用户、角色、Web session、API key 和 OpenFGA 判断仍归 HWLAB。
|
||||
|
||||
## Web 管理页
|
||||
|
||||
@@ -51,17 +52,19 @@ view: provider API Key 管理
|
||||
GET /v1/provider-profiles
|
||||
GET /v1/admin/provider-profiles
|
||||
DELETE /v1/admin/provider-profiles/:profile
|
||||
GET /v1/admin/provider-profiles/:profile/config
|
||||
PUT /v1/admin/provider-profiles/:profile/config
|
||||
PUT /v1/admin/provider-profiles/:profile/credential
|
||||
POST /v1/admin/provider-profiles/:profile/validate
|
||||
GET /v1/admin/provider-profiles/:profile/validations/:validationId
|
||||
```
|
||||
|
||||
- `/v1/provider-profiles` 是已认证用户可读的公开 catalog,只返回工作台下拉选择所需的 `profile/configured/backendKind/bridge` 等非敏感字段,用于工作台和设置页展示动态 slug。
|
||||
- `/v1/admin/provider-profiles*` 继续是管理员管理入口,负责查看 SecretRef/resourceVersion/hash 后缀、删除旧 slug、写 key/config 和触发 validate。
|
||||
- `/v1/admin/provider-profiles*` 继续是管理员管理入口,负责查看 SecretRef/resourceVersion/hash 后缀、读取/写入 profile config、删除旧 slug、写 key 和触发 validate。
|
||||
|
||||
所有接口必须先通过 [spec-v02-auth.md](spec-v02-auth.md) 恢复 `AuthPrincipal`,再按 [spec-user-access.md](spec-user-access.md) 和 [spec-v02-openfga-authorization.md](spec-v02-openfga-authorization.md) 判定是否允许访问管理能力。首版允许只对 `admin` 开放;如果后续引入 `provider_manager` 或等价 relation,必须先写入用户权限规格。
|
||||
|
||||
响应必须是 JSON,且不得包含完整 API Key、Kubernetes Secret data、base64 Secret data、Codex `auth.json` 明文或 `config.toml` 明文。允许返回的字段包括:
|
||||
响应必须是 JSON,且不得包含完整 API Key、Kubernetes Secret data、base64 Secret data、Codex `auth.json` 明文或 credential value。`config.toml` 只允许在显式 admin config read 接口和 `hwlab-cli client provider-profiles config` 输出中返回;它必须只包含非 credential 配置,不能夹带 token/key。允许返回的字段包括:
|
||||
|
||||
- `profile`
|
||||
- `configured`
|
||||
@@ -69,6 +72,8 @@ GET /v1/admin/provider-profiles/:profile/validations/:validationId
|
||||
- `keyPrefix` 或不可逆 `keyHashSuffix`
|
||||
- `resourceVersion`
|
||||
- `updatedAt`
|
||||
- `configToml`、`configHashSuffix`、`configTomlPrinted`
|
||||
- `credentialValuesPrinted=false`
|
||||
- `validation.status/failureKind/message/runId/commandId/jobName/traceId`
|
||||
- `delegation.agentRunBaseUrl` 的脱敏摘要
|
||||
|
||||
@@ -91,7 +96,7 @@ HWLAB Cloud API 必须调用 AgentRun 后端的 provider profile 管理 API,
|
||||
}
|
||||
```
|
||||
|
||||
AgentRun 对该调用不做用户鉴权,但可以校验调用来源、tenant、profile allowlist 和 request schema。HWLAB 必须把 AgentRun 返回的 failureKind 原样保留到审计和前端响应中,不能把 AgentRun provider/Secret 错误改写成 HWLAB auth、HWPOD node-ops 或 Cloud Web 故障。
|
||||
AgentRun 对该调用不做用户鉴权,但可以校验调用来源、tenant、profile slug 格式和 request schema;不得要求 HWLAB 为每个新 slug 维护 Cloud API/Web 静态 allowlist。HWLAB 必须把 AgentRun 返回的 failureKind 原样保留到审计和前端响应中,不能把 AgentRun provider/Secret 错误改写成 HWLAB auth、HWPOD node-ops 或 Cloud Web 故障。
|
||||
|
||||
## DeepSeek v0.2 通道规则
|
||||
|
||||
@@ -117,14 +122,17 @@ AgentRun deepseek profile
|
||||
|
||||
```bash
|
||||
bun tools/hwlab-cli/bin/hwlab-cli.ts client provider-profiles list
|
||||
bun tools/hwlab-cli/bin/hwlab-cli.ts client provider-profiles remove ofcx-go
|
||||
bun tools/hwlab-cli/bin/hwlab-cli.ts client provider-profiles set-key deepseek --key-stdin
|
||||
bun tools/hwlab-cli/bin/hwlab-cli.ts client provider-profiles validate deepseek --wait --timeout-ms 120000
|
||||
bun tools/hwlab-cli/bin/hwlab-cli.ts client provider-profiles config dsflash-go
|
||||
bun tools/hwlab-cli/bin/hwlab-cli.ts client provider-profiles set-config dsflash-go --config-file /tmp/config.toml
|
||||
bun tools/hwlab-cli/bin/hwlab-cli.ts client provider-profiles set-key dsflash-go --key-stdin
|
||||
bun tools/hwlab-cli/bin/hwlab-cli.ts client provider-profiles validate dsflash-go --wait --timeout-ms 120000
|
||||
bun tools/hwlab-cli/bin/hwlab-cli.ts client provider-profiles remove PROFILE
|
||||
```
|
||||
|
||||
约束:
|
||||
|
||||
- CLI 默认只使用 `HWLAB_API_KEY` 恢复同一个 HWLAB actor;已登录 Web session 只允许作为显式 `--web-session`/`--cookie` 诊断入口,不作为 provider 管理命令的默认鉴权来源。
|
||||
- `config`/`set-config` 只处理 profile config 文本;config 不得包含 provider API Key、Codex `auth.json`、Authorization header 或 bearer token。
|
||||
- `set-key --key-stdin` 从 stdin 读取 API Key,默认输出只显示 hash/resourceVersion,不打印 key。
|
||||
- `remove PROFILE` 通过 Cloud API 委托 AgentRun 删除对应 profile Secret;内建 profile 删除后 capability 仍保留,动态 slug 删除后从列表消失。
|
||||
- `validate --wait` 短连接 submit-and-poll,输出 validationId、runId、commandId、jobName、traceId、status、failureKind 和 redacted bridge upstream 摘要。
|
||||
@@ -132,7 +140,7 @@ bun tools/hwlab-cli/bin/hwlab-cli.ts client provider-profiles validate deepseek
|
||||
|
||||
## 审计与脱敏
|
||||
|
||||
HWLAB 审计日志记录:actor、profile、动作、requestId、AgentRun delegation id、SecretRef、old/new hash 后缀、resourceVersion、validation id 和结果。禁止记录 API Key 原文、Secret data、Codex auth/config 明文、Authorization header 或完整 bearer token。
|
||||
HWLAB 审计日志记录:actor、profile、动作、requestId、AgentRun delegation id、SecretRef、old/new hash 后缀、config hash 后缀、resourceVersion、validation id 和结果。禁止记录 API Key 原文、Secret data、Codex `auth.json` 明文、Authorization header 或完整 bearer token;显式读取的 `config.toml` 只允许进入对应 admin 响应和 CLI stdout,不写入审计日志正文。
|
||||
|
||||
AgentRun event/trace 只允许显示 provider profile、SecretRef 摘要、validation run/command/job identity 和 failureKind。HWLAB 前端和 CLI 必须把任何疑似 secret-like 字段 redacted 后再展示。
|
||||
|
||||
@@ -156,7 +164,7 @@ AgentRun event/trace 只允许显示 provider profile、SecretRef 摘要、valid
|
||||
|
||||
### T5 Secret 不泄露
|
||||
|
||||
检查 Web 响应、CLI 输出、HWLAB 日志、AgentRun event/trace 和 issue closeout,确认不包含完整 API Key、Codex auth/config 明文、base64 Secret data 或 Authorization header。
|
||||
检查 Web 响应、CLI 输出、HWLAB 日志、AgentRun event/trace 和 issue closeout,确认不包含完整 API Key、Codex `auth.json` 明文、base64 Secret data、Authorization header 或 bearer token。显式 admin config read 可以输出 `config.toml`,但不得包含 credential value。
|
||||
|
||||
## 实现状态
|
||||
|
||||
@@ -165,6 +173,6 @@ AgentRun event/trace 只允许显示 provider profile、SecretRef 摘要、valid
|
||||
| HWLAB 管理页规格 | 已定义/已接入 | 本文为 `v0.2` provider API Key 管理的 HWLAB 权威规格;Cloud Web 已提供 `#/management` 管理页。 |
|
||||
| Cloud API 委托接口 | 已实现 | `/v1/admin/provider-profiles*` 由 HWLAB Cloud API 鉴权授权后委托 AgentRun `/api/v1/provider-profiles*`,HWLAB 不直写 AgentRun Secret。 |
|
||||
| AgentRun provider profile 管理 API | 已对接 | 依赖 AgentRun `v0.1` `agentrun-mgr` provider profile 管理 API;后端长期规格和后续硬化项见 [pikasTech/agentrun#28](https://github.com/pikasTech/agentrun/issues/28)。 |
|
||||
| CLI 同路径入口 | 已实现 | `client provider-profiles list/remove/set-key/validate/validation` 走 HWLAB Cloud Web 同源 API,用作管理页的非视觉同路径验收入口。 |
|
||||
| CLI 同路径入口 | 已实现 | `client provider-profiles list/config/set-config/remove/set-key/validate/validation` 走 HWLAB Cloud Web 同源 API,用作管理页的非视觉同路径验收入口。 |
|
||||
| DeepSeek canary | 已验证 | DeepSeek profile 经 `hwlab-deepseek-proxy.hwlab-v02.svc.cluster.local:4000/v1` 到 `/v1/responses`,验收必须继续证明不访问 `hyueapi.com`。 |
|
||||
| Secret 脱敏 | 已实现/持续约束 | Web、Cloud API、CLI 和 issue 证据不得回显完整 API Key;AgentRun Secret 写入的 `last-applied-configuration` 硬化由 AgentRun 侧继续跟踪。 |
|
||||
|
||||
Reference in New Issue
Block a user