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,249 @@
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 collections.abc import Callable, Iterable
10
+ from functools import wraps
11
+ from typing import TYPE_CHECKING, Any, TypeVar, get_type_hints
12
+
13
+ from ..agentchat import Agent
14
+ from ..doc_utils import export_module
15
+ from ..fast_depends import Depends as FastDepends
16
+ from ..fast_depends import inject
17
+ from ..fast_depends.dependencies import model
18
+ from ..fast_depends.utils import is_coroutine_callable
19
+
20
+ if TYPE_CHECKING:
21
+ from ..agentchat.conversable_agent import ConversableAgent
22
+
23
+ __all__ = [
24
+ "BaseContext",
25
+ "ChatContext",
26
+ "Depends",
27
+ "Field",
28
+ "get_context_params",
29
+ "inject_params",
30
+ "on",
31
+ "remove_params",
32
+ ]
33
+
34
+
35
+ @export_module("autogen.tools")
36
+ class BaseContext(ABC):
37
+ """Base class for context classes.
38
+
39
+ This is the base class for defining various context types that may be used
40
+ throughout the application. It serves as a parent for specific context classes.
41
+ """
42
+
43
+ pass
44
+
45
+
46
+ @export_module("autogen.tools")
47
+ class ChatContext(BaseContext):
48
+ """ChatContext class that extends BaseContext.
49
+
50
+ This class is used to represent a chat context that holds a list of messages.
51
+ It inherits from `BaseContext` and adds the `messages` attribute.
52
+ """
53
+
54
+ def __init__(self, agent: "ConversableAgent") -> None:
55
+ """Initializes the ChatContext with an agent.
56
+
57
+ Args:
58
+ agent: The agent to use for retrieving chat messages.
59
+ """
60
+ self._agent = agent
61
+
62
+ @property
63
+ def chat_messages(self) -> dict[Agent, list[dict[Any, Any]]]:
64
+ """The messages in the chat.
65
+
66
+ Returns:
67
+ A dictionary of agents and their messages.
68
+ """
69
+ return self._agent.chat_messages
70
+
71
+ @property
72
+ def last_message(self) -> dict[str, Any] | None:
73
+ """The last message in the chat.
74
+
75
+ Returns:
76
+ The last message in the chat.
77
+ """
78
+ return self._agent.last_message()
79
+
80
+
81
+ T = TypeVar("T")
82
+
83
+
84
+ def on(x: T) -> Callable[[], T]:
85
+ def inner(ag2_x: T = x) -> T:
86
+ return ag2_x
87
+
88
+ return inner
89
+
90
+
91
+ @export_module("autogen.tools")
92
+ def Depends(x: Any) -> Any: # noqa: N802
93
+ """Creates a dependency for injection based on the provided context or type.
94
+
95
+ Args:
96
+ x: The context or dependency to be injected.
97
+
98
+ Returns:
99
+ A FastDepends object that will resolve the dependency for injection.
100
+ """
101
+ if isinstance(x, BaseContext):
102
+ return FastDepends(lambda: x)
103
+
104
+ return FastDepends(x)
105
+
106
+
107
+ def get_context_params(func: Callable[..., Any], subclass: type[BaseContext] | type[ChatContext]) -> list[str]:
108
+ """Gets the names of the context parameters in a function signature.
109
+
110
+ Args:
111
+ func: The function to inspect for context parameters.
112
+ subclass: The subclass to search for.
113
+
114
+ Returns:
115
+ A list of parameter names that are instances of the specified subclass.
116
+ """
117
+ sig = inspect.signature(func)
118
+ return [p.name for p in sig.parameters.values() if _is_context_param(p, subclass=subclass)]
119
+
120
+
121
+ def _is_context_param(param: inspect.Parameter, subclass: type[BaseContext] | type[ChatContext] = BaseContext) -> 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
+ func = _fix_staticmethod(func)
145
+ sig = inspect.signature(func)
146
+ params_to_remove = [p.name for p in sig.parameters.values() if _is_context_param(p) or _is_depends_param(p)]
147
+ remove_params(func, sig, params_to_remove)
148
+ return func
149
+
150
+
151
+ class Field:
152
+ """Represents a description field for use in type annotations.
153
+
154
+ This class is used to store a description for an annotated field, often used for
155
+ documenting or validating fields in a context or data model.
156
+ """
157
+
158
+ def __init__(self, description: str) -> None:
159
+ """Initializes the Field with a description.
160
+
161
+ Args:
162
+ description: The description text for the field.
163
+ """
164
+ self._description = description
165
+
166
+ @property
167
+ def description(self) -> str:
168
+ return self._description
169
+
170
+
171
+ def _string_metadata_to_description_field(func: Callable[..., Any]) -> Callable[..., Any]:
172
+ type_hints = get_type_hints(func, include_extras=True)
173
+
174
+ for _, annotation in type_hints.items():
175
+ # Check if the annotation itself has metadata (using __metadata__)
176
+ if hasattr(annotation, "__metadata__"):
177
+ metadata = annotation.__metadata__
178
+ if metadata and isinstance(metadata[0], str):
179
+ # Replace string metadata with Field
180
+ annotation.__metadata__ = (Field(description=metadata[0]),)
181
+ # For Python < 3.11, annotations like `Optional` are stored as `Union`, so metadata
182
+ # would be in the first element of __args__ (e.g., `__args__[0]` for `int` in `Optional[int]`)
183
+ elif hasattr(annotation, "__args__") and hasattr(annotation.__args__[0], "__metadata__"):
184
+ metadata = annotation.__args__[0].__metadata__
185
+ if metadata and isinstance(metadata[0], str):
186
+ # Replace string metadata with Field
187
+ annotation.__args__[0].__metadata__ = (Field(description=metadata[0]),)
188
+ return func
189
+
190
+
191
+ def _fix_staticmethod(f: Callable[..., Any]) -> Callable[..., Any]:
192
+ # This is a workaround for Python 3.9+ where staticmethod.__func__ is accessible
193
+ if sys.version_info >= (3, 9) and isinstance(f, staticmethod) and hasattr(f, "__func__"):
194
+
195
+ @wraps(f.__func__)
196
+ def wrapper(*args: Any, **kwargs: Any) -> Any:
197
+ return f.__func__(*args, **kwargs) # type: ignore[attr-defined]
198
+
199
+ wrapper.__name__ = f.__func__.__name__
200
+
201
+ f = wrapper
202
+ return f
203
+
204
+
205
+ def _set_return_annotation_to_any(f: Callable[..., Any]) -> Callable[..., Any]:
206
+ if is_coroutine_callable(f):
207
+
208
+ @functools.wraps(f)
209
+ async def _a_wrapped_func(*args: Any, **kwargs: Any) -> Any:
210
+ return await f(*args, **kwargs)
211
+
212
+ wrapped_func = _a_wrapped_func
213
+
214
+ else:
215
+
216
+ @functools.wraps(f)
217
+ def _wrapped_func(*args: Any, **kwargs: Any) -> Any:
218
+ return f(*args, **kwargs)
219
+
220
+ wrapped_func = _wrapped_func
221
+
222
+ sig = inspect.signature(f)
223
+
224
+ # Change the return annotation directly on the signature of the wrapper
225
+ wrapped_func.__signature__ = sig.replace(return_annotation=Any) # type: ignore[attr-defined]
226
+
227
+ return wrapped_func
228
+
229
+
230
+ def inject_params(f: Callable[..., Any]) -> Callable[..., Any]:
231
+ """Injects parameters into a function, removing injected dependencies from its signature.
232
+
233
+ This function is used to modify a function by injecting dependencies and removing
234
+ injected parameters from the function's signature.
235
+
236
+ Args:
237
+ f: The function to modify with dependency injection.
238
+
239
+ Returns:
240
+ The modified function with injected dependencies and updated signature.
241
+ """
242
+ # This is a workaround for Python 3.9+ where staticmethod.__func__ is accessible
243
+ f = _fix_staticmethod(f)
244
+ f = _string_metadata_to_description_field(f)
245
+ f = _set_return_annotation_to_any(f)
246
+ f = inject(f)
247
+ f = _remove_injected_params_from_signature(f)
248
+
249
+ return f
@@ -0,0 +1,54 @@
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 .code_execution import PythonCodeExecutionTool
7
+ from .crawl4ai import Crawl4AITool
8
+ from .deep_research import DeepResearchTool
9
+ from .duckduckgo import DuckDuckGoSearchTool
10
+ from .firecrawl import FirecrawlTool
11
+ from .google_search import GoogleSearchTool, YoutubeSearchTool
12
+ from .messageplatform import (
13
+ DiscordRetrieveTool,
14
+ DiscordSendTool,
15
+ SlackRetrieveRepliesTool,
16
+ SlackRetrieveTool,
17
+ SlackSendTool,
18
+ TelegramRetrieveTool,
19
+ TelegramSendTool,
20
+ )
21
+ from .perplexity import PerplexitySearchTool
22
+ from .reliable import ReliableTool, ReliableToolError, SuccessfulExecutionParameters, ToolExecutionDetails
23
+ from .searxng import SearxngSearchTool
24
+ from .tavily import TavilySearchTool
25
+ from .web_search_preview import WebSearchPreviewTool
26
+ from .wikipedia import WikipediaPageLoadTool, WikipediaQueryRunTool
27
+
28
+ __all__ = [
29
+ "BrowserUseTool",
30
+ "Crawl4AITool",
31
+ "DeepResearchTool",
32
+ "DiscordRetrieveTool",
33
+ "DiscordSendTool",
34
+ "DuckDuckGoSearchTool",
35
+ "FirecrawlTool",
36
+ "GoogleSearchTool",
37
+ "PerplexitySearchTool",
38
+ "PythonCodeExecutionTool",
39
+ "ReliableTool",
40
+ "ReliableToolError",
41
+ "SearxngSearchTool",
42
+ "SlackRetrieveRepliesTool",
43
+ "SlackRetrieveTool",
44
+ "SlackSendTool",
45
+ "SuccessfulExecutionParameters",
46
+ "TavilySearchTool",
47
+ "TelegramRetrieveTool",
48
+ "TelegramSendTool",
49
+ "ToolExecutionDetails",
50
+ "WebSearchPreviewTool",
51
+ "WikipediaPageLoadTool",
52
+ "WikipediaQueryRunTool",
53
+ "YoutubeSearchTool",
54
+ ]
@@ -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"]
@@ -0,0 +1,154 @@
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 typing import Annotated, Any, Optional
6
+
7
+ from pydantic import BaseModel, field_validator
8
+
9
+ from ....doc_utils import export_module
10
+ from ....import_utils import optional_import_block, require_optional_import
11
+ from ....llm_config import LLMConfig
12
+ from ... import Depends, Tool
13
+ from ...dependency_injection import on
14
+
15
+ with optional_import_block():
16
+ from browser_use import Agent, Controller
17
+ from browser_use.browser.browser import Browser, BrowserConfig
18
+
19
+ from ....interop.langchain.langchain_chat_model_factory import LangChainChatModelFactory
20
+
21
+
22
+ __all__ = ["BrowserUseResult", "BrowserUseTool", "ExtractedContent"]
23
+
24
+
25
+ @export_module("autogen.tools.experimental.browser_use")
26
+ class ExtractedContent(BaseModel):
27
+ """Extracted content from the browser.
28
+
29
+ Attributes:
30
+ content: The extracted content.
31
+ url: The URL of the extracted content
32
+ """
33
+
34
+ content: str
35
+ url: str | None
36
+
37
+ @field_validator("url")
38
+ @classmethod
39
+ def check_url(cls, v: str) -> str | None:
40
+ """Check if the URL is about:blank and return None if it is.
41
+
42
+ Args:
43
+ v: The URL to check.
44
+ """
45
+ if v == "about:blank":
46
+ return None
47
+ return v
48
+
49
+
50
+ @export_module("autogen.tools.experimental.browser_use")
51
+ class BrowserUseResult(BaseModel):
52
+ """The result of using the browser to perform a task.
53
+
54
+ Attributes:
55
+ extracted_content: List of extracted content.
56
+ final_result: The final result.
57
+ """
58
+
59
+ extracted_content: list[ExtractedContent]
60
+ final_result: str | None
61
+
62
+
63
+ @require_optional_import(
64
+ [
65
+ "langchain_anthropic",
66
+ "langchain_google_genai",
67
+ "langchain_ollama",
68
+ "langchain_openai",
69
+ "langchain_core",
70
+ "browser_use",
71
+ ],
72
+ "browser-use",
73
+ )
74
+ @export_module("autogen.tools.experimental")
75
+ class BrowserUseTool(Tool):
76
+ """BrowserUseTool is a tool that uses the browser to perform a task."""
77
+
78
+ def __init__( # type: ignore[no-any-unimported]
79
+ self,
80
+ *,
81
+ llm_config: LLMConfig | dict[str, Any] | None = None,
82
+ browser: Optional["Browser"] = None,
83
+ agent_kwargs: dict[str, Any] | None = None,
84
+ browser_config: dict[str, Any] | None = None,
85
+ ):
86
+ """Use the browser to perform a task.
87
+
88
+ Args:
89
+ llm_config: The LLM configuration. If None, the current LLMConfig from context is used.
90
+ browser: The browser to use. If defined, browser_config must be None
91
+ agent_kwargs: Additional keyword arguments to pass to the Agent
92
+ browser_config: The browser configuration to use. If defined, browser must be None
93
+ """
94
+ if llm_config is None:
95
+ llm_config = LLMConfig.current
96
+ if agent_kwargs is None:
97
+ agent_kwargs = {}
98
+ if browser_config is None:
99
+ browser_config = {}
100
+ if browser is not None and browser_config:
101
+ raise ValueError(
102
+ f"Cannot provide both browser and additional keyword parameters: {browser=}, {browser_config=}"
103
+ )
104
+
105
+ async def browser_use( # type: ignore[no-any-unimported]
106
+ task: Annotated[str, "The task to perform."],
107
+ llm_config: Annotated[LLMConfig | dict[str, Any], Depends(on(llm_config))],
108
+ browser: Annotated[Browser | None, Depends(on(browser))],
109
+ agent_kwargs: Annotated[dict[str, Any], Depends(on(agent_kwargs))],
110
+ browser_config: Annotated[dict[str, Any], Depends(on(browser_config))],
111
+ ) -> BrowserUseResult:
112
+ agent_kwargs = agent_kwargs.copy()
113
+ browser_config = browser_config.copy()
114
+ if browser is None:
115
+ # set default value for headless
116
+ headless = browser_config.pop("headless", True)
117
+ browser_config = BrowserConfig(headless=headless, **browser_config)
118
+ browser = Browser(config=browser_config)
119
+ # set default value for generate_gif
120
+ if "generate_gif" not in agent_kwargs:
121
+ agent_kwargs["generate_gif"] = False
122
+ llm = LangChainChatModelFactory.create_base_chat_model(llm_config)
123
+ max_steps = agent_kwargs.pop("max_steps", 100)
124
+ agent = Agent(
125
+ task=task,
126
+ llm=llm,
127
+ browser=browser,
128
+ controller=BrowserUseTool._get_controller(llm_config),
129
+ **agent_kwargs,
130
+ )
131
+ result = await agent.run(max_steps=max_steps)
132
+ extracted_content = [
133
+ ExtractedContent(content=content, url=url)
134
+ for content, url in zip(result.extracted_content(), result.urls())
135
+ ]
136
+ return BrowserUseResult(
137
+ extracted_content=extracted_content,
138
+ final_result=result.final_result(),
139
+ )
140
+
141
+ super().__init__(
142
+ name="browser_use",
143
+ description="Use the browser to perform a task.",
144
+ func_or_tool=browser_use,
145
+ )
146
+
147
+ @staticmethod
148
+ def _get_controller(llm_config: LLMConfig | dict[str, Any]) -> Any:
149
+ response_format = (
150
+ llm_config["config_list"][0].get("response_format", None)
151
+ if "config_list" in llm_config
152
+ else llm_config.get("response_format")
153
+ )
154
+ return Controller(output_model=response_format)
@@ -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 .python_code_execution import PythonCodeExecutionTool
6
+
7
+ __all__ = ["PythonCodeExecutionTool"]
@@ -0,0 +1,86 @@
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 os
6
+ import tempfile
7
+ from typing import Annotated, Any
8
+
9
+ from pydantic import BaseModel, Field
10
+
11
+ from ....doc_utils import export_module
12
+ from ....environments import WorkingDirectory
13
+ from ....environments.python_environment import PythonEnvironment
14
+ from ... import Tool
15
+
16
+ __all__ = ["PythonCodeExecutionTool"]
17
+
18
+
19
+ @export_module("autogen.tools.experimental")
20
+ class PythonCodeExecutionTool(Tool):
21
+ """Executes Python code in a given environment and returns the result."""
22
+
23
+ def __init__(
24
+ self,
25
+ *,
26
+ timeout: int = 30,
27
+ working_directory: WorkingDirectory | None = None,
28
+ python_environment: PythonEnvironment | None = None,
29
+ ) -> None:
30
+ """Initialize the PythonCodeExecutionTool.
31
+
32
+ **CAUTION**: If provided a local environment, this tool will execute code in your local environment, which can be dangerous if the code is untrusted.
33
+
34
+ Args:
35
+ timeout: Maximum execution time allowed in seconds, will raise a TimeoutError exception if exceeded.
36
+ working_directory: Optional WorkingDirectory context manager to use.
37
+ python_environment: Optional PythonEnvironment to use. If None, will auto-detect or create based on other parameters.
38
+ """
39
+ # Store configuration parameters
40
+ self.timeout = timeout
41
+ self.working_directory = WorkingDirectory.get_current_working_directory(working_directory)
42
+ tool_python_environment = PythonEnvironment.get_current_python_environment(python_environment)
43
+
44
+ assert self.working_directory, "No Working directory found"
45
+ assert tool_python_environment, "No Python environment found"
46
+
47
+ self.python_environment = tool_python_environment
48
+
49
+ # Pydantic model to contain the code and list of libraries to execute
50
+ class CodeExecutionRequest(BaseModel):
51
+ code: Annotated[str, Field(description="Python code to execute")]
52
+ libraries: Annotated[list[str], Field(description="List of libraries to install before execution")]
53
+
54
+ # The tool function, this is what goes to the LLM
55
+ async def execute_python_code(
56
+ code_execution_request: Annotated[CodeExecutionRequest, "Python code and the libraries required"],
57
+ ) -> dict[str, Any]:
58
+ """Executes Python code in the attached environment and returns the result.
59
+
60
+ Args:
61
+ code_execution_request (CodeExecutionRequest): The Python code and libraries to execute
62
+ """
63
+ code = code_execution_request.code
64
+
65
+ # NOTE: Libraries are not installed (something to consider for future versions)
66
+
67
+ # Prepare a script file path
68
+ script_dir = self._get_script_directory()
69
+ script_path = os.path.join(script_dir, "script.py")
70
+
71
+ # Execute the code
72
+ return await self.python_environment.execute_code(code=code, script_path=script_path, timeout=self.timeout)
73
+
74
+ super().__init__(
75
+ name="python_execute_code",
76
+ description="Executes Python code and returns the result.",
77
+ func_or_tool=execute_python_code,
78
+ )
79
+
80
+ def _get_script_directory(self) -> str:
81
+ """Get the directory to use for scripts."""
82
+ if self.working_directory and hasattr(self.working_directory, "path") and self.working_directory.path:
83
+ path = self.working_directory.path
84
+ os.makedirs(path, exist_ok=True)
85
+ return path
86
+ return tempfile.mkdtemp(prefix="ag2_script_dir_")
@@ -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 .crawl4ai import Crawl4AITool
6
+
7
+ __all__ = ["Crawl4AITool"]