Skip to content

Tool calls fail on reasoning deployments that refuse function tools unless reasoning_effort is "none" #1353

Closed

Description

@QuintinBotes

What happens

On an Azure OpenAI reasoning deployment, every request that carries tools comes back 400 ("Function tools with reasoning_effort are not supported for ") unless the body sets reasoning_effort: "none". Chat then falls back to a single retrieval step, and the governance second look, which needs tools, cannot run, so the pairs it would settle go to people instead.

What exists

#1232 learns max_completion_tokens and drops temperature from a single 400. Main also has a reasoning_effort setting, but with_reasoning_effort puts it into every chat body (crates/utopia-llm/src/lib.rs), so making tool calls work means turning reasoning off for extraction and alignment too.

Proposal

Learn it the way #1232 does: when a request with tools gets that 400, retry with reasoning_effort: "none" and remember it for tool calls only (chat_tools and chat_tools_stream), leaving the other calls as configured. Splitting the setting by call kind (extraction, alignment, tool calls) would also work.

Workaround we run

A small proxy in front of the endpoint that sets reasoning_effort: "none" when tools is non-empty.

Seen on v0.1.0-rc9; checked against main on 2026-10-21.

Activity

  1. WaylandYang commented on Oct 22, 2026

    @WaylandYang
    Contributor

    Thanks, confirmed on dev: the workspace's one reasoning_effort goes into every body, tool calls included. Learning none for tool bodies from the first 400 (the same pattern as the completion ceiling) is the small fix; per-task effort comes with ADR 0067. Note #1232 was closed unmerged, so dev has no learned-from-400 handling beyond the ceiling yet.

  2. added a commit that references this issue on Oct 22, 2026
  3. WaylandYang commented on Oct 23, 2026

    @WaylandYang
    Contributor

    Fixed on dev by #1368: a tool request refused for its reasoning effort is retried with none and the client remembers it. The follow-up for a deployment that refuses none too is #1372.

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

Metadata

Metadata

Assignees

No one assigned

    Labels

    enhancementNew feature or request

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions