ag2 0.10.2__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (423) hide show
  1. ag2-0.10.2.dist-info/METADATA +819 -0
  2. ag2-0.10.2.dist-info/RECORD +423 -0
  3. ag2-0.10.2.dist-info/WHEEL +4 -0
  4. ag2-0.10.2.dist-info/licenses/LICENSE +201 -0
  5. ag2-0.10.2.dist-info/licenses/NOTICE.md +19 -0
  6. autogen/__init__.py +88 -0
  7. autogen/_website/__init__.py +3 -0
  8. autogen/_website/generate_api_references.py +426 -0
  9. autogen/_website/generate_mkdocs.py +1216 -0
  10. autogen/_website/notebook_processor.py +475 -0
  11. autogen/_website/process_notebooks.py +656 -0
  12. autogen/_website/utils.py +413 -0
  13. autogen/a2a/__init__.py +36 -0
  14. autogen/a2a/agent_executor.py +86 -0
  15. autogen/a2a/client.py +357 -0
  16. autogen/a2a/errors.py +18 -0
  17. autogen/a2a/httpx_client_factory.py +79 -0
  18. autogen/a2a/server.py +221 -0
  19. autogen/a2a/utils.py +207 -0
  20. autogen/agentchat/__init__.py +47 -0
  21. autogen/agentchat/agent.py +180 -0
  22. autogen/agentchat/assistant_agent.py +86 -0
  23. autogen/agentchat/chat.py +325 -0
  24. autogen/agentchat/contrib/__init__.py +5 -0
  25. autogen/agentchat/contrib/agent_eval/README.md +7 -0
  26. autogen/agentchat/contrib/agent_eval/agent_eval.py +108 -0
  27. autogen/agentchat/contrib/agent_eval/criterion.py +43 -0
  28. autogen/agentchat/contrib/agent_eval/critic_agent.py +44 -0
  29. autogen/agentchat/contrib/agent_eval/quantifier_agent.py +39 -0
  30. autogen/agentchat/contrib/agent_eval/subcritic_agent.py +45 -0
  31. autogen/agentchat/contrib/agent_eval/task.py +42 -0
  32. autogen/agentchat/contrib/agent_optimizer.py +432 -0
  33. autogen/agentchat/contrib/capabilities/__init__.py +5 -0
  34. autogen/agentchat/contrib/capabilities/agent_capability.py +20 -0
  35. autogen/agentchat/contrib/capabilities/generate_images.py +301 -0
  36. autogen/agentchat/contrib/capabilities/teachability.py +393 -0
  37. autogen/agentchat/contrib/capabilities/text_compressors.py +66 -0
  38. autogen/agentchat/contrib/capabilities/tools_capability.py +22 -0
  39. autogen/agentchat/contrib/capabilities/transform_messages.py +93 -0
  40. autogen/agentchat/contrib/capabilities/transforms.py +578 -0
  41. autogen/agentchat/contrib/capabilities/transforms_util.py +122 -0
  42. autogen/agentchat/contrib/capabilities/vision_capability.py +215 -0
  43. autogen/agentchat/contrib/captainagent/__init__.py +9 -0
  44. autogen/agentchat/contrib/captainagent/agent_builder.py +790 -0
  45. autogen/agentchat/contrib/captainagent/captainagent.py +514 -0
  46. autogen/agentchat/contrib/captainagent/tool_retriever.py +334 -0
  47. autogen/agentchat/contrib/captainagent/tools/README.md +44 -0
  48. autogen/agentchat/contrib/captainagent/tools/__init__.py +5 -0
  49. autogen/agentchat/contrib/captainagent/tools/data_analysis/calculate_correlation.py +40 -0
  50. autogen/agentchat/contrib/captainagent/tools/data_analysis/calculate_skewness_and_kurtosis.py +28 -0
  51. autogen/agentchat/contrib/captainagent/tools/data_analysis/detect_outlier_iqr.py +28 -0
  52. autogen/agentchat/contrib/captainagent/tools/data_analysis/detect_outlier_zscore.py +28 -0
  53. autogen/agentchat/contrib/captainagent/tools/data_analysis/explore_csv.py +21 -0
  54. autogen/agentchat/contrib/captainagent/tools/data_analysis/shapiro_wilk_test.py +30 -0
  55. autogen/agentchat/contrib/captainagent/tools/information_retrieval/arxiv_download.py +27 -0
  56. autogen/agentchat/contrib/captainagent/tools/information_retrieval/arxiv_search.py +53 -0
  57. autogen/agentchat/contrib/captainagent/tools/information_retrieval/extract_pdf_image.py +53 -0
  58. autogen/agentchat/contrib/captainagent/tools/information_retrieval/extract_pdf_text.py +38 -0
  59. autogen/agentchat/contrib/captainagent/tools/information_retrieval/get_wikipedia_text.py +21 -0
  60. autogen/agentchat/contrib/captainagent/tools/information_retrieval/get_youtube_caption.py +34 -0
  61. autogen/agentchat/contrib/captainagent/tools/information_retrieval/image_qa.py +60 -0
  62. autogen/agentchat/contrib/captainagent/tools/information_retrieval/optical_character_recognition.py +61 -0
  63. autogen/agentchat/contrib/captainagent/tools/information_retrieval/perform_web_search.py +47 -0
  64. autogen/agentchat/contrib/captainagent/tools/information_retrieval/scrape_wikipedia_tables.py +33 -0
  65. autogen/agentchat/contrib/captainagent/tools/information_retrieval/transcribe_audio_file.py +21 -0
  66. autogen/agentchat/contrib/captainagent/tools/information_retrieval/youtube_download.py +35 -0
  67. autogen/agentchat/contrib/captainagent/tools/math/calculate_circle_area_from_diameter.py +21 -0
  68. autogen/agentchat/contrib/captainagent/tools/math/calculate_day_of_the_week.py +18 -0
  69. autogen/agentchat/contrib/captainagent/tools/math/calculate_fraction_sum.py +28 -0
  70. autogen/agentchat/contrib/captainagent/tools/math/calculate_matrix_power.py +31 -0
  71. autogen/agentchat/contrib/captainagent/tools/math/calculate_reflected_point.py +16 -0
  72. autogen/agentchat/contrib/captainagent/tools/math/complex_numbers_product.py +25 -0
  73. autogen/agentchat/contrib/captainagent/tools/math/compute_currency_conversion.py +23 -0
  74. autogen/agentchat/contrib/captainagent/tools/math/count_distinct_permutations.py +27 -0
  75. autogen/agentchat/contrib/captainagent/tools/math/evaluate_expression.py +28 -0
  76. autogen/agentchat/contrib/captainagent/tools/math/find_continuity_point.py +34 -0
  77. autogen/agentchat/contrib/captainagent/tools/math/fraction_to_mixed_numbers.py +39 -0
  78. autogen/agentchat/contrib/captainagent/tools/math/modular_inverse_sum.py +23 -0
  79. autogen/agentchat/contrib/captainagent/tools/math/simplify_mixed_numbers.py +36 -0
  80. autogen/agentchat/contrib/captainagent/tools/math/sum_of_digit_factorials.py +15 -0
  81. autogen/agentchat/contrib/captainagent/tools/math/sum_of_primes_below.py +15 -0
  82. autogen/agentchat/contrib/captainagent/tools/requirements.txt +10 -0
  83. autogen/agentchat/contrib/captainagent/tools/tool_description.tsv +34 -0
  84. autogen/agentchat/contrib/gpt_assistant_agent.py +526 -0
  85. autogen/agentchat/contrib/graph_rag/__init__.py +9 -0
  86. autogen/agentchat/contrib/graph_rag/document.py +29 -0
  87. autogen/agentchat/contrib/graph_rag/falkor_graph_query_engine.py +167 -0
  88. autogen/agentchat/contrib/graph_rag/falkor_graph_rag_capability.py +103 -0
  89. autogen/agentchat/contrib/graph_rag/graph_query_engine.py +53 -0
  90. autogen/agentchat/contrib/graph_rag/graph_rag_capability.py +63 -0
  91. autogen/agentchat/contrib/graph_rag/neo4j_graph_query_engine.py +263 -0
  92. autogen/agentchat/contrib/graph_rag/neo4j_graph_rag_capability.py +83 -0
  93. autogen/agentchat/contrib/graph_rag/neo4j_native_graph_query_engine.py +210 -0
  94. autogen/agentchat/contrib/graph_rag/neo4j_native_graph_rag_capability.py +93 -0
  95. autogen/agentchat/contrib/img_utils.py +397 -0
  96. autogen/agentchat/contrib/llamaindex_conversable_agent.py +117 -0
  97. autogen/agentchat/contrib/llava_agent.py +189 -0
  98. autogen/agentchat/contrib/math_user_proxy_agent.py +464 -0
  99. autogen/agentchat/contrib/multimodal_conversable_agent.py +125 -0
  100. autogen/agentchat/contrib/qdrant_retrieve_user_proxy_agent.py +325 -0
  101. autogen/agentchat/contrib/rag/__init__.py +10 -0
  102. autogen/agentchat/contrib/rag/chromadb_query_engine.py +268 -0
  103. autogen/agentchat/contrib/rag/llamaindex_query_engine.py +195 -0
  104. autogen/agentchat/contrib/rag/mongodb_query_engine.py +319 -0
  105. autogen/agentchat/contrib/rag/query_engine.py +76 -0
  106. autogen/agentchat/contrib/retrieve_assistant_agent.py +59 -0
  107. autogen/agentchat/contrib/retrieve_user_proxy_agent.py +704 -0
  108. autogen/agentchat/contrib/society_of_mind_agent.py +200 -0
  109. autogen/agentchat/contrib/swarm_agent.py +1404 -0
  110. autogen/agentchat/contrib/text_analyzer_agent.py +79 -0
  111. autogen/agentchat/contrib/vectordb/__init__.py +5 -0
  112. autogen/agentchat/contrib/vectordb/base.py +224 -0
  113. autogen/agentchat/contrib/vectordb/chromadb.py +316 -0
  114. autogen/agentchat/contrib/vectordb/couchbase.py +405 -0
  115. autogen/agentchat/contrib/vectordb/mongodb.py +551 -0
  116. autogen/agentchat/contrib/vectordb/pgvectordb.py +927 -0
  117. autogen/agentchat/contrib/vectordb/qdrant.py +320 -0
  118. autogen/agentchat/contrib/vectordb/utils.py +126 -0
  119. autogen/agentchat/contrib/web_surfer.py +304 -0
  120. autogen/agentchat/conversable_agent.py +4307 -0
  121. autogen/agentchat/group/__init__.py +67 -0
  122. autogen/agentchat/group/available_condition.py +91 -0
  123. autogen/agentchat/group/context_condition.py +77 -0
  124. autogen/agentchat/group/context_expression.py +238 -0
  125. autogen/agentchat/group/context_str.py +39 -0
  126. autogen/agentchat/group/context_variables.py +182 -0
  127. autogen/agentchat/group/events/transition_events.py +111 -0
  128. autogen/agentchat/group/group_tool_executor.py +324 -0
  129. autogen/agentchat/group/group_utils.py +659 -0
  130. autogen/agentchat/group/guardrails.py +179 -0
  131. autogen/agentchat/group/handoffs.py +303 -0
  132. autogen/agentchat/group/llm_condition.py +93 -0
  133. autogen/agentchat/group/multi_agent_chat.py +291 -0
  134. autogen/agentchat/group/on_condition.py +55 -0
  135. autogen/agentchat/group/on_context_condition.py +51 -0
  136. autogen/agentchat/group/patterns/__init__.py +18 -0
  137. autogen/agentchat/group/patterns/auto.py +160 -0
  138. autogen/agentchat/group/patterns/manual.py +177 -0
  139. autogen/agentchat/group/patterns/pattern.py +295 -0
  140. autogen/agentchat/group/patterns/random.py +106 -0
  141. autogen/agentchat/group/patterns/round_robin.py +117 -0
  142. autogen/agentchat/group/reply_result.py +24 -0
  143. autogen/agentchat/group/safeguards/__init__.py +21 -0
  144. autogen/agentchat/group/safeguards/api.py +241 -0
  145. autogen/agentchat/group/safeguards/enforcer.py +1158 -0
  146. autogen/agentchat/group/safeguards/events.py +140 -0
  147. autogen/agentchat/group/safeguards/validator.py +435 -0
  148. autogen/agentchat/group/speaker_selection_result.py +41 -0
  149. autogen/agentchat/group/targets/__init__.py +4 -0
  150. autogen/agentchat/group/targets/function_target.py +245 -0
  151. autogen/agentchat/group/targets/group_chat_target.py +133 -0
  152. autogen/agentchat/group/targets/group_manager_target.py +151 -0
  153. autogen/agentchat/group/targets/transition_target.py +424 -0
  154. autogen/agentchat/group/targets/transition_utils.py +6 -0
  155. autogen/agentchat/groupchat.py +1832 -0
  156. autogen/agentchat/realtime/__init__.py +3 -0
  157. autogen/agentchat/realtime/experimental/__init__.py +20 -0
  158. autogen/agentchat/realtime/experimental/audio_adapters/__init__.py +8 -0
  159. autogen/agentchat/realtime/experimental/audio_adapters/twilio_audio_adapter.py +148 -0
  160. autogen/agentchat/realtime/experimental/audio_adapters/websocket_audio_adapter.py +139 -0
  161. autogen/agentchat/realtime/experimental/audio_observer.py +42 -0
  162. autogen/agentchat/realtime/experimental/clients/__init__.py +15 -0
  163. autogen/agentchat/realtime/experimental/clients/gemini/__init__.py +7 -0
  164. autogen/agentchat/realtime/experimental/clients/gemini/client.py +274 -0
  165. autogen/agentchat/realtime/experimental/clients/oai/__init__.py +8 -0
  166. autogen/agentchat/realtime/experimental/clients/oai/base_client.py +220 -0
  167. autogen/agentchat/realtime/experimental/clients/oai/rtc_client.py +243 -0
  168. autogen/agentchat/realtime/experimental/clients/oai/utils.py +48 -0
  169. autogen/agentchat/realtime/experimental/clients/realtime_client.py +191 -0
  170. autogen/agentchat/realtime/experimental/function_observer.py +84 -0
  171. autogen/agentchat/realtime/experimental/realtime_agent.py +158 -0
  172. autogen/agentchat/realtime/experimental/realtime_events.py +42 -0
  173. autogen/agentchat/realtime/experimental/realtime_observer.py +100 -0
  174. autogen/agentchat/realtime/experimental/realtime_swarm.py +533 -0
  175. autogen/agentchat/realtime/experimental/websockets.py +21 -0
  176. autogen/agentchat/realtime_agent/__init__.py +21 -0
  177. autogen/agentchat/user_proxy_agent.py +114 -0
  178. autogen/agentchat/utils.py +206 -0
  179. autogen/agents/__init__.py +3 -0
  180. autogen/agents/contrib/__init__.py +10 -0
  181. autogen/agents/contrib/time/__init__.py +8 -0
  182. autogen/agents/contrib/time/time_reply_agent.py +74 -0
  183. autogen/agents/contrib/time/time_tool_agent.py +52 -0
  184. autogen/agents/experimental/__init__.py +27 -0
  185. autogen/agents/experimental/deep_research/__init__.py +7 -0
  186. autogen/agents/experimental/deep_research/deep_research.py +52 -0
  187. autogen/agents/experimental/discord/__init__.py +7 -0
  188. autogen/agents/experimental/discord/discord.py +66 -0
  189. autogen/agents/experimental/document_agent/__init__.py +19 -0
  190. autogen/agents/experimental/document_agent/chroma_query_engine.py +301 -0
  191. autogen/agents/experimental/document_agent/docling_doc_ingest_agent.py +113 -0
  192. autogen/agents/experimental/document_agent/document_agent.py +643 -0
  193. autogen/agents/experimental/document_agent/document_conditions.py +50 -0
  194. autogen/agents/experimental/document_agent/document_utils.py +376 -0
  195. autogen/agents/experimental/document_agent/inmemory_query_engine.py +214 -0
  196. autogen/agents/experimental/document_agent/parser_utils.py +134 -0
  197. autogen/agents/experimental/document_agent/url_utils.py +417 -0
  198. autogen/agents/experimental/reasoning/__init__.py +7 -0
  199. autogen/agents/experimental/reasoning/reasoning_agent.py +1178 -0
  200. autogen/agents/experimental/slack/__init__.py +7 -0
  201. autogen/agents/experimental/slack/slack.py +73 -0
  202. autogen/agents/experimental/telegram/__init__.py +7 -0
  203. autogen/agents/experimental/telegram/telegram.py +76 -0
  204. autogen/agents/experimental/websurfer/__init__.py +7 -0
  205. autogen/agents/experimental/websurfer/websurfer.py +70 -0
  206. autogen/agents/experimental/wikipedia/__init__.py +7 -0
  207. autogen/agents/experimental/wikipedia/wikipedia.py +88 -0
  208. autogen/browser_utils.py +309 -0
  209. autogen/cache/__init__.py +10 -0
  210. autogen/cache/abstract_cache_base.py +71 -0
  211. autogen/cache/cache.py +203 -0
  212. autogen/cache/cache_factory.py +88 -0
  213. autogen/cache/cosmos_db_cache.py +144 -0
  214. autogen/cache/disk_cache.py +97 -0
  215. autogen/cache/in_memory_cache.py +54 -0
  216. autogen/cache/redis_cache.py +119 -0
  217. autogen/code_utils.py +598 -0
  218. autogen/coding/__init__.py +30 -0
  219. autogen/coding/base.py +120 -0
  220. autogen/coding/docker_commandline_code_executor.py +283 -0
  221. autogen/coding/factory.py +56 -0
  222. autogen/coding/func_with_reqs.py +203 -0
  223. autogen/coding/jupyter/__init__.py +23 -0
  224. autogen/coding/jupyter/base.py +36 -0
  225. autogen/coding/jupyter/docker_jupyter_server.py +160 -0
  226. autogen/coding/jupyter/embedded_ipython_code_executor.py +182 -0
  227. autogen/coding/jupyter/import_utils.py +82 -0
  228. autogen/coding/jupyter/jupyter_client.py +224 -0
  229. autogen/coding/jupyter/jupyter_code_executor.py +154 -0
  230. autogen/coding/jupyter/local_jupyter_server.py +164 -0
  231. autogen/coding/local_commandline_code_executor.py +341 -0
  232. autogen/coding/markdown_code_extractor.py +44 -0
  233. autogen/coding/utils.py +55 -0
  234. autogen/coding/yepcode_code_executor.py +197 -0
  235. autogen/doc_utils.py +35 -0
  236. autogen/environments/__init__.py +10 -0
  237. autogen/environments/docker_python_environment.py +365 -0
  238. autogen/environments/python_environment.py +125 -0
  239. autogen/environments/system_python_environment.py +85 -0
  240. autogen/environments/venv_python_environment.py +220 -0
  241. autogen/environments/working_directory.py +74 -0
  242. autogen/events/__init__.py +7 -0
  243. autogen/events/agent_events.py +1016 -0
  244. autogen/events/base_event.py +100 -0
  245. autogen/events/client_events.py +168 -0
  246. autogen/events/helpers.py +44 -0
  247. autogen/events/print_event.py +45 -0
  248. autogen/exception_utils.py +73 -0
  249. autogen/extensions/__init__.py +5 -0
  250. autogen/fast_depends/__init__.py +16 -0
  251. autogen/fast_depends/_compat.py +75 -0
  252. autogen/fast_depends/core/__init__.py +14 -0
  253. autogen/fast_depends/core/build.py +206 -0
  254. autogen/fast_depends/core/model.py +527 -0
  255. autogen/fast_depends/dependencies/__init__.py +15 -0
  256. autogen/fast_depends/dependencies/model.py +30 -0
  257. autogen/fast_depends/dependencies/provider.py +40 -0
  258. autogen/fast_depends/library/__init__.py +10 -0
  259. autogen/fast_depends/library/model.py +46 -0
  260. autogen/fast_depends/py.typed +6 -0
  261. autogen/fast_depends/schema.py +66 -0
  262. autogen/fast_depends/use.py +272 -0
  263. autogen/fast_depends/utils.py +177 -0
  264. autogen/formatting_utils.py +83 -0
  265. autogen/function_utils.py +13 -0
  266. autogen/graph_utils.py +173 -0
  267. autogen/import_utils.py +539 -0
  268. autogen/interop/__init__.py +22 -0
  269. autogen/interop/crewai/__init__.py +7 -0
  270. autogen/interop/crewai/crewai.py +88 -0
  271. autogen/interop/interoperability.py +71 -0
  272. autogen/interop/interoperable.py +46 -0
  273. autogen/interop/langchain/__init__.py +8 -0
  274. autogen/interop/langchain/langchain_chat_model_factory.py +156 -0
  275. autogen/interop/langchain/langchain_tool.py +78 -0
  276. autogen/interop/litellm/__init__.py +7 -0
  277. autogen/interop/litellm/litellm_config_factory.py +178 -0
  278. autogen/interop/pydantic_ai/__init__.py +7 -0
  279. autogen/interop/pydantic_ai/pydantic_ai.py +172 -0
  280. autogen/interop/registry.py +70 -0
  281. autogen/io/__init__.py +15 -0
  282. autogen/io/base.py +151 -0
  283. autogen/io/console.py +56 -0
  284. autogen/io/processors/__init__.py +12 -0
  285. autogen/io/processors/base.py +21 -0
  286. autogen/io/processors/console_event_processor.py +61 -0
  287. autogen/io/run_response.py +294 -0
  288. autogen/io/thread_io_stream.py +63 -0
  289. autogen/io/websockets.py +214 -0
  290. autogen/json_utils.py +42 -0
  291. autogen/llm_clients/MIGRATION_TO_V2.md +782 -0
  292. autogen/llm_clients/__init__.py +77 -0
  293. autogen/llm_clients/client_v2.py +122 -0
  294. autogen/llm_clients/models/__init__.py +55 -0
  295. autogen/llm_clients/models/content_blocks.py +389 -0
  296. autogen/llm_clients/models/unified_message.py +145 -0
  297. autogen/llm_clients/models/unified_response.py +83 -0
  298. autogen/llm_clients/openai_completions_client.py +444 -0
  299. autogen/llm_config/__init__.py +11 -0
  300. autogen/llm_config/client.py +59 -0
  301. autogen/llm_config/config.py +461 -0
  302. autogen/llm_config/entry.py +169 -0
  303. autogen/llm_config/types.py +37 -0
  304. autogen/llm_config/utils.py +223 -0
  305. autogen/logger/__init__.py +11 -0
  306. autogen/logger/base_logger.py +129 -0
  307. autogen/logger/file_logger.py +262 -0
  308. autogen/logger/logger_factory.py +42 -0
  309. autogen/logger/logger_utils.py +57 -0
  310. autogen/logger/sqlite_logger.py +524 -0
  311. autogen/math_utils.py +338 -0
  312. autogen/mcp/__init__.py +7 -0
  313. autogen/mcp/__main__.py +78 -0
  314. autogen/mcp/helpers.py +45 -0
  315. autogen/mcp/mcp_client.py +349 -0
  316. autogen/mcp/mcp_proxy/__init__.py +19 -0
  317. autogen/mcp/mcp_proxy/fastapi_code_generator_helpers.py +62 -0
  318. autogen/mcp/mcp_proxy/mcp_proxy.py +577 -0
  319. autogen/mcp/mcp_proxy/operation_grouping.py +166 -0
  320. autogen/mcp/mcp_proxy/operation_renaming.py +110 -0
  321. autogen/mcp/mcp_proxy/patch_fastapi_code_generator.py +98 -0
  322. autogen/mcp/mcp_proxy/security.py +399 -0
  323. autogen/mcp/mcp_proxy/security_schema_visitor.py +37 -0
  324. autogen/messages/__init__.py +7 -0
  325. autogen/messages/agent_messages.py +946 -0
  326. autogen/messages/base_message.py +108 -0
  327. autogen/messages/client_messages.py +172 -0
  328. autogen/messages/print_message.py +48 -0
  329. autogen/oai/__init__.py +61 -0
  330. autogen/oai/anthropic.py +1516 -0
  331. autogen/oai/bedrock.py +800 -0
  332. autogen/oai/cerebras.py +302 -0
  333. autogen/oai/client.py +1658 -0
  334. autogen/oai/client_utils.py +196 -0
  335. autogen/oai/cohere.py +494 -0
  336. autogen/oai/gemini.py +1045 -0
  337. autogen/oai/gemini_types.py +156 -0
  338. autogen/oai/groq.py +319 -0
  339. autogen/oai/mistral.py +311 -0
  340. autogen/oai/oai_models/__init__.py +23 -0
  341. autogen/oai/oai_models/_models.py +16 -0
  342. autogen/oai/oai_models/chat_completion.py +86 -0
  343. autogen/oai/oai_models/chat_completion_audio.py +32 -0
  344. autogen/oai/oai_models/chat_completion_message.py +97 -0
  345. autogen/oai/oai_models/chat_completion_message_tool_call.py +60 -0
  346. autogen/oai/oai_models/chat_completion_token_logprob.py +62 -0
  347. autogen/oai/oai_models/completion_usage.py +59 -0
  348. autogen/oai/ollama.py +657 -0
  349. autogen/oai/openai_responses.py +451 -0
  350. autogen/oai/openai_utils.py +897 -0
  351. autogen/oai/together.py +387 -0
  352. autogen/remote/__init__.py +18 -0
  353. autogen/remote/agent.py +199 -0
  354. autogen/remote/agent_service.py +197 -0
  355. autogen/remote/errors.py +17 -0
  356. autogen/remote/httpx_client_factory.py +131 -0
  357. autogen/remote/protocol.py +37 -0
  358. autogen/remote/retry.py +102 -0
  359. autogen/remote/runtime.py +96 -0
  360. autogen/retrieve_utils.py +490 -0
  361. autogen/runtime_logging.py +161 -0
  362. autogen/testing/__init__.py +12 -0
  363. autogen/testing/messages.py +45 -0
  364. autogen/testing/test_agent.py +111 -0
  365. autogen/token_count_utils.py +280 -0
  366. autogen/tools/__init__.py +20 -0
  367. autogen/tools/contrib/__init__.py +9 -0
  368. autogen/tools/contrib/time/__init__.py +7 -0
  369. autogen/tools/contrib/time/time.py +40 -0
  370. autogen/tools/dependency_injection.py +249 -0
  371. autogen/tools/experimental/__init__.py +54 -0
  372. autogen/tools/experimental/browser_use/__init__.py +7 -0
  373. autogen/tools/experimental/browser_use/browser_use.py +154 -0
  374. autogen/tools/experimental/code_execution/__init__.py +7 -0
  375. autogen/tools/experimental/code_execution/python_code_execution.py +86 -0
  376. autogen/tools/experimental/crawl4ai/__init__.py +7 -0
  377. autogen/tools/experimental/crawl4ai/crawl4ai.py +150 -0
  378. autogen/tools/experimental/deep_research/__init__.py +7 -0
  379. autogen/tools/experimental/deep_research/deep_research.py +329 -0
  380. autogen/tools/experimental/duckduckgo/__init__.py +7 -0
  381. autogen/tools/experimental/duckduckgo/duckduckgo_search.py +103 -0
  382. autogen/tools/experimental/firecrawl/__init__.py +7 -0
  383. autogen/tools/experimental/firecrawl/firecrawl_tool.py +836 -0
  384. autogen/tools/experimental/google/__init__.py +14 -0
  385. autogen/tools/experimental/google/authentication/__init__.py +11 -0
  386. autogen/tools/experimental/google/authentication/credentials_hosted_provider.py +43 -0
  387. autogen/tools/experimental/google/authentication/credentials_local_provider.py +91 -0
  388. autogen/tools/experimental/google/authentication/credentials_provider.py +35 -0
  389. autogen/tools/experimental/google/drive/__init__.py +9 -0
  390. autogen/tools/experimental/google/drive/drive_functions.py +124 -0
  391. autogen/tools/experimental/google/drive/toolkit.py +88 -0
  392. autogen/tools/experimental/google/model.py +17 -0
  393. autogen/tools/experimental/google/toolkit_protocol.py +19 -0
  394. autogen/tools/experimental/google_search/__init__.py +8 -0
  395. autogen/tools/experimental/google_search/google_search.py +93 -0
  396. autogen/tools/experimental/google_search/youtube_search.py +181 -0
  397. autogen/tools/experimental/messageplatform/__init__.py +17 -0
  398. autogen/tools/experimental/messageplatform/discord/__init__.py +7 -0
  399. autogen/tools/experimental/messageplatform/discord/discord.py +284 -0
  400. autogen/tools/experimental/messageplatform/slack/__init__.py +7 -0
  401. autogen/tools/experimental/messageplatform/slack/slack.py +385 -0
  402. autogen/tools/experimental/messageplatform/telegram/__init__.py +7 -0
  403. autogen/tools/experimental/messageplatform/telegram/telegram.py +271 -0
  404. autogen/tools/experimental/perplexity/__init__.py +7 -0
  405. autogen/tools/experimental/perplexity/perplexity_search.py +249 -0
  406. autogen/tools/experimental/reliable/__init__.py +10 -0
  407. autogen/tools/experimental/reliable/reliable.py +1311 -0
  408. autogen/tools/experimental/searxng/__init__.py +7 -0
  409. autogen/tools/experimental/searxng/searxng_search.py +142 -0
  410. autogen/tools/experimental/tavily/__init__.py +7 -0
  411. autogen/tools/experimental/tavily/tavily_search.py +176 -0
  412. autogen/tools/experimental/web_search_preview/__init__.py +7 -0
  413. autogen/tools/experimental/web_search_preview/web_search_preview.py +120 -0
  414. autogen/tools/experimental/wikipedia/__init__.py +7 -0
  415. autogen/tools/experimental/wikipedia/wikipedia.py +284 -0
  416. autogen/tools/function_utils.py +412 -0
  417. autogen/tools/tool.py +188 -0
  418. autogen/tools/toolkit.py +86 -0
  419. autogen/types.py +29 -0
  420. autogen/version.py +7 -0
  421. templates/client_template/main.jinja2 +72 -0
  422. templates/config_template/config.jinja2 +7 -0
  423. templates/main.jinja2 +61 -0
@@ -0,0 +1,413 @@
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 re
6
+ import shutil
7
+ import subprocess
8
+ import sys
9
+ from datetime import datetime
10
+ from pathlib import Path
11
+ from textwrap import dedent, indent
12
+ from typing import Literal, TypedDict, Union
13
+
14
+ from ..import_utils import optional_import_block, require_optional_import
15
+
16
+ with optional_import_block():
17
+ import yaml
18
+
19
+
20
+ EDIT_URL_HTML = """
21
+ <div className="edit-url-container">
22
+ <a className="edit-url" href="https://github.com/ag2ai/ag2/edit/main/{file_path}" target='_blank'><Icon icon="pen" iconType="solid" size="13px"/> Edit this page</a>
23
+ </div>
24
+ """
25
+
26
+ build_system = Literal["mkdocs", "mintlify"]
27
+
28
+
29
+ class NavigationGroup(TypedDict):
30
+ group: str
31
+ pages: list[Union[str, "NavigationGroup"]]
32
+
33
+
34
+ def get_git_tracked_and_untracked_files_in_directory(directory: Path) -> list[Path]:
35
+ """Get all files in the directory that are tracked by git or newly added."""
36
+ proc = subprocess.run(
37
+ ["git", "-C", str(directory), "ls-files", "--others", "--exclude-standard", "--cached"],
38
+ capture_output=True,
39
+ text=True,
40
+ check=True,
41
+ )
42
+ return list({directory / p for p in proc.stdout.splitlines()})
43
+
44
+
45
+ def copy_files(src_dir: Path, dst_dir: Path, files_to_copy: list[Path]) -> None:
46
+ """Copy files from src_dir to dst_dir."""
47
+ for file in files_to_copy:
48
+ if file.is_file():
49
+ dst = dst_dir / file.relative_to(src_dir)
50
+ dst.parent.mkdir(parents=True, exist_ok=True)
51
+ shutil.copy2(file, dst)
52
+
53
+
54
+ def copy_only_git_tracked_and_untracked_files(src_dir: Path, dst_dir: Path, ignore_dir: str | None = None) -> None:
55
+ """Copy only the files that are tracked by git or newly added from src_dir to dst_dir."""
56
+ tracked_and_new_files = get_git_tracked_and_untracked_files_in_directory(src_dir)
57
+
58
+ if ignore_dir:
59
+ ignore_dir_rel_path = src_dir / ignore_dir
60
+
61
+ tracked_and_new_files = list({
62
+ file for file in tracked_and_new_files if not any(parent == ignore_dir_rel_path for parent in file.parents)
63
+ })
64
+
65
+ copy_files(src_dir, dst_dir, tracked_and_new_files)
66
+
67
+
68
+ def remove_marker_blocks(content: str, marker_prefix: str) -> str:
69
+ """Remove marker blocks from the content.
70
+
71
+ Args:
72
+ content: The source content to process
73
+ marker_prefix: The marker prefix to identify blocks to remove (without the START/END suffix)
74
+
75
+ Returns:
76
+ Processed content with appropriate blocks handled
77
+ """
78
+ # First, remove blocks with the specified marker completely
79
+ if f"{{/* {marker_prefix}-START */}}" in content:
80
+ pattern = rf"\{{/\* {re.escape(marker_prefix)}-START \*/\}}.*?\{{/\* {re.escape(marker_prefix)}-END \*/\}}"
81
+ content = re.sub(pattern, "", content, flags=re.DOTALL)
82
+
83
+ # Now, remove markers but keep content for the other marker type
84
+ other_prefix = (
85
+ "DELETE-ME-WHILE-BUILDING-MKDOCS"
86
+ if marker_prefix == "DELETE-ME-WHILE-BUILDING-MINTLIFY"
87
+ else "DELETE-ME-WHILE-BUILDING-MINTLIFY"
88
+ )
89
+
90
+ # Remove start markers
91
+ start_pattern = rf"\{{/\* {re.escape(other_prefix)}-START \*/\}}\s*"
92
+ content = re.sub(start_pattern, "", content)
93
+
94
+ # Remove end markers
95
+ end_pattern = rf"\s*\{{/\* {re.escape(other_prefix)}-END \*/\}}"
96
+ content = re.sub(end_pattern, "", content)
97
+
98
+ # Fix any double newlines that might have been created
99
+ content = re.sub(r"\n\s*\n\s*\n", "\n\n", content)
100
+
101
+ return content
102
+
103
+
104
+ # Sort files by parent directory date (if exists) and name
105
+ def sort_files_by_date(file_path: Path) -> tuple[datetime, str]:
106
+ dirname = file_path.parent.name
107
+ try:
108
+ # Extract date from directory name (first 3 parts)
109
+ date_str = "-".join(dirname.split("-")[:3])
110
+ date = datetime.strptime(date_str, "%Y-%m-%d")
111
+ except ValueError:
112
+ date = datetime.min
113
+ return (date, dirname)
114
+
115
+
116
+ def construct_authors_html(authors_list: list[str], authors_dict: dict[str, dict[str, str]], build_system: str) -> str:
117
+ """Constructs HTML for displaying author cards in a blog.
118
+
119
+ Args:
120
+ authors_list: list of author identifiers
121
+ authors_dict: Dictionary containing author information keyed by author identifier
122
+ build_system: The build system being used (mkdocs or mintlify)
123
+
124
+ Returns:
125
+ str: Formatted HTML string containing author cards
126
+ """
127
+ if not authors_list:
128
+ return ""
129
+
130
+ card_template_mintlify = """
131
+ <Card href="{url}">
132
+ <div class="col card">
133
+ <div class="img-placeholder">
134
+ <img noZoom src="{avatar}" />
135
+ </div>
136
+ <div>
137
+ <p class="name">{name}</p>
138
+ <p>{description}</p>
139
+ </div>
140
+ </div>
141
+ </Card>"""
142
+
143
+ card_template_mkdocs = """
144
+ <div class="card">
145
+ <div class="col card">
146
+ <div class="img-placeholder">
147
+ <img noZoom src="{avatar}" />
148
+ </div>
149
+ <div>
150
+ <p class="name">{name}</p>
151
+ <p>{description}</p>
152
+ </div>
153
+ </div>
154
+ </div>
155
+ """
156
+
157
+ card_template = card_template_mintlify if build_system == "mintlify" else card_template_mkdocs
158
+
159
+ authors_html = [card_template.format(**authors_dict[author]) for author in authors_list]
160
+
161
+ author_label = "Author:" if len(authors_list) == 1 else "Authors:"
162
+ authors_html_str = indent("".join(authors_html), " ")
163
+
164
+ retval = ""
165
+ if build_system == "mintlify":
166
+ retval = dedent(
167
+ f"""
168
+ <div class="blog-authors">
169
+ <p class="authors">{author_label}</p>
170
+ <CardGroup cols={{2}}>{authors_html_str}
171
+ </CardGroup>
172
+ </div>
173
+ """
174
+ )
175
+ else:
176
+ retval = dedent(
177
+ f"""
178
+ <div class="blog-authors">
179
+ <p class="authors">{author_label}</p>
180
+ <div class="card-group">
181
+ {authors_html_str}
182
+ </div>
183
+ </div>
184
+ """
185
+ )
186
+ return retval
187
+
188
+
189
+ def separate_front_matter_and_content(file_path: Path) -> tuple[str, str]:
190
+ """Separate front matter and content from a markdown file.
191
+
192
+ Args:
193
+ file_path (Path): Path to the mdx file
194
+ """
195
+ content = file_path.read_text(encoding="utf-8")
196
+
197
+ if content.startswith("---"):
198
+ front_matter_end = content.find("---", 3)
199
+ front_matter = content[0 : front_matter_end + 3]
200
+ content = content[front_matter_end + 3 :].strip()
201
+ return front_matter, content
202
+
203
+ return "", content
204
+
205
+
206
+ def ensure_edit_url(content: str, file_path: Path) -> str:
207
+ """Ensure editUrl is present in the content.
208
+
209
+ Args:
210
+ content (str): Content of the file
211
+ file_path (Path): Path to the file
212
+ """
213
+ html_placeholder = [line for line in EDIT_URL_HTML.splitlines() if line.strip() != ""][0]
214
+ if html_placeholder in content:
215
+ return content
216
+
217
+ return content + EDIT_URL_HTML.format(file_path=file_path)
218
+
219
+
220
+ @require_optional_import("yaml", "docs")
221
+ def add_authors_and_social_preview(
222
+ website_build_dir: Path,
223
+ target_dir: Path,
224
+ all_authors_info: dict[str, dict[str, str]],
225
+ build_system: build_system = "mintlify",
226
+ ) -> None:
227
+ """Add authors info and social share image to mdx files in the target directory."""
228
+ social_img_html = (
229
+ """\n<div>
230
+ <img noZoom className="social-share-img"
231
+ src="https://media.githubusercontent.com/media/ag2ai/ag2/refs/heads/main/website/static/img/cover.png"
232
+ alt="social preview"
233
+ style={{ position: 'absolute', left: '-9999px' }}
234
+ />
235
+ </div>"""
236
+ if build_system == "mintlify"
237
+ else ""
238
+ )
239
+
240
+ target_file_extension = "mdx" if build_system == "mintlify" else "md"
241
+ for file_path in target_dir.glob(f"**/*.{target_file_extension}"):
242
+ try:
243
+ front_matter_string, content = separate_front_matter_and_content(file_path)
244
+
245
+ # Convert single author to list and handle authors
246
+ front_matter = yaml.safe_load(front_matter_string[4:-3])
247
+ authors = front_matter.get("authors", [])
248
+ authors_list = [authors] if isinstance(authors, str) else authors
249
+
250
+ # Generate authors HTML
251
+ authors_html = (
252
+ construct_authors_html(authors_list, all_authors_info, build_system)
253
+ if '<div class="blog-authors">' not in content
254
+ else ""
255
+ )
256
+
257
+ # Combine content
258
+ new_content = f"{front_matter_string}\n{social_img_html}\n{authors_html}\n{content}"
259
+
260
+ # ensure editUrl is present
261
+
262
+ if build_system == "mintlify":
263
+ rel_file_path = (
264
+ str(file_path.relative_to(website_build_dir.parent))
265
+ .replace("build/docs/", "website/docs/")
266
+ .replace("website/docs/blog/", "website/docs/_blogs/")
267
+ )
268
+ content_with_edit_url = ensure_edit_url(new_content, Path(rel_file_path))
269
+
270
+ # replace the mkdocs excerpt marker
271
+ content_with_edit_url = content_with_edit_url.replace(r"\<!-- more -->", "")
272
+
273
+ file_path.write_text(f"{content_with_edit_url}\n", encoding="utf-8")
274
+
275
+ else:
276
+ file_path.write_text(f"{new_content}\n", encoding="utf-8")
277
+
278
+ except Exception as e:
279
+ print(f"Error processing {file_path}: {e}")
280
+ continue
281
+
282
+
283
+ @require_optional_import("yaml", "docs")
284
+ def get_authors_info(authors_yml: Path) -> dict[str, dict[str, str]]:
285
+ try:
286
+ all_authors_info = yaml.safe_load(authors_yml.read_text(encoding="utf-8"))["authors"]
287
+ except (yaml.YAMLError, OSError) as e:
288
+ print(f"Error reading authors file: {e}")
289
+ sys.exit(1)
290
+
291
+ return all_authors_info # type: ignore [no-any-return]
292
+
293
+
294
+ @require_optional_import("yaml", "docs")
295
+ def render_gallery_html(gallery_file_path: Path) -> str:
296
+ """Renders a gallery of items with tag filtering
297
+
298
+ Args:
299
+ gallery_file_path: Path to the YAML file containing gallery items
300
+
301
+ Returns:
302
+ HTML string for the gallery
303
+ """
304
+ try:
305
+ # Load gallery items from YAML file
306
+ with open(gallery_file_path) as file:
307
+ gallery_items = yaml.safe_load(file)
308
+
309
+ # Ensure gallery_items is a list
310
+ if not isinstance(gallery_items, list):
311
+ return f"<div class='error'>Error: YAML file did not contain a list, but a {type(gallery_items)}</div>"
312
+
313
+ # Extract all unique tags from gallery items
314
+ all_tags = []
315
+ for item in gallery_items:
316
+ if not isinstance(item, dict):
317
+ continue
318
+
319
+ if "tags" in item and item["tags"]:
320
+ all_tags.extend(item["tags"])
321
+ all_tags = sorted(set(all_tags))
322
+
323
+ # Generate HTML directly
324
+ html = '<div class="examples-gallery-container">'
325
+
326
+ # Generate tag filter select
327
+ html += '<select multiple class="tag-filter" data-placeholder="Filter by tags">'
328
+ for tag in all_tags:
329
+ html += f'<option value="{tag}">{tag}</option>'
330
+ html += "</select>"
331
+
332
+ # Generate gallery cards
333
+ html += '<div class="gallery-cards">'
334
+
335
+ for item in gallery_items:
336
+ # Skip if item is not a dictionary
337
+ if not isinstance(item, dict):
338
+ continue
339
+
340
+ image_url = item.get("image", "default.png")
341
+ if image_url and not isinstance(image_url, str):
342
+ # Handle case where image is not a string
343
+ image_url = "default.png"
344
+
345
+ if image_url and not image_url.startswith("http"):
346
+ image_url = f"../../../../assets/img/gallery/{image_url}"
347
+
348
+ # Handle default image
349
+ if not image_url:
350
+ image_url = "../../../../assets/img/gallery/default.png"
351
+
352
+ # Tags HTML
353
+ tags_html = ""
354
+ if "tags" in item and item["tags"]:
355
+ tags_html = '<div class="tags-container">'
356
+ for tag in item["tags"]:
357
+ tags_html += f'<span class="tag" data-tag="{tag}">{tag}</span>'
358
+ tags_html += "</div>"
359
+
360
+ # Badges HTML
361
+ badges_html = ""
362
+ notebook_src = item.get("source", None)
363
+
364
+ if notebook_src:
365
+ colab_href = f"https://colab.research.google.com/github/ag2ai/ag2/blob/main/{notebook_src}"
366
+ github_href = f"https://github.com/ag2ai/ag2/blob/main/{notebook_src}"
367
+ badges_html = f"""
368
+ <div class="badges">
369
+ <a style="margin-right: 5px" href="{colab_href}" target="_blank">
370
+ <img src="https://colab.research.google.com/assets/colab-badge.svg" alt="Open In Colab"/>
371
+ </a>
372
+ <p class="hidden">{item.get("title", "")}</p>
373
+ <a href="{github_href}" target="_blank">
374
+ <img alt="GitHub" src="https://img.shields.io/badge/Open%20on%20GitHub-grey?logo=github"/>
375
+ </a>
376
+ </div>
377
+ """
378
+
379
+ # Generate card HTML with safer access to attributes
380
+ tags_str = ",".join(item.get("tags", [])) if isinstance(item.get("tags"), list) else ""
381
+
382
+ # Generate HTML for image tag
383
+ img_tag = (
384
+ f'<img src="{image_url}" alt="{item.get("title", "")}" class="card-image">' if not notebook_src else ""
385
+ )
386
+
387
+ data_link_target = "_self" if notebook_src else "_blank"
388
+ html += f"""
389
+ <div class="card" data-link="{item.get("link", "#")}" data-rel-link="{item.get("rel_link", "#")}" data-tags="{tags_str}" data-link-target="{data_link_target}">
390
+ <div class="card-container">
391
+ {img_tag}
392
+ <p class="card-title">{item.get("title", "")}</p>
393
+ {badges_html}
394
+ <p class="card-description">{item.get("description", item.get("title", ""))}</p>
395
+ {tags_html}
396
+ </div>
397
+ </div>
398
+ """
399
+
400
+ # Close containers
401
+ html += """
402
+ </div>
403
+ </div>
404
+ """
405
+
406
+ return html
407
+
408
+ except FileNotFoundError:
409
+ return f"<div class='error'>Error: YAML file not found at path: {gallery_file_path}</div>"
410
+ except yaml.YAMLError:
411
+ return f"<div class='error'>Error: Invalid YAML format in file: {gallery_file_path}</div>"
412
+ except Exception as e:
413
+ return f"<div class='error'>Error: {str(e)}</div>"
@@ -0,0 +1,36 @@
1
+ # Copyright (c) 2023 - 2025, AG2ai, Inc., AG2ai open-source projects maintainers and core contributors
2
+ #
3
+ # SPDX-License-Identifier: Apache-2.0
4
+ try:
5
+ from a2a.types import AgentCard
6
+ except ImportError as e:
7
+ raise ImportError("a2a-sdk is not installed. Please install it with:\npip install ag2[a2a]") from e
8
+
9
+ import warnings
10
+
11
+ warnings.warn(
12
+ (
13
+ "AG2 Implementation for A2A support is in experimental mode "
14
+ "and is subjected to breaking changes. Once it's stable enough the "
15
+ "experimental mode will be removed. Your feedback is welcome."
16
+ ),
17
+ ImportWarning,
18
+ stacklevel=2,
19
+ )
20
+
21
+ from autogen.remote.httpx_client_factory import HttpxClientFactory
22
+
23
+ from .agent_executor import AutogenAgentExecutor
24
+ from .client import A2aRemoteAgent
25
+ from .httpx_client_factory import MockClient
26
+ from .server import A2aAgentServer, CardSettings
27
+
28
+ __all__ = (
29
+ "A2aAgentServer",
30
+ "A2aRemoteAgent",
31
+ "AgentCard",
32
+ "AutogenAgentExecutor",
33
+ "CardSettings",
34
+ "HttpxClientFactory",
35
+ "MockClient",
36
+ )
@@ -0,0 +1,86 @@
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 datetime import datetime, timezone
6
+ from uuid import uuid4
7
+
8
+ from a2a.server.agent_execution import AgentExecutor, RequestContext
9
+ from a2a.server.events import EventQueue
10
+ from a2a.server.tasks import TaskUpdater
11
+ from a2a.types import InternalError, Task, TaskState, TaskStatus
12
+ from a2a.utils.errors import ServerError
13
+
14
+ from autogen import ConversableAgent
15
+ from autogen.doc_utils import export_module
16
+ from autogen.remote.agent_service import AgentService
17
+
18
+ from .utils import request_message_from_a2a, response_message_to_a2a
19
+
20
+
21
+ @export_module("autogen.a2a")
22
+ class AutogenAgentExecutor(AgentExecutor):
23
+ """An agent executor that bridges Autogen ConversableAgents with A2A protocols.
24
+
25
+ This class wraps an Autogen ConversableAgent to enable it to be executed within
26
+ the A2A framework, handling message processing, task management, and event publishing.
27
+ """
28
+
29
+ def __init__(self, agent: ConversableAgent) -> None:
30
+ self.agent = AgentService(agent)
31
+
32
+ async def execute(self, context: RequestContext, event_queue: EventQueue) -> None:
33
+ assert context.message
34
+
35
+ task = context.current_task
36
+ if not task:
37
+ request = context.message
38
+ # build task object manually to allow empty messages
39
+ task = Task(
40
+ status=TaskStatus(
41
+ state=TaskState.submitted,
42
+ timestamp=datetime.now(timezone.utc).isoformat(),
43
+ ),
44
+ id=request.task_id or str(uuid4()),
45
+ context_id=request.context_id or str(uuid4()),
46
+ history=[request],
47
+ )
48
+ # publish the task status submitted event
49
+ await event_queue.enqueue_event(task)
50
+
51
+ updater = TaskUpdater(event_queue, task.id, task.context_id)
52
+
53
+ try:
54
+ result = await self.agent(request_message_from_a2a(context.message))
55
+
56
+ except Exception as e:
57
+ raise ServerError(error=InternalError()) from e
58
+
59
+ artifact, messages, input_required_msg = response_message_to_a2a(result, context.context_id, task.id)
60
+
61
+ # publish local chat history events
62
+ for message in messages:
63
+ await updater.update_status(
64
+ state=TaskState.working,
65
+ message=message,
66
+ )
67
+
68
+ # publish input required event
69
+ if input_required_msg:
70
+ await updater.requires_input(message=input_required_msg, final=True)
71
+ return
72
+
73
+ # publish the task final result event
74
+ if artifact:
75
+ await updater.add_artifact(
76
+ artifact_id=artifact.artifact_id,
77
+ name=artifact.name,
78
+ parts=artifact.parts,
79
+ metadata=artifact.metadata,
80
+ extensions=artifact.extensions,
81
+ )
82
+
83
+ await updater.complete()
84
+
85
+ async def cancel(self, context: RequestContext, event_queue: EventQueue) -> None:
86
+ pass