mirror of
https://github.com/BerriAI/litellm.git
synced 2026-10-31 06:56:59 +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>
39 lines
1.9 KiB
Python
39 lines
1.9 KiB
Python
from litellm.types.integrations.custom_logger import AgenticLoopPlan, AgenticLoopRequestPatch
|
|
from tests.test_litellm_rust.support.callback_recorder import RecordingLogger
|
|
from tests.test_litellm_rust.support.results import response_id, with_id
|
|
|
|
|
|
def agentic_hooks(recorder: RecordingLogger) -> tuple[str, ...]:
|
|
return tuple(name for name in recorder.names if "agentic" in name)
|
|
|
|
|
|
class PlannedAgenticLoop(RecordingLogger):
|
|
async def async_should_run_agentic_loop(self, response: object, **kwargs: object) -> tuple[bool, dict[str, object]]:
|
|
self._record("async_should_run_agentic_loop", response=response)
|
|
return response_id(response) != "followup", {}
|
|
|
|
async def async_build_agentic_loop_plan(self, response: object, **kwargs: object) -> AgenticLoopPlan:
|
|
self._record("async_build_agentic_loop_plan", response=response)
|
|
return AgenticLoopPlan(
|
|
run_agentic_loop=True,
|
|
request_patch=AgenticLoopRequestPatch.model_validate(
|
|
{"messages": [{"role": "user", "content": "followup"}]}
|
|
),
|
|
)
|
|
|
|
async def async_post_agentic_loop_response_hook(self, response: object, **kwargs: object) -> object:
|
|
self._record("async_post_agentic_loop_response_hook", response=response)
|
|
return with_id(response, "agentic-replaced")
|
|
|
|
async def async_agentic_loop_cleanup_hook(self, **kwargs: object) -> None:
|
|
self._record("async_agentic_loop_cleanup_hook")
|
|
|
|
|
|
class LegacyAgenticLoop(RecordingLogger):
|
|
async def async_should_run_agentic_loop(self, response: object, **kwargs: object) -> tuple[bool, dict[str, object]]:
|
|
self._record("async_should_run_agentic_loop", response=response)
|
|
return True, {}
|
|
|
|
async def async_run_agentic_loop(self, response: object, **kwargs: object) -> object:
|
|
self._record("async_run_agentic_loop", response=response)
|
|
return with_id(response, "agentic-replaced")
|