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,320 @@
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
+ import abc
8
+ import logging
9
+ from collections.abc import Sequence
10
+ from typing import Any
11
+
12
+ from ....import_utils import optional_import_block, require_optional_import
13
+ from .base import Document, ItemID, QueryResults, VectorDB
14
+ from .utils import get_logger
15
+
16
+ with optional_import_block():
17
+ from fastembed import TextEmbedding
18
+ from qdrant_client import QdrantClient, models
19
+
20
+
21
+ logger = get_logger(__name__)
22
+
23
+ Embeddings = Sequence[float] | Sequence[int]
24
+
25
+
26
+ class EmbeddingFunction(abc.ABC):
27
+ @abc.abstractmethod
28
+ def __call__(self, inputs: list[str]) -> list[Embeddings]:
29
+ raise NotImplementedError
30
+
31
+
32
+ @require_optional_import("fastembed", "retrievechat-qdrant")
33
+ class FastEmbedEmbeddingFunction(EmbeddingFunction):
34
+ """Embedding function implementation using FastEmbed - https://qdrant.github.io/fastembed."""
35
+
36
+ def __init__(
37
+ self,
38
+ model_name: str = "BAAI/bge-small-en-v1.5",
39
+ batch_size: int = 256,
40
+ cache_dir: str | None = None,
41
+ threads: int | None = None,
42
+ parallel: int | None = None,
43
+ **kwargs: Any,
44
+ ):
45
+ """Initialize fastembed.TextEmbedding.
46
+
47
+ Args:
48
+ model_name (str): The name of the model to use. Defaults to `"BAAI/bge-small-en-v1.5"`.
49
+ batch_size (int): Batch size for encoding. Higher values will use more memory, but be faster.\
50
+ Defaults to 256.
51
+ cache_dir (str, optional): The path to the model cache directory.\
52
+ Can also be set using the `FASTEMBED_CACHE_PATH` env variable.
53
+ threads (int, optional): The number of threads single onnxruntime session can use.
54
+ parallel (int, optional): If `>1`, data-parallel encoding will be used, recommended for large datasets.\
55
+ If `0`, use all available cores.\
56
+ If `None`, don't use data-parallel processing, use default onnxruntime threading.\
57
+ Defaults to None.
58
+ **kwargs: Additional options to pass to fastembed.TextEmbedding
59
+ Raises:
60
+ ValueError: If the model_name is not in the format `<org>/<model>` e.g. BAAI/bge-small-en-v1.5.
61
+ """
62
+ self._batch_size = batch_size
63
+ self._parallel = parallel
64
+ self._model = TextEmbedding(model_name=model_name, cache_dir=cache_dir, threads=threads, **kwargs)
65
+
66
+ def __call__(self, inputs: list[str]) -> list[Embeddings]:
67
+ embeddings = self._model.embed(inputs, batch_size=self._batch_size, parallel=self._parallel)
68
+
69
+ return [embedding.tolist() for embedding in embeddings]
70
+
71
+
72
+ @require_optional_import("qdrant_client", "retrievechat-qdrant")
73
+ class QdrantVectorDB(VectorDB):
74
+ """A vector database implementation that uses Qdrant as the backend."""
75
+
76
+ def __init__(
77
+ self,
78
+ *,
79
+ client=None,
80
+ embedding_function: EmbeddingFunction = None,
81
+ content_payload_key: str = "_content",
82
+ metadata_payload_key: str = "_metadata",
83
+ collection_options: dict = {},
84
+ **kwargs: Any,
85
+ ) -> None:
86
+ """Initialize the vector database.
87
+
88
+ Args:
89
+ client: An instance of QdrantClient.
90
+ embedding_function: The embedding function used to generate the vector representation
91
+ of the documents. Defaults to FastEmbedEmbeddingFunction.
92
+ content_payload_key: The key to use for the content payload. Default is "_content".
93
+ metadata_payload_key: The key to use for the metadata payload. Default is "_metadata".
94
+ collection_options: The options for creating the collection.
95
+ **kwargs: Additional keyword arguments.
96
+ """
97
+ self.client: QdrantClient = client or QdrantClient(location=":memory:")
98
+ self.embedding_function = embedding_function or FastEmbedEmbeddingFunction()
99
+ self.collection_options = collection_options
100
+ self.content_payload_key = content_payload_key
101
+ self.metadata_payload_key = metadata_payload_key
102
+ self.type = "qdrant"
103
+
104
+ def create_collection(self, collection_name: str, overwrite: bool = False, get_or_create: bool = True) -> None:
105
+ """Create a collection in the vector database.
106
+ Case 1. if the collection does not exist, create the collection.
107
+ Case 2. the collection exists, if overwrite is True, it will overwrite the collection.
108
+ Case 3. the collection exists and overwrite is False, if get_or_create is True, it will get the collection,
109
+ otherwise it raise a ValueError.
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 the collection if it exists. Default is True.
115
+
116
+ Returns:
117
+ Any | The collection object.
118
+ """
119
+ embeddings_size = len(self.embedding_function(["test"])[0])
120
+
121
+ if self.client.collection_exists(collection_name) and overwrite:
122
+ self.client.delete_collection(collection_name)
123
+
124
+ if not self.client.collection_exists(collection_name):
125
+ self.client.create_collection(
126
+ collection_name,
127
+ vectors_config=models.VectorParams(size=embeddings_size, distance=models.Distance.COSINE),
128
+ **self.collection_options,
129
+ )
130
+ elif not get_or_create:
131
+ raise ValueError(f"Collection {collection_name} already exists.")
132
+
133
+ def get_collection(self, collection_name: str = None):
134
+ """Get the collection from the vector database.
135
+
136
+ Args:
137
+ collection_name: str | The name of the collection.
138
+
139
+ Returns:
140
+ Any | The collection object.
141
+ """
142
+ if collection_name is None:
143
+ raise ValueError("The collection name is required.")
144
+
145
+ return self.client.get_collection(collection_name)
146
+
147
+ def delete_collection(self, collection_name: str) -> None:
148
+ """Delete the collection from the vector database.
149
+
150
+ Args:
151
+ collection_name: str | The name of the collection.
152
+
153
+ Returns:
154
+ Any
155
+ """
156
+ return self.client.delete_collection(collection_name)
157
+
158
+ def insert_docs(self, docs: list[Document], collection_name: str = None, upsert: bool = False) -> None:
159
+ """Insert documents into the collection of the vector database.
160
+
161
+ Args:
162
+ docs: List[Document] | A list of documents. Each document is a TypedDict `Document`.
163
+ collection_name: str | The name of the collection. Default is None.
164
+ upsert: bool | Whether to update the document if it exists. Default is False.
165
+ kwargs: Dict | Additional keyword arguments.
166
+
167
+ Returns:
168
+ None
169
+ """
170
+ if not docs:
171
+ return
172
+ if any(doc.get("content") is None for doc in docs):
173
+ raise ValueError("The document content is required.")
174
+ if any(doc.get("id") is None for doc in docs):
175
+ raise ValueError("The document id is required.")
176
+
177
+ if not upsert and not self._validate_upsert_ids(collection_name, [doc["id"] for doc in docs]):
178
+ logger.log("Some IDs already exist. Skipping insert", level=logging.WARN)
179
+
180
+ self.client.upsert(collection_name, points=self._documents_to_points(docs))
181
+
182
+ def update_docs(self, docs: list[Document], collection_name: str = None) -> None:
183
+ if not docs:
184
+ return
185
+ if any(doc.get("id") is None for doc in docs):
186
+ raise ValueError("The document id is required.")
187
+ if any(doc.get("content") is None for doc in docs):
188
+ raise ValueError("The document content is required.")
189
+ if self._validate_update_ids(collection_name, [doc["id"] for doc in docs]):
190
+ return self.client.upsert(collection_name, points=self._documents_to_points(docs))
191
+
192
+ raise ValueError("Some IDs do not exist. Skipping update")
193
+
194
+ def delete_docs(self, ids: list[ItemID], collection_name: str = None, **kwargs) -> None:
195
+ """Delete documents from the collection of the vector database.
196
+
197
+ Args:
198
+ ids: List[ItemID] | A list of document ids. Each id is a typed `ItemID`.
199
+ collection_name: str | The name of the collection. Default is None.
200
+ kwargs: Dict | Additional keyword arguments.
201
+
202
+ Returns:
203
+ None
204
+ """
205
+ self.client.delete(collection_name, ids)
206
+
207
+ def retrieve_docs(
208
+ self,
209
+ queries: list[str],
210
+ collection_name: str = None,
211
+ n_results: int = 10,
212
+ distance_threshold: float = 0,
213
+ **kwargs: Any,
214
+ ) -> QueryResults:
215
+ """Retrieve documents from the collection of the vector database based on the queries.
216
+
217
+ Args:
218
+ queries: List[str] | A list of queries. Each query is a string.
219
+ collection_name: str | The name of the collection. Default is None.
220
+ n_results: int | The number of relevant documents to return. Default is 10.
221
+ distance_threshold: float | The threshold for the distance score, only distance smaller than it will be
222
+ returned. Don't filter with it if `< 0`. Default is 0.
223
+ kwargs: Dict | Additional keyword arguments.
224
+
225
+ Returns:
226
+ QueryResults | The query results. Each query result is a list of list of tuples containing the document and
227
+ the distance.
228
+ """
229
+ embeddings = self.embedding_function(queries)
230
+ requests = [
231
+ models.SearchRequest(
232
+ vector=embedding,
233
+ limit=n_results,
234
+ score_threshold=distance_threshold,
235
+ with_payload=True,
236
+ with_vector=False,
237
+ )
238
+ for embedding in embeddings
239
+ ]
240
+
241
+ batch_results = self.client.search_batch(collection_name, requests)
242
+ return [self._scored_points_to_documents(results) for results in batch_results]
243
+
244
+ def get_docs_by_ids(
245
+ self, ids: list[ItemID] = None, collection_name: str = None, include=True, **kwargs
246
+ ) -> list[Document]:
247
+ """Retrieve documents from the collection of the vector database based on the ids.
248
+
249
+ Args:
250
+ ids: List[ItemID] | A list of document ids. If None, will return all the documents. Default is None.
251
+ collection_name: str | The name of the collection. Default is None.
252
+ include: List[str] | The fields to include. Default is True.
253
+ If None, will include ["metadatas", "documents"], ids will always be included.
254
+ kwargs: dict | Additional keyword arguments.
255
+
256
+ Returns:
257
+ List[Document] | The results.
258
+ """
259
+ if ids is None:
260
+ results = self.client.scroll(collection_name=collection_name, with_payload=include, with_vectors=True)[0]
261
+ else:
262
+ results = self.client.retrieve(collection_name, ids=ids, with_payload=include, with_vectors=True)
263
+ return [self._point_to_document(result) for result in results]
264
+
265
+ def _point_to_document(self, point) -> Document:
266
+ return {
267
+ "id": point.id,
268
+ "content": point.payload.get(self.content_payload_key, ""),
269
+ "metadata": point.payload.get(self.metadata_payload_key, {}),
270
+ "embedding": point.vector,
271
+ }
272
+
273
+ def _points_to_documents(self, points) -> list[Document]:
274
+ return [self._point_to_document(point) for point in points]
275
+
276
+ def _scored_point_to_document(self, scored_point: "models.ScoredPoint") -> tuple[Document, float]:
277
+ return self._point_to_document(scored_point), scored_point.score
278
+
279
+ def _documents_to_points(self, documents: list[Document]):
280
+ contents = [document["content"] for document in documents]
281
+ embeddings = self.embedding_function(contents)
282
+ points = [
283
+ models.PointStruct(
284
+ id=documents[i]["id"],
285
+ vector=embeddings[i],
286
+ payload={
287
+ self.content_payload_key: documents[i].get("content"),
288
+ self.metadata_payload_key: documents[i].get("metadata"),
289
+ },
290
+ )
291
+ for i in range(len(documents))
292
+ ]
293
+ return points
294
+
295
+ def _scored_points_to_documents(self, scored_points: list["models.ScoredPoint"]) -> list[tuple[Document, float]]:
296
+ return [self._scored_point_to_document(scored_point) for scored_point in scored_points]
297
+
298
+ def _validate_update_ids(self, collection_name: str, ids: list[str]) -> bool:
299
+ """Validates all the IDs exist in the collection"""
300
+ retrieved_ids = [
301
+ point.id for point in self.client.retrieve(collection_name, ids=ids, with_payload=False, with_vectors=False)
302
+ ]
303
+
304
+ if missing_ids := set(ids) - set(retrieved_ids):
305
+ logger.log(f"Missing IDs: {missing_ids}. Skipping update", level=logging.WARN)
306
+ return False
307
+
308
+ return True
309
+
310
+ def _validate_upsert_ids(self, collection_name: str, ids: list[str]) -> bool:
311
+ """Validate none of the IDs exist in the collection"""
312
+ retrieved_ids = [
313
+ point.id for point in self.client.retrieve(collection_name, ids=ids, with_payload=False, with_vectors=False)
314
+ ]
315
+
316
+ if existing_ids := set(ids) & set(retrieved_ids):
317
+ logger.log(f"Existing IDs: {existing_ids}.", level=logging.WARN)
318
+ return False
319
+
320
+ return True
@@ -0,0 +1,126 @@
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
+ import logging
8
+ from typing import Any
9
+
10
+ from termcolor import colored
11
+
12
+ from .base import QueryResults
13
+
14
+
15
+ class ColoredLogger(logging.Logger):
16
+ def __init__(self, name, level=logging.NOTSET):
17
+ super().__init__(name, level)
18
+
19
+ def debug(self, msg, *args, color=None, **kwargs):
20
+ super().debug(colored(msg, color), *args, **kwargs)
21
+
22
+ def info(self, msg, *args, color=None, **kwargs):
23
+ super().info(colored(msg, color), *args, **kwargs)
24
+
25
+ def warning(self, msg, *args, color="yellow", **kwargs):
26
+ super().warning(colored(msg, color), *args, **kwargs)
27
+
28
+ def error(self, msg, *args, color="light_red", **kwargs):
29
+ super().error(colored(msg, color), *args, **kwargs)
30
+
31
+ def critical(self, msg, *args, color="red", **kwargs):
32
+ super().critical(colored(msg, color), *args, **kwargs)
33
+
34
+ def fatal(self, msg, *args, color="red", **kwargs):
35
+ super().fatal(colored(msg, color), *args, **kwargs)
36
+
37
+
38
+ def get_logger(name: str, level: int = logging.INFO) -> ColoredLogger:
39
+ logger = ColoredLogger(name, level)
40
+ console_handler = logging.StreamHandler()
41
+ logger.addHandler(console_handler)
42
+ formatter = logging.Formatter("%(asctime)s - %(name)s - %(levelname)s - %(message)s")
43
+ logger.handlers[0].setFormatter(formatter)
44
+ return logger
45
+
46
+
47
+ logger = get_logger(__name__)
48
+
49
+
50
+ def filter_results_by_distance(results: QueryResults, distance_threshold: float = -1) -> QueryResults:
51
+ """Filters results based on a distance threshold.
52
+
53
+ Args:
54
+ results: QueryResults | The query results. List[List[Tuple[Document, float]]]
55
+ distance_threshold: The maximum distance allowed for results.
56
+
57
+ Returns:
58
+ QueryResults | A filtered results containing only distances smaller than the threshold.
59
+ """
60
+ if distance_threshold > 0:
61
+ results = [[(key, value) for key, value in data if value < distance_threshold] for data in results]
62
+
63
+ return results
64
+
65
+
66
+ def chroma_results_to_query_results(data_dict: dict[str, list[list[Any]]], special_key="distances") -> QueryResults:
67
+ """Converts a dictionary with list-of-list values to a list of tuples.
68
+
69
+ Args:
70
+ data_dict: A dictionary where keys map to lists of lists or None.
71
+ special_key: The key in the dictionary containing the special values
72
+ for each tuple.
73
+
74
+ Returns:
75
+ A list of tuples, where each tuple contains a sub-dictionary with
76
+ some keys from the original dictionary and the value from the
77
+ special_key.
78
+
79
+ Example:
80
+ ```python
81
+ data_dict = {
82
+ "key1s": [[1, 2, 3], [4, 5, 6], [7, 8, 9]],
83
+ "key2s": [["a", "b", "c"], ["c", "d", "e"], ["e", "f", "g"]],
84
+ "key3s": None,
85
+ "key4s": [["x", "y", "z"], ["1", "2", "3"], ["4", "5", "6"]],
86
+ "distances": [[0.1, 0.2, 0.3], [0.4, 0.5, 0.6], [0.7, 0.8, 0.9]],
87
+ }
88
+
89
+ results = [
90
+ [
91
+ ({"key1": 1, "key2": "a", "key4": "x"}, 0.1),
92
+ ({"key1": 2, "key2": "b", "key4": "y"}, 0.2),
93
+ ({"key1": 3, "key2": "c", "key4": "z"}, 0.3),
94
+ ],
95
+ [
96
+ ({"key1": 4, "key2": "c", "key4": "1"}, 0.4),
97
+ ({"key1": 5, "key2": "d", "key4": "2"}, 0.5),
98
+ ({"key1": 6, "key2": "e", "key4": "3"}, 0.6),
99
+ ],
100
+ [
101
+ ({"key1": 7, "key2": "e", "key4": "4"}, 0.7),
102
+ ({"key1": 8, "key2": "f", "key4": "5"}, 0.8),
103
+ ({"key1": 9, "key2": "g", "key4": "6"}, 0.9),
104
+ ],
105
+ ]
106
+ ```
107
+ """
108
+ keys = [
109
+ key
110
+ for key in data_dict
111
+ if key != special_key and data_dict[key] is not None and isinstance(data_dict[key][0], list)
112
+ ]
113
+ result = []
114
+ data_special_key = data_dict[special_key]
115
+
116
+ for i in range(len(data_special_key)):
117
+ sub_result = []
118
+ for j, distance in enumerate(data_special_key[i]):
119
+ sub_dict = {}
120
+ for key in keys:
121
+ if len(data_dict[key]) > i:
122
+ sub_dict[key[:-1]] = data_dict[key][i][j] # remove 's' in the end from key
123
+ sub_result.append((sub_dict, distance))
124
+ result.append(sub_result)
125
+
126
+ return result