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,177 @@
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 typing import TYPE_CHECKING, Any, Optional
7
+
8
+ from ..context_variables import ContextVariables
9
+ from ..group_tool_executor import GroupToolExecutor
10
+ from ..targets.transition_target import AskUserTarget, TransitionTarget
11
+ from .pattern import Pattern
12
+
13
+ if TYPE_CHECKING:
14
+ from ...conversable_agent import ConversableAgent
15
+ from ...groupchat import GroupChat, GroupChatManager
16
+
17
+
18
+ class ManualPattern(Pattern):
19
+ """ManualPattern will ask the user to nominate the next agent to speak at each turn."""
20
+
21
+ def __init__(
22
+ self,
23
+ initial_agent: "ConversableAgent",
24
+ agents: list["ConversableAgent"],
25
+ user_agent: Optional["ConversableAgent"] = None,
26
+ group_manager_args: dict[str, Any] | None = None,
27
+ context_variables: ContextVariables | None = None,
28
+ exclude_transit_message: bool = True,
29
+ summary_method: str | Callable[..., Any] | None = "last_msg",
30
+ ):
31
+ """Initialize the ManualPattern.
32
+
33
+ The after_work is always set to ask_user, which will prompt the user for the next agent
34
+
35
+ Args:
36
+ initial_agent: The first agent to speak in the group chat.
37
+ agents: List of all agents participating in the chat.
38
+ user_agent: Optional user proxy agent.
39
+ group_manager_args: Optional arguments for the GroupChatManager.
40
+ context_variables: Initial context variables for the chat.
41
+ exclude_transit_message: Whether to exclude transit messages from the conversation.
42
+ summary_method: Method for summarizing the conversation.
43
+ """
44
+ # The group after work will be to ask the user
45
+ group_after_work = AskUserTarget()
46
+
47
+ super().__init__(
48
+ initial_agent=initial_agent,
49
+ agents=agents,
50
+ user_agent=user_agent,
51
+ group_manager_args=group_manager_args,
52
+ context_variables=context_variables,
53
+ group_after_work=group_after_work,
54
+ exclude_transit_message=exclude_transit_message,
55
+ summary_method=summary_method,
56
+ )
57
+
58
+ def prepare_group_chat(
59
+ self,
60
+ max_rounds: int,
61
+ messages: list[dict[str, Any]] | str,
62
+ ) -> tuple[
63
+ list["ConversableAgent"],
64
+ list["ConversableAgent"],
65
+ Optional["ConversableAgent"],
66
+ ContextVariables,
67
+ "ConversableAgent",
68
+ TransitionTarget,
69
+ "GroupToolExecutor",
70
+ "GroupChat",
71
+ "GroupChatManager",
72
+ list[dict[str, Any]],
73
+ Any,
74
+ list[str],
75
+ list[Any],
76
+ ]:
77
+ """Prepare the group chat for organic agent selection.
78
+
79
+ Ensures that:
80
+ 1. The group manager has a valid LLM config
81
+ 2. All agents have appropriate descriptions for the group manager to use
82
+
83
+ Args:
84
+ max_rounds: Maximum number of conversation rounds.
85
+ messages: Initial message(s) to start the conversation.
86
+
87
+ Returns:
88
+ Tuple containing all necessary components for the group chat.
89
+ """
90
+ # Use the parent class's implementation to prepare the agents and group chat
91
+ components = super().prepare_group_chat(
92
+ max_rounds=max_rounds,
93
+ messages=messages,
94
+ )
95
+
96
+ # Extract the group_after_work and the rest of the components
97
+ (
98
+ agents,
99
+ wrapped_agents,
100
+ user_agent,
101
+ context_variables,
102
+ initial_agent,
103
+ _,
104
+ tool_executor,
105
+ groupchat,
106
+ manager,
107
+ processed_messages,
108
+ last_agent,
109
+ group_agent_names,
110
+ temp_user_list,
111
+ ) = components
112
+
113
+ # Ensure we're using the group_manager after_work
114
+ group_after_work = self.group_after_work
115
+
116
+ # Set up the allowed speaker transitions to exclude user_agent and GroupToolExecutor
117
+ self._setup_allowed_transitions(groupchat, user_agent, tool_executor)
118
+
119
+ # Return all components with our group_after_work
120
+ return (
121
+ agents,
122
+ wrapped_agents,
123
+ user_agent,
124
+ context_variables,
125
+ initial_agent,
126
+ group_after_work,
127
+ tool_executor,
128
+ groupchat,
129
+ manager,
130
+ processed_messages,
131
+ last_agent,
132
+ group_agent_names,
133
+ temp_user_list,
134
+ )
135
+
136
+ def _setup_allowed_transitions(
137
+ self, groupchat: "GroupChat", user_agent: Optional["ConversableAgent"], tool_executor: "GroupToolExecutor"
138
+ ) -> None:
139
+ """Set up the allowed speaker transitions for the group chat so that when a user selects the next agent the tool executor and user agent don't appear as options.
140
+
141
+ Creates transitions where:
142
+ 1. Any agent can speak after any other agent, including themselves
143
+ 2. The user_agent and GroupToolExecutor are excluded from transitions
144
+
145
+ Args:
146
+ groupchat: The GroupChat instance to configure
147
+ user_agent: The user agent to exclude from transitions
148
+ tool_executor: The GroupToolExecutor to exclude from transitions
149
+ """
150
+ # NOTE: THIS IS NOT WORKING - THE TRANSITIONS ARE NOT BEING KEPT?!
151
+ """
152
+ # Get all agents in the group chat
153
+ all_agents = groupchat.agents
154
+
155
+ # Filter out user_agent and group tool executor
156
+ eligible_agents = []
157
+ for agent in all_agents:
158
+ # Skip user_agent
159
+ if agent == user_agent:
160
+ continue
161
+
162
+ # Skip GroupToolExecutor
163
+ if isinstance(agent, GroupToolExecutor):
164
+ continue
165
+
166
+ eligible_agents.append(agent)
167
+
168
+ # Create a fully connected graph among eligible agents
169
+ # Each agent can be followed by any other eligible agent
170
+ allowed_transitions = {}
171
+ for agent in eligible_agents:
172
+ # For each agent, every other eligible agent can follow
173
+ allowed_transitions[agent] = eligible_agents
174
+
175
+ # Set the transitions in the group chat
176
+ groupchat.allowed_speaker_transitions_dict = allowed_transitions
177
+ """
@@ -0,0 +1,295 @@
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
+ # Patterns of agent orchestrations
6
+ # Uses the group chat or the agents' handoffs to create a pattern
7
+
8
+ from abc import ABC, abstractmethod
9
+ from collections.abc import Callable
10
+ from typing import TYPE_CHECKING, Any, Optional
11
+
12
+ from ..context_variables import ContextVariables
13
+ from ..group_utils import (
14
+ create_group_manager,
15
+ create_group_transition,
16
+ link_agents_to_group_manager,
17
+ prepare_group_agents,
18
+ process_initial_messages,
19
+ setup_context_variables,
20
+ )
21
+ from ..targets.transition_target import TerminateTarget, TransitionTarget
22
+
23
+ if TYPE_CHECKING:
24
+ from ...agent import Agent
25
+ from ...conversable_agent import ConversableAgent
26
+ from ...groupchat import GroupChat, GroupChatManager
27
+ from ..group_tool_executor import GroupToolExecutor
28
+
29
+
30
+ class Pattern(ABC):
31
+ """Base abstract class for all orchestration patterns.
32
+
33
+ Patterns provide a reusable way to define how agents interact within a group chat.
34
+ Each pattern encapsulates the logic for setting up agents, configuring handoffs,
35
+ and determining the flow of conversation.
36
+
37
+ This is an abstract base class and should not be instantiated directly.
38
+ Use one of the concrete pattern implementations like AutoPattern,
39
+ RoundRobinPattern, RandomPattern, or ManualPattern.
40
+ """
41
+
42
+ def __init__(
43
+ self,
44
+ initial_agent: "ConversableAgent",
45
+ agents: list["ConversableAgent"],
46
+ user_agent: Optional["ConversableAgent"] = None,
47
+ group_manager_args: dict[str, Any] | None = None,
48
+ context_variables: ContextVariables | None = None,
49
+ group_after_work: TransitionTarget | None = None,
50
+ exclude_transit_message: bool = True,
51
+ summary_method: str | Callable[..., Any] | None = "last_msg",
52
+ ):
53
+ """Initialize the pattern with the required components.
54
+
55
+ Args:
56
+ initial_agent: The first agent to speak in the group chat.
57
+ agents: List of all agents participating in the chat.
58
+ user_agent: Optional user proxy agent.
59
+ group_manager_args: Optional arguments for the GroupChatManager.
60
+ context_variables: Initial context variables for the chat.
61
+ group_after_work: Default after work transition behavior when no specific next agent is determined.
62
+ exclude_transit_message: Whether to exclude transit messages from the conversation.
63
+ summary_method: Method for summarizing the conversation.
64
+ """
65
+ self.initial_agent = initial_agent
66
+ self.agents = agents
67
+ self.user_agent = user_agent
68
+ self.group_manager_args = group_manager_args or {}
69
+ self.context_variables = context_variables or ContextVariables()
70
+ self.group_after_work = group_after_work if group_after_work is not None else TerminateTarget()
71
+ self.exclude_transit_message = exclude_transit_message
72
+ self.summary_method = summary_method
73
+
74
+ @abstractmethod
75
+ def prepare_group_chat(
76
+ self,
77
+ max_rounds: int,
78
+ messages: list[dict[str, Any]] | str,
79
+ ) -> tuple[
80
+ list["ConversableAgent"],
81
+ list["ConversableAgent"],
82
+ Optional["ConversableAgent"],
83
+ ContextVariables,
84
+ "ConversableAgent",
85
+ TransitionTarget,
86
+ "GroupToolExecutor",
87
+ "GroupChat",
88
+ "GroupChatManager",
89
+ list[dict[str, Any]],
90
+ "ConversableAgent",
91
+ list[str],
92
+ list["Agent"],
93
+ ]:
94
+ """Prepare the group chat for orchestration.
95
+
96
+ This is the main method called by initiate_group_chat to set up the pattern.
97
+ Subclasses must implement or extend this method to define pattern-specific behavior.
98
+
99
+ Args:
100
+ max_rounds: Maximum number of conversation rounds.
101
+ messages: Initial message(s) to start the conversation.
102
+
103
+ Returns:
104
+ Tuple containing:
105
+ - List of agents involved in the group chat
106
+ - List of wrapped agents
107
+ - User agent, if applicable
108
+ - Context variables for the group chat
109
+ - Initial agent for the group chat
110
+ - Group-level after work transition for the group chat
111
+ - Tool executor for the group chat
112
+ - GroupChat instance
113
+ - GroupChatManager instance
114
+ - Processed messages
115
+ - Last agent to speak
116
+ - List of group agent names
117
+ - List of temporary user agents
118
+ """
119
+ from ...groupchat import GroupChat
120
+
121
+ # Prepare the agents using the existing helper function
122
+ tool_executor, wrapped_agents = prepare_group_agents(
123
+ self.agents, self.context_variables, self.exclude_transit_message
124
+ )
125
+
126
+ # Process the initial messages BEFORE creating the GroupChat
127
+ # This will create a temporary user agent if needed
128
+ processed_messages, last_agent, group_agent_names, temp_user_list = process_initial_messages(
129
+ messages, self.user_agent, self.agents, wrapped_agents
130
+ )
131
+
132
+ # Create transition function (has enclosed state for initial agent)
133
+ group_transition = create_group_transition(
134
+ initial_agent=self.initial_agent,
135
+ tool_execution=tool_executor,
136
+ group_agent_names=group_agent_names,
137
+ user_agent=self.user_agent,
138
+ group_after_work=self.group_after_work,
139
+ )
140
+
141
+ # Create the group chat - now we use temp_user_list if no user_agent
142
+ groupchat = GroupChat(
143
+ agents=[tool_executor]
144
+ + self.agents
145
+ + wrapped_agents
146
+ + ([self.user_agent] if self.user_agent else temp_user_list),
147
+ messages=[],
148
+ max_round=max_rounds,
149
+ speaker_selection_method=group_transition,
150
+ )
151
+
152
+ # Create the group manager
153
+ manager = create_group_manager(groupchat, self.group_manager_args, self.agents, self.group_after_work)
154
+
155
+ # Point all agent's context variables to this function's context_variables
156
+ setup_context_variables(
157
+ tool_execution=tool_executor,
158
+ agents=self.agents,
159
+ manager=manager,
160
+ user_agent=self.user_agent,
161
+ context_variables=self.context_variables,
162
+ )
163
+
164
+ # Link all agents with the GroupChatManager to allow access to the group chat
165
+ link_agents_to_group_manager(groupchat.agents, manager)
166
+
167
+ return (
168
+ self.agents,
169
+ wrapped_agents,
170
+ self.user_agent,
171
+ self.context_variables,
172
+ self.initial_agent,
173
+ self.group_after_work,
174
+ tool_executor,
175
+ groupchat,
176
+ manager,
177
+ processed_messages,
178
+ last_agent,
179
+ group_agent_names,
180
+ temp_user_list,
181
+ ) # type: ignore[return-value]
182
+
183
+ @classmethod
184
+ def create_default(
185
+ cls,
186
+ initial_agent: "ConversableAgent",
187
+ agents: list["ConversableAgent"],
188
+ user_agent: Optional["ConversableAgent"] = None,
189
+ group_manager_args: dict[str, Any] | None = None,
190
+ context_variables: ContextVariables | None = None,
191
+ exclude_transit_message: bool = True,
192
+ summary_method: str | Callable[..., Any] | None = "last_msg",
193
+ ) -> "DefaultPattern":
194
+ """Create a default pattern with minimal configuration.
195
+
196
+ This replaces the need for a separate BasePattern class by providing
197
+ a factory method that creates a simple DefaultPattern instance.
198
+
199
+ Args:
200
+ initial_agent: The first agent to speak in the group chat.
201
+ agents: List of all agents participating in the chat.
202
+ user_agent: Optional user proxy agent.
203
+ group_manager_args: Optional arguments for the GroupChatManager.
204
+ context_variables: Initial context variables for the chat.
205
+ exclude_transit_message: Whether to exclude transit messages from the conversation.
206
+ summary_method: Method for summarizing the conversation.
207
+
208
+ Returns:
209
+ A DefaultPattern instance with basic configuration.
210
+ """
211
+ return DefaultPattern(
212
+ initial_agent=initial_agent,
213
+ agents=agents,
214
+ user_agent=user_agent,
215
+ group_manager_args=group_manager_args,
216
+ context_variables=context_variables,
217
+ exclude_transit_message=exclude_transit_message,
218
+ summary_method=summary_method,
219
+ )
220
+
221
+
222
+ class DefaultPattern(Pattern):
223
+ """DefaultPattern implements a minimal pattern for simple agent interactions.
224
+
225
+ This replaces the previous BasePattern and provides a concrete implementation
226
+ of the Pattern abstract base class.
227
+ """
228
+
229
+ def prepare_group_chat(
230
+ self,
231
+ max_rounds: int,
232
+ messages: list[dict[str, Any]] | str,
233
+ ) -> tuple[
234
+ list["ConversableAgent"],
235
+ list["ConversableAgent"],
236
+ Optional["ConversableAgent"],
237
+ ContextVariables,
238
+ "ConversableAgent",
239
+ TransitionTarget,
240
+ "GroupToolExecutor",
241
+ "GroupChat",
242
+ "GroupChatManager",
243
+ list[dict[str, Any]],
244
+ Any,
245
+ list[str],
246
+ list[Any],
247
+ ]:
248
+ """Prepare the group chat with default configuration.
249
+
250
+ This implementation calls the parent class method but ensures that
251
+ the group_after_work in the returned tuple is the pattern's own.
252
+
253
+ Args:
254
+ max_rounds: Maximum number of conversation rounds.
255
+ messages: Initial message(s) to start the conversation.
256
+
257
+ Returns:
258
+ Tuple containing all necessary components for the group chat.
259
+ """
260
+ # Use the parent class's implementation to prepare the agents and group chat
261
+ (
262
+ agents,
263
+ wrapped_agents,
264
+ user_agent,
265
+ context_variables,
266
+ initial_agent,
267
+ _, # Ignore the group_after_work from parent
268
+ tool_executor,
269
+ groupchat,
270
+ manager,
271
+ processed_messages,
272
+ last_agent,
273
+ group_agent_names,
274
+ temp_user_list,
275
+ ) = super().prepare_group_chat(
276
+ max_rounds=max_rounds,
277
+ messages=messages,
278
+ )
279
+
280
+ # Return all components with our group_after_work
281
+ return (
282
+ agents,
283
+ wrapped_agents,
284
+ user_agent,
285
+ context_variables,
286
+ initial_agent,
287
+ self.group_after_work, # Use our own group_after_work
288
+ tool_executor,
289
+ groupchat,
290
+ manager,
291
+ processed_messages,
292
+ last_agent,
293
+ group_agent_names,
294
+ temp_user_list,
295
+ )
@@ -0,0 +1,106 @@
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 TYPE_CHECKING, Any, Optional
6
+
7
+ from ..context_variables import ContextVariables
8
+ from ..targets.transition_target import RandomAgentTarget, TransitionTarget
9
+ from .pattern import Pattern
10
+
11
+ if TYPE_CHECKING:
12
+ from ...conversable_agent import ConversableAgent
13
+ from ...groupchat import GroupChat, GroupChatManager
14
+ from ..group_tool_executor import GroupToolExecutor
15
+
16
+
17
+ class RandomPattern(Pattern):
18
+ """RandomPattern implements a random agent selection process."""
19
+
20
+ def _generate_handoffs(
21
+ self,
22
+ initial_agent: "ConversableAgent",
23
+ agents: list["ConversableAgent"],
24
+ user_agent: Optional["ConversableAgent"],
25
+ ) -> None:
26
+ """Generate handoffs between agents in a random fashion."""
27
+ agent_list = agents + ([user_agent] if user_agent is not None else [])
28
+
29
+ for agent in agent_list:
30
+ # Get the list of agents except itself
31
+ other_agents = [a for a in agent_list if a != agent]
32
+
33
+ # Create a random after work
34
+ agent.handoffs.set_after_work(target=RandomAgentTarget(agents=other_agents))
35
+
36
+ def prepare_group_chat(
37
+ self,
38
+ max_rounds: int,
39
+ messages: list[dict[str, Any]] | str,
40
+ ) -> tuple[
41
+ list["ConversableAgent"],
42
+ list["ConversableAgent"],
43
+ Optional["ConversableAgent"],
44
+ ContextVariables,
45
+ "ConversableAgent",
46
+ TransitionTarget,
47
+ "GroupToolExecutor",
48
+ "GroupChat",
49
+ "GroupChatManager",
50
+ list[dict[str, Any]],
51
+ Any,
52
+ list[str],
53
+ list[Any],
54
+ ]:
55
+ """Prepare the group chat for organic agent selection.
56
+
57
+ Ensures that:
58
+ 1. The group manager has a valid LLM config
59
+ 2. All agents have appropriate descriptions for the group manager to use
60
+
61
+ Args:
62
+ max_rounds: Maximum number of conversation rounds.
63
+ messages: Initial message(s) to start the conversation.
64
+
65
+ Returns:
66
+ Tuple containing all necessary components for the group chat.
67
+ """
68
+ # Use the parent class's implementation to prepare the agents and group chat
69
+ (
70
+ agents,
71
+ wrapped_agents,
72
+ user_agent,
73
+ context_variables,
74
+ initial_agent,
75
+ group_after_work,
76
+ tool_executor,
77
+ groupchat,
78
+ manager,
79
+ processed_messages,
80
+ last_agent,
81
+ group_agent_names,
82
+ temp_user_list,
83
+ ) = super().prepare_group_chat(
84
+ max_rounds=max_rounds,
85
+ messages=messages,
86
+ )
87
+
88
+ # Create the random handoffs between agents
89
+ self._generate_handoffs(initial_agent=initial_agent, agents=agents, user_agent=user_agent)
90
+
91
+ # Return all components with our group_after_work
92
+ return (
93
+ agents,
94
+ wrapped_agents,
95
+ user_agent,
96
+ context_variables,
97
+ initial_agent,
98
+ group_after_work,
99
+ tool_executor,
100
+ groupchat,
101
+ manager,
102
+ processed_messages,
103
+ last_agent,
104
+ group_agent_names,
105
+ temp_user_list,
106
+ )
@@ -0,0 +1,117 @@
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 TYPE_CHECKING, Any, Optional
6
+
7
+ from ..context_variables import ContextVariables
8
+ from ..targets.transition_target import AgentTarget, TransitionTarget
9
+ from .pattern import Pattern
10
+
11
+ if TYPE_CHECKING:
12
+ from ...conversable_agent import ConversableAgent
13
+ from ...groupchat import GroupChat, GroupChatManager
14
+ from ..group_tool_executor import GroupToolExecutor
15
+
16
+
17
+ class RoundRobinPattern(Pattern):
18
+ """RoundRobinPattern implements a round robin with handoffs between agents."""
19
+
20
+ def _generate_handoffs(
21
+ self,
22
+ initial_agent: "ConversableAgent",
23
+ agents: list["ConversableAgent"],
24
+ user_agent: Optional["ConversableAgent"],
25
+ ) -> None:
26
+ """Generate handoffs between agents in a round-robin fashion."""
27
+ # Create a list of the agents and the user_agent but put the initial_agent first
28
+ agent_list = [initial_agent]
29
+
30
+ # Add the rest of the agents, excluding the initial_agent and user_agent
31
+ for agent in agents:
32
+ if agent != initial_agent and (user_agent is None or agent != user_agent):
33
+ agent_list.append(agent)
34
+
35
+ # Add the user_agent last if it exists
36
+ if user_agent is not None:
37
+ agent_list.append(user_agent)
38
+
39
+ # Create handoffs in a round-robin fashion
40
+ for i, agent in enumerate(agent_list):
41
+ # Last agent hands off to the first agent
42
+ # Otherwise agent hands off to the next one
43
+ handoff_target = agent_list[0] if i == len(agent_list) - 1 else agent_list[i + 1]
44
+
45
+ agent.handoffs.set_after_work(target=AgentTarget(agent=handoff_target))
46
+
47
+ def prepare_group_chat(
48
+ self,
49
+ max_rounds: int,
50
+ messages: list[dict[str, Any]] | str,
51
+ ) -> tuple[
52
+ list["ConversableAgent"],
53
+ list["ConversableAgent"],
54
+ Optional["ConversableAgent"],
55
+ ContextVariables,
56
+ "ConversableAgent",
57
+ TransitionTarget,
58
+ "GroupToolExecutor",
59
+ "GroupChat",
60
+ "GroupChatManager",
61
+ list[dict[str, Any]],
62
+ Any,
63
+ list[str],
64
+ list[Any],
65
+ ]:
66
+ """Prepare the group chat for organic agent selection.
67
+
68
+ Ensures that:
69
+ 1. The group manager has a valid LLM config
70
+ 2. All agents have appropriate descriptions for the group manager to use
71
+
72
+ Args:
73
+ max_rounds: Maximum number of conversation rounds.
74
+ messages: Initial message(s) to start the conversation.
75
+
76
+ Returns:
77
+ Tuple containing all necessary components for the group chat.
78
+ """
79
+ # Use the parent class's implementation to prepare the agents and group chat
80
+ (
81
+ agents,
82
+ wrapped_agents,
83
+ user_agent,
84
+ context_variables,
85
+ initial_agent,
86
+ group_after_work,
87
+ tool_executor,
88
+ groupchat,
89
+ manager,
90
+ processed_messages,
91
+ last_agent,
92
+ group_agent_names,
93
+ temp_user_list,
94
+ ) = super().prepare_group_chat(
95
+ max_rounds=max_rounds,
96
+ messages=messages,
97
+ )
98
+
99
+ # Create the handoffs between agents
100
+ self._generate_handoffs(initial_agent=initial_agent, agents=agents, user_agent=user_agent)
101
+
102
+ # Return all components with our group_after_work
103
+ return (
104
+ agents,
105
+ wrapped_agents,
106
+ user_agent,
107
+ context_variables,
108
+ initial_agent,
109
+ group_after_work,
110
+ tool_executor,
111
+ groupchat,
112
+ manager,
113
+ processed_messages,
114
+ last_agent,
115
+ group_agent_names,
116
+ temp_user_list,
117
+ )