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.
Files changed (1273) hide show
  1. {roomkit-0.75.2 → roomkit-0.76.0}/PKG-INFO +5 -4
  2. {roomkit-0.75.2 → roomkit-0.76.0}/pyproject.toml +1 -1
  3. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/__init__.py +17 -1
  4. roomkit-0.76.0/src/roomkit/_version.py +1 -0
  5. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/providers/gemini/image.py +147 -43
  6. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/providers/gemini/image_models.py +56 -4
  7. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/providers/gemini/sdk.py +19 -3
  8. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/providers/image/__init__.py +10 -0
  9. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/providers/image/base.py +89 -7
  10. roomkit-0.76.0/src/roomkit/providers/image/options.py +164 -0
  11. roomkit-0.76.0/src/roomkit/providers/image/usage.py +59 -0
  12. roomkit-0.76.0/src/roomkit/providers/openai/image.py +282 -0
  13. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/providers/openai/image_models.py +50 -7
  14. roomkit-0.76.0/src/roomkit/providers/openai/image_stream.py +89 -0
  15. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/providers/openai/live_events.py +33 -49
  16. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/voice/realtime/fastrtc_transport.py +6 -3
  17. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/webrtc/stream.py +11 -13
  18. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/webrtc/webrtc_connection_mixin.py +35 -10
  19. {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_openai_live.py +25 -3
  20. {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_providers/test_gemini_image.py +8 -6
  21. roomkit-0.76.0/tests/test_providers/test_image_advanced.py +254 -0
  22. roomkit-0.76.0/tests/test_providers/test_image_sdk_contracts.py +166 -0
  23. roomkit-0.76.0/tests/test_providers/test_image_stream.py +60 -0
  24. {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_providers/test_openai_image.py +6 -4
  25. roomkit-0.76.0/tests/test_webrtc_rtc_configuration.py +166 -0
  26. roomkit-0.75.2/src/roomkit/_version.py +0 -1
  27. roomkit-0.75.2/src/roomkit/providers/openai/image.py +0 -217
  28. {roomkit-0.75.2 → roomkit-0.76.0}/.gitignore +0 -0
  29. {roomkit-0.75.2 → roomkit-0.76.0}/AGENTS.md +0 -0
  30. {roomkit-0.75.2 → roomkit-0.76.0}/LICENSE +0 -0
  31. {roomkit-0.75.2 → roomkit-0.76.0}/README.md +0 -0
  32. {roomkit-0.75.2 → roomkit-0.76.0}/benchmarks/__init__.py +0 -0
  33. {roomkit-0.75.2 → roomkit-0.76.0}/benchmarks/chat/QUALITY.md +0 -0
  34. {roomkit-0.75.2 → roomkit-0.76.0}/benchmarks/chat/README.md +0 -0
  35. {roomkit-0.75.2 → roomkit-0.76.0}/benchmarks/chat/__init__.py +0 -0
  36. {roomkit-0.75.2 → roomkit-0.76.0}/benchmarks/chat/__main__.py +0 -0
  37. {roomkit-0.75.2 → roomkit-0.76.0}/benchmarks/chat/fixtures/quote-policy/SKILL.md +0 -0
  38. {roomkit-0.75.2 → roomkit-0.76.0}/benchmarks/chat/fixtures/quote-policy/references/rules.md +0 -0
  39. {roomkit-0.75.2 → roomkit-0.76.0}/benchmarks/chat/fixtures/quote-policy/scripts/total.py +0 -0
  40. {roomkit-0.75.2 → roomkit-0.76.0}/benchmarks/chat/harness.py +0 -0
  41. {roomkit-0.75.2 → roomkit-0.76.0}/benchmarks/chat/measurement.py +0 -0
  42. {roomkit-0.75.2 → roomkit-0.76.0}/benchmarks/chat/quality.py +0 -0
  43. {roomkit-0.75.2 → roomkit-0.76.0}/benchmarks/chat/quality_oracles.py +0 -0
  44. {roomkit-0.75.2 → roomkit-0.76.0}/benchmarks/chat/quality_report.py +0 -0
  45. {roomkit-0.75.2 → roomkit-0.76.0}/benchmarks/chat/report.py +0 -0
  46. {roomkit-0.75.2 → roomkit-0.76.0}/benchmarks/chat/scenarios.py +0 -0
  47. {roomkit-0.75.2 → roomkit-0.76.0}/docs/README.md +0 -0
  48. {roomkit-0.75.2 → roomkit-0.76.0}/docs/c7/acp.md +0 -0
  49. {roomkit-0.75.2 → roomkit-0.76.0}/docs/c7/ai-channels.md +0 -0
  50. {roomkit-0.75.2 → roomkit-0.76.0}/docs/c7/api-reference.md +0 -0
  51. {roomkit-0.75.2 → roomkit-0.76.0}/docs/c7/architecture.md +0 -0
  52. {roomkit-0.75.2 → roomkit-0.76.0}/docs/c7/conference.md +0 -0
  53. {roomkit-0.75.2 → roomkit-0.76.0}/docs/c7/hooks.md +0 -0
  54. {roomkit-0.75.2 → roomkit-0.76.0}/docs/c7/identity-and-realtime.md +0 -0
  55. {roomkit-0.75.2 → roomkit-0.76.0}/docs/c7/image-generation.md +0 -0
  56. {roomkit-0.75.2 → roomkit-0.76.0}/docs/c7/installation.md +0 -0
  57. {roomkit-0.75.2 → roomkit-0.76.0}/docs/c7/ollama-provider.md +0 -0
  58. {roomkit-0.75.2 → roomkit-0.76.0}/docs/c7/orchestration.md +0 -0
  59. {roomkit-0.75.2 → roomkit-0.76.0}/docs/c7/overview.md +0 -0
  60. {roomkit-0.75.2 → roomkit-0.76.0}/docs/c7/quickstart.md +0 -0
  61. {roomkit-0.75.2 → roomkit-0.76.0}/docs/c7/realtime-voice.md +0 -0
  62. {roomkit-0.75.2 → roomkit-0.76.0}/docs/c7/resilience.md +0 -0
  63. {roomkit-0.75.2 → roomkit-0.76.0}/docs/c7/rooms-and-channels.md +0 -0
  64. {roomkit-0.75.2 → roomkit-0.76.0}/docs/c7/storage.md +0 -0
  65. {roomkit-0.75.2 → roomkit-0.76.0}/docs/c7/testing.md +0 -0
  66. {roomkit-0.75.2 → roomkit-0.76.0}/docs/c7/transport-providers.md +0 -0
  67. {roomkit-0.75.2 → roomkit-0.76.0}/docs/c7/video.md +0 -0
  68. {roomkit-0.75.2 → roomkit-0.76.0}/docs/c7/voice-channels.md +0 -0
  69. {roomkit-0.75.2 → roomkit-0.76.0}/docs/c7/voice-pipeline.md +0 -0
  70. {roomkit-0.75.2 → roomkit-0.76.0}/docs/diagrams/architecture.svg +0 -0
  71. {roomkit-0.75.2 → roomkit-0.76.0}/docs/diagrams/avatar-pipeline.svg +0 -0
  72. {roomkit-0.75.2 → roomkit-0.76.0}/docs/diagrams/message-flow.svg +0 -0
  73. {roomkit-0.75.2 → roomkit-0.76.0}/docs/diagrams/orchestration.svg +0 -0
  74. {roomkit-0.75.2 → roomkit-0.76.0}/docs/diagrams/room-lifecycle.svg +0 -0
  75. {roomkit-0.75.2 → roomkit-0.76.0}/docs/diagrams/video-pipeline.svg +0 -0
  76. {roomkit-0.75.2 → roomkit-0.76.0}/docs/diagrams/voice-orchestration.svg +0 -0
  77. {roomkit-0.75.2 → roomkit-0.76.0}/docs/diagrams/voice-pipeline.svg +0 -0
  78. {roomkit-0.75.2 → roomkit-0.76.0}/llms-full.txt +0 -0
  79. {roomkit-0.75.2 → roomkit-0.76.0}/llms.txt +0 -0
  80. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/ai_docs.py +0 -0
  81. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/channels/__init__.py +0 -0
  82. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/channels/_acp_client.py +0 -0
  83. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/channels/_acp_context.py +0 -0
  84. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/channels/_acp_events.py +0 -0
  85. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/channels/_acp_usage.py +0 -0
  86. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/channels/_ai_coalescers.py +0 -0
  87. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/channels/_ai_context.py +0 -0
  88. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/channels/_ai_events.py +0 -0
  89. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/channels/_ai_generation.py +0 -0
  90. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/channels/_ai_loop_rules.py +0 -0
  91. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/channels/_ai_policy.py +0 -0
  92. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/channels/_ai_resilience.py +0 -0
  93. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/channels/_ai_steering.py +0 -0
  94. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/channels/_ai_stream_external_tools.py +0 -0
  95. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/channels/_ai_stream_round.py +0 -0
  96. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/channels/_ai_streaming.py +0 -0
  97. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/channels/_ai_tools.py +0 -0
  98. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/channels/_cli_markdown.py +0 -0
  99. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/channels/_conference_access.py +0 -0
  100. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/channels/_conference_activity.py +0 -0
  101. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/channels/_conference_attachment.py +0 -0
  102. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/channels/_conference_backlog.py +0 -0
  103. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/channels/_conference_identity.py +0 -0
  104. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/channels/_conference_lane.py +0 -0
  105. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/channels/_conference_lanes.py +0 -0
  106. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/channels/_conference_metadata.py +0 -0
  107. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/channels/_conference_mixer.py +0 -0
  108. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/channels/_conference_operations.py +0 -0
  109. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/channels/_conference_plug.py +0 -0
  110. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/channels/_conference_realtime.py +0 -0
  111. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/channels/_conference_recording.py +0 -0
  112. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/channels/_conference_recording_events.py +0 -0
  113. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/channels/_conference_recording_writer.py +0 -0
  114. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/channels/_conference_room_state.py +0 -0
  115. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/channels/_conference_roster.py +0 -0
  116. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/channels/_conference_session.py +0 -0
  117. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/channels/_conference_shutdown.py +0 -0
  118. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/channels/_conference_subscription.py +0 -0
  119. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/channels/_conference_voice.py +0 -0
  120. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/channels/_dangling_recovery.py +0 -0
  121. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/channels/_realtime_audio.py +0 -0
  122. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/channels/_realtime_context.py +0 -0
  123. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/channels/_realtime_delegation.py +0 -0
  124. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/channels/_realtime_response.py +0 -0
  125. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/channels/_realtime_skills.py +0 -0
  126. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/channels/_realtime_speech.py +0 -0
  127. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/channels/_realtime_tool_recovery.py +0 -0
  128. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/channels/_realtime_tool_search.py +0 -0
  129. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/channels/_realtime_tools.py +0 -0
  130. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/channels/_realtime_transcription.py +0 -0
  131. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/channels/_sandbox_handlers.py +0 -0
  132. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/channels/_skill_activation.py +0 -0
  133. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/channels/_skill_constants.py +0 -0
  134. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/channels/_skill_handlers.py +0 -0
  135. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/channels/_speaker.py +0 -0
  136. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/channels/_task_planner.py +0 -0
  137. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/channels/_tool_eviction.py +0 -0
  138. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/channels/_tool_search.py +0 -0
  139. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/channels/_tool_search_constants.py +0 -0
  140. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/channels/_tool_usage.py +0 -0
  141. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/channels/_turn_config.py +0 -0
  142. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/channels/_video_hooks.py +0 -0
  143. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/channels/_video_resources.py +0 -0
  144. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/channels/_voice_hooks.py +0 -0
  145. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/channels/_voice_pipeline.py +0 -0
  146. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/channels/_voice_stt.py +0 -0
  147. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/channels/_voice_tts.py +0 -0
  148. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/channels/_voice_turn.py +0 -0
  149. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/channels/acp.py +0 -0
  150. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/channels/acp_transport.py +0 -0
  151. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/channels/agent.py +0 -0
  152. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/channels/ai.py +0 -0
  153. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/channels/av.py +0 -0
  154. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/channels/base.py +0 -0
  155. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/channels/cli.py +0 -0
  156. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/channels/conference.py +0 -0
  157. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/channels/realtime_av.py +0 -0
  158. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/channels/realtime_voice.py +0 -0
  159. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/channels/transport.py +0 -0
  160. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/channels/video.py +0 -0
  161. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/channels/voice.py +0 -0
  162. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/channels/websocket.py +0 -0
  163. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/conference/__init__.py +0 -0
  164. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/conference/_livekit_mapping.py +0 -0
  165. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/conference/_livekit_media.py +0 -0
  166. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/conference/_livekit_session.py +0 -0
  167. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/conference/_livekit_voice.py +0 -0
  168. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/conference/_mock_faults.py +0 -0
  169. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/conference/_mock_media.py +0 -0
  170. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/conference/base.py +0 -0
  171. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/conference/livekit.py +0 -0
  172. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/conference/mock.py +0 -0
  173. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/conference/models.py +0 -0
  174. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/console/__init__.py +0 -0
  175. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/console/_activity.py +0 -0
  176. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/console/_brand.py +0 -0
  177. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/console/_chat.py +0 -0
  178. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/console/_display.py +0 -0
  179. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/console/_hooks.py +0 -0
  180. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/console/_shell.py +0 -0
  181. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/console/_state.py +0 -0
  182. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/console/_terminal.py +0 -0
  183. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/console/_tool_preview.py +0 -0
  184. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/core/__init__.py +0 -0
  185. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/core/_delivery_targets.py +0 -0
  186. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/core/_participant_channels.py +0 -0
  187. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/core/_voice_delivery.py +0 -0
  188. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/core/callbacks.py +0 -0
  189. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/core/circuit_breaker.py +0 -0
  190. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/core/delivery.py +0 -0
  191. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/core/event_router.py +0 -0
  192. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/core/exceptions.py +0 -0
  193. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/core/framework.py +0 -0
  194. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/core/hooks.py +0 -0
  195. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/core/inbound_router.py +0 -0
  196. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/core/lanes.py +0 -0
  197. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/core/locks.py +0 -0
  198. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/core/mixins/__init__.py +0 -0
  199. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/core/mixins/_child_execution.py +0 -0
  200. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/core/mixins/channel_ops.py +0 -0
  201. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/core/mixins/delegation.py +0 -0
  202. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/core/mixins/deliver.py +0 -0
  203. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/core/mixins/event_ops.py +0 -0
  204. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/core/mixins/greeting.py +0 -0
  205. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/core/mixins/helpers.py +0 -0
  206. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/core/mixins/hooks_api.py +0 -0
  207. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/core/mixins/inbound.py +0 -0
  208. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/core/mixins/inbound_identity.py +0 -0
  209. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/core/mixins/inbound_locked.py +0 -0
  210. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/core/mixins/inbound_streaming.py +0 -0
  211. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/core/mixins/lane_execution.py +0 -0
  212. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/core/mixins/membership.py +0 -0
  213. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/core/mixins/realtime_ops.py +0 -0
  214. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/core/mixins/recording.py +0 -0
  215. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/core/mixins/regenerate.py +0 -0
  216. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/core/mixins/room_lifecycle.py +0 -0
  217. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/core/mixins/source_ops.py +0 -0
  218. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/core/mixins/voice_ops.py +0 -0
  219. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/core/rate_limiter.py +0 -0
  220. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/core/retry.py +0 -0
  221. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/core/router.py +0 -0
  222. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/core/task_utils.py +0 -0
  223. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/core/transcoder.py +0 -0
  224. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/core/visibility.py +0 -0
  225. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/delivery/__init__.py +0 -0
  226. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/delivery/_redis_scripts.py +0 -0
  227. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/delivery/base.py +0 -0
  228. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/delivery/memory.py +0 -0
  229. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/delivery/redis.py +0 -0
  230. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/delivery/serialization.py +0 -0
  231. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/delivery/worker.py +0 -0
  232. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/identity/__init__.py +0 -0
  233. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/identity/base.py +0 -0
  234. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/identity/mock.py +0 -0
  235. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/knowledge/__init__.py +0 -0
  236. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/knowledge/base.py +0 -0
  237. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/knowledge/mock.py +0 -0
  238. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/knowledge/postgres.py +0 -0
  239. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/memory/__init__.py +0 -0
  240. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/memory/_wrapper.py +0 -0
  241. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/memory/base.py +0 -0
  242. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/memory/budget_aware.py +0 -0
  243. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/memory/compacting.py +0 -0
  244. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/memory/mock.py +0 -0
  245. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/memory/retrieval.py +0 -0
  246. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/memory/sliding_window.py +0 -0
  247. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/memory/summarizing.py +0 -0
  248. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/memory/token_estimator.py +0 -0
  249. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/models/__init__.py +0 -0
  250. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/models/channel.py +0 -0
  251. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/models/context.py +0 -0
  252. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/models/delivery.py +0 -0
  253. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/models/enums.py +0 -0
  254. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/models/event.py +0 -0
  255. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/models/framework_event.py +0 -0
  256. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/models/hook.py +0 -0
  257. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/models/identity.py +0 -0
  258. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/models/participant.py +0 -0
  259. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/models/pending_input.py +0 -0
  260. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/models/plan_event.py +0 -0
  261. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/models/response_metadata.py +0 -0
  262. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/models/room.py +0 -0
  263. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/models/session_event.py +0 -0
  264. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/models/steering.py +0 -0
  265. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/models/store_filter.py +0 -0
  266. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/models/streaming.py +0 -0
  267. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/models/task.py +0 -0
  268. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/models/thinking_event.py +0 -0
  269. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/models/tool_call.py +0 -0
  270. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/models/trace.py +0 -0
  271. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/models/vision_event.py +0 -0
  272. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/models/voice_delivery.py +0 -0
  273. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/orchestration/__init__.py +0 -0
  274. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/orchestration/base.py +0 -0
  275. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/orchestration/handoff.py +0 -0
  276. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/orchestration/pipeline.py +0 -0
  277. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/orchestration/result.py +0 -0
  278. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/orchestration/router.py +0 -0
  279. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/orchestration/session_audit.py +0 -0
  280. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/orchestration/state.py +0 -0
  281. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/orchestration/status_bus.py +0 -0
  282. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/orchestration/status_redis.py +0 -0
  283. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/orchestration/strategies/__init__.py +0 -0
  284. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/orchestration/strategies/loop.py +0 -0
  285. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/orchestration/strategies/pipeline.py +0 -0
  286. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/orchestration/strategies/supervisor/__init__.py +0 -0
  287. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/orchestration/strategies/supervisor/_common.py +0 -0
  288. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/orchestration/strategies/supervisor/_inject_per_worker.py +0 -0
  289. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/orchestration/strategies/supervisor/_inject_strategy.py +0 -0
  290. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/orchestration/strategies/supervisor/_install_auto.py +0 -0
  291. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/orchestration/strategies/supervisor/core.py +0 -0
  292. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/orchestration/strategies/supervisor/delegate.py +0 -0
  293. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/orchestration/strategies/supervisor/execution.py +0 -0
  294. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/orchestration/strategies/supervisor/prompts.py +0 -0
  295. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/orchestration/strategies/supervisor/results.py +0 -0
  296. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/orchestration/strategies/supervisor/supervised.py +0 -0
  297. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/orchestration/strategies/swarm.py +0 -0
  298. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/orchestration/tool_audit.py +0 -0
  299. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/providers/__init__.py +0 -0
  300. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/providers/ai/__init__.py +0 -0
  301. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/providers/ai/base.py +0 -0
  302. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/providers/ai/image_parts.py +0 -0
  303. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/providers/ai/mock.py +0 -0
  304. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/providers/ai/openai_dialect.py +0 -0
  305. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/providers/anam/__init__.py +0 -0
  306. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/providers/anam/_convert.py +0 -0
  307. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/providers/anam/avatar.py +0 -0
  308. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/providers/anam/config.py +0 -0
  309. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/providers/anam/realtime.py +0 -0
  310. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/providers/anthropic/__init__.py +0 -0
  311. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/providers/anthropic/ai.py +0 -0
  312. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/providers/anthropic/config.py +0 -0
  313. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/providers/anthropic/models.py +0 -0
  314. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/providers/anthropic/request.py +0 -0
  315. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/providers/azure/__init__.py +0 -0
  316. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/providers/azure/ai.py +0 -0
  317. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/providers/azure/config.py +0 -0
  318. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/providers/azure/image.py +0 -0
  319. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/providers/buzz/__init__.py +0 -0
  320. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/providers/buzz/agent.py +0 -0
  321. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/providers/buzz/base.py +0 -0
  322. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/providers/buzz/config.py +0 -0
  323. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/providers/buzz/mock.py +0 -0
  324. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/providers/buzz/relay.py +0 -0
  325. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/providers/cerebras/__init__.py +0 -0
  326. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/providers/cerebras/ai.py +0 -0
  327. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/providers/cerebras/config.py +0 -0
  328. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/providers/cerebras/models.py +0 -0
  329. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/providers/deepgram/__init__.py +0 -0
  330. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/providers/deepgram/config.py +0 -0
  331. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/providers/deepgram/realtime.py +0 -0
  332. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/providers/deepgram/settings.py +0 -0
  333. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/providers/deepgram/voices.py +0 -0
  334. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/providers/deepseek/__init__.py +0 -0
  335. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/providers/deepseek/ai.py +0 -0
  336. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/providers/deepseek/config.py +0 -0
  337. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/providers/deepseek/models.py +0 -0
  338. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/providers/discord/__init__.py +0 -0
  339. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/providers/discord/base.py +0 -0
  340. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/providers/discord/bot.py +0 -0
  341. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/providers/discord/config.py +0 -0
  342. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/providers/discord/mock.py +0 -0
  343. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/providers/elasticemail/__init__.py +0 -0
  344. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/providers/elasticemail/config.py +0 -0
  345. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/providers/elasticemail/email.py +0 -0
  346. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/providers/elevenlabs/__init__.py +0 -0
  347. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/providers/elevenlabs/config.py +0 -0
  348. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/providers/elevenlabs/realtime.py +0 -0
  349. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/providers/elevenlabs/voices.py +0 -0
  350. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/providers/email/__init__.py +0 -0
  351. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/providers/email/base.py +0 -0
  352. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/providers/email/mock.py +0 -0
  353. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/providers/gemini/__init__.py +0 -0
  354. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/providers/gemini/ai.py +0 -0
  355. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/providers/gemini/config.py +0 -0
  356. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/providers/gemini/errors.py +0 -0
  357. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/providers/gemini/models.py +0 -0
  358. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/providers/gemini/realtime.py +0 -0
  359. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/providers/gemini/realtime_models.py +0 -0
  360. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/providers/gemini/request.py +0 -0
  361. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/providers/gemini/schema.py +0 -0
  362. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/providers/gemini/vertex.py +0 -0
  363. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/providers/gemini/voices.py +0 -0
  364. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/providers/http/__init__.py +0 -0
  365. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/providers/http/base.py +0 -0
  366. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/providers/http/config.py +0 -0
  367. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/providers/http/mock.py +0 -0
  368. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/providers/http/provider.py +0 -0
  369. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/providers/http/webhook.py +0 -0
  370. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/providers/http_errors.py +0 -0
  371. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/providers/image/mock.py +0 -0
  372. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/providers/litellm/__init__.py +0 -0
  373. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/providers/litellm/ai.py +0 -0
  374. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/providers/litellm/config.py +0 -0
  375. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/providers/messenger/__init__.py +0 -0
  376. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/providers/messenger/base.py +0 -0
  377. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/providers/messenger/config.py +0 -0
  378. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/providers/messenger/facebook.py +0 -0
  379. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/providers/messenger/mock.py +0 -0
  380. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/providers/messenger/webhook.py +0 -0
  381. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/providers/mistral/__init__.py +0 -0
  382. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/providers/mistral/ai.py +0 -0
  383. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/providers/mistral/config.py +0 -0
  384. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/providers/mistral/models.py +0 -0
  385. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/providers/ollama/__init__.py +0 -0
  386. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/providers/ollama/ai.py +0 -0
  387. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/providers/ollama/config.py +0 -0
  388. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/providers/ollama/models.py +0 -0
  389. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/providers/openai/__init__.py +0 -0
  390. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/providers/openai/ai.py +0 -0
  391. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/providers/openai/config.py +0 -0
  392. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/providers/openai/live.py +0 -0
  393. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/providers/openai/live_client.py +0 -0
  394. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/providers/openai/live_config.py +0 -0
  395. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/providers/openai/live_handlers.py +0 -0
  396. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/providers/openai/live_hosted.py +0 -0
  397. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/providers/openai/live_models.py +0 -0
  398. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/providers/openai/models.py +0 -0
  399. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/providers/openai/realtime.py +0 -0
  400. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/providers/openai/realtime_base.py +0 -0
  401. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/providers/openai/realtime_events.py +0 -0
  402. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/providers/openai/realtime_models.py +0 -0
  403. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/providers/openai/voices.py +0 -0
  404. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/providers/openrouter/__init__.py +0 -0
  405. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/providers/openrouter/ai.py +0 -0
  406. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/providers/openrouter/config.py +0 -0
  407. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/providers/openrouter/image.py +0 -0
  408. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/providers/openrouter/image_models.py +0 -0
  409. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/providers/openrouter/models.py +0 -0
  410. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/providers/personaplex/__init__.py +0 -0
  411. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/providers/personaplex/config.py +0 -0
  412. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/providers/personaplex/realtime.py +0 -0
  413. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/providers/personaplex/voices.py +0 -0
  414. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/providers/polargrid/__init__.py +0 -0
  415. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/providers/polargrid/ai.py +0 -0
  416. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/providers/polargrid/config.py +0 -0
  417. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/providers/polargrid/models.py +0 -0
  418. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/providers/qwen/__init__.py +0 -0
  419. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/providers/qwen/ai.py +0 -0
  420. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/providers/qwen/config.py +0 -0
  421. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/providers/qwen/models.py +0 -0
  422. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/providers/rcs/__init__.py +0 -0
  423. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/providers/rcs/base.py +0 -0
  424. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/providers/rcs/mock.py +0 -0
  425. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/providers/sendgrid/__init__.py +0 -0
  426. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/providers/sendgrid/config.py +0 -0
  427. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/providers/sendgrid/email.py +0 -0
  428. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/providers/sinch/__init__.py +0 -0
  429. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/providers/sinch/config.py +0 -0
  430. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/providers/sinch/sms.py +0 -0
  431. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/providers/sms/__init__.py +0 -0
  432. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/providers/sms/base.py +0 -0
  433. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/providers/sms/meta.py +0 -0
  434. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/providers/sms/mock.py +0 -0
  435. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/providers/sms/phone.py +0 -0
  436. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/providers/teams/__init__.py +0 -0
  437. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/providers/teams/base.py +0 -0
  438. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/providers/teams/bot_framework.py +0 -0
  439. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/providers/teams/config.py +0 -0
  440. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/providers/teams/conversation_store.py +0 -0
  441. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/providers/teams/mock.py +0 -0
  442. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/providers/teams/models.py +0 -0
  443. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/providers/teams/webhook.py +0 -0
  444. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/providers/telegram/__init__.py +0 -0
  445. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/providers/telegram/api.py +0 -0
  446. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/providers/telegram/base.py +0 -0
  447. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/providers/telegram/bot.py +0 -0
  448. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/providers/telegram/config.py +0 -0
  449. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/providers/telegram/entities.py +0 -0
  450. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/providers/telegram/mock.py +0 -0
  451. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/providers/telegram/update.py +0 -0
  452. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/providers/telegram/webhook.py +0 -0
  453. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/providers/telnyx/__init__.py +0 -0
  454. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/providers/telnyx/_signature.py +0 -0
  455. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/providers/telnyx/config.py +0 -0
  456. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/providers/telnyx/rcs.py +0 -0
  457. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/providers/telnyx/sms.py +0 -0
  458. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/providers/twilio/__init__.py +0 -0
  459. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/providers/twilio/_signature.py +0 -0
  460. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/providers/twilio/config.py +0 -0
  461. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/providers/twilio/rcs.py +0 -0
  462. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/providers/twilio/sms.py +0 -0
  463. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/providers/twilio/webhook.py +0 -0
  464. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/providers/url_safety.py +0 -0
  465. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/providers/utils.py +0 -0
  466. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/providers/vllm/__init__.py +0 -0
  467. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/providers/vllm/config.py +0 -0
  468. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/providers/voicemeup/__init__.py +0 -0
  469. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/providers/voicemeup/config.py +0 -0
  470. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/providers/voicemeup/sms.py +0 -0
  471. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/providers/whatsapp/__init__.py +0 -0
  472. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/providers/whatsapp/base.py +0 -0
  473. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/providers/whatsapp/mock.py +0 -0
  474. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/providers/whatsapp/personal.py +0 -0
  475. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/providers/xai/__init__.py +0 -0
  476. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/providers/xai/ai.py +0 -0
  477. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/providers/xai/config.py +0 -0
  478. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/providers/xai/image.py +0 -0
  479. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/providers/xai/image_models.py +0 -0
  480. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/providers/xai/models.py +0 -0
  481. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/providers/xai/realtime.py +0 -0
  482. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/providers/xai/realtime_models.py +0 -0
  483. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/providers/xai/voices.py +0 -0
  484. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/py.typed +0 -0
  485. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/realtime/__init__.py +0 -0
  486. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/realtime/_subscription.py +0 -0
  487. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/realtime/base.py +0 -0
  488. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/realtime/memory.py +0 -0
  489. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/realtime/redis.py +0 -0
  490. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/recorder/__init__.py +0 -0
  491. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/recorder/_pyav_mux.py +0 -0
  492. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/recorder/_room_recorder_manager.py +0 -0
  493. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/recorder/base.py +0 -0
  494. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/recorder/mock.py +0 -0
  495. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/recorder/pyav.py +0 -0
  496. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/sandbox/__init__.py +0 -0
  497. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/sandbox/executor.py +0 -0
  498. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/sandbox/models.py +0 -0
  499. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/sandbox/tools.py +0 -0
  500. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/scoring/__init__.py +0 -0
  501. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/scoring/base.py +0 -0
  502. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/scoring/hook.py +0 -0
  503. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/scoring/mock.py +0 -0
  504. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/scoring/tracker.py +0 -0
  505. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/skills/__init__.py +0 -0
  506. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/skills/errors.py +0 -0
  507. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/skills/executor.py +0 -0
  508. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/skills/models.py +0 -0
  509. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/skills/parser.py +0 -0
  510. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/skills/paths.py +0 -0
  511. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/skills/registry.py +0 -0
  512. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/sources/__init__.py +0 -0
  513. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/sources/base.py +0 -0
  514. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/sources/buzz.py +0 -0
  515. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/sources/discord.py +0 -0
  516. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/sources/neonize.py +0 -0
  517. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/sources/sse.py +0 -0
  518. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/sources/websocket.py +0 -0
  519. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/store/__init__.py +0 -0
  520. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/store/base.py +0 -0
  521. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/store/memory.py +0 -0
  522. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/store/postgres.py +0 -0
  523. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/store/postgres_lock.py +0 -0
  524. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/store/postgres_mappers.py +0 -0
  525. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/store/postgres_schema.py +0 -0
  526. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/store/sqlite.py +0 -0
  527. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/tasks/__init__.py +0 -0
  528. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/tasks/base.py +0 -0
  529. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/tasks/cache.py +0 -0
  530. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/tasks/delegate.py +0 -0
  531. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/tasks/memory.py +0 -0
  532. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/tasks/models.py +0 -0
  533. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/telemetry/__init__.py +0 -0
  534. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/telemetry/base.py +0 -0
  535. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/telemetry/config.py +0 -0
  536. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/telemetry/console.py +0 -0
  537. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/telemetry/context.py +0 -0
  538. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/telemetry/mock.py +0 -0
  539. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/telemetry/noop.py +0 -0
  540. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/telemetry/opentelemetry.py +0 -0
  541. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/telemetry/pyroscope.py +0 -0
  542. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/telemetry/redaction.py +0 -0
  543. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/tools/__init__.py +0 -0
  544. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/tools/base.py +0 -0
  545. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/tools/compose.py +0 -0
  546. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/tools/context.py +0 -0
  547. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/tools/external.py +0 -0
  548. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/tools/human_input.py +0 -0
  549. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/tools/mcp.py +0 -0
  550. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/tools/policy.py +0 -0
  551. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/tools/validation.py +0 -0
  552. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/video/__init__.py +0 -0
  553. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/video/ai_integration.py +0 -0
  554. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/video/avatar/__init__.py +0 -0
  555. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/video/avatar/base.py +0 -0
  556. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/video/avatar/mock.py +0 -0
  557. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/video/avatar/musetalk.py +0 -0
  558. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/video/avatar/websocket.py +0 -0
  559. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/video/backends/__init__.py +0 -0
  560. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/video/backends/base.py +0 -0
  561. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/video/backends/fastrtc.py +0 -0
  562. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/video/backends/local.py +0 -0
  563. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/video/backends/mock.py +0 -0
  564. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/video/backends/rtp.py +0 -0
  565. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/video/backends/screen.py +0 -0
  566. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/video/backends/sip.py +0 -0
  567. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/video/backends/websocket.py +0 -0
  568. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/video/base.py +0 -0
  569. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/video/bridge.py +0 -0
  570. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/video/events.py +0 -0
  571. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/video/pipeline/__init__.py +0 -0
  572. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/video/pipeline/config.py +0 -0
  573. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/video/pipeline/decoder/__init__.py +0 -0
  574. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/video/pipeline/decoder/base.py +0 -0
  575. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/video/pipeline/decoder/mock.py +0 -0
  576. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/video/pipeline/decoder/pyav.py +0 -0
  577. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/video/pipeline/encoder/__init__.py +0 -0
  578. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/video/pipeline/encoder/base.py +0 -0
  579. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/video/pipeline/encoder/pyav.py +0 -0
  580. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/video/pipeline/engine.py +0 -0
  581. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/video/pipeline/filter/__init__.py +0 -0
  582. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/video/pipeline/filter/base.py +0 -0
  583. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/video/pipeline/filter/censor.py +0 -0
  584. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/video/pipeline/filter/mediapipe_face_touch.py +0 -0
  585. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/video/pipeline/filter/mock.py +0 -0
  586. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/video/pipeline/filter/mock_face_touch.py +0 -0
  587. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/video/pipeline/filter/watermark.py +0 -0
  588. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/video/pipeline/filter/yolo.py +0 -0
  589. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/video/pipeline/overlay/__init__.py +0 -0
  590. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/video/pipeline/overlay/base.py +0 -0
  591. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/video/pipeline/overlay/filter.py +0 -0
  592. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/video/pipeline/overlay/image.py +0 -0
  593. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/video/pipeline/overlay/mock.py +0 -0
  594. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/video/pipeline/overlay/rich.py +0 -0
  595. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/video/pipeline/overlay/subtitle.py +0 -0
  596. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/video/pipeline/overlay/text.py +0 -0
  597. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/video/pipeline/resizer/__init__.py +0 -0
  598. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/video/pipeline/resizer/base.py +0 -0
  599. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/video/pipeline/resizer/mock.py +0 -0
  600. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/video/pipeline/resizer/pyav.py +0 -0
  601. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/video/pipeline/transform/__init__.py +0 -0
  602. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/video/pipeline/transform/base.py +0 -0
  603. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/video/pipeline/transform/effects.py +0 -0
  604. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/video/pipeline/transform/mock.py +0 -0
  605. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/video/recorder/__init__.py +0 -0
  606. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/video/recorder/base.py +0 -0
  607. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/video/recorder/mock.py +0 -0
  608. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/video/recorder/opencv.py +0 -0
  609. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/video/recorder/pyav.py +0 -0
  610. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/video/utils.py +0 -0
  611. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/video/video_frame.py +0 -0
  612. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/video/vision/__init__.py +0 -0
  613. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/video/vision/base.py +0 -0
  614. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/video/vision/encode.py +0 -0
  615. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/video/vision/gemini.py +0 -0
  616. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/video/vision/mock.py +0 -0
  617. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/video/vision/openai.py +0 -0
  618. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/video/vision/screen_input.py +0 -0
  619. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/video/vision/screen_tool.py +0 -0
  620. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/video/vision/webcam_tool.py +0 -0
  621. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/voice/__init__.py +0 -0
  622. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/voice/_g711.py +0 -0
  623. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/voice/_limits.py +0 -0
  624. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/voice/_sounddevice.py +0 -0
  625. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/voice/audio_frame.py +0 -0
  626. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/voice/auth.py +0 -0
  627. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/voice/backends/__init__.py +0 -0
  628. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/voice/backends/_mulaw.py +0 -0
  629. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/voice/backends/_resample.py +0 -0
  630. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/voice/backends/_sip_types.py +0 -0
  631. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/voice/backends/_webrtc_auth.py +0 -0
  632. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/voice/backends/base.py +0 -0
  633. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/voice/backends/buzz_huddle.py +0 -0
  634. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/voice/backends/fastrtc.py +0 -0
  635. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/voice/backends/local.py +0 -0
  636. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/voice/backends/mock.py +0 -0
  637. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/voice/backends/rtp.py +0 -0
  638. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/voice/backends/sip.py +0 -0
  639. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/voice/backends/sip_audio.py +0 -0
  640. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/voice/backends/sip_auth.py +0 -0
  641. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/voice/backends/sip_calling.py +0 -0
  642. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/voice/backends/twilio_ws.py +0 -0
  643. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/voice/backends/webtransport.py +0 -0
  644. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/voice/base.py +0 -0
  645. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/voice/bridge.py +0 -0
  646. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/voice/capture/__init__.py +0 -0
  647. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/voice/capture/base.py +0 -0
  648. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/voice/capture/local.py +0 -0
  649. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/voice/capture/mock.py +0 -0
  650. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/voice/events.py +0 -0
  651. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/voice/inbound.py +0 -0
  652. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/voice/interruption.py +0 -0
  653. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/voice/pipeline/__init__.py +0 -0
  654. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/voice/pipeline/_telemetry.py +0 -0
  655. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/voice/pipeline/aec/__init__.py +0 -0
  656. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/voice/pipeline/aec/base.py +0 -0
  657. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/voice/pipeline/aec/mock.py +0 -0
  658. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/voice/pipeline/aec/speex.py +0 -0
  659. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/voice/pipeline/aec/webrtc.py +0 -0
  660. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/voice/pipeline/agc/__init__.py +0 -0
  661. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/voice/pipeline/agc/base.py +0 -0
  662. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/voice/pipeline/agc/mock.py +0 -0
  663. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/voice/pipeline/agc/simple.py +0 -0
  664. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/voice/pipeline/backchannel/__init__.py +0 -0
  665. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/voice/pipeline/backchannel/base.py +0 -0
  666. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/voice/pipeline/backchannel/mock.py +0 -0
  667. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/voice/pipeline/config.py +0 -0
  668. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/voice/pipeline/debug_taps.py +0 -0
  669. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/voice/pipeline/denoiser/__init__.py +0 -0
  670. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/voice/pipeline/denoiser/aicoustics.py +0 -0
  671. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/voice/pipeline/denoiser/base.py +0 -0
  672. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/voice/pipeline/denoiser/mock.py +0 -0
  673. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/voice/pipeline/denoiser/rnnoise.py +0 -0
  674. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/voice/pipeline/denoiser/sherpa_onnx.py +0 -0
  675. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/voice/pipeline/denoiser/webrtc.py +0 -0
  676. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/voice/pipeline/diarization/__init__.py +0 -0
  677. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/voice/pipeline/diarization/base.py +0 -0
  678. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/voice/pipeline/diarization/mock.py +0 -0
  679. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/voice/pipeline/diarization/sherpa_onnx.py +0 -0
  680. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/voice/pipeline/dtmf/__init__.py +0 -0
  681. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/voice/pipeline/dtmf/base.py +0 -0
  682. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/voice/pipeline/dtmf/mock.py +0 -0
  683. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/voice/pipeline/engine.py +0 -0
  684. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/voice/pipeline/mixer/__init__.py +0 -0
  685. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/voice/pipeline/mixer/base.py +0 -0
  686. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/voice/pipeline/mixer/numpy.py +0 -0
  687. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/voice/pipeline/mixer/python.py +0 -0
  688. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/voice/pipeline/offload.py +0 -0
  689. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/voice/pipeline/postprocessor/__init__.py +0 -0
  690. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/voice/pipeline/postprocessor/base.py +0 -0
  691. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/voice/pipeline/recorder/__init__.py +0 -0
  692. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/voice/pipeline/recorder/_wav_writer.py +0 -0
  693. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/voice/pipeline/recorder/base.py +0 -0
  694. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/voice/pipeline/recorder/mock.py +0 -0
  695. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/voice/pipeline/recorder/wav.py +0 -0
  696. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/voice/pipeline/resampler/__init__.py +0 -0
  697. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/voice/pipeline/resampler/base.py +0 -0
  698. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/voice/pipeline/resampler/linear.py +0 -0
  699. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/voice/pipeline/resampler/mock.py +0 -0
  700. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/voice/pipeline/resampler/numpy.py +0 -0
  701. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/voice/pipeline/resampler/sinc.py +0 -0
  702. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/voice/pipeline/turn/__init__.py +0 -0
  703. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/voice/pipeline/turn/base.py +0 -0
  704. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/voice/pipeline/turn/mock.py +0 -0
  705. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/voice/pipeline/turn/smart_turn.py +0 -0
  706. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/voice/pipeline/vad/__init__.py +0 -0
  707. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/voice/pipeline/vad/base.py +0 -0
  708. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/voice/pipeline/vad/energy.py +0 -0
  709. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/voice/pipeline/vad/mock.py +0 -0
  710. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/voice/pipeline/vad/sherpa_onnx.py +0 -0
  711. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/voice/realtime/__init__.py +0 -0
  712. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/voice/realtime/_fastrtc_playback.py +0 -0
  713. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/voice/realtime/bridge.py +0 -0
  714. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/voice/realtime/events.py +0 -0
  715. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/voice/realtime/injection.py +0 -0
  716. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/voice/realtime/mock.py +0 -0
  717. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/voice/realtime/pacer.py +0 -0
  718. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/voice/realtime/provider.py +0 -0
  719. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/voice/realtime/reasoning.py +0 -0
  720. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/voice/realtime/sip_transport.py +0 -0
  721. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/voice/realtime/ws_transport.py +0 -0
  722. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/voice/stt/__init__.py +0 -0
  723. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/voice/stt/base.py +0 -0
  724. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/voice/stt/deepgram.py +0 -0
  725. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/voice/stt/gemini.py +0 -0
  726. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/voice/stt/gemini_audio.py +0 -0
  727. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/voice/stt/gemini_transcript.py +0 -0
  728. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/voice/stt/gradium.py +0 -0
  729. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/voice/stt/language.py +0 -0
  730. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/voice/stt/mock.py +0 -0
  731. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/voice/stt/qwen3.py +0 -0
  732. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/voice/stt/sherpa_onnx.py +0 -0
  733. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/voice/testing/__init__.py +0 -0
  734. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/voice/testing/backend.py +0 -0
  735. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/voice/testing/trace.py +0 -0
  736. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/voice/testing/wav.py +0 -0
  737. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/voice/tts/__init__.py +0 -0
  738. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/voice/tts/audio_utils.py +0 -0
  739. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/voice/tts/base.py +0 -0
  740. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/voice/tts/elevenlabs.py +0 -0
  741. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/voice/tts/filters.py +0 -0
  742. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/voice/tts/gemini.py +0 -0
  743. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/voice/tts/gradium.py +0 -0
  744. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/voice/tts/grok.py +0 -0
  745. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/voice/tts/mock.py +0 -0
  746. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/voice/tts/neutts.py +0 -0
  747. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/voice/tts/qwen3.py +0 -0
  748. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/voice/tts/sentence_splitter.py +0 -0
  749. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/voice/tts/sherpa_onnx.py +0 -0
  750. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/voice/utils.py +0 -0
  751. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/webrtc/LICENSE +0 -0
  752. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/webrtc/__init__.py +0 -0
  753. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/webrtc/tracks.py +0 -0
  754. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/webrtc/utils.py +0 -0
  755. {roomkit-0.75.2 → roomkit-0.76.0}/src/roomkit/webrtc/websocket.py +0 -0
  756. {roomkit-0.75.2 → roomkit-0.76.0}/tests/__init__.py +0 -0
  757. {roomkit-0.75.2 → roomkit-0.76.0}/tests/conference/__init__.py +0 -0
  758. {roomkit-0.75.2 → roomkit-0.76.0}/tests/conference/lane_audio.py +0 -0
  759. {roomkit-0.75.2 → roomkit-0.76.0}/tests/conference/test_backend_abc.py +0 -0
  760. {roomkit-0.75.2 → roomkit-0.76.0}/tests/conference/test_conference_activity.py +0 -0
  761. {roomkit-0.75.2 → roomkit-0.76.0}/tests/conference/test_conference_attach_failure.py +0 -0
  762. {roomkit-0.75.2 → roomkit-0.76.0}/tests/conference/test_conference_channel.py +0 -0
  763. {roomkit-0.75.2 → roomkit-0.76.0}/tests/conference/test_conference_gating.py +0 -0
  764. {roomkit-0.75.2 → roomkit-0.76.0}/tests/conference/test_conference_hot_plug.py +0 -0
  765. {roomkit-0.75.2 → roomkit-0.76.0}/tests/conference/test_conference_identity.py +0 -0
  766. {roomkit-0.75.2 → roomkit-0.76.0}/tests/conference/test_conference_lane.py +0 -0
  767. {roomkit-0.75.2 → roomkit-0.76.0}/tests/conference/test_conference_metadata.py +0 -0
  768. {roomkit-0.75.2 → roomkit-0.76.0}/tests/conference/test_conference_mixer.py +0 -0
  769. {roomkit-0.75.2 → roomkit-0.76.0}/tests/conference/test_conference_outbound.py +0 -0
  770. {roomkit-0.75.2 → roomkit-0.76.0}/tests/conference/test_conference_pure_transport.py +0 -0
  771. {roomkit-0.75.2 → roomkit-0.76.0}/tests/conference/test_conference_races.py +0 -0
  772. {roomkit-0.75.2 → roomkit-0.76.0}/tests/conference/test_conference_realtime.py +0 -0
  773. {roomkit-0.75.2 → roomkit-0.76.0}/tests/conference/test_conference_realtime_hot_plug.py +0 -0
  774. {roomkit-0.75.2 → roomkit-0.76.0}/tests/conference/test_conference_realtime_voice.py +0 -0
  775. {roomkit-0.75.2 → roomkit-0.76.0}/tests/conference/test_conference_recording.py +0 -0
  776. {roomkit-0.75.2 → roomkit-0.76.0}/tests/conference/test_conference_recording_isolation.py +0 -0
  777. {roomkit-0.75.2 → roomkit-0.76.0}/tests/conference/test_conference_teardown_failure.py +0 -0
  778. {roomkit-0.75.2 → roomkit-0.76.0}/tests/conference/test_livekit_backend.py +0 -0
  779. {roomkit-0.75.2 → roomkit-0.76.0}/tests/conference/test_livekit_live.py +0 -0
  780. {roomkit-0.75.2 → roomkit-0.76.0}/tests/conference/test_livekit_mapping.py +0 -0
  781. {roomkit-0.75.2 → roomkit-0.76.0}/tests/conference/test_mock_backend.py +0 -0
  782. {roomkit-0.75.2 → roomkit-0.76.0}/tests/conference/test_mock_injection.py +0 -0
  783. {roomkit-0.75.2 → roomkit-0.76.0}/tests/conference/test_models.py +0 -0
  784. {roomkit-0.75.2 → roomkit-0.76.0}/tests/conftest.py +0 -0
  785. {roomkit-0.75.2 → roomkit-0.76.0}/tests/delivery/__init__.py +0 -0
  786. {roomkit-0.75.2 → roomkit-0.76.0}/tests/delivery/test_base.py +0 -0
  787. {roomkit-0.75.2 → roomkit-0.76.0}/tests/delivery/test_integration.py +0 -0
  788. {roomkit-0.75.2 → roomkit-0.76.0}/tests/delivery/test_memory.py +0 -0
  789. {roomkit-0.75.2 → roomkit-0.76.0}/tests/delivery/test_redis.py +0 -0
  790. {roomkit-0.75.2 → roomkit-0.76.0}/tests/delivery/test_redis_integration.py +0 -0
  791. {roomkit-0.75.2 → roomkit-0.76.0}/tests/delivery/test_serialization.py +0 -0
  792. {roomkit-0.75.2 → roomkit-0.76.0}/tests/delivery/test_targeted.py +0 -0
  793. {roomkit-0.75.2 → roomkit-0.76.0}/tests/delivery/test_worker.py +0 -0
  794. {roomkit-0.75.2 → roomkit-0.76.0}/tests/http_timeout_fakes.py +0 -0
  795. {roomkit-0.75.2 → roomkit-0.76.0}/tests/orchestration/__init__.py +0 -0
  796. {roomkit-0.75.2 → roomkit-0.76.0}/tests/orchestration/test_framework_orchestration.py +0 -0
  797. {roomkit-0.75.2 → roomkit-0.76.0}/tests/orchestration/test_handoff.py +0 -0
  798. {roomkit-0.75.2 → roomkit-0.76.0}/tests/orchestration/test_loop_strategy.py +0 -0
  799. {roomkit-0.75.2 → roomkit-0.76.0}/tests/orchestration/test_orchestration_base.py +0 -0
  800. {roomkit-0.75.2 → roomkit-0.76.0}/tests/orchestration/test_pipeline.py +0 -0
  801. {roomkit-0.75.2 → roomkit-0.76.0}/tests/orchestration/test_router.py +0 -0
  802. {roomkit-0.75.2 → roomkit-0.76.0}/tests/orchestration/test_session_audit.py +0 -0
  803. {roomkit-0.75.2 → roomkit-0.76.0}/tests/orchestration/test_state.py +0 -0
  804. {roomkit-0.75.2 → roomkit-0.76.0}/tests/orchestration/test_status_bus.py +0 -0
  805. {roomkit-0.75.2 → roomkit-0.76.0}/tests/orchestration/test_status_redis.py +0 -0
  806. {roomkit-0.75.2 → roomkit-0.76.0}/tests/orchestration/test_strategy_behavioral.py +0 -0
  807. {roomkit-0.75.2 → roomkit-0.76.0}/tests/orchestration/test_strategy_loop.py +0 -0
  808. {roomkit-0.75.2 → roomkit-0.76.0}/tests/orchestration/test_strategy_pipeline.py +0 -0
  809. {roomkit-0.75.2 → roomkit-0.76.0}/tests/orchestration/test_strategy_supervisor.py +0 -0
  810. {roomkit-0.75.2 → roomkit-0.76.0}/tests/orchestration/test_strategy_swarm.py +0 -0
  811. {roomkit-0.75.2 → roomkit-0.76.0}/tests/orchestration/test_supervisor_inline.py +0 -0
  812. {roomkit-0.75.2 → roomkit-0.76.0}/tests/orchestration/test_supervisor_strategy.py +0 -0
  813. {roomkit-0.75.2 → roomkit-0.76.0}/tests/orchestration/test_tool_audit.py +0 -0
  814. {roomkit-0.75.2 → roomkit-0.76.0}/tests/providers/__init__.py +0 -0
  815. {roomkit-0.75.2 → roomkit-0.76.0}/tests/providers/gemini/__init__.py +0 -0
  816. {roomkit-0.75.2 → roomkit-0.76.0}/tests/providers/gemini/test_reconfigure_preservation.py +0 -0
  817. {roomkit-0.75.2 → roomkit-0.76.0}/tests/providers/gemini/test_schema.py +0 -0
  818. {roomkit-0.75.2 → roomkit-0.76.0}/tests/providers/openai/__init__.py +0 -0
  819. {roomkit-0.75.2 → roomkit-0.76.0}/tests/providers/openai/test_reconfigure.py +0 -0
  820. {roomkit-0.75.2 → roomkit-0.76.0}/tests/redis_fakes.py +0 -0
  821. {roomkit-0.75.2 → roomkit-0.76.0}/tests/stress/__init__.py +0 -0
  822. {roomkit-0.75.2 → roomkit-0.76.0}/tests/stress/test_stress_core.py +0 -0
  823. {roomkit-0.75.2 → roomkit-0.76.0}/tests/stress/test_stress_messaging.py +0 -0
  824. {roomkit-0.75.2 → roomkit-0.76.0}/tests/stress/test_stress_voice.py +0 -0
  825. {roomkit-0.75.2 → roomkit-0.76.0}/tests/tasks/__init__.py +0 -0
  826. {roomkit-0.75.2 → roomkit-0.76.0}/tests/tasks/test_cache.py +0 -0
  827. {roomkit-0.75.2 → roomkit-0.76.0}/tests/tasks/test_child_room_trace.py +0 -0
  828. {roomkit-0.75.2 → roomkit-0.76.0}/tests/tasks/test_delegate.py +0 -0
  829. {roomkit-0.75.2 → roomkit-0.76.0}/tests/tasks/test_integration.py +0 -0
  830. {roomkit-0.75.2 → roomkit-0.76.0}/tests/tasks/test_models.py +0 -0
  831. {roomkit-0.75.2 → roomkit-0.76.0}/tests/tasks/test_runner.py +0 -0
  832. {roomkit-0.75.2 → roomkit-0.76.0}/tests/tasks/test_structured_result.py +0 -0
  833. {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_addressing.py +0 -0
  834. {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_aec_bench.py +0 -0
  835. {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_aec_pipeline.py +0 -0
  836. {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_ai_docs.py +0 -0
  837. {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_ai_response_plain_stream.py +0 -0
  838. {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_ai_response_transcript.py +0 -0
  839. {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_ai_stream_contract.py +0 -0
  840. {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_ai_streaming_thinking.py +0 -0
  841. {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_ai_streaming_tool_events.py +0 -0
  842. {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_ai_streaming_tool_loop.py +0 -0
  843. {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_aicoustics_denoiser.py +0 -0
  844. {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_anam_realtime.py +0 -0
  845. {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_audio_backpressure.py +0 -0
  846. {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_audio_capture_source.py +0 -0
  847. {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_audio_limits.py +0 -0
  848. {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_audio_pipeline.py +0 -0
  849. {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_auto_connect.py +0 -0
  850. {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_av_channel.py +0 -0
  851. {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_avatar.py +0 -0
  852. {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_before_ai_generation.py +0 -0
  853. {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_before_deliver_gate.py +0 -0
  854. {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_binding_permission_inheritance.py +0 -0
  855. {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_bridge_hook_modification.py +0 -0
  856. {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_buzz_huddle_backend.py +0 -0
  857. {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_channel_abc.py +0 -0
  858. {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_channel_attach_contract.py +0 -0
  859. {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_channels/__init__.py +0 -0
  860. {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_channels/test_acp.py +0 -0
  861. {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_channels/test_acp_empty_prompt.py +0 -0
  862. {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_channels/test_acp_usage.py +0 -0
  863. {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_channels/test_acp_usage_boundaries.py +0 -0
  864. {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_channels/test_agent.py +0 -0
  865. {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_channels/test_ai.py +0 -0
  866. {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_channels/test_ai_active_turns.py +0 -0
  867. {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_channels/test_ai_empty_retry.py +0 -0
  868. {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_channels/test_ai_loop_rules.py +0 -0
  869. {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_channels/test_ai_response_loop_end_reason.py +0 -0
  870. {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_channels/test_ai_retry.py +0 -0
  871. {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_channels/test_ai_skill_gating.py +0 -0
  872. {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_channels/test_ai_steering.py +0 -0
  873. {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_channels/test_ai_streaming_compaction.py +0 -0
  874. {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_channels/test_ai_tool_loop.py +0 -0
  875. {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_channels/test_compact_context_tool_pairs.py +0 -0
  876. {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_channels/test_email.py +0 -0
  877. {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_channels/test_http.py +0 -0
  878. {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_channels/test_loop_end_marker.py +0 -0
  879. {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_channels/test_loop_end_reason_nonstreaming.py +0 -0
  880. {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_channels/test_messenger.py +0 -0
  881. {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_channels/test_multimodal_tool_result.py +0 -0
  882. {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_channels/test_sms.py +0 -0
  883. {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_channels/test_telegram.py +0 -0
  884. {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_channels/test_tool_usage_memory.py +0 -0
  885. {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_channels/test_turn_config.py +0 -0
  886. {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_channels/test_websocket.py +0 -0
  887. {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_channels/test_whatsapp.py +0 -0
  888. {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_chat_benchmark.py +0 -0
  889. {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_chat_quality.py +0 -0
  890. {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_check_models.py +0 -0
  891. {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_circuit_breaker.py +0 -0
  892. {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_cli_activity.py +0 -0
  893. {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_cli_channel.py +0 -0
  894. {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_cli_console.py +0 -0
  895. {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_cli_prompt_shell.py +0 -0
  896. {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_cli_select.py +0 -0
  897. {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_commit_atomicity.py +0 -0
  898. {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_compacting_cache.py +0 -0
  899. {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_compose_tool_handlers.py +0 -0
  900. {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_config_secret_hygiene.py +0 -0
  901. {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_configs.py +0 -0
  902. {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_conformance_level0.py +0 -0
  903. {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_console.py +0 -0
  904. {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_context_carry_forward.py +0 -0
  905. {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_context_visibility.py +0 -0
  906. {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_current_turn_budget.py +0 -0
  907. {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_dangling_recovery.py +0 -0
  908. {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_delivery_cancellation.py +0 -0
  909. {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_delivery_cancellation_streams.py +0 -0
  910. {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_delivery_order.py +0 -0
  911. {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_delivery_outcomes.py +0 -0
  912. {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_delivery_strategies.py +0 -0
  913. {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_denoiser_rnnoise_loader.py +0 -0
  914. {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_describe_screen_tool.py +0 -0
  915. {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_describe_webcam_tool.py +0 -0
  916. {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_drain_barge_in.py +0 -0
  917. {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_edit_delete_authorization.py +0 -0
  918. {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_energy_vad.py +0 -0
  919. {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_enums.py +0 -0
  920. {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_event_ops.py +0 -0
  921. {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_event_text.py +0 -0
  922. {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_examples_audio.py +0 -0
  923. {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_external_tool_handler.py +0 -0
  924. {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_face_touch_filter.py +0 -0
  925. {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_fastrtc_audio_session.py +0 -0
  926. {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_fastrtc_playback.py +0 -0
  927. {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_fastrtc_realtime_transport.py +0 -0
  928. {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_framework.py +0 -0
  929. {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_framework_aware.py +0 -0
  930. {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_framework_events.py +0 -0
  931. {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_framework_queries.py +0 -0
  932. {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_framework_status_bus.py +0 -0
  933. {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_gemini_context_preservation.py +0 -0
  934. {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_gemini_realtime_failfast.py +0 -0
  935. {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_gemini_transcript_dedup.py +0 -0
  936. {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_hook_payload_modification.py +0 -0
  937. {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_hook_side_effects.py +0 -0
  938. {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_hooks.py +0 -0
  939. {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_http_timeouts.py +0 -0
  940. {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_human_input.py +0 -0
  941. {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_idempotent_redelivery.py +0 -0
  942. {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_identity_hooks.py +0 -0
  943. {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_identity_pipeline.py +0 -0
  944. {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_identity_unknown_outcomes.py +0 -0
  945. {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_inbound_connection_budget.py +0 -0
  946. {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_inbound_deferred.py +0 -0
  947. {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_inbound_error_surfacing.py +0 -0
  948. {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_inbound_rate_limit.py +0 -0
  949. {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_inbound_response_events.py +0 -0
  950. {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_inbound_routing.py +0 -0
  951. {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_inbound_routing_ambiguity.py +0 -0
  952. {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_inbound_stream_cancellation.py +0 -0
  953. {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_inbound_stream_error_propagation.py +0 -0
  954. {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_inbound_visibility.py +0 -0
  955. {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_integration/__init__.py +0 -0
  956. {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_integration/test_ai_assistant.py +0 -0
  957. {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_integration/test_ai_chain_depth.py +0 -0
  958. {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_integration/test_cerebras_live.py +0 -0
  959. {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_integration/test_cross_channel.py +0 -0
  960. {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_integration/test_dynamic_channels.py +0 -0
  961. {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_integration/test_human_ai.py +0 -0
  962. {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_integration/test_identity_resolution.py +0 -0
  963. {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_integration/test_observer.py +0 -0
  964. {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_integration/test_regenerate.py +0 -0
  965. {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_integration/test_sin_scanning.py +0 -0
  966. {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_interruption.py +0 -0
  967. {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_interruption_partials.py +0 -0
  968. {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_interruption_pipeline.py +0 -0
  969. {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_invalid_tool_repeat_guard.py +0 -0
  970. {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_knowledge_postgres.py +0 -0
  971. {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_lanes.py +0 -0
  972. {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_lanes_multiworker.py +0 -0
  973. {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_lifecycle_hooks.py +0 -0
  974. {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_local_backend_aec.py +0 -0
  975. {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_locks.py +0 -0
  976. {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_log_redaction.py +0 -0
  977. {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_mcp_structured_content.py +0 -0
  978. {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_mcp_tool_provider.py +0 -0
  979. {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_mcp_tools.py +0 -0
  980. {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_media_recorder.py +0 -0
  981. {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_memory.py +0 -0
  982. {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_memory_new.py +0 -0
  983. {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_memory_wrappers.py +0 -0
  984. {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_mock_providers.py +0 -0
  985. {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_models.py +0 -0
  986. {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_observability.py +0 -0
  987. {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_opencv_recorder.py +0 -0
  988. {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_opentelemetry.py +0 -0
  989. {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_optional_imports.py +0 -0
  990. {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_outbound_audio_pacer.py +0 -0
  991. {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_parallel_tool_cleanup.py +0 -0
  992. {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_participant_membership.py +0 -0
  993. {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_personaplex_realtime.py +0 -0
  994. {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_pipeline_debug_taps.py +0 -0
  995. {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_pipeline_engine.py +0 -0
  996. {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_pipeline_providers.py +0 -0
  997. {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_pipeline_resampler.py +0 -0
  998. {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_pipeline_resampler_numpy.py +0 -0
  999. {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_pipeline_resampler_sinc.py +0 -0
  1000. {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_postgres_lock.py +0 -0
  1001. {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_postgres_multiprocess.py +0 -0
  1002. {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_postgres_store.py +0 -0
  1003. {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_precommit_timeout.py +0 -0
  1004. {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_proactive_delivery.py +0 -0
  1005. {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_proactive_delivery_voice.py +0 -0
  1006. {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_protocol_trace.py +0 -0
  1007. {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_providers/__init__.py +0 -0
  1008. {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_providers/conftest.py +0 -0
  1009. {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_providers/test_ai_models.py +0 -0
  1010. {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_providers/test_anam_avatar.py +0 -0
  1011. {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_providers/test_anam_realtime.py +0 -0
  1012. {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_providers/test_anthropic.py +0 -0
  1013. {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_providers/test_azure.py +0 -0
  1014. {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_providers/test_azure_image.py +0 -0
  1015. {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_providers/test_buzz.py +0 -0
  1016. {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_providers/test_cerebras.py +0 -0
  1017. {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_providers/test_cerebras_tool_arrays.py +0 -0
  1018. {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_providers/test_deepseek.py +0 -0
  1019. {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_providers/test_discord.py +0 -0
  1020. {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_providers/test_elasticemail.py +0 -0
  1021. {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_providers/test_gemini.py +0 -0
  1022. {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_providers/test_gemini_list_models.py +0 -0
  1023. {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_providers/test_gemini_realtime.py +0 -0
  1024. {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_providers/test_gemini_vertex.py +0 -0
  1025. {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_providers/test_http.py +0 -0
  1026. {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_providers/test_http_timeouts.py +0 -0
  1027. {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_providers/test_image.py +0 -0
  1028. {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_providers/test_image_parts.py +0 -0
  1029. {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_providers/test_litellm.py +0 -0
  1030. {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_providers/test_messenger.py +0 -0
  1031. {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_providers/test_mistral.py +0 -0
  1032. {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_providers/test_ollama.py +0 -0
  1033. {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_providers/test_openai.py +0 -0
  1034. {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_providers/test_openai_realtime.py +0 -0
  1035. {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_providers/test_openrouter.py +0 -0
  1036. {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_providers/test_openrouter_image.py +0 -0
  1037. {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_providers/test_personaplex_realtime.py +0 -0
  1038. {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_providers/test_phone.py +0 -0
  1039. {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_providers/test_polargrid.py +0 -0
  1040. {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_providers/test_qwen.py +0 -0
  1041. {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_providers/test_rcs.py +0 -0
  1042. {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_providers/test_realtime_models.py +0 -0
  1043. {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_providers/test_realtime_voices.py +0 -0
  1044. {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_providers/test_sendgrid.py +0 -0
  1045. {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_providers/test_sinch.py +0 -0
  1046. {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_providers/test_sms_utils.py +0 -0
  1047. {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_providers/test_teams.py +0 -0
  1048. {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_providers/test_teams_webhook.py +0 -0
  1049. {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_providers/test_telegram_api.py +0 -0
  1050. {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_providers/test_telegram_bot.py +0 -0
  1051. {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_providers/test_telegram_entities.py +0 -0
  1052. {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_providers/test_telegram_update.py +0 -0
  1053. {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_providers/test_telegram_webhook.py +0 -0
  1054. {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_providers/test_telnyx.py +0 -0
  1055. {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_providers/test_telnyx_rcs.py +0 -0
  1056. {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_providers/test_twilio.py +0 -0
  1057. {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_providers/test_vllm.py +0 -0
  1058. {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_providers/test_voicemeup.py +0 -0
  1059. {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_providers/test_whatsapp_personal.py +0 -0
  1060. {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_providers/test_xai.py +0 -0
  1061. {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_providers/test_xai_image.py +0 -0
  1062. {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_providers/test_xai_realtime.py +0 -0
  1063. {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_public_api.py +0 -0
  1064. {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_pyav_decode_native.py +0 -0
  1065. {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_pyav_media_recorder.py +0 -0
  1066. {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_pyav_recorder.py +0 -0
  1067. {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_rate_limiter.py +0 -0
  1068. {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_raw_payload_preservation.py +0 -0
  1069. {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_realtime.py +0 -0
  1070. {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_realtime_av_channel.py +0 -0
  1071. {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_realtime_deepgram.py +0 -0
  1072. {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_realtime_elevenlabs.py +0 -0
  1073. {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_realtime_fixed_tools.py +0 -0
  1074. {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_realtime_full_duplex.py +0 -0
  1075. {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_realtime_g711.py +0 -0
  1076. {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_realtime_hook_coverage.py +0 -0
  1077. {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_realtime_playback_lifecycle.py +0 -0
  1078. {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_realtime_reasoning.py +0 -0
  1079. {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_realtime_reconfiguration.py +0 -0
  1080. {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_realtime_reconnection.py +0 -0
  1081. {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_realtime_redis.py +0 -0
  1082. {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_realtime_resample_offload.py +0 -0
  1083. {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_realtime_skill_delivery.py +0 -0
  1084. {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_realtime_skills.py +0 -0
  1085. {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_realtime_tool_recovery.py +0 -0
  1086. {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_realtime_tool_search.py +0 -0
  1087. {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_realtime_voice.py +0 -0
  1088. {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_realtime_voice_integration.py +0 -0
  1089. {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_realtime_xai.py +0 -0
  1090. {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_recent_events_window.py +0 -0
  1091. {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_recording_consent.py +0 -0
  1092. {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_recording_wiring.py +0 -0
  1093. {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_reentry_block_side_effects.py +0 -0
  1094. {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_related_family_tools.py +0 -0
  1095. {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_release_script.py +0 -0
  1096. {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_repeated_result_note.py +0 -0
  1097. {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_resilience.py +0 -0
  1098. {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_response_metadata.py +0 -0
  1099. {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_response_visibility.py +0 -0
  1100. {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_retrieval_memory.py +0 -0
  1101. {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_retry_retryability.py +0 -0
  1102. {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_rfc_arbitrations.py +0 -0
  1103. {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_rfc_conformance.py +0 -0
  1104. {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_rfc_framework_events.py +0 -0
  1105. {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_rfc_write_gates.py +0 -0
  1106. {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_rnnoise.py +0 -0
  1107. {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_room_org_scoping.py +0 -0
  1108. {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_room_status_enforcement.py +0 -0
  1109. {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_router.py +0 -0
  1110. {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_rtp_video_backend.py +0 -0
  1111. {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_scoring.py +0 -0
  1112. {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_screen_capture_backend.py +0 -0
  1113. {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_screen_input.py +0 -0
  1114. {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_session_started.py +0 -0
  1115. {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_sherpa_onnx_denoiser.py +0 -0
  1116. {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_sherpa_onnx_vad.py +0 -0
  1117. {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_sip_audio_clock.py +0 -0
  1118. {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_sip_auth.py +0 -0
  1119. {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_sip_dial.py +0 -0
  1120. {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_sip_helpers.py +0 -0
  1121. {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_sip_realtime_transport.py +0 -0
  1122. {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_sip_video_backend.py +0 -0
  1123. {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_skill_activation.py +0 -0
  1124. {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_skill_tool_gating.py +0 -0
  1125. {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_skills.py +0 -0
  1126. {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_skills_integration.py +0 -0
  1127. {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_smart_turn.py +0 -0
  1128. {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_smoke_quickstart.py +0 -0
  1129. {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_source_rate_limit.py +0 -0
  1130. {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_source_url_redaction.py +0 -0
  1131. {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_sources.py +0 -0
  1132. {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_sources_init.py +0 -0
  1133. {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_sources_neonize.py +0 -0
  1134. {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_sources_sse.py +0 -0
  1135. {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_sources_websocket.py +0 -0
  1136. {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_speaker_attribution.py +0 -0
  1137. {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_speex_aec.py +0 -0
  1138. {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_store_activity.py +0 -0
  1139. {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_store_binding_contract.py +0 -0
  1140. {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_store_identity_scoping.py +0 -0
  1141. {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_store_lifecycle_immutability.py +0 -0
  1142. {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_store_memory.py +0 -0
  1143. {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_store_postgres.py +0 -0
  1144. {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_store_sqlite.py +0 -0
  1145. {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_streaming_before_broadcast.py +0 -0
  1146. {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_stt_deepgram_teardown.py +0 -0
  1147. {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_stt_gemini.py +0 -0
  1148. {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_stt_qwen3.py +0 -0
  1149. {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_summarizing_memory.py +0 -0
  1150. {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_supervisor.py +0 -0
  1151. {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_task_planner.py +0 -0
  1152. {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_task_utils.py +0 -0
  1153. {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_telemetry.py +0 -0
  1154. {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_telemetry_pyroscope.py +0 -0
  1155. {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_threading.py +0 -0
  1156. {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_tool_arg_fold.py +0 -0
  1157. {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_tool_arg_validation.py +0 -0
  1158. {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_tool_context.py +0 -0
  1159. {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_tool_eviction_room_scope.py +0 -0
  1160. {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_tool_policy.py +0 -0
  1161. {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_tool_protocol.py +0 -0
  1162. {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_tool_repeat_guard.py +0 -0
  1163. {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_tool_round_cap.py +0 -0
  1164. {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_tool_search_text.py +0 -0
  1165. {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_transport_auth.py +0 -0
  1166. {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_tts_elevenlabs.py +0 -0
  1167. {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_tts_gemini.py +0 -0
  1168. {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_tts_grok.py +0 -0
  1169. {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_tts_neutts.py +0 -0
  1170. {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_tts_qwen3.py +0 -0
  1171. {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_tts_text_split.py +0 -0
  1172. {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_turn_detection.py +0 -0
  1173. {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_twilio_ws_backend.py +0 -0
  1174. {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_unified_tool_call.py +0 -0
  1175. {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_vad_debug_logging.py +0 -0
  1176. {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_video.py +0 -0
  1177. {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_video_ai_integration.py +0 -0
  1178. {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_video_channel.py +0 -0
  1179. {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_video_local.py +0 -0
  1180. {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_video_pipeline.py +0 -0
  1181. {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_video_pipeline_config.py +0 -0
  1182. {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_video_recording.py +0 -0
  1183. {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_video_session_isolation.py +0 -0
  1184. {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_video_transform.py +0 -0
  1185. {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_vision_gemini.py +0 -0
  1186. {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_vision_openai.py +0 -0
  1187. {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_voice.py +0 -0
  1188. {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_voice_batch_stt.py +0 -0
  1189. {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_voice_binding_gate.py +0 -0
  1190. {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_voice_channel_aec.py +0 -0
  1191. {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_voice_delivery_idempotency.py +0 -0
  1192. {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_voice_delivery_recovery.py +0 -0
  1193. {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_voice_delivery_store.py +0 -0
  1194. {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_voice_dsp_vectorized.py +0 -0
  1195. {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_voice_fastrtc.py +0 -0
  1196. {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_voice_frame_limit.py +0 -0
  1197. {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_voice_inbound.py +0 -0
  1198. {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_voice_injection_results.py +0 -0
  1199. {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_voice_integration.py +0 -0
  1200. {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_voice_local.py +0 -0
  1201. {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_voice_map.py +0 -0
  1202. {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_voice_rtp.py +0 -0
  1203. {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_voice_say_play.py +0 -0
  1204. {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_voice_security.py +0 -0
  1205. {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_voice_session_lifecycle.py +0 -0
  1206. {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_voice_sherpa_onnx.py +0 -0
  1207. {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_voice_streaming_ai_tts.py +0 -0
  1208. {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_voice_streaming_stt.py +0 -0
  1209. {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_voice_stt_language.py +0 -0
  1210. {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_voice_webtransport.py +0 -0
  1211. {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_wake_word_backlog.py +0 -0
  1212. {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_wav_recorder.py +0 -0
  1213. {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_webrtc_offer_auth.py +0 -0
  1214. {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_websocket_lifecycle.py +0 -0
  1215. {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_websocket_room_scoping.py +0 -0
  1216. {roomkit-0.75.2 → roomkit-0.76.0}/tests/test_yolo_filter.py +0 -0
  1217. {roomkit-0.75.2 → roomkit-0.76.0}/tests/video/__init__.py +0 -0
  1218. {roomkit-0.75.2 → roomkit-0.76.0}/tests/video/test_av_channel_fastrtc.py +0 -0
  1219. {roomkit-0.75.2 → roomkit-0.76.0}/tests/video/test_fastrtc_video_backend.py +0 -0
  1220. {roomkit-0.75.2 → roomkit-0.76.0}/tests/video/test_overlay_filter.py +0 -0
  1221. {roomkit-0.75.2 → roomkit-0.76.0}/tests/video/test_overlay_image.py +0 -0
  1222. {roomkit-0.75.2 → roomkit-0.76.0}/tests/video/test_overlay_rich.py +0 -0
  1223. {roomkit-0.75.2 → roomkit-0.76.0}/tests/video/test_overlay_subtitle.py +0 -0
  1224. {roomkit-0.75.2 → roomkit-0.76.0}/tests/video/test_overlay_text.py +0 -0
  1225. {roomkit-0.75.2 → roomkit-0.76.0}/tests/video/test_screen_input.py +0 -0
  1226. {roomkit-0.75.2 → roomkit-0.76.0}/tests/video/test_screen_input_tools.py +0 -0
  1227. {roomkit-0.75.2 → roomkit-0.76.0}/tests/video/test_video_bridge.py +0 -0
  1228. {roomkit-0.75.2 → roomkit-0.76.0}/tests/video/test_video_effects.py +0 -0
  1229. {roomkit-0.75.2 → roomkit-0.76.0}/tests/video/test_watermark_filter.py +0 -0
  1230. {roomkit-0.75.2 → roomkit-0.76.0}/tests/video/test_websocket_avatar.py +0 -0
  1231. {roomkit-0.75.2 → roomkit-0.76.0}/tests/video/test_websocket_video_backend.py +0 -0
  1232. {roomkit-0.75.2 → roomkit-0.76.0}/tests/voice/__init__.py +0 -0
  1233. {roomkit-0.75.2 → roomkit-0.76.0}/tests/voice/backends/__init__.py +0 -0
  1234. {roomkit-0.75.2 → roomkit-0.76.0}/tests/voice/backends/test_rtp.py +0 -0
  1235. {roomkit-0.75.2 → roomkit-0.76.0}/tests/voice/backends/test_sip.py +0 -0
  1236. {roomkit-0.75.2 → roomkit-0.76.0}/tests/voice/backends/test_sip_coverage.py +0 -0
  1237. {roomkit-0.75.2 → roomkit-0.76.0}/tests/voice/backends/test_webtransport.py +0 -0
  1238. {roomkit-0.75.2 → roomkit-0.76.0}/tests/voice/pipeline/__init__.py +0 -0
  1239. {roomkit-0.75.2 → roomkit-0.76.0}/tests/voice/pipeline/stream_conformance.py +0 -0
  1240. {roomkit-0.75.2 → roomkit-0.76.0}/tests/voice/pipeline/test_aicoustics_denoiser.py +0 -0
  1241. {roomkit-0.75.2 → roomkit-0.76.0}/tests/voice/pipeline/test_offload_callbacks.py +0 -0
  1242. {roomkit-0.75.2 → roomkit-0.76.0}/tests/voice/pipeline/test_per_stream_regression.py +0 -0
  1243. {roomkit-0.75.2 → roomkit-0.76.0}/tests/voice/pipeline/test_rnnoise_denoiser.py +0 -0
  1244. {roomkit-0.75.2 → roomkit-0.76.0}/tests/voice/pipeline/test_sherpa_diarization.py +0 -0
  1245. {roomkit-0.75.2 → roomkit-0.76.0}/tests/voice/pipeline/test_simple_agc.py +0 -0
  1246. {roomkit-0.75.2 → roomkit-0.76.0}/tests/voice/pipeline/test_smart_turn.py +0 -0
  1247. {roomkit-0.75.2 → roomkit-0.76.0}/tests/voice/pipeline/test_speex_aec.py +0 -0
  1248. {roomkit-0.75.2 → roomkit-0.76.0}/tests/voice/pipeline/test_stream_conformance.py +0 -0
  1249. {roomkit-0.75.2 → roomkit-0.76.0}/tests/voice/pipeline/test_stream_entry_point.py +0 -0
  1250. {roomkit-0.75.2 → roomkit-0.76.0}/tests/voice/pipeline/test_webrtc_aec.py +0 -0
  1251. {roomkit-0.75.2 → roomkit-0.76.0}/tests/voice/pipeline/test_webrtc_denoiser.py +0 -0
  1252. {roomkit-0.75.2 → roomkit-0.76.0}/tests/voice/realtime/__init__.py +0 -0
  1253. {roomkit-0.75.2 → roomkit-0.76.0}/tests/voice/realtime/test_fastrtc_transport.py +0 -0
  1254. {roomkit-0.75.2 → roomkit-0.76.0}/tests/voice/realtime/test_realtime_bridge.py +0 -0
  1255. {roomkit-0.75.2 → roomkit-0.76.0}/tests/voice/realtime/test_ws_transport.py +0 -0
  1256. {roomkit-0.75.2 → roomkit-0.76.0}/tests/voice/stt/__init__.py +0 -0
  1257. {roomkit-0.75.2 → roomkit-0.76.0}/tests/voice/stt/test_deepgram.py +0 -0
  1258. {roomkit-0.75.2 → roomkit-0.76.0}/tests/voice/stt/test_deepgram_stream_language.py +0 -0
  1259. {roomkit-0.75.2 → roomkit-0.76.0}/tests/voice/stt/test_gradium_stt.py +0 -0
  1260. {roomkit-0.75.2 → roomkit-0.76.0}/tests/voice/stt/test_language_lock.py +0 -0
  1261. {roomkit-0.75.2 → roomkit-0.76.0}/tests/voice/stt/test_qwen3_asr.py +0 -0
  1262. {roomkit-0.75.2 → roomkit-0.76.0}/tests/voice/test_bridge.py +0 -0
  1263. {roomkit-0.75.2 → roomkit-0.76.0}/tests/voice/test_inbound_offload.py +0 -0
  1264. {roomkit-0.75.2 → roomkit-0.76.0}/tests/voice/test_testing_backend.py +0 -0
  1265. {roomkit-0.75.2 → roomkit-0.76.0}/tests/voice/test_testing_trace.py +0 -0
  1266. {roomkit-0.75.2 → roomkit-0.76.0}/tests/voice/test_testing_wav.py +0 -0
  1267. {roomkit-0.75.2 → roomkit-0.76.0}/tests/voice/test_tts_filters.py +0 -0
  1268. {roomkit-0.75.2 → roomkit-0.76.0}/tests/voice/test_voice_close_providers.py +0 -0
  1269. {roomkit-0.75.2 → roomkit-0.76.0}/tests/voice/test_voice_tts_filter.py +0 -0
  1270. {roomkit-0.75.2 → roomkit-0.76.0}/tests/voice/tts/__init__.py +0 -0
  1271. {roomkit-0.75.2 → roomkit-0.76.0}/tests/voice/tts/test_elevenlabs.py +0 -0
  1272. {roomkit-0.75.2 → roomkit-0.76.0}/tests/voice/tts/test_gradium_tts.py +0 -0
  1273. {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.75.2
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.0.0; extra == 'dev'
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.0.0; extra == 'gemini'
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.0.0; extra == 'providers'
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.0.0"]
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 ImageProvider, ImageResult, MockImageProvider
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, provider="GeminiImageProvider", api_key=config.api_key.get_secret_value()
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(f"n must be at least 1, got {n}")
94
- request = self._build_request(prompt, size, reference_images or [])
95
- # A task group rather than ``gather``: when one interaction fails the
96
- # siblings are cancelled instead of running to completion for a result
97
- # nobody will read. Each one is a billed image.
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
- async with asyncio.TaskGroup() as group:
100
- tasks = [group.create_task(self._create(request)) for _ in range(n)]
101
- except BaseExceptionGroup as failures:
102
- # The caller asked for images and gets the failure that stopped
103
- # them, not a group wrapper it would have to unpack to find the
104
- # ProviderError its retry policy reads. Re-chained to its own cause
105
- # so the SDK exception underneath survives the unwrapping.
106
- first = failures.exceptions[0]
107
- raise first from first.__cause__
108
- return [self._result(task.result()) for task in tasks]
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._geometry(size)
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 _geometry(size: str) -> tuple[str, str]:
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
- usage = getattr(interaction, "usage", None)
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
- ModelInfo(
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
- ModelInfo(
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
- ModelInfo(
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
- ModelInfo(
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(timeouts: HTTPTimeouts, *, provider: str, api_key: str) -> GenaiClient:
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(timeouts: HTTPTimeouts, provider: str, **client_kwargs: Any) -> GenaiClient:
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 typing import Any
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
- name = self.model_name
178
- for model in type(self).available_models():
179
- if model.id == name:
180
- return model
181
- return None
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(