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,405 @@
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 json
9
+ import time
10
+ from collections.abc import Callable
11
+ from datetime import timedelta
12
+ from typing import Any, Literal, Optional
13
+
14
+ from ....import_utils import optional_import_block, require_optional_import
15
+ from .base import Document, ItemID, QueryResults, VectorDB
16
+ from .utils import get_logger
17
+
18
+ with optional_import_block():
19
+ import numpy as np
20
+ from couchbase import search
21
+ from couchbase.auth import PasswordAuthenticator
22
+ from couchbase.cluster import Cluster, ClusterOptions
23
+ from couchbase.collection import Collection
24
+ from couchbase.management.search import SearchIndex
25
+ from couchbase.options import SearchOptions
26
+ from couchbase.vector_search import VectorQuery, VectorSearch
27
+ from sentence_transformers import SentenceTransformer
28
+
29
+
30
+ logger = get_logger(__name__)
31
+
32
+ DEFAULT_BATCH_SIZE = 1000
33
+ _SAMPLE_SENTENCE = ["The weather is lovely today in paradise."]
34
+ TEXT_KEY = "content"
35
+ EMBEDDING_KEY = "embedding"
36
+
37
+
38
+ @require_optional_import(["couchbase", "sentence_transformers"], "retrievechat-couchbase")
39
+ class CouchbaseVectorDB(VectorDB):
40
+ """A vector database implementation that uses Couchbase as the backend."""
41
+
42
+ def __init__(
43
+ self,
44
+ connection_string: str = "couchbase://localhost",
45
+ username: str = "Administrator",
46
+ password: str = "password",
47
+ bucket_name: str = "vector_db",
48
+ embedding_function: Callable = None,
49
+ scope_name: str = "_default",
50
+ collection_name: str = "_default",
51
+ index_name: str = None,
52
+ ):
53
+ """Initialize the vector database.
54
+
55
+ Args:
56
+ connection_string (str): The Couchbase connection string to connect to. Default is 'couchbase://localhost'.
57
+ username (str): The username for Couchbase authentication. Default is 'Administrator'.
58
+ password (str): The password for Couchbase authentication. Default is 'password'.
59
+ bucket_name (str): The name of the bucket. Default is 'vector_db'.
60
+ embedding_function (Callable): The embedding function used to generate the vector representation. Default is SentenceTransformer("all-MiniLM-L6-v2").encode.
61
+ scope_name (str): The name of the scope. Default is '_default'.
62
+ collection_name (str): The name of the collection to create for this vector database. Default is '_default'.
63
+ index_name (str): Index name for the vector database. Default is None.
64
+ overwrite (bool): Whether to overwrite existing data. Default is False.
65
+ wait_until_index_ready (float or None): Blocking call to wait until the database indexes are ready. None means no wait. Default is None.
66
+ wait_until_document_ready (float or None): Blocking call to wait until the database documents are ready. None means no wait. Default is None.
67
+ """
68
+ if embedding_function is None:
69
+ embedding_function = SentenceTransformer("all-MiniLM-L6-v2").encode
70
+ self.embedding_function = embedding_function
71
+ self.index_name = index_name
72
+
73
+ # This will get the model dimension size by computing the embeddings dimensions
74
+ self.dimensions = self._get_embedding_size()
75
+
76
+ try:
77
+ auth = PasswordAuthenticator(username, password)
78
+ cluster = Cluster(connection_string, ClusterOptions(auth))
79
+ cluster.wait_until_ready(timedelta(seconds=5))
80
+ self.cluster = cluster
81
+
82
+ self.bucket = cluster.bucket(bucket_name)
83
+ self.scope = self.bucket.scope(scope_name)
84
+ self.collection = self.scope.collection(collection_name)
85
+ self.active_collection = self.collection
86
+
87
+ logger.debug("Successfully connected to Couchbase")
88
+ except Exception as err:
89
+ raise ConnectionError("Could not connect to Couchbase server") from err
90
+
91
+ def search_index_exists(self, index_name: str):
92
+ """Check if the specified index is ready"""
93
+ try:
94
+ search_index_mgr = self.scope.search_indexes()
95
+ index = search_index_mgr.get_index(index_name)
96
+ return index.is_valid()
97
+ except Exception:
98
+ return False
99
+
100
+ def _get_embedding_size(self):
101
+ return len(self.embedding_function(_SAMPLE_SENTENCE)[0])
102
+
103
+ def create_collection(
104
+ self,
105
+ collection_name: str,
106
+ overwrite: bool = False,
107
+ get_or_create: bool = True,
108
+ ) -> "Collection":
109
+ """Create a collection in the vector database and create a vector search index in the collection.
110
+
111
+ Args:
112
+ collection_name (str): The name of the collection.
113
+ overwrite (bool): Whether to overwrite the collection if it exists. Default is False.
114
+ get_or_create (bool): Whether to get or create the collection. Default is True
115
+ """
116
+ if overwrite:
117
+ self.delete_collection(collection_name)
118
+
119
+ try:
120
+ collection_mgr = self.bucket.collections()
121
+ collection_mgr.create_collection(self.scope.name, collection_name)
122
+ self.cluster.query(f"CREATE PRIMARY INDEX ON {self.bucket.name}.{self.scope.name}.{collection_name}")
123
+
124
+ except Exception:
125
+ if not get_or_create:
126
+ raise ValueError(f"Collection {collection_name} already exists.")
127
+ else:
128
+ logger.debug(f"Collection {collection_name} already exists. Getting the collection.")
129
+
130
+ collection = self.scope.collection(collection_name)
131
+ self.create_index_if_not_exists(index_name=self.index_name, collection=collection)
132
+ return collection
133
+
134
+ def create_index_if_not_exists(
135
+ self, index_name: str = "vector_index", collection: Optional["Collection"] = None
136
+ ) -> None:
137
+ """Creates a vector search index on the specified collection in Couchbase.
138
+
139
+ Args:
140
+ index_name (str, optional): The name of the vector search index to create. Defaults to "vector_search_index".
141
+ collection (Collection, optional): The Couchbase collection to create the index on. Defaults to None.
142
+ """
143
+ if not self.search_index_exists(index_name):
144
+ self.create_vector_search_index(collection, index_name)
145
+
146
+ def get_collection(self, collection_name: str | None = None) -> "Collection":
147
+ """Get the collection from the vector database.
148
+
149
+ Args:
150
+ collection_name (str): The name of the collection. Default is None. If None, return the current active collection.
151
+
152
+ Returns:
153
+ The collection object (Collection)
154
+ """
155
+ if collection_name is None:
156
+ if self.active_collection is None:
157
+ raise ValueError("No collection is specified.")
158
+ else:
159
+ logger.debug(
160
+ f"No collection is specified. Using current active collection {self.active_collection.name}."
161
+ )
162
+ else:
163
+ self.active_collection = self.scope.collection(collection_name)
164
+
165
+ return self.active_collection
166
+
167
+ def delete_collection(self, collection_name: str) -> None:
168
+ """Delete the collection from the vector database.
169
+
170
+ Args:
171
+ collection_name (str): The name of the collection.
172
+ """
173
+ try:
174
+ collection_mgr = self.bucket.collections()
175
+ collection_mgr.drop_collection(self.scope.name, collection_name)
176
+ except Exception as e:
177
+ logger.error(f"Error deleting collection: {e}")
178
+
179
+ def create_vector_search_index(
180
+ self,
181
+ collection,
182
+ index_name: str | None = "vector_index",
183
+ similarity: Literal["l2_norm", "dot_product"] = "dot_product",
184
+ ) -> None:
185
+ """Create a vector search index in the collection."""
186
+ search_index_mgr = self.scope.search_indexes()
187
+ dims = self._get_embedding_size()
188
+ index_definition = {
189
+ "type": "fulltext-index",
190
+ "name": index_name,
191
+ "sourceType": "couchbase",
192
+ "sourceName": self.bucket.name,
193
+ "planParams": {"maxPartitionsPerPIndex": 1024, "indexPartitions": 1},
194
+ "params": {
195
+ "doc_config": {
196
+ "docid_prefix_delim": "",
197
+ "docid_regexp": "",
198
+ "mode": "scope.collection.type_field",
199
+ "type_field": "type",
200
+ },
201
+ "mapping": {
202
+ "analysis": {},
203
+ "default_analyzer": "standard",
204
+ "default_datetime_parser": "dateTimeOptional",
205
+ "default_field": "_all",
206
+ "default_mapping": {"dynamic": True, "enabled": False},
207
+ "default_type": "_default",
208
+ "docvalues_dynamic": False,
209
+ "index_dynamic": True,
210
+ "store_dynamic": True,
211
+ "type_field": "_type",
212
+ "types": {
213
+ f"{self.scope.name}.{collection.name}": {
214
+ "dynamic": False,
215
+ "enabled": True,
216
+ "properties": {
217
+ "embedding": {
218
+ "dynamic": False,
219
+ "enabled": True,
220
+ "fields": [
221
+ {
222
+ "dims": dims,
223
+ "index": True,
224
+ "name": "embedding",
225
+ "similarity": similarity,
226
+ "type": "vector",
227
+ "vector_index_optimized_for": "recall",
228
+ }
229
+ ],
230
+ },
231
+ "metadata": {"dynamic": True, "enabled": True},
232
+ "content": {
233
+ "dynamic": False,
234
+ "enabled": True,
235
+ "fields": [
236
+ {
237
+ "include_in_all": True,
238
+ "index": True,
239
+ "name": "content",
240
+ "store": True,
241
+ "type": "text",
242
+ }
243
+ ],
244
+ },
245
+ },
246
+ }
247
+ },
248
+ },
249
+ "store": {"indexType": "scorch", "segmentVersion": 16},
250
+ },
251
+ "sourceParams": {},
252
+ }
253
+
254
+ search_index_def = SearchIndex.from_json(json.dumps(index_definition))
255
+ max_attempts = 10
256
+ attempt = 0
257
+ while attempt < max_attempts:
258
+ try:
259
+ search_index_mgr.upsert_index(search_index_def)
260
+ break
261
+ except Exception as e:
262
+ logger.debug(f"Attempt {attempt + 1}/{max_attempts}: Error creating search index: {e}")
263
+ time.sleep(3)
264
+ attempt += 1
265
+
266
+ if attempt == max_attempts:
267
+ logger.error(f"Error creating search index after {max_attempts} attempts.")
268
+ raise RuntimeError(f"Error creating search index after {max_attempts} attempts.")
269
+
270
+ logger.info(f"Search index {index_name} created successfully.")
271
+
272
+ def upsert_docs(
273
+ self, docs: list[Document], collection: "Collection", batch_size: int = DEFAULT_BATCH_SIZE, **kwargs: Any
274
+ ) -> None:
275
+ if docs[0].get("content") is None:
276
+ raise ValueError("The document content is required.")
277
+ if docs[0].get("id") is None:
278
+ raise ValueError("The document id is required.")
279
+
280
+ for i in range(0, len(docs), batch_size):
281
+ batch = docs[i : i + batch_size]
282
+ docs_to_upsert = {}
283
+ for doc in batch:
284
+ doc_id = doc["id"]
285
+ embedding = self.embedding_function([
286
+ doc["content"]
287
+ ]).tolist() # Gets new embedding even in case of document update
288
+ doc_content = {
289
+ TEXT_KEY: doc["content"],
290
+ "metadata": doc.get("metadata", {}),
291
+ EMBEDDING_KEY: embedding,
292
+ "id": doc_id,
293
+ }
294
+ docs_to_upsert[doc_id] = doc_content
295
+ collection.upsert_multi(docs_to_upsert)
296
+
297
+ def insert_docs(
298
+ self,
299
+ docs: list[Document],
300
+ collection_name: str = None,
301
+ upsert: bool = False,
302
+ batch_size: int = DEFAULT_BATCH_SIZE,
303
+ **kwargs: Any,
304
+ ) -> None:
305
+ """Insert Documents and Vector Embeddings into the collection of the vector database. Documents are upserted in all cases."""
306
+ if not docs:
307
+ logger.info("No documents to insert.")
308
+ return
309
+
310
+ collection = self.get_collection(collection_name)
311
+ self.upsert_docs(docs, collection, batch_size=batch_size)
312
+
313
+ def update_docs(
314
+ self, docs: list[Document], collection_name: str = None, batch_size: int = DEFAULT_BATCH_SIZE, **kwargs: Any
315
+ ) -> None:
316
+ """Update documents, including their embeddings, in the Collection."""
317
+ collection = self.get_collection(collection_name)
318
+ self.upsert_docs(docs, collection, batch_size)
319
+
320
+ def delete_docs(
321
+ self, ids: list[ItemID], collection_name: str = None, batch_size: int = DEFAULT_BATCH_SIZE, **kwargs
322
+ ):
323
+ """Delete documents from the collection of the vector database."""
324
+ collection = self.get_collection(collection_name)
325
+ # based on batch size, delete the documents
326
+ for i in range(0, len(ids), batch_size):
327
+ batch = ids[i : i + batch_size]
328
+ collection.remove_multi(batch)
329
+
330
+ def get_docs_by_ids(
331
+ self,
332
+ ids: list[ItemID] | None = None,
333
+ collection_name: str = None,
334
+ include: list[str] | None = None,
335
+ **kwargs: Any,
336
+ ) -> list[Document]:
337
+ """Retrieve documents from the collection of the vector database based on the ids."""
338
+ if include is None:
339
+ include = [TEXT_KEY, "metadata", "id"]
340
+ elif "id" not in include:
341
+ include.append("id")
342
+
343
+ collection = self.get_collection(collection_name)
344
+ if ids is not None:
345
+ docs = [collection.get(doc_id) for doc_id in ids]
346
+ else:
347
+ # Get all documents using couchbase query
348
+ include_str = ", ".join(include)
349
+ query = f"SELECT {include_str} FROM {self.bucket.name}.{self.scope.name}.{collection.name}"
350
+ result = self.cluster.query(query)
351
+ docs = []
352
+ for row in result:
353
+ docs.append(row)
354
+
355
+ return [{k: v for k, v in doc.items() if k in include or k == "id"} for doc in docs]
356
+
357
+ def retrieve_docs(
358
+ self,
359
+ queries: list[str],
360
+ collection_name: str = None,
361
+ n_results: int = 10,
362
+ distance_threshold: float = -1,
363
+ **kwargs: Any,
364
+ ) -> QueryResults:
365
+ """Retrieve documents from the collection of the vector database based on the queries.
366
+ Note: Distance threshold is not supported in Couchbase FTS.
367
+ """
368
+ results: QueryResults = []
369
+ for query_text in queries:
370
+ query_vector = np.array(self.embedding_function([query_text])).tolist()[0]
371
+ query_result = self._vector_search(
372
+ query_vector,
373
+ n_results,
374
+ **kwargs,
375
+ )
376
+ results.append(query_result)
377
+ return results
378
+
379
+ def _vector_search(
380
+ self, embedding_vector: list[float], n_results: int = 10, **kwargs
381
+ ) -> list[tuple[dict[str, Any], float]]:
382
+ """Core vector search using Couchbase FTS."""
383
+ search_req = search.SearchRequest.create(
384
+ VectorSearch.from_vector_query(
385
+ VectorQuery(
386
+ EMBEDDING_KEY,
387
+ embedding_vector,
388
+ n_results,
389
+ )
390
+ )
391
+ )
392
+
393
+ search_options = SearchOptions(limit=n_results, fields=["*"])
394
+ result = self.scope.search(self.index_name, search_req, search_options)
395
+
396
+ docs_with_score = []
397
+
398
+ for row in result.rows():
399
+ doc = row.fields
400
+ doc["id"] = row.id
401
+ score = row.score
402
+
403
+ docs_with_score.append((doc, score))
404
+
405
+ return docs_with_score