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,291 @@
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
+ import threading
7
+ from typing import TYPE_CHECKING, Any
8
+
9
+ from ...doc_utils import export_module
10
+ from ...events.agent_events import ErrorEvent, RunCompletionEvent
11
+ from ...io.base import IOStream
12
+ from ...io.run_response import AsyncRunResponse, AsyncRunResponseProtocol, RunResponse, RunResponseProtocol
13
+ from ...io.thread_io_stream import AsyncThreadIOStream, ThreadIOStream
14
+ from ...llm_config import LLMConfig
15
+ from ..chat import ChatResult
16
+ from .context_variables import ContextVariables
17
+ from .group_utils import cleanup_temp_user_messages
18
+
19
+ if TYPE_CHECKING:
20
+ from ..agent import Agent
21
+ from .patterns.pattern import Pattern
22
+
23
+ __all__ = [
24
+ "a_initiate_group_chat",
25
+ "a_run_group_chat",
26
+ "initiate_group_chat",
27
+ "run_group_chat",
28
+ ]
29
+
30
+
31
+ @export_module("autogen")
32
+ def initiate_group_chat(
33
+ pattern: "Pattern",
34
+ messages: list[dict[str, Any]] | str,
35
+ max_rounds: int = 20,
36
+ safeguard_policy: dict[str, Any] | str | None = None,
37
+ safeguard_llm_config: LLMConfig | None = None,
38
+ mask_llm_config: LLMConfig | None = None,
39
+ ) -> tuple[ChatResult, ContextVariables, "Agent"]:
40
+ """Initialize and run a group chat using a pattern for configuration.
41
+
42
+ Args:
43
+ pattern: Pattern object that encapsulates the chat configuration.
44
+ messages: Initial message(s).
45
+ max_rounds: Maximum number of conversation rounds.
46
+ safeguard_policy: Optional safeguard policy dict or path to JSON file.
47
+ safeguard_llm_config: Optional LLM configuration for safeguard checks.
48
+ mask_llm_config: Optional LLM configuration for masking.
49
+
50
+ Returns:
51
+ ChatResult: Conversations chat history.
52
+ ContextVariables: Updated Context variables.
53
+ "ConversableAgent": Last speaker.
54
+ """
55
+ # Let the pattern prepare the group chat and all its components
56
+ # Only passing the necessary parameters that aren't already in the pattern
57
+ (
58
+ _, # agents,
59
+ _, # wrapped_agents,
60
+ _, # user_agent,
61
+ context_variables,
62
+ _, # initial_agent,
63
+ _, # group_after_work,
64
+ _, # tool_execution,
65
+ _, # groupchat,
66
+ manager,
67
+ processed_messages,
68
+ last_agent,
69
+ _, # group_agent_names,
70
+ _, # temp_user_list,
71
+ ) = pattern.prepare_group_chat(
72
+ max_rounds=max_rounds,
73
+ messages=messages,
74
+ )
75
+
76
+ # Apply safeguards if provided
77
+ if safeguard_policy:
78
+ from .safeguards import apply_safeguard_policy
79
+
80
+ apply_safeguard_policy(
81
+ groupchat_manager=manager,
82
+ policy=safeguard_policy,
83
+ safeguard_llm_config=safeguard_llm_config,
84
+ mask_llm_config=mask_llm_config,
85
+ )
86
+
87
+ # Start or resume the conversation
88
+ if len(processed_messages) > 1:
89
+ last_agent, last_message = manager.resume(messages=processed_messages)
90
+ clear_history = False
91
+ else:
92
+ last_message = processed_messages[0]
93
+ clear_history = True
94
+
95
+ if last_agent is None:
96
+ raise ValueError("No agent selected to start the conversation")
97
+
98
+ chat_result = last_agent.initiate_chat(
99
+ manager,
100
+ message=last_message,
101
+ clear_history=clear_history,
102
+ summary_method=pattern.summary_method,
103
+ )
104
+
105
+ cleanup_temp_user_messages(chat_result)
106
+
107
+ return chat_result, context_variables, manager.last_speaker
108
+
109
+
110
+ @export_module("autogen.agentchat")
111
+ async def a_initiate_group_chat(
112
+ pattern: "Pattern",
113
+ messages: list[dict[str, Any]] | str,
114
+ max_rounds: int = 20,
115
+ safeguard_policy: dict[str, Any] | str | None = None,
116
+ safeguard_llm_config: LLMConfig | None = None,
117
+ mask_llm_config: LLMConfig | None = None,
118
+ ) -> tuple[ChatResult, ContextVariables, "Agent"]:
119
+ """Initialize and run a group chat using a pattern for configuration, asynchronously.
120
+
121
+ Args:
122
+ pattern: Pattern object that encapsulates the chat configuration.
123
+ messages: Initial message(s).
124
+ max_rounds: Maximum number of conversation rounds.
125
+ safeguard_policy: Optional safeguard policy dict or path to JSON file.
126
+ safeguard_llm_config: Optional LLM configuration for safeguard checks.
127
+ mask_llm_config: Optional LLM configuration for masking.
128
+
129
+ Returns:
130
+ ChatResult: Conversations chat history.
131
+ ContextVariables: Updated Context variables.
132
+ "ConversableAgent": Last speaker.
133
+ """
134
+ # Let the pattern prepare the group chat and all its components
135
+ # Only passing the necessary parameters that aren't already in the pattern
136
+ (
137
+ _, # agents,
138
+ _, # wrapped_agents,
139
+ _, # user_agent,
140
+ context_variables,
141
+ _, # initial_agent,
142
+ _, # group_after_work,
143
+ _, # tool_execution,
144
+ _, # groupchat,
145
+ manager,
146
+ processed_messages,
147
+ last_agent,
148
+ _, # group_agent_names,
149
+ _, # temp_user_list,
150
+ ) = pattern.prepare_group_chat(
151
+ max_rounds=max_rounds,
152
+ messages=messages,
153
+ )
154
+
155
+ # Apply safeguards if provided
156
+ if safeguard_policy:
157
+ from .safeguards import apply_safeguard_policy
158
+
159
+ apply_safeguard_policy(
160
+ groupchat_manager=manager,
161
+ policy=safeguard_policy,
162
+ safeguard_llm_config=safeguard_llm_config,
163
+ mask_llm_config=mask_llm_config,
164
+ )
165
+
166
+ # Start or resume the conversation
167
+ if len(processed_messages) > 1:
168
+ last_agent, last_message = await manager.a_resume(messages=processed_messages)
169
+ clear_history = False
170
+ else:
171
+ last_message = processed_messages[0]
172
+ clear_history = True
173
+
174
+ if last_agent is None:
175
+ raise ValueError("No agent selected to start the conversation")
176
+
177
+ chat_result = await last_agent.a_initiate_chat(
178
+ manager,
179
+ message=last_message, # type: ignore[arg-type]
180
+ clear_history=clear_history,
181
+ summary_method=pattern.summary_method,
182
+ )
183
+
184
+ cleanup_temp_user_messages(chat_result)
185
+
186
+ return chat_result, context_variables, manager.last_speaker
187
+
188
+
189
+ @export_module("autogen.agentchat")
190
+ def run_group_chat(
191
+ pattern: "Pattern",
192
+ messages: list[dict[str, Any]] | str,
193
+ max_rounds: int = 20,
194
+ safeguard_policy: dict[str, Any] | str | None = None,
195
+ safeguard_llm_config: LLMConfig | None = None,
196
+ mask_llm_config: LLMConfig | None = None,
197
+ ) -> RunResponseProtocol:
198
+ iostream = ThreadIOStream()
199
+ # todo: add agents
200
+ response = RunResponse(iostream, agents=[])
201
+
202
+ def _initiate_group_chat(
203
+ pattern: "Pattern" = pattern,
204
+ messages: list[dict[str, Any]] | str = messages,
205
+ max_rounds: int = max_rounds,
206
+ safeguard_policy: dict[str, Any] | str | None = safeguard_policy,
207
+ safeguard_llm_config: LLMConfig | None = safeguard_llm_config,
208
+ mask_llm_config: LLMConfig | None = mask_llm_config,
209
+ iostream: ThreadIOStream = iostream,
210
+ response: RunResponse = response,
211
+ ) -> None:
212
+ with IOStream.set_default(iostream):
213
+ try:
214
+ chat_result, context_vars, agent = initiate_group_chat(
215
+ pattern=pattern,
216
+ messages=messages,
217
+ max_rounds=max_rounds,
218
+ safeguard_policy=safeguard_policy,
219
+ safeguard_llm_config=safeguard_llm_config,
220
+ mask_llm_config=mask_llm_config,
221
+ )
222
+
223
+ IOStream.get_default().send(
224
+ RunCompletionEvent( # type: ignore[call-arg]
225
+ history=chat_result.chat_history,
226
+ summary=chat_result.summary,
227
+ cost=chat_result.cost,
228
+ last_speaker=agent.name,
229
+ context_variables=context_vars,
230
+ )
231
+ )
232
+ except Exception as e:
233
+ response.iostream.send(ErrorEvent(error=e)) # type: ignore[call-arg]
234
+
235
+ threading.Thread(
236
+ target=_initiate_group_chat,
237
+ ).start()
238
+
239
+ return response
240
+
241
+
242
+ @export_module("autogen.agentchat")
243
+ async def a_run_group_chat(
244
+ pattern: "Pattern",
245
+ messages: list[dict[str, Any]] | str,
246
+ max_rounds: int = 20,
247
+ safeguard_policy: dict[str, Any] | str | None = None,
248
+ safeguard_llm_config: LLMConfig | None = None,
249
+ mask_llm_config: LLMConfig | None = None,
250
+ ) -> AsyncRunResponseProtocol:
251
+ iostream = AsyncThreadIOStream()
252
+ # todo: add agents
253
+ response = AsyncRunResponse(iostream, agents=[])
254
+
255
+ async def _initiate_group_chat(
256
+ pattern: "Pattern" = pattern,
257
+ messages: list[dict[str, Any]] | str = messages,
258
+ max_rounds: int = max_rounds,
259
+ safeguard_policy: dict[str, Any] | str | None = safeguard_policy,
260
+ safeguard_llm_config: LLMConfig | None = safeguard_llm_config,
261
+ mask_llm_config: LLMConfig | None = mask_llm_config,
262
+ iostream: AsyncThreadIOStream = iostream,
263
+ response: AsyncRunResponse = response,
264
+ ) -> None:
265
+ with IOStream.set_default(iostream):
266
+ try:
267
+ chat_result, context_vars, agent = await a_initiate_group_chat(
268
+ pattern=pattern,
269
+ messages=messages,
270
+ max_rounds=max_rounds,
271
+ safeguard_policy=safeguard_policy,
272
+ safeguard_llm_config=safeguard_llm_config,
273
+ mask_llm_config=mask_llm_config,
274
+ )
275
+
276
+ IOStream.get_default().send(
277
+ RunCompletionEvent( # type: ignore[call-arg]
278
+ history=chat_result.chat_history,
279
+ summary=chat_result.summary,
280
+ cost=chat_result.cost,
281
+ last_speaker=agent.name,
282
+ context_variables=context_vars,
283
+ )
284
+ )
285
+ except Exception as e:
286
+ response.iostream.send(ErrorEvent(error=e)) # type: ignore[call-arg]
287
+
288
+ task = asyncio.create_task(_initiate_group_chat())
289
+ # prevent the task from being garbage collected
290
+ response._task_ref = task # type: ignore[attr-defined]
291
+ return response
@@ -0,0 +1,55 @@
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
+
6
+ from pydantic import BaseModel
7
+
8
+ from ...doc_utils import export_module
9
+ from .available_condition import AvailableCondition
10
+ from .llm_condition import LLMCondition
11
+ from .targets.transition_target import TransitionTarget
12
+
13
+ __all__ = [
14
+ "OnCondition",
15
+ ]
16
+
17
+
18
+ @export_module("autogen")
19
+ class OnCondition(BaseModel): # noqa: N801
20
+ """Defines a condition for transitioning to another agent or nested chats.\n
21
+ \n
22
+ This is for LLM-based condition evaluation where these conditions are translated into tools and attached to the agent.\n
23
+ \n
24
+ These are evaluated after the OnCondition conditions but before the after work condition.\n
25
+ \n
26
+ Args:\n
27
+ target (TransitionTarget): The transition (essentially an agent) to hand off to.\n
28
+ condition (LLMCondition): The condition for transitioning to the target agent, evaluated by the LLM.\n
29
+ available (AvailableCondition): Optional condition to determine if this OnCondition is included for the LLM to evaluate based on context variables using classes like StringAvailableCondition and ContextExpressionAvailableCondition.\n
30
+ llm_function_name (Optional[str]): The name of the LLM function to use for this condition.\n
31
+ """
32
+
33
+ target: TransitionTarget
34
+ condition: LLMCondition
35
+ available: AvailableCondition | None = None
36
+ llm_function_name: str | None = None
37
+
38
+ def has_target_type(self, target_type: type) -> bool:
39
+ """Check if the target type matches the specified type.
40
+
41
+ Args:
42
+ target_type (type): The target type to check against, which should be a subclass of TransitionTarget
43
+
44
+ Returns:
45
+ bool: True if the target type matches, False otherwise
46
+ """
47
+ return isinstance(self.target, target_type)
48
+
49
+ def target_requires_wrapping(self) -> bool:
50
+ """Check if the target requires wrapping in an agent.
51
+
52
+ Returns:
53
+ bool: True if the target requires wrapping, False otherwise
54
+ """
55
+ return self.target.needs_agent_wrapper()
@@ -0,0 +1,51 @@
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
+
6
+ from pydantic import BaseModel
7
+
8
+ from .available_condition import AvailableCondition
9
+ from .context_condition import ContextCondition
10
+ from .targets.transition_target import TransitionTarget
11
+
12
+ __all__ = [
13
+ "OnContextCondition",
14
+ ]
15
+
16
+
17
+ class OnContextCondition(BaseModel): # noqa: N801
18
+ """Defines a condition for transitioning to another agent or nested chats using context variables and the ContextExpression class.
19
+
20
+ This is for context variable-based condition evaluation (does not use the agent's LLM).
21
+
22
+ These are evaluated before the OnCondition and after work conditions.
23
+
24
+ Args:
25
+ target (TransitionTarget): The transition (essentially an agent) to hand off to.
26
+ condition (Optional[ContextCondition]): The context variable based condition for transitioning to the target agent. If None, the condition always evaluates to True.
27
+ available (AvailableCondition): Optional condition to determine if this OnCondition is included for the LLM to evaluate based on context variables using classes like StringAvailableCondition and ContextExpressionAvailableCondition.
28
+ """
29
+
30
+ target: TransitionTarget
31
+ condition: ContextCondition | None = None
32
+ available: AvailableCondition | None = None
33
+
34
+ def has_target_type(self, target_type: type) -> bool:
35
+ """Check if the target type matches the specified type.
36
+
37
+ Args:
38
+ target_type (type): The target type to check against. Should be a subclass of TransitionTarget.
39
+
40
+ Returns:
41
+ bool: True if the target type matches, False otherwise
42
+ """
43
+ return isinstance(self.target, target_type)
44
+
45
+ def target_requires_wrapping(self) -> bool:
46
+ """Check if the target requires wrapping in an agent.
47
+
48
+ Returns:
49
+ bool: True if the target requires wrapping, False otherwise
50
+ """
51
+ return self.target.needs_agent_wrapper()
@@ -0,0 +1,18 @@
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
+
6
+ from .auto import AutoPattern
7
+ from .manual import ManualPattern
8
+ from .pattern import DefaultPattern
9
+ from .random import RandomPattern
10
+ from .round_robin import RoundRobinPattern
11
+
12
+ __all__ = [
13
+ "AutoPattern",
14
+ "DefaultPattern",
15
+ "ManualPattern",
16
+ "RandomPattern",
17
+ "RoundRobinPattern",
18
+ ]
@@ -0,0 +1,160 @@
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 ..targets.group_manager_target import GroupManagerSelectionMessage, GroupManagerTarget
10
+ from ..targets.transition_target import TransitionTarget
11
+ from .pattern import Pattern
12
+
13
+ if TYPE_CHECKING:
14
+ from ...conversable_agent import ConversableAgent
15
+ from ...groupchat import GroupChat, GroupChatManager
16
+ from ..group_tool_executor import GroupToolExecutor
17
+
18
+
19
+ class AutoPattern(Pattern):
20
+ """AutoPattern implements a flexible pattern where agents are selected based on their expertise.
21
+
22
+ In this pattern, a group manager automatically selects the next agent to speak based on the context
23
+ of the conversation and agent descriptions. The after_work is always set to "group_manager" as
24
+ this is the defining characteristic of this pattern.
25
+ """
26
+
27
+ def __init__(
28
+ self,
29
+ initial_agent: "ConversableAgent",
30
+ agents: list["ConversableAgent"],
31
+ user_agent: Optional["ConversableAgent"] = None,
32
+ group_manager_args: dict[str, Any] | None = None,
33
+ context_variables: ContextVariables | None = None,
34
+ selection_message: GroupManagerSelectionMessage | None = None,
35
+ exclude_transit_message: bool = True,
36
+ summary_method: str | Callable[..., Any] | None = "last_msg",
37
+ ):
38
+ """Initialize the AutoPattern.
39
+
40
+ The after_work is always set to group_manager selection, which is the defining
41
+ characteristic of this pattern. You can customize the selection message used
42
+ by the group manager when selecting the next agent.
43
+
44
+ Args:
45
+ initial_agent: The first agent to speak in the group chat.
46
+ agents: List of all agents participating in the chat.
47
+ user_agent: Optional user proxy agent.
48
+ group_manager_args: Optional arguments for the GroupChatManager.
49
+ context_variables: Initial context variables for the chat.
50
+ selection_message: Custom message to use when the group manager is selecting agents.
51
+ exclude_transit_message: Whether to exclude transit messages from the conversation.
52
+ summary_method: Method for summarizing the conversation.
53
+ """
54
+ # Create the group_manager after_work with the provided selection message
55
+ group_manager_after_work = GroupManagerTarget(selection_message=selection_message)
56
+
57
+ super().__init__(
58
+ initial_agent=initial_agent,
59
+ agents=agents,
60
+ user_agent=user_agent,
61
+ group_manager_args=group_manager_args,
62
+ context_variables=context_variables,
63
+ group_after_work=group_manager_after_work,
64
+ exclude_transit_message=exclude_transit_message,
65
+ summary_method=summary_method,
66
+ )
67
+
68
+ # Store the selection message for potential use
69
+ self.selection_message = selection_message
70
+
71
+ def prepare_group_chat(
72
+ self,
73
+ max_rounds: int,
74
+ messages: list[dict[str, Any]] | str,
75
+ ) -> tuple[
76
+ list["ConversableAgent"],
77
+ list["ConversableAgent"],
78
+ Optional["ConversableAgent"],
79
+ ContextVariables,
80
+ "ConversableAgent",
81
+ TransitionTarget,
82
+ "GroupToolExecutor",
83
+ "GroupChat",
84
+ "GroupChatManager",
85
+ list[dict[str, Any]],
86
+ Any,
87
+ list[str],
88
+ list[Any],
89
+ ]:
90
+ """Prepare the group chat for organic agent selection.
91
+
92
+ Ensures that:
93
+ 1. The group manager has a valid LLM config
94
+ 2. All agents have appropriate descriptions for the group manager to use
95
+
96
+ Args:
97
+ max_rounds: Maximum number of conversation rounds.
98
+ messages: Initial message(s) to start the conversation.
99
+
100
+ Returns:
101
+ Tuple containing all necessary components for the group chat.
102
+ """
103
+ # Validate that group_manager_args has an LLM config which is required for this pattern
104
+ if not self.group_manager_args.get("llm_config", False):
105
+ # Check if any agent has an LLM config we can use
106
+ has_llm_config = any(getattr(agent, "llm_config", False) for agent in self.agents)
107
+
108
+ if not has_llm_config:
109
+ raise ValueError(
110
+ "AutoPattern requires the group_manager_args to include an llm_config, "
111
+ "or at least one agent to have an llm_config"
112
+ )
113
+
114
+ # Check that all agents have descriptions for effective group manager selection
115
+ for agent in self.agents:
116
+ if not hasattr(agent, "description") or not agent.description:
117
+ agent.description = f"Agent {agent.name}"
118
+
119
+ # Use the parent class's implementation to prepare the agents and group chat
120
+ components = super().prepare_group_chat(
121
+ max_rounds=max_rounds,
122
+ messages=messages,
123
+ )
124
+
125
+ # Extract the group_after_work and the rest of the components
126
+ (
127
+ agents,
128
+ wrapped_agents,
129
+ user_agent,
130
+ context_variables,
131
+ initial_agent,
132
+ _,
133
+ tool_executor,
134
+ groupchat,
135
+ manager,
136
+ processed_messages,
137
+ last_agent,
138
+ group_agent_names,
139
+ temp_user_list,
140
+ ) = components
141
+
142
+ # Ensure we're using the group_manager after_work
143
+ group_after_work = self.group_after_work
144
+
145
+ # Return all components with our group_after_work
146
+ return (
147
+ agents,
148
+ wrapped_agents,
149
+ user_agent,
150
+ context_variables,
151
+ initial_agent,
152
+ group_after_work,
153
+ tool_executor,
154
+ groupchat,
155
+ manager,
156
+ processed_messages,
157
+ last_agent,
158
+ group_agent_names,
159
+ temp_user_list,
160
+ )