ag2 0.9.1a1__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.1a1.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.1a1.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.1a1.dist-info/RECORD +0 -6
  355. ag2-0.9.1a1.dist-info/top_level.txt +0 -1
  356. {ag2-0.9.1a1.dist-info → ag2-0.9.1.post0.dist-info/licenses}/LICENSE +0 -0
  357. {ag2-0.9.1a1.dist-info → ag2-0.9.1.post0.dist-info/licenses}/NOTICE.md +0 -0
@@ -0,0 +1,461 @@
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 logging
6
+ from copy import deepcopy
7
+ from pathlib import Path
8
+ from typing import Annotated, Any, Optional, Union, cast
9
+
10
+ from pydantic import BaseModel, Field
11
+
12
+ from .... import Agent, ConversableAgent, UpdateSystemMessage
13
+ from ....agentchat.contrib.rag.query_engine import RAGQueryEngine
14
+ from ....agentchat.group.context_condition import ExpressionContextCondition
15
+ from ....agentchat.group.context_expression import ContextExpression
16
+ from ....agentchat.group.context_variables import ContextVariables
17
+ from ....agentchat.group.llm_condition import StringLLMCondition
18
+ from ....agentchat.group.multi_agent_chat import initiate_group_chat
19
+ from ....agentchat.group.on_condition import OnCondition
20
+ from ....agentchat.group.on_context_condition import OnContextCondition
21
+ from ....agentchat.group.patterns.pattern import DefaultPattern
22
+ from ....agentchat.group.reply_result import ReplyResult
23
+ from ....agentchat.group.targets.transition_target import AgentNameTarget, AgentTarget, StayTarget, TerminateTarget
24
+ from ....doc_utils import export_module
25
+ from ....llm_config import LLMConfig
26
+ from ....oai.client import OpenAIWrapper
27
+ from .chroma_query_engine import VectorChromaQueryEngine
28
+ from .docling_doc_ingest_agent import DoclingDocIngestAgent
29
+ from .document_conditions import SummaryTaskAvailableCondition
30
+ from .document_utils import Ingest, Query
31
+
32
+ __all__ = ["DocAgent"]
33
+
34
+ logger = logging.getLogger(__name__)
35
+
36
+ DEFAULT_SYSTEM_MESSAGE = """
37
+ You are a document agent.
38
+ You are given a list of documents to ingest and a list of queries to perform.
39
+ You are responsible for ingesting the documents and answering the queries.
40
+ """
41
+ TASK_MANAGER_NAME = "TaskManagerAgent"
42
+ TASK_MANAGER_SYSTEM_MESSAGE = """
43
+ You are a task manager agent. You have 2 priorities:
44
+ 1. You initiate the tasks which updates the context variables based on the task decisions (DocumentTask) from the DocumentTriageAgent.
45
+ If the DocumentTriageAgent has suggested any ingestions or queries, call initiate_tasks to record them.
46
+ Put all ingestion and query tasks into the one tool call.
47
+ i.e. output
48
+ {
49
+ "ingestions": [
50
+ {
51
+ "path_or_url": "path_or_url"
52
+ }
53
+ ],
54
+ "queries": [
55
+ {
56
+ "query_type": "RAG_QUERY",
57
+ "query": "query"
58
+ }
59
+ ],
60
+ "query_results": [
61
+ {
62
+ "query": "query",
63
+ "result": "result"
64
+ }
65
+ ]
66
+ }
67
+ 2. If there are no documents to ingest and no queries to run, hand control off to the summary agent.
68
+
69
+ Put all file paths and URLs into the ingestions. A http/https URL is also a valid path and should be ingested.
70
+
71
+ Use the initiate_tasks tool to incorporate all ingestions and queries. Don't call it again until new ingestions or queries are raised.
72
+
73
+ New ingestions and queries may be raised from time to time, so use the initiate_tasks again if you see new ingestions/queries.
74
+
75
+ Transfer to the summary agent if all ingestion and query tasks are done.
76
+ """
77
+
78
+ DEFAULT_ERROR_SWARM_MESSAGE: str = """
79
+ Document Agent failed to perform task.
80
+ """
81
+
82
+ ERROR_MANAGER_NAME = "ErrorManagerAgent"
83
+ ERROR_MANAGER_SYSTEM_MESSAGE = """
84
+ You communicate errors to the user. Include the original error messages in full. Use the format:
85
+ The following error(s) have occurred:
86
+ - Error 1
87
+ - Error 2
88
+ """
89
+
90
+
91
+ class DocumentTask(BaseModel):
92
+ """The structured output format for task decisions."""
93
+
94
+ ingestions: list[Ingest] = Field(description="The list of documents to ingest.")
95
+ queries: list[Query] = Field(description="The list of queries to perform.")
96
+
97
+ def format(self) -> str:
98
+ """Format the DocumentTask as a string for the TaskManager to work with."""
99
+ if len(self.ingestions) == 0 and len(self.queries) == 0:
100
+ return "There were no ingestion or query tasks detected."
101
+
102
+ instructions = "Tasks:\n\n"
103
+ order = 1
104
+
105
+ if len(self.ingestions) > 0:
106
+ instructions += "Ingestions:\n"
107
+ for ingestion in self.ingestions:
108
+ instructions += f"{order}: {ingestion.path_or_url}\n"
109
+ order += 1
110
+
111
+ instructions += "\n"
112
+
113
+ if len(self.queries) > 0:
114
+ instructions += "Queries:\n"
115
+ for query in self.queries:
116
+ instructions += f"{order}: {query.query}\n"
117
+ order += 1
118
+
119
+ return instructions
120
+
121
+
122
+ class DocumentTriageAgent(ConversableAgent):
123
+ """The DocumentTriageAgent is responsible for deciding what type of task to perform from user requests."""
124
+
125
+ def __init__(self, llm_config: Optional[Union[LLMConfig, dict[str, Any]]] = None):
126
+ # Add the structured message to the LLM configuration
127
+ structured_config_list = deepcopy(llm_config)
128
+ structured_config_list["response_format"] = DocumentTask # type: ignore[index]
129
+
130
+ super().__init__(
131
+ name="DocumentTriageAgent",
132
+ system_message=(
133
+ "You are a document triage agent. "
134
+ "You are responsible for deciding what type of task to perform from a user's request and populating a DocumentTask formatted response. "
135
+ "If the user specifies files or URLs, add them as individual 'ingestions' to DocumentTask. "
136
+ "You can access external websites if given a URL, so put them in as ingestions. "
137
+ "Add the user's questions about the files/URLs as individual 'RAG_QUERY' queries to the 'query' list in the DocumentTask. "
138
+ "Don't make up questions, keep it as concise and close to the user's request as possible."
139
+ ),
140
+ human_input_mode="NEVER",
141
+ llm_config=structured_config_list,
142
+ )
143
+
144
+
145
+ @export_module("autogen.agents.experimental")
146
+ class DocAgent(ConversableAgent):
147
+ """
148
+ The DocAgent is responsible for ingest and querying documents.
149
+
150
+ Internally, it generates a group of swarm agents to solve tasks.
151
+ """
152
+
153
+ def __init__(
154
+ self,
155
+ name: Optional[str] = None,
156
+ llm_config: Optional[Union[LLMConfig, dict[str, Any]]] = None,
157
+ system_message: Optional[str] = None,
158
+ parsed_docs_path: Optional[Union[str, Path]] = None,
159
+ collection_name: Optional[str] = None,
160
+ query_engine: Optional[RAGQueryEngine] = None,
161
+ ):
162
+ """Initialize the DocAgent.
163
+
164
+ Args:
165
+ name (Optional[str]): The name of the DocAgent.
166
+ llm_config (Optional[LLMConfig, dict[str, Any]]): The configuration for the LLM.
167
+ system_message (Optional[str]): The system message for the DocAgent.
168
+ parsed_docs_path (Union[str, Path]): The path where parsed documents will be stored.
169
+ collection_name (Optional[str]): The unique name for the data store collection. If omitted, a random name will be used. Populate this to reuse previous ingested data.
170
+ query_engine (Optional[RAGQueryEngine]): The query engine to use for querying documents, defaults to VectorChromaQueryEngine if none provided.
171
+ Use enable_query_citations and implement query_with_citations method to enable citation support. e.g. VectorChromaCitationQueryEngine
172
+
173
+ The DocAgent is responsible for generating a group of agents to solve a task.
174
+
175
+ The agents that the DocAgent generates are:
176
+ - Triage Agent: responsible for deciding what type of task to perform from user requests.
177
+ - Task Manager Agent: responsible for managing the tasks.
178
+ - Parser Agent: responsible for parsing the documents.
179
+ - Data Ingestion Agent: responsible for ingesting the documents.
180
+ - Query Agent: responsible for answering the user's questions.
181
+ - Error Agent: responsible for returning errors gracefully.
182
+ - Summary Agent: responsible for generating a summary of the user's questions.
183
+ """
184
+ name = name or "DocAgent"
185
+ llm_config = llm_config or LLMConfig.get_current_llm_config()
186
+ system_message = system_message or DEFAULT_SYSTEM_MESSAGE
187
+ parsed_docs_path = parsed_docs_path or "./parsed_docs"
188
+
189
+ # Default Query Engine will be ChromaDB
190
+ if query_engine is None:
191
+ query_engine = VectorChromaQueryEngine(collection_name=collection_name)
192
+
193
+ super().__init__(
194
+ name=name,
195
+ system_message=system_message,
196
+ llm_config=llm_config,
197
+ human_input_mode="NEVER",
198
+ )
199
+ self.register_reply([ConversableAgent, None], self.generate_inner_swarm_reply, position=0)
200
+
201
+ self.context_variables: ContextVariables = ContextVariables(
202
+ data={
203
+ "DocumentsToIngest": [],
204
+ "DocumentsIngested": [],
205
+ "QueriesToRun": [],
206
+ "QueryResults": [],
207
+ }
208
+ )
209
+
210
+ self._triage_agent = DocumentTriageAgent(llm_config=llm_config)
211
+
212
+ def create_error_agent_prompt(agent: ConversableAgent, messages: list[dict[str, Any]]) -> str:
213
+ """Create the error agent prompt, primarily used to update ingested documents for ending"""
214
+ update_ingested_documents()
215
+
216
+ return ERROR_MANAGER_SYSTEM_MESSAGE
217
+
218
+ self._error_agent = ConversableAgent(
219
+ name=ERROR_MANAGER_NAME,
220
+ system_message=ERROR_MANAGER_SYSTEM_MESSAGE,
221
+ llm_config=llm_config,
222
+ update_agent_state_before_reply=[UpdateSystemMessage(create_error_agent_prompt)],
223
+ )
224
+
225
+ def update_ingested_documents() -> None:
226
+ """Updates the list of ingested documents, persisted so we can keep a list over multiple replies"""
227
+ agent_documents_ingested = self._triage_agent.context_variables.get("DocumentsIngested", [])
228
+ # Update self.documents_ingested with any new documents ingested
229
+ for doc in agent_documents_ingested: # type: ignore[union-attr]
230
+ if doc not in self.documents_ingested:
231
+ self.documents_ingested.append(doc)
232
+
233
+ class TaskInitInfo(BaseModel):
234
+ ingestions: Annotated[list[Ingest], Field(description="List of documents, files, and URLs to ingest")]
235
+ queries: Annotated[list[Query], Field(description="List of queries to run")]
236
+
237
+ def initiate_tasks(
238
+ task_init_info: Annotated[TaskInitInfo, "Documents, Files, URLs to ingest and the queries to run"],
239
+ context_variables: Annotated[ContextVariables, "Context variables"],
240
+ ) -> ReplyResult:
241
+ """Add documents to ingest and queries to answer when received."""
242
+ ingestions = task_init_info.ingestions
243
+ queries = task_init_info.queries
244
+
245
+ if "TaskInitiated" in context_variables:
246
+ return ReplyResult(message="Task already initiated", context_variables=context_variables)
247
+ context_variables["DocumentsToIngest"] = ingestions
248
+ context_variables["QueriesToRun"] = [query for query in queries]
249
+ context_variables["TaskInitiated"] = True
250
+ return ReplyResult(
251
+ message="Updated context variables with task decisions",
252
+ context_variables=context_variables,
253
+ target=AgentNameTarget(agent_name=TASK_MANAGER_NAME),
254
+ )
255
+
256
+ self._task_manager_agent = ConversableAgent(
257
+ name=TASK_MANAGER_NAME,
258
+ system_message=TASK_MANAGER_SYSTEM_MESSAGE,
259
+ llm_config=llm_config,
260
+ functions=[initiate_tasks],
261
+ )
262
+
263
+ self._triage_agent.handoffs.set_after_work(target=AgentTarget(agent=self._task_manager_agent))
264
+
265
+ self._data_ingestion_agent = DoclingDocIngestAgent(
266
+ llm_config=llm_config,
267
+ query_engine=query_engine,
268
+ parsed_docs_path=parsed_docs_path,
269
+ return_agent_success=TASK_MANAGER_NAME,
270
+ return_agent_error=ERROR_MANAGER_NAME,
271
+ )
272
+
273
+ def execute_rag_query(context_variables: ContextVariables) -> ReplyResult: # type: ignore[type-arg]
274
+ """Execute outstanding RAG queries, call the tool once for each outstanding query. Call this tool with no arguments."""
275
+ if len(context_variables["QueriesToRun"]) == 0:
276
+ return ReplyResult(
277
+ target=AgentNameTarget(agent_name=TASK_MANAGER_NAME),
278
+ message="No queries to run",
279
+ context_variables=context_variables,
280
+ )
281
+
282
+ query = context_variables["QueriesToRun"][0].query
283
+ try:
284
+ if (
285
+ hasattr(query_engine, "enable_query_citations")
286
+ and query_engine.enable_query_citations
287
+ and hasattr(query_engine, "query_with_citations")
288
+ and callable(query_engine.query_with_citations)
289
+ ):
290
+ answer_with_citations = query_engine.query_with_citations(query) # type: ignore[union-attr]
291
+ answer = answer_with_citations.answer
292
+ txt_citations = [
293
+ {
294
+ "text_chunk": source.node.get_text(),
295
+ "file_path": source.metadata["file_path"],
296
+ }
297
+ for source in answer_with_citations.citations
298
+ ]
299
+ logger.info(f"Citations:\n {txt_citations}")
300
+ else:
301
+ answer = query_engine.query(query)
302
+ txt_citations = []
303
+ context_variables["QueriesToRun"].pop(0)
304
+ context_variables["CompletedTaskCount"] += 1
305
+ context_variables["QueryResults"].append({"query": query, "answer": answer, "citations": txt_citations})
306
+ return ReplyResult(message=answer, context_variables=context_variables)
307
+ except Exception as e:
308
+ return ReplyResult(
309
+ target=AgentNameTarget(agent_name=ERROR_MANAGER_NAME),
310
+ message=f"Query failed for '{query}': {e}",
311
+ context_variables=context_variables,
312
+ )
313
+
314
+ self._query_agent = ConversableAgent(
315
+ name="QueryAgent",
316
+ system_message="""
317
+ You are a query agent.
318
+ You answer the user's questions only using the query function provided to you.
319
+ You can only call use the execute_rag_query tool once per turn.
320
+ """,
321
+ llm_config=llm_config,
322
+ functions=[execute_rag_query],
323
+ )
324
+
325
+ # Summary agent prompt will include the results of the ingestions and swarms
326
+ def create_summary_agent_prompt(agent: ConversableAgent, messages: list[dict[str, Any]]) -> str:
327
+ """Create the summary agent prompt and updates ingested documents"""
328
+ update_ingested_documents()
329
+
330
+ documents_to_ingest: list[Ingest] = cast(list[Ingest], agent.context_variables.get("DocumentsToIngest", []))
331
+ queries_to_run: list[Query] = cast(list[Query], agent.context_variables.get("QueriesToRun", []))
332
+
333
+ system_message = (
334
+ "You are a summary agent and you provide a summary of all completed tasks and the list of queries and their answers. "
335
+ "Output two sections: 'Ingestions:' and 'Queries:' with the results of the tasks. Number the ingestions and queries. "
336
+ "If there are no ingestions output 'No ingestions', if there are no queries output 'No queries' under their respective sections. "
337
+ "Don't add markdown formatting. "
338
+ "For each query, there is one answer and, optionally, a list of citations."
339
+ "For each citation, it contains two fields: 'text_chunk' and 'file_path'."
340
+ "Format the Query and Answers and Citations as 'Query:\nAnswer:\n\nCitations:'. Add a number to each query if more than one. Use the context below:\n"
341
+ "For each query, output the full citation contents and list them one by one,"
342
+ "format each citation as '\nSource [X] (chunk file_path here):\n\nChunk X:\n(text_chunk here)' and mark a separator between each citation using '\n#########################\n\n'."
343
+ "If there are no citations at all, DON'T INCLUDE ANY mention of citations.\n"
344
+ f"Documents ingested: {documents_to_ingest}\n"
345
+ f"Documents left to ingest: {len(documents_to_ingest)}\n"
346
+ f"Queries left to run: {len(queries_to_run)}\n"
347
+ f"Query and Answers and Citations: {queries_to_run}\n"
348
+ )
349
+
350
+ return system_message
351
+
352
+ self._summary_agent = ConversableAgent(
353
+ name="SummaryAgent",
354
+ llm_config=llm_config,
355
+ update_agent_state_before_reply=[UpdateSystemMessage(create_summary_agent_prompt)],
356
+ )
357
+
358
+ self._task_manager_agent.register_handoffs([
359
+ OnContextCondition( # Go straight to data ingestion agent if we have documents to ingest
360
+ target=AgentTarget(agent=self._data_ingestion_agent),
361
+ condition=ExpressionContextCondition(
362
+ expression=ContextExpression(expression="len(${DocumentsToIngest}) > 0")
363
+ ),
364
+ ),
365
+ OnContextCondition( # Go to Query agent if we have queries to run (ingestion above run first)
366
+ target=AgentTarget(agent=self._query_agent),
367
+ condition=ExpressionContextCondition(
368
+ expression=ContextExpression(expression="len(${QueriesToRun}) > 0")
369
+ ),
370
+ ),
371
+ OnContextCondition( # Go to Summary agent if no documents or queries left to run and we have query results
372
+ target=AgentTarget(agent=self._summary_agent),
373
+ condition=ExpressionContextCondition(
374
+ expression=ContextExpression(
375
+ expression="len(${DocumentsToIngest}) == 0 and len(${QueriesToRun}) == 0 and len(${QueryResults}) > 0"
376
+ )
377
+ ),
378
+ ),
379
+ OnCondition(
380
+ target=AgentTarget(agent=self._summary_agent),
381
+ condition=StringLLMCondition(
382
+ prompt="Call this function if all work is done and a summary will be created"
383
+ ),
384
+ available=SummaryTaskAvailableCondition(), # Custom AvailableCondition class
385
+ ),
386
+ ])
387
+ self._task_manager_agent.handoffs.set_after_work(target=StayTarget())
388
+
389
+ self._data_ingestion_agent.handoffs.set_after_work(target=AgentTarget(agent=self._task_manager_agent))
390
+
391
+ self._query_agent.handoffs.set_after_work(target=AgentTarget(agent=self._task_manager_agent))
392
+
393
+ # Summary agent terminates the DocumentAgent
394
+ self._summary_agent.handoffs.set_after_work(target=TerminateTarget())
395
+
396
+ # The Error Agent always terminates the DocumentAgent
397
+ self._error_agent.handoffs.set_after_work(target=TerminateTarget())
398
+
399
+ self.register_reply([Agent, None], DocAgent.generate_inner_swarm_reply)
400
+
401
+ self.documents_ingested: list[str] = []
402
+
403
+ def generate_inner_swarm_reply(
404
+ self,
405
+ messages: Optional[Union[list[dict[str, Any]], str]] = None,
406
+ sender: Optional[Agent] = None,
407
+ config: Optional[OpenAIWrapper] = None,
408
+ ) -> tuple[bool, Optional[Union[str, dict[str, Any]]]]:
409
+ """Reply function that generates the inner swarm reply for the DocAgent."""
410
+ context_variables: ContextVariables = ContextVariables(
411
+ data={
412
+ "CompletedTaskCount": 0,
413
+ "DocumentsToIngest": [],
414
+ "DocumentsIngested": self.documents_ingested,
415
+ "QueriesToRun": [],
416
+ "QueryResults": [],
417
+ }
418
+ )
419
+
420
+ swarm_agents = [
421
+ self._triage_agent,
422
+ self._task_manager_agent,
423
+ self._data_ingestion_agent,
424
+ self._query_agent,
425
+ self._summary_agent,
426
+ self._error_agent,
427
+ ]
428
+
429
+ agent_pattern = DefaultPattern(
430
+ initial_agent=self._triage_agent,
431
+ agents=swarm_agents,
432
+ context_variables=context_variables,
433
+ group_after_work=TerminateTarget(),
434
+ )
435
+
436
+ chat_result, context_variables, last_speaker = initiate_group_chat(
437
+ pattern=agent_pattern,
438
+ messages=self._get_document_input_message(messages),
439
+ )
440
+ if last_speaker == self._error_agent:
441
+ # If we finish with the error agent, we return their message which contains the error
442
+ return True, chat_result.summary
443
+ if last_speaker != self._summary_agent:
444
+ # If the swarm finished but not with the summary agent, we assume something has gone wrong with the flow
445
+ return True, DEFAULT_ERROR_SWARM_MESSAGE
446
+
447
+ return True, chat_result.summary
448
+
449
+ def _get_document_input_message(self, messages: Optional[Union[list[dict[str, Any]], str]]) -> str: # type: ignore[type-arg]
450
+ """Gets and validates the input message(s) for the document agent."""
451
+ if isinstance(messages, str):
452
+ return messages
453
+ elif (
454
+ isinstance(messages, list)
455
+ and len(messages) > 0
456
+ and "content" in messages[-1]
457
+ and isinstance(messages[-1]["content"], str)
458
+ ):
459
+ return messages[-1]["content"]
460
+ else:
461
+ raise NotImplementedError("Invalid messages format. Must be a list of messages or a string.")
@@ -0,0 +1,50 @@
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 TYPE_CHECKING, Any, List, cast
6
+
7
+ from ....agentchat.group.available_condition import AvailableCondition
8
+ from .document_utils import Ingest, Query
9
+
10
+ if TYPE_CHECKING:
11
+ # Avoid circular import
12
+ from ....agentchat.conversable_agent import ConversableAgent
13
+
14
+ __all__ = ["SummaryTaskAvailableCondition"]
15
+
16
+
17
+ class SummaryTaskAvailableCondition(AvailableCondition):
18
+ """Available condition for determining if a summary task should be performed.
19
+
20
+ This condition checks if:
21
+ 1. There are no documents left to ingest
22
+ 2. There are no queries left to run
23
+ 3. The completed task count is truthy
24
+
25
+ If all conditions are met, the agent is ready for a summary task.
26
+ """
27
+
28
+ documents_var: str = "DocumentsToIngest" # Context variable name for documents to ingest list
29
+ queries_var: str = "QueriesToRun" # Context variable name for queries to run list
30
+ completed_var: str = "CompletedTaskCount" # Context variable name for completed task count
31
+
32
+ def is_available(self, agent: "ConversableAgent", messages: list[dict[str, Any]]) -> bool:
33
+ """Check if all task conditions are met.
34
+
35
+ Args:
36
+ agent: The agent with context variables
37
+ messages: The conversation history (not used)
38
+
39
+ Returns:
40
+ True if all conditions are met (ready for summary), False otherwise
41
+ """
42
+ # Get variables from context with appropriate casting
43
+ documents_to_ingest: List[Ingest] = cast(List[Ingest], agent.context_variables.get(self.documents_var, []))
44
+
45
+ queries_to_run: List[Query] = cast(List[Query], agent.context_variables.get(self.queries_var, []))
46
+
47
+ completed_task_count = bool(agent.context_variables.get(self.completed_var, 0))
48
+
49
+ # All conditions must be true for the function to return True
50
+ return len(documents_to_ingest) == 0 and len(queries_to_run) == 0 and completed_task_count