Skip to content

bug: Qwen2.5 tool calling broken in oa-compat provider — tools not properly formatted in toOaCompatibleRequest #11171

Closed

Description

@Almoosawi

Description

Description

Qwen2.5 models fail to perform tool calls when using the oa-compat provider format. The same model works correctly in Open WebUI.

Root Cause

In packages/console/app/src/routes/zen/util/provider/openai-compatible.ts, the toOaCompatibleRequest function has two issues:

  1. Assumes flat tool format only — The tools mapping does tool.name, tool.description, tool.parameters directly, but CommonTool objects arriving from other format converters may already be in the nested OpenAI format { type: "function", function: { name, description, parameters } }. When tools arrive nested, tool.name is undefined and the tool definition sent to the model is empty.

  2. Missing strict field — The CommonTool interface in provider.ts defines strict?: boolean, but toOaCompatibleRequest drops it during tool mapping. Some models (including Qwen2.5) rely on this field.

Current code (line 189)

const tools = Array.isArray(body.tools)
  ? body.tools.map((tool: any) => ({
      type: "function",
      function: {
        name: tool.name,
        description: tool.description,
        parameters: tool.parameters,
      },
    }))
  : undefined


### Plugins

_No response_

### OpenCode version

_No response_

### Steps to reproduce

_No response_

### Screenshot and/or share link

_No response_

### Operating System

_No response_

### Terminal

_No response_

Activity

  1. github-actions commented on Jan 29, 2026

    @github-actions
    Contributor

    This issue might be a duplicate of existing issues. Please check:

    These issues all relate to tool calling failures with Qwen and OpenAI-compatible providers. Your detailed analysis of the root cause (nested tool format handling and missing strict field) might help resolve these related issues as well.

    Feel free to ignore if none of these address your specific case.

  2. Almoosawi commented on Jan 29, 2026

    @Almoosawi
    Author

    can you check this fix and implement if it's correct please:
    const tools = Array.isArray(body.tools)
    ? body.tools.map((tool: any) => {
    const t = tool.function ? tool.function : tool // <-- KEY FIX #1
    return {
    type: "function",
    function: {
    name: t.name,
    description: t.description,
    parameters: t.parameters,
    strict: t.strict, // <-- KEY FIX #2
    },
    }
    })
    : undefined

  3. github-actions commented on Apr 1, 2026

    @github-actions
    Contributor

    To stay organized issues are automatically closed after 90 days of no activity. If the issue is still relevant please open a new one.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Labels

bugSomething isn't workingzenRelates to Zen

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions