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

Potentially problematic release.


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

Files changed (371) hide show
  1. {ag2-0.9.1a1.dist-info → ag2-0.9.2.dist-info}/METADATA +272 -75
  2. ag2-0.9.2.dist-info/RECORD +406 -0
  3. {ag2-0.9.1a1.dist-info → ag2-0.9.2.dist-info}/WHEEL +1 -2
  4. autogen/__init__.py +89 -0
  5. autogen/_website/__init__.py +3 -0
  6. autogen/_website/generate_api_references.py +427 -0
  7. autogen/_website/generate_mkdocs.py +1174 -0
  8. autogen/_website/notebook_processor.py +476 -0
  9. autogen/_website/process_notebooks.py +656 -0
  10. autogen/_website/utils.py +412 -0
  11. autogen/agentchat/__init__.py +44 -0
  12. autogen/agentchat/agent.py +182 -0
  13. autogen/agentchat/assistant_agent.py +85 -0
  14. autogen/agentchat/chat.py +309 -0
  15. autogen/agentchat/contrib/__init__.py +5 -0
  16. autogen/agentchat/contrib/agent_eval/README.md +7 -0
  17. autogen/agentchat/contrib/agent_eval/agent_eval.py +108 -0
  18. autogen/agentchat/contrib/agent_eval/criterion.py +43 -0
  19. autogen/agentchat/contrib/agent_eval/critic_agent.py +44 -0
  20. autogen/agentchat/contrib/agent_eval/quantifier_agent.py +39 -0
  21. autogen/agentchat/contrib/agent_eval/subcritic_agent.py +45 -0
  22. autogen/agentchat/contrib/agent_eval/task.py +42 -0
  23. autogen/agentchat/contrib/agent_optimizer.py +429 -0
  24. autogen/agentchat/contrib/capabilities/__init__.py +5 -0
  25. autogen/agentchat/contrib/capabilities/agent_capability.py +20 -0
  26. autogen/agentchat/contrib/capabilities/generate_images.py +301 -0
  27. autogen/agentchat/contrib/capabilities/teachability.py +393 -0
  28. autogen/agentchat/contrib/capabilities/text_compressors.py +66 -0
  29. autogen/agentchat/contrib/capabilities/tools_capability.py +22 -0
  30. autogen/agentchat/contrib/capabilities/transform_messages.py +93 -0
  31. autogen/agentchat/contrib/capabilities/transforms.py +566 -0
  32. autogen/agentchat/contrib/capabilities/transforms_util.py +122 -0
  33. autogen/agentchat/contrib/capabilities/vision_capability.py +214 -0
  34. autogen/agentchat/contrib/captainagent/__init__.py +9 -0
  35. autogen/agentchat/contrib/captainagent/agent_builder.py +790 -0
  36. autogen/agentchat/contrib/captainagent/captainagent.py +512 -0
  37. autogen/agentchat/contrib/captainagent/tool_retriever.py +335 -0
  38. autogen/agentchat/contrib/captainagent/tools/README.md +44 -0
  39. autogen/agentchat/contrib/captainagent/tools/__init__.py +5 -0
  40. autogen/agentchat/contrib/captainagent/tools/data_analysis/calculate_correlation.py +40 -0
  41. autogen/agentchat/contrib/captainagent/tools/data_analysis/calculate_skewness_and_kurtosis.py +28 -0
  42. autogen/agentchat/contrib/captainagent/tools/data_analysis/detect_outlier_iqr.py +28 -0
  43. autogen/agentchat/contrib/captainagent/tools/data_analysis/detect_outlier_zscore.py +28 -0
  44. autogen/agentchat/contrib/captainagent/tools/data_analysis/explore_csv.py +21 -0
  45. autogen/agentchat/contrib/captainagent/tools/data_analysis/shapiro_wilk_test.py +30 -0
  46. autogen/agentchat/contrib/captainagent/tools/information_retrieval/arxiv_download.py +27 -0
  47. autogen/agentchat/contrib/captainagent/tools/information_retrieval/arxiv_search.py +53 -0
  48. autogen/agentchat/contrib/captainagent/tools/information_retrieval/extract_pdf_image.py +53 -0
  49. autogen/agentchat/contrib/captainagent/tools/information_retrieval/extract_pdf_text.py +38 -0
  50. autogen/agentchat/contrib/captainagent/tools/information_retrieval/get_wikipedia_text.py +21 -0
  51. autogen/agentchat/contrib/captainagent/tools/information_retrieval/get_youtube_caption.py +34 -0
  52. autogen/agentchat/contrib/captainagent/tools/information_retrieval/image_qa.py +60 -0
  53. autogen/agentchat/contrib/captainagent/tools/information_retrieval/optical_character_recognition.py +61 -0
  54. autogen/agentchat/contrib/captainagent/tools/information_retrieval/perform_web_search.py +47 -0
  55. autogen/agentchat/contrib/captainagent/tools/information_retrieval/scrape_wikipedia_tables.py +33 -0
  56. autogen/agentchat/contrib/captainagent/tools/information_retrieval/transcribe_audio_file.py +21 -0
  57. autogen/agentchat/contrib/captainagent/tools/information_retrieval/youtube_download.py +35 -0
  58. autogen/agentchat/contrib/captainagent/tools/math/calculate_circle_area_from_diameter.py +21 -0
  59. autogen/agentchat/contrib/captainagent/tools/math/calculate_day_of_the_week.py +18 -0
  60. autogen/agentchat/contrib/captainagent/tools/math/calculate_fraction_sum.py +28 -0
  61. autogen/agentchat/contrib/captainagent/tools/math/calculate_matrix_power.py +31 -0
  62. autogen/agentchat/contrib/captainagent/tools/math/calculate_reflected_point.py +16 -0
  63. autogen/agentchat/contrib/captainagent/tools/math/complex_numbers_product.py +25 -0
  64. autogen/agentchat/contrib/captainagent/tools/math/compute_currency_conversion.py +23 -0
  65. autogen/agentchat/contrib/captainagent/tools/math/count_distinct_permutations.py +27 -0
  66. autogen/agentchat/contrib/captainagent/tools/math/evaluate_expression.py +28 -0
  67. autogen/agentchat/contrib/captainagent/tools/math/find_continuity_point.py +34 -0
  68. autogen/agentchat/contrib/captainagent/tools/math/fraction_to_mixed_numbers.py +39 -0
  69. autogen/agentchat/contrib/captainagent/tools/math/modular_inverse_sum.py +23 -0
  70. autogen/agentchat/contrib/captainagent/tools/math/simplify_mixed_numbers.py +36 -0
  71. autogen/agentchat/contrib/captainagent/tools/math/sum_of_digit_factorials.py +15 -0
  72. autogen/agentchat/contrib/captainagent/tools/math/sum_of_primes_below.py +15 -0
  73. autogen/agentchat/contrib/captainagent/tools/requirements.txt +10 -0
  74. autogen/agentchat/contrib/captainagent/tools/tool_description.tsv +34 -0
  75. autogen/agentchat/contrib/gpt_assistant_agent.py +526 -0
  76. autogen/agentchat/contrib/graph_rag/__init__.py +9 -0
  77. autogen/agentchat/contrib/graph_rag/document.py +29 -0
  78. autogen/agentchat/contrib/graph_rag/falkor_graph_query_engine.py +170 -0
  79. autogen/agentchat/contrib/graph_rag/falkor_graph_rag_capability.py +103 -0
  80. autogen/agentchat/contrib/graph_rag/graph_query_engine.py +53 -0
  81. autogen/agentchat/contrib/graph_rag/graph_rag_capability.py +63 -0
  82. autogen/agentchat/contrib/graph_rag/neo4j_graph_query_engine.py +268 -0
  83. autogen/agentchat/contrib/graph_rag/neo4j_graph_rag_capability.py +83 -0
  84. autogen/agentchat/contrib/graph_rag/neo4j_native_graph_query_engine.py +210 -0
  85. autogen/agentchat/contrib/graph_rag/neo4j_native_graph_rag_capability.py +93 -0
  86. autogen/agentchat/contrib/img_utils.py +397 -0
  87. autogen/agentchat/contrib/llamaindex_conversable_agent.py +117 -0
  88. autogen/agentchat/contrib/llava_agent.py +187 -0
  89. autogen/agentchat/contrib/math_user_proxy_agent.py +464 -0
  90. autogen/agentchat/contrib/multimodal_conversable_agent.py +125 -0
  91. autogen/agentchat/contrib/qdrant_retrieve_user_proxy_agent.py +324 -0
  92. autogen/agentchat/contrib/rag/__init__.py +10 -0
  93. autogen/agentchat/contrib/rag/chromadb_query_engine.py +272 -0
  94. autogen/agentchat/contrib/rag/llamaindex_query_engine.py +198 -0
  95. autogen/agentchat/contrib/rag/mongodb_query_engine.py +329 -0
  96. autogen/agentchat/contrib/rag/query_engine.py +74 -0
  97. autogen/agentchat/contrib/retrieve_assistant_agent.py +56 -0
  98. autogen/agentchat/contrib/retrieve_user_proxy_agent.py +703 -0
  99. autogen/agentchat/contrib/society_of_mind_agent.py +199 -0
  100. autogen/agentchat/contrib/swarm_agent.py +1425 -0
  101. autogen/agentchat/contrib/text_analyzer_agent.py +79 -0
  102. autogen/agentchat/contrib/vectordb/__init__.py +5 -0
  103. autogen/agentchat/contrib/vectordb/base.py +232 -0
  104. autogen/agentchat/contrib/vectordb/chromadb.py +315 -0
  105. autogen/agentchat/contrib/vectordb/couchbase.py +407 -0
  106. autogen/agentchat/contrib/vectordb/mongodb.py +550 -0
  107. autogen/agentchat/contrib/vectordb/pgvectordb.py +928 -0
  108. autogen/agentchat/contrib/vectordb/qdrant.py +320 -0
  109. autogen/agentchat/contrib/vectordb/utils.py +126 -0
  110. autogen/agentchat/contrib/web_surfer.py +303 -0
  111. autogen/agentchat/conversable_agent.py +4023 -0
  112. autogen/agentchat/group/__init__.py +64 -0
  113. autogen/agentchat/group/available_condition.py +91 -0
  114. autogen/agentchat/group/context_condition.py +77 -0
  115. autogen/agentchat/group/context_expression.py +238 -0
  116. autogen/agentchat/group/context_str.py +41 -0
  117. autogen/agentchat/group/context_variables.py +192 -0
  118. autogen/agentchat/group/group_tool_executor.py +202 -0
  119. autogen/agentchat/group/group_utils.py +591 -0
  120. autogen/agentchat/group/handoffs.py +244 -0
  121. autogen/agentchat/group/llm_condition.py +93 -0
  122. autogen/agentchat/group/multi_agent_chat.py +237 -0
  123. autogen/agentchat/group/on_condition.py +58 -0
  124. autogen/agentchat/group/on_context_condition.py +54 -0
  125. autogen/agentchat/group/patterns/__init__.py +18 -0
  126. autogen/agentchat/group/patterns/auto.py +159 -0
  127. autogen/agentchat/group/patterns/manual.py +176 -0
  128. autogen/agentchat/group/patterns/pattern.py +288 -0
  129. autogen/agentchat/group/patterns/random.py +106 -0
  130. autogen/agentchat/group/patterns/round_robin.py +117 -0
  131. autogen/agentchat/group/reply_result.py +26 -0
  132. autogen/agentchat/group/speaker_selection_result.py +41 -0
  133. autogen/agentchat/group/targets/__init__.py +4 -0
  134. autogen/agentchat/group/targets/group_chat_target.py +132 -0
  135. autogen/agentchat/group/targets/group_manager_target.py +151 -0
  136. autogen/agentchat/group/targets/transition_target.py +413 -0
  137. autogen/agentchat/group/targets/transition_utils.py +6 -0
  138. autogen/agentchat/groupchat.py +1694 -0
  139. autogen/agentchat/realtime/__init__.py +3 -0
  140. autogen/agentchat/realtime/experimental/__init__.py +20 -0
  141. autogen/agentchat/realtime/experimental/audio_adapters/__init__.py +8 -0
  142. autogen/agentchat/realtime/experimental/audio_adapters/twilio_audio_adapter.py +148 -0
  143. autogen/agentchat/realtime/experimental/audio_adapters/websocket_audio_adapter.py +139 -0
  144. autogen/agentchat/realtime/experimental/audio_observer.py +42 -0
  145. autogen/agentchat/realtime/experimental/clients/__init__.py +15 -0
  146. autogen/agentchat/realtime/experimental/clients/gemini/__init__.py +7 -0
  147. autogen/agentchat/realtime/experimental/clients/gemini/client.py +274 -0
  148. autogen/agentchat/realtime/experimental/clients/oai/__init__.py +8 -0
  149. autogen/agentchat/realtime/experimental/clients/oai/base_client.py +220 -0
  150. autogen/agentchat/realtime/experimental/clients/oai/rtc_client.py +243 -0
  151. autogen/agentchat/realtime/experimental/clients/oai/utils.py +48 -0
  152. autogen/agentchat/realtime/experimental/clients/realtime_client.py +190 -0
  153. autogen/agentchat/realtime/experimental/function_observer.py +85 -0
  154. autogen/agentchat/realtime/experimental/realtime_agent.py +158 -0
  155. autogen/agentchat/realtime/experimental/realtime_events.py +42 -0
  156. autogen/agentchat/realtime/experimental/realtime_observer.py +100 -0
  157. autogen/agentchat/realtime/experimental/realtime_swarm.py +475 -0
  158. autogen/agentchat/realtime/experimental/websockets.py +21 -0
  159. autogen/agentchat/realtime_agent/__init__.py +21 -0
  160. autogen/agentchat/user_proxy_agent.py +111 -0
  161. autogen/agentchat/utils.py +206 -0
  162. autogen/agents/__init__.py +3 -0
  163. autogen/agents/contrib/__init__.py +10 -0
  164. autogen/agents/contrib/time/__init__.py +8 -0
  165. autogen/agents/contrib/time/time_reply_agent.py +73 -0
  166. autogen/agents/contrib/time/time_tool_agent.py +51 -0
  167. autogen/agents/experimental/__init__.py +27 -0
  168. autogen/agents/experimental/deep_research/__init__.py +7 -0
  169. autogen/agents/experimental/deep_research/deep_research.py +52 -0
  170. autogen/agents/experimental/discord/__init__.py +7 -0
  171. autogen/agents/experimental/discord/discord.py +66 -0
  172. autogen/agents/experimental/document_agent/__init__.py +19 -0
  173. autogen/agents/experimental/document_agent/chroma_query_engine.py +316 -0
  174. autogen/agents/experimental/document_agent/docling_doc_ingest_agent.py +118 -0
  175. autogen/agents/experimental/document_agent/document_agent.py +461 -0
  176. autogen/agents/experimental/document_agent/document_conditions.py +50 -0
  177. autogen/agents/experimental/document_agent/document_utils.py +380 -0
  178. autogen/agents/experimental/document_agent/inmemory_query_engine.py +220 -0
  179. autogen/agents/experimental/document_agent/parser_utils.py +130 -0
  180. autogen/agents/experimental/document_agent/url_utils.py +426 -0
  181. autogen/agents/experimental/reasoning/__init__.py +7 -0
  182. autogen/agents/experimental/reasoning/reasoning_agent.py +1178 -0
  183. autogen/agents/experimental/slack/__init__.py +7 -0
  184. autogen/agents/experimental/slack/slack.py +73 -0
  185. autogen/agents/experimental/telegram/__init__.py +7 -0
  186. autogen/agents/experimental/telegram/telegram.py +77 -0
  187. autogen/agents/experimental/websurfer/__init__.py +7 -0
  188. autogen/agents/experimental/websurfer/websurfer.py +62 -0
  189. autogen/agents/experimental/wikipedia/__init__.py +7 -0
  190. autogen/agents/experimental/wikipedia/wikipedia.py +90 -0
  191. autogen/browser_utils.py +309 -0
  192. autogen/cache/__init__.py +10 -0
  193. autogen/cache/abstract_cache_base.py +75 -0
  194. autogen/cache/cache.py +203 -0
  195. autogen/cache/cache_factory.py +88 -0
  196. autogen/cache/cosmos_db_cache.py +144 -0
  197. autogen/cache/disk_cache.py +102 -0
  198. autogen/cache/in_memory_cache.py +58 -0
  199. autogen/cache/redis_cache.py +123 -0
  200. autogen/code_utils.py +596 -0
  201. autogen/coding/__init__.py +22 -0
  202. autogen/coding/base.py +119 -0
  203. autogen/coding/docker_commandline_code_executor.py +268 -0
  204. autogen/coding/factory.py +47 -0
  205. autogen/coding/func_with_reqs.py +202 -0
  206. autogen/coding/jupyter/__init__.py +23 -0
  207. autogen/coding/jupyter/base.py +36 -0
  208. autogen/coding/jupyter/docker_jupyter_server.py +167 -0
  209. autogen/coding/jupyter/embedded_ipython_code_executor.py +182 -0
  210. autogen/coding/jupyter/import_utils.py +82 -0
  211. autogen/coding/jupyter/jupyter_client.py +231 -0
  212. autogen/coding/jupyter/jupyter_code_executor.py +160 -0
  213. autogen/coding/jupyter/local_jupyter_server.py +172 -0
  214. autogen/coding/local_commandline_code_executor.py +405 -0
  215. autogen/coding/markdown_code_extractor.py +45 -0
  216. autogen/coding/utils.py +56 -0
  217. autogen/doc_utils.py +34 -0
  218. autogen/events/__init__.py +7 -0
  219. autogen/events/agent_events.py +1013 -0
  220. autogen/events/base_event.py +99 -0
  221. autogen/events/client_events.py +167 -0
  222. autogen/events/helpers.py +36 -0
  223. autogen/events/print_event.py +46 -0
  224. autogen/exception_utils.py +73 -0
  225. autogen/extensions/__init__.py +5 -0
  226. autogen/fast_depends/__init__.py +16 -0
  227. autogen/fast_depends/_compat.py +80 -0
  228. autogen/fast_depends/core/__init__.py +14 -0
  229. autogen/fast_depends/core/build.py +225 -0
  230. autogen/fast_depends/core/model.py +576 -0
  231. autogen/fast_depends/dependencies/__init__.py +15 -0
  232. autogen/fast_depends/dependencies/model.py +29 -0
  233. autogen/fast_depends/dependencies/provider.py +39 -0
  234. autogen/fast_depends/library/__init__.py +10 -0
  235. autogen/fast_depends/library/model.py +46 -0
  236. autogen/fast_depends/py.typed +6 -0
  237. autogen/fast_depends/schema.py +66 -0
  238. autogen/fast_depends/use.py +280 -0
  239. autogen/fast_depends/utils.py +187 -0
  240. autogen/formatting_utils.py +83 -0
  241. autogen/function_utils.py +13 -0
  242. autogen/graph_utils.py +178 -0
  243. autogen/import_utils.py +526 -0
  244. autogen/interop/__init__.py +22 -0
  245. autogen/interop/crewai/__init__.py +7 -0
  246. autogen/interop/crewai/crewai.py +88 -0
  247. autogen/interop/interoperability.py +71 -0
  248. autogen/interop/interoperable.py +46 -0
  249. autogen/interop/langchain/__init__.py +8 -0
  250. autogen/interop/langchain/langchain_chat_model_factory.py +155 -0
  251. autogen/interop/langchain/langchain_tool.py +82 -0
  252. autogen/interop/litellm/__init__.py +7 -0
  253. autogen/interop/litellm/litellm_config_factory.py +179 -0
  254. autogen/interop/pydantic_ai/__init__.py +7 -0
  255. autogen/interop/pydantic_ai/pydantic_ai.py +168 -0
  256. autogen/interop/registry.py +69 -0
  257. autogen/io/__init__.py +15 -0
  258. autogen/io/base.py +151 -0
  259. autogen/io/console.py +56 -0
  260. autogen/io/processors/__init__.py +12 -0
  261. autogen/io/processors/base.py +21 -0
  262. autogen/io/processors/console_event_processor.py +56 -0
  263. autogen/io/run_response.py +293 -0
  264. autogen/io/thread_io_stream.py +63 -0
  265. autogen/io/websockets.py +213 -0
  266. autogen/json_utils.py +43 -0
  267. autogen/llm_config.py +382 -0
  268. autogen/logger/__init__.py +11 -0
  269. autogen/logger/base_logger.py +128 -0
  270. autogen/logger/file_logger.py +261 -0
  271. autogen/logger/logger_factory.py +42 -0
  272. autogen/logger/logger_utils.py +57 -0
  273. autogen/logger/sqlite_logger.py +523 -0
  274. autogen/math_utils.py +339 -0
  275. autogen/mcp/__init__.py +7 -0
  276. autogen/mcp/__main__.py +78 -0
  277. autogen/mcp/mcp_client.py +208 -0
  278. autogen/mcp/mcp_proxy/__init__.py +19 -0
  279. autogen/mcp/mcp_proxy/fastapi_code_generator_helpers.py +63 -0
  280. autogen/mcp/mcp_proxy/mcp_proxy.py +581 -0
  281. autogen/mcp/mcp_proxy/operation_grouping.py +158 -0
  282. autogen/mcp/mcp_proxy/operation_renaming.py +114 -0
  283. autogen/mcp/mcp_proxy/patch_fastapi_code_generator.py +98 -0
  284. autogen/mcp/mcp_proxy/security.py +400 -0
  285. autogen/mcp/mcp_proxy/security_schema_visitor.py +37 -0
  286. autogen/messages/__init__.py +7 -0
  287. autogen/messages/agent_messages.py +948 -0
  288. autogen/messages/base_message.py +107 -0
  289. autogen/messages/client_messages.py +171 -0
  290. autogen/messages/print_message.py +49 -0
  291. autogen/oai/__init__.py +53 -0
  292. autogen/oai/anthropic.py +714 -0
  293. autogen/oai/bedrock.py +628 -0
  294. autogen/oai/cerebras.py +299 -0
  295. autogen/oai/client.py +1444 -0
  296. autogen/oai/client_utils.py +169 -0
  297. autogen/oai/cohere.py +479 -0
  298. autogen/oai/gemini.py +998 -0
  299. autogen/oai/gemini_types.py +155 -0
  300. autogen/oai/groq.py +305 -0
  301. autogen/oai/mistral.py +303 -0
  302. autogen/oai/oai_models/__init__.py +11 -0
  303. autogen/oai/oai_models/_models.py +16 -0
  304. autogen/oai/oai_models/chat_completion.py +87 -0
  305. autogen/oai/oai_models/chat_completion_audio.py +32 -0
  306. autogen/oai/oai_models/chat_completion_message.py +86 -0
  307. autogen/oai/oai_models/chat_completion_message_tool_call.py +37 -0
  308. autogen/oai/oai_models/chat_completion_token_logprob.py +63 -0
  309. autogen/oai/oai_models/completion_usage.py +60 -0
  310. autogen/oai/ollama.py +643 -0
  311. autogen/oai/openai_utils.py +881 -0
  312. autogen/oai/together.py +370 -0
  313. autogen/retrieve_utils.py +491 -0
  314. autogen/runtime_logging.py +160 -0
  315. autogen/token_count_utils.py +267 -0
  316. autogen/tools/__init__.py +20 -0
  317. autogen/tools/contrib/__init__.py +9 -0
  318. autogen/tools/contrib/time/__init__.py +7 -0
  319. autogen/tools/contrib/time/time.py +41 -0
  320. autogen/tools/dependency_injection.py +254 -0
  321. autogen/tools/experimental/__init__.py +48 -0
  322. autogen/tools/experimental/browser_use/__init__.py +7 -0
  323. autogen/tools/experimental/browser_use/browser_use.py +161 -0
  324. autogen/tools/experimental/crawl4ai/__init__.py +7 -0
  325. autogen/tools/experimental/crawl4ai/crawl4ai.py +153 -0
  326. autogen/tools/experimental/deep_research/__init__.py +7 -0
  327. autogen/tools/experimental/deep_research/deep_research.py +328 -0
  328. autogen/tools/experimental/duckduckgo/__init__.py +7 -0
  329. autogen/tools/experimental/duckduckgo/duckduckgo_search.py +109 -0
  330. autogen/tools/experimental/google/__init__.py +14 -0
  331. autogen/tools/experimental/google/authentication/__init__.py +11 -0
  332. autogen/tools/experimental/google/authentication/credentials_hosted_provider.py +43 -0
  333. autogen/tools/experimental/google/authentication/credentials_local_provider.py +91 -0
  334. autogen/tools/experimental/google/authentication/credentials_provider.py +35 -0
  335. autogen/tools/experimental/google/drive/__init__.py +9 -0
  336. autogen/tools/experimental/google/drive/drive_functions.py +124 -0
  337. autogen/tools/experimental/google/drive/toolkit.py +88 -0
  338. autogen/tools/experimental/google/model.py +17 -0
  339. autogen/tools/experimental/google/toolkit_protocol.py +19 -0
  340. autogen/tools/experimental/google_search/__init__.py +8 -0
  341. autogen/tools/experimental/google_search/google_search.py +93 -0
  342. autogen/tools/experimental/google_search/youtube_search.py +181 -0
  343. autogen/tools/experimental/messageplatform/__init__.py +17 -0
  344. autogen/tools/experimental/messageplatform/discord/__init__.py +7 -0
  345. autogen/tools/experimental/messageplatform/discord/discord.py +288 -0
  346. autogen/tools/experimental/messageplatform/slack/__init__.py +7 -0
  347. autogen/tools/experimental/messageplatform/slack/slack.py +391 -0
  348. autogen/tools/experimental/messageplatform/telegram/__init__.py +7 -0
  349. autogen/tools/experimental/messageplatform/telegram/telegram.py +275 -0
  350. autogen/tools/experimental/perplexity/__init__.py +7 -0
  351. autogen/tools/experimental/perplexity/perplexity_search.py +260 -0
  352. autogen/tools/experimental/reliable/__init__.py +10 -0
  353. autogen/tools/experimental/reliable/reliable.py +1316 -0
  354. autogen/tools/experimental/tavily/__init__.py +7 -0
  355. autogen/tools/experimental/tavily/tavily_search.py +183 -0
  356. autogen/tools/experimental/web_search_preview/__init__.py +7 -0
  357. autogen/tools/experimental/web_search_preview/web_search_preview.py +114 -0
  358. autogen/tools/experimental/wikipedia/__init__.py +7 -0
  359. autogen/tools/experimental/wikipedia/wikipedia.py +287 -0
  360. autogen/tools/function_utils.py +411 -0
  361. autogen/tools/tool.py +187 -0
  362. autogen/tools/toolkit.py +86 -0
  363. autogen/types.py +29 -0
  364. autogen/version.py +7 -0
  365. templates/client_template/main.jinja2 +69 -0
  366. templates/config_template/config.jinja2 +7 -0
  367. templates/main.jinja2 +61 -0
  368. ag2-0.9.1a1.dist-info/RECORD +0 -6
  369. ag2-0.9.1a1.dist-info/top_level.txt +0 -1
  370. {ag2-0.9.1a1.dist-info → ag2-0.9.2.dist-info/licenses}/LICENSE +0 -0
  371. {ag2-0.9.1a1.dist-info → ag2-0.9.2.dist-info/licenses}/NOTICE.md +0 -0
@@ -0,0 +1,1013 @@
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 copy import deepcopy
7
+ from typing import TYPE_CHECKING, Any, Callable, Literal, Optional, Union
8
+ from uuid import UUID
9
+
10
+ from pydantic import BaseModel, field_validator, model_serializer
11
+ from termcolor import colored
12
+
13
+ from autogen.agentchat.group import ContextVariables
14
+
15
+ from ..agentchat.agent import LLMMessageType
16
+ from ..code_utils import content_str
17
+ from ..import_utils import optional_import_block, require_optional_import
18
+ from ..oai.client import OpenAIWrapper
19
+ from .base_event import BaseEvent, wrap_event
20
+
21
+ with optional_import_block() as result:
22
+ from PIL.Image import Image
23
+
24
+ IS_PIL_AVAILABLE = result.is_successful
25
+
26
+ if TYPE_CHECKING:
27
+ from ..agentchat.agent import Agent
28
+ from ..coding.base import CodeBlock
29
+
30
+
31
+ __all__ = [
32
+ "ClearAgentsHistoryEvent",
33
+ "ClearConversableAgentHistoryEvent",
34
+ "ConversableAgentUsageSummaryEvent",
35
+ "ConversableAgentUsageSummaryNoCostIncurredEvent",
36
+ "ExecuteCodeBlockEvent",
37
+ "ExecuteFunctionEvent",
38
+ "FunctionCallEvent",
39
+ "FunctionResponseEvent",
40
+ "GenerateCodeExecutionReplyEvent",
41
+ "GroupChatResumeEvent",
42
+ "GroupChatRunChatEvent",
43
+ "PostCarryoverProcessingEvent",
44
+ "SelectSpeakerEvent",
45
+ "SpeakerAttemptFailedMultipleAgentsEvent",
46
+ "SpeakerAttemptFailedNoAgentsEvent",
47
+ "SpeakerAttemptSuccessfulEvent",
48
+ "TerminationAndHumanReplyNoInputEvent",
49
+ "TerminationEvent",
50
+ "TextEvent",
51
+ "ToolCallEvent",
52
+ "ToolResponseEvent",
53
+ ]
54
+
55
+ EventRole = Literal["assistant", "function", "tool"]
56
+
57
+
58
+ class BasePrintReceivedEvent(BaseEvent, ABC):
59
+ content: Union[str, int, float, bool]
60
+ sender: str
61
+ recipient: str
62
+
63
+ def print(self, f: Optional[Callable[..., Any]] = None) -> None:
64
+ f = f or print
65
+ f(f"{colored(self.sender, 'yellow')} (to {self.recipient}):\n", flush=True)
66
+
67
+
68
+ @wrap_event
69
+ class FunctionResponseEvent(BasePrintReceivedEvent):
70
+ name: Optional[str] = None
71
+ role: EventRole = "function"
72
+ content: Union[str, int, float, bool]
73
+
74
+ def print(self, f: Optional[Callable[..., Any]] = None) -> None:
75
+ f = f or print
76
+ super().print(f)
77
+
78
+ id = self.name or "No id found"
79
+ func_print = f"***** Response from calling {self.role} ({id}) *****"
80
+ f(colored(func_print, "green"), flush=True)
81
+ f(self.content, flush=True)
82
+ f(colored("*" * len(func_print), "green"), flush=True)
83
+
84
+ f("\n", "-" * 80, flush=True, sep="")
85
+
86
+
87
+ class ToolResponse(BaseModel):
88
+ tool_call_id: Optional[str] = None
89
+ role: EventRole = "tool"
90
+ content: Union[str, int, float, bool]
91
+
92
+ def print(self, f: Optional[Callable[..., Any]] = None) -> None:
93
+ f = f or print
94
+ id = self.tool_call_id or "No id found"
95
+ tool_print = f"***** Response from calling {self.role} ({id}) *****"
96
+ f(colored(tool_print, "green"), flush=True)
97
+ f(self.content, flush=True)
98
+ f(colored("*" * len(tool_print), "green"), flush=True)
99
+
100
+
101
+ @wrap_event
102
+ class ToolResponseEvent(BasePrintReceivedEvent):
103
+ role: EventRole = "tool"
104
+ tool_responses: list[ToolResponse]
105
+ content: Union[str, int, float, bool]
106
+
107
+ def print(self, f: Optional[Callable[..., Any]] = None) -> None:
108
+ f = f or print
109
+ super().print(f)
110
+
111
+ for tool_response in self.tool_responses:
112
+ tool_response.print(f)
113
+ f("\n", "-" * 80, flush=True, sep="")
114
+
115
+
116
+ class FunctionCall(BaseModel):
117
+ name: Optional[str] = None
118
+ arguments: Optional[str] = None
119
+
120
+ def print(self, f: Optional[Callable[..., Any]] = None) -> None:
121
+ f = f or print
122
+
123
+ name = self.name or "(No function name found)"
124
+ arguments = self.arguments or "(No arguments found)"
125
+
126
+ func_print = f"***** Suggested function call: {name} *****"
127
+ f(colored(func_print, "green"), flush=True)
128
+ f(
129
+ "Arguments: \n",
130
+ arguments,
131
+ flush=True,
132
+ sep="",
133
+ )
134
+ f(colored("*" * len(func_print), "green"), flush=True)
135
+
136
+
137
+ @wrap_event
138
+ class FunctionCallEvent(BasePrintReceivedEvent):
139
+ content: Optional[Union[str, int, float, bool]] = None # type: ignore [assignment]
140
+ function_call: FunctionCall
141
+
142
+ def print(self, f: Optional[Callable[..., Any]] = None) -> None:
143
+ f = f or print
144
+ super().print(f)
145
+
146
+ if self.content is not None:
147
+ f(self.content, flush=True)
148
+
149
+ self.function_call.print(f)
150
+
151
+ f("\n", "-" * 80, flush=True, sep="")
152
+
153
+
154
+ class ToolCall(BaseModel):
155
+ id: Optional[str] = None
156
+ function: FunctionCall
157
+ type: str
158
+
159
+ def print(self, f: Optional[Callable[..., Any]] = None) -> None:
160
+ f = f or print
161
+
162
+ id = self.id or "No tool call id found"
163
+
164
+ name = self.function.name or "(No function name found)"
165
+ arguments = self.function.arguments or "(No arguments found)"
166
+
167
+ func_print = f"***** Suggested tool call ({id}): {name} *****"
168
+ f(colored(func_print, "green"), flush=True)
169
+ f(
170
+ "Arguments: \n",
171
+ arguments,
172
+ flush=True,
173
+ sep="",
174
+ )
175
+ f(colored("*" * len(func_print), "green"), flush=True)
176
+
177
+
178
+ @wrap_event
179
+ class ToolCallEvent(BasePrintReceivedEvent):
180
+ content: Optional[Union[str, int, float, bool]] = None # type: ignore [assignment]
181
+ refusal: Optional[str] = None
182
+ role: Optional[EventRole] = None
183
+ audio: Optional[str] = None
184
+ function_call: Optional[FunctionCall] = None
185
+ tool_calls: list[ToolCall]
186
+
187
+ def print(self, f: Optional[Callable[..., Any]] = None) -> None:
188
+ f = f or print
189
+ super().print(f)
190
+
191
+ if self.content is not None:
192
+ f(self.content, flush=True)
193
+
194
+ for tool_call in self.tool_calls:
195
+ tool_call.print(f)
196
+
197
+ f("\n", "-" * 80, flush=True, sep="")
198
+
199
+
200
+ @wrap_event
201
+ class TextEvent(BasePrintReceivedEvent):
202
+ content: Optional[Union[str, int, float, bool, list[dict[str, Union[str, dict[str, Any]]]]]] = None # type: ignore [assignment]
203
+
204
+ @classmethod
205
+ @require_optional_import("PIL", "unknown")
206
+ def _replace_pil_image_with_placeholder(cls, image_url: dict[str, Any]) -> None:
207
+ if "url" in image_url and isinstance(image_url["url"], Image):
208
+ image_url["url"] = "<image>"
209
+
210
+ @field_validator("content", mode="before")
211
+ @classmethod
212
+ def validate_and_encode_content(
213
+ cls, content: Optional[Union[str, int, float, bool, list[dict[str, Union[str, dict[str, Any]]]]]]
214
+ ) -> Optional[Union[str, int, float, bool, list[dict[str, Union[str, dict[str, Any]]]]]]:
215
+ if not IS_PIL_AVAILABLE:
216
+ return content
217
+
218
+ if not isinstance(content, list):
219
+ return content
220
+
221
+ for item in content:
222
+ if isinstance(item, dict) and "image_url" in item and isinstance(item["image_url"], dict):
223
+ cls._replace_pil_image_with_placeholder(item["image_url"])
224
+
225
+ return content
226
+
227
+ def print(self, f: Optional[Callable[..., Any]] = None) -> None:
228
+ f = f or print
229
+ super().print(f)
230
+
231
+ if self.content is not None:
232
+ f(content_str(self.content), flush=True) # type: ignore [arg-type]
233
+
234
+ f("\n", "-" * 80, flush=True, sep="")
235
+
236
+
237
+ def create_received_event_model(
238
+ *, uuid: Optional[UUID] = None, event: dict[str, Any], sender: "Agent", recipient: "Agent"
239
+ ) -> Union[FunctionResponseEvent, ToolResponseEvent, FunctionCallEvent, ToolCallEvent, TextEvent]:
240
+ role = event.get("role")
241
+ if role == "function":
242
+ return FunctionResponseEvent(**event, sender=sender.name, recipient=recipient.name, uuid=uuid)
243
+ if role == "tool":
244
+ return ToolResponseEvent(**event, sender=sender.name, recipient=recipient.name, uuid=uuid)
245
+
246
+ # Role is neither function nor tool
247
+
248
+ if event.get("function_call"):
249
+ return FunctionCallEvent(
250
+ **event,
251
+ sender=sender.name,
252
+ recipient=recipient.name,
253
+ uuid=uuid,
254
+ )
255
+
256
+ if event.get("tool_calls"):
257
+ return ToolCallEvent(
258
+ **event,
259
+ sender=sender.name,
260
+ recipient=recipient.name,
261
+ uuid=uuid,
262
+ )
263
+
264
+ # Now message is a simple content message
265
+ content = event.get("content")
266
+ allow_format_str_template = (
267
+ recipient.llm_config.get("allow_format_str_template", False) if recipient.llm_config else False # type: ignore [attr-defined]
268
+ )
269
+ if content is not None and "context" in event:
270
+ content = OpenAIWrapper.instantiate(
271
+ content, # type: ignore [arg-type]
272
+ event["context"],
273
+ allow_format_str_template,
274
+ )
275
+
276
+ return TextEvent(
277
+ content=content,
278
+ sender=sender.name,
279
+ recipient=recipient.name,
280
+ uuid=uuid,
281
+ )
282
+
283
+
284
+ @wrap_event
285
+ class PostCarryoverProcessingEvent(BaseEvent):
286
+ carryover: Union[str, list[Union[str, dict[str, Any], Any]]]
287
+ message: str
288
+ verbose: bool = False
289
+
290
+ sender: str
291
+ recipient: str
292
+ summary_method: str
293
+ summary_args: Optional[dict[str, Any]] = None
294
+ max_turns: Optional[int] = None
295
+
296
+ def __init__(self, *, uuid: Optional[UUID] = None, chat_info: dict[str, Any]):
297
+ carryover = chat_info.get("carryover", "")
298
+ message = chat_info.get("message")
299
+ verbose = chat_info.get("verbose", False)
300
+
301
+ sender = chat_info["sender"].name if hasattr(chat_info["sender"], "name") else chat_info["sender"]
302
+ recipient = chat_info["recipient"].name if hasattr(chat_info["recipient"], "name") else chat_info["recipient"]
303
+ summary_args = chat_info.get("summary_args")
304
+ max_turns = chat_info.get("max_turns")
305
+
306
+ # Fix Callable in chat_info
307
+ summary_method = chat_info.get("summary_method", "")
308
+ if callable(summary_method):
309
+ summary_method = summary_method.__name__
310
+
311
+ print_message = ""
312
+ if isinstance(message, str):
313
+ print_message = message
314
+ elif callable(message):
315
+ print_message = "Callable: " + message.__name__
316
+ elif isinstance(message, dict):
317
+ print_message = "Dict: " + str(message)
318
+ elif message is None:
319
+ print_message = "None"
320
+
321
+ super().__init__(
322
+ uuid=uuid,
323
+ carryover=carryover,
324
+ message=print_message,
325
+ verbose=verbose,
326
+ summary_method=summary_method,
327
+ summary_args=summary_args,
328
+ max_turns=max_turns,
329
+ sender=sender,
330
+ recipient=recipient,
331
+ )
332
+
333
+ @model_serializer
334
+ def serialize_model(self) -> dict[str, Any]:
335
+ return {
336
+ "uuid": self.uuid,
337
+ "chat_info": {
338
+ "carryover": self.carryover,
339
+ "message": self.message,
340
+ "verbose": self.verbose,
341
+ "sender": self.sender,
342
+ "recipient": self.recipient,
343
+ "summary_method": self.summary_method,
344
+ "summary_args": self.summary_args,
345
+ "max_turns": self.max_turns,
346
+ },
347
+ }
348
+
349
+ def _process_carryover(self) -> str:
350
+ if not isinstance(self.carryover, list):
351
+ return self.carryover
352
+
353
+ print_carryover = []
354
+ for carryover_item in self.carryover:
355
+ if isinstance(carryover_item, str):
356
+ print_carryover.append(carryover_item)
357
+ elif isinstance(carryover_item, dict) and "content" in carryover_item:
358
+ print_carryover.append(str(carryover_item["content"]))
359
+ else:
360
+ print_carryover.append(str(carryover_item))
361
+
362
+ return ("\n").join(print_carryover)
363
+
364
+ def print(self, f: Optional[Callable[..., Any]] = None) -> None:
365
+ f = f or print
366
+
367
+ print_carryover = self._process_carryover()
368
+
369
+ f(colored("\n" + "*" * 80, "blue"), flush=True, sep="")
370
+ f(
371
+ colored(
372
+ "Starting a new chat....",
373
+ "blue",
374
+ ),
375
+ flush=True,
376
+ )
377
+ if self.verbose:
378
+ f(colored("Event:\n" + self.message, "blue"), flush=True)
379
+ f(colored("Carryover:\n" + print_carryover, "blue"), flush=True)
380
+ f(colored("\n" + "*" * 80, "blue"), flush=True, sep="")
381
+
382
+
383
+ @wrap_event
384
+ class ClearAgentsHistoryEvent(BaseEvent):
385
+ agent: Optional[str] = None
386
+ nr_events_to_preserve: Optional[int] = None
387
+
388
+ def __init__(
389
+ self,
390
+ *,
391
+ uuid: Optional[UUID] = None,
392
+ agent: Optional[Union["Agent", str]] = None,
393
+ nr_events_to_preserve: Optional[int] = None,
394
+ ):
395
+ return super().__init__(
396
+ uuid=uuid,
397
+ agent=agent.name if hasattr(agent, "name") else agent,
398
+ nr_events_to_preserve=nr_events_to_preserve,
399
+ )
400
+
401
+ def print(self, f: Optional[Callable[..., Any]] = None) -> None:
402
+ f = f or print
403
+
404
+ if self.agent:
405
+ if self.nr_events_to_preserve:
406
+ f(f"Clearing history for {self.agent} except last {self.nr_events_to_preserve} events.")
407
+ else:
408
+ f(f"Clearing history for {self.agent}.")
409
+ else:
410
+ if self.nr_events_to_preserve:
411
+ f(f"Clearing history for all agents except last {self.nr_events_to_preserve} events.")
412
+ else:
413
+ f("Clearing history for all agents.")
414
+
415
+
416
+ # todo: break into multiple events
417
+ @wrap_event
418
+ class SpeakerAttemptSuccessfulEvent(BaseEvent):
419
+ mentions: dict[str, int]
420
+ attempt: int
421
+ attempts_left: int
422
+ verbose: Optional[bool] = False
423
+
424
+ def __init__(
425
+ self,
426
+ *,
427
+ uuid: Optional[UUID] = None,
428
+ mentions: dict[str, int],
429
+ attempt: int,
430
+ attempts_left: int,
431
+ select_speaker_auto_verbose: Optional[bool] = False,
432
+ ):
433
+ super().__init__(
434
+ uuid=uuid,
435
+ mentions=deepcopy(mentions),
436
+ attempt=attempt,
437
+ attempts_left=attempts_left,
438
+ verbose=select_speaker_auto_verbose,
439
+ )
440
+
441
+ @model_serializer
442
+ def serialize_model(self) -> dict[str, Any]:
443
+ return {
444
+ "uuid": self.uuid,
445
+ "mentions": self.mentions,
446
+ "attempt": self.attempt,
447
+ "attempts_left": self.attempts_left,
448
+ "select_speaker_auto_verbose": self.verbose,
449
+ }
450
+
451
+ def print(self, f: Optional[Callable[..., Any]] = None) -> None:
452
+ f = f or print
453
+
454
+ selected_agent_name = next(iter(self.mentions))
455
+ f(
456
+ colored(
457
+ f">>>>>>>> Select speaker attempt {self.attempt} of {self.attempt + self.attempts_left} successfully selected: {selected_agent_name}",
458
+ "green",
459
+ ),
460
+ flush=True,
461
+ )
462
+
463
+
464
+ @wrap_event
465
+ class SpeakerAttemptFailedMultipleAgentsEvent(BaseEvent):
466
+ mentions: dict[str, int]
467
+ attempt: int
468
+ attempts_left: int
469
+ verbose: Optional[bool] = False
470
+
471
+ def __init__(
472
+ self,
473
+ *,
474
+ uuid: Optional[UUID] = None,
475
+ mentions: dict[str, int],
476
+ attempt: int,
477
+ attempts_left: int,
478
+ select_speaker_auto_verbose: Optional[bool] = False,
479
+ ):
480
+ super().__init__(
481
+ uuid=uuid,
482
+ mentions=deepcopy(mentions),
483
+ attempt=attempt,
484
+ attempts_left=attempts_left,
485
+ verbose=select_speaker_auto_verbose,
486
+ )
487
+
488
+ @model_serializer
489
+ def serialize_model(self) -> dict[str, Any]:
490
+ return {
491
+ "uuid": self.uuid,
492
+ "mentions": self.mentions,
493
+ "attempt": self.attempt,
494
+ "attempts_left": self.attempts_left,
495
+ "select_speaker_auto_verbose": self.verbose,
496
+ }
497
+
498
+ def print(self, f: Optional[Callable[..., Any]] = None) -> None:
499
+ f = f or print
500
+
501
+ f(
502
+ colored(
503
+ f">>>>>>>> Select speaker attempt {self.attempt} of {self.attempt + self.attempts_left} failed as it included multiple agent names.",
504
+ "red",
505
+ ),
506
+ flush=True,
507
+ )
508
+
509
+
510
+ @wrap_event
511
+ class SpeakerAttemptFailedNoAgentsEvent(BaseEvent):
512
+ mentions: dict[str, int]
513
+ attempt: int
514
+ attempts_left: int
515
+ verbose: Optional[bool] = False
516
+
517
+ def __init__(
518
+ self,
519
+ *,
520
+ uuid: Optional[UUID] = None,
521
+ mentions: dict[str, int],
522
+ attempt: int,
523
+ attempts_left: int,
524
+ select_speaker_auto_verbose: Optional[bool] = 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
+ @model_serializer
535
+ def serialize_model(self) -> dict[str, Any]:
536
+ return {
537
+ "uuid": self.uuid,
538
+ "mentions": self.mentions,
539
+ "attempt": self.attempt,
540
+ "attempts_left": self.attempts_left,
541
+ "select_speaker_auto_verbose": self.verbose,
542
+ }
543
+
544
+ def print(self, f: Optional[Callable[..., Any]] = None) -> None:
545
+ f = f or print
546
+
547
+ f(
548
+ colored(
549
+ f">>>>>>>> Select speaker attempt #{self.attempt} failed as it did not include any agent names.",
550
+ "red",
551
+ ),
552
+ flush=True,
553
+ )
554
+
555
+
556
+ @wrap_event
557
+ class GroupChatResumeEvent(BaseEvent):
558
+ last_speaker_name: str
559
+ events: list[LLMMessageType]
560
+ verbose: Optional[bool] = False
561
+
562
+ def __init__(
563
+ self,
564
+ *,
565
+ uuid: Optional[UUID] = None,
566
+ last_speaker_name: str,
567
+ events: list["LLMMessageType"],
568
+ silent: Optional[bool] = False,
569
+ ):
570
+ super().__init__(uuid=uuid, last_speaker_name=last_speaker_name, events=events, verbose=not silent)
571
+
572
+ @model_serializer
573
+ def serialize_model(self) -> dict[str, Any]:
574
+ return {
575
+ "uuid": self.uuid,
576
+ "last_speaker_name": self.last_speaker_name,
577
+ "events": self.events,
578
+ "silent": not self.verbose,
579
+ }
580
+
581
+ def print(self, f: Optional[Callable[..., Any]] = None) -> None:
582
+ f = f or print
583
+
584
+ f(
585
+ f"Prepared group chat with {len(self.events)} events, the last speaker is",
586
+ colored(self.last_speaker_name, "yellow"),
587
+ flush=True,
588
+ )
589
+
590
+
591
+ @wrap_event
592
+ class GroupChatRunChatEvent(BaseEvent):
593
+ speaker: str
594
+ verbose: Optional[bool] = False
595
+
596
+ def __init__(self, *, uuid: Optional[UUID] = None, speaker: Union["Agent", str], silent: Optional[bool] = False):
597
+ super().__init__(uuid=uuid, speaker=speaker.name if hasattr(speaker, "name") else speaker, verbose=not silent)
598
+
599
+ @model_serializer
600
+ def serialize_model(self) -> dict[str, Any]:
601
+ return {"uuid": self.uuid, "speaker": self.speaker, "silent": not self.verbose}
602
+
603
+ def print(self, f: Optional[Callable[..., Any]] = None) -> None:
604
+ f = f or print
605
+
606
+ f(colored(f"\nNext speaker: {self.speaker}\n", "green"), flush=True)
607
+
608
+
609
+ @wrap_event
610
+ class TerminationAndHumanReplyNoInputEvent(BaseEvent):
611
+ """When the human-in-the-loop is prompted but provides no input."""
612
+
613
+ no_human_input_msg: str
614
+ sender: str
615
+ recipient: str
616
+
617
+ def __init__(
618
+ self,
619
+ *,
620
+ uuid: Optional[UUID] = None,
621
+ no_human_input_msg: str,
622
+ sender: Optional[Union["Agent", str]] = None,
623
+ recipient: Union["Agent", str],
624
+ ):
625
+ sender = sender or "No sender"
626
+ super().__init__(
627
+ uuid=uuid,
628
+ no_human_input_msg=no_human_input_msg,
629
+ sender=sender.name if hasattr(sender, "name") else sender,
630
+ recipient=recipient.name if hasattr(recipient, "name") else recipient,
631
+ )
632
+
633
+ def print(self, f: Optional[Callable[..., Any]] = None) -> None:
634
+ f = f or print
635
+
636
+ f(colored(f"\n>>>>>>>> {self.no_human_input_msg}", "red"), flush=True)
637
+
638
+
639
+ @wrap_event
640
+ class UsingAutoReplyEvent(BaseEvent):
641
+ human_input_mode: str
642
+ sender: str
643
+ recipient: str
644
+
645
+ def __init__(
646
+ self,
647
+ *,
648
+ uuid: Optional[UUID] = None,
649
+ human_input_mode: str,
650
+ sender: Optional[Union["Agent", str]] = None,
651
+ recipient: Union["Agent", str],
652
+ ):
653
+ sender = sender or "No sender"
654
+ super().__init__(
655
+ uuid=uuid,
656
+ human_input_mode=human_input_mode,
657
+ sender=sender.name if hasattr(sender, "name") else sender,
658
+ recipient=recipient.name if hasattr(recipient, "name") else recipient,
659
+ )
660
+
661
+ def print(self, f: Optional[Callable[..., Any]] = None) -> None:
662
+ f = f or print
663
+
664
+ f(colored("\n>>>>>>>> USING AUTO REPLY...", "red"), flush=True)
665
+
666
+
667
+ @wrap_event
668
+ class TerminationEvent(BaseEvent):
669
+ """When a workflow termination condition is met"""
670
+
671
+ termination_reason: str
672
+
673
+ def __init__(
674
+ self,
675
+ *,
676
+ uuid: Optional[UUID] = None,
677
+ termination_reason: str,
678
+ ):
679
+ super().__init__(
680
+ uuid=uuid,
681
+ termination_reason=termination_reason,
682
+ )
683
+
684
+ def print(self, f: Optional[Callable[..., Any]] = None) -> None:
685
+ f = f or print
686
+
687
+ f(colored(f"\n>>>>>>>> TERMINATING RUN ({str(self.uuid)}): {self.termination_reason}", "red"), flush=True)
688
+
689
+
690
+ @wrap_event
691
+ class ExecuteCodeBlockEvent(BaseEvent):
692
+ code: str
693
+ language: str
694
+ code_block_count: int
695
+ recipient: str
696
+
697
+ def __init__(
698
+ self,
699
+ *,
700
+ uuid: Optional[UUID] = None,
701
+ code: str,
702
+ language: str,
703
+ code_block_count: int,
704
+ recipient: Union["Agent", str],
705
+ ):
706
+ super().__init__(
707
+ uuid=uuid,
708
+ code=code,
709
+ language=language,
710
+ code_block_count=code_block_count,
711
+ recipient=recipient.name if hasattr(recipient, "name") else recipient,
712
+ )
713
+
714
+ def print(self, f: Optional[Callable[..., Any]] = None) -> None:
715
+ f = f or print
716
+
717
+ f(
718
+ colored(
719
+ f"\n>>>>>>>> EXECUTING CODE BLOCK {self.code_block_count} (inferred language is {self.language})...",
720
+ "red",
721
+ ),
722
+ flush=True,
723
+ )
724
+
725
+
726
+ @wrap_event
727
+ class ExecuteFunctionEvent(BaseEvent):
728
+ func_name: str
729
+ call_id: Optional[str] = None
730
+ arguments: dict[str, Any]
731
+ recipient: str
732
+
733
+ def __init__(
734
+ self,
735
+ *,
736
+ uuid: Optional[UUID] = None,
737
+ func_name: str,
738
+ call_id: Optional[str] = None,
739
+ arguments: dict[str, Any],
740
+ recipient: Union["Agent", str],
741
+ ):
742
+ super().__init__(
743
+ uuid=uuid,
744
+ func_name=func_name,
745
+ call_id=call_id,
746
+ arguments=arguments,
747
+ recipient=recipient.name if hasattr(recipient, "name") else recipient,
748
+ )
749
+
750
+ def print(self, f: Optional[Callable[..., Any]] = None) -> None:
751
+ f = f or print
752
+
753
+ f(
754
+ colored(
755
+ f"\n>>>>>>>> EXECUTING FUNCTION {self.func_name}...\nCall ID: {self.call_id}\nInput arguments: {self.arguments}",
756
+ "magenta",
757
+ ),
758
+ flush=True,
759
+ )
760
+
761
+
762
+ @wrap_event
763
+ class ExecutedFunctionEvent(BaseEvent):
764
+ func_name: str
765
+ call_id: Optional[str] = None
766
+ arguments: Optional[dict[str, Any]]
767
+ content: Any
768
+ recipient: str
769
+ is_exec_success: bool = True
770
+
771
+ def __init__(
772
+ self,
773
+ *,
774
+ uuid: Optional[UUID] = None,
775
+ func_name: str,
776
+ call_id: Optional[str] = None,
777
+ arguments: Optional[dict[str, Any]],
778
+ content: Any,
779
+ recipient: Union["Agent", str],
780
+ is_exec_success: bool = True,
781
+ ):
782
+ super().__init__(
783
+ uuid=uuid,
784
+ func_name=func_name,
785
+ call_id=call_id,
786
+ arguments=arguments,
787
+ content=content,
788
+ recipient=recipient.name if hasattr(recipient, "name") else recipient,
789
+ )
790
+ self.is_exec_success = is_exec_success
791
+
792
+ def print(self, f: Optional[Callable[..., Any]] = None) -> None:
793
+ f = f or print
794
+
795
+ f(
796
+ colored(
797
+ f"\n>>>>>>>> EXECUTED FUNCTION {self.func_name}...\nCall ID: {self.call_id}\nInput arguments: {self.arguments}\nOutput:\n{self.content}",
798
+ "magenta",
799
+ ),
800
+ flush=True,
801
+ )
802
+
803
+
804
+ @wrap_event
805
+ class SelectSpeakerEvent(BaseEvent):
806
+ agents: Optional[list[str]] = None
807
+
808
+ def __init__(self, *, uuid: Optional[UUID] = None, agents: Optional[list[Union["Agent", str]]] = None):
809
+ agents = [agent.name if hasattr(agent, "name") else agent for agent in agents] if agents else None
810
+ super().__init__(uuid=uuid, agents=agents)
811
+
812
+ def print(self, f: Optional[Callable[..., Any]] = None) -> None:
813
+ f = f or print
814
+
815
+ f("Please select the next speaker from the following list:")
816
+ agents = self.agents or []
817
+ for i, agent in enumerate(agents):
818
+ f(f"{i + 1}: {agent}")
819
+
820
+
821
+ @wrap_event
822
+ class SelectSpeakerTryCountExceededEvent(BaseEvent):
823
+ try_count: int
824
+ agents: Optional[list[str]] = None
825
+
826
+ def __init__(
827
+ self, *, uuid: Optional[UUID] = None, try_count: int, agents: Optional[list[Union["Agent", str]]] = None
828
+ ):
829
+ agents = [agent.name if hasattr(agent, "name") else agent for agent in agents] if agents else None
830
+ super().__init__(uuid=uuid, try_count=try_count, agents=agents)
831
+
832
+ def print(self, f: Optional[Callable[..., Any]] = None) -> None:
833
+ f = f or print
834
+
835
+ f(f"You have tried {self.try_count} times. The next speaker will be selected automatically.")
836
+
837
+
838
+ @wrap_event
839
+ class SelectSpeakerInvalidInputEvent(BaseEvent):
840
+ agents: Optional[list[str]] = None
841
+
842
+ def __init__(self, *, uuid: Optional[UUID] = None, agents: Optional[list[Union["Agent", str]]] = None):
843
+ agents = [agent.name if hasattr(agent, "name") else agent for agent in agents] if agents else None
844
+ super().__init__(uuid=uuid, agents=agents)
845
+
846
+ def print(self, f: Optional[Callable[..., Any]] = None) -> None:
847
+ f = f or print
848
+
849
+ f(f"Invalid input. Please enter a number between 1 and {len(self.agents or [])}.")
850
+
851
+
852
+ @wrap_event
853
+ class ClearConversableAgentHistoryEvent(BaseEvent):
854
+ agent: str
855
+ recipient: str
856
+ no_events_preserved: int
857
+
858
+ def __init__(
859
+ self, *, uuid: Optional[UUID] = None, agent: Union["Agent", str], no_events_preserved: Optional[int] = None
860
+ ):
861
+ super().__init__(
862
+ uuid=uuid,
863
+ agent=agent.name if hasattr(agent, "name") else agent,
864
+ recipient=agent.name if hasattr(agent, "name") else agent,
865
+ no_events_preserved=no_events_preserved,
866
+ )
867
+
868
+ @model_serializer
869
+ def serialize_model(self) -> dict[str, Any]:
870
+ return {
871
+ "uuid": self.uuid,
872
+ "agent": self.agent,
873
+ "no_events_preserved": self.no_events_preserved,
874
+ }
875
+
876
+ def print(self, f: Optional[Callable[..., Any]] = None) -> None:
877
+ f = f or print
878
+
879
+ for _ in range(self.no_events_preserved):
880
+ f(f"Preserving one more event for {self.agent} to not divide history between tool call and tool response.")
881
+
882
+
883
+ @wrap_event
884
+ class ClearConversableAgentHistoryWarningEvent(BaseEvent):
885
+ recipient: str
886
+
887
+ def __init__(self, *, uuid: Optional[UUID] = None, recipient: Union["Agent", str]):
888
+ super().__init__(
889
+ uuid=uuid,
890
+ recipient=recipient.name if hasattr(recipient, "name") else recipient,
891
+ )
892
+
893
+ def print(self, f: Optional[Callable[..., Any]] = None) -> None:
894
+ f = f or print
895
+
896
+ f(
897
+ colored(
898
+ "WARNING: `nr_preserved_events` is ignored when clearing chat history with a specific agent.",
899
+ "yellow",
900
+ ),
901
+ flush=True,
902
+ )
903
+
904
+
905
+ @wrap_event
906
+ class GenerateCodeExecutionReplyEvent(BaseEvent):
907
+ code_blocks: list[str]
908
+ sender: str
909
+ recipient: str
910
+
911
+ def __init__(
912
+ self,
913
+ *,
914
+ uuid: Optional[UUID] = None,
915
+ code_blocks: list[Union["CodeBlock", str]],
916
+ sender: Optional[Union["Agent", str]] = None,
917
+ recipient: Union["Agent", str],
918
+ ):
919
+ code_blocks = [
920
+ code_block.language if hasattr(code_block, "language") else code_block for code_block in code_blocks
921
+ ]
922
+ sender = sender or "No sender"
923
+
924
+ super().__init__(
925
+ uuid=uuid,
926
+ code_blocks=code_blocks,
927
+ sender=sender.name if hasattr(sender, "name") else sender,
928
+ recipient=recipient.name if hasattr(recipient, "name") else recipient,
929
+ )
930
+
931
+ def print(self, f: Optional[Callable[..., Any]] = None) -> None:
932
+ f = f or print
933
+
934
+ num_code_blocks = len(self.code_blocks)
935
+ if num_code_blocks == 1:
936
+ f(
937
+ colored(
938
+ f"\n>>>>>>>> EXECUTING CODE BLOCK (inferred language is {self.code_blocks[0]})...",
939
+ "red",
940
+ ),
941
+ flush=True,
942
+ )
943
+ else:
944
+ f(
945
+ colored(
946
+ f"\n>>>>>>>> EXECUTING {num_code_blocks} CODE BLOCKS (inferred languages are [{', '.join([x for x in self.code_blocks])}])...",
947
+ "red",
948
+ ),
949
+ flush=True,
950
+ )
951
+
952
+
953
+ @wrap_event
954
+ class ConversableAgentUsageSummaryNoCostIncurredEvent(BaseEvent):
955
+ recipient: str
956
+
957
+ def __init__(self, *, uuid: Optional[UUID] = None, recipient: Union["Agent", str]):
958
+ super().__init__(uuid=uuid, recipient=recipient.name if hasattr(recipient, "name") else recipient)
959
+
960
+ def print(self, f: Optional[Callable[..., Any]] = None) -> None:
961
+ f = f or print
962
+
963
+ f(f"No cost incurred from agent '{self.recipient}'.")
964
+
965
+
966
+ @wrap_event
967
+ class ConversableAgentUsageSummaryEvent(BaseEvent):
968
+ recipient: str
969
+
970
+ def __init__(self, *, uuid: Optional[UUID] = None, recipient: Union["Agent", str]):
971
+ super().__init__(uuid=uuid, recipient=recipient.name if hasattr(recipient, "name") else recipient)
972
+
973
+ def print(self, f: Optional[Callable[..., Any]] = None) -> None:
974
+ f = f or print
975
+
976
+ f(f"Agent '{self.recipient}':")
977
+
978
+
979
+ @wrap_event
980
+ class InputRequestEvent(BaseEvent):
981
+ prompt: str
982
+ password: bool = False
983
+ respond: Optional[Callable[[str], None]] = None
984
+
985
+ type: str = "input_request"
986
+
987
+
988
+ @wrap_event
989
+ class AsyncInputRequestEvent(BaseEvent):
990
+ prompt: str
991
+ password: bool = False
992
+
993
+ async def a_respond(self, response: "InputResponseEvent") -> None:
994
+ pass
995
+
996
+
997
+ @wrap_event
998
+ class InputResponseEvent(BaseEvent):
999
+ value: str
1000
+
1001
+
1002
+ @wrap_event
1003
+ class ErrorEvent(BaseEvent):
1004
+ error: Any
1005
+
1006
+
1007
+ @wrap_event
1008
+ class RunCompletionEvent(BaseEvent):
1009
+ summary: str
1010
+ history: list[LLMMessageType]
1011
+ cost: dict[str, Any]
1012
+ last_speaker: Optional[str]
1013
+ context_variables: Optional[ContextVariables] = None