Skip to content

fix(model): unify Responses API compatibility#8

Merged
kunkundi merged 3 commits into
kunkundi:mainfrom
CyrusAuyeung:codex/model-api-compatibility
Jul 17, 2026
Merged

fix(model): unify Responses API compatibility#8
kunkundi merged 3 commits into
kunkundi:mainfrom
CyrusAuyeung:codex/model-api-compatibility

Conversation

@CyrusAuyeung

Copy link
Copy Markdown
Contributor

修改内容

  • 新增共享模型 API 兼容层,统一构造 Chat Completions 与 Responses 请求。
  • 将交易决策、A 股消息面预检、X 监控、美股评级日报、隔夜美股总结、A 股盘面总结及候选行业分类的模型 HTTP 调用收口到共享层。
  • 同时支持 Chat JSON、Chat SSE、Responses JSON 和 Responses SSE,包括网关在 stream=false 时仍强制返回 SSE 的情况。
  • 按接口映射 max_tokens / max_output_tokens;GPT-5.6 网关别名不再发送已确认不支持的 max_output_tokens,其他 Responses 网关若明确返回该参数不受支持,会去参重试一次。
  • 为 A 股消息面预检新增 DASHBOARD_NEWS_API_MODE=auto|responses|chat。默认 auto 会为 Grok 4.5 和 GPT-5 系列搜索模型选择 Responses API,并传入 web_search
  • 同步设置页、示例配置和中英文运维文档。

问题原因

各模型调用点此前分别维护端点、请求参数和响应解析逻辑,导致兼容行为逐渐分叉:

  • 部分调用固定发送 max_output_tokens,遇到不支持该字段的兼容网关会返回 400。
  • 部分调用只解析 JSON,或只按 Chat SSE 的 choices[].delta 解析,无法读取 Responses SSE 的 response.output_text.delta
  • 消息面预检固定调用 /chat/completions,无法使用通过 Responses 暴露的实时搜索工具。

Closes #7

兼容性与影响范围

  • 不修改策略评分、交易阈值、仓位、风控或账户数据。
  • 不新增第三方依赖。
  • 既有 Chat 模型继续使用 Chat Completions;未知搜索模型在 auto 下仍保持旧的 Chat 行为,可显式选择接口模式。
  • Grok 4.5 继续在 auto 下使用 Responses 搜索工具。
  • 配置项在下一轮模型任务生效。

验证结果

  • python -m unittest tests.test_sell_strategy_rules tests.test_multi_strategy_rules tests.test_model_api tests.test_news_precheck_config tests.test_x_watchlist_monitor tests.test_us_rating_report tests.test_us_market_summary tests.test_a_share_grok_summary
    • 171 项通过。
  • 模型兼容层、消息面、X、评级、总结和设置页定向回归:
    • 69 项通过。
  • node --check frontend/admin.js:通过。
  • git diff --check:通过。
  • 使用工作区完整依赖运行 scripts/validate.sh
    • Python、JavaScript、Shell、BAT 语法检查全部通过;
    • 437 项单测中 432 项通过,剩余 5 项均可在未修改的最新 main 上复现,属于 Windows/Git Bash 的既有路径分隔符、POSIX 权限位和子进程中文编码差异,与本次改动无关。

@CyrusAuyeung

Copy link
Copy Markdown
Contributor Author

补充真实兼容网关烟雾验证(未使用或输出任何密钥、账户数据):

  • 使用提交 d2d91892084c727f3b22ee07a17c2e23a33916e7 构建容器镜像。
  • 消息面模型以 responses 模式发送 web_search 请求;请求体已确认不含该上游不支持的 max_output_tokens / max_tokens
  • 上游实际返回可解析的非空搜索结果:22.5 秒、195 个字符。
  • 部署后 dashboard 健康,dashboard/scheduler/x-watchlist 均为 0 次重启;本机与公网 HTTP 均为 200。
  • 切换后日志中未发现 Traceback、fatal、unsupported parameter 或 max_output_tokens 参数错误。

@kunkundi kunkundi left a comment

Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

对照 issue #7,本次实现的整体方向合理:PR 已完成共享模型 API 兼容层、Chat/Responses 请求参数映射、JSON/SSE 响应解析,以及消息面预检的 auto|responses|chat 配置,主要功能和文档也基本同步。

不过,合并前仍需处理以下兼容性问题:

  1. X 监控会误用 GPT 的 Responses 接口

    Issue #7 只要求 A 股消息面预检在使用 GPT-5 搜索模型时切换到 Responses。当前共享逻辑却会影响所有携带搜索工具的调用:X 监控传入 x_search 后,GPT-5 也会从原来的 Chat 接口切换到 Responses,并发送可能不受支持的 x_search 参数。

    建议只在消息面预检使用 web_search 时为 GPT-5 选择 Responses;X 监控保持原有接口,除非用户明确配置 responses

  2. X 监控的临时故障处理发生回归

    共享解析器现在对空响应或非 JSON 响应抛出 ValueError,但 X 监控只把 JSONDecodeError 识别为临时上游故障。对相同空响应的对比结果显示:基线会静默等待下一轮轮询,本 PR 则会将其视为非临时任务失败。

    这不符合 issue #7 中“保持既有超时和重试逻辑兼容”的要求。建议定义专用的模型响应解析异常,并在 X 监控中将其按临时错误处理,同时增加空响应和非 JSON 响应的回归测试。

  3. 去除 max_output_tokens 的重试条件过宽

    _unsupported_output_limit()invalid parameter 也视为“不支持该字段”。如果网关实际表达的是 max_output_tokens 数值超限,当前实现也会删除用户配置的输出上限并重试。

    Issue #7 要求仅在网关明确不支持该字段时安全去参。建议收紧匹配条件,并增加“参数值非法时不得去参重试”的测试。

PR 中补充的真实网关烟雾测试已经验证了 GPT 消息面 Responses 的成功路径,但没有覆盖上述 X 监控、空响应降级和错误参数分类场景。

另外,PR 仍需解决与最新 main 的文档冲突,并在解决后重新运行 CI。修正以上边界并补充回归测试后,可再次评审。

@CyrusAuyeung

CyrusAuyeung commented Jul 17, 2026

Copy link
Copy Markdown
Contributor Author

已按本轮评审意见完成修改,更新提交为 625f9383b27d2ebfe3776a97d43fdc0fca18d545

已处理的兼容性问题

  1. 收窄 GPT 自动 Responses 路由范围

    • GPT-5 现在只有在使用 web_search 时,才会在 auto 模式下自动选择 Responses API。
    • X 监控传入 x_search 且模型为 GPT-5 时,会保持原有 Chat Completions 行为。
    • Grok 4.5 的 x_search 以及用户显式配置 responses 的行为保持不变。
  2. 恢复 X 监控的临时故障降级

    • 新增专用的 ModelResponseParseError
    • 空响应、非 JSON/SSE 响应会抛出该异常。
    • X 监控将其与 JSONDecodeError 一样视为临时上游故障,等待下一轮轮询,不再升级为非临时任务失败。
  3. 收紧 max_output_tokens 去参重试条件

    • 仅在上游明确表示参数“不支持、未知或无法识别”时去参重试。
    • “参数值非法、数值超限”等错误会保留原请求并直接向上抛出,不再错误删除用户配置的输出上限。
    • 同时修正检查 400 响应后恢复 HTTPError 响应体的兼容细节。
  4. 解决最新 main 冲突

    • 已语义合并最新 main
    • 文档同时保留本 PR 的 DASHBOARD_NEWS_API_MODE 说明和主分支新增的问财龙虎榜配置,没有选择整文件覆盖。

新增回归覆盖

  • GPT + x_searchauto 下保持 Chat。
  • 空响应和非 JSON 响应在 X 监控中按临时错误处理。
  • max_output_tokens 数值非法时不得触发去参重试。
  • 原有 Grok 4.5 Responses/X Search 和显式接口模式行为继续通过。

验证结果

  • 定向模型/X 测试:30/30 通过。
  • 模型与策略整组测试:180/180 通过。
  • GitHub Linux Validate:通过。
  • PR 当前无冲突、可合并。

本机完整验证共 477 项,472 项通过;剩余 5 项均已在最新未修改的 main 上复现,属于 Windows/Git Bash 的既有路径、权限位和中文编码差异。

@kunkundi 烦请重新评审,谢谢。

@CyrusAuyeung
CyrusAuyeung requested a review from kunkundi July 17, 2026 01:45

@kunkundi kunkundi left a comment

Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

对照 issue #7 及上一轮评审意见,最新提交已完成相关兼容性修正:

  • GPT 自动选择 Responses 的范围已收窄到 web_search,X 监控的 x_search 保持原有 Chat 路径。
  • 空响应和非 JSON 响应已使用专用异常处理,X 监控仍按临时上游故障降级。
  • max_output_tokens 仅在上游明确表示不支持时去参重试,并覆盖常见错误表述;参数值非法时不会错误重试。
  • 与最新 main 的冲突已解决,配置、前端说明及中英文文档保持同步。

相关回归测试和 GitHub Validate 均已通过,PR 当前无冲突、可正常合并。未发现新的阻塞问题,同意合并。

@kunkundi
kunkundi merged commit 842f9da into kunkundi:main Jul 17, 2026
1 check passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[Bug] 模型调用未统一兼容 Responses 参数与强制 SSE

2 participants