All session endpoints now include call_id as a path parameter:
| Before | After |
|---|---|
POST /sessions |
POST /calls/{call_id}/sessions |
DELETE /sessions/{session_id} |
DELETE /calls/{call_id}/sessions/{session_id} |
POST /sessions/{session_id}/close |
POST /calls/{call_id}/sessions/{session_id}/close |
GET /sessions/{session_id} |
GET /calls/{call_id}/sessions/{session_id} |
GET /sessions/{session_id}/metrics |
GET /calls/{call_id}/sessions/{session_id}/metrics |
call_idremoved fromPOST /sessionsrequest body — now a URL path parameter
DELETE /calls/{call_id}/sessions/{session_id}now returns 202 Accepted (was 204)POST /calls/{call_id}/sessions/{session_id}/closenow returns 202 Accepted (was 200)- Session closure is now asynchronous — the owning node processes the close request on its next maintenance cycle
get_current_useroption removed- Permission callbacks (
can_start_session,can_close_session,can_view_session,can_view_metrics) now receivecall_id: stras a parameter
vision_agents.core.runner.http.dependencies.get_sessionremovedvision_agents.core.runner.http.dependencies.get_current_userremoved
register_function()now rejects synchronous functions withValueError— all registered functions must be async (#373)FunctionRegistry.call_function()andLLM.call_function()are nowasync(#373)
Agent.create_user()renamed toAgent.authenticate()(#380)EdgeTransport.create_user()renamed toEdgeTransport.authenticate()(#380)- Authentication is now called automatically during
Agent.start()— manual calls are no longer needed (#380)
mock_tools()and standalonemock_functions()removed fromvision_agents.testing(#376)- Use
TestSession.mock_functions()instead
cleanup_intervalparameter renamed tomaintenance_interval(#374)created_byparameter removed fromstart_session()(#374)AgentSession.created_byfield removed (#374)call_idvalues must match^[a-z0-9_-]+$(raisesInvalidCallId) (#374)- New parameter:
registry: SessionRegistry | None = None(#374)
Adds inworld.Realtime for low-latency speech-to-speech over Inworld's Realtime API (WebRTC transport). Protocol-compatible with OpenAI Realtime — supports function calling, turn detection, and multiple upstream models via the <provider>/<model> ID format (e.g. "openai/gpt-4o-mini", "google-ai-studio/gemini-2.5-flash"). (#502)
Sessions are shared across nodes via Redis, enabling cross-node session queries and closure without sticky sessions. (#374)
from vision_agents.core import AgentLauncher, Runner
from vision_agents.core.agents.session_registry import RedisSessionKVStore, SessionRegistry
store = RedisSessionKVStore(url="redis://localhost:6379")
registry = SessionRegistry(store=store)
runner = Runner(AgentLauncher(create_agent=create_agent, join_call=join_call, registry=registry))Install with: uv add "vision-agents[redis]"
New public API on AgentLauncher:
| Method | Description |
|---|---|
get_session_info(call_id, session_id) |
Query session info from shared storage |
request_close_session(call_id, session_id) |
Request closure from any node |
Custom store backends: SessionKVStore is an abstract class that can be subclassed to support any TTL key-value store (DynamoDB, Memcached, etcd, etc.).
py.typed markers added to vision_agents.core and vision_agents.testing for downstream type checking support. (#378)
- EventManager: fix crash when event handlers have return type annotations (#381)
- RedisSessionKVStore: fix import error when
redispackage is not installed (#384) - Agent metrics: fix metrics storage and serialization in session registry (#387)