agentengine-sdk-python 0.7.0__py3-none-any.whl → 0.8.0__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 (371) hide show
  1. {agentengine_sdk_python-0.7.0.dist-info → agentengine_sdk_python-0.8.0.dist-info}/METADATA +36 -20
  2. agentengine_sdk_python-0.8.0.dist-info/RECORD +578 -0
  3. ksadk/a2a/__init__.py +178 -11
  4. ksadk/a2a/bootstrap.py +334 -0
  5. ksadk/a2a/card.py +120 -0
  6. ksadk/a2a/context_store.py +203 -0
  7. ksadk/a2a/control_plane.py +818 -0
  8. ksadk/a2a/credential.py +99 -0
  9. ksadk/a2a/event_adapter.py +149 -0
  10. ksadk/a2a/executor.py +406 -89
  11. ksadk/a2a/external_transport.py +516 -0
  12. ksadk/a2a/identity.py +304 -0
  13. ksadk/a2a/ids.py +22 -0
  14. ksadk/a2a/langgraph.py +285 -0
  15. ksadk/a2a/resume_store.py +201 -0
  16. ksadk/a2a/routes.py +105 -0
  17. ksadk/a2a/server.py +107 -60
  18. ksadk/a2a/space_client.py +1101 -0
  19. ksadk/a2a/task_adapter.py +423 -0
  20. ksadk/a2a/task_event_dispatcher.py +167 -0
  21. ksadk/a2a/task_event_outbox.py +326 -0
  22. ksadk/a2a/task_store.py +206 -0
  23. ksadk/a2ui/__init__.py +27 -0
  24. ksadk/a2ui/core.py +186 -0
  25. ksadk/a2ui/models.py +166 -0
  26. ksadk/a2ui/renderer.py +198 -0
  27. ksadk/agui/__init__.py +9 -0
  28. ksadk/agui/a2ui_projection.py +92 -0
  29. ksadk/agui/agent.py +857 -0
  30. ksadk/agui/config.py +86 -0
  31. ksadk/agui/routes.py +55 -0
  32. ksadk/api/client.py +233 -191
  33. ksadk/builders/__init__.py +2 -0
  34. ksadk/builders/base.py +16 -14
  35. ksadk/builders/code_builder.py +318 -236
  36. ksadk/builders/container_builder.py +187 -167
  37. ksadk/builders/framework_requirements.py +29 -11
  38. ksadk/builders/ks3_uploader.py +58 -27
  39. ksadk/builders/managed_runtime_builder.py +145 -0
  40. ksadk/builders/mcp_builder.py +91 -92
  41. ksadk/builders/requirements_utils.py +1 -5
  42. ksadk/cli/__init__.py +89 -171
  43. ksadk/cli/cmd_a2a.py +254 -70
  44. ksadk/cli/cmd_agent.py +19 -5
  45. ksadk/cli/cmd_build.py +158 -29
  46. ksadk/cli/cmd_completion.py +47 -35
  47. ksadk/cli/cmd_config.py +267 -198
  48. ksadk/cli/cmd_create.py +500 -720
  49. ksadk/cli/cmd_dashboard.py +120 -45
  50. ksadk/cli/cmd_deploy.py +117 -58
  51. ksadk/cli/cmd_destroy.py +44 -14
  52. ksadk/cli/cmd_files.py +63 -24
  53. ksadk/cli/cmd_hermes.py +168 -89
  54. ksadk/cli/cmd_invoke.py +184 -122
  55. ksadk/cli/cmd_launch.py +64 -28
  56. ksadk/cli/cmd_mcp.py +98 -64
  57. ksadk/cli/cmd_model.py +14 -5
  58. ksadk/cli/cmd_openclaw.py +483 -227
  59. ksadk/cli/cmd_replay.py +71 -0
  60. ksadk/cli/cmd_run.py +33 -10
  61. ksadk/cli/cmd_status.py +80 -31
  62. ksadk/cli/cmd_version.py +20 -13
  63. ksadk/cli/cmd_web.py +89 -13
  64. ksadk/cli/deploy_utils.py +20 -20
  65. ksadk/cli/dry_run.py +5 -3
  66. ksadk/cli/error_utils.py +37 -12
  67. ksadk/cli/global_options.py +1 -2
  68. ksadk/cli/local_runtime.py +1 -2
  69. ksadk/cli/model_catalog.py +6 -2
  70. ksadk/cli/network_options.py +34 -14
  71. ksadk/cli/resource_common.py +6 -2
  72. ksadk/cli/storage.py +0 -1
  73. ksadk/cli/ui.py +5 -3
  74. ksadk/cli/workflow_common.py +51 -17
  75. ksadk/codex/__init__.py +12 -0
  76. ksadk/codex/client.py +408 -0
  77. ksadk/codex/phase.py +143 -0
  78. ksadk/codex/runtime.py +449 -0
  79. ksadk/common/aicp_env.py +0 -1
  80. ksadk/common/auth.py +2 -2
  81. ksadk/common/constants.py +1 -3
  82. ksadk/common/llm_utils.py +17 -13
  83. ksadk/compat/__init__.py +5 -0
  84. ksadk/compat/adk_compat.py +200 -0
  85. ksadk/compat/copilotkit_a2ui.py +330 -0
  86. ksadk/configs/__init__.py +12 -12
  87. ksadk/configs/env_registry.py +500 -100
  88. ksadk/configs/global_config.py +2 -1
  89. ksadk/configs/settings.py +151 -124
  90. ksadk/conversations/__init__.py +7 -5
  91. ksadk/conversations/attachment_storage.py +16 -11
  92. ksadk/conversations/attachments.py +44 -36
  93. ksadk/conversations/compaction_pipeline.py +12 -12
  94. ksadk/conversations/compaction_prompt.py +9 -5
  95. ksadk/conversations/context.py +221 -6
  96. ksadk/conversations/message_projection.py +438 -51
  97. ksadk/conversations/model_context.py +12 -6
  98. ksadk/conversations/model_options.py +0 -1
  99. ksadk/conversations/normalize.py +20 -16
  100. ksadk/conversations/reasoning_markup.py +1 -1
  101. ksadk/conversations/runtime.py +339 -5255
  102. ksadk/conversations/runtime_compaction.py +333 -0
  103. ksadk/conversations/runtime_constants.py +27 -0
  104. ksadk/conversations/runtime_governance.py +185 -0
  105. ksadk/conversations/runtime_input.py +652 -0
  106. ksadk/conversations/runtime_invocation.py +395 -0
  107. ksadk/conversations/runtime_metadata.py +475 -0
  108. ksadk/conversations/runtime_observability.py +355 -0
  109. ksadk/conversations/runtime_payloads.py +272 -0
  110. ksadk/conversations/runtime_persistence.py +440 -0
  111. ksadk/conversations/runtime_preparation.py +418 -0
  112. ksadk/conversations/runtime_resume.py +816 -0
  113. ksadk/conversations/runtime_stream_events.py +902 -0
  114. ksadk/conversations/runtime_streaming.py +547 -0
  115. ksadk/conversations/semantic_summary.py +17 -5
  116. ksadk/conversations/session_title.py +6 -3
  117. ksadk/deployment/__init__.py +15 -16
  118. ksadk/deployment/agent_access.py +12 -23
  119. ksadk/deployment/base.py +51 -38
  120. ksadk/deployment/manager.py +63 -65
  121. ksadk/deployment/providers/serverless.py +309 -202
  122. ksadk/deployment/registry.py +38 -32
  123. ksadk/deployment/state.py +11 -11
  124. ksadk/deployment/ui_config.py +1 -1
  125. ksadk/detection/__init__.py +1 -1
  126. ksadk/detection/detector.py +146 -83
  127. ksadk/detection/mcp_detector.py +9 -6
  128. ksadk/events/__init__.py +25 -0
  129. ksadk/events/parser.py +191 -0
  130. ksadk/events/replay.py +37 -0
  131. ksadk/events/runtime_event.py +264 -0
  132. ksadk/events/store.py +317 -0
  133. ksadk/harness/__init__.py +34 -0
  134. ksadk/harness/app.py +278 -0
  135. ksadk/harness/config.py +181 -0
  136. ksadk/harness/reasoner.py +105 -0
  137. ksadk/harness/runner.py +211 -0
  138. ksadk/harness/sandbox.py +141 -0
  139. ksadk/harness/tools.py +222 -0
  140. ksadk/hermes_terminal.py +23 -12
  141. ksadk/identity/resolver.py +15 -9
  142. ksadk/ids.py +32 -0
  143. ksadk/knowledge_base/adk_tool.py +1 -1
  144. ksadk/knowledge_base/client.py +23 -29
  145. ksadk/managed_runtime.py +188 -0
  146. ksadk/markdown.py +5 -2
  147. ksadk/mcp_runtime/__init__.py +9 -6
  148. ksadk/memory/__init__.py +1 -1
  149. ksadk/memory/adk/__init__.py +2 -0
  150. ksadk/memory/adk/backends/base_ltm_backend.py +2 -6
  151. ksadk/memory/adk/backends/http_ltm_backend.py +13 -21
  152. ksadk/memory/adk/backends/inmemory_ltm_backend.py +7 -13
  153. ksadk/memory/adk/backends/sdk_ltm_backend.py +26 -33
  154. ksadk/memory/adk/long_term_memory.py +31 -35
  155. ksadk/memory/adk/resilient_session_service.py +4 -5
  156. ksadk/memory/adk/short_term_memory.py +12 -21
  157. ksadk/memory/adk_tool.py +3 -2
  158. ksadk/memory/backends/base.py +19 -19
  159. ksadk/memory/backends/memory.py +24 -25
  160. ksadk/memory/backends/redis.py +31 -30
  161. ksadk/memory/langchain_tool.py +2 -1
  162. ksadk/memory/manager.py +52 -47
  163. ksadk/memory/service.py +10 -8
  164. ksadk/model_policy.py +15 -7
  165. ksadk/model_proxy/__init__.py +51 -0
  166. ksadk/model_proxy/bootstrap.py +80 -0
  167. ksadk/model_proxy/cache.py +165 -0
  168. ksadk/model_proxy/config.py +45 -0
  169. ksadk/model_proxy/demo_webui.py +115 -0
  170. ksadk/model_proxy/detect.py +145 -0
  171. ksadk/model_proxy/gate.py +68 -0
  172. ksadk/model_proxy/namespace.py +173 -0
  173. ksadk/model_proxy/protocol_proxy.py +22 -0
  174. ksadk/model_proxy/server.py +300 -0
  175. ksadk/model_proxy/transform.py +691 -0
  176. ksadk/openclaw_gateway.py +29 -14
  177. ksadk/runners/adk_runner.py +345 -120
  178. ksadk/runners/base_runner.py +46 -29
  179. ksadk/runners/codex_runner.py +132 -0
  180. ksadk/runners/deepagents_runner.py +0 -1
  181. ksadk/runners/factory.py +17 -5
  182. ksadk/runners/langchain_runner.py +29 -742
  183. ksadk/runners/langgraph_runner.py +352 -90
  184. ksadk/runners/patch_langchain.py +16 -16
  185. ksadk/runners/remote_runner.py +134 -33
  186. ksadk/runners/usage_accumulator.py +1 -0
  187. ksadk/runners/utils/langfuse.py +3 -3
  188. ksadk/runners/utils/loader.py +7 -7
  189. ksadk/runtime/__init__.py +41 -0
  190. ksadk/runtime/adapter.py +345 -0
  191. ksadk/runtime/framework_adapters.py +124 -0
  192. ksadk/runtime/preprocessing.py +118 -0
  193. ksadk/runtime/runner_adapter.py +873 -0
  194. ksadk/runtime_context.py +18 -3
  195. ksadk/runtime_state.py +0 -1
  196. ksadk/sandbox/__init__.py +4 -1
  197. ksadk/sandbox/backends/__init__.py +4 -1
  198. ksadk/sandbox/backends/e2b.py +13 -5
  199. ksadk/sandbox/backends/local_process.py +11 -3
  200. ksadk/sandbox/base.py +10 -15
  201. ksadk/sandbox/factory.py +14 -4
  202. ksadk/sandbox/registry.py +57 -6
  203. ksadk/server/api_models.py +15 -5
  204. ksadk/server/app.py +455 -3885
  205. ksadk/server/composition.py +21 -0
  206. ksadk/server/factory.py +624 -0
  207. ksadk/server/routes/__init__.py +1 -0
  208. ksadk/server/routes/checkpoint_resolution.py +116 -0
  209. ksadk/server/routes/common.py +713 -0
  210. ksadk/server/routes/control.py +327 -0
  211. ksadk/server/routes/dependencies.py +98 -0
  212. ksadk/server/routes/misc.py +448 -0
  213. ksadk/server/routes/models.py +443 -0
  214. ksadk/server/routes/openai_compat.py +207 -0
  215. ksadk/server/routes/projection.py +795 -0
  216. ksadk/server/routes/routers.py +52 -0
  217. ksadk/server/routes/run.py +726 -0
  218. ksadk/server/routes/sessions.py +649 -0
  219. ksadk/server/routes/streaming.py +223 -0
  220. ksadk/server/routes/workspace.py +381 -0
  221. ksadk/server/static/assets/{ArtifactsPanel-D-SSn2ee.js → ArtifactsPanel-Cjnqt-8W.js} +1 -1
  222. ksadk/server/static/assets/CodeBlock-BqyqZfuB.js +9 -0
  223. ksadk/server/static/assets/MathMessageMarkdown-BpH7jiFM.js +8 -0
  224. ksadk/server/static/assets/MermaidBlock-DWuxETaJ.js +303 -0
  225. ksadk/server/static/assets/NativeTerminalPanel-MDTopWMO.js +1 -0
  226. ksadk/server/static/assets/{arc-BA13sHc9.js → arc-CFKwSk_B.js} +1 -1
  227. ksadk/server/static/assets/architecture-7EHR7CIX-CynqOWjZ.js +1 -0
  228. ksadk/server/static/assets/{architectureDiagram-3BPJPVTR-DzJzgVoL.js → architectureDiagram-3BPJPVTR-Dej8jX8c.js} +1 -1
  229. ksadk/server/static/assets/{blockDiagram-GPEHLZMM-UTdVcZhn.js → blockDiagram-GPEHLZMM-1F64jqvy.js} +1 -1
  230. ksadk/server/static/assets/{c4Diagram-AAUBKEIU-Dix0GD4m.js → c4Diagram-AAUBKEIU-9q7AUAKb.js} +1 -1
  231. ksadk/server/static/assets/channel-iUGv2N24.js +1 -0
  232. ksadk/server/static/assets/{chunk-2J33WTMH-C2JxuZ42.js → chunk-2J33WTMH-6qgwJm7Q.js} +1 -1
  233. ksadk/server/static/assets/{chunk-4BX2VUAB-Be57QPgD.js → chunk-4BX2VUAB-CsWIQRhc.js} +1 -1
  234. ksadk/server/static/assets/{chunk-55IACEB6-WjSuy4nv.js → chunk-55IACEB6-BK8paA20.js} +1 -1
  235. ksadk/server/static/assets/{chunk-727SXJPM-BOovP-b5.js → chunk-727SXJPM-B-JEhy7h.js} +1 -1
  236. ksadk/server/static/assets/{chunk-AQP2D5EJ-DOmZNmWj.js → chunk-AQP2D5EJ-DYBvMHAa.js} +1 -1
  237. ksadk/server/static/assets/{chunk-FMBD7UC4-DzwlodkU.js → chunk-FMBD7UC4-BGhvzDYt.js} +1 -1
  238. ksadk/server/static/assets/{chunk-ND2GUHAM-DMqAikEU.js → chunk-ND2GUHAM-D98vPd-E.js} +1 -1
  239. ksadk/server/static/assets/chunk-QZHKN3VN-YQIEXeF6.js +1 -0
  240. ksadk/server/static/assets/classDiagram-4FO5ZUOK-CDAUuoXK.js +1 -0
  241. ksadk/server/static/assets/classDiagram-v2-Q7XG4LA2-CDAUuoXK.js +1 -0
  242. ksadk/server/static/assets/{cose-bilkent-S5V4N54A-Zhy2GBnP.js → cose-bilkent-S5V4N54A-CX3yotHq.js} +1 -1
  243. ksadk/server/static/assets/{dagre-BM42HDAG-CbKrtIUz.js → dagre-BM42HDAG-C7TguAWo.js} +1 -1
  244. ksadk/server/static/assets/{diagram-2AECGRRQ-BRApgQRK.js → diagram-2AECGRRQ-Dd17_kws.js} +1 -1
  245. ksadk/server/static/assets/{diagram-5GNKFQAL-D0xbnDiK.js → diagram-5GNKFQAL-DVIClIil.js} +1 -1
  246. ksadk/server/static/assets/{diagram-KO2AKTUF-CVugVI9L.js → diagram-KO2AKTUF-Df_3gYQa.js} +1 -1
  247. ksadk/server/static/assets/{diagram-LMA3HP47-DozUGgee.js → diagram-LMA3HP47-BhLk6ZtA.js} +1 -1
  248. ksadk/server/static/assets/{diagram-OG6HWLK6-ZOYsKlru.js → diagram-OG6HWLK6-D4GNGvuu.js} +1 -1
  249. ksadk/server/static/assets/{dist-DmFaq_Iy.js → dist-6CVKuTAe.js} +1 -1
  250. ksadk/server/static/assets/{dist-8EEyGgDx.js → dist-BUHRxvDG.js} +1 -1
  251. ksadk/server/static/assets/{dist-B0NP_Z0z.js → dist-BZ9n9AjO.js} +1 -1
  252. ksadk/server/static/assets/{dist-DMezvBGJ.js → dist-BibcG1V9.js} +1 -1
  253. ksadk/server/static/assets/{dist-C3HIIaN5.js → dist-Bs-jQcRX.js} +1 -1
  254. ksadk/server/static/assets/{dist-BrCcQ47T.js → dist-C2xjE7cO.js} +1 -1
  255. ksadk/server/static/assets/{dist-Dp0k7bWI.js → dist-C7-3jInC.js} +1 -1
  256. ksadk/server/static/assets/{dist-D-xOD048.js → dist-C99THtIA.js} +1 -1
  257. ksadk/server/static/assets/{dist-CkEKJFtk.js → dist-CGcp2ex8.js} +1 -1
  258. ksadk/server/static/assets/{dist-DyOkZmze.js → dist-CVQRZjPu.js} +1 -1
  259. ksadk/server/static/assets/{dist-BssVmjIo.js → dist-Cf23NY4L.js} +1 -1
  260. ksadk/server/static/assets/{dist-BIJVDMuB.js → dist-CgF3fj15.js} +1 -1
  261. ksadk/server/static/assets/{dist-2hInLS_J.js → dist-Cwt7koer.js} +1 -1
  262. ksadk/server/static/assets/{dist-DyWsb78Q.js → dist-D82mtD2s.js} +1 -1
  263. ksadk/server/static/assets/{dist-D-JMdWPQ.js → dist-DF06ORQo.js} +1 -1
  264. ksadk/server/static/assets/{dist-BmlMPsCc.js → dist-DHn6nBzr.js} +1 -1
  265. ksadk/server/static/assets/{dist-gX6GOLKq.js → dist-Djgl2wVZ.js} +1 -1
  266. ksadk/server/static/assets/{dist-DpKtt4Bo.js → dist-DlzCRy0S.js} +1 -1
  267. ksadk/server/static/assets/{dist-8_SfK1IP.js → dist-DqNnNFrw.js} +1 -1
  268. ksadk/server/static/assets/{dist-D57wnGWd.js → dist-DyvYLMW9.js} +1 -1
  269. ksadk/server/static/assets/{dist-CPBtqRTW.js → dist-eoW6tZXA.js} +1 -1
  270. ksadk/server/static/assets/{dist-DL_NKc_z.js → dist-ivOya1LD.js} +1 -1
  271. ksadk/server/static/assets/{erDiagram-TEJ5UH35-Bk-9bgE5.js → erDiagram-TEJ5UH35-CnfRcY2M.js} +1 -1
  272. ksadk/server/static/assets/eventmodeling-FCH6USID-ChYO-ijM.js +1 -0
  273. ksadk/server/static/assets/{flowDiagram-I6XJVG4X-Dn9kZVuZ.js → flowDiagram-I6XJVG4X-DGaJjGNJ.js} +1 -1
  274. ksadk/server/static/assets/{ganttDiagram-6RSMTGT7-BGxXlJqm.js → ganttDiagram-6RSMTGT7-DpCoB2g9.js} +1 -1
  275. ksadk/server/static/assets/gitGraph-WXDBUCRP-BN_0Fk-j.js +1 -0
  276. ksadk/server/static/assets/{gitGraphDiagram-PVQCEYII-C7Q0X-wi.js → gitGraphDiagram-PVQCEYII-9IKVFBVT.js} +1 -1
  277. ksadk/server/static/assets/index-QSwCHuB8.js +177 -0
  278. ksadk/server/static/assets/index-jOPmTOZH.css +2 -0
  279. ksadk/server/static/assets/info-J43DQDTF-Cp6o3vId.js +1 -0
  280. ksadk/server/static/assets/{infoDiagram-5YYISTIA-BO_CSqq5.js → infoDiagram-5YYISTIA-CYIIsb8y.js} +1 -1
  281. ksadk/server/static/assets/{ishikawaDiagram-YF4QCWOH-eYLPLd46.js → ishikawaDiagram-YF4QCWOH-DLOHGvWw.js} +1 -1
  282. ksadk/server/static/assets/{journeyDiagram-JHISSGLW-De9geSb0.js → journeyDiagram-JHISSGLW-BIzKeejT.js} +1 -1
  283. ksadk/server/static/assets/{kanban-definition-UN3LZRKU-Cs80kQto.js → kanban-definition-UN3LZRKU-BWHoFSw2.js} +1 -1
  284. ksadk/server/static/assets/{katex-DSrCFD8n.js → katex-DATssjp1.js} +1 -1
  285. ksadk/server/static/assets/{linear-CN9sbKTF.js → linear-CvMBw9cA.js} +1 -1
  286. ksadk/server/static/assets/{mermaid-parser.core-DlgSBU8l.js → mermaid-parser.core-mGAcEwcq.js} +2 -2
  287. ksadk/server/static/assets/{mindmap-definition-RKZ34NQL-9afz7Oug.js → mindmap-definition-RKZ34NQL-CSAQxEAe.js} +1 -1
  288. ksadk/server/static/assets/packet-YPE3B663-wQzct3cT.js +1 -0
  289. ksadk/server/static/assets/pie-LRSECV5Y-BgTQiv-9.js +1 -0
  290. ksadk/server/static/assets/{pieDiagram-4H26LBE5-DPv_VstN.js → pieDiagram-4H26LBE5-By-ra07M.js} +1 -1
  291. ksadk/server/static/assets/{quadrantDiagram-W4KKPZXB-o77wZ1XK.js → quadrantDiagram-W4KKPZXB-CxIR4JXI.js} +1 -1
  292. ksadk/server/static/assets/radar-GUYGQ44K-BIq5fXsn.js +1 -0
  293. ksadk/server/static/assets/{requirementDiagram-4Y6WPE33-BYVw81VC.js → requirementDiagram-4Y6WPE33-DpW90iu3.js} +1 -1
  294. ksadk/server/static/assets/{sankeyDiagram-5OEKKPKP-B7nZFMKT.js → sankeyDiagram-5OEKKPKP-DpGa6EAV.js} +1 -1
  295. ksadk/server/static/assets/{sequenceDiagram-3UESZ5HK-BGRRrFw5.js → sequenceDiagram-3UESZ5HK-NTKNGGe5.js} +1 -1
  296. ksadk/server/static/assets/{stateDiagram-AJRCARHV-BUfHCoPs.js → stateDiagram-AJRCARHV-DGpd9yFG.js} +1 -1
  297. ksadk/server/static/assets/stateDiagram-v2-BHNVJYJU-B3o579IQ.js +1 -0
  298. ksadk/server/static/assets/{timeline-definition-PNZ67QCA-FbCTGrf9.js → timeline-definition-PNZ67QCA-jqoYs3jQ.js} +1 -1
  299. ksadk/server/static/assets/treeView-BLDUP644-Dqi-E0EM.js +1 -0
  300. ksadk/server/static/assets/treemap-LRROVOQU-ClQP9CJ9.js +1 -0
  301. ksadk/server/static/assets/{vennDiagram-CIIHVFJN-DWgwtPsJ.js → vennDiagram-CIIHVFJN-l3Z7-wbP.js} +1 -1
  302. ksadk/server/static/assets/wardley-L42UT6IY-8XLvnNIs.js +1 -0
  303. ksadk/server/static/assets/{wardleyDiagram-YWT4CUSO-2x8G-tTM.js → wardleyDiagram-YWT4CUSO-BR54GPmr.js} +1 -1
  304. ksadk/server/static/assets/{xychartDiagram-2RQKCTM6-Drma3AYl.js → xychartDiagram-2RQKCTM6-SkiH8GsK.js} +1 -1
  305. ksadk/server/static/index.html +2 -2
  306. ksadk/server/terminal_sessions.py +111 -58
  307. ksadk/sessions/__init__.py +69 -19
  308. ksadk/sessions/base.py +31 -11
  309. ksadk/sessions/continuity.py +2 -3
  310. ksadk/sessions/in_memory.py +46 -2
  311. ksadk/sessions/local_service.py +148 -17
  312. ksadk/sessions/postgres_service.py +143 -25
  313. ksadk/sessions/resilient.py +36 -8
  314. ksadk/skills/models.py +17 -5
  315. ksadk/skills/package_store.py +5 -2
  316. ksadk/skills/runtime/agent.py +20 -5
  317. ksadk/skills/runtime/artifacts.py +1 -5
  318. ksadk/skills/runtime/backends/e2b.py +10 -4
  319. ksadk/skills/runtime/backends/local.py +15 -3
  320. ksadk/skills/runtime/base.py +1 -2
  321. ksadk/skills/runtime/executor.py +10 -3
  322. ksadk/skills/runtime/factory.py +4 -2
  323. ksadk/skills/runtime/loader.py +1 -2
  324. ksadk/skills/runtime/registry.py +15 -10
  325. ksadk/skills/runtime/request.py +3 -1
  326. ksadk/skills/service_client.py +38 -17
  327. ksadk/skills/tool_defs.py +15 -10
  328. ksadk/terminal_exec_policy.py +3 -4
  329. ksadk/tools/gateway.py +92 -15
  330. ksadk/tools/result_budget.py +12 -4
  331. ksadk/toolsets/__init__.py +134 -36
  332. ksadk/toolsets/platform.py +21 -5
  333. ksadk/toolsets/sandbox.py +82 -16
  334. ksadk/toolsets/skills.py +200 -39
  335. ksadk/toolsets/web.py +123 -26
  336. ksadk/toolsets/workspace.py +212 -101
  337. ksadk/tracing/exporters/inmemory_exporter.py +62 -51
  338. ksadk/tracing/exporters/langfuse_exporter.py +91 -76
  339. ksadk/tracing/setup.py +69 -53
  340. ksadk/tracing/span_utils.py +5 -2
  341. ksadk/tui/loop.py +78 -30
  342. ksadk/tui/stream_render.py +1 -0
  343. ksadk/ui_config.py +5 -3
  344. ksadk/version.py +1 -1
  345. ksadk_runtime_common/schemas/runtime_event_v1.json +95 -0
  346. agentengine_sdk_python-0.7.0.dist-info/RECORD +0 -482
  347. ksadk/server/static/assets/CodeBlock-P16VOLYi.js +0 -9
  348. ksadk/server/static/assets/MathMessageMarkdown-CdGiQWHR.js +0 -8
  349. ksadk/server/static/assets/MermaidBlock-IOcal8cm.js +0 -303
  350. ksadk/server/static/assets/NativeTerminalPanel-DGSDWsei.js +0 -1
  351. ksadk/server/static/assets/architecture-7EHR7CIX-BvUlsA6l.js +0 -1
  352. ksadk/server/static/assets/channel-CTuydARX.js +0 -1
  353. ksadk/server/static/assets/chunk-QZHKN3VN-BnCydivS.js +0 -1
  354. ksadk/server/static/assets/classDiagram-4FO5ZUOK-BNHg45Be.js +0 -1
  355. ksadk/server/static/assets/classDiagram-v2-Q7XG4LA2-BNHg45Be.js +0 -1
  356. ksadk/server/static/assets/eventmodeling-FCH6USID-DsAgWnlf.js +0 -1
  357. ksadk/server/static/assets/gitGraph-WXDBUCRP-BIao9Yjg.js +0 -1
  358. ksadk/server/static/assets/index-C00Lwg3L.js +0 -165
  359. ksadk/server/static/assets/index-DAURbCsP.css +0 -1
  360. ksadk/server/static/assets/info-J43DQDTF-CyipqGxU.js +0 -1
  361. ksadk/server/static/assets/packet-YPE3B663-CGkyRxlg.js +0 -1
  362. ksadk/server/static/assets/pie-LRSECV5Y-M0uWAf4n.js +0 -1
  363. ksadk/server/static/assets/radar-GUYGQ44K-Bdbm24-x.js +0 -1
  364. ksadk/server/static/assets/stateDiagram-v2-BHNVJYJU-8xBN_gLM.js +0 -1
  365. ksadk/server/static/assets/treeView-BLDUP644-npMo0ak1.js +0 -1
  366. ksadk/server/static/assets/treemap-LRROVOQU-CHdzrrdo.js +0 -1
  367. ksadk/server/static/assets/wardley-L42UT6IY-BEQz7wyy.js +0 -1
  368. {agentengine_sdk_python-0.7.0.dist-info → agentengine_sdk_python-0.8.0.dist-info}/WHEEL +0 -0
  369. {agentengine_sdk_python-0.7.0.dist-info → agentengine_sdk_python-0.8.0.dist-info}/entry_points.txt +0 -0
  370. {agentengine_sdk_python-0.7.0.dist-info → agentengine_sdk_python-0.8.0.dist-info}/licenses/LICENSE +0 -0
  371. {agentengine_sdk_python-0.7.0.dist-info → agentengine_sdk_python-0.8.0.dist-info}/top_level.txt +0 -0
ksadk/a2a/__init__.py CHANGED
@@ -1,15 +1,182 @@
1
- """A2A protocol helpers for KsADK runners and remote agents."""
1
+ """A2A 协议数据面 (goal-05 清洁重写,wire 1.0 / a2a-sdk 1.1.0)。
2
2
 
3
- from ksadk.a2a.card_builder import AgentCardBuilder
4
- from ksadk.a2a.client import RemoteA2AAgent, RemoteA2AClient
5
- from ksadk.a2a.executor import KsAgentExecutor
6
- from ksadk.a2a.server import KsA2AServer, to_a2a
3
+ 旧 0.3 demo(``A2AStarletteApplication`` + ``InMemoryTaskStore`` + 顶层 ``url``)
4
+ 已整体推倒,不保留兼容。本包:
5
+
6
+ - :mod:`ksadk.a2a.card` — wire 1.0 AgentCard(``supportedInterfaces``)。
7
+ - :mod:`ksadk.a2a.task_store` — durable ``DatabaseTaskStore``(表 ``ksadk_a2a_tasks``)。
8
+ - :mod:`ksadk.a2a.executor` — runner → A2A 请求生命周期桥接。
9
+ - :mod:`ksadk.a2a.task_adapter` — A2A Task ↔ Runtime 映射(§7.2),cancel 走 RuntimeAdapter。
10
+ - :mod:`ksadk.a2a.event_adapter` — A2A Message/Task/Artifact ↔ RuntimeEvent。
11
+ - :mod:`ksadk.a2a.server` — ``A2AProtocolServer``(route factories + handler + store)。
12
+ - :mod:`ksadk.a2a.routes` — ``add_a2a_protocol_routes`` 装配进 create_runtime_app。
13
+
14
+ client 侧(``A2ASpaceClient`` 动态发现)见 goal-06。
15
+ """
16
+
17
+ from ksadk.a2a.bootstrap import A2ACheckpointStore, AgentEngineA2ABootstrap, RuntimeA2AMetadata
18
+ from ksadk.a2a.card import (
19
+ A2A_PROTOCOL_VERSION,
20
+ JSONRPC_PATH,
21
+ REST_PATH_PREFIX,
22
+ build_agent_card,
23
+ )
24
+ from ksadk.a2a.context_store import (
25
+ A2AContextIdentity,
26
+ A2AContextStore,
27
+ SQLiteA2AContextStore,
28
+ )
29
+ from ksadk.a2a.control_plane import (
30
+ A2A_INTERNAL_ACTIONS,
31
+ A2A_INTERNAL_PATH_PREFIX,
32
+ ENV_A2A_CONTROL_PLANE_URL,
33
+ ENV_A2A_TOKEN_DIR,
34
+ A2AControlPlane,
35
+ A2AControlPlaneError,
36
+ A2AInternalAction,
37
+ A2AOperation,
38
+ A2ARoute,
39
+ A2ARouteInterface,
40
+ A2ATarget,
41
+ CredentialInjection,
42
+ FileWorkloadTokenProvider,
43
+ InternalA2AControlPlaneClient,
44
+ PreparedA2AOperation,
45
+ RemoteTaskReference,
46
+ WorkloadTokenProvider,
47
+ build_a2a_internal_action_path,
48
+ )
49
+ from ksadk.a2a.event_adapter import A2AEventAdapter
50
+ from ksadk.a2a.executor import A2ARuntimeExecutor
51
+ from ksadk.a2a.external_transport import (
52
+ ERR_VPC_EGRESS_DIALER_REQUIRED,
53
+ A2AExternalTransport,
54
+ A2ARouteOpener,
55
+ A2ATransportLease,
56
+ CallableA2ARouteOpener,
57
+ GuardedA2AExternalTransport,
58
+ RuntimeLocalA2AExternalTransport,
59
+ )
60
+ from ksadk.a2a.identity import (
61
+ A2AGatewayIdentityMiddleware,
62
+ A2AIngressIdentity,
63
+ A2AIngressTargetBinding,
64
+ A2ATrustedIdentityResolver,
65
+ CallableGatewayIdentityVerifier,
66
+ CallableGatewayProbeVerifier,
67
+ GatewayIdentityVerifier,
68
+ GatewayProbeVerifier,
69
+ )
70
+ from ksadk.a2a.langgraph import (
71
+ A2AStreamEvent,
72
+ stream_a2a_agent,
73
+ stream_a2a_agent_events,
74
+ stream_a2a_agent_to_writer,
75
+ )
76
+ from ksadk.a2a.resume_store import (
77
+ A2AResumePayloadKind,
78
+ A2AResumeState,
79
+ A2AResumeStateStore,
80
+ InMemoryA2AResumeStateStore,
81
+ SQLiteA2AResumeStateStore,
82
+ )
83
+ from ksadk.a2a.routes import A2AConfig, add_a2a_protocol_routes
84
+ from ksadk.a2a.server import A2AProtocolServer
85
+ from ksadk.a2a.space_client import (
86
+ ENV_A2A_ENABLE_PUBLIC_EGRESS,
87
+ ENV_A2A_SPACE_IDS,
88
+ ERR_PUBLIC_EGRESS_DISABLED,
89
+ A2APlatformTask,
90
+ A2ASpaceClient,
91
+ DiscoveredAgent,
92
+ SpaceAgentPage,
93
+ )
94
+ from ksadk.a2a.task_adapter import A2ARuntimeTaskAdapter
95
+ from ksadk.a2a.task_event_dispatcher import A2ATaskEventDispatcher, A2ATaskEventSink
96
+ from ksadk.a2a.task_event_outbox import (
97
+ DEFAULT_A2A_EVENT_OUTBOX_PATH,
98
+ ENV_A2A_EVENT_OUTBOX_PATH,
99
+ A2ATaskEventBatch,
100
+ A2ATaskEventOutbox,
101
+ InMemoryA2ATaskEventOutbox,
102
+ SQLiteA2ATaskEventOutbox,
103
+ )
104
+ from ksadk.a2a.task_store import A2A_TASK_TABLE, build_a2a_task_store
7
105
 
8
106
  __all__ = [
9
- "AgentCardBuilder",
10
- "KsA2AServer",
11
- "KsAgentExecutor",
12
- "RemoteA2AAgent",
13
- "RemoteA2AClient",
14
- "to_a2a",
107
+ "A2AConfig",
108
+ "A2ACheckpointStore",
109
+ "A2AContextIdentity",
110
+ "A2AContextStore",
111
+ "A2AControlPlane",
112
+ "A2AControlPlaneError",
113
+ "A2AInternalAction",
114
+ "A2A_INTERNAL_ACTIONS",
115
+ "A2A_INTERNAL_PATH_PREFIX",
116
+ "A2AOperation",
117
+ "A2AEventAdapter",
118
+ "A2AExternalTransport",
119
+ "A2AGatewayIdentityMiddleware",
120
+ "A2AIngressIdentity",
121
+ "A2AIngressTargetBinding",
122
+ "A2APlatformTask",
123
+ "A2AProtocolServer",
124
+ "A2ARuntimeExecutor",
125
+ "A2ARuntimeTaskAdapter",
126
+ "A2AResumeState",
127
+ "A2AResumePayloadKind",
128
+ "A2AResumeStateStore",
129
+ "A2ASpaceClient",
130
+ "A2AStreamEvent",
131
+ "A2A_PROTOCOL_VERSION",
132
+ "A2ARoute",
133
+ "A2ARouteOpener",
134
+ "A2ARouteInterface",
135
+ "A2A_TASK_TABLE",
136
+ "A2ATarget",
137
+ "A2ATaskEventBatch",
138
+ "A2ATaskEventDispatcher",
139
+ "A2ATaskEventSink",
140
+ "A2ATaskEventOutbox",
141
+ "A2ATransportLease",
142
+ "A2ATrustedIdentityResolver",
143
+ "AgentEngineA2ABootstrap",
144
+ "CallableA2ARouteOpener",
145
+ "CallableGatewayIdentityVerifier",
146
+ "CallableGatewayProbeVerifier",
147
+ "CredentialInjection",
148
+ "DiscoveredAgent",
149
+ "ERR_VPC_EGRESS_DIALER_REQUIRED",
150
+ "DEFAULT_A2A_EVENT_OUTBOX_PATH",
151
+ "ENV_A2A_CONTROL_PLANE_URL",
152
+ "ENV_A2A_ENABLE_PUBLIC_EGRESS",
153
+ "ENV_A2A_EVENT_OUTBOX_PATH",
154
+ "ENV_A2A_SPACE_IDS",
155
+ "ENV_A2A_TOKEN_DIR",
156
+ "ERR_PUBLIC_EGRESS_DISABLED",
157
+ "FileWorkloadTokenProvider",
158
+ "GatewayIdentityVerifier",
159
+ "GatewayProbeVerifier",
160
+ "GuardedA2AExternalTransport",
161
+ "InMemoryA2ATaskEventOutbox",
162
+ "InMemoryA2AResumeStateStore",
163
+ "JSONRPC_PATH",
164
+ "InternalA2AControlPlaneClient",
165
+ "PreparedA2AOperation",
166
+ "RemoteTaskReference",
167
+ "REST_PATH_PREFIX",
168
+ "SpaceAgentPage",
169
+ "SQLiteA2ATaskEventOutbox",
170
+ "SQLiteA2AContextStore",
171
+ "SQLiteA2AResumeStateStore",
172
+ "RuntimeA2AMetadata",
173
+ "RuntimeLocalA2AExternalTransport",
174
+ "WorkloadTokenProvider",
175
+ "add_a2a_protocol_routes",
176
+ "build_a2a_task_store",
177
+ "build_a2a_internal_action_path",
178
+ "build_agent_card",
179
+ "stream_a2a_agent",
180
+ "stream_a2a_agent_events",
181
+ "stream_a2a_agent_to_writer",
15
182
  ]
ksadk/a2a/bootstrap.py ADDED
@@ -0,0 +1,334 @@
1
+ """AgentEngine product composition root for managed inbound and outbound A2A."""
2
+
3
+ from __future__ import annotations
4
+
5
+ import inspect
6
+ from dataclasses import dataclass
7
+ from typing import Any, Protocol, Sequence
8
+ from urllib.parse import urlsplit
9
+
10
+ import httpx
11
+ from a2a.server.tasks import TaskStore
12
+ from a2a.types import AgentSkill
13
+ from fastapi import FastAPI
14
+
15
+ from ksadk.a2a.context_store import A2AContextStore
16
+ from ksadk.a2a.external_transport import RuntimeLocalA2AExternalTransport
17
+ from ksadk.a2a.identity import (
18
+ A2AGatewayIdentityMiddleware,
19
+ A2AIngressTargetBinding,
20
+ A2ATrustedIdentityResolver,
21
+ GatewayIdentityVerifier,
22
+ GatewayProbeVerifier,
23
+ )
24
+ from ksadk.a2a.ids import require_a2a_resource_id
25
+ from ksadk.a2a.resume_store import A2AResumeStateStore
26
+ from ksadk.a2a.routes import A2AConfig, add_a2a_protocol_routes
27
+ from ksadk.a2a.task_adapter import A2ARuntimeTaskAdapter
28
+ from ksadk.a2a.task_event_dispatcher import A2ATaskEventDispatcher
29
+ from ksadk.a2a.task_event_outbox import A2ATaskEventOutbox
30
+ from ksadk.a2a.task_store import A2AOwnerContextBuilder
31
+ from ksadk.runtime.adapter import RuntimeAdapter
32
+
33
+
34
+ @dataclass(frozen=True)
35
+ class RuntimeA2AMetadata:
36
+ account_id: str
37
+ tenant_id: str
38
+ agent_id: str
39
+ a2a_agent_id: str
40
+ runtime_id: str
41
+ internal_base_url: str
42
+ name: str
43
+ version: str
44
+ skills: Sequence[AgentSkill]
45
+ description: str = ""
46
+
47
+ def validate(self) -> None:
48
+ values = {
49
+ "account_id": self.account_id,
50
+ "agent_id": self.agent_id,
51
+ "a2a_agent_id": self.a2a_agent_id,
52
+ "runtime_id": self.runtime_id,
53
+ "internal_base_url": self.internal_base_url,
54
+ "name": self.name,
55
+ "version": self.version,
56
+ }
57
+ missing = [name for name, value in values.items() if not str(value).strip()]
58
+ if missing:
59
+ raise ValueError(f"RuntimeA2AMetadata is missing required fields: {', '.join(missing)}")
60
+ if not self.agent_id.startswith("ar-"):
61
+ raise ValueError("RuntimeA2AMetadata.agent_id must be an ar-* Agent ID")
62
+ require_a2a_resource_id(
63
+ self.a2a_agent_id,
64
+ "a2a-agent-",
65
+ field_name="RuntimeA2AMetadata.a2a_agent_id",
66
+ )
67
+ for field_name, limit in (
68
+ ("account_id", 64),
69
+ ("tenant_id", 64),
70
+ ("agent_id", 64),
71
+ ("a2a_agent_id", 64),
72
+ ("runtime_id", 64),
73
+ ("name", 128),
74
+ ("description", 1024),
75
+ ("version", 64),
76
+ ):
77
+ if len(str(getattr(self, field_name))) > limit:
78
+ raise ValueError(f"RuntimeA2AMetadata.{field_name} exceeds {limit} characters")
79
+ if len(self.skills) > 100 or not all(
80
+ isinstance(skill, AgentSkill) for skill in self.skills
81
+ ):
82
+ raise ValueError(
83
+ "RuntimeA2AMetadata.skills must contain at most 100 AgentSkill objects"
84
+ )
85
+ parsed = urlsplit(self.internal_base_url)
86
+ try:
87
+ port = parsed.port
88
+ except ValueError as exc:
89
+ raise ValueError(
90
+ "RuntimeA2AMetadata.internal_base_url must be an absolute HTTP(S) origin"
91
+ ) from exc
92
+ if (
93
+ parsed.scheme not in {"http", "https"}
94
+ or not parsed.hostname
95
+ or parsed.username is not None
96
+ or parsed.password is not None
97
+ or parsed.path
98
+ or parsed.query
99
+ or parsed.fragment
100
+ or parsed.netloc.rsplit("@", 1)[-1].endswith(":")
101
+ or port is not None and not 1 <= port <= 65535
102
+ ):
103
+ raise ValueError(
104
+ "RuntimeA2AMetadata.internal_base_url must be an absolute HTTP(S) origin"
105
+ )
106
+
107
+
108
+ class A2ACheckpointStore(Protocol):
109
+ """Durable checkpoint backend readiness contract owned by the Runtime adapter."""
110
+
111
+ async def initialize(self) -> None: ...
112
+
113
+
114
+ class AgentEngineA2ABootstrap:
115
+ """Single product-owned composition root for managed A2A Runtime dependencies."""
116
+
117
+ def __init__(
118
+ self,
119
+ *,
120
+ runtime_metadata: RuntimeA2AMetadata,
121
+ task_store: TaskStore | None = None,
122
+ context_store: A2AContextStore | None = None,
123
+ checkpoint_store: A2ACheckpointStore | None = None,
124
+ resume_state_store: A2AResumeStateStore | None = None,
125
+ gateway_identity_verifier: GatewayIdentityVerifier | None = None,
126
+ gateway_probe_verifier: GatewayProbeVerifier | None = None,
127
+ external_transport: RuntimeLocalA2AExternalTransport | None = None,
128
+ control_plane: Any | None = None,
129
+ hosted_http_client: httpx.AsyncClient | None = None,
130
+ event_outbox: A2ATaskEventOutbox | None = None,
131
+ inbound_enabled: bool = True,
132
+ outbound_enabled: bool = True,
133
+ public_egress_enabled: bool = False,
134
+ outbox_retry_interval_seconds: float = 1.0,
135
+ ) -> None:
136
+ runtime_metadata.validate()
137
+ required: dict[str, Any] = {}
138
+ if outbound_enabled:
139
+ required.update(
140
+ {
141
+ "control_plane": control_plane,
142
+ "hosted_http_client": hosted_http_client,
143
+ "event_outbox": event_outbox,
144
+ }
145
+ )
146
+ if inbound_enabled:
147
+ required.update(
148
+ {
149
+ "task_store": task_store,
150
+ "context_store": context_store,
151
+ "checkpoint_store": checkpoint_store,
152
+ "resume_state_store": resume_state_store,
153
+ "gateway_identity_verifier": gateway_identity_verifier,
154
+ "gateway_probe_verifier": gateway_probe_verifier,
155
+ }
156
+ )
157
+ missing = [name for name, value in required.items() if value is None]
158
+ if missing:
159
+ raise ValueError(
160
+ "AgentEngineA2ABootstrap requires: " + ", ".join(missing)
161
+ )
162
+ if external_transport is not None and not isinstance(
163
+ external_transport, RuntimeLocalA2AExternalTransport
164
+ ):
165
+ raise TypeError(
166
+ "AgentEngineA2ABootstrap requires RuntimeLocalA2AExternalTransport "
167
+ "for external_public routes"
168
+ )
169
+ if not outbound_enabled and external_transport is not None:
170
+ raise ValueError("external_transport requires outbound_enabled=True")
171
+ if inbound_enabled:
172
+ _require_initializable(task_store, "task_store")
173
+ _require_initializable(context_store, "context_store")
174
+ _require_initializable(checkpoint_store, "checkpoint_store")
175
+ _require_initializable(resume_state_store, "resume_state_store")
176
+ self.runtime_metadata = runtime_metadata
177
+ self._target_binding = A2AIngressTargetBinding(
178
+ account_id=runtime_metadata.account_id,
179
+ tenant_id=runtime_metadata.tenant_id,
180
+ agent_id=runtime_metadata.agent_id,
181
+ runtime_id=runtime_metadata.runtime_id,
182
+ a2a_agent_id=runtime_metadata.a2a_agent_id,
183
+ )
184
+ self.inbound_enabled = inbound_enabled
185
+ self.outbound_enabled = outbound_enabled
186
+ self.public_egress_enabled = public_egress_enabled
187
+ self._task_store = task_store
188
+ self._context_store = context_store
189
+ self._checkpoint_store = checkpoint_store
190
+ self._resume_state_store = resume_state_store
191
+ self._gateway_identity_verifier = gateway_identity_verifier
192
+ self._gateway_probe_verifier = gateway_probe_verifier
193
+ self._external_transport = external_transport
194
+ self._control_plane = control_plane
195
+ self._hosted_http_client = hosted_http_client
196
+ self._dispatcher = (
197
+ A2ATaskEventDispatcher(
198
+ _require(event_outbox, "event_outbox"),
199
+ _require(control_plane, "control_plane"),
200
+ retry_interval_seconds=outbox_retry_interval_seconds,
201
+ )
202
+ if outbound_enabled
203
+ else None
204
+ )
205
+ self._mounted = False
206
+ self._server: Any = None
207
+
208
+ @classmethod
209
+ def from_platform(cls, **kwargs: Any) -> "AgentEngineA2ABootstrap":
210
+ """Explicit product factory; dependencies are injected by the platform layer."""
211
+
212
+ return cls(**kwargs)
213
+
214
+ @property
215
+ def event_dispatcher(self) -> A2ATaskEventDispatcher:
216
+ if self._dispatcher is None:
217
+ raise RuntimeError("A2A outbound client is disabled for this Runtime")
218
+ return self._dispatcher
219
+
220
+ @property
221
+ def server(self) -> Any:
222
+ return self._server
223
+
224
+ def client_for_space(self, space_id: str):
225
+ """Create a Space-scoped client sharing Runtime identity, clients, and outbox."""
226
+
227
+ from ksadk.a2a.space_client import A2ASpaceClient
228
+
229
+ if not self.outbound_enabled:
230
+ raise RuntimeError("A2A outbound client is disabled for this Runtime")
231
+ return A2ASpaceClient(
232
+ space_id,
233
+ _require(self._control_plane, "control_plane"),
234
+ egress_enabled=self.public_egress_enabled,
235
+ httpx_client=_require(self._hosted_http_client, "hosted_http_client"),
236
+ external_transport=self._external_transport,
237
+ event_dispatcher=self.event_dispatcher,
238
+ )
239
+
240
+ def mount(
241
+ self,
242
+ app: FastAPI,
243
+ *,
244
+ runner: Any,
245
+ runtime_adapter: RuntimeAdapter,
246
+ runtime_type: str,
247
+ ) -> Any | None:
248
+ """Mount exactly one managed inbound A2A server into an app."""
249
+
250
+ if self._mounted:
251
+ raise RuntimeError("AgentEngineA2ABootstrap may only be mounted once")
252
+ self._mounted = True
253
+ app.state.a2a_bootstrap = self
254
+ if not self.inbound_enabled:
255
+ return None
256
+ app.add_middleware(
257
+ A2AGatewayIdentityMiddleware,
258
+ verifier=_require(self._gateway_identity_verifier, "gateway_identity_verifier"),
259
+ probe_verifier=_require(self._gateway_probe_verifier, "gateway_probe_verifier"),
260
+ target_binding=self._target_binding,
261
+ )
262
+ config = A2AConfig(
263
+ enabled=True,
264
+ base_url=self.runtime_metadata.internal_base_url,
265
+ agent_name=self.runtime_metadata.name,
266
+ description=self.runtime_metadata.description,
267
+ version=self.runtime_metadata.version,
268
+ skills=self.runtime_metadata.skills,
269
+ create_table=False,
270
+ )
271
+ task_adapter = A2ARuntimeTaskAdapter(
272
+ runtime_adapter,
273
+ runtime_type=runtime_type,
274
+ context_store=_require(self._context_store, "context_store"),
275
+ resume_state_store=_require(self._resume_state_store, "resume_state_store"),
276
+ )
277
+ self._server = add_a2a_protocol_routes(
278
+ app,
279
+ runner,
280
+ config,
281
+ task_adapter=task_adapter,
282
+ task_store=_require(self._task_store, "task_store"),
283
+ context_builder=A2AOwnerContextBuilder(
284
+ identity_resolver=A2ATrustedIdentityResolver(
285
+ target_binding=self._target_binding,
286
+ ),
287
+ allow_unverified_identity=False,
288
+ ),
289
+ )
290
+ return self._server
291
+
292
+ async def start(self) -> None:
293
+ if self.inbound_enabled:
294
+ await _initialize_required(_require(self._task_store, "task_store"), "task_store")
295
+ await _initialize_required(
296
+ _require(self._context_store, "context_store"), "context_store"
297
+ )
298
+ await _initialize_required(
299
+ _require(self._checkpoint_store, "checkpoint_store"), "checkpoint_store"
300
+ )
301
+ await _initialize_required(
302
+ _require(self._resume_state_store, "resume_state_store"),
303
+ "resume_state_store",
304
+ )
305
+ if self._dispatcher is not None:
306
+ await self._dispatcher.start()
307
+
308
+ async def stop(self, *, flush_timeout_seconds: float = 5.0) -> None:
309
+ if self._dispatcher is not None:
310
+ await self._dispatcher.stop(flush_timeout_seconds=flush_timeout_seconds)
311
+
312
+
313
+ def _require_initializable(value: Any, name: str) -> None:
314
+ initialize = getattr(value, "initialize", None)
315
+ if not callable(initialize):
316
+ raise TypeError(f"{name} must implement async initialize()")
317
+
318
+
319
+ async def _initialize_required(value: Any, name: str) -> None:
320
+ _require_initializable(value, name)
321
+ initialize = value.initialize
322
+ result = initialize()
323
+ if not inspect.isawaitable(result):
324
+ raise TypeError(f"{name}.initialize() must return an awaitable")
325
+ await result
326
+
327
+
328
+ def _require(value: Any, name: str) -> Any:
329
+ if value is None:
330
+ raise RuntimeError(f"AgentEngineA2ABootstrap is missing {name}")
331
+ return value
332
+
333
+
334
+ __all__ = ["A2ACheckpointStore", "AgentEngineA2ABootstrap", "RuntimeA2AMetadata"]
ksadk/a2a/card.py ADDED
@@ -0,0 +1,120 @@
1
+ """A2A AgentCard 构造 (goal-05,wire 1.0)。
2
+
3
+ 契约(`a2a-center-productization-2026-07.md` §2.1):
4
+ - AgentCard 使用 ``supportedInterfaces[]``,每项 ``url`` / ``protocolBinding`` /
5
+ ``protocolVersion: "1.0"``;**不用顶层 ``url``,不提供 0.3 fallback,不挂
6
+ ``/.well-known/agent.json`` 旧路径**。
7
+ - 我方托管 Agent 7 月优先暴露 ``JSONRPC``,同时挂 SDK 已提供的 ``HTTP+JSON`` 路由。
8
+ - a2a-sdk 1.1.0 的 wire 对象是 protobuf(``a2a_pb2``),非 pydantic。
9
+ """
10
+
11
+ from __future__ import annotations
12
+
13
+ from collections.abc import Sequence
14
+
15
+ from a2a.types import (
16
+ AgentCapabilities,
17
+ AgentCard,
18
+ AgentInterface,
19
+ AgentSkill,
20
+ )
21
+
22
+ #: wire 协议版本(契约 §2.1 固定 1.0)。
23
+ A2A_PROTOCOL_VERSION = "1.0"
24
+ #: 托管 Agent 的 A2A 路由路径(契约 §3.3:/a2a/jsonrpc 与 /a2a/v1/*)。
25
+ JSONRPC_PATH = "/a2a/jsonrpc"
26
+ REST_PATH_PREFIX = "/a2a/v1"
27
+
28
+ _DEFAULT_IO_MODES = ["text/plain"]
29
+
30
+
31
+ def build_agent_card(
32
+ *,
33
+ name: str,
34
+ base_url: str,
35
+ description: str = "",
36
+ version: str = "1.0.0",
37
+ skills: Sequence[str | AgentSkill] | None = None,
38
+ streaming: bool = True,
39
+ provider: dict[str, str] | None = None,
40
+ ) -> AgentCard:
41
+ """构造符合 wire 1.0 的 AgentCard(supportedInterfaces)。
42
+
43
+ 参数:
44
+ name: Agent 名称。
45
+ base_url: 该 Agent 对外宣告的基础地址(各 interface url 由此拼出)。
46
+ description: 描述。
47
+ version: 业务版本。
48
+ skills: 标准 ``AgentSkill`` 列表,或本地配置使用的技能 id 列表(空则给 general)。
49
+ streaming: 是否声明 streaming 能力。
50
+ provider: 可选 provider 信息(如 {"organization": ..., "url": ...})。
51
+ """
52
+ base = base_url.rstrip("/")
53
+ supported_interfaces = [
54
+ AgentInterface(
55
+ url=f"{base}{JSONRPC_PATH}",
56
+ protocol_binding="JSONRPC",
57
+ protocol_version=A2A_PROTOCOL_VERSION,
58
+ ),
59
+ AgentInterface(
60
+ url=f"{base}{REST_PATH_PREFIX}",
61
+ protocol_binding="HTTP+JSON",
62
+ protocol_version=A2A_PROTOCOL_VERSION,
63
+ ),
64
+ ]
65
+
66
+ card_kwargs: dict = {
67
+ "name": name,
68
+ "description": description or f"{name} agent powered by ksadk",
69
+ "version": version,
70
+ "supported_interfaces": supported_interfaces,
71
+ "capabilities": AgentCapabilities(streaming=streaming, push_notifications=False),
72
+ "default_input_modes": list(_DEFAULT_IO_MODES),
73
+ "default_output_modes": list(_DEFAULT_IO_MODES),
74
+ "skills": _build_skills(skills),
75
+ }
76
+ if provider:
77
+ from a2a.types import AgentProvider
78
+
79
+ card_kwargs["provider"] = AgentProvider(
80
+ organization=provider.get("organization", ""),
81
+ url=provider.get("url", ""),
82
+ )
83
+ return AgentCard(**card_kwargs)
84
+
85
+
86
+ def _build_skills(skills: Sequence[str | AgentSkill] | None) -> list[AgentSkill]:
87
+ if not skills:
88
+ return [
89
+ AgentSkill(
90
+ id="general",
91
+ name="General",
92
+ description="General purpose agent powered by ksadk",
93
+ tags=["general"],
94
+ )
95
+ ]
96
+ result: list[AgentSkill] = []
97
+ for skill in skills:
98
+ if isinstance(skill, AgentSkill):
99
+ result.append(skill)
100
+ continue
101
+ if not isinstance(skill, str) or not skill.strip():
102
+ raise TypeError("AgentCard skills must be non-empty strings or AgentSkill objects")
103
+ skill_id = skill.strip()
104
+ result.append(
105
+ AgentSkill(
106
+ id=skill_id,
107
+ name=skill_id.replace("_", " ").title(),
108
+ description=f"Skill: {skill_id}",
109
+ tags=[skill_id],
110
+ )
111
+ )
112
+ return result
113
+
114
+
115
+ __all__ = [
116
+ "A2A_PROTOCOL_VERSION",
117
+ "JSONRPC_PATH",
118
+ "REST_PATH_PREFIX",
119
+ "build_agent_card",
120
+ ]