docs: add v02 provider management spec
This commit is contained in:
@@ -24,6 +24,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 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`。
|
||||
- `UNIDESK_SSH_CLIENT_TOKEN` 只授予 UniDesk frontend `/ws/ssh` scoped client 能力;route allowlist 由 UniDesk frontend 配置控制。HWLAB 不持有 provider token、主 server SSH key 或完整 frontend 登录态。
|
||||
|
||||
@@ -80,6 +80,9 @@ Code Agent session 是显式资源,不再由普通 `client agent send`、Workb
|
||||
| `hwlab-cli client access device-pods grant/revoke USER POD --relation REL` | `PUT/DELETE /v1/admin/access/users/{userId}/device-pods/{devicePodId}/{relation}` | 授予或撤销 device pod `viewer/operator/profile_editor/job_submitter` 等 relation。 |
|
||||
| `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 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 device-pods list` | `GET /v1/device-pods` | 对应右侧 Device Pod 列表。 |
|
||||
| `hwlab-cli client device-pods status POD` | `GET /v1/device-pods/{pod}/status` | 对应 Device Pod summary/status。 |
|
||||
| `hwlab-cli client device-pods events POD` | `GET /v1/device-pods/{pod}/events` | 对应纯文本事件流。 |
|
||||
@@ -164,6 +167,10 @@ Code Agent session 是显式资源,不再由普通 `client agent send`、Workb
|
||||
|
||||
阅读 docs/reference/spec-v02-hwlab-cli.md 和 docs/reference/spec-v02-openfga-authorization.md,然后在 runtime endpoint locked 环境下运行 `client access summary`、`client access users list`、`client access users inspect <user>`、`client access device-pods grant/revoke ...`、`client access tools grant/revoke ...` 和 `client access check ...`。确认所有命令都走 Cloud Web 同源 `19666` path,输出 JSON、route、actor、OpenFGA mode/decision 和 effective matrix,不输出 OpenFGA token、完整 API key 或 Secret 值。
|
||||
|
||||
## 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。
|
||||
|
||||
## 规格的实现情况
|
||||
|
||||
| 规格项 | 状态 | 说明 |
|
||||
@@ -171,6 +178,7 @@ Code Agent session 是显式资源,不再由普通 `client agent send`、Workb
|
||||
| 固定 repo 短连接 client | 目标状态 | `hwlab-cli` 在 `G14:/root/hwlab-v02` 或当前 v0.2 worktree 直接用 Bun 运行,不作为 runtime service。 |
|
||||
| WEB 等价 API client | 目标状态 | `client` 子命令覆盖 Cloud Web 非视觉业务面。 |
|
||||
| Admin Access 同路径 CLI | 目标状态 | `client access ...` 覆盖 OpenFGA summary、user matrix、grant/revoke、tool capability 和 check,必须走 Cloud Web 同源 path。 |
|
||||
| Provider profile 管理同路径 CLI | 目标状态 | `client provider-profiles ...` 覆盖管理页状态、API Key 写入和 canary 验证,必须走 Cloud Web 同源 path 并委托 AgentRun。 |
|
||||
| 显式 Code Agent session 管理 | 目标状态 | `client agent session create|select|status|list` 是 `send` 前置;普通 `send` 不自动创建或滚动 session。 |
|
||||
| WEB composer 状态机等价 | 目标状态 | `client agent composer status|submit` 复用 Web composer policy,但必须显示 sessionRequired/sessionUsable,不能自动创建或滚动 session。 |
|
||||
| JSON-RPC 同源 API | 目标状态 | `client rpc` 自动补齐 Web JSON-RPC envelope 的 `meta` 字段。 |
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
# v0.2 hwlab-cloud-api 服务规格
|
||||
|
||||
`hwlab-cloud-api` 是 `v0.2` 应用层核心服务,运行在 `hwlab-v02` namespace,内部端口 `6667`,公网经 `hwlab-edge-proxy` 和 FRP 暴露为 `http://74.48.78.17:19667`。
|
||||
Provider API Key 管理属于 Cloud API 的 authenticated admin surface:前端只调用 `/v1/admin/provider-profiles*`,Cloud API 使用 HWLAB `AuthPrincipal` 和授权模型判定后,把 provider profile 状态查询、API Key 写入和 canary 验证委托给 AgentRun 后端。Cloud API 不直接写 AgentRun Secret,不把 API Key 原文写入日志或响应;详细合同见 [spec-v02-provider-management.md](spec-v02-provider-management.md)。
|
||||
|
||||
## 在系统中的职责划分
|
||||
|
||||
@@ -47,6 +48,7 @@
|
||||
| `POST /v1/admin/users`、`POST/PUT /v1/admin/device-pods` | `admin` 管理用户和 device pod profile 的入口。 |
|
||||
| `GET/PATCH/PUT/DELETE /v1/admin/access...` | Admin Access API;唯一正式授权管理入口,读写 OpenFGA 细粒度授权、tool capability、role/status 和 effective matrix。 |
|
||||
| `POST /v1/admin/access/check` | 管理员调试授权 check;返回 mode、decision、object/relation 和 redacted actor,不返回 OpenFGA token。 |
|
||||
| `GET/PUT/POST /v1/admin/provider-profiles...` | Provider API Key 管理入口;Cloud API 鉴权和审计后委托 AgentRun 后端,返回脱敏 profile 状态、SecretRef 摘要和 canary 结果,不返回 Secret value。 |
|
||||
| `GET/PATCH /v1/workbench/workspace`、`POST /v1/workbench/workspace/{id}/reset`、`GET /events` | 账号级共享 workspace authority;所有读写按 ownerUserId 隔离,写入使用 revision 观测冲突,active trace 只表示最近活动/当前选中 trace,不作为同账号 Code Agent 并发互斥锁。 |
|
||||
| `POST /v1/agent/sessions`、`GET/PATCH /v1/agent/sessions...` | 显式 Code Agent session 生命周期入口;创建/选择/状态标记 session,并与账号 workspace selection 同步。 |
|
||||
| `GET /v1/m3/status`、`POST /v1/m3/io` | M3 只读/受控 IO 入口;写操作必须有明确 approval。 |
|
||||
@@ -90,6 +92,10 @@ OpenFGA、Access API、工具能力和 shadow/enforce 策略的最终规格见 [
|
||||
|
||||
阅读 docs/reference/spec-v02-hwlab-cloud-api.md 和 docs/reference/spec-v02-openfga-authorization.md,然后用 cli 手动测试以下内容:用 admin 调用 `GET /v1/admin/access/summary` 和 `POST /v1/admin/access/check`,确认 OpenFGA mode/readiness/store/model/decision 可见且 Secret 不泄漏;普通用户调用 admin access API 必须返回 403。
|
||||
|
||||
## T4.1
|
||||
|
||||
阅读 docs/reference/spec-v02-provider-management.md,然后用 cli 手动测试以下内容:用 admin 调用 `GET /v1/admin/provider-profiles`、`PUT /v1/admin/provider-profiles/deepseek/credential` 和 `POST /v1/admin/provider-profiles/deepseek/validate`,确认 Cloud API 先恢复 HWLAB actor,再委托 AgentRun 后端,响应只包含 SecretRef/resourceVersion/hash 后缀和 validation/run/command/job/trace 摘要;普通用户或未登录请求必须返回 auth/authorization blocker,响应、日志和 trace 不输出 API Key 原文。
|
||||
|
||||
## T5
|
||||
|
||||
阅读 docs/reference/spec-v02-hwlab-cloud-api.md 和 docs/reference/spec-v02-openfga-authorization.md,然后用 cli 手动测试以下内容:撤销某用户 `tool:unidesk_ssh` 或 `tool:hwpod` 后创建 Code Agent session,确认 runner transient env 和 trace 摘要不再注入对应工具能力,强行调用返回结构化 authorization blocker。
|
||||
@@ -106,5 +112,6 @@ OpenFGA、Access API、工具能力和 shadow/enforce 策略的最终规格见 [
|
||||
| device-pod 正式权限/profile/job | 部分实现 | profile/relation/list/status/job 持久化在 cloud-api;用户态 probe GET 已收敛为只读 job;已提供内部 gateway dispatch route 供 `hwlab-device-pod` executor 下发到 device-host-cli,无在线 gateway/device-host-cli 时返回 blocker。 |
|
||||
| v0.2 登录鉴权与 admin/user 权限模型 | 部分实现 | 当前 `/auth/*` 是本地账号密码 bootstrap fallback 和 Web session;Keycloak OIDC、24 小时 Web session、CLI API key 和 `AuthPrincipal` 归一仍需按 spec-v02-auth 收敛。admin user/device-pod/relation API 和 Code Agent owner binding 已接入;生产 bootstrap 依赖 SecretRef。 |
|
||||
| OpenFGA 细粒度授权与 Admin Access API | 目标状态 | 需要实现 OpenFGA client/bootstrap、`enforce`、`/v1/admin/access*`、tool capability check 和 runner env 过滤。 |
|
||||
| Provider API Key 管理委托 | 目标状态 | 需要实现 `/v1/admin/provider-profiles*`,由 HWLAB 鉴权后委托 AgentRun 后端管理 profile Secret/配置和 canary。 |
|
||||
| 账号共享 workspace authority | 已实现 | `account_workspaces` 持久化同账号 Web/CLI 共享 workspace,支持 revision 冲突可见性、账号隔离、最近 active trace 记录和 reset;同一用户不同 session/run 允许并发,互斥只在 session/thread/run 层处理。 |
|
||||
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
# v0.2 hwlab-cloud-web 服务规格
|
||||
|
||||
`hwlab-cloud-web` 是 `v0.2` 浏览器工作台,运行在 `hwlab-v02` namespace,内部端口 `8080`,公网经 FRP 暴露为 `http://74.48.78.17:19666/`。
|
||||
Provider API Key 配置入口也归属 Cloud Web:左侧顶级导航必须提供“管理”页面,具体路由、状态展示、API Key 写入表单、验证结果展示和脱敏规则见 [spec-v02-provider-management.md](spec-v02-provider-management.md)。Cloud Web 不直接调用 AgentRun,不保存完整 API Key,也不把 AgentRun token 暴露给浏览器。
|
||||
|
||||
## 在系统中的职责划分
|
||||
|
||||
@@ -10,6 +11,7 @@
|
||||
- Web 登录按 [spec-v02-auth.md](spec-v02-auth.md) 走 Keycloak OIDC;未登录用户进入 Keycloak 登录/注册,callback 后由 cloud-api 发行 24 小时 `hwlab_session`。
|
||||
- Cloud Web 提供 API key 管理入口,让用户查看默认 API key、创建新 key、revoke 或 regenerate;浏览器日常请求仍使用 Web session,不要求用户手动输入 API key。
|
||||
- Cloud Web 提供 admin-only Access 页面,让管理员按用户管理 role/status、device pod relation、Code Agent session 可见性和工具 capability;页面只调用 cloud-api `/v1/admin/access*` 同源 API,不直接访问 OpenFGA、Postgres、Kubernetes 或 Keycloak admin API。
|
||||
- Cloud Web 提供 admin-only Provider 管理页面,让管理员通过 cloud-api `/v1/admin/provider-profiles*` 同源 API 配置 AgentRun provider API Key;页面不得直接访问 AgentRun、Kubernetes Secret、Moon Bridge 或 provider upstream。
|
||||
- Cloud Web 与 `hwlab-cli client` 必须共享同一组非视觉业务 API。浏览器遇到的 Code Agent continuation、trace/result、device-pod list/status 和 device-pod job 问题,必须能通过 `hwlab-cli client` 走同一 `19666` Cloud Web path 复现;不能让 CLI 长期绕到 `19667` Cloud API 后把 Web 路径缺口误判为业务已通过。
|
||||
- Cloud Web 只承担浏览器 UI 和 `hwlab-cli client` 的同源代理。AgentRun runner 内的 `hwpod` 不走 Cloud Web;runner 使用映射到发起用户的 `HWLAB_API_KEY` 直连 Cloud API,Cloud Web 不保留 device-pod lease 路由。
|
||||
- 浏览器启动后必须从 `GET /v1/workbench/workspace` hydrate 账号 workspace;同一个账号在多个浏览器标签页、多个浏览器或 CLI profile 中应看到同一个 `workspaceId`、selected conversation/session/thread、provider profile 和 active trace。浏览器 localStorage 只能作为短期缓存,并必须绑定 actor,不能作为 workspace authority。
|
||||
|
||||
@@ -0,0 +1,161 @@
|
||||
# v0.2 Provider API Key 管理规格
|
||||
|
||||
本文是 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 Cloud Web 左侧顶级导航新增“管理”页面,提供 provider API Key 配置、状态查看和验证入口。
|
||||
- 继续使用 HWLAB 现有 Web session 与 CLI/API key 鉴权;浏览器用户不直接登录 AgentRun,也不直接调用 AgentRun。
|
||||
- HWLAB Cloud API 是浏览器同源入口,负责恢复 `AuthPrincipal`、执行业务授权和审计,然后把 provider profile 管理动作委托给 AgentRun 后端。
|
||||
- AgentRun 后端负责 provider profile 的 SecretRef、配置写入、状态查询和 canary 执行能力;AgentRun 信任来自 HWLAB 后端的服务端调用,不重新做用户级鉴权。
|
||||
- API Key 全程只允许写入,不允许在 Web、CLI、日志、trace、issue、AgentRun event 或 API 响应中回显原文。
|
||||
|
||||
## 职责边界
|
||||
|
||||
| 组件 | 职责 |
|
||||
| --- | --- |
|
||||
| `hwlab-cloud-web` | 提供“管理”页面、表单、状态展示和验证结果展示;只调用 HWLAB 同源 API。 |
|
||||
| `hwlab-cloud-api` | 复用 HWLAB 鉴权与授权,记录审计上下文,把管理动作委托给 AgentRun 后端,并把结果脱敏后返回前端。 |
|
||||
| `agentrun-mgr` | 提供 provider profile 管理 REST API,更新 AgentRun profile Secret/配置,触发 profile canary,返回脱敏状态。 |
|
||||
| `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。
|
||||
|
||||
## Web 管理页
|
||||
|
||||
`hwlab-cloud-web` 必须增加一个左侧顶级导航入口:
|
||||
|
||||
```text
|
||||
route: #/management
|
||||
label: 管理
|
||||
view: provider API Key 管理
|
||||
```
|
||||
|
||||
页面目标是直接可用的运维界面,不是 landing page。首版至少包含:
|
||||
|
||||
- provider profile 列表:`deepseek`、`codex-api`、`minimax-m3`。
|
||||
- 每个 profile 的配置状态:`configured`、SecretRef、key hash 后缀、resourceVersion、最近更新时间、最近验证结果。
|
||||
- API Key 写入表单:保存后立即清空输入框,不回显旧值。
|
||||
- DeepSeek 链路摘要:必须显示 `HWLAB Moon Bridge -> DeepSeek 官方 upstream`,并明确不是 hyue 通道。
|
||||
- 保存、验证和查看最近验证结果的操作状态。
|
||||
|
||||
前端不得保存完整 API Key 到 localStorage、sessionStorage、URL、DOM data attribute 或调试输出。表单提交失败时,只显示 failureKind/message 和 redacted target,不显示请求体。
|
||||
|
||||
## HWLAB Cloud API 合同
|
||||
|
||||
面向前端的同源 API 固定归属 HWLAB:
|
||||
|
||||
```http
|
||||
GET /v1/admin/provider-profiles
|
||||
PUT /v1/admin/provider-profiles/:profile/credential
|
||||
POST /v1/admin/provider-profiles/:profile/validate
|
||||
GET /v1/admin/provider-profiles/:profile/validations/:validationId
|
||||
```
|
||||
|
||||
所有接口必须先通过 [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` 明文。允许返回的字段包括:
|
||||
|
||||
- `profile`
|
||||
- `configured`
|
||||
- `secretRef.namespace/name/keys`
|
||||
- `keyPrefix` 或不可逆 `keyHashSuffix`
|
||||
- `resourceVersion`
|
||||
- `updatedAt`
|
||||
- `validation.status/failureKind/message/runId/commandId/jobName/traceId`
|
||||
- `delegation.agentRunBaseUrl` 的脱敏摘要
|
||||
|
||||
## 委托到 AgentRun
|
||||
|
||||
HWLAB Cloud API 必须调用 AgentRun 后端的 provider profile 管理 API,而不是直接写 AgentRun Kubernetes Secret。委托请求只在服务端发生;浏览器不持有 AgentRun token、不知道 AgentRun 内部地址,也不直接读取 AgentRun response。
|
||||
|
||||
委托请求必须携带最小审计上下文:
|
||||
|
||||
```json
|
||||
{
|
||||
"actor": {
|
||||
"system": "hwlab-v02",
|
||||
"userId": "<hwlab-user-id>",
|
||||
"username": "<hwlab-username>",
|
||||
"authMethod": "web-session|api-key"
|
||||
},
|
||||
"requestId": "<hwlab-request-id>",
|
||||
"reason": "hwlab-provider-management"
|
||||
}
|
||||
```
|
||||
|
||||
AgentRun 对该调用不做用户鉴权,但可以校验调用来源、tenant、profile allowlist 和 request schema。HWLAB 必须把 AgentRun 返回的 failureKind 原样保留到审计和前端响应中,不能把 AgentRun provider/Secret 错误改写成 HWLAB auth、device-pod 或 Cloud Web 故障。
|
||||
|
||||
## DeepSeek v0.2 通道规则
|
||||
|
||||
DeepSeek provider 的目标链路固定为:
|
||||
|
||||
```text
|
||||
AgentRun deepseek profile
|
||||
-> http://hwlab-deepseek-proxy.hwlab-v02.svc.cluster.local:4000/v1
|
||||
-> /v1/responses
|
||||
-> DeepSeek 官方 upstream
|
||||
```
|
||||
|
||||
规则:
|
||||
|
||||
- `deepseek` profile 不得配置到 `hyueapi.com` 或 `hyueapi.com/responses`。
|
||||
- `hyueapi.com` 仍是 Codex API 通道的直连域名,不能因为 DeepSeek 配置改动破坏 NO_PROXY 规则。
|
||||
- 如果 Moon Bridge 通过环境变量读取 upstream key,保存 DeepSeek API Key 后必须触发受控 rollout/restart,或者返回需要 rollout 的明确状态。
|
||||
- DeepSeek canary 必须证明 bridge 日志命中 `/v1/responses` 并返回 200;出现 hyue 的 `INSUFFICIENT_BALANCE` 不得算通过。
|
||||
|
||||
## CLI 同路径验收
|
||||
|
||||
`hwlab-cli` 必须提供管理页的非视觉同路径入口,默认走 Cloud Web 同源 API:
|
||||
|
||||
```bash
|
||||
bun tools/hwlab-cli/bin/hwlab-cli.ts client provider-profiles list
|
||||
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
|
||||
```
|
||||
|
||||
约束:
|
||||
|
||||
- CLI 使用 `HWLAB_API_KEY` 或已登录 Web session 恢复同一个 HWLAB actor。
|
||||
- `set-key --key-stdin` 从 stdin 读取 API Key,默认输出只显示 hash/resourceVersion,不打印 key。
|
||||
- `validate --wait` 短连接 submit-and-poll,输出 validationId、runId、commandId、jobName、traceId、status、failureKind 和 redacted bridge upstream 摘要。
|
||||
- 这些命令不得直接调用 AgentRun 内部 URL,不得直接读写 Kubernetes Secret。
|
||||
|
||||
## 审计与脱敏
|
||||
|
||||
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。
|
||||
|
||||
AgentRun event/trace 只允许显示 provider profile、SecretRef 摘要、validation run/command/job identity 和 failureKind。HWLAB 前端和 CLI 必须把任何疑似 secret-like 字段 redacted 后再展示。
|
||||
|
||||
## 验收规格
|
||||
|
||||
### T1 管理页入口
|
||||
|
||||
在部署后的 `http://74.48.78.17:19666/` 打开 HWLAB v0.2,登录后确认左侧顶级导航出现“管理”,路由为 `#/management`,页面能列出 provider profile 状态。未登录访问管理 API 必须返回 auth blocker。
|
||||
|
||||
### T2 状态查询
|
||||
|
||||
使用 `hwlab-cli client provider-profiles list` 查询状态,确认请求走 Cloud Web 同源 path,输出 actor、profile、SecretRef/resourceVersion/hash 后缀,不输出 Secret data 或 API Key。
|
||||
|
||||
### T3 DeepSeek API Key 写入
|
||||
|
||||
通过管理页或 `hwlab-cli client provider-profiles set-key deepseek --key-stdin` 保存新 key,确认 HWLAB 后端委托 AgentRun 后端,返回 updated resourceVersion 和 key hash 后缀。失败时必须显示 AgentRun failureKind,不得静默成功。
|
||||
|
||||
### T4 DeepSeek canary
|
||||
|
||||
通过管理页或 `hwlab-cli client provider-profiles validate deepseek --wait` 触发真实 canary。通过证据必须包含:validationId、runId、commandId、jobName、traceId、terminal status、bridge `/v1/responses` 200,以及不访问 hyue。
|
||||
|
||||
### T5 Secret 不泄露
|
||||
|
||||
检查 Web 响应、CLI 输出、HWLAB 日志、AgentRun event/trace 和 issue closeout,确认不包含完整 API Key、Codex auth/config 明文、base64 Secret data 或 Authorization header。
|
||||
|
||||
## 实现状态
|
||||
|
||||
| 能力 | 状态 | 说明 |
|
||||
| --- | --- | --- |
|
||||
| HWLAB 管理页规格 | 已定义 | 本文为 `v0.2` provider API Key 管理的 HWLAB 权威规格。 |
|
||||
| Cloud API 委托接口 | 目标状态 | 需要实现 `/v1/admin/provider-profiles*` 并委托 AgentRun。 |
|
||||
| AgentRun provider profile 管理 API | 外部依赖 | 由 AgentRun `v0.1` 规格和 [pikasTech/agentrun#28](https://github.com/pikasTech/agentrun/issues/28) 实现。 |
|
||||
| CLI 同路径入口 | 目标状态 | 需要补齐 `client provider-profiles ...`。 |
|
||||
| DeepSeek canary | 目标状态 | 保存后必须验证官方 DeepSeek/Moon Bridge 链路。 |
|
||||
Reference in New Issue
Block a user