feat: 兼容 OpenAI Responses API#544
Open
WinSalty wants to merge 1 commit into
Open
Conversation
367fe2a to
2f9bfd9
Compare
4 tasks
新增 Responses API 适配层(ResponsesApi + ResponsesApiChatModel), 实现 ChatModel 接口使上层服务无感切换;前端模型配置增加接口协议选项。 实现要点: - 同步调用挂载统一错误处理并接入重试模板,5xx/网络瞬时错误自动重试, 与 OpenAiChatModel 容错行为对齐 - 流式终包空文本,避免上层 FluxUtil 聚合时全文重复; 未收到任何增量事件时终包降级携带全文,兼容不推送 delta 的服务端 - 多条 SystemMessage 按出现顺序拼接为 instructions - chatApiProtocol 保存入口校验并归一化,新增配置空值回填默认协议, 避免 INSERT 显式 NULL 绕过数据库列默认值 - 运行时 options 按 ChatOptions 接口取值,兼容任意实现 - SSE 畸形事件按单条损坏跳过不中断流,日志截断负载 - 单元测试覆盖协议映射、SSE 事件解析与上述边界行为 Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2f9bfd9 to
3d9130c
Compare
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
概述
解决 #531:部分模型提供商仅支持 OpenAI Responses API(
POST /v1/responses),而当前项目只走 Chat Completions 协议,无法对接这些服务端。本 PR 在不修改上层任何服务/节点代码的前提下,新增 Responses API 适配层,让用户在模型配置中选择接口协议即可完成切换。
改动内容
ChatApiProtocol枚举:定义CHAT_COMPLETIONS(默认)和RESPONSES两种协议ResponsesApi:Responses API 低层 HTTP 客户端,支持同步调用和 SSE 流式调用,所有协议 DTO 以内嵌 record 定义ResponsesApiChatModel:实现ChatModel接口,将 Spring AI Prompt 与 Responses API 请求/响应互转;流式输出与OpenAiChatModel的行为对齐(delta → 文本块,completed → 空文本 + usage 的终包)DynamicModelFactory:按chatApiProtocol配置分支,RESPONSES 走ResponsesApiChatModel,其余走原有OpenAiChatModelModelConfig实体、DTO、Converter、Mapper、Service 全链路增加chatApiProtocol字段chat_api_protocol列,默认值CHAT_COMPLETIONS设计要点
ResponsesApiChatModel实现ChatModel接口,AiModelRegistry、LlmService、全部 16 个图节点零改动FluxUtil对每个 chunk 做文本聚合,终包只携带 finishReason 和 usage,避免聚合结果全文重复RetryUtils.DEFAULT_RETRY_TEMPLATE;SSE 解析对畸形事件(含结构不匹配)记录日志后跳过,不中断流;未知事件类型静默忽略保证向前兼容DynamicModelFactory已有的 proxy RestClient/WebClient 构建链路存量部署升级说明
schema.sql的CREATE TABLE IF NOT EXISTS仅对全新安装生效。已有 MySQL 部署升级时需手动执行:H2 开发环境每次启动自动重建表结构,无需处理。
测试方案
ResponsesApiTest(SSE 事件解析各分支 + 畸形事件容错)、ResponsesApiChatModelTest(请求映射、响应转换、流式终包空文本回归、错误传播)mvn test:0 failures, 0 errors)spring-javaformat:apply格式化通过checkstyle:check0 violationsnpm run lint0 errors集成测试结果
使用 Qwen(通义千问)的 Responses API 端点进行端到端验证,模型
qwen-plus,两条路径均通过:call()stream()验证要点:
response.output_text.delta和response.completed事件🤖 Generated with Claude Code