ag2 0.9.1__py3-none-any.whl → 0.9.1.post0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


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

Files changed (357) hide show
  1. {ag2-0.9.1.dist-info → ag2-0.9.1.post0.dist-info}/METADATA +264 -73
  2. ag2-0.9.1.post0.dist-info/RECORD +392 -0
  3. {ag2-0.9.1.dist-info → ag2-0.9.1.post0.dist-info}/WHEEL +1 -2
  4. autogen/__init__.py +89 -0
  5. autogen/_website/__init__.py +3 -0
  6. autogen/_website/generate_api_references.py +427 -0
  7. autogen/_website/generate_mkdocs.py +1174 -0
  8. autogen/_website/notebook_processor.py +476 -0
  9. autogen/_website/process_notebooks.py +656 -0
  10. autogen/_website/utils.py +412 -0
  11. autogen/agentchat/__init__.py +44 -0
  12. autogen/agentchat/agent.py +182 -0
  13. autogen/agentchat/assistant_agent.py +85 -0
  14. autogen/agentchat/chat.py +309 -0
  15. autogen/agentchat/contrib/__init__.py +5 -0
  16. autogen/agentchat/contrib/agent_eval/README.md +7 -0
  17. autogen/agentchat/contrib/agent_eval/agent_eval.py +108 -0
  18. autogen/agentchat/contrib/agent_eval/criterion.py +43 -0
  19. autogen/agentchat/contrib/agent_eval/critic_agent.py +44 -0
  20. autogen/agentchat/contrib/agent_eval/quantifier_agent.py +39 -0
  21. autogen/agentchat/contrib/agent_eval/subcritic_agent.py +45 -0
  22. autogen/agentchat/contrib/agent_eval/task.py +42 -0
  23. autogen/agentchat/contrib/agent_optimizer.py +429 -0
  24. autogen/agentchat/contrib/capabilities/__init__.py +5 -0
  25. autogen/agentchat/contrib/capabilities/agent_capability.py +20 -0
  26. autogen/agentchat/contrib/capabilities/generate_images.py +301 -0
  27. autogen/agentchat/contrib/capabilities/teachability.py +393 -0
  28. autogen/agentchat/contrib/capabilities/text_compressors.py +66 -0
  29. autogen/agentchat/contrib/capabilities/tools_capability.py +22 -0
  30. autogen/agentchat/contrib/capabilities/transform_messages.py +93 -0
  31. autogen/agentchat/contrib/capabilities/transforms.py +566 -0
  32. autogen/agentchat/contrib/capabilities/transforms_util.py +122 -0
  33. autogen/agentchat/contrib/capabilities/vision_capability.py +214 -0
  34. autogen/agentchat/contrib/captainagent/__init__.py +9 -0
  35. autogen/agentchat/contrib/captainagent/agent_builder.py +790 -0
  36. autogen/agentchat/contrib/captainagent/captainagent.py +512 -0
  37. autogen/agentchat/contrib/captainagent/tool_retriever.py +335 -0
  38. autogen/agentchat/contrib/captainagent/tools/README.md +44 -0
  39. autogen/agentchat/contrib/captainagent/tools/__init__.py +5 -0
  40. autogen/agentchat/contrib/captainagent/tools/data_analysis/calculate_correlation.py +40 -0
  41. autogen/agentchat/contrib/captainagent/tools/data_analysis/calculate_skewness_and_kurtosis.py +28 -0
  42. autogen/agentchat/contrib/captainagent/tools/data_analysis/detect_outlier_iqr.py +28 -0
  43. autogen/agentchat/contrib/captainagent/tools/data_analysis/detect_outlier_zscore.py +28 -0
  44. autogen/agentchat/contrib/captainagent/tools/data_analysis/explore_csv.py +21 -0
  45. autogen/agentchat/contrib/captainagent/tools/data_analysis/shapiro_wilk_test.py +30 -0
  46. autogen/agentchat/contrib/captainagent/tools/information_retrieval/arxiv_download.py +27 -0
  47. autogen/agentchat/contrib/captainagent/tools/information_retrieval/arxiv_search.py +53 -0
  48. autogen/agentchat/contrib/captainagent/tools/information_retrieval/extract_pdf_image.py +53 -0
  49. autogen/agentchat/contrib/captainagent/tools/information_retrieval/extract_pdf_text.py +38 -0
  50. autogen/agentchat/contrib/captainagent/tools/information_retrieval/get_wikipedia_text.py +21 -0
  51. autogen/agentchat/contrib/captainagent/tools/information_retrieval/get_youtube_caption.py +34 -0
  52. autogen/agentchat/contrib/captainagent/tools/information_retrieval/image_qa.py +60 -0
  53. autogen/agentchat/contrib/captainagent/tools/information_retrieval/optical_character_recognition.py +61 -0
  54. autogen/agentchat/contrib/captainagent/tools/information_retrieval/perform_web_search.py +47 -0
  55. autogen/agentchat/contrib/captainagent/tools/information_retrieval/scrape_wikipedia_tables.py +33 -0
  56. autogen/agentchat/contrib/captainagent/tools/information_retrieval/transcribe_audio_file.py +21 -0
  57. autogen/agentchat/contrib/captainagent/tools/information_retrieval/youtube_download.py +35 -0
  58. autogen/agentchat/contrib/captainagent/tools/math/calculate_circle_area_from_diameter.py +21 -0
  59. autogen/agentchat/contrib/captainagent/tools/math/calculate_day_of_the_week.py +18 -0
  60. autogen/agentchat/contrib/captainagent/tools/math/calculate_fraction_sum.py +28 -0
  61. autogen/agentchat/contrib/captainagent/tools/math/calculate_matrix_power.py +31 -0
  62. autogen/agentchat/contrib/captainagent/tools/math/calculate_reflected_point.py +16 -0
  63. autogen/agentchat/contrib/captainagent/tools/math/complex_numbers_product.py +25 -0
  64. autogen/agentchat/contrib/captainagent/tools/math/compute_currency_conversion.py +23 -0
  65. autogen/agentchat/contrib/captainagent/tools/math/count_distinct_permutations.py +27 -0
  66. autogen/agentchat/contrib/captainagent/tools/math/evaluate_expression.py +28 -0
  67. autogen/agentchat/contrib/captainagent/tools/math/find_continuity_point.py +34 -0
  68. autogen/agentchat/contrib/captainagent/tools/math/fraction_to_mixed_numbers.py +39 -0
  69. autogen/agentchat/contrib/captainagent/tools/math/modular_inverse_sum.py +23 -0
  70. autogen/agentchat/contrib/captainagent/tools/math/simplify_mixed_numbers.py +36 -0
  71. autogen/agentchat/contrib/captainagent/tools/math/sum_of_digit_factorials.py +15 -0
  72. autogen/agentchat/contrib/captainagent/tools/math/sum_of_primes_below.py +15 -0
  73. autogen/agentchat/contrib/captainagent/tools/requirements.txt +10 -0
  74. autogen/agentchat/contrib/captainagent/tools/tool_description.tsv +34 -0
  75. autogen/agentchat/contrib/gpt_assistant_agent.py +526 -0
  76. autogen/agentchat/contrib/graph_rag/__init__.py +9 -0
  77. autogen/agentchat/contrib/graph_rag/document.py +29 -0
  78. autogen/agentchat/contrib/graph_rag/falkor_graph_query_engine.py +170 -0
  79. autogen/agentchat/contrib/graph_rag/falkor_graph_rag_capability.py +103 -0
  80. autogen/agentchat/contrib/graph_rag/graph_query_engine.py +53 -0
  81. autogen/agentchat/contrib/graph_rag/graph_rag_capability.py +63 -0
  82. autogen/agentchat/contrib/graph_rag/neo4j_graph_query_engine.py +268 -0
  83. autogen/agentchat/contrib/graph_rag/neo4j_graph_rag_capability.py +83 -0
  84. autogen/agentchat/contrib/graph_rag/neo4j_native_graph_query_engine.py +210 -0
  85. autogen/agentchat/contrib/graph_rag/neo4j_native_graph_rag_capability.py +93 -0
  86. autogen/agentchat/contrib/img_utils.py +397 -0
  87. autogen/agentchat/contrib/llamaindex_conversable_agent.py +117 -0
  88. autogen/agentchat/contrib/llava_agent.py +187 -0
  89. autogen/agentchat/contrib/math_user_proxy_agent.py +464 -0
  90. autogen/agentchat/contrib/multimodal_conversable_agent.py +125 -0
  91. autogen/agentchat/contrib/qdrant_retrieve_user_proxy_agent.py +324 -0
  92. autogen/agentchat/contrib/rag/__init__.py +10 -0
  93. autogen/agentchat/contrib/rag/chromadb_query_engine.py +272 -0
  94. autogen/agentchat/contrib/rag/llamaindex_query_engine.py +198 -0
  95. autogen/agentchat/contrib/rag/mongodb_query_engine.py +329 -0
  96. autogen/agentchat/contrib/rag/query_engine.py +74 -0
  97. autogen/agentchat/contrib/retrieve_assistant_agent.py +56 -0
  98. autogen/agentchat/contrib/retrieve_user_proxy_agent.py +703 -0
  99. autogen/agentchat/contrib/society_of_mind_agent.py +199 -0
  100. autogen/agentchat/contrib/swarm_agent.py +1425 -0
  101. autogen/agentchat/contrib/text_analyzer_agent.py +79 -0
  102. autogen/agentchat/contrib/vectordb/__init__.py +5 -0
  103. autogen/agentchat/contrib/vectordb/base.py +232 -0
  104. autogen/agentchat/contrib/vectordb/chromadb.py +315 -0
  105. autogen/agentchat/contrib/vectordb/couchbase.py +407 -0
  106. autogen/agentchat/contrib/vectordb/mongodb.py +550 -0
  107. autogen/agentchat/contrib/vectordb/pgvectordb.py +928 -0
  108. autogen/agentchat/contrib/vectordb/qdrant.py +320 -0
  109. autogen/agentchat/contrib/vectordb/utils.py +126 -0
  110. autogen/agentchat/contrib/web_surfer.py +303 -0
  111. autogen/agentchat/conversable_agent.py +4020 -0
  112. autogen/agentchat/group/__init__.py +64 -0
  113. autogen/agentchat/group/available_condition.py +91 -0
  114. autogen/agentchat/group/context_condition.py +77 -0
  115. autogen/agentchat/group/context_expression.py +238 -0
  116. autogen/agentchat/group/context_str.py +41 -0
  117. autogen/agentchat/group/context_variables.py +192 -0
  118. autogen/agentchat/group/group_tool_executor.py +202 -0
  119. autogen/agentchat/group/group_utils.py +591 -0
  120. autogen/agentchat/group/handoffs.py +244 -0
  121. autogen/agentchat/group/llm_condition.py +93 -0
  122. autogen/agentchat/group/multi_agent_chat.py +237 -0
  123. autogen/agentchat/group/on_condition.py +58 -0
  124. autogen/agentchat/group/on_context_condition.py +54 -0
  125. autogen/agentchat/group/patterns/__init__.py +18 -0
  126. autogen/agentchat/group/patterns/auto.py +159 -0
  127. autogen/agentchat/group/patterns/manual.py +176 -0
  128. autogen/agentchat/group/patterns/pattern.py +288 -0
  129. autogen/agentchat/group/patterns/random.py +106 -0
  130. autogen/agentchat/group/patterns/round_robin.py +117 -0
  131. autogen/agentchat/group/reply_result.py +26 -0
  132. autogen/agentchat/group/speaker_selection_result.py +41 -0
  133. autogen/agentchat/group/targets/__init__.py +4 -0
  134. autogen/agentchat/group/targets/group_chat_target.py +132 -0
  135. autogen/agentchat/group/targets/group_manager_target.py +151 -0
  136. autogen/agentchat/group/targets/transition_target.py +413 -0
  137. autogen/agentchat/group/targets/transition_utils.py +6 -0
  138. autogen/agentchat/groupchat.py +1694 -0
  139. autogen/agentchat/realtime/__init__.py +3 -0
  140. autogen/agentchat/realtime/experimental/__init__.py +20 -0
  141. autogen/agentchat/realtime/experimental/audio_adapters/__init__.py +8 -0
  142. autogen/agentchat/realtime/experimental/audio_adapters/twilio_audio_adapter.py +148 -0
  143. autogen/agentchat/realtime/experimental/audio_adapters/websocket_audio_adapter.py +139 -0
  144. autogen/agentchat/realtime/experimental/audio_observer.py +42 -0
  145. autogen/agentchat/realtime/experimental/clients/__init__.py +15 -0
  146. autogen/agentchat/realtime/experimental/clients/gemini/__init__.py +7 -0
  147. autogen/agentchat/realtime/experimental/clients/gemini/client.py +274 -0
  148. autogen/agentchat/realtime/experimental/clients/oai/__init__.py +8 -0
  149. autogen/agentchat/realtime/experimental/clients/oai/base_client.py +220 -0
  150. autogen/agentchat/realtime/experimental/clients/oai/rtc_client.py +243 -0
  151. autogen/agentchat/realtime/experimental/clients/oai/utils.py +48 -0
  152. autogen/agentchat/realtime/experimental/clients/realtime_client.py +190 -0
  153. autogen/agentchat/realtime/experimental/function_observer.py +85 -0
  154. autogen/agentchat/realtime/experimental/realtime_agent.py +158 -0
  155. autogen/agentchat/realtime/experimental/realtime_events.py +42 -0
  156. autogen/agentchat/realtime/experimental/realtime_observer.py +100 -0
  157. autogen/agentchat/realtime/experimental/realtime_swarm.py +475 -0
  158. autogen/agentchat/realtime/experimental/websockets.py +21 -0
  159. autogen/agentchat/realtime_agent/__init__.py +21 -0
  160. autogen/agentchat/user_proxy_agent.py +111 -0
  161. autogen/agentchat/utils.py +206 -0
  162. autogen/agents/__init__.py +3 -0
  163. autogen/agents/contrib/__init__.py +10 -0
  164. autogen/agents/contrib/time/__init__.py +8 -0
  165. autogen/agents/contrib/time/time_reply_agent.py +73 -0
  166. autogen/agents/contrib/time/time_tool_agent.py +51 -0
  167. autogen/agents/experimental/__init__.py +27 -0
  168. autogen/agents/experimental/deep_research/__init__.py +7 -0
  169. autogen/agents/experimental/deep_research/deep_research.py +52 -0
  170. autogen/agents/experimental/discord/__init__.py +7 -0
  171. autogen/agents/experimental/discord/discord.py +66 -0
  172. autogen/agents/experimental/document_agent/__init__.py +19 -0
  173. autogen/agents/experimental/document_agent/chroma_query_engine.py +316 -0
  174. autogen/agents/experimental/document_agent/docling_doc_ingest_agent.py +118 -0
  175. autogen/agents/experimental/document_agent/document_agent.py +461 -0
  176. autogen/agents/experimental/document_agent/document_conditions.py +50 -0
  177. autogen/agents/experimental/document_agent/document_utils.py +380 -0
  178. autogen/agents/experimental/document_agent/inmemory_query_engine.py +220 -0
  179. autogen/agents/experimental/document_agent/parser_utils.py +130 -0
  180. autogen/agents/experimental/document_agent/url_utils.py +426 -0
  181. autogen/agents/experimental/reasoning/__init__.py +7 -0
  182. autogen/agents/experimental/reasoning/reasoning_agent.py +1178 -0
  183. autogen/agents/experimental/slack/__init__.py +7 -0
  184. autogen/agents/experimental/slack/slack.py +73 -0
  185. autogen/agents/experimental/telegram/__init__.py +7 -0
  186. autogen/agents/experimental/telegram/telegram.py +77 -0
  187. autogen/agents/experimental/websurfer/__init__.py +7 -0
  188. autogen/agents/experimental/websurfer/websurfer.py +62 -0
  189. autogen/agents/experimental/wikipedia/__init__.py +7 -0
  190. autogen/agents/experimental/wikipedia/wikipedia.py +90 -0
  191. autogen/browser_utils.py +309 -0
  192. autogen/cache/__init__.py +10 -0
  193. autogen/cache/abstract_cache_base.py +75 -0
  194. autogen/cache/cache.py +203 -0
  195. autogen/cache/cache_factory.py +88 -0
  196. autogen/cache/cosmos_db_cache.py +144 -0
  197. autogen/cache/disk_cache.py +102 -0
  198. autogen/cache/in_memory_cache.py +58 -0
  199. autogen/cache/redis_cache.py +123 -0
  200. autogen/code_utils.py +596 -0
  201. autogen/coding/__init__.py +22 -0
  202. autogen/coding/base.py +119 -0
  203. autogen/coding/docker_commandline_code_executor.py +268 -0
  204. autogen/coding/factory.py +47 -0
  205. autogen/coding/func_with_reqs.py +202 -0
  206. autogen/coding/jupyter/__init__.py +23 -0
  207. autogen/coding/jupyter/base.py +36 -0
  208. autogen/coding/jupyter/docker_jupyter_server.py +167 -0
  209. autogen/coding/jupyter/embedded_ipython_code_executor.py +182 -0
  210. autogen/coding/jupyter/import_utils.py +82 -0
  211. autogen/coding/jupyter/jupyter_client.py +231 -0
  212. autogen/coding/jupyter/jupyter_code_executor.py +160 -0
  213. autogen/coding/jupyter/local_jupyter_server.py +172 -0
  214. autogen/coding/local_commandline_code_executor.py +405 -0
  215. autogen/coding/markdown_code_extractor.py +45 -0
  216. autogen/coding/utils.py +56 -0
  217. autogen/doc_utils.py +34 -0
  218. autogen/events/__init__.py +7 -0
  219. autogen/events/agent_events.py +1010 -0
  220. autogen/events/base_event.py +99 -0
  221. autogen/events/client_events.py +167 -0
  222. autogen/events/helpers.py +36 -0
  223. autogen/events/print_event.py +46 -0
  224. autogen/exception_utils.py +73 -0
  225. autogen/extensions/__init__.py +5 -0
  226. autogen/fast_depends/__init__.py +16 -0
  227. autogen/fast_depends/_compat.py +80 -0
  228. autogen/fast_depends/core/__init__.py +14 -0
  229. autogen/fast_depends/core/build.py +225 -0
  230. autogen/fast_depends/core/model.py +576 -0
  231. autogen/fast_depends/dependencies/__init__.py +15 -0
  232. autogen/fast_depends/dependencies/model.py +29 -0
  233. autogen/fast_depends/dependencies/provider.py +39 -0
  234. autogen/fast_depends/library/__init__.py +10 -0
  235. autogen/fast_depends/library/model.py +46 -0
  236. autogen/fast_depends/py.typed +6 -0
  237. autogen/fast_depends/schema.py +66 -0
  238. autogen/fast_depends/use.py +280 -0
  239. autogen/fast_depends/utils.py +187 -0
  240. autogen/formatting_utils.py +83 -0
  241. autogen/function_utils.py +13 -0
  242. autogen/graph_utils.py +178 -0
  243. autogen/import_utils.py +526 -0
  244. autogen/interop/__init__.py +22 -0
  245. autogen/interop/crewai/__init__.py +7 -0
  246. autogen/interop/crewai/crewai.py +88 -0
  247. autogen/interop/interoperability.py +71 -0
  248. autogen/interop/interoperable.py +46 -0
  249. autogen/interop/langchain/__init__.py +8 -0
  250. autogen/interop/langchain/langchain_chat_model_factory.py +155 -0
  251. autogen/interop/langchain/langchain_tool.py +82 -0
  252. autogen/interop/litellm/__init__.py +7 -0
  253. autogen/interop/litellm/litellm_config_factory.py +113 -0
  254. autogen/interop/pydantic_ai/__init__.py +7 -0
  255. autogen/interop/pydantic_ai/pydantic_ai.py +168 -0
  256. autogen/interop/registry.py +69 -0
  257. autogen/io/__init__.py +15 -0
  258. autogen/io/base.py +151 -0
  259. autogen/io/console.py +56 -0
  260. autogen/io/processors/__init__.py +12 -0
  261. autogen/io/processors/base.py +21 -0
  262. autogen/io/processors/console_event_processor.py +56 -0
  263. autogen/io/run_response.py +293 -0
  264. autogen/io/thread_io_stream.py +63 -0
  265. autogen/io/websockets.py +213 -0
  266. autogen/json_utils.py +43 -0
  267. autogen/llm_config.py +379 -0
  268. autogen/logger/__init__.py +11 -0
  269. autogen/logger/base_logger.py +128 -0
  270. autogen/logger/file_logger.py +261 -0
  271. autogen/logger/logger_factory.py +42 -0
  272. autogen/logger/logger_utils.py +57 -0
  273. autogen/logger/sqlite_logger.py +523 -0
  274. autogen/math_utils.py +339 -0
  275. autogen/mcp/__init__.py +7 -0
  276. autogen/mcp/mcp_client.py +208 -0
  277. autogen/messages/__init__.py +7 -0
  278. autogen/messages/agent_messages.py +948 -0
  279. autogen/messages/base_message.py +107 -0
  280. autogen/messages/client_messages.py +171 -0
  281. autogen/messages/print_message.py +49 -0
  282. autogen/oai/__init__.py +53 -0
  283. autogen/oai/anthropic.py +714 -0
  284. autogen/oai/bedrock.py +628 -0
  285. autogen/oai/cerebras.py +299 -0
  286. autogen/oai/client.py +1435 -0
  287. autogen/oai/client_utils.py +169 -0
  288. autogen/oai/cohere.py +479 -0
  289. autogen/oai/gemini.py +990 -0
  290. autogen/oai/gemini_types.py +129 -0
  291. autogen/oai/groq.py +305 -0
  292. autogen/oai/mistral.py +303 -0
  293. autogen/oai/oai_models/__init__.py +11 -0
  294. autogen/oai/oai_models/_models.py +16 -0
  295. autogen/oai/oai_models/chat_completion.py +87 -0
  296. autogen/oai/oai_models/chat_completion_audio.py +32 -0
  297. autogen/oai/oai_models/chat_completion_message.py +86 -0
  298. autogen/oai/oai_models/chat_completion_message_tool_call.py +37 -0
  299. autogen/oai/oai_models/chat_completion_token_logprob.py +63 -0
  300. autogen/oai/oai_models/completion_usage.py +60 -0
  301. autogen/oai/ollama.py +643 -0
  302. autogen/oai/openai_utils.py +881 -0
  303. autogen/oai/together.py +370 -0
  304. autogen/retrieve_utils.py +491 -0
  305. autogen/runtime_logging.py +160 -0
  306. autogen/token_count_utils.py +267 -0
  307. autogen/tools/__init__.py +20 -0
  308. autogen/tools/contrib/__init__.py +9 -0
  309. autogen/tools/contrib/time/__init__.py +7 -0
  310. autogen/tools/contrib/time/time.py +41 -0
  311. autogen/tools/dependency_injection.py +254 -0
  312. autogen/tools/experimental/__init__.py +43 -0
  313. autogen/tools/experimental/browser_use/__init__.py +7 -0
  314. autogen/tools/experimental/browser_use/browser_use.py +161 -0
  315. autogen/tools/experimental/crawl4ai/__init__.py +7 -0
  316. autogen/tools/experimental/crawl4ai/crawl4ai.py +153 -0
  317. autogen/tools/experimental/deep_research/__init__.py +7 -0
  318. autogen/tools/experimental/deep_research/deep_research.py +328 -0
  319. autogen/tools/experimental/duckduckgo/__init__.py +7 -0
  320. autogen/tools/experimental/duckduckgo/duckduckgo_search.py +109 -0
  321. autogen/tools/experimental/google/__init__.py +14 -0
  322. autogen/tools/experimental/google/authentication/__init__.py +11 -0
  323. autogen/tools/experimental/google/authentication/credentials_hosted_provider.py +43 -0
  324. autogen/tools/experimental/google/authentication/credentials_local_provider.py +91 -0
  325. autogen/tools/experimental/google/authentication/credentials_provider.py +35 -0
  326. autogen/tools/experimental/google/drive/__init__.py +9 -0
  327. autogen/tools/experimental/google/drive/drive_functions.py +124 -0
  328. autogen/tools/experimental/google/drive/toolkit.py +88 -0
  329. autogen/tools/experimental/google/model.py +17 -0
  330. autogen/tools/experimental/google/toolkit_protocol.py +19 -0
  331. autogen/tools/experimental/google_search/__init__.py +8 -0
  332. autogen/tools/experimental/google_search/google_search.py +93 -0
  333. autogen/tools/experimental/google_search/youtube_search.py +181 -0
  334. autogen/tools/experimental/messageplatform/__init__.py +17 -0
  335. autogen/tools/experimental/messageplatform/discord/__init__.py +7 -0
  336. autogen/tools/experimental/messageplatform/discord/discord.py +288 -0
  337. autogen/tools/experimental/messageplatform/slack/__init__.py +7 -0
  338. autogen/tools/experimental/messageplatform/slack/slack.py +391 -0
  339. autogen/tools/experimental/messageplatform/telegram/__init__.py +7 -0
  340. autogen/tools/experimental/messageplatform/telegram/telegram.py +275 -0
  341. autogen/tools/experimental/perplexity/__init__.py +7 -0
  342. autogen/tools/experimental/perplexity/perplexity_search.py +260 -0
  343. autogen/tools/experimental/tavily/__init__.py +7 -0
  344. autogen/tools/experimental/tavily/tavily_search.py +183 -0
  345. autogen/tools/experimental/web_search_preview/__init__.py +7 -0
  346. autogen/tools/experimental/web_search_preview/web_search_preview.py +114 -0
  347. autogen/tools/experimental/wikipedia/__init__.py +7 -0
  348. autogen/tools/experimental/wikipedia/wikipedia.py +287 -0
  349. autogen/tools/function_utils.py +411 -0
  350. autogen/tools/tool.py +187 -0
  351. autogen/tools/toolkit.py +86 -0
  352. autogen/types.py +29 -0
  353. autogen/version.py +7 -0
  354. ag2-0.9.1.dist-info/RECORD +0 -6
  355. ag2-0.9.1.dist-info/top_level.txt +0 -1
  356. {ag2-0.9.1.dist-info → ag2-0.9.1.post0.dist-info/licenses}/LICENSE +0 -0
  357. {ag2-0.9.1.dist-info → ag2-0.9.1.post0.dist-info/licenses}/NOTICE.md +0 -0
@@ -0,0 +1,1010 @@
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: dict[str, Any]
767
+ content: str
768
+ recipient: str
769
+
770
+ def __init__(
771
+ self,
772
+ *,
773
+ uuid: Optional[UUID] = None,
774
+ func_name: str,
775
+ call_id: Optional[str] = None,
776
+ arguments: dict[str, Any],
777
+ content: str,
778
+ recipient: Union["Agent", str],
779
+ ):
780
+ super().__init__(
781
+ uuid=uuid,
782
+ func_name=func_name,
783
+ call_id=call_id,
784
+ arguments=arguments,
785
+ content=content,
786
+ recipient=recipient.name if hasattr(recipient, "name") else recipient,
787
+ )
788
+
789
+ def print(self, f: Optional[Callable[..., Any]] = None) -> None:
790
+ f = f or print
791
+
792
+ f(
793
+ colored(
794
+ f"\n>>>>>>>> EXECUTED FUNCTION {self.func_name}...\nCall ID: {self.call_id}\nInput arguments: {self.arguments}\nOutput:\n{self.content}",
795
+ "magenta",
796
+ ),
797
+ flush=True,
798
+ )
799
+
800
+
801
+ @wrap_event
802
+ class SelectSpeakerEvent(BaseEvent):
803
+ agents: Optional[list[str]] = None
804
+
805
+ def __init__(self, *, uuid: Optional[UUID] = None, agents: Optional[list[Union["Agent", str]]] = None):
806
+ agents = [agent.name if hasattr(agent, "name") else agent for agent in agents] if agents else None
807
+ super().__init__(uuid=uuid, agents=agents)
808
+
809
+ def print(self, f: Optional[Callable[..., Any]] = None) -> None:
810
+ f = f or print
811
+
812
+ f("Please select the next speaker from the following list:")
813
+ agents = self.agents or []
814
+ for i, agent in enumerate(agents):
815
+ f(f"{i + 1}: {agent}")
816
+
817
+
818
+ @wrap_event
819
+ class SelectSpeakerTryCountExceededEvent(BaseEvent):
820
+ try_count: int
821
+ agents: Optional[list[str]] = None
822
+
823
+ def __init__(
824
+ self, *, uuid: Optional[UUID] = None, try_count: int, agents: Optional[list[Union["Agent", str]]] = None
825
+ ):
826
+ agents = [agent.name if hasattr(agent, "name") else agent for agent in agents] if agents else None
827
+ super().__init__(uuid=uuid, try_count=try_count, agents=agents)
828
+
829
+ def print(self, f: Optional[Callable[..., Any]] = None) -> None:
830
+ f = f or print
831
+
832
+ f(f"You have tried {self.try_count} times. The next speaker will be selected automatically.")
833
+
834
+
835
+ @wrap_event
836
+ class SelectSpeakerInvalidInputEvent(BaseEvent):
837
+ agents: Optional[list[str]] = None
838
+
839
+ def __init__(self, *, uuid: Optional[UUID] = None, agents: Optional[list[Union["Agent", str]]] = None):
840
+ agents = [agent.name if hasattr(agent, "name") else agent for agent in agents] if agents else None
841
+ super().__init__(uuid=uuid, agents=agents)
842
+
843
+ def print(self, f: Optional[Callable[..., Any]] = None) -> None:
844
+ f = f or print
845
+
846
+ f(f"Invalid input. Please enter a number between 1 and {len(self.agents or [])}.")
847
+
848
+
849
+ @wrap_event
850
+ class ClearConversableAgentHistoryEvent(BaseEvent):
851
+ agent: str
852
+ recipient: str
853
+ no_events_preserved: int
854
+
855
+ def __init__(
856
+ self, *, uuid: Optional[UUID] = None, agent: Union["Agent", str], no_events_preserved: Optional[int] = None
857
+ ):
858
+ super().__init__(
859
+ uuid=uuid,
860
+ agent=agent.name if hasattr(agent, "name") else agent,
861
+ recipient=agent.name if hasattr(agent, "name") else agent,
862
+ no_events_preserved=no_events_preserved,
863
+ )
864
+
865
+ @model_serializer
866
+ def serialize_model(self) -> dict[str, Any]:
867
+ return {
868
+ "uuid": self.uuid,
869
+ "agent": self.agent,
870
+ "no_events_preserved": self.no_events_preserved,
871
+ }
872
+
873
+ def print(self, f: Optional[Callable[..., Any]] = None) -> None:
874
+ f = f or print
875
+
876
+ for _ in range(self.no_events_preserved):
877
+ f(f"Preserving one more event for {self.agent} to not divide history between tool call and tool response.")
878
+
879
+
880
+ @wrap_event
881
+ class ClearConversableAgentHistoryWarningEvent(BaseEvent):
882
+ recipient: str
883
+
884
+ def __init__(self, *, uuid: Optional[UUID] = None, recipient: Union["Agent", str]):
885
+ super().__init__(
886
+ uuid=uuid,
887
+ recipient=recipient.name if hasattr(recipient, "name") else recipient,
888
+ )
889
+
890
+ def print(self, f: Optional[Callable[..., Any]] = None) -> None:
891
+ f = f or print
892
+
893
+ f(
894
+ colored(
895
+ "WARNING: `nr_preserved_events` is ignored when clearing chat history with a specific agent.",
896
+ "yellow",
897
+ ),
898
+ flush=True,
899
+ )
900
+
901
+
902
+ @wrap_event
903
+ class GenerateCodeExecutionReplyEvent(BaseEvent):
904
+ code_blocks: list[str]
905
+ sender: str
906
+ recipient: str
907
+
908
+ def __init__(
909
+ self,
910
+ *,
911
+ uuid: Optional[UUID] = None,
912
+ code_blocks: list[Union["CodeBlock", str]],
913
+ sender: Optional[Union["Agent", str]] = None,
914
+ recipient: Union["Agent", str],
915
+ ):
916
+ code_blocks = [
917
+ code_block.language if hasattr(code_block, "language") else code_block for code_block in code_blocks
918
+ ]
919
+ sender = sender or "No sender"
920
+
921
+ super().__init__(
922
+ uuid=uuid,
923
+ code_blocks=code_blocks,
924
+ sender=sender.name if hasattr(sender, "name") else sender,
925
+ recipient=recipient.name if hasattr(recipient, "name") else recipient,
926
+ )
927
+
928
+ def print(self, f: Optional[Callable[..., Any]] = None) -> None:
929
+ f = f or print
930
+
931
+ num_code_blocks = len(self.code_blocks)
932
+ if num_code_blocks == 1:
933
+ f(
934
+ colored(
935
+ f"\n>>>>>>>> EXECUTING CODE BLOCK (inferred language is {self.code_blocks[0]})...",
936
+ "red",
937
+ ),
938
+ flush=True,
939
+ )
940
+ else:
941
+ f(
942
+ colored(
943
+ f"\n>>>>>>>> EXECUTING {num_code_blocks} CODE BLOCKS (inferred languages are [{', '.join([x for x in self.code_blocks])}])...",
944
+ "red",
945
+ ),
946
+ flush=True,
947
+ )
948
+
949
+
950
+ @wrap_event
951
+ class ConversableAgentUsageSummaryNoCostIncurredEvent(BaseEvent):
952
+ recipient: str
953
+
954
+ def __init__(self, *, uuid: Optional[UUID] = None, recipient: Union["Agent", str]):
955
+ super().__init__(uuid=uuid, recipient=recipient.name if hasattr(recipient, "name") else recipient)
956
+
957
+ def print(self, f: Optional[Callable[..., Any]] = None) -> None:
958
+ f = f or print
959
+
960
+ f(f"No cost incurred from agent '{self.recipient}'.")
961
+
962
+
963
+ @wrap_event
964
+ class ConversableAgentUsageSummaryEvent(BaseEvent):
965
+ recipient: str
966
+
967
+ def __init__(self, *, uuid: Optional[UUID] = None, recipient: Union["Agent", str]):
968
+ super().__init__(uuid=uuid, recipient=recipient.name if hasattr(recipient, "name") else recipient)
969
+
970
+ def print(self, f: Optional[Callable[..., Any]] = None) -> None:
971
+ f = f or print
972
+
973
+ f(f"Agent '{self.recipient}':")
974
+
975
+
976
+ @wrap_event
977
+ class InputRequestEvent(BaseEvent):
978
+ prompt: str
979
+ password: bool = False
980
+ respond: Optional[Callable[[str], None]] = None
981
+
982
+ type: str = "input_request"
983
+
984
+
985
+ @wrap_event
986
+ class AsyncInputRequestEvent(BaseEvent):
987
+ prompt: str
988
+ password: bool = False
989
+
990
+ async def a_respond(self, response: "InputResponseEvent") -> None:
991
+ pass
992
+
993
+
994
+ @wrap_event
995
+ class InputResponseEvent(BaseEvent):
996
+ value: str
997
+
998
+
999
+ @wrap_event
1000
+ class ErrorEvent(BaseEvent):
1001
+ error: Any
1002
+
1003
+
1004
+ @wrap_event
1005
+ class RunCompletionEvent(BaseEvent):
1006
+ summary: str
1007
+ history: list[LLMMessageType]
1008
+ cost: dict[str, Any]
1009
+ last_speaker: Optional[str]
1010
+ context_variables: Optional[ContextVariables] = None