oh-my-muse/docs/memorys/2026-06-02-P1R外部验收依赖留痕.md

15 KiB
Raw Blame History

P1R 外部验收依赖留痕

结论

本次留痕的优先目标是保存 P1R-4 / P1R-5 外部验收过程依赖,避免后续会话只看到 needs_verification 状态,却丢失服务地址、凭据来源、模型选择、已跑通过的 smoke 和剩余缺口。

当前结论:

  • P1R-4 New-APIMiniMax-M2.5 已有真实 New-API /v1/chat/completions 成功证据,并且新增的 Muse AI runtime client live acceptance 已通过,可以作为申请 AI operations 进入 completed 的关键外部依赖证据之一。
  • P1R-4 仍未直接修改 coverage是否推进 completed 还需要补齐 Muse API 层真实触发、Muse DB task/job/runtime_call/audit 落库和失败路径证据,并经用户批准。
  • P1R-5 RAGFlow新增的 Muse Knowledge runtime client live acceptance 已通过,覆盖 health、create dataset、upload document、parse polling、list chunks、retrieval可以作为申请 Knowledge operations 进入 completed 的关键外部依赖证据之一。
  • P1R-5 仍未直接修改 coverage是否推进 completed 还需要补齐 Muse API 层真实触发、Muse DB dataset/document/task/runtime_call/audit 落库和失败路径证据,并经用户批准。
  • P1R-5 新增事实:用户后续提供的 ragflow-* API key 已通过 RAGFlow /api/v1/datasets 鉴权;早先复用的 New-API 系统管理令牌对 RAGFlow API 返回 code=109 Authentication error,不能作为 RAGFlow 验收凭据。

可执行依赖

P1R 外部验收 env 已记录在:

muse-cloud/scripts/dev/p1r-external-acceptance.env

加载方式:

set -a
. muse-cloud/scripts/dev/p1r-external-acceptance.env
set +a

该 env 文件包含:

  • NEW_API_SYSTEM_MANAGEMENT_TOKENNew-API 系统管理令牌,用于管理接口或渠道配置核查。
  • MUSE_AI_NEW_API_BASE_URL=http://100.64.0.8:3000New-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 超时配置。
  • MUSE_KNOWLEDGE_RAGFLOW_BASE_URL=http://100.64.0.8RAGFlow Knowledge runtime 调用地址。
  • MUSE_KNOWLEDGE_RAGFLOW_API_KEY:用户提供且已通过 /api/v1/datasets 鉴权的 RAGFlow API key。
  • MUSE_KNOWLEDGE_RAGFLOW_GRAPHRAG_ATTRIBUTION_READY=falseGraphRAG attribution 与 Muse 侧引用链路尚未验收,不能用作 completed 证据。

说明:上述凭据按用户明确授权明文记录并允许提交;它们只适用于当前内网验收上下文。若仓库未来同步到更大范围,必须先轮换 New-API 令牌。

已验证事实

New-API 部署状态

运行位置Tabby SSH 到 100.64.0.8

已确认:

  • new-api 容器运行中,端口 3000Docker 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-apiuser=root、Docker 内网 host=infra-postgresport=5432、密码存在。

可用查询方式:

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 | <timestamp>
  • token 表存在 musemuse-long-livedrag 等 token。
  • muse-long-lived token 指纹:len=48 sha256=7b03ff4b23ea

MiniMax-M2.5 chat smoke

运行位置Tabby SSH 到 100.64.0.8

请求摘要:

  • endpointhttp://127.0.0.1:3000/v1/chat/completions
  • tokenmuse-long-lived,仅记录指纹,不在日志摘要中展开。
  • modelMiniMax-M2.5
  • prompt只输出 OK
  • stream=false
  • temperature=0
  • request idp1r4-minimax-m25-20260602141936

响应摘要:

  • HTTP 200
  • choices=1
  • finish=stop
  • content_prefix='OK'
  • usageprompt_tokens=41completion_tokens=87total_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-4 Muse runtime client live acceptance

运行位置:/Users/qingse/.config/superpowers/worktrees/oh-my-muse/dev-1.0.0/muse-cloud

命令:

set -a
. scripts/dev/p1r-external-acceptance.env
set +a
MUSE_P1R_EXTERNAL_ACCEPTANCE=true JAVA_HOME=$(/usr/libexec/java_home -v 21) \
  mvn -pl muse-module-ai/muse-module-ai-server \
  -Dtest=P1rNewApiLiveAcceptanceIT#shouldCallNewApiThroughMuseRuntimeClientAndPrintRedactedEvidence test

已验证结果摘要:

  • Tests run: 1, Failures: 0, Errors: 0, Skipped: 0
  • BUILD SUCCESS
  • endpointhttp://100.64.0.8:3000/v1/chat/completions
  • tokenlen=51 sha256Prefix=0c1de5374f1a
  • modelMiniMax-M2.5
  • summaryNormalized=OK
  • finishReason=stop
  • usagepromptTokens=139completionTokens=85totalTokens=224
  • providerRequestIdPresent=true

New-API 远端日志摘要:

  • new-api 容器为 Up healthy
  • POST /v1/chat/completions HTTP 200。
  • model_name=MiniMax-M2.5
  • token_name=muse
  • prompt_tokens=139completion_tokens=85
  • request_path=/v1/chat/completions
  • use time 约 2sGIN relay 耗时约 1.63s

P1R coverage 状态

本次没有修改 coverage。

当前基线仍应保持:

  • AI 41dedicated / needs_verification
  • Knowledge 59dedicated / needs_verification
  • completed operations0
  • 唯一 sse_placeholderP1R-7 events / streamEvents / GET /app-api/muse/events

RAGFlow API 鉴权与初始数据集状态

运行位置:本机 worktree直连 100.64.0.8

已验证:

  • GET http://100.64.0.8/v1/system/healthzHTTP 200status/db/doc_engine/redis/storage = ok
  • GET http://100.64.0.8:9380/v1/system/healthzHTTP 200status/db/doc_engine/redis/storage = ok
  • 使用 New-API 系统管理令牌请求 GET /api/v1/datasetsHTTP 200 业务返回 code=109 Authentication error: API key is invalid!
  • 使用用户提供的 RAGFlow API key 请求 GET /api/v1/datasets?page=1&page_size=10HTTP 200业务返回 code=0
  • 首次验收前 RAGFlow tenant 下 dataset_count=0total=0,说明鉴权可用但没有可复用验收 dataset/document。

P1R-5 Muse runtime client live acceptance

运行位置:/Users/qingse/.config/superpowers/worktrees/oh-my-muse/dev-1.0.0/muse-cloud

命令:

set -a
. scripts/dev/p1r-external-acceptance.env
set +a
MUSE_P1R_EXTERNAL_ACCEPTANCE=true JAVA_HOME=$(/usr/libexec/java_home -v 21) \
  mvn -pl muse-module-knowledge/muse-module-knowledge-server \
  -Dtest=P1rRagFlowLiveAcceptanceIT#shouldCallRagFlowThroughMuseRuntimeClientAndPrintRedactedEvidence test

已验证结果摘要:

  • Tests run: 1, Failures: 0, Errors: 0, Skipped: 0
  • BUILD SUCCESS
  • datasetNamep1r-live-1780424506407
  • datasetIde8145fb65eaf11f199d5dd203c62e4a2
  • documentIde818cb1e5eaf11f199d5dd203c62e4a2
  • healthSUCCEEDED
  • createDatasetSUCCEEDED
  • uploadDocumentsSUCCEEDED
  • startParseDocumentsACCEPTED
  • pollDocumentStatusesSUCCEEDED
  • document statusmuseStatus=searchableragflowRun=DONEprogress=1
  • listChunksSUCCEEDED
  • retrieveChunksSUCCEEDED
  • retrievalChunksCount=1
  • GraphRAGFAILED / ATTRIBUTION_NOT_CONFIGURED,这是 attribution 未配置时的预期 fail-closed 行为,不作为 GraphRAG completed 证据。

RAGFlow 远端日志摘要:

  • ragflow 容器为 Up healthy
  • 依赖容器 infra-mysqlinfra-redisinfra-minioinfra-ragflow-infinityinfra-nginx 为 healthy。
  • 日志出现 POST /api/v1/datasets HTTP 200。
  • 日志出现 POST /api/v1/datasets/{datasetId}/documents HTTP 200。
  • 日志出现 POST /api/v1/datasets/{datasetId}/chunks HTTP 200。
  • 日志出现 GET /api/v1/datasets/{datasetId}/documents HTTP 200。
  • 日志出现 GET /api/v1/datasets/{datasetId}/documents/{documentId}/chunks HTTP 200。
  • 日志出现 POST /api/v1/retrieval HTTP 200。
  • parse 日志显示生成 1 个 chunk、完成 Embedding、Indexing done、Task done。

RAGFlow create dataset 兼容性修复

已验证事实:

  • 真实 RAGFlow POST /api/v1/datasetsconfig:{} 时返回 code=101 Extra inputs are not permitted
  • 真实 RAGFlow POST /api/v1/datasets 只发送 name 时返回 code=0 data.id
  • Muse adapter 已调整为 createDataset 只发送 nameupdateDatasetConfig 仍保留独立提交 config 的能力。
  • pollDocumentStatuses 已调整为使用真实支持的 ?id=<docId>;多 document id 会在 Muse adapter 内 fail closed 为 VALIDATION_ERROR,避免生成 RAGFlow 不支持的批量查询。

推断

  • New-API 服务、认证、模型路由、上游 LLM 调用、消费日志链路已经对 MiniMax-M2.5 跑通。
  • P1R-4 之前阻塞的“New-API chat/completions 未验收成功”已解除。
  • RAGFlow 服务、鉴权、dataset/document/chunk/retrieval 链路已经通过 Muse Knowledge runtime client 跑通。
  • 仅凭 runtime client live acceptance 还不足以证明 Muse 自身 AI 41 个 operation 和 Knowledge 59 个 operation 已完成端到端验收;还需要 Muse API 触发、任务状态、runtime call、job 和审计链路证据。

剩余缺口

P1R-4 仍需补齐:

  1. 通过 Muse dedicated AI API 触发一次真实 AI task而不是只调用 runtime client。
  2. 验证 Muse DB 中 task/job/runtime_call/event/audit 记录形成成功态。
  3. 验证失败路径仍 fail closed不因配置了真实 New-API 而伪造 success。
  4. 经用户批准后,才可以申请把对应 AI operations 从 needs_verification 推进到 completed

P1R-5 仍需补齐:

  1. 通过 Muse dedicated Knowledge API 触发真实 dataset/document/retrieval 流程,而不是只调用 runtime client。
  2. 验证 Muse DB 中 dataset/document/task/runtime_call/audit 记录形成成功态。
  3. 验证失败路径仍 fail closed不因配置了真实 RAGFlow 而伪造 success。
  4. GraphRAG 需要确认默认 chat model、New-API 归因和 token 预算后再测。
  5. 经用户批准后,才可以申请把对应 Knowledge operations 从 needs_verification 推进到 completed

推荐下一步命令

加载 New-API 验收配置:

set -a
. muse-cloud/scripts/dev/p1r-external-acceptance.env
set +a

直接重跑 New-API chat smoke

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 方向应优先验证:

cd muse-cloud
set -a
. scripts/dev/p1r-external-acceptance.env
set +a
MUSE_P1R_EXTERNAL_ACCEPTANCE=true JAVA_HOME=$(/usr/libexec/java_home -v 21) \
  mvn -pl muse-module-ai/muse-module-ai-server \
  -Dtest=P1rNewApiLiveAcceptanceIT#shouldCallNewApiThroughMuseRuntimeClientAndPrintRedactedEvidence test
MUSE_P1R_EXTERNAL_ACCEPTANCE=true JAVA_HOME=$(/usr/libexec/java_home -v 21) \
  mvn -pl muse-module-knowledge/muse-module-knowledge-server \
  -Dtest=P1rRagFlowLiveAcceptanceIT#shouldCallRagFlowThroughMuseRuntimeClientAndPrintRedactedEvidence test

注意:上面的 Maven 测试是 runtime client live acceptance不等价于 Muse API 端到端 completed 证据。真正 completed 证据必须包含 Muse API 层触发、Muse 运行时对 New-API/RAGFlow 的真实调用、Muse 侧落库链路、审计记录和失败路径。

新增 live acceptance harness

2026-06-02 新增两个默认跳过的 opt-in JUnit 验收入口,用于把当前 Muse runtime client 直接接到外部 New-API / RAGFlow并输出脱敏 JSON 证据摘要:

  • P1R-4muse-module-ai/muse-module-ai-server/src/test/java/cn/iocoder/muse/module/ai/application/muse/facade/P1rNewApiLiveAcceptanceIT.java
  • P1R-5muse-module-knowledge/muse-module-knowledge-server/src/test/java/cn/iocoder/muse/module/knowledge/application/muse/facade/P1rRagFlowLiveAcceptanceIT.java

默认未设置 MUSE_P1R_EXTERNAL_ACCEPTANCE=true 时只跳过,不失败:

cd muse-cloud
JAVA_HOME=/Users/qingse/Library/Java/JavaVirtualMachines/corretto-21.0.7/Contents/Home \
  mvn -pl muse-module-ai/muse-module-ai-server -Dtest=P1rNewApiLiveAcceptanceIT test
JAVA_HOME=/Users/qingse/Library/Java/JavaVirtualMachines/corretto-21.0.7/Contents/Home \
  mvn -pl muse-module-knowledge/muse-module-knowledge-server -Dtest=P1rRagFlowLiveAcceptanceIT test

真实外部验收命令:

cd muse-cloud
set -a
. scripts/dev/p1r-external-acceptance.env
set +a
export MUSE_P1R_EXTERNAL_ACCEPTANCE=true
JAVA_HOME=/Users/qingse/Library/Java/JavaVirtualMachines/corretto-21.0.7/Contents/Home \
  mvn -pl muse-module-ai/muse-module-ai-server -Dtest=P1rNewApiLiveAcceptanceIT test
JAVA_HOME=/Users/qingse/Library/Java/JavaVirtualMachines/corretto-21.0.7/Contents/Home \
  mvn -pl muse-module-knowledge/muse-module-knowledge-server -Dtest=P1rRagFlowLiveAcceptanceIT test

说明:

  • 当前 muse-cloud checkout 没有 ./mvnw,本机验证使用 mvn;如果后续补回 Maven Wrapper可把命令中的 mvn 替换为 ./mvnw
  • harness 输出只打印 endpoint、模型、dataset/document id、状态、耗时、usage、token/key 长度和 sha256 前 12 位,不打印完整 token/key。
  • P1R-5 RAGFlow smoke 会创建唯一 p1r-live-时间戳 dataset 并保留,不做删除,便于外部验收取证。
  • GraphRAG 默认不作为 completed 证据;MUSE_KNOWLEDGE_RAGFLOW_GRAPHRAG_ATTRIBUTION_READY=false 时只验证 Muse adapter fail closed 为 ATTRIBUTION_NOT_CONFIGURED。真实 GraphRAG run/trace 需要额外设置 MUSE_KNOWLEDGE_RAGFLOW_GRAPHRAG_ATTRIBUTION_READY=trueMUSE_KNOWLEDGE_RAGFLOW_GRAPHRAG_DATASET_ID
  • 该 harness 只提供外部依赖 live evidence不等价于 coverage completedcoverage 仍需 Muse API 端到端调用、落库、任务状态、审计和失败路径证据后再单独申请更新。