Assistants not triggering registered function despite valid tool_choice

Problem

I’ve registered a function called run_reasoning_stack with strict validation and correct schema.

I’m calling my assistant via the /v1/threads/{id}/runs endpoint and trying all supported invocation patterns:

  • tool_choice: “auto”
  • tool_choice: { type: “function”, function: { name: “run_reasoning_stack” } }
  • JSON brief wrapped in triple backticks
  • user.message including the function name naturally
  • strict: true is set inside parameters

Result

The message is received in the thread, but:

  • No function_call is triggered
  • No arguments are passed
  • No tool is selected — even when requested explicitly
  • Even playground direct input fails to trigger execution

What I’ve Ruled Out

  • Broken schema (confirmed correct)
  • Broken API key or permissions
  • Invalid message formatting
  • Server setup (tested via both Assistants and Chat Completions)

Question

Is this a known issue? Has tool_choice or tool_resources routing changed recently?

Has anyone successfully called a function from Assistants v2 this month?

The function must appear to be useful to the AI.

It is not merely some way of getting an output - the function by its description must describe some service offered to the AI that can help answer user questions. When you do that, there is no need to specify a tool choice (which can loop the AI if not used intelligently).

This assistant has a function:

{
  "name": "rand_int",
  "description": "A function that can generate true random integer numbers for the AI. Use for making choices, or whenever breaking deterministic behavior of language generation is desired or required.",
  "strict": true,
  "parameters": {
    "type": "object",
    "required": [
      "range_start",
      "range_end"
    ],
    "properties": {
      "range_end": {
        "type": "integer",
        "description": "The inclusive end of the range"
      },
      "range_start": {
        "type": "integer",
        "description": "The inclusive start of the range"
      }
    },
    "additionalProperties": false
  }
}

Observe the AI call the function when not instructed. The function is useful.

Funny thing though: the AI will still be making up an answer, because it didn’t pre-define for itself what value would be heads..