RoomKit¶
RoomKit ¶
RoomKit(store=None, identity_resolver=None, identity_channel_types=None, inbound_router=None, lock_manager=None, realtime=None, max_chain_depth=5, identity_timeout=10.0, process_timeout=30.0, stt=None, tts=None, voice=None, task_runner=None, delivery_strategy=None, telemetry=None, inbound_rate_limit=None)
Central orchestrator tying rooms, channels, hooks, and storage.
Initialise the RoomKit orchestrator.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
store
|
ConversationStore | None
|
Persistent storage backend. Defaults to |
None
|
identity_resolver
|
IdentityResolver | None
|
Optional resolver for identifying inbound senders. |
None
|
identity_channel_types
|
set[ChannelType] | None
|
Restrict identity resolution to specific channel
types. If |
None
|
inbound_router
|
InboundRoomRouter | None
|
Strategy for routing inbound messages to rooms.
Defaults to |
None
|
lock_manager
|
RoomLockManager | None
|
Per-room locking backend. Defaults to
|
None
|
realtime
|
RealtimeBackend | None
|
Realtime backend for ephemeral events (typing, presence).
Defaults to |
None
|
max_chain_depth
|
int
|
Maximum reentry chain depth to prevent infinite loops. |
5
|
identity_timeout
|
float
|
Timeout in seconds for identity resolution calls. |
10.0
|
process_timeout
|
float
|
Timeout in seconds for the locked processing phase. |
30.0
|
stt
|
STTProvider | None
|
Optional speech-to-text provider for transcription. |
None
|
tts
|
TTSProvider | None
|
Optional text-to-speech provider for synthesis. |
None
|
voice
|
VoiceBackend | None
|
Optional voice backend for real-time audio transport. |
None
|
task_runner
|
TaskRunner | None
|
Pluggable backend for delegated background tasks.
Defaults to |
None
|
delivery_strategy
|
BackgroundTaskDeliveryStrategy | None
|
Controls proactive delivery of background task
results. When set, |
None
|
telemetry
|
TelemetryConfig | TelemetryProvider | None
|
Optional telemetry provider or config for span/metric
collection. Accepts a |
None
|
inbound_rate_limit
|
RateLimit | None
|
Optional rate limit applied to all inbound
messages before any processing. Messages exceeding the limit
are dropped with |
None
|
get_timeline
async
¶
Query the event timeline for a room.
list_tasks
async
¶
List tasks for a room, optionally filtered by status.
send_event
async
¶
send_event(room_id, channel_id, content, event_type=MESSAGE, chain_depth=0, participant_id=None, metadata=None, visibility='all', provider=None, response_visibility=None)
Send an event directly into a room from a channel.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
room_id
|
str
|
Target room ID |
required |
channel_id
|
str
|
Source channel ID |
required |
content
|
Any
|
Event content (TextContent, RichContent, etc.) |
required |
event_type
|
EventType
|
Type of event (default MESSAGE) |
MESSAGE
|
chain_depth
|
int
|
Depth in response chain (for loop prevention) |
0
|
participant_id
|
str | None
|
Optional participant/sender ID for the event source |
None
|
metadata
|
dict[str, Any] | None
|
Optional event metadata |
None
|
visibility
|
str
|
Event visibility ("all" or "internal") |
'all'
|
provider
|
str | None
|
Optional provider/backend name for event attribution |
None
|
response_visibility
|
str | None
|
Controls where the AI's response is delivered. Uses the same vocabulary as visibility. None means no restriction. |
None
|
connect_websocket
async
¶
Register a WebSocket connection and emit framework event.
disconnect_websocket
async
¶
Unregister a WebSocket connection and emit framework event.
publish_typing
async
¶
Publish a typing indicator for a user in a room.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
room_id
|
str
|
The room to publish the typing event in. |
required |
user_id
|
str
|
The user who is typing. |
required |
is_typing
|
bool
|
True for typing_start, False for typing_stop. |
True
|
data
|
dict[str, Any] | None
|
Optional additional data (e.g., {"name": "User Name"}). |
None
|
publish_presence
async
¶
Publish a presence update for a user in a room.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
room_id
|
str
|
The room to publish the presence event in. |
required |
user_id
|
str
|
The user whose presence changed. |
required |
status
|
str
|
One of "online", "away", or "offline". |
required |
publish_read_receipt
async
¶
Publish a read receipt for a user in a room.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
room_id
|
str
|
The room to publish the read receipt in. |
required |
user_id
|
str
|
The user who read the message. |
required |
event_id
|
str
|
The ID of the event that was read. |
required |
subscribe_room
async
¶
Subscribe to ephemeral events for a room.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
room_id
|
str
|
The room to subscribe to. |
required |
callback
|
EphemeralCallback
|
Async callback invoked for each ephemeral event. |
required |
Returns:
| Type | Description |
|---|---|
str
|
A subscription ID that can be used to unsubscribe. |
unsubscribe_room
async
¶
Unsubscribe from ephemeral events.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
subscription_id
|
str
|
The subscription ID returned by subscribe_room. |
required |
Returns:
| Type | Description |
|---|---|
bool
|
True if the subscription existed and was removed. |
hook ¶
hook(trigger, execution=SYNC, priority=0, name='', timeout=30.0, channel_types=None, channel_ids=None, directions=None)
Decorator to register a global hook.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
trigger
|
HookTrigger
|
When the hook fires (BEFORE_BROADCAST, AFTER_BROADCAST, etc.) |
required |
execution
|
HookExecution
|
SYNC (can block/modify) or ASYNC (fire-and-forget) |
SYNC
|
priority
|
int
|
Lower numbers run first (default: 0) |
0
|
name
|
str
|
Optional name for logging and removal |
''
|
timeout
|
float
|
Max execution time in seconds (default: 30.0) |
30.0
|
channel_types
|
set[ChannelType] | None
|
Only run for events from these channel types (None = all) |
None
|
channel_ids
|
set[str] | None
|
Only run for events from these channel IDs (None = all) |
None
|
directions
|
set[ChannelDirection] | None
|
Only run for events with these directions (None = all) |
None
|
identity_hook ¶
Decorator to register an identity-resolution hook.
The decorated function receives (event, context, id_result) and
returns an IdentityHookResult or None.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
trigger
|
HookTrigger
|
When the hook fires (ON_IDENTITY_AMBIGUOUS, ON_IDENTITY_UNKNOWN). |
required |
channel_types
|
set[ChannelType] | None
|
Only run for events from these channel types (None = all). |
None
|
channel_ids
|
set[str] | None
|
Only run for events from these channel IDs (None = all). |
None
|
directions
|
set[ChannelDirection] | None
|
Only run for events with these directions (None = all). |
None
|
add_room_hook ¶
Add a hook for a specific room.
Exceptions¶
RoomNotFoundError ¶
Bases: RoomKitError
Room does not exist.
ChannelNotFoundError ¶
Bases: RoomKitError
Channel binding not found in room.
ChannelNotRegisteredError ¶
Bases: RoomKitError
Channel type not registered.
Infrastructure¶
RoomLockManager ¶
Bases: ABC
Abstract base for per-room locking.
Implement this to plug in any locking backend (Redis, Postgres
advisory locks, etc.). The library ships with InMemoryLockManager
for single-process deployments.
Implementations should be reentrant within the same execution
context (including child tasks spawned by asyncio.gather): if
a coroutine already holds the lock for a room and awaits code that
tries to acquire the same room lock, the inner acquisition must
succeed without deadlocking. This is required because tool handlers
(e.g. handoff) may update room state while the inbound pipeline
already holds the room lock.
InMemoryLockManager ¶
Bases: RoomLockManager
In-process per-room asyncio locks with LRU eviction.
Reentrant within the same execution context: if the current context
already holds the lock for a given room (including child tasks
spawned by asyncio.gather), locked() yields immediately
instead of deadlocking.
Suitable for single-process deployments. For multi-process or
distributed setups, provide a custom RoomLockManager backed by
Redis, Postgres advisory locks, or similar.
AuthCallback
module-attribute
¶
Async callback for transport authentication.
Receives the connection context (e.g. WebSocket, HTTP request) and returns
a metadata dict on success or None to reject the connection.
auth_context
module-attribute
¶
Context variable holding auth metadata from the most recent authentication.
Set automatically before session_factory is called so the factory can
read auth metadata without changing its signature::
from roomkit.voice.auth import auth_context
async def my_session_factory(websocket_id: str) -> VoiceSession:
meta = auth_context.get() # dict or None
...