litellm/tests/test_litellm/proxy
Jason Cook c3932e06d4 fix(oauth): run the OAuth worker on the proxy's main asyncio loop
Reported error during device-code login:

  Tokens obtained but DB persist failed: <asyncio.locks.Event object at
  0x... [unset]> is bound to a different event loop

Root cause: the background worker was a ``threading.Thread`` that ran
``asyncio.run(persist_credential_to_db(item))``. That creates a fresh
event loop in the worker thread, but ``prisma_client``'s internal
asyncio primitives (locks, futures) are bound to the proxy's main loop.
Awaiting a prisma call from the worker loop hits the cross-loop error.

Fix:

- Refactor the background flow from a thread to an asyncio task
  (``asyncio.create_task``) scheduled on the proxy's main loop. Blocking
  IO in the flow (device-code poll, token exchange) runs in
  ``loop.run_in_executor``. The DB persist step (``await
  persist_credential_to_db(item)``) now naturally shares a loop with
  prisma_client. Same treatment for both ChatGPT and Copilot endpoints.

- For the DBAuthenticator refresh path (called from sync
  ``validate_environment`` during a request, same cross-loop risk), add
  ``_register_proxy_main_loop`` + ``_schedule_db_persist`` now prefers
  ``asyncio.run_coroutine_threadsafe`` onto the registered loop.
  ``/chatgpt/oauth/start`` and ``/copilot/oauth/start`` register the loop
  on invocation (guaranteed to be the proxy's main loop). Falls back to
  the old thread + ``asyncio.run`` path only when no loop is registered
  (CLI / tests, where prisma_client is ``None`` anyway).

Tests updated: ``TestBackgroundWorker`` now drives the async task
directly via ``await _run_device_code_flow_async(...)``. The
``test_creates_session_and_spawns_worker`` test stubs the task to a
no-op instead of patching ``threading.Thread``.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-23 10:48:59 -04:00
..
_experimental/mcp_server Merge branch 'main' into litellm_oss_staging_04_04_2026 2026-04-14 20:23:06 +05:30
agent_endpoints test(a2a): assert create_a2a_client default timeout uses DEFAULT_A2A_AGENT_TIMEOUT 2026-04-10 21:18:15 +03:00
anthropic_endpoints Litellm ishaan march 20 (#24303) 2026-03-21 12:40:11 -07:00
auth fix(auth): gate post-custom-auth DB lookups behind opt-in flag (#25634) 2026-04-13 08:02:16 -07:00
chatgpt_oauth_endpoints fix(oauth): run the OAuth worker on the proxy's main asyncio loop 2026-04-23 10:48:59 -04:00
client build: migrate packaging, CI, and Docker from Poetry to uv (#25007) 2026-04-09 11:46:23 -07:00
common_utils fix(budget): align budget table reset times with standardized calendar schedule (#25440) 2026-04-11 19:45:23 -07:00
copilot_oauth_endpoints fix(oauth): run the OAuth worker on the proxy's main asyncio loop 2026-04-23 10:48:59 -04:00
db build: migrate packaging, CI, and Docker from Poetry to uv (#25007) 2026-04-09 11:46:23 -07:00
discovery_endpoints feat: add control plane for multi-proxy worker management 2026-03-19 22:50:19 -07:00
experimental/mcp_server
google_endpoints fix: Metadata / Trace ID Missing in S3 Streaming Callbacks 2026-02-25 14:16:42 +05:30
guardrails Merge branch 'main' into litellm_oss_staging_04_04_2026 2026-04-14 20:23:06 +05:30
health_endpoints address review feedback 2026-04-11 21:52:39 -07:00
hooks Litellm ishaan april1 try2 (#25110) 2026-04-03 14:57:44 -07:00
image_endpoints fixing core proxy tests 2026-02-12 17:54:32 -08:00
management_endpoints Merge branch 'main' into litellm_oss_staging_04_11_2026 2026-04-14 20:54:12 +05:30
management_helpers Merge branch 'main' into litellm_audit_log_s3_export 2026-03-20 16:39:54 -07:00
middleware [Fix] Fix test failures and Docker build from pinned dependency upgrade 2026-04-01 09:43:33 -07:00
openai_files_endpoint Refactor file content streaming handling to improve routing and support 2026-04-11 18:56:15 +00:00
pass_through_endpoints fix(proxy): pass-through multipart uploads and Bedrock custom body 2026-04-09 19:43:57 -07:00
policy_engine Litellm ishaan april4 2 (#25150) 2026-04-04 23:09:42 +00:00
prompts feat: add POST /team/permissions_bulk_update endpoint 2026-04-06 17:45:35 -07:00
public_endpoints feat(ui): expose Azure Entra ID credential fields in provider form 2026-04-04 11:19:45 -07:00
rag_endpoints tests and route permissions (#21508) 2026-02-18 16:58:38 -08:00
realtime_endpoints fix(tests): fix flaky realtime WebRTC endpoint tests 2026-03-12 23:14:51 -07:00
response_api_endpoints Fix x-litellm-key-spend update 2025-12-12 11:44:51 +05:30
spend_tracking fix: hash sk- api_key in /spend/logs date-range path and add filter tests 2026-04-11 23:33:15 -07:00
test_configs
ui_crud_endpoints Update tests/test_litellm/proxy/ui_crud_endpoints/test_proxy_setting_endpoints.py 2026-03-14 15:42:17 -07:00
vector_store_endpoints test_delete_vector_store_checks_access 2026-01-31 12:05:09 -08:00
__init__.py
conftest.py remove conftest patch. TODO: make a different PR for this 2026-04-09 22:29:49 +00:00
test_aiohttp_cleanup_closed.py fix(aiohttp): only set enable_cleanup_closed when required (#21897) 2026-02-23 21:06:29 -08:00
test_aiohttp_session_recovery.py fix: use AsyncMock for concurrent test consistency 2026-03-18 00:54:23 +00:00
test_api_key_masking_in_errors.py fix: mask API keys in error responses for invalid/malformed keys (#20289) 2026-02-12 19:58:05 +05:30
test_audio_speech_prometheus_hooks.py fix req changes 2026-02-28 21:32:57 +05:30
test_batch_expiry.py fix(proxy): improve team expiry enforcement validation 2026-03-03 17:29:39 -08:00
test_batch_metadata_none_fix.py
test_caching_routes.py
test_chat_completion_metadata.py fix: propagate JWT auth metadata to OTEL spans (#19627) 2026-01-23 21:21:23 -08:00
test_common_request_processing.py fix(proxy): preserve dict guardrail HTTPException.detail + bedrock context (#25558) 2026-04-11 09:40:39 -07:00
test_custom_proxy.py
test_empty_model_list.py [Release Fix] (#22411) 2026-02-28 09:46:35 -08:00
test_enforce_user_param.py Enforce support of enforce_user_param to openai post endpoints 2025-12-03 12:19:21 +05:30
test_fallback_management_endpoints.py Add fallback endpoints support 2026-01-16 10:51:33 +05:30
test_fastapi_offline_routes.py
test_health_check_functions.py Litellm ishaan april4 2 (#25150) 2026-04-04 23:09:42 +00:00
test_health_check_max_tokens.py add docs and formatting 2026-02-28 14:08:09 +05:30
test_litellm_pre_call_utils.py feat(proxy): add credential overrides per team/project via model_config metadata (#24438) 2026-04-09 07:22:27 -07:00
test_max_budget_env_var.py Fix PR review issues: gpt-4-0314 prompt caching, case-insensitive data URL check, test I/O mocking 2026-03-21 11:30:29 -07:00
test_model_dump_with_preserved_fields.py Fix_mapped tests part 2 2026-02-26 12:43:39 +05:30
test_model_id_header_propagation.py (fix) propagate x-litellm-model-id in responses (#16986) 2025-11-24 20:40:43 -08:00
test_model_info_default_limits.py refactor: consolidate duplicate helpers and eliminate success-handler double lookup 2026-03-19 07:26:43 -04:00
test_model_level_guardrails.py test: use __file__-relative sys.path for stable test imports 2026-03-16 21:07:07 +01:00
test_openapi_schema_validation.py Reapply "feat: add model_cost aliases expansion support" 2026-03-12 13:36:57 -03:00
test_prometheus_cleanup.py [Infra] Merging RC Branch with Main (#23786) 2026-03-16 15:32:20 -07:00
test_proxy_cli.py build: migrate packaging, CI, and Docker from Poetry to uv (#25007) 2026-04-09 11:46:23 -07:00
test_proxy_server.py Fix failing test and code qa + lint 2026-04-14 20:53:17 +05:30
test_proxy_types.py fix: Add PROXY_ADMIN role to system user for key rotation (#21896) 2026-02-27 19:11:29 -08:00
test_proxy_utils.py fix(proxy): preserve dict guardrail HTTPException.detail + bedrock context (#25558) 2026-04-11 09:40:39 -07:00
test_pyroscope.py Fix CI/CD pyroscope test failure (#21219) 2026-02-14 12:07:20 -08:00
test_response_model_sanitization.py fix: return winning model name instead of comma-separated list for fastest_response 2026-03-27 22:34:26 -07:00
test_route_a2a_models.py Fix test_route_a2a_model_bypasses_router 2026-02-05 09:47:05 +05:30
test_route_llm_request.py Override router settings 2026-01-31 16:04:52 -08:00
test_shared_health_check.py Litellm ishaan april4 2 (#25150) 2026-04-04 23:09:42 +00:00
test_spend_log_cleanup.py Fix spend log cleanup: lock tracking, integer retention, skip log level 2026-03-03 10:12:08 -08:00
test_swagger_chat_completions.py [Release Fix] (#22411) 2026-02-28 09:46:35 -08:00
test_team_member_update.py
test_tools_allowlist_enforcement.py Bug Fix: auto-inject prompt caching support for Gemini models (#21881) 2026-03-03 20:25:35 -08:00
test_update_llm_router_resilience.py fix(proxy): isolate get_config failures from model loading in sync loop 2026-02-26 17:49:44 -03:00