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,71 @@
1
+ # Copyright (c) 2023 - 2025, AG2ai, Inc., AG2ai open-source projects maintainers and core contributors
2
+ #
3
+ # SPDX-License-Identifier: Apache-2.0
4
+ from typing import Any
5
+
6
+ from ..doc_utils import export_module
7
+ from ..tools import Tool
8
+ from .interoperable import Interoperable
9
+ from .registry import InteroperableRegistry
10
+
11
+ __all__ = ["Interoperable"]
12
+
13
+
14
+ @export_module("autogen.interop")
15
+ class Interoperability:
16
+ """A class to handle interoperability between different tool types.
17
+
18
+ This class allows the conversion of tools to various interoperability classes and provides functionality
19
+ for retrieving and registering interoperability classes.
20
+ """
21
+
22
+ registry = InteroperableRegistry.get_instance()
23
+
24
+ @classmethod
25
+ def convert_tool(cls, *, tool: Any, type: str, **kwargs: Any) -> Tool:
26
+ """Converts a given tool to an instance of a specified interoperability type.
27
+
28
+ Args:
29
+ tool (Any): The tool object to be converted.
30
+ type (str): The type of interoperability to convert the tool to.
31
+ **kwargs (Any): Additional arguments to be passed during conversion.
32
+
33
+ Returns:
34
+ Tool: The converted tool.
35
+
36
+ Raises:
37
+ ValueError: If the interoperability class for the provided type is not found.
38
+ """
39
+ interop = cls.get_interoperability_class(type)
40
+ return interop.convert_tool(tool, **kwargs)
41
+
42
+ @classmethod
43
+ def get_interoperability_class(cls, type: str) -> type[Interoperable]:
44
+ """Retrieves the interoperability class corresponding to the specified type.
45
+
46
+ Args:
47
+ type (str): The type of the interoperability class to retrieve.
48
+
49
+ Returns:
50
+ type[Interoperable]: The interoperability class type.
51
+
52
+ Raises:
53
+ ValueError: If no interoperability class is found for the provided type.
54
+ """
55
+ supported_types = cls.registry.get_supported_types()
56
+ if type not in supported_types:
57
+ supported_types_formatted = ", ".join(["'t'" for t in supported_types])
58
+ raise ValueError(
59
+ f"Interoperability class {type} is not supported, supported types: {supported_types_formatted}"
60
+ )
61
+
62
+ return cls.registry.get_class(type)
63
+
64
+ @classmethod
65
+ def get_supported_types(cls) -> list[str]:
66
+ """Returns a sorted list of all supported interoperability types.
67
+
68
+ Returns:
69
+ List[str]: A sorted list of strings representing the supported interoperability types.
70
+ """
71
+ return sorted(cls.registry.get_supported_types())
@@ -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
+ from typing import Any, Protocol, runtime_checkable
6
+
7
+ from ..doc_utils import export_module
8
+ from ..tools import Tool
9
+
10
+ __all__ = ["Interoperable"]
11
+
12
+
13
+ @runtime_checkable
14
+ @export_module("autogen.interop")
15
+ class Interoperable(Protocol):
16
+ """A Protocol defining the interoperability interface for tool conversion.
17
+
18
+ This protocol ensures that any class implementing it provides the method
19
+ `convert_tool` to convert a given tool into a desired format or type.
20
+ """
21
+
22
+ @classmethod
23
+ def convert_tool(cls, tool: Any, **kwargs: Any) -> Tool:
24
+ """Converts a given tool to a desired format or type.
25
+
26
+ This method should be implemented by any class adhering to the `Interoperable` protocol.
27
+
28
+ Args:
29
+ tool (Any): The tool object to be converted.
30
+ **kwargs (Any): Additional parameters to pass during the conversion process.
31
+
32
+ Returns:
33
+ Tool: The converted tool in the desired format or type.
34
+ """
35
+ ...
36
+
37
+ @classmethod
38
+ def get_unsupported_reason(cls) -> str | None:
39
+ """Returns the reason for the tool being unsupported.
40
+
41
+ This method should be implemented by any class adhering to the `Interoperable` protocol.
42
+
43
+ Returns:
44
+ str: The reason for the interoperability class being unsupported.
45
+ """
46
+ ...
@@ -0,0 +1,8 @@
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
+ from .langchain_chat_model_factory import LangChainChatModelFactory
6
+ from .langchain_tool import LangChainInteroperability
7
+
8
+ __all__ = ["LangChainChatModelFactory", "LangChainInteroperability"]
@@ -0,0 +1,156 @@
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
+ from abc import ABC, abstractmethod
6
+ from collections.abc import Callable
7
+ from typing import Any, TypeVar
8
+
9
+ from ...doc_utils import export_module
10
+ from ...import_utils import optional_import_block, require_optional_import
11
+ from ...llm_config import LLMConfig
12
+ from ...oai import get_first_llm_config
13
+
14
+ with optional_import_block():
15
+ from langchain_anthropic import ChatAnthropic
16
+ from langchain_core.language_models import BaseChatModel
17
+ from langchain_google_genai import ChatGoogleGenerativeAI
18
+ from langchain_ollama import ChatOllama
19
+ from langchain_openai import AzureChatOpenAI, ChatOpenAI
20
+
21
+
22
+ __all__ = ["LangChainChatModelFactory"]
23
+
24
+ T = TypeVar("T", bound="LangChainChatModelFactory")
25
+
26
+
27
+ @require_optional_import(
28
+ ["langchain_anthropic", "langchain_google_genai", "langchain_ollama", "langchain_openai", "langchain_core"],
29
+ "browser-use",
30
+ except_for=["__init__", "register_factory"],
31
+ )
32
+ @export_module("autogen.interop")
33
+ class LangChainChatModelFactory(ABC):
34
+ _factories: set["LangChainChatModelFactory"] = set()
35
+
36
+ @classmethod
37
+ def create_base_chat_model(cls, llm_config: LLMConfig | dict[str, Any]) -> "BaseChatModel": # type: ignore [no-any-unimported]
38
+ first_llm_config = get_first_llm_config(llm_config)
39
+ for factory in LangChainChatModelFactory._factories:
40
+ if factory.accepts(first_llm_config):
41
+ return factory.create(first_llm_config)
42
+
43
+ raise ValueError("Could not find a factory for the given config.")
44
+
45
+ @classmethod
46
+ def register_factory(cls) -> Callable[[type[T]], type[T]]:
47
+ def decorator(factory: type[T]) -> type[T]:
48
+ cls._factories.add(factory())
49
+ return factory
50
+
51
+ return decorator
52
+
53
+ @classmethod
54
+ def prepare_config(cls, first_llm_config: dict[str, Any]) -> dict[str, Any]:
55
+ for pop_keys in ["api_type", "response_format"]:
56
+ first_llm_config.pop(pop_keys, None)
57
+ return first_llm_config
58
+
59
+ @classmethod
60
+ @abstractmethod
61
+ def create(cls, first_llm_config: dict[str, Any]) -> "BaseChatModel": # type: ignore [no-any-unimported]
62
+ ...
63
+
64
+ @classmethod
65
+ @abstractmethod
66
+ def get_api_type(cls) -> str: ...
67
+
68
+ @classmethod
69
+ def accepts(cls, first_llm_config: dict[str, Any]) -> bool:
70
+ return first_llm_config.get("api_type", "openai") == cls.get_api_type() # type: ignore [no-any-return]
71
+
72
+
73
+ @LangChainChatModelFactory.register_factory()
74
+ class ChatOpenAIFactory(LangChainChatModelFactory):
75
+ @classmethod
76
+ def create(cls, first_llm_config: dict[str, Any]) -> "ChatOpenAI": # type: ignore [no-any-unimported]
77
+ first_llm_config = cls.prepare_config(first_llm_config)
78
+
79
+ return ChatOpenAI(**first_llm_config)
80
+
81
+ @classmethod
82
+ def get_api_type(cls) -> str:
83
+ return "openai"
84
+
85
+
86
+ @LangChainChatModelFactory.register_factory()
87
+ class DeepSeekFactory(ChatOpenAIFactory):
88
+ @classmethod
89
+ def create(cls, first_llm_config: dict[str, Any]) -> "ChatOpenAI": # type: ignore [no-any-unimported]
90
+ if "base_url" not in first_llm_config:
91
+ raise ValueError("base_url is required for deepseek api type.")
92
+ return super().create(first_llm_config)
93
+
94
+ @classmethod
95
+ def get_api_type(cls) -> str:
96
+ return "deepseek"
97
+
98
+
99
+ @LangChainChatModelFactory.register_factory()
100
+ class ChatAnthropicFactory(LangChainChatModelFactory):
101
+ @classmethod
102
+ def create(cls, first_llm_config: dict[str, Any]) -> "ChatAnthropic": # type: ignore [no-any-unimported]
103
+ first_llm_config = cls.prepare_config(first_llm_config)
104
+
105
+ return ChatAnthropic(**first_llm_config)
106
+
107
+ @classmethod
108
+ def get_api_type(cls) -> str:
109
+ return "anthropic"
110
+
111
+
112
+ @LangChainChatModelFactory.register_factory()
113
+ class ChatGoogleGenerativeAIFactory(LangChainChatModelFactory):
114
+ @classmethod
115
+ def create(cls, first_llm_config: dict[str, Any]) -> "ChatGoogleGenerativeAI": # type: ignore [no-any-unimported]
116
+ first_llm_config = cls.prepare_config(first_llm_config)
117
+
118
+ return ChatGoogleGenerativeAI(**first_llm_config)
119
+
120
+ @classmethod
121
+ def get_api_type(cls) -> str:
122
+ return "google"
123
+
124
+
125
+ @LangChainChatModelFactory.register_factory()
126
+ class AzureChatOpenAIFactory(LangChainChatModelFactory):
127
+ @classmethod
128
+ def create(cls, first_llm_config: dict[str, Any]) -> "AzureChatOpenAI": # type: ignore [no-any-unimported]
129
+ first_llm_config = cls.prepare_config(first_llm_config)
130
+ for param in ["base_url", "api_version"]:
131
+ if param not in first_llm_config:
132
+ raise ValueError(f"{param} is required for azure api type.")
133
+ first_llm_config["azure_endpoint"] = first_llm_config.pop("base_url")
134
+
135
+ return AzureChatOpenAI(**first_llm_config)
136
+
137
+ @classmethod
138
+ def get_api_type(cls) -> str:
139
+ return "azure"
140
+
141
+
142
+ @LangChainChatModelFactory.register_factory()
143
+ class ChatOllamaFactory(LangChainChatModelFactory):
144
+ @classmethod
145
+ def create(cls, first_llm_config: dict[str, Any]) -> "ChatOllama": # type: ignore [no-any-unimported]
146
+ first_llm_config = cls.prepare_config(first_llm_config)
147
+ first_llm_config["base_url"] = first_llm_config.pop("client_host", None)
148
+ if "num_ctx" not in first_llm_config:
149
+ # In all Browser Use examples, num_ctx is set to 32000
150
+ first_llm_config["num_ctx"] = 32000
151
+
152
+ return ChatOllama(**first_llm_config)
153
+
154
+ @classmethod
155
+ def get_api_type(cls) -> str:
156
+ return "ollama"
@@ -0,0 +1,78 @@
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
+ from typing import Any
6
+
7
+ from ...doc_utils import export_module
8
+ from ...import_utils import optional_import_block, require_optional_import
9
+ from ...tools import Tool
10
+ from ..registry import register_interoperable_class
11
+
12
+ __all__ = ["LangChainInteroperability"]
13
+
14
+ with optional_import_block():
15
+ from langchain_core.tools import BaseTool as LangchainTool
16
+
17
+
18
+ @register_interoperable_class("langchain")
19
+ @export_module("autogen.interop")
20
+ class LangChainInteroperability:
21
+ """A class implementing the `Interoperable` protocol for converting Langchain tools
22
+ into a general `Tool` format.
23
+
24
+ This class takes a `LangchainTool` and converts it into a standard `Tool` object,
25
+ ensuring compatibility between Langchain tools and other systems that expect
26
+ the `Tool` format.
27
+ """
28
+
29
+ @classmethod
30
+ @require_optional_import("langchain_core", "interop-langchain")
31
+ def convert_tool(cls, tool: Any, **kwargs: Any) -> Tool:
32
+ """Converts a given Langchain tool into a general `Tool` format.
33
+
34
+ This method verifies that the provided tool is a valid `LangchainTool`,
35
+ processes the tool's input and description, and returns a standardized
36
+ `Tool` object.
37
+
38
+ Args:
39
+ tool (Any): The tool to convert, expected to be an instance of `LangchainTool`.
40
+ **kwargs (Any): Additional arguments, which are not supported by this method.
41
+
42
+ Returns:
43
+ Tool: A standardized `Tool` object converted from the Langchain tool.
44
+
45
+ Raises:
46
+ ValueError: If the provided tool is not an instance of `LangchainTool`, or if
47
+ any additional arguments are passed.
48
+ """
49
+ if not isinstance(tool, LangchainTool):
50
+ raise ValueError(f"Expected an instance of `langchain_core.tools.BaseTool`, got {type(tool)}")
51
+ if kwargs:
52
+ raise ValueError(f"The LangchainInteroperability does not support any additional arguments, got {kwargs}")
53
+
54
+ # needed for type checking
55
+ langchain_tool: LangchainTool = tool # type: ignore[no-any-unimported]
56
+
57
+ model_type = langchain_tool.get_input_schema()
58
+
59
+ def func(tool_input: model_type) -> Any: # type: ignore[valid-type]
60
+ return langchain_tool.run(tool_input.model_dump()) # type: ignore[attr-defined]
61
+
62
+ return Tool(
63
+ name=langchain_tool.name,
64
+ description=langchain_tool.description,
65
+ func_or_tool=func,
66
+ )
67
+
68
+ @classmethod
69
+ def get_unsupported_reason(cls) -> str | None:
70
+ with optional_import_block() as result:
71
+ import langchain_core.tools # noqa: F401
72
+
73
+ if not result.is_successful:
74
+ return (
75
+ "Please install `interop-langchain` extra to use this module:\n\n\tpip install ag2[interop-langchain]"
76
+ )
77
+
78
+ return None
@@ -0,0 +1,7 @@
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
+ from .litellm_config_factory import LiteLLmConfigFactory
6
+
7
+ __all__ = ["LiteLLmConfigFactory"]
@@ -0,0 +1,178 @@
1
+ # Copyright (c) 2023 - 2025, AG2ai, Inc., AG2ai open-source projects maintainers and core contributors
2
+ #
3
+ # SPDX-License-Identifier: Apache-2.0
4
+
5
+ import os
6
+ from abc import ABC, abstractmethod
7
+ from collections.abc import Callable
8
+ from typing import Any, TypeVar
9
+
10
+ from ...doc_utils import export_module
11
+ from ...llm_config import LLMConfig
12
+ from ...oai import get_first_llm_config
13
+
14
+ __all__ = ["LiteLLmConfigFactory"]
15
+
16
+ T = TypeVar("T", bound="LiteLLmConfigFactory")
17
+
18
+
19
+ def get_crawl4ai_version() -> str | None:
20
+ """Get the installed crawl4ai version."""
21
+ try:
22
+ import crawl4ai
23
+
24
+ version = getattr(crawl4ai, "__version__", None)
25
+ return version if isinstance(version, str) else None
26
+ except (ImportError, AttributeError):
27
+ return None
28
+
29
+
30
+ def is_crawl4ai_v05_or_higher() -> bool:
31
+ """Check if crawl4ai version is 0.5 or higher."""
32
+ version = get_crawl4ai_version()
33
+ if version is None:
34
+ return False
35
+
36
+ # Parse version string (e.g., "0.5.0" -> [0, 5, 0])
37
+ try:
38
+ version_parts = [int(x) for x in version.split(".")]
39
+ # Check if version >= 0.5.0
40
+ return version_parts >= [0, 5, 0]
41
+ except (ValueError, IndexError):
42
+ return False
43
+
44
+
45
+ @export_module("autogen.interop")
46
+ class LiteLLmConfigFactory(ABC):
47
+ _factories: set["LiteLLmConfigFactory"] = set()
48
+
49
+ @classmethod
50
+ def create_lite_llm_config(cls, llm_config: LLMConfig | dict[str, Any]) -> dict[str, Any]:
51
+ """Create a lite LLM config compatible with the installed crawl4ai version.
52
+
53
+ For crawl4ai >=0.5: Returns config with llmConfig parameter
54
+ For crawl4ai <0.5: Returns config with provider parameter (legacy)
55
+ """
56
+ first_llm_config = get_first_llm_config(llm_config)
57
+ for factory in LiteLLmConfigFactory._factories:
58
+ if factory.accepts(first_llm_config):
59
+ base_config = factory.create(first_llm_config)
60
+
61
+ # Check crawl4ai version and adapt config accordingly
62
+ if is_crawl4ai_v05_or_higher():
63
+ return cls._adapt_for_crawl4ai_v05(base_config)
64
+ else:
65
+ return base_config # Use legacy format
66
+
67
+ raise ValueError("Could not find a factory for the given config.")
68
+
69
+ @classmethod
70
+ def _adapt_for_crawl4ai_v05(cls, base_config: dict[str, Any]) -> dict[str, Any]:
71
+ """Adapt the config for crawl4ai >=0.5 by moving deprecated parameters
72
+ into an llmConfig object.
73
+ """
74
+ adapted_config = base_config.copy()
75
+
76
+ # Extract deprecated parameters
77
+ llm_config_params = {}
78
+
79
+ if "provider" in adapted_config:
80
+ llm_config_params["provider"] = adapted_config.pop("provider")
81
+
82
+ if "api_token" in adapted_config:
83
+ llm_config_params["api_token"] = adapted_config.pop("api_token")
84
+
85
+ # Add other parameters that should be in llmConfig
86
+ for param in ["base_url", "api_base", "api_version"]:
87
+ if param in adapted_config:
88
+ llm_config_params[param] = adapted_config.pop(param)
89
+
90
+ # Create the llmConfig object if we have parameters for it
91
+ if llm_config_params:
92
+ adapted_config["llmConfig"] = llm_config_params
93
+
94
+ return adapted_config
95
+
96
+ @classmethod
97
+ def register_factory(cls) -> Callable[[type[T]], type[T]]:
98
+ def decorator(factory: type[T]) -> type[T]:
99
+ cls._factories.add(factory())
100
+ return factory
101
+
102
+ return decorator
103
+
104
+ @classmethod
105
+ def create(cls, first_llm_config: dict[str, Any]) -> dict[str, Any]:
106
+ model = first_llm_config.pop("model")
107
+ api_type = first_llm_config.pop("api_type", "openai")
108
+
109
+ first_llm_config["provider"] = f"{api_type}/{model}"
110
+ return first_llm_config
111
+
112
+ @classmethod
113
+ @abstractmethod
114
+ def get_api_type(cls) -> str: ...
115
+
116
+ @classmethod
117
+ def accepts(cls, first_llm_config: dict[str, Any]) -> bool:
118
+ return first_llm_config.get("api_type", "openai") == cls.get_api_type() # type: ignore [no-any-return]
119
+
120
+
121
+ @LiteLLmConfigFactory.register_factory()
122
+ class DefaultLiteLLmConfigFactory(LiteLLmConfigFactory):
123
+ @classmethod
124
+ def get_api_type(cls) -> str:
125
+ raise NotImplementedError("DefaultLiteLLmConfigFactory does not have an API type.")
126
+
127
+ @classmethod
128
+ def accepts(cls, first_llm_config: dict[str, Any]) -> bool:
129
+ non_base_api_types = ["google", "ollama"]
130
+ return first_llm_config.get("api_type", "openai") not in non_base_api_types
131
+
132
+ @classmethod
133
+ def create(cls, first_llm_config: dict[str, Any]) -> dict[str, Any]:
134
+ api_type = first_llm_config.get("api_type", "openai")
135
+ if api_type != "openai" and "api_key" not in first_llm_config:
136
+ raise ValueError("API key is required.")
137
+ first_llm_config["api_token"] = first_llm_config.pop("api_key", os.getenv("OPENAI_API_KEY"))
138
+
139
+ first_llm_config = super().create(first_llm_config)
140
+
141
+ return first_llm_config
142
+
143
+
144
+ @LiteLLmConfigFactory.register_factory()
145
+ class GoogleLiteLLmConfigFactory(LiteLLmConfigFactory):
146
+ @classmethod
147
+ def get_api_type(cls) -> str:
148
+ return "google"
149
+
150
+ @classmethod
151
+ def create(cls, first_llm_config: dict[str, Any]) -> dict[str, Any]:
152
+ # api type must be changed before calling super().create
153
+ # litellm uses gemini as the api type for google
154
+ first_llm_config["api_type"] = "gemini"
155
+ first_llm_config["api_token"] = first_llm_config.pop("api_key")
156
+ first_llm_config = super().create(first_llm_config)
157
+
158
+ return first_llm_config
159
+
160
+ @classmethod
161
+ def accepts(cls, first_llm_config: dict[str, Any]) -> bool:
162
+ api_type: str = first_llm_config.get("api_type", "")
163
+ return api_type == cls.get_api_type() or api_type == "gemini"
164
+
165
+
166
+ @LiteLLmConfigFactory.register_factory()
167
+ class OllamaLiteLLmConfigFactory(LiteLLmConfigFactory):
168
+ @classmethod
169
+ def get_api_type(cls) -> str:
170
+ return "ollama"
171
+
172
+ @classmethod
173
+ def create(cls, first_llm_config: dict[str, Any]) -> dict[str, Any]:
174
+ first_llm_config = super().create(first_llm_config)
175
+ if "client_host" in first_llm_config:
176
+ first_llm_config["api_base"] = first_llm_config.pop("client_host")
177
+
178
+ return first_llm_config
@@ -0,0 +1,7 @@
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
+ from .pydantic_ai import PydanticAIInteroperability
6
+
7
+ __all__ = ["PydanticAIInteroperability"]