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,527 @@
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/https://github.com/Lancetnik/FastDepends are under the MIT License.
6
+ # SPDX-License-Identifier: MIT
7
+
8
+ from collections import namedtuple
9
+ from collections.abc import Awaitable, Callable, Generator, Iterable, Sequence
10
+ from contextlib import AsyncExitStack, ExitStack
11
+ from functools import partial
12
+ from inspect import Parameter, unwrap
13
+ from itertools import chain
14
+ from typing import (
15
+ Any,
16
+ Generic,
17
+ TypeVar,
18
+ )
19
+
20
+ import anyio
21
+ from typing_extensions import ParamSpec
22
+
23
+ from .._compat import BaseModel, ExceptionGroup, get_aliases
24
+ from ..library import CustomField
25
+ from ..utils import (
26
+ async_map,
27
+ is_async_gen_callable,
28
+ is_coroutine_callable,
29
+ is_gen_callable,
30
+ run_async,
31
+ solve_generator_async,
32
+ solve_generator_sync,
33
+ )
34
+
35
+ P = ParamSpec("P")
36
+ T = TypeVar("T")
37
+
38
+
39
+ PriorityPair = namedtuple("PriorityPair", ("call", "dependencies_number", "dependencies_names"))
40
+
41
+
42
+ class ResponseModel(BaseModel, Generic[T]):
43
+ response: T
44
+
45
+
46
+ class CallModel(Generic[P, T]):
47
+ call: Callable[P, T] | Callable[P, Awaitable[T]]
48
+ is_async: bool
49
+ is_generator: bool
50
+ model: type[BaseModel] | None
51
+ response_model: type[ResponseModel[T]] | None
52
+
53
+ params: dict[str, tuple[Any, Any]]
54
+ alias_arguments: tuple[str, ...]
55
+
56
+ dependencies: dict[str, "CallModel[..., Any]"]
57
+ extra_dependencies: Iterable["CallModel[..., Any]"]
58
+ sorted_dependencies: tuple[tuple["CallModel[..., Any]", int], ...]
59
+ custom_fields: dict[str, CustomField]
60
+ keyword_args: tuple[str, ...]
61
+ positional_args: tuple[str, ...]
62
+ var_positional_arg: str | None
63
+ var_keyword_arg: str | None
64
+
65
+ # Dependencies and custom fields
66
+ use_cache: bool
67
+ cast: bool
68
+
69
+ __slots__ = (
70
+ "call",
71
+ "is_async",
72
+ "is_generator",
73
+ "model",
74
+ "response_model",
75
+ "params",
76
+ "alias_arguments",
77
+ "keyword_args",
78
+ "positional_args",
79
+ "var_positional_arg",
80
+ "var_keyword_arg",
81
+ "dependencies",
82
+ "extra_dependencies",
83
+ "sorted_dependencies",
84
+ "custom_fields",
85
+ "use_cache",
86
+ "cast",
87
+ )
88
+
89
+ @property
90
+ def call_name(self) -> str:
91
+ call = unwrap(self.call)
92
+ return getattr(call, "__name__", type(call).__name__)
93
+
94
+ @property
95
+ def flat_params(self) -> dict[str, tuple[Any, Any]]:
96
+ params = self.params
97
+ for d in (*self.dependencies.values(), *self.extra_dependencies):
98
+ params.update(d.flat_params)
99
+ return params
100
+
101
+ @property
102
+ def flat_dependencies(
103
+ self,
104
+ ) -> dict[
105
+ Callable[..., Any],
106
+ tuple[
107
+ "CallModel[..., Any]",
108
+ tuple[Callable[..., Any], ...],
109
+ ],
110
+ ]:
111
+ flat: dict[
112
+ Callable[..., Any],
113
+ tuple[
114
+ CallModel[..., Any],
115
+ tuple[Callable[..., Any], ...],
116
+ ],
117
+ ] = {}
118
+
119
+ for i in (*self.dependencies.values(), *self.extra_dependencies):
120
+ flat.update({
121
+ i.call: (
122
+ i,
123
+ tuple(j.call for j in i.dependencies.values()),
124
+ )
125
+ })
126
+
127
+ flat.update(i.flat_dependencies)
128
+
129
+ return flat
130
+
131
+ def __init__(
132
+ self,
133
+ /,
134
+ call: Callable[P, T] | Callable[P, Awaitable[T]],
135
+ model: type[BaseModel] | None,
136
+ params: dict[str, tuple[Any, Any]],
137
+ response_model: type[ResponseModel[T]] | None = None,
138
+ use_cache: bool = True,
139
+ cast: bool = True,
140
+ is_async: bool = False,
141
+ is_generator: bool = False,
142
+ dependencies: dict[str, "CallModel[..., Any]"] | None = None,
143
+ extra_dependencies: Iterable["CallModel[..., Any]"] | None = None,
144
+ keyword_args: list[str] | None = None,
145
+ positional_args: list[str] | None = None,
146
+ var_positional_arg: str | None = None,
147
+ var_keyword_arg: str | None = None,
148
+ custom_fields: dict[str, CustomField] | None = None,
149
+ ):
150
+ self.call = call
151
+ self.model = model
152
+
153
+ if model:
154
+ self.alias_arguments = get_aliases(model)
155
+ else: # pragma: no cover
156
+ self.alias_arguments = ()
157
+
158
+ self.keyword_args = tuple(keyword_args or ())
159
+ self.positional_args = tuple(positional_args or ())
160
+ self.var_positional_arg = var_positional_arg
161
+ self.var_keyword_arg = var_keyword_arg
162
+ self.response_model = response_model
163
+ self.use_cache = use_cache
164
+ self.cast = cast
165
+ self.is_async = is_async or is_coroutine_callable(call) or is_async_gen_callable(call)
166
+ self.is_generator = is_generator or is_gen_callable(call) or is_async_gen_callable(call)
167
+
168
+ self.dependencies = dependencies or {}
169
+ self.extra_dependencies = extra_dependencies or ()
170
+ self.custom_fields = custom_fields or {}
171
+
172
+ sorted_dep: list[CallModel[..., Any]] = []
173
+ flat = self.flat_dependencies
174
+ for calls in flat.values():
175
+ _sort_dep(sorted_dep, calls, flat)
176
+
177
+ self.sorted_dependencies = tuple((i, len(i.sorted_dependencies)) for i in sorted_dep if i.use_cache)
178
+ for name in chain(self.dependencies.keys(), self.custom_fields.keys()):
179
+ params.pop(name, None)
180
+ self.params = params
181
+
182
+ def _solve(
183
+ self,
184
+ /,
185
+ *args: tuple[Any, ...],
186
+ cache_dependencies: dict[
187
+ Callable[P, T] | Callable[P, Awaitable[T]],
188
+ T,
189
+ ],
190
+ dependency_overrides: dict[
191
+ Callable[P, T] | Callable[P, Awaitable[T]], Callable[P, T] | Callable[P, Awaitable[T]]
192
+ ]
193
+ | None = None,
194
+ **kwargs: dict[str, Any],
195
+ ) -> Generator[
196
+ tuple[
197
+ Sequence[Any],
198
+ dict[str, Any],
199
+ Callable[..., Any],
200
+ ],
201
+ Any,
202
+ T,
203
+ ]:
204
+ if dependency_overrides:
205
+ call = dependency_overrides.get(self.call, self.call)
206
+ assert self.is_async or not is_coroutine_callable(call), (
207
+ f"You cannot use async dependency `{self.call_name}` at sync main"
208
+ )
209
+
210
+ else:
211
+ call = self.call
212
+
213
+ if self.use_cache and call in cache_dependencies:
214
+ return cache_dependencies[call]
215
+
216
+ kw: dict[str, Any] = {}
217
+
218
+ for arg in self.keyword_args:
219
+ if (v := kwargs.pop(arg, Parameter.empty)) is not Parameter.empty:
220
+ kw[arg] = v
221
+
222
+ if self.var_keyword_arg is not None:
223
+ kw[self.var_keyword_arg] = kwargs
224
+ else:
225
+ kw.update(kwargs)
226
+
227
+ for arg in self.positional_args:
228
+ if args:
229
+ kw[arg], args = args[0], args[1:]
230
+ else:
231
+ break
232
+
233
+ keyword_args: Iterable[str]
234
+ if self.var_positional_arg is not None:
235
+ kw[self.var_positional_arg] = args
236
+ keyword_args = self.keyword_args
237
+
238
+ else:
239
+ keyword_args = self.keyword_args + self.positional_args
240
+ for arg in keyword_args:
241
+ if not self.cast and arg in self.params:
242
+ kw[arg] = self.params[arg][1]
243
+
244
+ if not args:
245
+ break
246
+
247
+ if arg not in self.dependencies:
248
+ kw[arg], args = args[0], args[1:]
249
+
250
+ solved_kw: dict[str, Any]
251
+ solved_kw = yield args, kw, call
252
+
253
+ args_: Sequence[Any]
254
+ if self.cast:
255
+ assert self.model, "Cast should be used only with model"
256
+ casted_model = self.model(**solved_kw)
257
+
258
+ kwargs_ = {arg: getattr(casted_model, arg, solved_kw.get(arg)) for arg in keyword_args}
259
+ if self.var_keyword_arg:
260
+ kwargs_.update(getattr(casted_model, self.var_keyword_arg, {}))
261
+
262
+ if self.var_positional_arg is not None:
263
+ args_ = [getattr(casted_model, arg, solved_kw.get(arg)) for arg in self.positional_args]
264
+ args_.extend(getattr(casted_model, self.var_positional_arg, ()))
265
+ else:
266
+ args_ = ()
267
+
268
+ else:
269
+ kwargs_ = {arg: solved_kw.get(arg) for arg in keyword_args}
270
+
271
+ args_ = tuple(map(solved_kw.get, self.positional_args)) if self.var_positional_arg is None else ()
272
+
273
+ response: T
274
+ response = yield args_, kwargs_, call
275
+
276
+ if self.cast and not self.is_generator:
277
+ response = self._cast_response(response)
278
+
279
+ if self.use_cache: # pragma: no branch
280
+ cache_dependencies[call] = response
281
+
282
+ return response
283
+
284
+ def _cast_response(self, /, value: Any) -> Any:
285
+ if self.response_model is not None:
286
+ return self.response_model(response=value).response
287
+ else:
288
+ return value
289
+
290
+ def solve(
291
+ self,
292
+ /,
293
+ *args: Any,
294
+ stack: ExitStack,
295
+ cache_dependencies: dict[
296
+ Callable[P, T] | Callable[P, Awaitable[T]],
297
+ T,
298
+ ],
299
+ dependency_overrides: dict[
300
+ Callable[P, T] | Callable[P, Awaitable[T]], Callable[P, T] | Callable[P, Awaitable[T]]
301
+ ]
302
+ | None = None,
303
+ nested: bool = False,
304
+ **kwargs: Any,
305
+ ) -> T:
306
+ cast_gen = self._solve(
307
+ *args,
308
+ cache_dependencies=cache_dependencies,
309
+ dependency_overrides=dependency_overrides,
310
+ **kwargs,
311
+ )
312
+ try:
313
+ args, kwargs, _ = next(cast_gen) # type: ignore[assignment]
314
+ except StopIteration as e:
315
+ cached_value: T = e.value
316
+ return cached_value
317
+
318
+ # Heat cache and solve extra dependencies
319
+ for dep, _ in self.sorted_dependencies:
320
+ dep.solve(
321
+ *args,
322
+ stack=stack,
323
+ cache_dependencies=cache_dependencies,
324
+ dependency_overrides=dependency_overrides,
325
+ nested=True,
326
+ **kwargs,
327
+ )
328
+
329
+ # Always get from cache
330
+ for dep in self.extra_dependencies:
331
+ dep.solve(
332
+ *args,
333
+ stack=stack,
334
+ cache_dependencies=cache_dependencies,
335
+ dependency_overrides=dependency_overrides,
336
+ nested=True,
337
+ **kwargs,
338
+ )
339
+
340
+ for dep_arg, dep in self.dependencies.items():
341
+ kwargs[dep_arg] = dep.solve(
342
+ stack=stack,
343
+ cache_dependencies=cache_dependencies,
344
+ dependency_overrides=dependency_overrides,
345
+ nested=True,
346
+ **kwargs,
347
+ )
348
+
349
+ for custom in self.custom_fields.values():
350
+ if custom.field:
351
+ custom.use_field(kwargs)
352
+ else:
353
+ kwargs = custom.use(**kwargs)
354
+
355
+ final_args, final_kwargs, call = cast_gen.send(kwargs)
356
+
357
+ if self.is_generator and nested:
358
+ response = solve_generator_sync(
359
+ *final_args,
360
+ call=call,
361
+ stack=stack,
362
+ **final_kwargs,
363
+ )
364
+
365
+ else:
366
+ response = call(*final_args, **final_kwargs)
367
+
368
+ try:
369
+ cast_gen.send(response)
370
+ except StopIteration as e:
371
+ value: T = e.value
372
+
373
+ if not self.cast or nested or not self.is_generator:
374
+ return value
375
+
376
+ else:
377
+ return map(self._cast_response, value) # type: ignore[no-any-return, call-overload]
378
+
379
+ raise AssertionError("unreachable")
380
+
381
+ async def asolve(
382
+ self,
383
+ /,
384
+ *args: Any,
385
+ stack: AsyncExitStack,
386
+ cache_dependencies: dict[
387
+ Callable[P, T] | Callable[P, Awaitable[T]],
388
+ T,
389
+ ],
390
+ dependency_overrides: dict[
391
+ Callable[P, T] | Callable[P, Awaitable[T]], Callable[P, T] | Callable[P, Awaitable[T]]
392
+ ]
393
+ | None = None,
394
+ nested: bool = False,
395
+ **kwargs: Any,
396
+ ) -> T:
397
+ cast_gen = self._solve(
398
+ *args,
399
+ cache_dependencies=cache_dependencies,
400
+ dependency_overrides=dependency_overrides,
401
+ **kwargs,
402
+ )
403
+ try:
404
+ args, kwargs, _ = next(cast_gen) # type: ignore[assignment]
405
+ except StopIteration as e:
406
+ cached_value: T = e.value
407
+ return cached_value
408
+
409
+ # Heat cache and solve extra dependencies
410
+ dep_to_solve: list[Callable[..., Awaitable[Any]]] = []
411
+ try:
412
+ async with anyio.create_task_group() as tg:
413
+ for dep, subdep in self.sorted_dependencies:
414
+ solve = partial(
415
+ dep.asolve,
416
+ *args,
417
+ stack=stack,
418
+ cache_dependencies=cache_dependencies,
419
+ dependency_overrides=dependency_overrides,
420
+ nested=True,
421
+ **kwargs,
422
+ )
423
+ if not subdep:
424
+ tg.start_soon(solve)
425
+ else:
426
+ dep_to_solve.append(solve)
427
+ except ExceptionGroup as exgr:
428
+ for ex in exgr.exceptions:
429
+ raise ex from None
430
+
431
+ for i in dep_to_solve:
432
+ await i()
433
+
434
+ # Always get from cache
435
+ for dep in self.extra_dependencies:
436
+ await dep.asolve(
437
+ *args,
438
+ stack=stack,
439
+ cache_dependencies=cache_dependencies,
440
+ dependency_overrides=dependency_overrides,
441
+ nested=True,
442
+ **kwargs,
443
+ )
444
+
445
+ for dep_arg, dep in self.dependencies.items():
446
+ kwargs[dep_arg] = await dep.asolve(
447
+ stack=stack,
448
+ cache_dependencies=cache_dependencies,
449
+ dependency_overrides=dependency_overrides,
450
+ nested=True,
451
+ **kwargs,
452
+ )
453
+
454
+ custom_to_solve: list[CustomField] = []
455
+
456
+ try:
457
+ async with anyio.create_task_group() as tg:
458
+ for custom in self.custom_fields.values():
459
+ if custom.field:
460
+ tg.start_soon(run_async, custom.use_field, kwargs)
461
+ else:
462
+ custom_to_solve.append(custom)
463
+
464
+ except ExceptionGroup as exgr:
465
+ for ex in exgr.exceptions:
466
+ raise ex from None
467
+
468
+ for j in custom_to_solve:
469
+ kwargs = await run_async(j.use, **kwargs)
470
+
471
+ final_args, final_kwargs, call = cast_gen.send(kwargs)
472
+
473
+ if self.is_generator and nested:
474
+ response = await solve_generator_async(
475
+ *final_args,
476
+ call=call,
477
+ stack=stack,
478
+ **final_kwargs,
479
+ )
480
+ else:
481
+ response = await run_async(call, *final_args, **final_kwargs)
482
+
483
+ try:
484
+ cast_gen.send(response)
485
+ except StopIteration as e:
486
+ value: T = e.value
487
+
488
+ if not self.cast or nested or not self.is_generator:
489
+ return value
490
+
491
+ else:
492
+ return async_map(self._cast_response, value) # type: ignore[return-value, arg-type]
493
+
494
+ raise AssertionError("unreachable")
495
+
496
+
497
+ def _sort_dep(
498
+ collector: list["CallModel[..., Any]"],
499
+ items: tuple[
500
+ "CallModel[..., Any]",
501
+ tuple[Callable[..., Any], ...],
502
+ ],
503
+ flat: dict[
504
+ Callable[..., Any],
505
+ tuple[
506
+ "CallModel[..., Any]",
507
+ tuple[Callable[..., Any], ...],
508
+ ],
509
+ ],
510
+ ) -> None:
511
+ model, calls = items
512
+
513
+ if model in collector:
514
+ return
515
+
516
+ if not calls:
517
+ position = -1
518
+
519
+ else:
520
+ for i in calls:
521
+ sub_model, _ = flat[i]
522
+ if sub_model not in collector: # pragma: no branch
523
+ _sort_dep(collector, flat[i], flat)
524
+
525
+ position = max(collector.index(flat[i][0]) for i in calls)
526
+
527
+ collector.insert(position + 1, model)
@@ -0,0 +1,15 @@
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/https://github.com/Lancetnik/FastDepends are under the MIT License.
6
+ # SPDX-License-Identifier: MIT
7
+
8
+ from .model import Depends
9
+ from .provider import Provider, dependency_provider
10
+
11
+ __all__ = (
12
+ "Depends",
13
+ "Provider",
14
+ "dependency_provider",
15
+ )
@@ -0,0 +1,30 @@
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/https://github.com/Lancetnik/FastDepends are under the MIT License.
6
+ # SPDX-License-Identifier: MIT
7
+
8
+ from collections.abc import Callable
9
+ from typing import Any
10
+
11
+
12
+ class Depends:
13
+ use_cache: bool
14
+ cast: bool
15
+
16
+ def __init__(
17
+ self,
18
+ dependency: Callable[..., Any],
19
+ *,
20
+ use_cache: bool = True,
21
+ cast: bool = True,
22
+ ) -> None:
23
+ self.dependency = dependency
24
+ self.use_cache = use_cache
25
+ self.cast = cast
26
+
27
+ def __repr__(self) -> str:
28
+ attr = getattr(self.dependency, "__name__", type(self.dependency).__name__)
29
+ cache = "" if self.use_cache else ", use_cache=False"
30
+ return f"{self.__class__.__name__}({attr}{cache})"
@@ -0,0 +1,40 @@
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/https://github.com/Lancetnik/FastDepends are under the MIT License.
6
+ # SPDX-License-Identifier: MIT
7
+
8
+ from collections.abc import Callable, Iterator
9
+ from contextlib import contextmanager
10
+ from typing import Any
11
+
12
+
13
+ class Provider:
14
+ dependency_overrides: dict[Callable[..., Any], Callable[..., Any]]
15
+
16
+ def __init__(self) -> None:
17
+ self.dependency_overrides = {}
18
+
19
+ def clear(self) -> None:
20
+ self.dependency_overrides = {}
21
+
22
+ def override(
23
+ self,
24
+ original: Callable[..., Any],
25
+ override: Callable[..., Any],
26
+ ) -> None:
27
+ self.dependency_overrides[original] = override
28
+
29
+ @contextmanager
30
+ def scope(
31
+ self,
32
+ original: Callable[..., Any],
33
+ override: Callable[..., Any],
34
+ ) -> Iterator[None]:
35
+ self.dependency_overrides[original] = override
36
+ yield
37
+ self.dependency_overrides.pop(original, None)
38
+
39
+
40
+ dependency_provider = Provider()
@@ -0,0 +1,10 @@
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/https://github.com/Lancetnik/FastDepends are under the MIT License.
6
+ # SPDX-License-Identifier: MIT
7
+
8
+ from .model import CustomField
9
+
10
+ __all__ = ("CustomField",)
@@ -0,0 +1,46 @@
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/https://github.com/Lancetnik/FastDepends are under the MIT License.
6
+ # SPDX-License-Identifier: MIT
7
+
8
+ from abc import ABC
9
+ from typing import Any, TypeVar
10
+
11
+ Cls = TypeVar("Cls", bound="CustomField")
12
+
13
+
14
+ class CustomField(ABC):
15
+ param_name: str | None
16
+ cast: bool
17
+ required: bool
18
+
19
+ __slots__ = (
20
+ "cast",
21
+ "param_name",
22
+ "required",
23
+ "field",
24
+ )
25
+
26
+ def __init__(
27
+ self,
28
+ *,
29
+ cast: bool = True,
30
+ required: bool = True,
31
+ ) -> None:
32
+ self.cast = cast
33
+ self.param_name = None
34
+ self.required = required
35
+ self.field = False
36
+
37
+ def set_param_name(self: Cls, name: str) -> Cls:
38
+ self.param_name = name
39
+ return self
40
+
41
+ def use(self, /, **kwargs: Any) -> dict[str, Any]:
42
+ assert self.param_name, "You should specify `param_name` before using"
43
+ return kwargs
44
+
45
+ def use_field(self, kwargs: dict[str, Any]) -> None:
46
+ raise NotImplementedError("You should implement `use_field` method.")
@@ -0,0 +1,6 @@
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/https://github.com/Lancetnik/FastDepends are under the MIT License.
6
+ # SPDX-License-Identifier: MIT