Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 4 additions & 1 deletion decart/client.py
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,8 @@ class DecartClient:

Args:
api_key: Your Decart API key. Defaults to the DECART_API_KEY environment variable.
base_url: API base URL (defaults to production)
base_url: API base URL for batch/process/queue endpoints (defaults to https://api.decart.ai)
realtime_base_url: WebSocket base URL for realtime streaming (defaults to wss://api3.decart.ai)
integration: Optional integration identifier (e.g., "langchain/0.1.0")

Example:
Expand Down Expand Up @@ -52,6 +53,7 @@ def __init__(
self,
api_key: Optional[str] = None,
base_url: str = "https://api.decart.ai",
realtime_base_url: str = "wss://api3.decart.ai",
integration: Optional[str] = None,
) -> None:
resolved_api_key = api_key or os.environ.get("DECART_API_KEY", "").strip() or None
Expand All @@ -64,6 +66,7 @@ def __init__(

self.api_key = resolved_api_key
self.base_url = base_url
self.realtime_base_url = realtime_base_url
self.integration = integration
self._session: Optional[aiohttp.ClientSession] = None
self._queue: Optional[QueueClient] = None
Expand Down
2 changes: 1 addition & 1 deletion decart/lipsync/client.py
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ class RealtimeLipsyncClient:
def __init__(
self,
api_key: str,
base_url: str = "https://api.decart.ai",
base_url: str = "wss://api3.decart.ai",
audio_sample_rate: int = 16000,
video_fps: int = VIDEO_FPS,
sync_latency: float = 0.0,
Expand Down
2 changes: 1 addition & 1 deletion examples/avatar_live.py
Original file line number Diff line number Diff line change
Expand Up @@ -115,7 +115,7 @@ def on_error(error):

try:
realtime_client = await RealtimeClient.connect(
base_url=client.base_url,
base_url=client.realtime_base_url,
api_key=client.api_key,
local_track=audio_track, # Can be None if no audio
options=RealtimeConnectOptions(
Expand Down
2 changes: 1 addition & 1 deletion examples/realtime_file.py
Original file line number Diff line number Diff line change
Expand Up @@ -79,7 +79,7 @@ def on_error(error):
from decart.types import ModelState, Prompt

realtime_client = await RealtimeClient.connect(
base_url=client.base_url,
base_url=client.realtime_base_url,
api_key=client.api_key,
local_track=player.video,
options=RealtimeConnectOptions(
Expand Down
2 changes: 1 addition & 1 deletion examples/realtime_synthetic.py
Original file line number Diff line number Diff line change
Expand Up @@ -105,7 +105,7 @@ def on_error(error):
from decart.types import ModelState, Prompt

realtime_client = await RealtimeClient.connect(
base_url=client.base_url,
base_url=client.realtime_base_url,
api_key=client.api_key,
local_track=video_track,
options=RealtimeConnectOptions(
Expand Down
2 changes: 1 addition & 1 deletion playground/playground.py
Original file line number Diff line number Diff line change
Expand Up @@ -321,7 +321,7 @@ def on_error(error: Exception) -> None:
client = DecartClient(api_key=api_key)

realtime = await RealtimeClient.connect(
base_url=client.base_url,
base_url=client.realtime_base_url,
api_key=client.api_key,
local_track=local_track,
options=RealtimeConnectOptions(
Expand Down
46 changes: 23 additions & 23 deletions tests/test_realtime_unit.py
Original file line number Diff line number Diff line change
Expand Up @@ -82,7 +82,7 @@ async def test_realtime_client_creation_with_mock():
from decart.types import ModelState, Prompt

realtime_client = await RealtimeClient.connect(
base_url=client.base_url,
base_url=client.realtime_base_url,
api_key=client.api_key,
local_track=mock_track,
options=RealtimeConnectOptions(
Expand Down Expand Up @@ -143,7 +143,7 @@ def register_prompt_wait(prompt):
from decart.realtime.types import RealtimeConnectOptions

realtime_client = await RealtimeClient.connect(
base_url=client.base_url,
base_url=client.realtime_base_url,
api_key=client.api_key,
local_track=mock_track,
options=RealtimeConnectOptions(
Expand Down Expand Up @@ -182,7 +182,7 @@ async def test_buffered_events_delivered_after_handler_registration():
from decart.realtime.types import RealtimeConnectOptions

realtime_client = await RealtimeClient.connect(
base_url=client.base_url,
base_url=client.realtime_base_url,
api_key=client.api_key,
local_track=mock_track,
options=RealtimeConnectOptions(
Expand Down Expand Up @@ -219,7 +219,7 @@ async def test_realtime_events():
from decart.realtime.types import RealtimeConnectOptions

realtime_client = await RealtimeClient.connect(
base_url=client.base_url,
base_url=client.realtime_base_url,
api_key=client.api_key,
local_track=mock_track,
options=RealtimeConnectOptions(
Expand Down Expand Up @@ -281,7 +281,7 @@ def register_prompt_wait(prompt):
from decart.realtime.types import RealtimeConnectOptions

realtime_client = await RealtimeClient.connect(
base_url=client.base_url,
base_url=client.realtime_base_url,
api_key=client.api_key,
local_track=mock_track,
options=RealtimeConnectOptions(
Expand Down Expand Up @@ -328,7 +328,7 @@ def register_prompt_wait(prompt):
from decart.realtime.types import RealtimeConnectOptions

realtime_client = await RealtimeClient.connect(
base_url=client.base_url,
base_url=client.realtime_base_url,
api_key=client.api_key,
local_track=mock_track,
options=RealtimeConnectOptions(
Expand Down Expand Up @@ -396,7 +396,7 @@ async def test_avatar_live_connect_with_initial_image():
from decart.types import ModelState

realtime_client = await RealtimeClient.connect(
base_url=client.base_url,
base_url=client.realtime_base_url,
api_key=client.api_key,
local_track=mock_track,
options=RealtimeConnectOptions(
Expand Down Expand Up @@ -444,7 +444,7 @@ async def test_avatar_live_set_image():
from decart.realtime.types import RealtimeConnectOptions

realtime_client = await RealtimeClient.connect(
base_url=client.base_url,
base_url=client.realtime_base_url,
api_key=client.api_key,
local_track=mock_track,
options=RealtimeConnectOptions(
Expand Down Expand Up @@ -487,7 +487,7 @@ async def test_set_image_works_for_any_model():
from decart.realtime.types import RealtimeConnectOptions

realtime_client = await RealtimeClient.connect(
base_url=client.base_url,
base_url=client.realtime_base_url,
api_key=client.api_key,
local_track=mock_track,
options=RealtimeConnectOptions(
Expand Down Expand Up @@ -524,7 +524,7 @@ async def test_set_image_null_clears_image():
from decart.realtime.types import RealtimeConnectOptions

realtime_client = await RealtimeClient.connect(
base_url=client.base_url,
base_url=client.realtime_base_url,
api_key=client.api_key,
local_track=mock_track,
options=RealtimeConnectOptions(
Expand Down Expand Up @@ -565,7 +565,7 @@ async def test_set_image_with_prompt_and_enhance():
from decart.realtime.types import RealtimeConnectOptions

realtime_client = await RealtimeClient.connect(
base_url=client.base_url,
base_url=client.realtime_base_url,
api_key=client.api_key,
local_track=mock_track,
options=RealtimeConnectOptions(
Expand Down Expand Up @@ -610,7 +610,7 @@ async def test_avatar_live_set_image_timeout():
from decart.realtime.types import RealtimeConnectOptions

realtime_client = await RealtimeClient.connect(
base_url=client.base_url,
base_url=client.realtime_base_url,
api_key=client.api_key,
local_track=mock_track,
options=RealtimeConnectOptions(
Expand Down Expand Up @@ -655,7 +655,7 @@ async def test_avatar_live_set_image_server_error():
from decart.realtime.types import RealtimeConnectOptions

realtime_client = await RealtimeClient.connect(
base_url=client.base_url,
base_url=client.realtime_base_url,
api_key=client.api_key,
local_track=mock_track,
options=RealtimeConnectOptions(
Expand Down Expand Up @@ -698,7 +698,7 @@ async def test_set_rejects_when_neither_prompt_nor_image():
from decart.errors import InvalidInputError

realtime_client = await RealtimeClient.connect(
base_url=client.base_url,
base_url=client.realtime_base_url,
api_key=client.api_key,
local_track=mock_track,
options=RealtimeConnectOptions(
Expand Down Expand Up @@ -736,7 +736,7 @@ async def test_set_rejects_empty_prompt():
from decart.errors import InvalidInputError

realtime_client = await RealtimeClient.connect(
base_url=client.base_url,
base_url=client.realtime_base_url,
api_key=client.api_key,
local_track=mock_track,
options=RealtimeConnectOptions(
Expand Down Expand Up @@ -774,7 +774,7 @@ async def test_set_sends_prompt_only():
from decart.realtime.client import SetInput

realtime_client = await RealtimeClient.connect(
base_url=client.base_url,
base_url=client.realtime_base_url,
api_key=client.api_key,
local_track=mock_track,
options=RealtimeConnectOptions(
Expand Down Expand Up @@ -820,7 +820,7 @@ async def test_set_sends_prompt_with_enhance():
from decart.realtime.client import SetInput

realtime_client = await RealtimeClient.connect(
base_url=client.base_url,
base_url=client.realtime_base_url,
api_key=client.api_key,
local_track=mock_track,
options=RealtimeConnectOptions(
Expand Down Expand Up @@ -869,7 +869,7 @@ async def test_set_sends_image_only():
from decart.realtime.client import SetInput

realtime_client = await RealtimeClient.connect(
base_url=client.base_url,
base_url=client.realtime_base_url,
api_key=client.api_key,
local_track=mock_track,
options=RealtimeConnectOptions(
Expand Down Expand Up @@ -919,7 +919,7 @@ async def test_set_sends_prompt_and_image():
from decart.realtime.client import SetInput

realtime_client = await RealtimeClient.connect(
base_url=client.base_url,
base_url=client.realtime_base_url,
api_key=client.api_key,
local_track=mock_track,
options=RealtimeConnectOptions(
Expand Down Expand Up @@ -968,7 +968,7 @@ async def test_set_converts_bytes_image():
from decart.realtime.client import SetInput

realtime_client = await RealtimeClient.connect(
base_url=client.base_url,
base_url=client.realtime_base_url,
api_key=client.api_key,
local_track=mock_track,
options=RealtimeConnectOptions(
Expand Down Expand Up @@ -1017,7 +1017,7 @@ async def test_connect_with_initial_prompt():
from decart.types import ModelState, Prompt

realtime_client = await RealtimeClient.connect(
base_url=client.base_url,
base_url=client.realtime_base_url,
api_key=client.api_key,
local_track=mock_track,
options=RealtimeConnectOptions(
Expand Down Expand Up @@ -1123,7 +1123,7 @@ async def test_connect_without_initial_state_sends_passthrough():
from decart.realtime.types import RealtimeConnectOptions

realtime_client = await RealtimeClient.connect(
base_url=client.base_url,
base_url=client.realtime_base_url,
api_key=client.api_key,
local_track=mock_track,
options=RealtimeConnectOptions(
Expand Down Expand Up @@ -1195,7 +1195,7 @@ async def test_subscribe_mode_skips_passthrough():
from decart.realtime.subscribe import SubscribeOptions

sub_client = await RealtimeClient.subscribe(
base_url=client.base_url,
base_url=client.realtime_base_url,
api_key=client.api_key,
options=SubscribeOptions(
token=token,
Expand Down
Loading