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,244 @@
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 Optional, Union, overload
6
+
7
+ from pydantic import BaseModel, Field
8
+
9
+ from .on_condition import OnCondition
10
+ from .on_context_condition import OnContextCondition
11
+ from .targets.transition_target import TransitionTarget
12
+
13
+ __all__ = ["Handoffs"]
14
+
15
+
16
+ class Handoffs(BaseModel):
17
+ """
18
+ Container for all handoff transition conditions of a ConversableAgent.
19
+
20
+ Three types of conditions can be added, each with a different order and time of use:
21
+ 1. OnContextConditions (evaluated without an LLM)
22
+ 2. OnConditions (evaluated with an LLM)
23
+ 3. After work TransitionTarget (if no other transition is triggered)
24
+
25
+ Supports method chaining:
26
+ agent.handoffs.add_context_conditions([condition1]) \
27
+ .add_llm_condition(condition2) \
28
+ .set_after_work(after_work)
29
+ """
30
+
31
+ context_conditions: list[OnContextCondition] = Field(default_factory=list)
32
+ llm_conditions: list[OnCondition] = Field(default_factory=list)
33
+ after_work: Optional[TransitionTarget] = None
34
+
35
+ def add_context_condition(self, condition: OnContextCondition) -> "Handoffs":
36
+ """
37
+ Add a single context condition.
38
+
39
+ Args:
40
+ condition: The OnContextCondition to add
41
+
42
+ Returns:
43
+ Self for method chaining
44
+ """
45
+ # Validate that it is an OnContextCondition
46
+ if not isinstance(condition, OnContextCondition):
47
+ raise TypeError(f"Expected an OnContextCondition instance, got {type(condition).__name__}")
48
+
49
+ self.context_conditions.append(condition)
50
+ return self
51
+
52
+ def add_context_conditions(self, conditions: list[OnContextCondition]) -> "Handoffs":
53
+ """
54
+ Add multiple context conditions.
55
+
56
+ Args:
57
+ conditions: List of OnContextConditions to add
58
+
59
+ Returns:
60
+ Self for method chaining
61
+ """
62
+ # Validate that it is a list of OnContextConditions
63
+ if not all(isinstance(condition, OnContextCondition) for condition in conditions):
64
+ raise TypeError("All conditions must be of type OnContextCondition")
65
+
66
+ self.context_conditions.extend(conditions)
67
+ return self
68
+
69
+ def add_llm_condition(self, condition: OnCondition) -> "Handoffs":
70
+ """
71
+ Add a single LLM condition.
72
+
73
+ Args:
74
+ condition: The OnCondition to add
75
+
76
+ Returns:
77
+ Self for method chaining
78
+ """
79
+ # Validate that it is an OnCondition
80
+ if not isinstance(condition, OnCondition):
81
+ raise TypeError(f"Expected an OnCondition instance, got {type(condition).__name__}")
82
+
83
+ self.llm_conditions.append(condition)
84
+ return self
85
+
86
+ def add_llm_conditions(self, conditions: list[OnCondition]) -> "Handoffs":
87
+ """
88
+ Add multiple LLM conditions.
89
+
90
+ Args:
91
+ conditions: List of OnConditions to add
92
+
93
+ Returns:
94
+ Self for method chaining
95
+ """
96
+ # Validate that it is a list of OnConditions
97
+ if not all(isinstance(condition, OnCondition) for condition in conditions):
98
+ raise TypeError("All conditions must be of type OnCondition")
99
+
100
+ self.llm_conditions.extend(conditions)
101
+ return self
102
+
103
+ def set_after_work(self, target: TransitionTarget) -> "Handoffs":
104
+ """
105
+ Set the after work target (only one allowed).
106
+
107
+ Args:
108
+ target: The after work TransitionTarget to set
109
+
110
+ Returns:
111
+ Self for method chaining
112
+ """
113
+ if not isinstance(target, TransitionTarget):
114
+ raise TypeError(f"Expected a TransitionTarget instance, got {type(target).__name__}")
115
+
116
+ self.after_work = target
117
+ return self
118
+
119
+ @overload
120
+ def add(self, condition: OnContextCondition) -> "Handoffs": ...
121
+
122
+ @overload
123
+ def add(self, condition: OnCondition) -> "Handoffs": ...
124
+
125
+ def add(self, condition: Union[OnContextCondition, OnCondition]) -> "Handoffs":
126
+ """
127
+ Add a single condition (OnContextCondition or OnCondition).
128
+
129
+ Args:
130
+ condition: The condition to add (OnContextCondition or OnCondition)
131
+
132
+ Raises:
133
+ TypeError: If the condition type is not supported
134
+
135
+ Returns:
136
+ Self for method chaining
137
+ """
138
+ # This add method is a helper method designed to make it easier for
139
+ # adding handoffs without worrying about the specific type.
140
+ if isinstance(condition, OnContextCondition):
141
+ return self.add_context_condition(condition)
142
+ elif isinstance(condition, OnCondition):
143
+ return self.add_llm_condition(condition)
144
+ else:
145
+ raise TypeError(f"Unsupported condition type: {type(condition).__name__}")
146
+
147
+ def add_many(self, conditions: list[Union[OnContextCondition, OnCondition]]) -> "Handoffs":
148
+ """
149
+ Add multiple conditions of any supported types (OnContextCondition and OnCondition).
150
+
151
+ Args:
152
+ conditions: List of conditions to add
153
+
154
+ Raises:
155
+ TypeError: If an unsupported condition type is provided
156
+
157
+ Returns:
158
+ Self for method chaining
159
+ """
160
+ # This add_many method is a helper method designed to make it easier for
161
+ # adding handoffs without worrying about the specific type.
162
+ context_conditions = []
163
+ llm_conditions = []
164
+
165
+ for condition in conditions:
166
+ if isinstance(condition, OnContextCondition):
167
+ context_conditions.append(condition)
168
+ elif isinstance(condition, OnCondition):
169
+ llm_conditions.append(condition)
170
+ else:
171
+ raise TypeError(f"Unsupported condition type: {type(condition).__name__}")
172
+
173
+ if context_conditions:
174
+ self.add_context_conditions(context_conditions)
175
+ if llm_conditions:
176
+ self.add_llm_conditions(llm_conditions)
177
+
178
+ return self
179
+
180
+ def clear(self) -> "Handoffs":
181
+ """
182
+ Clear all handoff conditions.
183
+
184
+ Returns:
185
+ Self for method chaining
186
+ """
187
+ self.context_conditions.clear()
188
+ self.llm_conditions.clear()
189
+ self.after_work = None
190
+ return self
191
+
192
+ def get_llm_conditions_by_target_type(self, target_type: type) -> list[OnCondition]:
193
+ """
194
+ Get OnConditions for a specific target type.
195
+
196
+ Args:
197
+ target_type: The type of condition to retrieve
198
+
199
+ Returns:
200
+ List of conditions of the specified type, or None if none exist
201
+ """
202
+ return [on_condition for on_condition in self.llm_conditions if on_condition.has_target_type(target_type)]
203
+
204
+ def get_context_conditions_by_target_type(self, target_type: type) -> list[OnContextCondition]:
205
+ """
206
+ Get OnContextConditions for a specific target type.
207
+
208
+ Args:
209
+ target_type: The type of condition to retrieve
210
+
211
+ Returns:
212
+ List of conditions of the specified type, or None if none exist
213
+ """
214
+ return [
215
+ on_context_condition
216
+ for on_context_condition in self.context_conditions
217
+ if on_context_condition.has_target_type(target_type)
218
+ ]
219
+
220
+ def get_llm_conditions_requiring_wrapping(self) -> list[OnCondition]:
221
+ """
222
+ Get LLM conditions that have targets that require wrapping.
223
+
224
+ Returns:
225
+ List of LLM conditions that require wrapping
226
+ """
227
+ return [condition for condition in self.llm_conditions if condition.target_requires_wrapping()]
228
+
229
+ def get_context_conditions_requiring_wrapping(self) -> list[OnContextCondition]:
230
+ """
231
+ Get context conditions that have targets that require wrapping.
232
+
233
+ Returns:
234
+ List of context conditions that require wrapping
235
+ """
236
+ return [condition for condition in self.context_conditions if condition.target_requires_wrapping()]
237
+
238
+ def set_llm_function_names(self) -> None:
239
+ """
240
+ Set the LLM function names for all LLM conditions, creating unique names for each function.
241
+ """
242
+ for i, condition in enumerate(self.llm_conditions):
243
+ # Function names are made unique and allow multiple OnCondition's to the same agent
244
+ condition.llm_function_name = f"transfer_to_{condition.target.normalized_name()}_{i + 1}"
@@ -0,0 +1,93 @@
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
6
+
7
+ from pydantic import BaseModel
8
+
9
+ from .context_str import ContextStr
10
+
11
+ if TYPE_CHECKING:
12
+ # Avoid circular import
13
+ from ..conversable_agent import ConversableAgent
14
+
15
+ __all__ = ["ContextStrLLMCondition", "LLMCondition", "StringLLMCondition"]
16
+
17
+
18
+ class LLMCondition(BaseModel):
19
+ """Protocol for conditions evaluated by an LLM."""
20
+
21
+ def get_prompt(self, agent: "ConversableAgent", messages: list[dict[str, Any]]) -> str:
22
+ """Get the prompt text for LLM evaluation.
23
+
24
+ Args:
25
+ agent: The agent evaluating the condition
26
+ messages: The conversation history
27
+
28
+ Returns:
29
+ The prompt text to be evaluated by the LLM
30
+ """
31
+ raise NotImplementedError("Requires subclasses to implement.")
32
+
33
+
34
+ class StringLLMCondition(LLMCondition):
35
+ """Simple string-based LLM condition.
36
+
37
+ This condition provides a static string prompt to be evaluated by an LLM.
38
+ """
39
+
40
+ prompt: str
41
+
42
+ def __init__(self, prompt: str, **data: Any) -> None:
43
+ """Initialize with a prompt string as a positional parameter.
44
+
45
+ Args:
46
+ prompt: The static prompt string to evaluate
47
+ data: Additional data for the parent class
48
+ """
49
+ super().__init__(prompt=prompt, **data)
50
+
51
+ def get_prompt(self, agent: "ConversableAgent", messages: list[dict[str, Any]]) -> str:
52
+ """Return the static prompt string.
53
+
54
+ Args:
55
+ agent: The agent evaluating the condition (not used)
56
+ messages: The conversation history (not used)
57
+
58
+ Returns:
59
+ The static prompt string
60
+ """
61
+ return self.prompt
62
+
63
+
64
+ class ContextStrLLMCondition(LLMCondition):
65
+ """Context variable-based LLM condition.
66
+
67
+ This condition uses a ContextStr object with context variable placeholders that
68
+ will be substituted before being evaluated by an LLM.
69
+ """
70
+
71
+ context_str: ContextStr
72
+
73
+ def __init__(self, context_str: ContextStr, **data: Any) -> None:
74
+ """Initialize with a context string as a positional parameter.
75
+
76
+ Args:
77
+ context_str: The ContextStr object with variable placeholders
78
+ data: Additional data for the parent class
79
+ """
80
+ super().__init__(context_str=context_str, **data)
81
+
82
+ def get_prompt(self, agent: "ConversableAgent", messages: list[dict[str, Any]]) -> str:
83
+ """Return the prompt with context variables substituted.
84
+
85
+ Args:
86
+ agent: The agent evaluating the condition (provides context variables)
87
+ messages: The conversation history (not used)
88
+
89
+ Returns:
90
+ The prompt with context variables substituted
91
+ """
92
+ result = self.context_str.format(agent.context_variables)
93
+ return result if result is not None else ""
@@ -0,0 +1,237 @@
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 asyncio
6
+ import threading
7
+ from typing import TYPE_CHECKING, Any, Union
8
+
9
+ from ...doc_utils import export_module
10
+ from ...events.agent_events import ErrorEvent, RunCompletionEvent
11
+ from ...io.base import IOStream
12
+ from ...io.run_response import AsyncRunResponse, AsyncRunResponseProtocol, RunResponse, RunResponseProtocol
13
+ from ...io.thread_io_stream import AsyncThreadIOStream, ThreadIOStream
14
+ from ..chat import ChatResult
15
+ from .context_variables import ContextVariables
16
+ from .group_utils import cleanup_temp_user_messages
17
+
18
+ if TYPE_CHECKING:
19
+ from ..agent import Agent
20
+ from .patterns.pattern import Pattern
21
+
22
+ __all__ = [
23
+ "a_initiate_group_chat",
24
+ "a_run_group_chat",
25
+ "initiate_group_chat",
26
+ "run_group_chat",
27
+ ]
28
+
29
+
30
+ @export_module("autogen")
31
+ def initiate_group_chat(
32
+ pattern: "Pattern",
33
+ messages: Union[list[dict[str, Any]], str],
34
+ max_rounds: int = 20,
35
+ ) -> tuple[ChatResult, ContextVariables, "Agent"]:
36
+ """Initialize and run a group chat using a pattern for configuration.
37
+
38
+ Args:
39
+ pattern: Pattern object that encapsulates the chat configuration.
40
+ messages: Initial message(s).
41
+ max_rounds: Maximum number of conversation rounds.
42
+
43
+ Returns:
44
+ ChatResult: Conversations chat history.
45
+ ContextVariables: Updated Context variables.
46
+ "ConversableAgent": Last speaker.
47
+ """
48
+ # Let the pattern prepare the group chat and all its components
49
+ # Only passing the necessary parameters that aren't already in the pattern
50
+ (
51
+ _, # agents,
52
+ _, # wrapped_agents,
53
+ _, # user_agent,
54
+ context_variables,
55
+ _, # initial_agent,
56
+ _, # group_after_work,
57
+ _, # tool_execution,
58
+ _, # groupchat,
59
+ manager,
60
+ processed_messages,
61
+ last_agent,
62
+ _, # group_agent_names,
63
+ _, # temp_user_list,
64
+ ) = pattern.prepare_group_chat(
65
+ max_rounds=max_rounds,
66
+ messages=messages,
67
+ )
68
+
69
+ # Start or resume the conversation
70
+ if len(processed_messages) > 1:
71
+ last_agent, last_message = manager.resume(messages=processed_messages)
72
+ clear_history = False
73
+ else:
74
+ last_message = processed_messages[0]
75
+ clear_history = True
76
+
77
+ if last_agent is None:
78
+ raise ValueError("No agent selected to start the conversation")
79
+
80
+ chat_result = last_agent.initiate_chat(
81
+ manager,
82
+ message=last_message,
83
+ clear_history=clear_history,
84
+ summary_method=pattern.summary_method,
85
+ )
86
+
87
+ cleanup_temp_user_messages(chat_result)
88
+
89
+ return chat_result, context_variables, manager.last_speaker
90
+
91
+
92
+ @export_module("autogen.agentchat")
93
+ async def a_initiate_group_chat(
94
+ pattern: "Pattern",
95
+ messages: Union[list[dict[str, Any]], str],
96
+ max_rounds: int = 20,
97
+ ) -> tuple[ChatResult, ContextVariables, "Agent"]:
98
+ """Initialize and run a group chat using a pattern for configuration, asynchronously.
99
+
100
+ Args:
101
+ pattern: Pattern object that encapsulates the chat configuration.
102
+ messages: Initial message(s).
103
+ max_rounds: Maximum number of conversation rounds.
104
+
105
+ Returns:
106
+ ChatResult: Conversations chat history.
107
+ ContextVariables: Updated Context variables.
108
+ "ConversableAgent": Last speaker.
109
+ """
110
+ # Let the pattern prepare the group chat and all its components
111
+ # Only passing the necessary parameters that aren't already in the pattern
112
+ (
113
+ _, # agents,
114
+ _, # wrapped_agents,
115
+ _, # user_agent,
116
+ context_variables,
117
+ _, # initial_agent,
118
+ _, # group_after_work,
119
+ _, # tool_execution,
120
+ _, # groupchat,
121
+ manager,
122
+ processed_messages,
123
+ last_agent,
124
+ _, # group_agent_names,
125
+ _, # temp_user_list,
126
+ ) = pattern.prepare_group_chat(
127
+ max_rounds=max_rounds,
128
+ messages=messages,
129
+ )
130
+
131
+ # Start or resume the conversation
132
+ if len(processed_messages) > 1:
133
+ last_agent, last_message = await manager.a_resume(messages=processed_messages)
134
+ clear_history = False
135
+ else:
136
+ last_message = processed_messages[0]
137
+ clear_history = True
138
+
139
+ if last_agent is None:
140
+ raise ValueError("No agent selected to start the conversation")
141
+
142
+ chat_result = await last_agent.a_initiate_chat(
143
+ manager,
144
+ message=last_message, # type: ignore[arg-type]
145
+ clear_history=clear_history,
146
+ summary_method=pattern.summary_method,
147
+ )
148
+
149
+ cleanup_temp_user_messages(chat_result)
150
+
151
+ return chat_result, context_variables, manager.last_speaker
152
+
153
+
154
+ @export_module("autogen.agentchat")
155
+ def run_group_chat(
156
+ pattern: "Pattern",
157
+ messages: Union[list[dict[str, Any]], str],
158
+ max_rounds: int = 20,
159
+ ) -> RunResponseProtocol:
160
+ iostream = ThreadIOStream()
161
+ # todo: add agents
162
+ response = RunResponse(iostream, agents=[])
163
+
164
+ def _initiate_group_chat(
165
+ pattern: "Pattern" = pattern,
166
+ messages: Union[list[dict[str, Any]], str] = messages,
167
+ max_rounds: int = max_rounds,
168
+ iostream: ThreadIOStream = iostream,
169
+ response: RunResponse = response,
170
+ ) -> None:
171
+ with IOStream.set_default(iostream):
172
+ try:
173
+ chat_result, context_vars, agent = initiate_group_chat(
174
+ pattern=pattern,
175
+ messages=messages,
176
+ max_rounds=max_rounds,
177
+ )
178
+
179
+ IOStream.get_default().send(
180
+ RunCompletionEvent( # type: ignore[call-arg]
181
+ history=chat_result.chat_history,
182
+ summary=chat_result.summary,
183
+ cost=chat_result.cost,
184
+ last_speaker=agent.name,
185
+ context_variables=context_vars,
186
+ )
187
+ )
188
+ except Exception as e:
189
+ response.iostream.send(ErrorEvent(error=e)) # type: ignore[call-arg]
190
+
191
+ threading.Thread(
192
+ target=_initiate_group_chat,
193
+ ).start()
194
+
195
+ return response
196
+
197
+
198
+ @export_module("autogen.agentchat")
199
+ async def a_run_group_chat(
200
+ pattern: "Pattern",
201
+ messages: Union[list[dict[str, Any]], str],
202
+ max_rounds: int = 20,
203
+ ) -> AsyncRunResponseProtocol:
204
+ iostream = AsyncThreadIOStream()
205
+ # todo: add agents
206
+ response = AsyncRunResponse(iostream, agents=[])
207
+
208
+ async def _initiate_group_chat(
209
+ pattern: "Pattern" = pattern,
210
+ messages: Union[list[dict[str, Any]], str] = messages,
211
+ max_rounds: int = max_rounds,
212
+ iostream: AsyncThreadIOStream = iostream,
213
+ response: AsyncRunResponse = response,
214
+ ) -> None:
215
+ with IOStream.set_default(iostream):
216
+ try:
217
+ chat_result, context_vars, agent = await a_initiate_group_chat(
218
+ pattern=pattern,
219
+ messages=messages,
220
+ max_rounds=max_rounds,
221
+ )
222
+
223
+ IOStream.get_default().send(
224
+ RunCompletionEvent( # type: ignore[call-arg]
225
+ history=chat_result.chat_history,
226
+ summary=chat_result.summary,
227
+ cost=chat_result.cost,
228
+ last_speaker=agent.name,
229
+ context_variables=context_vars,
230
+ )
231
+ )
232
+ except Exception as e:
233
+ response.iostream.send(ErrorEvent(error=e)) # type: ignore[call-arg]
234
+
235
+ asyncio.create_task(_initiate_group_chat())
236
+
237
+ return response
@@ -0,0 +1,58 @@
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 Optional
6
+
7
+ from pydantic import BaseModel
8
+
9
+ from ...doc_utils import export_module
10
+ from .available_condition import AvailableCondition
11
+ from .llm_condition import LLMCondition
12
+ from .targets.transition_target import TransitionTarget
13
+
14
+ __all__ = [
15
+ "OnCondition",
16
+ ]
17
+
18
+
19
+ @export_module("autogen")
20
+ class OnCondition(BaseModel): # noqa: N801
21
+ """Defines a condition for transitioning to another agent or nested chats.
22
+
23
+ This is for LLM-based condition evaluation where these conditions are translated into tools and attached to the agent.
24
+
25
+ These are evaluated after the OnCondition conditions but before the after work condition.
26
+
27
+ Args:
28
+ target (TransitionTarget): The transition (essentially an agent) to hand off to.
29
+ condition (LLMCondition): The condition for transitioning to the target agent, evaluated by the LLM.
30
+ available (AvailableCondition): Optional condition to determine if this OnCondition is included for the LLM to evaluate based on context variables using classes like StringAvailableCondition and ContextExpressionAvailableCondition.
31
+ llm_function_name (Optional[str]): The name of the LLM function to use for this condition.
32
+ """
33
+
34
+ target: TransitionTarget
35
+ condition: LLMCondition
36
+ available: Optional[AvailableCondition] = None
37
+ llm_function_name: Optional[str] = None
38
+
39
+ def has_target_type(self, target_type: type) -> bool:
40
+ """
41
+ Check if the target type matches the specified type.
42
+
43
+ Args:
44
+ target_type (type): The target type to check against, which should be a subclass of TransitionTarget
45
+
46
+ Returns:
47
+ bool: True if the target type matches, False otherwise
48
+ """
49
+ return isinstance(self.target, target_type)
50
+
51
+ def target_requires_wrapping(self) -> bool:
52
+ """
53
+ Check if the target requires wrapping in an agent.
54
+
55
+ Returns:
56
+ bool: True if the target requires wrapping, False otherwise
57
+ """
58
+ return self.target.needs_agent_wrapper()
@@ -0,0 +1,54 @@
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 Optional
6
+
7
+ from pydantic import BaseModel
8
+
9
+ from .available_condition import AvailableCondition
10
+ from .context_condition import ContextCondition
11
+ from .targets.transition_target import TransitionTarget
12
+
13
+ __all__ = [
14
+ "OnContextCondition",
15
+ ]
16
+
17
+
18
+ class OnContextCondition(BaseModel): # noqa: N801
19
+ """Defines a condition for transitioning to another agent or nested chats using context variables and the ContextExpression class.
20
+
21
+ This is for context variable-based condition evaluation (does not use the agent's LLM).
22
+
23
+ These are evaluated before the OnCondition and after work conditions.
24
+
25
+ Args:
26
+ target (TransitionTarget): The transition (essentially an agent) to hand off to.
27
+ condition (ContextCondition): The context variable based condition for transitioning to the target agent.
28
+ available (AvailableCondition): Optional condition to determine if this OnCondition is included for the LLM to evaluate based on context variables using classes like StringAvailableCondition and ContextExpressionAvailableCondition.
29
+ """
30
+
31
+ target: TransitionTarget
32
+ condition: ContextCondition
33
+ available: Optional[AvailableCondition] = None
34
+
35
+ def has_target_type(self, target_type: type) -> bool:
36
+ """
37
+ Check if the target type matches the specified type.
38
+
39
+ Args:
40
+ target_type (type): The target type to check against. Should be a subclass of TransitionTarget.
41
+
42
+ Returns:
43
+ bool: True if the target type matches, False otherwise
44
+ """
45
+ return isinstance(self.target, target_type)
46
+
47
+ def target_requires_wrapping(self) -> bool:
48
+ """
49
+ Check if the target requires wrapping in an agent.
50
+
51
+ Returns:
52
+ bool: True if the target requires wrapping, False otherwise
53
+ """
54
+ return self.target.needs_agent_wrapper()