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,475 @@
1
+ # Copyright (c) 2023 - 2025, AG2ai, Inc., AG2ai open-source projects maintainers and core contributors
2
+ #
3
+ # SPDX-License-Identifier: Apache-2.0
4
+
5
+
6
+ import argparse
7
+ import concurrent.futures
8
+ import functools
9
+ import json
10
+ import os
11
+ import shutil
12
+ import signal
13
+ import subprocess
14
+ import sys
15
+ import tempfile
16
+ import threading
17
+ import time
18
+ from collections.abc import Callable
19
+ from dataclasses import dataclass
20
+ from functools import lru_cache
21
+ from pathlib import Path
22
+ from typing import Any, TypeVar
23
+
24
+ from ..import_utils import optional_import_block, require_optional_import
25
+
26
+ with optional_import_block():
27
+ import nbformat
28
+ from nbclient.client import NotebookClient
29
+ from nbclient.exceptions import (
30
+ CellExecutionError,
31
+ CellTimeoutError,
32
+ )
33
+ from nbformat import NotebookNode
34
+ from termcolor import colored
35
+
36
+
37
+ # Notebook execution based on nbmake: https://github.com/treebeardtech/nbmakes
38
+ @dataclass
39
+ class NotebookError:
40
+ error_name: str
41
+ error_value: str | None
42
+ traceback: str
43
+ cell_source: str
44
+
45
+
46
+ @dataclass
47
+ class NotebookSkip:
48
+ reason: str
49
+
50
+
51
+ NB_VERSION = 4
52
+
53
+
54
+ class Result:
55
+ def __init__(self, returncode: int, stdout: str, stderr: str):
56
+ self.returncode = returncode
57
+ self.stdout = stdout
58
+ self.stderr = stderr
59
+
60
+
61
+ def path(path_str: str) -> Path:
62
+ """Return a Path object."""
63
+ return Path(path_str)
64
+
65
+
66
+ @lru_cache
67
+ def check_quarto_bin(quarto_bin: str = "quarto") -> bool:
68
+ """Check if quarto is installed."""
69
+ try:
70
+ version_str = subprocess.check_output([quarto_bin, "--version"], text=True).strip()
71
+ version = tuple(map(int, version_str.split(".")))
72
+ return version >= (1, 5, 23)
73
+
74
+ except FileNotFoundError:
75
+ return False
76
+
77
+
78
+ C = TypeVar("C", bound=Callable[..., Any])
79
+
80
+
81
+ def require_quarto_bin(f: C) -> C:
82
+ """Decorator to skip a function if quarto is not installed."""
83
+ if check_quarto_bin():
84
+ return f
85
+ else:
86
+
87
+ @functools.wraps(f)
88
+ def wrapper(*args: Any, **kwargs: Any) -> Any:
89
+ return ImportError("Quarto is not installed")
90
+
91
+ return wrapper # type: ignore[return-value]
92
+
93
+
94
+ def load_metadata(notebook: Path) -> dict[str, dict[str, str | list[str] | None]]:
95
+ content = json.load(notebook.open(encoding="utf-8"))
96
+ metadata: dict[str, dict[str, str | list[str] | None]] = content.get("metadata", {})
97
+ return metadata
98
+
99
+
100
+ def skip_reason_or_none_if_ok(notebook: Path) -> str | None | dict[str, Any]:
101
+ """Return a reason to skip the notebook, or None if it should not be skipped."""
102
+ if notebook.suffix != ".ipynb":
103
+ return "not a notebook"
104
+
105
+ if not notebook.exists():
106
+ return "file does not exist"
107
+
108
+ # Extra checks for notebooks in the notebook directory
109
+ if "notebook" not in notebook.parts:
110
+ return None
111
+
112
+ with open(notebook, encoding="utf-8") as f:
113
+ content = f.read()
114
+
115
+ # Load the json and get the first cell
116
+ json_content = json.loads(content)
117
+ first_cell = json_content["cells"][0]
118
+
119
+ # <!-- and --> must exists on lines on their own
120
+ if first_cell["cell_type"] == "markdown" and first_cell["source"][0].strip() == "<!--":
121
+ raise ValueError(
122
+ f"Error in {notebook.resolve()!s} - Front matter should be defined in the notebook metadata now."
123
+ )
124
+
125
+ metadata = load_metadata(notebook)
126
+
127
+ if "skip_render" in metadata:
128
+ return metadata["skip_render"]
129
+
130
+ if "front_matter" not in metadata:
131
+ return "front matter missing from notebook metadata ⚠️"
132
+
133
+ front_matter = metadata["front_matter"]
134
+
135
+ if "tags" not in front_matter:
136
+ return "tags is not in front matter"
137
+
138
+ if "description" not in front_matter:
139
+ return "description is not in front matter"
140
+
141
+ # Make sure tags is a list of strings
142
+ if front_matter["tags"] is not None and not all(isinstance(tag, str) for tag in front_matter["tags"]):
143
+ return "tags must be a list of strings"
144
+
145
+ # Make sure description is a string
146
+ if not isinstance(front_matter["description"], str):
147
+ return "description must be a string"
148
+
149
+ return None
150
+
151
+
152
+ def extract_title(notebook: Path) -> str | None:
153
+ """Extract the title of the notebook."""
154
+ with open(notebook, encoding="utf-8") as f:
155
+ content = f.read()
156
+
157
+ # Load the json and get the first cell
158
+ json_content = json.loads(content)
159
+ first_cell = json_content["cells"][0]
160
+
161
+ # find the # title
162
+ for line in first_cell["source"]:
163
+ if line.startswith("# "):
164
+ title: str = line[2:].strip()
165
+ # Strip off the { if it exists
166
+ if "{" in title:
167
+ title = title[: title.find("{")].strip()
168
+ return title
169
+
170
+ return None
171
+
172
+
173
+ def start_thread_to_terminate_when_parent_process_dies(ppid: int) -> None:
174
+ pid = os.getpid()
175
+
176
+ def f() -> None:
177
+ while True:
178
+ try:
179
+ os.kill(ppid, 0)
180
+ except OSError:
181
+ os.kill(pid, signal.SIGTERM)
182
+ time.sleep(1)
183
+
184
+ thread = threading.Thread(target=f, daemon=True)
185
+ thread.start()
186
+
187
+
188
+ @require_optional_import("termcolor", "docs")
189
+ def fmt_skip(notebook: Path, reason: str) -> str:
190
+ return f"{colored('[Skip]', 'yellow')} {colored(notebook.name, 'blue')}: {reason}"
191
+
192
+
193
+ @require_optional_import("termcolor", "docs")
194
+ def fmt_ok(notebook: Path) -> str:
195
+ return f"{colored('[OK]', 'green')} {colored(notebook.name, 'blue')} ✅"
196
+
197
+
198
+ @require_optional_import("termcolor", "docs")
199
+ def fmt_error(notebook: Path, error: NotebookError | str) -> str:
200
+ if isinstance(error, str):
201
+ return f"{colored('[Error]', 'red')} {colored(notebook.name, 'blue')}: {error}"
202
+ elif isinstance(error, NotebookError):
203
+ return f"{colored('[Error]', 'red')} {colored(notebook.name, 'blue')}: {error.error_name} - {error.error_value}"
204
+ else:
205
+ raise ValueError("error must be a string or a NotebookError")
206
+
207
+
208
+ @require_quarto_bin
209
+ @require_optional_import("nbclient", "docs")
210
+ def test_notebook(notebook_path: Path, timeout: int = 300) -> tuple[Path, NotebookError | NotebookSkip | None]:
211
+ nb = nbformat.read(str(notebook_path), NB_VERSION) # type: ignore[arg-type,no-untyped-call]
212
+
213
+ if "skip_test" in nb.metadata:
214
+ return notebook_path, NotebookSkip(reason=nb.metadata.skip_test)
215
+
216
+ try:
217
+ c = NotebookClient(
218
+ nb,
219
+ timeout=timeout,
220
+ allow_errors=False,
221
+ record_timing=True,
222
+ )
223
+ os.environ["PYDEVD_DISABLE_FILE_VALIDATION"] = "1"
224
+ os.environ["TOKENIZERS_PARALLELISM"] = "false"
225
+ with tempfile.TemporaryDirectory() as tempdir:
226
+ c.execute(cwd=tempdir)
227
+ except CellExecutionError:
228
+ error = get_error_info(nb)
229
+ assert error is not None
230
+ return notebook_path, error
231
+ except CellTimeoutError:
232
+ error = get_timeout_info(nb)
233
+ assert error is not None
234
+ return notebook_path, error
235
+
236
+ return notebook_path, None
237
+
238
+
239
+ # Find the first code cell which did not complete.
240
+ @require_optional_import("nbclient", "docs")
241
+ def get_timeout_info(
242
+ nb: NotebookNode,
243
+ ) -> NotebookError | None:
244
+ for i, cell in enumerate(nb.cells):
245
+ if cell.cell_type != "code":
246
+ continue
247
+ if "shell.execute_reply" not in cell.metadata.execution:
248
+ return NotebookError(
249
+ error_name="timeout",
250
+ error_value="",
251
+ traceback="",
252
+ cell_source="".join(cell["source"]),
253
+ )
254
+
255
+ return None
256
+
257
+
258
+ @require_optional_import("nbclient", "docs")
259
+ def get_error_info(nb: NotebookNode) -> NotebookError | None:
260
+ for cell in nb["cells"]: # get LAST error
261
+ if cell["cell_type"] != "code":
262
+ continue
263
+ errors = [output for output in cell["outputs"] if output["output_type"] == "error" or "ename" in output]
264
+
265
+ if errors:
266
+ traceback = "\n".join(errors[0].get("traceback", ""))
267
+ return NotebookError(
268
+ error_name=errors[0].get("ename", ""),
269
+ error_value=errors[0].get("evalue", ""),
270
+ traceback=traceback,
271
+ cell_source="".join(cell["source"]),
272
+ )
273
+ return None
274
+
275
+
276
+ def collect_notebooks(notebook_directory: Path, website_build_directory: Path) -> list[Path]:
277
+ notebooks = list(notebook_directory.glob("*.ipynb"))
278
+ notebooks.extend(list(website_build_directory.glob("docs/**/*.ipynb")))
279
+ return notebooks
280
+
281
+
282
+ @require_quarto_bin
283
+ @require_optional_import(["nbclient", "termcolor"], "docs")
284
+ def process_notebook(
285
+ src_notebook: Path,
286
+ website_build_directory: Path,
287
+ notebook_dir: Path,
288
+ quarto_bin: str,
289
+ dry_run: bool,
290
+ target_dir_func: Callable[[Path], Path],
291
+ post_processor: Callable[[Path, Path, dict[str, Any], Path], None] | None = None,
292
+ ) -> str:
293
+ """Process a single notebook.
294
+
295
+ Args:
296
+ src_notebook: Source notebook path
297
+ website_build_directory: Output directory
298
+ notebook_dir: Base notebooks directory
299
+ quarto_bin: Path to quarto binary
300
+ dry_run: If True, don't actually process
301
+ target_dir_func: Function to determine target directory for notebooks
302
+ post_processor: Optional callback for post-processing
303
+ """
304
+ in_notebook_dir = "notebook" in src_notebook.parts
305
+
306
+ metadata = load_metadata(src_notebook)
307
+
308
+ title = extract_title(src_notebook)
309
+ if title is None:
310
+ return fmt_error(src_notebook, "Title not found in notebook")
311
+
312
+ front_matter = {}
313
+ if "front_matter" in metadata:
314
+ front_matter = metadata["front_matter"]
315
+
316
+ front_matter["title"] = title
317
+
318
+ if in_notebook_dir:
319
+ relative_notebook = src_notebook.resolve().relative_to(notebook_dir.resolve())
320
+ dest_dir = target_dir_func(website_build_directory)
321
+ target_file = dest_dir / relative_notebook.with_suffix(".mdx")
322
+ intermediate_notebook = dest_dir / relative_notebook
323
+
324
+ # If the intermediate_notebook already exists, check if it is newer than the source file
325
+ if target_file.exists() and target_file.stat().st_mtime > src_notebook.stat().st_mtime:
326
+ return fmt_skip(src_notebook, f"target file ({target_file.name}) is newer ☑️")
327
+
328
+ if dry_run:
329
+ return colored(f"Would process {src_notebook.name}", "green")
330
+
331
+ # Copy notebook to target dir
332
+ # The reason we copy the notebook is that quarto does not support rendering from a different directory
333
+ shutil.copy(src_notebook, intermediate_notebook)
334
+
335
+ # Check if another file has to be copied too
336
+ # Solely added for the purpose of agent_library_example.json
337
+ if "extra_files_to_copy" in metadata:
338
+ for file in metadata["extra_files_to_copy"]:
339
+ shutil.copy(src_notebook.parent / file, dest_dir / file)
340
+
341
+ # Capture output
342
+ result = subprocess.run([quarto_bin, "render", intermediate_notebook], capture_output=True, text=True)
343
+ if result.returncode != 0:
344
+ return fmt_error(
345
+ src_notebook, f"Failed to render {src_notebook}\n\nstderr:\n{result.stderr}\nstdout:\n{result.stdout}"
346
+ )
347
+
348
+ # Unlink intermediate files
349
+ intermediate_notebook.unlink()
350
+ else:
351
+ target_file = src_notebook.with_suffix(".mdx")
352
+
353
+ # If the intermediate_notebook already exists, check if it is newer than the source file
354
+ if target_file.exists() and target_file.stat().st_mtime > src_notebook.stat().st_mtime:
355
+ return fmt_skip(src_notebook, f"target file ({target_file.name}) is newer ☑️")
356
+
357
+ if dry_run:
358
+ return colored(f"Would process {src_notebook.name}", "green")
359
+
360
+ result = subprocess.run([quarto_bin, "render", src_notebook], capture_output=True, text=True)
361
+ if result.returncode != 0:
362
+ return fmt_error(
363
+ src_notebook, f"Failed to render {src_notebook}\n\nstderr:\n{result.stderr}\nstdout:\n{result.stdout}"
364
+ )
365
+
366
+ # Use post-processor if provided
367
+ if post_processor and not dry_run:
368
+ post_processor(target_file, src_notebook, front_matter, website_build_directory)
369
+
370
+ return fmt_ok(src_notebook)
371
+
372
+
373
+ def create_base_argument_parser() -> argparse.ArgumentParser:
374
+ """Create the base argument parser with common options."""
375
+ parser = argparse.ArgumentParser()
376
+ subparsers = parser.add_subparsers(dest="subcommand")
377
+
378
+ parser.add_argument(
379
+ "--notebook-directory",
380
+ type=path,
381
+ help="Directory containing notebooks to process",
382
+ )
383
+ parser.add_argument("--website-build-directory", type=path, help="Root directory of website build")
384
+ parser.add_argument("--force", help="Force re-rendering of all notebooks", action="store_true", default=False)
385
+
386
+ render_parser = subparsers.add_parser("render")
387
+ render_parser.add_argument("--quarto-bin", help="Path to quarto binary", default="quarto")
388
+ render_parser.add_argument("--dry-run", help="Don't render", action="store_true")
389
+ render_parser.add_argument("notebooks", type=path, nargs="*", default=None)
390
+
391
+ test_parser = subparsers.add_parser("test")
392
+ test_parser.add_argument("--timeout", help="Timeout for each notebook", type=int, default=60)
393
+ test_parser.add_argument("--exit-on-first-fail", "-e", help="Exit after first test fail", action="store_true")
394
+ test_parser.add_argument("notebooks", type=path, nargs="*", default=None)
395
+ test_parser.add_argument("--workers", help="Number of workers to use", type=int, default=-1)
396
+
397
+ return parser
398
+
399
+
400
+ def process_notebooks_core(
401
+ args: argparse.Namespace,
402
+ post_process_func: Callable[[Path, Path, dict[str, Any], Path], None] | None,
403
+ target_dir_func: Callable[[Path], Path],
404
+ ) -> list[Path]:
405
+ """Core logic for processing notebooks shared across build systems.
406
+
407
+ Args:
408
+ args: Command line arguments
409
+ post_process_func: Function for post-processing rendered notebooks
410
+ target_dir_func: Function to determine target directory for notebooks
411
+ """
412
+ collected_notebooks = (
413
+ args.notebooks if args.notebooks else collect_notebooks(args.notebook_directory, args.website_build_directory)
414
+ )
415
+
416
+ filtered_notebooks = []
417
+ for notebook in collected_notebooks:
418
+ reason = skip_reason_or_none_if_ok(notebook)
419
+ if reason and isinstance(reason, str):
420
+ print(fmt_skip(notebook, reason))
421
+ else:
422
+ filtered_notebooks.append(notebook)
423
+
424
+ if args.subcommand == "test":
425
+ if args.workers == -1:
426
+ args.workers = None
427
+ failure = False
428
+ with concurrent.futures.ProcessPoolExecutor(
429
+ max_workers=args.workers,
430
+ initializer=start_thread_to_terminate_when_parent_process_dies,
431
+ initargs=(os.getpid(),),
432
+ ) as executor:
433
+ futures = [executor.submit(test_notebook, f, args.timeout) for f in filtered_notebooks]
434
+ for future in concurrent.futures.as_completed(futures):
435
+ notebook, optional_error_or_skip = future.result()
436
+ if isinstance(optional_error_or_skip, NotebookError):
437
+ if optional_error_or_skip.error_name == "timeout":
438
+ print(fmt_error(notebook, optional_error_or_skip.error_name))
439
+ else:
440
+ print("-" * 80)
441
+ print(fmt_error(notebook, optional_error_or_skip))
442
+ print(optional_error_or_skip.traceback)
443
+ print("-" * 80)
444
+ if args.exit_on_first_fail:
445
+ sys.exit(1)
446
+ failure = True
447
+ elif isinstance(optional_error_or_skip, NotebookSkip):
448
+ print(fmt_skip(notebook, optional_error_or_skip.reason))
449
+ else:
450
+ print(fmt_ok(notebook))
451
+
452
+ if failure:
453
+ sys.exit(1)
454
+
455
+ elif args.subcommand == "render":
456
+ check_quarto_bin(args.quarto_bin)
457
+
458
+ target_dir = target_dir_func(args.website_build_directory)
459
+ if not target_dir.exists():
460
+ target_dir.mkdir(parents=True)
461
+
462
+ for notebook in filtered_notebooks:
463
+ print(
464
+ process_notebook(
465
+ notebook,
466
+ args.website_build_directory,
467
+ args.notebook_directory,
468
+ args.quarto_bin,
469
+ args.dry_run,
470
+ target_dir_func,
471
+ post_process_func,
472
+ )
473
+ )
474
+
475
+ return filtered_notebooks