当前Pull Request已关闭, 关闭人@wang_cheng_zhao
变更摘要
本 PR 是纯 E2E 测试规格调整,不涉及产品代码:由于模型注册表的「添加 Provider」独立入口已并入连接卡片(连接向导),test/journey-provider-model-catalog.spec.ts(J7)原先点击该按钮的创建流程会让整条旅程超时,因此将其改为通过 POST /api/providers API 预置服务商再进入编辑器;同时把「选了预设 → 创建请求带着该厂商 baseUrl / apiVariant / modelDiscovery」这一预设落地性质迁入 test/journey-model-connect-wizard.spec.ts,并补齐连接向导旅程的空实例前提与布局断言容差。
主要改动
- 预设落地断言迁入连接向导旅程: 在
test/journey-model-connect-wizard.spec.ts新增「预设落地」步骤,对 MiniMax(api.minimaxi.com)与智谱(open.bigmodel.cn)分别选择#wizard-provider-select、只填令牌并提交,通过page.route("**/api/providers")捕获原始请求体后再改写到本地 stub,断言apiProtocol、apiVariant、baseUrl、modelDiscovery: "openai-models"、presetId与apiToken原样进入创建请求。 - 连接向导旅程建立空实例前提: 引入
requireFirstRunState(page, testInfo),在运行自己拥有的栈上清理上次残留,否则记为前置未满足,避免共享栈上已有模型时「系统首个模型设为全局默认」被产品正确返回「保持不变」而误判失败。 - 提交按钮与底栏布局断言加入亚像素容差: 将原来严格的
submitBox.y + height < footerBox.y改为计算overlap并断言overlap < 1(1 个 CSS 像素容差),以区分渲染取整差异与真实布局回归。 - J7 改为 API 预置 provider: 删除
openAddPanel、choosePreset、addCustomProvider等依赖已删除「添加 Provider」面板的辅助函数,新增openConnectCard、providerSelect、seedProvider、openProviderEditor,用page.request.fetch直接创建 MiniMax、智谱、自定义与草稿宿主等服务商,并携带presetId供目录按厂商选取区域价。 - J7 中依赖界面新建的断言改写与文案对齐: 预设入口断言改为连接卡片
#wizard-provider-select的option列表(末项为「自定义服务商」/Custom provider),删除 MiniMax、智谱两步界面创建流程;刷新失败提示由「无法刷新模型目录,仍在使用上一次的目录数据」改为「刷新模型目录失败」;草稿填写改为在已有服务商编辑器中展开对应.provider-row后进行。
已按要求仅输出「变更摘要」与「主要改动」两节。


代码审查
审查结论
变更文件逐一确认
- test/journey-model-connect-wizard.spec.ts:已完整审查(新增
requireFirstRunState前置闸、预设落地步骤、布局重叠容差断言)。发现问题 1 个(P2,见下);布局断言由严格浮点先后改为< 1px容差属于合理修正(真实回归是几十像素级),不另报。 - test/journey-provider-model-catalog.spec.ts:已完整审查(新增
openConnectCard/providerSelect/seedProvider/openProviderEditor辅助、删除openAddPanel/addCustomProvider/choosePreset及两步界面创建流程、J7 改为 API 预置、DeepSeek 行改为按新名字锚定、英文界面下拉断言迁移)。发现问题 2 个(P2 × 1、P3 × 1)。
发现清单(按优先级)
- P2 × 2
test/journey-provider-model-catalog.spec.ts:565— 预置 MiniMax 的baseUrl指向${stub.origin}/minimax/v1,该路径不在providerStub的列表白名单(仅/v1、/slow/v1、/fast/v1、/zhipu/v1)内,落到 404 分支;listAuth/listPaths不记录该请求,导致“每个服务商列表请求都带自己的令牌”的断言被静默削弱,且后续按文本过滤role=alert的 403 断言有 strict mode 命中多元素的风险。test/journey-model-connect-wizard.spec.ts:453-456— 新增预设步骤通过界面真实创建两个 Provider(名称来自产品预设,不带E2E 向导测试前缀),而cleanupProviders()只清理该前缀的记录,这两个指向已关闭 stub 端口的 Provider 会残留在共享栈上,污染后续旅程的注册表列表。
- P3 × 1
3.test/journey-provider-model-catalog.spec.ts:192-195— E2E-META 的 Steps 第 3/4/6 条仍描述本 PR 已删除的界面创建路径(MiniMax 仅填令牌、智谱预设连接、自定义 Provider 草稿保护),与迁移后的 API 预置实现不一致,journey-report.ts会直接读取该块生成场景报告头,属可维护性/审计问题(可选修正)。
总体风险判断
本 PR 只改两个 Playwright 规格、不动产品代码,无安全、并发或数据一致性风险,构建层面无语法/类型隐患(导入、辅助函数、被删函数的残留引用均已核对干净)。主要风险集中在测试自身的保真度与隔离性:一处 stub 路由缺口使新增的令牌配对断言覆盖变薄,一处清理缺口会在共享栈上留下脏数据;两者都不会让用例立刻失败,但会削弱这批 E2E 的判别力,建议一并修掉。
| 类型 | 数量 |
|---|---|
| 🔴 阻塞 | 0 |
| 🟡 建议 | 1 |
💬 仅评论


欢迎来到 openJiuwen 社区
Hey @wang_cheng_zhao , 感谢你对社区的贡献.
机器人使用手册
有关指令的使用,可以点击 此处 查看详情。开发人员可以在每个PR或Issue下方评论特定指令来触发机器人任务。


The pipeline(pipeline number:168) is running. Please wait a moment...


AI 自动检视,仅供参考,问题都需要人工评估分析.
本 PR 相对最新 origin/main(0a0403ae,behind_main=0,ahead=2)只动两个 Playwright 旅程:journey-model-connect-wizard 与 journey-provider-model-catalog(J7),无产品代码。merge-tree 干净。
连接向导旅程补上了它实际依赖的首启空态闸(requireFirstRunState),并把原先挂在 J7「添加 Provider」创建路径上的预设落地断言迁进来:选 MiniMax / 智谱后只填令牌,在浏览器边界捕获创建 body,核对厂商 baseUrl / apiVariant / modelDiscovery 原样进请求,再改写到本地 stub 转发。末段布局断言对「提交按钮压底栏」放宽到 1 CSS 像素容差,避免亚像素渲染把布局测成渲染器差异。J7 侧去掉已不存在的独立添加面板驱动,改为 API seedProvider 预置记录、编辑器只服务已有服务商,预设入口改断言连接卡片下拉;目录刷新失败文案也跟到当前产品文案。职责拆分清楚——创建与预设契约归向导,目录/令牌配对/编辑草稿归 J7——和「新建已并入连接卡片」的产品现状对齐。
可合


✅ 流水线 87a893c351aa4aee850a4ade3ed1e6ce 执行成功。
可在 https://gitcode.com/openJiuwen/sciencediscovery/pull/168/check 查看完整构建日志。
在 PR 评论中发送 rerun 可重新触发 CI 流水线。
| 任务名称 | 子任务 | 状态 | 详情 |
|---|---|---|---|
| 代码检查 | SCA(开源合规) | PASSED | 点此跳转 |
| Anti-poison(防投毒) | PASSED | 点此跳转 | |
| CodeCheck(静态检查) | PASSED | 点此跳转 | |
| Blacklist(禁用词) | PASSED | 点此跳转 | |
| UT | host tier | PASSED | 公开日志 |
| guest tier (QEMU TCG sandbox) | PASSED | 公开日志 | |
| ST | - | PASSED | 公开日志 |
| Binary | x86_64 debug package | PASSED | binary · SHA256SUMS |
| aarch64 debug package | PASSED | binary · SHA256SUMS |


🟡 Medium Priority
建议:在 providerStub 的 GET 列表白名单中加入 "/minimax/v1/models",或把 MiniMax 预置的 baseUrl 改回 ${stub.baseUrl},使该服务商的列表请求真正被 stub 记录。


评审意见(基于 main 分支实测核查)
一句话结论
测试-only 修复方向正确、事实核查全部成立:J7 确实点了产品里已删除的「添加 Provider」入口,预设落地断言迁入向导旅程后比原来更强(真实拦截创建请求);仅两处测试数据卫生小瑕疵,不阻断合入。
描述核查
- 「添加 Provider」独立入口确实已从产品消失:
apps/、packages/全量 grep 无provider-add-panel/添加 Provider/Add provider残留;旧 J7 第 1 步的getByRole("button", {name: /添加 Provider|…/}).first().click()必然等满 240s(configtimeout: 240000),诊断可信。 - 预设断言是真网络拦截而非 UI 状态:
page.route("**/api/providers")捕获浏览器实际 POST body,toMatchObject校验baseUrl/apiVariant/modelDiscovery/presetId/apiProtocol/apiToken,再改写baseUrl为 loopback stub 转发,服务端不触厂商网络。断言值与packages/schema/src/model-provider-presets.ts(MiniMaxapi.minimaxi.com/v1+minimax 变种、智谱open.bigmodel.cn/api/paas/v4+deepseek 变种、均openai-models)及ModelConnectWizard.providerInput()逐字段吻合。 requireFirstRunState闸门正确:models+providers+projects 三项判定空态;仅当E2E_ALLOW_STACK_RESET=1且 loopback 且非 trial 端口(.ci/run-e2e.sh:200由自有栈导出)才清理,否则testInfo.skip→ 报告标 BLOCKED;workers:1、fullyParallel:false无并发互踩;清理顺序(projects → 清 modelId/reviewModelId → providers → 残留 models)确实建立listModels()为空,与向导hadModels(ModelConnectWizard.tsx:346-391)语义对齐。- 亚像素容差是严格
<1CSS px(head 710-715 行),注释讲明 580.234 vs 580 的取整差异与「真回归是几十像素级」,不是松动棘轮。 - 确认零产品代码:仅 2 个 spec(93+3 / 129+182 = +222/−185);删除的
openAddPanel/choosePreset/addCustomProvider及两个创建步骤无任何残留引用(补丁可干净套用)。
问题清单
- [次要]
test/journey-provider-model-catalog.spec.ts:565(注释 652-653 行):MiniMax 预置指向${stub.origin}/minimax/v1,但 stub(61 行)只服务/v1、/slow、/fast、/zhipu四条 models 路径——/minimax/v1/models落入 404 分支,永不进listAuth;注释却称三家「都各自打过一次列表接口(端点分别指向 stub 的 /minimax 与 /zhipu)」。现有断言(智谱配对、custom 令牌)不破,CI 已绿,但注释失实且 MiniMax 一侧的令牌配对证据悄悄消失。修复:改指stub.baseUrl(同被删步骤)或在 stub 路径表加/minimax/v1/models并比照智谱断言配对。 - [次要]
test/journey-model-connect-wizard.spec.ts:402-473:新「预设落地」步骤创建名为 "MiniMax"/“智谱 GLM” 的 provider,而cleanupProviders(135-142 行)只删名字含「E2E 向导测试」的记录——这两个及其登记模型逃过 finally。自有栈上下一个带闸旅程(journey-model-settings,按字母序在后)会清;但指向式空栈(拒绝重置却 total=0 → 不 skip 直接跑)会留下无 E2E 标记的残留。修复:记录创建返回的 id 或扩大 victims 过滤,finally 一并删除。 - [建议]
test/journey-model-connect-wizard.spec.ts:226-228:步骤 1 仍用严格浮点先后(submitBox.y+height < footerBox.y),与 PR 自己在 710-715 行论证的「测渲染器而非布局」同理,存在同类亚像素抖动风险;建议统一套用 <1px 容差。
亮点
- 预设落地断言迁移即加强:两个厂商、浏览器边界捕获真实请求体、令牌进 body 亦断言,且证明厂商网络不可达。
- 闸门复用纪律好:与 first-run/model-settings 同一套「自有栈才清、否则 BLOCKED」治理,前置说明写明了
hadModels依赖。 - J7 重写忠实于现行 UI:刷新失败文案更新为实际字符串「刷新模型目录失败」(
messages.ts:3353),编辑器路径(provider-row-summary→「编辑」→「服务商编辑器」)与ProviderModelSettings.tsx吻合,所有预置 id 均入providerIds逆序清理。
VERDICT: approve-with-nits


What type of PR is this?
/kind bug
What does this PR do / why do we need it:
模型注册表的「添加 Provider」独立入口已经并进连接向导,但
journey-provider-model-catalog(J7)仍去点那个按钮,GitHub 镜像上整条旅程卡在第 1 步超时 240 秒。连接向导自己的旅程也有两处独立缺陷:共享栈上没建立「实例无模型」前提,以及用严格浮点先后去量提交按钮是否压住底栏。本 PR 只改两个 Playwright 规格,不改产品代码:
requireFirstRunState),布局断言允许不到 1 个 CSS 像素的重叠(亚像素取整,不是布局回归)。baseUrl/apiVariant/modelDiscovery」搬进向导旅程(覆盖 MiniMaxapi.minimaxi.com与智谱open.bigmodel.cn,以及openai-models)。Which issue(s) this PR fixes:
Fixes #
Test Plan and Test result:What scenarios were tested, and what were the verification results(Function, performance, reliability, etc.):
GitCode head:
1ea1107b(基于当前origin/main0a0403ae)。与 GitHub PR #113 heade4cd234c的规格补丁 patch-id 相同;GitHub 侧因镜像合入 SHA 不同,在cd313156上验证。GitHub Actions run:https://github.com/openJiuwen-ai/sciencediscovery/actions/runs/35555337267 (head
e4cd234c)E2E 总判定:PASS
被测补丁与本 PR 规格文件相同。
2 条 skipped 是既有条件跳过,不是本 PR 引入。未改产品默认行为,未削弱预设 endpoint 断言。
Self-checklist:(请自检,在[ ]内打上x,我们将检视你的完成情况,否则会导致pr无法合入)