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
autogen/coding/base.py ADDED
@@ -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
+ # Portions derived from https://github.com/microsoft/autogen are under the MIT License.
6
+ # SPDX-License-Identifier: MIT
7
+ from __future__ import annotations
8
+
9
+ from collections.abc import Mapping
10
+ from typing import Any, Literal, Protocol, TypedDict, runtime_checkable
11
+
12
+ from pydantic import BaseModel, Field
13
+
14
+ from ..doc_utils import export_module
15
+ from ..types import UserMessageImageContentPart, UserMessageTextContentPart
16
+
17
+ __all__ = ("CodeBlock", "CodeExecutionConfig", "CodeExecutor", "CodeExtractor", "CodeResult")
18
+
19
+
20
+ @export_module("autogen.coding")
21
+ class CodeBlock(BaseModel):
22
+ """(Experimental) A class that represents a code block."""
23
+
24
+ code: str = Field(description="The code to execute.")
25
+
26
+ language: str = Field(description="The language of the code.")
27
+
28
+
29
+ @export_module("autogen.coding")
30
+ class CodeResult(BaseModel):
31
+ """(Experimental) A class that represents the result of a code execution."""
32
+
33
+ exit_code: int = Field(description="The exit code of the code execution.")
34
+
35
+ output: str = Field(description="The output of the code execution.")
36
+
37
+
38
+ @export_module("autogen.coding")
39
+ class CodeExtractor(Protocol):
40
+ """(Experimental) A code extractor class that extracts code blocks from a message."""
41
+
42
+ def extract_code_blocks(
43
+ self, message: str | list[UserMessageTextContentPart | UserMessageImageContentPart] | None
44
+ ) -> list[CodeBlock]:
45
+ """(Experimental) Extract code blocks from a message.
46
+
47
+ Args:
48
+ message (str): The message to extract code blocks from.
49
+
50
+ Returns:
51
+ List[CodeBlock]: The extracted code blocks.
52
+ """
53
+ ... # pragma: no cover
54
+
55
+
56
+ @runtime_checkable
57
+ @export_module("autogen.coding")
58
+ class CodeExecutor(Protocol):
59
+ """(Experimental) A code executor class that executes code blocks and returns the result."""
60
+
61
+ @property
62
+ def code_extractor(self) -> CodeExtractor:
63
+ """(Experimental) The code extractor used by this code executor."""
64
+ ... # pragma: no cover
65
+
66
+ def execute_code_blocks(self, code_blocks: list[CodeBlock]) -> CodeResult:
67
+ """(Experimental) Execute code blocks and return the result.
68
+
69
+ This method should be implemented by the code executor.
70
+
71
+ Args:
72
+ code_blocks (List[CodeBlock]): The code blocks to execute.
73
+
74
+ Returns:
75
+ CodeResult: The result of the code execution.
76
+ """
77
+ ... # pragma: no cover
78
+
79
+ def restart(self) -> None:
80
+ """(Experimental) Restart the code executor.
81
+
82
+ This method should be implemented by the code executor.
83
+
84
+ This method is called when the agent is reset.
85
+ """
86
+ ... # pragma: no cover
87
+
88
+
89
+ class IPythonCodeResult(CodeResult):
90
+ """(Experimental) A code result class for IPython code executor."""
91
+
92
+ output_files: list[str] = Field(
93
+ default_factory=list,
94
+ description="The list of files that the executed code blocks generated.",
95
+ )
96
+
97
+
98
+ CodeExecutionConfig = TypedDict(
99
+ "CodeExecutionConfig",
100
+ {
101
+ "executor": Literal["ipython-embedded", "commandline-local", "yepcode"] | CodeExecutor,
102
+ "last_n_messages": int | Literal["auto"],
103
+ "timeout": int,
104
+ "use_docker": bool | str | list[str],
105
+ "work_dir": str,
106
+ "ipython-embedded": Mapping[str, Any],
107
+ "commandline-local": Mapping[str, Any],
108
+ "yepcode": Mapping[str, Any],
109
+ },
110
+ total=False,
111
+ )
112
+
113
+
114
+ class CommandLineCodeResult(CodeResult):
115
+ """(Experimental) A code result class for command line code executor."""
116
+
117
+ code_file: str | None = Field(
118
+ default=None,
119
+ description="The file that the executed code block was saved to.",
120
+ )
@@ -0,0 +1,283 @@
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
+ from __future__ import annotations
8
+
9
+ import atexit
10
+ import logging
11
+ import uuid
12
+ from hashlib import md5
13
+ from pathlib import Path
14
+ from time import sleep
15
+ from types import TracebackType
16
+ from typing import Any, ClassVar
17
+
18
+ import docker
19
+ from docker.errors import ImageNotFound
20
+ from typing_extensions import Self
21
+
22
+ from ..code_utils import TIMEOUT_MSG, _cmd
23
+ from ..doc_utils import export_module
24
+ from .base import CodeBlock, CodeExecutor, CodeExtractor, CommandLineCodeResult
25
+ from .markdown_code_extractor import MarkdownCodeExtractor
26
+ from .utils import _get_file_name_from_content, silence_pip
27
+
28
+
29
+ def _wait_for_ready(container: Any, timeout: int = 60, stop_time: float = 0.1) -> None:
30
+ elapsed_time = 0.0
31
+ while container.status != "running" and elapsed_time < timeout:
32
+ sleep(stop_time)
33
+ elapsed_time += stop_time
34
+ container.reload()
35
+ continue
36
+ if container.status != "running":
37
+ raise ValueError("Container failed to start")
38
+
39
+
40
+ __all__ = ("DockerCommandLineCodeExecutor",)
41
+
42
+
43
+ @export_module("autogen.coding")
44
+ class DockerCommandLineCodeExecutor(CodeExecutor):
45
+ DEFAULT_EXECUTION_POLICY: ClassVar[dict[str, bool]] = {
46
+ "bash": True,
47
+ "shell": True,
48
+ "sh": True,
49
+ "pwsh": True,
50
+ "powershell": True,
51
+ "ps1": True,
52
+ "python": True,
53
+ "javascript": False,
54
+ "html": False,
55
+ "css": False,
56
+ }
57
+ LANGUAGE_ALIASES: ClassVar[dict[str, str]] = {"py": "python", "js": "javascript"}
58
+
59
+ def __init__(
60
+ self,
61
+ image: str = "python:3-slim",
62
+ container_name: str | None = None,
63
+ timeout: int = 60,
64
+ work_dir: Path | str | None = None,
65
+ bind_dir: Path | str | None = None,
66
+ auto_remove: bool = True,
67
+ stop_container: bool = True,
68
+ execution_policies: dict[str, bool] | None = None,
69
+ *,
70
+ container_create_kwargs: dict[str, Any] | None = None,
71
+ ):
72
+ """(Experimental) A code executor class that executes code through
73
+ a command line environment in a Docker container.
74
+
75
+ The executor first saves each code block in a file in the working
76
+ directory, and then executes the code file in the container.
77
+ The executor executes the code blocks in the order they are received.
78
+ Currently, the executor only supports Python and shell scripts.
79
+ For Python code, use the language "python" for the code block.
80
+ For shell scripts, use the language "bash", "shell", or "sh" for the code
81
+ block.
82
+
83
+ Args:
84
+ image: Docker image to use for code execution. Defaults to "python:3-slim".
85
+ container_name: Name of the Docker container which is created. If None, will autogenerate a name. Defaults to None.
86
+ timeout: The timeout for code execution. Defaults to 60.
87
+ work_dir: The working directory for the code execution. Defaults to Path(".").
88
+ bind_dir: The directory that will be bound to the code executor container. Useful for cases where you want to spawn
89
+ the container from within a container. Defaults to work_dir.
90
+ auto_remove: If true, will automatically remove the Docker container when it is stopped. Defaults to True.
91
+ stop_container: If true, will automatically stop the
92
+ container when stop is called, when the context manager exits or when
93
+ the Python process exits with atext. Defaults to True.
94
+ execution_policies: A dictionary mapping language names to boolean values that determine
95
+ whether code in that language should be executed. True means code in that language
96
+ will be executed, False means it will only be saved to a file. This overrides the
97
+ default execution policies. Defaults to None.
98
+ container_create_kwargs: Optional dict forwarded verbatim to
99
+ "docker.client.containers.create". Use it to set advanced Docker
100
+ options (environment variables, GPU device_requests, port mappings, etc.).
101
+ Values here override the class defaults when keys collide. Defaults to None.
102
+
103
+
104
+ Raises:
105
+ ValueError: On argument error, or if the container fails to start.
106
+ """
107
+ work_dir = work_dir if work_dir is not None else Path()
108
+
109
+ if timeout < 1:
110
+ raise ValueError("Timeout must be greater than or equal to 1.")
111
+
112
+ if isinstance(work_dir, str):
113
+ work_dir = Path(work_dir)
114
+ work_dir.mkdir(exist_ok=True)
115
+
116
+ if bind_dir is None:
117
+ bind_dir = work_dir
118
+ elif isinstance(bind_dir, str):
119
+ bind_dir = Path(bind_dir)
120
+
121
+ client = docker.from_env()
122
+ # Check if the image exists
123
+ try:
124
+ client.images.get(image)
125
+ except ImageNotFound:
126
+ logging.info(f"Pulling image {image}...")
127
+ # Let the docker exception escape if this fails.
128
+ client.images.pull(image)
129
+
130
+ if container_name is None:
131
+ container_name = f"autogen-code-exec-{uuid.uuid4()}"
132
+
133
+ # build kwargs for docker.create
134
+ base_kwargs: dict[str, Any] = {
135
+ "image": image,
136
+ "name": container_name,
137
+ "entrypoint": "/bin/sh",
138
+ "tty": True,
139
+ "auto_remove": auto_remove,
140
+ "volumes": {str(bind_dir.resolve()): {"bind": "/workspace", "mode": "rw"}},
141
+ "working_dir": "/workspace",
142
+ }
143
+
144
+ if container_create_kwargs:
145
+ for k in ("entrypoint", "volumes", "working_dir", "tty"):
146
+ if k in container_create_kwargs:
147
+ logging.warning(
148
+ "DockerCommandLineCodeExecutor: overriding default %s=%s",
149
+ k,
150
+ container_create_kwargs[k],
151
+ )
152
+ base_kwargs.update(container_create_kwargs)
153
+
154
+ # Start a container from the image, read to exec commands later
155
+ self._container = client.containers.create(**base_kwargs)
156
+ self._container.start()
157
+
158
+ _wait_for_ready(self._container)
159
+
160
+ def cleanup() -> None:
161
+ try:
162
+ container = client.containers.get(container_name)
163
+ container.stop()
164
+ except docker.errors.NotFound:
165
+ pass
166
+ atexit.unregister(cleanup)
167
+
168
+ if stop_container:
169
+ atexit.register(cleanup)
170
+
171
+ self._cleanup = cleanup
172
+
173
+ # Check if the container is running
174
+ if self._container.status != "running":
175
+ raise ValueError(f"Failed to start container from image {image}. Logs: {self._container.logs()}")
176
+
177
+ self._timeout = timeout
178
+ self._work_dir: Path = work_dir
179
+ self._bind_dir: Path = bind_dir
180
+ self.execution_policies = self.DEFAULT_EXECUTION_POLICY.copy()
181
+ if execution_policies is not None:
182
+ self.execution_policies.update(execution_policies)
183
+
184
+ @property
185
+ def timeout(self) -> int:
186
+ """(Experimental) The timeout for code execution."""
187
+ return self._timeout
188
+
189
+ @property
190
+ def work_dir(self) -> Path:
191
+ """(Experimental) The working directory for the code execution."""
192
+ return self._work_dir
193
+
194
+ @property
195
+ def bind_dir(self) -> Path:
196
+ """(Experimental) The binding directory for the code execution container."""
197
+ return self._bind_dir
198
+
199
+ @property
200
+ def code_extractor(self) -> CodeExtractor:
201
+ """(Experimental) Export a code extractor that can be used by an agent."""
202
+ return MarkdownCodeExtractor()
203
+
204
+ def execute_code_blocks(self, code_blocks: list[CodeBlock]) -> CommandLineCodeResult:
205
+ """(Experimental) Execute the code blocks and return the result.
206
+
207
+ Args:
208
+ code_blocks (List[CodeBlock]): The code blocks to execute.
209
+
210
+ Returns:
211
+ CommandlineCodeResult: The result of the code execution.
212
+ """
213
+ if len(code_blocks) == 0:
214
+ raise ValueError("No code blocks to execute.")
215
+
216
+ outputs = []
217
+ files = []
218
+ last_exit_code = 0
219
+ for code_block in code_blocks:
220
+ lang = self.LANGUAGE_ALIASES.get(code_block.language.lower(), code_block.language.lower())
221
+ if lang not in self.DEFAULT_EXECUTION_POLICY:
222
+ outputs.append(f"Unsupported language {lang}\n")
223
+ last_exit_code = 1
224
+ break
225
+
226
+ execute_code = self.execution_policies.get(lang, False)
227
+ code = silence_pip(code_block.code, lang)
228
+
229
+ # Check if there is a filename comment
230
+ try:
231
+ filename = _get_file_name_from_content(code, self._work_dir)
232
+ except ValueError:
233
+ outputs.append("Filename is not in the workspace")
234
+ last_exit_code = 1
235
+ break
236
+
237
+ if not filename:
238
+ filename = f"tmp_code_{md5(code.encode()).hexdigest()}.{lang}"
239
+
240
+ code_path = self._work_dir / filename
241
+ with code_path.open("w", encoding="utf-8") as fout:
242
+ fout.write(code)
243
+ files.append(code_path)
244
+
245
+ if not execute_code:
246
+ outputs.append(f"Code saved to {code_path!s}\n")
247
+ continue
248
+
249
+ command = ["timeout", str(self._timeout), _cmd(lang), filename]
250
+ result = self._container.exec_run(command)
251
+ exit_code = result.exit_code
252
+ output = result.output.decode("utf-8")
253
+ if exit_code == 124:
254
+ output += "\n" + TIMEOUT_MSG
255
+ outputs.append(output)
256
+
257
+ last_exit_code = exit_code
258
+ if exit_code != 0:
259
+ break
260
+
261
+ code_file = str(files[0]) if files else None
262
+ return CommandLineCodeResult(exit_code=last_exit_code, output="".join(outputs), code_file=code_file)
263
+
264
+ def restart(self) -> None:
265
+ """(Experimental) Restart the code executor."""
266
+ self._container.restart()
267
+ if self._container.status != "running":
268
+ raise ValueError(f"Failed to restart container. Logs: {self._container.logs()}")
269
+
270
+ def stop(self) -> None:
271
+ """(Experimental) Stop the code executor."""
272
+ self._cleanup()
273
+
274
+ def __enter__(self) -> Self:
275
+ return self
276
+
277
+ def __exit__(
278
+ self,
279
+ exc_type: type[BaseException] | None,
280
+ exc_val: BaseException | None,
281
+ exc_tb: TracebackType | None,
282
+ ) -> None:
283
+ self.stop()
@@ -0,0 +1,56 @@
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
+ from ..doc_utils import export_module
8
+ from .base import CodeExecutionConfig, CodeExecutor
9
+
10
+ __all__ = ("CodeExecutorFactory",)
11
+
12
+
13
+ @export_module("autogen.coding")
14
+ class CodeExecutorFactory:
15
+ """(Experimental) A factory class for creating code executors."""
16
+
17
+ @staticmethod
18
+ def create(code_execution_config: CodeExecutionConfig) -> CodeExecutor:
19
+ """(Experimental) Get a code executor based on the code execution config.
20
+
21
+ Args:
22
+ code_execution_config (Dict): The code execution config,
23
+ which is a dictionary that must contain the key "executor".
24
+ The value of the key "executor" can be either a string
25
+ or an instance of CodeExecutor, in which case the code
26
+ executor is returned directly.
27
+
28
+ Returns:
29
+ CodeExecutor: The code executor.
30
+
31
+ Raises:
32
+ ValueError: If the code executor is unknown or not specified.
33
+ """
34
+ executor = code_execution_config.get("executor")
35
+ if isinstance(executor, CodeExecutor):
36
+ # If the executor is already an instance of CodeExecutor, return it.
37
+ return executor
38
+ if executor == "ipython-embedded":
39
+ from .jupyter.embedded_ipython_code_executor import EmbeddedIPythonCodeExecutor
40
+
41
+ return EmbeddedIPythonCodeExecutor(**code_execution_config.get("ipython-embedded", {}))
42
+ elif executor == "commandline-local":
43
+ from .local_commandline_code_executor import LocalCommandLineCodeExecutor
44
+
45
+ return LocalCommandLineCodeExecutor(**code_execution_config.get("commandline-local", {}))
46
+ elif executor == "yepcode":
47
+ try:
48
+ from .yepcode_code_executor import YepCodeCodeExecutor
49
+ except ImportError as e:
50
+ raise ImportError(
51
+ "Missing dependencies for YepCodeCodeExecutor. Please install with: pip install ag2[yepcode]"
52
+ ) from e
53
+
54
+ return YepCodeCodeExecutor(**code_execution_config.get("yepcode", {}))
55
+ else:
56
+ raise ValueError(f"Unknown code executor {executor}")
@@ -0,0 +1,203 @@
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 functools
9
+ import importlib
10
+ import inspect
11
+ from collections.abc import Callable
12
+ from dataclasses import dataclass, field
13
+ from importlib.abc import SourceLoader
14
+ from textwrap import dedent, indent
15
+ from typing import Any, Generic, TypeVar, Union
16
+
17
+ from typing_extensions import ParamSpec
18
+
19
+ T = TypeVar("T")
20
+ P = ParamSpec("P")
21
+
22
+
23
+ def _to_code(func: Union["FunctionWithRequirements[T, P]", Callable[P, T], "FunctionWithRequirementsStr"]) -> str:
24
+ if isinstance(func, FunctionWithRequirementsStr):
25
+ return func.func
26
+
27
+ code = inspect.getsource(func)
28
+ # Strip the decorator
29
+ if code.startswith("@"):
30
+ code = code[code.index("\n") + 1 :]
31
+ return code
32
+
33
+
34
+ @dataclass
35
+ class Alias:
36
+ name: str
37
+ alias: str
38
+
39
+
40
+ @dataclass
41
+ class ImportFromModule:
42
+ module: str
43
+ imports: list[str | Alias]
44
+
45
+
46
+ Import = str | ImportFromModule | Alias
47
+
48
+
49
+ def _import_to_str(im: Import) -> str:
50
+ if isinstance(im, str):
51
+ return f"import {im}"
52
+ elif isinstance(im, Alias):
53
+ return f"import {im.name} as {im.alias}"
54
+ else:
55
+
56
+ def to_str(i: str | Alias) -> str:
57
+ if isinstance(i, str):
58
+ return i
59
+ else:
60
+ return f"{i.name} as {i.alias}"
61
+
62
+ imports = ", ".join(map(to_str, im.imports))
63
+ return f"from {im.module} import {imports}"
64
+
65
+
66
+ class _StringLoader(SourceLoader):
67
+ def __init__(self, data: str):
68
+ self.data = data
69
+
70
+ def get_source(self, fullname: str) -> str:
71
+ return self.data
72
+
73
+ def get_data(self, path: str) -> bytes:
74
+ return self.data.encode("utf-8")
75
+
76
+ def get_filename(self, fullname: str) -> str:
77
+ return "<not a real path>/" + fullname + ".py"
78
+
79
+
80
+ @dataclass
81
+ class FunctionWithRequirementsStr:
82
+ func: str
83
+ _compiled_func: Callable[..., Any]
84
+ _func_name: str
85
+ python_packages: list[str] = field(default_factory=list)
86
+ global_imports: list[Import] = field(default_factory=list)
87
+
88
+ def __init__(self, func: str, python_packages: list[str] = [], global_imports: list[Import] = []):
89
+ self.func = func
90
+ self.python_packages = python_packages
91
+ self.global_imports = global_imports
92
+
93
+ module_name = "func_module"
94
+ loader = _StringLoader(func)
95
+ spec = importlib.util.spec_from_loader(module_name, loader)
96
+ if spec is None:
97
+ raise ValueError("Could not create spec")
98
+ module = importlib.util.module_from_spec(spec)
99
+ if spec.loader is None:
100
+ raise ValueError("Could not create loader")
101
+
102
+ try:
103
+ spec.loader.exec_module(module)
104
+ except Exception as e:
105
+ raise ValueError(f"Could not compile function: {e}") from e
106
+
107
+ functions = inspect.getmembers(module, inspect.isfunction)
108
+ if len(functions) != 1:
109
+ raise ValueError("The string must contain exactly one function")
110
+
111
+ self._func_name, self._compiled_func = functions[0]
112
+
113
+ def __call__(self, *args: Any, **kwargs: Any) -> None:
114
+ raise NotImplementedError("String based function with requirement objects are not directly callable")
115
+
116
+
117
+ @dataclass
118
+ class FunctionWithRequirements(Generic[T, P]):
119
+ func: Callable[P, T]
120
+ python_packages: list[str] = field(default_factory=list)
121
+ global_imports: list[Import] = field(default_factory=list)
122
+
123
+ @classmethod
124
+ def from_callable(
125
+ cls, func: Callable[P, T], python_packages: list[str] = [], global_imports: list[Import] = []
126
+ ) -> "FunctionWithRequirements[T, P]":
127
+ return cls(python_packages=python_packages, global_imports=global_imports, func=func)
128
+
129
+ @staticmethod
130
+ def from_str(
131
+ func: str, python_packages: list[str] = [], global_imports: list[Import] = []
132
+ ) -> FunctionWithRequirementsStr:
133
+ return FunctionWithRequirementsStr(func=func, python_packages=python_packages, global_imports=global_imports)
134
+
135
+ # Type this based on F
136
+ def __call__(self, *args: P.args, **kwargs: P.kwargs) -> T:
137
+ return self.func(*args, **kwargs)
138
+
139
+
140
+ def with_requirements(
141
+ python_packages: list[str] = [], global_imports: list[Import] = []
142
+ ) -> Callable[[Callable[P, T]], FunctionWithRequirements[T, P]]:
143
+ """Decorate a function with package and import requirements
144
+
145
+ Args:
146
+ python_packages (List[str], optional): Packages required to function. Can include version info.. Defaults to [].
147
+ global_imports (List[Import], optional): Required imports. Defaults to [].
148
+
149
+ Returns:
150
+ Callable[[Callable[P, T]], FunctionWithRequirements[T, P]]: The decorated function
151
+ """
152
+
153
+ def wrapper(func: Callable[P, T]) -> FunctionWithRequirements[T, P]:
154
+ func_with_reqs = FunctionWithRequirements(
155
+ python_packages=python_packages, global_imports=global_imports, func=func
156
+ )
157
+
158
+ functools.update_wrapper(func_with_reqs, func)
159
+ return func_with_reqs
160
+
161
+ return wrapper
162
+
163
+
164
+ def _build_python_functions_file(
165
+ funcs: list[FunctionWithRequirements[Any, P] | Callable[..., Any] | FunctionWithRequirementsStr],
166
+ ) -> str:
167
+ # First collect all global imports
168
+ global_imports: set[str] = set()
169
+ for func in funcs:
170
+ if isinstance(func, (FunctionWithRequirements, FunctionWithRequirementsStr)):
171
+ global_imports.update(map(_import_to_str, func.global_imports))
172
+
173
+ content = "\n".join(global_imports) + "\n\n"
174
+
175
+ for func in funcs:
176
+ content += _to_code(func) + "\n\n"
177
+
178
+ return content
179
+
180
+
181
+ def to_stub(func: Callable[..., Any] | FunctionWithRequirementsStr) -> str:
182
+ """Generate a stub for a function as a string
183
+
184
+ Args:
185
+ func (Callable[..., Any]): The function to generate a stub for
186
+
187
+ Returns:
188
+ str: The stub for the function
189
+ """
190
+ if isinstance(func, FunctionWithRequirementsStr):
191
+ return to_stub(func._compiled_func)
192
+
193
+ content = f"def {func.__name__}{inspect.signature(func)}:\n"
194
+ docstring = func.__doc__
195
+
196
+ if docstring:
197
+ docstring = dedent(docstring)
198
+ docstring = '"""' + docstring + '"""'
199
+ docstring = indent(docstring, " ")
200
+ content += docstring + "\n"
201
+
202
+ content += " ..."
203
+ return content
@@ -0,0 +1,23 @@
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
+ # Original portions of this file are derived from https://github.com/microsoft/autogen under the MIT License.
6
+ # SPDX-License-Identifier: MIT
7
+
8
+ from .base import JupyterConnectable, JupyterConnectionInfo
9
+ from .docker_jupyter_server import DockerJupyterServer
10
+ from .embedded_ipython_code_executor import EmbeddedIPythonCodeExecutor
11
+ from .jupyter_client import JupyterClient
12
+ from .jupyter_code_executor import JupyterCodeExecutor
13
+ from .local_jupyter_server import LocalJupyterServer
14
+
15
+ __all__ = [
16
+ "DockerJupyterServer",
17
+ "EmbeddedIPythonCodeExecutor",
18
+ "JupyterClient",
19
+ "JupyterCodeExecutor",
20
+ "JupyterConnectable",
21
+ "JupyterConnectionInfo",
22
+ "LocalJupyterServer",
23
+ ]