Skip to content

opencode zen: Malformed request (HTTP 400) - tools[N].function.name missing; opencode go works #7626

Description

@Dicklee18

摘要

在 Reasonix 中選用 opencode zen 端點(OpenAI-compatible gateway)的任何模型時,請求被網關拒絕:

Malformed request (HTTP 400): the request body was rejected.
Error from provider (Console): Upstream request failed: [invalid_request_error]
46 request validation errors: Missing required input field: 'tools[0].function.name';
Missing required input field: 'tools[1].function.name'; ...

同一台機器改用 opencode go 端點(同樣的模型、同樣的 tools)則正常,證明問題出在 Reasonix 對這類 OpenAI-compatible 網關的工具序列化格式,而非模型或 key。

環境

  • Reasonix:Desktop v1.19.7(revision 295b3f7
  • OS:Windows 11 / amd64
  • Node:v24.16.0
  • 端點:opencode zen(OpenAI-compatible /v1/chat/completions
  • 對照組:opencode go(同網關同模型,正常)

重現步驟

  1. 在 Reasonix 新增/選用 provider = opencode zen,模型 = 任意(如 deepseek-v4-flash / deepseek-v4 / minimax)。
  2. 送出任何會觸發工具呼叫的對話(本會話 tools 共 46 個)。
  3. 收到 HTTP 400,錯誤如上;46 個 tools 全部回報缺 function.name

根因分析(供維護者參考)

Reasonix 內部工具結構為(docs/SPEC.md §4):

type ToolSchema struct {
    Name, Description string
    Parameters json.RawMessage
}

但在對 OpenAI-compatible 網關序列化時,tools 陣列沒有把 Name 包裝成標準 OpenAI 格式的 function.name

// 預期(OpenAI 標準)
{"type":"function","function":{"name":"...","description":"...","parameters":{...}}}
// 實際送出(疑似)缺 function.name,導致 400

docs/GUIDE.zh-CN.md「兼容設置」說明 tools 等核心字段由 Reasonix 控制、不接受覆寫,因此用戶端無法繞過。

影響範圍

  • opencode zen 端點下所有模型無法使用(blocking)。
  • opencode go 端點不受影響(其接受較寬鬆格式)。
  • 任何嚴格執行 OpenAI tools schema 驗證的 gateway 都會中招。

期望行為

Reasonix 對 OpenAI-compatible 端點送出標準格式的 tools[{type:"function", function:{name, description, parameters}}],使 opencode zen 等嚴格網關正常運作。

附註

  • 錯誤訊息全文 46 條 identical 錯誤,僅 tools[N] 索引不同。
  • 若需要實際請求 body 的抓包樣本,我可以再提供(需先開啟 Reasonix 的 debug log)。

Metadata

Metadata

Assignees

No one assigned

    Labels

    agentCore agent loop (internal/agent, internal/control)windowsWindows-specific

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions