roomkit 0.75.2__tar.gz → 0.76.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {roomkit-0.75.2 → roomkit-0.76.0}/PKG-INFO +5 -4
- {roomkit-0.75.2 → roomkit-0.76.0}/pyproject.toml +1 -1
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/__init__.py +17 -1
- roomkit-0.76.0/src/roomkit/_version.py +1 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/providers/gemini/image.py +147 -43
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/providers/gemini/image_models.py +56 -4
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/providers/gemini/sdk.py +19 -3
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/providers/image/__init__.py +10 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/providers/image/base.py +89 -7
- roomkit-0.76.0/src/roomkit/providers/image/options.py +164 -0
- roomkit-0.76.0/src/roomkit/providers/image/usage.py +59 -0
- roomkit-0.76.0/src/roomkit/providers/openai/image.py +282 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/providers/openai/image_models.py +50 -7
- roomkit-0.76.0/src/roomkit/providers/openai/image_stream.py +89 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/providers/openai/live_events.py +33 -49
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/voice/realtime/fastrtc_transport.py +6 -3
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/webrtc/stream.py +11 -13
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/webrtc/webrtc_connection_mixin.py +35 -10
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_openai_live.py +25 -3
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_providers/test_gemini_image.py +8 -6
- roomkit-0.76.0/tests/test_providers/test_image_advanced.py +254 -0
- roomkit-0.76.0/tests/test_providers/test_image_sdk_contracts.py +166 -0
- roomkit-0.76.0/tests/test_providers/test_image_stream.py +60 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_providers/test_openai_image.py +6 -4
- roomkit-0.76.0/tests/test_webrtc_rtc_configuration.py +166 -0
- roomkit-0.75.2/src/roomkit/_version.py +0 -1
- roomkit-0.75.2/src/roomkit/providers/openai/image.py +0 -217
- {roomkit-0.75.2 → roomkit-0.76.0}/.gitignore +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/AGENTS.md +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/LICENSE +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/README.md +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/benchmarks/__init__.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/benchmarks/chat/QUALITY.md +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/benchmarks/chat/README.md +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/benchmarks/chat/__init__.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/benchmarks/chat/__main__.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/benchmarks/chat/fixtures/quote-policy/SKILL.md +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/benchmarks/chat/fixtures/quote-policy/references/rules.md +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/benchmarks/chat/fixtures/quote-policy/scripts/total.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/benchmarks/chat/harness.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/benchmarks/chat/measurement.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/benchmarks/chat/quality.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/benchmarks/chat/quality_oracles.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/benchmarks/chat/quality_report.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/benchmarks/chat/report.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/benchmarks/chat/scenarios.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/docs/README.md +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/docs/c7/acp.md +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/docs/c7/ai-channels.md +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/docs/c7/api-reference.md +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/docs/c7/architecture.md +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/docs/c7/conference.md +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/docs/c7/hooks.md +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/docs/c7/identity-and-realtime.md +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/docs/c7/image-generation.md +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/docs/c7/installation.md +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/docs/c7/ollama-provider.md +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/docs/c7/orchestration.md +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/docs/c7/overview.md +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/docs/c7/quickstart.md +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/docs/c7/realtime-voice.md +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/docs/c7/resilience.md +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/docs/c7/rooms-and-channels.md +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/docs/c7/storage.md +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/docs/c7/testing.md +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/docs/c7/transport-providers.md +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/docs/c7/video.md +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/docs/c7/voice-channels.md +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/docs/c7/voice-pipeline.md +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/docs/diagrams/architecture.svg +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/docs/diagrams/avatar-pipeline.svg +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/docs/diagrams/message-flow.svg +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/docs/diagrams/orchestration.svg +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/docs/diagrams/room-lifecycle.svg +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/docs/diagrams/video-pipeline.svg +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/docs/diagrams/voice-orchestration.svg +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/docs/diagrams/voice-pipeline.svg +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/llms-full.txt +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/llms.txt +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/ai_docs.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/channels/__init__.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/channels/_acp_client.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/channels/_acp_context.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/channels/_acp_events.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/channels/_acp_usage.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/channels/_ai_coalescers.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/channels/_ai_context.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/channels/_ai_events.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/channels/_ai_generation.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/channels/_ai_loop_rules.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/channels/_ai_policy.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/channels/_ai_resilience.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/channels/_ai_steering.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/channels/_ai_stream_external_tools.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/channels/_ai_stream_round.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/channels/_ai_streaming.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/channels/_ai_tools.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/channels/_cli_markdown.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/channels/_conference_access.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/channels/_conference_activity.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/channels/_conference_attachment.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/channels/_conference_backlog.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/channels/_conference_identity.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/channels/_conference_lane.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/channels/_conference_lanes.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/channels/_conference_metadata.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/channels/_conference_mixer.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/channels/_conference_operations.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/channels/_conference_plug.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/channels/_conference_realtime.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/channels/_conference_recording.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/channels/_conference_recording_events.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/channels/_conference_recording_writer.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/channels/_conference_room_state.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/channels/_conference_roster.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/channels/_conference_session.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/channels/_conference_shutdown.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/channels/_conference_subscription.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/channels/_conference_voice.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/channels/_dangling_recovery.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/channels/_realtime_audio.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/channels/_realtime_context.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/channels/_realtime_delegation.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/channels/_realtime_response.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/channels/_realtime_skills.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/channels/_realtime_speech.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/channels/_realtime_tool_recovery.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/channels/_realtime_tool_search.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/channels/_realtime_tools.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/channels/_realtime_transcription.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/channels/_sandbox_handlers.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/channels/_skill_activation.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/channels/_skill_constants.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/channels/_skill_handlers.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/channels/_speaker.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/channels/_task_planner.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/channels/_tool_eviction.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/channels/_tool_search.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/channels/_tool_search_constants.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/channels/_tool_usage.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/channels/_turn_config.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/channels/_video_hooks.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/channels/_video_resources.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/channels/_voice_hooks.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/channels/_voice_pipeline.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/channels/_voice_stt.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/channels/_voice_tts.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/channels/_voice_turn.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/channels/acp.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/channels/acp_transport.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/channels/agent.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/channels/ai.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/channels/av.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/channels/base.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/channels/cli.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/channels/conference.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/channels/realtime_av.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/channels/realtime_voice.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/channels/transport.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/channels/video.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/channels/voice.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/channels/websocket.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/conference/__init__.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/conference/_livekit_mapping.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/conference/_livekit_media.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/conference/_livekit_session.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/conference/_livekit_voice.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/conference/_mock_faults.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/conference/_mock_media.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/conference/base.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/conference/livekit.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/conference/mock.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/conference/models.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/console/__init__.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/console/_activity.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/console/_brand.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/console/_chat.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/console/_display.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/console/_hooks.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/console/_shell.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/console/_state.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/console/_terminal.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/console/_tool_preview.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/core/__init__.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/core/_delivery_targets.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/core/_participant_channels.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/core/_voice_delivery.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/core/callbacks.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/core/circuit_breaker.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/core/delivery.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/core/event_router.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/core/exceptions.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/core/framework.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/core/hooks.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/core/inbound_router.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/core/lanes.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/core/locks.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/core/mixins/__init__.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/core/mixins/_child_execution.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/core/mixins/channel_ops.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/core/mixins/delegation.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/core/mixins/deliver.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/core/mixins/event_ops.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/core/mixins/greeting.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/core/mixins/helpers.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/core/mixins/hooks_api.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/core/mixins/inbound.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/core/mixins/inbound_identity.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/core/mixins/inbound_locked.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/core/mixins/inbound_streaming.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/core/mixins/lane_execution.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/core/mixins/membership.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/core/mixins/realtime_ops.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/core/mixins/recording.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/core/mixins/regenerate.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/core/mixins/room_lifecycle.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/core/mixins/source_ops.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/core/mixins/voice_ops.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/core/rate_limiter.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/core/retry.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/core/router.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/core/task_utils.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/core/transcoder.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/core/visibility.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/delivery/__init__.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/delivery/_redis_scripts.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/delivery/base.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/delivery/memory.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/delivery/redis.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/delivery/serialization.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/delivery/worker.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/identity/__init__.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/identity/base.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/identity/mock.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/knowledge/__init__.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/knowledge/base.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/knowledge/mock.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/knowledge/postgres.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/memory/__init__.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/memory/_wrapper.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/memory/base.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/memory/budget_aware.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/memory/compacting.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/memory/mock.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/memory/retrieval.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/memory/sliding_window.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/memory/summarizing.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/memory/token_estimator.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/models/__init__.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/models/channel.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/models/context.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/models/delivery.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/models/enums.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/models/event.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/models/framework_event.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/models/hook.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/models/identity.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/models/participant.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/models/pending_input.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/models/plan_event.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/models/response_metadata.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/models/room.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/models/session_event.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/models/steering.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/models/store_filter.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/models/streaming.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/models/task.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/models/thinking_event.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/models/tool_call.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/models/trace.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/models/vision_event.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/models/voice_delivery.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/orchestration/__init__.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/orchestration/base.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/orchestration/handoff.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/orchestration/pipeline.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/orchestration/result.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/orchestration/router.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/orchestration/session_audit.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/orchestration/state.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/orchestration/status_bus.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/orchestration/status_redis.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/orchestration/strategies/__init__.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/orchestration/strategies/loop.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/orchestration/strategies/pipeline.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/orchestration/strategies/supervisor/__init__.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/orchestration/strategies/supervisor/_common.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/orchestration/strategies/supervisor/_inject_per_worker.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/orchestration/strategies/supervisor/_inject_strategy.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/orchestration/strategies/supervisor/_install_auto.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/orchestration/strategies/supervisor/core.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/orchestration/strategies/supervisor/delegate.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/orchestration/strategies/supervisor/execution.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/orchestration/strategies/supervisor/prompts.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/orchestration/strategies/supervisor/results.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/orchestration/strategies/supervisor/supervised.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/orchestration/strategies/swarm.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/orchestration/tool_audit.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/providers/__init__.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/providers/ai/__init__.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/providers/ai/base.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/providers/ai/image_parts.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/providers/ai/mock.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/providers/ai/openai_dialect.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/providers/anam/__init__.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/providers/anam/_convert.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/providers/anam/avatar.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/providers/anam/config.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/providers/anam/realtime.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/providers/anthropic/__init__.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/providers/anthropic/ai.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/providers/anthropic/config.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/providers/anthropic/models.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/providers/anthropic/request.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/providers/azure/__init__.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/providers/azure/ai.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/providers/azure/config.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/providers/azure/image.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/providers/buzz/__init__.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/providers/buzz/agent.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/providers/buzz/base.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/providers/buzz/config.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/providers/buzz/mock.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/providers/buzz/relay.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/providers/cerebras/__init__.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/providers/cerebras/ai.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/providers/cerebras/config.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/providers/cerebras/models.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/providers/deepgram/__init__.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/providers/deepgram/config.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/providers/deepgram/realtime.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/providers/deepgram/settings.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/providers/deepgram/voices.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/providers/deepseek/__init__.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/providers/deepseek/ai.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/providers/deepseek/config.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/providers/deepseek/models.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/providers/discord/__init__.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/providers/discord/base.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/providers/discord/bot.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/providers/discord/config.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/providers/discord/mock.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/providers/elasticemail/__init__.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/providers/elasticemail/config.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/providers/elasticemail/email.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/providers/elevenlabs/__init__.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/providers/elevenlabs/config.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/providers/elevenlabs/realtime.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/providers/elevenlabs/voices.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/providers/email/__init__.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/providers/email/base.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/providers/email/mock.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/providers/gemini/__init__.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/providers/gemini/ai.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/providers/gemini/config.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/providers/gemini/errors.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/providers/gemini/models.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/providers/gemini/realtime.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/providers/gemini/realtime_models.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/providers/gemini/request.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/providers/gemini/schema.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/providers/gemini/vertex.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/providers/gemini/voices.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/providers/http/__init__.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/providers/http/base.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/providers/http/config.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/providers/http/mock.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/providers/http/provider.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/providers/http/webhook.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/providers/http_errors.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/providers/image/mock.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/providers/litellm/__init__.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/providers/litellm/ai.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/providers/litellm/config.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/providers/messenger/__init__.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/providers/messenger/base.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/providers/messenger/config.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/providers/messenger/facebook.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/providers/messenger/mock.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/providers/messenger/webhook.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/providers/mistral/__init__.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/providers/mistral/ai.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/providers/mistral/config.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/providers/mistral/models.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/providers/ollama/__init__.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/providers/ollama/ai.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/providers/ollama/config.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/providers/ollama/models.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/providers/openai/__init__.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/providers/openai/ai.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/providers/openai/config.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/providers/openai/live.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/providers/openai/live_client.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/providers/openai/live_config.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/providers/openai/live_handlers.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/providers/openai/live_hosted.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/providers/openai/live_models.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/providers/openai/models.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/providers/openai/realtime.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/providers/openai/realtime_base.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/providers/openai/realtime_events.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/providers/openai/realtime_models.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/providers/openai/voices.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/providers/openrouter/__init__.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/providers/openrouter/ai.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/providers/openrouter/config.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/providers/openrouter/image.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/providers/openrouter/image_models.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/providers/openrouter/models.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/providers/personaplex/__init__.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/providers/personaplex/config.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/providers/personaplex/realtime.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/providers/personaplex/voices.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/providers/polargrid/__init__.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/providers/polargrid/ai.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/providers/polargrid/config.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/providers/polargrid/models.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/providers/qwen/__init__.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/providers/qwen/ai.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/providers/qwen/config.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/providers/qwen/models.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/providers/rcs/__init__.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/providers/rcs/base.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/providers/rcs/mock.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/providers/sendgrid/__init__.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/providers/sendgrid/config.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/providers/sendgrid/email.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/providers/sinch/__init__.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/providers/sinch/config.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/providers/sinch/sms.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/providers/sms/__init__.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/providers/sms/base.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/providers/sms/meta.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/providers/sms/mock.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/providers/sms/phone.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/providers/teams/__init__.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/providers/teams/base.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/providers/teams/bot_framework.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/providers/teams/config.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/providers/teams/conversation_store.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/providers/teams/mock.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/providers/teams/models.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/providers/teams/webhook.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/providers/telegram/__init__.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/providers/telegram/api.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/providers/telegram/base.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/providers/telegram/bot.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/providers/telegram/config.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/providers/telegram/entities.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/providers/telegram/mock.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/providers/telegram/update.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/providers/telegram/webhook.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/providers/telnyx/__init__.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/providers/telnyx/_signature.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/providers/telnyx/config.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/providers/telnyx/rcs.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/providers/telnyx/sms.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/providers/twilio/__init__.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/providers/twilio/_signature.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/providers/twilio/config.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/providers/twilio/rcs.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/providers/twilio/sms.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/providers/twilio/webhook.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/providers/url_safety.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/providers/utils.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/providers/vllm/__init__.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/providers/vllm/config.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/providers/voicemeup/__init__.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/providers/voicemeup/config.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/providers/voicemeup/sms.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/providers/whatsapp/__init__.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/providers/whatsapp/base.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/providers/whatsapp/mock.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/providers/whatsapp/personal.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/providers/xai/__init__.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/providers/xai/ai.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/providers/xai/config.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/providers/xai/image.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/providers/xai/image_models.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/providers/xai/models.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/providers/xai/realtime.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/providers/xai/realtime_models.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/providers/xai/voices.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/py.typed +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/realtime/__init__.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/realtime/_subscription.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/realtime/base.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/realtime/memory.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/realtime/redis.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/recorder/__init__.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/recorder/_pyav_mux.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/recorder/_room_recorder_manager.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/recorder/base.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/recorder/mock.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/recorder/pyav.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/sandbox/__init__.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/sandbox/executor.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/sandbox/models.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/sandbox/tools.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/scoring/__init__.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/scoring/base.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/scoring/hook.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/scoring/mock.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/scoring/tracker.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/skills/__init__.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/skills/errors.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/skills/executor.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/skills/models.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/skills/parser.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/skills/paths.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/skills/registry.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/sources/__init__.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/sources/base.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/sources/buzz.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/sources/discord.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/sources/neonize.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/sources/sse.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/sources/websocket.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/store/__init__.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/store/base.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/store/memory.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/store/postgres.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/store/postgres_lock.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/store/postgres_mappers.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/store/postgres_schema.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/store/sqlite.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/tasks/__init__.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/tasks/base.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/tasks/cache.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/tasks/delegate.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/tasks/memory.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/tasks/models.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/telemetry/__init__.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/telemetry/base.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/telemetry/config.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/telemetry/console.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/telemetry/context.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/telemetry/mock.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/telemetry/noop.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/telemetry/opentelemetry.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/telemetry/pyroscope.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/telemetry/redaction.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/tools/__init__.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/tools/base.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/tools/compose.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/tools/context.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/tools/external.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/tools/human_input.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/tools/mcp.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/tools/policy.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/tools/validation.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/video/__init__.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/video/ai_integration.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/video/avatar/__init__.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/video/avatar/base.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/video/avatar/mock.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/video/avatar/musetalk.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/video/avatar/websocket.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/video/backends/__init__.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/video/backends/base.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/video/backends/fastrtc.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/video/backends/local.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/video/backends/mock.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/video/backends/rtp.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/video/backends/screen.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/video/backends/sip.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/video/backends/websocket.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/video/base.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/video/bridge.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/video/events.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/video/pipeline/__init__.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/video/pipeline/config.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/video/pipeline/decoder/__init__.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/video/pipeline/decoder/base.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/video/pipeline/decoder/mock.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/video/pipeline/decoder/pyav.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/video/pipeline/encoder/__init__.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/video/pipeline/encoder/base.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/video/pipeline/encoder/pyav.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/video/pipeline/engine.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/video/pipeline/filter/__init__.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/video/pipeline/filter/base.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/video/pipeline/filter/censor.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/video/pipeline/filter/mediapipe_face_touch.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/video/pipeline/filter/mock.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/video/pipeline/filter/mock_face_touch.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/video/pipeline/filter/watermark.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/video/pipeline/filter/yolo.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/video/pipeline/overlay/__init__.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/video/pipeline/overlay/base.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/video/pipeline/overlay/filter.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/video/pipeline/overlay/image.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/video/pipeline/overlay/mock.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/video/pipeline/overlay/rich.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/video/pipeline/overlay/subtitle.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/video/pipeline/overlay/text.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/video/pipeline/resizer/__init__.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/video/pipeline/resizer/base.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/video/pipeline/resizer/mock.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/video/pipeline/resizer/pyav.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/video/pipeline/transform/__init__.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/video/pipeline/transform/base.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/video/pipeline/transform/effects.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/video/pipeline/transform/mock.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/video/recorder/__init__.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/video/recorder/base.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/video/recorder/mock.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/video/recorder/opencv.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/video/recorder/pyav.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/video/utils.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/video/video_frame.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/video/vision/__init__.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/video/vision/base.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/video/vision/encode.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/video/vision/gemini.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/video/vision/mock.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/video/vision/openai.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/video/vision/screen_input.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/video/vision/screen_tool.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/video/vision/webcam_tool.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/voice/__init__.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/voice/_g711.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/voice/_limits.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/voice/_sounddevice.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/voice/audio_frame.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/voice/auth.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/voice/backends/__init__.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/voice/backends/_mulaw.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/voice/backends/_resample.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/voice/backends/_sip_types.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/voice/backends/_webrtc_auth.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/voice/backends/base.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/voice/backends/buzz_huddle.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/voice/backends/fastrtc.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/voice/backends/local.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/voice/backends/mock.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/voice/backends/rtp.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/voice/backends/sip.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/voice/backends/sip_audio.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/voice/backends/sip_auth.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/voice/backends/sip_calling.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/voice/backends/twilio_ws.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/voice/backends/webtransport.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/voice/base.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/voice/bridge.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/voice/capture/__init__.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/voice/capture/base.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/voice/capture/local.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/voice/capture/mock.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/voice/events.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/voice/inbound.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/voice/interruption.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/voice/pipeline/__init__.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/voice/pipeline/_telemetry.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/voice/pipeline/aec/__init__.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/voice/pipeline/aec/base.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/voice/pipeline/aec/mock.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/voice/pipeline/aec/speex.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/voice/pipeline/aec/webrtc.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/voice/pipeline/agc/__init__.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/voice/pipeline/agc/base.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/voice/pipeline/agc/mock.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/voice/pipeline/agc/simple.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/voice/pipeline/backchannel/__init__.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/voice/pipeline/backchannel/base.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/voice/pipeline/backchannel/mock.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/voice/pipeline/config.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/voice/pipeline/debug_taps.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/voice/pipeline/denoiser/__init__.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/voice/pipeline/denoiser/aicoustics.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/voice/pipeline/denoiser/base.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/voice/pipeline/denoiser/mock.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/voice/pipeline/denoiser/rnnoise.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/voice/pipeline/denoiser/sherpa_onnx.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/voice/pipeline/denoiser/webrtc.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/voice/pipeline/diarization/__init__.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/voice/pipeline/diarization/base.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/voice/pipeline/diarization/mock.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/voice/pipeline/diarization/sherpa_onnx.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/voice/pipeline/dtmf/__init__.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/voice/pipeline/dtmf/base.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/voice/pipeline/dtmf/mock.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/voice/pipeline/engine.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/voice/pipeline/mixer/__init__.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/voice/pipeline/mixer/base.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/voice/pipeline/mixer/numpy.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/voice/pipeline/mixer/python.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/voice/pipeline/offload.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/voice/pipeline/postprocessor/__init__.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/voice/pipeline/postprocessor/base.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/voice/pipeline/recorder/__init__.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/voice/pipeline/recorder/_wav_writer.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/voice/pipeline/recorder/base.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/voice/pipeline/recorder/mock.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/voice/pipeline/recorder/wav.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/voice/pipeline/resampler/__init__.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/voice/pipeline/resampler/base.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/voice/pipeline/resampler/linear.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/voice/pipeline/resampler/mock.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/voice/pipeline/resampler/numpy.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/voice/pipeline/resampler/sinc.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/voice/pipeline/turn/__init__.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/voice/pipeline/turn/base.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/voice/pipeline/turn/mock.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/voice/pipeline/turn/smart_turn.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/voice/pipeline/vad/__init__.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/voice/pipeline/vad/base.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/voice/pipeline/vad/energy.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/voice/pipeline/vad/mock.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/voice/pipeline/vad/sherpa_onnx.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/voice/realtime/__init__.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/voice/realtime/_fastrtc_playback.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/voice/realtime/bridge.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/voice/realtime/events.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/voice/realtime/injection.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/voice/realtime/mock.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/voice/realtime/pacer.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/voice/realtime/provider.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/voice/realtime/reasoning.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/voice/realtime/sip_transport.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/voice/realtime/ws_transport.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/voice/stt/__init__.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/voice/stt/base.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/voice/stt/deepgram.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/voice/stt/gemini.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/voice/stt/gemini_audio.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/voice/stt/gemini_transcript.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/voice/stt/gradium.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/voice/stt/language.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/voice/stt/mock.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/voice/stt/qwen3.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/voice/stt/sherpa_onnx.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/voice/testing/__init__.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/voice/testing/backend.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/voice/testing/trace.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/voice/testing/wav.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/voice/tts/__init__.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/voice/tts/audio_utils.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/voice/tts/base.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/voice/tts/elevenlabs.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/voice/tts/filters.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/voice/tts/gemini.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/voice/tts/gradium.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/voice/tts/grok.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/voice/tts/mock.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/voice/tts/neutts.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/voice/tts/qwen3.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/voice/tts/sentence_splitter.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/voice/tts/sherpa_onnx.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/voice/utils.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/webrtc/LICENSE +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/webrtc/__init__.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/webrtc/tracks.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/webrtc/utils.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/webrtc/websocket.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/__init__.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/conference/__init__.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/conference/lane_audio.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/conference/test_backend_abc.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/conference/test_conference_activity.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/conference/test_conference_attach_failure.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/conference/test_conference_channel.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/conference/test_conference_gating.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/conference/test_conference_hot_plug.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/conference/test_conference_identity.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/conference/test_conference_lane.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/conference/test_conference_metadata.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/conference/test_conference_mixer.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/conference/test_conference_outbound.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/conference/test_conference_pure_transport.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/conference/test_conference_races.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/conference/test_conference_realtime.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/conference/test_conference_realtime_hot_plug.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/conference/test_conference_realtime_voice.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/conference/test_conference_recording.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/conference/test_conference_recording_isolation.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/conference/test_conference_teardown_failure.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/conference/test_livekit_backend.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/conference/test_livekit_live.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/conference/test_livekit_mapping.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/conference/test_mock_backend.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/conference/test_mock_injection.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/conference/test_models.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/conftest.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/delivery/__init__.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/delivery/test_base.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/delivery/test_integration.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/delivery/test_memory.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/delivery/test_redis.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/delivery/test_redis_integration.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/delivery/test_serialization.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/delivery/test_targeted.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/delivery/test_worker.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/http_timeout_fakes.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/orchestration/__init__.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/orchestration/test_framework_orchestration.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/orchestration/test_handoff.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/orchestration/test_loop_strategy.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/orchestration/test_orchestration_base.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/orchestration/test_pipeline.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/orchestration/test_router.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/orchestration/test_session_audit.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/orchestration/test_state.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/orchestration/test_status_bus.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/orchestration/test_status_redis.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/orchestration/test_strategy_behavioral.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/orchestration/test_strategy_loop.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/orchestration/test_strategy_pipeline.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/orchestration/test_strategy_supervisor.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/orchestration/test_strategy_swarm.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/orchestration/test_supervisor_inline.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/orchestration/test_supervisor_strategy.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/orchestration/test_tool_audit.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/providers/__init__.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/providers/gemini/__init__.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/providers/gemini/test_reconfigure_preservation.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/providers/gemini/test_schema.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/providers/openai/__init__.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/providers/openai/test_reconfigure.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/redis_fakes.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/stress/__init__.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/stress/test_stress_core.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/stress/test_stress_messaging.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/stress/test_stress_voice.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/tasks/__init__.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/tasks/test_cache.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/tasks/test_child_room_trace.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/tasks/test_delegate.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/tasks/test_integration.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/tasks/test_models.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/tasks/test_runner.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/tasks/test_structured_result.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_addressing.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_aec_bench.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_aec_pipeline.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_ai_docs.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_ai_response_plain_stream.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_ai_response_transcript.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_ai_stream_contract.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_ai_streaming_thinking.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_ai_streaming_tool_events.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_ai_streaming_tool_loop.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_aicoustics_denoiser.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_anam_realtime.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_audio_backpressure.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_audio_capture_source.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_audio_limits.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_audio_pipeline.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_auto_connect.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_av_channel.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_avatar.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_before_ai_generation.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_before_deliver_gate.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_binding_permission_inheritance.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_bridge_hook_modification.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_buzz_huddle_backend.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_channel_abc.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_channel_attach_contract.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_channels/__init__.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_channels/test_acp.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_channels/test_acp_empty_prompt.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_channels/test_acp_usage.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_channels/test_acp_usage_boundaries.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_channels/test_agent.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_channels/test_ai.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_channels/test_ai_active_turns.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_channels/test_ai_empty_retry.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_channels/test_ai_loop_rules.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_channels/test_ai_response_loop_end_reason.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_channels/test_ai_retry.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_channels/test_ai_skill_gating.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_channels/test_ai_steering.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_channels/test_ai_streaming_compaction.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_channels/test_ai_tool_loop.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_channels/test_compact_context_tool_pairs.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_channels/test_email.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_channels/test_http.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_channels/test_loop_end_marker.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_channels/test_loop_end_reason_nonstreaming.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_channels/test_messenger.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_channels/test_multimodal_tool_result.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_channels/test_sms.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_channels/test_telegram.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_channels/test_tool_usage_memory.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_channels/test_turn_config.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_channels/test_websocket.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_channels/test_whatsapp.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_chat_benchmark.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_chat_quality.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_check_models.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_circuit_breaker.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_cli_activity.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_cli_channel.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_cli_console.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_cli_prompt_shell.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_cli_select.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_commit_atomicity.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_compacting_cache.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_compose_tool_handlers.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_config_secret_hygiene.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_configs.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_conformance_level0.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_console.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_context_carry_forward.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_context_visibility.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_current_turn_budget.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_dangling_recovery.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_delivery_cancellation.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_delivery_cancellation_streams.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_delivery_order.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_delivery_outcomes.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_delivery_strategies.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_denoiser_rnnoise_loader.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_describe_screen_tool.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_describe_webcam_tool.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_drain_barge_in.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_edit_delete_authorization.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_energy_vad.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_enums.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_event_ops.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_event_text.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_examples_audio.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_external_tool_handler.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_face_touch_filter.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_fastrtc_audio_session.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_fastrtc_playback.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_fastrtc_realtime_transport.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_framework.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_framework_aware.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_framework_events.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_framework_queries.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_framework_status_bus.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_gemini_context_preservation.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_gemini_realtime_failfast.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_gemini_transcript_dedup.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_hook_payload_modification.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_hook_side_effects.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_hooks.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_http_timeouts.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_human_input.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_idempotent_redelivery.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_identity_hooks.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_identity_pipeline.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_identity_unknown_outcomes.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_inbound_connection_budget.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_inbound_deferred.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_inbound_error_surfacing.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_inbound_rate_limit.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_inbound_response_events.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_inbound_routing.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_inbound_routing_ambiguity.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_inbound_stream_cancellation.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_inbound_stream_error_propagation.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_inbound_visibility.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_integration/__init__.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_integration/test_ai_assistant.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_integration/test_ai_chain_depth.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_integration/test_cerebras_live.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_integration/test_cross_channel.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_integration/test_dynamic_channels.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_integration/test_human_ai.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_integration/test_identity_resolution.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_integration/test_observer.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_integration/test_regenerate.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_integration/test_sin_scanning.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_interruption.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_interruption_partials.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_interruption_pipeline.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_invalid_tool_repeat_guard.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_knowledge_postgres.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_lanes.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_lanes_multiworker.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_lifecycle_hooks.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_local_backend_aec.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_locks.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_log_redaction.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_mcp_structured_content.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_mcp_tool_provider.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_mcp_tools.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_media_recorder.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_memory.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_memory_new.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_memory_wrappers.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_mock_providers.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_models.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_observability.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_opencv_recorder.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_opentelemetry.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_optional_imports.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_outbound_audio_pacer.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_parallel_tool_cleanup.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_participant_membership.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_personaplex_realtime.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_pipeline_debug_taps.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_pipeline_engine.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_pipeline_providers.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_pipeline_resampler.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_pipeline_resampler_numpy.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_pipeline_resampler_sinc.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_postgres_lock.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_postgres_multiprocess.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_postgres_store.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_precommit_timeout.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_proactive_delivery.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_proactive_delivery_voice.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_protocol_trace.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_providers/__init__.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_providers/conftest.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_providers/test_ai_models.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_providers/test_anam_avatar.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_providers/test_anam_realtime.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_providers/test_anthropic.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_providers/test_azure.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_providers/test_azure_image.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_providers/test_buzz.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_providers/test_cerebras.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_providers/test_cerebras_tool_arrays.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_providers/test_deepseek.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_providers/test_discord.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_providers/test_elasticemail.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_providers/test_gemini.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_providers/test_gemini_list_models.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_providers/test_gemini_realtime.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_providers/test_gemini_vertex.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_providers/test_http.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_providers/test_http_timeouts.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_providers/test_image.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_providers/test_image_parts.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_providers/test_litellm.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_providers/test_messenger.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_providers/test_mistral.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_providers/test_ollama.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_providers/test_openai.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_providers/test_openai_realtime.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_providers/test_openrouter.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_providers/test_openrouter_image.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_providers/test_personaplex_realtime.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_providers/test_phone.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_providers/test_polargrid.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_providers/test_qwen.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_providers/test_rcs.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_providers/test_realtime_models.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_providers/test_realtime_voices.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_providers/test_sendgrid.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_providers/test_sinch.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_providers/test_sms_utils.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_providers/test_teams.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_providers/test_teams_webhook.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_providers/test_telegram_api.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_providers/test_telegram_bot.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_providers/test_telegram_entities.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_providers/test_telegram_update.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_providers/test_telegram_webhook.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_providers/test_telnyx.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_providers/test_telnyx_rcs.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_providers/test_twilio.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_providers/test_vllm.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_providers/test_voicemeup.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_providers/test_whatsapp_personal.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_providers/test_xai.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_providers/test_xai_image.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_providers/test_xai_realtime.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_public_api.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_pyav_decode_native.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_pyav_media_recorder.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_pyav_recorder.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_rate_limiter.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_raw_payload_preservation.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_realtime.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_realtime_av_channel.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_realtime_deepgram.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_realtime_elevenlabs.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_realtime_fixed_tools.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_realtime_full_duplex.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_realtime_g711.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_realtime_hook_coverage.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_realtime_playback_lifecycle.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_realtime_reasoning.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_realtime_reconfiguration.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_realtime_reconnection.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_realtime_redis.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_realtime_resample_offload.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_realtime_skill_delivery.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_realtime_skills.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_realtime_tool_recovery.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_realtime_tool_search.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_realtime_voice.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_realtime_voice_integration.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_realtime_xai.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_recent_events_window.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_recording_consent.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_recording_wiring.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_reentry_block_side_effects.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_related_family_tools.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_release_script.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_repeated_result_note.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_resilience.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_response_metadata.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_response_visibility.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_retrieval_memory.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_retry_retryability.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_rfc_arbitrations.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_rfc_conformance.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_rfc_framework_events.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_rfc_write_gates.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_rnnoise.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_room_org_scoping.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_room_status_enforcement.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_router.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_rtp_video_backend.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_scoring.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_screen_capture_backend.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_screen_input.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_session_started.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_sherpa_onnx_denoiser.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_sherpa_onnx_vad.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_sip_audio_clock.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_sip_auth.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_sip_dial.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_sip_helpers.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_sip_realtime_transport.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_sip_video_backend.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_skill_activation.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_skill_tool_gating.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_skills.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_skills_integration.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_smart_turn.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_smoke_quickstart.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_source_rate_limit.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_source_url_redaction.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_sources.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_sources_init.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_sources_neonize.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_sources_sse.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_sources_websocket.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_speaker_attribution.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_speex_aec.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_store_activity.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_store_binding_contract.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_store_identity_scoping.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_store_lifecycle_immutability.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_store_memory.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_store_postgres.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_store_sqlite.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_streaming_before_broadcast.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_stt_deepgram_teardown.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_stt_gemini.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_stt_qwen3.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_summarizing_memory.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_supervisor.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_task_planner.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_task_utils.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_telemetry.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_telemetry_pyroscope.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_threading.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_tool_arg_fold.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_tool_arg_validation.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_tool_context.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_tool_eviction_room_scope.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_tool_policy.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_tool_protocol.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_tool_repeat_guard.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_tool_round_cap.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_tool_search_text.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_transport_auth.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_tts_elevenlabs.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_tts_gemini.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_tts_grok.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_tts_neutts.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_tts_qwen3.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_tts_text_split.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_turn_detection.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_twilio_ws_backend.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_unified_tool_call.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_vad_debug_logging.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_video.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_video_ai_integration.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_video_channel.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_video_local.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_video_pipeline.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_video_pipeline_config.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_video_recording.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_video_session_isolation.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_video_transform.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_vision_gemini.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_vision_openai.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_voice.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_voice_batch_stt.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_voice_binding_gate.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_voice_channel_aec.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_voice_delivery_idempotency.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_voice_delivery_recovery.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_voice_delivery_store.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_voice_dsp_vectorized.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_voice_fastrtc.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_voice_frame_limit.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_voice_inbound.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_voice_injection_results.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_voice_integration.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_voice_local.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_voice_map.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_voice_rtp.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_voice_say_play.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_voice_security.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_voice_session_lifecycle.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_voice_sherpa_onnx.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_voice_streaming_ai_tts.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_voice_streaming_stt.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_voice_stt_language.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_voice_webtransport.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_wake_word_backlog.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_wav_recorder.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_webrtc_offer_auth.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_websocket_lifecycle.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_websocket_room_scoping.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_yolo_filter.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/video/__init__.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/video/test_av_channel_fastrtc.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/video/test_fastrtc_video_backend.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/video/test_overlay_filter.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/video/test_overlay_image.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/video/test_overlay_rich.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/video/test_overlay_subtitle.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/video/test_overlay_text.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/video/test_screen_input.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/video/test_screen_input_tools.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/video/test_video_bridge.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/video/test_video_effects.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/video/test_watermark_filter.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/video/test_websocket_avatar.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/video/test_websocket_video_backend.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/voice/__init__.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/voice/backends/__init__.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/voice/backends/test_rtp.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/voice/backends/test_sip.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/voice/backends/test_sip_coverage.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/voice/backends/test_webtransport.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/voice/pipeline/__init__.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/voice/pipeline/stream_conformance.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/voice/pipeline/test_aicoustics_denoiser.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/voice/pipeline/test_offload_callbacks.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/voice/pipeline/test_per_stream_regression.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/voice/pipeline/test_rnnoise_denoiser.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/voice/pipeline/test_sherpa_diarization.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/voice/pipeline/test_simple_agc.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/voice/pipeline/test_smart_turn.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/voice/pipeline/test_speex_aec.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/voice/pipeline/test_stream_conformance.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/voice/pipeline/test_stream_entry_point.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/voice/pipeline/test_webrtc_aec.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/voice/pipeline/test_webrtc_denoiser.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/voice/realtime/__init__.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/voice/realtime/test_fastrtc_transport.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/voice/realtime/test_realtime_bridge.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/voice/realtime/test_ws_transport.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/voice/stt/__init__.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/voice/stt/test_deepgram.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/voice/stt/test_deepgram_stream_language.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/voice/stt/test_gradium_stt.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/voice/stt/test_language_lock.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/voice/stt/test_qwen3_asr.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/voice/test_bridge.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/voice/test_inbound_offload.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/voice/test_testing_backend.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/voice/test_testing_trace.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/voice/test_testing_wav.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/voice/test_tts_filters.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/voice/test_voice_close_providers.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/voice/test_voice_tts_filter.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/voice/tts/__init__.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/voice/tts/test_elevenlabs.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/voice/tts/test_gradium_tts.py +0 -0
- {roomkit-0.75.2 → roomkit-0.76.0}/tests/voice/tts/test_qwen3_tts.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.5
|
|
2
2
|
Name: roomkit
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.76.0
|
|
4
4
|
Summary: Pure async Python library for multi-channel conversations
|
|
5
5
|
Project-URL: Homepage, https://roomkit.live
|
|
6
6
|
Project-URL: Documentation, https://www.roomkit.live/docs/
|
|
@@ -40,6 +40,7 @@ Requires-Dist: deepgram-sdk>=6.0.0; extra == 'all'
|
|
|
40
40
|
Requires-Dist: discord-py>=2.4; extra == 'all'
|
|
41
41
|
Requires-Dist: elevenlabs>=2.40; extra == 'all'
|
|
42
42
|
Requires-Dist: google-genai>=2.0.0; extra == 'all'
|
|
43
|
+
Requires-Dist: google-genai>=2.18.0; extra == 'all'
|
|
43
44
|
Requires-Dist: gradium>=0.5.7; extra == 'all'
|
|
44
45
|
Requires-Dist: httpx-sse>=0.4; extra == 'all'
|
|
45
46
|
Requires-Dist: httpx>=0.27; extra == 'all'
|
|
@@ -95,7 +96,7 @@ Requires-Dist: asyncpg>=0.29; extra == 'dev'
|
|
|
95
96
|
Requires-Dist: bandit>=1.7; extra == 'dev'
|
|
96
97
|
Requires-Dist: botbuilder-core>=4.17; extra == 'dev'
|
|
97
98
|
Requires-Dist: discord-py>=2.4; extra == 'dev'
|
|
98
|
-
Requires-Dist: google-genai>=2.
|
|
99
|
+
Requires-Dist: google-genai>=2.18.0; extra == 'dev'
|
|
99
100
|
Requires-Dist: gradium>=0.5.7; extra == 'dev'
|
|
100
101
|
Requires-Dist: httpx-sse>=0.4; extra == 'dev'
|
|
101
102
|
Requires-Dist: httpx>=0.27; extra == 'dev'
|
|
@@ -138,7 +139,7 @@ Requires-Dist: librosa>=0.10; extra == 'fastrtc'
|
|
|
138
139
|
Requires-Dist: numpy<2.5,>=1.26; extra == 'fastrtc'
|
|
139
140
|
Requires-Dist: pydub>=0.25; extra == 'fastrtc'
|
|
140
141
|
Provides-Extra: gemini
|
|
141
|
-
Requires-Dist: google-genai>=2.
|
|
142
|
+
Requires-Dist: google-genai>=2.18.0; extra == 'gemini'
|
|
142
143
|
Provides-Extra: gradium
|
|
143
144
|
Requires-Dist: gradium>=0.5.7; extra == 'gradium'
|
|
144
145
|
Provides-Extra: httpx
|
|
@@ -180,7 +181,7 @@ Provides-Extra: providers
|
|
|
180
181
|
Requires-Dist: anthropic>=0.30; extra == 'providers'
|
|
181
182
|
Requires-Dist: botbuilder-core>=4.17; extra == 'providers'
|
|
182
183
|
Requires-Dist: discord-py>=2.4; extra == 'providers'
|
|
183
|
-
Requires-Dist: google-genai>=2.
|
|
184
|
+
Requires-Dist: google-genai>=2.18.0; extra == 'providers'
|
|
184
185
|
Requires-Dist: gradium>=0.5.7; extra == 'providers'
|
|
185
186
|
Requires-Dist: httpx>=0.27; extra == 'providers'
|
|
186
187
|
Requires-Dist: mistralai<3,>=2.0; extra == 'providers'
|
|
@@ -49,7 +49,7 @@ cerebras = ["openai>=2.28,<3"]
|
|
|
49
49
|
# read like the family's umbrella install rather than the chat provider.
|
|
50
50
|
qwen-ai = ["openai>=2.28,<3"]
|
|
51
51
|
ollama = ["ollama>=0.4"]
|
|
52
|
-
gemini = ["google-genai>=2.
|
|
52
|
+
gemini = ["google-genai>=2.18.0"]
|
|
53
53
|
mistral = ["mistralai>=2.0,<3"]
|
|
54
54
|
polargrid = ["polargrid-sdk>=0.10.0"]
|
|
55
55
|
deepgram = ["deepgram-sdk>=6.0.0"]
|
|
@@ -171,7 +171,17 @@ from roomkit.orchestration import (
|
|
|
171
171
|
)
|
|
172
172
|
from roomkit.providers.ai import ModelPricing
|
|
173
173
|
from roomkit.providers.cerebras import CerebrasAIProvider, CerebrasConfig
|
|
174
|
-
from roomkit.providers.image import
|
|
174
|
+
from roomkit.providers.image import (
|
|
175
|
+
ImageAttempt,
|
|
176
|
+
ImageCapabilities,
|
|
177
|
+
ImageGenerationError,
|
|
178
|
+
ImageModelInfo,
|
|
179
|
+
ImageOptions,
|
|
180
|
+
ImageProgressCallback,
|
|
181
|
+
ImageProvider,
|
|
182
|
+
ImageResult,
|
|
183
|
+
MockImageProvider,
|
|
184
|
+
)
|
|
175
185
|
from roomkit.sandbox import SandboxExecutor, SandboxResult
|
|
176
186
|
from roomkit.skills import ScriptExecutor, Skill, SkillMetadata, SkillRegistry
|
|
177
187
|
from roomkit.store import ConversationStore, InMemoryStore, SQLiteSchemaError, SQLiteStore
|
|
@@ -427,6 +437,12 @@ __all__ = [
|
|
|
427
437
|
"FrameworkEvent",
|
|
428
438
|
"HookResult",
|
|
429
439
|
"ImageProvider",
|
|
440
|
+
"ImageAttempt",
|
|
441
|
+
"ImageCapabilities",
|
|
442
|
+
"ImageGenerationError",
|
|
443
|
+
"ImageModelInfo",
|
|
444
|
+
"ImageOptions",
|
|
445
|
+
"ImageProgressCallback",
|
|
430
446
|
"ImageResult",
|
|
431
447
|
"InjectedEvent",
|
|
432
448
|
"InboundMessage",
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
__version__ = "0.76.0"
|
|
@@ -21,11 +21,17 @@ from roomkit.providers.gemini.errors import wrap_gemini_error
|
|
|
21
21
|
from roomkit.providers.gemini.image_models import MODELS
|
|
22
22
|
from roomkit.providers.gemini.sdk import build_genai_client, close_genai_client
|
|
23
23
|
from roomkit.providers.image.base import (
|
|
24
|
+
ImageAttempt,
|
|
25
|
+
ImageGenerationError,
|
|
26
|
+
ImageProgressCallback,
|
|
24
27
|
ImageProvider,
|
|
25
28
|
ImageResult,
|
|
29
|
+
notify_image_progress,
|
|
26
30
|
parse_data_uri,
|
|
27
31
|
parse_size,
|
|
28
32
|
)
|
|
33
|
+
from roomkit.providers.image.options import ImageModelInfo, ImageOptions, plain_metadata
|
|
34
|
+
from roomkit.providers.image.usage import gemini_image_usage
|
|
29
35
|
|
|
30
36
|
# Aspect ratios the Interactions image format accepts. A requested size is
|
|
31
37
|
# reduced to its ratio and looked up here; an unlisted one is refused rather
|
|
@@ -64,7 +70,10 @@ class GeminiImageProvider(ImageProvider):
|
|
|
64
70
|
# The client carries the connect/read split; see ``build_genai_client``
|
|
65
71
|
# for why it cannot go on the request.
|
|
66
72
|
built = build_genai_client(
|
|
67
|
-
config,
|
|
73
|
+
config,
|
|
74
|
+
provider="GeminiImageProvider",
|
|
75
|
+
api_key=config.api_key.get_secret_value(),
|
|
76
|
+
disable_retries=True,
|
|
68
77
|
)
|
|
69
78
|
self._client, self._http = built.client, built.http
|
|
70
79
|
|
|
@@ -88,24 +97,141 @@ class GeminiImageProvider(ImageProvider):
|
|
|
88
97
|
size: str | None = None,
|
|
89
98
|
n: int = 1,
|
|
90
99
|
reference_images: list[AIImagePart] | None = None,
|
|
100
|
+
) -> list[ImageResult]:
|
|
101
|
+
return await self.generate_with_options(
|
|
102
|
+
prompt, size=size, n=n, reference_images=reference_images
|
|
103
|
+
)
|
|
104
|
+
|
|
105
|
+
async def generate_with_options(
|
|
106
|
+
self,
|
|
107
|
+
prompt: str,
|
|
108
|
+
*,
|
|
109
|
+
size: str | None = None,
|
|
110
|
+
n: int = 1,
|
|
111
|
+
reference_images: list[AIImagePart] | None = None,
|
|
112
|
+
options: ImageOptions | None = None,
|
|
113
|
+
mask: AIImagePart | None = None,
|
|
114
|
+
on_progress: ImageProgressCallback | None = None,
|
|
91
115
|
) -> list[ImageResult]:
|
|
92
116
|
if n < 1:
|
|
93
|
-
raise ValueError(
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
117
|
+
raise ValueError("n must be at least 1")
|
|
118
|
+
if mask:
|
|
119
|
+
raise ValueError("Gemini does not support explicit masks")
|
|
120
|
+
options = options or ImageOptions()
|
|
121
|
+
references = reference_images or []
|
|
122
|
+
if size and (options.aspect_ratio or options.image_size):
|
|
123
|
+
raise ValueError("Use size or aspect_ratio/image_size, not both")
|
|
124
|
+
defaults: dict[str, Any] = {}
|
|
125
|
+
if self._config.image_size:
|
|
126
|
+
defaults["image_size"] = self._config.image_size
|
|
127
|
+
if self._config.output_mime_type:
|
|
128
|
+
defaults["output_format"] = self._config.output_mime_type.removeprefix("image/")
|
|
129
|
+
if size:
|
|
130
|
+
defaults["aspect_ratio"], defaults["image_size"] = self.resolve_size(size)
|
|
131
|
+
options = ImageOptions.model_validate(
|
|
132
|
+
{**defaults, **options.model_dump(exclude_none=True)}
|
|
133
|
+
)
|
|
134
|
+
entry = self.catalog_entry()
|
|
135
|
+
if isinstance(entry, ImageModelInfo):
|
|
136
|
+
entry.image.validate_request(
|
|
137
|
+
options, size=None, n=n, references=len(references), mask=False
|
|
138
|
+
)
|
|
139
|
+
elif set(options.model_dump(exclude_none=True)) - set(defaults) - {"store"}:
|
|
140
|
+
raise ValueError("Advanced controls require a model with known image capabilities")
|
|
141
|
+
request = self._build_request(prompt, None, references)
|
|
142
|
+
for field in ("aspect_ratio", "image_size"):
|
|
143
|
+
if (value := getattr(options, field)) is not None:
|
|
144
|
+
request["response_format"][field] = value
|
|
145
|
+
if options.output_format:
|
|
146
|
+
request["response_format"]["mime_type"] = "image/" + options.output_format
|
|
147
|
+
if options.store is not None:
|
|
148
|
+
request["store"] = options.store
|
|
149
|
+
if options.previous_interaction_id:
|
|
150
|
+
request["previous_interaction_id"] = options.previous_interaction_id
|
|
151
|
+
if options.search_types:
|
|
152
|
+
request["tools"] = [{"type": "google_search", "search_types": options.search_types}]
|
|
153
|
+
if options.thinking_level:
|
|
154
|
+
request["generation_config"] = {"thinking_level": options.thinking_level}
|
|
155
|
+
# Each call settles independently. A rejected sibling does not erase a
|
|
156
|
+
# successful billed image or cancel a call whose outcome is still unknown.
|
|
157
|
+
outcomes = await asyncio.gather(
|
|
158
|
+
*[self._attempt(request, index, on_progress) for index in range(n)],
|
|
159
|
+
return_exceptions=True,
|
|
160
|
+
)
|
|
161
|
+
attempts: list[ImageAttempt] = []
|
|
162
|
+
failures: list[BaseException] = []
|
|
163
|
+
for outcome in outcomes:
|
|
164
|
+
if isinstance(outcome, ImageAttempt):
|
|
165
|
+
attempts.append(outcome)
|
|
166
|
+
elif isinstance(outcome, ImageGenerationError):
|
|
167
|
+
attempts.extend(outcome.attempts)
|
|
168
|
+
failures.append(outcome)
|
|
169
|
+
elif isinstance(outcome, BaseException):
|
|
170
|
+
failures.append(outcome)
|
|
171
|
+
if failures:
|
|
172
|
+
first = failures[0]
|
|
173
|
+
raise ImageGenerationError(str(first), provider="gemini", attempts=attempts) from (
|
|
174
|
+
first.__cause__ or first
|
|
175
|
+
)
|
|
176
|
+
return [result for attempt in attempts for result in attempt.results]
|
|
177
|
+
|
|
178
|
+
async def _attempt(
|
|
179
|
+
self, request: dict[str, Any], index: int, on_progress: ImageProgressCallback | None
|
|
180
|
+
) -> ImageAttempt:
|
|
181
|
+
attempt = ImageAttempt(
|
|
182
|
+
index=index,
|
|
183
|
+
effective_options={key: value for key, value in request.items() if key != "input"},
|
|
184
|
+
)
|
|
185
|
+
if on_progress:
|
|
186
|
+
await notify_image_progress(on_progress, attempt, provider="gemini")
|
|
187
|
+
interaction = None
|
|
188
|
+
failure: Exception | None = None
|
|
98
189
|
try:
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
190
|
+
interaction = await self._create(request)
|
|
191
|
+
attempt.provider_request_id = getattr(interaction, "id", None)
|
|
192
|
+
attempt.usage = self._usage(interaction)
|
|
193
|
+
attempt.raw_usage = plain_metadata(getattr(interaction, "usage", None)) or {}
|
|
194
|
+
attempt.metadata = {
|
|
195
|
+
"steps": plain_metadata(getattr(interaction, "steps", [])),
|
|
196
|
+
"output_text": getattr(interaction, "output_text", None),
|
|
197
|
+
}
|
|
198
|
+
result = self._result(interaction)
|
|
199
|
+
attempt.results = [
|
|
200
|
+
result.model_copy(
|
|
201
|
+
update={
|
|
202
|
+
"attempt_id": attempt.id,
|
|
203
|
+
"provider_request_id": attempt.provider_request_id,
|
|
204
|
+
"raw_usage": attempt.raw_usage,
|
|
205
|
+
"effective_options": attempt.effective_options,
|
|
206
|
+
"metadata": attempt.metadata,
|
|
207
|
+
}
|
|
208
|
+
)
|
|
209
|
+
]
|
|
210
|
+
attempt.status = "succeeded"
|
|
211
|
+
except asyncio.CancelledError as cancelled:
|
|
212
|
+
attempt.status = "unknown"
|
|
213
|
+
attempt.error = "Cancelled locally; the provider may still bill this request"
|
|
214
|
+
try:
|
|
215
|
+
await notify_image_progress(on_progress, attempt, provider="gemini")
|
|
216
|
+
except Exception as exc:
|
|
217
|
+
cancelled.add_note(f"Failed to report unknown image outcome: {exc}")
|
|
218
|
+
raise
|
|
219
|
+
except Exception as exc:
|
|
220
|
+
failure = exc
|
|
221
|
+
attempt.status = (
|
|
222
|
+
"failed"
|
|
223
|
+
if interaction is not None or getattr(exc, "status_code", None)
|
|
224
|
+
else "unknown"
|
|
225
|
+
)
|
|
226
|
+
attempt.error = str(exc)
|
|
227
|
+
attempt.status_code = getattr(exc, "status_code", None)
|
|
228
|
+
if on_progress:
|
|
229
|
+
await notify_image_progress(on_progress, attempt, provider="gemini")
|
|
230
|
+
if failure:
|
|
231
|
+
raise ImageGenerationError(
|
|
232
|
+
str(failure), provider="gemini", attempts=[attempt]
|
|
233
|
+
) from failure
|
|
234
|
+
return attempt
|
|
109
235
|
|
|
110
236
|
def _build_request(
|
|
111
237
|
self,
|
|
@@ -130,7 +256,7 @@ class GeminiImageProvider(ImageProvider):
|
|
|
130
256
|
if size is not None:
|
|
131
257
|
# The requested pixels win over the deployment default: a caller
|
|
132
258
|
# naming a geometry is more specific than a configured tier.
|
|
133
|
-
aspect_ratio, tier = self.
|
|
259
|
+
aspect_ratio, tier = self.resolve_size(size)
|
|
134
260
|
response_format["aspect_ratio"] = aspect_ratio
|
|
135
261
|
response_format["image_size"] = tier
|
|
136
262
|
elif self._config.image_size is not None:
|
|
@@ -153,7 +279,7 @@ class GeminiImageProvider(ImageProvider):
|
|
|
153
279
|
raise wrap_gemini_error(exc) from exc
|
|
154
280
|
|
|
155
281
|
@staticmethod
|
|
156
|
-
def
|
|
282
|
+
def resolve_size(size: str) -> tuple[str, str]:
|
|
157
283
|
"""Translate ``"WIDTHxHEIGHT"`` into Gemini's aspect ratio and size tier.
|
|
158
284
|
|
|
159
285
|
Gemini expresses geometry as a named ratio and a resolution tier, not
|
|
@@ -174,6 +300,8 @@ class GeminiImageProvider(ImageProvider):
|
|
|
174
300
|
return aspect_ratio, tier
|
|
175
301
|
raise ValueError(f"size {size!r} exceeds Gemini's largest tier (4K)")
|
|
176
302
|
|
|
303
|
+
_geometry = resolve_size
|
|
304
|
+
|
|
177
305
|
@staticmethod
|
|
178
306
|
def _image_content(part: AIImagePart, index: int) -> dict[str, Any]:
|
|
179
307
|
"""Turn a reference image into an Interactions image content block.
|
|
@@ -241,34 +369,10 @@ class GeminiImageProvider(ImageProvider):
|
|
|
241
369
|
again, which would bill the pixels twice. Thought tokens are billed at
|
|
242
370
|
the text output rate, so they join the text output counter.
|
|
243
371
|
"""
|
|
244
|
-
|
|
245
|
-
if usage is None:
|
|
246
|
-
return {}
|
|
247
|
-
input_total = int(getattr(usage, "total_input_tokens", 0) or 0)
|
|
248
|
-
output_total = int(getattr(usage, "total_output_tokens", 0) or 0)
|
|
249
|
-
thoughts = int(getattr(usage, "total_thought_tokens", 0) or 0)
|
|
250
|
-
input_image = _modality_tokens(getattr(usage, "input_tokens_by_modality", None), "image")
|
|
251
|
-
output_image = _modality_tokens(getattr(usage, "output_tokens_by_modality", None), "image")
|
|
252
|
-
return {
|
|
253
|
-
"input_tokens": max(input_total - input_image, 0),
|
|
254
|
-
"input_image_tokens": input_image,
|
|
255
|
-
"output_tokens": max(output_total - output_image, 0) + thoughts,
|
|
256
|
-
"output_image_tokens": output_image,
|
|
257
|
-
}
|
|
372
|
+
return gemini_image_usage(getattr(interaction, "usage", None))
|
|
258
373
|
|
|
259
374
|
async def close(self) -> None:
|
|
260
375
|
"""Close the SDK and the httpx client it was given."""
|
|
261
376
|
client, self._client = self._client, None
|
|
262
377
|
http, self._http = self._http, None
|
|
263
378
|
await close_genai_client(client, http)
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
def _modality_tokens(breakdown: Any, modality: str) -> int:
|
|
267
|
-
"""Sum the token counts one modality contributes to a usage breakdown."""
|
|
268
|
-
if not breakdown:
|
|
269
|
-
return 0
|
|
270
|
-
total = 0
|
|
271
|
-
for entry in breakdown:
|
|
272
|
-
if str(getattr(entry, "modality", "")).lower() == modality:
|
|
273
|
-
total += int(getattr(entry, "tokens", 0) or 0)
|
|
274
|
-
return total
|
|
@@ -32,13 +32,61 @@ from datetime import date
|
|
|
32
32
|
|
|
33
33
|
from roomkit.providers.ai.base import ModelInfo, ModelPricing
|
|
34
34
|
from roomkit.providers.image.base import IMAGE_GEN_CAPABILITY
|
|
35
|
+
from roomkit.providers.image.options import ImageCapabilities, ImageModelInfo
|
|
35
36
|
|
|
36
37
|
_VERIFIED = date(2026, 8, 7)
|
|
37
38
|
_CAPS = [IMAGE_GEN_CAPABILITY, "edit"]
|
|
38
39
|
|
|
40
|
+
_RATIOS = ["1:1", "2:3", "3:2", "3:4", "4:3", "4:5", "5:4", "9:16", "16:9", "21:9"]
|
|
41
|
+
_PRO = ImageCapabilities(
|
|
42
|
+
options=[
|
|
43
|
+
"aspect_ratio",
|
|
44
|
+
"image_size",
|
|
45
|
+
"output_format",
|
|
46
|
+
"previous_interaction_id",
|
|
47
|
+
"store",
|
|
48
|
+
"search_types",
|
|
49
|
+
],
|
|
50
|
+
aspect_ratios=_RATIOS,
|
|
51
|
+
image_sizes=["1K", "2K", "4K"],
|
|
52
|
+
formats=["png", "jpeg"],
|
|
53
|
+
max_references=14,
|
|
54
|
+
max_images=None,
|
|
55
|
+
continuity=True,
|
|
56
|
+
search_types=["web_search"],
|
|
57
|
+
verified=date(2026, 9, 15),
|
|
58
|
+
)
|
|
59
|
+
_FLASH = _PRO.model_copy(
|
|
60
|
+
update={
|
|
61
|
+
"options": [*_PRO.options, "thinking_level"],
|
|
62
|
+
"thinking_levels": ["minimal", "high"],
|
|
63
|
+
"aspect_ratios": [*_RATIOS, "1:4", "4:1", "1:8", "8:1"],
|
|
64
|
+
"image_sizes": ["512", "1K", "2K", "4K"],
|
|
65
|
+
"search_types": ["web_search", "image_search"],
|
|
66
|
+
}
|
|
67
|
+
)
|
|
68
|
+
_LITE = _PRO.model_copy(
|
|
69
|
+
update={
|
|
70
|
+
"image_sizes": ["1K"],
|
|
71
|
+
"search_types": [],
|
|
72
|
+
"options": [option for option in _PRO.options if option != "search_types"]
|
|
73
|
+
+ ["thinking_level"],
|
|
74
|
+
"thinking_levels": ["minimal", "high"],
|
|
75
|
+
}
|
|
76
|
+
)
|
|
77
|
+
_V25 = _LITE.model_copy(
|
|
78
|
+
update={
|
|
79
|
+
"max_references": 3,
|
|
80
|
+
"retirement_date": date(2026, 10, 2),
|
|
81
|
+
"thinking_levels": [],
|
|
82
|
+
"options": [option for option in _LITE.options if option != "thinking_level"],
|
|
83
|
+
}
|
|
84
|
+
)
|
|
85
|
+
|
|
39
86
|
MODELS: list[ModelInfo] = [
|
|
40
|
-
|
|
87
|
+
ImageModelInfo(
|
|
41
88
|
id="gemini-3-pro-image",
|
|
89
|
+
image=_PRO,
|
|
42
90
|
display_name="Gemini 3 Pro Image (Nano Banana Pro)",
|
|
43
91
|
supports_vision=True,
|
|
44
92
|
capabilities=_CAPS,
|
|
@@ -51,8 +99,9 @@ MODELS: list[ModelInfo] = [
|
|
|
51
99
|
verified=_VERIFIED,
|
|
52
100
|
),
|
|
53
101
|
),
|
|
54
|
-
|
|
102
|
+
ImageModelInfo(
|
|
55
103
|
id="gemini-3.1-flash-image",
|
|
104
|
+
image=_FLASH,
|
|
56
105
|
display_name="Gemini 3.1 Flash Image (Nano Banana 2)",
|
|
57
106
|
supports_vision=True,
|
|
58
107
|
capabilities=_CAPS,
|
|
@@ -64,8 +113,9 @@ MODELS: list[ModelInfo] = [
|
|
|
64
113
|
verified=_VERIFIED,
|
|
65
114
|
),
|
|
66
115
|
),
|
|
67
|
-
|
|
116
|
+
ImageModelInfo(
|
|
68
117
|
id="gemini-3.1-flash-lite-image",
|
|
118
|
+
image=_LITE,
|
|
69
119
|
display_name="Gemini 3.1 Flash Lite Image (Nano Banana 2 Lite)",
|
|
70
120
|
supports_vision=True,
|
|
71
121
|
capabilities=_CAPS,
|
|
@@ -77,8 +127,10 @@ MODELS: list[ModelInfo] = [
|
|
|
77
127
|
verified=_VERIFIED,
|
|
78
128
|
),
|
|
79
129
|
),
|
|
80
|
-
|
|
130
|
+
ImageModelInfo(
|
|
81
131
|
id="gemini-2.5-flash-image",
|
|
132
|
+
image=_V25,
|
|
133
|
+
deprecated=True,
|
|
82
134
|
display_name="Gemini 2.5 Flash Image (Nano Banana)",
|
|
83
135
|
supports_vision=True,
|
|
84
136
|
capabilities=_CAPS,
|
|
@@ -84,14 +84,16 @@ def _restore_client_timeout(timeout: httpx.Timeout) -> Callable[[httpx.Request],
|
|
|
84
84
|
return restore
|
|
85
85
|
|
|
86
86
|
|
|
87
|
-
def build_genai_client(
|
|
87
|
+
def build_genai_client(
|
|
88
|
+
timeouts: HTTPTimeouts, *, provider: str, api_key: str, disable_retries: bool = False
|
|
89
|
+
) -> GenaiClient:
|
|
88
90
|
"""A client for the Gemini Developer API, authenticated by *api_key*.
|
|
89
91
|
|
|
90
92
|
``timeouts.timeout`` is the read/write/pool budget, ``connect_timeout``
|
|
91
93
|
bounds the TCP connect. *provider* names the caller in the ImportError
|
|
92
94
|
raised when google-genai is not installed.
|
|
93
95
|
"""
|
|
94
|
-
return _build_client(timeouts, provider, api_key=api_key)
|
|
96
|
+
return _build_client(timeouts, provider, api_key=api_key, disable_retries=disable_retries)
|
|
95
97
|
|
|
96
98
|
|
|
97
99
|
def build_vertex_genai_client(
|
|
@@ -118,7 +120,13 @@ def build_vertex_genai_client(
|
|
|
118
120
|
)
|
|
119
121
|
|
|
120
122
|
|
|
121
|
-
def _build_client(
|
|
123
|
+
def _build_client(
|
|
124
|
+
timeouts: HTTPTimeouts,
|
|
125
|
+
provider: str,
|
|
126
|
+
*,
|
|
127
|
+
disable_retries: bool = False,
|
|
128
|
+
**client_kwargs: Any,
|
|
129
|
+
) -> GenaiClient:
|
|
122
130
|
"""Build the pair behind both entry points; *client_kwargs* go to ``genai.Client``."""
|
|
123
131
|
# Both optional: google-genai brings httpx along, and the package root
|
|
124
132
|
# reaches this module (through the video vision providers), so neither
|
|
@@ -148,6 +156,14 @@ def _build_client(timeouts: HTTPTimeouts, provider: str, **client_kwargs: Any) -
|
|
|
148
156
|
# The sync client is built by the SDK regardless; same budget.
|
|
149
157
|
client_args={"timeout": timeout},
|
|
150
158
|
httpx_async_client=http,
|
|
159
|
+
# Interactions interprets attempts as retries, while the parent
|
|
160
|
+
# client changes zero to one. Use an impossible HTTP status to
|
|
161
|
+
# disable status retries, including successful paid POSTs.
|
|
162
|
+
**(
|
|
163
|
+
{"retry_options": {"attempts": 1, "http_status_codes": [0]}}
|
|
164
|
+
if disable_retries
|
|
165
|
+
else {}
|
|
166
|
+
),
|
|
151
167
|
),
|
|
152
168
|
)
|
|
153
169
|
return GenaiClient(client, http, genai.types)
|
|
@@ -2,6 +2,9 @@
|
|
|
2
2
|
|
|
3
3
|
from roomkit.providers.image.base import (
|
|
4
4
|
IMAGE_GEN_CAPABILITY,
|
|
5
|
+
ImageAttempt,
|
|
6
|
+
ImageGenerationError,
|
|
7
|
+
ImageProgressCallback,
|
|
5
8
|
ImageProvider,
|
|
6
9
|
ImageResult,
|
|
7
10
|
parse_data_uri,
|
|
@@ -10,9 +13,16 @@ from roomkit.providers.image.base import (
|
|
|
10
13
|
to_data_uri,
|
|
11
14
|
)
|
|
12
15
|
from roomkit.providers.image.mock import MockImageProvider
|
|
16
|
+
from roomkit.providers.image.options import ImageCapabilities, ImageModelInfo, ImageOptions
|
|
13
17
|
|
|
14
18
|
__all__ = [
|
|
15
19
|
"IMAGE_GEN_CAPABILITY",
|
|
20
|
+
"ImageAttempt",
|
|
21
|
+
"ImageCapabilities",
|
|
22
|
+
"ImageGenerationError",
|
|
23
|
+
"ImageModelInfo",
|
|
24
|
+
"ImageOptions",
|
|
25
|
+
"ImageProgressCallback",
|
|
16
26
|
"ImageProvider",
|
|
17
27
|
"ImageResult",
|
|
18
28
|
"MockImageProvider",
|
|
@@ -16,11 +16,14 @@ from __future__ import annotations
|
|
|
16
16
|
|
|
17
17
|
import re
|
|
18
18
|
from abc import ABC, abstractmethod
|
|
19
|
-
from
|
|
19
|
+
from collections.abc import Awaitable, Callable
|
|
20
|
+
from typing import Any, Literal
|
|
21
|
+
from uuid import uuid4
|
|
20
22
|
|
|
21
23
|
from pydantic import BaseModel, Field, field_validator
|
|
22
24
|
|
|
23
|
-
from roomkit.providers.ai.base import AIImagePart, ModelInfo
|
|
25
|
+
from roomkit.providers.ai.base import AIImagePart, ModelInfo, ProviderError
|
|
26
|
+
from roomkit.providers.image.options import ImageOptions, image_model_entry
|
|
24
27
|
from roomkit.providers.utils import parse_data_uri as parse_data_uri
|
|
25
28
|
from roomkit.providers.utils import to_data_uri as to_data_uri
|
|
26
29
|
|
|
@@ -108,6 +111,13 @@ class ImageResult(BaseModel):
|
|
|
108
111
|
mime_type: str
|
|
109
112
|
revised_prompt: str | None = None
|
|
110
113
|
usage: dict[str, Any] = Field(default_factory=dict)
|
|
114
|
+
attempt_id: str | None = None
|
|
115
|
+
provider_request_id: str | None = None
|
|
116
|
+
raw_usage: dict[str, Any] = Field(default_factory=dict)
|
|
117
|
+
effective_options: dict[str, Any] = Field(default_factory=dict)
|
|
118
|
+
metadata: dict[str, Any] = Field(default_factory=dict)
|
|
119
|
+
width: int | None = None
|
|
120
|
+
height: int | None = None
|
|
111
121
|
|
|
112
122
|
@field_validator("data")
|
|
113
123
|
@classmethod
|
|
@@ -136,6 +146,59 @@ class ImageResult(BaseModel):
|
|
|
136
146
|
return AIImagePart(url=self.data, mime_type=self.mime_type)
|
|
137
147
|
|
|
138
148
|
|
|
149
|
+
class ImageAttempt(BaseModel):
|
|
150
|
+
"""One vendor call, including outcomes that produced no usable image.
|
|
151
|
+
|
|
152
|
+
``usage`` applies to the whole call. Result-level usage is the compatibility
|
|
153
|
+
projection of this same measurement; a consumer must not sum both.
|
|
154
|
+
"""
|
|
155
|
+
|
|
156
|
+
id: str = Field(default_factory=lambda: str(uuid4()))
|
|
157
|
+
index: int = 0
|
|
158
|
+
status: Literal["started", "preview", "succeeded", "failed", "unknown"] = "started"
|
|
159
|
+
provider_request_id: str | None = None
|
|
160
|
+
usage: dict[str, Any] = Field(default_factory=dict)
|
|
161
|
+
raw_usage: dict[str, Any] = Field(default_factory=dict)
|
|
162
|
+
effective_options: dict[str, Any] = Field(default_factory=dict)
|
|
163
|
+
metadata: dict[str, Any] = Field(default_factory=dict)
|
|
164
|
+
results: list[ImageResult] = Field(default_factory=list)
|
|
165
|
+
error: str | None = None
|
|
166
|
+
status_code: int | None = None
|
|
167
|
+
|
|
168
|
+
|
|
169
|
+
ImageProgressCallback = Callable[[ImageAttempt], Awaitable[None]]
|
|
170
|
+
|
|
171
|
+
|
|
172
|
+
class ImageGenerationError(ProviderError):
|
|
173
|
+
"""A failed generation with every available outcome; never auto-retry it."""
|
|
174
|
+
|
|
175
|
+
def __init__(self, message: str, *, provider: str, attempts: list[ImageAttempt]) -> None:
|
|
176
|
+
super().__init__(
|
|
177
|
+
message,
|
|
178
|
+
provider=provider,
|
|
179
|
+
retryable=False,
|
|
180
|
+
status_code=next(
|
|
181
|
+
(attempt.status_code for attempt in attempts if attempt.status_code), None
|
|
182
|
+
),
|
|
183
|
+
)
|
|
184
|
+
self.attempts = attempts
|
|
185
|
+
self.results = [result for attempt in attempts for result in attempt.results]
|
|
186
|
+
|
|
187
|
+
|
|
188
|
+
async def notify_image_progress(
|
|
189
|
+
callback: ImageProgressCallback | None, attempt: ImageAttempt, *, provider: str
|
|
190
|
+
) -> None:
|
|
191
|
+
"""Callback failure preserves the billed outcome and never repeats a request."""
|
|
192
|
+
if callback is None:
|
|
193
|
+
return
|
|
194
|
+
try:
|
|
195
|
+
await callback(attempt.model_copy(deep=True))
|
|
196
|
+
except Exception as exc:
|
|
197
|
+
raise ImageGenerationError(
|
|
198
|
+
f"Image progress callback failed: {exc}", provider=provider, attempts=[attempt]
|
|
199
|
+
) from exc
|
|
200
|
+
|
|
201
|
+
|
|
139
202
|
class ImageProvider(ABC):
|
|
140
203
|
"""Generates images from a prompt, decoupled from the conversation (RFC §25)."""
|
|
141
204
|
|
|
@@ -174,11 +237,30 @@ class ImageProvider(ABC):
|
|
|
174
237
|
|
|
175
238
|
def catalog_entry(self) -> ModelInfo | None:
|
|
176
239
|
"""The offline :class:`ModelInfo` for the active model, if the catalog has it."""
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
240
|
+
return image_model_entry(type(self).available_models(), self.model_name)
|
|
241
|
+
|
|
242
|
+
async def generate_with_options(
|
|
243
|
+
self,
|
|
244
|
+
prompt: str,
|
|
245
|
+
*,
|
|
246
|
+
size: str | None = None,
|
|
247
|
+
n: int = 1,
|
|
248
|
+
reference_images: list[AIImagePart] | None = None,
|
|
249
|
+
options: ImageOptions | None = None,
|
|
250
|
+
mask: AIImagePart | None = None,
|
|
251
|
+
on_progress: ImageProgressCallback | None = None,
|
|
252
|
+
) -> list[ImageResult]:
|
|
253
|
+
"""Generate with endpoint-specific controls and observable outcomes.
|
|
254
|
+
|
|
255
|
+
Providers override this additive entry point to support advanced controls.
|
|
256
|
+
The default preserves third-party implementations of ``generate`` and
|
|
257
|
+
rejects unsupported controls rather than silently discarding them.
|
|
258
|
+
"""
|
|
259
|
+
if mask or (options and options.model_dump(exclude_none=True)):
|
|
260
|
+
raise ValueError(f"{self.name} does not support advanced image options")
|
|
261
|
+
if on_progress:
|
|
262
|
+
raise ValueError(f"{self.name} does not support image progress callbacks")
|
|
263
|
+
return await self.generate(prompt, size=size, n=n, reference_images=reference_images)
|
|
182
264
|
|
|
183
265
|
@abstractmethod
|
|
184
266
|
async def generate(
|