Repository navigation
v0.94.0
What's Changed
- docs(changelog): 0.94.0 — BREAKING leads on three default changes, and the LiveKit pump fix
- fix(examples): the WebSocket Gemini, Anam avatar, SIP video and external tool handler examples work end to end (RMK-353)
- chore(examples): remove three examples covered elsewhere, move the personal screen agent out of the repo (RMK-353)
- fix(anam): disconnect gives up on Anam's WebRTC close after 5 s instead of hanging (RMK-353)
- fix(realtime): the WebSocket transport logs a send to a client that hung up at debug, its docstring states the wire format (RMK-353)
- fix(video): a SIP video call is answered with one m-line per offered stream, and send_video sends one VideoChunk as one frame (RMK-353)
- refactor(conference): tidy the LiveKit session split per review (RMK-354)
- fix(conference): no track pump starts once a leaving session closed its pumps, found reviewing RMK-354
- fix(conference): a state event the bridge refuses leaves no value behind, found reviewing RMK-354
- docs(voice): the Context7 voice page names add_backend for several transports in one bridged room, llms-full.txt regenerated (RMK-353)
- fix(examples): video and conference examples transcribe, censor and record as documented, the screen assistant validates app names (RMK-353)
- fix(examples): SIP examples gate calls where the gate runs, stop ending sessions twice, and shut down cleanly (RMK-353)
- fix(examples): voice cascade examples pass AEC once, record only when asked, and use the event fields that exist (RMK-353)
- fix(examples): channel, delivery and storage examples run against real backends and write nothing into the repo (RMK-353)
- fix(examples): orchestration and infrastructure examples show what they claim, hooks inject, the breaker opens (RMK-353)
- fix(examples): AI examples report a failed turn, read every reply of a tool turn, and do what their titles say (RMK-353)
- feat(voice): VoiceChannel.add_backend serves sessions from several transports, each session's output goes out on its own backend (RMK-353)
- build(deps): roomkit[fastrtc] installs fastapi and uvicorn, roomkit.webrtc mounts its routes on FastAPI (RMK-353)
- fix(video): mount_websocket_video accepts connections, the route takes the socket positionally (RMK-353)
- fix(telemetry): PyroscopeProfiler starts on pyroscope-io 1.x, detect_subprocesses goes only to a configure() that takes it (RMK-353)
- fix(voice): ON_RECORDING_STOPPED fires when a voice session ends, the room rides along past the unbinding (RMK-353)
- refactor(conference): move the LiveKit session's room books into RoomView (RMK-354)
- refactor(conference): move the LiveKit session's departure into SessionDeparture (RMK-354)
- refactor(conference): move the LiveKit session's event bridge into EventBridge (RMK-354)
- refactor(conference): move the LiveKit session's track pumps into TrackPumps (RMK-354)
- fix(conference): a departure cancelled during its eviction stays settled, and the eviction is bounded, per review (RMK-350)
- fix(conference): a LiveKit bot leaves even when the SDK's disconnect hangs, and a refused voice ends its session (RMK-350)
- docs(conference): a refused screen-share sound ends the whole browser share, TrackKind.AUDIO names the sound of a share, per review (RMK-348)
- feat(conference): ConferenceGrants.publish_screen_share_audio grants the sound of a screen share, off by default (RMK-348)
- fix(core): the gate reads the source's binding as its hooks left it, event_blocked names the source on every path, one report of a cascade, per review (RMK-344)
- docs(ai): AIChannelTurnConfig's field list names response_schema and the turn budgets, found reviewing RMK-346
- fix(ai): an enable_thinking false turns off a budget a less specific level set, a null tools declares no toolset, per review (RMK-346)
- fix(core): a response meets its hooks before its source's right to write on every commit path, and a regenerated answer re-enters like any other (RMK-344)
- refactor(core): extract committing an accepted response from _run_reentry_pass into _commit_reentry (RMK-344)
- refactor(core): extract the hooks and the source's right to write from _run_precommit into _gate_commit (RMK-344)
- fix(ai): a null in the binding metadata defers to the next level for every per-turn setting, as the turn config's None does (RMK-346)
- feat: MemoryResult is exported from roomkit beside MemoryProvider, found reviewing RMK-334
- fix(memory): CompactingMemory pays for its inner provider's messages and notes, found reviewing RMK-334
- fix(orchestration): HandoffMemoryProvider reads its inner window and leaves the inner result alone, found reviewing RMK-334
- fix(skills): a standalone turn opens no gate a skill activated in the room, found reviewing RMK-345
- fix(ai): a standalone turn keeps out of the room's declaration, each gating skill reopens its tools, a fallback gets no exchange, per review (RMK-345)
- perf(ai): a room keeps its tool declaration from one turn to the next, reopening what an earlier turn opened, so the cached history survives it (RMK-345)
- docs(ai): AIContext.reasoning_effort says which values a vendor setting reads and that none is off, per review (RMK-337)
- fix(providers): every provider reads the turn's thinking switch, and off on a Gemini model that cannot stop reasoning is its lowest level, per review (RMK-337)
- fix(providers): a tool round's reasoning survives its text, and OpenRouter reads the turn's enable_thinking, per review (RMK-338)
- fix(gemini): the catalogue marks gemini-2.5-pro and gemini-2.5-flash-lite deprecated, which the API refuses to new users (RMK-337)
- feat(providers): Ollama's think, Gemini's thinking_level and PolarGrid's thinking yield to the turn on what it states (RMK-337)
- refactor(providers): one thinking switch for the turn's settings, which Qwen and DeepSeek read, a reasoning_effort of none turning thinking off (RMK-337)
- feat(openrouter): a turn with tools carries the turn's reasoning as any other turn does (RMK-338)
- fix(core): a greeting or regenerated answer reads the room once, under the lock, so a close just before it is seen, per review (RMK-331)
- perf(core): a reentry pass reads the room once, its status gate and its source's right to write reading the context it builds under the lock (RMK-331)
- refactor(core): extract whether a reentry pass may write from _run_reentry_pass (RMK-331)
- fix(memory): a budgeted memory counts the turn's notes, which nothing trims, per review (RMK-334)
- perf(memory): what a memory retrieves for one turn rides the turn's notes, so RAG passages no longer re-bill the history (RMK-334)
- fix(tools): a search reads each stored line whole and stays under a page's bound, and Tool Search counts only what it can hide, per review (RMK-321)
- refactor(tools): reading a stored result back, a page or a search, moves to its own module (RMK-321)
- fix(tools): a page of non-ASCII text is written as text, not escaped, so it stays under the threshold (RMK-321)
- feat(tools): read_stored_result searches a stored result, and Tool Search switches on past 8,000 schema tokens for cost (RMK-321)
- refactor(tools): extract a stored result's page from handle_read (RMK-321)
- fix(ai): past its budget a turn retries no empty answer and ends budget_exceeded, budgets are validated, and the fallback's rate is stated, per review (RMK-320)
- feat(ai): a turn's token and cost budget stops its tool loop at a round boundary, and 50 tool rounds by default (RMK-320)
- refactor(ai): extract what every transport the answer reaches can carry from _build_context (RMK-320)
- refactor(ai): the tool loops ask their shared state whether a limit of their own is reached, instead of each checking the deadline (RMK-320)
- fix(ai): a compaction keeps skill bodies whole and the hook's input, refuses when nothing shortens, and every summary joins the user message after it, per review (RMK-335)
- test(sources): wait for the restarts on a condition instead of a fixed sleep that flakes under load (RMK-316)
- fix(ai): an emergency compaction keeps the turn's input and its notes whole, and stores the older rounds' results for re-reading (RMK-335)
- refactor(ai): extract the turn's conversation, its history and its noted input, from _build_context (RMK-335)
- Begin 0.94.0.dev0 development
Full Changelog: v0.93.0...v0.94.0