ag2 0.9.1a1__py3-none-any.whl → 0.9.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.

Potentially problematic release.


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

Files changed (371) hide show
  1. {ag2-0.9.1a1.dist-info → ag2-0.9.2.dist-info}/METADATA +272 -75
  2. ag2-0.9.2.dist-info/RECORD +406 -0
  3. {ag2-0.9.1a1.dist-info → ag2-0.9.2.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 +4023 -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 +1013 -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 +179 -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 +382 -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/__main__.py +78 -0
  277. autogen/mcp/mcp_client.py +208 -0
  278. autogen/mcp/mcp_proxy/__init__.py +19 -0
  279. autogen/mcp/mcp_proxy/fastapi_code_generator_helpers.py +63 -0
  280. autogen/mcp/mcp_proxy/mcp_proxy.py +581 -0
  281. autogen/mcp/mcp_proxy/operation_grouping.py +158 -0
  282. autogen/mcp/mcp_proxy/operation_renaming.py +114 -0
  283. autogen/mcp/mcp_proxy/patch_fastapi_code_generator.py +98 -0
  284. autogen/mcp/mcp_proxy/security.py +400 -0
  285. autogen/mcp/mcp_proxy/security_schema_visitor.py +37 -0
  286. autogen/messages/__init__.py +7 -0
  287. autogen/messages/agent_messages.py +948 -0
  288. autogen/messages/base_message.py +107 -0
  289. autogen/messages/client_messages.py +171 -0
  290. autogen/messages/print_message.py +49 -0
  291. autogen/oai/__init__.py +53 -0
  292. autogen/oai/anthropic.py +714 -0
  293. autogen/oai/bedrock.py +628 -0
  294. autogen/oai/cerebras.py +299 -0
  295. autogen/oai/client.py +1444 -0
  296. autogen/oai/client_utils.py +169 -0
  297. autogen/oai/cohere.py +479 -0
  298. autogen/oai/gemini.py +998 -0
  299. autogen/oai/gemini_types.py +155 -0
  300. autogen/oai/groq.py +305 -0
  301. autogen/oai/mistral.py +303 -0
  302. autogen/oai/oai_models/__init__.py +11 -0
  303. autogen/oai/oai_models/_models.py +16 -0
  304. autogen/oai/oai_models/chat_completion.py +87 -0
  305. autogen/oai/oai_models/chat_completion_audio.py +32 -0
  306. autogen/oai/oai_models/chat_completion_message.py +86 -0
  307. autogen/oai/oai_models/chat_completion_message_tool_call.py +37 -0
  308. autogen/oai/oai_models/chat_completion_token_logprob.py +63 -0
  309. autogen/oai/oai_models/completion_usage.py +60 -0
  310. autogen/oai/ollama.py +643 -0
  311. autogen/oai/openai_utils.py +881 -0
  312. autogen/oai/together.py +370 -0
  313. autogen/retrieve_utils.py +491 -0
  314. autogen/runtime_logging.py +160 -0
  315. autogen/token_count_utils.py +267 -0
  316. autogen/tools/__init__.py +20 -0
  317. autogen/tools/contrib/__init__.py +9 -0
  318. autogen/tools/contrib/time/__init__.py +7 -0
  319. autogen/tools/contrib/time/time.py +41 -0
  320. autogen/tools/dependency_injection.py +254 -0
  321. autogen/tools/experimental/__init__.py +48 -0
  322. autogen/tools/experimental/browser_use/__init__.py +7 -0
  323. autogen/tools/experimental/browser_use/browser_use.py +161 -0
  324. autogen/tools/experimental/crawl4ai/__init__.py +7 -0
  325. autogen/tools/experimental/crawl4ai/crawl4ai.py +153 -0
  326. autogen/tools/experimental/deep_research/__init__.py +7 -0
  327. autogen/tools/experimental/deep_research/deep_research.py +328 -0
  328. autogen/tools/experimental/duckduckgo/__init__.py +7 -0
  329. autogen/tools/experimental/duckduckgo/duckduckgo_search.py +109 -0
  330. autogen/tools/experimental/google/__init__.py +14 -0
  331. autogen/tools/experimental/google/authentication/__init__.py +11 -0
  332. autogen/tools/experimental/google/authentication/credentials_hosted_provider.py +43 -0
  333. autogen/tools/experimental/google/authentication/credentials_local_provider.py +91 -0
  334. autogen/tools/experimental/google/authentication/credentials_provider.py +35 -0
  335. autogen/tools/experimental/google/drive/__init__.py +9 -0
  336. autogen/tools/experimental/google/drive/drive_functions.py +124 -0
  337. autogen/tools/experimental/google/drive/toolkit.py +88 -0
  338. autogen/tools/experimental/google/model.py +17 -0
  339. autogen/tools/experimental/google/toolkit_protocol.py +19 -0
  340. autogen/tools/experimental/google_search/__init__.py +8 -0
  341. autogen/tools/experimental/google_search/google_search.py +93 -0
  342. autogen/tools/experimental/google_search/youtube_search.py +181 -0
  343. autogen/tools/experimental/messageplatform/__init__.py +17 -0
  344. autogen/tools/experimental/messageplatform/discord/__init__.py +7 -0
  345. autogen/tools/experimental/messageplatform/discord/discord.py +288 -0
  346. autogen/tools/experimental/messageplatform/slack/__init__.py +7 -0
  347. autogen/tools/experimental/messageplatform/slack/slack.py +391 -0
  348. autogen/tools/experimental/messageplatform/telegram/__init__.py +7 -0
  349. autogen/tools/experimental/messageplatform/telegram/telegram.py +275 -0
  350. autogen/tools/experimental/perplexity/__init__.py +7 -0
  351. autogen/tools/experimental/perplexity/perplexity_search.py +260 -0
  352. autogen/tools/experimental/reliable/__init__.py +10 -0
  353. autogen/tools/experimental/reliable/reliable.py +1316 -0
  354. autogen/tools/experimental/tavily/__init__.py +7 -0
  355. autogen/tools/experimental/tavily/tavily_search.py +183 -0
  356. autogen/tools/experimental/web_search_preview/__init__.py +7 -0
  357. autogen/tools/experimental/web_search_preview/web_search_preview.py +114 -0
  358. autogen/tools/experimental/wikipedia/__init__.py +7 -0
  359. autogen/tools/experimental/wikipedia/wikipedia.py +287 -0
  360. autogen/tools/function_utils.py +411 -0
  361. autogen/tools/tool.py +187 -0
  362. autogen/tools/toolkit.py +86 -0
  363. autogen/types.py +29 -0
  364. autogen/version.py +7 -0
  365. templates/client_template/main.jinja2 +69 -0
  366. templates/config_template/config.jinja2 +7 -0
  367. templates/main.jinja2 +61 -0
  368. ag2-0.9.1a1.dist-info/RECORD +0 -6
  369. ag2-0.9.1a1.dist-info/top_level.txt +0 -1
  370. {ag2-0.9.1a1.dist-info → ag2-0.9.2.dist-info/licenses}/LICENSE +0 -0
  371. {ag2-0.9.1a1.dist-info → ag2-0.9.2.dist-info/licenses}/NOTICE.md +0 -0
@@ -0,0 +1,397 @@
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 base64
8
+ import copy
9
+ import os
10
+ import re
11
+ from io import BytesIO
12
+ from math import ceil
13
+ from typing import Any, Union
14
+
15
+ import requests
16
+
17
+ from ...import_utils import optional_import_block, require_optional_import
18
+ from .. import utils
19
+
20
+ with optional_import_block():
21
+ from PIL import Image
22
+
23
+
24
+ # Parameters for token counting for images for different models
25
+ MODEL_PARAMS = {
26
+ "gpt-4-vision": {
27
+ "max_edge": 2048,
28
+ "min_edge": 768,
29
+ "tile_size": 512,
30
+ "base_token_count": 85,
31
+ "token_multiplier": 170,
32
+ },
33
+ "gpt-4o-mini": {
34
+ "max_edge": 2048,
35
+ "min_edge": 768,
36
+ "tile_size": 512,
37
+ "base_token_count": 2833,
38
+ "token_multiplier": 5667,
39
+ },
40
+ "gpt-4o": {"max_edge": 2048, "min_edge": 768, "tile_size": 512, "base_token_count": 85, "token_multiplier": 170},
41
+ }
42
+
43
+
44
+ @require_optional_import("PIL", "unknown")
45
+ def get_pil_image(image_file: Union[str, "Image.Image"]) -> "Image.Image":
46
+ """Loads an image from a file and returns a PIL Image object.
47
+
48
+ Parameters:
49
+ image_file (str, or Image): The filename, URL, URI, or base64 string of the image file.
50
+
51
+ Returns:
52
+ Image.Image: The PIL Image object.
53
+ """
54
+ if isinstance(image_file, Image.Image):
55
+ # Already a PIL Image object
56
+ return image_file
57
+
58
+ # Remove quotes if existed
59
+ if image_file.startswith('"') and image_file.endswith('"'):
60
+ image_file = image_file[1:-1]
61
+ if image_file.startswith("'") and image_file.endswith("'"):
62
+ image_file = image_file[1:-1]
63
+
64
+ if image_file.startswith("http://") or image_file.startswith("https://"):
65
+ # A URL file
66
+ response = requests.get(image_file)
67
+ content = BytesIO(response.content)
68
+ image = Image.open(content)
69
+ # Match base64-encoded image URIs for supported formats: jpg, jpeg, png, gif, bmp, webp
70
+ elif re.match(r"data:image/(?:jpg|jpeg|png|gif|bmp|webp);base64,", image_file):
71
+ # A URI. Remove the prefix and decode the base64 string.
72
+ base64_data = re.sub(r"data:image/(?:jpg|jpeg|png|gif|bmp|webp);base64,", "", image_file)
73
+ image = _to_pil(base64_data)
74
+ elif os.path.exists(image_file):
75
+ # A local file
76
+ image = Image.open(image_file)
77
+ else:
78
+ # base64 encoded string
79
+ image = _to_pil(image_file)
80
+
81
+ return image.convert("RGB")
82
+
83
+
84
+ @require_optional_import("PIL", "unknown")
85
+ def get_image_data(image_file: Union[str, "Image.Image"], use_b64=True) -> bytes:
86
+ """Loads an image and returns its data either as raw bytes or in base64-encoded format.
87
+
88
+ This function first loads an image from the specified file, URL, or base64 string using
89
+ the `get_pil_image` function. It then saves this image in memory in PNG format and
90
+ retrieves its binary content. Depending on the `use_b64` flag, this binary content is
91
+ either returned directly or as a base64-encoded string.
92
+
93
+ Parameters:
94
+ image_file (str, or Image): The path to the image file, a URL to an image, or a base64-encoded
95
+ string of the image.
96
+ use_b64 (bool): If True, the function returns a base64-encoded string of the image data.
97
+ If False, it returns the raw byte data of the image. Defaults to True.
98
+
99
+ Returns:
100
+ bytes: The image data in raw bytes if `use_b64` is False, or a base64-encoded string
101
+ if `use_b64` is True.
102
+ """
103
+ image = get_pil_image(image_file)
104
+
105
+ buffered = BytesIO()
106
+ image.save(buffered, format="PNG")
107
+ content = buffered.getvalue()
108
+
109
+ if use_b64:
110
+ return base64.b64encode(content).decode("utf-8")
111
+ else:
112
+ return content
113
+
114
+
115
+ @require_optional_import("PIL", "unknown")
116
+ def llava_formatter(prompt: str, order_image_tokens: bool = False) -> tuple[str, list[str]]:
117
+ """Formats the input prompt by replacing image tags and returns the new prompt along with image locations.
118
+
119
+ Parameters:
120
+ - prompt (str): The input string that may contain image tags like `<img ...>`.
121
+ - order_image_tokens (bool, optional): Whether to order the image tokens with numbers.
122
+ It will be useful for GPT-4V. Defaults to False.
123
+
124
+ Returns:
125
+ - Tuple[str, List[str]]: A tuple containing the formatted string and a list of images (loaded in b64 format).
126
+ """
127
+ # Initialize variables
128
+ new_prompt = prompt
129
+ image_locations = []
130
+ images = []
131
+ image_count = 0
132
+
133
+ # Regular expression pattern for matching <img ...> tags
134
+ img_tag_pattern = re.compile(r"<img ([^>]+)>")
135
+
136
+ # Find all image tags
137
+ for match in img_tag_pattern.finditer(prompt):
138
+ image_location = match.group(1)
139
+
140
+ try:
141
+ img_data = get_image_data(image_location)
142
+ except Exception as e:
143
+ # Remove the token
144
+ print(f"Warning! Unable to load image from {image_location}, because of {e}")
145
+ new_prompt = new_prompt.replace(match.group(0), "", 1)
146
+ continue
147
+
148
+ image_locations.append(image_location)
149
+ images.append(img_data)
150
+
151
+ # Increment the image count and replace the tag in the prompt
152
+ new_token = f"<image {image_count}>" if order_image_tokens else "<image>"
153
+
154
+ new_prompt = new_prompt.replace(match.group(0), new_token, 1)
155
+ image_count += 1
156
+
157
+ return new_prompt, images
158
+
159
+
160
+ @require_optional_import("PIL", "unknown")
161
+ def pil_to_data_uri(image: "Image.Image") -> str:
162
+ """Converts a PIL Image object to a data URI.
163
+
164
+ Parameters:
165
+ image (Image.Image): The PIL Image object.
166
+
167
+ Returns:
168
+ str: The data URI string.
169
+ """
170
+ buffered = BytesIO()
171
+ image.save(buffered, format="PNG")
172
+ content = buffered.getvalue()
173
+ return convert_base64_to_data_uri(base64.b64encode(content).decode("utf-8"))
174
+
175
+
176
+ def convert_base64_to_data_uri(base64_image):
177
+ def _get_mime_type_from_data_uri(base64_image):
178
+ # Decode the base64 string
179
+ image_data = base64.b64decode(base64_image)
180
+ # Check the first few bytes for known signatures
181
+ if image_data.startswith(b"\xff\xd8\xff"):
182
+ return "image/jpeg"
183
+ elif image_data.startswith(b"\x89PNG\r\n\x1a\n"):
184
+ return "image/png"
185
+ elif image_data.startswith(b"GIF87a") or image_data.startswith(b"GIF89a"):
186
+ return "image/gif"
187
+ elif image_data.startswith(b"RIFF") and image_data[8:12] == b"WEBP":
188
+ return "image/webp"
189
+ return "image/jpeg" # use jpeg for unknown formats, best guess.
190
+
191
+ mime_type = _get_mime_type_from_data_uri(base64_image)
192
+ data_uri = f"data:{mime_type};base64,{base64_image}"
193
+ return data_uri
194
+
195
+
196
+ @require_optional_import("PIL", "unknown")
197
+ def gpt4v_formatter(prompt: str, img_format: str = "uri") -> list[Union[str, dict[str, Any]]]:
198
+ """Formats the input prompt by replacing image tags and returns a list of text and images.
199
+
200
+ Args:
201
+ prompt (str): The input string that may contain image tags like `<img ...>`.
202
+ img_format (str): what image format should be used. One of "uri", "url", "pil".
203
+
204
+ Returns:
205
+ List[Union[str, dict[str, Any]]]: A list of alternating text and image dictionary items.
206
+ """
207
+ assert img_format in ["uri", "url", "pil"]
208
+
209
+ output = []
210
+ last_index = 0
211
+ image_count = 0
212
+
213
+ # Find all image tags
214
+ for parsed_tag in utils.parse_tags_from_content("img", prompt):
215
+ image_location = parsed_tag["attr"]["src"]
216
+ try:
217
+ if img_format == "pil":
218
+ img_data = get_pil_image(image_location)
219
+ elif img_format == "uri":
220
+ img_data = get_image_data(image_location)
221
+ img_data = convert_base64_to_data_uri(img_data)
222
+ elif img_format == "url":
223
+ img_data = image_location
224
+ else:
225
+ raise ValueError(f"Unknown image format {img_format}")
226
+ except Exception as e:
227
+ # Warning and skip this token
228
+ print(f"Warning! Unable to load image from {image_location}, because {e}")
229
+ continue
230
+
231
+ # Add text before this image tag to output list
232
+ output.append({"type": "text", "text": prompt[last_index : parsed_tag["match"].start()]})
233
+
234
+ # Add image data to output list
235
+ output.append({"type": "image_url", "image_url": {"url": img_data}})
236
+
237
+ last_index = parsed_tag["match"].end()
238
+ image_count += 1
239
+
240
+ # Add remaining text to output list
241
+ output.append({"type": "text", "text": prompt[last_index:]})
242
+ return output
243
+
244
+
245
+ def extract_img_paths(paragraph: str) -> list:
246
+ """Extract image paths (URLs or local paths) from a text paragraph.
247
+
248
+ Parameters:
249
+ paragraph (str): The input text paragraph.
250
+
251
+ Returns:
252
+ list: A list of extracted image paths.
253
+ """
254
+ # Regular expression to match image URLs and file paths.
255
+ # This regex detects URLs and file paths with common image extensions, including support for the webp format.
256
+ img_path_pattern = re.compile(
257
+ r"\b(?:http[s]?://\S+\.(?:jpg|jpeg|png|gif|bmp|webp)|\S+\.(?:jpg|jpeg|png|gif|bmp|webp))\b", re.IGNORECASE
258
+ )
259
+
260
+ # Find all matches in the paragraph
261
+ img_paths = re.findall(img_path_pattern, paragraph)
262
+ return img_paths
263
+
264
+
265
+ @require_optional_import("PIL", "unknown")
266
+ def _to_pil(data: str) -> "Image.Image":
267
+ """Converts a base64 encoded image data string to a PIL Image object.
268
+
269
+ This function first decodes the base64 encoded string to bytes, then creates a BytesIO object from the bytes,
270
+ and finally creates and returns a PIL Image object from the BytesIO object.
271
+
272
+ Parameters:
273
+ data (str): The encoded image data string.
274
+
275
+ Returns:
276
+ Image.Image: The PIL Image object created from the input data.
277
+ """
278
+ return Image.open(BytesIO(base64.b64decode(data)))
279
+
280
+
281
+ @require_optional_import("PIL", "unknown")
282
+ def message_formatter_pil_to_b64(messages: list[dict[str, Any]]) -> list[dict[str, Any]]:
283
+ """Converts the PIL image URLs in the messages to base64 encoded data URIs.
284
+
285
+ This function iterates over a list of message dictionaries. For each message,
286
+ if it contains a 'content' key with a list of items, it looks for items
287
+ with an 'image_url' key. The function then converts the PIL image URL
288
+ (pointed to by 'image_url') to a base64 encoded data URI.
289
+
290
+ Parameters:
291
+ messages (List[Dict]): A list of message dictionaries. Each dictionary
292
+ may contain a 'content' key with a list of items,
293
+ some of which might be image URLs.
294
+
295
+ Returns:
296
+ List[Dict]: A new list of message dictionaries with PIL image URLs in the
297
+ 'image_url' key converted to base64 encoded data URIs.
298
+
299
+ Example Input:
300
+ ```python
301
+ [
302
+ {'content': [{'type': 'text', 'text': 'You are a helpful AI assistant.'}], 'role': 'system'},
303
+ {'content': [
304
+ {'type': 'text', 'text': "What's the breed of this dog here?"},
305
+ {'type': 'image_url', 'image_url': {'url': a PIL.Image.Image}},
306
+ {'type': 'text', 'text': '.'}],
307
+ 'role': 'user'}
308
+ ]
309
+ ```
310
+
311
+ Example Output:
312
+ ```python
313
+ [
314
+ {'content': [{'type': 'text', 'text': 'You are a helpful AI assistant.'}], 'role': 'system'},
315
+ {'content': [
316
+ {'type': 'text', 'text': "What's the breed of this dog here?"},
317
+ {'type': 'image_url', 'image_url': {'url': a B64 Image}},
318
+ {'type': 'text', 'text': '.'}],
319
+ 'role': 'user'}
320
+ ]
321
+ ```
322
+ """
323
+ new_messages = []
324
+ for message in messages:
325
+ # Handle the new GPT messages format.
326
+ if isinstance(message, dict) and "content" in message and isinstance(message["content"], list):
327
+ message = copy.deepcopy(message)
328
+ for item in message["content"]:
329
+ if isinstance(item, dict) and "image_url" in item:
330
+ item["image_url"]["url"] = pil_to_data_uri(item["image_url"]["url"])
331
+
332
+ new_messages.append(message)
333
+
334
+ return new_messages
335
+
336
+
337
+ @require_optional_import("PIL", "unknown")
338
+ def num_tokens_from_gpt_image(
339
+ image_data: Union[str, "Image.Image"], model: str = "gpt-4-vision", low_quality: bool = False
340
+ ) -> int:
341
+ """Calculate the number of tokens required to process an image based on its dimensions
342
+ after scaling for different GPT models. Supports "gpt-4-vision", "gpt-4o", and "gpt-4o-mini".
343
+ This function scales the image so that its longest edge is at most 2048 pixels and its shortest
344
+ edge is at most 768 pixels (for "gpt-4-vision"). It then calculates the number of 512x512 tiles
345
+ needed to cover the scaled image and computes the total tokens based on the number of these tiles.
346
+
347
+ Reference: https://openai.com/api/pricing/
348
+
349
+ Args:
350
+ image_data : Union[str, Image.Image]: The image data which can either be a base64 encoded string, a URL, a file path, or a PIL Image object.
351
+ model: str: The model being used for image processing. Can be "gpt-4-vision", "gpt-4o", or "gpt-4o-mini".
352
+ low_quality: bool: Whether to use low-quality processing. Defaults to False.
353
+
354
+ Returns:
355
+ int: The total number of tokens required for processing the image.
356
+
357
+ Examples:
358
+ --------
359
+ >>> from PIL import Image
360
+ >>> img = Image.new("RGB", (2500, 2500), color="red")
361
+ >>> num_tokens_from_gpt_image(img, model="gpt-4-vision")
362
+ 765
363
+ """
364
+ image = get_pil_image(image_data) # PIL Image
365
+ width, height = image.size
366
+
367
+ # Determine model parameters
368
+ if "gpt-4-vision" in model or "gpt-4-turbo" in model or "gpt-4v" in model or "gpt-4-v" in model:
369
+ params = MODEL_PARAMS["gpt-4-vision"]
370
+ elif "gpt-4o-mini" in model:
371
+ params = MODEL_PARAMS["gpt-4o-mini"]
372
+ elif "gpt-4o" in model:
373
+ params = MODEL_PARAMS["gpt-4o"]
374
+ else:
375
+ raise ValueError(
376
+ f"Model {model} is not supported. Choose 'gpt-4-vision', 'gpt-4-turbo', 'gpt-4v', 'gpt-4-v', 'gpt-4o', or 'gpt-4o-mini'."
377
+ )
378
+
379
+ if low_quality:
380
+ return params["base_token_count"]
381
+
382
+ # 1. Constrain the longest edge
383
+ if max(width, height) > params["max_edge"]:
384
+ scale_factor = params["max_edge"] / max(width, height)
385
+ width, height = int(width * scale_factor), int(height * scale_factor)
386
+
387
+ # 2. Further constrain the shortest edge
388
+ if min(width, height) > params["min_edge"]:
389
+ scale_factor = params["min_edge"] / min(width, height)
390
+ width, height = int(width * scale_factor), int(height * scale_factor)
391
+
392
+ # 3. Count how many tiles are needed to cover the image
393
+ tiles_width = ceil(width / params["tile_size"])
394
+ tiles_height = ceil(height / params["tile_size"])
395
+ total_tokens = params["base_token_count"] + params["token_multiplier"] * (tiles_width * tiles_height)
396
+
397
+ return total_tokens
@@ -0,0 +1,117 @@
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
+ from typing import Any, Optional, Union
8
+
9
+ from ... import OpenAIWrapper
10
+ from ...import_utils import optional_import_block, require_optional_import
11
+ from .. import Agent, ConversableAgent
12
+ from .vectordb.utils import get_logger
13
+
14
+ logger = get_logger(__name__)
15
+
16
+ with optional_import_block():
17
+ from llama_index.core.agent.runner.base import AgentRunner
18
+ from llama_index.core.base.llms.types import ChatMessage
19
+ from llama_index.core.chat_engine.types import AgentChatResponse
20
+ from pydantic import BaseModel, ConfigDict
21
+
22
+ Config = ConfigDict(arbitrary_types_allowed=True)
23
+
24
+ # Add Pydantic configuration to allow arbitrary types
25
+ # Added to mitigate PydanticSchemaGenerationError
26
+ BaseModel.model_config = Config
27
+
28
+
29
+ @require_optional_import("llama_index", "neo4j")
30
+ class LLamaIndexConversableAgent(ConversableAgent):
31
+ def __init__(
32
+ self,
33
+ name: str,
34
+ llama_index_agent: "AgentRunner",
35
+ description: Optional[str] = None,
36
+ **kwargs: Any,
37
+ ):
38
+ """Args:
39
+ name (str): agent name.
40
+ llama_index_agent (AgentRunner): llama index agent.
41
+ Please override this attribute if you want to reprogram the agent.
42
+ description (str): a short description of the agent. This description is used by other agents
43
+ (e.g. the GroupChatManager) to decide when to call upon this agent.
44
+ **kwargs (dict): Please refer to other kwargs in
45
+ [ConversableAgent](/docs/api-reference/autogen/ConversableAgent#conversableagent).
46
+ """
47
+ if llama_index_agent is None:
48
+ raise ValueError("llama_index_agent must be provided")
49
+
50
+ if not description or description.strip() == "":
51
+ raise ValueError("description must be provided")
52
+
53
+ super().__init__(
54
+ name,
55
+ description=description,
56
+ **kwargs,
57
+ )
58
+
59
+ self._llama_index_agent = llama_index_agent
60
+
61
+ # Override the `generate_oai_reply`
62
+ self.replace_reply_func(ConversableAgent.generate_oai_reply, LLamaIndexConversableAgent._generate_oai_reply)
63
+
64
+ self.replace_reply_func(ConversableAgent.a_generate_oai_reply, LLamaIndexConversableAgent._a_generate_oai_reply)
65
+
66
+ def _generate_oai_reply(
67
+ self,
68
+ messages: Optional[list[dict[str, Any]]] = None,
69
+ sender: Optional[Agent] = None,
70
+ config: Optional[OpenAIWrapper] = None,
71
+ ) -> tuple[bool, Optional[Union[str, dict[str, Any]]]]:
72
+ """Generate a reply using autogen.oai."""
73
+ user_message, history = self._extract_message_and_history(messages=messages, sender=sender)
74
+
75
+ chat_response: AgentChatResponse = self._llama_index_agent.chat(message=user_message, chat_history=history)
76
+
77
+ extracted_response = chat_response.response
78
+
79
+ return (True, extracted_response)
80
+
81
+ async def _a_generate_oai_reply(
82
+ self,
83
+ messages: Optional[list[dict[str, Any]]] = None,
84
+ sender: Optional[Agent] = None,
85
+ config: Optional[OpenAIWrapper] = None,
86
+ ) -> tuple[bool, Optional[Union[str, dict[str, Any]]]]:
87
+ """Generate a reply using autogen.oai."""
88
+ user_message, history = self._extract_message_and_history(messages=messages, sender=sender)
89
+
90
+ chat_response: AgentChatResponse = await self._llama_index_agent.achat(
91
+ message=user_message, chat_history=history
92
+ )
93
+
94
+ extracted_response = chat_response.response
95
+
96
+ return (True, extracted_response)
97
+
98
+ def _extract_message_and_history(
99
+ self, messages: Optional[list[dict[str, Any]]] = None, sender: Optional[Agent] = None
100
+ ) -> tuple[str, list["ChatMessage"]]:
101
+ """Extract the message and history from the messages."""
102
+ if not messages:
103
+ messages = self._oai_messages[sender]
104
+
105
+ if not messages:
106
+ return "", []
107
+
108
+ message = messages[-1].get("content", "")
109
+
110
+ history = messages[:-1]
111
+ history_messages: list[ChatMessage] = []
112
+ for history_message in history:
113
+ content = history_message.get("content", "")
114
+ role = history_message.get("role", "user")
115
+ if role and (role == "user" or role == "assistant"):
116
+ history_messages.append(ChatMessage(content=content, role=role, additional_kwargs={}))
117
+ return message, history_messages