mirror of
https://github.com/tiennm99/litellm.git
synced 2026-06-18 03:31:23 +00:00
9761ba7c7a
* fix proxy config * fix(responses api): fix streaming ID consistency and tool format handling (#12640) * fix(responses): ensure streaming chunk IDs use consistent encoding format Fixes streaming ID inconsistency where streaming responses used raw provider IDs while non-streaming responses used properly encoded IDs with provider context. Changes: - Updated LiteLLMCompletionStreamingIterator to accept provider context - Added _encode_chunk_id() method using same logic as non-streaming responses - Modified chunk transformation to encode all streaming item_ids with resp_ prefix - Updated handlers to pass custom_llm_provider and litellm_metadata to streaming iterator Impact: - Streaming chunk IDs now format: resp_<base64_encoded_provider_context> - Enables session continuity when using streaming response IDs as previous_response_id - Allows provider detection and load balancing with streaming responses - Maintains backward compatibility with existing streaming functionality 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com> * fix(types): add explicit Optional[str] type annotation for model_id This resolves MyPy type checking error where model_id could be None but wasn't explicitly typed as Optional[str]. * fix(types): handle None case for litellm_metadata access Prevents 'Item None has no attribute get' error by checking for None before accessing litellm_metadata dictionary. * test: add comprehensive tests for streaming ID consistency Adds unit and E2E tests to verify streaming chunk IDs are properly encoded with consistent format across streaming responses. ## Tests Added ### Unit Test (test_reasoning_content_transformation.py) - `test_streaming_chunk_id_encoding()`: Validates the `_encode_chunk_id()` method correctly encodes chunk IDs with `resp_` prefix and provider context ### E2E Tests (test_e2e_openai_responses_api.py) - `test_streaming_id_consistency_across_chunks()`: Tests that all streaming chunk IDs are properly encoded across multiple chunks in a real streaming response - `test_streaming_response_id_as_previous_response_id()`: Tests the core use case - using streaming response IDs for session continuity with `previous_response_id` ## Key Testing Approach - Uses **Gemini** (non-OpenAI model) to test the transformation logic rather than OpenAI passthrough, since the streaming ID consistency issue occurs when LiteLLM transforms responses rather than just passing through to native OpenAI responses API - Tests validate that streaming chunk IDs now use same encoding as non-streaming responses - Verifies session continuity works with streaming responses Addresses @ishaan-jaff's request for unit tests covering the streaming ID consistency fix. 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com> * fix(lint): remove unused imports in transformation.py Removes unused imports to fix CI linting errors: - GenericResponseOutputItem - OutputFunctionToolCall * test: remove E2E tests from openai_endpoints_tests Remove streaming ID consistency E2E tests as requested by @ishaan-jaff. Keep only the mock/unit test in test_reasoning_content_transformation.py * revert: remove streaming chunk ID encoding to original behavior This reverts the streaming chunk ID encoding changes to understand the original issue better. Original behavior was: - Streaming chunks: raw provider IDs - Streaming final response: raw IDs (PROBLEM!) - Non-streaming final response: encoded IDs (correct) The real issue: streaming final response IDs were not encoded, breaking session continuity. * fix(responses): encode streaming final response IDs to match OpenAI behavior Fixes streaming ID inconsistency to match OpenAI's Responses API behavior: - Streaming chunks: raw message IDs (like OpenAI's msg_xxx) - Final response: encoded IDs (like OpenAI's resp_xxx) This enables session continuity by ensuring streaming final response IDs have the same encoded format as non-streaming responses, allowing them to be used as previous_response_id in follow-up requests. Changes: - Add custom_llm_provider and litellm_metadata to LiteLLMCompletionStreamingIterator - Update handlers to pass provider context to streaming iterator - Apply _update_responses_api_response_id_with_model_id to final streaming response - Keep streaming chunks as raw IDs to match OpenAI format Impact: - Session continuity works with streaming responses - Load balancing can detect provider from streaming final response IDs - Format matches OpenAI's Responses API exactly 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com> * test: update unit test to match correct OpenAI-compatible behavior Updates the unit test to verify streaming chunk IDs are raw (not encoded) to match OpenAI's responses API format: - Streaming chunks: raw message IDs (like msg_xxx) - Final response: encoded IDs (like resp_xxx) This reflects the correct behavior implemented in the fix. --------- Co-authored-by: Claude <noreply@anthropic.com> * cleanup * TestBaseResponsesAPIStreamingIterator --------- Co-authored-by: Javier de la Torre <jatorre@carto.com> Co-authored-by: Claude <noreply@anthropic.com>
220 lines
7.8 KiB
YAML
220 lines
7.8 KiB
YAML
model_list:
|
|
- model_name: gpt-3.5-turbo-end-user-test
|
|
litellm_params:
|
|
model: gpt-3.5-turbo
|
|
region_name: "eu"
|
|
model_info:
|
|
id: "1"
|
|
- model_name: gpt-3.5-turbo-end-user-test
|
|
litellm_params:
|
|
model: azure/gpt-4o-new-test
|
|
api_base: https://openai-gpt-4-test-v-1.openai.azure.com/
|
|
api_version: "2023-05-15"
|
|
api_key: os.environ/AZURE_API_KEY # The `os.environ/` prefix tells litellm to read this from the env. See https://docs.litellm.ai/docs/simple_proxy#load-api-keys-from-vault
|
|
- model_name: gpt-3.5-turbo
|
|
litellm_params:
|
|
model: azure/gpt-4o-new-test
|
|
api_base: https://openai-gpt-4-test-v-1.openai.azure.com/
|
|
api_version: "2023-05-15"
|
|
api_key: os.environ/AZURE_API_KEY # The `os.environ/` prefix tells litellm to read this from the env. See https://docs.litellm.ai/docs/simple_proxy#load-api-keys-from-vault
|
|
- model_name: gpt-3.5-turbo-large
|
|
litellm_params:
|
|
model: "gpt-3.5-turbo-1106"
|
|
api_key: os.environ/OPENAI_API_KEY
|
|
rpm: 480
|
|
timeout: 300
|
|
stream_timeout: 60
|
|
- model_name: gpt-4
|
|
litellm_params:
|
|
model: azure/gpt-4o-new-test
|
|
api_base: https://openai-gpt-4-test-v-1.openai.azure.com/
|
|
api_version: "2023-05-15"
|
|
api_key: os.environ/AZURE_API_KEY # The `os.environ/` prefix tells litellm to read this from the env. See https://docs.litellm.ai/docs/simple_proxy#load-api-keys-from-vault
|
|
rpm: 480
|
|
timeout: 300
|
|
stream_timeout: 60
|
|
- model_name: sagemaker-completion-model
|
|
litellm_params:
|
|
model: sagemaker/berri-benchmarking-Llama-2-70b-chat-hf-4
|
|
input_cost_per_second: 0.000420
|
|
- model_name: text-embedding-ada-002
|
|
litellm_params:
|
|
model: azure/azure-embedding-model
|
|
api_key: os.environ/AZURE_API_KEY
|
|
api_base: https://openai-gpt-4-test-v-1.openai.azure.com/
|
|
api_version: "2023-05-15"
|
|
model_info:
|
|
mode: embedding
|
|
base_model: text-embedding-ada-002
|
|
- model_name: dall-e-2 # some tests use dall-e-2 which is now deprecated, alias to dall-e-3
|
|
litellm_params:
|
|
model: openai/dall-e-3
|
|
- model_name: openai-dall-e-3
|
|
litellm_params:
|
|
model: dall-e-3
|
|
- model_name: fake-openai-endpoint
|
|
litellm_params:
|
|
model: openai/fake
|
|
api_key: fake-key
|
|
api_base: https://exampleopenaiendpoint-production.up.railway.app/
|
|
- model_name: fake-openai-endpoint-2
|
|
litellm_params:
|
|
model: openai/my-fake-model
|
|
api_key: my-fake-key
|
|
api_base: https://exampleopenaiendpoint-production.up.railway.app/
|
|
stream_timeout: 0.001
|
|
rpm: 1
|
|
- model_name: fake-openai-endpoint-3
|
|
litellm_params:
|
|
model: openai/my-fake-model
|
|
api_key: my-fake-key
|
|
api_base: https://exampleopenaiendpoint-production.up.railway.app/
|
|
stream_timeout: 0.001
|
|
rpm: 1000
|
|
- model_name: fake-openai-endpoint-4
|
|
litellm_params:
|
|
model: openai/my-fake-model
|
|
api_key: my-fake-key
|
|
api_base: https://exampleopenaiendpoint-production.up.railway.app/
|
|
num_retries: 50
|
|
- model_name: fake-openai-endpoint-3
|
|
litellm_params:
|
|
model: openai/my-fake-model-2
|
|
api_key: my-fake-key
|
|
api_base: https://exampleopenaiendpoint-production.up.railway.app/
|
|
stream_timeout: 0.001
|
|
rpm: 1000
|
|
- model_name: bad-model
|
|
litellm_params:
|
|
model: openai/bad-model
|
|
api_key: os.environ/OPENAI_API_KEY
|
|
api_base: https://exampleopenaiendpoint-production.up.railway.app/
|
|
mock_timeout: True
|
|
timeout: 60
|
|
rpm: 1000
|
|
model_info:
|
|
health_check_timeout: 1
|
|
- model_name: good-model
|
|
litellm_params:
|
|
model: openai/bad-model
|
|
api_key: os.environ/OPENAI_API_KEY
|
|
api_base: https://exampleopenaiendpoint-production.up.railway.app/
|
|
rpm: 1000
|
|
model_info:
|
|
health_check_timeout: 1
|
|
- model_name: "*"
|
|
litellm_params:
|
|
model: openai/*
|
|
api_key: os.environ/OPENAI_API_KEY
|
|
|
|
|
|
# provider specific wildcard routing
|
|
- model_name: "anthropic/*"
|
|
litellm_params:
|
|
model: "anthropic/*"
|
|
api_key: os.environ/ANTHROPIC_API_KEY
|
|
- model_name: "bedrock/*"
|
|
litellm_params:
|
|
model: "bedrock/*"
|
|
- model_name: "groq/*"
|
|
litellm_params:
|
|
model: "groq/*"
|
|
api_key: os.environ/GROQ_API_KEY
|
|
- model_name: mistral-embed
|
|
litellm_params:
|
|
model: mistral/mistral-embed
|
|
- model_name: gpt-instruct # [PROD TEST] - tests if `/health` automatically infers this to be a text completion model
|
|
litellm_params:
|
|
model: text-completion-openai/gpt-3.5-turbo-instruct
|
|
- model_name: fake-openai-endpoint-5
|
|
litellm_params:
|
|
model: openai/my-fake-model
|
|
api_key: my-fake-key
|
|
api_base: https://exampleopenaiendpoint-production.up.railway.app/
|
|
timeout: 1
|
|
- model_name: badly-configured-openai-endpoint
|
|
litellm_params:
|
|
model: openai/my-fake-model
|
|
api_key: my-fake-key
|
|
api_base: https://exampleopenaiendpoint-production.up.railway.appxxxx/
|
|
- model_name: gemini-1.5-flash
|
|
litellm_params:
|
|
model: gemini/gemini-1.5-flash
|
|
api_key: os.environ/GOOGLE_API_KEY
|
|
- model_name: gpt-4o
|
|
litellm_params:
|
|
model: gpt-4o
|
|
api_key: os.environ/OPENAI_API_KEY
|
|
|
|
|
|
litellm_settings:
|
|
# set_verbose: True # Uncomment this if you want to see verbose logs; not recommended in production
|
|
drop_params: True
|
|
# max_budget: 100
|
|
# budget_duration: 30d
|
|
num_retries: 5
|
|
request_timeout: 600
|
|
telemetry: False
|
|
context_window_fallbacks: [{"gpt-3.5-turbo": ["gpt-3.5-turbo-large"]}]
|
|
default_team_settings:
|
|
- team_id: team-1
|
|
success_callback: ["langfuse"]
|
|
failure_callback: ["langfuse"]
|
|
langfuse_public_key: os.environ/LANGFUSE_PROJECT1_PUBLIC # Project 1
|
|
langfuse_secret: os.environ/LANGFUSE_PROJECT1_SECRET # Project 1
|
|
- team_id: team-2
|
|
success_callback: ["langfuse"]
|
|
failure_callback: ["langfuse"]
|
|
langfuse_public_key: os.environ/LANGFUSE_PROJECT2_PUBLIC # Project 2
|
|
langfuse_secret: os.environ/LANGFUSE_PROJECT2_SECRET # Project 2
|
|
langfuse_host: https://us.cloud.langfuse.com
|
|
|
|
# For /fine_tuning/jobs endpoints
|
|
finetune_settings:
|
|
- custom_llm_provider: azure
|
|
api_base: os.environ/AZURE_API_BASE
|
|
api_key: os.environ/AZURE_API_KEY
|
|
api_version: "2023-03-15-preview"
|
|
- custom_llm_provider: openai
|
|
api_key: os.environ/OPENAI_API_KEY
|
|
|
|
# for /files endpoints
|
|
files_settings:
|
|
- custom_llm_provider: azure
|
|
api_base: os.environ/AZURE_API_BASE
|
|
api_key: os.environ/AZURE_API_KEY
|
|
api_version: "2023-03-15-preview"
|
|
- custom_llm_provider: openai
|
|
api_key: os.environ/OPENAI_API_KEY
|
|
|
|
router_settings:
|
|
routing_strategy: usage-based-routing-v2
|
|
redis_host: os.environ/REDIS_HOST
|
|
redis_password: os.environ/REDIS_PASSWORD
|
|
redis_port: os.environ/REDIS_PORT
|
|
enable_pre_call_checks: true
|
|
model_group_alias: {"my-special-fake-model-alias-name": "fake-openai-endpoint-3"}
|
|
|
|
general_settings:
|
|
master_key: sk-1234 # [OPTIONAL] Use to enforce auth on proxy. See - https://docs.litellm.ai/docs/proxy/virtual_keys
|
|
store_model_in_db: True
|
|
proxy_budget_rescheduler_min_time: 60
|
|
proxy_budget_rescheduler_max_time: 64
|
|
proxy_batch_write_at: 1
|
|
database_connection_pool_limit: 10
|
|
# database_url: "postgresql://<user>:<password>@<host>:<port>/<dbname>" # [OPTIONAL] use for token-based auth to proxy
|
|
|
|
pass_through_endpoints:
|
|
- path: "/v1/rerank" # route you want to add to LiteLLM Proxy Server
|
|
target: "https://api.cohere.com/v1/rerank" # URL this route should forward requests to
|
|
headers: # headers to forward to this URL
|
|
content-type: application/json # (Optional) Extra Headers to pass to this endpoint
|
|
accept: application/json
|
|
forward_headers: True
|
|
|
|
# environment_variables:
|
|
# settings for using redis caching
|
|
# REDIS_HOST: redis-16337.c322.us-east-1-2.ec2.cloud.redislabs.com
|
|
# REDIS_PORT: "16337"
|
|
# REDIS_PASSWORD:
|