diff --git a/docs/memorys/2026-06-02-P1R外部验收依赖留痕.md b/docs/memorys/2026-06-02-P1R外部验收依赖留痕.md new file mode 100644 index 00000000..f6a892c2 --- /dev/null +++ b/docs/memorys/2026-06-02-P1R外部验收依赖留痕.md @@ -0,0 +1,179 @@ +# P1R 外部验收依赖留痕 + +## 结论 + +本次留痕的优先目标是保存 P1R-4 / P1R-5 外部验收过程依赖,避免后续会话只看到 `needs_verification` 状态,却丢失服务地址、凭据来源、模型选择、已跑通过的 smoke 和剩余缺口。 + +当前结论: + +- P1R-4 New-API:`MiniMax-M2.5` 已有真实 New-API `/v1/chat/completions` 成功证据,可以作为申请 AI operations 进入 `completed` 的关键外部证据之一。 +- P1R-4 仍未直接修改 coverage;是否推进 `completed` 需要再跑 Muse 自身 AI runtime / task / job / runtime_call 端到端验收,并经用户批准。 +- P1R-5 RAGFlow:服务健康和 API token 可用,但当前 RAGFlow 没有 dataset/document,尚无 retrieval / GraphRAG 正向验收证据,不能进入 `completed`。 + +## 可执行依赖 + +P1R 外部验收 env 已记录在: + +```bash +muse-cloud/scripts/dev/p1r-external-acceptance.env +``` + +加载方式: + +```bash +set -a +. muse-cloud/scripts/dev/p1r-external-acceptance.env +set +a +``` + +该 env 文件包含: + +- `NEW_API_SYSTEM_MANAGEMENT_TOKEN`:New-API 系统管理令牌,用于管理接口或渠道配置核查。 +- `MUSE_AI_NEW_API_BASE_URL=http://100.64.0.8:3000`:New-API OpenAI-compatible 调用地址。 +- `MUSE_AI_NEW_API_TOKEN`:大模型调用令牌。 +- `MUSE_AI_NEW_API_DEFAULT_MODEL_KEY=MiniMax-M2.5`:本次已验收成功的模型。 +- `MUSE_AI_NEW_API_*_TIMEOUT_SECONDS`:与 P1R-4 runtime adapter 默认策略对齐的 smoke 超时配置。 + +说明:上述凭据按用户明确授权明文记录并允许提交;它们只适用于当前内网验收上下文。若仓库未来同步到更大范围,必须先轮换 New-API 令牌。 + +## 已验证事实 + +### New-API 部署状态 + +运行位置:Tabby SSH 到 `100.64.0.8`。 + +已确认: + +- `new-api` 容器运行中,端口 `3000`,Docker health 为 healthy。 +- `GET http://127.0.0.1:3000/api/status` 可达。 +- New-API DB 运行在 `infra-postgres` 容器内,外部宿主机端口为 `100.64.0.8:5433`,应用容器内 DSN 使用 `infra-postgres:5432/new-api`。 + +### New-API 数据库取证路径 + +远端 runtime 配置: + +- 文件:`/opt/new-api/.env.runtime` +- 配置项:`SQL_DSN` +- DSN 解析事实:`database=new-api`、`user=root`、Docker 内网 `host=infra-postgres`、`port=5432`、密码存在。 + +可用查询方式: + +```bash +eval "$(python3 - <<'PY' +from pathlib import Path +import urllib.parse, shlex +line = next(l for l in Path('/opt/new-api/.env.runtime').read_text(errors='replace').splitlines() if l.startswith('SQL_DSN=')) +v = line.split('=',1)[1].strip().strip('"').strip("'") +u = urllib.parse.urlparse(v) +print('PGUSER=' + shlex.quote(urllib.parse.unquote(u.username or ''))) +print('PGPASSWORD=' + shlex.quote(urllib.parse.unquote(u.password or ''))) +print('PGDATABASE=' + shlex.quote(u.path.lstrip('/'))) +PY +)" +docker exec -e PGPASSWORD="$PGPASSWORD" infra-postgres \ + psql -h 127.0.0.1 -U "$PGUSER" -d "$PGDATABASE" -qAtc 'select current_database(), current_user, now();' +``` + +已验证结果摘要: + +- DB 查询返回 `new-api | root | `。 +- token 表存在 `muse`、`muse-long-lived`、`rag` 等 token。 +- `muse-long-lived` token 指纹:`len=48 sha256=7b03ff4b23ea`。 + +### MiniMax-M2.5 chat smoke + +运行位置:Tabby SSH 到 `100.64.0.8`。 + +请求摘要: + +- endpoint:`http://127.0.0.1:3000/v1/chat/completions` +- token:`muse-long-lived`,仅记录指纹,不在日志摘要中展开。 +- model:`MiniMax-M2.5` +- prompt:`只输出 OK` +- `stream=false` +- `temperature=0` +- request id:`p1r4-minimax-m25-20260602141936` + +响应摘要: + +- HTTP 200 +- `choices=1` +- `finish=stop` +- `content_prefix='OK'` +- usage:`prompt_tokens=41`、`completion_tokens=87`、`total_tokens=128` +- 响应耗时约 `6.6s` + +New-API 日志摘要: + +- `record consume log` +- `model_name=MiniMax-M2.5` +- `token_name=muse-long-lived` +- `request_path=/v1/chat/completions` +- `POST /v1/chat/completions` HTTP 200 + +### P1R coverage 状态 + +本次没有修改 coverage。 + +当前基线仍应保持: + +- AI 41:`dedicated / needs_verification` +- Knowledge 59:`dedicated / needs_verification` +- completed operations:`0` +- 唯一 `sse_placeholder`:P1R-7 `events / streamEvents / GET /app-api/muse/events` + +## 推断 + +- New-API 服务、认证、模型路由、上游 LLM 调用、消费日志链路已经对 `MiniMax-M2.5` 跑通。 +- P1R-4 之前阻塞的“New-API chat/completions 未验收成功”已解除。 +- 仅凭 New-API 自身 smoke 还不足以证明 Muse 自身 41 个 AI operation 已完成端到端验收;还需要 Muse runtime 触发、任务状态、runtime call、job 和审计链路证据。 + +## 剩余缺口 + +P1R-4 仍需补齐: + +1. 使用 `muse-cloud/scripts/dev/p1r-external-acceptance.env` 启动或测试 Muse AI runtime。 +2. 通过 Muse dedicated AI API 或 runtime service 触发一次真实 AI task。 +3. 验证 Muse DB 中 task/job/runtime_call/event/audit 记录形成成功态。 +4. 验证失败路径仍 fail closed,不因配置了真实 New-API 而伪造 success。 +5. 经用户批准后,才可以申请把对应 AI operations 从 `needs_verification` 推进到 `completed`。 + +P1R-5 仍需补齐: + +1. 创建或确认可用于验收的 RAGFlow dataset。 +2. 上传最小 txt document。 +3. 触发 parse / chunk / index。 +4. 跑 `/api/v1/retrieval` 正向 smoke。 +5. GraphRAG 需要确认默认 chat model、New-API 归因和 token 预算后再测。 + +## 推荐下一步命令 + +加载 New-API 验收配置: + +```bash +set -a +. muse-cloud/scripts/dev/p1r-external-acceptance.env +set +a +``` + +直接重跑 New-API chat smoke: + +```bash +curl --noproxy '*' -sS -m 150 \ + -H "Authorization: Bearer ${MUSE_AI_NEW_API_TOKEN}" \ + -H 'Content-Type: application/json' \ + --data '{"model":"MiniMax-M2.5","messages":[{"role":"user","content":"只输出 OK"}],"stream":false,"temperature":0}' \ + "${MUSE_AI_NEW_API_BASE_URL}/v1/chat/completions" +``` + +Muse runtime adapter 方向应优先验证: + +```bash +cd muse-cloud +set -a +. scripts/dev/p1r-external-acceptance.env +set +a +./mvnw -pl muse-module-ai/muse-module-ai-server -Dtest=MuseAiRuntimeClientTest test +``` + +注意:上面的 Maven 测试是 adapter 单元/合同测试,不等价于 Muse API 端到端 completed 证据。真正 completed 证据必须包含 Muse 运行时对 New-API 的真实调用和 Muse 侧落库链路。 diff --git a/muse-cloud/scripts/dev/p1r-external-acceptance.env b/muse-cloud/scripts/dev/p1r-external-acceptance.env new file mode 100644 index 00000000..95c5f189 --- /dev/null +++ b/muse-cloud/scripts/dev/p1r-external-acceptance.env @@ -0,0 +1,22 @@ +# P1R 外部真实验收依赖。 +# 该文件按用户授权明文提交,仅用于内网 P1R-4 New-API 与 P1R-5 RAGFlow 验收。 +# 使用方式:set -a && . muse-cloud/scripts/dev/p1r-external-acceptance.env && set +a + +# New-API 系统管理令牌,用于需要管理接口或渠道配置核查的场景。 +NEW_API_SYSTEM_MANAGEMENT_TOKEN=AyNL/Spm0yVXcZY27JxYMRFRudutew== + +# New-API OpenAI-compatible 大模型调用入口。 +MUSE_AI_NEW_API_ENABLED=true +MUSE_AI_NEW_API_BASE_URL=http://100.64.0.8:3000 +MUSE_AI_NEW_API_TOKEN=sk-DyVqO3lDmEvQZ3PqGpbNaaaHZHhbh0xaHRIiynhYSmVlLHl2 +MUSE_AI_NEW_API_DEFAULT_MODEL_KEY=MiniMax-M2.5 + +# P1R smoke 推荐超时。MiniMax-M2.5 已在 2026-06-02 跑出 6.6s 左右成功响应。 +MUSE_AI_NEW_API_CONNECT_TIMEOUT_SECONDS=5 +MUSE_AI_NEW_API_FIRST_BYTE_TIMEOUT_SECONDS=15 +MUSE_AI_NEW_API_NON_STREAM_READ_TIMEOUT_SECONDS=60 +MUSE_AI_NEW_API_STREAM_IDLE_TIMEOUT_SECONDS=30 +MUSE_AI_NEW_API_TOTAL_TIMEOUT_SECONDS=180 +MUSE_AI_NEW_API_MAX_ATTEMPTS=3 +MUSE_AI_NEW_API_RETRY_BACKOFF_SECONDS=1,2,4 +MUSE_AI_NEW_API_PROPAGATE_MUSE_CONTEXT=true