1
T-273
ila edited this page 2026-08-07 16:37:12 +08:00

同步来源:docs/tasks/T-273.md · commit afc651f75a3a


id: T-273 title: 在 Roubao API 设置中测试本地模型配置 phase: 2 deps:

  • T-207
  • T-272 status: DONE created: 2026-08-01 context_ref: c0011d4 work_branch: null write_paths:
  • docs/tasks/T-273.md
  • docs/current-state.md
  • docs/02-requirements.md
  • docs/04-architecture.md
  • docs/05-coding-rules.md
  • android-buyer/app/src/main/**
  • android-buyer/app/src/test/**

问题 / 背景

Roubao 设置页可以保存本机 provider、Base URL、API Key 和模型,也可以通过 GET /models 获取模型列表,但该请求不能证明所选模型支持实际采购链路使用的 OpenAI 兼容多模态 chat/completions。配置错误目前只能在领取任务后暴露,既浪费搜索轮次,也 容易把模型不可用误判为规格或自动化失败。

本任务在“API 配置”分组增加显式测试按钮,只检查当前手机本地配置,不经过 Admin。

行为契约

  1. “测试模型”使用当前已保存的 provider、Base URL、API Key 和 model;测试开始前执行 与正式 VLM 相同的必填项和端点安全校验,不读取任务、相册、截图或采购数据。
  2. 请求使用内置、固定且不含业务信息的测试图和固定提示词,对 POST <baseUrl>/chat/completions 发出一次多模态请求,以证明鉴权、模型名、请求格式和 图片输入均可用。不得自动重试或跟随重定向。
  3. 按钮执行期间显示测试中并保持禁用,避免重复付费请求;离开页面或 Activity 销毁时 协程取消必须取消 HTTP call。
  4. 成功只显示“模型可用”;失败按本地配置、端点安全、鉴权、模型不存在/不支持、限流、 服务端、网络/超时和响应格式分类。UI、日志和崩溃记录不得包含 API Key、完整 endpoint、 固定测试图 Base64 或供应商响应正文。
  5. 测试结果只存在当前 UI 状态,不写 SharedPreferences、数据库、outbox 或 Admin;成功 也不替代真实任务质量验收。

方案

  1. 增加 provider-neutral 的模型连通性测试器和稳定结果枚举,使用有界响应、单次请求、 禁止重定向的 OkHttp client。
  2. 在设置页增加带状态的“测试模型”命令项,并由 MainActivity 使用当前设置执行测试。
  3. 使用 MockWebServer 覆盖请求契约、Bearer 脱敏边界、成功、鉴权、模型、限流、服务端、 超大/非法响应、网络失败和协程取消。

验收要点

  • 配置完整时点击一次只产生一个带固定测试图的 chat/completions 请求。
  • 测试中不能再次触发;成功和分级失败均在设置页明确显示。
  • 非安全 endpoint、空 model 和要求凭证但 Key 为空时不发网络请求。
  • 响应正文、API Key、完整 endpoint 和图片 Base64 不进入 UI、日志或持久化。
  • Android 单测、lint、Debug/Release APK 构建通过。

边界

  • 不新增后端模型代理、Admin 配置、数据库字段或任务 payload 字段。
  • 不使用真实任务图片,不评价模型的商品匹配质量、价格或供应商稳定性。
  • 不把测试成功作为自动下单授权,也不改变 execution 已冻结的模式。

执行记录

  • 2026-08-01:根据设置页需要主动验证本机模型配置的需求创建任务,状态 TODO。
  • 2026-08-01:完成设置页“测试模型”按钮、执行中防重、当前配置校验和无持久化结果; 新增单次固定红色测试图请求以及鉴权、模型、限流、服务端、网络、超时和响应异常分类。 Debug/Release 各 448 项单测、lintDebug、assembleDebug、assembleRelease 全部通过, 状态改为 DONE。真实 provider 未调用,本任务不声明真实供应商质量或稳定性。