mirror of
https://github.com/BerriAI/litellm.git
synced 2026-11-05 07:37:50 +00:00
* refactor: clean up fresh tech debt in proxy sub-call budget checks, model search and logger init Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> * refactor: clean up fresh tech debt in otel baggage metadata, model budget limiter and batch line items Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> * Revert "refactor: clean up fresh tech debt in otel baggage metadata, model budget limiter and batch line items" This reverts commit68737c457c. * refactor: clean up fresh tech debt in guardrail init, cost map fetch and stream continuation Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> * refactor: clean up fresh tech debt in kimi k3 token counting and two slop comments Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> * refactor: clean up fresh tech debt in mcp tool call auth fields, messages drop_params, exception chain and spend log noqa Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> * fix: preserve dict-compatible drop params access Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> * refactor: clean up fresh tech debt in user list sorting, opencode affinity header and aws polly comment Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> * refactor: clean up fresh tech debt in responses bridge check, chatgpt authenticator and image header adapters Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> * refactor: clean up fresh tech debt in auth 401 detection, cooldown fallback lookup and bedrock guardrail billing Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> * Revert "refactor: clean up fresh tech debt in auth 401 detection, cooldown fallback lookup and bedrock guardrail billing" This reverts commitd497e02bbf. * refactor: clean up fresh tech debt in responses stream usage cost, bedrock count tokens comments and router return types Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> * refactor: clean up fresh tech debt in messages drop_params reads, auth zero cost comment and two return types Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> * refactor: keep getattr drop_params reads where callers pass a plain dict Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> * refactor: clean up fresh tech debt in router context signatures, search tool comment and gemini realtime init Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> * refactor: drop fresh private-alias, getattr and duplicated response id helpers Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> * refactor: bind response id helper to logging instance Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> * refactor: simplify media guard and spend log reads Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> * fix: satisfy media guard type discipline and formatting Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> * refactor: keep media guard cast rather than trade it for new suppressions Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> --------- Co-authored-by: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> Co-authored-by: mateo <277851410+mateo-berri@users.noreply.github.com>
90 lines
3.1 KiB
Python
90 lines
3.1 KiB
Python
from typing import Final
|
|
|
|
import pytest
|
|
|
|
from litellm.constants import SESSION_ID_GENERATED_METADATA_KEY
|
|
from litellm.litellm_core_utils.provider_affinity import add_provider_affinity_header
|
|
from litellm.litellm_core_utils.get_llm_provider_logic import get_provider_affinity_header
|
|
|
|
|
|
@pytest.mark.parametrize(
|
|
"api_base",
|
|
[
|
|
"https://opencode.ai/zen/v1",
|
|
"https://opencode.ai/zen/go/v1/",
|
|
"https://opencode.ai/inference/openai/v1",
|
|
"https://opencode.ai/inference/go/openai/v1",
|
|
"https://opencode.ai/inference/go/anthropic/v1",
|
|
"https://opencode.ai/inference/anthropic/v1",
|
|
],
|
|
)
|
|
def test_opencode_defaults_affinity_header_to_the_callers_session(api_base: str) -> None:
|
|
headers: Final = {"Authorization": "Bearer test-key"}
|
|
params: Final = {"metadata": {"session_id": "conversation-123"}}
|
|
assert add_provider_affinity_header(
|
|
headers, params, get_provider_affinity_header(api_base)
|
|
) == {
|
|
**headers,
|
|
"x-opencode-session": "conversation-123",
|
|
}
|
|
assert headers == {"Authorization": "Bearer test-key"}
|
|
assert params == {"metadata": {"session_id": "conversation-123"}}
|
|
|
|
|
|
@pytest.mark.parametrize(
|
|
"api_base",
|
|
[
|
|
None,
|
|
"https://api.openai.com/v1",
|
|
"https://opencode.ai.example/zen/go/v1",
|
|
"https://opencode.ai@example.com/zen/go/v1",
|
|
"https://example.com/opencode.ai/zen/go/v1",
|
|
"https://example.com/v1?upstream=https://opencode.ai/zen/go/v1",
|
|
"https://opencode.ai/console/v1",
|
|
"http://opencode.ai/zen/go/v1",
|
|
],
|
|
)
|
|
def test_other_destinations_do_not_receive_an_automatic_session_header(api_base: str | None) -> None:
|
|
headers: Final = {"Authorization": "Bearer test-key", "x-existing": "unchanged"}
|
|
assert (
|
|
add_provider_affinity_header(
|
|
headers,
|
|
{"litellm_session_id": "conversation-123"},
|
|
get_provider_affinity_header(api_base),
|
|
)
|
|
== headers
|
|
)
|
|
|
|
|
|
@pytest.mark.parametrize(
|
|
"params",
|
|
[
|
|
{},
|
|
{"litellm_trace_id": "request-123"},
|
|
{"metadata": {"trace_id": "request-123"}},
|
|
{
|
|
"litellm_session_id": "request-123",
|
|
"litellm_metadata": {"session_id": "request-123", SESSION_ID_GENERATED_METADATA_KEY: True},
|
|
},
|
|
],
|
|
)
|
|
def test_opencode_does_not_invent_a_conversation_id(params: dict[str, object]) -> None:
|
|
assert (
|
|
add_provider_affinity_header(
|
|
{}, params, get_provider_affinity_header("https://opencode.ai/zen/go/v1")
|
|
)
|
|
== {}
|
|
)
|
|
|
|
|
|
def test_opencode_preserves_explicit_header_and_affinity_configuration() -> None:
|
|
assert add_provider_affinity_header(
|
|
{"X-OpenCode-Session": "explicit"},
|
|
{"litellm_session_id": "conversation-123"},
|
|
get_provider_affinity_header("https://opencode.ai/zen/go/v1"),
|
|
) == {"X-OpenCode-Session": "explicit"}
|
|
assert add_provider_affinity_header(
|
|
{},
|
|
{"litellm_session_id": "conversation-123", "provider_affinity_header": "x-custom-session"},
|
|
get_provider_affinity_header("https://opencode.ai/zen/go/v1"),
|
|
) == {"x-custom-session": "conversation-123"}
|