ag2 0.9.1a1__py3-none-any.whl → 0.9.1.post0__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.

Potentially problematic release.


This version of ag2 might be problematic. Click here for more details.

Files changed (357) hide show
  1. {ag2-0.9.1a1.dist-info → ag2-0.9.1.post0.dist-info}/METADATA +264 -73
  2. ag2-0.9.1.post0.dist-info/RECORD +392 -0
  3. {ag2-0.9.1a1.dist-info → ag2-0.9.1.post0.dist-info}/WHEEL +1 -2
  4. autogen/__init__.py +89 -0
  5. autogen/_website/__init__.py +3 -0
  6. autogen/_website/generate_api_references.py +427 -0
  7. autogen/_website/generate_mkdocs.py +1174 -0
  8. autogen/_website/notebook_processor.py +476 -0
  9. autogen/_website/process_notebooks.py +656 -0
  10. autogen/_website/utils.py +412 -0
  11. autogen/agentchat/__init__.py +44 -0
  12. autogen/agentchat/agent.py +182 -0
  13. autogen/agentchat/assistant_agent.py +85 -0
  14. autogen/agentchat/chat.py +309 -0
  15. autogen/agentchat/contrib/__init__.py +5 -0
  16. autogen/agentchat/contrib/agent_eval/README.md +7 -0
  17. autogen/agentchat/contrib/agent_eval/agent_eval.py +108 -0
  18. autogen/agentchat/contrib/agent_eval/criterion.py +43 -0
  19. autogen/agentchat/contrib/agent_eval/critic_agent.py +44 -0
  20. autogen/agentchat/contrib/agent_eval/quantifier_agent.py +39 -0
  21. autogen/agentchat/contrib/agent_eval/subcritic_agent.py +45 -0
  22. autogen/agentchat/contrib/agent_eval/task.py +42 -0
  23. autogen/agentchat/contrib/agent_optimizer.py +429 -0
  24. autogen/agentchat/contrib/capabilities/__init__.py +5 -0
  25. autogen/agentchat/contrib/capabilities/agent_capability.py +20 -0
  26. autogen/agentchat/contrib/capabilities/generate_images.py +301 -0
  27. autogen/agentchat/contrib/capabilities/teachability.py +393 -0
  28. autogen/agentchat/contrib/capabilities/text_compressors.py +66 -0
  29. autogen/agentchat/contrib/capabilities/tools_capability.py +22 -0
  30. autogen/agentchat/contrib/capabilities/transform_messages.py +93 -0
  31. autogen/agentchat/contrib/capabilities/transforms.py +566 -0
  32. autogen/agentchat/contrib/capabilities/transforms_util.py +122 -0
  33. autogen/agentchat/contrib/capabilities/vision_capability.py +214 -0
  34. autogen/agentchat/contrib/captainagent/__init__.py +9 -0
  35. autogen/agentchat/contrib/captainagent/agent_builder.py +790 -0
  36. autogen/agentchat/contrib/captainagent/captainagent.py +512 -0
  37. autogen/agentchat/contrib/captainagent/tool_retriever.py +335 -0
  38. autogen/agentchat/contrib/captainagent/tools/README.md +44 -0
  39. autogen/agentchat/contrib/captainagent/tools/__init__.py +5 -0
  40. autogen/agentchat/contrib/captainagent/tools/data_analysis/calculate_correlation.py +40 -0
  41. autogen/agentchat/contrib/captainagent/tools/data_analysis/calculate_skewness_and_kurtosis.py +28 -0
  42. autogen/agentchat/contrib/captainagent/tools/data_analysis/detect_outlier_iqr.py +28 -0
  43. autogen/agentchat/contrib/captainagent/tools/data_analysis/detect_outlier_zscore.py +28 -0
  44. autogen/agentchat/contrib/captainagent/tools/data_analysis/explore_csv.py +21 -0
  45. autogen/agentchat/contrib/captainagent/tools/data_analysis/shapiro_wilk_test.py +30 -0
  46. autogen/agentchat/contrib/captainagent/tools/information_retrieval/arxiv_download.py +27 -0
  47. autogen/agentchat/contrib/captainagent/tools/information_retrieval/arxiv_search.py +53 -0
  48. autogen/agentchat/contrib/captainagent/tools/information_retrieval/extract_pdf_image.py +53 -0
  49. autogen/agentchat/contrib/captainagent/tools/information_retrieval/extract_pdf_text.py +38 -0
  50. autogen/agentchat/contrib/captainagent/tools/information_retrieval/get_wikipedia_text.py +21 -0
  51. autogen/agentchat/contrib/captainagent/tools/information_retrieval/get_youtube_caption.py +34 -0
  52. autogen/agentchat/contrib/captainagent/tools/information_retrieval/image_qa.py +60 -0
  53. autogen/agentchat/contrib/captainagent/tools/information_retrieval/optical_character_recognition.py +61 -0
  54. autogen/agentchat/contrib/captainagent/tools/information_retrieval/perform_web_search.py +47 -0
  55. autogen/agentchat/contrib/captainagent/tools/information_retrieval/scrape_wikipedia_tables.py +33 -0
  56. autogen/agentchat/contrib/captainagent/tools/information_retrieval/transcribe_audio_file.py +21 -0
  57. autogen/agentchat/contrib/captainagent/tools/information_retrieval/youtube_download.py +35 -0
  58. autogen/agentchat/contrib/captainagent/tools/math/calculate_circle_area_from_diameter.py +21 -0
  59. autogen/agentchat/contrib/captainagent/tools/math/calculate_day_of_the_week.py +18 -0
  60. autogen/agentchat/contrib/captainagent/tools/math/calculate_fraction_sum.py +28 -0
  61. autogen/agentchat/contrib/captainagent/tools/math/calculate_matrix_power.py +31 -0
  62. autogen/agentchat/contrib/captainagent/tools/math/calculate_reflected_point.py +16 -0
  63. autogen/agentchat/contrib/captainagent/tools/math/complex_numbers_product.py +25 -0
  64. autogen/agentchat/contrib/captainagent/tools/math/compute_currency_conversion.py +23 -0
  65. autogen/agentchat/contrib/captainagent/tools/math/count_distinct_permutations.py +27 -0
  66. autogen/agentchat/contrib/captainagent/tools/math/evaluate_expression.py +28 -0
  67. autogen/agentchat/contrib/captainagent/tools/math/find_continuity_point.py +34 -0
  68. autogen/agentchat/contrib/captainagent/tools/math/fraction_to_mixed_numbers.py +39 -0
  69. autogen/agentchat/contrib/captainagent/tools/math/modular_inverse_sum.py +23 -0
  70. autogen/agentchat/contrib/captainagent/tools/math/simplify_mixed_numbers.py +36 -0
  71. autogen/agentchat/contrib/captainagent/tools/math/sum_of_digit_factorials.py +15 -0
  72. autogen/agentchat/contrib/captainagent/tools/math/sum_of_primes_below.py +15 -0
  73. autogen/agentchat/contrib/captainagent/tools/requirements.txt +10 -0
  74. autogen/agentchat/contrib/captainagent/tools/tool_description.tsv +34 -0
  75. autogen/agentchat/contrib/gpt_assistant_agent.py +526 -0
  76. autogen/agentchat/contrib/graph_rag/__init__.py +9 -0
  77. autogen/agentchat/contrib/graph_rag/document.py +29 -0
  78. autogen/agentchat/contrib/graph_rag/falkor_graph_query_engine.py +170 -0
  79. autogen/agentchat/contrib/graph_rag/falkor_graph_rag_capability.py +103 -0
  80. autogen/agentchat/contrib/graph_rag/graph_query_engine.py +53 -0
  81. autogen/agentchat/contrib/graph_rag/graph_rag_capability.py +63 -0
  82. autogen/agentchat/contrib/graph_rag/neo4j_graph_query_engine.py +268 -0
  83. autogen/agentchat/contrib/graph_rag/neo4j_graph_rag_capability.py +83 -0
  84. autogen/agentchat/contrib/graph_rag/neo4j_native_graph_query_engine.py +210 -0
  85. autogen/agentchat/contrib/graph_rag/neo4j_native_graph_rag_capability.py +93 -0
  86. autogen/agentchat/contrib/img_utils.py +397 -0
  87. autogen/agentchat/contrib/llamaindex_conversable_agent.py +117 -0
  88. autogen/agentchat/contrib/llava_agent.py +187 -0
  89. autogen/agentchat/contrib/math_user_proxy_agent.py +464 -0
  90. autogen/agentchat/contrib/multimodal_conversable_agent.py +125 -0
  91. autogen/agentchat/contrib/qdrant_retrieve_user_proxy_agent.py +324 -0
  92. autogen/agentchat/contrib/rag/__init__.py +10 -0
  93. autogen/agentchat/contrib/rag/chromadb_query_engine.py +272 -0
  94. autogen/agentchat/contrib/rag/llamaindex_query_engine.py +198 -0
  95. autogen/agentchat/contrib/rag/mongodb_query_engine.py +329 -0
  96. autogen/agentchat/contrib/rag/query_engine.py +74 -0
  97. autogen/agentchat/contrib/retrieve_assistant_agent.py +56 -0
  98. autogen/agentchat/contrib/retrieve_user_proxy_agent.py +703 -0
  99. autogen/agentchat/contrib/society_of_mind_agent.py +199 -0
  100. autogen/agentchat/contrib/swarm_agent.py +1425 -0
  101. autogen/agentchat/contrib/text_analyzer_agent.py +79 -0
  102. autogen/agentchat/contrib/vectordb/__init__.py +5 -0
  103. autogen/agentchat/contrib/vectordb/base.py +232 -0
  104. autogen/agentchat/contrib/vectordb/chromadb.py +315 -0
  105. autogen/agentchat/contrib/vectordb/couchbase.py +407 -0
  106. autogen/agentchat/contrib/vectordb/mongodb.py +550 -0
  107. autogen/agentchat/contrib/vectordb/pgvectordb.py +928 -0
  108. autogen/agentchat/contrib/vectordb/qdrant.py +320 -0
  109. autogen/agentchat/contrib/vectordb/utils.py +126 -0
  110. autogen/agentchat/contrib/web_surfer.py +303 -0
  111. autogen/agentchat/conversable_agent.py +4020 -0
  112. autogen/agentchat/group/__init__.py +64 -0
  113. autogen/agentchat/group/available_condition.py +91 -0
  114. autogen/agentchat/group/context_condition.py +77 -0
  115. autogen/agentchat/group/context_expression.py +238 -0
  116. autogen/agentchat/group/context_str.py +41 -0
  117. autogen/agentchat/group/context_variables.py +192 -0
  118. autogen/agentchat/group/group_tool_executor.py +202 -0
  119. autogen/agentchat/group/group_utils.py +591 -0
  120. autogen/agentchat/group/handoffs.py +244 -0
  121. autogen/agentchat/group/llm_condition.py +93 -0
  122. autogen/agentchat/group/multi_agent_chat.py +237 -0
  123. autogen/agentchat/group/on_condition.py +58 -0
  124. autogen/agentchat/group/on_context_condition.py +54 -0
  125. autogen/agentchat/group/patterns/__init__.py +18 -0
  126. autogen/agentchat/group/patterns/auto.py +159 -0
  127. autogen/agentchat/group/patterns/manual.py +176 -0
  128. autogen/agentchat/group/patterns/pattern.py +288 -0
  129. autogen/agentchat/group/patterns/random.py +106 -0
  130. autogen/agentchat/group/patterns/round_robin.py +117 -0
  131. autogen/agentchat/group/reply_result.py +26 -0
  132. autogen/agentchat/group/speaker_selection_result.py +41 -0
  133. autogen/agentchat/group/targets/__init__.py +4 -0
  134. autogen/agentchat/group/targets/group_chat_target.py +132 -0
  135. autogen/agentchat/group/targets/group_manager_target.py +151 -0
  136. autogen/agentchat/group/targets/transition_target.py +413 -0
  137. autogen/agentchat/group/targets/transition_utils.py +6 -0
  138. autogen/agentchat/groupchat.py +1694 -0
  139. autogen/agentchat/realtime/__init__.py +3 -0
  140. autogen/agentchat/realtime/experimental/__init__.py +20 -0
  141. autogen/agentchat/realtime/experimental/audio_adapters/__init__.py +8 -0
  142. autogen/agentchat/realtime/experimental/audio_adapters/twilio_audio_adapter.py +148 -0
  143. autogen/agentchat/realtime/experimental/audio_adapters/websocket_audio_adapter.py +139 -0
  144. autogen/agentchat/realtime/experimental/audio_observer.py +42 -0
  145. autogen/agentchat/realtime/experimental/clients/__init__.py +15 -0
  146. autogen/agentchat/realtime/experimental/clients/gemini/__init__.py +7 -0
  147. autogen/agentchat/realtime/experimental/clients/gemini/client.py +274 -0
  148. autogen/agentchat/realtime/experimental/clients/oai/__init__.py +8 -0
  149. autogen/agentchat/realtime/experimental/clients/oai/base_client.py +220 -0
  150. autogen/agentchat/realtime/experimental/clients/oai/rtc_client.py +243 -0
  151. autogen/agentchat/realtime/experimental/clients/oai/utils.py +48 -0
  152. autogen/agentchat/realtime/experimental/clients/realtime_client.py +190 -0
  153. autogen/agentchat/realtime/experimental/function_observer.py +85 -0
  154. autogen/agentchat/realtime/experimental/realtime_agent.py +158 -0
  155. autogen/agentchat/realtime/experimental/realtime_events.py +42 -0
  156. autogen/agentchat/realtime/experimental/realtime_observer.py +100 -0
  157. autogen/agentchat/realtime/experimental/realtime_swarm.py +475 -0
  158. autogen/agentchat/realtime/experimental/websockets.py +21 -0
  159. autogen/agentchat/realtime_agent/__init__.py +21 -0
  160. autogen/agentchat/user_proxy_agent.py +111 -0
  161. autogen/agentchat/utils.py +206 -0
  162. autogen/agents/__init__.py +3 -0
  163. autogen/agents/contrib/__init__.py +10 -0
  164. autogen/agents/contrib/time/__init__.py +8 -0
  165. autogen/agents/contrib/time/time_reply_agent.py +73 -0
  166. autogen/agents/contrib/time/time_tool_agent.py +51 -0
  167. autogen/agents/experimental/__init__.py +27 -0
  168. autogen/agents/experimental/deep_research/__init__.py +7 -0
  169. autogen/agents/experimental/deep_research/deep_research.py +52 -0
  170. autogen/agents/experimental/discord/__init__.py +7 -0
  171. autogen/agents/experimental/discord/discord.py +66 -0
  172. autogen/agents/experimental/document_agent/__init__.py +19 -0
  173. autogen/agents/experimental/document_agent/chroma_query_engine.py +316 -0
  174. autogen/agents/experimental/document_agent/docling_doc_ingest_agent.py +118 -0
  175. autogen/agents/experimental/document_agent/document_agent.py +461 -0
  176. autogen/agents/experimental/document_agent/document_conditions.py +50 -0
  177. autogen/agents/experimental/document_agent/document_utils.py +380 -0
  178. autogen/agents/experimental/document_agent/inmemory_query_engine.py +220 -0
  179. autogen/agents/experimental/document_agent/parser_utils.py +130 -0
  180. autogen/agents/experimental/document_agent/url_utils.py +426 -0
  181. autogen/agents/experimental/reasoning/__init__.py +7 -0
  182. autogen/agents/experimental/reasoning/reasoning_agent.py +1178 -0
  183. autogen/agents/experimental/slack/__init__.py +7 -0
  184. autogen/agents/experimental/slack/slack.py +73 -0
  185. autogen/agents/experimental/telegram/__init__.py +7 -0
  186. autogen/agents/experimental/telegram/telegram.py +77 -0
  187. autogen/agents/experimental/websurfer/__init__.py +7 -0
  188. autogen/agents/experimental/websurfer/websurfer.py +62 -0
  189. autogen/agents/experimental/wikipedia/__init__.py +7 -0
  190. autogen/agents/experimental/wikipedia/wikipedia.py +90 -0
  191. autogen/browser_utils.py +309 -0
  192. autogen/cache/__init__.py +10 -0
  193. autogen/cache/abstract_cache_base.py +75 -0
  194. autogen/cache/cache.py +203 -0
  195. autogen/cache/cache_factory.py +88 -0
  196. autogen/cache/cosmos_db_cache.py +144 -0
  197. autogen/cache/disk_cache.py +102 -0
  198. autogen/cache/in_memory_cache.py +58 -0
  199. autogen/cache/redis_cache.py +123 -0
  200. autogen/code_utils.py +596 -0
  201. autogen/coding/__init__.py +22 -0
  202. autogen/coding/base.py +119 -0
  203. autogen/coding/docker_commandline_code_executor.py +268 -0
  204. autogen/coding/factory.py +47 -0
  205. autogen/coding/func_with_reqs.py +202 -0
  206. autogen/coding/jupyter/__init__.py +23 -0
  207. autogen/coding/jupyter/base.py +36 -0
  208. autogen/coding/jupyter/docker_jupyter_server.py +167 -0
  209. autogen/coding/jupyter/embedded_ipython_code_executor.py +182 -0
  210. autogen/coding/jupyter/import_utils.py +82 -0
  211. autogen/coding/jupyter/jupyter_client.py +231 -0
  212. autogen/coding/jupyter/jupyter_code_executor.py +160 -0
  213. autogen/coding/jupyter/local_jupyter_server.py +172 -0
  214. autogen/coding/local_commandline_code_executor.py +405 -0
  215. autogen/coding/markdown_code_extractor.py +45 -0
  216. autogen/coding/utils.py +56 -0
  217. autogen/doc_utils.py +34 -0
  218. autogen/events/__init__.py +7 -0
  219. autogen/events/agent_events.py +1010 -0
  220. autogen/events/base_event.py +99 -0
  221. autogen/events/client_events.py +167 -0
  222. autogen/events/helpers.py +36 -0
  223. autogen/events/print_event.py +46 -0
  224. autogen/exception_utils.py +73 -0
  225. autogen/extensions/__init__.py +5 -0
  226. autogen/fast_depends/__init__.py +16 -0
  227. autogen/fast_depends/_compat.py +80 -0
  228. autogen/fast_depends/core/__init__.py +14 -0
  229. autogen/fast_depends/core/build.py +225 -0
  230. autogen/fast_depends/core/model.py +576 -0
  231. autogen/fast_depends/dependencies/__init__.py +15 -0
  232. autogen/fast_depends/dependencies/model.py +29 -0
  233. autogen/fast_depends/dependencies/provider.py +39 -0
  234. autogen/fast_depends/library/__init__.py +10 -0
  235. autogen/fast_depends/library/model.py +46 -0
  236. autogen/fast_depends/py.typed +6 -0
  237. autogen/fast_depends/schema.py +66 -0
  238. autogen/fast_depends/use.py +280 -0
  239. autogen/fast_depends/utils.py +187 -0
  240. autogen/formatting_utils.py +83 -0
  241. autogen/function_utils.py +13 -0
  242. autogen/graph_utils.py +178 -0
  243. autogen/import_utils.py +526 -0
  244. autogen/interop/__init__.py +22 -0
  245. autogen/interop/crewai/__init__.py +7 -0
  246. autogen/interop/crewai/crewai.py +88 -0
  247. autogen/interop/interoperability.py +71 -0
  248. autogen/interop/interoperable.py +46 -0
  249. autogen/interop/langchain/__init__.py +8 -0
  250. autogen/interop/langchain/langchain_chat_model_factory.py +155 -0
  251. autogen/interop/langchain/langchain_tool.py +82 -0
  252. autogen/interop/litellm/__init__.py +7 -0
  253. autogen/interop/litellm/litellm_config_factory.py +113 -0
  254. autogen/interop/pydantic_ai/__init__.py +7 -0
  255. autogen/interop/pydantic_ai/pydantic_ai.py +168 -0
  256. autogen/interop/registry.py +69 -0
  257. autogen/io/__init__.py +15 -0
  258. autogen/io/base.py +151 -0
  259. autogen/io/console.py +56 -0
  260. autogen/io/processors/__init__.py +12 -0
  261. autogen/io/processors/base.py +21 -0
  262. autogen/io/processors/console_event_processor.py +56 -0
  263. autogen/io/run_response.py +293 -0
  264. autogen/io/thread_io_stream.py +63 -0
  265. autogen/io/websockets.py +213 -0
  266. autogen/json_utils.py +43 -0
  267. autogen/llm_config.py +379 -0
  268. autogen/logger/__init__.py +11 -0
  269. autogen/logger/base_logger.py +128 -0
  270. autogen/logger/file_logger.py +261 -0
  271. autogen/logger/logger_factory.py +42 -0
  272. autogen/logger/logger_utils.py +57 -0
  273. autogen/logger/sqlite_logger.py +523 -0
  274. autogen/math_utils.py +339 -0
  275. autogen/mcp/__init__.py +7 -0
  276. autogen/mcp/mcp_client.py +208 -0
  277. autogen/messages/__init__.py +7 -0
  278. autogen/messages/agent_messages.py +948 -0
  279. autogen/messages/base_message.py +107 -0
  280. autogen/messages/client_messages.py +171 -0
  281. autogen/messages/print_message.py +49 -0
  282. autogen/oai/__init__.py +53 -0
  283. autogen/oai/anthropic.py +714 -0
  284. autogen/oai/bedrock.py +628 -0
  285. autogen/oai/cerebras.py +299 -0
  286. autogen/oai/client.py +1435 -0
  287. autogen/oai/client_utils.py +169 -0
  288. autogen/oai/cohere.py +479 -0
  289. autogen/oai/gemini.py +990 -0
  290. autogen/oai/gemini_types.py +129 -0
  291. autogen/oai/groq.py +305 -0
  292. autogen/oai/mistral.py +303 -0
  293. autogen/oai/oai_models/__init__.py +11 -0
  294. autogen/oai/oai_models/_models.py +16 -0
  295. autogen/oai/oai_models/chat_completion.py +87 -0
  296. autogen/oai/oai_models/chat_completion_audio.py +32 -0
  297. autogen/oai/oai_models/chat_completion_message.py +86 -0
  298. autogen/oai/oai_models/chat_completion_message_tool_call.py +37 -0
  299. autogen/oai/oai_models/chat_completion_token_logprob.py +63 -0
  300. autogen/oai/oai_models/completion_usage.py +60 -0
  301. autogen/oai/ollama.py +643 -0
  302. autogen/oai/openai_utils.py +881 -0
  303. autogen/oai/together.py +370 -0
  304. autogen/retrieve_utils.py +491 -0
  305. autogen/runtime_logging.py +160 -0
  306. autogen/token_count_utils.py +267 -0
  307. autogen/tools/__init__.py +20 -0
  308. autogen/tools/contrib/__init__.py +9 -0
  309. autogen/tools/contrib/time/__init__.py +7 -0
  310. autogen/tools/contrib/time/time.py +41 -0
  311. autogen/tools/dependency_injection.py +254 -0
  312. autogen/tools/experimental/__init__.py +43 -0
  313. autogen/tools/experimental/browser_use/__init__.py +7 -0
  314. autogen/tools/experimental/browser_use/browser_use.py +161 -0
  315. autogen/tools/experimental/crawl4ai/__init__.py +7 -0
  316. autogen/tools/experimental/crawl4ai/crawl4ai.py +153 -0
  317. autogen/tools/experimental/deep_research/__init__.py +7 -0
  318. autogen/tools/experimental/deep_research/deep_research.py +328 -0
  319. autogen/tools/experimental/duckduckgo/__init__.py +7 -0
  320. autogen/tools/experimental/duckduckgo/duckduckgo_search.py +109 -0
  321. autogen/tools/experimental/google/__init__.py +14 -0
  322. autogen/tools/experimental/google/authentication/__init__.py +11 -0
  323. autogen/tools/experimental/google/authentication/credentials_hosted_provider.py +43 -0
  324. autogen/tools/experimental/google/authentication/credentials_local_provider.py +91 -0
  325. autogen/tools/experimental/google/authentication/credentials_provider.py +35 -0
  326. autogen/tools/experimental/google/drive/__init__.py +9 -0
  327. autogen/tools/experimental/google/drive/drive_functions.py +124 -0
  328. autogen/tools/experimental/google/drive/toolkit.py +88 -0
  329. autogen/tools/experimental/google/model.py +17 -0
  330. autogen/tools/experimental/google/toolkit_protocol.py +19 -0
  331. autogen/tools/experimental/google_search/__init__.py +8 -0
  332. autogen/tools/experimental/google_search/google_search.py +93 -0
  333. autogen/tools/experimental/google_search/youtube_search.py +181 -0
  334. autogen/tools/experimental/messageplatform/__init__.py +17 -0
  335. autogen/tools/experimental/messageplatform/discord/__init__.py +7 -0
  336. autogen/tools/experimental/messageplatform/discord/discord.py +288 -0
  337. autogen/tools/experimental/messageplatform/slack/__init__.py +7 -0
  338. autogen/tools/experimental/messageplatform/slack/slack.py +391 -0
  339. autogen/tools/experimental/messageplatform/telegram/__init__.py +7 -0
  340. autogen/tools/experimental/messageplatform/telegram/telegram.py +275 -0
  341. autogen/tools/experimental/perplexity/__init__.py +7 -0
  342. autogen/tools/experimental/perplexity/perplexity_search.py +260 -0
  343. autogen/tools/experimental/tavily/__init__.py +7 -0
  344. autogen/tools/experimental/tavily/tavily_search.py +183 -0
  345. autogen/tools/experimental/web_search_preview/__init__.py +7 -0
  346. autogen/tools/experimental/web_search_preview/web_search_preview.py +114 -0
  347. autogen/tools/experimental/wikipedia/__init__.py +7 -0
  348. autogen/tools/experimental/wikipedia/wikipedia.py +287 -0
  349. autogen/tools/function_utils.py +411 -0
  350. autogen/tools/tool.py +187 -0
  351. autogen/tools/toolkit.py +86 -0
  352. autogen/types.py +29 -0
  353. autogen/version.py +7 -0
  354. ag2-0.9.1a1.dist-info/RECORD +0 -6
  355. ag2-0.9.1a1.dist-info/top_level.txt +0 -1
  356. {ag2-0.9.1a1.dist-info → ag2-0.9.1.post0.dist-info/licenses}/LICENSE +0 -0
  357. {ag2-0.9.1a1.dist-info → ag2-0.9.1.post0.dist-info/licenses}/NOTICE.md +0 -0
@@ -0,0 +1,512 @@
1
+ # Copyright (c) 2023 - 2025, AG2ai, Inc., AG2ai open-source projects maintainers and core contributors
2
+ #
3
+ # SPDX-License-Identifier: Apache-2.0
4
+ import hashlib
5
+ import json
6
+ import os
7
+ from typing import Any, Callable, Literal, Optional, Union
8
+
9
+ from termcolor import colored
10
+
11
+ from .... import GroupChat, GroupChatManager, UserProxyAgent
12
+ from ....doc_utils import export_module
13
+ from ....llm_config import LLMConfig
14
+ from ...conversable_agent import ConversableAgent
15
+ from .agent_builder import AgentBuilder
16
+ from .tool_retriever import ToolBuilder, format_ag2_tool, get_full_tool_description
17
+
18
+
19
+ @export_module("autogen.agentchat.contrib.captainagent")
20
+ class CaptainAgent(ConversableAgent):
21
+ """(In preview) Captain agent, designed to solve a task with an agent or a group of agents."""
22
+
23
+ DEFAULT_NESTED_CONFIG = {
24
+ "autobuild_init_config": {
25
+ "config_file_or_env": "OAI_CONFIG_LIST",
26
+ "builder_model": "gpt-4o",
27
+ "agent_model": "gpt-4o",
28
+ },
29
+ "autobuild_build_config": {
30
+ "default_llm_config": {"temperature": 1, "top_p": 0.95, "max_tokens": 2048},
31
+ "code_execution_config": {
32
+ "timeout": 300,
33
+ "work_dir": "groupchat",
34
+ "last_n_messages": 1,
35
+ "use_docker": False,
36
+ },
37
+ "coding": True,
38
+ },
39
+ "group_chat_config": {"max_round": 10},
40
+ "group_chat_llm_config": None,
41
+ "max_turns": 5,
42
+ }
43
+
44
+ AUTOBUILD_TOOL = {
45
+ "type": "function",
46
+ "function": {
47
+ "name": "seek_experts_help",
48
+ "description": """Build a group of experts and let them chat with each other in a group chat.""",
49
+ "parameters": {
50
+ "type": "object",
51
+ "properties": {
52
+ "group_name": {"type": "string", "description": "[REQUIRED] Name of the group."},
53
+ "building_task": {
54
+ "type": "string",
55
+ "description": """Instructions that help a build manager to build a group of experts.""",
56
+ },
57
+ "execution_task": {
58
+ "type": "string",
59
+ "description": """[REQUIRED] The task that needs the experts to solve by conversation.""",
60
+ },
61
+ },
62
+ },
63
+ },
64
+ }
65
+
66
+ AUTOBUILD_SYSTEM_MESSAGE = """# Your role
67
+ You are a perfect manager of a group of advanced experts.
68
+
69
+ # How to solve the task
70
+ When a task is assigned to you:
71
+ 1. Analysis of its constraints and conditions for completion.
72
+ 2. Respond with a specific plan of how to solve the task.
73
+
74
+ After that, you can solve the task in two ways:
75
+ - Delegate the resolution of tasks to other experts created by seeking a group of experts for help and derive conclusive insights from their conversation summarization.
76
+ - Analysis and solve the task with your coding and language skills.
77
+
78
+ # How to seek experts help
79
+ The tool "seek_experts_help" can build a group of experts according to the building_task and let them chat with each other in a group chat to solve the execution_task you provided.
80
+ - This tool will summarize the essence of the experts' conversation and the derived conclusions.
81
+ - You should not modify any task information from meta_user_proxy, including code blocks, but you can provide extra information.
82
+ - Within a single response, you are limited to initiating one group of experts.
83
+
84
+ ## building_task
85
+ This task helps a build manager to build a group of experts for your task.
86
+ You should suggest less then three roles (including a checker for verification) with the following format.
87
+
88
+ ### Format
89
+ - [Detailed description for role 1]
90
+ - [Detailed description for role 2]
91
+ - [Detailed description for checker]
92
+
93
+ ## execution_task
94
+ This is the task that needs the experts to solve by conversation.
95
+ You should Provide the following information in markdown format.
96
+
97
+ ### Format
98
+ ## Task description
99
+ ...
100
+ ## Plan for solving the task
101
+ ...
102
+ ## Output format
103
+ ...
104
+ ## Constraints and conditions for completion
105
+ ...
106
+ ## [Optional] results (including code blocks) and reason from last response
107
+ ...
108
+
109
+ # After seek_experts_help
110
+ You will receive a comprehensive conclusion from the conversation, including the task information, results, reason for the results, conversation contradiction or issues, and additional information.
111
+ You **must** conduct a thorough verification for the result and reason's logical compliance by leveraging the step-by-step backward reasoning with the same group of experts (with the same group name) when:
112
+ - The conversation has contradictions or issues (need double-check marked as yes), or
113
+ - The result is different from the previous results.
114
+
115
+ Note that the previous experts will forget everything after you obtain the response from them. You should provide the results (including code blocks) you collected from the previous experts' response and put it in the new execution_task.
116
+
117
+ # Some useful instructions
118
+ - You only have one tool called "seek_experts_help".
119
+ - Provide a answer yourself after "seek_experts_help".
120
+ - You should suggest python code in a python coding block (```python...```). If you need to get the value of a variable, you must use the print statement.
121
+ - When using code, you must indicate the script type in the code block.
122
+ - Do not suggest incomplete code which requires users to modify.
123
+ - Be clear about which step uses code, which step uses your language skill, and which step to build a group chat.
124
+ - If the code's result indicates there is an error, fix the error and output the whole code again.
125
+ - If the error can't be fixed or if the task is not solved even after the code is executed successfully, analyze the problem, revisit your assumption, collect additional info you need, and think of a different approach to try.
126
+ - Include verifiable evidence in your response if possible.
127
+ - After completing all tasks and verifications, you should conclude the operation and reply "TERMINATE"
128
+ """
129
+
130
+ DEFAULT_DESCRIPTION = "A helpful AI assistant that can build a group of agents at a proper time to solve a task."
131
+
132
+ # This is used to prompt the LLM to summarize the conversation history between CaptainAgent's tool execution history
133
+ DEFAULT_SUMMARY_PROMPT = "Read the following conversation history between an expert and a group of agent experts, summarize the conversation history. Your summarization should include the initial task, the experts' plan and the attempt, finally the results of the conversation. If the experts arrived at a conclusion, state it as it is without any modification."
134
+
135
+ def __init__(
136
+ self,
137
+ name: str,
138
+ system_message: Optional[str] = None,
139
+ llm_config: Optional[Union[LLMConfig, dict[str, Any], Literal[False]]] = None,
140
+ is_termination_msg: Optional[Callable[[dict[str, Any]], bool]] = None,
141
+ max_consecutive_auto_reply: Optional[int] = None,
142
+ human_input_mode: Optional[str] = "NEVER",
143
+ code_execution_config: Optional[Union[dict[str, Any], Literal[False]]] = False,
144
+ nested_config: Optional[dict[str, Any]] = None,
145
+ agent_lib: Optional[str] = None,
146
+ tool_lib: Optional[str] = None,
147
+ agent_config_save_path: Optional[str] = None,
148
+ description: Optional[str] = DEFAULT_DESCRIPTION,
149
+ **kwargs: Any,
150
+ ):
151
+ """Args:
152
+ name (str): agent name.
153
+ system_message (str): system message for the ChatCompletion inference.
154
+ Please override this attribute if you want to reprogram the agent.
155
+ llm_config (LLMConfig or dict or False): llm inference configuration.
156
+ Please refer to [OpenAIWrapper.create](https://docs.ag2.ai/latest/docs/api-reference/autogen/OpenAIWrapper/#autogen.OpenAIWrapper.create) for available options.
157
+ is_termination_msg (function): a function that takes a message in the form of a dictionary
158
+ and returns a boolean value indicating if this received message is a termination message.
159
+ The dict can contain the following keys: "content", "role", "name", "function_call".
160
+ max_consecutive_auto_reply (int): the maximum number of consecutive auto replies.
161
+ default to None (no limit provided, class attribute MAX_CONSECUTIVE_AUTO_REPLY will be used as the limit in this case).
162
+ The limit only plays a role when human_input_mode is not "ALWAYS".
163
+ agent_lib (str): the path or a JSON file of the agent library for retrieving the nested chat instantiated by CaptainAgent.
164
+ tool_lib (str): the path to the tool library for retrieving the tools used in the nested chat instantiated by CaptainAgent.
165
+ nested_config (dict): the configuration for the nested chat instantiated by CaptainAgent.
166
+ A full list of keys and their functionalities can be found in [docs](https://docs.ag2.ai/latest/docs/user-guide/reference-agents/captainagent).
167
+ agent_config_save_path (str): the path to save the generated or retrieved agent configuration.
168
+ **kwargs (dict): Please refer to other kwargs in
169
+ [ConversableAgent](https://github.com/ag2ai/ag2/blob/main/autogen/agentchat/conversable_agent.py#L74).
170
+ """
171
+ super().__init__(
172
+ name,
173
+ is_termination_msg=is_termination_msg,
174
+ max_consecutive_auto_reply=max_consecutive_auto_reply,
175
+ human_input_mode=human_input_mode,
176
+ code_execution_config=code_execution_config,
177
+ llm_config=llm_config,
178
+ description=description,
179
+ **kwargs,
180
+ )
181
+
182
+ llm_config = LLMConfig.get_current_llm_config(llm_config)
183
+
184
+ if system_message is None:
185
+ system_message = self.AUTOBUILD_SYSTEM_MESSAGE
186
+ nested_config = self._update_config(self.DEFAULT_NESTED_CONFIG, nested_config)
187
+ if (
188
+ "llm_config" not in nested_config["autobuild_init_config"]
189
+ or nested_config["autobuild_init_config"]["llm_config"] is None
190
+ ):
191
+ nested_config["autobuild_init_config"]["llm_config"] = llm_config.copy()
192
+ if nested_config["group_chat_llm_config"] is None:
193
+ nested_config["group_chat_llm_config"] = llm_config.copy()
194
+ if agent_lib:
195
+ nested_config["autobuild_build_config"]["library_path_or_json"] = agent_lib
196
+ if tool_lib:
197
+ if "autobuild_tool_config" not in nested_config:
198
+ nested_config["autobuild_tool_config"] = {}
199
+ nested_config["autobuild_tool_config"]["tool_root"] = tool_lib
200
+
201
+ self.assistant = ConversableAgent(name="CaptainAgent", system_message=system_message, llm_config=llm_config)
202
+ self.assistant.update_tool_signature(self.AUTOBUILD_TOOL, is_remove=False)
203
+
204
+ self.executor = CaptainUserProxyAgent(
205
+ name="Expert_summoner",
206
+ nested_config=nested_config,
207
+ agent_config_save_path=agent_config_save_path,
208
+ is_termination_msg=lambda x: x.get("content", "") and "terminate" in x.get("content", "").lower(),
209
+ code_execution_config=code_execution_config,
210
+ human_input_mode="NEVER",
211
+ )
212
+
213
+ self.register_nested_chats(
214
+ [
215
+ {
216
+ "sender": self.executor,
217
+ "recipient": self.assistant,
218
+ "max_turns": nested_config["max_turns"],
219
+ "summary_method": "reflection_with_llm",
220
+ "summary_args": {
221
+ "summary_prompt": self.DEFAULT_SUMMARY_PROMPT,
222
+ },
223
+ }
224
+ ],
225
+ trigger=UserProxyAgent,
226
+ position=0,
227
+ )
228
+
229
+ @staticmethod
230
+ def _update_config(default_dict: dict[str, Any], update_dict: Optional[dict[str, Any]]) -> dict[str, Any]:
231
+ """Recursively updates the default_dict with values from update_dict."""
232
+ if update_dict is None:
233
+ return default_dict
234
+
235
+ for key, value in update_dict.items():
236
+ default_value = default_dict.get(key)
237
+ if isinstance(default_value, dict) and isinstance(value, dict):
238
+ # Recursively update nested dictionaries
239
+ default_dict[key] = CaptainAgent._update_config(default_value, value)
240
+ else:
241
+ # Update the value or add new key
242
+ default_dict[key] = value
243
+
244
+ return default_dict
245
+
246
+
247
+ class CaptainUserProxyAgent(ConversableAgent):
248
+ """(In preview) A proxy agent for the captain agent, that can execute code and provide feedback to the other agents."""
249
+
250
+ CONVERSATION_REVIEW_PROMPT = """# Your task
251
+ Briefly summarize the conversation history derived from an experts' group chat by following the answer format.
252
+ If you found non-trivial errors or issues in the conversation, point it out with a detailed reason, if you think it is worth further verification, mark the "Need double-check" as "Yes"
253
+ If you find the conversation ends with TERMINATE and the task is solved, this is normal situation, you can mark the "Need double-check" as "No".
254
+
255
+ # Conversation history:
256
+ {chat_history}
257
+
258
+ # Answer format
259
+ ## Task
260
+ ...
261
+
262
+ ## Results
263
+ ...
264
+
265
+ ## Reason for the results
266
+ ...
267
+
268
+ ## Errors or issues in the conversation
269
+ ...
270
+
271
+ ### Need to double-check?
272
+ [Yes or No]
273
+
274
+ ## Additional information (file path, code blocks, url, etc.)
275
+ ...
276
+ """
277
+
278
+ AUTOBUILD_TASK_DESC = """You are given: (1) a task and advises from your manager with a specific plan and (2) a general task.
279
+ Collect information from the general task, follow the suggestions from manager to solve the task.
280
+
281
+ # General Task
282
+ {general_task}
283
+
284
+ # Task and suggestions from manager
285
+ {manager_task} """
286
+
287
+ DEFAULT_AUTO_REPLY = "I'm a proxy and I can only execute your tool or end the conversation. If you think the problem is solved, please reply me only with 'TERMINATE'."
288
+
289
+ DEFAULT_USER_PROXY_AGENT_DESCRIPTIONS = {
290
+ "ALWAYS": "An attentive HUMAN user who can answer questions about the task, and can perform tasks such as running Python code or inputting command line commands at a Linux terminal and reporting back the execution results.",
291
+ "TERMINATE": "A user that can run Python code or input command line commands at a Linux terminal and report back the execution results.",
292
+ "NEVER": "A computer terminal that can running Python scripts (provided to it quoted in ```python code blocks), or sh shell scripts (provided to it quoted in ```sh code blocks), or the conversation history and result of a group of agents",
293
+ }
294
+
295
+ def __init__(
296
+ self,
297
+ name: str,
298
+ nested_config: dict[str, Any],
299
+ agent_config_save_path: str = None,
300
+ is_termination_msg: Optional[Callable[[dict[str, Any]], bool]] = None,
301
+ max_consecutive_auto_reply: Optional[int] = None,
302
+ human_input_mode: Optional[str] = "NEVER",
303
+ code_execution_config: Optional[Union[dict[str, Any], Literal[False]]] = None,
304
+ default_auto_reply: Optional[Union[str, dict[str, Any]]] = DEFAULT_AUTO_REPLY,
305
+ llm_config: Optional[Union[LLMConfig, dict[str, Any], Literal[False]]] = False,
306
+ system_message: Optional[Union[str, list]] = "",
307
+ description: Optional[str] = None,
308
+ ):
309
+ """Args:
310
+ name (str): name of the agent.
311
+ nested_config (dict): the configuration for the nested chat instantiated by CaptainAgent.
312
+ is_termination_msg (function): a function that takes a message in the form of a dictionary
313
+ and returns a boolean value indicating if this received message is a termination message.
314
+ The dict can contain the following keys: "content", "role", "name", "function_call".
315
+ max_consecutive_auto_reply (int): the maximum number of consecutive auto replies.
316
+ default to None (no limit provided, class attribute MAX_CONSECUTIVE_AUTO_REPLY will be used as the limit in this case).
317
+ The limit only plays a role when human_input_mode is not "ALWAYS".
318
+ human_input_mode (str): whether to ask for human inputs every time a message is received.
319
+ Possible values are "ALWAYS", "TERMINATE", "NEVER".
320
+ (1) When "ALWAYS", the agent prompts for human input every time a message is received.
321
+ Under this mode, the conversation stops when the human input is "exit",
322
+ or when is_termination_msg is True and there is no human input.
323
+ (2) When "TERMINATE", the agent only prompts for human input only when a termination message is received or
324
+ the number of auto reply reaches the max_consecutive_auto_reply.
325
+ (3) When "NEVER", the agent will never prompt for human input. Under this mode, the conversation stops
326
+ when the number of auto reply reaches the max_consecutive_auto_reply or when is_termination_msg is True.
327
+ code_execution_config (dict or False): config for the code execution.
328
+ To disable code execution, set to False. Otherwise, set to a dictionary with the following keys:
329
+ - work_dir (Optional, str): The working directory for the code execution.
330
+ If None, a default working directory will be used.
331
+ The default working directory is the "extensions" directory under
332
+ "path_to_autogen".
333
+ - use_docker (Optional, list, str or bool): The docker image to use for code execution.
334
+ Default is True, which means the code will be executed in a docker container. A default list of images will be used.
335
+ If a list or a str of image name(s) is provided, the code will be executed in a docker container
336
+ with the first image successfully pulled.
337
+ If False, the code will be executed in the current environment.
338
+ We strongly recommend using docker for code execution.
339
+ - timeout (Optional, int): The maximum execution time in seconds.
340
+ - last_n_messages (Experimental, Optional, int): The number of messages to look back for code execution. Default to 1.
341
+ default_auto_reply (str or dict or None): the default auto reply message when no code execution or llm based reply is generated.
342
+ llm_config (LLMConfig or dict or False): llm inference configuration.
343
+ Please refer to [OpenAIWrapper.create](https://docs.ag2.ai/latest/docs/api-reference/autogen/OpenAIWrapper/#autogen.OpenAIWrapper.create)
344
+ for available options.
345
+ Default to false, which disables llm-based auto reply.
346
+ system_message (str or List): system message for ChatCompletion inference.
347
+ Only used when llm_config is not False. Use it to reprogram the agent.
348
+ description (str): a short description of the agent. This description is used by other agents
349
+ (e.g. the GroupChatManager) to decide when to call upon this agent. (Default: system_message)
350
+ """
351
+ description = (
352
+ description if description is not None else self.DEFAULT_USER_PROXY_AGENT_DESCRIPTIONS[human_input_mode]
353
+ )
354
+ super().__init__(
355
+ name=name,
356
+ system_message=system_message,
357
+ is_termination_msg=is_termination_msg,
358
+ max_consecutive_auto_reply=max_consecutive_auto_reply,
359
+ human_input_mode=human_input_mode,
360
+ code_execution_config=code_execution_config,
361
+ llm_config=llm_config,
362
+ default_auto_reply=default_auto_reply,
363
+ description=description,
364
+ )
365
+ self.register_function(
366
+ function_map={
367
+ "seek_experts_help": lambda **args: self._run_autobuild(**args),
368
+ }
369
+ )
370
+ self._agent_config_save_path = agent_config_save_path
371
+ self._nested_config = nested_config.copy()
372
+ self._code_execution_config = code_execution_config
373
+ self.build_history = {}
374
+ self.tool_history = {}
375
+ self.build_times = 0
376
+
377
+ def _run_autobuild(self, group_name: str, execution_task: str, building_task: str = "") -> str:
378
+ """Build a group of agents by AutoBuild to solve the task.
379
+ This function requires the nested_config to contain the autobuild_init_config, autobuild_llm_config, group_chat_llm_config.
380
+ """
381
+ print("==> Running AutoBuild...", flush=True)
382
+ print("\n==> Building task: ", building_task, flush=True)
383
+ print("\n==> Execution task: ", execution_task, flush=True)
384
+
385
+ builder = AgentBuilder(**self._nested_config["autobuild_init_config"])
386
+ # if the group is already built, load from history
387
+ if group_name in self.build_history:
388
+ agent_list, agent_configs = builder.load(config_json=json.dumps(self.build_history[group_name]))
389
+ if self._nested_config.get("autobuild_tool_config", None) and agent_configs["coding"] is True:
390
+ # tool library is enabled, reload tools and bind them to the agents
391
+ tool_root_dir = self.tool_root_dir
392
+ tool_builder = ToolBuilder(
393
+ corpus_root=tool_root_dir,
394
+ retriever=self._nested_config["autobuild_tool_config"].get("retriever", "all-mpnet-base-v2"),
395
+ type=self.tool_type,
396
+ )
397
+ for idx, agent in enumerate(agent_list):
398
+ if idx == len(self.tool_history[group_name]):
399
+ break
400
+ tool_builder.bind(agent, "\n\n".join(self.tool_history[group_name][idx]))
401
+ agent_list[-1] = tool_builder.bind_user_proxy(agent_list[-1], tool_root_dir)
402
+ else:
403
+ if self._nested_config["autobuild_build_config"].get("library_path_or_json", None):
404
+ # Build from retrieval
405
+ agent_list, agent_configs = builder.build_from_library(
406
+ building_task, **self._nested_config["autobuild_build_config"]
407
+ )
408
+ self.build_history[group_name] = agent_configs.copy()
409
+
410
+ if self._nested_config.get("autobuild_tool_config", None) and agent_configs["coding"] is True:
411
+ skills = building_task.split("\n")
412
+ if len(skills) == 0:
413
+ skills = [building_task]
414
+
415
+ tool_type = "default"
416
+ if self._nested_config["autobuild_tool_config"].get("tool_root", "default") == "default":
417
+ print(colored("==> Retrieving tools...", "green"), flush=True)
418
+ cur_path = os.path.dirname(os.path.abspath(__file__))
419
+ tool_root_dir = os.path.join(cur_path, "tools")
420
+ elif isinstance(self._nested_config["autobuild_tool_config"].get("tool_root", "default"), list):
421
+ # We get a list, in this case, we assume it contains several tools for the agents
422
+ tool_root_dir = self._nested_config["autobuild_tool_config"]["tool_root"]
423
+ tool_type = "user_defined"
424
+ else:
425
+ tool_root_dir = self._nested_config["autobuild_tool_config"]["tool_root"]
426
+ self.tool_root_dir = tool_root_dir
427
+ self.tool_type = tool_type
428
+
429
+ # Retrieve and build tools based on the smilarities between the skills and the tool description
430
+ tool_builder = ToolBuilder(
431
+ corpus_root=tool_root_dir,
432
+ retriever=self._nested_config["autobuild_tool_config"].get("retriever", "all-mpnet-base-v2"),
433
+ type=tool_type,
434
+ )
435
+ if tool_type == "default":
436
+ for idx, skill in enumerate(skills):
437
+ tools = tool_builder.retrieve(skill)
438
+ docstrings = []
439
+ for tool in tools:
440
+ category, tool_name = tool.split(" ")[0], tool.split(" ")[1]
441
+ tool_path = os.path.join(tool_root_dir, category, f"{tool_name}.py")
442
+ docstring = get_full_tool_description(tool_path)
443
+ docstrings.append(docstring)
444
+ tool_builder.bind(agent_list[idx], "\n\n".join(docstrings))
445
+ # the last agent is the user proxy agent, we need special treatment
446
+ agent_list[-1] = tool_builder.bind_user_proxy(agent_list[-1], tool_root_dir)
447
+ else:
448
+ # a list containing all the tools that the agents share
449
+ docstrings = []
450
+ for tool in tool_root_dir:
451
+ docstrings.append(format_ag2_tool(tool))
452
+ for idx, agent in enumerate(agent_list):
453
+ if idx == len(agent_list) - 1:
454
+ break
455
+ tool_builder.bind(agent, "\n\n".join(docstrings))
456
+ agent_list[-1] = tool_builder.bind_user_proxy(agent_list[-1], tool_root_dir)
457
+
458
+ # log tools
459
+ tool_history = self.tool_history.get(group_name, [])
460
+ tool_history.append(docstrings)
461
+ self.tool_history[group_name] = tool_history
462
+ else:
463
+ # Build agents from scratch
464
+ agent_list, agent_configs = builder.build(
465
+ building_task, **self._nested_config["autobuild_build_config"]
466
+ )
467
+ self.build_history[group_name] = agent_configs.copy()
468
+
469
+ if self._agent_config_save_path is not None:
470
+ building_task_md5 = hashlib.md5(building_task.encode("utf-8")).hexdigest()
471
+ with open(f"{self._agent_config_save_path}/build_history_{building_task_md5}.json", "w") as f:
472
+ json.dump(self.build_history, f)
473
+
474
+ self.build_times += 1
475
+ # start nested chat
476
+ nested_group_chat = GroupChat(
477
+ agents=agent_list,
478
+ messages=[],
479
+ allow_repeat_speaker=agent_list[:-1] if agent_configs["coding"] is True else agent_list,
480
+ **self._nested_config["group_chat_config"],
481
+ )
482
+ manager = GroupChatManager(
483
+ groupchat=nested_group_chat,
484
+ llm_config=self._nested_config["group_chat_llm_config"],
485
+ )
486
+ key = list(self.chat_messages.keys())[0]
487
+ general_task = self.chat_messages[key][0]["content"]
488
+ agent_list[0].initiate_chat(
489
+ manager, message=self.AUTOBUILD_TASK_DESC.format(general_task=general_task, manager_task=execution_task)
490
+ )
491
+ chat_history = []
492
+ key = list(agent_list[0].chat_messages.keys())[0]
493
+ chat_messages = agent_list[0].chat_messages[key]
494
+ for item in chat_messages:
495
+ chat_history.append(item)
496
+
497
+ # Review the group chat history
498
+ summary_model = builder.builder_model
499
+ summarized_history = (
500
+ summary_model.create(
501
+ messages=[
502
+ {
503
+ "role": "user",
504
+ "content": self.CONVERSATION_REVIEW_PROMPT.format(chat_history=chat_history),
505
+ }
506
+ ]
507
+ )
508
+ .choices[0]
509
+ .message.content
510
+ )
511
+
512
+ return f"# Response from seek_agent_help: \n{summarized_history}"