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

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

Potentially problematic release.


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

Files changed (357) hide show
  1. {ag2-0.9.1a1.dist-info → ag2-0.9.1.post0.dist-info}/METADATA +264 -73
  2. ag2-0.9.1.post0.dist-info/RECORD +392 -0
  3. {ag2-0.9.1a1.dist-info → ag2-0.9.1.post0.dist-info}/WHEEL +1 -2
  4. autogen/__init__.py +89 -0
  5. autogen/_website/__init__.py +3 -0
  6. autogen/_website/generate_api_references.py +427 -0
  7. autogen/_website/generate_mkdocs.py +1174 -0
  8. autogen/_website/notebook_processor.py +476 -0
  9. autogen/_website/process_notebooks.py +656 -0
  10. autogen/_website/utils.py +412 -0
  11. autogen/agentchat/__init__.py +44 -0
  12. autogen/agentchat/agent.py +182 -0
  13. autogen/agentchat/assistant_agent.py +85 -0
  14. autogen/agentchat/chat.py +309 -0
  15. autogen/agentchat/contrib/__init__.py +5 -0
  16. autogen/agentchat/contrib/agent_eval/README.md +7 -0
  17. autogen/agentchat/contrib/agent_eval/agent_eval.py +108 -0
  18. autogen/agentchat/contrib/agent_eval/criterion.py +43 -0
  19. autogen/agentchat/contrib/agent_eval/critic_agent.py +44 -0
  20. autogen/agentchat/contrib/agent_eval/quantifier_agent.py +39 -0
  21. autogen/agentchat/contrib/agent_eval/subcritic_agent.py +45 -0
  22. autogen/agentchat/contrib/agent_eval/task.py +42 -0
  23. autogen/agentchat/contrib/agent_optimizer.py +429 -0
  24. autogen/agentchat/contrib/capabilities/__init__.py +5 -0
  25. autogen/agentchat/contrib/capabilities/agent_capability.py +20 -0
  26. autogen/agentchat/contrib/capabilities/generate_images.py +301 -0
  27. autogen/agentchat/contrib/capabilities/teachability.py +393 -0
  28. autogen/agentchat/contrib/capabilities/text_compressors.py +66 -0
  29. autogen/agentchat/contrib/capabilities/tools_capability.py +22 -0
  30. autogen/agentchat/contrib/capabilities/transform_messages.py +93 -0
  31. autogen/agentchat/contrib/capabilities/transforms.py +566 -0
  32. autogen/agentchat/contrib/capabilities/transforms_util.py +122 -0
  33. autogen/agentchat/contrib/capabilities/vision_capability.py +214 -0
  34. autogen/agentchat/contrib/captainagent/__init__.py +9 -0
  35. autogen/agentchat/contrib/captainagent/agent_builder.py +790 -0
  36. autogen/agentchat/contrib/captainagent/captainagent.py +512 -0
  37. autogen/agentchat/contrib/captainagent/tool_retriever.py +335 -0
  38. autogen/agentchat/contrib/captainagent/tools/README.md +44 -0
  39. autogen/agentchat/contrib/captainagent/tools/__init__.py +5 -0
  40. autogen/agentchat/contrib/captainagent/tools/data_analysis/calculate_correlation.py +40 -0
  41. autogen/agentchat/contrib/captainagent/tools/data_analysis/calculate_skewness_and_kurtosis.py +28 -0
  42. autogen/agentchat/contrib/captainagent/tools/data_analysis/detect_outlier_iqr.py +28 -0
  43. autogen/agentchat/contrib/captainagent/tools/data_analysis/detect_outlier_zscore.py +28 -0
  44. autogen/agentchat/contrib/captainagent/tools/data_analysis/explore_csv.py +21 -0
  45. autogen/agentchat/contrib/captainagent/tools/data_analysis/shapiro_wilk_test.py +30 -0
  46. autogen/agentchat/contrib/captainagent/tools/information_retrieval/arxiv_download.py +27 -0
  47. autogen/agentchat/contrib/captainagent/tools/information_retrieval/arxiv_search.py +53 -0
  48. autogen/agentchat/contrib/captainagent/tools/information_retrieval/extract_pdf_image.py +53 -0
  49. autogen/agentchat/contrib/captainagent/tools/information_retrieval/extract_pdf_text.py +38 -0
  50. autogen/agentchat/contrib/captainagent/tools/information_retrieval/get_wikipedia_text.py +21 -0
  51. autogen/agentchat/contrib/captainagent/tools/information_retrieval/get_youtube_caption.py +34 -0
  52. autogen/agentchat/contrib/captainagent/tools/information_retrieval/image_qa.py +60 -0
  53. autogen/agentchat/contrib/captainagent/tools/information_retrieval/optical_character_recognition.py +61 -0
  54. autogen/agentchat/contrib/captainagent/tools/information_retrieval/perform_web_search.py +47 -0
  55. autogen/agentchat/contrib/captainagent/tools/information_retrieval/scrape_wikipedia_tables.py +33 -0
  56. autogen/agentchat/contrib/captainagent/tools/information_retrieval/transcribe_audio_file.py +21 -0
  57. autogen/agentchat/contrib/captainagent/tools/information_retrieval/youtube_download.py +35 -0
  58. autogen/agentchat/contrib/captainagent/tools/math/calculate_circle_area_from_diameter.py +21 -0
  59. autogen/agentchat/contrib/captainagent/tools/math/calculate_day_of_the_week.py +18 -0
  60. autogen/agentchat/contrib/captainagent/tools/math/calculate_fraction_sum.py +28 -0
  61. autogen/agentchat/contrib/captainagent/tools/math/calculate_matrix_power.py +31 -0
  62. autogen/agentchat/contrib/captainagent/tools/math/calculate_reflected_point.py +16 -0
  63. autogen/agentchat/contrib/captainagent/tools/math/complex_numbers_product.py +25 -0
  64. autogen/agentchat/contrib/captainagent/tools/math/compute_currency_conversion.py +23 -0
  65. autogen/agentchat/contrib/captainagent/tools/math/count_distinct_permutations.py +27 -0
  66. autogen/agentchat/contrib/captainagent/tools/math/evaluate_expression.py +28 -0
  67. autogen/agentchat/contrib/captainagent/tools/math/find_continuity_point.py +34 -0
  68. autogen/agentchat/contrib/captainagent/tools/math/fraction_to_mixed_numbers.py +39 -0
  69. autogen/agentchat/contrib/captainagent/tools/math/modular_inverse_sum.py +23 -0
  70. autogen/agentchat/contrib/captainagent/tools/math/simplify_mixed_numbers.py +36 -0
  71. autogen/agentchat/contrib/captainagent/tools/math/sum_of_digit_factorials.py +15 -0
  72. autogen/agentchat/contrib/captainagent/tools/math/sum_of_primes_below.py +15 -0
  73. autogen/agentchat/contrib/captainagent/tools/requirements.txt +10 -0
  74. autogen/agentchat/contrib/captainagent/tools/tool_description.tsv +34 -0
  75. autogen/agentchat/contrib/gpt_assistant_agent.py +526 -0
  76. autogen/agentchat/contrib/graph_rag/__init__.py +9 -0
  77. autogen/agentchat/contrib/graph_rag/document.py +29 -0
  78. autogen/agentchat/contrib/graph_rag/falkor_graph_query_engine.py +170 -0
  79. autogen/agentchat/contrib/graph_rag/falkor_graph_rag_capability.py +103 -0
  80. autogen/agentchat/contrib/graph_rag/graph_query_engine.py +53 -0
  81. autogen/agentchat/contrib/graph_rag/graph_rag_capability.py +63 -0
  82. autogen/agentchat/contrib/graph_rag/neo4j_graph_query_engine.py +268 -0
  83. autogen/agentchat/contrib/graph_rag/neo4j_graph_rag_capability.py +83 -0
  84. autogen/agentchat/contrib/graph_rag/neo4j_native_graph_query_engine.py +210 -0
  85. autogen/agentchat/contrib/graph_rag/neo4j_native_graph_rag_capability.py +93 -0
  86. autogen/agentchat/contrib/img_utils.py +397 -0
  87. autogen/agentchat/contrib/llamaindex_conversable_agent.py +117 -0
  88. autogen/agentchat/contrib/llava_agent.py +187 -0
  89. autogen/agentchat/contrib/math_user_proxy_agent.py +464 -0
  90. autogen/agentchat/contrib/multimodal_conversable_agent.py +125 -0
  91. autogen/agentchat/contrib/qdrant_retrieve_user_proxy_agent.py +324 -0
  92. autogen/agentchat/contrib/rag/__init__.py +10 -0
  93. autogen/agentchat/contrib/rag/chromadb_query_engine.py +272 -0
  94. autogen/agentchat/contrib/rag/llamaindex_query_engine.py +198 -0
  95. autogen/agentchat/contrib/rag/mongodb_query_engine.py +329 -0
  96. autogen/agentchat/contrib/rag/query_engine.py +74 -0
  97. autogen/agentchat/contrib/retrieve_assistant_agent.py +56 -0
  98. autogen/agentchat/contrib/retrieve_user_proxy_agent.py +703 -0
  99. autogen/agentchat/contrib/society_of_mind_agent.py +199 -0
  100. autogen/agentchat/contrib/swarm_agent.py +1425 -0
  101. autogen/agentchat/contrib/text_analyzer_agent.py +79 -0
  102. autogen/agentchat/contrib/vectordb/__init__.py +5 -0
  103. autogen/agentchat/contrib/vectordb/base.py +232 -0
  104. autogen/agentchat/contrib/vectordb/chromadb.py +315 -0
  105. autogen/agentchat/contrib/vectordb/couchbase.py +407 -0
  106. autogen/agentchat/contrib/vectordb/mongodb.py +550 -0
  107. autogen/agentchat/contrib/vectordb/pgvectordb.py +928 -0
  108. autogen/agentchat/contrib/vectordb/qdrant.py +320 -0
  109. autogen/agentchat/contrib/vectordb/utils.py +126 -0
  110. autogen/agentchat/contrib/web_surfer.py +303 -0
  111. autogen/agentchat/conversable_agent.py +4020 -0
  112. autogen/agentchat/group/__init__.py +64 -0
  113. autogen/agentchat/group/available_condition.py +91 -0
  114. autogen/agentchat/group/context_condition.py +77 -0
  115. autogen/agentchat/group/context_expression.py +238 -0
  116. autogen/agentchat/group/context_str.py +41 -0
  117. autogen/agentchat/group/context_variables.py +192 -0
  118. autogen/agentchat/group/group_tool_executor.py +202 -0
  119. autogen/agentchat/group/group_utils.py +591 -0
  120. autogen/agentchat/group/handoffs.py +244 -0
  121. autogen/agentchat/group/llm_condition.py +93 -0
  122. autogen/agentchat/group/multi_agent_chat.py +237 -0
  123. autogen/agentchat/group/on_condition.py +58 -0
  124. autogen/agentchat/group/on_context_condition.py +54 -0
  125. autogen/agentchat/group/patterns/__init__.py +18 -0
  126. autogen/agentchat/group/patterns/auto.py +159 -0
  127. autogen/agentchat/group/patterns/manual.py +176 -0
  128. autogen/agentchat/group/patterns/pattern.py +288 -0
  129. autogen/agentchat/group/patterns/random.py +106 -0
  130. autogen/agentchat/group/patterns/round_robin.py +117 -0
  131. autogen/agentchat/group/reply_result.py +26 -0
  132. autogen/agentchat/group/speaker_selection_result.py +41 -0
  133. autogen/agentchat/group/targets/__init__.py +4 -0
  134. autogen/agentchat/group/targets/group_chat_target.py +132 -0
  135. autogen/agentchat/group/targets/group_manager_target.py +151 -0
  136. autogen/agentchat/group/targets/transition_target.py +413 -0
  137. autogen/agentchat/group/targets/transition_utils.py +6 -0
  138. autogen/agentchat/groupchat.py +1694 -0
  139. autogen/agentchat/realtime/__init__.py +3 -0
  140. autogen/agentchat/realtime/experimental/__init__.py +20 -0
  141. autogen/agentchat/realtime/experimental/audio_adapters/__init__.py +8 -0
  142. autogen/agentchat/realtime/experimental/audio_adapters/twilio_audio_adapter.py +148 -0
  143. autogen/agentchat/realtime/experimental/audio_adapters/websocket_audio_adapter.py +139 -0
  144. autogen/agentchat/realtime/experimental/audio_observer.py +42 -0
  145. autogen/agentchat/realtime/experimental/clients/__init__.py +15 -0
  146. autogen/agentchat/realtime/experimental/clients/gemini/__init__.py +7 -0
  147. autogen/agentchat/realtime/experimental/clients/gemini/client.py +274 -0
  148. autogen/agentchat/realtime/experimental/clients/oai/__init__.py +8 -0
  149. autogen/agentchat/realtime/experimental/clients/oai/base_client.py +220 -0
  150. autogen/agentchat/realtime/experimental/clients/oai/rtc_client.py +243 -0
  151. autogen/agentchat/realtime/experimental/clients/oai/utils.py +48 -0
  152. autogen/agentchat/realtime/experimental/clients/realtime_client.py +190 -0
  153. autogen/agentchat/realtime/experimental/function_observer.py +85 -0
  154. autogen/agentchat/realtime/experimental/realtime_agent.py +158 -0
  155. autogen/agentchat/realtime/experimental/realtime_events.py +42 -0
  156. autogen/agentchat/realtime/experimental/realtime_observer.py +100 -0
  157. autogen/agentchat/realtime/experimental/realtime_swarm.py +475 -0
  158. autogen/agentchat/realtime/experimental/websockets.py +21 -0
  159. autogen/agentchat/realtime_agent/__init__.py +21 -0
  160. autogen/agentchat/user_proxy_agent.py +111 -0
  161. autogen/agentchat/utils.py +206 -0
  162. autogen/agents/__init__.py +3 -0
  163. autogen/agents/contrib/__init__.py +10 -0
  164. autogen/agents/contrib/time/__init__.py +8 -0
  165. autogen/agents/contrib/time/time_reply_agent.py +73 -0
  166. autogen/agents/contrib/time/time_tool_agent.py +51 -0
  167. autogen/agents/experimental/__init__.py +27 -0
  168. autogen/agents/experimental/deep_research/__init__.py +7 -0
  169. autogen/agents/experimental/deep_research/deep_research.py +52 -0
  170. autogen/agents/experimental/discord/__init__.py +7 -0
  171. autogen/agents/experimental/discord/discord.py +66 -0
  172. autogen/agents/experimental/document_agent/__init__.py +19 -0
  173. autogen/agents/experimental/document_agent/chroma_query_engine.py +316 -0
  174. autogen/agents/experimental/document_agent/docling_doc_ingest_agent.py +118 -0
  175. autogen/agents/experimental/document_agent/document_agent.py +461 -0
  176. autogen/agents/experimental/document_agent/document_conditions.py +50 -0
  177. autogen/agents/experimental/document_agent/document_utils.py +380 -0
  178. autogen/agents/experimental/document_agent/inmemory_query_engine.py +220 -0
  179. autogen/agents/experimental/document_agent/parser_utils.py +130 -0
  180. autogen/agents/experimental/document_agent/url_utils.py +426 -0
  181. autogen/agents/experimental/reasoning/__init__.py +7 -0
  182. autogen/agents/experimental/reasoning/reasoning_agent.py +1178 -0
  183. autogen/agents/experimental/slack/__init__.py +7 -0
  184. autogen/agents/experimental/slack/slack.py +73 -0
  185. autogen/agents/experimental/telegram/__init__.py +7 -0
  186. autogen/agents/experimental/telegram/telegram.py +77 -0
  187. autogen/agents/experimental/websurfer/__init__.py +7 -0
  188. autogen/agents/experimental/websurfer/websurfer.py +62 -0
  189. autogen/agents/experimental/wikipedia/__init__.py +7 -0
  190. autogen/agents/experimental/wikipedia/wikipedia.py +90 -0
  191. autogen/browser_utils.py +309 -0
  192. autogen/cache/__init__.py +10 -0
  193. autogen/cache/abstract_cache_base.py +75 -0
  194. autogen/cache/cache.py +203 -0
  195. autogen/cache/cache_factory.py +88 -0
  196. autogen/cache/cosmos_db_cache.py +144 -0
  197. autogen/cache/disk_cache.py +102 -0
  198. autogen/cache/in_memory_cache.py +58 -0
  199. autogen/cache/redis_cache.py +123 -0
  200. autogen/code_utils.py +596 -0
  201. autogen/coding/__init__.py +22 -0
  202. autogen/coding/base.py +119 -0
  203. autogen/coding/docker_commandline_code_executor.py +268 -0
  204. autogen/coding/factory.py +47 -0
  205. autogen/coding/func_with_reqs.py +202 -0
  206. autogen/coding/jupyter/__init__.py +23 -0
  207. autogen/coding/jupyter/base.py +36 -0
  208. autogen/coding/jupyter/docker_jupyter_server.py +167 -0
  209. autogen/coding/jupyter/embedded_ipython_code_executor.py +182 -0
  210. autogen/coding/jupyter/import_utils.py +82 -0
  211. autogen/coding/jupyter/jupyter_client.py +231 -0
  212. autogen/coding/jupyter/jupyter_code_executor.py +160 -0
  213. autogen/coding/jupyter/local_jupyter_server.py +172 -0
  214. autogen/coding/local_commandline_code_executor.py +405 -0
  215. autogen/coding/markdown_code_extractor.py +45 -0
  216. autogen/coding/utils.py +56 -0
  217. autogen/doc_utils.py +34 -0
  218. autogen/events/__init__.py +7 -0
  219. autogen/events/agent_events.py +1010 -0
  220. autogen/events/base_event.py +99 -0
  221. autogen/events/client_events.py +167 -0
  222. autogen/events/helpers.py +36 -0
  223. autogen/events/print_event.py +46 -0
  224. autogen/exception_utils.py +73 -0
  225. autogen/extensions/__init__.py +5 -0
  226. autogen/fast_depends/__init__.py +16 -0
  227. autogen/fast_depends/_compat.py +80 -0
  228. autogen/fast_depends/core/__init__.py +14 -0
  229. autogen/fast_depends/core/build.py +225 -0
  230. autogen/fast_depends/core/model.py +576 -0
  231. autogen/fast_depends/dependencies/__init__.py +15 -0
  232. autogen/fast_depends/dependencies/model.py +29 -0
  233. autogen/fast_depends/dependencies/provider.py +39 -0
  234. autogen/fast_depends/library/__init__.py +10 -0
  235. autogen/fast_depends/library/model.py +46 -0
  236. autogen/fast_depends/py.typed +6 -0
  237. autogen/fast_depends/schema.py +66 -0
  238. autogen/fast_depends/use.py +280 -0
  239. autogen/fast_depends/utils.py +187 -0
  240. autogen/formatting_utils.py +83 -0
  241. autogen/function_utils.py +13 -0
  242. autogen/graph_utils.py +178 -0
  243. autogen/import_utils.py +526 -0
  244. autogen/interop/__init__.py +22 -0
  245. autogen/interop/crewai/__init__.py +7 -0
  246. autogen/interop/crewai/crewai.py +88 -0
  247. autogen/interop/interoperability.py +71 -0
  248. autogen/interop/interoperable.py +46 -0
  249. autogen/interop/langchain/__init__.py +8 -0
  250. autogen/interop/langchain/langchain_chat_model_factory.py +155 -0
  251. autogen/interop/langchain/langchain_tool.py +82 -0
  252. autogen/interop/litellm/__init__.py +7 -0
  253. autogen/interop/litellm/litellm_config_factory.py +113 -0
  254. autogen/interop/pydantic_ai/__init__.py +7 -0
  255. autogen/interop/pydantic_ai/pydantic_ai.py +168 -0
  256. autogen/interop/registry.py +69 -0
  257. autogen/io/__init__.py +15 -0
  258. autogen/io/base.py +151 -0
  259. autogen/io/console.py +56 -0
  260. autogen/io/processors/__init__.py +12 -0
  261. autogen/io/processors/base.py +21 -0
  262. autogen/io/processors/console_event_processor.py +56 -0
  263. autogen/io/run_response.py +293 -0
  264. autogen/io/thread_io_stream.py +63 -0
  265. autogen/io/websockets.py +213 -0
  266. autogen/json_utils.py +43 -0
  267. autogen/llm_config.py +379 -0
  268. autogen/logger/__init__.py +11 -0
  269. autogen/logger/base_logger.py +128 -0
  270. autogen/logger/file_logger.py +261 -0
  271. autogen/logger/logger_factory.py +42 -0
  272. autogen/logger/logger_utils.py +57 -0
  273. autogen/logger/sqlite_logger.py +523 -0
  274. autogen/math_utils.py +339 -0
  275. autogen/mcp/__init__.py +7 -0
  276. autogen/mcp/mcp_client.py +208 -0
  277. autogen/messages/__init__.py +7 -0
  278. autogen/messages/agent_messages.py +948 -0
  279. autogen/messages/base_message.py +107 -0
  280. autogen/messages/client_messages.py +171 -0
  281. autogen/messages/print_message.py +49 -0
  282. autogen/oai/__init__.py +53 -0
  283. autogen/oai/anthropic.py +714 -0
  284. autogen/oai/bedrock.py +628 -0
  285. autogen/oai/cerebras.py +299 -0
  286. autogen/oai/client.py +1435 -0
  287. autogen/oai/client_utils.py +169 -0
  288. autogen/oai/cohere.py +479 -0
  289. autogen/oai/gemini.py +990 -0
  290. autogen/oai/gemini_types.py +129 -0
  291. autogen/oai/groq.py +305 -0
  292. autogen/oai/mistral.py +303 -0
  293. autogen/oai/oai_models/__init__.py +11 -0
  294. autogen/oai/oai_models/_models.py +16 -0
  295. autogen/oai/oai_models/chat_completion.py +87 -0
  296. autogen/oai/oai_models/chat_completion_audio.py +32 -0
  297. autogen/oai/oai_models/chat_completion_message.py +86 -0
  298. autogen/oai/oai_models/chat_completion_message_tool_call.py +37 -0
  299. autogen/oai/oai_models/chat_completion_token_logprob.py +63 -0
  300. autogen/oai/oai_models/completion_usage.py +60 -0
  301. autogen/oai/ollama.py +643 -0
  302. autogen/oai/openai_utils.py +881 -0
  303. autogen/oai/together.py +370 -0
  304. autogen/retrieve_utils.py +491 -0
  305. autogen/runtime_logging.py +160 -0
  306. autogen/token_count_utils.py +267 -0
  307. autogen/tools/__init__.py +20 -0
  308. autogen/tools/contrib/__init__.py +9 -0
  309. autogen/tools/contrib/time/__init__.py +7 -0
  310. autogen/tools/contrib/time/time.py +41 -0
  311. autogen/tools/dependency_injection.py +254 -0
  312. autogen/tools/experimental/__init__.py +43 -0
  313. autogen/tools/experimental/browser_use/__init__.py +7 -0
  314. autogen/tools/experimental/browser_use/browser_use.py +161 -0
  315. autogen/tools/experimental/crawl4ai/__init__.py +7 -0
  316. autogen/tools/experimental/crawl4ai/crawl4ai.py +153 -0
  317. autogen/tools/experimental/deep_research/__init__.py +7 -0
  318. autogen/tools/experimental/deep_research/deep_research.py +328 -0
  319. autogen/tools/experimental/duckduckgo/__init__.py +7 -0
  320. autogen/tools/experimental/duckduckgo/duckduckgo_search.py +109 -0
  321. autogen/tools/experimental/google/__init__.py +14 -0
  322. autogen/tools/experimental/google/authentication/__init__.py +11 -0
  323. autogen/tools/experimental/google/authentication/credentials_hosted_provider.py +43 -0
  324. autogen/tools/experimental/google/authentication/credentials_local_provider.py +91 -0
  325. autogen/tools/experimental/google/authentication/credentials_provider.py +35 -0
  326. autogen/tools/experimental/google/drive/__init__.py +9 -0
  327. autogen/tools/experimental/google/drive/drive_functions.py +124 -0
  328. autogen/tools/experimental/google/drive/toolkit.py +88 -0
  329. autogen/tools/experimental/google/model.py +17 -0
  330. autogen/tools/experimental/google/toolkit_protocol.py +19 -0
  331. autogen/tools/experimental/google_search/__init__.py +8 -0
  332. autogen/tools/experimental/google_search/google_search.py +93 -0
  333. autogen/tools/experimental/google_search/youtube_search.py +181 -0
  334. autogen/tools/experimental/messageplatform/__init__.py +17 -0
  335. autogen/tools/experimental/messageplatform/discord/__init__.py +7 -0
  336. autogen/tools/experimental/messageplatform/discord/discord.py +288 -0
  337. autogen/tools/experimental/messageplatform/slack/__init__.py +7 -0
  338. autogen/tools/experimental/messageplatform/slack/slack.py +391 -0
  339. autogen/tools/experimental/messageplatform/telegram/__init__.py +7 -0
  340. autogen/tools/experimental/messageplatform/telegram/telegram.py +275 -0
  341. autogen/tools/experimental/perplexity/__init__.py +7 -0
  342. autogen/tools/experimental/perplexity/perplexity_search.py +260 -0
  343. autogen/tools/experimental/tavily/__init__.py +7 -0
  344. autogen/tools/experimental/tavily/tavily_search.py +183 -0
  345. autogen/tools/experimental/web_search_preview/__init__.py +7 -0
  346. autogen/tools/experimental/web_search_preview/web_search_preview.py +114 -0
  347. autogen/tools/experimental/wikipedia/__init__.py +7 -0
  348. autogen/tools/experimental/wikipedia/wikipedia.py +287 -0
  349. autogen/tools/function_utils.py +411 -0
  350. autogen/tools/tool.py +187 -0
  351. autogen/tools/toolkit.py +86 -0
  352. autogen/types.py +29 -0
  353. autogen/version.py +7 -0
  354. ag2-0.9.1a1.dist-info/RECORD +0 -6
  355. ag2-0.9.1a1.dist-info/top_level.txt +0 -1
  356. {ag2-0.9.1a1.dist-info → ag2-0.9.1.post0.dist-info/licenses}/LICENSE +0 -0
  357. {ag2-0.9.1a1.dist-info → ag2-0.9.1.post0.dist-info/licenses}/NOTICE.md +0 -0
@@ -0,0 +1,181 @@
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
+
6
+ import logging
7
+ from typing import Annotated, Any, Dict, List, Optional
8
+
9
+ from ....doc_utils import export_module
10
+ from ....import_utils import optional_import_block, require_optional_import
11
+ from ... import Depends, Tool
12
+ from ...dependency_injection import on
13
+
14
+ with optional_import_block():
15
+ import googleapiclient.errors
16
+ from googleapiclient.discovery import build
17
+
18
+
19
+ @require_optional_import(
20
+ ["googleapiclient"],
21
+ "google-search",
22
+ )
23
+ def _execute_search_query(query: str, youtube_api_key: str, max_results: int) -> Any:
24
+ """Execute a YouTube search query using the YouTube Data API.
25
+
26
+ Args:
27
+ query: The search query string.
28
+ youtube_api_key: The API key for the YouTube Data API.
29
+ max_results: The maximum number of results to return.
30
+
31
+ Returns:
32
+ The search response from the YouTube Data API.
33
+ """
34
+ youtube = build("youtube", "v3", developerKey=youtube_api_key)
35
+
36
+ try:
37
+ search_response = (
38
+ youtube.search().list(q=query, part="id,snippet", maxResults=max_results, type="video").execute()
39
+ )
40
+
41
+ return search_response
42
+ except googleapiclient.errors.HttpError as e:
43
+ logging.error(f"An HTTP error occurred: {e}")
44
+ raise
45
+
46
+
47
+ @require_optional_import(
48
+ ["googleapiclient"],
49
+ "google-search",
50
+ )
51
+ def _get_video_details(video_ids: List[str], youtube_api_key: str) -> Any:
52
+ """Get detailed information about specific YouTube videos.
53
+
54
+ Args:
55
+ video_ids: List of YouTube video IDs.
56
+ youtube_api_key: The API key for the YouTube Data API.
57
+
58
+ Returns:
59
+ The video details response from the YouTube Data API.
60
+ """
61
+ if not video_ids:
62
+ return {"items": []}
63
+
64
+ youtube = build("youtube", "v3", developerKey=youtube_api_key)
65
+
66
+ try:
67
+ videos_response = (
68
+ youtube.videos().list(id=",".join(video_ids), part="snippet,contentDetails,statistics").execute()
69
+ )
70
+
71
+ return videos_response
72
+ except googleapiclient.errors.HttpError as e:
73
+ logging.error(f"An HTTP error occurred: {e}")
74
+ raise
75
+
76
+
77
+ def _youtube_search(
78
+ query: str,
79
+ youtube_api_key: str,
80
+ max_results: int,
81
+ include_video_details: bool = True,
82
+ ) -> List[Dict[str, Any]]:
83
+ """Search YouTube videos based on a query.
84
+
85
+ Args:
86
+ query: The search query string.
87
+ youtube_api_key: The API key for the YouTube Data API.
88
+ max_results: The maximum number of results to return.
89
+ include_video_details: Whether to include detailed video information.
90
+
91
+ Returns:
92
+ A list of dictionaries containing information about the videos.
93
+ """
94
+ search_response = _execute_search_query(query=query, youtube_api_key=youtube_api_key, max_results=max_results)
95
+
96
+ results = []
97
+ video_ids = []
98
+
99
+ # Extract basic info from search results
100
+ for item in search_response.get("items", []):
101
+ if item["id"]["kind"] == "youtube#video":
102
+ video_ids.append(item["id"]["videoId"])
103
+ video_info = {
104
+ "title": item["snippet"]["title"],
105
+ "description": item["snippet"]["description"],
106
+ "publishedAt": item["snippet"]["publishedAt"],
107
+ "channelTitle": item["snippet"]["channelTitle"],
108
+ "videoId": item["id"]["videoId"],
109
+ "url": f"https://www.youtube.com/watch?v={item['id']['videoId']}",
110
+ }
111
+ results.append(video_info)
112
+
113
+ # If detailed info requested, get it
114
+ if include_video_details and video_ids:
115
+ video_details = _get_video_details(video_ids, youtube_api_key)
116
+
117
+ # Create a mapping of videoId to details
118
+ details_map = {item["id"]: item for item in video_details.get("items", [])}
119
+
120
+ # Update results with additional details
121
+ for result in results:
122
+ video_id = result["videoId"]
123
+ if video_id in details_map:
124
+ details = details_map[video_id]
125
+ result.update({
126
+ "viewCount": details["statistics"].get("viewCount"),
127
+ "likeCount": details["statistics"].get("likeCount"),
128
+ "commentCount": details["statistics"].get("commentCount"),
129
+ "duration": details["contentDetails"].get("duration"),
130
+ "definition": details["contentDetails"].get("definition"),
131
+ })
132
+
133
+ return results
134
+
135
+
136
+ @export_module("autogen.tools.experimental")
137
+ class YoutubeSearchTool(Tool):
138
+ """YoutubeSearchTool is a tool that uses the YouTube Data API to search for videos."""
139
+
140
+ def __init__(
141
+ self,
142
+ *,
143
+ youtube_api_key: Optional[str] = None,
144
+ ):
145
+ """Initialize a YouTube search tool.
146
+
147
+ Args:
148
+ youtube_api_key: The API key for the YouTube Data API.
149
+ """
150
+ self.youtube_api_key = youtube_api_key
151
+
152
+ if youtube_api_key is None:
153
+ raise ValueError("youtube_api_key must be provided")
154
+
155
+ def youtube_search(
156
+ query: Annotated[str, "The search query for YouTube videos."],
157
+ youtube_api_key: Annotated[str, Depends(on(youtube_api_key))],
158
+ max_results: Annotated[int, "The maximum number of results to return."] = 5,
159
+ include_video_details: Annotated[bool, "Whether to include detailed video information."] = True,
160
+ ) -> List[Dict[str, Any]]:
161
+ """Search for YouTube videos based on a query.
162
+
163
+ Args:
164
+ query: The search query string.
165
+ youtube_api_key: The API key for the YouTube Data API.
166
+ max_results: The maximum number of results to return.
167
+ include_video_details: Whether to include detailed video information.
168
+
169
+ Returns:
170
+ A list of dictionaries containing information about the videos.
171
+ """
172
+ if youtube_api_key is None:
173
+ raise ValueError("YouTube API key is required")
174
+
175
+ return _youtube_search(query, youtube_api_key, max_results, include_video_details)
176
+
177
+ super().__init__(
178
+ name="youtube_search",
179
+ description="Search for YouTube videos based on a query, optionally including detailed information.",
180
+ func_or_tool=youtube_search,
181
+ )
@@ -0,0 +1,17 @@
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 .discord import DiscordRetrieveTool, DiscordSendTool
6
+ from .slack import SlackRetrieveRepliesTool, SlackRetrieveTool, SlackSendTool
7
+ from .telegram import TelegramRetrieveTool, TelegramSendTool
8
+
9
+ __all__ = [
10
+ "DiscordRetrieveTool",
11
+ "DiscordSendTool",
12
+ "SlackRetrieveRepliesTool",
13
+ "SlackRetrieveTool",
14
+ "SlackSendTool",
15
+ "TelegramRetrieveTool",
16
+ "TelegramSendTool",
17
+ ]
@@ -0,0 +1,7 @@
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 .discord import DiscordRetrieveTool, DiscordSendTool
6
+
7
+ __all__ = ["DiscordRetrieveTool", "DiscordSendTool"]
@@ -0,0 +1,288 @@
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
+ import asyncio
6
+ from datetime import datetime, timezone
7
+ from typing import Annotated, Any, Union
8
+
9
+ from .....doc_utils import export_module
10
+ from .....import_utils import optional_import_block, require_optional_import
11
+ from .... import Tool
12
+ from ....dependency_injection import Depends, on
13
+
14
+ __all__ = ["DiscordRetrieveTool", "DiscordSendTool"]
15
+
16
+ with optional_import_block():
17
+ from discord import Client, Intents, utils
18
+
19
+ MAX_MESSAGE_LENGTH = 2000
20
+ MAX_BATCH_RETRIEVE_MESSAGES = 100 # Discord's max per request
21
+
22
+
23
+ @require_optional_import(["discord"], "commsagent-discord")
24
+ @export_module("autogen.tools.experimental")
25
+ class DiscordSendTool(Tool):
26
+ """Sends a message to a Discord channel."""
27
+
28
+ def __init__(self, *, bot_token: str, channel_name: str, guild_name: str) -> None:
29
+ """
30
+ Initialize the DiscordSendTool.
31
+
32
+ Args:
33
+ bot_token: The bot token to use for sending messages.
34
+ channel_name: The name of the channel to send messages to.
35
+ guild_name: The name of the guild for the channel.
36
+ """
37
+
38
+ # Function that sends the message, uses dependency injection for bot token / channel / guild
39
+ async def discord_send_message(
40
+ message: Annotated[str, "Message to send to the channel."],
41
+ bot_token: Annotated[str, Depends(on(bot_token))],
42
+ guild_name: Annotated[str, Depends(on(guild_name))],
43
+ channel_name: Annotated[str, Depends(on(channel_name))],
44
+ ) -> Any:
45
+ """
46
+ Sends a message to a Discord channel.
47
+
48
+ Args:
49
+ message: The message to send to the channel.
50
+ bot_token: The bot token to use for Discord. (uses dependency injection)
51
+ guild_name: The name of the server. (uses dependency injection)
52
+ channel_name: The name of the channel. (uses dependency injection)
53
+ """
54
+ intents = Intents.default()
55
+ intents.message_content = True
56
+ intents.guilds = True
57
+ intents.guild_messages = True
58
+
59
+ client = Client(intents=intents)
60
+ result_future: asyncio.Future[str] = asyncio.Future() # Stores the result of the send
61
+
62
+ # When the client is ready, we'll send the message
63
+ @client.event # type: ignore[misc]
64
+ async def on_ready() -> None:
65
+ try:
66
+ # Server
67
+ guild = utils.get(client.guilds, name=guild_name)
68
+ if guild:
69
+ # Channel
70
+ channel = utils.get(guild.text_channels, name=channel_name)
71
+ if channel:
72
+ # Send the message
73
+ if len(message) > MAX_MESSAGE_LENGTH:
74
+ chunks = [
75
+ message[i : i + (MAX_MESSAGE_LENGTH - 1)]
76
+ for i in range(0, len(message), (MAX_MESSAGE_LENGTH - 1))
77
+ ]
78
+ for i, chunk in enumerate(chunks):
79
+ sent = await channel.send(chunk)
80
+
81
+ # Store ID for the first chunk
82
+ if i == 0:
83
+ sent_message_id = str(sent.id)
84
+
85
+ result_future.set_result(
86
+ f"Message sent successfully ({len(chunks)} chunks, first ID: {sent_message_id}):\n{message}"
87
+ )
88
+ else:
89
+ sent = await channel.send(message)
90
+ result_future.set_result(f"Message sent successfully (ID: {sent.id}):\n{message}")
91
+ else:
92
+ result_future.set_result(f"Message send failed, could not find channel: {channel_name}")
93
+ else:
94
+ result_future.set_result(f"Message send failed, could not find guild: {guild_name}")
95
+
96
+ except Exception as e:
97
+ result_future.set_exception(e)
98
+ finally:
99
+ try:
100
+ await client.close()
101
+ except Exception as e:
102
+ raise Exception(f"Unable to close Discord client: {e}")
103
+
104
+ # Start the client and when it's ready it'll send the message in on_ready
105
+ try:
106
+ await client.start(bot_token)
107
+
108
+ # Capture the result of the send
109
+ return await result_future
110
+ except Exception as e:
111
+ raise Exception(f"Failed to start Discord client: {e}")
112
+
113
+ super().__init__(
114
+ name="discord_send",
115
+ description="Sends a message to a Discord channel.",
116
+ func_or_tool=discord_send_message,
117
+ )
118
+
119
+
120
+ @require_optional_import(["discord"], "commsagent-discord")
121
+ @export_module("autogen.tools.experimental")
122
+ class DiscordRetrieveTool(Tool):
123
+ """Retrieves messages from a Discord channel."""
124
+
125
+ def __init__(self, *, bot_token: str, channel_name: str, guild_name: str) -> None:
126
+ """
127
+ Initialize the DiscordRetrieveTool.
128
+
129
+ Args:
130
+ bot_token: The bot token to use for retrieving messages.
131
+ channel_name: The name of the channel to retrieve messages from.
132
+ guild_name: The name of the guild for the channel.
133
+ """
134
+
135
+ async def discord_retrieve_messages(
136
+ bot_token: Annotated[str, Depends(on(bot_token))],
137
+ guild_name: Annotated[str, Depends(on(guild_name))],
138
+ channel_name: Annotated[str, Depends(on(channel_name))],
139
+ messages_since: Annotated[
140
+ Union[str, None],
141
+ "Date to retrieve messages from (ISO format) OR Discord snowflake ID. If None, retrieves latest messages.",
142
+ ] = None,
143
+ maximum_messages: Annotated[
144
+ Union[int, None], "Maximum number of messages to retrieve. If None, retrieves all messages since date."
145
+ ] = None,
146
+ ) -> Any:
147
+ """
148
+ Retrieves messages from a Discord channel.
149
+
150
+ Args:
151
+ bot_token: The bot token to use for Discord. (uses dependency injection)
152
+ guild_name: The name of the server. (uses dependency injection)
153
+ channel_name: The name of the channel. (uses dependency injection)
154
+ messages_since: ISO format date string OR Discord snowflake ID, to retrieve messages from. If None, retrieves latest messages.
155
+ maximum_messages: Maximum number of messages to retrieve. If None, retrieves all messages since date.
156
+ """
157
+ intents = Intents.default()
158
+ intents.message_content = True
159
+ intents.guilds = True
160
+ intents.guild_messages = True
161
+
162
+ client = Client(intents=intents)
163
+ result_future: asyncio.Future[list[dict[str, Any]]] = asyncio.Future()
164
+
165
+ messages_since_date: Union[str, None] = None
166
+ if messages_since is not None:
167
+ if DiscordRetrieveTool._is_snowflake(messages_since):
168
+ messages_since_date = DiscordRetrieveTool._snowflake_to_iso(messages_since)
169
+ else:
170
+ messages_since_date = messages_since
171
+
172
+ @client.event # type: ignore[misc]
173
+ async def on_ready() -> None:
174
+ try:
175
+ messages = []
176
+
177
+ # Get guild and channel
178
+ guild = utils.get(client.guilds, name=guild_name)
179
+ if not guild:
180
+ result_future.set_result([{"error": f"Could not find guild: {guild_name}"}])
181
+ return
182
+
183
+ channel = utils.get(guild.text_channels, name=channel_name)
184
+ if not channel:
185
+ result_future.set_result([{"error": f"Could not find channel: {channel_name}"}])
186
+ return
187
+
188
+ # Setup retrieval parameters
189
+ last_message_id = None
190
+ messages_retrieved = 0
191
+
192
+ # Convert to ISO format
193
+ after_date = None
194
+ if messages_since_date:
195
+ try:
196
+ from datetime import datetime
197
+
198
+ after_date = datetime.fromisoformat(messages_since_date)
199
+ except ValueError:
200
+ result_future.set_result([
201
+ {"error": f"Invalid date format: {messages_since_date}. Use ISO format."}
202
+ ])
203
+ return
204
+
205
+ while True:
206
+ # Setup fetch options
207
+ fetch_options = {
208
+ "limit": MAX_BATCH_RETRIEVE_MESSAGES,
209
+ "before": last_message_id if last_message_id else None,
210
+ "after": after_date if after_date else None,
211
+ }
212
+
213
+ # Fetch batch of messages
214
+ message_batch = []
215
+ async for message in channel.history(**fetch_options): # type: ignore[arg-type]
216
+ message_batch.append(message)
217
+ messages_retrieved += 1
218
+
219
+ # Check if we've reached the maximum
220
+ if maximum_messages and messages_retrieved >= maximum_messages:
221
+ break
222
+
223
+ if not message_batch:
224
+ break
225
+
226
+ # Process messages
227
+ for msg in message_batch:
228
+ messages.append({
229
+ "id": str(msg.id),
230
+ "content": msg.content,
231
+ "author": str(msg.author),
232
+ "timestamp": msg.created_at.isoformat(),
233
+ })
234
+
235
+ # Update last message ID for pagination
236
+ last_message_id = message_batch[-1] # Use message object directly as 'before' parameter
237
+
238
+ # Break if we've reached the maximum
239
+ if maximum_messages and messages_retrieved >= maximum_messages:
240
+ break
241
+
242
+ result_future.set_result(messages)
243
+
244
+ except Exception as e:
245
+ result_future.set_exception(e)
246
+ finally:
247
+ try:
248
+ await client.close()
249
+ except Exception as e:
250
+ raise Exception(f"Unable to close Discord client: {e}")
251
+
252
+ try:
253
+ await client.start(bot_token)
254
+ return await result_future
255
+ except Exception as e:
256
+ raise Exception(f"Failed to start Discord client: {e}")
257
+
258
+ super().__init__(
259
+ name="discord_retrieve",
260
+ description="Retrieves messages from a Discord channel based datetime/message ID and/or number of latest messages.",
261
+ func_or_tool=discord_retrieve_messages,
262
+ )
263
+
264
+ @staticmethod
265
+ def _is_snowflake(value: str) -> bool:
266
+ """Check if a string is a valid Discord snowflake ID."""
267
+ # Must be numeric and 17-20 digits
268
+ if not value.isdigit():
269
+ return False
270
+
271
+ digit_count = len(value)
272
+ return 17 <= digit_count <= 20
273
+
274
+ @staticmethod
275
+ def _snowflake_to_iso(snowflake: str) -> str:
276
+ """Convert a Discord snowflake ID to ISO timestamp string."""
277
+ if not DiscordRetrieveTool._is_snowflake(snowflake):
278
+ raise ValueError(f"Invalid snowflake ID: {snowflake}")
279
+
280
+ # Discord epoch (2015-01-01)
281
+ discord_epoch = 1420070400000
282
+
283
+ # Convert ID to int and shift right 22 bits to get timestamp
284
+ timestamp_ms = (int(snowflake) >> 22) + discord_epoch
285
+
286
+ # Convert to datetime and format as ISO string
287
+ dt = datetime.fromtimestamp(timestamp_ms / 1000.0, tz=timezone.utc)
288
+ return dt.isoformat()
@@ -0,0 +1,7 @@
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 .slack import SlackRetrieveRepliesTool, SlackRetrieveTool, SlackSendTool
6
+
7
+ __all__ = ["SlackRetrieveRepliesTool", "SlackRetrieveTool", "SlackSendTool"]