ag2 0.10.2__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (423) hide show
  1. ag2-0.10.2.dist-info/METADATA +819 -0
  2. ag2-0.10.2.dist-info/RECORD +423 -0
  3. ag2-0.10.2.dist-info/WHEEL +4 -0
  4. ag2-0.10.2.dist-info/licenses/LICENSE +201 -0
  5. ag2-0.10.2.dist-info/licenses/NOTICE.md +19 -0
  6. autogen/__init__.py +88 -0
  7. autogen/_website/__init__.py +3 -0
  8. autogen/_website/generate_api_references.py +426 -0
  9. autogen/_website/generate_mkdocs.py +1216 -0
  10. autogen/_website/notebook_processor.py +475 -0
  11. autogen/_website/process_notebooks.py +656 -0
  12. autogen/_website/utils.py +413 -0
  13. autogen/a2a/__init__.py +36 -0
  14. autogen/a2a/agent_executor.py +86 -0
  15. autogen/a2a/client.py +357 -0
  16. autogen/a2a/errors.py +18 -0
  17. autogen/a2a/httpx_client_factory.py +79 -0
  18. autogen/a2a/server.py +221 -0
  19. autogen/a2a/utils.py +207 -0
  20. autogen/agentchat/__init__.py +47 -0
  21. autogen/agentchat/agent.py +180 -0
  22. autogen/agentchat/assistant_agent.py +86 -0
  23. autogen/agentchat/chat.py +325 -0
  24. autogen/agentchat/contrib/__init__.py +5 -0
  25. autogen/agentchat/contrib/agent_eval/README.md +7 -0
  26. autogen/agentchat/contrib/agent_eval/agent_eval.py +108 -0
  27. autogen/agentchat/contrib/agent_eval/criterion.py +43 -0
  28. autogen/agentchat/contrib/agent_eval/critic_agent.py +44 -0
  29. autogen/agentchat/contrib/agent_eval/quantifier_agent.py +39 -0
  30. autogen/agentchat/contrib/agent_eval/subcritic_agent.py +45 -0
  31. autogen/agentchat/contrib/agent_eval/task.py +42 -0
  32. autogen/agentchat/contrib/agent_optimizer.py +432 -0
  33. autogen/agentchat/contrib/capabilities/__init__.py +5 -0
  34. autogen/agentchat/contrib/capabilities/agent_capability.py +20 -0
  35. autogen/agentchat/contrib/capabilities/generate_images.py +301 -0
  36. autogen/agentchat/contrib/capabilities/teachability.py +393 -0
  37. autogen/agentchat/contrib/capabilities/text_compressors.py +66 -0
  38. autogen/agentchat/contrib/capabilities/tools_capability.py +22 -0
  39. autogen/agentchat/contrib/capabilities/transform_messages.py +93 -0
  40. autogen/agentchat/contrib/capabilities/transforms.py +578 -0
  41. autogen/agentchat/contrib/capabilities/transforms_util.py +122 -0
  42. autogen/agentchat/contrib/capabilities/vision_capability.py +215 -0
  43. autogen/agentchat/contrib/captainagent/__init__.py +9 -0
  44. autogen/agentchat/contrib/captainagent/agent_builder.py +790 -0
  45. autogen/agentchat/contrib/captainagent/captainagent.py +514 -0
  46. autogen/agentchat/contrib/captainagent/tool_retriever.py +334 -0
  47. autogen/agentchat/contrib/captainagent/tools/README.md +44 -0
  48. autogen/agentchat/contrib/captainagent/tools/__init__.py +5 -0
  49. autogen/agentchat/contrib/captainagent/tools/data_analysis/calculate_correlation.py +40 -0
  50. autogen/agentchat/contrib/captainagent/tools/data_analysis/calculate_skewness_and_kurtosis.py +28 -0
  51. autogen/agentchat/contrib/captainagent/tools/data_analysis/detect_outlier_iqr.py +28 -0
  52. autogen/agentchat/contrib/captainagent/tools/data_analysis/detect_outlier_zscore.py +28 -0
  53. autogen/agentchat/contrib/captainagent/tools/data_analysis/explore_csv.py +21 -0
  54. autogen/agentchat/contrib/captainagent/tools/data_analysis/shapiro_wilk_test.py +30 -0
  55. autogen/agentchat/contrib/captainagent/tools/information_retrieval/arxiv_download.py +27 -0
  56. autogen/agentchat/contrib/captainagent/tools/information_retrieval/arxiv_search.py +53 -0
  57. autogen/agentchat/contrib/captainagent/tools/information_retrieval/extract_pdf_image.py +53 -0
  58. autogen/agentchat/contrib/captainagent/tools/information_retrieval/extract_pdf_text.py +38 -0
  59. autogen/agentchat/contrib/captainagent/tools/information_retrieval/get_wikipedia_text.py +21 -0
  60. autogen/agentchat/contrib/captainagent/tools/information_retrieval/get_youtube_caption.py +34 -0
  61. autogen/agentchat/contrib/captainagent/tools/information_retrieval/image_qa.py +60 -0
  62. autogen/agentchat/contrib/captainagent/tools/information_retrieval/optical_character_recognition.py +61 -0
  63. autogen/agentchat/contrib/captainagent/tools/information_retrieval/perform_web_search.py +47 -0
  64. autogen/agentchat/contrib/captainagent/tools/information_retrieval/scrape_wikipedia_tables.py +33 -0
  65. autogen/agentchat/contrib/captainagent/tools/information_retrieval/transcribe_audio_file.py +21 -0
  66. autogen/agentchat/contrib/captainagent/tools/information_retrieval/youtube_download.py +35 -0
  67. autogen/agentchat/contrib/captainagent/tools/math/calculate_circle_area_from_diameter.py +21 -0
  68. autogen/agentchat/contrib/captainagent/tools/math/calculate_day_of_the_week.py +18 -0
  69. autogen/agentchat/contrib/captainagent/tools/math/calculate_fraction_sum.py +28 -0
  70. autogen/agentchat/contrib/captainagent/tools/math/calculate_matrix_power.py +31 -0
  71. autogen/agentchat/contrib/captainagent/tools/math/calculate_reflected_point.py +16 -0
  72. autogen/agentchat/contrib/captainagent/tools/math/complex_numbers_product.py +25 -0
  73. autogen/agentchat/contrib/captainagent/tools/math/compute_currency_conversion.py +23 -0
  74. autogen/agentchat/contrib/captainagent/tools/math/count_distinct_permutations.py +27 -0
  75. autogen/agentchat/contrib/captainagent/tools/math/evaluate_expression.py +28 -0
  76. autogen/agentchat/contrib/captainagent/tools/math/find_continuity_point.py +34 -0
  77. autogen/agentchat/contrib/captainagent/tools/math/fraction_to_mixed_numbers.py +39 -0
  78. autogen/agentchat/contrib/captainagent/tools/math/modular_inverse_sum.py +23 -0
  79. autogen/agentchat/contrib/captainagent/tools/math/simplify_mixed_numbers.py +36 -0
  80. autogen/agentchat/contrib/captainagent/tools/math/sum_of_digit_factorials.py +15 -0
  81. autogen/agentchat/contrib/captainagent/tools/math/sum_of_primes_below.py +15 -0
  82. autogen/agentchat/contrib/captainagent/tools/requirements.txt +10 -0
  83. autogen/agentchat/contrib/captainagent/tools/tool_description.tsv +34 -0
  84. autogen/agentchat/contrib/gpt_assistant_agent.py +526 -0
  85. autogen/agentchat/contrib/graph_rag/__init__.py +9 -0
  86. autogen/agentchat/contrib/graph_rag/document.py +29 -0
  87. autogen/agentchat/contrib/graph_rag/falkor_graph_query_engine.py +167 -0
  88. autogen/agentchat/contrib/graph_rag/falkor_graph_rag_capability.py +103 -0
  89. autogen/agentchat/contrib/graph_rag/graph_query_engine.py +53 -0
  90. autogen/agentchat/contrib/graph_rag/graph_rag_capability.py +63 -0
  91. autogen/agentchat/contrib/graph_rag/neo4j_graph_query_engine.py +263 -0
  92. autogen/agentchat/contrib/graph_rag/neo4j_graph_rag_capability.py +83 -0
  93. autogen/agentchat/contrib/graph_rag/neo4j_native_graph_query_engine.py +210 -0
  94. autogen/agentchat/contrib/graph_rag/neo4j_native_graph_rag_capability.py +93 -0
  95. autogen/agentchat/contrib/img_utils.py +397 -0
  96. autogen/agentchat/contrib/llamaindex_conversable_agent.py +117 -0
  97. autogen/agentchat/contrib/llava_agent.py +189 -0
  98. autogen/agentchat/contrib/math_user_proxy_agent.py +464 -0
  99. autogen/agentchat/contrib/multimodal_conversable_agent.py +125 -0
  100. autogen/agentchat/contrib/qdrant_retrieve_user_proxy_agent.py +325 -0
  101. autogen/agentchat/contrib/rag/__init__.py +10 -0
  102. autogen/agentchat/contrib/rag/chromadb_query_engine.py +268 -0
  103. autogen/agentchat/contrib/rag/llamaindex_query_engine.py +195 -0
  104. autogen/agentchat/contrib/rag/mongodb_query_engine.py +319 -0
  105. autogen/agentchat/contrib/rag/query_engine.py +76 -0
  106. autogen/agentchat/contrib/retrieve_assistant_agent.py +59 -0
  107. autogen/agentchat/contrib/retrieve_user_proxy_agent.py +704 -0
  108. autogen/agentchat/contrib/society_of_mind_agent.py +200 -0
  109. autogen/agentchat/contrib/swarm_agent.py +1404 -0
  110. autogen/agentchat/contrib/text_analyzer_agent.py +79 -0
  111. autogen/agentchat/contrib/vectordb/__init__.py +5 -0
  112. autogen/agentchat/contrib/vectordb/base.py +224 -0
  113. autogen/agentchat/contrib/vectordb/chromadb.py +316 -0
  114. autogen/agentchat/contrib/vectordb/couchbase.py +405 -0
  115. autogen/agentchat/contrib/vectordb/mongodb.py +551 -0
  116. autogen/agentchat/contrib/vectordb/pgvectordb.py +927 -0
  117. autogen/agentchat/contrib/vectordb/qdrant.py +320 -0
  118. autogen/agentchat/contrib/vectordb/utils.py +126 -0
  119. autogen/agentchat/contrib/web_surfer.py +304 -0
  120. autogen/agentchat/conversable_agent.py +4307 -0
  121. autogen/agentchat/group/__init__.py +67 -0
  122. autogen/agentchat/group/available_condition.py +91 -0
  123. autogen/agentchat/group/context_condition.py +77 -0
  124. autogen/agentchat/group/context_expression.py +238 -0
  125. autogen/agentchat/group/context_str.py +39 -0
  126. autogen/agentchat/group/context_variables.py +182 -0
  127. autogen/agentchat/group/events/transition_events.py +111 -0
  128. autogen/agentchat/group/group_tool_executor.py +324 -0
  129. autogen/agentchat/group/group_utils.py +659 -0
  130. autogen/agentchat/group/guardrails.py +179 -0
  131. autogen/agentchat/group/handoffs.py +303 -0
  132. autogen/agentchat/group/llm_condition.py +93 -0
  133. autogen/agentchat/group/multi_agent_chat.py +291 -0
  134. autogen/agentchat/group/on_condition.py +55 -0
  135. autogen/agentchat/group/on_context_condition.py +51 -0
  136. autogen/agentchat/group/patterns/__init__.py +18 -0
  137. autogen/agentchat/group/patterns/auto.py +160 -0
  138. autogen/agentchat/group/patterns/manual.py +177 -0
  139. autogen/agentchat/group/patterns/pattern.py +295 -0
  140. autogen/agentchat/group/patterns/random.py +106 -0
  141. autogen/agentchat/group/patterns/round_robin.py +117 -0
  142. autogen/agentchat/group/reply_result.py +24 -0
  143. autogen/agentchat/group/safeguards/__init__.py +21 -0
  144. autogen/agentchat/group/safeguards/api.py +241 -0
  145. autogen/agentchat/group/safeguards/enforcer.py +1158 -0
  146. autogen/agentchat/group/safeguards/events.py +140 -0
  147. autogen/agentchat/group/safeguards/validator.py +435 -0
  148. autogen/agentchat/group/speaker_selection_result.py +41 -0
  149. autogen/agentchat/group/targets/__init__.py +4 -0
  150. autogen/agentchat/group/targets/function_target.py +245 -0
  151. autogen/agentchat/group/targets/group_chat_target.py +133 -0
  152. autogen/agentchat/group/targets/group_manager_target.py +151 -0
  153. autogen/agentchat/group/targets/transition_target.py +424 -0
  154. autogen/agentchat/group/targets/transition_utils.py +6 -0
  155. autogen/agentchat/groupchat.py +1832 -0
  156. autogen/agentchat/realtime/__init__.py +3 -0
  157. autogen/agentchat/realtime/experimental/__init__.py +20 -0
  158. autogen/agentchat/realtime/experimental/audio_adapters/__init__.py +8 -0
  159. autogen/agentchat/realtime/experimental/audio_adapters/twilio_audio_adapter.py +148 -0
  160. autogen/agentchat/realtime/experimental/audio_adapters/websocket_audio_adapter.py +139 -0
  161. autogen/agentchat/realtime/experimental/audio_observer.py +42 -0
  162. autogen/agentchat/realtime/experimental/clients/__init__.py +15 -0
  163. autogen/agentchat/realtime/experimental/clients/gemini/__init__.py +7 -0
  164. autogen/agentchat/realtime/experimental/clients/gemini/client.py +274 -0
  165. autogen/agentchat/realtime/experimental/clients/oai/__init__.py +8 -0
  166. autogen/agentchat/realtime/experimental/clients/oai/base_client.py +220 -0
  167. autogen/agentchat/realtime/experimental/clients/oai/rtc_client.py +243 -0
  168. autogen/agentchat/realtime/experimental/clients/oai/utils.py +48 -0
  169. autogen/agentchat/realtime/experimental/clients/realtime_client.py +191 -0
  170. autogen/agentchat/realtime/experimental/function_observer.py +84 -0
  171. autogen/agentchat/realtime/experimental/realtime_agent.py +158 -0
  172. autogen/agentchat/realtime/experimental/realtime_events.py +42 -0
  173. autogen/agentchat/realtime/experimental/realtime_observer.py +100 -0
  174. autogen/agentchat/realtime/experimental/realtime_swarm.py +533 -0
  175. autogen/agentchat/realtime/experimental/websockets.py +21 -0
  176. autogen/agentchat/realtime_agent/__init__.py +21 -0
  177. autogen/agentchat/user_proxy_agent.py +114 -0
  178. autogen/agentchat/utils.py +206 -0
  179. autogen/agents/__init__.py +3 -0
  180. autogen/agents/contrib/__init__.py +10 -0
  181. autogen/agents/contrib/time/__init__.py +8 -0
  182. autogen/agents/contrib/time/time_reply_agent.py +74 -0
  183. autogen/agents/contrib/time/time_tool_agent.py +52 -0
  184. autogen/agents/experimental/__init__.py +27 -0
  185. autogen/agents/experimental/deep_research/__init__.py +7 -0
  186. autogen/agents/experimental/deep_research/deep_research.py +52 -0
  187. autogen/agents/experimental/discord/__init__.py +7 -0
  188. autogen/agents/experimental/discord/discord.py +66 -0
  189. autogen/agents/experimental/document_agent/__init__.py +19 -0
  190. autogen/agents/experimental/document_agent/chroma_query_engine.py +301 -0
  191. autogen/agents/experimental/document_agent/docling_doc_ingest_agent.py +113 -0
  192. autogen/agents/experimental/document_agent/document_agent.py +643 -0
  193. autogen/agents/experimental/document_agent/document_conditions.py +50 -0
  194. autogen/agents/experimental/document_agent/document_utils.py +376 -0
  195. autogen/agents/experimental/document_agent/inmemory_query_engine.py +214 -0
  196. autogen/agents/experimental/document_agent/parser_utils.py +134 -0
  197. autogen/agents/experimental/document_agent/url_utils.py +417 -0
  198. autogen/agents/experimental/reasoning/__init__.py +7 -0
  199. autogen/agents/experimental/reasoning/reasoning_agent.py +1178 -0
  200. autogen/agents/experimental/slack/__init__.py +7 -0
  201. autogen/agents/experimental/slack/slack.py +73 -0
  202. autogen/agents/experimental/telegram/__init__.py +7 -0
  203. autogen/agents/experimental/telegram/telegram.py +76 -0
  204. autogen/agents/experimental/websurfer/__init__.py +7 -0
  205. autogen/agents/experimental/websurfer/websurfer.py +70 -0
  206. autogen/agents/experimental/wikipedia/__init__.py +7 -0
  207. autogen/agents/experimental/wikipedia/wikipedia.py +88 -0
  208. autogen/browser_utils.py +309 -0
  209. autogen/cache/__init__.py +10 -0
  210. autogen/cache/abstract_cache_base.py +71 -0
  211. autogen/cache/cache.py +203 -0
  212. autogen/cache/cache_factory.py +88 -0
  213. autogen/cache/cosmos_db_cache.py +144 -0
  214. autogen/cache/disk_cache.py +97 -0
  215. autogen/cache/in_memory_cache.py +54 -0
  216. autogen/cache/redis_cache.py +119 -0
  217. autogen/code_utils.py +598 -0
  218. autogen/coding/__init__.py +30 -0
  219. autogen/coding/base.py +120 -0
  220. autogen/coding/docker_commandline_code_executor.py +283 -0
  221. autogen/coding/factory.py +56 -0
  222. autogen/coding/func_with_reqs.py +203 -0
  223. autogen/coding/jupyter/__init__.py +23 -0
  224. autogen/coding/jupyter/base.py +36 -0
  225. autogen/coding/jupyter/docker_jupyter_server.py +160 -0
  226. autogen/coding/jupyter/embedded_ipython_code_executor.py +182 -0
  227. autogen/coding/jupyter/import_utils.py +82 -0
  228. autogen/coding/jupyter/jupyter_client.py +224 -0
  229. autogen/coding/jupyter/jupyter_code_executor.py +154 -0
  230. autogen/coding/jupyter/local_jupyter_server.py +164 -0
  231. autogen/coding/local_commandline_code_executor.py +341 -0
  232. autogen/coding/markdown_code_extractor.py +44 -0
  233. autogen/coding/utils.py +55 -0
  234. autogen/coding/yepcode_code_executor.py +197 -0
  235. autogen/doc_utils.py +35 -0
  236. autogen/environments/__init__.py +10 -0
  237. autogen/environments/docker_python_environment.py +365 -0
  238. autogen/environments/python_environment.py +125 -0
  239. autogen/environments/system_python_environment.py +85 -0
  240. autogen/environments/venv_python_environment.py +220 -0
  241. autogen/environments/working_directory.py +74 -0
  242. autogen/events/__init__.py +7 -0
  243. autogen/events/agent_events.py +1016 -0
  244. autogen/events/base_event.py +100 -0
  245. autogen/events/client_events.py +168 -0
  246. autogen/events/helpers.py +44 -0
  247. autogen/events/print_event.py +45 -0
  248. autogen/exception_utils.py +73 -0
  249. autogen/extensions/__init__.py +5 -0
  250. autogen/fast_depends/__init__.py +16 -0
  251. autogen/fast_depends/_compat.py +75 -0
  252. autogen/fast_depends/core/__init__.py +14 -0
  253. autogen/fast_depends/core/build.py +206 -0
  254. autogen/fast_depends/core/model.py +527 -0
  255. autogen/fast_depends/dependencies/__init__.py +15 -0
  256. autogen/fast_depends/dependencies/model.py +30 -0
  257. autogen/fast_depends/dependencies/provider.py +40 -0
  258. autogen/fast_depends/library/__init__.py +10 -0
  259. autogen/fast_depends/library/model.py +46 -0
  260. autogen/fast_depends/py.typed +6 -0
  261. autogen/fast_depends/schema.py +66 -0
  262. autogen/fast_depends/use.py +272 -0
  263. autogen/fast_depends/utils.py +177 -0
  264. autogen/formatting_utils.py +83 -0
  265. autogen/function_utils.py +13 -0
  266. autogen/graph_utils.py +173 -0
  267. autogen/import_utils.py +539 -0
  268. autogen/interop/__init__.py +22 -0
  269. autogen/interop/crewai/__init__.py +7 -0
  270. autogen/interop/crewai/crewai.py +88 -0
  271. autogen/interop/interoperability.py +71 -0
  272. autogen/interop/interoperable.py +46 -0
  273. autogen/interop/langchain/__init__.py +8 -0
  274. autogen/interop/langchain/langchain_chat_model_factory.py +156 -0
  275. autogen/interop/langchain/langchain_tool.py +78 -0
  276. autogen/interop/litellm/__init__.py +7 -0
  277. autogen/interop/litellm/litellm_config_factory.py +178 -0
  278. autogen/interop/pydantic_ai/__init__.py +7 -0
  279. autogen/interop/pydantic_ai/pydantic_ai.py +172 -0
  280. autogen/interop/registry.py +70 -0
  281. autogen/io/__init__.py +15 -0
  282. autogen/io/base.py +151 -0
  283. autogen/io/console.py +56 -0
  284. autogen/io/processors/__init__.py +12 -0
  285. autogen/io/processors/base.py +21 -0
  286. autogen/io/processors/console_event_processor.py +61 -0
  287. autogen/io/run_response.py +294 -0
  288. autogen/io/thread_io_stream.py +63 -0
  289. autogen/io/websockets.py +214 -0
  290. autogen/json_utils.py +42 -0
  291. autogen/llm_clients/MIGRATION_TO_V2.md +782 -0
  292. autogen/llm_clients/__init__.py +77 -0
  293. autogen/llm_clients/client_v2.py +122 -0
  294. autogen/llm_clients/models/__init__.py +55 -0
  295. autogen/llm_clients/models/content_blocks.py +389 -0
  296. autogen/llm_clients/models/unified_message.py +145 -0
  297. autogen/llm_clients/models/unified_response.py +83 -0
  298. autogen/llm_clients/openai_completions_client.py +444 -0
  299. autogen/llm_config/__init__.py +11 -0
  300. autogen/llm_config/client.py +59 -0
  301. autogen/llm_config/config.py +461 -0
  302. autogen/llm_config/entry.py +169 -0
  303. autogen/llm_config/types.py +37 -0
  304. autogen/llm_config/utils.py +223 -0
  305. autogen/logger/__init__.py +11 -0
  306. autogen/logger/base_logger.py +129 -0
  307. autogen/logger/file_logger.py +262 -0
  308. autogen/logger/logger_factory.py +42 -0
  309. autogen/logger/logger_utils.py +57 -0
  310. autogen/logger/sqlite_logger.py +524 -0
  311. autogen/math_utils.py +338 -0
  312. autogen/mcp/__init__.py +7 -0
  313. autogen/mcp/__main__.py +78 -0
  314. autogen/mcp/helpers.py +45 -0
  315. autogen/mcp/mcp_client.py +349 -0
  316. autogen/mcp/mcp_proxy/__init__.py +19 -0
  317. autogen/mcp/mcp_proxy/fastapi_code_generator_helpers.py +62 -0
  318. autogen/mcp/mcp_proxy/mcp_proxy.py +577 -0
  319. autogen/mcp/mcp_proxy/operation_grouping.py +166 -0
  320. autogen/mcp/mcp_proxy/operation_renaming.py +110 -0
  321. autogen/mcp/mcp_proxy/patch_fastapi_code_generator.py +98 -0
  322. autogen/mcp/mcp_proxy/security.py +399 -0
  323. autogen/mcp/mcp_proxy/security_schema_visitor.py +37 -0
  324. autogen/messages/__init__.py +7 -0
  325. autogen/messages/agent_messages.py +946 -0
  326. autogen/messages/base_message.py +108 -0
  327. autogen/messages/client_messages.py +172 -0
  328. autogen/messages/print_message.py +48 -0
  329. autogen/oai/__init__.py +61 -0
  330. autogen/oai/anthropic.py +1516 -0
  331. autogen/oai/bedrock.py +800 -0
  332. autogen/oai/cerebras.py +302 -0
  333. autogen/oai/client.py +1658 -0
  334. autogen/oai/client_utils.py +196 -0
  335. autogen/oai/cohere.py +494 -0
  336. autogen/oai/gemini.py +1045 -0
  337. autogen/oai/gemini_types.py +156 -0
  338. autogen/oai/groq.py +319 -0
  339. autogen/oai/mistral.py +311 -0
  340. autogen/oai/oai_models/__init__.py +23 -0
  341. autogen/oai/oai_models/_models.py +16 -0
  342. autogen/oai/oai_models/chat_completion.py +86 -0
  343. autogen/oai/oai_models/chat_completion_audio.py +32 -0
  344. autogen/oai/oai_models/chat_completion_message.py +97 -0
  345. autogen/oai/oai_models/chat_completion_message_tool_call.py +60 -0
  346. autogen/oai/oai_models/chat_completion_token_logprob.py +62 -0
  347. autogen/oai/oai_models/completion_usage.py +59 -0
  348. autogen/oai/ollama.py +657 -0
  349. autogen/oai/openai_responses.py +451 -0
  350. autogen/oai/openai_utils.py +897 -0
  351. autogen/oai/together.py +387 -0
  352. autogen/remote/__init__.py +18 -0
  353. autogen/remote/agent.py +199 -0
  354. autogen/remote/agent_service.py +197 -0
  355. autogen/remote/errors.py +17 -0
  356. autogen/remote/httpx_client_factory.py +131 -0
  357. autogen/remote/protocol.py +37 -0
  358. autogen/remote/retry.py +102 -0
  359. autogen/remote/runtime.py +96 -0
  360. autogen/retrieve_utils.py +490 -0
  361. autogen/runtime_logging.py +161 -0
  362. autogen/testing/__init__.py +12 -0
  363. autogen/testing/messages.py +45 -0
  364. autogen/testing/test_agent.py +111 -0
  365. autogen/token_count_utils.py +280 -0
  366. autogen/tools/__init__.py +20 -0
  367. autogen/tools/contrib/__init__.py +9 -0
  368. autogen/tools/contrib/time/__init__.py +7 -0
  369. autogen/tools/contrib/time/time.py +40 -0
  370. autogen/tools/dependency_injection.py +249 -0
  371. autogen/tools/experimental/__init__.py +54 -0
  372. autogen/tools/experimental/browser_use/__init__.py +7 -0
  373. autogen/tools/experimental/browser_use/browser_use.py +154 -0
  374. autogen/tools/experimental/code_execution/__init__.py +7 -0
  375. autogen/tools/experimental/code_execution/python_code_execution.py +86 -0
  376. autogen/tools/experimental/crawl4ai/__init__.py +7 -0
  377. autogen/tools/experimental/crawl4ai/crawl4ai.py +150 -0
  378. autogen/tools/experimental/deep_research/__init__.py +7 -0
  379. autogen/tools/experimental/deep_research/deep_research.py +329 -0
  380. autogen/tools/experimental/duckduckgo/__init__.py +7 -0
  381. autogen/tools/experimental/duckduckgo/duckduckgo_search.py +103 -0
  382. autogen/tools/experimental/firecrawl/__init__.py +7 -0
  383. autogen/tools/experimental/firecrawl/firecrawl_tool.py +836 -0
  384. autogen/tools/experimental/google/__init__.py +14 -0
  385. autogen/tools/experimental/google/authentication/__init__.py +11 -0
  386. autogen/tools/experimental/google/authentication/credentials_hosted_provider.py +43 -0
  387. autogen/tools/experimental/google/authentication/credentials_local_provider.py +91 -0
  388. autogen/tools/experimental/google/authentication/credentials_provider.py +35 -0
  389. autogen/tools/experimental/google/drive/__init__.py +9 -0
  390. autogen/tools/experimental/google/drive/drive_functions.py +124 -0
  391. autogen/tools/experimental/google/drive/toolkit.py +88 -0
  392. autogen/tools/experimental/google/model.py +17 -0
  393. autogen/tools/experimental/google/toolkit_protocol.py +19 -0
  394. autogen/tools/experimental/google_search/__init__.py +8 -0
  395. autogen/tools/experimental/google_search/google_search.py +93 -0
  396. autogen/tools/experimental/google_search/youtube_search.py +181 -0
  397. autogen/tools/experimental/messageplatform/__init__.py +17 -0
  398. autogen/tools/experimental/messageplatform/discord/__init__.py +7 -0
  399. autogen/tools/experimental/messageplatform/discord/discord.py +284 -0
  400. autogen/tools/experimental/messageplatform/slack/__init__.py +7 -0
  401. autogen/tools/experimental/messageplatform/slack/slack.py +385 -0
  402. autogen/tools/experimental/messageplatform/telegram/__init__.py +7 -0
  403. autogen/tools/experimental/messageplatform/telegram/telegram.py +271 -0
  404. autogen/tools/experimental/perplexity/__init__.py +7 -0
  405. autogen/tools/experimental/perplexity/perplexity_search.py +249 -0
  406. autogen/tools/experimental/reliable/__init__.py +10 -0
  407. autogen/tools/experimental/reliable/reliable.py +1311 -0
  408. autogen/tools/experimental/searxng/__init__.py +7 -0
  409. autogen/tools/experimental/searxng/searxng_search.py +142 -0
  410. autogen/tools/experimental/tavily/__init__.py +7 -0
  411. autogen/tools/experimental/tavily/tavily_search.py +176 -0
  412. autogen/tools/experimental/web_search_preview/__init__.py +7 -0
  413. autogen/tools/experimental/web_search_preview/web_search_preview.py +120 -0
  414. autogen/tools/experimental/wikipedia/__init__.py +7 -0
  415. autogen/tools/experimental/wikipedia/wikipedia.py +284 -0
  416. autogen/tools/function_utils.py +412 -0
  417. autogen/tools/tool.py +188 -0
  418. autogen/tools/toolkit.py +86 -0
  419. autogen/types.py +29 -0
  420. autogen/version.py +7 -0
  421. templates/client_template/main.jinja2 +72 -0
  422. templates/config_template/config.jinja2 +7 -0
  423. templates/main.jinja2 +61 -0
@@ -0,0 +1,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 .searxng_search import SearxngSearchTool
6
+
7
+ __all__ = ["SearxngSearchTool"]
@@ -0,0 +1,142 @@
1
+ # Copyright (c) 2023 - 2025, AG2ai, Inc., AG2ai open-source projects maintainers and core contributors
2
+ #
3
+ # SPDX-License-Identifier: Apache-2.0
4
+ """SearxNG Search Tool
5
+ A simple tool to perform web searches using a SearxNG instance.
6
+ """
7
+
8
+ import logging
9
+ from typing import Annotated, Any
10
+
11
+ import requests
12
+
13
+ from autogen.doc_utils import export_module
14
+ from autogen.tools import Tool
15
+
16
+ logger = logging.getLogger(__name__)
17
+
18
+
19
+ def _execute_searxng_query(
20
+ query: str,
21
+ max_results: int = 5,
22
+ categories: list[str] | None = None,
23
+ language: str | None = None,
24
+ base_url: str = "https://searxng.site/search",
25
+ ) -> list[dict[str, Any]]:
26
+ """Execute a search query using a SearxNG instance.
27
+
28
+ Args:
29
+ query (str): The search query string.
30
+ max_results (int, optional): The maximum number of results to return. Defaults to 5.
31
+ categories (Optional[List[str]]): List of categories to search in.
32
+ language (Optional[str]): Language code.
33
+ base_url (str): SearxNG instance URL.
34
+
35
+ Returns:
36
+ list[dict[str, Any]]: A list of search results from SearxNG.
37
+ """
38
+ params = {
39
+ "q": query,
40
+ "format": "json",
41
+ "language": language or "en-US",
42
+ "categories": ",".join(categories) if categories else None,
43
+ "count": max_results,
44
+ }
45
+ params = {k: v for k, v in params.items() if v is not None}
46
+ try:
47
+ response = requests.get(base_url, params=params, timeout=10)
48
+ response.raise_for_status()
49
+ data = response.json()
50
+ results = data.get("results", [])
51
+ if not isinstance(results, list):
52
+ return []
53
+ # Ensure each result is a dict before returning
54
+ typed_results: list[dict[str, Any]] = []
55
+ for item in results:
56
+ if isinstance(item, dict):
57
+ typed_results.append(item)
58
+ return typed_results
59
+ except Exception as e:
60
+ logger.error(f"SearxNG Search failed: {e}")
61
+ return []
62
+
63
+
64
+ def _searxng_search(
65
+ query: str,
66
+ max_results: int = 5,
67
+ categories: list[str] | None = None,
68
+ language: str | None = None,
69
+ base_url: str = "https://searxng.site/search",
70
+ ) -> list[dict[str, Any]]:
71
+ """Perform a SearxNG search and format the results.
72
+
73
+ Args:
74
+ query (str): The search query string.
75
+ max_results (int, optional): The maximum number of results to return. Defaults to 5.
76
+ categories (Optional[List[str]]): List of categories to search in.
77
+ language (Optional[str]): Language code.
78
+ base_url (str): SearxNG instance URL.
79
+
80
+ Returns:
81
+ list[dict[str, Any]]: A list of dictionaries with 'title', 'link', and 'snippet'.
82
+ """
83
+ res = _execute_searxng_query(
84
+ query=query,
85
+ max_results=max_results,
86
+ categories=categories,
87
+ language=language,
88
+ base_url=base_url,
89
+ )
90
+ formatted_results: list[dict[str, Any]] = [
91
+ {"title": item.get("title", ""), "link": item.get("url", ""), "snippet": item.get("content", "")}
92
+ for item in res
93
+ ]
94
+ return formatted_results
95
+
96
+
97
+ @export_module("autogen.tools.experimental")
98
+ class SearxngSearchTool(Tool):
99
+ """SearxngSearchTool is a tool that uses SearxNG to perform a search.
100
+
101
+ This tool allows agents to leverage the SearxNG search engine for information retrieval.
102
+ SearxNG does not require an API key by default, making it easy to use.
103
+ """
104
+
105
+ def __init__(self, base_url: str = "https://searxng.site/search") -> None:
106
+ """Initializes the SearxngSearchTool.
107
+
108
+ Args:
109
+ base_url (str): The SearxNG instance URL.
110
+ """
111
+ self.base_url = base_url
112
+ super().__init__(
113
+ name="searxng_search",
114
+ description="Use the SearxNG API to perform a search.",
115
+ func_or_tool=self.searxng_search,
116
+ )
117
+
118
+ def searxng_search(
119
+ self,
120
+ query: Annotated[str, "The search query."],
121
+ max_results: Annotated[int, "The number of results to return."] = 5,
122
+ categories: Annotated[list[str] | None, "List of categories to search in."] = None,
123
+ language: Annotated[str | None, "Language code (e.g., 'en-US')."] = None,
124
+ ) -> list[dict[str, Any]]:
125
+ """Performs a search using the SearxNG API and returns formatted results.
126
+
127
+ Args:
128
+ query: The search query string.
129
+ max_results: The maximum number of results to return. Defaults to 5.
130
+ categories: List of categories to search in.
131
+ language: Language code.
132
+
133
+ Returns:
134
+ A list of dictionaries, each containing 'title', 'link', and 'snippet' of a search result.
135
+ """
136
+ return _searxng_search(
137
+ query=query,
138
+ max_results=max_results,
139
+ categories=categories,
140
+ language=language,
141
+ base_url=self.base_url,
142
+ )
@@ -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 .tavily_search import TavilySearchTool
6
+
7
+ __all__ = ["TavilySearchTool"]
@@ -0,0 +1,176 @@
1
+ # Copyright (c) 2023 - 2025, AG2ai, Inc., AG2ai open-source projects maintainers and core contributors
2
+ #
3
+ # SPDX-License-Identifier: Apache-2.0
4
+ import os
5
+ from typing import Annotated, Any
6
+
7
+ from ....doc_utils import export_module
8
+ from ....import_utils import optional_import_block, require_optional_import
9
+ from ....llm_config import LLMConfig
10
+ from ... import Depends, Tool
11
+ from ...dependency_injection import on
12
+
13
+ with optional_import_block():
14
+ from tavily import TavilyClient
15
+
16
+
17
+ @require_optional_import(
18
+ [
19
+ "tavily",
20
+ ],
21
+ "tavily",
22
+ )
23
+ def _execute_tavily_query(
24
+ query: str,
25
+ tavily_api_key: str,
26
+ search_depth: str = "basic",
27
+ topic: str = "general",
28
+ include_answer: str = "basic",
29
+ include_raw_content: bool = False,
30
+ include_domains: list[str] = [],
31
+ num_results: int = 5,
32
+ ) -> Any:
33
+ """Execute a search query using the Tavily API.
34
+
35
+ Args:
36
+ query (str): The search query string.
37
+ tavily_api_key (str): The API key for Tavily.
38
+ search_depth (str, optional): The depth of the search ('basic' or 'advanced'). Defaults to "basic".
39
+ topic (str, optional): The topic of the search. Defaults to "general".
40
+ include_answer (str, optional): Whether to include an AI-generated answer ('basic' or 'advanced'). Defaults to "basic".
41
+ include_raw_content (bool, optional): Whether to include raw content in the results. Defaults to False.
42
+ include_domains (list[str], optional): A list of domains to include in the search. Defaults to [].
43
+ num_results (int, optional): The maximum number of results to return. Defaults to 5.
44
+
45
+ Returns:
46
+ Any: The raw response object from the Tavily API client.
47
+ """
48
+ tavily_client = TavilyClient(api_key=tavily_api_key)
49
+ return tavily_client.search(
50
+ query=query,
51
+ search_depth=search_depth,
52
+ topic=topic,
53
+ include_answer=include_answer,
54
+ include_raw_content=include_raw_content,
55
+ include_domains=include_domains,
56
+ max_results=num_results,
57
+ )
58
+
59
+
60
+ def _tavily_search(
61
+ query: str,
62
+ tavily_api_key: str,
63
+ search_depth: str = "basic",
64
+ topic: str = "general",
65
+ include_answer: str = "basic",
66
+ include_raw_content: bool = False,
67
+ include_domains: list[str] = [],
68
+ num_results: int = 5,
69
+ ) -> list[dict[str, Any]]:
70
+ """Perform a Tavily search and format the results.
71
+
72
+ This function takes search parameters, executes the query using `_execute_tavily_query`,
73
+ and formats the results into a list of dictionaries containing title, link, and snippet.
74
+
75
+ Args:
76
+ query (str): The search query string.
77
+ tavily_api_key (str): The API key for Tavily.
78
+ search_depth (str, optional): The depth of the search ('basic' or 'advanced'). Defaults to "basic".
79
+ topic (str, optional): The topic of the search. Defaults to "general".
80
+ include_answer (str, optional): Whether to include an AI-generated answer ('basic' or 'advanced'). Defaults to "basic".
81
+ include_raw_content (bool, optional): Whether to include raw content in the results. Defaults to False.
82
+ include_domains (list[str], optional): A list of domains to include in the search. Defaults to [].
83
+ num_results (int, optional): The maximum number of results to return. Defaults to 5.
84
+
85
+ Returns:
86
+ list[dict[str, Any]]: A list of dictionaries, where each dictionary represents a search result
87
+ with keys 'title', 'link', and 'snippet'. Returns an empty list if no results are found.
88
+ """
89
+ res = _execute_tavily_query(
90
+ query=query,
91
+ tavily_api_key=tavily_api_key,
92
+ search_depth=search_depth,
93
+ topic=topic,
94
+ include_answer=include_answer,
95
+ include_raw_content=include_raw_content,
96
+ include_domains=include_domains,
97
+ num_results=num_results,
98
+ )
99
+
100
+ return [
101
+ {"title": item.get("title", ""), "link": item.get("url", ""), "snippet": item.get("content", "")}
102
+ for item in res.get("results", [])
103
+ ]
104
+
105
+
106
+ @export_module("autogen.tools.experimental")
107
+ class TavilySearchTool(Tool):
108
+ """TavilySearchTool is a tool that uses the Tavily Search API to perform a search.
109
+
110
+ This tool allows agents to leverage the Tavily search engine for information retrieval.
111
+ It requires a Tavily API key, which can be provided during initialization or set as
112
+ an environment variable `TAVILY_API_KEY`.
113
+
114
+ Attributes:
115
+ tavily_api_key (str): The API key used for authenticating with the Tavily API.
116
+ """
117
+
118
+ def __init__(self, *, llm_config: LLMConfig | dict[str, Any] | None = None, tavily_api_key: str | None = None):
119
+ """Initializes the TavilySearchTool.
120
+
121
+ Args:
122
+ llm_config (Optional[Union[LLMConfig, dict[str, Any]]]): LLM configuration. (Currently unused but kept for potential future integration).
123
+ tavily_api_key (Optional[str]): The API key for the Tavily Search API. If not provided,
124
+ it attempts to read from the `TAVILY_API_KEY` environment variable.
125
+
126
+ Raises:
127
+ ValueError: If `tavily_api_key` is not provided either directly or via the environment variable.
128
+ """
129
+ self.tavily_api_key = tavily_api_key or os.getenv("TAVILY_API_KEY")
130
+
131
+ if self.tavily_api_key is None:
132
+ raise ValueError("tavily_api_key must be provided either as an argument or via TAVILY_API_KEY env var")
133
+
134
+ def tavily_search(
135
+ query: Annotated[str, "The search query."],
136
+ tavily_api_key: Annotated[str | None, Depends(on(self.tavily_api_key))],
137
+ search_depth: Annotated[str | None, "Either 'advanced' or 'basic'"] = "basic",
138
+ include_answer: Annotated[str | None, "Either 'advanced' or 'basic'"] = "basic",
139
+ include_raw_content: Annotated[bool | None, "Include the raw contents"] = False,
140
+ include_domains: Annotated[list[str] | None, "Specific web domains to search"] = [],
141
+ num_results: Annotated[int, "The number of results to return."] = 5,
142
+ ) -> list[dict[str, Any]]:
143
+ """Performs a search using the Tavily API and returns formatted results.
144
+
145
+ Args:
146
+ query: The search query string.
147
+ tavily_api_key: The API key for Tavily (injected dependency).
148
+ search_depth: The depth of the search ('basic' or 'advanced'). Defaults to "basic".
149
+ include_answer: Whether to include an AI-generated answer ('basic' or 'advanced'). Defaults to "basic".
150
+ include_raw_content: Whether to include raw content in the results. Defaults to False.
151
+ include_domains: A list of domains to include in the search. Defaults to [].
152
+ num_results: The maximum number of results to return. Defaults to 5.
153
+
154
+ Returns:
155
+ A list of dictionaries, each containing 'title', 'link', and 'snippet' of a search result.
156
+
157
+ Raises:
158
+ ValueError: If the Tavily API key is not available.
159
+ """
160
+ if tavily_api_key is None:
161
+ raise ValueError("Tavily API key is missing.")
162
+ return _tavily_search(
163
+ query=query,
164
+ tavily_api_key=tavily_api_key,
165
+ search_depth=search_depth or "basic",
166
+ include_answer=include_answer or "basic",
167
+ include_raw_content=include_raw_content or False,
168
+ include_domains=include_domains or [],
169
+ num_results=num_results,
170
+ )
171
+
172
+ super().__init__(
173
+ name="tavily_search",
174
+ description="Use the Tavily Search API to perform a search.",
175
+ func_or_tool=tavily_search,
176
+ )
@@ -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 .web_search_preview import WebSearchPreviewTool
6
+
7
+ __all__ = ["WebSearchPreviewTool"]
@@ -0,0 +1,120 @@
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 copy
7
+ import logging
8
+ import os
9
+ from typing import Annotated, Any, Literal
10
+
11
+ from pydantic import BaseModel
12
+
13
+ from ....doc_utils import export_module
14
+ from ....import_utils import optional_import_block, require_optional_import
15
+ from ....llm_config import LLMConfig
16
+ from ... import Tool
17
+
18
+ with optional_import_block():
19
+ from openai import OpenAI
20
+ from openai.types.responses import WebSearchToolParam
21
+ from openai.types.responses.web_search_tool import UserLocation
22
+
23
+
24
+ @require_optional_import("openai>=1.66.2", "openai")
25
+ @export_module("autogen.tools.experimental")
26
+ class WebSearchPreviewTool(Tool):
27
+ """WebSearchPreviewTool is a tool that uses OpenAI's web_search_preview tool to perform a search."""
28
+
29
+ def __init__(
30
+ self,
31
+ *,
32
+ llm_config: LLMConfig | dict[str, Any],
33
+ search_context_size: Literal["low", "medium", "high"] = "medium",
34
+ user_location: dict[str, str] | None = None,
35
+ instructions: str | None = None,
36
+ text_format: type[BaseModel] | None = None,
37
+ ):
38
+ """Initialize the WebSearchPreviewTool.
39
+
40
+ Args:
41
+ llm_config: The LLM configuration to use. This should be a dictionary
42
+ containing the model name and other parameters.
43
+ search_context_size: The size of the search context. One of `low`, `medium`, or `high`.
44
+ `medium` is the default.
45
+ user_location: The location of the user. This should be a dictionary containing
46
+ the city, country, region, and timezone.
47
+ instructions: Inserts a system (or developer) message as the first item in the model's context.
48
+ text_format: The format of the text to be returned. This should be a subclass of `BaseModel`.
49
+ The default is `None`, which means the text will be returned as a string.
50
+ """
51
+ self.web_search_tool_param = WebSearchToolParam(
52
+ type="web_search_preview", # type: ignore[typeddict-item]
53
+ search_context_size=search_context_size,
54
+ user_location=UserLocation(**user_location) if user_location else None, # type: ignore[typeddict-item]
55
+ )
56
+ self.instructions = instructions
57
+ self.text_format = text_format
58
+
59
+ if isinstance(llm_config, LLMConfig):
60
+ llm_config = llm_config.model_dump()
61
+
62
+ llm_config = copy.deepcopy(llm_config)
63
+
64
+ if "config_list" not in llm_config:
65
+ raise ValueError("llm_config must contain 'config_list' key")
66
+
67
+ # Find first OpenAI model which starts with "gpt-4"
68
+ self.model = None
69
+ self.api_key = None
70
+ for model in llm_config["config_list"]:
71
+ if model["model"].startswith("gpt-4") and model.get("api_type", "openai") == "openai":
72
+ self.model = model["model"]
73
+ self.api_key = model.get("api_key", os.getenv("OPENAI_API_KEY"))
74
+ break
75
+ if self.model is None:
76
+ raise ValueError(
77
+ "No OpenAI model starting with 'gpt-4' found in llm_config, other models do not support web_search_preview"
78
+ )
79
+
80
+ if not self.model.startswith("gpt-4.1") and not self.model.startswith("gpt-4o-search-preview"):
81
+ logging.warning(
82
+ f"We recommend using a model starting with 'gpt-4.1' or 'gpt-4o-search-preview' for web_search_preview, but found {self.model}. "
83
+ "This may result in suboptimal performance."
84
+ )
85
+
86
+ def web_search_preview(
87
+ query: Annotated[str, "The search query. Add all relevant context to the query."],
88
+ ) -> str | BaseModel | None:
89
+ client = OpenAI()
90
+
91
+ if not self.text_format:
92
+ response = client.responses.create(
93
+ model=self.model, # type: ignore[arg-type]
94
+ tools=[self.web_search_tool_param],
95
+ input=query,
96
+ instructions=self.instructions,
97
+ )
98
+ text = []
99
+ for output in response.output:
100
+ if output.type == "message":
101
+ for content in output.content:
102
+ if content.type == "output_text":
103
+ text.append(content.text)
104
+ return "\n".join(text)
105
+
106
+ else:
107
+ response = client.responses.parse(
108
+ model=self.model, # type: ignore[arg-type]
109
+ tools=[self.web_search_tool_param],
110
+ input=query,
111
+ instructions=self.instructions,
112
+ text_format=self.text_format,
113
+ )
114
+ return response.output_parsed
115
+
116
+ super().__init__(
117
+ name="web_search_preview",
118
+ description="Tool used to perform a web search. It can be used as google search or directly searching a specific website.",
119
+ func_or_tool=web_search_preview,
120
+ )
@@ -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 .wikipedia import WikipediaPageLoadTool, WikipediaQueryRunTool
6
+
7
+ __all__ = ["WikipediaPageLoadTool", "WikipediaQueryRunTool"]