mirror of
https://github.com/BerriAI/litellm.git
synced 2026-11-10 08:28:25 +00:00
* refactor(rust-bridge): require the native extension _native ships in every wheel and the sdist will not install without it, yet the bridge loaded it optionally and carried None paths that could fail open for fork safety, exception mapping and OTLP errors. Delete loader.py and import _native directly. Tests inject a fake module through NativeBinding(source=...) or with_source() instead of patching the loader The install smoke checks now verify the compiled module, and tests fail instead of skipping when _native is missing. The interactions spec canary installs the project so it has the extension Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * fix(ci): build Rust bridge in Windows smoke tests --------- Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> Co-authored-by: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
73 lines
1.9 KiB
Python
73 lines
1.9 KiB
Python
from __future__ import annotations
|
|
|
|
import pytest
|
|
|
|
from litellm.rust_bridge import configuration
|
|
from litellm.rust_bridge.responses import websocket as responses_websocket
|
|
|
|
|
|
class _FakeNativeConnection:
|
|
def __init__(self) -> None:
|
|
self.sent: list[str] = []
|
|
self.closed = False
|
|
|
|
async def send_text(self, text: str) -> None:
|
|
self.sent.append(text)
|
|
|
|
async def recv_text(self) -> str:
|
|
return "response.completed"
|
|
|
|
async def close(self) -> None:
|
|
self.closed = True
|
|
|
|
|
|
class _ClosedNativeConnection:
|
|
async def recv_text(self) -> None:
|
|
return None
|
|
|
|
|
|
class _FakeNativeBridge:
|
|
@classmethod
|
|
async def connect(
|
|
cls,
|
|
*,
|
|
url: str,
|
|
headers: dict[str, str],
|
|
timeout_seconds: float | None,
|
|
) -> _FakeNativeConnection:
|
|
return _FakeNativeConnection()
|
|
|
|
|
|
@pytest.fixture(autouse=True)
|
|
def reset_responses_websocket():
|
|
responses_websocket.set_rust_responses_websocket(connection=None)
|
|
configuration.reset_rust_configuration()
|
|
yield
|
|
responses_websocket.set_rust_responses_websocket(connection=None)
|
|
configuration.reset_rust_configuration()
|
|
|
|
|
|
@pytest.mark.asyncio
|
|
async def test_adapter_raises_clean_close_when_rust_connection_ends() -> None:
|
|
adapter = responses_websocket._ConnectionAdapter(_ClosedNativeConnection())
|
|
|
|
with pytest.raises(responses_websocket.ConnectionClosedOK):
|
|
await adapter.recv()
|
|
|
|
|
|
@pytest.mark.asyncio
|
|
async def test_enabled_bridge_connects_and_adapts_socket(
|
|
monkeypatch: pytest.MonkeyPatch,
|
|
) -> None:
|
|
responses_websocket.set_rust_responses_websocket(connection=_FakeNativeBridge)
|
|
|
|
connection = await responses_websocket.connect(
|
|
url="wss://example.test/responses",
|
|
headers={"Authorization": "Bearer key"},
|
|
timeout=1.0,
|
|
)
|
|
|
|
assert connection is not None
|
|
await connection.send("response.create")
|
|
assert await connection.recv() == "response.completed"
|
|
await connection.close()
|