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