ag2 0.9.1__py3-none-any.whl → 0.9.1.post0__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.

Potentially problematic release.


This version of ag2 might be problematic. Click here for more details.

Files changed (357) hide show
  1. {ag2-0.9.1.dist-info → ag2-0.9.1.post0.dist-info}/METADATA +264 -73
  2. ag2-0.9.1.post0.dist-info/RECORD +392 -0
  3. {ag2-0.9.1.dist-info → ag2-0.9.1.post0.dist-info}/WHEEL +1 -2
  4. autogen/__init__.py +89 -0
  5. autogen/_website/__init__.py +3 -0
  6. autogen/_website/generate_api_references.py +427 -0
  7. autogen/_website/generate_mkdocs.py +1174 -0
  8. autogen/_website/notebook_processor.py +476 -0
  9. autogen/_website/process_notebooks.py +656 -0
  10. autogen/_website/utils.py +412 -0
  11. autogen/agentchat/__init__.py +44 -0
  12. autogen/agentchat/agent.py +182 -0
  13. autogen/agentchat/assistant_agent.py +85 -0
  14. autogen/agentchat/chat.py +309 -0
  15. autogen/agentchat/contrib/__init__.py +5 -0
  16. autogen/agentchat/contrib/agent_eval/README.md +7 -0
  17. autogen/agentchat/contrib/agent_eval/agent_eval.py +108 -0
  18. autogen/agentchat/contrib/agent_eval/criterion.py +43 -0
  19. autogen/agentchat/contrib/agent_eval/critic_agent.py +44 -0
  20. autogen/agentchat/contrib/agent_eval/quantifier_agent.py +39 -0
  21. autogen/agentchat/contrib/agent_eval/subcritic_agent.py +45 -0
  22. autogen/agentchat/contrib/agent_eval/task.py +42 -0
  23. autogen/agentchat/contrib/agent_optimizer.py +429 -0
  24. autogen/agentchat/contrib/capabilities/__init__.py +5 -0
  25. autogen/agentchat/contrib/capabilities/agent_capability.py +20 -0
  26. autogen/agentchat/contrib/capabilities/generate_images.py +301 -0
  27. autogen/agentchat/contrib/capabilities/teachability.py +393 -0
  28. autogen/agentchat/contrib/capabilities/text_compressors.py +66 -0
  29. autogen/agentchat/contrib/capabilities/tools_capability.py +22 -0
  30. autogen/agentchat/contrib/capabilities/transform_messages.py +93 -0
  31. autogen/agentchat/contrib/capabilities/transforms.py +566 -0
  32. autogen/agentchat/contrib/capabilities/transforms_util.py +122 -0
  33. autogen/agentchat/contrib/capabilities/vision_capability.py +214 -0
  34. autogen/agentchat/contrib/captainagent/__init__.py +9 -0
  35. autogen/agentchat/contrib/captainagent/agent_builder.py +790 -0
  36. autogen/agentchat/contrib/captainagent/captainagent.py +512 -0
  37. autogen/agentchat/contrib/captainagent/tool_retriever.py +335 -0
  38. autogen/agentchat/contrib/captainagent/tools/README.md +44 -0
  39. autogen/agentchat/contrib/captainagent/tools/__init__.py +5 -0
  40. autogen/agentchat/contrib/captainagent/tools/data_analysis/calculate_correlation.py +40 -0
  41. autogen/agentchat/contrib/captainagent/tools/data_analysis/calculate_skewness_and_kurtosis.py +28 -0
  42. autogen/agentchat/contrib/captainagent/tools/data_analysis/detect_outlier_iqr.py +28 -0
  43. autogen/agentchat/contrib/captainagent/tools/data_analysis/detect_outlier_zscore.py +28 -0
  44. autogen/agentchat/contrib/captainagent/tools/data_analysis/explore_csv.py +21 -0
  45. autogen/agentchat/contrib/captainagent/tools/data_analysis/shapiro_wilk_test.py +30 -0
  46. autogen/agentchat/contrib/captainagent/tools/information_retrieval/arxiv_download.py +27 -0
  47. autogen/agentchat/contrib/captainagent/tools/information_retrieval/arxiv_search.py +53 -0
  48. autogen/agentchat/contrib/captainagent/tools/information_retrieval/extract_pdf_image.py +53 -0
  49. autogen/agentchat/contrib/captainagent/tools/information_retrieval/extract_pdf_text.py +38 -0
  50. autogen/agentchat/contrib/captainagent/tools/information_retrieval/get_wikipedia_text.py +21 -0
  51. autogen/agentchat/contrib/captainagent/tools/information_retrieval/get_youtube_caption.py +34 -0
  52. autogen/agentchat/contrib/captainagent/tools/information_retrieval/image_qa.py +60 -0
  53. autogen/agentchat/contrib/captainagent/tools/information_retrieval/optical_character_recognition.py +61 -0
  54. autogen/agentchat/contrib/captainagent/tools/information_retrieval/perform_web_search.py +47 -0
  55. autogen/agentchat/contrib/captainagent/tools/information_retrieval/scrape_wikipedia_tables.py +33 -0
  56. autogen/agentchat/contrib/captainagent/tools/information_retrieval/transcribe_audio_file.py +21 -0
  57. autogen/agentchat/contrib/captainagent/tools/information_retrieval/youtube_download.py +35 -0
  58. autogen/agentchat/contrib/captainagent/tools/math/calculate_circle_area_from_diameter.py +21 -0
  59. autogen/agentchat/contrib/captainagent/tools/math/calculate_day_of_the_week.py +18 -0
  60. autogen/agentchat/contrib/captainagent/tools/math/calculate_fraction_sum.py +28 -0
  61. autogen/agentchat/contrib/captainagent/tools/math/calculate_matrix_power.py +31 -0
  62. autogen/agentchat/contrib/captainagent/tools/math/calculate_reflected_point.py +16 -0
  63. autogen/agentchat/contrib/captainagent/tools/math/complex_numbers_product.py +25 -0
  64. autogen/agentchat/contrib/captainagent/tools/math/compute_currency_conversion.py +23 -0
  65. autogen/agentchat/contrib/captainagent/tools/math/count_distinct_permutations.py +27 -0
  66. autogen/agentchat/contrib/captainagent/tools/math/evaluate_expression.py +28 -0
  67. autogen/agentchat/contrib/captainagent/tools/math/find_continuity_point.py +34 -0
  68. autogen/agentchat/contrib/captainagent/tools/math/fraction_to_mixed_numbers.py +39 -0
  69. autogen/agentchat/contrib/captainagent/tools/math/modular_inverse_sum.py +23 -0
  70. autogen/agentchat/contrib/captainagent/tools/math/simplify_mixed_numbers.py +36 -0
  71. autogen/agentchat/contrib/captainagent/tools/math/sum_of_digit_factorials.py +15 -0
  72. autogen/agentchat/contrib/captainagent/tools/math/sum_of_primes_below.py +15 -0
  73. autogen/agentchat/contrib/captainagent/tools/requirements.txt +10 -0
  74. autogen/agentchat/contrib/captainagent/tools/tool_description.tsv +34 -0
  75. autogen/agentchat/contrib/gpt_assistant_agent.py +526 -0
  76. autogen/agentchat/contrib/graph_rag/__init__.py +9 -0
  77. autogen/agentchat/contrib/graph_rag/document.py +29 -0
  78. autogen/agentchat/contrib/graph_rag/falkor_graph_query_engine.py +170 -0
  79. autogen/agentchat/contrib/graph_rag/falkor_graph_rag_capability.py +103 -0
  80. autogen/agentchat/contrib/graph_rag/graph_query_engine.py +53 -0
  81. autogen/agentchat/contrib/graph_rag/graph_rag_capability.py +63 -0
  82. autogen/agentchat/contrib/graph_rag/neo4j_graph_query_engine.py +268 -0
  83. autogen/agentchat/contrib/graph_rag/neo4j_graph_rag_capability.py +83 -0
  84. autogen/agentchat/contrib/graph_rag/neo4j_native_graph_query_engine.py +210 -0
  85. autogen/agentchat/contrib/graph_rag/neo4j_native_graph_rag_capability.py +93 -0
  86. autogen/agentchat/contrib/img_utils.py +397 -0
  87. autogen/agentchat/contrib/llamaindex_conversable_agent.py +117 -0
  88. autogen/agentchat/contrib/llava_agent.py +187 -0
  89. autogen/agentchat/contrib/math_user_proxy_agent.py +464 -0
  90. autogen/agentchat/contrib/multimodal_conversable_agent.py +125 -0
  91. autogen/agentchat/contrib/qdrant_retrieve_user_proxy_agent.py +324 -0
  92. autogen/agentchat/contrib/rag/__init__.py +10 -0
  93. autogen/agentchat/contrib/rag/chromadb_query_engine.py +272 -0
  94. autogen/agentchat/contrib/rag/llamaindex_query_engine.py +198 -0
  95. autogen/agentchat/contrib/rag/mongodb_query_engine.py +329 -0
  96. autogen/agentchat/contrib/rag/query_engine.py +74 -0
  97. autogen/agentchat/contrib/retrieve_assistant_agent.py +56 -0
  98. autogen/agentchat/contrib/retrieve_user_proxy_agent.py +703 -0
  99. autogen/agentchat/contrib/society_of_mind_agent.py +199 -0
  100. autogen/agentchat/contrib/swarm_agent.py +1425 -0
  101. autogen/agentchat/contrib/text_analyzer_agent.py +79 -0
  102. autogen/agentchat/contrib/vectordb/__init__.py +5 -0
  103. autogen/agentchat/contrib/vectordb/base.py +232 -0
  104. autogen/agentchat/contrib/vectordb/chromadb.py +315 -0
  105. autogen/agentchat/contrib/vectordb/couchbase.py +407 -0
  106. autogen/agentchat/contrib/vectordb/mongodb.py +550 -0
  107. autogen/agentchat/contrib/vectordb/pgvectordb.py +928 -0
  108. autogen/agentchat/contrib/vectordb/qdrant.py +320 -0
  109. autogen/agentchat/contrib/vectordb/utils.py +126 -0
  110. autogen/agentchat/contrib/web_surfer.py +303 -0
  111. autogen/agentchat/conversable_agent.py +4020 -0
  112. autogen/agentchat/group/__init__.py +64 -0
  113. autogen/agentchat/group/available_condition.py +91 -0
  114. autogen/agentchat/group/context_condition.py +77 -0
  115. autogen/agentchat/group/context_expression.py +238 -0
  116. autogen/agentchat/group/context_str.py +41 -0
  117. autogen/agentchat/group/context_variables.py +192 -0
  118. autogen/agentchat/group/group_tool_executor.py +202 -0
  119. autogen/agentchat/group/group_utils.py +591 -0
  120. autogen/agentchat/group/handoffs.py +244 -0
  121. autogen/agentchat/group/llm_condition.py +93 -0
  122. autogen/agentchat/group/multi_agent_chat.py +237 -0
  123. autogen/agentchat/group/on_condition.py +58 -0
  124. autogen/agentchat/group/on_context_condition.py +54 -0
  125. autogen/agentchat/group/patterns/__init__.py +18 -0
  126. autogen/agentchat/group/patterns/auto.py +159 -0
  127. autogen/agentchat/group/patterns/manual.py +176 -0
  128. autogen/agentchat/group/patterns/pattern.py +288 -0
  129. autogen/agentchat/group/patterns/random.py +106 -0
  130. autogen/agentchat/group/patterns/round_robin.py +117 -0
  131. autogen/agentchat/group/reply_result.py +26 -0
  132. autogen/agentchat/group/speaker_selection_result.py +41 -0
  133. autogen/agentchat/group/targets/__init__.py +4 -0
  134. autogen/agentchat/group/targets/group_chat_target.py +132 -0
  135. autogen/agentchat/group/targets/group_manager_target.py +151 -0
  136. autogen/agentchat/group/targets/transition_target.py +413 -0
  137. autogen/agentchat/group/targets/transition_utils.py +6 -0
  138. autogen/agentchat/groupchat.py +1694 -0
  139. autogen/agentchat/realtime/__init__.py +3 -0
  140. autogen/agentchat/realtime/experimental/__init__.py +20 -0
  141. autogen/agentchat/realtime/experimental/audio_adapters/__init__.py +8 -0
  142. autogen/agentchat/realtime/experimental/audio_adapters/twilio_audio_adapter.py +148 -0
  143. autogen/agentchat/realtime/experimental/audio_adapters/websocket_audio_adapter.py +139 -0
  144. autogen/agentchat/realtime/experimental/audio_observer.py +42 -0
  145. autogen/agentchat/realtime/experimental/clients/__init__.py +15 -0
  146. autogen/agentchat/realtime/experimental/clients/gemini/__init__.py +7 -0
  147. autogen/agentchat/realtime/experimental/clients/gemini/client.py +274 -0
  148. autogen/agentchat/realtime/experimental/clients/oai/__init__.py +8 -0
  149. autogen/agentchat/realtime/experimental/clients/oai/base_client.py +220 -0
  150. autogen/agentchat/realtime/experimental/clients/oai/rtc_client.py +243 -0
  151. autogen/agentchat/realtime/experimental/clients/oai/utils.py +48 -0
  152. autogen/agentchat/realtime/experimental/clients/realtime_client.py +190 -0
  153. autogen/agentchat/realtime/experimental/function_observer.py +85 -0
  154. autogen/agentchat/realtime/experimental/realtime_agent.py +158 -0
  155. autogen/agentchat/realtime/experimental/realtime_events.py +42 -0
  156. autogen/agentchat/realtime/experimental/realtime_observer.py +100 -0
  157. autogen/agentchat/realtime/experimental/realtime_swarm.py +475 -0
  158. autogen/agentchat/realtime/experimental/websockets.py +21 -0
  159. autogen/agentchat/realtime_agent/__init__.py +21 -0
  160. autogen/agentchat/user_proxy_agent.py +111 -0
  161. autogen/agentchat/utils.py +206 -0
  162. autogen/agents/__init__.py +3 -0
  163. autogen/agents/contrib/__init__.py +10 -0
  164. autogen/agents/contrib/time/__init__.py +8 -0
  165. autogen/agents/contrib/time/time_reply_agent.py +73 -0
  166. autogen/agents/contrib/time/time_tool_agent.py +51 -0
  167. autogen/agents/experimental/__init__.py +27 -0
  168. autogen/agents/experimental/deep_research/__init__.py +7 -0
  169. autogen/agents/experimental/deep_research/deep_research.py +52 -0
  170. autogen/agents/experimental/discord/__init__.py +7 -0
  171. autogen/agents/experimental/discord/discord.py +66 -0
  172. autogen/agents/experimental/document_agent/__init__.py +19 -0
  173. autogen/agents/experimental/document_agent/chroma_query_engine.py +316 -0
  174. autogen/agents/experimental/document_agent/docling_doc_ingest_agent.py +118 -0
  175. autogen/agents/experimental/document_agent/document_agent.py +461 -0
  176. autogen/agents/experimental/document_agent/document_conditions.py +50 -0
  177. autogen/agents/experimental/document_agent/document_utils.py +380 -0
  178. autogen/agents/experimental/document_agent/inmemory_query_engine.py +220 -0
  179. autogen/agents/experimental/document_agent/parser_utils.py +130 -0
  180. autogen/agents/experimental/document_agent/url_utils.py +426 -0
  181. autogen/agents/experimental/reasoning/__init__.py +7 -0
  182. autogen/agents/experimental/reasoning/reasoning_agent.py +1178 -0
  183. autogen/agents/experimental/slack/__init__.py +7 -0
  184. autogen/agents/experimental/slack/slack.py +73 -0
  185. autogen/agents/experimental/telegram/__init__.py +7 -0
  186. autogen/agents/experimental/telegram/telegram.py +77 -0
  187. autogen/agents/experimental/websurfer/__init__.py +7 -0
  188. autogen/agents/experimental/websurfer/websurfer.py +62 -0
  189. autogen/agents/experimental/wikipedia/__init__.py +7 -0
  190. autogen/agents/experimental/wikipedia/wikipedia.py +90 -0
  191. autogen/browser_utils.py +309 -0
  192. autogen/cache/__init__.py +10 -0
  193. autogen/cache/abstract_cache_base.py +75 -0
  194. autogen/cache/cache.py +203 -0
  195. autogen/cache/cache_factory.py +88 -0
  196. autogen/cache/cosmos_db_cache.py +144 -0
  197. autogen/cache/disk_cache.py +102 -0
  198. autogen/cache/in_memory_cache.py +58 -0
  199. autogen/cache/redis_cache.py +123 -0
  200. autogen/code_utils.py +596 -0
  201. autogen/coding/__init__.py +22 -0
  202. autogen/coding/base.py +119 -0
  203. autogen/coding/docker_commandline_code_executor.py +268 -0
  204. autogen/coding/factory.py +47 -0
  205. autogen/coding/func_with_reqs.py +202 -0
  206. autogen/coding/jupyter/__init__.py +23 -0
  207. autogen/coding/jupyter/base.py +36 -0
  208. autogen/coding/jupyter/docker_jupyter_server.py +167 -0
  209. autogen/coding/jupyter/embedded_ipython_code_executor.py +182 -0
  210. autogen/coding/jupyter/import_utils.py +82 -0
  211. autogen/coding/jupyter/jupyter_client.py +231 -0
  212. autogen/coding/jupyter/jupyter_code_executor.py +160 -0
  213. autogen/coding/jupyter/local_jupyter_server.py +172 -0
  214. autogen/coding/local_commandline_code_executor.py +405 -0
  215. autogen/coding/markdown_code_extractor.py +45 -0
  216. autogen/coding/utils.py +56 -0
  217. autogen/doc_utils.py +34 -0
  218. autogen/events/__init__.py +7 -0
  219. autogen/events/agent_events.py +1010 -0
  220. autogen/events/base_event.py +99 -0
  221. autogen/events/client_events.py +167 -0
  222. autogen/events/helpers.py +36 -0
  223. autogen/events/print_event.py +46 -0
  224. autogen/exception_utils.py +73 -0
  225. autogen/extensions/__init__.py +5 -0
  226. autogen/fast_depends/__init__.py +16 -0
  227. autogen/fast_depends/_compat.py +80 -0
  228. autogen/fast_depends/core/__init__.py +14 -0
  229. autogen/fast_depends/core/build.py +225 -0
  230. autogen/fast_depends/core/model.py +576 -0
  231. autogen/fast_depends/dependencies/__init__.py +15 -0
  232. autogen/fast_depends/dependencies/model.py +29 -0
  233. autogen/fast_depends/dependencies/provider.py +39 -0
  234. autogen/fast_depends/library/__init__.py +10 -0
  235. autogen/fast_depends/library/model.py +46 -0
  236. autogen/fast_depends/py.typed +6 -0
  237. autogen/fast_depends/schema.py +66 -0
  238. autogen/fast_depends/use.py +280 -0
  239. autogen/fast_depends/utils.py +187 -0
  240. autogen/formatting_utils.py +83 -0
  241. autogen/function_utils.py +13 -0
  242. autogen/graph_utils.py +178 -0
  243. autogen/import_utils.py +526 -0
  244. autogen/interop/__init__.py +22 -0
  245. autogen/interop/crewai/__init__.py +7 -0
  246. autogen/interop/crewai/crewai.py +88 -0
  247. autogen/interop/interoperability.py +71 -0
  248. autogen/interop/interoperable.py +46 -0
  249. autogen/interop/langchain/__init__.py +8 -0
  250. autogen/interop/langchain/langchain_chat_model_factory.py +155 -0
  251. autogen/interop/langchain/langchain_tool.py +82 -0
  252. autogen/interop/litellm/__init__.py +7 -0
  253. autogen/interop/litellm/litellm_config_factory.py +113 -0
  254. autogen/interop/pydantic_ai/__init__.py +7 -0
  255. autogen/interop/pydantic_ai/pydantic_ai.py +168 -0
  256. autogen/interop/registry.py +69 -0
  257. autogen/io/__init__.py +15 -0
  258. autogen/io/base.py +151 -0
  259. autogen/io/console.py +56 -0
  260. autogen/io/processors/__init__.py +12 -0
  261. autogen/io/processors/base.py +21 -0
  262. autogen/io/processors/console_event_processor.py +56 -0
  263. autogen/io/run_response.py +293 -0
  264. autogen/io/thread_io_stream.py +63 -0
  265. autogen/io/websockets.py +213 -0
  266. autogen/json_utils.py +43 -0
  267. autogen/llm_config.py +379 -0
  268. autogen/logger/__init__.py +11 -0
  269. autogen/logger/base_logger.py +128 -0
  270. autogen/logger/file_logger.py +261 -0
  271. autogen/logger/logger_factory.py +42 -0
  272. autogen/logger/logger_utils.py +57 -0
  273. autogen/logger/sqlite_logger.py +523 -0
  274. autogen/math_utils.py +339 -0
  275. autogen/mcp/__init__.py +7 -0
  276. autogen/mcp/mcp_client.py +208 -0
  277. autogen/messages/__init__.py +7 -0
  278. autogen/messages/agent_messages.py +948 -0
  279. autogen/messages/base_message.py +107 -0
  280. autogen/messages/client_messages.py +171 -0
  281. autogen/messages/print_message.py +49 -0
  282. autogen/oai/__init__.py +53 -0
  283. autogen/oai/anthropic.py +714 -0
  284. autogen/oai/bedrock.py +628 -0
  285. autogen/oai/cerebras.py +299 -0
  286. autogen/oai/client.py +1435 -0
  287. autogen/oai/client_utils.py +169 -0
  288. autogen/oai/cohere.py +479 -0
  289. autogen/oai/gemini.py +990 -0
  290. autogen/oai/gemini_types.py +129 -0
  291. autogen/oai/groq.py +305 -0
  292. autogen/oai/mistral.py +303 -0
  293. autogen/oai/oai_models/__init__.py +11 -0
  294. autogen/oai/oai_models/_models.py +16 -0
  295. autogen/oai/oai_models/chat_completion.py +87 -0
  296. autogen/oai/oai_models/chat_completion_audio.py +32 -0
  297. autogen/oai/oai_models/chat_completion_message.py +86 -0
  298. autogen/oai/oai_models/chat_completion_message_tool_call.py +37 -0
  299. autogen/oai/oai_models/chat_completion_token_logprob.py +63 -0
  300. autogen/oai/oai_models/completion_usage.py +60 -0
  301. autogen/oai/ollama.py +643 -0
  302. autogen/oai/openai_utils.py +881 -0
  303. autogen/oai/together.py +370 -0
  304. autogen/retrieve_utils.py +491 -0
  305. autogen/runtime_logging.py +160 -0
  306. autogen/token_count_utils.py +267 -0
  307. autogen/tools/__init__.py +20 -0
  308. autogen/tools/contrib/__init__.py +9 -0
  309. autogen/tools/contrib/time/__init__.py +7 -0
  310. autogen/tools/contrib/time/time.py +41 -0
  311. autogen/tools/dependency_injection.py +254 -0
  312. autogen/tools/experimental/__init__.py +43 -0
  313. autogen/tools/experimental/browser_use/__init__.py +7 -0
  314. autogen/tools/experimental/browser_use/browser_use.py +161 -0
  315. autogen/tools/experimental/crawl4ai/__init__.py +7 -0
  316. autogen/tools/experimental/crawl4ai/crawl4ai.py +153 -0
  317. autogen/tools/experimental/deep_research/__init__.py +7 -0
  318. autogen/tools/experimental/deep_research/deep_research.py +328 -0
  319. autogen/tools/experimental/duckduckgo/__init__.py +7 -0
  320. autogen/tools/experimental/duckduckgo/duckduckgo_search.py +109 -0
  321. autogen/tools/experimental/google/__init__.py +14 -0
  322. autogen/tools/experimental/google/authentication/__init__.py +11 -0
  323. autogen/tools/experimental/google/authentication/credentials_hosted_provider.py +43 -0
  324. autogen/tools/experimental/google/authentication/credentials_local_provider.py +91 -0
  325. autogen/tools/experimental/google/authentication/credentials_provider.py +35 -0
  326. autogen/tools/experimental/google/drive/__init__.py +9 -0
  327. autogen/tools/experimental/google/drive/drive_functions.py +124 -0
  328. autogen/tools/experimental/google/drive/toolkit.py +88 -0
  329. autogen/tools/experimental/google/model.py +17 -0
  330. autogen/tools/experimental/google/toolkit_protocol.py +19 -0
  331. autogen/tools/experimental/google_search/__init__.py +8 -0
  332. autogen/tools/experimental/google_search/google_search.py +93 -0
  333. autogen/tools/experimental/google_search/youtube_search.py +181 -0
  334. autogen/tools/experimental/messageplatform/__init__.py +17 -0
  335. autogen/tools/experimental/messageplatform/discord/__init__.py +7 -0
  336. autogen/tools/experimental/messageplatform/discord/discord.py +288 -0
  337. autogen/tools/experimental/messageplatform/slack/__init__.py +7 -0
  338. autogen/tools/experimental/messageplatform/slack/slack.py +391 -0
  339. autogen/tools/experimental/messageplatform/telegram/__init__.py +7 -0
  340. autogen/tools/experimental/messageplatform/telegram/telegram.py +275 -0
  341. autogen/tools/experimental/perplexity/__init__.py +7 -0
  342. autogen/tools/experimental/perplexity/perplexity_search.py +260 -0
  343. autogen/tools/experimental/tavily/__init__.py +7 -0
  344. autogen/tools/experimental/tavily/tavily_search.py +183 -0
  345. autogen/tools/experimental/web_search_preview/__init__.py +7 -0
  346. autogen/tools/experimental/web_search_preview/web_search_preview.py +114 -0
  347. autogen/tools/experimental/wikipedia/__init__.py +7 -0
  348. autogen/tools/experimental/wikipedia/wikipedia.py +287 -0
  349. autogen/tools/function_utils.py +411 -0
  350. autogen/tools/tool.py +187 -0
  351. autogen/tools/toolkit.py +86 -0
  352. autogen/types.py +29 -0
  353. autogen/version.py +7 -0
  354. ag2-0.9.1.dist-info/RECORD +0 -6
  355. ag2-0.9.1.dist-info/top_level.txt +0 -1
  356. {ag2-0.9.1.dist-info → ag2-0.9.1.post0.dist-info/licenses}/LICENSE +0 -0
  357. {ag2-0.9.1.dist-info → ag2-0.9.1.post0.dist-info/licenses}/NOTICE.md +0 -0
@@ -0,0 +1,293 @@
1
+ # Copyright (c) 2023 - 2025, AG2ai, Inc., AG2ai open-source projects maintainers and core contributors
2
+ #
3
+ # SPDX-License-Identifier: Apache-2.0
4
+ #
5
+ # Portions derived from https://github.com/microsoft/autogen are under the MIT License.
6
+ # SPDX-License-Identifier: MIT
7
+
8
+ import queue
9
+ from asyncio import Queue as AsyncQueue
10
+ from typing import Any, AsyncIterable, Dict, Iterable, Optional, Protocol, Sequence, Union
11
+ from uuid import UUID, uuid4
12
+
13
+ from pydantic import BaseModel, Field
14
+
15
+ from autogen.tools.tool import Tool
16
+
17
+ from ..agentchat.agent import Agent, LLMMessageType
18
+ from ..agentchat.group.context_variables import ContextVariables
19
+ from ..events.agent_events import ErrorEvent, InputRequestEvent, RunCompletionEvent
20
+ from ..events.base_event import BaseEvent
21
+ from .processors import (
22
+ AsyncConsoleEventProcessor,
23
+ AsyncEventProcessorProtocol,
24
+ ConsoleEventProcessor,
25
+ EventProcessorProtocol,
26
+ )
27
+ from .thread_io_stream import AsyncThreadIOStream, ThreadIOStream
28
+
29
+ Message = dict[str, Any]
30
+
31
+
32
+ class RunInfoProtocol(Protocol):
33
+ @property
34
+ def uuid(self) -> UUID: ...
35
+
36
+ @property
37
+ def above_run(self) -> Optional["RunResponseProtocol"]: ...
38
+
39
+
40
+ class Usage(BaseModel):
41
+ cost: float
42
+ prompt_tokens: int
43
+ completion_tokens: int
44
+ total_tokens: int
45
+
46
+
47
+ class CostBreakdown(BaseModel):
48
+ total_cost: float
49
+ models: Dict[str, Usage] = Field(default_factory=dict)
50
+
51
+ @classmethod
52
+ def from_raw(cls, data: dict[str, Any]) -> "CostBreakdown":
53
+ # Extract total cost
54
+ total_cost = data.get("total_cost", 0.0)
55
+
56
+ # Remove total_cost key to extract models
57
+ model_usages = {k: Usage(**v) for k, v in data.items() if k != "total_cost"}
58
+
59
+ return cls(total_cost=total_cost, models=model_usages)
60
+
61
+
62
+ class Cost(BaseModel):
63
+ usage_including_cached_inference: CostBreakdown
64
+ usage_excluding_cached_inference: CostBreakdown
65
+
66
+ @classmethod
67
+ def from_raw(cls, data: dict[str, Any]) -> "Cost":
68
+ return cls(
69
+ usage_including_cached_inference=CostBreakdown.from_raw(data.get("usage_including_cached_inference", {})),
70
+ usage_excluding_cached_inference=CostBreakdown.from_raw(data.get("usage_excluding_cached_inference", {})),
71
+ )
72
+
73
+
74
+ class RunResponseProtocol(RunInfoProtocol, Protocol):
75
+ @property
76
+ def events(self) -> Iterable[BaseEvent]: ...
77
+
78
+ @property
79
+ def messages(self) -> Iterable[Message]: ...
80
+
81
+ @property
82
+ def summary(self) -> Optional[str]: ...
83
+
84
+ @property
85
+ def context_variables(self) -> Optional[ContextVariables]: ...
86
+
87
+ @property
88
+ def last_speaker(self) -> Optional[str]: ...
89
+
90
+ @property
91
+ def cost(self) -> Optional[Cost]: ...
92
+
93
+ def process(self, processor: Optional[EventProcessorProtocol] = None) -> None: ...
94
+
95
+ def set_ui_tools(self, tools: list[Tool]) -> None: ...
96
+
97
+
98
+ class AsyncRunResponseProtocol(RunInfoProtocol, Protocol):
99
+ @property
100
+ def events(self) -> AsyncIterable[BaseEvent]: ...
101
+
102
+ @property
103
+ async def messages(self) -> Iterable[Message]: ...
104
+
105
+ @property
106
+ async def summary(self) -> Optional[str]: ...
107
+
108
+ @property
109
+ async def context_variables(self) -> Optional[ContextVariables]: ...
110
+
111
+ @property
112
+ async def last_speaker(self) -> Optional[str]: ...
113
+
114
+ @property
115
+ async def cost(self) -> Optional[Cost]: ...
116
+
117
+ async def process(self, processor: Optional[AsyncEventProcessorProtocol] = None) -> None: ...
118
+
119
+ def set_ui_tools(self, tools: list[Tool]) -> None: ...
120
+
121
+
122
+ class RunResponse:
123
+ def __init__(self, iostream: ThreadIOStream, agents: list[Agent]):
124
+ self.iostream = iostream
125
+ self.agents = agents
126
+ self._summary: Optional[str] = None
127
+ self._messages: Sequence[LLMMessageType] = []
128
+ self._uuid = uuid4()
129
+ self._context_variables: Optional[ContextVariables] = None
130
+ self._last_speaker: Optional[str] = None
131
+ self._cost: Optional[Cost] = None
132
+
133
+ def _queue_generator(self, q: queue.Queue) -> Iterable[BaseEvent]: # type: ignore[type-arg]
134
+ """A generator to yield items from the queue until the termination message is found."""
135
+ while True:
136
+ try:
137
+ # Get an item from the queue
138
+ event = q.get(timeout=0.1) # Adjust timeout as needed
139
+
140
+ if isinstance(event, InputRequestEvent):
141
+ event.content.respond = lambda response: self.iostream._output_stream.put(response) # type: ignore[attr-defined]
142
+
143
+ yield event
144
+
145
+ if isinstance(event, RunCompletionEvent):
146
+ self._messages = event.content.history # type: ignore[attr-defined]
147
+ self._last_speaker = event.content.last_speaker # type: ignore[attr-defined]
148
+ self._summary = event.content.summary # type: ignore[attr-defined]
149
+ self._context_variables = event.content.context_variables # type: ignore[attr-defined]
150
+ self.cost = event.content.cost # type: ignore[attr-defined]
151
+ break
152
+
153
+ if isinstance(event, ErrorEvent):
154
+ raise event.content.error # type: ignore[attr-defined]
155
+ except queue.Empty:
156
+ continue # Wait for more items in the queue
157
+
158
+ @property
159
+ def events(self) -> Iterable[BaseEvent]:
160
+ return self._queue_generator(self.iostream.input_stream)
161
+
162
+ @property
163
+ def messages(self) -> Iterable[Message]:
164
+ return self._messages
165
+
166
+ @property
167
+ def summary(self) -> Optional[str]:
168
+ return self._summary
169
+
170
+ @property
171
+ def above_run(self) -> Optional["RunResponseProtocol"]:
172
+ return None
173
+
174
+ @property
175
+ def uuid(self) -> UUID:
176
+ return self._uuid
177
+
178
+ @property
179
+ def context_variables(self) -> Optional[ContextVariables]:
180
+ return self._context_variables
181
+
182
+ @property
183
+ def last_speaker(self) -> Optional[str]:
184
+ return self._last_speaker
185
+
186
+ @property
187
+ def cost(self) -> Optional[Cost]:
188
+ return self._cost
189
+
190
+ @cost.setter
191
+ def cost(self, value: Union[Cost, dict[str, Any]]) -> None:
192
+ if isinstance(value, dict):
193
+ self._cost = Cost.from_raw(value)
194
+ else:
195
+ self._cost = value
196
+
197
+ def process(self, processor: Optional[EventProcessorProtocol] = None) -> None:
198
+ processor = processor or ConsoleEventProcessor()
199
+ processor.process(self)
200
+
201
+ def set_ui_tools(self, tools: list[Tool]) -> None:
202
+ """Set the UI tools for the agents."""
203
+ for agent in self.agents:
204
+ agent.set_ui_tools(tools)
205
+
206
+
207
+ class AsyncRunResponse:
208
+ def __init__(self, iostream: AsyncThreadIOStream, agents: list[Agent]):
209
+ self.iostream = iostream
210
+ self.agents = agents
211
+ self._summary: Optional[str] = None
212
+ self._messages: Sequence[LLMMessageType] = []
213
+ self._uuid = uuid4()
214
+ self._context_variables: Optional[ContextVariables] = None
215
+ self._last_speaker: Optional[str] = None
216
+ self._cost: Optional[Cost] = None
217
+
218
+ async def _queue_generator(self, q: AsyncQueue[Any]) -> AsyncIterable[BaseEvent]: # type: ignore[type-arg]
219
+ """A generator to yield items from the queue until the termination message is found."""
220
+ while True:
221
+ try:
222
+ # Get an item from the queue
223
+ event = await q.get()
224
+
225
+ if isinstance(event, InputRequestEvent):
226
+
227
+ async def respond(response: str) -> None:
228
+ await self.iostream._output_stream.put(response)
229
+
230
+ event.content.respond = respond # type: ignore[attr-defined]
231
+
232
+ yield event
233
+
234
+ if isinstance(event, RunCompletionEvent):
235
+ self._messages = event.content.history # type: ignore[attr-defined]
236
+ self._last_speaker = event.content.last_speaker # type: ignore[attr-defined]
237
+ self._summary = event.content.summary # type: ignore[attr-defined]
238
+ self._context_variables = event.content.context_variables # type: ignore[attr-defined]
239
+ self.cost = event.content.cost # type: ignore[attr-defined]
240
+ break
241
+
242
+ if isinstance(event, ErrorEvent):
243
+ raise event.content.error # type: ignore[attr-defined]
244
+ except queue.Empty:
245
+ continue
246
+
247
+ @property
248
+ def events(self) -> AsyncIterable[BaseEvent]:
249
+ return self._queue_generator(self.iostream.input_stream)
250
+
251
+ @property
252
+ async def messages(self) -> Iterable[Message]:
253
+ return self._messages
254
+
255
+ @property
256
+ async def summary(self) -> Optional[str]:
257
+ return self._summary
258
+
259
+ @property
260
+ def above_run(self) -> Optional["RunResponseProtocol"]:
261
+ return None
262
+
263
+ @property
264
+ def uuid(self) -> UUID:
265
+ return self._uuid
266
+
267
+ @property
268
+ async def context_variables(self) -> Optional[ContextVariables]:
269
+ return self._context_variables
270
+
271
+ @property
272
+ async def last_speaker(self) -> Optional[str]:
273
+ return self._last_speaker
274
+
275
+ @property
276
+ async def cost(self) -> Optional[Cost]:
277
+ return self._cost
278
+
279
+ @cost.setter
280
+ def cost(self, value: Union[Cost, dict[str, Any]]) -> None:
281
+ if isinstance(value, dict):
282
+ self._cost = Cost.from_raw(value)
283
+ else:
284
+ self._cost = value
285
+
286
+ async def process(self, processor: Optional[AsyncEventProcessorProtocol] = None) -> None:
287
+ processor = processor or AsyncConsoleEventProcessor()
288
+ await processor.process(self)
289
+
290
+ def set_ui_tools(self, tools: list[Tool]) -> None:
291
+ """Set the UI tools for the agents."""
292
+ for agent in self.agents:
293
+ agent.set_ui_tools(tools)
@@ -0,0 +1,63 @@
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 queue
6
+ from asyncio import Queue as AsyncQueue
7
+ from typing import TYPE_CHECKING, Any
8
+
9
+ from autogen.io.base import AsyncIOStreamProtocol, IOStreamProtocol
10
+
11
+ from ..events.agent_events import InputRequestEvent
12
+ from ..events.print_event import PrintEvent
13
+
14
+
15
+ class ThreadIOStream:
16
+ def __init__(self) -> None:
17
+ self._input_stream: queue.Queue = queue.Queue() # type: ignore[type-arg]
18
+ self._output_stream: queue.Queue = queue.Queue() # type: ignore[type-arg]
19
+
20
+ def input(self, prompt: str = "", *, password: bool = False) -> str:
21
+ self.send(InputRequestEvent(prompt=prompt, password=password)) # type: ignore[call-arg]
22
+ return self._output_stream.get() # type: ignore[no-any-return]
23
+
24
+ def print(self, *objects: Any, sep: str = " ", end: str = "\n", flush: bool = False) -> None:
25
+ print_message = PrintEvent(*objects, sep=sep, end=end)
26
+ self.send(print_message)
27
+
28
+ def send(self, message: Any) -> None:
29
+ self._input_stream.put(message)
30
+
31
+ @property
32
+ def input_stream(self) -> queue.Queue: # type: ignore[type-arg]
33
+ return self._input_stream
34
+
35
+
36
+ class AsyncThreadIOStream:
37
+ def __init__(self) -> None:
38
+ self._input_stream: AsyncQueue = AsyncQueue() # type: ignore[type-arg]
39
+ self._output_stream: AsyncQueue = AsyncQueue() # type: ignore[type-arg]
40
+
41
+ async def input(self, prompt: str = "", *, password: bool = False) -> str:
42
+ self.send(InputRequestEvent(prompt=prompt, password=password)) # type: ignore[call-arg]
43
+ return await self._output_stream.get() # type: ignore[no-any-return]
44
+
45
+ def print(self, *objects: Any, sep: str = " ", end: str = "\n", flush: bool = False) -> None:
46
+ print_message = PrintEvent(*objects, sep=sep, end=end)
47
+ self.send(print_message)
48
+
49
+ def send(self, message: Any) -> None:
50
+ self._input_stream.put_nowait(message)
51
+
52
+ @property
53
+ def input_stream(self) -> AsyncQueue[Any]:
54
+ return self._input_stream
55
+
56
+
57
+ if TYPE_CHECKING:
58
+
59
+ def check_type_1(x: ThreadIOStream) -> IOStreamProtocol:
60
+ return x
61
+
62
+ def check_type_2(x: AsyncThreadIOStream) -> AsyncIOStreamProtocol:
63
+ return x
@@ -0,0 +1,213 @@
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
+ import ssl
9
+ import threading
10
+ from contextlib import contextmanager
11
+ from functools import partial
12
+ from time import sleep
13
+ from typing import Any, Callable, Iterable, Iterator, Optional, Protocol, Union
14
+
15
+ from ..doc_utils import export_module
16
+ from ..events.base_event import BaseEvent
17
+ from ..events.print_event import PrintEvent
18
+ from ..import_utils import optional_import_block, require_optional_import
19
+ from .base import IOStream
20
+
21
+ # Check if the websockets module is available
22
+ with optional_import_block():
23
+ from websockets.sync.server import serve as ws_serve
24
+
25
+ __all__ = ("IOWebsockets",)
26
+
27
+
28
+ logger = logging.getLogger(__name__)
29
+ logger.setLevel(logging.INFO)
30
+
31
+ # The following type and protocols are used to define the ServerConnection and WebSocketServer classes
32
+ # if websockets is not installed, they would be untyped
33
+ Data = Union[str, bytes]
34
+
35
+
36
+ class ServerConnection(Protocol):
37
+ def send(self, message: Union[Data, Iterable[Data]]) -> None:
38
+ """Send a message to the client.
39
+
40
+ Args:
41
+ message (Union[Data, Iterable[Data]]): The message to send.
42
+
43
+ """
44
+ ... # pragma: no cover
45
+
46
+ def recv(self, timeout: Optional[float] = None) -> Data:
47
+ """Receive a message from the client.
48
+
49
+ Args:
50
+ timeout (Optional[float], optional): The timeout for the receive operation. Defaults to None.
51
+
52
+ Returns:
53
+ Data: The message received from the client.
54
+
55
+ """
56
+ ... # pragma: no cover
57
+
58
+ def close(self) -> None:
59
+ """Close the connection."""
60
+ ...
61
+
62
+
63
+ class WebSocketServer(Protocol):
64
+ def serve_forever(self) -> None:
65
+ """Run the server forever."""
66
+ ... # pragma: no cover
67
+
68
+ def shutdown(self) -> None:
69
+ """Shutdown the server."""
70
+ ... # pragma: no cover
71
+
72
+ def __enter__(self) -> "WebSocketServer":
73
+ """Enter the server context."""
74
+ ... # pragma: no cover
75
+
76
+ def __exit__(self, exc_type: Any, exc_value: Any, traceback: Any) -> None:
77
+ """Exit the server context."""
78
+ ... # pragma: no cover
79
+
80
+
81
+ @require_optional_import("websockets", "websockets")
82
+ @export_module("autogen.io")
83
+ class IOWebsockets(IOStream):
84
+ """A websocket input/output stream."""
85
+
86
+ def __init__(self, websocket: ServerConnection) -> None:
87
+ """Initialize the websocket input/output stream.
88
+
89
+ Args:
90
+ websocket (ServerConnection): The websocket server.
91
+ """
92
+ self._websocket = websocket
93
+
94
+ @staticmethod
95
+ def _handler(websocket: ServerConnection, on_connect: Callable[["IOWebsockets"], None]) -> None:
96
+ """The handler function for the websocket server."""
97
+ logger.info(f" - IOWebsockets._handler(): Client connected on {websocket}")
98
+ # create a new IOWebsockets instance using the websocket that is create when a client connects
99
+ try:
100
+ iowebsocket = IOWebsockets(websocket)
101
+ with IOStream.set_default(iowebsocket):
102
+ # call the on_connect function
103
+ try:
104
+ on_connect(iowebsocket)
105
+ except Exception as e:
106
+ logger.warning(f" - IOWebsockets._handler(): Error in on_connect: {e}")
107
+ except Exception as e:
108
+ logger.error(f" - IOWebsockets._handler(): Unexpected error in IOWebsockets: {e}")
109
+
110
+ @staticmethod
111
+ @contextmanager
112
+ def run_server_in_thread(
113
+ *,
114
+ host: str = "127.0.0.1",
115
+ port: int = 8765,
116
+ on_connect: Callable[["IOWebsockets"], None],
117
+ ssl_context: Optional[ssl.SSLContext] = None,
118
+ **kwargs: Any,
119
+ ) -> Iterator[str]:
120
+ """Factory function to create a websocket input/output stream.
121
+
122
+ Args:
123
+ host (str, optional): The host to bind the server to. Defaults to "127.0.0.1".
124
+ port (int, optional): The port to bind the server to. Defaults to 8765.
125
+ on_connect (Callable[[IOWebsockets], None]): The function to be executed on client connection. Typically creates agents and initiate chat.
126
+ ssl_context (Optional[ssl.SSLContext], optional): The SSL context to use for secure connections. Defaults to None.
127
+ kwargs (Any): Additional keyword arguments to pass to the websocket server.
128
+
129
+ Yields:
130
+ str: The URI of the websocket server.
131
+ """
132
+ server_dict: dict[str, WebSocketServer] = {}
133
+
134
+ def _run_server() -> None:
135
+ # print(f" - _run_server(): starting server on ws://{host}:{port}", flush=True)
136
+ with ws_serve(
137
+ handler=partial(IOWebsockets._handler, on_connect=on_connect),
138
+ host=host,
139
+ port=port,
140
+ ssl_context=ssl_context,
141
+ **kwargs,
142
+ ) as server:
143
+ # print(f" - _run_server(): server {server} started on ws://{host}:{port}", flush=True)
144
+
145
+ server_dict["server"] = server
146
+
147
+ # runs until the server is shutdown
148
+ server.serve_forever()
149
+
150
+ return
151
+
152
+ # start server in a separate thread
153
+ thread = threading.Thread(target=_run_server)
154
+ thread.start()
155
+ try:
156
+ while "server" not in server_dict:
157
+ sleep(0.1)
158
+
159
+ yield f"ws://{host}:{port}"
160
+
161
+ finally:
162
+ # print(f" - run_server_in_thread(): shutting down server on ws://{host}:{port}", flush=True)
163
+ # gracefully stop server
164
+ if "server" in server_dict:
165
+ # print(f" - run_server_in_thread(): shutting down server {server_dict['server']}", flush=True)
166
+ server_dict["server"].shutdown()
167
+
168
+ # wait for the thread to stop
169
+ if thread:
170
+ thread.join()
171
+
172
+ @property
173
+ def websocket(self) -> "ServerConnection":
174
+ """The URI of the websocket server."""
175
+ return self._websocket
176
+
177
+ def print(self, *objects: Any, sep: str = " ", end: str = "\n", flush: bool = False) -> None:
178
+ """Print data to the output stream.
179
+
180
+ Args:
181
+ objects (any): The data to print.
182
+ sep (str, optional): The separator between objects. Defaults to " ".
183
+ end (str, optional): The end of the output. Defaults to "\n".
184
+ flush (bool, optional): Whether to flush the output. Defaults to False.
185
+ """
186
+ print_message = PrintEvent(*objects, sep=sep, end=end)
187
+ self.send(print_message)
188
+
189
+ def send(self, message: BaseEvent) -> None:
190
+ """Send a message to the output stream.
191
+
192
+ Args:
193
+ message (Any): The message to send.
194
+ """
195
+ self._websocket.send(message.model_dump_json())
196
+
197
+ def input(self, prompt: str = "", *, password: bool = False) -> str:
198
+ """Read a line from the input stream.
199
+
200
+ Args:
201
+ prompt (str, optional): The prompt to display. Defaults to "".
202
+ password (bool, optional): Whether to read a password. Defaults to False.
203
+
204
+ Returns:
205
+ str: The line read from the input stream.
206
+
207
+ """
208
+ if prompt != "":
209
+ self._websocket.send(prompt)
210
+
211
+ msg = self._websocket.recv()
212
+
213
+ return msg.decode("utf-8") if isinstance(msg, bytes) else msg
autogen/json_utils.py ADDED
@@ -0,0 +1,43 @@
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 .import_utils import optional_import_block, require_optional_import
8
+
9
+ with optional_import_block():
10
+ from jsonschema import Draft7Validator, RefResolver
11
+
12
+ __all__ = ["resolve_json_references"]
13
+
14
+
15
+ @require_optional_import("jsonschema", "gemini")
16
+ def resolve_json_references(schema: dict[str, Any]) -> dict[str, Any]:
17
+ """
18
+ Resolve JSON references in the given schema.
19
+
20
+ Args:
21
+ schema (dict): The JSON schema with references.
22
+
23
+ Returns:
24
+ dict: The JSON schema with resolved references.
25
+ """
26
+ resolver = RefResolver.from_schema(schema)
27
+ validator = Draft7Validator(schema, resolver=resolver)
28
+ resolved_schema = validator.schema
29
+
30
+ def resolve_refs(node: Any) -> Any:
31
+ if isinstance(node, dict):
32
+ if "$ref" in node:
33
+ ref = node["$ref"]
34
+ with resolver.resolving(ref) as resolved:
35
+ return resolve_refs(resolved)
36
+ else:
37
+ return {k: resolve_refs(v) for k, v in node.items()}
38
+ elif isinstance(node, list):
39
+ return [resolve_refs(item) for item in node]
40
+ else:
41
+ return node
42
+
43
+ return resolve_refs(resolved_schema) # type: ignore[no-any-return]