Merge branch 'litellm_passthrough_auth_guardrails' into litellm_lakera_v2_gemini_contents

This commit is contained in:
yucheng 2026-11-02 13:56:03 -08:00
commit a2a34c4cf4
2 changed files with 14 additions and 14 deletions

View file

@ -63,25 +63,21 @@ _REPLY_NESTED_FIELDS: Final = MappingProxyType(
}
)
_REPLY_MODEL_OUTPUT_FIELDS: Final = frozenset(("args", "arguments", "input", "parameters"))
_REPLY_MARKER_FIELDS: Final = frozenset(
(
"candidates",
"choices",
"finish_reason",
"object",
"output",
"predictions",
"stop_reason",
"usage",
"usageMetadata",
)
)
_REPLY_LIST_FIELDS: Final = ("candidates", "choices", "output", "predictions")
_IMAGE_REPLY_FIELDS: Final = frozenset(("created", "data"))
_NO_FIELDS: Final[frozenset[str]] = frozenset()
def _is_provider_reply(response: Mapping[str, object]) -> bool:
return bool(_REPLY_MARKER_FIELDS & response.keys()) or _IMAGE_REPLY_FIELDS.issubset(response)
"""Whether a JSON response has the shape of a provider's reply, by the type of the field that names it, since a
custom API's JSON can use the same field names."""
return (
any(isinstance(response.get(field), list) for field in _REPLY_LIST_FIELDS)
or isinstance(response.get("object"), str)
or (response.get("type") == "message" and "stop_reason" in response)
or ("finish_reason" in response and "message" in response)
or _IMAGE_REPLY_FIELDS.issubset(response)
)
def _reply_field_position(name: str, skipped: frozenset[str] | None) -> frozenset[str] | None:

View file

@ -286,6 +286,9 @@ async def test_post_call_scan_reads_a_field_named_like_the_envelope_in_what_the_
"4111111111111111",
),
({"choices": [{"message": {"tool_calls": [{"function": {"arguments": {"n": 5551234567}}}]}}]}, "5551234567"),
({"usage": {}, "customer": {"phone": 5551234567}}, "5551234567"),
({"output": {"card": 4111111111111111}}, "4111111111111111"),
({"type": "message", "phone": 5551234567}, "5551234567"),
],
)
async def test_post_call_scan_reads_an_integer_in_what_the_model_or_api_wrote(response, expected):
@ -311,6 +314,7 @@ async def test_post_call_scan_reads_a_field_name_in_what_the_model_or_api_wrote(
{"created": 1793600123, "data": [{"url": "https://x.example/a.png"}]},
{"id": "batch_1", "object": "batch", "created_at": 1793600123, "request_counts": {"total": 5551234567}},
{"predictions": [{"embeddings": {"values": [0.0123456789]}, "total": 5551234567}]},
{"finish_reason": "COMPLETE", "message": {"role": "assistant"}, "usage": {"total": 5551234567}},
],
)
async def test_post_call_scan_leaves_out_the_numbers_of_a_provider_reply(response):