ag2 0.10.2__py3-none-any.whl

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 (423) hide show
  1. ag2-0.10.2.dist-info/METADATA +819 -0
  2. ag2-0.10.2.dist-info/RECORD +423 -0
  3. ag2-0.10.2.dist-info/WHEEL +4 -0
  4. ag2-0.10.2.dist-info/licenses/LICENSE +201 -0
  5. ag2-0.10.2.dist-info/licenses/NOTICE.md +19 -0
  6. autogen/__init__.py +88 -0
  7. autogen/_website/__init__.py +3 -0
  8. autogen/_website/generate_api_references.py +426 -0
  9. autogen/_website/generate_mkdocs.py +1216 -0
  10. autogen/_website/notebook_processor.py +475 -0
  11. autogen/_website/process_notebooks.py +656 -0
  12. autogen/_website/utils.py +413 -0
  13. autogen/a2a/__init__.py +36 -0
  14. autogen/a2a/agent_executor.py +86 -0
  15. autogen/a2a/client.py +357 -0
  16. autogen/a2a/errors.py +18 -0
  17. autogen/a2a/httpx_client_factory.py +79 -0
  18. autogen/a2a/server.py +221 -0
  19. autogen/a2a/utils.py +207 -0
  20. autogen/agentchat/__init__.py +47 -0
  21. autogen/agentchat/agent.py +180 -0
  22. autogen/agentchat/assistant_agent.py +86 -0
  23. autogen/agentchat/chat.py +325 -0
  24. autogen/agentchat/contrib/__init__.py +5 -0
  25. autogen/agentchat/contrib/agent_eval/README.md +7 -0
  26. autogen/agentchat/contrib/agent_eval/agent_eval.py +108 -0
  27. autogen/agentchat/contrib/agent_eval/criterion.py +43 -0
  28. autogen/agentchat/contrib/agent_eval/critic_agent.py +44 -0
  29. autogen/agentchat/contrib/agent_eval/quantifier_agent.py +39 -0
  30. autogen/agentchat/contrib/agent_eval/subcritic_agent.py +45 -0
  31. autogen/agentchat/contrib/agent_eval/task.py +42 -0
  32. autogen/agentchat/contrib/agent_optimizer.py +432 -0
  33. autogen/agentchat/contrib/capabilities/__init__.py +5 -0
  34. autogen/agentchat/contrib/capabilities/agent_capability.py +20 -0
  35. autogen/agentchat/contrib/capabilities/generate_images.py +301 -0
  36. autogen/agentchat/contrib/capabilities/teachability.py +393 -0
  37. autogen/agentchat/contrib/capabilities/text_compressors.py +66 -0
  38. autogen/agentchat/contrib/capabilities/tools_capability.py +22 -0
  39. autogen/agentchat/contrib/capabilities/transform_messages.py +93 -0
  40. autogen/agentchat/contrib/capabilities/transforms.py +578 -0
  41. autogen/agentchat/contrib/capabilities/transforms_util.py +122 -0
  42. autogen/agentchat/contrib/capabilities/vision_capability.py +215 -0
  43. autogen/agentchat/contrib/captainagent/__init__.py +9 -0
  44. autogen/agentchat/contrib/captainagent/agent_builder.py +790 -0
  45. autogen/agentchat/contrib/captainagent/captainagent.py +514 -0
  46. autogen/agentchat/contrib/captainagent/tool_retriever.py +334 -0
  47. autogen/agentchat/contrib/captainagent/tools/README.md +44 -0
  48. autogen/agentchat/contrib/captainagent/tools/__init__.py +5 -0
  49. autogen/agentchat/contrib/captainagent/tools/data_analysis/calculate_correlation.py +40 -0
  50. autogen/agentchat/contrib/captainagent/tools/data_analysis/calculate_skewness_and_kurtosis.py +28 -0
  51. autogen/agentchat/contrib/captainagent/tools/data_analysis/detect_outlier_iqr.py +28 -0
  52. autogen/agentchat/contrib/captainagent/tools/data_analysis/detect_outlier_zscore.py +28 -0
  53. autogen/agentchat/contrib/captainagent/tools/data_analysis/explore_csv.py +21 -0
  54. autogen/agentchat/contrib/captainagent/tools/data_analysis/shapiro_wilk_test.py +30 -0
  55. autogen/agentchat/contrib/captainagent/tools/information_retrieval/arxiv_download.py +27 -0
  56. autogen/agentchat/contrib/captainagent/tools/information_retrieval/arxiv_search.py +53 -0
  57. autogen/agentchat/contrib/captainagent/tools/information_retrieval/extract_pdf_image.py +53 -0
  58. autogen/agentchat/contrib/captainagent/tools/information_retrieval/extract_pdf_text.py +38 -0
  59. autogen/agentchat/contrib/captainagent/tools/information_retrieval/get_wikipedia_text.py +21 -0
  60. autogen/agentchat/contrib/captainagent/tools/information_retrieval/get_youtube_caption.py +34 -0
  61. autogen/agentchat/contrib/captainagent/tools/information_retrieval/image_qa.py +60 -0
  62. autogen/agentchat/contrib/captainagent/tools/information_retrieval/optical_character_recognition.py +61 -0
  63. autogen/agentchat/contrib/captainagent/tools/information_retrieval/perform_web_search.py +47 -0
  64. autogen/agentchat/contrib/captainagent/tools/information_retrieval/scrape_wikipedia_tables.py +33 -0
  65. autogen/agentchat/contrib/captainagent/tools/information_retrieval/transcribe_audio_file.py +21 -0
  66. autogen/agentchat/contrib/captainagent/tools/information_retrieval/youtube_download.py +35 -0
  67. autogen/agentchat/contrib/captainagent/tools/math/calculate_circle_area_from_diameter.py +21 -0
  68. autogen/agentchat/contrib/captainagent/tools/math/calculate_day_of_the_week.py +18 -0
  69. autogen/agentchat/contrib/captainagent/tools/math/calculate_fraction_sum.py +28 -0
  70. autogen/agentchat/contrib/captainagent/tools/math/calculate_matrix_power.py +31 -0
  71. autogen/agentchat/contrib/captainagent/tools/math/calculate_reflected_point.py +16 -0
  72. autogen/agentchat/contrib/captainagent/tools/math/complex_numbers_product.py +25 -0
  73. autogen/agentchat/contrib/captainagent/tools/math/compute_currency_conversion.py +23 -0
  74. autogen/agentchat/contrib/captainagent/tools/math/count_distinct_permutations.py +27 -0
  75. autogen/agentchat/contrib/captainagent/tools/math/evaluate_expression.py +28 -0
  76. autogen/agentchat/contrib/captainagent/tools/math/find_continuity_point.py +34 -0
  77. autogen/agentchat/contrib/captainagent/tools/math/fraction_to_mixed_numbers.py +39 -0
  78. autogen/agentchat/contrib/captainagent/tools/math/modular_inverse_sum.py +23 -0
  79. autogen/agentchat/contrib/captainagent/tools/math/simplify_mixed_numbers.py +36 -0
  80. autogen/agentchat/contrib/captainagent/tools/math/sum_of_digit_factorials.py +15 -0
  81. autogen/agentchat/contrib/captainagent/tools/math/sum_of_primes_below.py +15 -0
  82. autogen/agentchat/contrib/captainagent/tools/requirements.txt +10 -0
  83. autogen/agentchat/contrib/captainagent/tools/tool_description.tsv +34 -0
  84. autogen/agentchat/contrib/gpt_assistant_agent.py +526 -0
  85. autogen/agentchat/contrib/graph_rag/__init__.py +9 -0
  86. autogen/agentchat/contrib/graph_rag/document.py +29 -0
  87. autogen/agentchat/contrib/graph_rag/falkor_graph_query_engine.py +167 -0
  88. autogen/agentchat/contrib/graph_rag/falkor_graph_rag_capability.py +103 -0
  89. autogen/agentchat/contrib/graph_rag/graph_query_engine.py +53 -0
  90. autogen/agentchat/contrib/graph_rag/graph_rag_capability.py +63 -0
  91. autogen/agentchat/contrib/graph_rag/neo4j_graph_query_engine.py +263 -0
  92. autogen/agentchat/contrib/graph_rag/neo4j_graph_rag_capability.py +83 -0
  93. autogen/agentchat/contrib/graph_rag/neo4j_native_graph_query_engine.py +210 -0
  94. autogen/agentchat/contrib/graph_rag/neo4j_native_graph_rag_capability.py +93 -0
  95. autogen/agentchat/contrib/img_utils.py +397 -0
  96. autogen/agentchat/contrib/llamaindex_conversable_agent.py +117 -0
  97. autogen/agentchat/contrib/llava_agent.py +189 -0
  98. autogen/agentchat/contrib/math_user_proxy_agent.py +464 -0
  99. autogen/agentchat/contrib/multimodal_conversable_agent.py +125 -0
  100. autogen/agentchat/contrib/qdrant_retrieve_user_proxy_agent.py +325 -0
  101. autogen/agentchat/contrib/rag/__init__.py +10 -0
  102. autogen/agentchat/contrib/rag/chromadb_query_engine.py +268 -0
  103. autogen/agentchat/contrib/rag/llamaindex_query_engine.py +195 -0
  104. autogen/agentchat/contrib/rag/mongodb_query_engine.py +319 -0
  105. autogen/agentchat/contrib/rag/query_engine.py +76 -0
  106. autogen/agentchat/contrib/retrieve_assistant_agent.py +59 -0
  107. autogen/agentchat/contrib/retrieve_user_proxy_agent.py +704 -0
  108. autogen/agentchat/contrib/society_of_mind_agent.py +200 -0
  109. autogen/agentchat/contrib/swarm_agent.py +1404 -0
  110. autogen/agentchat/contrib/text_analyzer_agent.py +79 -0
  111. autogen/agentchat/contrib/vectordb/__init__.py +5 -0
  112. autogen/agentchat/contrib/vectordb/base.py +224 -0
  113. autogen/agentchat/contrib/vectordb/chromadb.py +316 -0
  114. autogen/agentchat/contrib/vectordb/couchbase.py +405 -0
  115. autogen/agentchat/contrib/vectordb/mongodb.py +551 -0
  116. autogen/agentchat/contrib/vectordb/pgvectordb.py +927 -0
  117. autogen/agentchat/contrib/vectordb/qdrant.py +320 -0
  118. autogen/agentchat/contrib/vectordb/utils.py +126 -0
  119. autogen/agentchat/contrib/web_surfer.py +304 -0
  120. autogen/agentchat/conversable_agent.py +4307 -0
  121. autogen/agentchat/group/__init__.py +67 -0
  122. autogen/agentchat/group/available_condition.py +91 -0
  123. autogen/agentchat/group/context_condition.py +77 -0
  124. autogen/agentchat/group/context_expression.py +238 -0
  125. autogen/agentchat/group/context_str.py +39 -0
  126. autogen/agentchat/group/context_variables.py +182 -0
  127. autogen/agentchat/group/events/transition_events.py +111 -0
  128. autogen/agentchat/group/group_tool_executor.py +324 -0
  129. autogen/agentchat/group/group_utils.py +659 -0
  130. autogen/agentchat/group/guardrails.py +179 -0
  131. autogen/agentchat/group/handoffs.py +303 -0
  132. autogen/agentchat/group/llm_condition.py +93 -0
  133. autogen/agentchat/group/multi_agent_chat.py +291 -0
  134. autogen/agentchat/group/on_condition.py +55 -0
  135. autogen/agentchat/group/on_context_condition.py +51 -0
  136. autogen/agentchat/group/patterns/__init__.py +18 -0
  137. autogen/agentchat/group/patterns/auto.py +160 -0
  138. autogen/agentchat/group/patterns/manual.py +177 -0
  139. autogen/agentchat/group/patterns/pattern.py +295 -0
  140. autogen/agentchat/group/patterns/random.py +106 -0
  141. autogen/agentchat/group/patterns/round_robin.py +117 -0
  142. autogen/agentchat/group/reply_result.py +24 -0
  143. autogen/agentchat/group/safeguards/__init__.py +21 -0
  144. autogen/agentchat/group/safeguards/api.py +241 -0
  145. autogen/agentchat/group/safeguards/enforcer.py +1158 -0
  146. autogen/agentchat/group/safeguards/events.py +140 -0
  147. autogen/agentchat/group/safeguards/validator.py +435 -0
  148. autogen/agentchat/group/speaker_selection_result.py +41 -0
  149. autogen/agentchat/group/targets/__init__.py +4 -0
  150. autogen/agentchat/group/targets/function_target.py +245 -0
  151. autogen/agentchat/group/targets/group_chat_target.py +133 -0
  152. autogen/agentchat/group/targets/group_manager_target.py +151 -0
  153. autogen/agentchat/group/targets/transition_target.py +424 -0
  154. autogen/agentchat/group/targets/transition_utils.py +6 -0
  155. autogen/agentchat/groupchat.py +1832 -0
  156. autogen/agentchat/realtime/__init__.py +3 -0
  157. autogen/agentchat/realtime/experimental/__init__.py +20 -0
  158. autogen/agentchat/realtime/experimental/audio_adapters/__init__.py +8 -0
  159. autogen/agentchat/realtime/experimental/audio_adapters/twilio_audio_adapter.py +148 -0
  160. autogen/agentchat/realtime/experimental/audio_adapters/websocket_audio_adapter.py +139 -0
  161. autogen/agentchat/realtime/experimental/audio_observer.py +42 -0
  162. autogen/agentchat/realtime/experimental/clients/__init__.py +15 -0
  163. autogen/agentchat/realtime/experimental/clients/gemini/__init__.py +7 -0
  164. autogen/agentchat/realtime/experimental/clients/gemini/client.py +274 -0
  165. autogen/agentchat/realtime/experimental/clients/oai/__init__.py +8 -0
  166. autogen/agentchat/realtime/experimental/clients/oai/base_client.py +220 -0
  167. autogen/agentchat/realtime/experimental/clients/oai/rtc_client.py +243 -0
  168. autogen/agentchat/realtime/experimental/clients/oai/utils.py +48 -0
  169. autogen/agentchat/realtime/experimental/clients/realtime_client.py +191 -0
  170. autogen/agentchat/realtime/experimental/function_observer.py +84 -0
  171. autogen/agentchat/realtime/experimental/realtime_agent.py +158 -0
  172. autogen/agentchat/realtime/experimental/realtime_events.py +42 -0
  173. autogen/agentchat/realtime/experimental/realtime_observer.py +100 -0
  174. autogen/agentchat/realtime/experimental/realtime_swarm.py +533 -0
  175. autogen/agentchat/realtime/experimental/websockets.py +21 -0
  176. autogen/agentchat/realtime_agent/__init__.py +21 -0
  177. autogen/agentchat/user_proxy_agent.py +114 -0
  178. autogen/agentchat/utils.py +206 -0
  179. autogen/agents/__init__.py +3 -0
  180. autogen/agents/contrib/__init__.py +10 -0
  181. autogen/agents/contrib/time/__init__.py +8 -0
  182. autogen/agents/contrib/time/time_reply_agent.py +74 -0
  183. autogen/agents/contrib/time/time_tool_agent.py +52 -0
  184. autogen/agents/experimental/__init__.py +27 -0
  185. autogen/agents/experimental/deep_research/__init__.py +7 -0
  186. autogen/agents/experimental/deep_research/deep_research.py +52 -0
  187. autogen/agents/experimental/discord/__init__.py +7 -0
  188. autogen/agents/experimental/discord/discord.py +66 -0
  189. autogen/agents/experimental/document_agent/__init__.py +19 -0
  190. autogen/agents/experimental/document_agent/chroma_query_engine.py +301 -0
  191. autogen/agents/experimental/document_agent/docling_doc_ingest_agent.py +113 -0
  192. autogen/agents/experimental/document_agent/document_agent.py +643 -0
  193. autogen/agents/experimental/document_agent/document_conditions.py +50 -0
  194. autogen/agents/experimental/document_agent/document_utils.py +376 -0
  195. autogen/agents/experimental/document_agent/inmemory_query_engine.py +214 -0
  196. autogen/agents/experimental/document_agent/parser_utils.py +134 -0
  197. autogen/agents/experimental/document_agent/url_utils.py +417 -0
  198. autogen/agents/experimental/reasoning/__init__.py +7 -0
  199. autogen/agents/experimental/reasoning/reasoning_agent.py +1178 -0
  200. autogen/agents/experimental/slack/__init__.py +7 -0
  201. autogen/agents/experimental/slack/slack.py +73 -0
  202. autogen/agents/experimental/telegram/__init__.py +7 -0
  203. autogen/agents/experimental/telegram/telegram.py +76 -0
  204. autogen/agents/experimental/websurfer/__init__.py +7 -0
  205. autogen/agents/experimental/websurfer/websurfer.py +70 -0
  206. autogen/agents/experimental/wikipedia/__init__.py +7 -0
  207. autogen/agents/experimental/wikipedia/wikipedia.py +88 -0
  208. autogen/browser_utils.py +309 -0
  209. autogen/cache/__init__.py +10 -0
  210. autogen/cache/abstract_cache_base.py +71 -0
  211. autogen/cache/cache.py +203 -0
  212. autogen/cache/cache_factory.py +88 -0
  213. autogen/cache/cosmos_db_cache.py +144 -0
  214. autogen/cache/disk_cache.py +97 -0
  215. autogen/cache/in_memory_cache.py +54 -0
  216. autogen/cache/redis_cache.py +119 -0
  217. autogen/code_utils.py +598 -0
  218. autogen/coding/__init__.py +30 -0
  219. autogen/coding/base.py +120 -0
  220. autogen/coding/docker_commandline_code_executor.py +283 -0
  221. autogen/coding/factory.py +56 -0
  222. autogen/coding/func_with_reqs.py +203 -0
  223. autogen/coding/jupyter/__init__.py +23 -0
  224. autogen/coding/jupyter/base.py +36 -0
  225. autogen/coding/jupyter/docker_jupyter_server.py +160 -0
  226. autogen/coding/jupyter/embedded_ipython_code_executor.py +182 -0
  227. autogen/coding/jupyter/import_utils.py +82 -0
  228. autogen/coding/jupyter/jupyter_client.py +224 -0
  229. autogen/coding/jupyter/jupyter_code_executor.py +154 -0
  230. autogen/coding/jupyter/local_jupyter_server.py +164 -0
  231. autogen/coding/local_commandline_code_executor.py +341 -0
  232. autogen/coding/markdown_code_extractor.py +44 -0
  233. autogen/coding/utils.py +55 -0
  234. autogen/coding/yepcode_code_executor.py +197 -0
  235. autogen/doc_utils.py +35 -0
  236. autogen/environments/__init__.py +10 -0
  237. autogen/environments/docker_python_environment.py +365 -0
  238. autogen/environments/python_environment.py +125 -0
  239. autogen/environments/system_python_environment.py +85 -0
  240. autogen/environments/venv_python_environment.py +220 -0
  241. autogen/environments/working_directory.py +74 -0
  242. autogen/events/__init__.py +7 -0
  243. autogen/events/agent_events.py +1016 -0
  244. autogen/events/base_event.py +100 -0
  245. autogen/events/client_events.py +168 -0
  246. autogen/events/helpers.py +44 -0
  247. autogen/events/print_event.py +45 -0
  248. autogen/exception_utils.py +73 -0
  249. autogen/extensions/__init__.py +5 -0
  250. autogen/fast_depends/__init__.py +16 -0
  251. autogen/fast_depends/_compat.py +75 -0
  252. autogen/fast_depends/core/__init__.py +14 -0
  253. autogen/fast_depends/core/build.py +206 -0
  254. autogen/fast_depends/core/model.py +527 -0
  255. autogen/fast_depends/dependencies/__init__.py +15 -0
  256. autogen/fast_depends/dependencies/model.py +30 -0
  257. autogen/fast_depends/dependencies/provider.py +40 -0
  258. autogen/fast_depends/library/__init__.py +10 -0
  259. autogen/fast_depends/library/model.py +46 -0
  260. autogen/fast_depends/py.typed +6 -0
  261. autogen/fast_depends/schema.py +66 -0
  262. autogen/fast_depends/use.py +272 -0
  263. autogen/fast_depends/utils.py +177 -0
  264. autogen/formatting_utils.py +83 -0
  265. autogen/function_utils.py +13 -0
  266. autogen/graph_utils.py +173 -0
  267. autogen/import_utils.py +539 -0
  268. autogen/interop/__init__.py +22 -0
  269. autogen/interop/crewai/__init__.py +7 -0
  270. autogen/interop/crewai/crewai.py +88 -0
  271. autogen/interop/interoperability.py +71 -0
  272. autogen/interop/interoperable.py +46 -0
  273. autogen/interop/langchain/__init__.py +8 -0
  274. autogen/interop/langchain/langchain_chat_model_factory.py +156 -0
  275. autogen/interop/langchain/langchain_tool.py +78 -0
  276. autogen/interop/litellm/__init__.py +7 -0
  277. autogen/interop/litellm/litellm_config_factory.py +178 -0
  278. autogen/interop/pydantic_ai/__init__.py +7 -0
  279. autogen/interop/pydantic_ai/pydantic_ai.py +172 -0
  280. autogen/interop/registry.py +70 -0
  281. autogen/io/__init__.py +15 -0
  282. autogen/io/base.py +151 -0
  283. autogen/io/console.py +56 -0
  284. autogen/io/processors/__init__.py +12 -0
  285. autogen/io/processors/base.py +21 -0
  286. autogen/io/processors/console_event_processor.py +61 -0
  287. autogen/io/run_response.py +294 -0
  288. autogen/io/thread_io_stream.py +63 -0
  289. autogen/io/websockets.py +214 -0
  290. autogen/json_utils.py +42 -0
  291. autogen/llm_clients/MIGRATION_TO_V2.md +782 -0
  292. autogen/llm_clients/__init__.py +77 -0
  293. autogen/llm_clients/client_v2.py +122 -0
  294. autogen/llm_clients/models/__init__.py +55 -0
  295. autogen/llm_clients/models/content_blocks.py +389 -0
  296. autogen/llm_clients/models/unified_message.py +145 -0
  297. autogen/llm_clients/models/unified_response.py +83 -0
  298. autogen/llm_clients/openai_completions_client.py +444 -0
  299. autogen/llm_config/__init__.py +11 -0
  300. autogen/llm_config/client.py +59 -0
  301. autogen/llm_config/config.py +461 -0
  302. autogen/llm_config/entry.py +169 -0
  303. autogen/llm_config/types.py +37 -0
  304. autogen/llm_config/utils.py +223 -0
  305. autogen/logger/__init__.py +11 -0
  306. autogen/logger/base_logger.py +129 -0
  307. autogen/logger/file_logger.py +262 -0
  308. autogen/logger/logger_factory.py +42 -0
  309. autogen/logger/logger_utils.py +57 -0
  310. autogen/logger/sqlite_logger.py +524 -0
  311. autogen/math_utils.py +338 -0
  312. autogen/mcp/__init__.py +7 -0
  313. autogen/mcp/__main__.py +78 -0
  314. autogen/mcp/helpers.py +45 -0
  315. autogen/mcp/mcp_client.py +349 -0
  316. autogen/mcp/mcp_proxy/__init__.py +19 -0
  317. autogen/mcp/mcp_proxy/fastapi_code_generator_helpers.py +62 -0
  318. autogen/mcp/mcp_proxy/mcp_proxy.py +577 -0
  319. autogen/mcp/mcp_proxy/operation_grouping.py +166 -0
  320. autogen/mcp/mcp_proxy/operation_renaming.py +110 -0
  321. autogen/mcp/mcp_proxy/patch_fastapi_code_generator.py +98 -0
  322. autogen/mcp/mcp_proxy/security.py +399 -0
  323. autogen/mcp/mcp_proxy/security_schema_visitor.py +37 -0
  324. autogen/messages/__init__.py +7 -0
  325. autogen/messages/agent_messages.py +946 -0
  326. autogen/messages/base_message.py +108 -0
  327. autogen/messages/client_messages.py +172 -0
  328. autogen/messages/print_message.py +48 -0
  329. autogen/oai/__init__.py +61 -0
  330. autogen/oai/anthropic.py +1516 -0
  331. autogen/oai/bedrock.py +800 -0
  332. autogen/oai/cerebras.py +302 -0
  333. autogen/oai/client.py +1658 -0
  334. autogen/oai/client_utils.py +196 -0
  335. autogen/oai/cohere.py +494 -0
  336. autogen/oai/gemini.py +1045 -0
  337. autogen/oai/gemini_types.py +156 -0
  338. autogen/oai/groq.py +319 -0
  339. autogen/oai/mistral.py +311 -0
  340. autogen/oai/oai_models/__init__.py +23 -0
  341. autogen/oai/oai_models/_models.py +16 -0
  342. autogen/oai/oai_models/chat_completion.py +86 -0
  343. autogen/oai/oai_models/chat_completion_audio.py +32 -0
  344. autogen/oai/oai_models/chat_completion_message.py +97 -0
  345. autogen/oai/oai_models/chat_completion_message_tool_call.py +60 -0
  346. autogen/oai/oai_models/chat_completion_token_logprob.py +62 -0
  347. autogen/oai/oai_models/completion_usage.py +59 -0
  348. autogen/oai/ollama.py +657 -0
  349. autogen/oai/openai_responses.py +451 -0
  350. autogen/oai/openai_utils.py +897 -0
  351. autogen/oai/together.py +387 -0
  352. autogen/remote/__init__.py +18 -0
  353. autogen/remote/agent.py +199 -0
  354. autogen/remote/agent_service.py +197 -0
  355. autogen/remote/errors.py +17 -0
  356. autogen/remote/httpx_client_factory.py +131 -0
  357. autogen/remote/protocol.py +37 -0
  358. autogen/remote/retry.py +102 -0
  359. autogen/remote/runtime.py +96 -0
  360. autogen/retrieve_utils.py +490 -0
  361. autogen/runtime_logging.py +161 -0
  362. autogen/testing/__init__.py +12 -0
  363. autogen/testing/messages.py +45 -0
  364. autogen/testing/test_agent.py +111 -0
  365. autogen/token_count_utils.py +280 -0
  366. autogen/tools/__init__.py +20 -0
  367. autogen/tools/contrib/__init__.py +9 -0
  368. autogen/tools/contrib/time/__init__.py +7 -0
  369. autogen/tools/contrib/time/time.py +40 -0
  370. autogen/tools/dependency_injection.py +249 -0
  371. autogen/tools/experimental/__init__.py +54 -0
  372. autogen/tools/experimental/browser_use/__init__.py +7 -0
  373. autogen/tools/experimental/browser_use/browser_use.py +154 -0
  374. autogen/tools/experimental/code_execution/__init__.py +7 -0
  375. autogen/tools/experimental/code_execution/python_code_execution.py +86 -0
  376. autogen/tools/experimental/crawl4ai/__init__.py +7 -0
  377. autogen/tools/experimental/crawl4ai/crawl4ai.py +150 -0
  378. autogen/tools/experimental/deep_research/__init__.py +7 -0
  379. autogen/tools/experimental/deep_research/deep_research.py +329 -0
  380. autogen/tools/experimental/duckduckgo/__init__.py +7 -0
  381. autogen/tools/experimental/duckduckgo/duckduckgo_search.py +103 -0
  382. autogen/tools/experimental/firecrawl/__init__.py +7 -0
  383. autogen/tools/experimental/firecrawl/firecrawl_tool.py +836 -0
  384. autogen/tools/experimental/google/__init__.py +14 -0
  385. autogen/tools/experimental/google/authentication/__init__.py +11 -0
  386. autogen/tools/experimental/google/authentication/credentials_hosted_provider.py +43 -0
  387. autogen/tools/experimental/google/authentication/credentials_local_provider.py +91 -0
  388. autogen/tools/experimental/google/authentication/credentials_provider.py +35 -0
  389. autogen/tools/experimental/google/drive/__init__.py +9 -0
  390. autogen/tools/experimental/google/drive/drive_functions.py +124 -0
  391. autogen/tools/experimental/google/drive/toolkit.py +88 -0
  392. autogen/tools/experimental/google/model.py +17 -0
  393. autogen/tools/experimental/google/toolkit_protocol.py +19 -0
  394. autogen/tools/experimental/google_search/__init__.py +8 -0
  395. autogen/tools/experimental/google_search/google_search.py +93 -0
  396. autogen/tools/experimental/google_search/youtube_search.py +181 -0
  397. autogen/tools/experimental/messageplatform/__init__.py +17 -0
  398. autogen/tools/experimental/messageplatform/discord/__init__.py +7 -0
  399. autogen/tools/experimental/messageplatform/discord/discord.py +284 -0
  400. autogen/tools/experimental/messageplatform/slack/__init__.py +7 -0
  401. autogen/tools/experimental/messageplatform/slack/slack.py +385 -0
  402. autogen/tools/experimental/messageplatform/telegram/__init__.py +7 -0
  403. autogen/tools/experimental/messageplatform/telegram/telegram.py +271 -0
  404. autogen/tools/experimental/perplexity/__init__.py +7 -0
  405. autogen/tools/experimental/perplexity/perplexity_search.py +249 -0
  406. autogen/tools/experimental/reliable/__init__.py +10 -0
  407. autogen/tools/experimental/reliable/reliable.py +1311 -0
  408. autogen/tools/experimental/searxng/__init__.py +7 -0
  409. autogen/tools/experimental/searxng/searxng_search.py +142 -0
  410. autogen/tools/experimental/tavily/__init__.py +7 -0
  411. autogen/tools/experimental/tavily/tavily_search.py +176 -0
  412. autogen/tools/experimental/web_search_preview/__init__.py +7 -0
  413. autogen/tools/experimental/web_search_preview/web_search_preview.py +120 -0
  414. autogen/tools/experimental/wikipedia/__init__.py +7 -0
  415. autogen/tools/experimental/wikipedia/wikipedia.py +284 -0
  416. autogen/tools/function_utils.py +412 -0
  417. autogen/tools/tool.py +188 -0
  418. autogen/tools/toolkit.py +86 -0
  419. autogen/types.py +29 -0
  420. autogen/version.py +7 -0
  421. templates/client_template/main.jinja2 +72 -0
  422. templates/config_template/config.jinja2 +7 -0
  423. templates/main.jinja2 +61 -0
@@ -0,0 +1,191 @@
1
+ # Copyright (c) 2023 - 2025, AG2ai, Inc., AG2ai open-source projects maintainers and core contributors
2
+ #
3
+ # SPDX-License-Identifier: Apache-2.0
4
+
5
+ import asyncio
6
+ from collections.abc import AsyncGenerator, Callable
7
+ from contextlib import AbstractAsyncContextManager
8
+ from logging import Logger
9
+ from typing import Any, Literal, Protocol, TypeVar, runtime_checkable
10
+
11
+ from anyio import create_task_group
12
+
13
+ from .....doc_utils import export_module
14
+ from .....llm_config import LLMConfig
15
+ from ..realtime_events import InputAudioBufferDelta, RealtimeEvent
16
+
17
+ __all__ = ["RealtimeClientProtocol", "Role", "get_client", "register_realtime_client"]
18
+
19
+ # define role literal type for typing
20
+ Role = Literal["user", "assistant", "system"]
21
+
22
+
23
+ @runtime_checkable
24
+ @export_module("autogen.agentchat.realtime.experimental.clients")
25
+ class RealtimeClientProtocol(Protocol):
26
+ async def send_function_result(self, call_id: str, result: str) -> None:
27
+ """Send the result of a function call to a Realtime API.
28
+
29
+ Args:
30
+ call_id (str): The ID of the function call.
31
+ result (str): The result of the function call.
32
+ """
33
+ ...
34
+
35
+ async def send_text(self, *, role: Role, text: str) -> None:
36
+ """Send a text message to a Realtime API.
37
+
38
+ Args:
39
+ role (str): The role of the message.
40
+ text (str): The text of the message.
41
+ """
42
+ ...
43
+
44
+ async def send_audio(self, audio: str) -> None:
45
+ """Send audio to a Realtime API.
46
+
47
+ Args:
48
+ audio (str): The audio to send.
49
+ """
50
+ ...
51
+
52
+ async def truncate_audio(self, audio_end_ms: int, content_index: int, item_id: str) -> None:
53
+ """Truncate audio in a Realtime API.
54
+
55
+ Args:
56
+ audio_end_ms (int): The end of the audio to truncate.
57
+ content_index (int): The index of the content to truncate.
58
+ item_id (str): The ID of the item to truncate.
59
+ """
60
+ ...
61
+
62
+ async def session_update(self, session_options: dict[str, Any]) -> None:
63
+ """Send a session update to a Realtime API.
64
+
65
+ Args:
66
+ session_options (dict[str, Any]): The session options to update.
67
+ """
68
+ ...
69
+
70
+ def connect(self) -> AbstractAsyncContextManager[None]: ...
71
+
72
+ def read_events(self) -> AsyncGenerator[RealtimeEvent, None]:
73
+ """Read events from a Realtime Client."""
74
+ ...
75
+
76
+ async def _read_from_connection(self) -> AsyncGenerator[RealtimeEvent, None]:
77
+ """Read events from a Realtime connection."""
78
+ ...
79
+
80
+ def _parse_message(self, message: dict[str, Any]) -> list[RealtimeEvent]:
81
+ """Parse a message from a Realtime API.
82
+
83
+ Args:
84
+ message (dict[str, Any]): The message to parse.
85
+
86
+ Returns:
87
+ list[RealtimeEvent]: The parsed events.
88
+ """
89
+ ...
90
+
91
+ @classmethod
92
+ def get_factory(
93
+ cls, llm_config: LLMConfig | dict[str, Any], logger: Logger, **kwargs: Any
94
+ ) -> Callable[[], "RealtimeClientProtocol"] | None:
95
+ """Create a Realtime API client.
96
+
97
+ Args:
98
+ llm_config: The config for the client.
99
+ logger: The logger to use for logging events.
100
+ **kwargs: Additional arguments.
101
+
102
+ Returns:
103
+ RealtimeClientProtocol: The Realtime API client is returned if the model matches the pattern
104
+ """
105
+ ...
106
+
107
+
108
+ class RealtimeClientBase:
109
+ def __init__(self):
110
+ self._eventQueue = asyncio.Queue()
111
+
112
+ async def add_event(self, event: RealtimeEvent | None):
113
+ await self._eventQueue.put(event)
114
+
115
+ async def get_event(self) -> RealtimeEvent | None:
116
+ return await self._eventQueue.get()
117
+
118
+ async def _read_from_connection_task(self):
119
+ async for event in self._read_from_connection():
120
+ await self.add_event(event)
121
+ await self.add_event(None)
122
+
123
+ async def _read_events(self) -> AsyncGenerator[RealtimeEvent, None]:
124
+ """Read events from a Realtime Client."""
125
+ async with create_task_group() as tg:
126
+ tg.start_soon(self._read_from_connection_task)
127
+ while True:
128
+ try:
129
+ event = await self._eventQueue.get()
130
+ if event is not None:
131
+ yield event
132
+ else:
133
+ break
134
+ except Exception:
135
+ break
136
+
137
+ async def queue_input_audio_buffer_delta(self, audio: str) -> None:
138
+ """Queue InputAudioBufferDelta.
139
+
140
+ Args:
141
+ audio (str): The audio.
142
+ """
143
+ await self.add_event(InputAudioBufferDelta(delta=audio, item_id=None, raw_message={}))
144
+
145
+
146
+ _realtime_client_classes: dict[str, type[RealtimeClientProtocol]] = {}
147
+
148
+ T = TypeVar("T", bound=RealtimeClientProtocol)
149
+
150
+
151
+ def register_realtime_client() -> Callable[[type[T]], type[T]]:
152
+ """Register a Realtime API client.
153
+
154
+ Returns:
155
+ Callable[[type[T]], type[T]]: The decorator to register the Realtime API client
156
+ """
157
+
158
+ def decorator(client_cls: type[T]) -> type[T]:
159
+ """Register a Realtime API client.
160
+
161
+ Args:
162
+ client_cls: The client to register.
163
+ """
164
+ global _realtime_client_classes
165
+ fqn = f"{client_cls.__module__}.{client_cls.__name__}"
166
+ _realtime_client_classes[fqn] = client_cls
167
+
168
+ return client_cls
169
+
170
+ return decorator
171
+
172
+
173
+ @export_module("autogen.agentchat.realtime.experimental.clients")
174
+ def get_client(llm_config: LLMConfig | dict[str, Any], logger: Logger, **kwargs: Any) -> "RealtimeClientProtocol":
175
+ """Get a registered Realtime API client.
176
+
177
+ Args:
178
+ llm_config: The config for the client.
179
+ logger: The logger to use for logging events.
180
+ **kwargs: Additional arguments.
181
+
182
+ Returns:
183
+ RealtimeClientProtocol: The Realtime API client.
184
+ """
185
+ global _realtime_client_classes
186
+ for _, client_cls in _realtime_client_classes.items():
187
+ factory = client_cls.get_factory(llm_config=llm_config, logger=logger, **kwargs)
188
+ if factory:
189
+ return factory()
190
+
191
+ raise ValueError("Realtime API client not found.")
@@ -0,0 +1,84 @@
1
+ # Copyright (c) 2023 - 2025, AG2ai, Inc., AG2ai open-source projects maintainers and core contributors
2
+ #
3
+ # SPDX-License-Identifier: Apache-2.0
4
+
5
+ import json
6
+ from typing import TYPE_CHECKING, Any, Optional
7
+
8
+ from pydantic import BaseModel
9
+
10
+ from ....doc_utils import export_module
11
+ from ....fast_depends.utils import asyncify
12
+ from .realtime_events import FunctionCall, RealtimeEvent
13
+ from .realtime_observer import RealtimeObserver
14
+
15
+ if TYPE_CHECKING:
16
+ from logging import Logger
17
+
18
+
19
+ @export_module("autogen.agentchat.realtime.experimental")
20
+ class FunctionObserver(RealtimeObserver):
21
+ """Observer for handling function calls from the OpenAI Realtime API."""
22
+
23
+ def __init__(self, *, logger: Optional["Logger"] = None) -> None:
24
+ """Observer for handling function calls from the OpenAI Realtime API."""
25
+ super().__init__(logger=logger)
26
+
27
+ async def on_event(self, event: RealtimeEvent) -> None:
28
+ """Handle function call events from the OpenAI Realtime API.
29
+
30
+ Args:
31
+ event (dict[str, Any]): The event from the OpenAI Realtime API.
32
+ """
33
+ if isinstance(event, FunctionCall):
34
+ self.logger.info("Received function call event")
35
+ await self.call_function(
36
+ call_id=event.call_id,
37
+ name=event.name,
38
+ kwargs=event.arguments,
39
+ )
40
+
41
+ async def call_function(self, call_id: str, name: str, kwargs: dict[str, Any]) -> None:
42
+ """Call a function registered with the agent.
43
+
44
+ Args:
45
+ call_id (str): The ID of the function call.
46
+ name (str): The name of the function to call.
47
+ kwargs (Any[str, Any]): The arguments to pass to the function.
48
+ """
49
+ if name in self.agent.registered_realtime_tools:
50
+ func = self.agent.registered_realtime_tools[name].func
51
+ func = asyncify(func)
52
+ try:
53
+ result = await func(**kwargs)
54
+ except Exception:
55
+ result = "Function call failed"
56
+ self.logger.info(f"Function call failed: {name=}, {kwargs=}", stack_info=True)
57
+
58
+ if isinstance(result, BaseModel):
59
+ result = result.model_dump_json()
60
+ elif not isinstance(result, str):
61
+ try:
62
+ result = json.dumps(result)
63
+ except Exception:
64
+ result = str(result)
65
+
66
+ await self.realtime_client.send_function_result(call_id, result)
67
+ else:
68
+ self.logger.warning(f"Function {name} called, but is not registered with the realtime agent.")
69
+
70
+ async def initialize_session(self) -> None:
71
+ """Add registered tools to OpenAI with a session update."""
72
+ session_update = {
73
+ "tools": [tool.realtime_tool_schema for tool in self.agent.registered_realtime_tools.values()],
74
+ "tool_choice": "auto",
75
+ }
76
+ await self.realtime_client.session_update(session_update)
77
+
78
+ async def run_loop(self) -> None:
79
+ """Run the observer loop."""
80
+ pass
81
+
82
+
83
+ if TYPE_CHECKING:
84
+ function_observer: RealtimeObserver = FunctionObserver()
@@ -0,0 +1,158 @@
1
+ # Copyright (c) 2023 - 2025, AG2ai, Inc., AG2ai open-source projects maintainers and core contributors
2
+ #
3
+ # SPDX-License-Identifier: Apache-2.0
4
+
5
+ from collections.abc import Callable
6
+ from dataclasses import dataclass
7
+ from logging import Logger, getLogger
8
+ from typing import Any, TypeVar
9
+
10
+ from anyio import create_task_group, lowlevel
11
+
12
+ from ....doc_utils import export_module
13
+ from ....llm_config import LLMConfig
14
+ from ....tools import Tool
15
+ from .clients.realtime_client import RealtimeClientProtocol, get_client
16
+ from .function_observer import FunctionObserver
17
+ from .realtime_observer import RealtimeObserver
18
+
19
+ F = TypeVar("F", bound=Callable[..., Any])
20
+
21
+ global_logger = getLogger(__name__)
22
+
23
+
24
+ @dataclass
25
+ class RealtimeAgentCallbacks:
26
+ """Callbacks for the Realtime Agent."""
27
+
28
+ # async empty placeholder function
29
+ on_observers_ready: Callable[[], Any] = lambda: lowlevel.checkpoint()
30
+
31
+
32
+ @export_module("autogen.agentchat.realtime.experimental")
33
+ class RealtimeAgent:
34
+ def __init__(
35
+ self,
36
+ *,
37
+ name: str,
38
+ audio_adapter: RealtimeObserver | None = None,
39
+ system_message: str = "You are a helpful AI Assistant.",
40
+ llm_config: LLMConfig | dict[str, Any] | None = None,
41
+ logger: Logger | None = None,
42
+ observers: list[RealtimeObserver] | None = None,
43
+ **client_kwargs: Any,
44
+ ):
45
+ """(Experimental) Agent for interacting with the Realtime Clients.
46
+
47
+ Args:
48
+ name (str): The name of the agent.
49
+ audio_adapter (Optional[RealtimeObserver] = None): The audio adapter for the agent.
50
+ system_message (str): The system message for the agent.
51
+ llm_config (LLMConfig, dict[str, Any], bool): The config for the agent.
52
+ logger (Optional[Logger]): The logger for the agent.
53
+ observers (Optional[list[RealtimeObserver]]): The additional observers for the agent.
54
+ **client_kwargs (Any): The keyword arguments for the client.
55
+ """
56
+ self._logger = logger
57
+ self._name = name
58
+ self._system_message = system_message
59
+
60
+ llm_config = LLMConfig.get_current_llm_config(llm_config)
61
+
62
+ self._realtime_client: RealtimeClientProtocol = get_client(
63
+ llm_config=llm_config, logger=self.logger, **client_kwargs
64
+ )
65
+
66
+ self._registered_realtime_tools: dict[str, Tool] = {}
67
+ self._observers: list[RealtimeObserver] = observers if observers else []
68
+ self._observers.append(FunctionObserver(logger=logger))
69
+ if audio_adapter:
70
+ self._observers.append(audio_adapter)
71
+
72
+ self.callbacks = RealtimeAgentCallbacks()
73
+
74
+ @property
75
+ def system_message(self) -> str:
76
+ """Get the system message for the agent."""
77
+ return self._system_message
78
+
79
+ @property
80
+ def logger(self) -> Logger:
81
+ """Get the logger for the agent."""
82
+ return self._logger or global_logger
83
+
84
+ @property
85
+ def realtime_client(self) -> RealtimeClientProtocol:
86
+ """Get the OpenAI Realtime Client."""
87
+ return self._realtime_client
88
+
89
+ @property
90
+ def registered_realtime_tools(self) -> dict[str, Tool]:
91
+ """Get the registered realtime tools."""
92
+ return self._registered_realtime_tools
93
+
94
+ def register_observer(self, observer: RealtimeObserver) -> None:
95
+ """Register an observer with the Realtime Agent.
96
+
97
+ Args:
98
+ observer (RealtimeObserver): The observer to register.
99
+ """
100
+ self._observers.append(observer)
101
+
102
+ async def start_observers(self) -> None:
103
+ for observer in self._observers:
104
+ self._tg.start_soon(observer.run, self)
105
+
106
+ # wait for the observers to be ready
107
+ for observer in self._observers:
108
+ await observer.wait_for_ready()
109
+
110
+ await self.callbacks.on_observers_ready()
111
+
112
+ async def run(self) -> None:
113
+ """Run the agent."""
114
+ # everything is run in the same task group to enable easy cancellation using self._tg.cancel_scope.cancel()
115
+ async with create_task_group() as self._tg: # noqa: SIM117
116
+ # connect with the client first (establishes a connection and initializes a session)
117
+ async with self._realtime_client.connect():
118
+ # start the observers and wait for them to be ready
119
+ await self.realtime_client.session_update(session_options={"instructions": self.system_message})
120
+ await self.start_observers()
121
+
122
+ # iterate over the events
123
+ async for event in self.realtime_client.read_events():
124
+ for observer in self._observers:
125
+ await observer.on_event(event)
126
+
127
+ def register_realtime_function(
128
+ self,
129
+ *,
130
+ name: str | None = None,
131
+ description: str | None = None,
132
+ ) -> Callable[[F | Tool], Tool]:
133
+ """Decorator for registering a function to be used by an agent.
134
+
135
+ Args:
136
+ name (str): The name of the function.
137
+ description (str): The description of the function.
138
+
139
+ Returns:
140
+ Callable[[Union[F, Tool]], Tool]: The decorator for registering a function.
141
+ """
142
+
143
+ def _decorator(func_or_tool: F | Tool) -> Tool:
144
+ """Decorator for registering a function to be used by an agent.
145
+
146
+ Args:
147
+ func_or_tool (Union[F, Tool]): The function or tool to register.
148
+
149
+ Returns:
150
+ Tool: The registered tool.
151
+ """
152
+ tool = Tool(func_or_tool=func_or_tool, name=name, description=description)
153
+
154
+ self._registered_realtime_tools[tool.name] = tool
155
+
156
+ return tool
157
+
158
+ return _decorator
@@ -0,0 +1,42 @@
1
+ # Copyright (c) 2023 - 2025, AG2ai, Inc., AG2ai open-source projects maintainers and core contributors
2
+ #
3
+ # SPDX-License-Identifier: Apache-2.0
4
+
5
+ from typing import Any, Literal
6
+
7
+ from pydantic import BaseModel
8
+
9
+
10
+ class RealtimeEvent(BaseModel):
11
+ raw_message: dict[str, Any]
12
+
13
+
14
+ class SessionCreated(RealtimeEvent):
15
+ type: Literal["session.created"] = "session.created"
16
+
17
+
18
+ class SessionUpdated(RealtimeEvent):
19
+ type: Literal["session.updated"] = "session.updated"
20
+
21
+
22
+ class AudioDelta(RealtimeEvent):
23
+ type: Literal["response.audio.delta"] = "response.audio.delta"
24
+ delta: str
25
+ item_id: Any
26
+
27
+
28
+ class InputAudioBufferDelta(RealtimeEvent):
29
+ type: Literal["input_audio_buffer.delta"] = "input_audio_buffer.delta"
30
+ delta: str
31
+ item_id: Any
32
+
33
+
34
+ class SpeechStarted(RealtimeEvent):
35
+ type: Literal["input_audio_buffer.speech_started"] = "input_audio_buffer.speech_started"
36
+
37
+
38
+ class FunctionCall(RealtimeEvent):
39
+ type: Literal["response.function_call_arguments.done"] = "response.function_call_arguments.done"
40
+ name: str
41
+ arguments: dict[str, Any]
42
+ call_id: str
@@ -0,0 +1,100 @@
1
+ # Copyright (c) 2023 - 2025, AG2ai, Inc., AG2ai open-source projects maintainers and core contributors
2
+ #
3
+ # SPDX-License-Identifier: Apache-2.0
4
+
5
+ from abc import ABC, abstractmethod
6
+ from logging import Logger, getLogger
7
+ from typing import TYPE_CHECKING
8
+
9
+ from anyio import Event
10
+
11
+ from ....doc_utils import export_module
12
+ from .clients.realtime_client import RealtimeClientProtocol
13
+ from .realtime_events import RealtimeEvent
14
+
15
+ if TYPE_CHECKING:
16
+ from .realtime_agent import RealtimeAgent
17
+
18
+ __all__ = ["RealtimeObserver"]
19
+
20
+ global_logger = getLogger(__name__)
21
+
22
+
23
+ @export_module("autogen.agentchat.realtime.experimental")
24
+ class RealtimeObserver(ABC):
25
+ """Observer for the OpenAI Realtime API."""
26
+
27
+ def __init__(self, *, logger: Logger | None = None) -> None:
28
+ """Observer for the OpenAI Realtime API.
29
+
30
+ Args:
31
+ logger (Logger): The logger for the observer.
32
+ """
33
+ self._ready_event = Event()
34
+ self._agent: RealtimeAgent | None = None
35
+ self._logger = logger
36
+
37
+ @property
38
+ def logger(self) -> Logger:
39
+ return self._logger or global_logger
40
+
41
+ @property
42
+ def agent(self) -> "RealtimeAgent":
43
+ if self._agent is None:
44
+ raise RuntimeError("Agent has not been set.")
45
+ return self._agent
46
+
47
+ @property
48
+ def realtime_client(self) -> RealtimeClientProtocol:
49
+ if self._agent is None:
50
+ raise RuntimeError("Agent has not been set.")
51
+ if self._agent.realtime_client is None:
52
+ raise RuntimeError("Realtime client has not been set.")
53
+
54
+ return self._agent.realtime_client
55
+
56
+ async def run(self, agent: "RealtimeAgent") -> None:
57
+ """Run the observer with the agent.
58
+
59
+ When implementing, be sure to call `self._ready_event.set()` when the observer is ready to process events.
60
+
61
+ Args:
62
+ agent (RealtimeAgent): The realtime agent attached to the observer.
63
+ """
64
+ self._agent = agent
65
+ await self.initialize_session()
66
+ self._ready_event.set()
67
+
68
+ await self.run_loop()
69
+
70
+ @abstractmethod
71
+ async def run_loop(self) -> None:
72
+ """Run the loop if needed.
73
+
74
+ This method is called after the observer is ready to process events.
75
+ Events will be processed by the on_event method, this is just a hook for additional processing.
76
+ Use initialize_session to set up the session.
77
+ """
78
+ ...
79
+
80
+ @abstractmethod
81
+ async def initialize_session(self) -> None:
82
+ """Initialize the session for the observer."""
83
+ ...
84
+
85
+ async def wait_for_ready(self) -> None:
86
+ """Get the event that is set when the observer is ready."""
87
+ await self._ready_event.wait()
88
+
89
+ @abstractmethod
90
+ async def on_event(self, event: RealtimeEvent) -> None:
91
+ """Handle an event from the OpenAI Realtime API.
92
+
93
+ Args:
94
+ event (RealtimeServerEvent): The event from the OpenAI Realtime API.
95
+ """
96
+ ...
97
+
98
+ async def on_close(self) -> None:
99
+ """Handle close of RealtimeClient."""
100
+ ...