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,267 @@
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
+ # Portions derived from https://github.com/microsoft/autogen are under the MIT License.
6
+ # SPDX-License-Identifier: MIT
7
+
8
+ import json
9
+ import logging
10
+ import re
11
+ from typing import Any, Union
12
+
13
+ import tiktoken
14
+
15
+ from .agentchat.contrib.img_utils import num_tokens_from_gpt_image
16
+ from .import_utils import optional_import_block
17
+
18
+ # if PIL is not imported, we will redefine num_tokens_from_gpt_image to return 0 tokens for images
19
+ # Otherwise, it would raise an ImportError
20
+ with optional_import_block() as result:
21
+ import PIL # noqa: F401
22
+
23
+ pil_imported = result.is_successful
24
+ if not pil_imported:
25
+
26
+ def num_tokens_from_gpt_image(*args, **kwargs):
27
+ return 0
28
+
29
+
30
+ logger = logging.getLogger(__name__)
31
+ logger.img_dependency_warned = False # member variable to track if the warning has been logged
32
+
33
+
34
+ def get_max_token_limit(model: str = "gpt-3.5-turbo-0613") -> int:
35
+ # Handle common azure model names/aliases
36
+ model = re.sub(r"^gpt\-?35", "gpt-3.5", model)
37
+ model = re.sub(r"^gpt4", "gpt-4", model)
38
+
39
+ max_token_limit = {
40
+ "gpt-3.5-turbo": 16385,
41
+ "gpt-3.5-turbo-0125": 16385,
42
+ "gpt-3.5-turbo-0301": 4096,
43
+ "gpt-3.5-turbo-0613": 4096,
44
+ "gpt-3.5-turbo-instruct": 4096,
45
+ "gpt-3.5-turbo-16k": 16385,
46
+ "gpt-3.5-turbo-16k-0613": 16385,
47
+ "gpt-3.5-turbo-1106": 16385,
48
+ "gpt-4": 8192,
49
+ "gpt-4-turbo": 128000,
50
+ "gpt-4-turbo-2024-04-09": 128000,
51
+ "gpt-4-32k": 32768,
52
+ "gpt-4-32k-0314": 32768, # deprecate in Sep
53
+ "gpt-4-0314": 8192, # deprecate in Sep
54
+ "gpt-4-0613": 8192,
55
+ "gpt-4-32k-0613": 32768,
56
+ "gpt-4-1106-preview": 128000,
57
+ "gpt-4-0125-preview": 128000,
58
+ "gpt-4-turbo-preview": 128000,
59
+ "gpt-4-vision-preview": 128000,
60
+ "gpt-4o": 128000,
61
+ "gpt-4o-2024-05-13": 128000,
62
+ "gpt-4o-2024-08-06": 128000,
63
+ "gpt-4o-2024-11-20": 128000,
64
+ "gpt-4o-mini": 128000,
65
+ "gpt-4o-mini-2024-07-18": 128000,
66
+ }
67
+ return max_token_limit[model]
68
+
69
+
70
+ def percentile_used(input, model="gpt-3.5-turbo-0613"):
71
+ return count_token(input) / get_max_token_limit(model)
72
+
73
+
74
+ def token_left(input: Union[str, list[str], dict[str, Any]], model="gpt-3.5-turbo-0613") -> int:
75
+ """Count number of tokens left for an OpenAI model.
76
+
77
+ Args:
78
+ input: (str, list, dict): Input to the model.
79
+ model: (str): Model name.
80
+
81
+ Returns:
82
+ int: Number of tokens left that the model can use for completion.
83
+ """
84
+ return get_max_token_limit(model) - count_token(input, model=model)
85
+
86
+
87
+ def count_token(input: Union[str, list[str], dict[str, Any]], model: str = "gpt-3.5-turbo-0613") -> int:
88
+ """Count number of tokens used by an OpenAI model.
89
+
90
+ Args:
91
+ input: (str, list, dict): Input to the model.
92
+ model: (str): Model name.
93
+
94
+ Returns:
95
+ int: Number of tokens from the input.
96
+ """
97
+ if isinstance(input, str):
98
+ return _num_token_from_text(input, model=model)
99
+ elif isinstance(input, (list, dict)):
100
+ return _num_token_from_messages(input, model=model)
101
+ else:
102
+ raise ValueError(f"input must be str, list or dict, but we got {type(input)}")
103
+
104
+
105
+ def _num_token_from_text(text: str, model: str = "gpt-3.5-turbo-0613"):
106
+ """Return the number of tokens used by a string."""
107
+ try:
108
+ encoding = tiktoken.encoding_for_model(model)
109
+ except KeyError:
110
+ logger.warning(f"Model {model} not found. Using cl100k_base encoding.")
111
+ encoding = tiktoken.get_encoding("cl100k_base")
112
+ return len(encoding.encode(text))
113
+
114
+
115
+ def _num_token_from_messages(messages: Union[list[str], dict[str, Any]], model="gpt-3.5-turbo-0613"):
116
+ """Return the number of tokens used by a list of messages.
117
+
118
+ retrieved from https://github.com/openai/openai-cookbook/blob/main/examples/How_to_count_tokens_with_tiktoken.ipynb/
119
+ """
120
+ if isinstance(messages, dict):
121
+ messages = [messages]
122
+
123
+ try:
124
+ encoding = tiktoken.encoding_for_model(model)
125
+ except KeyError:
126
+ logger.warning(f"Model {model} not found. Using cl100k_base encoding.")
127
+ encoding = tiktoken.get_encoding("cl100k_base")
128
+ if model in {
129
+ "gpt-3.5-turbo-0613",
130
+ "gpt-3.5-turbo-16k-0613",
131
+ "gpt-4-0314",
132
+ "gpt-4-32k-0314",
133
+ "gpt-4-0613",
134
+ "gpt-4-32k-0613",
135
+ "gpt-4-turbo-preview",
136
+ "gpt-4-vision-preview",
137
+ "gpt-4o",
138
+ "gpt-4o-2024-05-13",
139
+ "gpt-4o-2024-08-06",
140
+ "gpt-4o-2024-11-20",
141
+ "gpt-4o-mini",
142
+ "gpt-4o-mini-2024-07-18",
143
+ }:
144
+ tokens_per_message = 3
145
+ tokens_per_name = 1
146
+ elif model == "gpt-3.5-turbo-0301":
147
+ tokens_per_message = 4 # every message follows <|start|>{role/name}\n{content}<|end|>\n
148
+ tokens_per_name = -1 # if there's a name, the role is omitted
149
+ elif "gpt-3.5-turbo" in model:
150
+ logger.info("gpt-3.5-turbo may update over time. Returning num tokens assuming gpt-3.5-turbo-0613.")
151
+ return _num_token_from_messages(messages, model="gpt-3.5-turbo-0613")
152
+ elif "gpt-4" in model:
153
+ logger.info("gpt-4 may update over time. Returning num tokens assuming gpt-4-0613.")
154
+ return _num_token_from_messages(messages, model="gpt-4-0613")
155
+ elif "gemini" in model:
156
+ logger.info("Gemini is not supported in tiktoken. Returning num tokens assuming gpt-4-0613.")
157
+ return _num_token_from_messages(messages, model="gpt-4-0613")
158
+ elif "claude" in model:
159
+ logger.info("Claude is not supported in tiktoken. Returning num tokens assuming gpt-4-0613.")
160
+ return _num_token_from_messages(messages, model="gpt-4-0613")
161
+ elif "mistral-" in model or "mixtral-" in model:
162
+ logger.info("Mistral.AI models are not supported in tiktoken. Returning num tokens assuming gpt-4-0613.")
163
+ return _num_token_from_messages(messages, model="gpt-4-0613")
164
+ elif "deepseek" in model:
165
+ logger.info("Deepseek models are not supported in tiktoken. Returning num tokens assuming gpt-4-0613.")
166
+ return _num_token_from_messages(messages, model="gpt-4-0613")
167
+ else:
168
+ raise NotImplementedError(
169
+ f"""_num_token_from_messages() is not implemented for model {model}. See https://github.com/openai/openai-python/blob/main/chatml.md for information on how messages are converted to tokens."""
170
+ )
171
+ num_tokens = 0
172
+ for message in messages:
173
+ num_tokens += tokens_per_message
174
+ for key, value in message.items():
175
+ if value is None:
176
+ continue
177
+
178
+ # handle content if images are in GPT-4-vision
179
+ if key == "content" and isinstance(value, list):
180
+ for part in value:
181
+ if not isinstance(part, dict) or "type" not in part:
182
+ continue
183
+ if part["type"] == "text":
184
+ num_tokens += len(encoding.encode(part["text"]))
185
+ if "image_url" in part:
186
+ assert "url" in part["image_url"]
187
+ if not pil_imported and not logger.img_dependency_warned:
188
+ logger.warning(
189
+ "img_utils or PIL not imported. Skipping image token count."
190
+ "Please install autogen with [lmm] option.",
191
+ )
192
+ logger.img_dependency_warned = True
193
+ is_low_quality = "detail" in part["image_url"] and part["image_url"]["detail"] == "low"
194
+ try:
195
+ num_tokens += num_tokens_from_gpt_image(
196
+ image_data=part["image_url"]["url"], model=model, low_quality=is_low_quality
197
+ )
198
+ except ValueError as e:
199
+ logger.warning(f"Error in num_tokens_from_gpt_image: {e}")
200
+ continue
201
+
202
+ # function calls
203
+ if not isinstance(value, str):
204
+ try:
205
+ value = json.dumps(value)
206
+ except TypeError:
207
+ logger.warning(
208
+ f"Value {value} is not a string and cannot be converted to json. It is a type: {type(value)} Skipping."
209
+ )
210
+ continue
211
+
212
+ num_tokens += len(encoding.encode(value))
213
+ if key == "name":
214
+ num_tokens += tokens_per_name
215
+ num_tokens += 3 # every reply is primed with <|start|>assistant<|message|>
216
+ return num_tokens
217
+
218
+
219
+ def num_tokens_from_functions(functions, model="gpt-3.5-turbo-0613") -> int:
220
+ """Return the number of tokens used by a list of functions.
221
+
222
+ Args:
223
+ functions: (list): List of function descriptions that will be passed in model.
224
+ model: (str): Model name.
225
+
226
+ Returns:
227
+ int: Number of tokens from the function descriptions.
228
+ """
229
+ try:
230
+ encoding = tiktoken.encoding_for_model(model)
231
+ except KeyError:
232
+ logger.warning(f"Model {model} not found. Using cl100k_base encoding.")
233
+ encoding = tiktoken.get_encoding("cl100k_base")
234
+
235
+ num_tokens = 0
236
+ for function in functions:
237
+ function_tokens = len(encoding.encode(function["name"]))
238
+ function_tokens += len(encoding.encode(function["description"]))
239
+ function_tokens -= 2
240
+ if "parameters" in function:
241
+ parameters = function["parameters"]
242
+ if "properties" in parameters:
243
+ for properties_key in parameters["properties"]:
244
+ function_tokens += len(encoding.encode(properties_key))
245
+ v = parameters["properties"][properties_key]
246
+ for field in v:
247
+ if field == "type":
248
+ function_tokens += 2
249
+ function_tokens += len(encoding.encode(v["type"]))
250
+ elif field == "description":
251
+ function_tokens += 2
252
+ function_tokens += len(encoding.encode(v["description"]))
253
+ elif field == "enum":
254
+ function_tokens -= 3
255
+ for o in v["enum"]:
256
+ function_tokens += 3
257
+ function_tokens += len(encoding.encode(o))
258
+ else:
259
+ logger.warning(f"Not supported field {field}")
260
+ function_tokens += 11
261
+ if len(parameters["properties"]) == 0:
262
+ function_tokens -= 2
263
+
264
+ num_tokens += function_tokens
265
+
266
+ num_tokens += 12
267
+ return num_tokens
@@ -0,0 +1,20 @@
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 .dependency_injection import BaseContext, ChatContext, Depends
6
+ from .function_utils import get_function_schema, load_basemodels_if_needed, serialize_to_str
7
+ from .tool import Tool, tool
8
+ from .toolkit import Toolkit
9
+
10
+ __all__ = [
11
+ "BaseContext",
12
+ "ChatContext",
13
+ "Depends",
14
+ "Tool",
15
+ "Toolkit",
16
+ "get_function_schema",
17
+ "load_basemodels_if_needed",
18
+ "serialize_to_str",
19
+ "tool",
20
+ ]
@@ -0,0 +1,9 @@
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 .time import TimeTool
6
+
7
+ __all__ = [
8
+ "TimeTool",
9
+ ]
@@ -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 .time import TimeTool
6
+
7
+ __all__ = ["TimeTool"]
@@ -0,0 +1,41 @@
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 datetime import datetime
6
+ from typing import Annotated
7
+
8
+ from autogen.tools import Tool
9
+
10
+ from ....doc_utils import export_module
11
+
12
+ __all__ = ["TimeTool"]
13
+
14
+
15
+ @export_module("autogen.tools.contrib") # API Reference: autogen > tools > contrib > TimeAgent
16
+ class TimeTool(Tool):
17
+ """Outputs the current date and time of the computer."""
18
+
19
+ def __init__(
20
+ self,
21
+ *,
22
+ date_time_format: str = "%Y-%m-%d %H:%M:%S", # This is a parameter that is unique to this tool
23
+ ):
24
+ """Get the date and time of the computer.
25
+
26
+ Args:
27
+ date_time_format (str, optional): The format of the date and time. Defaults to "%Y-%m-%d %H:%M:%S".
28
+ """
29
+
30
+ self._date_time_format = date_time_format
31
+
32
+ async def get_date_and_time(
33
+ date_time_format: Annotated[str, "date/time Python format"] = self._date_time_format,
34
+ ) -> str:
35
+ return datetime.now().strftime(date_time_format)
36
+
37
+ super().__init__(
38
+ name="date_time",
39
+ description="Get the current computer's date and time.",
40
+ func_or_tool=get_date_and_time,
41
+ )
@@ -0,0 +1,254 @@
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 functools
6
+ import inspect
7
+ import sys
8
+ from abc import ABC
9
+ from functools import wraps
10
+ from typing import TYPE_CHECKING, Any, Callable, Iterable, Optional, TypeVar, Union, get_type_hints
11
+
12
+ from ..agentchat import Agent
13
+ from ..doc_utils import export_module
14
+ from ..fast_depends import Depends as FastDepends
15
+ from ..fast_depends import inject
16
+ from ..fast_depends.dependencies import model
17
+
18
+ if TYPE_CHECKING:
19
+ from ..agentchat.conversable_agent import ConversableAgent
20
+
21
+ __all__ = [
22
+ "BaseContext",
23
+ "ChatContext",
24
+ "Depends",
25
+ "Field",
26
+ "get_context_params",
27
+ "inject_params",
28
+ "on",
29
+ "remove_params",
30
+ ]
31
+
32
+
33
+ @export_module("autogen.tools")
34
+ class BaseContext(ABC):
35
+ """Base class for context classes.
36
+
37
+ This is the base class for defining various context types that may be used
38
+ throughout the application. It serves as a parent for specific context classes.
39
+ """
40
+
41
+ pass
42
+
43
+
44
+ @export_module("autogen.tools")
45
+ class ChatContext(BaseContext):
46
+ """ChatContext class that extends BaseContext.
47
+
48
+ This class is used to represent a chat context that holds a list of messages.
49
+ It inherits from `BaseContext` and adds the `messages` attribute.
50
+ """
51
+
52
+ def __init__(self, agent: "ConversableAgent") -> None:
53
+ """Initializes the ChatContext with an agent.
54
+
55
+ Args:
56
+ agent: The agent to use for retrieving chat messages.
57
+ """
58
+ self._agent = agent
59
+
60
+ @property
61
+ def chat_messages(self) -> dict[Agent, list[dict[Any, Any]]]:
62
+ """The messages in the chat.
63
+
64
+ Returns:
65
+ A dictionary of agents and their messages.
66
+ """
67
+ return self._agent.chat_messages
68
+
69
+ @property
70
+ def last_message(self) -> Optional[dict[str, Any]]:
71
+ """The last message in the chat.
72
+
73
+ Returns:
74
+ The last message in the chat.
75
+ """
76
+ return self._agent.last_message()
77
+
78
+
79
+ T = TypeVar("T")
80
+
81
+
82
+ def on(x: T) -> Callable[[], T]:
83
+ def inner(ag2_x: T = x) -> T:
84
+ return ag2_x
85
+
86
+ return inner
87
+
88
+
89
+ @export_module("autogen.tools")
90
+ def Depends(x: Any) -> Any: # noqa: N802
91
+ """Creates a dependency for injection based on the provided context or type.
92
+
93
+ Args:
94
+ x: The context or dependency to be injected.
95
+
96
+ Returns:
97
+ A FastDepends object that will resolve the dependency for injection.
98
+ """
99
+ if isinstance(x, BaseContext):
100
+ return FastDepends(lambda: x)
101
+
102
+ return FastDepends(x)
103
+
104
+
105
+ def get_context_params(func: Callable[..., Any], subclass: Union[type[BaseContext], type[ChatContext]]) -> list[str]:
106
+ """Gets the names of the context parameters in a function signature.
107
+
108
+ Args:
109
+ func: The function to inspect for context parameters.
110
+ subclass: The subclass to search for.
111
+
112
+ Returns:
113
+ A list of parameter names that are instances of the specified subclass.
114
+ """
115
+ sig = inspect.signature(func)
116
+ return [p.name for p in sig.parameters.values() if _is_context_param(p, subclass=subclass)]
117
+
118
+
119
+ def _is_context_param(
120
+ param: inspect.Parameter, subclass: Union[type[BaseContext], type[ChatContext]] = BaseContext
121
+ ) -> bool:
122
+ # param.annotation.__args__[0] is used to handle Annotated[MyContext, Depends(MyContext(b=2))]
123
+ param_annotation = param.annotation.__args__[0] if hasattr(param.annotation, "__args__") else param.annotation
124
+ try:
125
+ return isinstance(param_annotation, type) and issubclass(param_annotation, subclass)
126
+ except TypeError:
127
+ return False
128
+
129
+
130
+ def _is_depends_param(param: inspect.Parameter) -> bool:
131
+ return isinstance(param.default, model.Depends) or (
132
+ hasattr(param.annotation, "__metadata__")
133
+ and type(param.annotation.__metadata__) == tuple
134
+ and isinstance(param.annotation.__metadata__[0], model.Depends)
135
+ )
136
+
137
+
138
+ def remove_params(func: Callable[..., Any], sig: inspect.Signature, params: Iterable[str]) -> None:
139
+ new_signature = sig.replace(parameters=[p for p in sig.parameters.values() if p.name not in params])
140
+ func.__signature__ = new_signature # type: ignore[attr-defined]
141
+
142
+
143
+ def _remove_injected_params_from_signature(func: Callable[..., Any]) -> Callable[..., Any]:
144
+ # This is a workaround for Python 3.9+ where staticmethod.__func__ is accessible
145
+ if sys.version_info >= (3, 9) and isinstance(func, staticmethod) and hasattr(func, "__func__"):
146
+ func = _fix_staticmethod(func)
147
+
148
+ sig = inspect.signature(func)
149
+ params_to_remove = [p.name for p in sig.parameters.values() if _is_context_param(p) or _is_depends_param(p)]
150
+ remove_params(func, sig, params_to_remove)
151
+ return func
152
+
153
+
154
+ class Field:
155
+ """Represents a description field for use in type annotations.
156
+
157
+ This class is used to store a description for an annotated field, often used for
158
+ documenting or validating fields in a context or data model.
159
+ """
160
+
161
+ def __init__(self, description: str) -> None:
162
+ """Initializes the Field with a description.
163
+
164
+ Args:
165
+ description: The description text for the field.
166
+ """
167
+ self._description = description
168
+
169
+ @property
170
+ def description(self) -> str:
171
+ return self._description
172
+
173
+
174
+ def _string_metadata_to_description_field(func: Callable[..., Any]) -> Callable[..., Any]:
175
+ type_hints = get_type_hints(func, include_extras=True)
176
+
177
+ for _, annotation in type_hints.items():
178
+ # Check if the annotation itself has metadata (using __metadata__)
179
+ if hasattr(annotation, "__metadata__"):
180
+ metadata = annotation.__metadata__
181
+ if metadata and isinstance(metadata[0], str):
182
+ # Replace string metadata with Field
183
+ annotation.__metadata__ = (Field(description=metadata[0]),)
184
+ # For Python < 3.11, annotations like `Optional` are stored as `Union`, so metadata
185
+ # would be in the first element of __args__ (e.g., `__args__[0]` for `int` in `Optional[int]`)
186
+ elif hasattr(annotation, "__args__") and hasattr(annotation.__args__[0], "__metadata__"):
187
+ metadata = annotation.__args__[0].__metadata__
188
+ if metadata and isinstance(metadata[0], str):
189
+ # Replace string metadata with Field
190
+ annotation.__args__[0].__metadata__ = (Field(description=metadata[0]),)
191
+ return func
192
+
193
+
194
+ def _fix_staticmethod(f: Callable[..., Any]) -> Callable[..., Any]:
195
+ # This is a workaround for Python 3.9+ where staticmethod.__func__ is accessible
196
+ if sys.version_info >= (3, 9) and isinstance(f, staticmethod) and hasattr(f, "__func__"):
197
+
198
+ @wraps(f.__func__)
199
+ def wrapper(*args: Any, **kwargs: Any) -> Any:
200
+ return f.__func__(*args, **kwargs) # type: ignore[attr-defined]
201
+
202
+ wrapper.__name__ = f.__func__.__name__
203
+
204
+ f = wrapper
205
+ return f
206
+
207
+
208
+ def _set_return_annotation_to_any(f: Callable[..., Any]) -> Callable[..., Any]:
209
+ if inspect.iscoroutinefunction(f):
210
+
211
+ @functools.wraps(f)
212
+ async def _a_wrapped_func(*args: Any, **kwargs: Any) -> Any:
213
+ return await f(*args, **kwargs)
214
+
215
+ wrapped_func = _a_wrapped_func
216
+
217
+ else:
218
+
219
+ @functools.wraps(f)
220
+ def _wrapped_func(*args: Any, **kwargs: Any) -> Any:
221
+ return f(*args, **kwargs)
222
+
223
+ wrapped_func = _wrapped_func
224
+
225
+ sig = inspect.signature(f)
226
+
227
+ # Change the return annotation directly on the signature of the wrapper
228
+ wrapped_func.__signature__ = sig.replace(return_annotation=Any) # type: ignore[attr-defined]
229
+
230
+ return wrapped_func
231
+
232
+
233
+ def inject_params(f: Callable[..., Any]) -> Callable[..., Any]:
234
+ """Injects parameters into a function, removing injected dependencies from its signature.
235
+
236
+ This function is used to modify a function by injecting dependencies and removing
237
+ injected parameters from the function's signature.
238
+
239
+ Args:
240
+ f: The function to modify with dependency injection.
241
+
242
+ Returns:
243
+ The modified function with injected dependencies and updated signature.
244
+ """
245
+ # This is a workaround for Python 3.9+ where staticmethod.__func__ is accessible
246
+ if sys.version_info >= (3, 9) and isinstance(f, staticmethod) and hasattr(f, "__func__"):
247
+ f = _fix_staticmethod(f)
248
+
249
+ f = _string_metadata_to_description_field(f)
250
+ f = _set_return_annotation_to_any(f)
251
+ f = inject(f)
252
+ f = _remove_injected_params_from_signature(f)
253
+
254
+ return f
@@ -0,0 +1,43 @@
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 .browser_use import BrowserUseTool
6
+ from .crawl4ai import Crawl4AITool
7
+ from .deep_research import DeepResearchTool
8
+ from .duckduckgo import DuckDuckGoSearchTool
9
+ from .google_search import GoogleSearchTool, YoutubeSearchTool
10
+ from .messageplatform import (
11
+ DiscordRetrieveTool,
12
+ DiscordSendTool,
13
+ SlackRetrieveRepliesTool,
14
+ SlackRetrieveTool,
15
+ SlackSendTool,
16
+ TelegramRetrieveTool,
17
+ TelegramSendTool,
18
+ )
19
+ from .perplexity import PerplexitySearchTool
20
+ from .tavily import TavilySearchTool
21
+ from .web_search_preview import WebSearchPreviewTool
22
+ from .wikipedia import WikipediaPageLoadTool, WikipediaQueryRunTool
23
+
24
+ __all__ = [
25
+ "BrowserUseTool",
26
+ "Crawl4AITool",
27
+ "DeepResearchTool",
28
+ "DiscordRetrieveTool",
29
+ "DiscordSendTool",
30
+ "DuckDuckGoSearchTool",
31
+ "GoogleSearchTool",
32
+ "PerplexitySearchTool",
33
+ "SlackRetrieveRepliesTool",
34
+ "SlackRetrieveTool",
35
+ "SlackSendTool",
36
+ "TavilySearchTool",
37
+ "TelegramRetrieveTool",
38
+ "TelegramSendTool",
39
+ "WebSearchPreviewTool",
40
+ "WikipediaPageLoadTool",
41
+ "WikipediaQueryRunTool",
42
+ "YoutubeSearchTool",
43
+ ]
@@ -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 .browser_use import BrowserUseResult, BrowserUseTool, ExtractedContent
6
+
7
+ __all__ = ["BrowserUseResult", "BrowserUseTool", "ExtractedContent"]