mirror of
https://github.com/BerriAI/litellm.git
synced 2026-10-17 04:34:25 +00:00
* test(rust-bridge): pin Messages and Responses callback contracts on the native path Each test runs the native route and asserts what the Python path does today, so a known gap is a strict xfail that names its reason and the exception it fails with Messages and Responses share one Surface and hook recorder in support/callbacks.py, and each surface folder lists its own expected counts and gaps. Body-level hooks from the function body (pre-request hook, websearch short-circuit, Messages interceptors, planned and legacy agentic loops, streaming deployment hook) are xfail until native runs them Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * test(rust-bridge): give every route folder the same one-concern-per-file layout Route data, the route Surface and the server fixture move into each route folder, and support/ keeps only route-neutral helpers. test_inference.py splits into chat_completions/ and responses/, ocr/test_requests.py splits into requests, failures and settings, and Messages and Responses get streaming and body hook files. Messages request tests that duplicate inference-messages request.rs are removed, and drop_params read from litellm.drop_params is now covered Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * test(rust-bridge): expect the required-route decline error for unsupported Responses requests Co-Authored-By: Yujong Lee <yujong@berri.ai> * test(rust-bridge): import route data from the route folders in the secrets unit tests Co-Authored-By: Yujong Lee <yujong@berri.ai> * test(rust-bridge): import NoReturn in the OCR dispatch tests Co-Authored-By: Yujong Lee <yujong@berri.ai> * test(rust-bridge): move route-neutral helpers out of support/callbacks.py Co-Authored-By: Yujong Lee <yujong@berri.ai> * test(rust-bridge): cover deployment rejection and concurrent callbacks * test(rust-bridge): assert native serving via the x-litellm-rust marker in the route folder tests Co-Authored-By: Yujong Lee <yujong@berri.ai> --------- Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> Co-authored-by: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
64 lines
2.2 KiB
Python
64 lines
2.2 KiB
Python
from typing import Final
|
|
|
|
import litellm
|
|
from litellm.rust_bridge.catalog import Route
|
|
from tests.test_litellm_rust.support.gaps import gap
|
|
from tests.test_litellm_rust.support.recording_server import RecordingServer
|
|
from tests.test_litellm_rust.support.routing import call_natively
|
|
|
|
MESSAGES_MODEL: Final = "anthropic/claude-sonnet-5"
|
|
MESSAGES: Final = ({"role": "user", "content": "Hello"},)
|
|
MESSAGES_TEXT: Final = "Hello from native Messages"
|
|
MESSAGES_RESPONSE: Final = {
|
|
"id": "msg_native",
|
|
"type": "message",
|
|
"role": "assistant",
|
|
"model": "claude-sonnet-5",
|
|
"content": [{"type": "text", "text": MESSAGES_TEXT}],
|
|
"stop_reason": "end_turn",
|
|
"stop_sequence": None,
|
|
"usage": {"input_tokens": 5, "output_tokens": 4},
|
|
}
|
|
MESSAGES_EVENTS: Final = (
|
|
("message_start", {"type": "message_start", "message": {**MESSAGES_RESPONSE, "content": [], "stop_reason": None}}),
|
|
("content_block_start", {"type": "content_block_start", "index": 0, "content_block": {"type": "text", "text": ""}}),
|
|
(
|
|
"content_block_delta",
|
|
{"type": "content_block_delta", "index": 0, "delta": {"type": "text_delta", "text": MESSAGES_TEXT}},
|
|
),
|
|
("content_block_stop", {"type": "content_block_stop", "index": 0}),
|
|
(
|
|
"message_delta",
|
|
{
|
|
"type": "message_delta",
|
|
"delta": {"stop_reason": "end_turn", "stop_sequence": None},
|
|
"usage": {"output_tokens": 4},
|
|
},
|
|
),
|
|
("message_stop", {"type": "message_stop"}),
|
|
)
|
|
|
|
REQUEST: Final = {"model": MESSAGES_MODEL, "messages": list(MESSAGES), "max_tokens": 64}
|
|
|
|
|
|
def _error(kind: str) -> dict[str, object]:
|
|
return {"type": "error", "error": {"type": kind, "message": kind}}
|
|
|
|
|
|
BAD_REQUEST: Final = _error("invalid_request_error")
|
|
RATE_LIMITED: Final = _error("rate_limit_error")
|
|
|
|
|
|
async def call(server: RecordingServer, *, asynchronous: bool = True, **kwargs: object) -> object:
|
|
return await call_natively(
|
|
Route.MESSAGES,
|
|
litellm.anthropic.messages.create,
|
|
litellm.anthropic.messages.acreate,
|
|
REQUEST,
|
|
server,
|
|
asynchronous=asynchronous,
|
|
**kwargs,
|
|
)
|
|
|
|
|
|
BODY_HOOKS: Final = gap("native Messages does not run the handler body hooks")
|