test: type the eager_input_streaming test helpers and mark constants Final

This commit is contained in:
mateo-berri 2026-09-18 13:30:08 -07:00
parent d1563e0b55
commit a37d1e8b9b
4 changed files with 36 additions and 27 deletions

View file

@ -6372,18 +6372,19 @@ def test_response_format_tool_path_skips_forced_tool_choice_when_unsupported(loc
assert "tool_choice" not in result
def _eager_chat_tool(**extra):
def _eager_chat_function(**extra: object) -> dict[str, object]:
return {
"type": "function",
"function": {
"name": "write_file",
"description": "Write a file",
"parameters": {"type": "object", "properties": {"path": {"type": "string"}}, "required": ["path"]},
},
"name": "write_file",
"description": "Write a file",
"parameters": {"type": "object", "properties": {"path": {"type": "string"}}, "required": ["path"]},
**extra,
}
def _eager_chat_tool(**extra: object) -> dict[str, object]:
return {"type": "function", "function": _eager_chat_function(), **extra}
@pytest.mark.parametrize("flag", [True, False])
def test_eager_input_streaming_passed_through_from_tool_top_level(flag):
mapped_tool, _ = AnthropicConfig()._map_tool_helper(_eager_chat_tool(eager_input_streaming=flag))
@ -6398,10 +6399,9 @@ def test_eager_input_streaming_passed_through_from_tool_top_level(flag):
def test_eager_input_streaming_passed_through_from_function():
tool = _eager_chat_tool()
tool["function"]["eager_input_streaming"] = True
mapped_tool, _ = AnthropicConfig()._map_tool_helper(tool)
mapped_tool, _ = AnthropicConfig()._map_tool_helper(
{"type": "function", "function": _eager_chat_function(eager_input_streaming=True)}
)
assert mapped_tool["eager_input_streaming"] is True
assert "eager_input_streaming" not in mapped_tool["input_schema"]

View file

@ -1,6 +1,7 @@
import asyncio
import json
import uuid
from typing import Final
from unittest.mock import patch
import httpx
@ -861,14 +862,16 @@ def test_bedrock_chat_invoke_tool_search_beta_follows_model_map(
assert result.get("anthropic_beta") == expected_betas
FINE_GRAINED_TOOL_STREAMING_BETA = "fine-grained-tool-streaming-2025-05-14"
EAGER_TOOL_SCHEMA = {"type": "object", "properties": {"path": {"type": "string"}}, "required": ["path"]}
FINE_GRAINED_TOOL_STREAMING_BETA: Final = "fine-grained-tool-streaming-2025-05-14"
EAGER_TOOL_SCHEMA: Final = {"type": "object", "properties": {"path": {"type": "string"}}, "required": ["path"]}
def _chat_invoke_request_with_tools(tools, headers=None):
config = AmazonAnthropicClaudeConfig()
model = "us.anthropic.claude-sonnet-4-5-20250929-v1:0"
optional_params = config.map_openai_params(
def _chat_invoke_request_with_tools(
tools: list[dict[str, object]], headers: dict[str, str] | None = None
) -> dict[str, object]:
config: Final = AmazonAnthropicClaudeConfig()
model: Final = "us.anthropic.claude-sonnet-4-5-20250929-v1:0"
optional_params: Final = config.map_openai_params(
non_default_params={"max_tokens": 64, "stream": True, "tools": tools},
optional_params={},
model=model,
@ -883,7 +886,7 @@ def _chat_invoke_request_with_tools(tools, headers=None):
)
def _eager_openai_tool(name, **extra):
def _eager_openai_tool(name: str, **extra: object) -> dict[str, object]:
return {"type": "function", "function": {"name": name, "parameters": EAGER_TOOL_SCHEMA}, **extra}

View file

@ -4,6 +4,7 @@ import os
import httpx
import pytest
from typing import Final
from unittest.mock import MagicMock, patch
import litellm
@ -7402,23 +7403,25 @@ def test_transform_response_honors_json_mode_kwarg_when_optional_params_lack_it(
assert json.loads(result.choices[0].message.content) == {"city": "Paris", "population": 2100000}
FINE_GRAINED_TOOL_STREAMING_BETA = "fine-grained-tool-streaming-2025-05-14"
EAGER_TOOL_SCHEMA = {"type": "object", "properties": {"path": {"type": "string"}}, "required": ["path"]}
FINE_GRAINED_TOOL_STREAMING_BETA: Final = "fine-grained-tool-streaming-2025-05-14"
EAGER_TOOL_SCHEMA: Final = {"type": "object", "properties": {"path": {"type": "string"}}, "required": ["path"]}
def _eager_openai_tool(**extra):
def _eager_openai_tool(**extra: object) -> dict[str, object]:
return {"type": "function", "function": {"name": "write_file", "parameters": EAGER_TOOL_SCHEMA}, **extra}
def _eager_openai_function_tool(**extra):
def _eager_openai_function_tool(**extra: object) -> dict[str, object]:
return {"type": "function", "function": {"name": "write_file", "parameters": EAGER_TOOL_SCHEMA, **extra}}
def _eager_anthropic_tool(**extra):
def _eager_anthropic_tool(**extra: object) -> dict[str, object]:
return {"name": "write_file", "input_schema": EAGER_TOOL_SCHEMA, **extra}
def _converse_request(model, tools, headers=None):
def _converse_request(
model: str, tools: list[dict[str, object]], headers: dict[str, object] | None = None
) -> dict[str, object]:
return AmazonConverseConfig()._transform_request_helper(
model=model,
system_content_blocks=[],

View file

@ -4,6 +4,7 @@ import json
import os
from datetime import datetime
from types import SimpleNamespace
from typing import Final
from unittest.mock import Mock
import pytest
@ -3246,10 +3247,12 @@ def test_bedrock_messages_strips_effort_but_keeps_format_for_sonnet_4_5(local_mo
assert result.get("output_config") == {"format": schema_format}
FINE_GRAINED_TOOL_STREAMING_BETA = "fine-grained-tool-streaming-2025-05-14"
FINE_GRAINED_TOOL_STREAMING_BETA: Final = "fine-grained-tool-streaming-2025-05-14"
def _invoke_request_with_tools(tools, headers=None):
def _invoke_request_with_tools(
tools: list[dict[str, object]], headers: dict[str, str] | None = None
) -> dict[str, object]:
from litellm.types.router import GenericLiteLLMParams
return AmazonAnthropicClaudeMessagesConfig().transform_anthropic_messages_request(
@ -3261,7 +3264,7 @@ def _invoke_request_with_tools(tools, headers=None):
)
def _eager_invoke_tool(name, eager_input_streaming):
def _eager_invoke_tool(name: str, eager_input_streaming: bool) -> dict[str, object]:
return {
"name": name,
"description": f"{name} tool",