mirror of
https://github.com/BerriAI/litellm.git
synced 2026-09-26 01:12:21 +00:00
* feat(rust-bridge): declare native chat completions and responses bindings Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> * test(dispatch): cover chat completions and messages dispatch Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> * refactor(rust-bridge): keep secret manager stub formatting unchanged Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> * fix(rust-bridge): match stub parameter names and exports to the native surface Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> * fix(rust-bridge): name declining entrypoint parameters and export embeddings in the stub Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> * test(rust-bridge): cover embeddings bindings in the route matrix Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> * refactor(rust-bridge): keep secret manager stub formatting unchanged Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> --------- Co-authored-by: Yujong Lee <yujong@berri.ai> Co-authored-by: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
76 lines
2.9 KiB
Python
76 lines
2.9 KiB
Python
from types import SimpleNamespace
|
|
from typing import Final
|
|
|
|
import pytest
|
|
|
|
from litellm.rust_bridge import bindings
|
|
from litellm.rust_bridge.chat_completions import entrypoints as chat_completions
|
|
from litellm.rust_bridge.embeddings import entrypoints as embeddings
|
|
from litellm.rust_bridge.messages import entrypoints as messages
|
|
from litellm.rust_bridge.ocr import entrypoints as ocr
|
|
from litellm.rust_bridge.responses import entrypoints as responses
|
|
from litellm.rust_bridge.transcription import native as transcription
|
|
|
|
|
|
def test_binding_distinguishes_disable_from_reset(monkeypatch) -> None:
|
|
native = SimpleNamespace(route=lambda: "native")
|
|
monkeypatch.setattr(bindings, "get_native_bridge", lambda: native)
|
|
binding: bindings.NativeBinding[object] = bindings.NativeBinding("route", validate=lambda value: value)
|
|
|
|
assert binding.load() is native.route
|
|
|
|
binding.override(None)
|
|
assert binding.load() is None
|
|
|
|
replacement = object()
|
|
binding.override(replacement)
|
|
assert binding.load() is replacement
|
|
|
|
binding.reset()
|
|
assert binding.load() is native.route
|
|
|
|
|
|
@pytest.mark.parametrize(("value", "expected"), ((3, 3), ("invalid", None), (None, None)))
|
|
def test_binding_validates_native_attribute(
|
|
monkeypatch: pytest.MonkeyPatch, value: object, expected: int | None
|
|
) -> None:
|
|
native: Final = SimpleNamespace(route=value)
|
|
monkeypatch.setattr(bindings, "get_native_bridge", lambda: native)
|
|
binding: Final = bindings.NativeBinding("route", validate=lambda item: item if isinstance(item, int) else None)
|
|
|
|
assert binding.load() == expected
|
|
|
|
|
|
ROUTE_BINDINGS: Final = (
|
|
("completion", chat_completions.NATIVE_COMPLETION),
|
|
("acompletion", chat_completions.NATIVE_ACOMPLETION),
|
|
("embedding", embeddings.NATIVE_EMBEDDING),
|
|
("aembedding", embeddings.NATIVE_AEMBEDDING),
|
|
("messages", messages.NATIVE_MESSAGES),
|
|
("amessages", messages.NATIVE_AMESSAGES),
|
|
("responses", responses.NATIVE_RESPONSES),
|
|
("aresponses", responses.NATIVE_ARESPONSES),
|
|
("ocr", ocr.NATIVE_OCR),
|
|
("aocr", ocr.NATIVE_AOCR),
|
|
("transcription", transcription.NATIVE_TRANSCRIPTION),
|
|
("atranscription", transcription.NATIVE_ATRANSCRIPTION),
|
|
)
|
|
|
|
|
|
@pytest.mark.parametrize(
|
|
("attribute", "route_binding"), ROUTE_BINDINGS, ids=[attribute for attribute, _ in ROUTE_BINDINGS]
|
|
)
|
|
def test_route_bindings_only_accept_callable_native_attributes(
|
|
monkeypatch: pytest.MonkeyPatch, attribute: str, route_binding: bindings.NativeBinding[object]
|
|
) -> None:
|
|
def native_route() -> None:
|
|
pass
|
|
|
|
monkeypatch.setattr(bindings, "get_native_bridge", lambda: SimpleNamespace(**{attribute: "not callable"}))
|
|
route_binding.reset()
|
|
assert route_binding.load() is None
|
|
|
|
monkeypatch.setattr(bindings, "get_native_bridge", lambda: SimpleNamespace(**{attribute: native_route}))
|
|
route_binding.reset()
|
|
assert route_binding.load() is native_route
|
|
route_binding.reset()
|