mirror of
https://github.com/BerriAI/litellm.git
synced 2025-04-26 03:04:13 +00:00
* refactor(vertex_ai_partner_models/anthropic): refactor anthropic to use partner model logic * fix(vertex_ai/): support passing custom api base to partner models Fixes https://github.com/BerriAI/litellm/issues/4317 * fix(proxy_server.py): Fix prometheus premium user check logic * docs(prometheus.md): update quick start docs * fix(custom_llm.py): support passing dynamic api key + api base * fix(realtime_api/main.py): Add request/response logging for realtime api endpoints Closes https://github.com/BerriAI/litellm/issues/6081 * feat(openai/realtime): add openai realtime api logging Closes https://github.com/BerriAI/litellm/issues/6081 * fix(realtime_streaming.py): fix linting errors * fix(realtime_streaming.py): fix linting errors * fix: fix linting errors * fix pattern match router * Add literalai in the sidebar observability category (#6163) * fix: add literalai in the sidebar * fix: typo * update (#6160) * Feat: Add Langtrace integration (#5341) * Feat: Add Langtrace integration * add langtrace service name * fix timestamps for traces * add tests * Discard Callback + use existing otel logger * cleanup * remove print statments * remove callback * add docs * docs * add logging docs * format logging * remove emoji and add litellm proxy example * format logging * format `logging.md` * add langtrace docs to logging.md * sync conflict * docs fix * (perf) move s3 logging to Batch logging + async [94% faster perf under 100 RPS on 1 litellm instance] (#6165) * fix move s3 to use customLogger * add basic s3 logging test * add s3 to custom logger compatible * use batch logger for s3 * s3 set flush interval and batch size * fix s3 logging * add notes on s3 logging * fix s3 logging * add basic s3 logging test * fix s3 type errors * add test for sync logging on s3 * fix: fix to debug log --------- Co-authored-by: Ishaan Jaff <ishaanjaffer0324@gmail.com> Co-authored-by: Willy Douhard <willy.douhard@gmail.com> Co-authored-by: yujonglee <yujonglee.dev@gmail.com> Co-authored-by: Ali Waleed <ali@scale3labs.com>
76 lines
2.6 KiB
Python
76 lines
2.6 KiB
Python
"""
|
|
This file contains the calling Azure OpenAI's `/openai/realtime` endpoint.
|
|
|
|
This requires websockets, and is currently only supported on LiteLLM Proxy.
|
|
"""
|
|
|
|
import asyncio
|
|
from typing import Any, Optional
|
|
|
|
from ....litellm_core_utils.litellm_logging import Logging as LiteLLMLogging
|
|
from ....litellm_core_utils.realtime_streaming import RealTimeStreaming
|
|
from ..azure import AzureChatCompletion
|
|
|
|
# BACKEND_WS_URL = "ws://localhost:8080/v1/realtime?model=gpt-4o-realtime-preview-2024-10-01"
|
|
|
|
|
|
async def forward_messages(client_ws: Any, backend_ws: Any):
|
|
import websockets
|
|
|
|
try:
|
|
while True:
|
|
message = await backend_ws.recv()
|
|
await client_ws.send_text(message)
|
|
except websockets.exceptions.ConnectionClosed: # type: ignore
|
|
pass
|
|
|
|
|
|
class AzureOpenAIRealtime(AzureChatCompletion):
|
|
def _construct_url(self, api_base: str, model: str, api_version: str) -> str:
|
|
"""
|
|
Example output:
|
|
"wss://my-endpoint-sweden-berri992.openai.azure.com/openai/realtime?api-version=2024-10-01-preview&deployment=gpt-4o-realtime-preview";
|
|
|
|
"""
|
|
api_base = api_base.replace("https://", "wss://")
|
|
return (
|
|
f"{api_base}/openai/realtime?api-version={api_version}&deployment={model}"
|
|
)
|
|
|
|
async def async_realtime(
|
|
self,
|
|
model: str,
|
|
websocket: Any,
|
|
api_base: Optional[str] = None,
|
|
api_key: Optional[str] = None,
|
|
api_version: Optional[str] = None,
|
|
azure_ad_token: Optional[str] = None,
|
|
client: Optional[Any] = None,
|
|
logging_obj: Optional[LiteLLMLogging] = None,
|
|
timeout: Optional[float] = None,
|
|
):
|
|
import websockets
|
|
|
|
if api_base is None:
|
|
raise ValueError("api_base is required for Azure OpenAI calls")
|
|
if api_version is None:
|
|
raise ValueError("api_version is required for Azure OpenAI calls")
|
|
|
|
url = self._construct_url(api_base, model, api_version)
|
|
|
|
try:
|
|
async with websockets.connect( # type: ignore
|
|
url,
|
|
extra_headers={
|
|
"api-key": api_key, # type: ignore
|
|
},
|
|
) as backend_ws:
|
|
realtime_streaming = RealTimeStreaming(
|
|
websocket, backend_ws, logging_obj
|
|
)
|
|
await realtime_streaming.bidirectional_forward()
|
|
|
|
except websockets.exceptions.InvalidStatusCode as e: # type: ignore
|
|
await websocket.close(code=e.status_code, reason=str(e))
|
|
except Exception as e:
|
|
await websocket.close(code=1011, reason=f"Internal server error: {str(e)}")
|