litellm/tests/unit/llms/openai/realtime
Wang Yunzhuo a2f792634e
fix: preserve explicit provider for async image, audio, and realtime routes (#36346)
* fix(images): preserve explicit provider for async generation

* test(images): prove a bare model name reaches its explicit provider on the async path

* fix(images): validate async provider hints instead of reading untyped kwargs

Read custom_llm_provider and api_base in aimage_generation through a TypeAdapter over a small TypedDict, so the provider lookup gets typed values and the basedpyright gate stays within its merge-base ceiling

* fix: answer bad provider hints with a 400 and keep the explicit provider for async speech and transcription

* fix: keep the explicit provider for realtime and cover the audio bad-hint 400

* fix: keep the explicit provider on the realtime HTTP routes and read base_url in async audio

* fix: stop async image generation from rejecting a base_url it never reads

* fix(audio): skip base_url validation when api_base is set on async speech and transcription

* test(integration): cover a declared provider with a bare model on image, audio, and realtime routes

---------

Co-authored-by: mateo-berri <277851410+mateo-berri@users.noreply.github.com>
2026-10-15 05:21:43 -07:00
..
__init__.py test: move tests/test_litellm/llms into tests/unit/llms (#43191) 2026-09-25 12:43:23 -07:00
README.md test: move tests/test_litellm/llms into tests/unit/llms (#43191) 2026-09-25 12:43:23 -07:00
test_openai_realtime_handler.py fix: preserve explicit provider for async image, audio, and realtime routes (#36346) 2026-10-15 05:21:43 -07:00
test_transcription_sessions.py refactor(llms): expose public names for private provider helpers (#45037) 2026-10-07 08:49:25 -07:00

OpenAI Realtime Handler Tests

Important Context: additional_headers vs extra_headers

Background

There was confusion about the correct parameter name for passing headers to websockets.connect(). This README documents the resolution for future maintainers.

Timeline of Changes

  1. Dec 5, 2025 - Changed extra_headers → additional_headers (commit 8db7f1b8e4)
  2. Dec 18, 2025 - Changed extra_headers → additional_headers again (PR #17950, commit 9f88d61d10)
  3. Jan 15, 2026 - Upgraded websockets from 13.1.0 → 15.0.1 (commit a3cf178e24, Issue #19089)

The Issue & Resolution

The websockets library changed its API between versions:

  • websockets < 14.0: Used extra_headers parameter ✅
  • websockets >= 14.0: Uses additional_headers parameter ✅

LiteLLM uses websockets 15.0.1 (per uv.lock), which requires additional_headers.

Verification

You can verify the correct parameter name:

uv run python -c "import websockets; import inspect; print(inspect.signature(websockets.connect))"

This shows: additional_headers: 'HeadersLike | None' = None for websockets 15.0.1.

Current Implementation (Correct)

# ✅ Correct for websockets 15.0.1+
await websockets.connect(url, additional_headers={
    "Authorization": f"Bearer {api_key}",
    "OpenAI-Beta": "realtime=v1"
})

Impact

This is NOT just a test fix - this was a critical bug that affected all realtime APIs:

  • OpenAI realtime
  • Azure realtime
  • xAI realtime
  • Any pass-through realtime connections

Using extra_headers with websockets 15.0.1 resulted in:

TypeError: connect() got an unexpected keyword argument 'extra_headers'

For Future Maintainers

If you see test failures related to header parameters:

  1. Check installed websockets version:

    uv run python -c "import websockets; print(websockets.__version__)"
    
  2. Check uv.lock for the pinned version

  3. Verify the correct parameter:

    • websockets >= 14.0: use additional_headers
    • websockets < 14.0: use extra_headers
  4. Ensure consistency across all files:

    • litellm/llms/openai/realtime/handler.py
    • litellm/llms/azure/realtime/handler.py
    • litellm/llms/custom_httpx/llm_http_handler.py
    • litellm/realtime_api/main.py
    • litellm/proxy/pass_through_endpoints/pass_through_endpoints.py

Current Status (Feb 2026):

  • ✅ websockets version: 15.0.1
  • ✅ Correct parameter: additional_headers
  • ✅ All handlers updated and working