Skip to content

[BUG MODEL]: Magistral models ignore tool_choice="required" and return text instead of tool calls #419

@bilelomrani1

Description

@bilelomrani1

Models

magistral-medium-2509
magistral-medium-latest
magistral-small-2509
magistral-small-latest

Request Payload

import asyncio
import os
from mistralai import Mistral

TOOL = {
    "type": "function",
    "function": {
        "name": "get_weather",
        "description": "Get the current weather for a city",
        "parameters": {
            "type": "object",
            "properties": {"city": {"type": "string", "description": "City name"}},
            "required": ["city"],
        },
    },
}

async def main():
    client = Mistral(api_key=os.environ["MISTRAL_API_KEY"])
    for model in [
        "magistral-medium-2509",
        "magistral-medium-latest",
        "magistral-small-2509",
        "magistral-small-latest",
    ]:
        resp = await client.chat.complete_async(
            model=model,
            messages=[{"role": "user", "content": "Say hello."}],
            tools=[TOOL],
            tool_choice="required",
            max_tokens=256,
            temperature=0,
        )
        choice = resp.choices[0]
        print(f"{model}: finish_reason={choice.finish_reason}, tool_calls={choice.message.tool_calls}")


asyncio.run(main())

Output

All four magistral models return a text response with no tool calls, despite tool_choice="required":

magistral-medium-2509:   finish_reason=length, tool_calls=None
magistral-medium-latest: finish_reason=length, tool_calls=None
magistral-small-2509:    finish_reason=length, tool_calls=None
magistral-small-latest:  finish_reason=length, tool_calls=None

The response content is a plain text greeting (e.g. "Hello! How can I assist you today?") with no tool invocation.

Expected Behavior

When tool_choice="required" is set, the model should always produce at least one tool call, regardless of the prompt content. This is the documented behavior and works correctly with other Mistral model families (e.g. mistral-large-latest, mistral-small-latest, codestral-latest).

Additional Context

No response

Suggested Solutions

No response

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions