From d728195a09979c55b6c6f870fc304756b396d494 Mon Sep 17 00:00:00 2001 From: Cursor Agent Date: Sun, 22 Mar 2026 15:53:58 +0000 Subject: [PATCH 01/14] refactor(cli): split cli_app into focused submodules Extract Typer Annotated aliases (cli_types), Rich dashboard and list output (cli_dashboard), RuntimeReporter thread (cli_reporter), and LiveKit argv/env handoff plus pool reporting (cli_livekit). cli_app keeps command definitions and main(); re-exports public symbols for existing imports. Tests patch AgentPool on cli_app for list and cli_livekit for worker commands. Co-authored-by: Mahimai Raja J --- src/openrtc/cli_app.py | 1040 ++-------------------------------- src/openrtc/cli_dashboard.py | 382 +++++++++++++ src/openrtc/cli_livekit.py | 286 ++++++++++ src/openrtc/cli_reporter.py | 141 +++++ src/openrtc/cli_types.py | 210 +++++++ tests/test_cli.py | 24 +- 6 files changed, 1087 insertions(+), 996 deletions(-) create mode 100644 src/openrtc/cli_dashboard.py create mode 100644 src/openrtc/cli_livekit.py create mode 100644 src/openrtc/cli_reporter.py create mode 100644 src/openrtc/cli_types.py diff --git a/src/openrtc/cli_app.py b/src/openrtc/cli_app.py index 2fb662f..1e7ec39 100644 --- a/src/openrtc/cli_app.py +++ b/src/openrtc/cli_app.py @@ -1,42 +1,57 @@ +"""Typer CLI: command registration and programmatic :func:`main` entry.""" + from __future__ import annotations -import contextlib import json import logging -import os import sys -import threading -import time -from collections.abc import Iterator -from pathlib import Path -from typing import Annotated, Any +from typing import Annotated import typer -from rich.console import Console -from rich.live import Live -from rich.panel import Panel -from rich.progress_bar import ProgressBar -from rich.table import Table -from rich.text import Text from typer import Context -from openrtc.metrics_stream import JsonlMetricsSink -from openrtc.pool import AgentConfig, AgentPool -from openrtc.resources import ( - PoolRuntimeSnapshot, - agent_disk_footprints, - estimate_shared_worker_savings, - file_size_bytes, - format_byte_size, - get_process_resident_set_info, +from openrtc.cli_dashboard import ( + build_list_json_payload, + build_runtime_dashboard, + print_list_plain, + print_list_rich_table, + print_resource_summary_rich, +) +from openrtc.cli_livekit import ( + _delegate_discovered_pool_to_livekit, + _discover_or_exit, + _pool_kwargs, + _run_connect_handoff, + _run_pool_with_reporting, + _strip_openrtc_only_flags_for_livekit, ) +from openrtc.cli_reporter import RuntimeReporter +from openrtc.cli_types import ( + _LIVEKIT_CLI_CONTEXT_SETTINGS, + PANEL_ADVANCED, + AgentsDirArg, + ConnectParticipantArg, + ConnectRoomArg, + DashboardArg, + DashboardRefreshArg, + DefaultGreetingArg, + DefaultLlmArg, + DefaultSttArg, + DefaultTtsArg, + LiveKitApiKeyArg, + LiveKitApiSecretArg, + LiveKitLogLevelArg, + LiveKitUrlArg, + MetricsJsonFileArg, + MetricsJsonlArg, + MetricsJsonlIntervalArg, + TuiFromStartArg, + TuiWatchPathArg, +) +from openrtc.pool import AgentPool logger = logging.getLogger("openrtc") -PANEL_OPENRTC = "OpenRTC" -PANEL_LIVEKIT = "Connection" -PANEL_ADVANCED = "Advanced" - _QUICKSTART_EPILOG = ( "[bold]Typical usage[/bold]: set [code]LIVEKIT_URL[/code], [code]LIVEKIT_API_KEY[/code], " "and [code]LIVEKIT_API_SECRET[/code], then run " @@ -60,709 +75,6 @@ no_args_is_help=True, ) -console = Console() - - -class RuntimeReporter: - """Background reporter: Rich dashboard, static JSON file, and/or JSONL stream.""" - - def __init__( - self, - pool: AgentPool, - *, - dashboard: bool, - refresh_seconds: float, - json_output_path: Path | None, - metrics_jsonl_path: Path | None = None, - metrics_jsonl_interval: float | None = None, - ) -> None: - self._pool = pool - self._dashboard = dashboard - self._refresh_seconds = max(refresh_seconds, 0.25) - self._json_output_path = json_output_path - self._jsonl_interval = ( - max(metrics_jsonl_interval, 0.25) - if metrics_jsonl_interval is not None - else self._refresh_seconds - ) - self._jsonl_sink: JsonlMetricsSink | None = None - if metrics_jsonl_path is not None: - self._jsonl_sink = JsonlMetricsSink(metrics_jsonl_path) - self._jsonl_sink.open() - self._stop_event = threading.Event() - self._thread: threading.Thread | None = None - self._needs_periodic_file_or_ui = dashboard or json_output_path is not None - - def start(self) -> None: - """Start the background reporter when at least one output is enabled.""" - if ( - not self._dashboard - and self._json_output_path is None - and self._jsonl_sink is None - ): - return - self._thread = threading.Thread( - target=self._run, - name="openrtc-runtime-reporter", - daemon=True, - ) - self._thread.start() - - def stop(self) -> None: - """Stop the background reporter and flush one final snapshot.""" - self._stop_event.set() - if self._thread is not None: - self._thread.join(timeout=max(self._refresh_seconds * 2, 1.0)) - self._write_json_snapshot() - self._emit_jsonl() - if self._jsonl_sink is not None: - self._jsonl_sink.close() - - def _run(self) -> None: - now = time.monotonic() - next_periodic = ( - now + self._refresh_seconds - if self._needs_periodic_file_or_ui - else float("inf") - ) - next_jsonl = now + self._jsonl_interval if self._jsonl_sink else float("inf") - - def schedule_cycle(live: Live | None) -> bool: - """Wait until the next tick; run JSON/JSONL/dashboard work. Return False to exit.""" - nonlocal next_periodic, next_jsonl - n = time.monotonic() - wait_periodic = max(0.0, next_periodic - n) - wait_jsonl = ( - max(0.0, next_jsonl - n) - if self._jsonl_sink is not None - else float("inf") - ) - timeout = min(wait_periodic, wait_jsonl, 3600.0) - if self._stop_event.wait(timeout): - return False - n = time.monotonic() - if self._needs_periodic_file_or_ui and n >= next_periodic: - if live is not None: - live.update(self._build_dashboard_renderable()) - self._write_json_snapshot() - next_periodic += self._refresh_seconds - if self._jsonl_sink is not None and n >= next_jsonl: - self._emit_jsonl() - next_jsonl += self._jsonl_interval - return True - - if self._dashboard: - with Live( - self._build_dashboard_renderable(), - console=console, - refresh_per_second=max(int(round(1 / self._refresh_seconds)), 1), - transient=True, - ) as live: - while schedule_cycle(live): - pass - live.update(self._build_dashboard_renderable()) - return - - while schedule_cycle(None): - pass - - def _build_dashboard_renderable(self) -> Panel: - snapshot = self._pool.runtime_snapshot() - return build_runtime_dashboard(snapshot) - - def _write_json_snapshot(self) -> None: - if self._json_output_path is None: - return - payload = self._pool.runtime_snapshot().to_dict() - self._json_output_path.parent.mkdir(parents=True, exist_ok=True) - self._json_output_path.write_text( - json.dumps(payload, indent=2, sort_keys=True), - encoding="utf-8", - ) - - def _emit_jsonl(self) -> None: - """Write one snapshot line then any queued session events (same tick).""" - if self._jsonl_sink is None: - return - self._jsonl_sink.write_snapshot(self._pool.runtime_snapshot()) - for ev in self._pool.drain_metrics_stream_events(): - self._jsonl_sink.write_event(ev) - - -def _format_percent(saved_bytes: int | None, baseline_bytes: int | None) -> str: - if saved_bytes is None or baseline_bytes in (None, 0): - return "—" - return f"{(saved_bytes / baseline_bytes) * 100:.0f}%" - - -def _memory_style(num_bytes: int | None) -> str: - if num_bytes is None: - return "white" - mib = num_bytes / (1024 * 1024) - if mib < 512: - return "green" - if mib < 1024: - return "yellow" - return "red" - - -def _build_sessions_table(snapshot: PoolRuntimeSnapshot) -> Table: - table = Table(show_header=True, header_style="bold cyan") - table.add_column("Agent", style="cyan") - table.add_column("Active sessions", justify="right") - - if snapshot.sessions_by_agent: - for agent_name, count in sorted( - snapshot.sessions_by_agent.items(), - key=lambda item: (-item[1], item[0]), - ): - table.add_row(agent_name, str(count)) - else: - table.add_row("—", "0") - return table - - -def build_runtime_dashboard(snapshot: PoolRuntimeSnapshot) -> Panel: - """Build a Rich dashboard from a runtime snapshot.""" - metrics = Table.grid(expand=True) - metrics.add_column(ratio=2) - metrics.add_column(ratio=1) - - rss_bytes = snapshot.resident_set.bytes_value - savings = snapshot.savings_estimate - progress_total = max(snapshot.registered_agents, 1) - left = Table.grid(padding=(0, 1)) - left.add_column(style="bold cyan") - left.add_column() - left.add_row( - "Worker RSS", - Text( - format_byte_size(rss_bytes or 0) - if rss_bytes is not None - else "Unavailable", - style=_memory_style(rss_bytes), - ), - ) - left.add_row("Metric", snapshot.resident_set.metric) - left.add_row("Uptime", f"{snapshot.uptime_seconds:.1f}s") - left.add_row("Registered", str(snapshot.registered_agents)) - left.add_row("Active", str(snapshot.active_sessions)) - left.add_row("Total handled", str(snapshot.total_sessions_started)) - left.add_row("Failures", str(snapshot.total_session_failures)) - left.add_row("Last route", snapshot.last_routed_agent or "—") - - right = Table.grid(padding=(0, 1)) - right.add_column(style="bold magenta") - right.add_column() - right.add_row( - "Shared worker", - format_byte_size(savings.shared_worker_bytes or 0) - if savings.shared_worker_bytes is not None - else "Unavailable", - ) - right.add_row( - "10x style estimate" - if snapshot.registered_agents == 10 - else "Separate workers", - format_byte_size(savings.estimated_separate_workers_bytes or 0) - if savings.estimated_separate_workers_bytes is not None - else "Unavailable", - ) - right.add_row( - "Estimated saved", - format_byte_size(savings.estimated_saved_bytes or 0) - if savings.estimated_saved_bytes is not None - else "Unavailable", - ) - right.add_row( - "Saved vs separate", - _format_percent( - savings.estimated_saved_bytes, - savings.estimated_separate_workers_bytes, - ), - ) - - metrics.add_row(left, right) - - progress = Table.grid(expand=True) - progress.add_column(ratio=3) - progress.add_column(ratio=2) - progress.add_row( - ProgressBar( - total=progress_total, - completed=min(snapshot.active_sessions, progress_total), - complete_style="green", - finished_style="green", - pulse_style="cyan", - ), - _build_sessions_table(snapshot), - ) - - footer = Text( - f"Memory metric: {snapshot.resident_set.description}", - style="dim", - ) - if snapshot.last_error: - footer.append(f"\nLast error: {snapshot.last_error}", style="bold red") - - body = Table.grid(expand=True) - body.add_row(metrics) - body.add_row("") - body.add_row(progress) - body.add_row("") - body.add_row(footer) - - return Panel( - body, - title="[bold blue]OpenRTC runtime dashboard[/bold blue]", - subtitle="shared worker visibility", - border_style="bright_blue", - ) - - -def _pool_kwargs( - default_stt: str | None, - default_llm: str | None, - default_tts: str | None, - default_greeting: str | None, -) -> dict[str, Any]: - return { - "default_stt": default_stt, - "default_llm": default_llm, - "default_tts": default_tts, - "default_greeting": default_greeting, - } - - -_OPENRTC_ONLY_FLAGS_WITH_VALUE: frozenset[str] = frozenset( - { - "--agents-dir", - "--default-stt", - "--default-llm", - "--default-tts", - "--default-greeting", - "--dashboard-refresh", - "--metrics-json-file", - "--metrics-jsonl", - "--metrics-jsonl-interval", - } -) -_OPENRTC_ONLY_BOOL_FLAGS: frozenset[str] = frozenset({"--dashboard"}) - - -def _strip_openrtc_only_flags_for_livekit(argv_tail: list[str]) -> list[str]: - """Drop OpenRTC-only CLI flags; LiveKit's ``run_app`` parses ``sys.argv`` itself. - - ``openrtc start`` / ``openrtc dev`` are implemented with Typer, then delegate to - :func:`livekit.agents.cli.run_app`, which builds a separate Typer application - that does not recognize OpenRTC options such as ``--agents-dir``. Those must - be removed before the handoff while preserving any forwarded LiveKit flags - (e.g. ``--reload``, ``--url``) when we add pass-through options later. - - For flags in ``_OPENRTC_ONLY_FLAGS_WITH_VALUE``, the **next** token is always - consumed as the value when present, even if it starts with ``--`` (e.g. a - path or provider string must not be mistaken for a following flag). - """ - out: list[str] = [] - i = 0 - while i < len(argv_tail): - arg = argv_tail[i] - if arg == "--": - out.extend(argv_tail[i:]) - break - if "=" in arg: - name = arg.split("=", 1)[0] - if ( - name in _OPENRTC_ONLY_FLAGS_WITH_VALUE - or name in _OPENRTC_ONLY_BOOL_FLAGS - ): - i += 1 - continue - out.append(arg) - i += 1 - continue - if arg in _OPENRTC_ONLY_BOOL_FLAGS: - i += 1 - continue - if arg in _OPENRTC_ONLY_FLAGS_WITH_VALUE: - i += 1 - if i < len(argv_tail): - i += 1 - continue - out.append(arg) - i += 1 - return out - - -def _livekit_sys_argv(subcommand: str) -> None: - """Set ``sys.argv`` for ``livekit.agents.cli.run_app``. - - OpenRTC-specific options are stripped because the LiveKit CLI re-parses - ``sys.argv`` and only accepts its own flags per subcommand. - - When the process was not started as ``openrtc ...`` (e.g. tests - that patch ``sys.argv``), only ``[argv0, subcommand]`` is used. - """ - prog = sys.argv[0] - if len(sys.argv) >= 2 and sys.argv[1] == subcommand: - rest = _strip_openrtc_only_flags_for_livekit(list(sys.argv[2:])) - sys.argv = [prog, subcommand, *rest] - else: - sys.argv = [prog, subcommand] - - -_LIVEKIT_ENV_OVERRIDE_KEYS: tuple[str, ...] = ( - "LIVEKIT_URL", - "LIVEKIT_API_KEY", - "LIVEKIT_API_SECRET", - "LIVEKIT_LOG_LEVEL", -) - - -def _snapshot_livekit_env() -> dict[str, str | None]: - return {key: os.environ.get(key) for key in _LIVEKIT_ENV_OVERRIDE_KEYS} - - -def _restore_livekit_env(snapshot: dict[str, str | None]) -> None: - for key, previous in snapshot.items(): - if previous is None: - os.environ.pop(key, None) - else: - os.environ[key] = previous - - -@contextlib.contextmanager -def _livekit_env_overrides( - *, - url: str | None, - api_key: str | None, - api_secret: str | None, - log_level: str | None, -) -> Iterator[None]: - """Temporarily set LiveKit env vars; restore previous values on exit.""" - snapshot = _snapshot_livekit_env() - try: - if url is not None: - os.environ["LIVEKIT_URL"] = url - if api_key is not None: - os.environ["LIVEKIT_API_KEY"] = api_key - if api_secret is not None: - os.environ["LIVEKIT_API_SECRET"] = api_secret - if log_level is not None: - os.environ["LIVEKIT_LOG_LEVEL"] = log_level - yield - finally: - _restore_livekit_env(snapshot) - - -def _delegate_discovered_pool_to_livekit( - *, - agents_dir: Path, - subcommand: str, - default_stt: str | None, - default_llm: str | None, - default_tts: str | None, - default_greeting: str | None, - dashboard: bool, - dashboard_refresh: float, - metrics_json_file: Path | None, - metrics_jsonl: Path | None, - metrics_jsonl_interval: float | None, - url: str | None, - api_key: str | None, - api_secret: str | None, - log_level: str | None, -) -> None: - """Discover agents, optionally set connection env, then run a LiveKit CLI subcommand.""" - pool = AgentPool( - **_pool_kwargs(default_stt, default_llm, default_tts, default_greeting) - ) - _discover_or_exit(agents_dir, pool) - with _livekit_env_overrides( - url=url, api_key=api_key, api_secret=api_secret, log_level=log_level - ): - _livekit_sys_argv(subcommand) - _run_pool_with_reporting( - pool, - dashboard=dashboard, - dashboard_refresh=dashboard_refresh, - metrics_json_file=metrics_json_file, - metrics_jsonl=metrics_jsonl, - metrics_jsonl_interval=metrics_jsonl_interval, - ) - - -def _run_connect_handoff( - *, - agents_dir: Path, - default_stt: str | None, - default_llm: str | None, - default_tts: str | None, - default_greeting: str | None, - room: str, - participant_identity: str | None, - log_level: str | None, - url: str | None, - api_key: str | None, - api_secret: str | None, - dashboard: bool, - dashboard_refresh: float, - metrics_json_file: Path | None, - metrics_jsonl: Path | None, - metrics_jsonl_interval: float | None, -) -> None: - """Hand off to LiveKit ``connect`` with explicit argv (Typer consumes flags first).""" - pool = AgentPool( - **_pool_kwargs(default_stt, default_llm, default_tts, default_greeting) - ) - _discover_or_exit(agents_dir, pool) - with _livekit_env_overrides( - url=url, api_key=api_key, api_secret=api_secret, log_level=None - ): - prog = sys.argv[0] - tail: list[str] = ["connect", "--room", room] - if participant_identity is not None: - tail.extend(["--participant-identity", participant_identity]) - if log_level is not None: - tail.extend(["--log-level", log_level]) - sys.argv = [prog, *tail] - _run_pool_with_reporting( - pool, - dashboard=dashboard, - dashboard_refresh=dashboard_refresh, - metrics_json_file=metrics_json_file, - metrics_jsonl=metrics_jsonl, - metrics_jsonl_interval=metrics_jsonl_interval, - ) - - -def _discover_or_exit(agents_dir: Path, pool: AgentPool) -> list[AgentConfig]: - try: - discovered = pool.discover(agents_dir) - except FileNotFoundError: - logger.error( - "Agents directory does not exist: %s. Pass a valid --agents-dir path.", - agents_dir, - ) - raise typer.Exit(code=1) from None - except NotADirectoryError: - logger.error( - "--agents-dir is not a directory: %s. Pass a directory of agent modules.", - agents_dir, - ) - raise typer.Exit(code=1) from None - except PermissionError as exc: - logger.error( - "Permission denied reading agents directory %s: %s", - agents_dir, - exc, - ) - raise typer.Exit(code=1) from exc - if not discovered: - logger.error("No agent modules were discovered in %s.", agents_dir) - raise typer.Exit(code=1) - return discovered - - -def _truncate_cell(text: str, max_len: int = 36) -> str: - if len(text) <= max_len: - return text - return text[: max_len - 1] + "…" - - -AgentsDirArg = Annotated[ - Path, - typer.Option( - "--agents-dir", - help="Directory of agent modules to load (only required flag for most workflows).", - exists=False, - resolve_path=True, - path_type=Path, - rich_help_panel=PANEL_OPENRTC, - ), -] - -DefaultSttArg = Annotated[ - str | None, - typer.Option( - "--default-stt", - help=( - "Default STT provider used when a discovered agent does not " - "override STT via @agent_config(...)." - ), - rich_help_panel=PANEL_OPENRTC, - ), -] - -DefaultLlmArg = Annotated[ - str | None, - typer.Option( - "--default-llm", - help=( - "Default LLM provider used when a discovered agent does not " - "override LLM via @agent_config(...)." - ), - rich_help_panel=PANEL_OPENRTC, - ), -] - -DefaultTtsArg = Annotated[ - str | None, - typer.Option( - "--default-tts", - help=( - "Default TTS provider used when a discovered agent does not " - "override TTS via @agent_config(...)." - ), - rich_help_panel=PANEL_OPENRTC, - ), -] - -DefaultGreetingArg = Annotated[ - str | None, - typer.Option( - "--default-greeting", - help=( - "Default greeting used when a discovered agent does not " - "override greeting via @agent_config(...)." - ), - rich_help_panel=PANEL_ADVANCED, - ), -] - -DashboardArg = Annotated[ - bool, - typer.Option( - "--dashboard", - help="Show a live Rich dashboard (off by default; use for local debugging).", - rich_help_panel=PANEL_OPENRTC, - ), -] - -DashboardRefreshArg = Annotated[ - float, - typer.Option( - "--dashboard-refresh", - min=0.25, - help="Refresh interval in seconds for dashboard / metrics file / JSONL (default 1s).", - rich_help_panel=PANEL_ADVANCED, - ), -] - -MetricsJsonFileArg = Annotated[ - Path | None, - typer.Option( - "--metrics-json-file", - help="Overwrite a JSON file each tick with the latest snapshot (automation / CI).", - resolve_path=True, - path_type=Path, - rich_help_panel=PANEL_ADVANCED, - ), -] - -MetricsJsonlArg = Annotated[ - Path | None, - typer.Option( - "--metrics-jsonl", - help=( - "Append JSON Lines for ``openrtc tui --watch`` (off by default; " - "truncates when the worker starts)." - ), - resolve_path=True, - path_type=Path, - rich_help_panel=PANEL_OPENRTC, - ), -] - -MetricsJsonlIntervalArg = Annotated[ - float | None, - typer.Option( - "--metrics-jsonl-interval", - min=0.25, - help=("Seconds between JSONL records (default: same as --dashboard-refresh)."), - rich_help_panel=PANEL_ADVANCED, - ), -] - -TuiWatchPathArg = Annotated[ - Path, - typer.Option( - "--watch", - help="JSONL file written by the worker's --metrics-jsonl.", - resolve_path=True, - path_type=Path, - rich_help_panel=PANEL_OPENRTC, - ), -] - -TuiFromStartArg = Annotated[ - bool, - typer.Option( - "--from-start", - help="Read the file from the beginning instead of tailing from EOF.", - rich_help_panel=PANEL_ADVANCED, - ), -] - -LiveKitUrlArg = Annotated[ - str | None, - typer.Option( - "--url", - help="WebSocket URL of the LiveKit server or Cloud project.", - envvar="LIVEKIT_URL", - rich_help_panel=PANEL_LIVEKIT, - ), -] - -LiveKitApiKeyArg = Annotated[ - str | None, - typer.Option( - "--api-key", - help="API key for the LiveKit server or Cloud project.", - envvar="LIVEKIT_API_KEY", - rich_help_panel=PANEL_LIVEKIT, - ), -] - -LiveKitApiSecretArg = Annotated[ - str | None, - typer.Option( - "--api-secret", - help="API secret for the LiveKit server or Cloud project.", - envvar="LIVEKIT_API_SECRET", - rich_help_panel=PANEL_LIVEKIT, - ), -] - -ConnectRoomArg = Annotated[ - str, - typer.Option( - "--room", - help="Room name to connect to (same as LiveKit Agents [code]connect[/code]).", - rich_help_panel=PANEL_LIVEKIT, - ), -] - -ConnectParticipantArg = Annotated[ - str | None, - typer.Option( - "--participant-identity", - help="Agent participant identity when connecting to the room.", - rich_help_panel=PANEL_ADVANCED, - ), -] - -LiveKitLogLevelArg = Annotated[ - str | None, - typer.Option( - "--log-level", - help="Log level (e.g. DEBUG, INFO, WARN, ERROR).", - envvar="LIVEKIT_LOG_LEVEL", - case_sensitive=False, - rich_help_panel=PANEL_ADVANCED, - ), -] - @app.command("list") def list_command( @@ -812,147 +124,17 @@ def list_command( discovered = _discover_or_exit(agents_dir, pool) if json_output: - payload = _build_list_json_payload(discovered, include_resources=resources) + payload = build_list_json_payload(discovered, include_resources=resources) print(json.dumps(payload, indent=2, default=str)) return if plain: - _print_list_plain(discovered, resources=resources) + print_list_plain(discovered, resources=resources) return - _print_list_rich_table(discovered, resources=resources) - if resources: - _print_resource_summary_rich(discovered) - - -def _print_list_rich_table( - discovered: list[AgentConfig], - *, - resources: bool, -) -> None: - table = Table( - title="Discovered agents", - show_header=True, - header_style="bold", - show_lines=False, - ) - table.add_column("Name", style="cyan", no_wrap=True) - table.add_column("Class", style="green") - table.add_column("STT") - table.add_column("LLM") - table.add_column("TTS") - table.add_column("Greeting") - if resources: - table.add_column("Source size", style="dim") - - for config in discovered: - greeting = "" if config.greeting is None else config.greeting - row = [ - config.name, - config.agent_cls.__name__, - _truncate_cell(repr(config.stt)), - _truncate_cell(repr(config.llm)), - _truncate_cell(repr(config.tts)), - _truncate_cell(greeting), - ] - if resources: - if config.source_path is not None: - sz = file_size_bytes(config.source_path) - row.append(format_byte_size(sz)) - else: - row.append("—") - table.add_row(*row) - - console.print(table) - - -def _print_list_plain( - discovered: list[AgentConfig], - *, - resources: bool, -) -> None: - for config in discovered: - line = ( - f"{config.name}: class={config.agent_cls.__name__}, " - f"stt={config.stt!r}, llm={config.llm!r}, tts={config.tts!r}, " - f"greeting={config.greeting!r}" - ) - if resources and config.source_path is not None: - sz = file_size_bytes(config.source_path) - line += f", source_size={format_byte_size(sz)}" - print(line) - + print_list_rich_table(discovered, resources=resources) if resources: - print() - _print_resource_summary_plain(discovered) - - -def _build_list_json_payload( - discovered: list[AgentConfig], - *, - include_resources: bool, -) -> dict[str, Any]: - agents: list[dict[str, Any]] = [] - for config in discovered: - entry: dict[str, Any] = { - "name": config.name, - "class": config.agent_cls.__name__, - "stt": config.stt, - "llm": config.llm, - "tts": config.tts, - "greeting": config.greeting, - } - if include_resources: - entry["source_path"] = ( - str(config.source_path) if config.source_path is not None else None - ) - entry["source_file_bytes"] = ( - file_size_bytes(config.source_path) - if config.source_path is not None - else None - ) - agents.append(entry) - - # Bump when the JSON shape changes so automation can branch safely. - payload: dict[str, Any] = { - "schema_version": 1, - "command": "list", - "agents": agents, - } - if include_resources: - footprints = agent_disk_footprints(discovered) - total_source = sum(f.size_bytes for f in footprints) - rss_info = get_process_resident_set_info() - savings = estimate_shared_worker_savings( - agent_count=len(discovered), - shared_worker_bytes=rss_info.bytes_value, - ) - payload["resource_summary"] = { - "agent_count": len(discovered), - "total_source_bytes": total_source, - "agents_with_known_path": len(footprints), - "resident_set": { - "bytes": rss_info.bytes_value, - "metric": rss_info.metric, - "description": rss_info.description, - }, - "savings_estimate": { - "agent_count": savings.agent_count, - "shared_worker_bytes": savings.shared_worker_bytes, - "estimated_separate_workers_bytes": ( - savings.estimated_separate_workers_bytes - ), - "estimated_saved_bytes": savings.estimated_saved_bytes, - "assumptions": list(savings.assumptions), - }, - } - return payload - - -_LIVEKIT_CLI_CONTEXT_SETTINGS = { - "allow_extra_args": True, - "ignore_unknown_options": True, -} + print_resource_summary_rich(discovered) @app.command("start", context_settings=_LIVEKIT_CLI_CONTEXT_SETTINGS) @@ -1159,128 +341,6 @@ def tui_command( run_metrics_tui(watch, from_start=from_start) -def _run_pool_with_reporting( - pool: AgentPool, - *, - dashboard: bool, - dashboard_refresh: float, - metrics_json_file: Path | None, - metrics_jsonl: Path | None = None, - metrics_jsonl_interval: float | None = None, -) -> None: - reporter = RuntimeReporter( - pool, - dashboard=dashboard, - refresh_seconds=dashboard_refresh, - json_output_path=metrics_json_file, - metrics_jsonl_path=metrics_jsonl, - metrics_jsonl_interval=metrics_jsonl_interval, - ) - reporter.start() - try: - pool.run() - finally: - reporter.stop() - - -def _print_resource_summary_rich(discovered: list[AgentConfig]) -> None: - footprints = agent_disk_footprints(discovered) - total_source = sum(f.size_bytes for f in footprints) - rss_info = get_process_resident_set_info() - savings = estimate_shared_worker_savings( - agent_count=len(discovered), - shared_worker_bytes=rss_info.bytes_value, - ) - - lines: list[str] = [ - ( - f"Agents: {len(discovered)}; on-disk agent source total: " - f"{format_byte_size(total_source)}" - ), - ] - if len(footprints) < len(discovered): - lines.append( - "Per-agent source size is shown only when the module path is known " - "(e.g. via discovery)." - ) - - if rss_info.bytes_value is not None: - lines.append( - f"{format_byte_size(rss_info.bytes_value)} — {rss_info.description}" - ) - else: - lines.append( - f"Resident memory metric unavailable on this platform ({rss_info.metric})." - ) - - if savings.estimated_saved_bytes is not None: - lines.append( - "Estimated shared-worker savings versus one worker per agent: " - f"{format_byte_size(savings.estimated_saved_bytes)}" - ) - - lines.append("") - lines.append( - "OpenRTC runs every agent in one shared LiveKit worker process, so you ship " - "one container image and one runtime instead of duplicating a large base " - "image per agent. Actual memory at runtime depends on models, concurrent " - "sessions, and providers; use host metrics in production." - ) - - console.print() - console.print( - Panel( - "\n".join(lines), - title="[bold]Resource summary[/bold]", - subtitle="Local estimates for this [code]openrtc list[/code] process", - border_style="blue", - ) - ) - - -def _print_resource_summary_plain(discovered: list[AgentConfig]) -> None: - footprints = agent_disk_footprints(discovered) - total_source = sum(f.size_bytes for f in footprints) - rss_info = get_process_resident_set_info() - savings = estimate_shared_worker_savings( - agent_count=len(discovered), - shared_worker_bytes=rss_info.bytes_value, - ) - - print("Resource summary (local estimates for this `openrtc list` process):") - print( - f" Agents: {len(discovered)}; on-disk agent source total: " - f"{format_byte_size(total_source)}" - ) - if len(footprints) < len(discovered): - print( - " Note: per-agent source size is shown only for agents " - "registered with a known file path (e.g. via discovery)." - ) - if rss_info.bytes_value is not None: - print( - f" Resident set metric ({rss_info.metric}): " - f"{format_byte_size(rss_info.bytes_value)} — {rss_info.description}" - ) - else: - print( - f" Resident memory metric unavailable ({rss_info.metric}): " - f"{rss_info.description}" - ) - if savings.estimated_saved_bytes is not None: - print( - " Estimated shared-worker savings versus one worker per agent: " - f"{format_byte_size(savings.estimated_saved_bytes)}" - ) - print() - print( - "OpenRTC runs every agent in one shared LiveKit worker process, so you ship " - "one container image and one runtime instead of duplicating a large base " - "image per agent. Actual memory at runtime depends on models, concurrent " - "sessions, and providers; use host metrics in production." - ) - - def main(argv: list[str] | None = None) -> int: """Run the CLI via Typer's underlying Click command (programmatic API). @@ -1311,3 +371,13 @@ def main(argv: list[str] | None = None) -> int: finally: sys.argv = previous_argv return 0 + + +__all__ = [ + "RuntimeReporter", + "_run_pool_with_reporting", + "_strip_openrtc_only_flags_for_livekit", + "app", + "build_runtime_dashboard", + "main", +] diff --git a/src/openrtc/cli_dashboard.py b/src/openrtc/cli_dashboard.py new file mode 100644 index 0000000..0497151 --- /dev/null +++ b/src/openrtc/cli_dashboard.py @@ -0,0 +1,382 @@ +"""Rich dashboard, list output, and resource summary rendering for the CLI.""" + +from __future__ import annotations + +from typing import Any + +from rich.console import Console +from rich.panel import Panel +from rich.progress_bar import ProgressBar +from rich.table import Table +from rich.text import Text + +from openrtc.pool import AgentConfig +from openrtc.resources import ( + PoolRuntimeSnapshot, + agent_disk_footprints, + estimate_shared_worker_savings, + file_size_bytes, + format_byte_size, + get_process_resident_set_info, +) + +console = Console() + + +def _format_percent(saved_bytes: int | None, baseline_bytes: int | None) -> str: + if saved_bytes is None or baseline_bytes in (None, 0): + return "—" + return f"{(saved_bytes / baseline_bytes) * 100:.0f}%" + + +def _memory_style(num_bytes: int | None) -> str: + if num_bytes is None: + return "white" + mib = num_bytes / (1024 * 1024) + if mib < 512: + return "green" + if mib < 1024: + return "yellow" + return "red" + + +def _build_sessions_table(snapshot: PoolRuntimeSnapshot) -> Table: + table = Table(show_header=True, header_style="bold cyan") + table.add_column("Agent", style="cyan") + table.add_column("Active sessions", justify="right") + + if snapshot.sessions_by_agent: + for agent_name, count in sorted( + snapshot.sessions_by_agent.items(), + key=lambda item: (-item[1], item[0]), + ): + table.add_row(agent_name, str(count)) + else: + table.add_row("—", "0") + return table + + +def build_runtime_dashboard(snapshot: PoolRuntimeSnapshot) -> Panel: + """Build a Rich dashboard from a runtime snapshot.""" + metrics = Table.grid(expand=True) + metrics.add_column(ratio=2) + metrics.add_column(ratio=1) + + rss_bytes = snapshot.resident_set.bytes_value + savings = snapshot.savings_estimate + progress_total = max(snapshot.registered_agents, 1) + left = Table.grid(padding=(0, 1)) + left.add_column(style="bold cyan") + left.add_column() + left.add_row( + "Worker RSS", + Text( + format_byte_size(rss_bytes or 0) + if rss_bytes is not None + else "Unavailable", + style=_memory_style(rss_bytes), + ), + ) + left.add_row("Metric", snapshot.resident_set.metric) + left.add_row("Uptime", f"{snapshot.uptime_seconds:.1f}s") + left.add_row("Registered", str(snapshot.registered_agents)) + left.add_row("Active", str(snapshot.active_sessions)) + left.add_row("Total handled", str(snapshot.total_sessions_started)) + left.add_row("Failures", str(snapshot.total_session_failures)) + left.add_row("Last route", snapshot.last_routed_agent or "—") + + right = Table.grid(padding=(0, 1)) + right.add_column(style="bold magenta") + right.add_column() + right.add_row( + "Shared worker", + format_byte_size(savings.shared_worker_bytes or 0) + if savings.shared_worker_bytes is not None + else "Unavailable", + ) + right.add_row( + "10x style estimate" + if snapshot.registered_agents == 10 + else "Separate workers", + format_byte_size(savings.estimated_separate_workers_bytes or 0) + if savings.estimated_separate_workers_bytes is not None + else "Unavailable", + ) + right.add_row( + "Estimated saved", + format_byte_size(savings.estimated_saved_bytes or 0) + if savings.estimated_saved_bytes is not None + else "Unavailable", + ) + right.add_row( + "Saved vs separate", + _format_percent( + savings.estimated_saved_bytes, + savings.estimated_separate_workers_bytes, + ), + ) + + metrics.add_row(left, right) + + progress = Table.grid(expand=True) + progress.add_column(ratio=3) + progress.add_column(ratio=2) + progress.add_row( + ProgressBar( + total=progress_total, + completed=min(snapshot.active_sessions, progress_total), + complete_style="green", + finished_style="green", + pulse_style="cyan", + ), + _build_sessions_table(snapshot), + ) + + footer = Text( + f"Memory metric: {snapshot.resident_set.description}", + style="dim", + ) + if snapshot.last_error: + footer.append(f"\nLast error: {snapshot.last_error}", style="bold red") + + body = Table.grid(expand=True) + body.add_row(metrics) + body.add_row("") + body.add_row(progress) + body.add_row("") + body.add_row(footer) + + return Panel( + body, + title="[bold blue]OpenRTC runtime dashboard[/bold blue]", + subtitle="shared worker visibility", + border_style="bright_blue", + ) + + +def _truncate_cell(text: str, max_len: int = 36) -> str: + if len(text) <= max_len: + return text + return text[: max_len - 1] + "…" + + +def print_list_rich_table( + discovered: list[AgentConfig], + *, + resources: bool, +) -> None: + table = Table( + title="Discovered agents", + show_header=True, + header_style="bold", + show_lines=False, + ) + table.add_column("Name", style="cyan", no_wrap=True) + table.add_column("Class", style="green") + table.add_column("STT") + table.add_column("LLM") + table.add_column("TTS") + table.add_column("Greeting") + if resources: + table.add_column("Source size", style="dim") + + for config in discovered: + greeting = "" if config.greeting is None else config.greeting + row = [ + config.name, + config.agent_cls.__name__, + _truncate_cell(repr(config.stt)), + _truncate_cell(repr(config.llm)), + _truncate_cell(repr(config.tts)), + _truncate_cell(greeting), + ] + if resources: + if config.source_path is not None: + sz = file_size_bytes(config.source_path) + row.append(format_byte_size(sz)) + else: + row.append("—") + table.add_row(*row) + + console.print(table) + + +def print_list_plain( + discovered: list[AgentConfig], + *, + resources: bool, +) -> None: + for config in discovered: + line = ( + f"{config.name}: class={config.agent_cls.__name__}, " + f"stt={config.stt!r}, llm={config.llm!r}, tts={config.tts!r}, " + f"greeting={config.greeting!r}" + ) + if resources and config.source_path is not None: + sz = file_size_bytes(config.source_path) + line += f", source_size={format_byte_size(sz)}" + print(line) + + if resources: + print() + print_resource_summary_plain(discovered) + + +def build_list_json_payload( + discovered: list[AgentConfig], + *, + include_resources: bool, +) -> dict[str, Any]: + agents: list[dict[str, Any]] = [] + for config in discovered: + entry: dict[str, Any] = { + "name": config.name, + "class": config.agent_cls.__name__, + "stt": config.stt, + "llm": config.llm, + "tts": config.tts, + "greeting": config.greeting, + } + if include_resources: + entry["source_path"] = ( + str(config.source_path) if config.source_path is not None else None + ) + entry["source_file_bytes"] = ( + file_size_bytes(config.source_path) + if config.source_path is not None + else None + ) + agents.append(entry) + + # Bump when the JSON shape changes so automation can branch safely. + payload: dict[str, Any] = { + "schema_version": 1, + "command": "list", + "agents": agents, + } + if include_resources: + footprints = agent_disk_footprints(discovered) + total_source = sum(f.size_bytes for f in footprints) + rss_info = get_process_resident_set_info() + savings = estimate_shared_worker_savings( + agent_count=len(discovered), + shared_worker_bytes=rss_info.bytes_value, + ) + payload["resource_summary"] = { + "agent_count": len(discovered), + "total_source_bytes": total_source, + "agents_with_known_path": len(footprints), + "resident_set": { + "bytes": rss_info.bytes_value, + "metric": rss_info.metric, + "description": rss_info.description, + }, + "savings_estimate": { + "agent_count": savings.agent_count, + "shared_worker_bytes": savings.shared_worker_bytes, + "estimated_separate_workers_bytes": ( + savings.estimated_separate_workers_bytes + ), + "estimated_saved_bytes": savings.estimated_saved_bytes, + "assumptions": list(savings.assumptions), + }, + } + return payload + + +def print_resource_summary_rich(discovered: list[AgentConfig]) -> None: + footprints = agent_disk_footprints(discovered) + total_source = sum(f.size_bytes for f in footprints) + rss_info = get_process_resident_set_info() + savings = estimate_shared_worker_savings( + agent_count=len(discovered), + shared_worker_bytes=rss_info.bytes_value, + ) + + lines: list[str] = [ + ( + f"Agents: {len(discovered)}; on-disk agent source total: " + f"{format_byte_size(total_source)}" + ), + ] + if len(footprints) < len(discovered): + lines.append( + "Per-agent source size is shown only when the module path is known " + "(e.g. via discovery)." + ) + + if rss_info.bytes_value is not None: + lines.append( + f"{format_byte_size(rss_info.bytes_value)} — {rss_info.description}" + ) + else: + lines.append( + f"Resident memory metric unavailable on this platform ({rss_info.metric})." + ) + + if savings.estimated_saved_bytes is not None: + lines.append( + "Estimated shared-worker savings versus one worker per agent: " + f"{format_byte_size(savings.estimated_saved_bytes)}" + ) + + lines.append("") + lines.append( + "OpenRTC runs every agent in one shared LiveKit worker process, so you ship " + "one container image and one runtime instead of duplicating a large base " + "image per agent. Actual memory at runtime depends on models, concurrent " + "sessions, and providers; use host metrics in production." + ) + + console.print() + console.print( + Panel( + "\n".join(lines), + title="[bold]Resource summary[/bold]", + subtitle="Local estimates for this [code]openrtc list[/code] process", + border_style="blue", + ) + ) + + +def print_resource_summary_plain(discovered: list[AgentConfig]) -> None: + footprints = agent_disk_footprints(discovered) + total_source = sum(f.size_bytes for f in footprints) + rss_info = get_process_resident_set_info() + savings = estimate_shared_worker_savings( + agent_count=len(discovered), + shared_worker_bytes=rss_info.bytes_value, + ) + + print("Resource summary (local estimates for this `openrtc list` process):") + print( + f" Agents: {len(discovered)}; on-disk agent source total: " + f"{format_byte_size(total_source)}" + ) + if len(footprints) < len(discovered): + print( + " Note: per-agent source size is shown only for agents " + "registered with a known file path (e.g. via discovery)." + ) + if rss_info.bytes_value is not None: + print( + f" Resident set metric ({rss_info.metric}): " + f"{format_byte_size(rss_info.bytes_value)} — {rss_info.description}" + ) + else: + print( + f" Resident memory metric unavailable ({rss_info.metric}): " + f"{rss_info.description}" + ) + if savings.estimated_saved_bytes is not None: + print( + " Estimated shared-worker savings versus one worker per agent: " + f"{format_byte_size(savings.estimated_saved_bytes)}" + ) + print() + print( + "OpenRTC runs every agent in one shared LiveKit worker process, so you ship " + "one container image and one runtime instead of duplicating a large base " + "image per agent. Actual memory at runtime depends on models, concurrent " + "sessions, and providers; use host metrics in production." + ) diff --git a/src/openrtc/cli_livekit.py b/src/openrtc/cli_livekit.py new file mode 100644 index 0000000..122af24 --- /dev/null +++ b/src/openrtc/cli_livekit.py @@ -0,0 +1,286 @@ +"""LiveKit CLI handoff: argv stripping, env overrides, pool lifecycle.""" + +from __future__ import annotations + +import contextlib +import logging +import os +import sys +from collections.abc import Iterator +from pathlib import Path +from typing import Any + +import typer + +from openrtc.cli_reporter import RuntimeReporter +from openrtc.pool import AgentConfig, AgentPool + +logger = logging.getLogger("openrtc") + + +def _pool_kwargs( + default_stt: str | None, + default_llm: str | None, + default_tts: str | None, + default_greeting: str | None, +) -> dict[str, Any]: + return { + "default_stt": default_stt, + "default_llm": default_llm, + "default_tts": default_tts, + "default_greeting": default_greeting, + } + + +_OPENRTC_ONLY_FLAGS_WITH_VALUE: frozenset[str] = frozenset( + { + "--agents-dir", + "--default-stt", + "--default-llm", + "--default-tts", + "--default-greeting", + "--dashboard-refresh", + "--metrics-json-file", + "--metrics-jsonl", + "--metrics-jsonl-interval", + } +) +_OPENRTC_ONLY_BOOL_FLAGS: frozenset[str] = frozenset({"--dashboard"}) + + +def _strip_openrtc_only_flags_for_livekit(argv_tail: list[str]) -> list[str]: + """Drop OpenRTC-only CLI flags; LiveKit's ``run_app`` parses ``sys.argv`` itself. + + ``openrtc start`` / ``openrtc dev`` are implemented with Typer, then delegate to + :func:`livekit.agents.cli.run_app`, which builds a separate Typer application + that does not recognize OpenRTC options such as ``--agents-dir``. Those must + be removed before the handoff while preserving any forwarded LiveKit flags + (e.g. ``--reload``, ``--url``) when we add pass-through options later. + + For flags in ``_OPENRTC_ONLY_FLAGS_WITH_VALUE``, the **next** token is always + consumed as the value when present, even if it starts with ``--`` (e.g. a + path or provider string must not be mistaken for a following flag). + """ + out: list[str] = [] + i = 0 + while i < len(argv_tail): + arg = argv_tail[i] + if arg == "--": + out.extend(argv_tail[i:]) + break + if "=" in arg: + name = arg.split("=", 1)[0] + if ( + name in _OPENRTC_ONLY_FLAGS_WITH_VALUE + or name in _OPENRTC_ONLY_BOOL_FLAGS + ): + i += 1 + continue + out.append(arg) + i += 1 + continue + if arg in _OPENRTC_ONLY_BOOL_FLAGS: + i += 1 + continue + if arg in _OPENRTC_ONLY_FLAGS_WITH_VALUE: + i += 1 + if i < len(argv_tail): + i += 1 + continue + out.append(arg) + i += 1 + return out + + +def _livekit_sys_argv(subcommand: str) -> None: + """Set ``sys.argv`` for ``livekit.agents.cli.run_app``. + + OpenRTC-specific options are stripped because the LiveKit CLI re-parses + ``sys.argv`` and only accepts its own flags per subcommand. + + When the process was not started as ``openrtc ...`` (e.g. tests + that patch ``sys.argv``), only ``[argv0, subcommand]`` is used. + """ + prog = sys.argv[0] + if len(sys.argv) >= 2 and sys.argv[1] == subcommand: + rest = _strip_openrtc_only_flags_for_livekit(list(sys.argv[2:])) + sys.argv = [prog, subcommand, *rest] + else: + sys.argv = [prog, subcommand] + + +_LIVEKIT_ENV_OVERRIDE_KEYS: tuple[str, ...] = ( + "LIVEKIT_URL", + "LIVEKIT_API_KEY", + "LIVEKIT_API_SECRET", + "LIVEKIT_LOG_LEVEL", +) + + +def _snapshot_livekit_env() -> dict[str, str | None]: + return {key: os.environ.get(key) for key in _LIVEKIT_ENV_OVERRIDE_KEYS} + + +def _restore_livekit_env(snapshot: dict[str, str | None]) -> None: + for key, previous in snapshot.items(): + if previous is None: + os.environ.pop(key, None) + else: + os.environ[key] = previous + + +@contextlib.contextmanager +def _livekit_env_overrides( + *, + url: str | None, + api_key: str | None, + api_secret: str | None, + log_level: str | None, +) -> Iterator[None]: + """Temporarily set LiveKit env vars; restore previous values on exit.""" + snapshot = _snapshot_livekit_env() + try: + if url is not None: + os.environ["LIVEKIT_URL"] = url + if api_key is not None: + os.environ["LIVEKIT_API_KEY"] = api_key + if api_secret is not None: + os.environ["LIVEKIT_API_SECRET"] = api_secret + if log_level is not None: + os.environ["LIVEKIT_LOG_LEVEL"] = log_level + yield + finally: + _restore_livekit_env(snapshot) + + +def _delegate_discovered_pool_to_livekit( + *, + agents_dir: Path, + subcommand: str, + default_stt: str | None, + default_llm: str | None, + default_tts: str | None, + default_greeting: str | None, + dashboard: bool, + dashboard_refresh: float, + metrics_json_file: Path | None, + metrics_jsonl: Path | None, + metrics_jsonl_interval: float | None, + url: str | None, + api_key: str | None, + api_secret: str | None, + log_level: str | None, +) -> None: + """Discover agents, optionally set connection env, then run a LiveKit CLI subcommand.""" + pool = AgentPool( + **_pool_kwargs(default_stt, default_llm, default_tts, default_greeting) + ) + _discover_or_exit(agents_dir, pool) + with _livekit_env_overrides( + url=url, api_key=api_key, api_secret=api_secret, log_level=log_level + ): + _livekit_sys_argv(subcommand) + _run_pool_with_reporting( + pool, + dashboard=dashboard, + dashboard_refresh=dashboard_refresh, + metrics_json_file=metrics_json_file, + metrics_jsonl=metrics_jsonl, + metrics_jsonl_interval=metrics_jsonl_interval, + ) + + +def _run_connect_handoff( + *, + agents_dir: Path, + default_stt: str | None, + default_llm: str | None, + default_tts: str | None, + default_greeting: str | None, + room: str, + participant_identity: str | None, + log_level: str | None, + url: str | None, + api_key: str | None, + api_secret: str | None, + dashboard: bool, + dashboard_refresh: float, + metrics_json_file: Path | None, + metrics_jsonl: Path | None, + metrics_jsonl_interval: float | None, +) -> None: + """Hand off to LiveKit ``connect`` with explicit argv (Typer consumes flags first).""" + pool = AgentPool( + **_pool_kwargs(default_stt, default_llm, default_tts, default_greeting) + ) + _discover_or_exit(agents_dir, pool) + with _livekit_env_overrides( + url=url, api_key=api_key, api_secret=api_secret, log_level=None + ): + prog = sys.argv[0] + tail: list[str] = ["connect", "--room", room] + if participant_identity is not None: + tail.extend(["--participant-identity", participant_identity]) + if log_level is not None: + tail.extend(["--log-level", log_level]) + sys.argv = [prog, *tail] + _run_pool_with_reporting( + pool, + dashboard=dashboard, + dashboard_refresh=dashboard_refresh, + metrics_json_file=metrics_json_file, + metrics_jsonl=metrics_jsonl, + metrics_jsonl_interval=metrics_jsonl_interval, + ) + + +def _discover_or_exit(agents_dir: Path, pool: AgentPool) -> list[AgentConfig]: + try: + discovered = pool.discover(agents_dir) + except FileNotFoundError: + logger.error( + "Agents directory does not exist: %s. Pass a valid --agents-dir path.", + agents_dir, + ) + raise typer.Exit(code=1) from None + except NotADirectoryError: + logger.error( + "--agents-dir is not a directory: %s. Pass a directory of agent modules.", + agents_dir, + ) + raise typer.Exit(code=1) from None + except PermissionError as exc: + logger.error( + "Permission denied reading agents directory %s: %s", + agents_dir, + exc, + ) + raise typer.Exit(code=1) from exc + if not discovered: + logger.error("No agent modules were discovered in %s.", agents_dir) + raise typer.Exit(code=1) + return discovered + + +def _run_pool_with_reporting( + pool: AgentPool, + *, + dashboard: bool, + dashboard_refresh: float, + metrics_json_file: Path | None, + metrics_jsonl: Path | None = None, + metrics_jsonl_interval: float | None = None, +) -> None: + reporter = RuntimeReporter( + pool, + dashboard=dashboard, + refresh_seconds=dashboard_refresh, + json_output_path=metrics_json_file, + metrics_jsonl_path=metrics_jsonl, + metrics_jsonl_interval=metrics_jsonl_interval, + ) + reporter.start() + try: + pool.run() + finally: + reporter.stop() diff --git a/src/openrtc/cli_reporter.py b/src/openrtc/cli_reporter.py new file mode 100644 index 0000000..cf85fe3 --- /dev/null +++ b/src/openrtc/cli_reporter.py @@ -0,0 +1,141 @@ +"""Background runtime metrics reporter (Rich dashboard, JSON file, JSONL stream).""" + +from __future__ import annotations + +import json +import threading +import time +from pathlib import Path + +from rich.live import Live +from rich.panel import Panel + +from openrtc.cli_dashboard import build_runtime_dashboard, console +from openrtc.metrics_stream import JsonlMetricsSink +from openrtc.pool import AgentPool + + +class RuntimeReporter: + """Background reporter: Rich dashboard, static JSON file, and/or JSONL stream.""" + + def __init__( + self, + pool: AgentPool, + *, + dashboard: bool, + refresh_seconds: float, + json_output_path: Path | None, + metrics_jsonl_path: Path | None = None, + metrics_jsonl_interval: float | None = None, + ) -> None: + self._pool = pool + self._dashboard = dashboard + self._refresh_seconds = max(refresh_seconds, 0.25) + self._json_output_path = json_output_path + self._jsonl_interval = ( + max(metrics_jsonl_interval, 0.25) + if metrics_jsonl_interval is not None + else self._refresh_seconds + ) + self._jsonl_sink: JsonlMetricsSink | None = None + if metrics_jsonl_path is not None: + self._jsonl_sink = JsonlMetricsSink(metrics_jsonl_path) + self._jsonl_sink.open() + self._stop_event = threading.Event() + self._thread: threading.Thread | None = None + self._needs_periodic_file_or_ui = dashboard or json_output_path is not None + + def start(self) -> None: + """Start the background reporter when at least one output is enabled.""" + if ( + not self._dashboard + and self._json_output_path is None + and self._jsonl_sink is None + ): + return + self._thread = threading.Thread( + target=self._run, + name="openrtc-runtime-reporter", + daemon=True, + ) + self._thread.start() + + def stop(self) -> None: + """Stop the background reporter and flush one final snapshot.""" + self._stop_event.set() + if self._thread is not None: + self._thread.join(timeout=max(self._refresh_seconds * 2, 1.0)) + self._write_json_snapshot() + self._emit_jsonl() + if self._jsonl_sink is not None: + self._jsonl_sink.close() + + def _run(self) -> None: + now = time.monotonic() + next_periodic = ( + now + self._refresh_seconds + if self._needs_periodic_file_or_ui + else float("inf") + ) + next_jsonl = now + self._jsonl_interval if self._jsonl_sink else float("inf") + + def schedule_cycle(live: Live | None) -> bool: + """Wait until the next tick; run JSON/JSONL/dashboard work. Return False to exit.""" + nonlocal next_periodic, next_jsonl + n = time.monotonic() + wait_periodic = max(0.0, next_periodic - n) + wait_jsonl = ( + max(0.0, next_jsonl - n) + if self._jsonl_sink is not None + else float("inf") + ) + timeout = min(wait_periodic, wait_jsonl, 3600.0) + if self._stop_event.wait(timeout): + return False + n = time.monotonic() + if self._needs_periodic_file_or_ui and n >= next_periodic: + if live is not None: + live.update(self._build_dashboard_renderable()) + self._write_json_snapshot() + next_periodic += self._refresh_seconds + if self._jsonl_sink is not None and n >= next_jsonl: + self._emit_jsonl() + next_jsonl += self._jsonl_interval + return True + + if self._dashboard: + with Live( + self._build_dashboard_renderable(), + console=console, + refresh_per_second=max(int(round(1 / self._refresh_seconds)), 1), + transient=True, + ) as live: + while schedule_cycle(live): + pass + live.update(self._build_dashboard_renderable()) + return + + while schedule_cycle(None): + pass + + def _build_dashboard_renderable(self) -> Panel: + snapshot = self._pool.runtime_snapshot() + return build_runtime_dashboard(snapshot) + + def _write_json_snapshot(self) -> None: + if self._json_output_path is None: + return + payload = self._pool.runtime_snapshot().to_dict() + self._json_output_path.parent.mkdir(parents=True, exist_ok=True) + self._json_output_path.write_text( + json.dumps(payload, indent=2, sort_keys=True), + encoding="utf-8", + ) + + def _emit_jsonl(self) -> None: + """Write one snapshot line then any queued session events (same tick).""" + if self._jsonl_sink is None: + return + self._jsonl_sink.write_snapshot(self._pool.runtime_snapshot()) + for ev in self._pool.drain_metrics_stream_events(): + self._jsonl_sink.write_event(ev) diff --git a/src/openrtc/cli_types.py b/src/openrtc/cli_types.py new file mode 100644 index 0000000..b310bba --- /dev/null +++ b/src/openrtc/cli_types.py @@ -0,0 +1,210 @@ +"""Typer :class:`typing.Annotated` aliases shared by OpenRTC CLI commands.""" + +from __future__ import annotations + +from pathlib import Path +from typing import Annotated + +import typer + +PANEL_OPENRTC = "OpenRTC" +PANEL_LIVEKIT = "Connection" +PANEL_ADVANCED = "Advanced" + +AgentsDirArg = Annotated[ + Path, + typer.Option( + "--agents-dir", + help="Directory of agent modules to load (only required flag for most workflows).", + exists=False, + resolve_path=True, + path_type=Path, + rich_help_panel=PANEL_OPENRTC, + ), +] + +DefaultSttArg = Annotated[ + str | None, + typer.Option( + "--default-stt", + help=( + "Default STT provider used when a discovered agent does not " + "override STT via @agent_config(...)." + ), + rich_help_panel=PANEL_OPENRTC, + ), +] + +DefaultLlmArg = Annotated[ + str | None, + typer.Option( + "--default-llm", + help=( + "Default LLM provider used when a discovered agent does not " + "override LLM via @agent_config(...)." + ), + rich_help_panel=PANEL_OPENRTC, + ), +] + +DefaultTtsArg = Annotated[ + str | None, + typer.Option( + "--default-tts", + help=( + "Default TTS provider used when a discovered agent does not " + "override TTS via @agent_config(...)." + ), + rich_help_panel=PANEL_OPENRTC, + ), +] + +DefaultGreetingArg = Annotated[ + str | None, + typer.Option( + "--default-greeting", + help=( + "Default greeting used when a discovered agent does not " + "override greeting via @agent_config(...)." + ), + rich_help_panel=PANEL_ADVANCED, + ), +] + +DashboardArg = Annotated[ + bool, + typer.Option( + "--dashboard", + help="Show a live Rich dashboard (off by default; use for local debugging).", + rich_help_panel=PANEL_OPENRTC, + ), +] + +DashboardRefreshArg = Annotated[ + float, + typer.Option( + "--dashboard-refresh", + min=0.25, + help="Refresh interval in seconds for dashboard / metrics file / JSONL (default 1s).", + rich_help_panel=PANEL_ADVANCED, + ), +] + +MetricsJsonFileArg = Annotated[ + Path | None, + typer.Option( + "--metrics-json-file", + help="Overwrite a JSON file each tick with the latest snapshot (automation / CI).", + resolve_path=True, + path_type=Path, + rich_help_panel=PANEL_ADVANCED, + ), +] + +MetricsJsonlArg = Annotated[ + Path | None, + typer.Option( + "--metrics-jsonl", + help=( + "Append JSON Lines for ``openrtc tui --watch`` (off by default; " + "truncates when the worker starts)." + ), + resolve_path=True, + path_type=Path, + rich_help_panel=PANEL_OPENRTC, + ), +] + +MetricsJsonlIntervalArg = Annotated[ + float | None, + typer.Option( + "--metrics-jsonl-interval", + min=0.25, + help=("Seconds between JSONL records (default: same as --dashboard-refresh)."), + rich_help_panel=PANEL_ADVANCED, + ), +] + +TuiWatchPathArg = Annotated[ + Path, + typer.Option( + "--watch", + help="JSONL file written by the worker's --metrics-jsonl.", + resolve_path=True, + path_type=Path, + rich_help_panel=PANEL_OPENRTC, + ), +] + +TuiFromStartArg = Annotated[ + bool, + typer.Option( + "--from-start", + help="Read the file from the beginning instead of tailing from EOF.", + rich_help_panel=PANEL_ADVANCED, + ), +] + +LiveKitUrlArg = Annotated[ + str | None, + typer.Option( + "--url", + help="WebSocket URL of the LiveKit server or Cloud project.", + envvar="LIVEKIT_URL", + rich_help_panel=PANEL_LIVEKIT, + ), +] + +LiveKitApiKeyArg = Annotated[ + str | None, + typer.Option( + "--api-key", + help="API key for the LiveKit server or Cloud project.", + envvar="LIVEKIT_API_KEY", + rich_help_panel=PANEL_LIVEKIT, + ), +] + +LiveKitApiSecretArg = Annotated[ + str | None, + typer.Option( + "--api-secret", + help="API secret for the LiveKit server or Cloud project.", + envvar="LIVEKIT_API_SECRET", + rich_help_panel=PANEL_LIVEKIT, + ), +] + +ConnectRoomArg = Annotated[ + str, + typer.Option( + "--room", + help="Room name to connect to (same as LiveKit Agents [code]connect[/code]).", + rich_help_panel=PANEL_LIVEKIT, + ), +] + +ConnectParticipantArg = Annotated[ + str | None, + typer.Option( + "--participant-identity", + help="Agent participant identity when connecting to the room.", + rich_help_panel=PANEL_ADVANCED, + ), +] + +LiveKitLogLevelArg = Annotated[ + str | None, + typer.Option( + "--log-level", + help="Log level (e.g. DEBUG, INFO, WARN, ERROR).", + envvar="LIVEKIT_LOG_LEVEL", + case_sensitive=False, + rich_help_panel=PANEL_ADVANCED, + ), +] + +_LIVEKIT_CLI_CONTEXT_SETTINGS = { + "allow_extra_args": True, + "ignore_unknown_options": True, +} diff --git a/tests/test_cli.py b/tests/test_cli.py index b988aea..ba53ab8 100644 --- a/tests/test_cli.py +++ b/tests/test_cli.py @@ -219,7 +219,7 @@ def test_run_commands_inject_livekit_mode_and_run_pool( stub_pool = StubPool( discovered=[StubConfig(name="restaurant", agent_cls=StubAgent)] ) - monkeypatch.setattr("openrtc.cli_app.AgentPool", lambda **kwargs: stub_pool) + monkeypatch.setattr("openrtc.cli_livekit.AgentPool", lambda **kwargs: stub_pool) monkeypatch.setattr(sys, "argv", original_argv.copy()) exit_code = main([command, *extra_args]) @@ -320,18 +320,18 @@ def test_dev_passes_reload_through_argv_strip( monkeypatch: pytest.MonkeyPatch, tmp_path: Path, ) -> None: - import openrtc.cli_app as cli_app_mod + import openrtc.cli_livekit as cli_livekit_mod agents = tmp_path / "agents" agents.mkdir() stub_pool = StubPool(discovered=[StubConfig(name="a", agent_cls=StubAgent)]) - monkeypatch.setattr(cli_app_mod, "AgentPool", lambda **kwargs: stub_pool) + monkeypatch.setattr(cli_livekit_mod, "AgentPool", lambda **kwargs: stub_pool) def _run_pool_stub(pool: StubPool, **kwargs: Any) -> None: pool.run() - monkeypatch.setattr(cli_app_mod, "_run_pool_with_reporting", _run_pool_stub) - real_strip = cli_app_mod._strip_openrtc_only_flags_for_livekit + monkeypatch.setattr(cli_livekit_mod, "_run_pool_with_reporting", _run_pool_stub) + real_strip = cli_livekit_mod._strip_openrtc_only_flags_for_livekit recorded: list[tuple[list[str], list[str]]] = [] def recording_strip(tail: list[str]) -> list[str]: @@ -340,7 +340,7 @@ def recording_strip(tail: list[str]) -> list[str]: return out monkeypatch.setattr( - cli_app_mod, + cli_livekit_mod, "_strip_openrtc_only_flags_for_livekit", recording_strip, ) @@ -359,11 +359,13 @@ def recording_strip(tail: list[str]) -> list[str]: def test_livekit_env_restored_after_delegate_returns( monkeypatch: pytest.MonkeyPatch, ) -> None: - import openrtc.cli_app as cli_app_mod + import openrtc.cli_livekit as cli_livekit_mod stub_pool = StubPool(discovered=[StubConfig(name="a", agent_cls=StubAgent)]) - monkeypatch.setattr(cli_app_mod, "AgentPool", lambda **kwargs: stub_pool) - monkeypatch.setattr(cli_app_mod, "_run_pool_with_reporting", lambda *a, **k: None) + monkeypatch.setattr(cli_livekit_mod, "AgentPool", lambda **kwargs: stub_pool) + monkeypatch.setattr( + cli_livekit_mod, "_run_pool_with_reporting", lambda *a, **k: None + ) monkeypatch.setenv("LIVEKIT_URL", "ws://persist") exit_code = main( ["start", "--agents-dir", "./agents", "--url", "ws://temporary-override"], @@ -527,7 +529,7 @@ def test_start_command_can_write_runtime_metrics_json( stub_pool = StubPool( discovered=[StubConfig(name="restaurant", agent_cls=StubAgent)] ) - monkeypatch.setattr("openrtc.cli_app.AgentPool", lambda **kwargs: stub_pool) + monkeypatch.setattr("openrtc.cli_livekit.AgentPool", lambda **kwargs: stub_pool) metrics_path = tmp_path / "runtime.json" runner = CliRunner() @@ -559,7 +561,7 @@ def test_start_command_metrics_jsonl_writes_snapshot_records( stub_pool = StubPool( discovered=[StubConfig(name="restaurant", agent_cls=StubAgent)] ) - monkeypatch.setattr("openrtc.cli_app.AgentPool", lambda **kwargs: stub_pool) + monkeypatch.setattr("openrtc.cli_livekit.AgentPool", lambda **kwargs: stub_pool) runner = CliRunner() result = runner.invoke( From 2fd0a63e5c27fa4cd7c8b0584a768efbed6d2676 Mon Sep 17 00:00:00 2001 From: Cursor Agent Date: Sun, 22 Mar 2026 16:00:04 +0000 Subject: [PATCH 02/14] refactor(cli): bundle worker handoff options in SharedLiveKitWorkerOptions Introduce cli_params with agent_provider_kwargs and a frozen dataclass used by cli_livekit delegates. Register start/dev/console via a single handler factory to avoid repeating identical Typer option lists. Add focused unit tests. Co-authored-by: Mahimai Raja J --- src/openrtc/cli_app.py | 225 ++++++++++++++----------------------- src/openrtc/cli_livekit.py | 93 +++++---------- src/openrtc/cli_params.py | 117 +++++++++++++++++++ tests/test_cli_params.py | 40 +++++++ 4 files changed, 270 insertions(+), 205 deletions(-) create mode 100644 src/openrtc/cli_params.py create mode 100644 tests/test_cli_params.py diff --git a/src/openrtc/cli_app.py b/src/openrtc/cli_app.py index 1e7ec39..8dc726f 100644 --- a/src/openrtc/cli_app.py +++ b/src/openrtc/cli_app.py @@ -20,11 +20,11 @@ from openrtc.cli_livekit import ( _delegate_discovered_pool_to_livekit, _discover_or_exit, - _pool_kwargs, _run_connect_handoff, _run_pool_with_reporting, _strip_openrtc_only_flags_for_livekit, ) +from openrtc.cli_params import SharedLiveKitWorkerOptions, agent_provider_kwargs from openrtc.cli_reporter import RuntimeReporter from openrtc.cli_types import ( _LIVEKIT_CLI_CONTEXT_SETTINGS, @@ -119,7 +119,7 @@ def list_command( raise typer.BadParameter("Use only one of --plain and --json.") pool = AgentPool( - **_pool_kwargs(default_stt, default_llm, default_tts, default_greeting) + **agent_provider_kwargs(default_stt, default_llm, default_tts, default_greeting) ) discovered = _discover_or_exit(agents_dir, pool) @@ -137,118 +137,70 @@ def list_command( print_resource_summary_rich(discovered) -@app.command("start", context_settings=_LIVEKIT_CLI_CONTEXT_SETTINGS) -def start_command( - _ctx: Context, - agents_dir: AgentsDirArg, - default_stt: DefaultSttArg = None, - default_llm: DefaultLlmArg = None, - default_tts: DefaultTtsArg = None, - default_greeting: DefaultGreetingArg = None, - url: LiveKitUrlArg = None, - api_key: LiveKitApiKeyArg = None, - api_secret: LiveKitApiSecretArg = None, - log_level: LiveKitLogLevelArg = None, - dashboard: DashboardArg = False, - dashboard_refresh: DashboardRefreshArg = 1.0, - metrics_json_file: MetricsJsonFileArg = None, - metrics_jsonl: MetricsJsonlArg = None, - metrics_jsonl_interval: MetricsJsonlIntervalArg = None, -) -> None: - """Run the worker (same role as [code]python agent.py start[/code] with LiveKit).""" - _delegate_discovered_pool_to_livekit( - agents_dir=agents_dir, - subcommand="start", - default_stt=default_stt, - default_llm=default_llm, - default_tts=default_tts, - default_greeting=default_greeting, - dashboard=dashboard, - dashboard_refresh=dashboard_refresh, - metrics_json_file=metrics_json_file, - metrics_jsonl=metrics_jsonl, - metrics_jsonl_interval=metrics_jsonl_interval, - url=url, - api_key=api_key, - api_secret=api_secret, - log_level=log_level, - ) +_STANDARD_LIVEKIT_WORKER_SPECS: tuple[tuple[str, str], ...] = ( + ( + "start", + "Run the worker (same role as [code]python agent.py start[/code] with LiveKit).", + ), + ( + "dev", + "Development worker with reload (same role as [code]python agent.py dev[/code]).", + ), + ( + "console", + "Local console session (same role as [code]python agent.py console[/code]).", + ), +) -@app.command("dev", context_settings=_LIVEKIT_CLI_CONTEXT_SETTINGS) -def dev_command( - _ctx: Context, - agents_dir: AgentsDirArg, - default_stt: DefaultSttArg = None, - default_llm: DefaultLlmArg = None, - default_tts: DefaultTtsArg = None, - default_greeting: DefaultGreetingArg = None, - url: LiveKitUrlArg = None, - api_key: LiveKitApiKeyArg = None, - api_secret: LiveKitApiSecretArg = None, - log_level: LiveKitLogLevelArg = None, - dashboard: DashboardArg = False, - dashboard_refresh: DashboardRefreshArg = 1.0, - metrics_json_file: MetricsJsonFileArg = None, - metrics_jsonl: MetricsJsonlArg = None, - metrics_jsonl_interval: MetricsJsonlIntervalArg = None, -) -> None: - """Development worker with reload (same role as [code]python agent.py dev[/code]).""" - _delegate_discovered_pool_to_livekit( - agents_dir=agents_dir, - subcommand="dev", - default_stt=default_stt, - default_llm=default_llm, - default_tts=default_tts, - default_greeting=default_greeting, - dashboard=dashboard, - dashboard_refresh=dashboard_refresh, - metrics_json_file=metrics_json_file, - metrics_jsonl=metrics_jsonl, - metrics_jsonl_interval=metrics_jsonl_interval, - url=url, - api_key=api_key, - api_secret=api_secret, - log_level=log_level, - ) +def _make_standard_livekit_worker_handler(subcommand: str): + """Build a Typer command that shares one option signature for start/dev/console.""" + + def handler( + _ctx: Context, + agents_dir: AgentsDirArg, + default_stt: DefaultSttArg = None, + default_llm: DefaultLlmArg = None, + default_tts: DefaultTtsArg = None, + default_greeting: DefaultGreetingArg = None, + url: LiveKitUrlArg = None, + api_key: LiveKitApiKeyArg = None, + api_secret: LiveKitApiSecretArg = None, + log_level: LiveKitLogLevelArg = None, + dashboard: DashboardArg = False, + dashboard_refresh: DashboardRefreshArg = 1.0, + metrics_json_file: MetricsJsonFileArg = None, + metrics_jsonl: MetricsJsonlArg = None, + metrics_jsonl_interval: MetricsJsonlIntervalArg = None, + ) -> None: + _delegate_discovered_pool_to_livekit( + subcommand, + SharedLiveKitWorkerOptions.from_cli( + agents_dir, + default_stt=default_stt, + default_llm=default_llm, + default_tts=default_tts, + default_greeting=default_greeting, + url=url, + api_key=api_key, + api_secret=api_secret, + log_level=log_level, + dashboard=dashboard, + dashboard_refresh=dashboard_refresh, + metrics_json_file=metrics_json_file, + metrics_jsonl=metrics_jsonl, + metrics_jsonl_interval=metrics_jsonl_interval, + ), + ) + handler.__name__ = f"{subcommand}_command" + return handler -@app.command("console", context_settings=_LIVEKIT_CLI_CONTEXT_SETTINGS) -def console_command( - _ctx: Context, - agents_dir: AgentsDirArg, - default_stt: DefaultSttArg = None, - default_llm: DefaultLlmArg = None, - default_tts: DefaultTtsArg = None, - default_greeting: DefaultGreetingArg = None, - url: LiveKitUrlArg = None, - api_key: LiveKitApiKeyArg = None, - api_secret: LiveKitApiSecretArg = None, - log_level: LiveKitLogLevelArg = None, - dashboard: DashboardArg = False, - dashboard_refresh: DashboardRefreshArg = 1.0, - metrics_json_file: MetricsJsonFileArg = None, - metrics_jsonl: MetricsJsonlArg = None, - metrics_jsonl_interval: MetricsJsonlIntervalArg = None, -) -> None: - """Local console session (same role as [code]python agent.py console[/code]).""" - _delegate_discovered_pool_to_livekit( - agents_dir=agents_dir, - subcommand="console", - default_stt=default_stt, - default_llm=default_llm, - default_tts=default_tts, - default_greeting=default_greeting, - dashboard=dashboard, - dashboard_refresh=dashboard_refresh, - metrics_json_file=metrics_json_file, - metrics_jsonl=metrics_jsonl, - metrics_jsonl_interval=metrics_jsonl_interval, - url=url, - api_key=api_key, - api_secret=api_secret, - log_level=log_level, - ) + +for _subcommand, _doc in _STANDARD_LIVEKIT_WORKER_SPECS: + _handler = _make_standard_livekit_worker_handler(_subcommand) + _handler.__doc__ = _doc + app.command(_subcommand, context_settings=_LIVEKIT_CLI_CONTEXT_SETTINGS)(_handler) @app.command("connect", context_settings=_LIVEKIT_CLI_CONTEXT_SETTINGS) @@ -273,22 +225,24 @@ def connect_command( ) -> None: """Connect the worker to an existing room (LiveKit [code]connect[/code]).""" _run_connect_handoff( - agents_dir=agents_dir, - default_stt=default_stt, - default_llm=default_llm, - default_tts=default_tts, - default_greeting=default_greeting, + SharedLiveKitWorkerOptions.from_cli( + agents_dir, + default_stt=default_stt, + default_llm=default_llm, + default_tts=default_tts, + default_greeting=default_greeting, + url=url, + api_key=api_key, + api_secret=api_secret, + log_level=log_level, + dashboard=dashboard, + dashboard_refresh=dashboard_refresh, + metrics_json_file=metrics_json_file, + metrics_jsonl=metrics_jsonl, + metrics_jsonl_interval=metrics_jsonl_interval, + ), room=room, participant_identity=participant_identity, - log_level=log_level, - url=url, - api_key=api_key, - api_secret=api_secret, - dashboard=dashboard, - dashboard_refresh=dashboard_refresh, - metrics_json_file=metrics_json_file, - metrics_jsonl=metrics_jsonl, - metrics_jsonl_interval=metrics_jsonl_interval, ) @@ -306,21 +260,14 @@ def download_files_command( valid; provider defaults are not needed for this subcommand. """ _delegate_discovered_pool_to_livekit( - agents_dir=agents_dir, - subcommand="download-files", - default_stt=None, - default_llm=None, - default_tts=None, - default_greeting=None, - dashboard=False, - dashboard_refresh=1.0, - metrics_json_file=None, - metrics_jsonl=None, - metrics_jsonl_interval=None, - url=url, - api_key=api_key, - api_secret=api_secret, - log_level=log_level, + "download-files", + SharedLiveKitWorkerOptions.for_download_files( + agents_dir, + url=url, + api_key=api_key, + api_secret=api_secret, + log_level=log_level, + ), ) diff --git a/src/openrtc/cli_livekit.py b/src/openrtc/cli_livekit.py index 122af24..f180c6c 100644 --- a/src/openrtc/cli_livekit.py +++ b/src/openrtc/cli_livekit.py @@ -8,30 +8,16 @@ import sys from collections.abc import Iterator from pathlib import Path -from typing import Any import typer +from openrtc.cli_params import SharedLiveKitWorkerOptions from openrtc.cli_reporter import RuntimeReporter from openrtc.pool import AgentConfig, AgentPool logger = logging.getLogger("openrtc") -def _pool_kwargs( - default_stt: str | None, - default_llm: str | None, - default_tts: str | None, - default_greeting: str | None, -) -> dict[str, Any]: - return { - "default_stt": default_stt, - "default_llm": default_llm, - "default_tts": default_tts, - "default_greeting": default_greeting, - } - - _OPENRTC_ONLY_FLAGS_WITH_VALUE: frozenset[str] = frozenset( { "--agents-dir", @@ -154,83 +140,58 @@ def _livekit_env_overrides( def _delegate_discovered_pool_to_livekit( - *, - agents_dir: Path, subcommand: str, - default_stt: str | None, - default_llm: str | None, - default_tts: str | None, - default_greeting: str | None, - dashboard: bool, - dashboard_refresh: float, - metrics_json_file: Path | None, - metrics_jsonl: Path | None, - metrics_jsonl_interval: float | None, - url: str | None, - api_key: str | None, - api_secret: str | None, - log_level: str | None, + opts: SharedLiveKitWorkerOptions, ) -> None: """Discover agents, optionally set connection env, then run a LiveKit CLI subcommand.""" - pool = AgentPool( - **_pool_kwargs(default_stt, default_llm, default_tts, default_greeting) - ) - _discover_or_exit(agents_dir, pool) + pool = AgentPool(**opts.agent_pool_kwargs()) + _discover_or_exit(opts.agents_dir, pool) with _livekit_env_overrides( - url=url, api_key=api_key, api_secret=api_secret, log_level=log_level + url=opts.url, + api_key=opts.api_key, + api_secret=opts.api_secret, + log_level=opts.log_level, ): _livekit_sys_argv(subcommand) _run_pool_with_reporting( pool, - dashboard=dashboard, - dashboard_refresh=dashboard_refresh, - metrics_json_file=metrics_json_file, - metrics_jsonl=metrics_jsonl, - metrics_jsonl_interval=metrics_jsonl_interval, + dashboard=opts.dashboard, + dashboard_refresh=opts.dashboard_refresh, + metrics_json_file=opts.metrics_json_file, + metrics_jsonl=opts.metrics_jsonl, + metrics_jsonl_interval=opts.metrics_jsonl_interval, ) def _run_connect_handoff( + opts: SharedLiveKitWorkerOptions, *, - agents_dir: Path, - default_stt: str | None, - default_llm: str | None, - default_tts: str | None, - default_greeting: str | None, room: str, participant_identity: str | None, - log_level: str | None, - url: str | None, - api_key: str | None, - api_secret: str | None, - dashboard: bool, - dashboard_refresh: float, - metrics_json_file: Path | None, - metrics_jsonl: Path | None, - metrics_jsonl_interval: float | None, ) -> None: """Hand off to LiveKit ``connect`` with explicit argv (Typer consumes flags first).""" - pool = AgentPool( - **_pool_kwargs(default_stt, default_llm, default_tts, default_greeting) - ) - _discover_or_exit(agents_dir, pool) + pool = AgentPool(**opts.agent_pool_kwargs()) + _discover_or_exit(opts.agents_dir, pool) with _livekit_env_overrides( - url=url, api_key=api_key, api_secret=api_secret, log_level=None + url=opts.url, + api_key=opts.api_key, + api_secret=opts.api_secret, + log_level=None, ): prog = sys.argv[0] tail: list[str] = ["connect", "--room", room] if participant_identity is not None: tail.extend(["--participant-identity", participant_identity]) - if log_level is not None: - tail.extend(["--log-level", log_level]) + if opts.log_level is not None: + tail.extend(["--log-level", opts.log_level]) sys.argv = [prog, *tail] _run_pool_with_reporting( pool, - dashboard=dashboard, - dashboard_refresh=dashboard_refresh, - metrics_json_file=metrics_json_file, - metrics_jsonl=metrics_jsonl, - metrics_jsonl_interval=metrics_jsonl_interval, + dashboard=opts.dashboard, + dashboard_refresh=opts.dashboard_refresh, + metrics_json_file=opts.metrics_json_file, + metrics_jsonl=opts.metrics_jsonl, + metrics_jsonl_interval=opts.metrics_jsonl_interval, ) diff --git a/src/openrtc/cli_params.py b/src/openrtc/cli_params.py new file mode 100644 index 0000000..bdad998 --- /dev/null +++ b/src/openrtc/cli_params.py @@ -0,0 +1,117 @@ +"""Structured CLI parameter bundles for LiveKit worker handoff (internal).""" + +from __future__ import annotations + +from dataclasses import dataclass +from pathlib import Path +from typing import Any + + +def agent_provider_kwargs( + default_stt: str | None, + default_llm: str | None, + default_tts: str | None, + default_greeting: str | None, +) -> dict[str, Any]: + """Keyword arguments for :class:`openrtc.pool.AgentPool` provider defaults.""" + return { + "default_stt": default_stt, + "default_llm": default_llm, + "default_tts": default_tts, + "default_greeting": default_greeting, + } + + +@dataclass(frozen=True) +class SharedLiveKitWorkerOptions: + """Options shared by ``start`` / ``dev`` / ``console`` / ``connect`` handoff paths. + + Typer still lists each flag on every command so ``--help`` stays accurate; this + dataclass deduplicates the handoff to :mod:`openrtc.cli_livekit`. + """ + + agents_dir: Path + default_stt: str | None + default_llm: str | None + default_tts: str | None + default_greeting: str | None + url: str | None + api_key: str | None + api_secret: str | None + log_level: str | None + dashboard: bool + dashboard_refresh: float + metrics_json_file: Path | None + metrics_jsonl: Path | None + metrics_jsonl_interval: float | None + + def agent_pool_kwargs(self) -> dict[str, Any]: + return agent_provider_kwargs( + self.default_stt, + self.default_llm, + self.default_tts, + self.default_greeting, + ) + + @classmethod + def from_cli( + cls, + agents_dir: Path, + *, + default_stt: str | None = None, + default_llm: str | None = None, + default_tts: str | None = None, + default_greeting: str | None = None, + url: str | None = None, + api_key: str | None = None, + api_secret: str | None = None, + log_level: str | None = None, + dashboard: bool = False, + dashboard_refresh: float = 1.0, + metrics_json_file: Path | None = None, + metrics_jsonl: Path | None = None, + metrics_jsonl_interval: float | None = None, + ) -> SharedLiveKitWorkerOptions: + return cls( + agents_dir=agents_dir, + default_stt=default_stt, + default_llm=default_llm, + default_tts=default_tts, + default_greeting=default_greeting, + url=url, + api_key=api_key, + api_secret=api_secret, + log_level=log_level, + dashboard=dashboard, + dashboard_refresh=dashboard_refresh, + metrics_json_file=metrics_json_file, + metrics_jsonl=metrics_jsonl, + metrics_jsonl_interval=metrics_jsonl_interval, + ) + + @classmethod + def for_download_files( + cls, + agents_dir: Path, + *, + url: str | None = None, + api_key: str | None = None, + api_secret: str | None = None, + log_level: str | None = None, + ) -> SharedLiveKitWorkerOptions: + return cls( + agents_dir=agents_dir, + default_stt=None, + default_llm=None, + default_tts=None, + default_greeting=None, + url=url, + api_key=api_key, + api_secret=api_secret, + log_level=log_level, + dashboard=False, + dashboard_refresh=1.0, + metrics_json_file=None, + metrics_jsonl=None, + metrics_jsonl_interval=None, + ) diff --git a/tests/test_cli_params.py b/tests/test_cli_params.py new file mode 100644 index 0000000..65687d1 --- /dev/null +++ b/tests/test_cli_params.py @@ -0,0 +1,40 @@ +"""Unit tests for :mod:`openrtc.cli_params` bundles.""" + +from __future__ import annotations + +from pathlib import Path + +from openrtc.cli_params import SharedLiveKitWorkerOptions, agent_provider_kwargs + + +def test_agent_provider_kwargs_matches_agent_pool_constructor() -> None: + d = agent_provider_kwargs("stt", "llm", "tts", "greet") + assert d == { + "default_stt": "stt", + "default_llm": "llm", + "default_tts": "tts", + "default_greeting": "greet", + } + + +def test_shared_livekit_worker_options_from_cli_and_for_download_files() -> None: + agents = Path("/tmp/agents") + opts = SharedLiveKitWorkerOptions.from_cli( + agents, + default_stt="a", + default_greeting="hi", + dashboard=True, + ) + assert opts.agents_dir == agents + assert opts.agent_pool_kwargs() == agent_provider_kwargs("a", None, None, "hi") + + dl = SharedLiveKitWorkerOptions.for_download_files( + agents, + url="ws://example", + log_level="INFO", + ) + assert dl.default_stt is None + assert dl.dashboard is False + assert dl.metrics_jsonl is None + assert dl.url == "ws://example" + assert dl.log_level == "INFO" From 031cfe41324eaccc6880c38240ffc22e2a1c8584 Mon Sep 17 00:00:00 2001 From: Cursor Agent Date: Sun, 22 Mar 2026 16:04:58 +0000 Subject: [PATCH 03/14] feat(typing): add ProviderValue alias for STT/LLM/TTS slots Introduce openrtc.provider_types.ProviderValue (str | Any) documenting provider ID strings vs LiveKit plugin instances. Use it on AgentConfig, AgentDiscoveryConfig, agent_config(), AgentPool defaults/add(), and CLI worker option bundles. Export ProviderValue from the package root. Co-authored-by: Mahimai Raja J --- src/openrtc/__init__.py | 2 ++ src/openrtc/cli_params.py | 20 ++++++++++--------- src/openrtc/pool.py | 37 ++++++++++++++++++++--------------- src/openrtc/provider_types.py | 13 ++++++++++++ tests/test_cli.py | 13 ++++++------ 5 files changed, 54 insertions(+), 31 deletions(-) create mode 100644 src/openrtc/provider_types.py diff --git a/src/openrtc/__init__.py b/src/openrtc/__init__.py index a1ac319..aa2694d 100644 --- a/src/openrtc/__init__.py +++ b/src/openrtc/__init__.py @@ -3,6 +3,7 @@ from importlib.metadata import PackageNotFoundError, version from .pool import AgentConfig, AgentDiscoveryConfig, AgentPool, agent_config +from .provider_types import ProviderValue try: __version__ = version("openrtc") @@ -13,6 +14,7 @@ "AgentConfig", "AgentDiscoveryConfig", "AgentPool", + "ProviderValue", "__version__", "agent_config", ] diff --git a/src/openrtc/cli_params.py b/src/openrtc/cli_params.py index bdad998..80f7921 100644 --- a/src/openrtc/cli_params.py +++ b/src/openrtc/cli_params.py @@ -6,11 +6,13 @@ from pathlib import Path from typing import Any +from openrtc.provider_types import ProviderValue + def agent_provider_kwargs( - default_stt: str | None, - default_llm: str | None, - default_tts: str | None, + default_stt: ProviderValue | None, + default_llm: ProviderValue | None, + default_tts: ProviderValue | None, default_greeting: str | None, ) -> dict[str, Any]: """Keyword arguments for :class:`openrtc.pool.AgentPool` provider defaults.""" @@ -31,9 +33,9 @@ class SharedLiveKitWorkerOptions: """ agents_dir: Path - default_stt: str | None - default_llm: str | None - default_tts: str | None + default_stt: ProviderValue | None + default_llm: ProviderValue | None + default_tts: ProviderValue | None default_greeting: str | None url: str | None api_key: str | None @@ -58,9 +60,9 @@ def from_cli( cls, agents_dir: Path, *, - default_stt: str | None = None, - default_llm: str | None = None, - default_tts: str | None = None, + default_stt: ProviderValue | None = None, + default_llm: ProviderValue | None = None, + default_tts: ProviderValue | None = None, default_greeting: str | None = None, url: str | None = None, api_key: str | None = None, diff --git a/src/openrtc/pool.py b/src/openrtc/pool.py index 6ba761b..c79137e 100644 --- a/src/openrtc/pool.py +++ b/src/openrtc/pool.py @@ -18,6 +18,7 @@ from livekit.agents import Agent, AgentServer, AgentSession, JobContext, JobProcess, cli +from openrtc.provider_types import ProviderValue from openrtc.resources import ( MetricsStreamEvent, PoolRuntimeSnapshot, @@ -130,9 +131,9 @@ class AgentConfig: name: str agent_cls: type[Agent] - stt: Any = None - llm: Any = None - tts: Any = None + stt: ProviderValue | None = None + llm: ProviderValue | None = None + tts: ProviderValue | None = None greeting: str | None = None session_kwargs: dict[str, Any] = field(default_factory=dict) source_path: Path | None = None @@ -185,18 +186,18 @@ class AgentDiscoveryConfig: """ name: str | None = None - stt: Any = None - llm: Any = None - tts: Any = None + stt: ProviderValue | None = None + llm: ProviderValue | None = None + tts: ProviderValue | None = None greeting: str | None = None def agent_config( *, name: str | None = None, - stt: Any = None, - llm: Any = None, - tts: Any = None, + stt: ProviderValue | None = None, + llm: ProviderValue | None = None, + tts: ProviderValue | None = None, greeting: str | None = None, ) -> Callable[[_AgentType], _AgentType]: """Attach OpenRTC discovery metadata to a standard LiveKit ``Agent`` class. @@ -238,9 +239,9 @@ class AgentPool: def __init__( self, *, - default_stt: Any = None, - default_llm: Any = None, - default_tts: Any = None, + default_stt: ProviderValue | None = None, + default_llm: ProviderValue | None = None, + default_tts: ProviderValue | None = None, default_greeting: str | None = None, ) -> None: """Create a pool with shared defaults, prewarm, and a universal entrypoint. @@ -283,9 +284,9 @@ def add( name: str, agent_cls: type[Agent], *, - stt: Any = None, - llm: Any = None, - tts: Any = None, + stt: ProviderValue | None = None, + llm: ProviderValue | None = None, + tts: ProviderValue | None = None, greeting: str | None = None, session_kwargs: Mapping[str, Any] | None = None, source_path: Path | str | None = None, @@ -473,7 +474,11 @@ async def _handle_session(self, ctx: JobContext) -> None: """Create and start a LiveKit ``AgentSession`` for the resolved agent.""" await _run_universal_session(self._runtime_state, ctx) - def _resolve_provider(self, value: Any, default_value: Any) -> Any: + def _resolve_provider( + self, + value: ProviderValue | None, + default_value: ProviderValue | None, + ) -> ProviderValue | None: return default_value if value is None else value def _resolve_greeting(self, greeting: str | None) -> str | None: diff --git a/src/openrtc/provider_types.py b/src/openrtc/provider_types.py new file mode 100644 index 0000000..dc81b26 --- /dev/null +++ b/src/openrtc/provider_types.py @@ -0,0 +1,13 @@ +"""Shared type aliases for voice pipeline provider slots (STT, LLM, TTS).""" + +from __future__ import annotations + +from typing import Any, TypeAlias + +# Values accepted for STT, LLM, and TTS configuration: +# - Provider ID strings (e.g. ``"openai/gpt-4o-mini-transcribe"``) used by LiveKit +# routing and the OpenRTC CLI defaults. +# - Concrete LiveKit plugin instances (e.g. ``livekit.plugins.openai.STT(...)``). +# ``Any`` covers third-party plugin classes without enumerating them here; use +# strings when you want the type checker to stay precise. +ProviderValue: TypeAlias = str | Any diff --git a/tests/test_cli.py b/tests/test_cli.py index ba53ab8..9c7bfa4 100644 --- a/tests/test_cli.py +++ b/tests/test_cli.py @@ -16,6 +16,7 @@ from typer.testing import CliRunner from openrtc.cli import app, main +from openrtc.provider_types import ProviderValue from openrtc.resources import ( MetricsStreamEvent, PoolRuntimeSnapshot, @@ -36,9 +37,9 @@ def _normalize_cli_output_for_assert(text: str) -> str: class StubConfig: name: str agent_cls: type[Any] - stt: Any = None - llm: Any = None - tts: Any = None + stt: ProviderValue | None = None + llm: ProviderValue | None = None + tts: ProviderValue | None = None greeting: str | None = None @@ -50,9 +51,9 @@ class StubPool: def __init__( self, *, - default_stt: Any = None, - default_llm: Any = None, - default_tts: Any = None, + default_stt: ProviderValue | None = None, + default_llm: ProviderValue | None = None, + default_tts: ProviderValue | None = None, default_greeting: str | None = None, discovered: list[StubConfig], ) -> None: From 2db48c77f3d9387480319775b31f616c9cd14c30 Mon Sep 17 00:00:00 2001 From: Cursor Agent Date: Sun, 22 Mar 2026 16:09:28 +0000 Subject: [PATCH 04/14] fix(pool): detect OpenAI NotGiven without repr() coupling Use isinstance(openai.NotGiven) when importable; fall back to class name plus openai module prefix. Removes fragile repr(value) == "NOT_GIVEN" check. Add regression tests for both sentinels and unrelated NotGiven classes. Co-authored-by: Mahimai Raja J --- src/openrtc/pool.py | 14 +++++++++++++- tests/test_pool.py | 21 +++++++++++++++++++++ 2 files changed, 34 insertions(+), 1 deletion(-) diff --git a/src/openrtc/pool.py b/src/openrtc/pool.py index c79137e..4b7f1d3 100644 --- a/src/openrtc/pool.py +++ b/src/openrtc/pool.py @@ -27,6 +27,11 @@ logger = logging.getLogger("openrtc") +try: + from openai import NotGiven as _OpenAINotGiven +except ImportError: # pragma: no cover - optional when openai is absent + _OpenAINotGiven = None + _AgentType = TypeVar("_AgentType", bound=type[Agent]) _AGENT_METADATA_ATTR = "__openrtc_agent_config__" _METADATA_AGENT_KEYS = ("agent", "demo") @@ -619,7 +624,14 @@ def _filter_provider_kwargs(options: Mapping[str, Any]) -> dict[str, Any]: def _is_not_given(value: Any) -> bool: - return repr(value) == "NOT_GIVEN" + """True if ``value`` is OpenAI's ``NotGiven`` (unset optional on plugin ``_opts``).""" + if _OpenAINotGiven is not None and isinstance(value, _OpenAINotGiven): + return True + cls = type(value) + if cls.__name__ != "NotGiven": + return False + module = getattr(cls, "__module__", "") + return module == "openai._types" or module.startswith("openai.") def _build_session_kwargs( diff --git a/tests/test_pool.py b/tests/test_pool.py index 592025b..fae156e 100644 --- a/tests/test_pool.py +++ b/tests/test_pool.py @@ -594,3 +594,24 @@ def test_drain_metrics_stream_events_delegates_to_runtime_store() -> None: pool = AgentPool() pool.add("test", DemoAgent, stt="a", llm="b", tts="c") assert pool.drain_metrics_stream_events() == [] + + +def test_is_not_given_detects_openai_sentinels_without_repr() -> None: + pytest.importorskip("openai") + from openai import NOT_GIVEN, not_given + + from openrtc.pool import _is_not_given + + assert _is_not_given(NOT_GIVEN) is True + assert _is_not_given(not_given) is True + assert _is_not_given("NOT_GIVEN") is False + assert _is_not_given(None) is False + + +def test_is_not_given_ignores_unrelated_class_named_notgiven() -> None: + from openrtc.pool import _is_not_given + + class NotGiven: + pass + + assert _is_not_given(NotGiven()) is False From 3eed5d24c6877c78a98d8bc48a794f68b100c580 Mon Sep 17 00:00:00 2001 From: Cursor Agent Date: Sun, 22 Mar 2026 16:11:07 +0000 Subject: [PATCH 05/14] refactor(pool): registry for spawn-safe provider ref serialization Replace chained module/qualname checks with _PROVIDER_REF_KEYS frozenset and a single _try_build_provider_ref path. Document extending the set for new LiveKit plugins that use the same _opts flattening contract. Co-authored-by: Mahimai Raja J --- src/openrtc/pool.py | 47 +++++++++++++++++++++------------------------ 1 file changed, 22 insertions(+), 25 deletions(-) diff --git a/src/openrtc/pool.py b/src/openrtc/pool.py index 4b7f1d3..8afacbc 100644 --- a/src/openrtc/pool.py +++ b/src/openrtc/pool.py @@ -75,6 +75,19 @@ class _ProviderRef: kwargs: dict[str, Any] +# ``(module, qualname)`` pairs for plugin classes that expose OpenAI-style +# ``_opts`` and can be rehydrated via ``ProviderClass(**kwargs)`` in the child +# after unpickling. Add entries here when new LiveKit plugins follow the same +# pattern (Deepgram, Azure, …); unknown classes fall back to pickle or error. +_PROVIDER_REF_KEYS: frozenset[tuple[str, str]] = frozenset( + { + ("livekit.plugins.openai.stt", "STT"), + ("livekit.plugins.openai.tts", "TTS"), + ("livekit.plugins.openai.responses.llm", "LLM"), + } +) + + def _prewarm_worker( runtime_state: _PoolRuntimeState, proc: JobProcess, @@ -580,31 +593,15 @@ def _deserialize_provider_value(value: Any) -> Any: def _try_build_provider_ref(value: Any) -> _ProviderRef | None: - module_name = value.__class__.__module__ - qualname = value.__class__.__qualname__ - - if module_name == "livekit.plugins.openai.stt" and qualname == "STT": - return _ProviderRef( - module_name=module_name, - qualname=qualname, - kwargs=_extract_provider_kwargs(value), - ) - - if module_name == "livekit.plugins.openai.tts" and qualname == "TTS": - return _ProviderRef( - module_name=module_name, - qualname=qualname, - kwargs=_extract_provider_kwargs(value), - ) - - if module_name == "livekit.plugins.openai.responses.llm" and qualname == "LLM": - return _ProviderRef( - module_name=module_name, - qualname=qualname, - kwargs=_extract_provider_kwargs(value), - ) - - return None + cls = type(value) + key = (cls.__module__, cls.__qualname__) + if key not in _PROVIDER_REF_KEYS: + return None + return _ProviderRef( + module_name=key[0], + qualname=key[1], + kwargs=_extract_provider_kwargs(value), + ) def _extract_provider_kwargs(value: Any) -> dict[str, Any]: From 905108c233567948aef057595bcc42c70f09197c Mon Sep 17 00:00:00 2001 From: Cursor Agent Date: Sun, 22 Mar 2026 16:22:02 +0000 Subject: [PATCH 06/14] ci: run mypy in lint workflow; fix typing for clean check - Add mypy step to lint.yml after installing editable package + cli/tui extras (matches livekit imports; pyproject already sets ignore_missing_imports). - Resolve prior mypy issues: OpenAI NotGiven import typing, AgentSession annotation, discovery metadata cast, RuntimeMetricsStore pickle __setstate__ narrowing, JsonlMetricsSink.write_event Mapping payload, _format_percent guards, async Textual action_quit + test await. - Document in AGENTS.md and CONTRIBUTING.md. Avoid 'mypy ... || true' so CI actually blocks regressions. Co-authored-by: Mahimai Raja J --- .github/workflows/lint.yml | 8 +++++-- AGENTS.md | 4 ++-- CONTRIBUTING.md | 8 +++++++ src/openrtc/cli_dashboard.py | 2 +- src/openrtc/metrics_stream.py | 5 +++-- src/openrtc/pool.py | 18 ++++++++++------ src/openrtc/resources.py | 40 ++++++++++++++++++++++++----------- src/openrtc/tui_app.py | 2 +- tests/test_tui_app.py | 2 +- 9 files changed, 62 insertions(+), 27 deletions(-) diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml index dd82c07..11b03ce 100644 --- a/.github/workflows/lint.yml +++ b/.github/workflows/lint.yml @@ -16,13 +16,17 @@ jobs: with: python-version: "3.11" - - name: Install Ruff + - name: Install lint dependencies run: | python -m pip install --upgrade pip - python -m pip install ruff + python -m pip install ruff "mypy>=1.19.1" + python -m pip install -e ".[cli,tui]" - name: Check formatting run: ruff format --check . - name: Run lint checks run: ruff check . + + - name: Run mypy + run: mypy src/ diff --git a/AGENTS.md b/AGENTS.md index a13daab..e355967 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -406,14 +406,14 @@ All commands are documented in `CONTRIBUTING.md`. Quick reference: - **Tests:** `uv run pytest` (self-contained; no LiveKit server required) - **Lint:** `uv run ruff check .` - **Format check:** `uv run ruff format --check .` -- **Type check:** `uv run mypy src/` (3 pre-existing errors as of this writing) +- **Type check:** `uv run mypy src/` (must pass clean; also runs in `.github/workflows/lint.yml`) - **CLI demo:** `uv run openrtc list --agents-dir ./examples/agents --default-stt "deepgram/nova-3:multi" --default-llm "openai/gpt-4.1-mini" --default-tts "cartesia/sonic-3"` ### Non-obvious notes - The `tests/conftest.py` creates a fake `livekit.agents` module when the real one isn't importable. This allows tests to run without the full LiveKit SDK. The real SDK *is* installed by `uv sync`, but if you see import weirdness in tests, this shim is the reason. - Version is derived from git tags via `hatch-vcs`. In a dev checkout the version will be something like `0.0.9.dev0+g`. -- `mypy` has 3 pre-existing errors in `pool.py` — these are not regressions from your changes. +- `mypy` is enforced in CI alongside Ruff; run `uv run mypy src/` before pushing type-sensitive changes. - Running `openrtc start` or `openrtc dev` requires a running LiveKit server and provider API keys. For development validation, use `openrtc list` which exercises discovery and routing without network dependencies. The optional sidecar metrics TUI (`openrtc tui --watch`, requires `openrtc[tui]` / dev deps) tails `--metrics-jsonl` from a worker in another terminal. - `pytest-cov` is in the dev dependency group; CI uses `--cov-fail-under=80`; run `uv run pytest --cov=openrtc --cov-report=xml --cov-fail-under=80` to match. diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 1c0824b..349e8f5 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -43,6 +43,14 @@ uv run ruff check uv run ruff format ``` +### Type check (mypy) + +CI runs `mypy src/` on pull requests (see `.github/workflows/lint.yml`). Locally: + +```bash +uv run mypy src/ +``` + ## Project architecture Keep these responsibilities in mind when contributing: diff --git a/src/openrtc/cli_dashboard.py b/src/openrtc/cli_dashboard.py index 0497151..af7b12b 100644 --- a/src/openrtc/cli_dashboard.py +++ b/src/openrtc/cli_dashboard.py @@ -24,7 +24,7 @@ def _format_percent(saved_bytes: int | None, baseline_bytes: int | None) -> str: - if saved_bytes is None or baseline_bytes in (None, 0): + if saved_bytes is None or baseline_bytes is None or baseline_bytes == 0: return "—" return f"{(saved_bytes / baseline_bytes) * 100:.0f}%" diff --git a/src/openrtc/metrics_stream.py b/src/openrtc/metrics_stream.py index 4e33f48..155ddac 100644 --- a/src/openrtc/metrics_stream.py +++ b/src/openrtc/metrics_stream.py @@ -18,6 +18,7 @@ import json import time +from collections.abc import Mapping from pathlib import Path from threading import Lock from typing import Any @@ -116,13 +117,13 @@ def write_snapshot(self, snapshot: PoolRuntimeSnapshot) -> None: self._file.write(json.dumps(record, sort_keys=True) + "\n") self._file.flush() - def write_event(self, payload: dict[str, Any]) -> None: + def write_event(self, payload: Mapping[str, Any]) -> None: """Append one event line after the current ``seq`` (thread-safe).""" with self._lock: if self._file is None: raise RuntimeError("JsonlMetricsSink.open() was not called") self._seq += 1 - record = event_envelope(seq=self._seq, payload=payload) + record = event_envelope(seq=self._seq, payload=dict(payload)) self._file.write(json.dumps(record, sort_keys=True) + "\n") self._file.flush() diff --git a/src/openrtc/pool.py b/src/openrtc/pool.py index 8afacbc..792fb26 100644 --- a/src/openrtc/pool.py +++ b/src/openrtc/pool.py @@ -14,7 +14,7 @@ from hashlib import sha1 from pathlib import Path from types import ModuleType -from typing import Any, TypeVar +from typing import Any, TypeVar, cast from livekit.agents import Agent, AgentServer, AgentSession, JobContext, JobProcess, cli @@ -27,10 +27,13 @@ logger = logging.getLogger("openrtc") +_OPENAI_NOT_GIVEN_TYPE: type[Any] | None = None try: from openai import NotGiven as _OpenAINotGiven except ImportError: # pragma: no cover - optional when openai is absent - _OpenAINotGiven = None + pass +else: + _OPENAI_NOT_GIVEN_TYPE = _OpenAINotGiven _AgentType = TypeVar("_AgentType", bound=type[Agent]) _AGENT_METADATA_ATTR = "__openrtc_agent_config__" @@ -109,7 +112,7 @@ async def _run_universal_session( raise RuntimeError("No agents are registered in the pool.") config = _resolve_agent_config(runtime_state.agents, ctx) session_kwargs = _build_session_kwargs(config.session_kwargs, ctx.proc) - session = AgentSession( + session: AgentSession = AgentSession( stt=config.stt, llm=config.llm, tts=config.tts, @@ -118,7 +121,10 @@ async def _run_universal_session( ) try: runtime_state.metrics.record_session_started(config.name) - await session.start(agent=config.agent_cls(), room=ctx.room) + await session.start( + agent=config.agent_cls(), # type: ignore[call-arg] + room=ctx.room, + ) await ctx.connect() if config.greeting is not None: @@ -521,7 +527,7 @@ def _resolve_discovery_metadata( ) -> AgentDiscoveryConfig: metadata = getattr(agent_cls, _AGENT_METADATA_ATTR, None) if metadata is not None: - return metadata + return cast(AgentDiscoveryConfig, metadata) return AgentDiscoveryConfig() @@ -622,7 +628,7 @@ def _filter_provider_kwargs(options: Mapping[str, Any]) -> dict[str, Any]: def _is_not_given(value: Any) -> bool: """True if ``value`` is OpenAI's ``NotGiven`` (unset optional on plugin ``_opts``).""" - if _OpenAINotGiven is not None and isinstance(value, _OpenAINotGiven): + if _OPENAI_NOT_GIVEN_TYPE is not None and isinstance(value, _OPENAI_NOT_GIVEN_TYPE): return True cls = type(value) if cls.__name__ != "NotGiven": diff --git a/src/openrtc/resources.py b/src/openrtc/resources.py index 64cb318..719cb4e 100644 --- a/src/openrtc/resources.py +++ b/src/openrtc/resources.py @@ -8,7 +8,7 @@ from dataclasses import dataclass, field from pathlib import Path from threading import Lock -from typing import TYPE_CHECKING, TypedDict +from typing import TYPE_CHECKING, TypedDict, cast if TYPE_CHECKING: from openrtc.pool import AgentConfig @@ -154,20 +154,36 @@ def __getstate__(self) -> dict[str, object]: } def __setstate__(self, state: Mapping[str, object]) -> None: - self.started_at = float(state["started_at"]) - self.total_sessions_started = int(state["total_sessions_started"]) - self.total_session_failures = int(state["total_session_failures"]) - self.last_routed_agent = state["last_routed_agent"] # type: ignore[assignment] - self.last_error = state["last_error"] # type: ignore[assignment] + started = state["started_at"] + if not isinstance(started, (int, float)): + raise TypeError("pickle state 'started_at' must be int or float") + self.started_at = float(started) + tss = state["total_sessions_started"] + if not isinstance(tss, int): + raise TypeError("pickle state 'total_sessions_started' must be int") + self.total_sessions_started = tss + tsf = state["total_session_failures"] + if not isinstance(tsf, int): + raise TypeError("pickle state 'total_session_failures' must be int") + self.total_session_failures = tsf + self.last_routed_agent = cast(str | None, state["last_routed_agent"]) + self.last_error = cast(str | None, state["last_error"]) + raw_sba = state["sessions_by_agent"] + if not isinstance(raw_sba, Mapping): + raise TypeError("pickle state 'sessions_by_agent' must be a mapping") self.sessions_by_agent = { - str(key): int(value) - for key, value in dict(state["sessions_by_agent"]).items() + str(key): int(value) for key, value in dict(raw_sba).items() } raw_events = state.get("_stream_events", []) - self._stream_events = deque(raw_events) - self._metrics_stream_overflow_since_drain = int( - state.get("_metrics_stream_overflow_since_drain", 0) - ) + if not isinstance(raw_events, list): + raise TypeError("pickle state '_stream_events' must be a list") + self._stream_events = deque(cast(list[MetricsStreamEvent], raw_events)) + overflow = state.get("_metrics_stream_overflow_since_drain", 0) + if not isinstance(overflow, int): + raise TypeError( + "pickle state '_metrics_stream_overflow_since_drain' must be int" + ) + self._metrics_stream_overflow_since_drain = overflow self._lock = Lock() def _append_stream_event_locked(self, event: MetricsStreamEvent) -> None: diff --git a/src/openrtc/tui_app.py b/src/openrtc/tui_app.py index 384a6c8..a5837f9 100644 --- a/src/openrtc/tui_app.py +++ b/src/openrtc/tui_app.py @@ -157,7 +157,7 @@ def _refresh_view(self) -> None: f"failures={payload.get('total_session_failures')}" ) - def action_quit(self) -> None: + async def action_quit(self) -> None: self.exit() diff --git a/tests/test_tui_app.py b/tests/test_tui_app.py index 8ddd16d..841a402 100644 --- a/tests/test_tui_app.py +++ b/tests/test_tui_app.py @@ -311,7 +311,7 @@ async def test_metrics_tui_action_quit_exits(tmp_path: Path) -> None: path.touch() app = MetricsTuiApp(path, from_start=True) async with app.run_test() as pilot: - app.action_quit() + await app.action_quit() await pilot.pause() From c617a61f74acca67a4fe09b2adda1c5ae17a44dd Mon Sep 17 00:00:00 2001 From: Cursor Agent Date: Sun, 22 Mar 2026 16:24:08 +0000 Subject: [PATCH 07/14] docs(tests): document LiveKit conftest shim scope and sync expectations Module docstring ties stubs to pyproject livekit-agents pin, drift risk, and when to extend stubs. CONTRIBUTING and AGENTS clarify real SDK is default with uv sync; shim is ImportError fallback. Co-authored-by: Mahimai Raja J --- AGENTS.md | 4 ++-- CONTRIBUTING.md | 8 ++++++++ tests/conftest.py | 19 +++++++++++++++++++ 3 files changed, 29 insertions(+), 2 deletions(-) diff --git a/AGENTS.md b/AGENTS.md index e355967..25bbc7e 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -396,7 +396,7 @@ When in doubt: ### Services overview -**OpenRTC** is a single Python package (`src/openrtc/`) with no runtime services required for development. All tests use stubs/mocks for LiveKit (see `tests/conftest.py`), so no LiveKit server, API keys, or external providers are needed to run the test suite. +**OpenRTC** is a single Python package (`src/openrtc/`) with no runtime services required for development. Normal `uv sync` installs the real `livekit-agents` wheel, so tests run against the actual SDK. A fallback shim in `tests/conftest.py` only applies when `livekit.agents` cannot be imported. No LiveKit server, API keys, or external *providers* are needed to run the test suite. ### Common dev commands @@ -411,7 +411,7 @@ All commands are documented in `CONTRIBUTING.md`. Quick reference: ### Non-obvious notes -- The `tests/conftest.py` creates a fake `livekit.agents` module when the real one isn't importable. This allows tests to run without the full LiveKit SDK. The real SDK *is* installed by `uv sync`, but if you see import weirdness in tests, this shim is the reason. +- The `tests/conftest.py` shim targets the `livekit-agents` pin in `pyproject.toml` (~1.4.x today) and only implements APIs OpenRTC uses. When upgrading LiveKit or adding new `livekit.agents` usage, extend the shim or confirm tests pass with the real SDK (`uv sync` + `uv run pytest`). If imports behave oddly, check whether the shim path is active vs. the real package. - Version is derived from git tags via `hatch-vcs`. In a dev checkout the version will be something like `0.0.9.dev0+g`. - `mypy` is enforced in CI alongside Ruff; run `uv run mypy src/` before pushing type-sensitive changes. - Running `openrtc start` or `openrtc dev` requires a running LiveKit server and provider API keys. For development validation, use `openrtc list` which exercises discovery and routing without network dependencies. The optional sidecar metrics TUI (`openrtc tui --watch`, requires `openrtc[tui]` / dev deps) tails `--metrics-jsonl` from a worker in another terminal. diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 349e8f5..7462e9d 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -31,6 +31,14 @@ but `uv` is the preferred workflow for contributors. uv run pytest ``` +With `uv sync --group dev`, the real `livekit-agents` package is installed, so +pytest uses the upstream SDK—not the fallback shim in `tests/conftest.py`. That +shim only loads when `livekit.agents` is missing (minimal or broken installs). It +is hand-maintained to match APIs OpenRTC uses; when you upgrade the +`livekit-agents` pin in `pyproject.toml` or add new LiveKit imports in `src/`, +re-run the full suite locally and update `conftest.py` if anything still relies +on the stub. + ### Run Ruff lint checks ```bash diff --git a/tests/conftest.py b/tests/conftest.py index ec02d51..6907688 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -1,5 +1,24 @@ from __future__ import annotations +"""Pytest configuration and shared fixtures. + +LiveKit SDK shim (below): if ``livekit.agents`` cannot be imported, we register a +minimal ``livekit`` / ``livekit.agents`` package so tests can import +``openrtc.pool`` without the real wheel. The shapes here mirror only what +OpenRTC uses today; they are **not** a full SDK copy. + +**Target:** align with ``livekit-agents`` as pinned in ``pyproject.toml`` (see +``dependencies`` / ``livekit-agents[...]``). When bumping that version or when +OpenRTC starts calling new ``livekit.agents`` APIs, re-check this block: either +extend the stubs or rely on ``uv sync`` + real SDK (normal contributor setup) so +pytest exercises the actual package. + +**Drift risk:** new attributes on real ``Agent``, ``AgentServer``, etc. will exist +on the installed SDK but not on these stubs; code paths that only run under the +shim could diverge. Prefer running ``uv run pytest`` after ``uv sync`` before +release; use the shim mainly for documented minimal environments. +""" + import importlib import sys import types From 7609543fec046f4ecec088929a2d9d84e15b5c47 Mon Sep 17 00:00:00 2001 From: Cursor Agent Date: Sun, 22 Mar 2026 16:28:27 +0000 Subject: [PATCH 08/14] docs: note PEP 561 py.typed in distributions Empty marker lives at src/openrtc/py.typed; hatch includes it in wheel and sdist. Co-authored-by: Mahimai Raja J --- CONTRIBUTING.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 7462e9d..895246d 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -59,6 +59,9 @@ CI runs `mypy src/` on pull requests (see `.github/workflows/lint.yml`). Locally uv run mypy src/ ``` +The wheel and sdist ship `src/openrtc/py.typed` (empty PEP 561 marker) so tools +like mypy and pyright treat `openrtc` as a typed dependency. + ## Project architecture Keep these responsibilities in mind when contributing: From b3ded96f4b9965e619156fffdb3d08bb9f8a5e49 Mon Sep 17 00:00:00 2001 From: Cursor Agent Date: Sun, 22 Mar 2026 16:30:27 +0000 Subject: [PATCH 09/14] chore(codecov): stop excluding tui_app.py from coverage tui_app is covered by tests/test_tui_app.py; project coverage remains above the 80% gate with it included. Co-authored-by: Mahimai Raja J --- codecov.yml | 6 ------ 1 file changed, 6 deletions(-) diff --git a/codecov.yml b/codecov.yml index 42af682..9ab4c6e 100644 --- a/codecov.yml +++ b/codecov.yml @@ -3,12 +3,6 @@ # Codecov checks and PR comments. Patch status is informational so small PRs # are not blocked twice (pytest remains the hard gate for overall %). -# Optional Textual sidecar (`openrtc[tui]`). Excluded from Codecov totals/patch so -# PR checks are not dominated by UI-only lines; `pytest --cov=openrtc` still -# includes it unless you omit it locally. -ignore: - - "**/openrtc/tui_app\\.py" - coverage: precision: 2 round: down From e8730191370a7d76c2858aa9247b805815799ef7 Mon Sep 17 00:00:00 2001 From: Cursor Agent Date: Sun, 22 Mar 2026 16:35:53 +0000 Subject: [PATCH 10/14] fix(deps): cap onnxruntime on Python 3.10 for uv resolution onnxruntime 1.24+ has no cp310 wheels; LiveKit plugins still depend on it. Add a PEP 508 conditional dependency (1.23.x on <3.11) so uv add/sync and pip install work on 3.10. Regenerate uv.lock; document in CONTRIBUTING. Co-authored-by: Mahimai Raja J --- CONTRIBUTING.md | 5 +++ pyproject.toml | 4 +++ uv.lock | 81 +++++++++++++++++++++++++++++++++++++------------ 3 files changed, 70 insertions(+), 20 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 895246d..cce3a77 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -23,6 +23,11 @@ CLI with `pip install 'openrtc[cli]'` and the sidecar TUI with If you prefer, you can also install the package and dev dependencies with pip, but `uv` is the preferred workflow for contributors. +**Python 3.10:** newer `onnxruntime` releases (pulled in by LiveKit’s Silero / +turn-detector plugins) only ship wheels for CPython 3.11+. OpenRTC declares a +conditional dependency so 3.10 environments resolve `onnxruntime` 1.23.x instead. +If you still see resolver errors, use `uv sync --python 3.11` or newer. + ## Common development commands ### Run tests diff --git a/pyproject.toml b/pyproject.toml index 468c1be..4599862 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -23,6 +23,10 @@ license = "MIT" requires-python = ">=3.10,<3.14" dependencies = [ "livekit-agents[openai,silero,turn-detector]~=1.4", + # onnxruntime 1.24+ only publishes wheels for CPython 3.11+; LiveKit's + # turn-detector/silero stack still pulls it transitively. Pin the last + # 1.23.x line on Python 3.10 so `uv sync` / `uv add` can resolve wheels. + "onnxruntime>=1.23.2,<1.24; python_full_version < '3.11'", ] [project.optional-dependencies] diff --git a/uv.lock b/uv.lock index 0fc073a..9965113 100644 --- a/uv.lock +++ b/uv.lock @@ -378,6 +378,18 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6", size = 25335, upload-time = "2022-10-25T02:36:20.889Z" }, ] +[[package]] +name = "coloredlogs" +version = "15.0.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "humanfriendly", marker = "python_full_version < '3.11'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/cc/c7/eed8f27100517e8c0e6b923d5f0845d0cb99763da6fdee00478f91db7325/coloredlogs-15.0.1.tar.gz", hash = "sha256:7c991aa71a4577af2f82600d8f8f3a89f936baeaf9b50a9c197da014e5bf16b0", size = 278520, upload-time = "2021-06-11T10:22:45.202Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a7/06/3d6badcf13db419e25b07041d9c7b4a2c331d3f4e7134445ec5df57714cd/coloredlogs-15.0.1-py2.py3-none-any.whl", hash = "sha256:612ee75c546f53e92e70049c9dbfcc18c935a2b9a53b66085ce9ef6a6e5c0934", size = 46018, upload-time = "2021-06-11T10:22:42.561Z" }, +] + [[package]] name = "coverage" version = "7.13.5" @@ -772,6 +784,18 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/a8/af/48ac8483240de756d2438c380746e7130d1c6f75802ef22f3c6d49982787/huggingface_hub-0.36.2-py3-none-any.whl", hash = "sha256:48f0c8eac16145dfce371e9d2d7772854a4f591bcb56c9cf548accf531d54270", size = 566395, upload-time = "2026-02-06T09:24:11.133Z" }, ] +[[package]] +name = "humanfriendly" +version = "10.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyreadline3", marker = "python_full_version < '3.11' and sys_platform == 'win32'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/cc/3f/2c29224acb2e2df4d2046e4c73ee2662023c58ff5b113c4c1adac0886c43/humanfriendly-10.0.tar.gz", hash = "sha256:6b0b831ce8f15f7300721aa49829fc4e83921a9a301cc7f606be6686a2288ddc", size = 360702, upload-time = "2021-09-17T21:40:43.31Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f0/0f/310fb31e39e2d734ccaa2c0fb981ee41f7bd5056ce9bc29b2248bd569169/humanfriendly-10.0-py2.py3-none-any.whl", hash = "sha256:1697e1a8a8f550fd43c2865cd84542fc175a61dcb779b6fee18cf6b6ccba1477", size = 86794, upload-time = "2021-09-17T21:40:39.897Z" }, +] + [[package]] name = "identify" version = "2.6.18" @@ -1108,7 +1132,7 @@ dependencies = [ { name = "livekit-agents" }, { name = "numpy", version = "2.2.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, { name = "numpy", version = "2.4.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, - { name = "onnxruntime", version = "1.24.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, + { name = "onnxruntime", version = "1.23.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, { name = "onnxruntime", version = "1.24.4", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/aa/35/6d01bce8b13dfd49531b496ee1af63c85374d8b59cfea82152da764ada14/livekit_plugins_silero-1.5.0.tar.gz", hash = "sha256:c2eed08b5c3ab1f6cbf4c7c645f355c2888b66cf194dd9620e3dd74257a527d8", size = 1955569, upload-time = "2026-03-19T17:01:38.43Z" } @@ -1125,7 +1149,7 @@ dependencies = [ { name = "livekit-agents" }, { name = "numpy", version = "2.2.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, { name = "numpy", version = "2.4.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, - { name = "onnxruntime", version = "1.24.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, + { name = "onnxruntime", version = "1.23.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, { name = "onnxruntime", version = "1.24.4", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, { name = "transformers" }, ] @@ -1558,12 +1582,13 @@ wheels = [ [[package]] name = "onnxruntime" -version = "1.24.3" +version = "1.23.2" source = { registry = "https://pypi.org/simple" } resolution-markers = [ "python_full_version < '3.11'", ] dependencies = [ + { name = "coloredlogs", marker = "python_full_version < '3.11'" }, { name = "flatbuffers", marker = "python_full_version < '3.11'" }, { name = "numpy", version = "2.2.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, { name = "packaging", marker = "python_full_version < '3.11'" }, @@ -1571,23 +1596,28 @@ dependencies = [ { name = "sympy", marker = "python_full_version < '3.11'" }, ] wheels = [ - { url = "https://files.pythonhosted.org/packages/15/41/3253db975a90c3ce1d475e2a230773a21cd7998537f0657947df6fb79861/onnxruntime-1.24.3-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:3e6456801c66b095c5cd68e690ca25db970ea5202bd0c5b84a2c3ef7731c5a3c", size = 17332766, upload-time = "2026-03-05T17:18:59.714Z" }, - { url = "https://files.pythonhosted.org/packages/7e/c5/3af6b325f1492d691b23844d88ed26844c1164620860c5efe95c0e22782d/onnxruntime-1.24.3-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:8b2ebc54c6d8281dccff78d4b06e47d4cf07535937584ab759448390a70f4978", size = 15130330, upload-time = "2026-03-05T16:34:53.831Z" }, - { url = "https://files.pythonhosted.org/packages/03/4b/f96b46c1866a293ed23ca2cf5e5a63d413ad3a951da60dd877e3c56cbbca/onnxruntime-1.24.3-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:fb56575d7794bf0781156955610c9e651c9504c64d42ec880784b6106244882d", size = 17213247, upload-time = "2026-03-05T17:17:59.812Z" }, - { url = "https://files.pythonhosted.org/packages/36/13/27cf4d8df2578747584e8758aeb0b673b60274048510257f1f084b15e80e/onnxruntime-1.24.3-cp311-cp311-win_amd64.whl", hash = "sha256:c958222ef9eff54018332beecd32d5d94a3ab079d8821937b333811bf4da0d39", size = 12595530, upload-time = "2026-03-05T17:18:49.356Z" }, - { url = "https://files.pythonhosted.org/packages/19/8c/6d9f31e6bae72a8079be12ed8ba36c4126a571fad38ded0a1b96f60f6896/onnxruntime-1.24.3-cp311-cp311-win_arm64.whl", hash = "sha256:a8f761857ebaf58a85b9e42422d03207f1d39e6bb8fecfdbf613bac5b9710723", size = 12261715, upload-time = "2026-03-05T17:18:39.699Z" }, - { url = "https://files.pythonhosted.org/packages/d0/7f/dfdc4e52600fde4c02d59bfe98c4b057931c1114b701e175aee311a9bc11/onnxruntime-1.24.3-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:0d244227dc5e00a9ae15a7ac1eba4c4460d7876dfecafe73fb00db9f1d914d91", size = 17342578, upload-time = "2026-03-05T17:19:02.403Z" }, - { url = "https://files.pythonhosted.org/packages/1c/dc/1f5489f7b21817d4ad352bf7a92a252bd5b438bcbaa7ad20ea50814edc79/onnxruntime-1.24.3-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0a9847b870b6cb462652b547bc98c49e0efb67553410a082fde1918a38707452", size = 15150105, upload-time = "2026-03-05T16:34:56.897Z" }, - { url = "https://files.pythonhosted.org/packages/28/7c/fd253da53594ab8efbefdc85b3638620ab1a6aab6eb7028a513c853559ce/onnxruntime-1.24.3-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b354afce3333f2859c7e8706d84b6c552beac39233bcd3141ce7ab77b4cabb5d", size = 17237101, upload-time = "2026-03-05T17:18:02.561Z" }, - { url = "https://files.pythonhosted.org/packages/71/5f/eaabc5699eeed6a9188c5c055ac1948ae50138697a0428d562ac970d7db5/onnxruntime-1.24.3-cp312-cp312-win_amd64.whl", hash = "sha256:44ea708c34965439170d811267c51281d3897ecfc4aa0087fa25d4a4c3eb2e4a", size = 12597638, upload-time = "2026-03-05T17:18:52.141Z" }, - { url = "https://files.pythonhosted.org/packages/cc/5c/d8066c320b90610dbeb489a483b132c3b3879b2f93f949fb5d30cfa9b119/onnxruntime-1.24.3-cp312-cp312-win_arm64.whl", hash = "sha256:48d1092b44ca2ba6f9543892e7c422c15a568481403c10440945685faf27a8d8", size = 12270943, upload-time = "2026-03-05T17:18:42.006Z" }, - { url = "https://files.pythonhosted.org/packages/51/8d/487ece554119e2991242d4de55de7019ac6e47ee8dfafa69fcf41d37f8ed/onnxruntime-1.24.3-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:34a0ea5ff191d8420d9c1332355644148b1bf1a0d10c411af890a63a9f662aa7", size = 17342706, upload-time = "2026-03-05T16:35:10.813Z" }, - { url = "https://files.pythonhosted.org/packages/dd/25/8b444f463c1ac6106b889f6235c84f01eec001eaf689c3eff8c69cf48fae/onnxruntime-1.24.3-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1fd2ec7bb0fabe42f55e8337cfc9b1969d0d14622711aac73d69b4bd5abb5ed7", size = 15149956, upload-time = "2026-03-05T16:34:59.264Z" }, - { url = "https://files.pythonhosted.org/packages/34/fc/c9182a3e1ab46940dd4f30e61071f59eee8804c1f641f37ce6e173633fb6/onnxruntime-1.24.3-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:df8e70e732fe26346faaeec9147fa38bef35d232d2495d27e93dd221a2d473a9", size = 17237370, upload-time = "2026-03-05T17:18:05.258Z" }, - { url = "https://files.pythonhosted.org/packages/05/7e/3b549e1f4538514118bff98a1bcd6481dd9a17067f8c9af77151621c9a5c/onnxruntime-1.24.3-cp313-cp313-win_amd64.whl", hash = "sha256:2d3706719be6ad41d38a2250998b1d87758a20f6ea4546962e21dc79f1f1fd2b", size = 12597939, upload-time = "2026-03-05T17:18:54.772Z" }, - { url = "https://files.pythonhosted.org/packages/80/41/9696a5c4631a0caa75cc8bc4efd30938fd483694aa614898d087c3ee6d29/onnxruntime-1.24.3-cp313-cp313-win_arm64.whl", hash = "sha256:b082f3ba9519f0a1a1e754556bc7e635c7526ef81b98b3f78da4455d25f0437b", size = 12270705, upload-time = "2026-03-05T17:18:44.774Z" }, - { url = "https://files.pythonhosted.org/packages/b7/65/a26c5e59e3b210852ee04248cf8843c81fe7d40d94cf95343b66efe7eec9/onnxruntime-1.24.3-cp313-cp313t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:72f956634bc2e4bd2e8b006bef111849bd42c42dea37bd0a4c728404fdaf4d34", size = 15161796, upload-time = "2026-03-05T16:35:02.871Z" }, - { url = "https://files.pythonhosted.org/packages/f3/25/2035b4aa2ccb5be6acf139397731ec507c5f09e199ab39d3262b22ffa1ac/onnxruntime-1.24.3-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:78d1f25eed4ab9959db70a626ed50ee24cf497e60774f59f1207ac8556399c4d", size = 17240936, upload-time = "2026-03-05T17:18:09.534Z" }, + { url = "https://files.pythonhosted.org/packages/35/d6/311b1afea060015b56c742f3531168c1644650767f27ef40062569960587/onnxruntime-1.23.2-cp310-cp310-macosx_13_0_arm64.whl", hash = "sha256:a7730122afe186a784660f6ec5807138bf9d792fa1df76556b27307ea9ebcbe3", size = 17195934, upload-time = "2025-10-27T23:06:14.143Z" }, + { url = "https://files.pythonhosted.org/packages/db/db/81bf3d7cecfbfed9092b6b4052e857a769d62ed90561b410014e0aae18db/onnxruntime-1.23.2-cp310-cp310-macosx_13_0_x86_64.whl", hash = "sha256:b28740f4ecef1738ea8f807461dd541b8287d5650b5be33bca7b474e3cbd1f36", size = 19153079, upload-time = "2025-10-27T23:05:57.686Z" }, + { url = "https://files.pythonhosted.org/packages/2e/4d/a382452b17cf70a2313153c520ea4c96ab670c996cb3a95cc5d5ac7bfdac/onnxruntime-1.23.2-cp310-cp310-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:8f7d1fe034090a1e371b7f3ca9d3ccae2fabae8c1d8844fb7371d1ea38e8e8d2", size = 15219883, upload-time = "2025-10-22T03:46:21.66Z" }, + { url = "https://files.pythonhosted.org/packages/fb/56/179bf90679984c85b417664c26aae4f427cba7514bd2d65c43b181b7b08b/onnxruntime-1.23.2-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4ca88747e708e5c67337b0f65eed4b7d0dd70d22ac332038c9fc4635760018f7", size = 17370357, upload-time = "2025-10-22T03:46:57.968Z" }, + { url = "https://files.pythonhosted.org/packages/cd/6d/738e50c47c2fd285b1e6c8083f15dac1a5f6199213378a5f14092497296d/onnxruntime-1.23.2-cp310-cp310-win_amd64.whl", hash = "sha256:0be6a37a45e6719db5120e9986fcd30ea205ac8103fd1fb74b6c33348327a0cc", size = 13467651, upload-time = "2025-10-27T23:06:11.904Z" }, + { url = "https://files.pythonhosted.org/packages/44/be/467b00f09061572f022ffd17e49e49e5a7a789056bad95b54dfd3bee73ff/onnxruntime-1.23.2-cp311-cp311-macosx_13_0_arm64.whl", hash = "sha256:6f91d2c9b0965e86827a5ba01531d5b669770b01775b23199565d6c1f136616c", size = 17196113, upload-time = "2025-10-22T03:47:33.526Z" }, + { url = "https://files.pythonhosted.org/packages/9f/a8/3c23a8f75f93122d2b3410bfb74d06d0f8da4ac663185f91866b03f7da1b/onnxruntime-1.23.2-cp311-cp311-macosx_13_0_x86_64.whl", hash = "sha256:87d8b6eaf0fbeb6835a60a4265fde7a3b60157cf1b2764773ac47237b4d48612", size = 19153857, upload-time = "2025-10-22T03:46:37.578Z" }, + { url = "https://files.pythonhosted.org/packages/3f/d8/506eed9af03d86f8db4880a4c47cd0dffee973ef7e4f4cff9f1d4bcf7d22/onnxruntime-1.23.2-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:bbfd2fca76c855317568c1b36a885ddea2272c13cb0e395002c402f2360429a6", size = 15220095, upload-time = "2025-10-22T03:46:24.769Z" }, + { url = "https://files.pythonhosted.org/packages/e9/80/113381ba832d5e777accedc6cb41d10f9eca82321ae31ebb6bcede530cea/onnxruntime-1.23.2-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:da44b99206e77734c5819aa2142c69e64f3b46edc3bd314f6a45a932defc0b3e", size = 17372080, upload-time = "2025-10-22T03:47:00.265Z" }, + { url = "https://files.pythonhosted.org/packages/3a/db/1b4a62e23183a0c3fe441782462c0ede9a2a65c6bbffb9582fab7c7a0d38/onnxruntime-1.23.2-cp311-cp311-win_amd64.whl", hash = "sha256:902c756d8b633ce0dedd889b7c08459433fbcf35e9c38d1c03ddc020f0648c6e", size = 13468349, upload-time = "2025-10-22T03:47:25.783Z" }, + { url = "https://files.pythonhosted.org/packages/1b/9e/f748cd64161213adeef83d0cb16cb8ace1e62fa501033acdd9f9341fff57/onnxruntime-1.23.2-cp312-cp312-macosx_13_0_arm64.whl", hash = "sha256:b8f029a6b98d3cf5be564d52802bb50a8489ab73409fa9db0bf583eabb7c2321", size = 17195929, upload-time = "2025-10-22T03:47:36.24Z" }, + { url = "https://files.pythonhosted.org/packages/91/9d/a81aafd899b900101988ead7fb14974c8a58695338ab6a0f3d6b0100f30b/onnxruntime-1.23.2-cp312-cp312-macosx_13_0_x86_64.whl", hash = "sha256:218295a8acae83905f6f1aed8cacb8e3eb3bd7513a13fe4ba3b2664a19fc4a6b", size = 19157705, upload-time = "2025-10-22T03:46:40.415Z" }, + { url = "https://files.pythonhosted.org/packages/3c/35/4e40f2fba272a6698d62be2cd21ddc3675edfc1a4b9ddefcc4648f115315/onnxruntime-1.23.2-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:76ff670550dc23e58ea9bc53b5149b99a44e63b34b524f7b8547469aaa0dcb8c", size = 15226915, upload-time = "2025-10-22T03:46:27.773Z" }, + { url = "https://files.pythonhosted.org/packages/ef/88/9cc25d2bafe6bc0d4d3c1db3ade98196d5b355c0b273e6a5dc09c5d5d0d5/onnxruntime-1.23.2-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0f9b4ae77f8e3c9bee50c27bc1beede83f786fe1d52e99ac85aa8d65a01e9b77", size = 17382649, upload-time = "2025-10-22T03:47:02.782Z" }, + { url = "https://files.pythonhosted.org/packages/c0/b4/569d298f9fc4d286c11c45e85d9ffa9e877af12ace98af8cab52396e8f46/onnxruntime-1.23.2-cp312-cp312-win_amd64.whl", hash = "sha256:25de5214923ce941a3523739d34a520aac30f21e631de53bba9174dc9c004435", size = 13470528, upload-time = "2025-10-22T03:47:28.106Z" }, + { url = "https://files.pythonhosted.org/packages/3d/41/fba0cabccecefe4a1b5fc8020c44febb334637f133acefc7ec492029dd2c/onnxruntime-1.23.2-cp313-cp313-macosx_13_0_arm64.whl", hash = "sha256:2ff531ad8496281b4297f32b83b01cdd719617e2351ffe0dba5684fb283afa1f", size = 17196337, upload-time = "2025-10-22T03:46:35.168Z" }, + { url = "https://files.pythonhosted.org/packages/fe/f9/2d49ca491c6a986acce9f1d1d5fc2099108958cc1710c28e89a032c9cfe9/onnxruntime-1.23.2-cp313-cp313-macosx_13_0_x86_64.whl", hash = "sha256:162f4ca894ec3de1a6fd53589e511e06ecdc3ff646849b62a9da7489dee9ce95", size = 19157691, upload-time = "2025-10-22T03:46:43.518Z" }, + { url = "https://files.pythonhosted.org/packages/1c/a1/428ee29c6eaf09a6f6be56f836213f104618fb35ac6cc586ff0f477263eb/onnxruntime-1.23.2-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:45d127d6e1e9b99d1ebeae9bcd8f98617a812f53f46699eafeb976275744826b", size = 15226898, upload-time = "2025-10-22T03:46:30.039Z" }, + { url = "https://files.pythonhosted.org/packages/f2/2b/b57c8a2466a3126dbe0a792f56ad7290949b02f47b86216cd47d857e4b77/onnxruntime-1.23.2-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8bace4e0d46480fbeeb7bbe1ffe1f080e6663a42d1086ff95c1551f2d39e7872", size = 17382518, upload-time = "2025-10-22T03:47:05.407Z" }, + { url = "https://files.pythonhosted.org/packages/4a/93/aba75358133b3a941d736816dd392f687e7eab77215a6e429879080b76b6/onnxruntime-1.23.2-cp313-cp313-win_amd64.whl", hash = "sha256:1f9cc0a55349c584f083c1c076e611a7c35d5b867d5d6e6d6c823bf821978088", size = 13470276, upload-time = "2025-10-22T03:47:31.193Z" }, + { url = "https://files.pythonhosted.org/packages/7c/3d/6830fa61c69ca8e905f237001dbfc01689a4e4ab06147020a4518318881f/onnxruntime-1.23.2-cp313-cp313t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9d2385e774f46ac38f02b3a91a91e30263d41b2f1f4f26ae34805b2a9ddef466", size = 15229610, upload-time = "2025-10-22T03:46:32.239Z" }, + { url = "https://files.pythonhosted.org/packages/b6/ca/862b1e7a639460f0ca25fd5b6135fb42cf9deea86d398a92e44dfda2279d/onnxruntime-1.23.2-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:e2b9233c4947907fd1818d0e581c049c41ccc39b2856cc942ff6d26317cee145", size = 17394184, upload-time = "2025-10-22T03:47:08.127Z" }, ] [[package]] @@ -1654,6 +1684,7 @@ name = "openrtc" source = { editable = "." } dependencies = [ { name = "livekit-agents", extra = ["openai", "silero", "turn-detector"] }, + { name = "onnxruntime", version = "1.23.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, ] [package.optional-dependencies] @@ -1684,6 +1715,7 @@ dev = [ [package.metadata] requires-dist = [ { name = "livekit-agents", extras = ["openai", "silero", "turn-detector"], specifier = "~=1.4" }, + { name = "onnxruntime", marker = "python_full_version < '3.11'", specifier = ">=1.23.2,<1.24" }, { name = "rich", marker = "extra == 'cli'", specifier = ">=13" }, { name = "rich", marker = "extra == 'tui'", specifier = ">=13" }, { name = "textual", marker = "extra == 'tui'", specifier = ">=0.47,<2" }, @@ -2209,6 +2241,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/e5/7a/8dd906bd22e79e47397a61742927f6747fe93242ef86645ee9092e610244/pyjwt-2.12.1-py3-none-any.whl", hash = "sha256:28ca37c070cad8ba8cd9790cd940535d40274d22f80ab87f3ac6a713e6e8454c", size = 29726, upload-time = "2026-03-13T19:27:35.677Z" }, ] +[[package]] +name = "pyreadline3" +version = "3.5.4" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/0f/49/4cea918a08f02817aabae639e3d0ac046fef9f9180518a3ad394e22da148/pyreadline3-3.5.4.tar.gz", hash = "sha256:8d57d53039a1c75adba8e50dd3d992b28143480816187ea5efbd5c78e6c885b7", size = 99839, upload-time = "2024-09-19T02:40:10.062Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/5a/dc/491b7661614ab97483abf2056be1deee4dc2490ecbf7bff9ab5cdbac86e1/pyreadline3-3.5.4-py3-none-any.whl", hash = "sha256:eaf8e6cc3c49bcccf145fc6067ba8643d1df34d604a1ec0eccbf7a18e6d3fae6", size = 83178, upload-time = "2024-09-19T02:40:08.598Z" }, +] + [[package]] name = "pytest" version = "9.0.2" From d78337b4e20bc9a0468bcb05acd7ee37ce611623 Mon Sep 17 00:00:00 2001 From: Cursor Agent Date: Sun, 22 Mar 2026 16:41:51 +0000 Subject: [PATCH 11/14] docs: sync README and VitePress site with current package - README: uv install, py.typed, ProviderValue, expanded src layout, onnxruntime 3.10 note, CI Ruff/mypy - getting-started: uv, PEP 561, Python 3.10/onnxruntime pointer - cli: document split cli_* modules - api/pool: ProviderValue types replace Any in signatures - architecture: mention ProviderValue for pipeline slots VitePress docs:build succeeds. Co-authored-by: Mahimai Raja J --- README.md | 32 +++++++++++++++++++++++++------- docs/api/pool.md | 29 ++++++++++++++++++++++------- docs/cli.md | 6 ++++-- docs/concepts/architecture.md | 3 ++- docs/getting-started.md | 16 ++++++++++++++-- 5 files changed, 67 insertions(+), 19 deletions(-) diff --git a/README.md b/README.md index 613b9bc..094992f 100644 --- a/README.md +++ b/README.md @@ -61,7 +61,16 @@ You already ship three voice agents with `livekit-agents`. Each agent is its own pip install openrtc ``` -The base install pulls in `livekit-agents[openai,silero,turn-detector]` so shared prewarm has the plugins it expects. +The base install pulls in `livekit-agents[openai,silero,turn-detector]` so shared prewarm has the plugins it expects. The package ships a **PEP 561** `py.typed` marker for downstream type checkers. + +With **uv** (recommended in [CONTRIBUTING.md](CONTRIBUTING.md)): + +```bash +uv add openrtc +uv add "openrtc[cli,tui]" +``` + +On **CPython 3.10**, a conditional `onnxruntime` pin keeps resolution compatible with wheels (newer `onnxruntime` releases are 3.11+ only). Prefer **3.11+** if you hit resolver issues. ```bash pip install 'openrtc[cli]' @@ -253,6 +262,7 @@ Everything openrtc exposes publicly is listed here. Anything else is internal an - `AgentConfig` - `AgentDiscoveryConfig` - `agent_config(...)` +- `ProviderValue` — type alias for STT/LLM/TTS slot values (provider ID strings or LiveKit plugin instances) On `AgentPool`: @@ -271,11 +281,18 @@ On `AgentPool`: ```text src/openrtc/ ├── __init__.py -├── cli.py -├── cli_app.py -├── metrics_stream.py -├── tui_app.py -└── pool.py +├── py.typed +├── cli.py # lazy console entry / missing-extra hints +├── cli_app.py # Typer commands and programmatic main() +├── cli_types.py # shared CLI option aliases +├── cli_dashboard.py # Rich dashboard and list output +├── cli_reporter.py # background metrics reporter thread +├── cli_livekit.py # LiveKit argv/env handoff, pool run +├── cli_params.py # shared worker handoff option bundles +├── metrics_stream.py # JSONL metrics schema +├── provider_types.py # ProviderValue and related typing +├── tui_app.py # optional Textual sidecar +└── pool.py # AgentPool, discovery, routing ``` - `pool.py` — `AgentPool`, discovery, routing @@ -285,7 +302,8 @@ src/openrtc/ ## Contributing -See [CONTRIBUTING.md](CONTRIBUTING.md). +See [CONTRIBUTING.md](CONTRIBUTING.md). CI runs **Ruff** and **mypy** on pull +requests alongside the test suite. ## License diff --git a/docs/api/pool.md b/docs/api/pool.md index 8bf1e6f..d1a6d31 100644 --- a/docs/api/pool.md +++ b/docs/api/pool.md @@ -3,9 +3,24 @@ ## Imports ```python -from openrtc import AgentConfig, AgentDiscoveryConfig, AgentPool, agent_config +from dataclasses import field +from typing import Any + +from livekit.agents import Agent + +from openrtc import ( + AgentConfig, + AgentDiscoveryConfig, + AgentPool, + ProviderValue, + agent_config, +) ``` +`ProviderValue` is `str | Any`: provider ID strings (for example +`openai/gpt-4.1-mini`) or concrete LiveKit plugin instances (for example +`openai.STT(...)`). + ## `AgentConfig` ```python @@ -13,9 +28,9 @@ from openrtc import AgentConfig, AgentDiscoveryConfig, AgentPool, agent_config class AgentConfig: name: str agent_cls: type[Agent] - stt: Any = None - llm: Any = None - tts: Any = None + stt: ProviderValue | None = None + llm: ProviderValue | None = None + tts: ProviderValue | None = None greeting: str | None = None session_kwargs: dict[str, Any] = field(default_factory=dict) source_path: Path | None = None @@ -35,9 +50,9 @@ in pickle state for worker processes. @dataclass(slots=True) class AgentDiscoveryConfig: name: str | None = None - stt: Any = None - llm: Any = None - tts: Any = None + stt: ProviderValue | None = None + llm: ProviderValue | None = None + tts: ProviderValue | None = None greeting: str | None = None ``` diff --git a/docs/cli.md b/docs/cli.md index 5698260..68de67a 100644 --- a/docs/cli.md +++ b/docs/cli.md @@ -1,8 +1,10 @@ # CLI OpenRTC ships a console script named `openrtc` (Typer + Rich) for discovery-based -workflows. The implementation lives in `openrtc.cli` / `openrtc.cli_app`; the -programmatic entry is `typer.main.get_command(app).main(...)` (Click’s +workflows. The Typer application and `main()` live in `openrtc.cli_app` (with +helpers in `cli_livekit`, `cli_dashboard`, `cli_reporter`, `cli_types`, and +`cli_params`). The lazy entrypoint and missing-extra hints are in `openrtc.cli`. +The programmatic entry is `typer.main.get_command(app).main(...)` (Click’s `Command.main`), not the test-only `CliRunner`. ## Installation diff --git a/docs/concepts/architecture.md b/docs/concepts/architecture.md index 51cc5c7..2023bcd 100644 --- a/docs/concepts/architecture.md +++ b/docs/concepts/architecture.md @@ -10,7 +10,8 @@ OpenRTC keeps the public API intentionally narrow. - unique `name` - `agent_cls` subclass -- optional `stt`, `llm`, and `tts` providers +- optional `stt`, `llm`, and `tts` values (`ProviderValue | None`: provider ID + strings or plugin instances) - optional `greeting` generated after `ctx.connect()` - optional `session_kwargs` forwarded to `AgentSession` - optional `source_path` when the module file is known (e.g. after discovery), for diff --git a/docs/getting-started.md b/docs/getting-started.md index b07c8ab..582f42e 100644 --- a/docs/getting-started.md +++ b/docs/getting-started.md @@ -3,7 +3,11 @@ ## Requirements OpenRTC currently supports Python `>=3.10,<3.14` and depends on -`livekit-agents[openai,silero,turn-detector]~=1.4`. +`livekit-agents[openai,silero,turn-detector]~=1.4`. On **Python 3.10** the +resolver keeps a compatible `onnxruntime` release (LiveKit’s Silero / +turn-detector stack depends on it); **3.11+** is the smoothest path if you see +install issues. See the repository’s `CONTRIBUTING.md` for `uv` workflows and +Python 3.10 notes. ## Install @@ -12,7 +16,15 @@ pip install openrtc ``` The base package includes the LiveKit Silero and turn-detector plugins used by -OpenRTC's shared prewarm path. +OpenRTC's shared prewarm path. The wheel includes **PEP 561** `py.typed` for type +checkers. + +With **uv**: + +```bash +uv add openrtc +uv add "openrtc[cli,tui]" +``` Install the **Typer/Rich CLI** (`openrtc list`, `openrtc start`, `openrtc dev`, `openrtc console`, …) with: From 626ca45a5dd79184b8e211089ee9340e0ac1737d Mon Sep 17 00:00:00 2001 From: Cursor Agent Date: Sun, 22 Mar 2026 16:46:30 +0000 Subject: [PATCH 12/14] feat!: require Python 3.11+ (drop 3.10) onnxruntime and the LiveKit Silero/turn-detector stack no longer support 3.10 wheels in current releases; the conditional onnxruntime pin was fragile. - requires-python >=3.11,<3.14; remove onnxruntime extra constraint - CI test matrix and PyPI publish Python updated; mypy python_version 3.11 - Docs, README, CONTRIBUTING, AGENTS, skill: version notes BREAKING CHANGE: Python 3.10 environments must upgrade to 3.11 or newer. Co-authored-by: Mahimai Raja J --- .agents/skills/openrtc-python/SKILL.md | 2 +- .github/workflows/publish.yml | 2 +- .github/workflows/test.yml | 2 +- AGENTS.md | 2 + CONTRIBUTING.md | 6 +- README.md | 8 +- docs/getting-started.md | 11 +- pyproject.toml | 9 +- uv.lock | 518 +------------------------ 9 files changed, 34 insertions(+), 526 deletions(-) diff --git a/.agents/skills/openrtc-python/SKILL.md b/.agents/skills/openrtc-python/SKILL.md index a703d75..4c1b397 100644 --- a/.agents/skills/openrtc-python/SKILL.md +++ b/.agents/skills/openrtc-python/SKILL.md @@ -7,7 +7,7 @@ description: >- providers, set up agent routing, or run multiple LiveKit agents together with OpenRTC. license: MIT -compatibility: Requires Python 3.10+ and uv (or pip). Requires the openrtc package. +compatibility: Requires Python 3.11+ and uv (or pip). Requires the openrtc package. metadata: author: mahimailabs version: "1.0" diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index 2a3e6bb..0db2661 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -24,7 +24,7 @@ jobs: - name: Set up Python uses: actions/setup-python@v5 with: - python-version: "3.10" + python-version: "3.12" - name: Install build dependencies run: | diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index da944fb..370ca74 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -12,7 +12,7 @@ jobs: strategy: fail-fast: false matrix: - python-version: ["3.10", "3.11", "3.12", "3.13"] + python-version: ["3.11", "3.12", "3.13"] steps: - name: Check out repository diff --git a/AGENTS.md b/AGENTS.md index 25bbc7e..2623e4e 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -400,6 +400,8 @@ When in doubt: ### Common dev commands +**Python:** `requires-python` is **3.11+** (see `pyproject.toml`); 3.10 is not supported. + All commands are documented in `CONTRIBUTING.md`. Quick reference: - **Install deps:** `uv sync --group dev` diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index cce3a77..c7ae519 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -23,10 +23,8 @@ CLI with `pip install 'openrtc[cli]'` and the sidecar TUI with If you prefer, you can also install the package and dev dependencies with pip, but `uv` is the preferred workflow for contributors. -**Python 3.10:** newer `onnxruntime` releases (pulled in by LiveKit’s Silero / -turn-detector plugins) only ship wheels for CPython 3.11+. OpenRTC declares a -conditional dependency so 3.10 environments resolve `onnxruntime` 1.23.x instead. -If you still see resolver errors, use `uv sync --python 3.11` or newer. +**Python version:** OpenRTC requires **3.11+** (transitive `onnxruntime` from +LiveKit plugins does not support 3.10). ## Common development commands diff --git a/README.md b/README.md index 094992f..f85fb87 100644 --- a/README.md +++ b/README.md @@ -16,7 +16,7 @@ Run N LiveKit voice agents in one worker. Pay the model-load cost once.
License: MIT - Python Version + Python Version Ruff PyPI version codecov @@ -57,6 +57,10 @@ You already ship three voice agents with `livekit-agents`. Each agent is its own ## Installation +OpenRTC **requires Python 3.11 or newer**. The LiveKit Silero / turn-detector +plugins depend on `onnxruntime`, which does not ship supported wheels for +Python 3.10 in current releases—use 3.11+ to avoid install failures. + ```bash pip install openrtc ``` @@ -70,8 +74,6 @@ uv add openrtc uv add "openrtc[cli,tui]" ``` -On **CPython 3.10**, a conditional `onnxruntime` pin keeps resolution compatible with wheels (newer `onnxruntime` releases are 3.11+ only). Prefer **3.11+** if you hit resolver issues. - ```bash pip install 'openrtc[cli]' ``` diff --git a/docs/getting-started.md b/docs/getting-started.md index 582f42e..d22c45b 100644 --- a/docs/getting-started.md +++ b/docs/getting-started.md @@ -2,12 +2,11 @@ ## Requirements -OpenRTC currently supports Python `>=3.10,<3.14` and depends on -`livekit-agents[openai,silero,turn-detector]~=1.4`. On **Python 3.10** the -resolver keeps a compatible `onnxruntime` release (LiveKit’s Silero / -turn-detector stack depends on it); **3.11+** is the smoothest path if you see -install issues. See the repository’s `CONTRIBUTING.md` for `uv` workflows and -Python 3.10 notes. +OpenRTC requires Python **`>=3.11,<3.14`** and depends on +`livekit-agents[openai,silero,turn-detector]~=1.4`. **3.10 is not supported** +(LiveKit’s Silero / turn-detector stack pulls `onnxruntime`, which does not ship +wheels for CPython 3.10 in current releases). See the repository’s +`CONTRIBUTING.md` for `uv` workflows. ## Install diff --git a/pyproject.toml b/pyproject.toml index 4599862..f54fb53 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -13,20 +13,15 @@ classifiers = [ "Topic :: Multimedia :: Sound/Audio", "Topic :: Scientific/Engineering :: Artificial Intelligence", "Programming Language :: Python :: 3", - "Programming Language :: Python :: 3.10", "Programming Language :: Python :: 3.11", "Programming Language :: Python :: 3.12", "Programming Language :: Python :: 3.13", "Programming Language :: Python :: 3 :: Only", ] license = "MIT" -requires-python = ">=3.10,<3.14" +requires-python = ">=3.11,<3.14" dependencies = [ "livekit-agents[openai,silero,turn-detector]~=1.4", - # onnxruntime 1.24+ only publishes wheels for CPython 3.11+; LiveKit's - # turn-detector/silero stack still pulls it transitively. Pin the last - # 1.23.x line on Python 3.10 so `uv sync` / `uv add` can resolve wheels. - "onnxruntime>=1.23.2,<1.24; python_full_version < '3.11'", ] [project.optional-dependencies] @@ -87,7 +82,7 @@ ignore = [ "tests/conftest.py" = ["E402"] [tool.mypy] -python_version = "3.10" +python_version = "3.11" warn_return_any = true warn_unused_configs = true ignore_missing_imports = true diff --git a/uv.lock b/uv.lock index 9965113..5d18047 100644 --- a/uv.lock +++ b/uv.lock @@ -1,10 +1,9 @@ version = 1 revision = 3 -requires-python = ">=3.10, <3.14" +requires-python = ">=3.11, <3.14" resolution-markers = [ "python_full_version >= '3.13'", - "python_full_version >= '3.11' and python_full_version < '3.13'", - "python_full_version < '3.11'", + "python_full_version < '3.13'", ] [[package]] @@ -32,7 +31,6 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "aiohappyeyeballs" }, { name = "aiosignal" }, - { name = "async-timeout", marker = "python_full_version < '3.11'" }, { name = "attrs" }, { name = "frozenlist" }, { name = "multidict" }, @@ -41,23 +39,6 @@ dependencies = [ ] sdist = { url = "https://files.pythonhosted.org/packages/50/42/32cf8e7704ceb4481406eb87161349abb46a57fee3f008ba9cb610968646/aiohttp-3.13.3.tar.gz", hash = "sha256:a949eee43d3782f2daae4f4a2819b2cb9b0c5d3b7f7a927067cc84dafdbb9f88", size = 7844556, upload-time = "2026-01-03T17:33:05.204Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/36/d6/5aec9313ee6ea9c7cde8b891b69f4ff4001416867104580670a31daeba5b/aiohttp-3.13.3-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:d5a372fd5afd301b3a89582817fdcdb6c34124787c70dbcc616f259013e7eef7", size = 738950, upload-time = "2026-01-03T17:29:13.002Z" }, - { url = "https://files.pythonhosted.org/packages/68/03/8fa90a7e6d11ff20a18837a8e2b5dd23db01aabc475aa9271c8ad33299f5/aiohttp-3.13.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:147e422fd1223005c22b4fe080f5d93ced44460f5f9c105406b753612b587821", size = 496099, upload-time = "2026-01-03T17:29:15.268Z" }, - { url = "https://files.pythonhosted.org/packages/d2/23/b81f744d402510a8366b74eb420fc0cc1170d0c43daca12d10814df85f10/aiohttp-3.13.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:859bd3f2156e81dd01432f5849fc73e2243d4a487c4fd26609b1299534ee1845", size = 491072, upload-time = "2026-01-03T17:29:16.922Z" }, - { url = "https://files.pythonhosted.org/packages/d5/e1/56d1d1c0dd334cd203dd97706ce004c1aa24b34a813b0b8daf3383039706/aiohttp-3.13.3-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:dca68018bf48c251ba17c72ed479f4dafe9dbd5a73707ad8d28a38d11f3d42af", size = 1671588, upload-time = "2026-01-03T17:29:18.539Z" }, - { url = "https://files.pythonhosted.org/packages/5f/34/8d7f962604f4bc2b4e39eb1220dac7d4e4cba91fb9ba0474b4ecd67db165/aiohttp-3.13.3-cp310-cp310-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:fee0c6bc7db1de362252affec009707a17478a00ec69f797d23ca256e36d5940", size = 1640334, upload-time = "2026-01-03T17:29:21.028Z" }, - { url = "https://files.pythonhosted.org/packages/94/1d/fcccf2c668d87337ddeef9881537baee13c58d8f01f12ba8a24215f2b804/aiohttp-3.13.3-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:c048058117fd649334d81b4b526e94bde3ccaddb20463a815ced6ecbb7d11160", size = 1722656, upload-time = "2026-01-03T17:29:22.531Z" }, - { url = "https://files.pythonhosted.org/packages/aa/98/c6f3b081c4c606bc1e5f2ec102e87d6411c73a9ef3616fea6f2d5c98c062/aiohttp-3.13.3-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:215a685b6fbbfcf71dfe96e3eba7a6f58f10da1dfdf4889c7dd856abe430dca7", size = 1817625, upload-time = "2026-01-03T17:29:24.276Z" }, - { url = "https://files.pythonhosted.org/packages/2c/c0/cfcc3d2e11b477f86e1af2863f3858c8850d751ce8dc39c4058a072c9e54/aiohttp-3.13.3-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:de2c184bb1fe2cbd2cefba613e9db29a5ab559323f994b6737e370d3da0ac455", size = 1672604, upload-time = "2026-01-03T17:29:26.099Z" }, - { url = "https://files.pythonhosted.org/packages/1e/77/6b4ffcbcac4c6a5d041343a756f34a6dd26174ae07f977a64fe028dda5b0/aiohttp-3.13.3-cp310-cp310-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:75ca857eba4e20ce9f546cd59c7007b33906a4cd48f2ff6ccf1ccfc3b646f279", size = 1554370, upload-time = "2026-01-03T17:29:28.121Z" }, - { url = "https://files.pythonhosted.org/packages/f2/f0/e3ddfa93f17d689dbe014ba048f18e0c9f9b456033b70e94349a2e9048be/aiohttp-3.13.3-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:81e97251d9298386c2b7dbeb490d3d1badbdc69107fb8c9299dd04eb39bddc0e", size = 1642023, upload-time = "2026-01-03T17:29:30.002Z" }, - { url = "https://files.pythonhosted.org/packages/eb/45/c14019c9ec60a8e243d06d601b33dcc4fd92379424bde3021725859d7f99/aiohttp-3.13.3-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:c0e2d366af265797506f0283487223146af57815b388623f0357ef7eac9b209d", size = 1649680, upload-time = "2026-01-03T17:29:31.782Z" }, - { url = "https://files.pythonhosted.org/packages/9c/fd/09c9451dae5aa5c5ed756df95ff9ef549d45d4be663bafd1e4954fd836f0/aiohttp-3.13.3-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:4e239d501f73d6db1522599e14b9b321a7e3b1de66ce33d53a765d975e9f4808", size = 1692407, upload-time = "2026-01-03T17:29:33.392Z" }, - { url = "https://files.pythonhosted.org/packages/a6/81/938bc2ec33c10efd6637ccb3d22f9f3160d08e8f3aa2587a2c2d5ab578eb/aiohttp-3.13.3-cp310-cp310-musllinux_1_2_riscv64.whl", hash = "sha256:0db318f7a6f065d84cb1e02662c526294450b314a02bd9e2a8e67f0d8564ce40", size = 1543047, upload-time = "2026-01-03T17:29:34.855Z" }, - { url = "https://files.pythonhosted.org/packages/f7/23/80488ee21c8d567c83045e412e1d9b7077d27171591a4eb7822586e8c06a/aiohttp-3.13.3-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:bfc1cc2fe31a6026a8a88e4ecfb98d7f6b1fec150cfd708adbfd1d2f42257c29", size = 1715264, upload-time = "2026-01-03T17:29:36.389Z" }, - { url = "https://files.pythonhosted.org/packages/e2/83/259a8da6683182768200b368120ab3deff5370bed93880fb9a3a86299f34/aiohttp-3.13.3-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:af71fff7bac6bb7508956696dce8f6eec2bbb045eceb40343944b1ae62b5ef11", size = 1657275, upload-time = "2026-01-03T17:29:38.162Z" }, - { url = "https://files.pythonhosted.org/packages/3f/4f/2c41f800a0b560785c10fb316216ac058c105f9be50bdc6a285de88db625/aiohttp-3.13.3-cp310-cp310-win32.whl", hash = "sha256:37da61e244d1749798c151421602884db5270faf479cf0ef03af0ff68954c9dd", size = 434053, upload-time = "2026-01-03T17:29:40.074Z" }, - { url = "https://files.pythonhosted.org/packages/80/df/29cd63c7ecfdb65ccc12f7d808cac4fa2a19544660c06c61a4a48462de0c/aiohttp-3.13.3-cp310-cp310-win_amd64.whl", hash = "sha256:7e63f210bc1b57ef699035f2b4b6d9ce096b5914414a49b0997c839b2bd2223c", size = 456687, upload-time = "2026-01-03T17:29:41.819Z" }, { url = "https://files.pythonhosted.org/packages/f1/4c/a164164834f03924d9a29dc3acd9e7ee58f95857e0b467f6d04298594ebb/aiohttp-3.13.3-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:5b6073099fb654e0a068ae678b10feff95c5cae95bbfcbfa7af669d361a8aa6b", size = 746051, upload-time = "2026-01-03T17:29:43.287Z" }, { url = "https://files.pythonhosted.org/packages/82/71/d5c31390d18d4f58115037c432b7e0348c60f6f53b727cad33172144a112/aiohttp-3.13.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:1cb93e166e6c28716c8c6aeb5f99dfb6d5ccf482d29fe9bf9a794110e6d0ab64", size = 499234, upload-time = "2026-01-03T17:29:44.822Z" }, { url = "https://files.pythonhosted.org/packages/0e/c9/741f8ac91e14b1d2e7100690425a5b2b919a87a5075406582991fb7de920/aiohttp-3.13.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:28e027cf2f6b641693a09f631759b4d9ce9165099d2b5d92af9bd4e197690eea", size = 494979, upload-time = "2026-01-03T17:29:46.405Z" }, @@ -147,7 +128,6 @@ name = "anyio" version = "4.12.1" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "exceptiongroup", marker = "python_full_version < '3.11'" }, { name = "idna" }, { name = "typing-extensions", marker = "python_full_version < '3.13'" }, ] @@ -156,15 +136,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/38/0e/27be9fdef66e72d64c0cdc3cc2823101b80585f8119b5c112c2e8f5f7dab/anyio-4.12.1-py3-none-any.whl", hash = "sha256:d405828884fc140aa80a3c667b8beed277f1dfedec42ba031bd6ac3db606ab6c", size = 113592, upload-time = "2026-01-06T11:45:19.497Z" }, ] -[[package]] -name = "async-timeout" -version = "5.0.1" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/a5/ae/136395dfbfe00dfc94da3f3e136d0b13f394cba8f4841120e34226265780/async_timeout-5.0.1.tar.gz", hash = "sha256:d9321a7a3d5a6a5e187e824d2fa0793ce379a202935782d555d6e9d2735677d3", size = 9274, upload-time = "2024-11-06T16:41:39.6Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/fe/ba/e2081de779ca30d473f21f5b30e0e737c438205440784c7dfc81efc2b029/async_timeout-5.0.1-py3-none-any.whl", hash = "sha256:39e3809566ff85354557ec2398b55e096c8364bacac9405a7a1fa429e77fe76c", size = 6233, upload-time = "2024-11-06T16:41:37.9Z" }, -] - [[package]] name = "attrs" version = "26.1.0" @@ -180,13 +151,6 @@ version = "17.0.0" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/b2/eb/abca886df3a091bc406feb5ff71b4c4f426beaae6b71b9697264ce8c7211/av-17.0.0.tar.gz", hash = "sha256:c53685df73775a8763c375c7b2d62a6cb149d992a26a4b098204da42ade8c3df", size = 4410769, upload-time = "2026-03-14T14:38:45.868Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/95/4d/ea1ac272eeea83014daca1783679a9e9f894e1e68e5eb4f717dd8813da2a/av-17.0.0-cp310-cp310-macosx_11_0_x86_64.whl", hash = "sha256:4b21bcff4144acae658c0efb011fa8668c7a9638384f3ae7f5add33f35b907c6", size = 23407827, upload-time = "2026-03-14T14:37:47.337Z" }, - { url = "https://files.pythonhosted.org/packages/54/1a/e433766470c57c9c1c8558021de4d2466b3403ed629e48722d39d12baa6c/av-17.0.0-cp310-cp310-macosx_14_0_arm64.whl", hash = "sha256:17cd518fc88dc449ce9dcfd0b40e9b3530266927375a743efc80d510adfb188b", size = 18829899, upload-time = "2026-03-14T14:37:50.493Z" }, - { url = "https://files.pythonhosted.org/packages/5f/25/95ad714f950c188495ffbfef235d06a332123d6f266026a534801ffc2171/av-17.0.0-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:9a8b7b63a92d8dc7cbe5000546e4684176124ddd49fdd9c12570e3aa6dadf11a", size = 35348062, upload-time = "2026-03-14T14:37:52.964Z" }, - { url = "https://files.pythonhosted.org/packages/7a/db/7f3f9e92f2ac8dba639ab01d69a33b723aa16b5e3e612dbfe667fbc02dcd/av-17.0.0-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:8706ce9b5d8d087d093b46a9781e7532c4a9e13874bca1da468be78efc56cecc", size = 37684503, upload-time = "2026-03-14T14:37:55.628Z" }, - { url = "https://files.pythonhosted.org/packages/c1/53/3b356b14ba72354688c8d9777cf67b707769b6e14b63aaeb0cddeeac8d32/av-17.0.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:3a074835ce807434451086993fedfb3b223dacedb2119ab9d7a72480f2d77f32", size = 36547601, upload-time = "2026-03-14T14:37:58.465Z" }, - { url = "https://files.pythonhosted.org/packages/cd/8d/f489cd6f9fe9c8b38dca00ecb39dc38836761767a4ec07dd95e62e124ac3/av-17.0.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:f8ef8e8f1a0cbb2e0ad49266015e2277801a916e2186ac9451b493ff6dfdec27", size = 38815129, upload-time = "2026-03-14T14:38:01.277Z" }, - { url = "https://files.pythonhosted.org/packages/fb/bd/e42536234e37caffd1a054de1a0e6abca226c5686e9672726a8d95511422/av-17.0.0-cp310-cp310-win_amd64.whl", hash = "sha256:a795e153ff31a6430e974b4e6ad0d0fab695b78e3f17812293a0a34cd03ee6a9", size = 28984602, upload-time = "2026-03-14T14:38:03.632Z" }, { url = "https://files.pythonhosted.org/packages/b1/fb/55e3b5b5d1fc61466292f26fbcbabafa2642f378dc48875f8f554591e1a4/av-17.0.0-cp311-abi3-macosx_11_0_x86_64.whl", hash = "sha256:ed4013fac77c309a4a68141dcf6148f1821bb1073a36d4289379762a6372f711", size = 23238424, upload-time = "2026-03-14T14:38:05.856Z" }, { url = "https://files.pythonhosted.org/packages/52/03/9ace1acc08bc9ae38c14bf3a4b1360e995e4d999d1d33c2cbd7c9e77582a/av-17.0.0-cp311-abi3-macosx_14_0_arm64.whl", hash = "sha256:e44b6c83e9f3be9f79ee87d0b77a27cea9a9cd67bd630362c86b7e56a748dfbb", size = 18709043, upload-time = "2026-03-14T14:38:08.288Z" }, { url = "https://files.pythonhosted.org/packages/00/c0/637721f3cd5bb8bd16105a1a08efd781fc12f449931bdb3a4d0cfd63fa55/av-17.0.0-cp311-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:b440da6ac47da0629d509316f24bcd858f33158dbdd0f1b7293d71e99beb26de", size = 34018780, upload-time = "2026-03-14T14:38:10.45Z" }, @@ -197,15 +161,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/b0/bb/c5a4c4172c514d631fb506e6366b503576b8c7f29809cf42aca73e28ff01/av-17.0.0-cp311-abi3-win_arm64.whl", hash = "sha256:3d32e9b5c5bbcb872a0b6917b352a1db8a42142237826c9b49a36d5dbd9e9c26", size = 21916910, upload-time = "2026-03-14T14:38:23.706Z" }, ] -[[package]] -name = "backports-asyncio-runner" -version = "1.2.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/8e/ff/70dca7d7cb1cbc0edb2c6cc0c38b65cba36cccc491eca64cabd5fe7f8670/backports_asyncio_runner-1.2.0.tar.gz", hash = "sha256:a5aa7b2b7d8f8bfcaa2b57313f70792df84e32a2a746f585213373f900b42162", size = 69893, upload-time = "2025-07-02T02:27:15.685Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/a0/59/76ab57e3fe74484f48a53f8e337171b4a2349e506eabe136d7e01d059086/backports_asyncio_runner-1.2.0-py3-none-any.whl", hash = "sha256:0da0a936a8aeb554eccb426dc55af3ba63bcdc69fa1a600b5bb305413a4477b5", size = 12313, upload-time = "2025-07-02T02:27:14.263Z" }, -] - [[package]] name = "certifi" version = "2026.2.25" @@ -224,18 +179,6 @@ dependencies = [ ] sdist = { url = "https://files.pythonhosted.org/packages/eb/56/b1ba7935a17738ae8453301356628e8147c79dbb825bcbc73dc7401f9846/cffi-2.0.0.tar.gz", hash = "sha256:44d1b5909021139fe36001ae048dbdde8214afa20200eda0f64c068cac5d5529", size = 523588, upload-time = "2025-09-08T23:24:04.541Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/93/d7/516d984057745a6cd96575eea814fe1edd6646ee6efd552fb7b0921dec83/cffi-2.0.0-cp310-cp310-macosx_10_13_x86_64.whl", hash = "sha256:0cf2d91ecc3fcc0625c2c530fe004f82c110405f101548512cce44322fa8ac44", size = 184283, upload-time = "2025-09-08T23:22:08.01Z" }, - { url = "https://files.pythonhosted.org/packages/9e/84/ad6a0b408daa859246f57c03efd28e5dd1b33c21737c2db84cae8c237aa5/cffi-2.0.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:f73b96c41e3b2adedc34a7356e64c8eb96e03a3782b535e043a986276ce12a49", size = 180504, upload-time = "2025-09-08T23:22:10.637Z" }, - { url = "https://files.pythonhosted.org/packages/50/bd/b1a6362b80628111e6653c961f987faa55262b4002fcec42308cad1db680/cffi-2.0.0-cp310-cp310-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:53f77cbe57044e88bbd5ed26ac1d0514d2acf0591dd6bb02a3ae37f76811b80c", size = 208811, upload-time = "2025-09-08T23:22:12.267Z" }, - { url = "https://files.pythonhosted.org/packages/4f/27/6933a8b2562d7bd1fb595074cf99cc81fc3789f6a6c05cdabb46284a3188/cffi-2.0.0-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:3e837e369566884707ddaf85fc1744b47575005c0a229de3327f8f9a20f4efeb", size = 216402, upload-time = "2025-09-08T23:22:13.455Z" }, - { url = "https://files.pythonhosted.org/packages/05/eb/b86f2a2645b62adcfff53b0dd97e8dfafb5c8aa864bd0d9a2c2049a0d551/cffi-2.0.0-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:5eda85d6d1879e692d546a078b44251cdd08dd1cfb98dfb77b670c97cee49ea0", size = 203217, upload-time = "2025-09-08T23:22:14.596Z" }, - { url = "https://files.pythonhosted.org/packages/9f/e0/6cbe77a53acf5acc7c08cc186c9928864bd7c005f9efd0d126884858a5fe/cffi-2.0.0-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:9332088d75dc3241c702d852d4671613136d90fa6881da7d770a483fd05248b4", size = 203079, upload-time = "2025-09-08T23:22:15.769Z" }, - { url = "https://files.pythonhosted.org/packages/98/29/9b366e70e243eb3d14a5cb488dfd3a0b6b2f1fb001a203f653b93ccfac88/cffi-2.0.0-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:fc7de24befaeae77ba923797c7c87834c73648a05a4bde34b3b7e5588973a453", size = 216475, upload-time = "2025-09-08T23:22:17.427Z" }, - { url = "https://files.pythonhosted.org/packages/21/7a/13b24e70d2f90a322f2900c5d8e1f14fa7e2a6b3332b7309ba7b2ba51a5a/cffi-2.0.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:cf364028c016c03078a23b503f02058f1814320a56ad535686f90565636a9495", size = 218829, upload-time = "2025-09-08T23:22:19.069Z" }, - { url = "https://files.pythonhosted.org/packages/60/99/c9dc110974c59cc981b1f5b66e1d8af8af764e00f0293266824d9c4254bc/cffi-2.0.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:e11e82b744887154b182fd3e7e8512418446501191994dbf9c9fc1f32cc8efd5", size = 211211, upload-time = "2025-09-08T23:22:20.588Z" }, - { url = "https://files.pythonhosted.org/packages/49/72/ff2d12dbf21aca1b32a40ed792ee6b40f6dc3a9cf1644bd7ef6e95e0ac5e/cffi-2.0.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:8ea985900c5c95ce9db1745f7933eeef5d314f0565b27625d9a10ec9881e1bfb", size = 218036, upload-time = "2025-09-08T23:22:22.143Z" }, - { url = "https://files.pythonhosted.org/packages/e2/cc/027d7fb82e58c48ea717149b03bcadcbdc293553edb283af792bd4bcbb3f/cffi-2.0.0-cp310-cp310-win32.whl", hash = "sha256:1f72fb8906754ac8a2cc3f9f5aaa298070652a0ffae577e0ea9bd480dc3c931a", size = 172184, upload-time = "2025-09-08T23:22:23.328Z" }, - { url = "https://files.pythonhosted.org/packages/33/fa/072dd15ae27fbb4e06b437eb6e944e75b068deb09e2a2826039e49ee2045/cffi-2.0.0-cp310-cp310-win_amd64.whl", hash = "sha256:b18a3ed7d5b3bd8d9ef7a8cb226502c6bf8308df1525e1cc676c3680e7176739", size = 182790, upload-time = "2025-09-08T23:22:24.752Z" }, { url = "https://files.pythonhosted.org/packages/12/4a/3dfd5f7850cbf0d06dc84ba9aa00db766b52ca38d8b86e3a38314d52498c/cffi-2.0.0-cp311-cp311-macosx_10_13_x86_64.whl", hash = "sha256:b4c854ef3adc177950a8dfc81a86f5115d2abd545751a304c5bcf2c2c7283cfe", size = 184344, upload-time = "2025-09-08T23:22:26.456Z" }, { url = "https://files.pythonhosted.org/packages/4f/8b/f0e4c441227ba756aafbe78f117485b25bb26b1c059d01f137fa6d14896b/cffi-2.0.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:2de9a304e27f7596cd03d16f1b7c72219bd944e99cc52b84d0145aefb07cbd3c", size = 180560, upload-time = "2025-09-08T23:22:28.197Z" }, { url = "https://files.pythonhosted.org/packages/b1/b7/1200d354378ef52ec227395d95c2576330fd22a869f7a70e88e1447eb234/cffi-2.0.0-cp311-cp311-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:baf5215e0ab74c16e2dd324e8ec067ef59e41125d3eade2b863d294fd5035c92", size = 209613, upload-time = "2025-09-08T23:22:29.475Z" }, @@ -290,22 +233,6 @@ version = "3.4.6" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/7b/60/e3bec1881450851b087e301bedc3daa9377a4d45f1c26aa90b0b235e38aa/charset_normalizer-3.4.6.tar.gz", hash = "sha256:1ae6b62897110aa7c79ea2f5dd38d1abca6db663687c0b1ad9aed6f6bae3d9d6", size = 143363, upload-time = "2026-03-15T18:53:25.478Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/e6/8c/2c56124c6dc53a774d435f985b5973bc592f42d437be58c0c92d65ae7296/charset_normalizer-3.4.6-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:2e1d8ca8611099001949d1cdfaefc510cf0f212484fe7c565f735b68c78c3c95", size = 298751, upload-time = "2026-03-15T18:50:00.003Z" }, - { url = "https://files.pythonhosted.org/packages/86/2a/2a7db6b314b966a3bcad8c731c0719c60b931b931de7ae9f34b2839289ee/charset_normalizer-3.4.6-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e25369dc110d58ddf29b949377a93e0716d72a24f62bad72b2b39f155949c1fd", size = 200027, upload-time = "2026-03-15T18:50:01.702Z" }, - { url = "https://files.pythonhosted.org/packages/68/f2/0fe775c74ae25e2a3b07b01538fc162737b3e3f795bada3bc26f4d4d495c/charset_normalizer-3.4.6-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:259695e2ccc253feb2a016303543d691825e920917e31f894ca1a687982b1de4", size = 220741, upload-time = "2026-03-15T18:50:03.194Z" }, - { url = "https://files.pythonhosted.org/packages/10/98/8085596e41f00b27dd6aa1e68413d1ddda7e605f34dd546833c61fddd709/charset_normalizer-3.4.6-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:dda86aba335c902b6149a02a55b38e96287157e609200811837678214ba2b1db", size = 215802, upload-time = "2026-03-15T18:50:05.859Z" }, - { url = "https://files.pythonhosted.org/packages/fd/ce/865e4e09b041bad659d682bbd98b47fb490b8e124f9398c9448065f64fee/charset_normalizer-3.4.6-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:51fb3c322c81d20567019778cb5a4a6f2dc1c200b886bc0d636238e364848c89", size = 207908, upload-time = "2026-03-15T18:50:07.676Z" }, - { url = "https://files.pythonhosted.org/packages/a8/54/8c757f1f7349262898c2f169e0d562b39dcb977503f18fdf0814e923db78/charset_normalizer-3.4.6-cp310-cp310-manylinux_2_31_armv7l.whl", hash = "sha256:4482481cb0572180b6fd976a4d5c72a30263e98564da68b86ec91f0fe35e8565", size = 194357, upload-time = "2026-03-15T18:50:09.327Z" }, - { url = "https://files.pythonhosted.org/packages/6f/29/e88f2fac9218907fc7a70722b393d1bbe8334c61fe9c46640dba349b6e66/charset_normalizer-3.4.6-cp310-cp310-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:39f5068d35621da2881271e5c3205125cc456f54e9030d3f723288c873a71bf9", size = 205610, upload-time = "2026-03-15T18:50:10.732Z" }, - { url = "https://files.pythonhosted.org/packages/4c/c5/21d7bb0cb415287178450171d130bed9d664211fdd59731ed2c34267b07d/charset_normalizer-3.4.6-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:8bea55c4eef25b0b19a0337dc4e3f9a15b00d569c77211fa8cde38684f234fb7", size = 203512, upload-time = "2026-03-15T18:50:12.535Z" }, - { url = "https://files.pythonhosted.org/packages/a4/be/ce52f3c7fdb35cc987ad38a53ebcef52eec498f4fb6c66ecfe62cfe57ba2/charset_normalizer-3.4.6-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:f0cdaecd4c953bfae0b6bb64910aaaca5a424ad9c72d85cb88417bb9814f7550", size = 195398, upload-time = "2026-03-15T18:50:14.236Z" }, - { url = "https://files.pythonhosted.org/packages/81/a0/3ab5dd39d4859a3555e5dadfc8a9fa7f8352f8c183d1a65c90264517da0e/charset_normalizer-3.4.6-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:150b8ce8e830eb7ccb029ec9ca36022f756986aaaa7956aad6d9ec90089338c0", size = 221772, upload-time = "2026-03-15T18:50:15.581Z" }, - { url = "https://files.pythonhosted.org/packages/04/6e/6a4e41a97ba6b2fa87f849c41e4d229449a586be85053c4d90135fe82d26/charset_normalizer-3.4.6-cp310-cp310-musllinux_1_2_riscv64.whl", hash = "sha256:e68c14b04827dd76dcbd1aeea9e604e3e4b78322d8faf2f8132c7138efa340a8", size = 205759, upload-time = "2026-03-15T18:50:17.047Z" }, - { url = "https://files.pythonhosted.org/packages/db/3b/34a712a5ee64a6957bf355b01dc17b12de457638d436fdb05d01e463cd1c/charset_normalizer-3.4.6-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:3778fd7d7cd04ae8f54651f4a7a0bd6e39a0cf20f801720a4c21d80e9b7ad6b0", size = 216938, upload-time = "2026-03-15T18:50:18.44Z" }, - { url = "https://files.pythonhosted.org/packages/cb/05/5bd1e12da9ab18790af05c61aafd01a60f489778179b621ac2a305243c62/charset_normalizer-3.4.6-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:dad6e0f2e481fffdcf776d10ebee25e0ef89f16d691f1e5dee4b586375fdc64b", size = 210138, upload-time = "2026-03-15T18:50:19.852Z" }, - { url = "https://files.pythonhosted.org/packages/bd/8e/3cb9e2d998ff6b21c0a1860343cb7b83eba9cdb66b91410e18fc4969d6ab/charset_normalizer-3.4.6-cp310-cp310-win32.whl", hash = "sha256:74a2e659c7ecbc73562e2a15e05039f1e22c75b7c7618b4b574a3ea9118d1557", size = 144137, upload-time = "2026-03-15T18:50:21.505Z" }, - { url = "https://files.pythonhosted.org/packages/d8/8f/78f5489ffadb0db3eb7aff53d31c24531d33eb545f0c6f6567c25f49a5ff/charset_normalizer-3.4.6-cp310-cp310-win_amd64.whl", hash = "sha256:aa9cccf4a44b9b62d8ba8b4dd06c649ba683e4bf04eea606d2e94cfc2d6ff4d6", size = 154244, upload-time = "2026-03-15T18:50:22.81Z" }, - { url = "https://files.pythonhosted.org/packages/e4/74/e472659dffb0cadb2f411282d2d76c60da1fc94076d7fffed4ae8a93ec01/charset_normalizer-3.4.6-cp310-cp310-win_arm64.whl", hash = "sha256:e985a16ff513596f217cee86c21371b8cd011c0f6f056d0920aa2d926c544058", size = 143312, upload-time = "2026-03-15T18:50:24.074Z" }, { url = "https://files.pythonhosted.org/packages/62/28/ff6f234e628a2de61c458be2779cb182bc03f6eec12200d4a525bbfc9741/charset_normalizer-3.4.6-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:82060f995ab5003a2d6e0f4ad29065b7672b6593c8c63559beefe5b443242c3e", size = 293582, upload-time = "2026-03-15T18:50:25.454Z" }, { url = "https://files.pythonhosted.org/packages/1c/b7/b1a117e5385cbdb3205f6055403c2a2a220c5ea80b8716c324eaf75c5c95/charset_normalizer-3.4.6-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:60c74963d8350241a79cb8feea80e54d518f72c26db618862a8f53e5023deaf9", size = 197240, upload-time = "2026-03-15T18:50:27.196Z" }, { url = "https://files.pythonhosted.org/packages/a1/5f/2574f0f09f3c3bc1b2f992e20bce6546cb1f17e111c5be07308dc5427956/charset_normalizer-3.4.6-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:f6e4333fb15c83f7d1482a76d45a0818897b3d33f00efd215528ff7c51b8e35d", size = 217363, upload-time = "2026-03-15T18:50:28.601Z" }, @@ -378,38 +305,12 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6", size = 25335, upload-time = "2022-10-25T02:36:20.889Z" }, ] -[[package]] -name = "coloredlogs" -version = "15.0.1" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "humanfriendly", marker = "python_full_version < '3.11'" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/cc/c7/eed8f27100517e8c0e6b923d5f0845d0cb99763da6fdee00478f91db7325/coloredlogs-15.0.1.tar.gz", hash = "sha256:7c991aa71a4577af2f82600d8f8f3a89f936baeaf9b50a9c197da014e5bf16b0", size = 278520, upload-time = "2021-06-11T10:22:45.202Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/a7/06/3d6badcf13db419e25b07041d9c7b4a2c331d3f4e7134445ec5df57714cd/coloredlogs-15.0.1-py2.py3-none-any.whl", hash = "sha256:612ee75c546f53e92e70049c9dbfcc18c935a2b9a53b66085ce9ef6a6e5c0934", size = 46018, upload-time = "2021-06-11T10:22:42.561Z" }, -] - [[package]] name = "coverage" version = "7.13.5" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/9d/e0/70553e3000e345daff267cec284ce4cbf3fc141b6da229ac52775b5428f1/coverage-7.13.5.tar.gz", hash = "sha256:c81f6515c4c40141f83f502b07bbfa5c240ba25bbe73da7b33f1e5b6120ff179", size = 915967, upload-time = "2026-03-17T10:33:18.341Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/69/33/e8c48488c29a73fd089f9d71f9653c1be7478f2ad6b5bc870db11a55d23d/coverage-7.13.5-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e0723d2c96324561b9aa76fb982406e11d93cdb388a7a7da2b16e04719cf7ca5", size = 219255, upload-time = "2026-03-17T10:29:51.081Z" }, - { url = "https://files.pythonhosted.org/packages/da/bd/b0ebe9f677d7f4b74a3e115eec7ddd4bcf892074963a00d91e8b164a6386/coverage-7.13.5-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:52f444e86475992506b32d4e5ca55c24fc88d73bcbda0e9745095b28ef4dc0cf", size = 219772, upload-time = "2026-03-17T10:29:52.867Z" }, - { url = "https://files.pythonhosted.org/packages/48/cc/5cb9502f4e01972f54eedd48218bb203fe81e294be606a2bc93970208013/coverage-7.13.5-cp310-cp310-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:704de6328e3d612a8f6c07000a878ff38181ec3263d5a11da1db294fa6a9bdf8", size = 246532, upload-time = "2026-03-17T10:29:54.688Z" }, - { url = "https://files.pythonhosted.org/packages/7d/d8/3217636d86c7e7b12e126e4f30ef1581047da73140614523af7495ed5f2d/coverage-7.13.5-cp310-cp310-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:a1a6d79a14e1ec1832cabc833898636ad5f3754a678ef8bb4908515208bf84f4", size = 248333, upload-time = "2026-03-17T10:29:56.221Z" }, - { url = "https://files.pythonhosted.org/packages/2b/30/2002ac6729ba2d4357438e2ed3c447ad8562866c8c63fc16f6dfc33afe56/coverage-7.13.5-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:79060214983769c7ba3f0cee10b54c97609dca4d478fa1aa32b914480fd5738d", size = 250211, upload-time = "2026-03-17T10:29:57.938Z" }, - { url = "https://files.pythonhosted.org/packages/6c/85/552496626d6b9359eb0e2f86f920037c9cbfba09b24d914c6e1528155f7d/coverage-7.13.5-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:356e76b46783a98c2a2fe81ec79df4883a1e62895ea952968fb253c114e7f930", size = 252125, upload-time = "2026-03-17T10:29:59.388Z" }, - { url = "https://files.pythonhosted.org/packages/44/21/40256eabdcbccdb6acf6b381b3016a154399a75fe39d406f790ae84d1f3c/coverage-7.13.5-cp310-cp310-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:0cef0cdec915d11254a7f549c1170afecce708d30610c6abdded1f74e581666d", size = 247219, upload-time = "2026-03-17T10:30:01.199Z" }, - { url = "https://files.pythonhosted.org/packages/b1/e8/96e2a6c3f21a0ea77d7830b254a1542d0328acc8d7bdf6a284ba7e529f77/coverage-7.13.5-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:dc022073d063b25a402454e5712ef9e007113e3a676b96c5f29b2bda29352f40", size = 248248, upload-time = "2026-03-17T10:30:03.317Z" }, - { url = "https://files.pythonhosted.org/packages/da/ba/8477f549e554827da390ec659f3c38e4b6d95470f4daafc2d8ff94eaa9c2/coverage-7.13.5-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:9b74db26dfea4f4e50d48a4602207cd1e78be33182bc9cbf22da94f332f99878", size = 246254, upload-time = "2026-03-17T10:30:04.832Z" }, - { url = "https://files.pythonhosted.org/packages/55/59/bc22aef0e6aa179d5b1b001e8b3654785e9adf27ef24c93dc4228ebd5d68/coverage-7.13.5-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:ad146744ca4fd09b50c482650e3c1b1f4dfa1d4792e0a04a369c7f23336f0400", size = 250067, upload-time = "2026-03-17T10:30:06.535Z" }, - { url = "https://files.pythonhosted.org/packages/de/1b/c6a023a160806a5137dca53468fd97530d6acad24a22003b1578a9c2e429/coverage-7.13.5-cp310-cp310-musllinux_1_2_riscv64.whl", hash = "sha256:c555b48be1853fe3997c11c4bd521cdd9a9612352de01fa4508f16ec341e6fe0", size = 246521, upload-time = "2026-03-17T10:30:08.486Z" }, - { url = "https://files.pythonhosted.org/packages/2d/3f/3532c85a55aa2f899fa17c186f831cfa1aa434d88ff792a709636f64130e/coverage-7.13.5-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:7034b5c56a58ae5e85f23949d52c14aca2cfc6848a31764995b7de88f13a1ea0", size = 247126, upload-time = "2026-03-17T10:30:09.966Z" }, - { url = "https://files.pythonhosted.org/packages/aa/2e/b9d56af4a24ef45dfbcda88e06870cb7d57b2b0bfa3a888d79b4c8debd76/coverage-7.13.5-cp310-cp310-win32.whl", hash = "sha256:eb7fdf1ef130660e7415e0253a01a7d5a88c9c4d158bcf75cbbd922fd65a5b58", size = 221860, upload-time = "2026-03-17T10:30:11.393Z" }, - { url = "https://files.pythonhosted.org/packages/9f/cc/d938417e7a4d7f0433ad4edee8bb2acdc60dc7ac5af19e2a07a048ecbee3/coverage-7.13.5-cp310-cp310-win_amd64.whl", hash = "sha256:3e1bb5f6c78feeb1be3475789b14a0f0a5b47d505bfc7267126ccbd50289999e", size = 222788, upload-time = "2026-03-17T10:30:12.886Z" }, { url = "https://files.pythonhosted.org/packages/4b/37/d24c8f8220ff07b839b2c043ea4903a33b0f455abe673ae3c03bbdb7f212/coverage-7.13.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:66a80c616f80181f4d643b0f9e709d97bcea413ecd9631e1dedc7401c8e6695d", size = 219381, upload-time = "2026-03-17T10:30:14.68Z" }, { url = "https://files.pythonhosted.org/packages/35/8b/cd129b0ca4afe886a6ce9d183c44d8301acbd4ef248622e7c49a23145605/coverage-7.13.5-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:145ede53ccbafb297c1c9287f788d1bc3efd6c900da23bf6931b09eafc931587", size = 219880, upload-time = "2026-03-17T10:30:16.231Z" }, { url = "https://files.pythonhosted.org/packages/55/2f/e0e5b237bffdb5d6c530ce87cc1d413a5b7d7dfd60fb067ad6d254c35c76/coverage-7.13.5-cp311-cp311-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:0672854dc733c342fa3e957e0605256d2bf5934feeac328da9e0b5449634a642", size = 250303, upload-time = "2026-03-17T10:30:17.748Z" }, @@ -514,18 +415,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/cf/22/fdc2e30d43ff853720042fa15baa3e6122722be1a7950a98233ebb55cd71/eval_type_backport-0.3.1-py3-none-any.whl", hash = "sha256:279ab641905e9f11129f56a8a78f493518515b83402b860f6f06dd7c011fdfa8", size = 6063, upload-time = "2025-12-02T11:51:41.665Z" }, ] -[[package]] -name = "exceptiongroup" -version = "1.3.1" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "typing-extensions", marker = "python_full_version < '3.11'" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/50/79/66800aadf48771f6b62f7eb014e352e5d06856655206165d775e675a02c9/exceptiongroup-1.3.1.tar.gz", hash = "sha256:8b412432c6055b0b7d14c310000ae93352ed6754f70fa8f7c34141f91c4e3219", size = 30371, upload-time = "2025-11-21T23:01:54.787Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/8a/0e/97c33bf5009bdbac74fd2beace167cab3f978feb69cc36f1ef79360d6c4e/exceptiongroup-1.3.1-py3-none-any.whl", hash = "sha256:a7a39a3bd276781e98394987d3a5701d0c4edffb633bb7a5144577f82c773598", size = 16740, upload-time = "2025-11-21T23:01:53.443Z" }, -] - [[package]] name = "filelock" version = "3.25.2" @@ -549,22 +438,6 @@ version = "1.8.0" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/2d/f5/c831fac6cc817d26fd54c7eaccd04ef7e0288806943f7cc5bbf69f3ac1f0/frozenlist-1.8.0.tar.gz", hash = "sha256:3ede829ed8d842f6cd48fc7081d7a41001a56f1f38603f9d49bf3020d59a31ad", size = 45875, upload-time = "2025-10-06T05:38:17.865Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/83/4a/557715d5047da48d54e659203b9335be7bfaafda2c3f627b7c47e0b3aaf3/frozenlist-1.8.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:b37f6d31b3dcea7deb5e9696e529a6aa4a898adc33db82da12e4c60a7c4d2011", size = 86230, upload-time = "2025-10-06T05:35:23.699Z" }, - { url = "https://files.pythonhosted.org/packages/a2/fb/c85f9fed3ea8fe8740e5b46a59cc141c23b842eca617da8876cfce5f760e/frozenlist-1.8.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:ef2b7b394f208233e471abc541cc6991f907ffd47dc72584acee3147899d6565", size = 49621, upload-time = "2025-10-06T05:35:25.341Z" }, - { url = "https://files.pythonhosted.org/packages/63/70/26ca3f06aace16f2352796b08704338d74b6d1a24ca38f2771afbb7ed915/frozenlist-1.8.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a88f062f072d1589b7b46e951698950e7da00442fc1cacbe17e19e025dc327ad", size = 49889, upload-time = "2025-10-06T05:35:26.797Z" }, - { url = "https://files.pythonhosted.org/packages/5d/ed/c7895fd2fde7f3ee70d248175f9b6cdf792fb741ab92dc59cd9ef3bd241b/frozenlist-1.8.0-cp310-cp310-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:f57fb59d9f385710aa7060e89410aeb5058b99e62f4d16b08b91986b9a2140c2", size = 219464, upload-time = "2025-10-06T05:35:28.254Z" }, - { url = "https://files.pythonhosted.org/packages/6b/83/4d587dccbfca74cb8b810472392ad62bfa100bf8108c7223eb4c4fa2f7b3/frozenlist-1.8.0-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:799345ab092bee59f01a915620b5d014698547afd011e691a208637312db9186", size = 221649, upload-time = "2025-10-06T05:35:29.454Z" }, - { url = "https://files.pythonhosted.org/packages/6a/c6/fd3b9cd046ec5fff9dab66831083bc2077006a874a2d3d9247dea93ddf7e/frozenlist-1.8.0-cp310-cp310-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:c23c3ff005322a6e16f71bf8692fcf4d5a304aaafe1e262c98c6d4adc7be863e", size = 219188, upload-time = "2025-10-06T05:35:30.951Z" }, - { url = "https://files.pythonhosted.org/packages/ce/80/6693f55eb2e085fc8afb28cf611448fb5b90e98e068fa1d1b8d8e66e5c7d/frozenlist-1.8.0-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:8a76ea0f0b9dfa06f254ee06053d93a600865b3274358ca48a352ce4f0798450", size = 231748, upload-time = "2025-10-06T05:35:32.101Z" }, - { url = "https://files.pythonhosted.org/packages/97/d6/e9459f7c5183854abd989ba384fe0cc1a0fb795a83c033f0571ec5933ca4/frozenlist-1.8.0-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:c7366fe1418a6133d5aa824ee53d406550110984de7637d65a178010f759c6ef", size = 236351, upload-time = "2025-10-06T05:35:33.834Z" }, - { url = "https://files.pythonhosted.org/packages/97/92/24e97474b65c0262e9ecd076e826bfd1d3074adcc165a256e42e7b8a7249/frozenlist-1.8.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:13d23a45c4cebade99340c4165bd90eeb4a56c6d8a9d8aa49568cac19a6d0dc4", size = 218767, upload-time = "2025-10-06T05:35:35.205Z" }, - { url = "https://files.pythonhosted.org/packages/ee/bf/dc394a097508f15abff383c5108cb8ad880d1f64a725ed3b90d5c2fbf0bb/frozenlist-1.8.0-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:e4a3408834f65da56c83528fb52ce7911484f0d1eaf7b761fc66001db1646eff", size = 235887, upload-time = "2025-10-06T05:35:36.354Z" }, - { url = "https://files.pythonhosted.org/packages/40/90/25b201b9c015dbc999a5baf475a257010471a1fa8c200c843fd4abbee725/frozenlist-1.8.0-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:42145cd2748ca39f32801dad54aeea10039da6f86e303659db90db1c4b614c8c", size = 228785, upload-time = "2025-10-06T05:35:37.949Z" }, - { url = "https://files.pythonhosted.org/packages/84/f4/b5bc148df03082f05d2dd30c089e269acdbe251ac9a9cf4e727b2dbb8a3d/frozenlist-1.8.0-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:e2de870d16a7a53901e41b64ffdf26f2fbb8917b3e6ebf398098d72c5b20bd7f", size = 230312, upload-time = "2025-10-06T05:35:39.178Z" }, - { url = "https://files.pythonhosted.org/packages/db/4b/87e95b5d15097c302430e647136b7d7ab2398a702390cf4c8601975709e7/frozenlist-1.8.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:20e63c9493d33ee48536600d1a5c95eefc870cd71e7ab037763d1fbb89cc51e7", size = 217650, upload-time = "2025-10-06T05:35:40.377Z" }, - { url = "https://files.pythonhosted.org/packages/e5/70/78a0315d1fea97120591a83e0acd644da638c872f142fd72a6cebee825f3/frozenlist-1.8.0-cp310-cp310-win32.whl", hash = "sha256:adbeebaebae3526afc3c96fad434367cafbfd1b25d72369a9e5858453b1bb71a", size = 39659, upload-time = "2025-10-06T05:35:41.863Z" }, - { url = "https://files.pythonhosted.org/packages/66/aa/3f04523fb189a00e147e60c5b2205126118f216b0aa908035c45336e27e4/frozenlist-1.8.0-cp310-cp310-win_amd64.whl", hash = "sha256:667c3777ca571e5dbeb76f331562ff98b957431df140b54c85fd4d52eea8d8f6", size = 43837, upload-time = "2025-10-06T05:35:43.205Z" }, - { url = "https://files.pythonhosted.org/packages/39/75/1135feecdd7c336938bd55b4dc3b0dfc46d85b9be12ef2628574b28de776/frozenlist-1.8.0-cp310-cp310-win_arm64.whl", hash = "sha256:80f85f0a7cc86e7a54c46d99c9e1318ff01f4687c172ede30fd52d19d1da1c8e", size = 39989, upload-time = "2025-10-06T05:35:44.596Z" }, { url = "https://files.pythonhosted.org/packages/bc/03/077f869d540370db12165c0aa51640a873fb661d8b315d1d4d67b284d7ac/frozenlist-1.8.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:09474e9831bc2b2199fad6da3c14c7b0fbdd377cce9d3d77131be28906cb7d84", size = 86912, upload-time = "2025-10-06T05:35:45.98Z" }, { url = "https://files.pythonhosted.org/packages/df/b5/7610b6bd13e4ae77b96ba85abea1c8cb249683217ef09ac9e0ae93f25a91/frozenlist-1.8.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:17c883ab0ab67200b5f964d2b9ed6b00971917d5d8a92df149dc2c9779208ee9", size = 50046, upload-time = "2025-10-06T05:35:47.009Z" }, { url = "https://files.pythonhosted.org/packages/6e/ef/0e8f1fe32f8a53dd26bdd1f9347efe0778b0fddf62789ea683f4cc7d787d/frozenlist-1.8.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:fa47e444b8ba08fffd1c18e8cdb9a75db1b6a27f17507522834ad13ed5922b93", size = 50119, upload-time = "2025-10-06T05:35:48.38Z" }, @@ -662,16 +535,6 @@ dependencies = [ ] sdist = { url = "https://files.pythonhosted.org/packages/06/8a/3d098f35c143a89520e568e6539cc098fcd294495910e359889ce8741c84/grpcio-1.78.0.tar.gz", hash = "sha256:7382b95189546f375c174f53a5fa873cef91c4b8005faa05cc5b3beea9c4f1c5", size = 12852416, upload-time = "2026-02-06T09:57:18.093Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/5a/a8/690a085b4d1fe066130de97a87de32c45062cf2ecd218df9675add895550/grpcio-1.78.0-cp310-cp310-linux_armv7l.whl", hash = "sha256:7cc47943d524ee0096f973e1081cb8f4f17a4615f2116882a5f1416e4cfe92b5", size = 5946986, upload-time = "2026-02-06T09:54:34.043Z" }, - { url = "https://files.pythonhosted.org/packages/c7/1b/e5213c5c0ced9d2d92778d30529ad5bb2dcfb6c48c4e2d01b1f302d33d64/grpcio-1.78.0-cp310-cp310-macosx_11_0_universal2.whl", hash = "sha256:c3f293fdc675ccba4db5a561048cca627b5e7bd1c8a6973ffedabe7d116e22e2", size = 11816533, upload-time = "2026-02-06T09:54:37.04Z" }, - { url = "https://files.pythonhosted.org/packages/18/37/1ba32dccf0a324cc5ace744c44331e300b000a924bf14840f948c559ede7/grpcio-1.78.0-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:10a9a644b5dd5aec3b82b5b0b90d41c0fa94c85ef42cb42cf78a23291ddb5e7d", size = 6519964, upload-time = "2026-02-06T09:54:40.268Z" }, - { url = "https://files.pythonhosted.org/packages/ed/f5/c0e178721b818072f2e8b6fde13faaba942406c634009caf065121ce246b/grpcio-1.78.0-cp310-cp310-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:4c5533d03a6cbd7f56acfc9cfb44ea64f63d29091e40e44010d34178d392d7eb", size = 7198058, upload-time = "2026-02-06T09:54:42.389Z" }, - { url = "https://files.pythonhosted.org/packages/5b/b2/40d43c91ae9cd667edc960135f9f08e58faa1576dc95af29f66ec912985f/grpcio-1.78.0-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:ff870aebe9a93a85283837801d35cd5f8814fe2ad01e606861a7fb47c762a2b7", size = 6727212, upload-time = "2026-02-06T09:54:44.91Z" }, - { url = "https://files.pythonhosted.org/packages/ed/88/9da42eed498f0efcfcd9156e48ae63c0cde3bea398a16c99fb5198c885b6/grpcio-1.78.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:391e93548644e6b2726f1bb84ed60048d4bcc424ce5e4af0843d28ca0b754fec", size = 7300845, upload-time = "2026-02-06T09:54:47.562Z" }, - { url = "https://files.pythonhosted.org/packages/23/3f/1c66b7b1b19a8828890e37868411a6e6925df5a9030bfa87ab318f34095d/grpcio-1.78.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:df2c8f3141f7cbd112a6ebbd760290b5849cda01884554f7c67acc14e7b1758a", size = 8284605, upload-time = "2026-02-06T09:54:50.475Z" }, - { url = "https://files.pythonhosted.org/packages/94/c4/ca1bd87394f7b033e88525384b4d1e269e8424ab441ea2fba1a0c5b50986/grpcio-1.78.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:bd8cb8026e5f5b50498a3c4f196f57f9db344dad829ffae16b82e4fdbaea2813", size = 7726672, upload-time = "2026-02-06T09:54:53.11Z" }, - { url = "https://files.pythonhosted.org/packages/41/09/f16e487d4cc65ccaf670f6ebdd1a17566b965c74fc3d93999d3b2821e052/grpcio-1.78.0-cp310-cp310-win32.whl", hash = "sha256:f8dff3d9777e5d2703a962ee5c286c239bf0ba173877cc68dc02c17d042e29de", size = 4076715, upload-time = "2026-02-06T09:54:55.549Z" }, - { url = "https://files.pythonhosted.org/packages/2a/32/4ce60d94e242725fd3bcc5673c04502c82a8e87b21ea411a63992dc39f8f/grpcio-1.78.0-cp310-cp310-win_amd64.whl", hash = "sha256:94f95cf5d532d0e717eed4fc1810e8e6eded04621342ec54c89a7c2f14b581bf", size = 4799157, upload-time = "2026-02-06T09:54:59.838Z" }, { url = "https://files.pythonhosted.org/packages/86/c7/d0b780a29b0837bf4ca9580904dfb275c1fc321ded7897d620af7047ec57/grpcio-1.78.0-cp311-cp311-linux_armv7l.whl", hash = "sha256:2777b783f6c13b92bd7b716667452c329eefd646bfb3f2e9dabea2e05dbd34f6", size = 5951525, upload-time = "2026-02-06T09:55:01.989Z" }, { url = "https://files.pythonhosted.org/packages/c5/b1/96920bf2ee61df85a9503cb6f733fe711c0ff321a5a697d791b075673281/grpcio-1.78.0-cp311-cp311-macosx_11_0_universal2.whl", hash = "sha256:9dca934f24c732750389ce49d638069c3892ad065df86cb465b3fa3012b70c9e", size = 11830418, upload-time = "2026-02-06T09:55:04.462Z" }, { url = "https://files.pythonhosted.org/packages/83/0c/7c1528f098aeb75a97de2bae18c530f56959fb7ad6c882db45d9884d6edc/grpcio-1.78.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:459ab414b35f4496138d0ecd735fed26f1318af5e52cb1efbc82a09f0d5aa911", size = 6524477, upload-time = "2026-02-06T09:55:07.111Z" }, @@ -784,18 +647,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/a8/af/48ac8483240de756d2438c380746e7130d1c6f75802ef22f3c6d49982787/huggingface_hub-0.36.2-py3-none-any.whl", hash = "sha256:48f0c8eac16145dfce371e9d2d7772854a4f591bcb56c9cf548accf531d54270", size = 566395, upload-time = "2026-02-06T09:24:11.133Z" }, ] -[[package]] -name = "humanfriendly" -version = "10.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "pyreadline3", marker = "python_full_version < '3.11' and sys_platform == 'win32'" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/cc/3f/2c29224acb2e2df4d2046e4c73ee2662023c58ff5b113c4c1adac0886c43/humanfriendly-10.0.tar.gz", hash = "sha256:6b0b831ce8f15f7300721aa49829fc4e83921a9a301cc7f606be6686a2288ddc", size = 360702, upload-time = "2021-09-17T21:40:43.31Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/f0/0f/310fb31e39e2d734ccaa2c0fb981ee41f7bd5056ce9bc29b2248bd569169/humanfriendly-10.0-py2.py3-none-any.whl", hash = "sha256:1697e1a8a8f550fd43c2865cd84542fc175a61dcb779b6fee18cf6b6ccba1477", size = 86794, upload-time = "2021-09-17T21:40:39.897Z" }, -] - [[package]] name = "identify" version = "2.6.18" @@ -853,18 +704,6 @@ version = "0.13.0" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/0d/5e/4ec91646aee381d01cdb9974e30882c9cd3b8c5d1079d6b5ff4af522439a/jiter-0.13.0.tar.gz", hash = "sha256:f2839f9c2c7e2dffc1bc5929a510e14ce0a946be9365fd1219e7ef342dae14f4", size = 164847, upload-time = "2026-02-02T12:37:56.441Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/d0/5a/41da76c5ea07bec1b0472b6b2fdb1b651074d504b19374d7e130e0cdfb25/jiter-0.13.0-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:2ffc63785fd6c7977defe49b9824ae6ce2b2e2b77ce539bdaf006c26da06342e", size = 311164, upload-time = "2026-02-02T12:35:17.688Z" }, - { url = "https://files.pythonhosted.org/packages/40/cb/4a1bf994a3e869f0d39d10e11efb471b76d0ad70ecbfb591427a46c880c2/jiter-0.13.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:4a638816427006c1e3f0013eb66d391d7a3acda99a7b0cf091eff4497ccea33a", size = 320296, upload-time = "2026-02-02T12:35:19.828Z" }, - { url = "https://files.pythonhosted.org/packages/09/82/acd71ca9b50ecebadc3979c541cd717cce2fe2bc86236f4fa597565d8f1a/jiter-0.13.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:19928b5d1ce0ff8c1ee1b9bdef3b5bfc19e8304f1b904e436caf30bc15dc6cf5", size = 352742, upload-time = "2026-02-02T12:35:21.258Z" }, - { url = "https://files.pythonhosted.org/packages/71/03/d1fc996f3aecfd42eb70922edecfb6dd26421c874503e241153ad41df94f/jiter-0.13.0-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:309549b778b949d731a2f0e1594a3f805716be704a73bf3ad9a807eed5eb5721", size = 363145, upload-time = "2026-02-02T12:35:24.653Z" }, - { url = "https://files.pythonhosted.org/packages/f1/61/a30492366378cc7a93088858f8991acd7d959759fe6138c12a4644e58e81/jiter-0.13.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:bcdabaea26cb04e25df3103ce47f97466627999260290349a88c8136ecae0060", size = 487683, upload-time = "2026-02-02T12:35:26.162Z" }, - { url = "https://files.pythonhosted.org/packages/20/4e/4223cffa9dbbbc96ed821c5aeb6bca510848c72c02086d1ed3f1da3d58a7/jiter-0.13.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a3a377af27b236abbf665a69b2bdd680e3b5a0bd2af825cd3b81245279a7606c", size = 373579, upload-time = "2026-02-02T12:35:27.582Z" }, - { url = "https://files.pythonhosted.org/packages/fe/c9/b0489a01329ab07a83812d9ebcffe7820a38163c6d9e7da644f926ff877c/jiter-0.13.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fe49d3ff6db74321f144dff9addd4a5874d3105ac5ba7c5b77fac099cfae31ae", size = 362904, upload-time = "2026-02-02T12:35:28.925Z" }, - { url = "https://files.pythonhosted.org/packages/05/af/53e561352a44afcba9a9bc67ee1d320b05a370aed8df54eafe714c4e454d/jiter-0.13.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2113c17c9a67071b0f820733c0893ed1d467b5fcf4414068169e5c2cabddb1e2", size = 392380, upload-time = "2026-02-02T12:35:30.385Z" }, - { url = "https://files.pythonhosted.org/packages/76/2a/dd805c3afb8ed5b326c5ae49e725d1b1255b9754b1b77dbecdc621b20773/jiter-0.13.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:ab1185ca5c8b9491b55ebf6c1e8866b8f68258612899693e24a92c5fdb9455d5", size = 517939, upload-time = "2026-02-02T12:35:31.865Z" }, - { url = "https://files.pythonhosted.org/packages/20/2a/7b67d76f55b8fe14c937e7640389612f05f9a4145fc28ae128aaa5e62257/jiter-0.13.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:9621ca242547edc16400981ca3231e0c91c0c4c1ab8573a596cd9bb3575d5c2b", size = 551696, upload-time = "2026-02-02T12:35:33.306Z" }, - { url = "https://files.pythonhosted.org/packages/85/9c/57cdd64dac8f4c6ab8f994fe0eb04dc9fd1db102856a4458fcf8a99dfa62/jiter-0.13.0-cp310-cp310-win32.whl", hash = "sha256:a7637d92b1c9d7a771e8c56f445c7f84396d48f2e756e5978840ecba2fac0894", size = 204592, upload-time = "2026-02-02T12:35:34.58Z" }, - { url = "https://files.pythonhosted.org/packages/a7/38/f4f3ea5788b8a5bae7510a678cdc747eda0c45ffe534f9878ff37e7cf3b3/jiter-0.13.0-cp310-cp310-win_amd64.whl", hash = "sha256:c1b609e5cbd2f52bb74fb721515745b407df26d7b800458bd97cb3b972c29e7d", size = 206016, upload-time = "2026-02-02T12:35:36.435Z" }, { url = "https://files.pythonhosted.org/packages/71/29/499f8c9eaa8a16751b1c0e45e6f5f1761d180da873d417996cc7bddc8eef/jiter-0.13.0-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:ea026e70a9a28ebbdddcbcf0f1323128a8db66898a06eaad3a4e62d2f554d096", size = 311157, upload-time = "2026-02-02T12:35:37.758Z" }, { url = "https://files.pythonhosted.org/packages/50/f6/566364c777d2ab450b92100bea11333c64c38d32caf8dc378b48e5b20c46/jiter-0.13.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:66aa3e663840152d18cc8ff1e4faad3dd181373491b9cfdc6004b92198d67911", size = 319729, upload-time = "2026-02-02T12:35:39.246Z" }, { url = "https://files.pythonhosted.org/packages/73/dd/560f13ec5e4f116d8ad2658781646cca91b617ae3b8758d4a5076b278f70/jiter-0.13.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c3524798e70655ff19aec58c7d05adb1f074fecff62da857ea9be2b908b6d701", size = 354766, upload-time = "2026-02-02T12:35:40.662Z" }, @@ -925,18 +764,6 @@ version = "0.8.1" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/56/9c/b4b0c54d84da4a94b37bd44151e46d5e583c9534c7e02250b961b1b6d8a8/librt-0.8.1.tar.gz", hash = "sha256:be46a14693955b3bd96014ccbdb8339ee8c9346fbe11c1b78901b55125f14c73", size = 177471, upload-time = "2026-02-17T16:13:06.101Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/7c/5f/63f5fa395c7a8a93558c0904ba8f1c8d1b997ca6a3de61bc7659970d66bf/librt-0.8.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:81fd938344fecb9373ba1b155968c8a329491d2ce38e7ddb76f30ffb938f12dc", size = 65697, upload-time = "2026-02-17T16:11:06.903Z" }, - { url = "https://files.pythonhosted.org/packages/ff/e0/0472cf37267b5920eff2f292ccfaede1886288ce35b7f3203d8de00abfe6/librt-0.8.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:5db05697c82b3a2ec53f6e72b2ed373132b0c2e05135f0696784e97d7f5d48e7", size = 68376, upload-time = "2026-02-17T16:11:08.395Z" }, - { url = "https://files.pythonhosted.org/packages/c8/be/8bd1359fdcd27ab897cd5963294fa4a7c83b20a8564678e4fd12157e56a5/librt-0.8.1-cp310-cp310-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:d56bc4011975f7460bea7b33e1ff425d2f1adf419935ff6707273c77f8a4ada6", size = 197084, upload-time = "2026-02-17T16:11:09.774Z" }, - { url = "https://files.pythonhosted.org/packages/e2/fe/163e33fdd091d0c2b102f8a60cc0a61fd730ad44e32617cd161e7cd67a01/librt-0.8.1-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5cdc0f588ff4b663ea96c26d2a230c525c6fc62b28314edaaaca8ed5af931ad0", size = 207337, upload-time = "2026-02-17T16:11:11.311Z" }, - { url = "https://files.pythonhosted.org/packages/01/99/f85130582f05dcf0c8902f3d629270231d2f4afdfc567f8305a952ac7f14/librt-0.8.1-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:97c2b54ff6717a7a563b72627990bec60d8029df17df423f0ed37d56a17a176b", size = 219980, upload-time = "2026-02-17T16:11:12.499Z" }, - { url = "https://files.pythonhosted.org/packages/6f/54/cb5e4d03659e043a26c74e08206412ac9a3742f0477d96f9761a55313b5f/librt-0.8.1-cp310-cp310-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:8f1125e6bbf2f1657d9a2f3ccc4a2c9b0c8b176965bb565dd4d86be67eddb4b6", size = 212921, upload-time = "2026-02-17T16:11:14.484Z" }, - { url = "https://files.pythonhosted.org/packages/b1/81/a3a01e4240579c30f3487f6fed01eb4bc8ef0616da5b4ebac27ca19775f3/librt-0.8.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:8f4bb453f408137d7581be309b2fbc6868a80e7ef60c88e689078ee3a296ae71", size = 221381, upload-time = "2026-02-17T16:11:17.459Z" }, - { url = "https://files.pythonhosted.org/packages/08/b0/fc2d54b4b1c6fb81e77288ff31ff25a2c1e62eaef4424a984f228839717b/librt-0.8.1-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:c336d61d2fe74a3195edc1646d53ff1cddd3a9600b09fa6ab75e5514ba4862a7", size = 216714, upload-time = "2026-02-17T16:11:19.197Z" }, - { url = "https://files.pythonhosted.org/packages/96/96/85daa73ffbd87e1fb287d7af6553ada66bf25a2a6b0de4764344a05469f6/librt-0.8.1-cp310-cp310-musllinux_1_2_riscv64.whl", hash = "sha256:eb5656019db7c4deacf0c1a55a898c5bb8f989be904597fcb5232a2f4828fa05", size = 214777, upload-time = "2026-02-17T16:11:20.443Z" }, - { url = "https://files.pythonhosted.org/packages/12/9c/c3aa7a2360383f4bf4f04d98195f2739a579128720c603f4807f006a4225/librt-0.8.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:c25d9e338d5bed46c1632f851babf3d13c78f49a225462017cf5e11e845c5891", size = 237398, upload-time = "2026-02-17T16:11:22.083Z" }, - { url = "https://files.pythonhosted.org/packages/61/19/d350ea89e5274665185dabc4bbb9c3536c3411f862881d316c8b8e00eb66/librt-0.8.1-cp310-cp310-win32.whl", hash = "sha256:aaab0e307e344cb28d800957ef3ec16605146ef0e59e059a60a176d19543d1b7", size = 54285, upload-time = "2026-02-17T16:11:23.27Z" }, - { url = "https://files.pythonhosted.org/packages/4f/d6/45d587d3d41c112e9543a0093d883eb57a24a03e41561c127818aa2a6bcc/librt-0.8.1-cp310-cp310-win_amd64.whl", hash = "sha256:56e04c14b696300d47b3bc5f1d10a00e86ae978886d0cee14e5714fafb5df5d2", size = 61352, upload-time = "2026-02-17T16:11:24.207Z" }, { url = "https://files.pythonhosted.org/packages/1d/01/0e748af5e4fee180cf7cd12bd12b0513ad23b045dccb2a83191bde82d168/librt-0.8.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:681dc2451d6d846794a828c16c22dc452d924e9f700a485b7ecb887a30aad1fd", size = 65315, upload-time = "2026-02-17T16:11:25.152Z" }, { url = "https://files.pythonhosted.org/packages/9d/4d/7184806efda571887c798d573ca4134c80ac8642dcdd32f12c31b939c595/librt-0.8.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:a3b4350b13cc0e6f5bec8fa7caf29a8fb8cdc051a3bae45cfbfd7ce64f009965", size = 68021, upload-time = "2026-02-17T16:11:26.129Z" }, { url = "https://files.pythonhosted.org/packages/ae/88/c3c52d2a5d5101f28d3dc89298444626e7874aa904eed498464c2af17627/librt-0.8.1-cp311-cp311-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:ac1e7817fd0ed3d14fd7c5df91daed84c48e4c2a11ee99c0547f9f62fdae13da", size = 194500, upload-time = "2026-02-17T16:11:27.177Z" }, @@ -996,8 +823,7 @@ version = "1.0.25" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "aiofiles" }, - { name = "numpy", version = "2.2.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, - { name = "numpy", version = "2.4.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, + { name = "numpy" }, { name = "protobuf" }, { name = "types-protobuf" }, ] @@ -1028,8 +854,7 @@ dependencies = [ { name = "livekit-blingfire" }, { name = "livekit-protocol" }, { name = "nest-asyncio" }, - { name = "numpy", version = "2.2.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, - { name = "numpy", version = "2.4.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, + { name = "numpy" }, { name = "openai" }, { name = "opentelemetry-api" }, { name = "opentelemetry-exporter-otlp" }, @@ -1052,8 +877,7 @@ wheels = [ [package.optional-dependencies] codecs = [ - { name = "numpy", version = "2.2.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, - { name = "numpy", version = "2.4.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, + { name = "numpy" }, ] images = [ { name = "pillow" }, @@ -1089,11 +913,6 @@ name = "livekit-blingfire" version = "1.1.0" source = { registry = "https://pypi.org/simple" } wheels = [ - { url = "https://files.pythonhosted.org/packages/5e/0e/e1d79fb428ad43396da2ee4217ae043e42d75b4270e97e76d20c9d17438d/livekit_blingfire-1.1.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:fb8f6a9e69b0e58abd913e0b3b5f27bd79ae498887a9e6708c2255a6841a3f1b", size = 152217, upload-time = "2025-12-16T00:47:59.429Z" }, - { url = "https://files.pythonhosted.org/packages/d3/e6/d881bc1bf61f4bd71df7b52e89a523b4046913977794dac2d2f0453151c2/livekit_blingfire-1.1.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:610a7ef7b1c81be587c41241cbdac474f8461345ee066330c69f7c460f81e7e0", size = 147320, upload-time = "2025-12-16T00:48:00.553Z" }, - { url = "https://files.pythonhosted.org/packages/db/81/714a5a4cc742856cf2077ac3851d943c2a4accb4ec76d291c9d8f96fe9d5/livekit_blingfire-1.1.0-cp310-cp310-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4bf808159597d402415ae06cbb87e8cc8c2a58d2448e0fcd0ae3cf14b114f395", size = 165503, upload-time = "2025-12-16T00:48:01.818Z" }, - { url = "https://files.pythonhosted.org/packages/35/c9/fb8ca3881dcbea2d04cc8995e501a67a450fc93cda3ec4638608030b22f1/livekit_blingfire-1.1.0-cp310-cp310-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8e9fd97f49831c34065f8db3b1407e95c6c3353f0c35b6fff78547582d3d5278", size = 173081, upload-time = "2025-12-16T00:48:03.522Z" }, - { url = "https://files.pythonhosted.org/packages/40/2b/98ba07aae81eb87d426d2bf57426a0861f3f39c41c4d15158612c1d41fc5/livekit_blingfire-1.1.0-cp310-cp310-win_amd64.whl", hash = "sha256:e747443f3b21999ec1d6d96c2f128dc8375937795dc7bedd8fa7b2a7e54d341c", size = 129305, upload-time = "2025-12-16T00:48:04.74Z" }, { url = "https://files.pythonhosted.org/packages/fc/09/1095ace608a41810d5c0f343eff36154505487c415acd9c653a882ff2cf1/livekit_blingfire-1.1.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:0358058ba6cba59379d22a01acef6ff8a729b0facf880c0f75d13c26f1315c9d", size = 153650, upload-time = "2025-12-16T00:48:05.976Z" }, { url = "https://files.pythonhosted.org/packages/80/a5/f4eb0e5d97334581440d37ced2a1db4fdfc8454c641c7c144e858012f1ce/livekit_blingfire-1.1.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:a0741a8abcfaa1f3af2313271f15ac0f79777681a8e3ab9a782a68d8eb121c89", size = 148628, upload-time = "2025-12-16T00:48:06.998Z" }, { url = "https://files.pythonhosted.org/packages/89/f9/dc5ad008cb8b9c2a300bb7f7d44f022cd4970a32707eb90358290a07f0e1/livekit_blingfire-1.1.0-cp311-cp311-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d99d7a34c9350da3a6ea738bc282a5f5b4ac4ffb7f8aa5251dfa96070ad845f6", size = 166832, upload-time = "2025-12-16T00:48:07.919Z" }, @@ -1130,10 +949,8 @@ version = "1.5.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "livekit-agents" }, - { name = "numpy", version = "2.2.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, - { name = "numpy", version = "2.4.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, - { name = "onnxruntime", version = "1.23.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, - { name = "onnxruntime", version = "1.24.4", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, + { name = "numpy" }, + { name = "onnxruntime" }, ] sdist = { url = "https://files.pythonhosted.org/packages/aa/35/6d01bce8b13dfd49531b496ee1af63c85374d8b59cfea82152da764ada14/livekit_plugins_silero-1.5.0.tar.gz", hash = "sha256:c2eed08b5c3ab1f6cbf4c7c645f355c2888b66cf194dd9620e3dd74257a527d8", size = 1955569, upload-time = "2026-03-19T17:01:38.43Z" } wheels = [ @@ -1147,10 +964,8 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "jinja2" }, { name = "livekit-agents" }, - { name = "numpy", version = "2.2.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, - { name = "numpy", version = "2.4.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, - { name = "onnxruntime", version = "1.23.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, - { name = "onnxruntime", version = "1.24.4", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, + { name = "numpy" }, + { name = "onnxruntime" }, { name = "transformers" }, ] sdist = { url = "https://files.pythonhosted.org/packages/05/ac/6615cd40c51e00ef36401e885dbccd3b5f5a0b959b90cd9975eb7c1a7161/livekit_plugins_turn_detector-1.5.0.tar.gz", hash = "sha256:e10d3d2c09c3c34cfe1b385c163fc60400d51582c8e35128b6493eb4a6919fa4", size = 8662, upload-time = "2026-03-19T17:02:28.783Z" } @@ -1197,17 +1012,6 @@ version = "3.0.3" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/7e/99/7690b6d4034fffd95959cbe0c02de8deb3098cc577c67bb6a24fe5d7caa7/markupsafe-3.0.3.tar.gz", hash = "sha256:722695808f4b6457b320fdc131280796bdceb04ab50fe1795cd540799ebe1698", size = 80313, upload-time = "2025-09-27T18:37:40.426Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/e8/4b/3541d44f3937ba468b75da9eebcae497dcf67adb65caa16760b0a6807ebb/markupsafe-3.0.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:2f981d352f04553a7171b8e44369f2af4055f888dfb147d55e42d29e29e74559", size = 11631, upload-time = "2025-09-27T18:36:05.558Z" }, - { url = "https://files.pythonhosted.org/packages/98/1b/fbd8eed11021cabd9226c37342fa6ca4e8a98d8188a8d9b66740494960e4/markupsafe-3.0.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e1c1493fb6e50ab01d20a22826e57520f1284df32f2d8601fdd90b6304601419", size = 12057, upload-time = "2025-09-27T18:36:07.165Z" }, - { url = "https://files.pythonhosted.org/packages/40/01/e560d658dc0bb8ab762670ece35281dec7b6c1b33f5fbc09ebb57a185519/markupsafe-3.0.3-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1ba88449deb3de88bd40044603fafffb7bc2b055d626a330323a9ed736661695", size = 22050, upload-time = "2025-09-27T18:36:08.005Z" }, - { url = "https://files.pythonhosted.org/packages/af/cd/ce6e848bbf2c32314c9b237839119c5a564a59725b53157c856e90937b7a/markupsafe-3.0.3-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f42d0984e947b8adf7dd6dde396e720934d12c506ce84eea8476409563607591", size = 20681, upload-time = "2025-09-27T18:36:08.881Z" }, - { url = "https://files.pythonhosted.org/packages/c9/2a/b5c12c809f1c3045c4d580b035a743d12fcde53cf685dbc44660826308da/markupsafe-3.0.3-cp310-cp310-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:c0c0b3ade1c0b13b936d7970b1d37a57acde9199dc2aecc4c336773e1d86049c", size = 20705, upload-time = "2025-09-27T18:36:10.131Z" }, - { url = "https://files.pythonhosted.org/packages/cf/e3/9427a68c82728d0a88c50f890d0fc072a1484de2f3ac1ad0bfc1a7214fd5/markupsafe-3.0.3-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:0303439a41979d9e74d18ff5e2dd8c43ed6c6001fd40e5bf2e43f7bd9bbc523f", size = 21524, upload-time = "2025-09-27T18:36:11.324Z" }, - { url = "https://files.pythonhosted.org/packages/bc/36/23578f29e9e582a4d0278e009b38081dbe363c5e7165113fad546918a232/markupsafe-3.0.3-cp310-cp310-musllinux_1_2_riscv64.whl", hash = "sha256:d2ee202e79d8ed691ceebae8e0486bd9a2cd4794cec4824e1c99b6f5009502f6", size = 20282, upload-time = "2025-09-27T18:36:12.573Z" }, - { url = "https://files.pythonhosted.org/packages/56/21/dca11354e756ebd03e036bd8ad58d6d7168c80ce1fe5e75218e4945cbab7/markupsafe-3.0.3-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:177b5253b2834fe3678cb4a5f0059808258584c559193998be2601324fdeafb1", size = 20745, upload-time = "2025-09-27T18:36:13.504Z" }, - { url = "https://files.pythonhosted.org/packages/87/99/faba9369a7ad6e4d10b6a5fbf71fa2a188fe4a593b15f0963b73859a1bbd/markupsafe-3.0.3-cp310-cp310-win32.whl", hash = "sha256:2a15a08b17dd94c53a1da0438822d70ebcd13f8c3a95abe3a9ef9f11a94830aa", size = 14571, upload-time = "2025-09-27T18:36:14.779Z" }, - { url = "https://files.pythonhosted.org/packages/d6/25/55dc3ab959917602c96985cb1253efaa4ff42f71194bddeb61eb7278b8be/markupsafe-3.0.3-cp310-cp310-win_amd64.whl", hash = "sha256:c4ffb7ebf07cfe8931028e3e4c85f0357459a3f9f9490886198848f4fa002ec8", size = 15056, upload-time = "2025-09-27T18:36:16.125Z" }, - { url = "https://files.pythonhosted.org/packages/d0/9e/0a02226640c255d1da0b8d12e24ac2aa6734da68bff14c05dd53b94a0fc3/markupsafe-3.0.3-cp310-cp310-win_arm64.whl", hash = "sha256:e2103a929dfa2fcaf9bb4e7c091983a49c9ac3b19c9061b6d5427dd7d14d81a1", size = 13932, upload-time = "2025-09-27T18:36:17.311Z" }, { url = "https://files.pythonhosted.org/packages/08/db/fefacb2136439fc8dd20e797950e749aa1f4997ed584c62cfb8ef7c2be0e/markupsafe-3.0.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:1cc7ea17a6824959616c525620e387f6dd30fec8cb44f649e31712db02123dad", size = 11631, upload-time = "2025-09-27T18:36:18.185Z" }, { url = "https://files.pythonhosted.org/packages/e1/2e/5898933336b61975ce9dc04decbc0a7f2fee78c30353c5efba7f2d6ff27a/markupsafe-3.0.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:4bd4cd07944443f5a265608cc6aab442e4f74dff8088b0dfc8238647b8f6ae9a", size = 12058, upload-time = "2025-09-27T18:36:19.444Z" }, { url = "https://files.pythonhosted.org/packages/1d/09/adf2df3699d87d1d8184038df46a9c80d78c0148492323f4693df54e17bb/markupsafe-3.0.3-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6b5420a1d9450023228968e7e6a9ce57f65d148ab56d2313fcd589eee96a7a50", size = 24287, upload-time = "2025-09-27T18:36:20.768Z" }, @@ -1288,29 +1092,8 @@ wheels = [ name = "multidict" version = "6.7.1" source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "typing-extensions", marker = "python_full_version < '3.11'" }, -] sdist = { url = "https://files.pythonhosted.org/packages/1a/c2/c2d94cbe6ac1753f3fc980da97b3d930efe1da3af3c9f5125354436c073d/multidict-6.7.1.tar.gz", hash = "sha256:ec6652a1bee61c53a3e5776b6049172c53b6aaba34f18c9ad04f82712bac623d", size = 102010, upload-time = "2026-01-26T02:46:45.979Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/84/0b/19348d4c98980c4851d2f943f8ebafdece2ae7ef737adcfa5994ce8e5f10/multidict-6.7.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:c93c3db7ea657dd4637d57e74ab73de31bccefe144d3d4ce370052035bc85fb5", size = 77176, upload-time = "2026-01-26T02:42:59.784Z" }, - { url = "https://files.pythonhosted.org/packages/ef/04/9de3f8077852e3d438215c81e9b691244532d2e05b4270e89ce67b7d103c/multidict-6.7.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:974e72a2474600827abaeda71af0c53d9ebbc3c2eb7da37b37d7829ae31232d8", size = 44996, upload-time = "2026-01-26T02:43:01.674Z" }, - { url = "https://files.pythonhosted.org/packages/31/5c/08c7f7fe311f32e83f7621cd3f99d805f45519cd06fafb247628b861da7d/multidict-6.7.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:cdea2e7b2456cfb6694fb113066fd0ec7ea4d67e3a35e1f4cbeea0b448bf5872", size = 44631, upload-time = "2026-01-26T02:43:03.169Z" }, - { url = "https://files.pythonhosted.org/packages/b7/7f/0e3b1390ae772f27501199996b94b52ceeb64fe6f9120a32c6c3f6b781be/multidict-6.7.1-cp310-cp310-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:17207077e29342fdc2c9a82e4b306f1127bf1ea91f8b71e02d4798a70bb99991", size = 242561, upload-time = "2026-01-26T02:43:04.733Z" }, - { url = "https://files.pythonhosted.org/packages/dd/f4/8719f4f167586af317b69dd3e90f913416c91ca610cac79a45c53f590312/multidict-6.7.1-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d4f49cb5661344764e4c7c7973e92a47a59b8fc19b6523649ec9dc4960e58a03", size = 242223, upload-time = "2026-01-26T02:43:06.695Z" }, - { url = "https://files.pythonhosted.org/packages/47/ab/7c36164cce64a6ad19c6d9a85377b7178ecf3b89f8fd589c73381a5eedfd/multidict-6.7.1-cp310-cp310-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:a9fc4caa29e2e6ae408d1c450ac8bf19892c5fca83ee634ecd88a53332c59981", size = 222322, upload-time = "2026-01-26T02:43:08.472Z" }, - { url = "https://files.pythonhosted.org/packages/f5/79/a25add6fb38035b5337bc5734f296d9afc99163403bbcf56d4170f97eb62/multidict-6.7.1-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:c5f0c21549ab432b57dcc82130f388d84ad8179824cc3f223d5e7cfbfd4143f6", size = 254005, upload-time = "2026-01-26T02:43:10.127Z" }, - { url = "https://files.pythonhosted.org/packages/4a/7b/64a87cf98e12f756fc8bd444b001232ffff2be37288f018ad0d3f0aae931/multidict-6.7.1-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:7dfb78d966b2c906ae1d28ccf6e6712a3cd04407ee5088cd276fe8cb42186190", size = 251173, upload-time = "2026-01-26T02:43:11.731Z" }, - { url = "https://files.pythonhosted.org/packages/4b/ac/b605473de2bb404e742f2cc3583d12aedb2352a70e49ae8fce455b50c5aa/multidict-6.7.1-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9b0d9b91d1aa44db9c1f1ecd0d9d2ae610b2f4f856448664e01a3b35899f3f92", size = 243273, upload-time = "2026-01-26T02:43:13.063Z" }, - { url = "https://files.pythonhosted.org/packages/03/65/11492d6a0e259783720f3bc1d9ea55579a76f1407e31ed44045c99542004/multidict-6.7.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:dd96c01a9dcd4889dcfcf9eb5544ca0c77603f239e3ffab0524ec17aea9a93ee", size = 238956, upload-time = "2026-01-26T02:43:14.843Z" }, - { url = "https://files.pythonhosted.org/packages/5f/a7/7ee591302af64e7c196fb63fe856c788993c1372df765102bd0448e7e165/multidict-6.7.1-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:067343c68cd6612d375710f895337b3a98a033c94f14b9a99eff902f205424e2", size = 233477, upload-time = "2026-01-26T02:43:16.025Z" }, - { url = "https://files.pythonhosted.org/packages/9c/99/c109962d58756c35fd9992fed7f2355303846ea2ff054bb5f5e9d6b888de/multidict-6.7.1-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:5884a04f4ff56c6120f6ccf703bdeb8b5079d808ba604d4d53aec0d55dc33568", size = 243615, upload-time = "2026-01-26T02:43:17.84Z" }, - { url = "https://files.pythonhosted.org/packages/d5/5f/1973e7c771c86e93dcfe1c9cc55a5481b610f6614acfc28c0d326fe6bfad/multidict-6.7.1-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:8affcf1c98b82bc901702eb73b6947a1bfa170823c153fe8a47b5f5f02e48e40", size = 249930, upload-time = "2026-01-26T02:43:19.06Z" }, - { url = "https://files.pythonhosted.org/packages/5d/a5/f170fc2268c3243853580203378cd522446b2df632061e0a5409817854c7/multidict-6.7.1-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:0d17522c37d03e85c8098ec8431636309b2682cf12e58f4dbc76121fb50e4962", size = 243807, upload-time = "2026-01-26T02:43:20.286Z" }, - { url = "https://files.pythonhosted.org/packages/de/01/73856fab6d125e5bc652c3986b90e8699a95e84b48d72f39ade6c0e74a8c/multidict-6.7.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:24c0cf81544ca5e17cfcb6e482e7a82cd475925242b308b890c9452a074d4505", size = 239103, upload-time = "2026-01-26T02:43:21.508Z" }, - { url = "https://files.pythonhosted.org/packages/e7/46/f1220bd9944d8aa40d8ccff100eeeee19b505b857b6f603d6078cb5315b0/multidict-6.7.1-cp310-cp310-win32.whl", hash = "sha256:d82dd730a95e6643802f4454b8fdecdf08667881a9c5670db85bc5a56693f122", size = 41416, upload-time = "2026-01-26T02:43:22.703Z" }, - { url = "https://files.pythonhosted.org/packages/68/00/9b38e272a770303692fc406c36e1a4c740f401522d5787691eb38a8925a8/multidict-6.7.1-cp310-cp310-win_amd64.whl", hash = "sha256:cf37cbe5ced48d417ba045aca1b21bafca67489452debcde94778a576666a1df", size = 46022, upload-time = "2026-01-26T02:43:23.77Z" }, - { url = "https://files.pythonhosted.org/packages/64/65/d8d42490c02ee07b6bbe00f7190d70bb4738b3cce7629aaf9f213ef730dd/multidict-6.7.1-cp310-cp310-win_arm64.whl", hash = "sha256:59bc83d3f66b41dac1e7460aac1d196edc70c9ba3094965c467715a70ecb46db", size = 43238, upload-time = "2026-01-26T02:43:24.882Z" }, { url = "https://files.pythonhosted.org/packages/ce/f1/a90635c4f88fb913fbf4ce660b83b7445b7a02615bda034b2f8eb38fd597/multidict-6.7.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:7ff981b266af91d7b4b3793ca3382e53229088d193a85dfad6f5f4c27fc73e5d", size = 76626, upload-time = "2026-01-26T02:43:26.485Z" }, { url = "https://files.pythonhosted.org/packages/a6/9b/267e64eaf6fc637a15b35f5de31a566634a2740f97d8d094a69d34f524a4/multidict-6.7.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:844c5bca0b5444adb44a623fb0a1310c2f4cd41f402126bb269cd44c9b3f3e1e", size = 44706, upload-time = "2026-01-26T02:43:27.607Z" }, { url = "https://files.pythonhosted.org/packages/dd/a4/d45caf2b97b035c57267791ecfaafbd59c68212004b3842830954bb4b02e/multidict-6.7.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f2a0a924d4c2e9afcd7ec64f9de35fcd96915149b2216e1cb2c10a56df483855", size = 44356, upload-time = "2026-01-26T02:43:28.661Z" }, @@ -1394,17 +1177,10 @@ dependencies = [ { name = "librt", marker = "platform_python_implementation != 'PyPy'" }, { name = "mypy-extensions" }, { name = "pathspec" }, - { name = "tomli", marker = "python_full_version < '3.11'" }, { name = "typing-extensions" }, ] sdist = { url = "https://files.pythonhosted.org/packages/f5/db/4efed9504bc01309ab9c2da7e352cc223569f05478012b5d9ece38fd44d2/mypy-1.19.1.tar.gz", hash = "sha256:19d88bb05303fe63f71dd2c6270daca27cb9401c4ca8255fe50d1d920e0eb9ba", size = 3582404, upload-time = "2025-12-15T05:03:48.42Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/2f/63/e499890d8e39b1ff2df4c0c6ce5d371b6844ee22b8250687a99fd2f657a8/mypy-1.19.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:5f05aa3d375b385734388e844bc01733bd33c644ab48e9684faa54e5389775ec", size = 13101333, upload-time = "2025-12-15T05:03:03.28Z" }, - { url = "https://files.pythonhosted.org/packages/72/4b/095626fc136fba96effc4fd4a82b41d688ab92124f8c4f7564bffe5cf1b0/mypy-1.19.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:022ea7279374af1a5d78dfcab853fe6a536eebfda4b59deab53cd21f6cd9f00b", size = 12164102, upload-time = "2025-12-15T05:02:33.611Z" }, - { url = "https://files.pythonhosted.org/packages/0c/5b/952928dd081bf88a83a5ccd49aaecfcd18fd0d2710c7ff07b8fb6f7032b9/mypy-1.19.1-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ee4c11e460685c3e0c64a4c5de82ae143622410950d6be863303a1c4ba0e36d6", size = 12765799, upload-time = "2025-12-15T05:03:28.44Z" }, - { url = "https://files.pythonhosted.org/packages/2a/0d/93c2e4a287f74ef11a66fb6d49c7a9f05e47b0a4399040e6719b57f500d2/mypy-1.19.1-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:de759aafbae8763283b2ee5869c7255391fbc4de3ff171f8f030b5ec48381b74", size = 13522149, upload-time = "2025-12-15T05:02:36.011Z" }, - { url = "https://files.pythonhosted.org/packages/7b/0e/33a294b56aaad2b338d203e3a1d8b453637ac36cb278b45005e0901cf148/mypy-1.19.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:ab43590f9cd5108f41aacf9fca31841142c786827a74ab7cc8a2eacb634e09a1", size = 13810105, upload-time = "2025-12-15T05:02:40.327Z" }, - { url = "https://files.pythonhosted.org/packages/0e/fd/3e82603a0cb66b67c5e7abababce6bf1a929ddf67bf445e652684af5c5a0/mypy-1.19.1-cp310-cp310-win_amd64.whl", hash = "sha256:2899753e2f61e571b3971747e302d5f420c3fd09650e1951e99f823bc3089dac", size = 10057200, upload-time = "2025-12-15T05:02:51.012Z" }, { url = "https://files.pythonhosted.org/packages/ef/47/6b3ebabd5474d9cdc170d1342fbf9dddc1b0ec13ec90bf9004ee6f391c31/mypy-1.19.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:d8dfc6ab58ca7dda47d9237349157500468e404b17213d44fc1cb77bce532288", size = 13028539, upload-time = "2025-12-15T05:03:44.129Z" }, { url = "https://files.pythonhosted.org/packages/5c/a6/ac7c7a88a3c9c54334f53a941b765e6ec6c4ebd65d3fe8cdcfbe0d0fd7db/mypy-1.19.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:e3f276d8493c3c97930e354b2595a44a21348b320d859fb4a2b9f66da9ed27ab", size = 12083163, upload-time = "2025-12-15T05:03:37.679Z" }, { url = "https://files.pythonhosted.org/packages/67/af/3afa9cf880aa4a2c803798ac24f1d11ef72a0c8079689fac5cfd815e2830/mypy-1.19.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:2abb24cf3f17864770d18d673c85235ba52456b36a06b6afc1e07c1fdcd3d0e6", size = 12687629, upload-time = "2025-12-15T05:02:31.526Z" }, @@ -1453,79 +1229,10 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/88/b2/d0896bdcdc8d28a7fc5717c305f1a861c26e18c05047949fb371034d98bd/nodeenv-1.10.0-py2.py3-none-any.whl", hash = "sha256:5bb13e3eed2923615535339b3c620e76779af4cb4c6a90deccc9e36b274d3827", size = 23438, upload-time = "2025-12-20T14:08:52.782Z" }, ] -[[package]] -name = "numpy" -version = "2.2.6" -source = { registry = "https://pypi.org/simple" } -resolution-markers = [ - "python_full_version < '3.11'", -] -sdist = { url = "https://files.pythonhosted.org/packages/76/21/7d2a95e4bba9dc13d043ee156a356c0a8f0c6309dff6b21b4d71a073b8a8/numpy-2.2.6.tar.gz", hash = "sha256:e29554e2bef54a90aa5cc07da6ce955accb83f21ab5de01a62c8478897b264fd", size = 20276440, upload-time = "2025-05-17T22:38:04.611Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/9a/3e/ed6db5be21ce87955c0cbd3009f2803f59fa08df21b5df06862e2d8e2bdd/numpy-2.2.6-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:b412caa66f72040e6d268491a59f2c43bf03eb6c96dd8f0307829feb7fa2b6fb", size = 21165245, upload-time = "2025-05-17T21:27:58.555Z" }, - { url = "https://files.pythonhosted.org/packages/22/c2/4b9221495b2a132cc9d2eb862e21d42a009f5a60e45fc44b00118c174bff/numpy-2.2.6-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8e41fd67c52b86603a91c1a505ebaef50b3314de0213461c7a6e99c9a3beff90", size = 14360048, upload-time = "2025-05-17T21:28:21.406Z" }, - { url = "https://files.pythonhosted.org/packages/fd/77/dc2fcfc66943c6410e2bf598062f5959372735ffda175b39906d54f02349/numpy-2.2.6-cp310-cp310-macosx_14_0_arm64.whl", hash = "sha256:37e990a01ae6ec7fe7fa1c26c55ecb672dd98b19c3d0e1d1f326fa13cb38d163", size = 5340542, upload-time = "2025-05-17T21:28:30.931Z" }, - { url = "https://files.pythonhosted.org/packages/7a/4f/1cb5fdc353a5f5cc7feb692db9b8ec2c3d6405453f982435efc52561df58/numpy-2.2.6-cp310-cp310-macosx_14_0_x86_64.whl", hash = "sha256:5a6429d4be8ca66d889b7cf70f536a397dc45ba6faeb5f8c5427935d9592e9cf", size = 6878301, upload-time = "2025-05-17T21:28:41.613Z" }, - { url = "https://files.pythonhosted.org/packages/eb/17/96a3acd228cec142fcb8723bd3cc39c2a474f7dcf0a5d16731980bcafa95/numpy-2.2.6-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:efd28d4e9cd7d7a8d39074a4d44c63eda73401580c5c76acda2ce969e0a38e83", size = 14297320, upload-time = "2025-05-17T21:29:02.78Z" }, - { url = "https://files.pythonhosted.org/packages/b4/63/3de6a34ad7ad6646ac7d2f55ebc6ad439dbbf9c4370017c50cf403fb19b5/numpy-2.2.6-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fc7b73d02efb0e18c000e9ad8b83480dfcd5dfd11065997ed4c6747470ae8915", size = 16801050, upload-time = "2025-05-17T21:29:27.675Z" }, - { url = "https://files.pythonhosted.org/packages/07/b6/89d837eddef52b3d0cec5c6ba0456c1bf1b9ef6a6672fc2b7873c3ec4e2e/numpy-2.2.6-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:74d4531beb257d2c3f4b261bfb0fc09e0f9ebb8842d82a7b4209415896adc680", size = 15807034, upload-time = "2025-05-17T21:29:51.102Z" }, - { url = "https://files.pythonhosted.org/packages/01/c8/dc6ae86e3c61cfec1f178e5c9f7858584049b6093f843bca541f94120920/numpy-2.2.6-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:8fc377d995680230e83241d8a96def29f204b5782f371c532579b4f20607a289", size = 18614185, upload-time = "2025-05-17T21:30:18.703Z" }, - { url = "https://files.pythonhosted.org/packages/5b/c5/0064b1b7e7c89137b471ccec1fd2282fceaae0ab3a9550f2568782d80357/numpy-2.2.6-cp310-cp310-win32.whl", hash = "sha256:b093dd74e50a8cba3e873868d9e93a85b78e0daf2e98c6797566ad8044e8363d", size = 6527149, upload-time = "2025-05-17T21:30:29.788Z" }, - { url = "https://files.pythonhosted.org/packages/a3/dd/4b822569d6b96c39d1215dbae0582fd99954dcbcf0c1a13c61783feaca3f/numpy-2.2.6-cp310-cp310-win_amd64.whl", hash = "sha256:f0fd6321b839904e15c46e0d257fdd101dd7f530fe03fd6359c1ea63738703f3", size = 12904620, upload-time = "2025-05-17T21:30:48.994Z" }, - { url = "https://files.pythonhosted.org/packages/da/a8/4f83e2aa666a9fbf56d6118faaaf5f1974d456b1823fda0a176eff722839/numpy-2.2.6-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:f9f1adb22318e121c5c69a09142811a201ef17ab257a1e66ca3025065b7f53ae", size = 21176963, upload-time = "2025-05-17T21:31:19.36Z" }, - { url = "https://files.pythonhosted.org/packages/b3/2b/64e1affc7972decb74c9e29e5649fac940514910960ba25cd9af4488b66c/numpy-2.2.6-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:c820a93b0255bc360f53eca31a0e676fd1101f673dda8da93454a12e23fc5f7a", size = 14406743, upload-time = "2025-05-17T21:31:41.087Z" }, - { url = "https://files.pythonhosted.org/packages/4a/9f/0121e375000b5e50ffdd8b25bf78d8e1a5aa4cca3f185d41265198c7b834/numpy-2.2.6-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:3d70692235e759f260c3d837193090014aebdf026dfd167834bcba43e30c2a42", size = 5352616, upload-time = "2025-05-17T21:31:50.072Z" }, - { url = "https://files.pythonhosted.org/packages/31/0d/b48c405c91693635fbe2dcd7bc84a33a602add5f63286e024d3b6741411c/numpy-2.2.6-cp311-cp311-macosx_14_0_x86_64.whl", hash = "sha256:481b49095335f8eed42e39e8041327c05b0f6f4780488f61286ed3c01368d491", size = 6889579, upload-time = "2025-05-17T21:32:01.712Z" }, - { url = "https://files.pythonhosted.org/packages/52/b8/7f0554d49b565d0171eab6e99001846882000883998e7b7d9f0d98b1f934/numpy-2.2.6-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b64d8d4d17135e00c8e346e0a738deb17e754230d7e0810ac5012750bbd85a5a", size = 14312005, upload-time = "2025-05-17T21:32:23.332Z" }, - { url = "https://files.pythonhosted.org/packages/b3/dd/2238b898e51bd6d389b7389ffb20d7f4c10066d80351187ec8e303a5a475/numpy-2.2.6-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ba10f8411898fc418a521833e014a77d3ca01c15b0c6cdcce6a0d2897e6dbbdf", size = 16821570, upload-time = "2025-05-17T21:32:47.991Z" }, - { url = "https://files.pythonhosted.org/packages/83/6c/44d0325722cf644f191042bf47eedad61c1e6df2432ed65cbe28509d404e/numpy-2.2.6-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:bd48227a919f1bafbdda0583705e547892342c26fb127219d60a5c36882609d1", size = 15818548, upload-time = "2025-05-17T21:33:11.728Z" }, - { url = "https://files.pythonhosted.org/packages/ae/9d/81e8216030ce66be25279098789b665d49ff19eef08bfa8cb96d4957f422/numpy-2.2.6-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:9551a499bf125c1d4f9e250377c1ee2eddd02e01eac6644c080162c0c51778ab", size = 18620521, upload-time = "2025-05-17T21:33:39.139Z" }, - { url = "https://files.pythonhosted.org/packages/6a/fd/e19617b9530b031db51b0926eed5345ce8ddc669bb3bc0044b23e275ebe8/numpy-2.2.6-cp311-cp311-win32.whl", hash = "sha256:0678000bb9ac1475cd454c6b8c799206af8107e310843532b04d49649c717a47", size = 6525866, upload-time = "2025-05-17T21:33:50.273Z" }, - { url = "https://files.pythonhosted.org/packages/31/0a/f354fb7176b81747d870f7991dc763e157a934c717b67b58456bc63da3df/numpy-2.2.6-cp311-cp311-win_amd64.whl", hash = "sha256:e8213002e427c69c45a52bbd94163084025f533a55a59d6f9c5b820774ef3303", size = 12907455, upload-time = "2025-05-17T21:34:09.135Z" }, - { url = "https://files.pythonhosted.org/packages/82/5d/c00588b6cf18e1da539b45d3598d3557084990dcc4331960c15ee776ee41/numpy-2.2.6-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:41c5a21f4a04fa86436124d388f6ed60a9343a6f767fced1a8a71c3fbca038ff", size = 20875348, upload-time = "2025-05-17T21:34:39.648Z" }, - { url = "https://files.pythonhosted.org/packages/66/ee/560deadcdde6c2f90200450d5938f63a34b37e27ebff162810f716f6a230/numpy-2.2.6-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:de749064336d37e340f640b05f24e9e3dd678c57318c7289d222a8a2f543e90c", size = 14119362, upload-time = "2025-05-17T21:35:01.241Z" }, - { url = "https://files.pythonhosted.org/packages/3c/65/4baa99f1c53b30adf0acd9a5519078871ddde8d2339dc5a7fde80d9d87da/numpy-2.2.6-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:894b3a42502226a1cac872f840030665f33326fc3dac8e57c607905773cdcde3", size = 5084103, upload-time = "2025-05-17T21:35:10.622Z" }, - { url = "https://files.pythonhosted.org/packages/cc/89/e5a34c071a0570cc40c9a54eb472d113eea6d002e9ae12bb3a8407fb912e/numpy-2.2.6-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:71594f7c51a18e728451bb50cc60a3ce4e6538822731b2933209a1f3614e9282", size = 6625382, upload-time = "2025-05-17T21:35:21.414Z" }, - { url = "https://files.pythonhosted.org/packages/f8/35/8c80729f1ff76b3921d5c9487c7ac3de9b2a103b1cd05e905b3090513510/numpy-2.2.6-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f2618db89be1b4e05f7a1a847a9c1c0abd63e63a1607d892dd54668dd92faf87", size = 14018462, upload-time = "2025-05-17T21:35:42.174Z" }, - { url = "https://files.pythonhosted.org/packages/8c/3d/1e1db36cfd41f895d266b103df00ca5b3cbe965184df824dec5c08c6b803/numpy-2.2.6-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fd83c01228a688733f1ded5201c678f0c53ecc1006ffbc404db9f7a899ac6249", size = 16527618, upload-time = "2025-05-17T21:36:06.711Z" }, - { url = "https://files.pythonhosted.org/packages/61/c6/03ed30992602c85aa3cd95b9070a514f8b3c33e31124694438d88809ae36/numpy-2.2.6-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:37c0ca431f82cd5fa716eca9506aefcabc247fb27ba69c5062a6d3ade8cf8f49", size = 15505511, upload-time = "2025-05-17T21:36:29.965Z" }, - { url = "https://files.pythonhosted.org/packages/b7/25/5761d832a81df431e260719ec45de696414266613c9ee268394dd5ad8236/numpy-2.2.6-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:fe27749d33bb772c80dcd84ae7e8df2adc920ae8297400dabec45f0dedb3f6de", size = 18313783, upload-time = "2025-05-17T21:36:56.883Z" }, - { url = "https://files.pythonhosted.org/packages/57/0a/72d5a3527c5ebffcd47bde9162c39fae1f90138c961e5296491ce778e682/numpy-2.2.6-cp312-cp312-win32.whl", hash = "sha256:4eeaae00d789f66c7a25ac5f34b71a7035bb474e679f410e5e1a94deb24cf2d4", size = 6246506, upload-time = "2025-05-17T21:37:07.368Z" }, - { url = "https://files.pythonhosted.org/packages/36/fa/8c9210162ca1b88529ab76b41ba02d433fd54fecaf6feb70ef9f124683f1/numpy-2.2.6-cp312-cp312-win_amd64.whl", hash = "sha256:c1f9540be57940698ed329904db803cf7a402f3fc200bfe599334c9bd84a40b2", size = 12614190, upload-time = "2025-05-17T21:37:26.213Z" }, - { url = "https://files.pythonhosted.org/packages/f9/5c/6657823f4f594f72b5471f1db1ab12e26e890bb2e41897522d134d2a3e81/numpy-2.2.6-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:0811bb762109d9708cca4d0b13c4f67146e3c3b7cf8d34018c722adb2d957c84", size = 20867828, upload-time = "2025-05-17T21:37:56.699Z" }, - { url = "https://files.pythonhosted.org/packages/dc/9e/14520dc3dadf3c803473bd07e9b2bd1b69bc583cb2497b47000fed2fa92f/numpy-2.2.6-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:287cc3162b6f01463ccd86be154f284d0893d2b3ed7292439ea97eafa8170e0b", size = 14143006, upload-time = "2025-05-17T21:38:18.291Z" }, - { url = "https://files.pythonhosted.org/packages/4f/06/7e96c57d90bebdce9918412087fc22ca9851cceaf5567a45c1f404480e9e/numpy-2.2.6-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:f1372f041402e37e5e633e586f62aa53de2eac8d98cbfb822806ce4bbefcb74d", size = 5076765, upload-time = "2025-05-17T21:38:27.319Z" }, - { url = "https://files.pythonhosted.org/packages/73/ed/63d920c23b4289fdac96ddbdd6132e9427790977d5457cd132f18e76eae0/numpy-2.2.6-cp313-cp313-macosx_14_0_x86_64.whl", hash = "sha256:55a4d33fa519660d69614a9fad433be87e5252f4b03850642f88993f7b2ca566", size = 6617736, upload-time = "2025-05-17T21:38:38.141Z" }, - { url = "https://files.pythonhosted.org/packages/85/c5/e19c8f99d83fd377ec8c7e0cf627a8049746da54afc24ef0a0cb73d5dfb5/numpy-2.2.6-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f92729c95468a2f4f15e9bb94c432a9229d0d50de67304399627a943201baa2f", size = 14010719, upload-time = "2025-05-17T21:38:58.433Z" }, - { url = "https://files.pythonhosted.org/packages/19/49/4df9123aafa7b539317bf6d342cb6d227e49f7a35b99c287a6109b13dd93/numpy-2.2.6-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1bc23a79bfabc5d056d106f9befb8d50c31ced2fbc70eedb8155aec74a45798f", size = 16526072, upload-time = "2025-05-17T21:39:22.638Z" }, - { url = "https://files.pythonhosted.org/packages/b2/6c/04b5f47f4f32f7c2b0e7260442a8cbcf8168b0e1a41ff1495da42f42a14f/numpy-2.2.6-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:e3143e4451880bed956e706a3220b4e5cf6172ef05fcc397f6f36a550b1dd868", size = 15503213, upload-time = "2025-05-17T21:39:45.865Z" }, - { url = "https://files.pythonhosted.org/packages/17/0a/5cd92e352c1307640d5b6fec1b2ffb06cd0dabe7d7b8227f97933d378422/numpy-2.2.6-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:b4f13750ce79751586ae2eb824ba7e1e8dba64784086c98cdbbcc6a42112ce0d", size = 18316632, upload-time = "2025-05-17T21:40:13.331Z" }, - { url = "https://files.pythonhosted.org/packages/f0/3b/5cba2b1d88760ef86596ad0f3d484b1cbff7c115ae2429678465057c5155/numpy-2.2.6-cp313-cp313-win32.whl", hash = "sha256:5beb72339d9d4fa36522fc63802f469b13cdbe4fdab4a288f0c441b74272ebfd", size = 6244532, upload-time = "2025-05-17T21:43:46.099Z" }, - { url = "https://files.pythonhosted.org/packages/cb/3b/d58c12eafcb298d4e6d0d40216866ab15f59e55d148a5658bb3132311fcf/numpy-2.2.6-cp313-cp313-win_amd64.whl", hash = "sha256:b0544343a702fa80c95ad5d3d608ea3599dd54d4632df855e4c8d24eb6ecfa1c", size = 12610885, upload-time = "2025-05-17T21:44:05.145Z" }, - { url = "https://files.pythonhosted.org/packages/6b/9e/4bf918b818e516322db999ac25d00c75788ddfd2d2ade4fa66f1f38097e1/numpy-2.2.6-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:0bca768cd85ae743b2affdc762d617eddf3bcf8724435498a1e80132d04879e6", size = 20963467, upload-time = "2025-05-17T21:40:44Z" }, - { url = "https://files.pythonhosted.org/packages/61/66/d2de6b291507517ff2e438e13ff7b1e2cdbdb7cb40b3ed475377aece69f9/numpy-2.2.6-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:fc0c5673685c508a142ca65209b4e79ed6740a4ed6b2267dbba90f34b0b3cfda", size = 14225144, upload-time = "2025-05-17T21:41:05.695Z" }, - { url = "https://files.pythonhosted.org/packages/e4/25/480387655407ead912e28ba3a820bc69af9adf13bcbe40b299d454ec011f/numpy-2.2.6-cp313-cp313t-macosx_14_0_arm64.whl", hash = "sha256:5bd4fc3ac8926b3819797a7c0e2631eb889b4118a9898c84f585a54d475b7e40", size = 5200217, upload-time = "2025-05-17T21:41:15.903Z" }, - { url = "https://files.pythonhosted.org/packages/aa/4a/6e313b5108f53dcbf3aca0c0f3e9c92f4c10ce57a0a721851f9785872895/numpy-2.2.6-cp313-cp313t-macosx_14_0_x86_64.whl", hash = "sha256:fee4236c876c4e8369388054d02d0e9bb84821feb1a64dd59e137e6511a551f8", size = 6712014, upload-time = "2025-05-17T21:41:27.321Z" }, - { url = "https://files.pythonhosted.org/packages/b7/30/172c2d5c4be71fdf476e9de553443cf8e25feddbe185e0bd88b096915bcc/numpy-2.2.6-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e1dda9c7e08dc141e0247a5b8f49cf05984955246a327d4c48bda16821947b2f", size = 14077935, upload-time = "2025-05-17T21:41:49.738Z" }, - { url = "https://files.pythonhosted.org/packages/12/fb/9e743f8d4e4d3c710902cf87af3512082ae3d43b945d5d16563f26ec251d/numpy-2.2.6-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f447e6acb680fd307f40d3da4852208af94afdfab89cf850986c3ca00562f4fa", size = 16600122, upload-time = "2025-05-17T21:42:14.046Z" }, - { url = "https://files.pythonhosted.org/packages/12/75/ee20da0e58d3a66f204f38916757e01e33a9737d0b22373b3eb5a27358f9/numpy-2.2.6-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:389d771b1623ec92636b0786bc4ae56abafad4a4c513d36a55dce14bd9ce8571", size = 15586143, upload-time = "2025-05-17T21:42:37.464Z" }, - { url = "https://files.pythonhosted.org/packages/76/95/bef5b37f29fc5e739947e9ce5179ad402875633308504a52d188302319c8/numpy-2.2.6-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:8e9ace4a37db23421249ed236fdcdd457d671e25146786dfc96835cd951aa7c1", size = 18385260, upload-time = "2025-05-17T21:43:05.189Z" }, - { url = "https://files.pythonhosted.org/packages/09/04/f2f83279d287407cf36a7a8053a5abe7be3622a4363337338f2585e4afda/numpy-2.2.6-cp313-cp313t-win32.whl", hash = "sha256:038613e9fb8c72b0a41f025a7e4c3f0b7a1b5d768ece4796b674c8f3fe13efff", size = 6377225, upload-time = "2025-05-17T21:43:16.254Z" }, - { url = "https://files.pythonhosted.org/packages/67/0e/35082d13c09c02c011cf21570543d202ad929d961c02a147493cb0c2bdf5/numpy-2.2.6-cp313-cp313t-win_amd64.whl", hash = "sha256:6031dd6dfecc0cf9f668681a37648373bddd6421fff6c66ec1624eed0180ee06", size = 12771374, upload-time = "2025-05-17T21:43:35.479Z" }, - { url = "https://files.pythonhosted.org/packages/9e/3b/d94a75f4dbf1ef5d321523ecac21ef23a3cd2ac8b78ae2aac40873590229/numpy-2.2.6-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:0b605b275d7bd0c640cad4e5d30fa701a8d59302e127e5f79138ad62762c3e3d", size = 21040391, upload-time = "2025-05-17T21:44:35.948Z" }, - { url = "https://files.pythonhosted.org/packages/17/f4/09b2fa1b58f0fb4f7c7963a1649c64c4d315752240377ed74d9cd878f7b5/numpy-2.2.6-pp310-pypy310_pp73-macosx_14_0_x86_64.whl", hash = "sha256:7befc596a7dc9da8a337f79802ee8adb30a552a94f792b9c9d18c840055907db", size = 6786754, upload-time = "2025-05-17T21:44:47.446Z" }, - { url = "https://files.pythonhosted.org/packages/af/30/feba75f143bdc868a1cc3f44ccfa6c4b9ec522b36458e738cd00f67b573f/numpy-2.2.6-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ce47521a4754c8f4593837384bd3424880629f718d87c5d44f8ed763edd63543", size = 16643476, upload-time = "2025-05-17T21:45:11.871Z" }, - { url = "https://files.pythonhosted.org/packages/37/48/ac2a9584402fb6c0cd5b5d1a91dcf176b15760130dd386bbafdbfe3640bf/numpy-2.2.6-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:d042d24c90c41b54fd506da306759e06e568864df8ec17ccc17e9e884634fd00", size = 12812666, upload-time = "2025-05-17T21:45:31.426Z" }, -] - [[package]] name = "numpy" version = "2.4.3" source = { registry = "https://pypi.org/simple" } -resolution-markers = [ - "python_full_version >= '3.13'", - "python_full_version >= '3.11' and python_full_version < '3.13'", -] sdist = { url = "https://files.pythonhosted.org/packages/10/8b/c265f4823726ab832de836cdd184d0986dcf94480f81e8739692a7ac7af2/numpy-2.4.3.tar.gz", hash = "sha256:483a201202b73495f00dbc83796c6ae63137a9bdade074f7648b3e32613412dd", size = 20727743, upload-time = "2026-03-09T07:58:53.426Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/f9/51/5093a2df15c4dc19da3f79d1021e891f5dcf1d9d1db6ba38891d5590f3fe/numpy-2.4.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:33b3bf58ee84b172c067f56aeadc7ee9ab6de69c5e800ab5b10295d54c581adb", size = 16957183, upload-time = "2026-03-09T07:55:57.774Z" }, @@ -1580,60 +1287,16 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/57/a7/b35835e278c18b85206834b3aa3abe68e77a98769c59233d1f6300284781/numpy-2.4.3-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:4b42639cdde6d24e732ff823a3fa5b701d8acad89c4142bc1d0bd6dc85200ba5", size = 12504685, upload-time = "2026-03-09T07:58:50.525Z" }, ] -[[package]] -name = "onnxruntime" -version = "1.23.2" -source = { registry = "https://pypi.org/simple" } -resolution-markers = [ - "python_full_version < '3.11'", -] -dependencies = [ - { name = "coloredlogs", marker = "python_full_version < '3.11'" }, - { name = "flatbuffers", marker = "python_full_version < '3.11'" }, - { name = "numpy", version = "2.2.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, - { name = "packaging", marker = "python_full_version < '3.11'" }, - { name = "protobuf", marker = "python_full_version < '3.11'" }, - { name = "sympy", marker = "python_full_version < '3.11'" }, -] -wheels = [ - { url = "https://files.pythonhosted.org/packages/35/d6/311b1afea060015b56c742f3531168c1644650767f27ef40062569960587/onnxruntime-1.23.2-cp310-cp310-macosx_13_0_arm64.whl", hash = "sha256:a7730122afe186a784660f6ec5807138bf9d792fa1df76556b27307ea9ebcbe3", size = 17195934, upload-time = "2025-10-27T23:06:14.143Z" }, - { url = "https://files.pythonhosted.org/packages/db/db/81bf3d7cecfbfed9092b6b4052e857a769d62ed90561b410014e0aae18db/onnxruntime-1.23.2-cp310-cp310-macosx_13_0_x86_64.whl", hash = "sha256:b28740f4ecef1738ea8f807461dd541b8287d5650b5be33bca7b474e3cbd1f36", size = 19153079, upload-time = "2025-10-27T23:05:57.686Z" }, - { url = "https://files.pythonhosted.org/packages/2e/4d/a382452b17cf70a2313153c520ea4c96ab670c996cb3a95cc5d5ac7bfdac/onnxruntime-1.23.2-cp310-cp310-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:8f7d1fe034090a1e371b7f3ca9d3ccae2fabae8c1d8844fb7371d1ea38e8e8d2", size = 15219883, upload-time = "2025-10-22T03:46:21.66Z" }, - { url = "https://files.pythonhosted.org/packages/fb/56/179bf90679984c85b417664c26aae4f427cba7514bd2d65c43b181b7b08b/onnxruntime-1.23.2-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4ca88747e708e5c67337b0f65eed4b7d0dd70d22ac332038c9fc4635760018f7", size = 17370357, upload-time = "2025-10-22T03:46:57.968Z" }, - { url = "https://files.pythonhosted.org/packages/cd/6d/738e50c47c2fd285b1e6c8083f15dac1a5f6199213378a5f14092497296d/onnxruntime-1.23.2-cp310-cp310-win_amd64.whl", hash = "sha256:0be6a37a45e6719db5120e9986fcd30ea205ac8103fd1fb74b6c33348327a0cc", size = 13467651, upload-time = "2025-10-27T23:06:11.904Z" }, - { url = "https://files.pythonhosted.org/packages/44/be/467b00f09061572f022ffd17e49e49e5a7a789056bad95b54dfd3bee73ff/onnxruntime-1.23.2-cp311-cp311-macosx_13_0_arm64.whl", hash = "sha256:6f91d2c9b0965e86827a5ba01531d5b669770b01775b23199565d6c1f136616c", size = 17196113, upload-time = "2025-10-22T03:47:33.526Z" }, - { url = "https://files.pythonhosted.org/packages/9f/a8/3c23a8f75f93122d2b3410bfb74d06d0f8da4ac663185f91866b03f7da1b/onnxruntime-1.23.2-cp311-cp311-macosx_13_0_x86_64.whl", hash = "sha256:87d8b6eaf0fbeb6835a60a4265fde7a3b60157cf1b2764773ac47237b4d48612", size = 19153857, upload-time = "2025-10-22T03:46:37.578Z" }, - { url = "https://files.pythonhosted.org/packages/3f/d8/506eed9af03d86f8db4880a4c47cd0dffee973ef7e4f4cff9f1d4bcf7d22/onnxruntime-1.23.2-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:bbfd2fca76c855317568c1b36a885ddea2272c13cb0e395002c402f2360429a6", size = 15220095, upload-time = "2025-10-22T03:46:24.769Z" }, - { url = "https://files.pythonhosted.org/packages/e9/80/113381ba832d5e777accedc6cb41d10f9eca82321ae31ebb6bcede530cea/onnxruntime-1.23.2-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:da44b99206e77734c5819aa2142c69e64f3b46edc3bd314f6a45a932defc0b3e", size = 17372080, upload-time = "2025-10-22T03:47:00.265Z" }, - { url = "https://files.pythonhosted.org/packages/3a/db/1b4a62e23183a0c3fe441782462c0ede9a2a65c6bbffb9582fab7c7a0d38/onnxruntime-1.23.2-cp311-cp311-win_amd64.whl", hash = "sha256:902c756d8b633ce0dedd889b7c08459433fbcf35e9c38d1c03ddc020f0648c6e", size = 13468349, upload-time = "2025-10-22T03:47:25.783Z" }, - { url = "https://files.pythonhosted.org/packages/1b/9e/f748cd64161213adeef83d0cb16cb8ace1e62fa501033acdd9f9341fff57/onnxruntime-1.23.2-cp312-cp312-macosx_13_0_arm64.whl", hash = "sha256:b8f029a6b98d3cf5be564d52802bb50a8489ab73409fa9db0bf583eabb7c2321", size = 17195929, upload-time = "2025-10-22T03:47:36.24Z" }, - { url = "https://files.pythonhosted.org/packages/91/9d/a81aafd899b900101988ead7fb14974c8a58695338ab6a0f3d6b0100f30b/onnxruntime-1.23.2-cp312-cp312-macosx_13_0_x86_64.whl", hash = "sha256:218295a8acae83905f6f1aed8cacb8e3eb3bd7513a13fe4ba3b2664a19fc4a6b", size = 19157705, upload-time = "2025-10-22T03:46:40.415Z" }, - { url = "https://files.pythonhosted.org/packages/3c/35/4e40f2fba272a6698d62be2cd21ddc3675edfc1a4b9ddefcc4648f115315/onnxruntime-1.23.2-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:76ff670550dc23e58ea9bc53b5149b99a44e63b34b524f7b8547469aaa0dcb8c", size = 15226915, upload-time = "2025-10-22T03:46:27.773Z" }, - { url = "https://files.pythonhosted.org/packages/ef/88/9cc25d2bafe6bc0d4d3c1db3ade98196d5b355c0b273e6a5dc09c5d5d0d5/onnxruntime-1.23.2-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0f9b4ae77f8e3c9bee50c27bc1beede83f786fe1d52e99ac85aa8d65a01e9b77", size = 17382649, upload-time = "2025-10-22T03:47:02.782Z" }, - { url = "https://files.pythonhosted.org/packages/c0/b4/569d298f9fc4d286c11c45e85d9ffa9e877af12ace98af8cab52396e8f46/onnxruntime-1.23.2-cp312-cp312-win_amd64.whl", hash = "sha256:25de5214923ce941a3523739d34a520aac30f21e631de53bba9174dc9c004435", size = 13470528, upload-time = "2025-10-22T03:47:28.106Z" }, - { url = "https://files.pythonhosted.org/packages/3d/41/fba0cabccecefe4a1b5fc8020c44febb334637f133acefc7ec492029dd2c/onnxruntime-1.23.2-cp313-cp313-macosx_13_0_arm64.whl", hash = "sha256:2ff531ad8496281b4297f32b83b01cdd719617e2351ffe0dba5684fb283afa1f", size = 17196337, upload-time = "2025-10-22T03:46:35.168Z" }, - { url = "https://files.pythonhosted.org/packages/fe/f9/2d49ca491c6a986acce9f1d1d5fc2099108958cc1710c28e89a032c9cfe9/onnxruntime-1.23.2-cp313-cp313-macosx_13_0_x86_64.whl", hash = "sha256:162f4ca894ec3de1a6fd53589e511e06ecdc3ff646849b62a9da7489dee9ce95", size = 19157691, upload-time = "2025-10-22T03:46:43.518Z" }, - { url = "https://files.pythonhosted.org/packages/1c/a1/428ee29c6eaf09a6f6be56f836213f104618fb35ac6cc586ff0f477263eb/onnxruntime-1.23.2-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:45d127d6e1e9b99d1ebeae9bcd8f98617a812f53f46699eafeb976275744826b", size = 15226898, upload-time = "2025-10-22T03:46:30.039Z" }, - { url = "https://files.pythonhosted.org/packages/f2/2b/b57c8a2466a3126dbe0a792f56ad7290949b02f47b86216cd47d857e4b77/onnxruntime-1.23.2-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8bace4e0d46480fbeeb7bbe1ffe1f080e6663a42d1086ff95c1551f2d39e7872", size = 17382518, upload-time = "2025-10-22T03:47:05.407Z" }, - { url = "https://files.pythonhosted.org/packages/4a/93/aba75358133b3a941d736816dd392f687e7eab77215a6e429879080b76b6/onnxruntime-1.23.2-cp313-cp313-win_amd64.whl", hash = "sha256:1f9cc0a55349c584f083c1c076e611a7c35d5b867d5d6e6d6c823bf821978088", size = 13470276, upload-time = "2025-10-22T03:47:31.193Z" }, - { url = "https://files.pythonhosted.org/packages/7c/3d/6830fa61c69ca8e905f237001dbfc01689a4e4ab06147020a4518318881f/onnxruntime-1.23.2-cp313-cp313t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9d2385e774f46ac38f02b3a91a91e30263d41b2f1f4f26ae34805b2a9ddef466", size = 15229610, upload-time = "2025-10-22T03:46:32.239Z" }, - { url = "https://files.pythonhosted.org/packages/b6/ca/862b1e7a639460f0ca25fd5b6135fb42cf9deea86d398a92e44dfda2279d/onnxruntime-1.23.2-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:e2b9233c4947907fd1818d0e581c049c41ccc39b2856cc942ff6d26317cee145", size = 17394184, upload-time = "2025-10-22T03:47:08.127Z" }, -] - [[package]] name = "onnxruntime" version = "1.24.4" source = { registry = "https://pypi.org/simple" } -resolution-markers = [ - "python_full_version >= '3.13'", - "python_full_version >= '3.11' and python_full_version < '3.13'", -] dependencies = [ - { name = "flatbuffers", marker = "python_full_version >= '3.11'" }, - { name = "numpy", version = "2.4.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, - { name = "packaging", marker = "python_full_version >= '3.11'" }, - { name = "protobuf", marker = "python_full_version >= '3.11'" }, - { name = "sympy", marker = "python_full_version >= '3.11'" }, + { name = "flatbuffers" }, + { name = "numpy" }, + { name = "packaging" }, + { name = "protobuf" }, + { name = "sympy" }, ] wheels = [ { url = "https://files.pythonhosted.org/packages/60/69/6c40720201012c6af9aa7d4ecdd620e521bd806dc6269d636fdd5c5aeebe/onnxruntime-1.24.4-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:0bdfce8e9a6497cec584aab407b71bf697dac5e1b7b7974adc50bf7533bdb3a2", size = 17332131, upload-time = "2026-03-17T22:05:49.005Z" }, @@ -1684,7 +1347,6 @@ name = "openrtc" source = { editable = "." } dependencies = [ { name = "livekit-agents", extra = ["openai", "silero", "turn-detector"] }, - { name = "onnxruntime", version = "1.23.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, ] [package.optional-dependencies] @@ -1715,7 +1377,6 @@ dev = [ [package.metadata] requires-dist = [ { name = "livekit-agents", extras = ["openai", "silero", "turn-detector"], specifier = "~=1.4" }, - { name = "onnxruntime", marker = "python_full_version < '3.11'", specifier = ">=1.23.2,<1.24" }, { name = "rich", marker = "extra == 'cli'", specifier = ">=13" }, { name = "rich", marker = "extra == 'tui'", specifier = ">=13" }, { name = "textual", marker = "extra == 'tui'", specifier = ">=0.47,<2" }, @@ -1875,17 +1536,6 @@ version = "12.1.1" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/1f/42/5c74462b4fd957fcd7b13b04fb3205ff8349236ea74c7c375766d6c82288/pillow-12.1.1.tar.gz", hash = "sha256:9ad8fa5937ab05218e2b6a4cff30295ad35afd2f83ac592e68c0d871bb0fdbc4", size = 46980264, upload-time = "2026-02-11T04:23:07.146Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/1d/30/5bd3d794762481f8c8ae9c80e7b76ecea73b916959eb587521358ef0b2f9/pillow-12.1.1-cp310-cp310-macosx_10_10_x86_64.whl", hash = "sha256:1f1625b72740fdda5d77b4def688eb8fd6490975d06b909fd19f13f391e077e0", size = 5304099, upload-time = "2026-02-11T04:20:06.13Z" }, - { url = "https://files.pythonhosted.org/packages/bd/c1/aab9e8f3eeb4490180e357955e15c2ef74b31f64790ff356c06fb6cf6d84/pillow-12.1.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:178aa072084bd88ec759052feca8e56cbb14a60b39322b99a049e58090479713", size = 4657880, upload-time = "2026-02-11T04:20:09.291Z" }, - { url = "https://files.pythonhosted.org/packages/f1/0a/9879e30d56815ad529d3985aeff5af4964202425c27261a6ada10f7cbf53/pillow-12.1.1-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:b66e95d05ba806247aaa1561f080abc7975daf715c30780ff92a20e4ec546e1b", size = 6222587, upload-time = "2026-02-11T04:20:10.82Z" }, - { url = "https://files.pythonhosted.org/packages/5a/5f/a1b72ff7139e4f89014e8d451442c74a774d5c43cd938fb0a9f878576b37/pillow-12.1.1-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:89c7e895002bbe49cdc5426150377cbbc04767d7547ed145473f496dfa40408b", size = 8027678, upload-time = "2026-02-11T04:20:12.455Z" }, - { url = "https://files.pythonhosted.org/packages/e2/c2/c7cb187dac79a3d22c3ebeae727abee01e077c8c7d930791dc592f335153/pillow-12.1.1-cp310-cp310-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3a5cbdcddad0af3da87cb16b60d23648bc3b51967eb07223e9fed77a82b457c4", size = 6335777, upload-time = "2026-02-11T04:20:14.441Z" }, - { url = "https://files.pythonhosted.org/packages/0c/7b/f9b09a7804ec7336effb96c26d37c29d27225783dc1501b7d62dcef6ae25/pillow-12.1.1-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9f51079765661884a486727f0729d29054242f74b46186026582b4e4769918e4", size = 7027140, upload-time = "2026-02-11T04:20:16.387Z" }, - { url = "https://files.pythonhosted.org/packages/98/b2/2fa3c391550bd421b10849d1a2144c44abcd966daadd2f7c12e19ea988c4/pillow-12.1.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:99c1506ea77c11531d75e3a412832a13a71c7ebc8192ab9e4b2e355555920e3e", size = 6449855, upload-time = "2026-02-11T04:20:18.554Z" }, - { url = "https://files.pythonhosted.org/packages/96/ff/9caf4b5b950c669263c39e96c78c0d74a342c71c4f43fd031bb5cb7ceac9/pillow-12.1.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:36341d06738a9f66c8287cf8b876d24b18db9bd8740fa0672c74e259ad408cff", size = 7151329, upload-time = "2026-02-11T04:20:20.646Z" }, - { url = "https://files.pythonhosted.org/packages/7b/f8/4b24841f582704da675ca535935bccb32b00a6da1226820845fac4a71136/pillow-12.1.1-cp310-cp310-win32.whl", hash = "sha256:6c52f062424c523d6c4db85518774cc3d50f5539dd6eed32b8f6229b26f24d40", size = 6325574, upload-time = "2026-02-11T04:20:22.43Z" }, - { url = "https://files.pythonhosted.org/packages/f8/f9/9f6b01c0881d7036063aa6612ef04c0e2cad96be21325a1e92d0203f8e91/pillow-12.1.1-cp310-cp310-win_amd64.whl", hash = "sha256:c6008de247150668a705a6338156efb92334113421ceecf7438a12c9a12dab23", size = 7032347, upload-time = "2026-02-11T04:20:23.932Z" }, - { url = "https://files.pythonhosted.org/packages/79/13/c7922edded3dcdaf10c59297540b72785620abc0538872c819915746757d/pillow-12.1.1-cp310-cp310-win_arm64.whl", hash = "sha256:1a9b0ee305220b392e1124a764ee4265bd063e54a751a6b62eff69992f457fa9", size = 2453457, upload-time = "2026-02-11T04:20:25.392Z" }, { url = "https://files.pythonhosted.org/packages/2b/46/5da1ec4a5171ee7bf1a0efa064aba70ba3d6e0788ce3f5acd1375d23c8c0/pillow-12.1.1-cp311-cp311-macosx_10_10_x86_64.whl", hash = "sha256:e879bb6cd5c73848ef3b2b48b8af9ff08c5b71ecda8048b7dd22d8a33f60be32", size = 5304084, upload-time = "2026-02-11T04:20:27.501Z" }, { url = "https://files.pythonhosted.org/packages/78/93/a29e9bc02d1cf557a834da780ceccd54e02421627200696fcf805ebdc3fb/pillow-12.1.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:365b10bb9417dd4498c0e3b128018c4a624dc11c7b97d8cc54effe3b096f4c38", size = 4657866, upload-time = "2026-02-11T04:20:29.827Z" }, { url = "https://files.pythonhosted.org/packages/13/84/583a4558d492a179d31e4aae32eadce94b9acf49c0337c4ce0b70e0a01f2/pillow-12.1.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:d4ce8e329c93845720cd2014659ca67eac35f6433fd3050393d85f3ecef0dad5", size = 6232148, upload-time = "2026-02-11T04:20:31.329Z" }, @@ -1991,21 +1641,6 @@ version = "0.4.1" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/9e/da/e9fc233cf63743258bff22b3dfa7ea5baef7b5bc324af47a0ad89b8ffc6f/propcache-0.4.1.tar.gz", hash = "sha256:f48107a8c637e80362555f37ecf49abe20370e557cc4ab374f04ec4423c97c3d", size = 46442, upload-time = "2025-10-08T19:49:02.291Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/3c/0e/934b541323035566a9af292dba85a195f7b78179114f2c6ebb24551118a9/propcache-0.4.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:7c2d1fa3201efaf55d730400d945b5b3ab6e672e100ba0f9a409d950ab25d7db", size = 79534, upload-time = "2025-10-08T19:46:02.083Z" }, - { url = "https://files.pythonhosted.org/packages/a1/6b/db0d03d96726d995dc7171286c6ba9d8d14251f37433890f88368951a44e/propcache-0.4.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:1eb2994229cc8ce7fe9b3db88f5465f5fd8651672840b2e426b88cdb1a30aac8", size = 45526, upload-time = "2025-10-08T19:46:03.884Z" }, - { url = "https://files.pythonhosted.org/packages/e4/c3/82728404aea669e1600f304f2609cde9e665c18df5a11cdd57ed73c1dceb/propcache-0.4.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:66c1f011f45a3b33d7bcb22daed4b29c0c9e2224758b6be00686731e1b46f925", size = 47263, upload-time = "2025-10-08T19:46:05.405Z" }, - { url = "https://files.pythonhosted.org/packages/df/1b/39313ddad2bf9187a1432654c38249bab4562ef535ef07f5eb6eb04d0b1b/propcache-0.4.1-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9a52009f2adffe195d0b605c25ec929d26b36ef986ba85244891dee3b294df21", size = 201012, upload-time = "2025-10-08T19:46:07.165Z" }, - { url = "https://files.pythonhosted.org/packages/5b/01/f1d0b57d136f294a142acf97f4ed58c8e5b974c21e543000968357115011/propcache-0.4.1-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:5d4e2366a9c7b837555cf02fb9be2e3167d333aff716332ef1b7c3a142ec40c5", size = 209491, upload-time = "2025-10-08T19:46:08.909Z" }, - { url = "https://files.pythonhosted.org/packages/a1/c8/038d909c61c5bb039070b3fb02ad5cccdb1dde0d714792e251cdb17c9c05/propcache-0.4.1-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:9d2b6caef873b4f09e26ea7e33d65f42b944837563a47a94719cc3544319a0db", size = 215319, upload-time = "2025-10-08T19:46:10.7Z" }, - { url = "https://files.pythonhosted.org/packages/08/57/8c87e93142b2c1fa2408e45695205a7ba05fb5db458c0bf5c06ba0e09ea6/propcache-0.4.1-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:2b16ec437a8c8a965ecf95739448dd938b5c7f56e67ea009f4300d8df05f32b7", size = 196856, upload-time = "2025-10-08T19:46:12.003Z" }, - { url = "https://files.pythonhosted.org/packages/42/df/5615fec76aa561987a534759b3686008a288e73107faa49a8ae5795a9f7a/propcache-0.4.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:296f4c8ed03ca7476813fe666c9ea97869a8d7aec972618671b33a38a5182ef4", size = 193241, upload-time = "2025-10-08T19:46:13.495Z" }, - { url = "https://files.pythonhosted.org/packages/d5/21/62949eb3a7a54afe8327011c90aca7e03547787a88fb8bd9726806482fea/propcache-0.4.1-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:1f0978529a418ebd1f49dad413a2b68af33f85d5c5ca5c6ca2a3bed375a7ac60", size = 190552, upload-time = "2025-10-08T19:46:14.938Z" }, - { url = "https://files.pythonhosted.org/packages/30/ee/ab4d727dd70806e5b4de96a798ae7ac6e4d42516f030ee60522474b6b332/propcache-0.4.1-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:fd138803047fb4c062b1c1dd95462f5209456bfab55c734458f15d11da288f8f", size = 200113, upload-time = "2025-10-08T19:46:16.695Z" }, - { url = "https://files.pythonhosted.org/packages/8a/0b/38b46208e6711b016aa8966a3ac793eee0d05c7159d8342aa27fc0bc365e/propcache-0.4.1-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:8c9b3cbe4584636d72ff556d9036e0c9317fa27b3ac1f0f558e7e84d1c9c5900", size = 200778, upload-time = "2025-10-08T19:46:18.023Z" }, - { url = "https://files.pythonhosted.org/packages/cf/81/5abec54355ed344476bee711e9f04815d4b00a311ab0535599204eecc257/propcache-0.4.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:f93243fdc5657247533273ac4f86ae106cc6445a0efacb9a1bfe982fcfefd90c", size = 193047, upload-time = "2025-10-08T19:46:19.449Z" }, - { url = "https://files.pythonhosted.org/packages/ec/b6/1f237c04e32063cb034acd5f6ef34ef3a394f75502e72703545631ab1ef6/propcache-0.4.1-cp310-cp310-win32.whl", hash = "sha256:a0ee98db9c5f80785b266eb805016e36058ac72c51a064040f2bc43b61101cdb", size = 38093, upload-time = "2025-10-08T19:46:20.643Z" }, - { url = "https://files.pythonhosted.org/packages/a6/67/354aac4e0603a15f76439caf0427781bcd6797f370377f75a642133bc954/propcache-0.4.1-cp310-cp310-win_amd64.whl", hash = "sha256:1cdb7988c4e5ac7f6d175a28a9aa0c94cb6f2ebe52756a3c0cda98d2809a9e37", size = 41638, upload-time = "2025-10-08T19:46:21.935Z" }, - { url = "https://files.pythonhosted.org/packages/e0/e1/74e55b9fd1a4c209ff1a9a824bf6c8b3d1fc5a1ac3eabe23462637466785/propcache-0.4.1-cp310-cp310-win_arm64.whl", hash = "sha256:d82ad62b19645419fe79dd63b3f9253e15b30e955c0170e5cebc350c1844e581", size = 38229, upload-time = "2025-10-08T19:46:23.368Z" }, { url = "https://files.pythonhosted.org/packages/8c/d4/4e2c9aaf7ac2242b9358f98dccd8f90f2605402f5afeff6c578682c2c491/propcache-0.4.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:60a8fda9644b7dfd5dece8c61d8a85e271cb958075bfc4e01083c148b61a7caf", size = 80208, upload-time = "2025-10-08T19:46:24.597Z" }, { url = "https://files.pythonhosted.org/packages/c2/21/d7b68e911f9c8e18e4ae43bdbc1e1e9bbd971f8866eb81608947b6f585ff/propcache-0.4.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c30b53e7e6bda1d547cabb47c825f3843a0a1a42b0496087bb58d8fedf9f41b5", size = 45777, upload-time = "2025-10-08T19:46:25.733Z" }, { url = "https://files.pythonhosted.org/packages/d3/1d/11605e99ac8ea9435651ee71ab4cb4bf03f0949586246476a25aadfec54a/propcache-0.4.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:6918ecbd897443087a3b7cd978d56546a812517dcaaca51b49526720571fa93e", size = 47647, upload-time = "2025-10-08T19:46:27.304Z" }, @@ -2139,19 +1774,6 @@ dependencies = [ ] sdist = { url = "https://files.pythonhosted.org/packages/71/70/23b021c950c2addd24ec408e9ab05d59b035b39d97cdc1130e1bce647bb6/pydantic_core-2.41.5.tar.gz", hash = "sha256:08daa51ea16ad373ffd5e7606252cc32f07bc72b28284b6bc9c6df804816476e", size = 460952, upload-time = "2025-11-04T13:43:49.098Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/c6/90/32c9941e728d564b411d574d8ee0cf09b12ec978cb22b294995bae5549a5/pydantic_core-2.41.5-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:77b63866ca88d804225eaa4af3e664c5faf3568cea95360d21f4725ab6e07146", size = 2107298, upload-time = "2025-11-04T13:39:04.116Z" }, - { url = "https://files.pythonhosted.org/packages/fb/a8/61c96a77fe28993d9a6fb0f4127e05430a267b235a124545d79fea46dd65/pydantic_core-2.41.5-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:dfa8a0c812ac681395907e71e1274819dec685fec28273a28905df579ef137e2", size = 1901475, upload-time = "2025-11-04T13:39:06.055Z" }, - { url = "https://files.pythonhosted.org/packages/5d/b6/338abf60225acc18cdc08b4faef592d0310923d19a87fba1faf05af5346e/pydantic_core-2.41.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5921a4d3ca3aee735d9fd163808f5e8dd6c6972101e4adbda9a4667908849b97", size = 1918815, upload-time = "2025-11-04T13:39:10.41Z" }, - { url = "https://files.pythonhosted.org/packages/d1/1c/2ed0433e682983d8e8cba9c8d8ef274d4791ec6a6f24c58935b90e780e0a/pydantic_core-2.41.5-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:e25c479382d26a2a41b7ebea1043564a937db462816ea07afa8a44c0866d52f9", size = 2065567, upload-time = "2025-11-04T13:39:12.244Z" }, - { url = "https://files.pythonhosted.org/packages/b3/24/cf84974ee7d6eae06b9e63289b7b8f6549d416b5c199ca2d7ce13bbcf619/pydantic_core-2.41.5-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f547144f2966e1e16ae626d8ce72b4cfa0caedc7fa28052001c94fb2fcaa1c52", size = 2230442, upload-time = "2025-11-04T13:39:13.962Z" }, - { url = "https://files.pythonhosted.org/packages/fd/21/4e287865504b3edc0136c89c9c09431be326168b1eb7841911cbc877a995/pydantic_core-2.41.5-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6f52298fbd394f9ed112d56f3d11aabd0d5bd27beb3084cc3d8ad069483b8941", size = 2350956, upload-time = "2025-11-04T13:39:15.889Z" }, - { url = "https://files.pythonhosted.org/packages/a8/76/7727ef2ffa4b62fcab916686a68a0426b9b790139720e1934e8ba797e238/pydantic_core-2.41.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:100baa204bb412b74fe285fb0f3a385256dad1d1879f0a5cb1499ed2e83d132a", size = 2068253, upload-time = "2025-11-04T13:39:17.403Z" }, - { url = "https://files.pythonhosted.org/packages/d5/8c/a4abfc79604bcb4c748e18975c44f94f756f08fb04218d5cb87eb0d3a63e/pydantic_core-2.41.5-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:05a2c8852530ad2812cb7914dc61a1125dc4e06252ee98e5638a12da6cc6fb6c", size = 2177050, upload-time = "2025-11-04T13:39:19.351Z" }, - { url = "https://files.pythonhosted.org/packages/67/b1/de2e9a9a79b480f9cb0b6e8b6ba4c50b18d4e89852426364c66aa82bb7b3/pydantic_core-2.41.5-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:29452c56df2ed968d18d7e21f4ab0ac55e71dc59524872f6fc57dcf4a3249ed2", size = 2147178, upload-time = "2025-11-04T13:39:21Z" }, - { url = "https://files.pythonhosted.org/packages/16/c1/dfb33f837a47b20417500efaa0378adc6635b3c79e8369ff7a03c494b4ac/pydantic_core-2.41.5-cp310-cp310-musllinux_1_1_armv7l.whl", hash = "sha256:d5160812ea7a8a2ffbe233d8da666880cad0cbaf5d4de74ae15c313213d62556", size = 2341833, upload-time = "2025-11-04T13:39:22.606Z" }, - { url = "https://files.pythonhosted.org/packages/47/36/00f398642a0f4b815a9a558c4f1dca1b4020a7d49562807d7bc9ff279a6c/pydantic_core-2.41.5-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:df3959765b553b9440adfd3c795617c352154e497a4eaf3752555cfb5da8fc49", size = 2321156, upload-time = "2025-11-04T13:39:25.843Z" }, - { url = "https://files.pythonhosted.org/packages/7e/70/cad3acd89fde2010807354d978725ae111ddf6d0ea46d1ea1775b5c1bd0c/pydantic_core-2.41.5-cp310-cp310-win32.whl", hash = "sha256:1f8d33a7f4d5a7889e60dc39856d76d09333d8a6ed0f5f1190635cbec70ec4ba", size = 1989378, upload-time = "2025-11-04T13:39:27.92Z" }, - { url = "https://files.pythonhosted.org/packages/76/92/d338652464c6c367e5608e4488201702cd1cbb0f33f7b6a85a60fe5f3720/pydantic_core-2.41.5-cp310-cp310-win_amd64.whl", hash = "sha256:62de39db01b8d593e45871af2af9e497295db8d73b085f6bfd0b18c83c70a8f9", size = 2013622, upload-time = "2025-11-04T13:39:29.848Z" }, { url = "https://files.pythonhosted.org/packages/e8/72/74a989dd9f2084b3d9530b0915fdda64ac48831c30dbf7c72a41a5232db8/pydantic_core-2.41.5-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:a3a52f6156e73e7ccb0f8cced536adccb7042be67cb45f9562e12b319c119da6", size = 2105873, upload-time = "2025-11-04T13:39:31.373Z" }, { url = "https://files.pythonhosted.org/packages/12/44/37e403fd9455708b3b942949e1d7febc02167662bf1a7da5b78ee1ea2842/pydantic_core-2.41.5-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:7f3bf998340c6d4b0c9a2f02d6a400e51f123b59565d74dc60d252ce888c260b", size = 1899826, upload-time = "2025-11-04T13:39:32.897Z" }, { url = "https://files.pythonhosted.org/packages/33/7f/1d5cab3ccf44c1935a359d51a8a2a9e1a654b744b5e7f80d41b88d501eec/pydantic_core-2.41.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:378bec5c66998815d224c9ca994f1e14c0c21cb95d2f52b6021cc0b2a58f2a5a", size = 1917869, upload-time = "2025-11-04T13:39:34.469Z" }, @@ -2202,14 +1824,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/aa/81/05e400037eaf55ad400bcd318c05bb345b57e708887f07ddb2d20e3f0e98/pydantic_core-2.41.5-graalpy312-graalpy250_312_native-macosx_11_0_arm64.whl", hash = "sha256:aabf5777b5c8ca26f7824cb4a120a740c9588ed58df9b2d196ce92fba42ff8dc", size = 1915388, upload-time = "2025-11-04T13:42:52.215Z" }, { url = "https://files.pythonhosted.org/packages/6e/0d/e3549b2399f71d56476b77dbf3cf8937cec5cd70536bdc0e374a421d0599/pydantic_core-2.41.5-graalpy312-graalpy250_312_native-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c007fe8a43d43b3969e8469004e9845944f1a80e6acd47c150856bb87f230c56", size = 1942879, upload-time = "2025-11-04T13:42:56.483Z" }, { url = "https://files.pythonhosted.org/packages/f7/07/34573da085946b6a313d7c42f82f16e8920bfd730665de2d11c0c37a74b5/pydantic_core-2.41.5-graalpy312-graalpy250_312_native-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:76d0819de158cd855d1cbb8fcafdf6f5cf1eb8e470abe056d5d161106e38062b", size = 2139017, upload-time = "2025-11-04T13:42:59.471Z" }, - { url = "https://files.pythonhosted.org/packages/e6/b0/1a2aa41e3b5a4ba11420aba2d091b2d17959c8d1519ece3627c371951e73/pydantic_core-2.41.5-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:b5819cd790dbf0c5eb9f82c73c16b39a65dd6dd4d1439dcdea7816ec9adddab8", size = 2103351, upload-time = "2025-11-04T13:43:02.058Z" }, - { url = "https://files.pythonhosted.org/packages/a4/ee/31b1f0020baaf6d091c87900ae05c6aeae101fa4e188e1613c80e4f1ea31/pydantic_core-2.41.5-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:5a4e67afbc95fa5c34cf27d9089bca7fcab4e51e57278d710320a70b956d1b9a", size = 1925363, upload-time = "2025-11-04T13:43:05.159Z" }, - { url = "https://files.pythonhosted.org/packages/e1/89/ab8e86208467e467a80deaca4e434adac37b10a9d134cd2f99b28a01e483/pydantic_core-2.41.5-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ece5c59f0ce7d001e017643d8d24da587ea1f74f6993467d85ae8a5ef9d4f42b", size = 2135615, upload-time = "2025-11-04T13:43:08.116Z" }, - { url = "https://files.pythonhosted.org/packages/99/0a/99a53d06dd0348b2008f2f30884b34719c323f16c3be4e6cc1203b74a91d/pydantic_core-2.41.5-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:16f80f7abe3351f8ea6858914ddc8c77e02578544a0ebc15b4c2e1a0e813b0b2", size = 2175369, upload-time = "2025-11-04T13:43:12.49Z" }, - { url = "https://files.pythonhosted.org/packages/6d/94/30ca3b73c6d485b9bb0bc66e611cff4a7138ff9736b7e66bcf0852151636/pydantic_core-2.41.5-pp310-pypy310_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:33cb885e759a705b426baada1fe68cbb0a2e68e34c5d0d0289a364cf01709093", size = 2144218, upload-time = "2025-11-04T13:43:15.431Z" }, - { url = "https://files.pythonhosted.org/packages/87/57/31b4f8e12680b739a91f472b5671294236b82586889ef764b5fbc6669238/pydantic_core-2.41.5-pp310-pypy310_pp73-musllinux_1_1_armv7l.whl", hash = "sha256:c8d8b4eb992936023be7dee581270af5c6e0697a8559895f527f5b7105ecd36a", size = 2329951, upload-time = "2025-11-04T13:43:18.062Z" }, - { url = "https://files.pythonhosted.org/packages/7d/73/3c2c8edef77b8f7310e6fb012dbc4b8551386ed575b9eb6fb2506e28a7eb/pydantic_core-2.41.5-pp310-pypy310_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:242a206cd0318f95cd21bdacff3fcc3aab23e79bba5cac3db5a841c9ef9c6963", size = 2318428, upload-time = "2025-11-04T13:43:20.679Z" }, - { url = "https://files.pythonhosted.org/packages/2f/02/8559b1f26ee0d502c74f9cca5c0d2fd97e967e083e006bbbb4e97f3a043a/pydantic_core-2.41.5-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:d3a978c4f57a597908b7e697229d996d77a6d3c94901e9edee593adada95ce1a", size = 2147009, upload-time = "2025-11-04T13:43:23.286Z" }, { url = "https://files.pythonhosted.org/packages/5f/9b/1b3f0e9f9305839d7e84912f9e8bfbd191ed1b1ef48083609f0dabde978c/pydantic_core-2.41.5-pp311-pypy311_pp73-macosx_10_12_x86_64.whl", hash = "sha256:b2379fa7ed44ddecb5bfe4e48577d752db9fc10be00a6b7446e9663ba143de26", size = 2101980, upload-time = "2025-11-04T13:43:25.97Z" }, { url = "https://files.pythonhosted.org/packages/a4/ed/d71fefcb4263df0da6a85b5d8a7508360f2f2e9b3bf5814be9c8bccdccc1/pydantic_core-2.41.5-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:266fb4cbf5e3cbd0b53669a6d1b039c45e3ce651fd5442eff4d07c2cc8d66808", size = 1923865, upload-time = "2025-11-04T13:43:28.763Z" }, { url = "https://files.pythonhosted.org/packages/ce/3a/626b38db460d675f873e4444b4bb030453bbe7b4ba55df821d026a0493c4/pydantic_core-2.41.5-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:58133647260ea01e4d0500089a8c4f07bd7aa6ce109682b1426394988d8aaacc", size = 2134256, upload-time = "2025-11-04T13:43:31.71Z" }, @@ -2233,35 +1847,21 @@ wheels = [ name = "pyjwt" version = "2.12.1" source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "typing-extensions", marker = "python_full_version < '3.11'" }, -] sdist = { url = "https://files.pythonhosted.org/packages/c2/27/a3b6e5bf6ff856d2509292e95c8f57f0df7017cf5394921fc4e4ef40308a/pyjwt-2.12.1.tar.gz", hash = "sha256:c74a7a2adf861c04d002db713dd85f84beb242228e671280bf709d765b03672b", size = 102564, upload-time = "2026-03-13T19:27:37.25Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/e5/7a/8dd906bd22e79e47397a61742927f6747fe93242ef86645ee9092e610244/pyjwt-2.12.1-py3-none-any.whl", hash = "sha256:28ca37c070cad8ba8cd9790cd940535d40274d22f80ab87f3ac6a713e6e8454c", size = 29726, upload-time = "2026-03-13T19:27:35.677Z" }, ] -[[package]] -name = "pyreadline3" -version = "3.5.4" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/0f/49/4cea918a08f02817aabae639e3d0ac046fef9f9180518a3ad394e22da148/pyreadline3-3.5.4.tar.gz", hash = "sha256:8d57d53039a1c75adba8e50dd3d992b28143480816187ea5efbd5c78e6c885b7", size = 99839, upload-time = "2024-09-19T02:40:10.062Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/5a/dc/491b7661614ab97483abf2056be1deee4dc2490ecbf7bff9ab5cdbac86e1/pyreadline3-3.5.4-py3-none-any.whl", hash = "sha256:eaf8e6cc3c49bcccf145fc6067ba8643d1df34d604a1ec0eccbf7a18e6d3fae6", size = 83178, upload-time = "2024-09-19T02:40:08.598Z" }, -] - [[package]] name = "pytest" version = "9.0.2" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "colorama", marker = "sys_platform == 'win32'" }, - { name = "exceptiongroup", marker = "python_full_version < '3.11'" }, { name = "iniconfig" }, { name = "packaging" }, { name = "pluggy" }, { name = "pygments" }, - { name = "tomli", marker = "python_full_version < '3.11'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/d1/db/7ef3487e0fb0049ddb5ce41d3a49c235bf9ad299b6a25d5780a89f19230f/pytest-9.0.2.tar.gz", hash = "sha256:75186651a92bd89611d1d9fc20f0b4345fd827c41ccd5c299a868a05d70edf11", size = 1568901, upload-time = "2025-12-06T21:30:51.014Z" } wheels = [ @@ -2273,7 +1873,6 @@ name = "pytest-asyncio" version = "1.3.0" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "backports-asyncio-runner", marker = "python_full_version < '3.11'" }, { name = "pytest" }, { name = "typing-extensions", marker = "python_full_version < '3.13'" }, ] @@ -2324,15 +1923,6 @@ version = "6.0.3" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/05/8e/961c0007c59b8dd7729d542c61a4d537767a59645b82a0b521206e1e25c2/pyyaml-6.0.3.tar.gz", hash = "sha256:d76623373421df22fb4cf8817020cbb7ef15c725b9d5e45f17e189bfc384190f", size = 130960, upload-time = "2025-09-25T21:33:16.546Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/f4/a0/39350dd17dd6d6c6507025c0e53aef67a9293a6d37d3511f23ea510d5800/pyyaml-6.0.3-cp310-cp310-macosx_10_13_x86_64.whl", hash = "sha256:214ed4befebe12df36bcc8bc2b64b396ca31be9304b8f59e25c11cf94a4c033b", size = 184227, upload-time = "2025-09-25T21:31:46.04Z" }, - { url = "https://files.pythonhosted.org/packages/05/14/52d505b5c59ce73244f59c7a50ecf47093ce4765f116cdb98286a71eeca2/pyyaml-6.0.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:02ea2dfa234451bbb8772601d7b8e426c2bfa197136796224e50e35a78777956", size = 174019, upload-time = "2025-09-25T21:31:47.706Z" }, - { url = "https://files.pythonhosted.org/packages/43/f7/0e6a5ae5599c838c696adb4e6330a59f463265bfa1e116cfd1fbb0abaaae/pyyaml-6.0.3-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b30236e45cf30d2b8e7b3e85881719e98507abed1011bf463a8fa23e9c3e98a8", size = 740646, upload-time = "2025-09-25T21:31:49.21Z" }, - { url = "https://files.pythonhosted.org/packages/2f/3a/61b9db1d28f00f8fd0ae760459a5c4bf1b941baf714e207b6eb0657d2578/pyyaml-6.0.3-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:66291b10affd76d76f54fad28e22e51719ef9ba22b29e1d7d03d6777a9174198", size = 840793, upload-time = "2025-09-25T21:31:50.735Z" }, - { url = "https://files.pythonhosted.org/packages/7a/1e/7acc4f0e74c4b3d9531e24739e0ab832a5edf40e64fbae1a9c01941cabd7/pyyaml-6.0.3-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9c7708761fccb9397fe64bbc0395abcae8c4bf7b0eac081e12b809bf47700d0b", size = 770293, upload-time = "2025-09-25T21:31:51.828Z" }, - { url = "https://files.pythonhosted.org/packages/8b/ef/abd085f06853af0cd59fa5f913d61a8eab65d7639ff2a658d18a25d6a89d/pyyaml-6.0.3-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:418cf3f2111bc80e0933b2cd8cd04f286338bb88bdc7bc8e6dd775ebde60b5e0", size = 732872, upload-time = "2025-09-25T21:31:53.282Z" }, - { url = "https://files.pythonhosted.org/packages/1f/15/2bc9c8faf6450a8b3c9fc5448ed869c599c0a74ba2669772b1f3a0040180/pyyaml-6.0.3-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:5e0b74767e5f8c593e8c9b5912019159ed0533c70051e9cce3e8b6aa699fcd69", size = 758828, upload-time = "2025-09-25T21:31:54.807Z" }, - { url = "https://files.pythonhosted.org/packages/a3/00/531e92e88c00f4333ce359e50c19b8d1de9fe8d581b1534e35ccfbc5f393/pyyaml-6.0.3-cp310-cp310-win32.whl", hash = "sha256:28c8d926f98f432f88adc23edf2e6d4921ac26fb084b028c733d01868d19007e", size = 142415, upload-time = "2025-09-25T21:31:55.885Z" }, - { url = "https://files.pythonhosted.org/packages/2a/fa/926c003379b19fca39dd4634818b00dec6c62d87faf628d1394e137354d4/pyyaml-6.0.3-cp310-cp310-win_amd64.whl", hash = "sha256:bdb2c67c6c1390b63c6ff89f210c8fd09d9a1217a465701eac7316313c915e4c", size = 158561, upload-time = "2025-09-25T21:31:57.406Z" }, { url = "https://files.pythonhosted.org/packages/6d/16/a95b6757765b7b031c9374925bb718d55e0a9ba8a1b6a12d25962ea44347/pyyaml-6.0.3-cp311-cp311-macosx_10_13_x86_64.whl", hash = "sha256:44edc647873928551a01e7a563d7452ccdebee747728c1080d881d68af7b997e", size = 185826, upload-time = "2025-09-25T21:31:58.655Z" }, { url = "https://files.pythonhosted.org/packages/16/19/13de8e4377ed53079ee996e1ab0a9c33ec2faf808a4647b7b4c0d46dd239/pyyaml-6.0.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:652cb6edd41e718550aad172851962662ff2681490a8a711af6a4d288dd96824", size = 175577, upload-time = "2025-09-25T21:32:00.088Z" }, { url = "https://files.pythonhosted.org/packages/0c/62/d2eb46264d4b157dae1275b573017abec435397aa59cbcdab6fc978a8af4/pyyaml-6.0.3-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:10892704fc220243f5305762e276552a0395f7beb4dbf9b14ec8fd43b57f126c", size = 775556, upload-time = "2025-09-25T21:32:01.31Z" }, @@ -2370,23 +1960,6 @@ version = "2026.2.28" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/8b/71/41455aa99a5a5ac1eaf311f5d8efd9ce6433c03ac1e0962de163350d0d97/regex-2026.2.28.tar.gz", hash = "sha256:a729e47d418ea11d03469f321aaf67cdee8954cde3ff2cf8403ab87951ad10f2", size = 415184, upload-time = "2026-02-28T02:19:42.792Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/70/b8/845a927e078f5e5cc55d29f57becbfde0003d52806544531ab3f2da4503c/regex-2026.2.28-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:fc48c500838be6882b32748f60a15229d2dea96e59ef341eaa96ec83538f498d", size = 488461, upload-time = "2026-02-28T02:15:48.405Z" }, - { url = "https://files.pythonhosted.org/packages/32/f9/8a0034716684e38a729210ded6222249f29978b24b684f448162ef21f204/regex-2026.2.28-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:2afa673660928d0b63d84353c6c08a8a476ddfc4a47e11742949d182e6863ce8", size = 290774, upload-time = "2026-02-28T02:15:51.738Z" }, - { url = "https://files.pythonhosted.org/packages/a6/ba/b27feefffbb199528dd32667cd172ed484d9c197618c575f01217fbe6103/regex-2026.2.28-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:7ab218076eb0944549e7fe74cf0e2b83a82edb27e81cc87411f76240865e04d5", size = 288737, upload-time = "2026-02-28T02:15:53.534Z" }, - { url = "https://files.pythonhosted.org/packages/18/c5/65379448ca3cbfe774fcc33774dc8295b1ee97dc3237ae3d3c7b27423c9d/regex-2026.2.28-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:94d63db12e45a9b9f064bfe4800cefefc7e5f182052e4c1b774d46a40ab1d9bb", size = 782675, upload-time = "2026-02-28T02:15:55.488Z" }, - { url = "https://files.pythonhosted.org/packages/aa/30/6fa55bef48090f900fbd4649333791fc3e6467380b9e775e741beeb3231f/regex-2026.2.28-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:195237dc327858a7721bf8b0bbbef797554bc13563c3591e91cd0767bacbe359", size = 850514, upload-time = "2026-02-28T02:15:57.509Z" }, - { url = "https://files.pythonhosted.org/packages/a9/28/9ca180fb3787a54150209754ac06a42409913571fa94994f340b3bba4e1e/regex-2026.2.28-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:b387a0d092dac157fb026d737dde35ff3e49ef27f285343e7c6401851239df27", size = 896612, upload-time = "2026-02-28T02:15:59.682Z" }, - { url = "https://files.pythonhosted.org/packages/46/b5/f30d7d3936d6deecc3ea7bea4f7d3c5ee5124e7c8de372226e436b330a55/regex-2026.2.28-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:3935174fa4d9f70525a4367aaff3cb8bc0548129d114260c29d9dfa4a5b41692", size = 791691, upload-time = "2026-02-28T02:16:01.752Z" }, - { url = "https://files.pythonhosted.org/packages/f5/34/96631bcf446a56ba0b2a7f684358a76855dfe315b7c2f89b35388494ede0/regex-2026.2.28-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:2b2b23587b26496ff5fd40df4278becdf386813ec00dc3533fa43a4cf0e2ad3c", size = 783111, upload-time = "2026-02-28T02:16:03.651Z" }, - { url = "https://files.pythonhosted.org/packages/39/54/f95cb7a85fe284d41cd2f3625e0f2ae30172b55dfd2af1d9b4eaef6259d7/regex-2026.2.28-cp310-cp310-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:3b24bd7e9d85dc7c6a8bd2aa14ecd234274a0248335a02adeb25448aecdd420d", size = 767512, upload-time = "2026-02-28T02:16:05.616Z" }, - { url = "https://files.pythonhosted.org/packages/3d/af/a650f64a79c02a97f73f64d4e7fc4cc1984e64affab14075e7c1f9a2db34/regex-2026.2.28-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:bd477d5f79920338107f04aa645f094032d9e3030cc55be581df3d1ef61aa318", size = 773920, upload-time = "2026-02-28T02:16:08.325Z" }, - { url = "https://files.pythonhosted.org/packages/72/f8/3f9c2c2af37aedb3f5a1e7227f81bea065028785260d9cacc488e43e6997/regex-2026.2.28-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:b49eb78048c6354f49e91e4b77da21257fecb92256b6d599ae44403cab30b05b", size = 846681, upload-time = "2026-02-28T02:16:10.381Z" }, - { url = "https://files.pythonhosted.org/packages/54/12/8db04a334571359f4d127d8f89550917ec6561a2fddfd69cd91402b47482/regex-2026.2.28-cp310-cp310-musllinux_1_2_riscv64.whl", hash = "sha256:a25c7701e4f7a70021db9aaf4a4a0a67033c6318752146e03d1b94d32006217e", size = 755565, upload-time = "2026-02-28T02:16:11.972Z" }, - { url = "https://files.pythonhosted.org/packages/da/bc/91c22f384d79324121b134c267a86ca90d11f8016aafb1dc5bee05890ee3/regex-2026.2.28-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:9dd450db6458387167e033cfa80887a34c99c81d26da1bf8b0b41bf8c9cac88e", size = 835789, upload-time = "2026-02-28T02:16:14.036Z" }, - { url = "https://files.pythonhosted.org/packages/46/a7/4cc94fd3af01dcfdf5a9ed75c8e15fd80fcd62cc46da7592b1749e9c35db/regex-2026.2.28-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:2954379dd20752e82d22accf3ff465311cbb2bac6c1f92c4afd400e1757f7451", size = 780094, upload-time = "2026-02-28T02:16:15.468Z" }, - { url = "https://files.pythonhosted.org/packages/3c/21/e5a38f420af3c77cab4a65f0c3a55ec02ac9babf04479cfd282d356988a6/regex-2026.2.28-cp310-cp310-win32.whl", hash = "sha256:1f8b17be5c27a684ea6759983c13506bd77bfc7c0347dff41b18ce5ddd2ee09a", size = 266025, upload-time = "2026-02-28T02:16:16.828Z" }, - { url = "https://files.pythonhosted.org/packages/4d/0a/205c4c1466a36e04d90afcd01d8908bac327673050c7fe316b2416d99d3d/regex-2026.2.28-cp310-cp310-win_amd64.whl", hash = "sha256:dd8847c4978bc3c7e6c826fb745f5570e518b8459ac2892151ce6627c7bc00d5", size = 277965, upload-time = "2026-02-28T02:16:18.752Z" }, - { url = "https://files.pythonhosted.org/packages/c3/4d/29b58172f954b6ec2c5ed28529a65e9026ab96b4b7016bcd3858f1c31d3c/regex-2026.2.28-cp310-cp310-win_arm64.whl", hash = "sha256:73cdcdbba8028167ea81490c7f45280113e41db2c7afb65a276f4711fa3bcbff", size = 270336, upload-time = "2026-02-28T02:16:20.735Z" }, { url = "https://files.pythonhosted.org/packages/04/db/8cbfd0ba3f302f2d09dd0019a9fcab74b63fee77a76c937d0e33161fb8c1/regex-2026.2.28-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:e621fb7c8dc147419b28e1702f58a0177ff8308a76fa295c71f3e7827849f5d9", size = 488462, upload-time = "2026-02-28T02:16:22.616Z" }, { url = "https://files.pythonhosted.org/packages/5d/10/ccc22c52802223f2368731964ddd117799e1390ffc39dbb31634a83022ee/regex-2026.2.28-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:0d5bef2031cbf38757a0b0bc4298bb4824b6332d28edc16b39247228fbdbad97", size = 290774, upload-time = "2026-02-28T02:16:23.993Z" }, { url = "https://files.pythonhosted.org/packages/62/b9/6796b3bf3101e64117201aaa3a5a030ec677ecf34b3cd6141b5d5c6c67d5/regex-2026.2.28-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:bcb399ed84eabf4282587ba151f2732ad8168e66f1d3f85b1d038868fe547703", size = 288724, upload-time = "2026-02-28T02:16:25.403Z" }, @@ -2526,10 +2099,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/4a/d8/0c8a7dc9b41dcac53c4cbf9df2b9c83e0e0097203de8b37a712b345c0be5/safetensors-0.7.0-cp38-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:b0f6d66c1c538d5a94a73aa9ddca8ccc4227e6c9ff555322ea40bdd142391dd4", size = 677368, upload-time = "2025-11-19T15:18:41.627Z" }, { url = "https://files.pythonhosted.org/packages/05/e5/cb4b713c8a93469e3c5be7c3f8d77d307e65fe89673e731f5c2bfd0a9237/safetensors-0.7.0-cp38-abi3-win32.whl", hash = "sha256:c74af94bf3ac15ac4d0f2a7c7b4663a15f8c2ab15ed0fc7531ca61d0835eccba", size = 326423, upload-time = "2025-11-19T15:18:45.74Z" }, { url = "https://files.pythonhosted.org/packages/5d/e6/ec8471c8072382cb91233ba7267fd931219753bb43814cbc71757bfd4dab/safetensors-0.7.0-cp38-abi3-win_amd64.whl", hash = "sha256:d1239932053f56f3456f32eb9625590cc7582e905021f94636202a864d470755", size = 341380, upload-time = "2025-11-19T15:18:44.427Z" }, - { url = "https://files.pythonhosted.org/packages/a7/6a/4d08d89a6fcbe905c5ae68b8b34f0791850882fc19782d0d02c65abbdf3b/safetensors-0.7.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f4729811a6640d019a4b7ba8638ee2fd21fa5ca8c7e7bdf0fed62068fcaac737", size = 492430, upload-time = "2025-11-19T15:18:11.884Z" }, - { url = "https://files.pythonhosted.org/packages/dd/29/59ed8152b30f72c42d00d241e58eaca558ae9dbfa5695206e2e0f54c7063/safetensors-0.7.0-pp310-pypy310_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:12f49080303fa6bb424b362149a12949dfbbf1e06811a88f2307276b0c131afd", size = 503977, upload-time = "2025-11-19T15:18:17.523Z" }, - { url = "https://files.pythonhosted.org/packages/d3/0b/4811bfec67fa260e791369b16dab105e4bae82686120554cc484064e22b4/safetensors-0.7.0-pp310-pypy310_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0071bffba4150c2f46cae1432d31995d77acfd9f8db598b5d1a2ce67e8440ad2", size = 623890, upload-time = "2025-11-19T15:18:22.666Z" }, - { url = "https://files.pythonhosted.org/packages/58/5b/632a58724221ef03d78ab65062e82a1010e1bef8e8e0b9d7c6d7b8044841/safetensors-0.7.0-pp310-pypy310_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:473b32699f4200e69801bf5abf93f1a4ecd432a70984df164fc22ccf39c4a6f3", size = 531885, upload-time = "2025-11-19T15:18:27.146Z" }, ] [[package]] @@ -2617,10 +2186,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/fd/18/a545c4ea42af3df6effd7d13d250ba77a0a86fb20393143bbb9a92e434d4/tokenizers-0.22.2-cp39-abi3-win32.whl", hash = "sha256:a6bf3f88c554a2b653af81f3204491c818ae2ac6fbc09e76ef4773351292bc92", size = 2502363, upload-time = "2026-01-05T10:45:20.593Z" }, { url = "https://files.pythonhosted.org/packages/65/71/0670843133a43d43070abeb1949abfdef12a86d490bea9cd9e18e37c5ff7/tokenizers-0.22.2-cp39-abi3-win_amd64.whl", hash = "sha256:c9ea31edff2968b44a88f97d784c2f16dc0729b8b143ed004699ebca91f05c48", size = 2747786, upload-time = "2026-01-05T10:45:18.411Z" }, { url = "https://files.pythonhosted.org/packages/72/f4/0de46cfa12cdcbcd464cc59fde36912af405696f687e53a091fb432f694c/tokenizers-0.22.2-cp39-abi3-win_arm64.whl", hash = "sha256:9ce725d22864a1e965217204946f830c37876eee3b2ba6fc6255e8e903d5fcbc", size = 2612133, upload-time = "2026-01-05T10:45:17.232Z" }, - { url = "https://files.pythonhosted.org/packages/84/04/655b79dbcc9b3ac5f1479f18e931a344af67e5b7d3b251d2dcdcd7558592/tokenizers-0.22.2-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:753d47ebd4542742ef9261d9da92cd545b2cacbb48349a1225466745bb866ec4", size = 3282301, upload-time = "2026-01-05T10:40:34.858Z" }, - { url = "https://files.pythonhosted.org/packages/46/cd/e4851401f3d8f6f45d8480262ab6a5c8cb9c4302a790a35aa14eeed6d2fd/tokenizers-0.22.2-pp310-pypy310_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:e10bf9113d209be7cd046d40fbabbaf3278ff6d18eb4da4c500443185dc1896c", size = 3161308, upload-time = "2026-01-05T10:40:40.737Z" }, - { url = "https://files.pythonhosted.org/packages/6f/6e/55553992a89982cd12d4a66dddb5e02126c58677ea3931efcbe601d419db/tokenizers-0.22.2-pp310-pypy310_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:64d94e84f6660764e64e7e0b22baa72f6cd942279fdbb21d46abd70d179f0195", size = 3718964, upload-time = "2026-01-05T10:40:46.56Z" }, - { url = "https://files.pythonhosted.org/packages/59/8c/b1c87148aa15e099243ec9f0cf9d0e970cc2234c3257d558c25a2c5304e6/tokenizers-0.22.2-pp310-pypy310_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f01a9c019878532f98927d2bacb79bbb404b43d3437455522a00a30718cdedb5", size = 3373542, upload-time = "2026-01-05T10:40:52.803Z" }, ] [[package]] @@ -2678,8 +2243,7 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "filelock" }, { name = "huggingface-hub" }, - { name = "numpy", version = "2.2.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, - { name = "numpy", version = "2.4.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, + { name = "numpy" }, { name = "packaging" }, { name = "pyyaml" }, { name = "regex" }, @@ -2765,7 +2329,6 @@ dependencies = [ { name = "filelock" }, { name = "platformdirs" }, { name = "python-discovery" }, - { name = "typing-extensions", marker = "python_full_version < '3.11'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/aa/92/58199fe10049f9703c2666e809c4f686c54ef0a68b0f6afccf518c0b1eb9/virtualenv-21.2.0.tar.gz", hash = "sha256:1720dc3a62ef5b443092e3f499228599045d7fea4c79199770499df8becf9098", size = 5840618, upload-time = "2026-03-09T17:24:38.013Z" } wheels = [ @@ -2781,18 +2344,6 @@ dependencies = [ ] sdist = { url = "https://files.pythonhosted.org/packages/c2/c9/8869df9b2a2d6c59d79220a4db37679e74f807c559ffe5265e08b227a210/watchfiles-1.1.1.tar.gz", hash = "sha256:a173cb5c16c4f40ab19cecf48a534c409f7ea983ab8fed0741304a1c0a31b3f2", size = 94440, upload-time = "2025-10-14T15:06:21.08Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/a7/1a/206e8cf2dd86fddf939165a57b4df61607a1e0add2785f170a3f616b7d9f/watchfiles-1.1.1-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:eef58232d32daf2ac67f42dea51a2c80f0d03379075d44a587051e63cc2e368c", size = 407318, upload-time = "2025-10-14T15:04:18.753Z" }, - { url = "https://files.pythonhosted.org/packages/b3/0f/abaf5262b9c496b5dad4ed3c0e799cbecb1f8ea512ecb6ddd46646a9fca3/watchfiles-1.1.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:03fa0f5237118a0c5e496185cafa92878568b652a2e9a9382a5151b1a0380a43", size = 394478, upload-time = "2025-10-14T15:04:20.297Z" }, - { url = "https://files.pythonhosted.org/packages/b1/04/9cc0ba88697b34b755371f5ace8d3a4d9a15719c07bdc7bd13d7d8c6a341/watchfiles-1.1.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8ca65483439f9c791897f7db49202301deb6e15fe9f8fe2fed555bf986d10c31", size = 449894, upload-time = "2025-10-14T15:04:21.527Z" }, - { url = "https://files.pythonhosted.org/packages/d2/9c/eda4615863cd8621e89aed4df680d8c3ec3da6a4cf1da113c17decd87c7f/watchfiles-1.1.1-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:f0ab1c1af0cb38e3f598244c17919fb1a84d1629cc08355b0074b6d7f53138ac", size = 459065, upload-time = "2025-10-14T15:04:22.795Z" }, - { url = "https://files.pythonhosted.org/packages/84/13/f28b3f340157d03cbc8197629bc109d1098764abe1e60874622a0be5c112/watchfiles-1.1.1-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3bc570d6c01c206c46deb6e935a260be44f186a2f05179f52f7fcd2be086a94d", size = 488377, upload-time = "2025-10-14T15:04:24.138Z" }, - { url = "https://files.pythonhosted.org/packages/86/93/cfa597fa9389e122488f7ffdbd6db505b3b915ca7435ecd7542e855898c2/watchfiles-1.1.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e84087b432b6ac94778de547e08611266f1f8ffad28c0ee4c82e028b0fc5966d", size = 595837, upload-time = "2025-10-14T15:04:25.057Z" }, - { url = "https://files.pythonhosted.org/packages/57/1e/68c1ed5652b48d89fc24d6af905d88ee4f82fa8bc491e2666004e307ded1/watchfiles-1.1.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:620bae625f4cb18427b1bb1a2d9426dc0dd5a5ba74c7c2cdb9de405f7b129863", size = 473456, upload-time = "2025-10-14T15:04:26.497Z" }, - { url = "https://files.pythonhosted.org/packages/d5/dc/1a680b7458ffa3b14bb64878112aefc8f2e4f73c5af763cbf0bd43100658/watchfiles-1.1.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:544364b2b51a9b0c7000a4b4b02f90e9423d97fbbf7e06689236443ebcad81ab", size = 455614, upload-time = "2025-10-14T15:04:27.539Z" }, - { url = "https://files.pythonhosted.org/packages/61/a5/3d782a666512e01eaa6541a72ebac1d3aae191ff4a31274a66b8dd85760c/watchfiles-1.1.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:bbe1ef33d45bc71cf21364df962af171f96ecaeca06bd9e3d0b583efb12aec82", size = 630690, upload-time = "2025-10-14T15:04:28.495Z" }, - { url = "https://files.pythonhosted.org/packages/9b/73/bb5f38590e34687b2a9c47a244aa4dd50c56a825969c92c9c5fc7387cea1/watchfiles-1.1.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:1a0bb430adb19ef49389e1ad368450193a90038b5b752f4ac089ec6942c4dff4", size = 622459, upload-time = "2025-10-14T15:04:29.491Z" }, - { url = "https://files.pythonhosted.org/packages/f1/ac/c9bb0ec696e07a20bd58af5399aeadaef195fb2c73d26baf55180fe4a942/watchfiles-1.1.1-cp310-cp310-win32.whl", hash = "sha256:3f6d37644155fb5beca5378feb8c1708d5783145f2a0f1c4d5a061a210254844", size = 272663, upload-time = "2025-10-14T15:04:30.435Z" }, - { url = "https://files.pythonhosted.org/packages/11/a0/a60c5a7c2ec59fa062d9a9c61d02e3b6abd94d32aac2d8344c4bdd033326/watchfiles-1.1.1-cp310-cp310-win_amd64.whl", hash = "sha256:a36d8efe0f290835fd0f33da35042a1bb5dc0e83cbc092dcf69bce442579e88e", size = 287453, upload-time = "2025-10-14T15:04:31.53Z" }, { url = "https://files.pythonhosted.org/packages/1f/f8/2c5f479fb531ce2f0564eda479faecf253d886b1ab3630a39b7bf7362d46/watchfiles-1.1.1-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:f57b396167a2565a4e8b5e56a5a1c537571733992b226f4f1197d79e94cf0ae5", size = 406529, upload-time = "2025-10-14T15:04:32.899Z" }, { url = "https://files.pythonhosted.org/packages/fe/cd/f515660b1f32f65df671ddf6f85bfaca621aee177712874dc30a97397977/watchfiles-1.1.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:421e29339983e1bebc281fab40d812742268ad057db4aee8c4d2bce0af43b741", size = 394384, upload-time = "2025-10-14T15:04:33.761Z" }, { url = "https://files.pythonhosted.org/packages/7b/c3/28b7dc99733eab43fca2d10f55c86e03bd6ab11ca31b802abac26b23d161/watchfiles-1.1.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6e43d39a741e972bab5d8100b5cdacf69db64e34eb19b6e9af162bccf63c5cc6", size = 448789, upload-time = "2025-10-14T15:04:34.679Z" }, @@ -2842,10 +2393,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/e1/f7/0a4467be0a56e80447c8529c9fce5b38eab4f513cb3d9bf82e7392a5696b/watchfiles-1.1.1-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3f7eb7da0eb23aa2ba036d4f616d46906013a68caf61b7fdbe42fc8b25132e77", size = 455425, upload-time = "2025-10-14T15:05:23.348Z" }, { url = "https://files.pythonhosted.org/packages/8e/e0/82583485ea00137ddf69bc84a2db88bd92ab4a6e3c405e5fb878ead8d0e7/watchfiles-1.1.1-cp313-cp313t-musllinux_1_1_aarch64.whl", hash = "sha256:831a62658609f0e5c64178211c942ace999517f5770fe9436be4c2faeba0c0ef", size = 628826, upload-time = "2025-10-14T15:05:24.398Z" }, { url = "https://files.pythonhosted.org/packages/28/9a/a785356fccf9fae84c0cc90570f11702ae9571036fb25932f1242c82191c/watchfiles-1.1.1-cp313-cp313t-musllinux_1_1_x86_64.whl", hash = "sha256:f9a2ae5c91cecc9edd47e041a930490c31c3afb1f5e6d71de3dc671bfaca02bf", size = 622208, upload-time = "2025-10-14T15:05:25.45Z" }, - { url = "https://files.pythonhosted.org/packages/ba/4c/a888c91e2e326872fa4705095d64acd8aa2fb9c1f7b9bd0588f33850516c/watchfiles-1.1.1-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:17ef139237dfced9da49fb7f2232c86ca9421f666d78c264c7ffca6601d154c3", size = 409611, upload-time = "2025-10-14T15:06:05.809Z" }, - { url = "https://files.pythonhosted.org/packages/1e/c7/5420d1943c8e3ce1a21c0a9330bcf7edafb6aa65d26b21dbb3267c9e8112/watchfiles-1.1.1-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:672b8adf25b1a0d35c96b5888b7b18699d27d4194bac8beeae75be4b7a3fc9b2", size = 396889, upload-time = "2025-10-14T15:06:07.035Z" }, - { url = "https://files.pythonhosted.org/packages/0c/e5/0072cef3804ce8d3aaddbfe7788aadff6b3d3f98a286fdbee9fd74ca59a7/watchfiles-1.1.1-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:77a13aea58bc2b90173bc69f2a90de8e282648939a00a602e1dc4ee23e26b66d", size = 451616, upload-time = "2025-10-14T15:06:08.072Z" }, - { url = "https://files.pythonhosted.org/packages/83/4e/b87b71cbdfad81ad7e83358b3e447fedd281b880a03d64a760fe0a11fc2e/watchfiles-1.1.1-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0b495de0bb386df6a12b18335a0285dda90260f51bdb505503c02bcd1ce27a8b", size = 458413, upload-time = "2025-10-14T15:06:09.209Z" }, { url = "https://files.pythonhosted.org/packages/d3/8e/e500f8b0b77be4ff753ac94dc06b33d8f0d839377fee1b78e8c8d8f031bf/watchfiles-1.1.1-pp311-pypy311_pp73-macosx_10_12_x86_64.whl", hash = "sha256:db476ab59b6765134de1d4fe96a1a9c96ddf091683599be0f26147ea1b2e4b88", size = 408250, upload-time = "2025-10-14T15:06:10.264Z" }, { url = "https://files.pythonhosted.org/packages/bd/95/615e72cd27b85b61eec764a5ca51bd94d40b5adea5ff47567d9ebc4d275a/watchfiles-1.1.1-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:89eef07eee5e9d1fda06e38822ad167a044153457e6fd997f8a858ab7564a336", size = 396117, upload-time = "2025-10-14T15:06:11.28Z" }, { url = "https://files.pythonhosted.org/packages/c9/81/e7fe958ce8a7fb5c73cc9fb07f5aeaf755e6aa72498c57d760af760c91f8/watchfiles-1.1.1-pp311-pypy311_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ce19e06cbda693e9e7686358af9cd6f5d61312ab8b00488bc36f5aabbaf77e24", size = 450493, upload-time = "2025-10-14T15:06:12.321Z" }, @@ -2858,17 +2405,6 @@ version = "15.0.1" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/21/e6/26d09fab466b7ca9c7737474c52be4f76a40301b08362eb2dbc19dcc16c1/websockets-15.0.1.tar.gz", hash = "sha256:82544de02076bafba038ce055ee6412d68da13ab47f0c60cab827346de828dee", size = 177016, upload-time = "2025-03-05T20:03:41.606Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/1e/da/6462a9f510c0c49837bbc9345aca92d767a56c1fb2939e1579df1e1cdcf7/websockets-15.0.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:d63efaa0cd96cf0c5fe4d581521d9fa87744540d4bc999ae6e08595a1014b45b", size = 175423, upload-time = "2025-03-05T20:01:35.363Z" }, - { url = "https://files.pythonhosted.org/packages/1c/9f/9d11c1a4eb046a9e106483b9ff69bce7ac880443f00e5ce64261b47b07e7/websockets-15.0.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:ac60e3b188ec7574cb761b08d50fcedf9d77f1530352db4eef1707fe9dee7205", size = 173080, upload-time = "2025-03-05T20:01:37.304Z" }, - { url = "https://files.pythonhosted.org/packages/d5/4f/b462242432d93ea45f297b6179c7333dd0402b855a912a04e7fc61c0d71f/websockets-15.0.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:5756779642579d902eed757b21b0164cd6fe338506a8083eb58af5c372e39d9a", size = 173329, upload-time = "2025-03-05T20:01:39.668Z" }, - { url = "https://files.pythonhosted.org/packages/6e/0c/6afa1f4644d7ed50284ac59cc70ef8abd44ccf7d45850d989ea7310538d0/websockets-15.0.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0fdfe3e2a29e4db3659dbd5bbf04560cea53dd9610273917799f1cde46aa725e", size = 182312, upload-time = "2025-03-05T20:01:41.815Z" }, - { url = "https://files.pythonhosted.org/packages/dd/d4/ffc8bd1350b229ca7a4db2a3e1c482cf87cea1baccd0ef3e72bc720caeec/websockets-15.0.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4c2529b320eb9e35af0fa3016c187dffb84a3ecc572bcee7c3ce302bfeba52bf", size = 181319, upload-time = "2025-03-05T20:01:43.967Z" }, - { url = "https://files.pythonhosted.org/packages/97/3a/5323a6bb94917af13bbb34009fac01e55c51dfde354f63692bf2533ffbc2/websockets-15.0.1-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ac1e5c9054fe23226fb11e05a6e630837f074174c4c2f0fe442996112a6de4fb", size = 181631, upload-time = "2025-03-05T20:01:46.104Z" }, - { url = "https://files.pythonhosted.org/packages/a6/cc/1aeb0f7cee59ef065724041bb7ed667b6ab1eeffe5141696cccec2687b66/websockets-15.0.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:5df592cd503496351d6dc14f7cdad49f268d8e618f80dce0cd5a36b93c3fc08d", size = 182016, upload-time = "2025-03-05T20:01:47.603Z" }, - { url = "https://files.pythonhosted.org/packages/79/f9/c86f8f7af208e4161a7f7e02774e9d0a81c632ae76db2ff22549e1718a51/websockets-15.0.1-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:0a34631031a8f05657e8e90903e656959234f3a04552259458aac0b0f9ae6fd9", size = 181426, upload-time = "2025-03-05T20:01:48.949Z" }, - { url = "https://files.pythonhosted.org/packages/c7/b9/828b0bc6753db905b91df6ae477c0b14a141090df64fb17f8a9d7e3516cf/websockets-15.0.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:3d00075aa65772e7ce9e990cab3ff1de702aa09be3940d1dc88d5abf1ab8a09c", size = 181360, upload-time = "2025-03-05T20:01:50.938Z" }, - { url = "https://files.pythonhosted.org/packages/89/fb/250f5533ec468ba6327055b7d98b9df056fb1ce623b8b6aaafb30b55d02e/websockets-15.0.1-cp310-cp310-win32.whl", hash = "sha256:1234d4ef35db82f5446dca8e35a7da7964d02c127b095e172e54397fb6a6c256", size = 176388, upload-time = "2025-03-05T20:01:52.213Z" }, - { url = "https://files.pythonhosted.org/packages/1c/46/aca7082012768bb98e5608f01658ff3ac8437e563eca41cf068bd5849a5e/websockets-15.0.1-cp310-cp310-win_amd64.whl", hash = "sha256:39c1fec2c11dc8d89bba6b2bf1556af381611a173ac2b511cf7231622058af41", size = 176830, upload-time = "2025-03-05T20:01:53.922Z" }, { url = "https://files.pythonhosted.org/packages/9f/32/18fcd5919c293a398db67443acd33fde142f283853076049824fc58e6f75/websockets-15.0.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:823c248b690b2fd9303ba00c4f66cd5e2d8c3ba4aa968b2779be9532a4dad431", size = 175423, upload-time = "2025-03-05T20:01:56.276Z" }, { url = "https://files.pythonhosted.org/packages/76/70/ba1ad96b07869275ef42e2ce21f07a5b0148936688c2baf7e4a1f60d5058/websockets-15.0.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:678999709e68425ae2593acf2e3ebcbcf2e69885a5ee78f9eb80e6e371f1bf57", size = 173082, upload-time = "2025-03-05T20:01:57.563Z" }, { url = "https://files.pythonhosted.org/packages/86/f2/10b55821dd40eb696ce4704a87d57774696f9451108cff0d2824c97e0f97/websockets-15.0.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:d50fd1ee42388dcfb2b3676132c78116490976f1300da28eb629272d5d93e905", size = 173330, upload-time = "2025-03-05T20:01:59.063Z" }, @@ -2902,12 +2438,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/33/2b/1f168cb6041853eef0362fb9554c3824367c5560cbdaad89ac40f8c2edfc/websockets-15.0.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:558d023b3df0bffe50a04e710bc87742de35060580a293c2a984299ed83bc4e4", size = 182195, upload-time = "2025-03-05T20:02:51.561Z" }, { url = "https://files.pythonhosted.org/packages/86/eb/20b6cdf273913d0ad05a6a14aed4b9a85591c18a987a3d47f20fa13dcc47/websockets-15.0.1-cp313-cp313-win32.whl", hash = "sha256:ba9e56e8ceeeedb2e080147ba85ffcd5cd0711b89576b83784d8605a7df455fa", size = 176393, upload-time = "2025-03-05T20:02:53.814Z" }, { url = "https://files.pythonhosted.org/packages/1b/6c/c65773d6cab416a64d191d6ee8a8b1c68a09970ea6909d16965d26bfed1e/websockets-15.0.1-cp313-cp313-win_amd64.whl", hash = "sha256:e09473f095a819042ecb2ab9465aee615bd9c2028e4ef7d933600a8401c79561", size = 176837, upload-time = "2025-03-05T20:02:55.237Z" }, - { url = "https://files.pythonhosted.org/packages/02/9e/d40f779fa16f74d3468357197af8d6ad07e7c5a27ea1ca74ceb38986f77a/websockets-15.0.1-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:0c9e74d766f2818bb95f84c25be4dea09841ac0f734d1966f415e4edfc4ef1c3", size = 173109, upload-time = "2025-03-05T20:03:17.769Z" }, - { url = "https://files.pythonhosted.org/packages/bc/cd/5b887b8585a593073fd92f7c23ecd3985cd2c3175025a91b0d69b0551372/websockets-15.0.1-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:1009ee0c7739c08a0cd59de430d6de452a55e42d6b522de7aa15e6f67db0b8e1", size = 173343, upload-time = "2025-03-05T20:03:19.094Z" }, - { url = "https://files.pythonhosted.org/packages/fe/ae/d34f7556890341e900a95acf4886833646306269f899d58ad62f588bf410/websockets-15.0.1-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:76d1f20b1c7a2fa82367e04982e708723ba0e7b8d43aa643d3dcd404d74f1475", size = 174599, upload-time = "2025-03-05T20:03:21.1Z" }, - { url = "https://files.pythonhosted.org/packages/71/e6/5fd43993a87db364ec60fc1d608273a1a465c0caba69176dd160e197ce42/websockets-15.0.1-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f29d80eb9a9263b8d109135351caf568cc3f80b9928bccde535c235de55c22d9", size = 174207, upload-time = "2025-03-05T20:03:23.221Z" }, - { url = "https://files.pythonhosted.org/packages/2b/fb/c492d6daa5ec067c2988ac80c61359ace5c4c674c532985ac5a123436cec/websockets-15.0.1-pp310-pypy310_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b359ed09954d7c18bbc1680f380c7301f92c60bf924171629c5db97febb12f04", size = 174155, upload-time = "2025-03-05T20:03:25.321Z" }, - { url = "https://files.pythonhosted.org/packages/68/a1/dcb68430b1d00b698ae7a7e0194433bce4f07ded185f0ee5fb21e2a2e91e/websockets-15.0.1-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:cad21560da69f4ce7658ca2cb83138fb4cf695a2ba3e475e0559e05991aa8122", size = 176884, upload-time = "2025-03-05T20:03:27.934Z" }, { url = "https://files.pythonhosted.org/packages/fa/a8/5b41e0da817d64113292ab1f8247140aac61cbf6cfd085d6a0fa77f4984f/websockets-15.0.1-py3-none-any.whl", hash = "sha256:f7a866fbc1e97b5c617ee4116daaa09b722101d4a3c170c787450ba409f9736f", size = 169743, upload-time = "2025-03-05T20:03:39.41Z" }, ] @@ -2922,24 +2452,6 @@ dependencies = [ ] sdist = { url = "https://files.pythonhosted.org/packages/23/6e/beb1beec874a72f23815c1434518bfc4ed2175065173fb138c3705f658d4/yarl-1.23.0.tar.gz", hash = "sha256:53b1ea6ca88ebd4420379c330aea57e258408dd0df9af0992e5de2078dc9f5d5", size = 194676, upload-time = "2026-03-01T22:07:53.373Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/8b/0d/9cc638702f6fc3c7a3685bcc8cf2a9ed7d6206e932a49f5242658047ef51/yarl-1.23.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:cff6d44cb13d39db2663a22b22305d10855efa0fa8015ddeacc40bc59b9d8107", size = 123764, upload-time = "2026-03-01T22:04:09.7Z" }, - { url = "https://files.pythonhosted.org/packages/7a/35/5a553687c5793df5429cd1db45909d4f3af7eee90014888c208d086a44f0/yarl-1.23.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e4c53f8347cd4200f0d70a48ad059cabaf24f5adc6ba08622a23423bc7efa10d", size = 86282, upload-time = "2026-03-01T22:04:11.892Z" }, - { url = "https://files.pythonhosted.org/packages/68/2e/c5a2234238f8ce37a8312b52801ee74117f576b1539eec8404a480434acc/yarl-1.23.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:2a6940a074fb3c48356ed0158a3ca5699c955ee4185b4d7d619be3c327143e05", size = 86053, upload-time = "2026-03-01T22:04:13.292Z" }, - { url = "https://files.pythonhosted.org/packages/74/3f/bbd8ff36fb038622797ffbaf7db314918bb4d76f1cc8a4f9ca7a55fe5195/yarl-1.23.0-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ed5f69ce7be7902e5c70ea19eb72d20abf7d725ab5d49777d696e32d4fc1811d", size = 99395, upload-time = "2026-03-01T22:04:15.133Z" }, - { url = "https://files.pythonhosted.org/packages/77/04/9516bc4e269d2a3ec9c6779fcdeac51ce5b3a9b0156f06ac7152e5bba864/yarl-1.23.0-cp310-cp310-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:389871e65468400d6283c0308e791a640b5ab5c83bcee02a2f51295f95e09748", size = 92143, upload-time = "2026-03-01T22:04:16.829Z" }, - { url = "https://files.pythonhosted.org/packages/c7/63/88802d1f6b1cb1fc67d67a58cd0cf8a1790de4ce7946e434240f1d60ab4a/yarl-1.23.0-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:dda608c88cf709b1d406bdfcd84d8d63cff7c9e577a403c6108ce8ce9dcc8764", size = 107643, upload-time = "2026-03-01T22:04:18.519Z" }, - { url = "https://files.pythonhosted.org/packages/8e/db/4f9b838f4d8bdd6f0f385aed8bbf21c71ed11a0b9983305c302cbd557815/yarl-1.23.0-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:8c4fe09e0780c6c3bf2b7d4af02ee2394439d11a523bbcf095cf4747c2932007", size = 108700, upload-time = "2026-03-01T22:04:20.373Z" }, - { url = "https://files.pythonhosted.org/packages/50/12/95a1d33f04a79c402664070d43b8b9f72dc18914e135b345b611b0b1f8cc/yarl-1.23.0-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:31c9921eb8bd12633b41ad27686bbb0b1a2a9b8452bfdf221e34f311e9942ed4", size = 102769, upload-time = "2026-03-01T22:04:23.055Z" }, - { url = "https://files.pythonhosted.org/packages/86/65/91a0285f51321369fd1a8308aa19207520c5f0587772cfc2e03fc2467e90/yarl-1.23.0-cp310-cp310-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:5f10fd85e4b75967468af655228fbfd212bdf66db1c0d135065ce288982eda26", size = 101114, upload-time = "2026-03-01T22:04:25.031Z" }, - { url = "https://files.pythonhosted.org/packages/58/80/c7c8244fc3e5bc483dc71a09560f43b619fab29301a0f0a8f936e42865c7/yarl-1.23.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:dbf507e9ef5688bada447a24d68b4b58dd389ba93b7afc065a2ba892bea54769", size = 98883, upload-time = "2026-03-01T22:04:27.281Z" }, - { url = "https://files.pythonhosted.org/packages/86/e7/71ca9cc9ca79c0b7d491216177d1aed559d632947b8ffb0ee60f7d8b23e3/yarl-1.23.0-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:85e9beda1f591bc73e77ea1c51965c68e98dafd0fec72cdd745f77d727466716", size = 94172, upload-time = "2026-03-01T22:04:28.554Z" }, - { url = "https://files.pythonhosted.org/packages/6a/3f/6c6c8a0fe29c26fb2db2e8d32195bb84ec1bfb8f1d32e7f73b787fcf349b/yarl-1.23.0-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:0e1fdaa14ef51366d7757b45bde294e95f6c8c049194e793eedb8387c86d5993", size = 107010, upload-time = "2026-03-01T22:04:30.385Z" }, - { url = "https://files.pythonhosted.org/packages/56/38/12730c05e5ad40a76374d440ed8b0899729a96c250516d91c620a6e38fc2/yarl-1.23.0-cp310-cp310-musllinux_1_2_riscv64.whl", hash = "sha256:75e3026ab649bf48f9a10c0134512638725b521340293f202a69b567518d94e0", size = 100285, upload-time = "2026-03-01T22:04:31.752Z" }, - { url = "https://files.pythonhosted.org/packages/34/92/6a7be9239f2347234e027284e7a5f74b1140cc86575e7b469d13fba1ebfe/yarl-1.23.0-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:80e6d33a3d42a7549b409f199857b4fb54e2103fc44fb87605b6663b7a7ff750", size = 108230, upload-time = "2026-03-01T22:04:33.844Z" }, - { url = "https://files.pythonhosted.org/packages/5e/81/4aebccfa9376bd98b9d8bfad20621a57d3e8cfc5b8631c1fa5f62cdd03f4/yarl-1.23.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:5ec2f42d41ccbd5df0270d7df31618a8ee267bfa50997f5d720ddba86c4a83a6", size = 103008, upload-time = "2026-03-01T22:04:35.856Z" }, - { url = "https://files.pythonhosted.org/packages/38/0f/0b4e3edcec794a86b853b0c6396c0a888d72dfce19b2d88c02ac289fb6c1/yarl-1.23.0-cp310-cp310-win32.whl", hash = "sha256:debe9c4f41c32990771be5c22b56f810659f9ddf3d63f67abfdcaa2c6c9c5c1d", size = 83073, upload-time = "2026-03-01T22:04:38.268Z" }, - { url = "https://files.pythonhosted.org/packages/a0/71/ad95c33da18897e4c636528bbc24a1dd23fe16797de8bc4ec667b8db0ba4/yarl-1.23.0-cp310-cp310-win_amd64.whl", hash = "sha256:ab5f043cb8a2d71c981c09c510da013bc79fd661f5c60139f00dd3c3cc4f2ffb", size = 87328, upload-time = "2026-03-01T22:04:39.558Z" }, - { url = "https://files.pythonhosted.org/packages/e2/14/dfa369523c79bccf9c9c746b0a63eb31f65db9418ac01275f7950962e504/yarl-1.23.0-cp310-cp310-win_arm64.whl", hash = "sha256:263cd4f47159c09b8b685890af949195b51d1aa82ba451c5847ca9bc6413c220", size = 82463, upload-time = "2026-03-01T22:04:41.454Z" }, { url = "https://files.pythonhosted.org/packages/a2/aa/60da938b8f0997ba3a911263c40d82b6f645a67902a490b46f3355e10fae/yarl-1.23.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:b35d13d549077713e4414f927cdc388d62e543987c572baee613bf82f11a4b99", size = 123641, upload-time = "2026-03-01T22:04:42.841Z" }, { url = "https://files.pythonhosted.org/packages/24/84/e237607faf4e099dbb8a4f511cfd5efcb5f75918baad200ff7380635631b/yarl-1.23.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:cbb0fef01f0c6b38cb0f39b1f78fc90b807e0e3c86a7ff3ce74ad77ce5c7880c", size = 86248, upload-time = "2026-03-01T22:04:44.757Z" }, { url = "https://files.pythonhosted.org/packages/b2/0d/71ceabc14c146ba8ee3804ca7b3d42b1664c8440439de5214d366fec7d3a/yarl-1.23.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:dc52310451fc7c629e13c4e061cbe2dd01684d91f2f8ee2821b083c58bd72432", size = 85988, upload-time = "2026-03-01T22:04:46.365Z" }, From 4ba997a1058d7aaa483aca1d0a8394f16ee695b3 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Sun, 22 Mar 2026 17:06:29 +0000 Subject: [PATCH 13/14] Initial plan From 7070680c350eafa46709a0313653cc4cc1173aa8 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Sun, 22 Mar 2026 17:10:18 +0000 Subject: [PATCH 14/14] fix: address review comments - ProviderValue typing, conftest docstring, pool.py format Co-authored-by: mahimairaja <81288263+mahimairaja@users.noreply.github.com> Agent-Logs-Url: https://github.com/mahimairaja/openrtc-python/sessions/8aca67d0-da08-4745-899f-296a8db94b8b --- src/openrtc/provider_types.py | 8 ++++---- tests/conftest.py | 4 ++-- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/openrtc/provider_types.py b/src/openrtc/provider_types.py index dc81b26..63d876d 100644 --- a/src/openrtc/provider_types.py +++ b/src/openrtc/provider_types.py @@ -2,12 +2,12 @@ from __future__ import annotations -from typing import Any, TypeAlias +from typing import TypeAlias # Values accepted for STT, LLM, and TTS configuration: # - Provider ID strings (e.g. ``"openai/gpt-4o-mini-transcribe"``) used by LiveKit # routing and the OpenRTC CLI defaults. # - Concrete LiveKit plugin instances (e.g. ``livekit.plugins.openai.STT(...)``). -# ``Any`` covers third-party plugin classes without enumerating them here; use -# strings when you want the type checker to stay precise. -ProviderValue: TypeAlias = str | Any +# ``object`` allows any third-party plugin class without enumerating them here; +# use strings when you want the type checker to stay precise. +ProviderValue: TypeAlias = str | object diff --git a/tests/conftest.py b/tests/conftest.py index 6907688..c1e6148 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -1,5 +1,3 @@ -from __future__ import annotations - """Pytest configuration and shared fixtures. LiveKit SDK shim (below): if ``livekit.agents`` cannot be imported, we register a @@ -19,6 +17,8 @@ release; use the shim mainly for documented minimal environments. """ +from __future__ import annotations + import importlib import sys import types