Skip to content

feat(core): 补齐 OpenAI SDK 最新 provider 能力(Chat 参数透传 + Streaming + Responses API 双栈) #216

@minorcell

Description

@minorcell

背景

Memo 当前 provider 层基于 OpenAI SDK 调用 chat.completions.create,但参数能力与 SDK 最新能力存在明显缺口。

本 issue 目标:基于最新 OpenAI SDK 能力做一次 provider 能力补齐设计,并给出可执行升级路线。

调研结论(2026-05)

1) SDK 版本差异

  • Memo 当前依赖openai@^6.10.0package.json
  • npm 最新版本6.38.0npm view openai version

2) 官方推荐方向

  • OpenAI Node README 明确:Responses API 是主 API,Chat Completions 仍长期支持。

3) Memo 当前 provider 实现现状

  • 仅走 chat.completions.create(...)packages/core/src/runtime/defaults.ts
  • 请求构建仅覆盖:model/messages/tools/tool_choice/parallel_tool_calls
    • buildChatCompletionRequest(...)packages/core/src/runtime/model_profile.ts
  • wire API 被固定为:chat_completions
    • ModelWireApi = 'chat_completions'packages/core/src/runtime/model_profile.ts
  • model_profiles 当前仅支持:
    • supports_parallel_tool_calls
    • supports_reasoning_content
    • context_window
    • 定义见:packages/core/src/config/config.ts
  • TUI 当前无入口编辑 reasoning_effort / response_format / verbosity / stream 等 provider 参数。

能力对比矩阵(最新 SDK vs 当前 Memo)

能力 OpenAI SDK(6.38) Memo 当前 差距
Chat 基础调用
reasoning_effort(chat) 未透传
verbosity(chat) 未透传
response_format(json_schema/json_object/text) 未透传
prompt_cache_key/retention 未透传
service_tier / safety_identifier 未透传
prediction 未透传
modalities/audio 未透传
stream + stream_options ⚠️(仅非流) 未实现流式通道
Responses API (client.responses.create) ✅(主路径) 完全未接入
Responses reasoning 配置(reasoning.effort/summary 完全未接入
Responses 内建工具(web/file/code_interpreter/mcp 等) 完全未接入
Responses 会话状态(previous_response_id / truncation 完全未接入
Provider 特有扩展字段(如 deepseek thinking 运行时可传(TS 非强约束场景) ❌(无扩展参数机制) 缺少扩展透传层

升级方案(建议分三阶段)

Phase 1(低风险补齐:Chat 参数透传)

目标:在不切换 wire API 的前提下,快速释放新参数能力。

  1. 扩展 ModelProfileOverrideconfig.toml 可配置)
    • 新增可选字段(建议首批):
      • reasoning_effort
      • verbosity
      • response_format(支持 text/json_object/json_schema
      • prompt_cache_key / prompt_cache_retention
      • service_tier
      • safety_identifier
      • stream(后续 Phase 2 真正生效)
  2. 扩展 buildChatCompletionRequest(...) 参数合成逻辑
  3. 加入 provider 级“额外请求字段”机制(例如 extra_request_fields
    • 用于兼容 OpenAI-compatible 服务的非标准字段(如 thinking
  4. 增补单测:配置解析 + 请求构建 + 回归

Phase 2(流式能力打通)

目标:让 onChunk 真正生效。

  1. 在 core callLLM 中支持 stream: true 分支
  2. 解析 chat streaming 事件增量并回调 _onChunk
  3. 处理 tool call streaming 聚合(保持现有工具调用行为一致)
  4. TUI 增加 streaming 开关(会话级/配置级)

Phase 3(引入 Responses API 双栈)

目标:升级架构到“可选 wire API”,逐步向 Responses 迁移。

  1. ModelWireApi 扩展为:'chat_completions' | 'responses'
  2. 新增 buildResponsesRequest(...) + responses -> LLMResponse 归一化层
  3. 将 tool definitions 映射到 Responses tools
  4. 支持 Responses 关键能力:
    • reasoning 对象
    • previous_response_id
    • truncation
    • text 配置(结构化输出)
  5. 在 provider/model profile 层提供迁移开关(按 provider:model 灰度)

可升级项拆分(可直接建子任务)

  1. core/config: 扩展 ModelProfileOverride schema 与序列化/反序列化
  2. core/runtime: 扩展 chat 请求构建字段
  3. core/runtime: 增加 provider extra_request_fields 合并策略(白名单 + 透传日志)
  4. core/runtime: streaming 支持与事件归一化
  5. core/runtime: Responses API adapter(请求构建 + 响应归一化)
  6. tui: /effort/format(或统一 /model-params)入口(可关联 feat(tui): 增加 /effort 命令用于推理强度与上下文策略切换 #211
  7. docs: 配置文档新增 provider 参数与 wire API 说明
  8. tests: defaults/model_profile/config/tui 命令端到端覆盖

兼容性与风险

  • 兼容性:默认保持 chat_completions 不变,新增能力均为可选配置,避免破坏现有用户。
  • 风险点
    1. 不同 OpenAI-compatible 厂商对新字段支持不一致(需 provider/model 级开关)
    2. streaming + tool call 的增量拼装复杂,需重点测试
    3. Responses API 的 tool item 语义与当前 LLMResponse 存在映射差异

验收标准

  • 可通过配置开启 reasoning_effort / verbosity / response_format
  • 对 OpenAI-compatible provider 支持非标准字段透传(含文档)
  • 支持 streaming 并在 TUI 正常增量显示
  • 支持按 provider/model 选择 chat_completionsresponses
  • 全量相关单测通过,已有行为无回归

Metadata

Metadata

Assignees

No one assigned

    Labels

    area:coreCore runtime and session statearea:docsDocumentation and docs UXarea:toolsBuilt-in tools and tool runtimearea:tuiTerminal UI and interaction layerenhancementNew feature or requestneeds-triageIssue needs initial triage

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions