mirror of
https://github.com/BerriAI/litellm.git
synced 2026-09-11 22:51:28 +00:00
chore(groq): cleanup diff for GHAS and patch coverage
This commit is contained in:
parent
6170840a35
commit
c8485c4120
2 changed files with 27 additions and 46 deletions
|
|
@ -1,7 +1,6 @@
|
|||
"""
|
||||
Translate from OpenAI's `/v1/chat/completions` to Groq's `/v1/chat/completions`
|
||||
"""
|
||||
|
||||
from typing import (
|
||||
Any,
|
||||
Coroutine,
|
||||
|
|
@ -116,7 +115,8 @@ class GroqChatConfig(OpenAILikeChatConfig):
|
|||
@overload
|
||||
def _transform_messages(
|
||||
self, messages: List[AllMessageValues], model: str, is_async: Literal[True]
|
||||
) -> Coroutine[Any, Any, List[AllMessageValues]]: ...
|
||||
) -> Coroutine[Any, Any, List[AllMessageValues]]:
|
||||
...
|
||||
|
||||
@overload
|
||||
def _transform_messages(
|
||||
|
|
@ -124,7 +124,8 @@ class GroqChatConfig(OpenAILikeChatConfig):
|
|||
messages: List[AllMessageValues],
|
||||
model: str,
|
||||
is_async: Literal[False] = False,
|
||||
) -> List[AllMessageValues]: ...
|
||||
) -> List[AllMessageValues]:
|
||||
...
|
||||
|
||||
def _transform_messages(
|
||||
self, messages: List[AllMessageValues], model: str, is_async: bool = False
|
||||
|
|
@ -132,8 +133,6 @@ class GroqChatConfig(OpenAILikeChatConfig):
|
|||
for idx, message in enumerate(messages):
|
||||
"""
|
||||
1. Don't pass 'null' function_call assistant message to groq - https://github.com/BerriAI/litellm/issues/5839
|
||||
2. Strip LiteLLM-internal provider_specific_fields from assistant history
|
||||
before sending to Groq, which rejects unknown assistant properties.
|
||||
"""
|
||||
if isinstance(message, BaseModel):
|
||||
_message = message.model_dump()
|
||||
|
|
@ -296,10 +295,10 @@ class GroqChatConfig(OpenAILikeChatConfig):
|
|||
json_mode=json_mode,
|
||||
)
|
||||
|
||||
mapped_service_tier: Literal["auto", "default", "flex"] = (
|
||||
self._map_groq_service_tier(
|
||||
original_service_tier=getattr(model_response, "service_tier")
|
||||
)
|
||||
mapped_service_tier: Literal[
|
||||
"auto", "default", "flex"
|
||||
] = self._map_groq_service_tier(
|
||||
original_service_tier=getattr(model_response, "service_tier")
|
||||
)
|
||||
setattr(model_response, "service_tier", mapped_service_tier)
|
||||
return model_response
|
||||
|
|
|
|||
|
|
@ -18,7 +18,6 @@ from litellm.llms.groq.chat.transformation import (
|
|||
)
|
||||
from litellm.types.llms.openai import AllMessageValues
|
||||
|
||||
|
||||
class TestGroq(BaseLLMChatTest):
|
||||
def get_base_completion_call_args(self) -> dict:
|
||||
return {
|
||||
|
|
@ -32,10 +31,7 @@ class TestGroq(BaseLLMChatTest):
|
|||
def test_tool_call_with_empty_enum_property(self):
|
||||
pass
|
||||
|
||||
@pytest.mark.parametrize(
|
||||
"model",
|
||||
["groq/qwen/qwen3-32b", "groq/openai/gpt-oss-20b", "groq/openai/gpt-oss-120b"],
|
||||
)
|
||||
@pytest.mark.parametrize("model", ["groq/qwen/qwen3-32b", "groq/openai/gpt-oss-20b", "groq/openai/gpt-oss-120b"])
|
||||
def test_reasoning_effort_in_supported_params(self, model):
|
||||
"""Test that reasoning_effort is in the list of supported parameters for Groq"""
|
||||
supported_params = GroqChatConfig().get_supported_openai_params(model=model)
|
||||
|
|
@ -98,19 +94,19 @@ class TestGroqStructuredOutputs:
|
|||
"schema": {
|
||||
"type": "object",
|
||||
"properties": {"name": {"type": "string"}},
|
||||
"required": ["name"],
|
||||
},
|
||||
},
|
||||
"required": ["name"]
|
||||
}
|
||||
}
|
||||
},
|
||||
"tools": [
|
||||
{
|
||||
"type": "function",
|
||||
"function": {
|
||||
"name": "get_weather",
|
||||
"parameters": {"type": "object", "properties": {}},
|
||||
},
|
||||
"parameters": {"type": "object", "properties": {}}
|
||||
}
|
||||
}
|
||||
],
|
||||
]
|
||||
}
|
||||
|
||||
with pytest.raises(litellm.BadRequestError) as exc_info:
|
||||
|
|
@ -124,9 +120,7 @@ class TestGroqStructuredOutputs:
|
|||
assert "does not support native structured outputs" in str(exc_info.value)
|
||||
assert "incompatible with user-provided tools" in str(exc_info.value)
|
||||
|
||||
def test_structured_output_without_tools_uses_workaround_for_non_native_models(
|
||||
self,
|
||||
):
|
||||
def test_structured_output_without_tools_uses_workaround_for_non_native_models(self):
|
||||
"""
|
||||
Test that structured outputs without tools works using the json_tool_call workaround
|
||||
for models that don't support native json_schema.
|
||||
|
|
@ -143,9 +137,9 @@ class TestGroqStructuredOutputs:
|
|||
"schema": {
|
||||
"type": "object",
|
||||
"properties": {"name": {"type": "string"}},
|
||||
"required": ["name"],
|
||||
},
|
||||
},
|
||||
"required": ["name"]
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -181,9 +175,9 @@ class TestGroqStructuredOutputs:
|
|||
"schema": {
|
||||
"type": "object",
|
||||
"properties": {"name": {"type": "string"}},
|
||||
"required": ["name"],
|
||||
},
|
||||
},
|
||||
"required": ["name"]
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -206,7 +200,7 @@ class TestGroqStructuredOutputs:
|
|||
class TestGroqReasoning:
|
||||
"""
|
||||
Tests for Groq reasoning field mapping.
|
||||
|
||||
|
||||
Groq returns 'reasoning' field in delta, but LiteLLM expects 'reasoning_content'.
|
||||
"""
|
||||
|
||||
|
|
@ -241,10 +235,7 @@ class TestGroqReasoning:
|
|||
parsed_chunk = handler.chunk_parser(groq_chunk)
|
||||
|
||||
# Verify that reasoning was mapped to reasoning_content
|
||||
assert (
|
||||
parsed_chunk.choices[0].delta.reasoning_content
|
||||
== "This is reasoning content"
|
||||
)
|
||||
assert parsed_chunk.choices[0].delta.reasoning_content == "This is reasoning content"
|
||||
# Verify that the original 'reasoning' field was removed
|
||||
assert not hasattr(parsed_chunk.choices[0].delta, "reasoning")
|
||||
|
||||
|
|
@ -305,10 +296,7 @@ class TestGroqReasoning:
|
|||
{
|
||||
"index": 0,
|
||||
"id": "call_123",
|
||||
"function": {
|
||||
"name": "test_function",
|
||||
"arguments": "{}",
|
||||
},
|
||||
"function": {"name": "test_function", "arguments": "{}"},
|
||||
"type": "function",
|
||||
}
|
||||
],
|
||||
|
|
@ -323,14 +311,8 @@ class TestGroqReasoning:
|
|||
parsed_chunk = handler.chunk_parser(groq_chunk)
|
||||
|
||||
# Verify that reasoning was mapped to reasoning_content
|
||||
assert (
|
||||
parsed_chunk.choices[0].delta.reasoning_content
|
||||
== "Reasoning before tool call"
|
||||
)
|
||||
assert parsed_chunk.choices[0].delta.reasoning_content == "Reasoning before tool call"
|
||||
# Verify tool_calls are still present
|
||||
assert parsed_chunk.choices[0].delta.tool_calls is not None
|
||||
assert len(parsed_chunk.choices[0].delta.tool_calls) == 1
|
||||
assert (
|
||||
parsed_chunk.choices[0].delta.tool_calls[0]["function"]["name"]
|
||||
== "test_function"
|
||||
)
|
||||
assert parsed_chunk.choices[0].delta.tool_calls[0]["function"]["name"] == "test_function"
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue