Model gpt-realtime-2.1-mini not calling function tools in SIP Realtime, while gpt-realtime-mini works with the same prompt/tools

Hi everyone,

I’m testing a voice agent using the OpenAI Realtime API via SIP.

I have a production flow that works +/- correctly with gpt-realtime-mini: the assistant collects a delivery order by phone, confirms the order with the caller, and then calls a function tool to register/send the order to my system.

However, when I change only the model to gpt-realtime-2.1-mini, using the same prompt, same SIP accept payload, same tools, and same backend handler, the model does not call the function tool. Instead, after collecting and confirming the order, it answers something like:

“I understand, but I can’t register the order here. You should contact human support or use WhatsApp.”

This does not happen with gpt-realtime-mini. With the older model, the function is called as expected.

My SIP accept payload is basically:

return [
    'type' => 'realtime',
    'model' => gpt-realtime-2.1-mini,

    'instructions' => PROMPT,

    'output_modalities' => ['audio'],

    'audio' => [
        'input' => [
            'format' => [
                'type' => 'audio/pcm',
                'rate' => 24000
            ],
            'noise_reduction' => [
                'type' => 'far_field'
            ],
            'transcription' => [
                'model' => 'gpt-4o-transcribe',
                'language' => 'pt',
                'prompt' => 'Transcribe with maximum fidelity. Proper names are critical. Do not correct names. If you’re unsure, keep exactly what you heard.'
            ],
            'turn_detection' => [
                'type' => 'server_vad',
                'threshold' => 0.6,
                'prefix_padding_ms' => 500,
                'silence_duration_ms' => 1100,
                'idle_timeout_ms' => 12000,
                'create_response' => true,
                'interrupt_response' => true,
            ],
        ],
        'output' => [
            'format' => [
                'type' => 'audio/pcm',
                'rate' => 24000
            ],
            'voice' => $voice,
        ],
    ],

    'tools' => $tools,
    'tool_choice' => 'auto'
];

The main function tool is similar to this:

{
  "type": "function",
  "name": "send_notification_2",
  "description": "Registers and sends a confirmed delivery order to the system. Use only when all required fields are complete and confirmed.",
  "parameters": {
    "type": "object",
    "properties": {
      "resp_endereco": {
        "type": "string",
        "description": "Delivery address"
      },
      "resp_quantidade": {
        "type": "string",
        "description": "Product and quantity"
      },
      "resp_observacao": {
        "type": "string",
        "description": "Optional delivery notes"
      }
    },
    "required": [
      "resp_endereco",
      "resp_quantidade"
    ]
  }
}

Expected behavior:

  1. Caller asks for a gas delivery.

  2. Assistant collects product/quantity and address.

  3. Assistant confirms the full order.

  4. Caller confirms.

  5. Assistant calls send_notification_2.

  6. Backend executes the function and returns the result.

Actual behavior with gpt-realtime-2.1-mini:

  1. Caller asks for a gas delivery.

  2. Assistant collects product/quantity and address.

  3. Assistant confirms the full order.

  4. Caller confirms.

  5. Assistant does not emit a function call.

  6. Assistant replies that it cannot register/send the order directly and suggests human support or WhatsApp.

Actual behavior with gpt-realtime-mini:

The same flow successfully emits the function call and the order is registered.

I also tried making the prompt more explicit, with instructions such as:

  • “The assistant is allowed to register orders during the call.”

  • “Registering an order means executing the function tool.”

  • “Never say you cannot register the order if the required fields are complete.”

  • “After order confirmation, call the function.”

But gpt-realtime-2.1-mini still avoids the function call.

I also tested adding text to output_modalities, but in the SIP accept flow this caused the WebSocket connection to fail with:

Unexpected server response: 404

So I reverted to:

"output_modalities": ["audio"]

Questions:

  1. Is there any known difference in tool calling behavior between gpt-realtime-mini and gpt-realtime-2.1-mini?

  2. Is gpt-realtime-2.1-mini expected to support function calling in Realtime SIP sessions the same way as gpt-realtime-mini?

  3. Should function tools be configured differently for gpt-realtime-2.1-mini?

  4. Is there a recommended way to force or strongly bias function calling after confirmation in SIP Realtime?

  5. Could create_response: true with server VAD affect tool calling decisions in this model?

Any suggestions on what to log or test would be appreciated. I can share sanitized event logs if helpful.

As I know, the 2.1-mini it’s working better then tha old mini model to listen and answer voice calls.

The voice call and the prompt is totally in Portuguese, because it I don’t share details.

No one is using the model gpt-realtime-2.1-mini?

I tried to reproduce the issue using the code you provided, but got the expected results. This suggests that the issue is not with the model or SIP. It is more likely related to the prompt or conversation state, turn segmentation, or the way backend events are handled.

Maybe you can share a bit more context?

thank you @veitb I can share the full prompt here # REGRAS IMPORTANTES DE VOZ:- Fale curto, objetivo e com simpatia (máx. ~50 - Pastebin.com

It’s in portuguese, but may can help you understand better.

Hi @leandro-ligmee
bom dia

I can confirm that the gpt-realtime-2.1-mini can call tools. And for us it is working better than gpt-realtime-mini.. In fact we are dropping one and leaving 2.1 mini only.

But when I see your error “I understand, but I can’t register the order here. You should contact human support or use WhatsApp.”, this looks like a guardrail error. You should post the logs that the LLM got for it to generate this error.

My gut feeling tells me that the prompt that you had for mini needs to be adjusted to work for gpt-2.1-mini. (we have this problem - we see that prompts need adjustment when models are udpated. BUT most times, the adjustments happen to be automatically backward compatible with the older model. So don’t worry.

Im also interested in updates on gpt-realtime-2.1-mini so keep me updated on your experience.

BTW I see this in your log

‘model’ => ‘gpt-4o-transcribe’,

I think you should be using this instead gpt-realtime-transcribe (there are 4 models for transcriptiopn and the realtime is designed for relatime applications)

See you around

God bless