mirror of
https://github.com/Alishahryar1/free-claude-code.git
synced 2026-04-28 11:30:03 +00:00
- Add local web_search/web_fetch SSE handling and optional tool schemas - Extend HeuristicToolParser for JSON-style WebFetch/WebSearch text - Consolidate provider defaults, ids, and exception typing; stream contracts - Messaging: typed options, voice config injection, platform contract cleanup - Tests for web server tools, converters, parsers, contracts; ignore debug-*.log
128 lines
3.8 KiB
Python
128 lines
3.8 KiB
Python
from api.models.anthropic import Message, MessagesRequest, TokenCountRequest
|
|
|
|
|
|
def test_messages_request_parses_without_model_mapping_side_effects():
|
|
request = MessagesRequest(
|
|
model="claude-3-opus",
|
|
max_tokens=100,
|
|
messages=[Message(role="user", content="hello")],
|
|
)
|
|
|
|
assert request.model == "claude-3-opus"
|
|
|
|
|
|
def test_messages_request_ignores_internal_routing_fields_when_supplied():
|
|
request = MessagesRequest.model_validate(
|
|
{
|
|
"model": "target-model",
|
|
"original_model": "claude-3-opus",
|
|
"resolved_provider_model": "nvidia_nim/target-model",
|
|
"max_tokens": 100,
|
|
"messages": [{"role": "user", "content": "hello"}],
|
|
}
|
|
)
|
|
|
|
assert request.model == "target-model"
|
|
assert "original_model" not in request.model_dump()
|
|
assert "resolved_provider_model" not in request.model_dump()
|
|
|
|
|
|
def test_token_count_request_parses_without_model_mapping_side_effects():
|
|
request = TokenCountRequest(
|
|
model="claude-3-sonnet", messages=[Message(role="user", content="hello")]
|
|
)
|
|
|
|
assert request.model == "claude-3-sonnet"
|
|
|
|
|
|
def test_messages_request_preserves_thinking_signature():
|
|
request = MessagesRequest.model_validate(
|
|
{
|
|
"model": "claude-3-opus",
|
|
"max_tokens": 100,
|
|
"messages": [
|
|
{
|
|
"role": "assistant",
|
|
"content": [
|
|
{
|
|
"type": "thinking",
|
|
"thinking": "signed thought",
|
|
"signature": "sig_123",
|
|
}
|
|
],
|
|
}
|
|
],
|
|
}
|
|
)
|
|
|
|
dumped = request.model_dump(exclude_none=True)
|
|
|
|
assert dumped["messages"][0]["content"][0]["signature"] == "sig_123"
|
|
|
|
|
|
def test_messages_request_preserves_native_thinking_budget():
|
|
request = MessagesRequest.model_validate(
|
|
{
|
|
"model": "claude-3-opus",
|
|
"max_tokens": 100,
|
|
"messages": [{"role": "user", "content": "think hard"}],
|
|
"thinking": {"type": "enabled", "budget_tokens": 4096},
|
|
}
|
|
)
|
|
|
|
dumped = request.model_dump(exclude_none=True)
|
|
|
|
assert dumped["thinking"]["type"] == "enabled"
|
|
assert dumped["thinking"]["budget_tokens"] == 4096
|
|
|
|
|
|
def test_messages_request_accepts_adaptive_thinking_type():
|
|
request = MessagesRequest.model_validate(
|
|
{
|
|
"model": "claude-3-opus",
|
|
"max_tokens": 100,
|
|
"messages": [{"role": "user", "content": "hello"}],
|
|
"thinking": {"type": "adaptive"},
|
|
}
|
|
)
|
|
|
|
dumped = request.model_dump(exclude_none=True)
|
|
|
|
assert dumped["thinking"]["type"] == "adaptive"
|
|
|
|
|
|
def test_messages_request_accepts_anthropic_server_tool_without_input_schema():
|
|
request = MessagesRequest.model_validate(
|
|
{
|
|
"model": "claude-opus-4-7",
|
|
"max_tokens": 100,
|
|
"messages": [{"role": "user", "content": "search"}],
|
|
"tools": [{"type": "web_search_20250305", "name": "web_search"}],
|
|
}
|
|
)
|
|
|
|
dumped = request.model_dump(exclude_none=True)
|
|
|
|
assert dumped["tools"] == [{"name": "web_search", "type": "web_search_20250305"}]
|
|
|
|
|
|
def test_messages_request_accepts_redacted_thinking_blocks():
|
|
request = MessagesRequest.model_validate(
|
|
{
|
|
"model": "claude-3-opus",
|
|
"max_tokens": 100,
|
|
"messages": [
|
|
{
|
|
"role": "assistant",
|
|
"content": [{"type": "redacted_thinking", "data": "opaque"}],
|
|
}
|
|
],
|
|
}
|
|
)
|
|
|
|
dumped = request.model_dump(exclude_none=True)
|
|
|
|
assert dumped["messages"][0]["content"][0] == {
|
|
"type": "redacted_thinking",
|
|
"data": "opaque",
|
|
}
|