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,946 @@
1
+ # Copyright (c) 2023 - 2025, AG2ai, Inc., AG2ai open-source projects maintainers and core contributors
2
+ #
3
+ # SPDX-License-Identifier: Apache-2.0
4
+
5
+ from abc import ABC
6
+ from collections.abc import Callable
7
+ from copy import deepcopy
8
+ from typing import TYPE_CHECKING, Any, Literal, Optional, Union
9
+ from uuid import UUID
10
+
11
+ from pydantic import BaseModel, field_validator
12
+ from termcolor import colored
13
+
14
+ from ..agentchat.agent import LLMMessageType
15
+ from ..code_utils import content_str
16
+ from ..events import deprecated_by
17
+ from ..events.agent_events import (
18
+ ClearAgentsHistoryEvent,
19
+ ClearConversableAgentHistoryEvent,
20
+ ClearConversableAgentHistoryWarningEvent,
21
+ ConversableAgentUsageSummaryEvent,
22
+ ConversableAgentUsageSummaryNoCostIncurredEvent,
23
+ ExecuteCodeBlockEvent,
24
+ ExecuteFunctionEvent,
25
+ ExecutedFunctionEvent,
26
+ FunctionCallEvent,
27
+ FunctionResponseEvent,
28
+ GenerateCodeExecutionReplyEvent,
29
+ GroupChatResumeEvent,
30
+ GroupChatRunChatEvent,
31
+ PostCarryoverProcessingEvent,
32
+ SelectSpeakerEvent,
33
+ SelectSpeakerInvalidInputEvent,
34
+ SelectSpeakerTryCountExceededEvent,
35
+ SpeakerAttemptFailedMultipleAgentsEvent,
36
+ SpeakerAttemptFailedNoAgentsEvent,
37
+ SpeakerAttemptSuccessfulEvent,
38
+ TerminationAndHumanReplyNoInputEvent,
39
+ TerminationEvent,
40
+ TextEvent,
41
+ ToolCallEvent,
42
+ ToolResponseEvent,
43
+ UsingAutoReplyEvent,
44
+ )
45
+ from ..import_utils import optional_import_block, require_optional_import
46
+ from ..oai.client import OpenAIWrapper
47
+ from .base_message import BaseMessage, wrap_message
48
+
49
+ with optional_import_block() as result:
50
+ from PIL.Image import Image
51
+
52
+ IS_PIL_AVAILABLE = result.is_successful
53
+
54
+ if TYPE_CHECKING:
55
+ from ..agentchat.agent import Agent
56
+ from ..coding.base import CodeBlock
57
+
58
+
59
+ __all__ = [
60
+ "ClearAgentsHistoryMessage",
61
+ "ClearConversableAgentHistoryMessage",
62
+ "ConversableAgentUsageSummaryMessage",
63
+ "ConversableAgentUsageSummaryNoCostIncurredMessage",
64
+ "ExecuteCodeBlockMessage",
65
+ "ExecuteFunctionMessage",
66
+ "FunctionCallMessage",
67
+ "FunctionResponseMessage",
68
+ "GenerateCodeExecutionReplyMessage",
69
+ "GroupChatResumeMessage",
70
+ "GroupChatRunChatMessage",
71
+ "PostCarryoverProcessingMessage",
72
+ "SelectSpeakerMessage",
73
+ "SpeakerAttemptFailedMultipleAgentsMessage",
74
+ "SpeakerAttemptFailedNoAgentsMessage",
75
+ "SpeakerAttemptSuccessfulMessage",
76
+ "TerminationAndHumanReplyNoInputMessage",
77
+ "TerminationMessage",
78
+ "TextMessage",
79
+ "ToolCallMessage",
80
+ "ToolResponseMessage",
81
+ ]
82
+
83
+ MessageRole = Literal["assistant", "function", "tool"]
84
+
85
+
86
+ class BasePrintReceivedMessage(BaseMessage, ABC):
87
+ content: str | int | float | bool
88
+ sender_name: str
89
+ recipient_name: str
90
+
91
+ def print(self, f: Callable[..., Any] | None = None) -> None:
92
+ f = f or print
93
+ f(f"{colored(self.sender_name, 'yellow')} (to {self.recipient_name}):\n", flush=True)
94
+
95
+
96
+ @deprecated_by(FunctionResponseEvent, param_mapping={"sender_name": "sender", "recipient_name": "recipient"})
97
+ @wrap_message
98
+ class FunctionResponseMessage(BasePrintReceivedMessage):
99
+ name: str | None = None
100
+ role: MessageRole = "function"
101
+ content: str | int | float | bool
102
+
103
+ def print(self, f: Callable[..., Any] | None = None) -> None:
104
+ f = f or print
105
+ super().print(f)
106
+
107
+ id = self.name or "No id found"
108
+ func_print = f"***** Response from calling {self.role} ({id}) *****"
109
+ f(colored(func_print, "green"), flush=True)
110
+ f(self.content, flush=True)
111
+ f(colored("*" * len(func_print), "green"), flush=True)
112
+
113
+ f("\n", "-" * 80, flush=True, sep="")
114
+
115
+
116
+ class ToolResponse(BaseModel):
117
+ tool_call_id: str | None = None
118
+ role: MessageRole = "tool"
119
+ content: str | int | float | bool
120
+
121
+ def print(self, f: Callable[..., Any] | None = None) -> None:
122
+ f = f or print
123
+ id = self.tool_call_id or "No id found"
124
+ tool_print = f"***** Response from calling {self.role} ({id}) *****"
125
+ f(colored(tool_print, "green"), flush=True)
126
+ f(self.content, flush=True)
127
+ f(colored("*" * len(tool_print), "green"), flush=True)
128
+
129
+
130
+ @deprecated_by(ToolResponseEvent, param_mapping={"sender_name": "sender", "recipient_name": "recipient"})
131
+ @wrap_message
132
+ class ToolResponseMessage(BasePrintReceivedMessage):
133
+ role: MessageRole = "tool"
134
+ tool_responses: list[ToolResponse]
135
+ content: str | int | float | bool
136
+
137
+ def print(self, f: Callable[..., Any] | None = None) -> None:
138
+ f = f or print
139
+ super().print(f)
140
+
141
+ for tool_response in self.tool_responses:
142
+ tool_response.print(f)
143
+ f("\n", "-" * 80, flush=True, sep="")
144
+
145
+
146
+ class FunctionCall(BaseModel):
147
+ name: str | None = None
148
+ arguments: str | None = None
149
+
150
+ def print(self, f: Callable[..., Any] | None = None) -> None:
151
+ f = f or print
152
+
153
+ name = self.name or "(No function name found)"
154
+ arguments = self.arguments or "(No arguments found)"
155
+
156
+ func_print = f"***** Suggested function call: {name} *****"
157
+ f(colored(func_print, "green"), flush=True)
158
+ f(
159
+ "Arguments: \n",
160
+ arguments,
161
+ flush=True,
162
+ sep="",
163
+ )
164
+ f(colored("*" * len(func_print), "green"), flush=True)
165
+
166
+
167
+ @deprecated_by(FunctionCallEvent, param_mapping={"sender_name": "sender", "recipient_name": "recipient"})
168
+ @wrap_message
169
+ class FunctionCallMessage(BasePrintReceivedMessage):
170
+ content: str | int | float | bool | None = None # type: ignore [assignment]
171
+ function_call: FunctionCall
172
+
173
+ def print(self, f: Callable[..., Any] | None = None) -> None:
174
+ f = f or print
175
+ super().print(f)
176
+
177
+ if self.content is not None:
178
+ f(self.content, flush=True)
179
+
180
+ self.function_call.print(f)
181
+
182
+ f("\n", "-" * 80, flush=True, sep="")
183
+
184
+
185
+ class ToolCall(BaseModel):
186
+ id: str | None = None
187
+ function: FunctionCall
188
+ type: str
189
+
190
+ def print(self, f: Callable[..., Any] | None = None) -> None:
191
+ f = f or print
192
+
193
+ id = self.id or "No tool call id found"
194
+
195
+ name = self.function.name or "(No function name found)"
196
+ arguments = self.function.arguments or "(No arguments found)"
197
+
198
+ func_print = f"***** Suggested tool call ({id}): {name} *****"
199
+ f(colored(func_print, "green"), flush=True)
200
+ f(
201
+ "Arguments: \n",
202
+ arguments,
203
+ flush=True,
204
+ sep="",
205
+ )
206
+ f(colored("*" * len(func_print), "green"), flush=True)
207
+
208
+
209
+ @deprecated_by(ToolCallEvent, param_mapping={"sender_name": "sender", "recipient_name": "recipient"})
210
+ @wrap_message
211
+ class ToolCallMessage(BasePrintReceivedMessage):
212
+ content: str | int | float | bool | None = None # type: ignore [assignment]
213
+ refusal: str | None = None
214
+ role: MessageRole | None = None
215
+ audio: str | None = None
216
+ function_call: FunctionCall | None = None
217
+ tool_calls: list[ToolCall]
218
+
219
+ def print(self, f: Callable[..., Any] | None = None) -> None:
220
+ f = f or print
221
+ super().print(f)
222
+
223
+ if self.content is not None:
224
+ f(self.content, flush=True)
225
+
226
+ for tool_call in self.tool_calls:
227
+ tool_call.print(f)
228
+
229
+ f("\n", "-" * 80, flush=True, sep="")
230
+
231
+
232
+ @deprecated_by(TextEvent, param_mapping={"sender_name": "sender", "recipient_name": "recipient"})
233
+ @wrap_message
234
+ class TextMessage(BasePrintReceivedMessage):
235
+ content: str | int | float | bool | list[dict[str, str | dict[str, Any]]] | None = None # type: ignore [assignment]
236
+
237
+ @classmethod
238
+ @require_optional_import("PIL", "unknown")
239
+ def _replace_pil_image_with_placeholder(cls, image_url: dict[str, Any]) -> None:
240
+ if "url" in image_url and isinstance(image_url["url"], Image):
241
+ image_url["url"] = "<image>"
242
+
243
+ @field_validator("content", mode="before")
244
+ @classmethod
245
+ def validate_and_encode_content(
246
+ cls, content: str | int | float | bool | list[dict[str, str | dict[str, Any]]] | None
247
+ ) -> str | int | float | bool | list[dict[str, str | dict[str, Any]]] | None:
248
+ if not IS_PIL_AVAILABLE:
249
+ return content
250
+
251
+ if not isinstance(content, list):
252
+ return content
253
+
254
+ for item in content:
255
+ if isinstance(item, dict) and "image_url" in item and isinstance(item["image_url"], dict):
256
+ cls._replace_pil_image_with_placeholder(item["image_url"])
257
+
258
+ return content
259
+
260
+ def print(self, f: Callable[..., Any] | None = None) -> None:
261
+ f = f or print
262
+ super().print(f)
263
+
264
+ if self.content is not None:
265
+ f(content_str(self.content), flush=True) # type: ignore [arg-type]
266
+
267
+ f("\n", "-" * 80, flush=True, sep="")
268
+
269
+
270
+ def create_received_message_model(
271
+ *, uuid: UUID | None = None, message: dict[str, Any], sender: "Agent", recipient: "Agent"
272
+ ) -> Union[FunctionResponseMessage, ToolResponseMessage, FunctionCallMessage, ToolCallMessage, TextMessage]: # noqa: UP007
273
+ role = message.get("role")
274
+ if role == "function":
275
+ return FunctionResponseMessage(**message, sender_name=sender.name, recipient_name=recipient.name, uuid=uuid)
276
+ if role == "tool":
277
+ return ToolResponseMessage(**message, sender_name=sender.name, recipient_name=recipient.name, uuid=uuid)
278
+
279
+ # Role is neither function nor tool
280
+
281
+ if message.get("function_call"):
282
+ return FunctionCallMessage(
283
+ **message,
284
+ sender_name=sender.name,
285
+ recipient_name=recipient.name,
286
+ uuid=uuid,
287
+ )
288
+
289
+ if message.get("tool_calls"):
290
+ return ToolCallMessage(
291
+ **message,
292
+ sender_name=sender.name,
293
+ recipient_name=recipient.name,
294
+ uuid=uuid,
295
+ )
296
+
297
+ # Now message is a simple content message
298
+ content = message.get("content")
299
+ allow_format_str_template = (
300
+ recipient.llm_config.get("allow_format_str_template", False) if recipient.llm_config else False # type: ignore [attr-defined]
301
+ )
302
+ if content is not None and "context" in message:
303
+ content = OpenAIWrapper.instantiate(
304
+ content, # type: ignore [arg-type]
305
+ message["context"],
306
+ allow_format_str_template,
307
+ )
308
+
309
+ return TextMessage(
310
+ content=content,
311
+ sender_name=sender.name,
312
+ recipient_name=recipient.name,
313
+ uuid=uuid,
314
+ )
315
+
316
+
317
+ @deprecated_by(PostCarryoverProcessingEvent, param_mapping={"sender_name": "sender", "recipient_name": "recipient"})
318
+ @wrap_message
319
+ class PostCarryoverProcessingMessage(BaseMessage):
320
+ carryover: str | list[str | dict[str, Any] | Any]
321
+ message: str
322
+ verbose: bool = False
323
+
324
+ sender_name: str
325
+ recipient_name: str
326
+ summary_method: str
327
+ summary_args: dict[str, Any] | None = None
328
+ max_turns: int | None = None
329
+
330
+ def __init__(self, *, uuid: UUID | None = None, chat_info: dict[str, Any]):
331
+ carryover = chat_info.get("carryover", "")
332
+ message = chat_info.get("message")
333
+ verbose = chat_info.get("verbose", False)
334
+
335
+ sender_name = chat_info["sender"].name
336
+ recipient_name = chat_info["recipient"].name
337
+ summary_args = chat_info.get("summary_args")
338
+ max_turns = chat_info.get("max_turns")
339
+
340
+ # Fix Callable in chat_info
341
+ summary_method = chat_info.get("summary_method", "")
342
+ if callable(summary_method):
343
+ summary_method = summary_method.__name__
344
+
345
+ print_message = ""
346
+ if isinstance(message, str):
347
+ print_message = message
348
+ elif callable(message):
349
+ print_message = "Callable: " + message.__name__
350
+ elif isinstance(message, dict):
351
+ print_message = "Dict: " + str(message)
352
+ elif message is None:
353
+ print_message = "None"
354
+
355
+ super().__init__(
356
+ uuid=uuid,
357
+ carryover=carryover,
358
+ message=print_message,
359
+ verbose=verbose,
360
+ summary_method=summary_method,
361
+ summary_args=summary_args,
362
+ max_turns=max_turns,
363
+ sender_name=sender_name,
364
+ recipient_name=recipient_name,
365
+ )
366
+
367
+ def _process_carryover(self) -> str:
368
+ if not isinstance(self.carryover, list):
369
+ return self.carryover
370
+
371
+ print_carryover = []
372
+ for carryover_item in self.carryover:
373
+ if isinstance(carryover_item, str):
374
+ print_carryover.append(carryover_item)
375
+ elif isinstance(carryover_item, dict) and "content" in carryover_item:
376
+ print_carryover.append(str(carryover_item["content"]))
377
+ else:
378
+ print_carryover.append(str(carryover_item))
379
+
380
+ return ("\n").join(print_carryover)
381
+
382
+ def print(self, f: Callable[..., Any] | None = None) -> None:
383
+ f = f or print
384
+
385
+ print_carryover = self._process_carryover()
386
+
387
+ f(colored("\n" + "*" * 80, "blue"), flush=True, sep="")
388
+ f(
389
+ colored(
390
+ "Starting a new chat....",
391
+ "blue",
392
+ ),
393
+ flush=True,
394
+ )
395
+ if self.verbose:
396
+ f(colored("Message:\n" + self.message, "blue"), flush=True)
397
+ f(colored("Carryover:\n" + print_carryover, "blue"), flush=True)
398
+ f(colored("\n" + "*" * 80, "blue"), flush=True, sep="")
399
+
400
+
401
+ @deprecated_by(ClearAgentsHistoryEvent, param_mapping={"nr_messages_to_preserve": "nr_events_to_preserve"})
402
+ @wrap_message
403
+ class ClearAgentsHistoryMessage(BaseMessage):
404
+ agent_name: str | None = None
405
+ nr_messages_to_preserve: int | None = None
406
+
407
+ def __init__(
408
+ self,
409
+ *,
410
+ uuid: UUID | None = None,
411
+ agent: Optional["Agent"] = None,
412
+ nr_messages_to_preserve: int | None = None,
413
+ ):
414
+ return super().__init__(
415
+ uuid=uuid, agent_name=agent.name if agent else None, nr_messages_to_preserve=nr_messages_to_preserve
416
+ )
417
+
418
+ def print(self, f: Callable[..., Any] | None = None) -> None:
419
+ f = f or print
420
+
421
+ if self.agent_name:
422
+ if self.nr_messages_to_preserve:
423
+ f(f"Clearing history for {self.agent_name} except last {self.nr_messages_to_preserve} messages.")
424
+ else:
425
+ f(f"Clearing history for {self.agent_name}.")
426
+ else:
427
+ if self.nr_messages_to_preserve:
428
+ f(f"Clearing history for all agents except last {self.nr_messages_to_preserve} messages.")
429
+ else:
430
+ f("Clearing history for all agents.")
431
+
432
+
433
+ # todo: break into multiple messages
434
+ @deprecated_by(SpeakerAttemptSuccessfulEvent)
435
+ @wrap_message
436
+ class SpeakerAttemptSuccessfulMessage(BaseMessage):
437
+ mentions: dict[str, int]
438
+ attempt: int
439
+ attempts_left: int
440
+ verbose: bool | None = False
441
+
442
+ def __init__(
443
+ self,
444
+ *,
445
+ uuid: UUID | None = None,
446
+ mentions: dict[str, int],
447
+ attempt: int,
448
+ attempts_left: int,
449
+ select_speaker_auto_verbose: bool | None = False,
450
+ ):
451
+ super().__init__(
452
+ uuid=uuid,
453
+ mentions=deepcopy(mentions),
454
+ attempt=attempt,
455
+ attempts_left=attempts_left,
456
+ verbose=select_speaker_auto_verbose,
457
+ )
458
+
459
+ def print(self, f: Callable[..., Any] | None = None) -> None:
460
+ f = f or print
461
+
462
+ selected_agent_name = next(iter(self.mentions))
463
+ f(
464
+ colored(
465
+ f">>>>>>>> Select speaker attempt {self.attempt} of {self.attempt + self.attempts_left} successfully selected: {selected_agent_name}",
466
+ "green",
467
+ ),
468
+ flush=True,
469
+ )
470
+
471
+
472
+ @deprecated_by(SpeakerAttemptFailedMultipleAgentsEvent)
473
+ @wrap_message
474
+ class SpeakerAttemptFailedMultipleAgentsMessage(BaseMessage):
475
+ mentions: dict[str, int]
476
+ attempt: int
477
+ attempts_left: int
478
+ verbose: bool | None = False
479
+
480
+ def __init__(
481
+ self,
482
+ *,
483
+ uuid: UUID | None = None,
484
+ mentions: dict[str, int],
485
+ attempt: int,
486
+ attempts_left: int,
487
+ select_speaker_auto_verbose: bool | None = False,
488
+ ):
489
+ super().__init__(
490
+ uuid=uuid,
491
+ mentions=deepcopy(mentions),
492
+ attempt=attempt,
493
+ attempts_left=attempts_left,
494
+ verbose=select_speaker_auto_verbose,
495
+ )
496
+
497
+ def print(self, f: Callable[..., Any] | None = None) -> None:
498
+ f = f or print
499
+
500
+ f(
501
+ colored(
502
+ f">>>>>>>> Select speaker attempt {self.attempt} of {self.attempt + self.attempts_left} failed as it included multiple agent names.",
503
+ "red",
504
+ ),
505
+ flush=True,
506
+ )
507
+
508
+
509
+ @deprecated_by(SpeakerAttemptFailedNoAgentsEvent)
510
+ @wrap_message
511
+ class SpeakerAttemptFailedNoAgentsMessage(BaseMessage):
512
+ mentions: dict[str, int]
513
+ attempt: int
514
+ attempts_left: int
515
+ verbose: bool | None = False
516
+
517
+ def __init__(
518
+ self,
519
+ *,
520
+ uuid: UUID | None = None,
521
+ mentions: dict[str, int],
522
+ attempt: int,
523
+ attempts_left: int,
524
+ select_speaker_auto_verbose: bool | None = False,
525
+ ):
526
+ super().__init__(
527
+ uuid=uuid,
528
+ mentions=deepcopy(mentions),
529
+ attempt=attempt,
530
+ attempts_left=attempts_left,
531
+ verbose=select_speaker_auto_verbose,
532
+ )
533
+
534
+ def print(self, f: Callable[..., Any] | None = None) -> None:
535
+ f = f or print
536
+
537
+ f(
538
+ colored(
539
+ f">>>>>>>> Select speaker attempt #{self.attempt} failed as it did not include any agent names.",
540
+ "red",
541
+ ),
542
+ flush=True,
543
+ )
544
+
545
+
546
+ @deprecated_by(GroupChatResumeEvent, param_mapping={"messages": "events"})
547
+ @wrap_message
548
+ class GroupChatResumeMessage(BaseMessage):
549
+ last_speaker_name: str
550
+ messages: list[LLMMessageType]
551
+ verbose: bool | None = False
552
+
553
+ def __init__(
554
+ self,
555
+ *,
556
+ uuid: UUID | None = None,
557
+ last_speaker_name: str,
558
+ messages: list["LLMMessageType"],
559
+ silent: bool | None = False,
560
+ ):
561
+ super().__init__(uuid=uuid, last_speaker_name=last_speaker_name, messages=messages, verbose=not silent)
562
+
563
+ def print(self, f: Callable[..., Any] | None = None) -> None:
564
+ f = f or print
565
+
566
+ f(
567
+ f"Prepared group chat with {len(self.messages)} messages, the last speaker is",
568
+ colored(self.last_speaker_name, "yellow"),
569
+ flush=True,
570
+ )
571
+
572
+
573
+ @deprecated_by(GroupChatRunChatEvent)
574
+ @wrap_message
575
+ class GroupChatRunChatMessage(BaseMessage):
576
+ speaker_name: str
577
+ verbose: bool | None = False
578
+
579
+ def __init__(self, *, uuid: UUID | None = None, speaker: "Agent", silent: bool | None = False):
580
+ super().__init__(uuid=uuid, speaker_name=speaker.name, verbose=not silent)
581
+
582
+ def print(self, f: Callable[..., Any] | None = None) -> None:
583
+ f = f or print
584
+
585
+ f(colored(f"\nNext speaker: {self.speaker_name}\n", "green"), flush=True)
586
+
587
+
588
+ @deprecated_by(
589
+ TerminationAndHumanReplyNoInputEvent, param_mapping={"sender_name": "sender", "recipient_name": "recipient"}
590
+ )
591
+ @wrap_message
592
+ class TerminationAndHumanReplyNoInputMessage(BaseMessage):
593
+ """When the human-in-the-loop is prompted but provides no input."""
594
+
595
+ no_human_input_msg: str
596
+ sender_name: str
597
+ recipient_name: str
598
+
599
+ def __init__(
600
+ self,
601
+ *,
602
+ uuid: UUID | None = None,
603
+ no_human_input_msg: str,
604
+ sender: Optional["Agent"] = None,
605
+ recipient: "Agent",
606
+ ):
607
+ super().__init__(
608
+ uuid=uuid,
609
+ no_human_input_msg=no_human_input_msg,
610
+ sender_name=sender.name if sender else "No sender",
611
+ recipient_name=recipient.name,
612
+ )
613
+
614
+ def print(self, f: Callable[..., Any] | None = None) -> None:
615
+ f = f or print
616
+
617
+ f(colored(f"\n>>>>>>>> {self.no_human_input_msg}", "red"), flush=True)
618
+
619
+
620
+ @deprecated_by(UsingAutoReplyEvent, param_mapping={"sender_name": "sender", "recipient_name": "recipient"})
621
+ @wrap_message
622
+ class UsingAutoReplyMessage(BaseMessage):
623
+ human_input_mode: str
624
+ sender_name: str
625
+ recipient_name: str
626
+
627
+ def __init__(
628
+ self,
629
+ *,
630
+ uuid: UUID | None = None,
631
+ human_input_mode: str,
632
+ sender: Optional["Agent"] = None,
633
+ recipient: "Agent",
634
+ ):
635
+ super().__init__(
636
+ uuid=uuid,
637
+ human_input_mode=human_input_mode,
638
+ sender_name=sender.name if sender else "No sender",
639
+ recipient_name=recipient.name,
640
+ )
641
+
642
+ def print(self, f: Callable[..., Any] | None = None) -> None:
643
+ f = f or print
644
+
645
+ f(colored("\n>>>>>>>> USING AUTO REPLY...", "red"), flush=True)
646
+
647
+
648
+ @deprecated_by(TerminationEvent, default_params={"sender": "system"})
649
+ @wrap_message
650
+ class TerminationMessage(BaseMessage):
651
+ """When a workflow termination condition is met"""
652
+
653
+ termination_reason: str
654
+
655
+ def __init__(
656
+ self,
657
+ *,
658
+ uuid: UUID | None = None,
659
+ termination_reason: str,
660
+ ):
661
+ super().__init__(
662
+ uuid=uuid,
663
+ termination_reason=termination_reason,
664
+ )
665
+
666
+ def print(self, f: Callable[..., Any] | None = None) -> None:
667
+ f = f or print
668
+
669
+ f(colored(f"\n>>>>>>>> TERMINATING RUN ({str(self.uuid)}): {self.termination_reason}", "red"), flush=True)
670
+
671
+
672
+ @deprecated_by(ExecuteCodeBlockEvent, param_mapping={"recipient_name": "recipient"})
673
+ @wrap_message
674
+ class ExecuteCodeBlockMessage(BaseMessage):
675
+ code: str
676
+ language: str
677
+ code_block_count: int
678
+ recipient_name: str
679
+
680
+ def __init__(
681
+ self, *, uuid: UUID | None = None, code: str, language: str, code_block_count: int, recipient: "Agent"
682
+ ):
683
+ super().__init__(
684
+ uuid=uuid, code=code, language=language, code_block_count=code_block_count, recipient_name=recipient.name
685
+ )
686
+
687
+ def print(self, f: Callable[..., Any] | None = None) -> None:
688
+ f = f or print
689
+
690
+ f(
691
+ colored(
692
+ f"\n>>>>>>>> EXECUTING CODE BLOCK {self.code_block_count} (inferred language is {self.language})...",
693
+ "red",
694
+ ),
695
+ flush=True,
696
+ )
697
+
698
+
699
+ @deprecated_by(ExecuteFunctionEvent, param_mapping={"recipient_name": "recipient"})
700
+ @wrap_message
701
+ class ExecuteFunctionMessage(BaseMessage):
702
+ func_name: str
703
+ call_id: str | None = None
704
+ arguments: dict[str, Any]
705
+ recipient_name: str
706
+
707
+ def __init__(
708
+ self,
709
+ *,
710
+ uuid: UUID | None = None,
711
+ func_name: str,
712
+ call_id: str | None = None,
713
+ arguments: dict[str, Any],
714
+ recipient: "Agent",
715
+ ):
716
+ super().__init__(
717
+ uuid=uuid, func_name=func_name, call_id=call_id, arguments=arguments, recipient_name=recipient.name
718
+ )
719
+
720
+ def print(self, f: Callable[..., Any] | None = None) -> None:
721
+ f = f or print
722
+
723
+ f(
724
+ colored(
725
+ f"\n>>>>>>>> EXECUTING FUNCTION {self.func_name}...\nCall ID: {self.call_id}\nInput arguments: {self.arguments}",
726
+ "magenta",
727
+ ),
728
+ flush=True,
729
+ )
730
+
731
+
732
+ @deprecated_by(ExecutedFunctionEvent, param_mapping={"recipient_name": "recipient"})
733
+ @wrap_message
734
+ class ExecutedFunctionMessage(BaseMessage):
735
+ func_name: str
736
+ call_id: str | None = None
737
+ arguments: dict[str, Any]
738
+ content: str
739
+ recipient_name: str
740
+
741
+ def __init__(
742
+ self,
743
+ *,
744
+ uuid: UUID | None = None,
745
+ func_name: str,
746
+ call_id: str | None = None,
747
+ arguments: dict[str, Any],
748
+ content: str,
749
+ recipient: "Agent",
750
+ ):
751
+ super().__init__(
752
+ uuid=uuid,
753
+ func_name=func_name,
754
+ call_id=call_id,
755
+ arguments=arguments,
756
+ content=content,
757
+ recipient_name=recipient.name,
758
+ )
759
+
760
+ def print(self, f: Callable[..., Any] | None = None) -> None:
761
+ f = f or print
762
+
763
+ f(
764
+ colored(
765
+ f"\n>>>>>>>> EXECUTED FUNCTION {self.func_name}...\nCall ID: {self.call_id}\nInput arguments: {self.arguments}\nOutput:\n{self.content}",
766
+ "magenta",
767
+ ),
768
+ flush=True,
769
+ )
770
+
771
+
772
+ @deprecated_by(SelectSpeakerEvent)
773
+ @wrap_message
774
+ class SelectSpeakerMessage(BaseMessage):
775
+ agent_names: list[str] | None = None
776
+
777
+ def __init__(self, *, uuid: UUID | None = None, agents: list["Agent"] | None = None):
778
+ agent_names = [agent.name for agent in agents] if agents else None
779
+ super().__init__(uuid=uuid, agent_names=agent_names)
780
+
781
+ def print(self, f: Callable[..., Any] | None = None) -> None:
782
+ f = f or print
783
+
784
+ f("Please select the next speaker from the following list:")
785
+ agent_names = self.agent_names or []
786
+ for i, agent_name in enumerate(agent_names):
787
+ f(f"{i + 1}: {agent_name}")
788
+
789
+
790
+ @deprecated_by(SelectSpeakerTryCountExceededEvent)
791
+ @wrap_message
792
+ class SelectSpeakerTryCountExceededMessage(BaseMessage):
793
+ try_count: int
794
+ agent_names: list[str] | None = None
795
+
796
+ def __init__(self, *, uuid: UUID | None = None, try_count: int, agents: list["Agent"] | None = None):
797
+ agent_names = [agent.name for agent in agents] if agents else None
798
+ super().__init__(uuid=uuid, try_count=try_count, agent_names=agent_names)
799
+
800
+ def print(self, f: Callable[..., Any] | None = None) -> None:
801
+ f = f or print
802
+
803
+ f(f"You have tried {self.try_count} times. The next speaker will be selected automatically.")
804
+
805
+
806
+ @deprecated_by(SelectSpeakerInvalidInputEvent)
807
+ @wrap_message
808
+ class SelectSpeakerInvalidInputMessage(BaseMessage):
809
+ agent_names: list[str] | None = None
810
+
811
+ def __init__(self, *, uuid: UUID | None = None, agents: list["Agent"] | None = None):
812
+ agent_names = [agent.name for agent in agents] if agents else None
813
+ super().__init__(uuid=uuid, agent_names=agent_names)
814
+
815
+ def print(self, f: Callable[..., Any] | None = None) -> None:
816
+ f = f or print
817
+
818
+ f(f"Invalid input. Please enter a number between 1 and {len(self.agent_names or [])}.")
819
+
820
+
821
+ @deprecated_by(
822
+ ClearConversableAgentHistoryEvent,
823
+ param_mapping={"no_messages_preserved": "no_events_preserved", "recipient_name": "recipient"},
824
+ )
825
+ @wrap_message
826
+ class ClearConversableAgentHistoryMessage(BaseMessage):
827
+ agent_name: str
828
+ recipient_name: str
829
+ no_messages_preserved: int
830
+
831
+ def __init__(self, *, uuid: UUID | None = None, agent: "Agent", no_messages_preserved: int | None = None):
832
+ super().__init__(
833
+ uuid=uuid,
834
+ agent_name=agent.name,
835
+ recipient_name=agent.name,
836
+ no_messages_preserved=no_messages_preserved,
837
+ )
838
+
839
+ def print(self, f: Callable[..., Any] | None = None) -> None:
840
+ f = f or print
841
+
842
+ for _ in range(self.no_messages_preserved):
843
+ f(
844
+ f"Preserving one more message for {self.agent_name} to not divide history between tool call and "
845
+ f"tool response."
846
+ )
847
+
848
+
849
+ @deprecated_by(ClearConversableAgentHistoryWarningEvent, param_mapping={"recipient_name": "recipient"})
850
+ @wrap_message
851
+ class ClearConversableAgentHistoryWarningMessage(BaseMessage):
852
+ recipient_name: str
853
+
854
+ def __init__(self, *, uuid: UUID | None = None, recipient: "Agent"):
855
+ super().__init__(
856
+ uuid=uuid,
857
+ recipient_name=recipient.name,
858
+ )
859
+
860
+ def print(self, f: Callable[..., Any] | None = None) -> None:
861
+ f = f or print
862
+
863
+ f(
864
+ colored(
865
+ "WARNING: `nr_preserved_messages` is ignored when clearing chat history with a specific agent.",
866
+ "yellow",
867
+ ),
868
+ flush=True,
869
+ )
870
+
871
+
872
+ @deprecated_by(
873
+ GenerateCodeExecutionReplyEvent,
874
+ param_mapping={"sender_name": "sender", "recipient_name": "recipient", "code_block_languages": "code_blocks"},
875
+ )
876
+ @wrap_message
877
+ class GenerateCodeExecutionReplyMessage(BaseMessage):
878
+ code_block_languages: list[str]
879
+ sender_name: str | None = None
880
+ recipient_name: str
881
+
882
+ def __init__(
883
+ self,
884
+ *,
885
+ uuid: UUID | None = None,
886
+ code_blocks: list["CodeBlock"],
887
+ sender: Optional["Agent"] = None,
888
+ recipient: "Agent",
889
+ ):
890
+ code_block_languages = [code_block.language for code_block in code_blocks]
891
+
892
+ super().__init__(
893
+ uuid=uuid,
894
+ code_block_languages=code_block_languages,
895
+ sender_name=sender.name if sender else None,
896
+ recipient_name=recipient.name,
897
+ )
898
+
899
+ def print(self, f: Callable[..., Any] | None = None) -> None:
900
+ f = f or print
901
+
902
+ num_code_blocks = len(self.code_block_languages)
903
+ if num_code_blocks == 1:
904
+ f(
905
+ colored(
906
+ f"\n>>>>>>>> EXECUTING CODE BLOCK (inferred language is {self.code_block_languages[0]})...",
907
+ "red",
908
+ ),
909
+ flush=True,
910
+ )
911
+ else:
912
+ f(
913
+ colored(
914
+ f"\n>>>>>>>> EXECUTING {num_code_blocks} CODE BLOCKS (inferred languages are [{', '.join(list(self.code_block_languages))}])...",
915
+ "red",
916
+ ),
917
+ flush=True,
918
+ )
919
+
920
+
921
+ @deprecated_by(ConversableAgentUsageSummaryNoCostIncurredEvent, param_mapping={"recipient_name": "recipient"})
922
+ @wrap_message
923
+ class ConversableAgentUsageSummaryNoCostIncurredMessage(BaseMessage):
924
+ recipient_name: str
925
+
926
+ def __init__(self, *, uuid: UUID | None = None, recipient: "Agent"):
927
+ super().__init__(uuid=uuid, recipient_name=recipient.name)
928
+
929
+ def print(self, f: Callable[..., Any] | None = None) -> None:
930
+ f = f or print
931
+
932
+ f(f"No cost incurred from agent '{self.recipient_name}'.")
933
+
934
+
935
+ @deprecated_by(ConversableAgentUsageSummaryEvent, param_mapping={"recipient_name": "recipient"})
936
+ @wrap_message
937
+ class ConversableAgentUsageSummaryMessage(BaseMessage):
938
+ recipient_name: str
939
+
940
+ def __init__(self, *, uuid: UUID | None = None, recipient: "Agent"):
941
+ super().__init__(uuid=uuid, recipient_name=recipient.name)
942
+
943
+ def print(self, f: Callable[..., Any] | None = None) -> None:
944
+ f = f or print
945
+
946
+ f(f"Agent '{self.recipient_name}':")