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,301 @@
1
+ # Copyright (c) 2023 - 2025, AG2ai, Inc., AG2ai open-source projects maintainers and core contributors
2
+ #
3
+ # SPDX-License-Identifier: Apache-2.0
4
+
5
+ import logging
6
+ import os
7
+ from collections.abc import Sequence
8
+ from pathlib import Path
9
+ from typing import TYPE_CHECKING, Any, Optional
10
+
11
+ from pydantic import BaseModel
12
+
13
+ from ....doc_utils import export_module
14
+ from ....import_utils import optional_import_block, require_optional_import
15
+
16
+ with optional_import_block():
17
+ import chromadb
18
+ from chromadb.api.models.Collection import Collection
19
+ from chromadb.api.types import EmbeddingFunction
20
+ from chromadb.utils.embedding_functions import DefaultEmbeddingFunction
21
+ from llama_index.core import SimpleDirectoryReader, StorageContext, VectorStoreIndex
22
+ from llama_index.core.llms import LLM
23
+ from llama_index.core.query_engine import CitationQueryEngine
24
+ from llama_index.core.schema import Document as LlamaDocument
25
+ from llama_index.core.schema import NodeWithScore
26
+ from llama_index.llms.openai import OpenAI
27
+ from llama_index.vector_stores.chroma import ChromaVectorStore
28
+
29
+ __all__ = ["VectorChromaCitationQueryEngine", "VectorChromaQueryEngine"]
30
+
31
+ DEFAULT_COLLECTION_NAME = "docling-parsed-docs"
32
+ EMPTY_RESPONSE_TEXT = "Empty Response" # Indicates that the query did not return any results
33
+ EMPTY_RESPONSE_REPLY = "Sorry, I couldn't find any information on that. If you haven't ingested any documents, please try that." # Default response for queries without results
34
+
35
+ # Set up logging
36
+ logging.basicConfig(level=logging.INFO)
37
+ logging.getLogger("httpx").setLevel(logging.WARNING)
38
+ logger = logging.getLogger(__name__)
39
+
40
+
41
+ @require_optional_import(["chromadb", "llama_index"], "rag")
42
+ @export_module("autogen.agents.experimental")
43
+ class VectorChromaQueryEngine:
44
+ """This engine leverages Chromadb to persist document embeddings in a named collection
45
+ and LlamaIndex's VectorStoreIndex to efficiently index and retrieve documents, and generate an answer in response
46
+ to natural language queries. The Chromadb collection serves as the storage layer, while
47
+ the collection name uniquely identifies the set of documents within the persistent database.
48
+
49
+ This implements the autogen.agentchat.contrib.rag.RAGQueryEngine protocol.
50
+ """
51
+
52
+ def __init__( # type: ignore[no-any-unimported]
53
+ self,
54
+ db_path: str | None = None,
55
+ embedding_function: "EmbeddingFunction[Any] | None" = None,
56
+ metadata: dict[str, Any] | None = None,
57
+ llm: Optional["LLM"] = None,
58
+ collection_name: str | None = None,
59
+ ) -> None:
60
+ """Initializes the VectorChromaQueryEngine with db_path, metadata, and embedding function and llm.
61
+
62
+ Args:
63
+ db_path: The file system path where Chromadb will store its persistent data.
64
+ If not specified, the default directory "./chroma" is used.
65
+ embedding_function: A callable that converts text into vector embeddings. Default embedding uses Sentence Transformers model all-MiniLM-L6-v2.
66
+ For more embeddings that ChromaDB support, please refer to [embeddings](https://docs.trychroma.com/docs/embeddings/embedding-functions)
67
+ metadata: A dictionary containing configuration parameters for the Chromadb collection.
68
+ This metadata is typically used to configure the HNSW indexing algorithm.
69
+ For more details about the default metadata, please refer to [HNSW configuration](https://cookbook.chromadb.dev/core/configuration/#hnsw-configuration)
70
+ llm: LLM model used by LlamaIndex for query processing.
71
+ You can find more supported LLMs at [LLM](https://docs.llamaindex.ai/en/stable/module_guides/models/llms/)
72
+ collection_name (str): The unique name for the Chromadb collection. If omitted, a constant name will be used. Populate this to reuse previous ingested data.
73
+ """
74
+ self.llm: LLM = llm or OpenAI(model="gpt-4o", temperature=0.0) # type: ignore[no-any-unimported]
75
+ self.embedding_function: EmbeddingFunction[Any] = embedding_function or DefaultEmbeddingFunction() # type: ignore[no-any-unimported,assignment]
76
+ self.metadata: dict[str, Any] = metadata or {
77
+ "hnsw:space": "ip",
78
+ "hnsw:construction_ef": 30,
79
+ "hnsw:M": 32,
80
+ }
81
+ self.client = chromadb.PersistentClient(path=db_path or "./chroma")
82
+ self.collection_name: str | None = collection_name
83
+
84
+ self.connect_db()
85
+
86
+ def connect_db(self, *args: Any, **kwargs: Any) -> bool:
87
+ """Establish a connection to the Chromadb database and initialize the collection."""
88
+ self.collection_name = self.collection_name or DEFAULT_COLLECTION_NAME
89
+
90
+ if self._collection_exists(self.collection_name):
91
+ logger.info(f"Using existing collection {self.collection_name} from the database.")
92
+ else:
93
+ logger.info(f"Creating new collection {self.collection_name} in the database.")
94
+
95
+ self.collection = self.client.create_collection(
96
+ name=self.collection_name,
97
+ embedding_function=self.embedding_function,
98
+ metadata=self.metadata,
99
+ get_or_create=True, # If collection already exists, get the collection
100
+ )
101
+ self.index = self._create_index(self.collection)
102
+
103
+ return True
104
+
105
+ def query(self, question: str) -> str:
106
+ """Retrieve information from indexed documents by processing a natural language query.
107
+
108
+ Args:
109
+ question: A natural language query string used to search the indexed documents.
110
+
111
+ Returns:
112
+ A string containing the response generated by LLM.
113
+ """
114
+ self.validate_query_index()
115
+ self.query_engine = self.index.as_query_engine(llm=self.llm)
116
+ response = self.query_engine.query(question)
117
+
118
+ if str(response) == EMPTY_RESPONSE_TEXT:
119
+ return EMPTY_RESPONSE_REPLY
120
+
121
+ return str(response)
122
+
123
+ def add_docs(
124
+ self,
125
+ new_doc_dir: Path | str | None = None,
126
+ new_doc_paths_or_urls: Sequence[Path | str] | None = None,
127
+ ) -> None:
128
+ """Add additional documents to the existing vector index.
129
+
130
+ Loads new Docling-parsed Markdown files from a specified directory or a list of file paths
131
+ and inserts them into the current index for future queries.
132
+
133
+ Args:
134
+ new_doc_dir: The directory path from which to load additional documents.
135
+ If provided, all eligible files in this directory are loaded.
136
+ new_doc_paths_or_urls: A list of file paths specifying additional documents to load.
137
+ Each file should be a Docling-parsed Markdown file.
138
+ """
139
+ self.validate_query_index()
140
+ new_doc_dir = new_doc_dir or ""
141
+ new_doc_paths = new_doc_paths_or_urls or []
142
+ new_docs = self._load_doc(input_dir=new_doc_dir, input_docs=new_doc_paths)
143
+ for doc in new_docs:
144
+ self.index.insert(doc)
145
+
146
+ def _load_doc( # type: ignore[no-any-unimported]
147
+ self, input_dir: Path | str | None, input_docs: Sequence[Path | str] | None
148
+ ) -> list["LlamaDocument"]:
149
+ """Load documents from a directory and/or a list of file paths.
150
+
151
+ This helper method reads Docling-parsed Markdown files using LlamaIndex's
152
+ SimpleDirectoryReader. It supports multiple file [formats]((https://docs.llamaindex.ai/en/stable/module_guides/loading/simpledirectoryreader/#supported-file-types)),
153
+ but the intended use is for documents processed by Docling.
154
+
155
+ Args:
156
+ input_dir (Optional[Union[Path, str]]): The directory containing documents to be loaded.
157
+ If provided, all files in the directory will be considered.
158
+ input_docs (Optional[list[Union[Path, str]]]): A list of individual file paths to load.
159
+ Each path must point to an existing file.
160
+
161
+ Returns:
162
+ A list of documents loaded as LlamaDocument objects.
163
+
164
+ Raises:
165
+ ValueError: If the specified directory does not exist.
166
+ ValueError: If any provided file path does not exist.
167
+ ValueError: If neither input_dir nor input_docs is provided.
168
+ """
169
+ loaded_documents = []
170
+ if input_dir:
171
+ logger.info(f"Loading docs from directory: {input_dir}")
172
+ if not os.path.exists(input_dir):
173
+ raise ValueError(f"Input directory not found: {input_dir}")
174
+ loaded_documents.extend(SimpleDirectoryReader(input_dir=input_dir).load_data())
175
+
176
+ if input_docs:
177
+ for doc in input_docs:
178
+ logger.info(f"Loading input doc: {doc}")
179
+ if not os.path.exists(doc):
180
+ raise ValueError(f"Document file not found: {doc}")
181
+ loaded_documents.extend(SimpleDirectoryReader(input_files=list(input_docs)).load_data())
182
+
183
+ if not input_dir and not input_docs:
184
+ raise ValueError("No input directory or docs provided!")
185
+
186
+ return loaded_documents
187
+
188
+ def _create_index( # type: ignore[no-any-unimported]
189
+ self, collection: "Collection"
190
+ ) -> "VectorStoreIndex":
191
+ """Build a vector index for document retrieval using a Chromadb collection.
192
+
193
+ Wraps the provided Chromadb collection into a vector store and uses LlamaIndex's
194
+ StorageContext to create a VectorStoreIndex from the collection.
195
+
196
+ Args:
197
+ collection (Collection): A Chromadb Collection object that stores the embeddings of the documents.
198
+
199
+ Returns:
200
+ A VectorStoreIndex object built from the provided collection.
201
+ """
202
+ self.vector_store = ChromaVectorStore(chroma_collection=collection)
203
+ self.storage_context = StorageContext.from_defaults(vector_store=self.vector_store)
204
+
205
+ index = VectorStoreIndex.from_vector_store(vector_store=self.vector_store, storage_context=self.storage_context)
206
+
207
+ return index
208
+
209
+ def _collection_exists(self, collection_name: str) -> bool:
210
+ """Check if a collection with the given name exists in the database.
211
+
212
+ Args:
213
+ collection_name (str): The name of the collection to check.
214
+
215
+ Returns:
216
+ True if a collection with the given name exists in the database, False otherwise.
217
+ """
218
+ existing_collections = self.client.list_collections()
219
+ return any(col == collection_name for col in existing_collections)
220
+
221
+ def get_collection_name(self) -> str:
222
+ """Get the name of the collection used by the query engine.
223
+
224
+ Returns:
225
+ The name of the collection.
226
+ """
227
+ if self.collection_name:
228
+ return self.collection_name
229
+ else:
230
+ raise ValueError("Collection name not set.")
231
+
232
+ def validate_query_index(self) -> None:
233
+ """Ensures an index exists"""
234
+ if not hasattr(self, "index"):
235
+ raise Exception("Query index is not initialized. Please ingest some documents before querying.")
236
+
237
+ def init_db(
238
+ self,
239
+ new_doc_dir: Path | str | None = None,
240
+ new_doc_paths_or_urls: Sequence[Path | str] | None = None,
241
+ *args: Any,
242
+ **kwargs: Any,
243
+ ) -> bool:
244
+ """Not required nor implemented for VectorChromaQueryEngine"""
245
+ raise NotImplementedError("Method, init_db, not required nor implemented for VectorChromaQueryEngine")
246
+
247
+
248
+ class AnswerWithCitations(BaseModel): # type: ignore[no-any-unimported]
249
+ answer: str
250
+ citations: list["NodeWithScore"] # type: ignore[no-any-unimported]
251
+
252
+
253
+ @require_optional_import(["chromadb", "llama_index"], "rag")
254
+ @export_module("autogen.agents.experimental")
255
+ class VectorChromaCitationQueryEngine(VectorChromaQueryEngine):
256
+ """This engine leverages VectorChromaQueryEngine and CitationQueryEngine to answer queries with citations."""
257
+
258
+ def __init__( # type: ignore[no-any-unimported]
259
+ self,
260
+ db_path: str | None = None,
261
+ embedding_function: "EmbeddingFunction[Any] | None" = None,
262
+ metadata: dict[str, Any] | None = None,
263
+ llm: Optional["LLM"] = None,
264
+ collection_name: str | None = None,
265
+ enable_query_citations: bool = False,
266
+ citation_chunk_size: int = 512,
267
+ ) -> None:
268
+ """See parent class VectorChromaQueryEngine."""
269
+ super().__init__(db_path, embedding_function, metadata, llm, collection_name)
270
+ self.enable_query_citations = enable_query_citations
271
+ self.citation_chunk_size = citation_chunk_size
272
+
273
+ def query_with_citations(self, query: str) -> AnswerWithCitations:
274
+ """Query the index with the given query and return the answer along with citations.
275
+
276
+ Args:
277
+ query (str): The query to be answered.
278
+ citation_chunk_size (int): The size of chunks to use for each citation. Default is 512.
279
+
280
+ Returns:
281
+ AnswerWithCitations: An object containing the answer and citations.
282
+ """
283
+ query_engine = CitationQueryEngine.from_args(
284
+ index=self.index,
285
+ citation_chunk_size=self.citation_chunk_size,
286
+ )
287
+
288
+ response = query_engine.query(query)
289
+
290
+ if hasattr(response, "response"):
291
+ return AnswerWithCitations(answer=response.response, citations=response.source_nodes)
292
+ else:
293
+ raise ValueError(f"Query response of type '{type(response)}' does not contain a response attribute.")
294
+
295
+
296
+ # mypy will fail if ChromaDBQueryEngine does not implement RAGQueryEngine protocol
297
+ if TYPE_CHECKING:
298
+ from ....agentchat.contrib.rag.query_engine import RAGQueryEngine
299
+
300
+ def _check_implement_protocol(o: VectorChromaQueryEngine) -> RAGQueryEngine:
301
+ return o
@@ -0,0 +1,113 @@
1
+ # Copyright (c) 2023 - 2025, AG2ai, Inc., AG2ai open-source projects maintainers and core contributors
2
+ #
3
+ # SPDX-License-Identifier: Apache-2.0
4
+
5
+ import logging
6
+ from pathlib import Path
7
+ from typing import Literal
8
+
9
+ from .... import ConversableAgent
10
+ from ....agentchat.contrib.rag.query_engine import RAGQueryEngine
11
+ from ....agentchat.group.context_variables import ContextVariables
12
+ from ....agentchat.group.reply_result import ReplyResult
13
+ from ....agentchat.group.targets.transition_target import AgentNameTarget
14
+ from ....doc_utils import export_module
15
+ from ....llm_config import LLMConfig
16
+ from ..document_agent.parser_utils import docling_parse_docs
17
+ from .chroma_query_engine import VectorChromaQueryEngine
18
+ from .document_utils import preprocess_path
19
+
20
+ __all__ = ["DoclingDocIngestAgent"]
21
+
22
+ logger = logging.getLogger(__name__)
23
+
24
+ DOCLING_PARSE_TOOL_NAME = "docling_parse_docs"
25
+
26
+ DEFAULT_DOCLING_PARSER_PROMPT = f"""
27
+ You are an expert in parsing and understanding text. You can use {DOCLING_PARSE_TOOL_NAME} tool to parse various documents and extract information from them. You can only use the tool once per turn.
28
+ """
29
+
30
+
31
+ @export_module("autogen.agents.experimental")
32
+ class DoclingDocIngestAgent(ConversableAgent):
33
+ """A DoclingDocIngestAgent is a swarm agent that ingests documents using the docling_parse_docs tool."""
34
+
35
+ def __init__(
36
+ self,
37
+ name: str | None = None,
38
+ llm_config: LLMConfig | dict | Literal[False] | None = None, # type: ignore[type-arg]
39
+ parsed_docs_path: Path | str | None = None,
40
+ query_engine: RAGQueryEngine | None = None,
41
+ return_agent_success: str = "TaskManagerAgent",
42
+ return_agent_error: str = "ErrorManagerAgent",
43
+ collection_name: str | None = None,
44
+ ):
45
+ """Initialize the DoclingDocIngestAgent.
46
+
47
+ Args:
48
+ name: The name of the DoclingDocIngestAgent.
49
+ llm_config: The configuration for the LLM.
50
+ parsed_docs_path: The path where parsed documents will be stored.
51
+ query_engine: The VectorChromaQueryEngine to use for querying documents.
52
+ return_agent_success: The agent to return on successful completion of the task.
53
+ return_agent_error: The agent to return on error.
54
+ collection_name: The unique name for the Chromadb collection. Set this to a value to reuse a collection. If a query_engine is provided, this will be ignored.
55
+ """
56
+ name = name or "DoclingDocIngestAgent"
57
+
58
+ parsed_docs_path = parsed_docs_path or Path("./parsed_docs")
59
+ parsed_docs_path = preprocess_path(str_or_path=parsed_docs_path, mk_path=True)
60
+
61
+ self._query_engine = query_engine or VectorChromaQueryEngine(collection_name=collection_name)
62
+
63
+ def data_ingest_task(context_variables: ContextVariables) -> ReplyResult:
64
+ """A tool for Swarm agent to ingests documents using the docling_parse_docs to parse documents to markdown
65
+ and add them to the docling_query_engine.
66
+
67
+ Args:
68
+ context_variables (ContextVariables): The context variables for the task.
69
+
70
+ Returns:
71
+ ReplyResult: The result of the task.
72
+ """
73
+ try:
74
+ input_file_path = ""
75
+ tasks = context_variables.get("DocumentsToIngest", [])
76
+ while tasks:
77
+ task = tasks.pop()
78
+ input_file_path = task.path_or_url
79
+ output_files = docling_parse_docs(
80
+ input_file_path=input_file_path, output_dir_path=parsed_docs_path, output_formats=["markdown"]
81
+ )
82
+
83
+ # Limit to one output markdown file for now.
84
+ if output_files:
85
+ output_file = output_files[0]
86
+ if output_file.suffix == ".md":
87
+ self._query_engine.add_docs(new_doc_paths_or_urls=[output_file])
88
+
89
+ # Keep track of documents ingested
90
+ context_variables["DocumentsIngested"].append(input_file_path)
91
+
92
+ context_variables["CompletedTaskCount"] += 1
93
+ logger.info(f"data_ingest_task context_variables: {context_variables.to_dict()}")
94
+
95
+ except Exception as e:
96
+ return ReplyResult(
97
+ target=AgentNameTarget(agent_name=return_agent_error),
98
+ message=f"Data Ingestion Task Failed, Error {e}: '{input_file_path}'",
99
+ context_variables=context_variables,
100
+ )
101
+
102
+ return ReplyResult(
103
+ target=AgentNameTarget(agent_name=return_agent_success),
104
+ message=f"Data Ingestion Task Completed for {input_file_path}",
105
+ context_variables=context_variables,
106
+ )
107
+
108
+ super().__init__(
109
+ name=name,
110
+ llm_config=llm_config,
111
+ functions=[data_ingest_task],
112
+ system_message=DEFAULT_DOCLING_PARSER_PROMPT,
113
+ )