agentengine-sdk-python 0.8.0__py3-none-any.whl → 0.8.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 (494) hide show
  1. {agentengine_sdk_python-0.8.0.dist-info → agentengine_sdk_python-0.8.2.dist-info}/METADATA +43 -7
  2. agentengine_sdk_python-0.8.2.dist-info/RECORD +778 -0
  3. {agentengine_sdk_python-0.8.0.dist-info → agentengine_sdk_python-0.8.2.dist-info}/WHEEL +1 -1
  4. ksadk/a2a/__init__.py +2 -0
  5. ksadk/a2a/_space_client_events.py +381 -0
  6. ksadk/a2a/bootstrap.py +0 -2
  7. ksadk/a2a/card.py +6 -111
  8. ksadk/a2a/control_plane.py +239 -1
  9. ksadk/a2a/event_adapter.py +156 -64
  10. ksadk/a2a/executor.py +195 -172
  11. ksadk/a2a/routes.py +12 -5
  12. ksadk/a2a/server.py +1 -8
  13. ksadk/a2a/service_env.py +33 -0
  14. ksadk/a2a/space_client.py +43 -349
  15. ksadk/a2a_card.py +101 -0
  16. ksadk/a2ui/core.py +222 -53
  17. ksadk/agui/_agent_helpers.py +243 -0
  18. ksadk/agui/a2ui_projection.py +12 -5
  19. ksadk/agui/agent.py +474 -275
  20. ksadk/agui/config.py +11 -5
  21. ksadk/agui/routes.py +7 -15
  22. ksadk/api/client.py +530 -40
  23. ksadk/api/environment.py +27 -0
  24. ksadk/builders/code_builder.py +352 -53
  25. ksadk/builders/container_builder.py +71 -44
  26. ksadk/builders/framework_requirements.py +2 -1
  27. ksadk/builders/ks3_uploader.py +2 -2
  28. ksadk/builders/managed_runtime_builder.py +60 -28
  29. ksadk/cli/__init__.py +25 -0
  30. ksadk/cli/cmd_a2a.py +18 -31
  31. ksadk/cli/cmd_create.py +13 -26
  32. ksadk/cli/cmd_dashboard.py +15 -1
  33. ksadk/cli/cmd_deploy.py +28 -3
  34. ksadk/cli/cmd_eval.py +443 -0
  35. ksadk/cli/cmd_evalset.py +284 -0
  36. ksadk/cli/cmd_files.py +5 -1
  37. ksadk/cli/cmd_hermes.py +137 -163
  38. ksadk/cli/cmd_invoke.py +28 -38
  39. ksadk/cli/cmd_launch.py +12 -0
  40. ksadk/cli/cmd_managed_runtime.py +95 -0
  41. ksadk/cli/cmd_observe.py +85 -0
  42. ksadk/cli/cmd_openclaw.py +85 -479
  43. ksadk/cli/cmd_replay.py +28 -4
  44. ksadk/cli/cmd_run.py +29 -67
  45. ksadk/cli/cmd_studio.py +201 -0
  46. ksadk/cli/cmd_web.py +15 -6
  47. ksadk/cli/dry_run.py +2 -1
  48. ksadk/cli/env_options.py +83 -0
  49. ksadk/cli/global_options.py +3 -1
  50. ksadk/cli/hermes_env.py +151 -0
  51. ksadk/cli/invoke_payload.py +49 -0
  52. ksadk/cli/network_options.py +7 -5
  53. ksadk/cli/openclaw_env.py +458 -0
  54. ksadk/cli/runtime_bootstrap.py +51 -0
  55. ksadk/cli/ui.py +6 -0
  56. ksadk/cli/workflow_common.py +5 -5
  57. ksadk/codex/__init__.py +3 -3
  58. ksadk/codex/client.py +833 -49
  59. ksadk/codex/phase.py +1 -1
  60. ksadk/codex/runtime.py +720 -127
  61. ksadk/common/kop_client.py +232 -0
  62. ksadk/configs/__init__.py +1 -3
  63. ksadk/configs/env_registry.py +244 -45
  64. ksadk/configs/env_registry_pcm.py +181 -0
  65. ksadk/configs/env_var_spec.py +18 -0
  66. ksadk/configs/global_config.py +6 -1
  67. ksadk/configs/settings.py +5 -108
  68. ksadk/context_engine/__init__.py +98 -0
  69. ksadk/context_engine/assembler.py +176 -0
  70. ksadk/context_engine/baseline.py +419 -0
  71. ksadk/context_engine/cache_observability.py +228 -0
  72. ksadk/context_engine/capabilities.py +443 -0
  73. ksadk/context_engine/contributors.py +344 -0
  74. ksadk/context_engine/hosted_pipeline.py +417 -0
  75. ksadk/context_engine/models.py +117 -0
  76. ksadk/context_engine/planner.py +698 -0
  77. ksadk/context_engine/policies.py +319 -0
  78. ksadk/context_engine/projection.py +31 -0
  79. ksadk/context_engine/shadow_plan.py +266 -0
  80. ksadk/context_engine/tokenizer.py +164 -0
  81. ksadk/conversations/__init__.py +85 -94
  82. ksadk/conversations/context.py +126 -6
  83. ksadk/conversations/message_projection.py +292 -28
  84. ksadk/conversations/model_context.py +49 -3
  85. ksadk/conversations/runtime_compaction.py +207 -5
  86. ksadk/conversations/runtime_input.py +193 -3
  87. ksadk/conversations/runtime_invocation.py +81 -3
  88. ksadk/conversations/runtime_observability.py +157 -4
  89. ksadk/conversations/runtime_payloads.py +42 -0
  90. ksadk/conversations/runtime_preparation.py +280 -2
  91. ksadk/conversations/runtime_resume.py +71 -32
  92. ksadk/conversations/runtime_stream_events.py +94 -9
  93. ksadk/conversations/runtime_streaming.py +175 -22
  94. ksadk/conversations/semantic_summary.py +311 -1
  95. ksadk/conversations/session_lock.py +51 -0
  96. ksadk/deployment/env_forward.py +72 -0
  97. ksadk/deployment/managed_runtime.py +38 -0
  98. ksadk/deployment/manager.py +24 -8
  99. ksadk/deployment/providers/serverless.py +228 -92
  100. ksadk/evaluation/__init__.py +116 -0
  101. ksadk/evaluation/a2a_adapter.py +452 -0
  102. ksadk/evaluation/adapters.py +67 -0
  103. ksadk/evaluation/agent_eval_client.py +395 -0
  104. ksadk/evaluation/cloud_binding.py +80 -0
  105. ksadk/evaluation/cloud_converter.py +194 -0
  106. ksadk/evaluation/cloud_service.py +199 -0
  107. ksadk/evaluation/contracts.py +478 -0
  108. ksadk/evaluation/evalset.py +351 -0
  109. ksadk/evaluation/evaluators.py +627 -0
  110. ksadk/evaluation/evidence.py +258 -0
  111. ksadk/evaluation/executor.py +143 -0
  112. ksadk/evaluation/local_adapter.py +550 -0
  113. ksadk/evaluation/service_env.py +27 -0
  114. ksadk/evaluation/storage.py +68 -0
  115. ksadk/evaluation/studio_build_adapter.py +253 -0
  116. ksadk/evaluation/target.py +82 -0
  117. ksadk/events/__init__.py +13 -13
  118. ksadk/events/_v1_compat/__init__.py +1 -0
  119. ksadk/events/_v1_compat/models.py +299 -0
  120. ksadk/events/_v1_compat/parser.py +247 -0
  121. ksadk/events/_v1_compat/projection.py +753 -0
  122. ksadk/events/adapters/__init__.py +34 -0
  123. ksadk/events/adapters/_a2a_snapshot.py +622 -0
  124. ksadk/events/adapters/_a2a_support.py +275 -0
  125. ksadk/events/adapters/_codex_interactions.py +375 -0
  126. ksadk/events/adapters/_codex_items.py +801 -0
  127. ksadk/events/adapters/_codex_validators.py +311 -0
  128. ksadk/events/adapters/_langgraph_support.py +785 -0
  129. ksadk/events/adapters/a2a.py +841 -0
  130. ksadk/events/adapters/adk.py +503 -0
  131. ksadk/events/adapters/codex.py +717 -0
  132. ksadk/events/adapters/langgraph.py +745 -0
  133. ksadk/events/canonical.py +440 -0
  134. ksadk/events/canonical_replay.py +497 -0
  135. ksadk/events/canonical_store.py +468 -0
  136. ksadk/events/cold_recovery.py +257 -0
  137. ksadk/events/content.py +89 -0
  138. ksadk/events/identity.py +86 -0
  139. ksadk/events/pipeline.py +455 -0
  140. ksadk/events/projections.py +66 -0
  141. ksadk/events/reducer.py +661 -0
  142. ksadk/events/replay.py +3 -36
  143. ksadk/events/runtime_event.py +20 -256
  144. ksadk/events/session_event.py +324 -0
  145. ksadk/events/store.py +3 -316
  146. ksadk/events/v1_compat.py +41 -0
  147. ksadk/harness/__init__.py +3 -2
  148. ksadk/harness/app.py +114 -123
  149. ksadk/harness/config.py +1 -1
  150. ksadk/harness/runtime.py +467 -0
  151. ksadk/hermes_terminal.py +5 -0
  152. ksadk/identity/resolver.py +4 -3
  153. ksadk/interaction/__init__.py +28 -0
  154. ksadk/interaction/contracts.py +136 -0
  155. ksadk/interaction/ledger.py +189 -0
  156. ksadk/interaction/provider.py +122 -0
  157. ksadk/interaction/providers/__init__.py +52 -0
  158. ksadk/interaction/providers/adk.py +40 -0
  159. ksadk/interaction/providers/codex.py +94 -0
  160. ksadk/interaction/providers/langgraph.py +58 -0
  161. ksadk/kernel/__init__.py +117 -0
  162. ksadk/kernel/authorization.py +258 -0
  163. ksadk/kernel/bootstrap.py +1074 -0
  164. ksadk/kernel/contract_fingerprints.py +61 -0
  165. ksadk/kernel/contracts.py +362 -0
  166. ksadk/kernel/control.py +219 -0
  167. ksadk/kernel/errors.py +79 -0
  168. ksadk/kernel/ingress.py +1102 -0
  169. ksadk/kernel/mapping.py +111 -0
  170. ksadk/kernel/memory_store.py +1133 -0
  171. ksadk/kernel/postgres_store.py +1756 -0
  172. ksadk/kernel/recovery.py +452 -0
  173. ksadk/kernel/runtime_identity.py +103 -0
  174. ksadk/kernel/sql/001_agent_kernel.sql +120 -0
  175. ksadk/kernel/sqlite_store.py +1410 -0
  176. ksadk/kernel/state.py +145 -0
  177. ksadk/kernel/store.py +232 -0
  178. ksadk/kernel/worker.py +953 -0
  179. ksadk/knowledge_base/client.py +22 -4
  180. ksadk/knowledge_base/service.py +32 -5
  181. ksadk/managed_a2a_card.py +160 -0
  182. ksadk/managed_runtime.py +16 -9
  183. ksadk/memory/__init__.py +61 -0
  184. ksadk/memory/adk/backends/base_ltm_backend.py +96 -1
  185. ksadk/memory/adk/backends/http_ltm_backend.py +14 -5
  186. ksadk/memory/adk/backends/inmemory_ltm_backend.py +136 -3
  187. ksadk/memory/adk/backends/sdk_ltm_backend.py +394 -5
  188. ksadk/memory/adk/backends/sqlite_ltm_backend.py +95 -0
  189. ksadk/memory/adk/long_term_memory.py +3 -2
  190. ksadk/memory/coordinator.py +461 -0
  191. ksadk/memory/events.py +202 -0
  192. ksadk/memory/extraction.py +228 -0
  193. ksadk/memory/ltm_backend_factory.py +16 -3
  194. ksadk/memory/models.py +316 -0
  195. ksadk/memory/policy.py +215 -0
  196. ksadk/memory/provider.py +47 -0
  197. ksadk/memory/provider_adapter.py +159 -0
  198. ksadk/memory/provider_resolver.py +71 -0
  199. ksadk/memory/providers/__init__.py +5 -0
  200. ksadk/memory/providers/local_sqlite.py +490 -0
  201. ksadk/memory/resolved_policy.py +145 -0
  202. ksadk/memory/service.py +198 -8
  203. ksadk/memory/tool.py +4 -0
  204. ksadk/model_proxy/bootstrap.py +16 -9
  205. ksadk/model_proxy/config.py +22 -1
  206. ksadk/model_proxy/detect.py +202 -9
  207. ksadk/model_proxy/namespace.py +67 -15
  208. ksadk/model_proxy/server.py +168 -6
  209. ksadk/model_proxy/transform.py +105 -3
  210. ksadk/observability/__init__.py +25 -0
  211. ksadk/observability/session_log.py +420 -0
  212. ksadk/observability/trajectory.py +105 -0
  213. ksadk/prompts/__init__.py +71 -0
  214. ksadk/prompts/compiler.py +215 -0
  215. ksadk/prompts/models.py +82 -0
  216. ksadk/prompts/projection.py +89 -0
  217. ksadk/prompts/resolved.py +137 -0
  218. ksadk/prompts/sources.py +233 -0
  219. ksadk/runners/_langgraph_runner_streams.py +822 -0
  220. ksadk/runners/adk_runner.py +14 -31
  221. ksadk/runners/base_runner.py +44 -3
  222. ksadk/runners/factory.py +3 -3
  223. ksadk/runners/langgraph_runner.py +252 -433
  224. ksadk/runners/utils/__init__.py +0 -10
  225. ksadk/runners/utils/loader.py +16 -0
  226. ksadk/runtime/__init__.py +67 -41
  227. ksadk/runtime/_runner_adapter/__init__.py +1 -0
  228. ksadk/runtime/_runner_adapter/stream_mapping.py +788 -0
  229. ksadk/runtime/adapter.py +199 -16
  230. ksadk/runtime/conversation_execution.py +687 -0
  231. ksadk/runtime/executor.py +392 -0
  232. ksadk/runtime/factory.py +342 -0
  233. ksadk/runtime/framework_adapters.py +6 -12
  234. ksadk/runtime/hosted_finalizer.py +268 -0
  235. ksadk/runtime/launch.py +61 -0
  236. ksadk/runtime/preprocessing.py +49 -14
  237. ksadk/runtime/runner_adapter.py +330 -391
  238. ksadk/runtime/runner_loading.py +36 -0
  239. ksadk/runtime/usage.py +33 -0
  240. ksadk/sandbox/backends/e2b.py +36 -3
  241. ksadk/server/__init__.py +39 -4
  242. ksadk/server/app.py +18 -492
  243. ksadk/server/composition.py +36 -2
  244. ksadk/server/factory.py +210 -149
  245. ksadk/server/routes/common.py +15 -46
  246. ksadk/server/routes/control.py +13 -9
  247. ksadk/server/routes/kernel_ingress.py +258 -0
  248. ksadk/server/routes/misc.py +10 -33
  249. ksadk/server/routes/models.py +14 -6
  250. ksadk/server/routes/openai_compat.py +129 -27
  251. ksadk/server/routes/projection.py +84 -16
  252. ksadk/server/routes/run.py +347 -460
  253. ksadk/server/routes/sessions.py +37 -40
  254. ksadk/server/routes/streaming.py +52 -7
  255. ksadk/server/routes/workspace.py +54 -21
  256. ksadk/server/static/assets/{ArtifactsPanel-Cjnqt-8W.js → ArtifactsPanel-DSU1sWD_.js} +1 -1
  257. ksadk/server/static/assets/{CodeBlock-BqyqZfuB.js → CodeBlock-DOH6MVcn.js} +4 -4
  258. ksadk/server/static/assets/{MathMessageMarkdown-BpH7jiFM.js → MathMessageMarkdown-BL8my1R2.js} +4 -4
  259. ksadk/server/static/assets/MathMessageMarkdown-BorAY7qD.css +1 -0
  260. ksadk/server/static/assets/MermaidBlock-Dz4IP-Tx.js +312 -0
  261. ksadk/server/static/assets/NativeTerminalPanel-DUrK0JpZ.js +1 -0
  262. ksadk/server/static/assets/abnfDiagram-VCTEODGH-g20pFzNV.js +1 -0
  263. ksadk/server/static/assets/arc-C4FzinUA.js +1 -0
  264. ksadk/server/static/assets/architecture-7GRP2DOG-DjKratdf.js +1 -0
  265. ksadk/server/static/assets/architectureDiagram-5GKGNRK7-DpIqL5h4.js +36 -0
  266. ksadk/server/static/assets/blockDiagram-NRAW4CY4-BjkljTNz.js +129 -0
  267. ksadk/server/static/assets/c4Diagram-UCG6FXSJ-Dk_ieq2X.js +38 -0
  268. ksadk/server/static/assets/channel-4cQHKtx1.js +1 -0
  269. ksadk/server/static/assets/chunk-2Q5K7J3B-DmgWkESh.js +1 -0
  270. ksadk/server/static/assets/{chunk-FMBD7UC4-BGhvzDYt.js → chunk-5VM5RSS4-BVHAchFb.js} +1 -1
  271. ksadk/server/static/assets/{chunk-ND2GUHAM-D98vPd-E.js → chunk-F27PBJKO-C-ipQzuS.js} +1 -1
  272. ksadk/server/static/assets/chunk-G27WJ6UU-C2EyJbIK.js +231 -0
  273. ksadk/server/static/assets/{chunk-4BX2VUAB-CsWIQRhc.js → chunk-JWPE2WC7-vYvVJb_M.js} +1 -1
  274. ksadk/server/static/assets/chunk-LCL6LL3I-BcI6ysPT.js +206 -0
  275. ksadk/server/static/assets/chunk-POPQ4Y6H-C030x_Z1.js +1 -0
  276. ksadk/server/static/assets/chunk-RHFEMEQ7-yyGpsz4n.js +168 -0
  277. ksadk/server/static/assets/chunk-SVP7TREG-BLTlmMU7.js +88 -0
  278. ksadk/server/static/assets/chunk-XXDRQBXY-C_32ArgP.js +1 -0
  279. ksadk/server/static/assets/classDiagram-DTDB5LWJ-DLFd9Xi0.js +1 -0
  280. ksadk/server/static/assets/classDiagram-v2-JRS7N3AN-DLFd9Xi0.js +1 -0
  281. ksadk/server/static/assets/{cose-bilkent-S5V4N54A-CX3yotHq.js → cose-bilkent-JH36ORCC-9YQYwdl0.js} +1 -1
  282. ksadk/server/static/assets/cynefin-OW5HDTMX-DjEM48Qp.js +1 -0
  283. ksadk/server/static/assets/cynefinDiagram-5FMLGOSQ-ErLF5N13.js +62 -0
  284. ksadk/server/static/assets/cytoscape.esm-CyCl8rPi.js +321 -0
  285. ksadk/server/static/assets/dagre-3AP2YEHR-DFiQF-6f.js +4 -0
  286. ksadk/server/static/assets/dagre-BuhGnRI1.js +1 -0
  287. ksadk/server/static/assets/diagram-S7CK7UJ4-Bt1v8-GC.js +30 -0
  288. ksadk/server/static/assets/diagram-UQ7AKVKN-DSCxJdBK.js +41 -0
  289. ksadk/server/static/assets/diagram-VSXAHHWV-DHfYwp_9.js +3 -0
  290. ksadk/server/static/assets/diagram-VX7I27RA-DdzD-4Le.js +24 -0
  291. ksadk/server/static/assets/diagram-Z3DM3KII-Du-nAJ9F.js +24 -0
  292. ksadk/server/static/assets/{dist-D82mtD2s.js → dist-8hqcx0sU.js} +1 -1
  293. ksadk/server/static/assets/dist-B7seoj3d.js +1 -0
  294. ksadk/server/static/assets/{dist-DHn6nBzr.js → dist-BE7bu-DL.js} +1 -1
  295. ksadk/server/static/assets/{dist-eoW6tZXA.js → dist-BVDffZ0U.js} +1 -1
  296. ksadk/server/static/assets/{dist-C2xjE7cO.js → dist-BX8z72IC.js} +1 -1
  297. ksadk/server/static/assets/{dist-CgF3fj15.js → dist-Bf2M8m3N.js} +1 -1
  298. ksadk/server/static/assets/{dist-Bs-jQcRX.js → dist-BjU6y-A2.js} +1 -1
  299. ksadk/server/static/assets/{dist-Djgl2wVZ.js → dist-BytlxIDT.js} +1 -1
  300. ksadk/server/static/assets/{dist-CVQRZjPu.js → dist-CSh_DE14.js} +1 -1
  301. ksadk/server/static/assets/{dist-6CVKuTAe.js → dist-CXYYBw3_.js} +1 -1
  302. ksadk/server/static/assets/{dist-DlzCRy0S.js → dist-C_wsv-Qd.js} +1 -1
  303. ksadk/server/static/assets/{dist-DF06ORQo.js → dist-ClxGviKw.js} +1 -1
  304. ksadk/server/static/assets/{dist-Cf23NY4L.js → dist-CttYUqzS.js} +1 -1
  305. ksadk/server/static/assets/{dist-ivOya1LD.js → dist-DNp6rLRA.js} +1 -1
  306. ksadk/server/static/assets/{dist-BibcG1V9.js → dist-DUX-id_F.js} +1 -1
  307. ksadk/server/static/assets/{dist-BUHRxvDG.js → dist-DmldrHd_.js} +1 -1
  308. ksadk/server/static/assets/{dist-BZ9n9AjO.js → dist-DnfXs8Vn.js} +2 -2
  309. ksadk/server/static/assets/{dist-DqNnNFrw.js → dist-Dq9gLD7L.js} +1 -1
  310. ksadk/server/static/assets/{dist-CGcp2ex8.js → dist-W-TIVntx.js} +1 -1
  311. ksadk/server/static/assets/{dist-Cwt7koer.js → dist-dDdADKFA.js} +1 -1
  312. ksadk/server/static/assets/{dist-C7-3jInC.js → dist-dydu68Fl.js} +1 -1
  313. ksadk/server/static/assets/{dist-C99THtIA.js → dist-ngtN0DJB.js} +1 -1
  314. ksadk/server/static/assets/ebnfDiagram-PWID7BFC-Da9C9NO1.js +1 -0
  315. ksadk/server/static/assets/erDiagram-SSCWMZ5O-EAGqqR79.js +99 -0
  316. ksadk/server/static/assets/eventmodeling-NTZA5JFV-CMgMaJrC.js +1 -0
  317. ksadk/server/static/assets/flowDiagram-A5DVABFB-BBKL0x3P.js +1 -0
  318. ksadk/server/static/assets/ganttDiagram-EL5Y4UJY-DqJsKb59.js +292 -0
  319. ksadk/server/static/assets/gitGraph-4MIJSDKK-Dw63mrhw.js +1 -0
  320. ksadk/server/static/assets/gitGraphDiagram-WWUBYQGX-B6g4dtDi.js +106 -0
  321. ksadk/server/static/assets/index-8ipRcQ-M.js +240 -0
  322. ksadk/server/static/assets/index-ByFCqjlh.css +2 -0
  323. ksadk/server/static/assets/info-A6RAGUB7-B6iAblII.js +1 -0
  324. ksadk/server/static/assets/infoDiagram-RXCK75RN-Djm_nbd5.js +2 -0
  325. ksadk/server/static/assets/{ishikawaDiagram-YF4QCWOH-DLOHGvWw.js → ishikawaDiagram-5VMMS53U-DWya9SG2.js} +6 -6
  326. ksadk/server/static/assets/{journeyDiagram-JHISSGLW-BIzKeejT.js → journeyDiagram-EYS64GPL-DutxhSNI.js} +6 -6
  327. ksadk/server/static/assets/{kanban-definition-UN3LZRKU-BWHoFSw2.js → kanban-definition-3QL26DDD-DJdOF8Fm.js} +10 -10
  328. ksadk/server/static/assets/katex-vFWytM5c.js +257 -0
  329. ksadk/server/static/assets/{linear-CvMBw9cA.js → linear-BHjG8b-J.js} +1 -1
  330. ksadk/server/static/assets/mermaid-parser.core-KGSy4jWT.js +166 -0
  331. ksadk/server/static/assets/{mindmap-definition-RKZ34NQL-CSAQxEAe.js → mindmap-definition-FBJOCRG2-9-HC88D4.js} +29 -29
  332. ksadk/server/static/assets/packet-AYTQ26CC-BOYAipuq.js +1 -0
  333. ksadk/server/static/assets/pegDiagram-XKGWAZYB-DrEZd4fD.js +1 -0
  334. ksadk/server/static/assets/pie-WAS4IAKB-Ctq0Kbku.js +1 -0
  335. ksadk/server/static/assets/pieDiagram-E7YTZNPT-DpjqOFFp.js +39 -0
  336. ksadk/server/static/assets/{quadrantDiagram-W4KKPZXB-CxIR4JXI.js → quadrantDiagram-AXDQQJYC-BiNhgOXX.js} +6 -6
  337. ksadk/server/static/assets/radar-RG4KPBEZ-DN0-ul_0.js +1 -0
  338. ksadk/server/static/assets/railroad-74A4TZTK-C6cC_to0.js +1 -0
  339. ksadk/server/static/assets/railroad-abnf-HS5TGJTU-BimjIuRc.js +1 -0
  340. ksadk/server/static/assets/railroad-ebnf-LZEXJU2U-CvY65ABq.js +1 -0
  341. ksadk/server/static/assets/railroad-peg-WCYAUIDC-D72Iq_Tv.js +1 -0
  342. ksadk/server/static/assets/railroadDiagram-O6MQD6OU-_Y3Ojg6G.js +1 -0
  343. ksadk/server/static/assets/requirementDiagram-EFPCY7ZU-DeCFdg9K.js +84 -0
  344. ksadk/server/static/assets/{sankeyDiagram-5OEKKPKP-DpGa6EAV.js → sankeyDiagram-P5KCCOFB-CPH75rhw.js} +7 -7
  345. ksadk/server/static/assets/{sequenceDiagram-3UESZ5HK-NTKNGGe5.js → sequenceDiagram-WJ2MYXX4-OEpQQdr4.js} +10 -10
  346. ksadk/server/static/assets/sizeCapture-X5ZJPWSS-heUErzhI.js +1 -0
  347. ksadk/server/static/assets/stateDiagram-HBIQ2CUA-DvA3jSMB.js +1 -0
  348. ksadk/server/static/assets/stateDiagram-v2-4QOOHH4V-BgQY03nz.js +1 -0
  349. ksadk/server/static/assets/swimlanes-XN3QIQJK-CR-dfN_t.js +1 -0
  350. ksadk/server/static/assets/swimlanesDiagram-VK2B7HYN-DLVw3q5Q.js +8 -0
  351. ksadk/server/static/assets/{timeline-definition-PNZ67QCA-jqoYs3jQ.js → timeline-definition-24CTP7MA-DAVJf1TX.js} +7 -7
  352. ksadk/server/static/assets/treeView-Q6P3EWNA-BMpO0wsB.js +1 -0
  353. ksadk/server/static/assets/treemap-WGGIJYW6-Et0aqzU3.js +1 -0
  354. ksadk/server/static/assets/vennDiagram-4TSXK5OY-DwM8eDkh.js +34 -0
  355. ksadk/server/static/assets/wardley-WFR3VGLG-CbY0mhpl.js +1 -0
  356. ksadk/server/static/assets/wardleyDiagram-VM6X3IG4-DZL-Zz2t.js +78 -0
  357. ksadk/server/static/assets/xychartDiagram-S5SC5T6Z-Dy6Yh_hu.js +7 -0
  358. ksadk/server/static/index.html +2 -2
  359. ksadk/sessions/__init__.py +26 -9
  360. ksadk/sessions/_local_service_sync.py +688 -0
  361. ksadk/sessions/_local_tables.py +21 -0
  362. ksadk/sessions/_postgres_schema.py +305 -0
  363. ksadk/sessions/_postgres_tables.py +15 -0
  364. ksadk/sessions/base.py +80 -1
  365. ksadk/sessions/in_memory.py +53 -2
  366. ksadk/sessions/local_service.py +63 -604
  367. ksadk/sessions/postgres_service.py +58 -148
  368. ksadk/sessions/resilient.py +35 -1
  369. ksadk/skills/runtime/backends/e2b.py +1 -1
  370. ksadk/skills/service_client.py +13 -3
  371. ksadk/studio/__init__.py +5 -0
  372. ksadk/studio/agent_avatar_assets.py +120 -0
  373. ksadk/studio/agent_lifecycle.py +51 -0
  374. ksadk/studio/api.py +1598 -0
  375. ksadk/studio/api_catalog_routes.py +324 -0
  376. ksadk/studio/api_contracts.py +286 -0
  377. ksadk/studio/api_helpers.py +132 -0
  378. ksadk/studio/api_memory_routes.py +82 -0
  379. ksadk/studio/authoring.py +749 -0
  380. ksadk/studio/authoring_coordinator.py +1017 -0
  381. ksadk/studio/builder.py +397 -0
  382. ksadk/studio/capabilities.py +368 -0
  383. ksadk/studio/cloud.py +2099 -0
  384. ksadk/studio/codex_agent_service.py +694 -0
  385. ksadk/studio/codex_authoring.py +469 -0
  386. ksadk/studio/codex_builder.py +437 -0
  387. ksadk/studio/codex_manifest.py +307 -0
  388. ksadk/studio/codex_run.py +395 -0
  389. ksadk/studio/compiler.py +190 -0
  390. ksadk/studio/contracts.py +755 -0
  391. ksadk/studio/errors.py +47 -0
  392. ksadk/studio/event_store.py +214 -0
  393. ksadk/studio/framework_run.py +342 -0
  394. ksadk/studio/hosted_kernel.py +317 -0
  395. ksadk/studio/identifiers.py +33 -0
  396. ksadk/studio/manifest_resolver.py +131 -0
  397. ksadk/studio/mcp_runtime.py +229 -0
  398. ksadk/studio/model_client.py +629 -0
  399. ksadk/studio/model_profile_service.py +214 -0
  400. ksadk/studio/operations.py +275 -0
  401. ksadk/studio/otel_trace.py +1060 -0
  402. ksadk/studio/pagination.py +182 -0
  403. ksadk/studio/pcm_memory.py +85 -0
  404. ksadk/studio/python_tool_inspection.py +183 -0
  405. ksadk/studio/repository.py +327 -0
  406. ksadk/studio/resource_catalog.py +1260 -0
  407. ksadk/studio/run_service.py +1133 -0
  408. ksadk/studio/runtime_catalog.py +74 -0
  409. ksadk/studio/runtime_source.py +365 -0
  410. ksadk/studio/service.py +2249 -0
  411. ksadk/studio/shared_web.py +1004 -0
  412. ksadk/studio/skill_discovery.py +628 -0
  413. ksadk/studio/static/assets/PrismRenderer-IYN-ffww.js +3 -0
  414. ksadk/studio/static/assets/index-BLpcdrgW.css +1 -0
  415. ksadk/studio/static/assets/index-CYekR2Xv.js +260 -0
  416. ksadk/studio/static/assets/react-vendor-BNmTiJ-I.js +9 -0
  417. ksadk/studio/static/assets/rolldown-runtime-hePW80VL.js +1 -0
  418. ksadk/studio/static/index.html +15 -0
  419. ksadk/studio/templates.py +722 -0
  420. ksadk/studio/validator.py +265 -0
  421. ksadk/studio/workspace.py +135 -0
  422. ksadk/tools/gateway.py +9 -0
  423. ksadk/toolsets/__init__.py +27 -1
  424. ksadk/toolsets/a2a.py +426 -0
  425. ksadk/tracing/__init__.py +19 -21
  426. ksadk/tracing/setup.py +317 -403
  427. ksadk/tracing/span_utils.py +0 -44
  428. ksadk/version.py +1 -1
  429. ksadk_runtime_common/memory_backend/registry.py +56 -56
  430. ksadk_runtime_common/schemas/runtime_event_v1.json +37 -0
  431. ksadk_runtime_common/schemas/runtime_event_v2.json +271 -0
  432. ksadk_runtime_common/workspace_files/router.py +8 -2
  433. agentengine_sdk_python-0.8.0.dist-info/RECORD +0 -578
  434. ksadk/a2a/card_builder.py +0 -64
  435. ksadk/a2a/client.py +0 -309
  436. ksadk/events/parser.py +0 -191
  437. ksadk/harness/runner.py +0 -211
  438. ksadk/runners/codex_runner.py +0 -132
  439. ksadk/runners/utils/langfuse.py +0 -230
  440. ksadk/server/static/assets/MathMessageMarkdown-DeYh8QPr.css +0 -1
  441. ksadk/server/static/assets/MermaidBlock-DWuxETaJ.js +0 -303
  442. ksadk/server/static/assets/NativeTerminalPanel-MDTopWMO.js +0 -1
  443. ksadk/server/static/assets/arc-CFKwSk_B.js +0 -1
  444. ksadk/server/static/assets/architecture-7EHR7CIX-CynqOWjZ.js +0 -1
  445. ksadk/server/static/assets/architectureDiagram-3BPJPVTR-Dej8jX8c.js +0 -36
  446. ksadk/server/static/assets/blockDiagram-GPEHLZMM-1F64jqvy.js +0 -132
  447. ksadk/server/static/assets/c4Diagram-AAUBKEIU-9q7AUAKb.js +0 -10
  448. ksadk/server/static/assets/channel-iUGv2N24.js +0 -1
  449. ksadk/server/static/assets/chunk-2J33WTMH-6qgwJm7Q.js +0 -1
  450. ksadk/server/static/assets/chunk-55IACEB6-BK8paA20.js +0 -1
  451. ksadk/server/static/assets/chunk-727SXJPM-B-JEhy7h.js +0 -206
  452. ksadk/server/static/assets/chunk-AQP2D5EJ-DYBvMHAa.js +0 -231
  453. ksadk/server/static/assets/chunk-QZHKN3VN-YQIEXeF6.js +0 -1
  454. ksadk/server/static/assets/classDiagram-4FO5ZUOK-CDAUuoXK.js +0 -1
  455. ksadk/server/static/assets/classDiagram-v2-Q7XG4LA2-CDAUuoXK.js +0 -1
  456. ksadk/server/static/assets/cytoscape.esm-DelgaX4f.js +0 -321
  457. ksadk/server/static/assets/dagre-BM42HDAG-C7TguAWo.js +0 -4
  458. ksadk/server/static/assets/dagre-Bx709z4p.js +0 -1
  459. ksadk/server/static/assets/diagram-2AECGRRQ-Dd17_kws.js +0 -43
  460. ksadk/server/static/assets/diagram-5GNKFQAL-DVIClIil.js +0 -10
  461. ksadk/server/static/assets/diagram-KO2AKTUF-Df_3gYQa.js +0 -3
  462. ksadk/server/static/assets/diagram-LMA3HP47-BhLk6ZtA.js +0 -24
  463. ksadk/server/static/assets/diagram-OG6HWLK6-D4GNGvuu.js +0 -24
  464. ksadk/server/static/assets/dist-DyvYLMW9.js +0 -1
  465. ksadk/server/static/assets/erDiagram-TEJ5UH35-CnfRcY2M.js +0 -85
  466. ksadk/server/static/assets/eventmodeling-FCH6USID-ChYO-ijM.js +0 -1
  467. ksadk/server/static/assets/flowDiagram-I6XJVG4X-DGaJjGNJ.js +0 -162
  468. ksadk/server/static/assets/ganttDiagram-6RSMTGT7-DpCoB2g9.js +0 -292
  469. ksadk/server/static/assets/gitGraph-WXDBUCRP-BN_0Fk-j.js +0 -1
  470. ksadk/server/static/assets/gitGraphDiagram-PVQCEYII-9IKVFBVT.js +0 -106
  471. ksadk/server/static/assets/graphlib-B8gBHxth.js +0 -1
  472. ksadk/server/static/assets/index-QSwCHuB8.js +0 -177
  473. ksadk/server/static/assets/index-jOPmTOZH.css +0 -2
  474. ksadk/server/static/assets/info-J43DQDTF-Cp6o3vId.js +0 -1
  475. ksadk/server/static/assets/infoDiagram-5YYISTIA-CYIIsb8y.js +0 -2
  476. ksadk/server/static/assets/katex-DATssjp1.js +0 -265
  477. ksadk/server/static/assets/mermaid-parser.core-mGAcEwcq.js +0 -161
  478. ksadk/server/static/assets/packet-YPE3B663-wQzct3cT.js +0 -1
  479. ksadk/server/static/assets/pie-LRSECV5Y-BgTQiv-9.js +0 -1
  480. ksadk/server/static/assets/pieDiagram-4H26LBE5-By-ra07M.js +0 -30
  481. ksadk/server/static/assets/radar-GUYGQ44K-BIq5fXsn.js +0 -1
  482. ksadk/server/static/assets/requirementDiagram-4Y6WPE33-DpW90iu3.js +0 -84
  483. ksadk/server/static/assets/stateDiagram-AJRCARHV-DGpd9yFG.js +0 -1
  484. ksadk/server/static/assets/stateDiagram-v2-BHNVJYJU-B3o579IQ.js +0 -1
  485. ksadk/server/static/assets/treeView-BLDUP644-Dqi-E0EM.js +0 -1
  486. ksadk/server/static/assets/treemap-LRROVOQU-ClQP9CJ9.js +0 -1
  487. ksadk/server/static/assets/vennDiagram-CIIHVFJN-l3Z7-wbP.js +0 -34
  488. ksadk/server/static/assets/wardley-L42UT6IY-8XLvnNIs.js +0 -1
  489. ksadk/server/static/assets/wardleyDiagram-YWT4CUSO-BR54GPmr.js +0 -78
  490. ksadk/server/static/assets/xychartDiagram-2RQKCTM6-SkiH8GsK.js +0 -7
  491. ksadk/tracing/exporters/langfuse_exporter.py +0 -460
  492. {agentengine_sdk_python-0.8.0.dist-info → agentengine_sdk_python-0.8.2.dist-info}/entry_points.txt +0 -0
  493. {agentengine_sdk_python-0.8.0.dist-info → agentengine_sdk_python-0.8.2.dist-info}/licenses/LICENSE +0 -0
  494. {agentengine_sdk_python-0.8.0.dist-info → agentengine_sdk_python-0.8.2.dist-info}/top_level.txt +0 -0
ksadk/a2a/executor.py CHANGED
@@ -1,4 +1,4 @@
1
- """A2ARuntimeExecutor — 把 ksadk runner 桥接进 A2A 请求生命周期 (goal-05)。
1
+ """A2ARuntimeExecutor — 把 RuntimeAdapter 桥接进 A2A 请求生命周期。
2
2
 
3
3
  契约 §7.2:A2A ``context_id`` ↔ Runtime ``session_id``;``canceled`` ↔
4
4
  ``RuntimeAdapter.cancel(invocation_id)``。executor 不在此自造 cancel,而是委托
@@ -23,7 +23,18 @@ from a2a.types import Part, Task, TaskState, TaskStatus
23
23
  from a2a.utils.errors import TaskNotCancelableError
24
24
 
25
25
  from ksadk.a2a.resume_store import A2AResumePayloadKind
26
- from ksadk.events import EventType, RuntimeEvent
26
+ from ksadk.events.canonical import (
27
+ ContinuationCreated,
28
+ EventEnvelope,
29
+ InteractionRequested,
30
+ ItemCompleted,
31
+ ItemUpdated,
32
+ RunCanceled,
33
+ RunFailed,
34
+ RunInterrupted,
35
+ RuntimeEvent,
36
+ )
37
+ from ksadk.events.content import TextContent
27
38
  from ksadk.runtime import CancelResult, RunHandle
28
39
 
29
40
  logger = logging.getLogger(__name__)
@@ -136,31 +147,52 @@ async def _enqueue_initial_task(context: RequestContext, event_queue: EventQueue
136
147
 
137
148
 
138
149
  class _InputRequired(Exception):
139
- """runner 请求用户输入的信号(内部用于跳出 execute,task 停 input-required)。"""
150
+ """Runtime 请求用户输入的信号(内部用于跳出 execute,task 停 input-required)。"""
140
151
 
141
152
 
142
153
  class _RunCanceled(Exception):
143
154
  """Runtime 已取消本次执行,executor 不得再发 completed。"""
144
155
 
145
156
 
157
+ def _require_resume_capability(task_adapter: Any) -> None:
158
+ """当 runtime adapter 显式声明 typed capability matrix 时,校验 resume 是否 supported。
159
+
160
+ 只有 adapter **覆写**了 ``capabilities()`` 才执行强校验(声明 unsupported 必须
161
+ fail-closed);沿用基类默认矩阵的旧版/第三方 adapter 不受影响,避免把
162
+ "未迁移到 v1 matrix" 误判为 "声明不支持"。
163
+ """
164
+
165
+ from ksadk.runtime.adapter import RuntimeAdapter
166
+
167
+ runtime_adapter = getattr(task_adapter, "runtime_adapter", None)
168
+ declared = getattr(type(runtime_adapter), "capabilities", None)
169
+ if declared is None or declared is RuntimeAdapter.capabilities:
170
+ return
171
+ matrix = declared(runtime_adapter)
172
+ if not matrix.resume.supported:
173
+ from ksadk.kernel.errors import UnsupportedControlError
174
+
175
+ raise UnsupportedControlError(
176
+ "runtime capability matrix declares resume unsupported: "
177
+ f"{matrix.resume.reason}"
178
+ )
179
+
180
+
146
181
  class A2ARuntimeExecutor(AgentExecutor):
147
- """在 A2A 请求生命周期内执行 ksadk runner。
182
+ """在 A2A 请求生命周期内执行 RuntimeAdapter。
148
183
 
149
- - sync: ``runner.invoke``。
150
- - streaming: ``runner.stream``,逐 chunk 发 artifact。
151
- - cancel: 委托 ``task_adapter.cancel_task``(内部走 RuntimeAdapter.cancel)。
184
+ start/stream/resume/cancel 全部委托 ``A2ARuntimeTaskAdapter``;协议层不再
185
+ 保留 Runner fallback,因此所有入口共享同一 RuntimeEvent 合同。
152
186
  """
153
187
 
154
188
  def __init__(
155
189
  self,
156
- runner: Any,
157
- task_adapter: Any = None,
158
- prefer_stream: bool = True,
190
+ task_adapter: Any,
159
191
  include_reasoning: bool = False,
160
192
  ) -> None:
161
- self.runner = runner
193
+ if task_adapter is None:
194
+ raise TypeError("task_adapter is required")
162
195
  self.task_adapter = task_adapter
163
- self.prefer_stream = prefer_stream
164
196
  self.include_reasoning = include_reasoning
165
197
 
166
198
  async def execute(self, context: RequestContext, event_queue: EventQueue) -> None:
@@ -178,14 +210,19 @@ class A2ARuntimeExecutor(AgentExecutor):
178
210
  and getattr(getattr(current_task, "status", None), "state", None)
179
211
  == TaskState.TASK_STATE_INPUT_REQUIRED
180
212
  )
213
+ from ksadk.kernel.ingress import kernel_route_active
214
+
215
+ if kernel_route_active() and not is_resume:
216
+ await self._kernel_execute(context, updater)
217
+ return
218
+
181
219
  interaction_response: Any = None
182
- if self.task_adapter is not None:
183
- # Third-party/local adapters written before durable context mapping
184
- # do not necessarily provide this optional lifecycle hook.
185
- prepare_context = getattr(self.task_adapter, "prepare_context", None)
186
- if callable(prepare_context):
187
- await prepare_context(context)
188
- if is_resume and self.task_adapter is not None:
220
+ # Third-party/local adapters written before durable context mapping do not
221
+ # necessarily provide this optional lifecycle hook.
222
+ prepare_context = getattr(self.task_adapter, "prepare_context", None)
223
+ if callable(prepare_context):
224
+ await prepare_context(context)
225
+ if is_resume:
189
226
  interaction_response = self.task_adapter.answer_from_context(context)
190
227
  # Invalid resume tokens/decisions are request errors. Validate before emitting
191
228
  # working so the durable Task remains input-required and retryable.
@@ -194,6 +231,9 @@ class A2ARuntimeExecutor(AgentExecutor):
194
231
  context,
195
232
  answer=interaction_response,
196
233
  )
234
+ # 诚实 capability:runtime 声明 resume unsupported 时 fail-closed,
235
+ # 不允许协议层吞掉 matrix 并假装续跑成功。
236
+ _require_resume_capability(self.task_adapter)
197
237
 
198
238
  handle: RunHandle | None = None
199
239
  try:
@@ -206,25 +246,20 @@ class A2ARuntimeExecutor(AgentExecutor):
206
246
  TaskState.TASK_STATE_WORKING,
207
247
  metadata=dict(ADK_V2_INTEGRATION_METADATA),
208
248
  )
209
- runner_input = self._build_runner_input(context)
210
249
  if is_resume:
211
- if self.task_adapter is None:
212
- raise RuntimeError("runtime task adapter is required to resume A2A task")
213
250
  handle = await self.task_adapter.resume_task(
214
251
  context.task_id or "",
215
252
  context,
216
253
  answer=interaction_response,
217
254
  )
218
255
  output = await self._run_runtime(context, updater, handle)
219
- elif self.task_adapter is not None:
256
+ else:
220
257
  handle = await self.task_adapter.start_task(
221
258
  task_id=str(context.task_id or ""),
222
259
  context=context,
223
- input_data=runner_input.get("input"),
260
+ input_data=context.get_user_input(),
224
261
  )
225
262
  output = await self._run_runtime(context, updater, handle)
226
- else:
227
- output = await self._run_runner(context, updater, runner_input)
228
263
  # completed 携带全文消息:非流式消费端与 text.completed 投影(§ event_adapter
229
264
  # message_to_event final)依赖它拿最终结果;流式消费端的重复由 adk_runner
230
265
  # 在 handoff 分支对"增量累积"去重解决(不在此处删消息)。
@@ -246,6 +281,70 @@ class A2ARuntimeExecutor(AgentExecutor):
246
281
  )
247
282
  await self._forget_task(context, handle)
248
283
 
284
+ async def _kernel_execute(self, context: RequestContext, updater: TaskUpdater) -> None:
285
+ """kernel 路径(灰度 opt-in):A2A task -> AgentControlCommand -> receipt。
286
+
287
+ mutation 只走 kernel.submit;A2A task 事件 shape 保留,cursor 源自同一
288
+ Session seq(SessionEventSubscription.after_seq)。
289
+ """
290
+ from ksadk.kernel import ingress as _kernel_ingress
291
+
292
+ task_id = str(context.task_id or "")
293
+ session_id = str(context.context_id or task_id)
294
+ try:
295
+ trusted = _kernel_ingress.trusted_context(
296
+ source_kind="a2a",
297
+ source_ref=task_id,
298
+ session_id=session_id,
299
+ operations=("enqueue",),
300
+ )
301
+ command = _kernel_ingress.map_a2a_task(
302
+ session_id=session_id,
303
+ idempotency_key=task_id,
304
+ content={"input": context.get_user_input()},
305
+ task_id=task_id,
306
+ trusted=trusted,
307
+ )
308
+ receipt = await _kernel_ingress.submit_command(command, permit=trusted.permit)
309
+ if receipt.status not in ("accepted", "duplicate"):
310
+ await updater.failed(
311
+ message=updater.new_agent_message(
312
+ parts=[Part(text=f"agent kernel rejected command: {receipt.status}")]
313
+ )
314
+ )
315
+ return
316
+ await updater.update_status(
317
+ TaskState.TASK_STATE_WORKING,
318
+ metadata=dict(ADK_V2_INTEGRATION_METADATA),
319
+ )
320
+ output_text = ""
321
+ async for _seq, projected in _kernel_ingress.subscribe_projected(
322
+ session_id,
323
+ trusted=trusted,
324
+ after_seq=int(receipt.accepted_seq or 0),
325
+ projector=_a2a_envelope_projection,
326
+ ):
327
+ if projected is None:
328
+ continue
329
+ kind, value = projected
330
+ if kind == "delta":
331
+ output_text += value
332
+ elif kind == "completed":
333
+ output_text = value or output_text
334
+ completion = (
335
+ updater.new_agent_message(parts=[Part(text=output_text)])
336
+ if output_text
337
+ else None
338
+ )
339
+ await updater.complete(message=completion)
340
+ except Exception as exc: # noqa: BLE001
341
+ logger.error("A2A kernel ingress failed (%s)", type(exc).__name__)
342
+ await updater.failed(
343
+ message=updater.new_agent_message(
344
+ parts=[Part(text="A2A task execution failed")]
345
+ )
346
+ )
347
+
249
348
  async def cancel(self, context: RequestContext, event_queue: EventQueue) -> None:
250
349
  # §7.4:cancel 统一由 adapter 提供。有 RuntimeAdapter → 尊重其 CancelResult,
251
350
  # 只有底层真取消(CANCELLED)才把协议 Task 置 canceled;其余状态如实抛
@@ -259,8 +358,6 @@ class A2ARuntimeExecutor(AgentExecutor):
259
358
  getattr(current_task, "context_id", "") or context.context_id or "unknown-context"
260
359
  ),
261
360
  )
262
- if self.task_adapter is None:
263
- raise TaskNotCancelableError(message="runtime task adapter is not configured")
264
361
  result = await self.task_adapter.cancel_task(context.task_id or "", context)
265
362
  # 只有底层真的接受了取消(已中断活跃 turn,或已登记 pending cancel)才把
266
363
  # 协议 Task 置 canceled;其他结果如实拒绝,包括未来新增的 UNSUPPORTED。
@@ -281,89 +378,6 @@ class A2ARuntimeExecutor(AgentExecutor):
281
378
  if inspect.isawaitable(result):
282
379
  await result
283
380
 
284
- async def _run_runner(
285
- self, context: RequestContext, updater: TaskUpdater, runner_input: dict[str, Any]
286
- ) -> str:
287
- stream = getattr(self.runner, "stream", None)
288
- if self.prefer_stream and callable(stream):
289
- return await self._run_streaming(context, updater, stream, runner_input)
290
-
291
- result = await self.runner.invoke(runner_input)
292
- text = self._coerce_text(result)
293
- if text:
294
- await updater.add_artifact(
295
- parts=[Part(text=text)],
296
- artifact_id=f"{context.task_id}-response",
297
- name="response",
298
- last_chunk=True,
299
- )
300
- return text
301
-
302
- async def _run_streaming(
303
- self,
304
- context: RequestContext,
305
- updater: TaskUpdater,
306
- stream: Any,
307
- runner_input: dict[str, Any],
308
- ) -> str:
309
- output_text = ""
310
- artifacts = _ArtifactStreamEmitter(updater, str(context.task_id))
311
-
312
- async for chunk in stream(runner_input):
313
- chunk_type = chunk.get("type") if isinstance(chunk, dict) else None
314
- if chunk_type == "input_required":
315
- raise RuntimeError(
316
- "runner emitted input_required without a RuntimeAdapter execution path"
317
- )
318
- if chunk_type == "final":
319
- final_text = (
320
- self._coerce_text(chunk.get("output")) if isinstance(chunk, dict) else ""
321
- )
322
- if not final_text:
323
- continue
324
- if not output_text:
325
- output_text = final_text
326
- await artifacts.push("text", final_text)
327
- elif final_text.startswith(output_text):
328
- suffix = final_text[len(output_text) :]
329
- output_text = final_text
330
- if suffix:
331
- await artifacts.push("text", suffix)
332
- continue
333
- else:
334
- output_text = final_text
335
- await artifacts.push("text", final_text, replace_snapshot=True)
336
- continue
337
-
338
- text = self._coerce_text(chunk)
339
- if not text:
340
- continue
341
- if chunk_type == "thinking":
342
- if self.include_reasoning:
343
- await artifacts.push("thinking", text)
344
- continue
345
- output_text += text
346
- await artifacts.push("text", text)
347
-
348
- await artifacts.close()
349
- return output_text
350
-
351
- def _build_runner_input(self, context: RequestContext) -> dict[str, Any]:
352
- metadata = dict(getattr(context, "metadata", None) or {})
353
- state = metadata.get("state", {})
354
- if not isinstance(state, dict):
355
- state = {}
356
- # §7.2: A2A context_id ↔ Runtime session_id。
357
- return {
358
- "input": context.get_user_input(),
359
- "task_id": context.task_id,
360
- "context_id": context.context_id,
361
- "session_id": context.context_id,
362
- "state": dict(state),
363
- "branch": metadata.get("branch", ""),
364
- "metadata": metadata,
365
- }
366
-
367
381
  async def _run_runtime(
368
382
  self,
369
383
  context: RequestContext,
@@ -372,7 +386,6 @@ class A2ARuntimeExecutor(AgentExecutor):
372
386
  ) -> str:
373
387
  output_text = ""
374
388
  artifacts = _ArtifactStreamEmitter(updater, str(context.task_id))
375
- reasoning_text = ""
376
389
  input_required = False
377
390
  input_prompt = "Input required"
378
391
  checkpoint_id: str | None = None
@@ -380,91 +393,81 @@ class A2ARuntimeExecutor(AgentExecutor):
380
393
  payload_kind: A2AResumePayloadKind = "hitl_answer"
381
394
 
382
395
  async for event in self.task_adapter.stream_task(handle):
383
- if not isinstance(event, RuntimeEvent):
396
+ if not isinstance(event, EventEnvelope):
384
397
  raise TypeError("RuntimeAdapter.stream must yield RuntimeEvent")
385
- if event.event_type == EventType.RUN_FAILED:
386
- raise RuntimeError(self._coerce_text(event.payload.get("error")))
387
- if event.event_type == EventType.RUN_CANCELED:
398
+ if isinstance(event, RunFailed):
399
+ raise RuntimeError(self._coerce_text(event.error.message))
400
+ if isinstance(event, RunCanceled):
388
401
  await artifacts.close()
389
402
  if not self._cancel_was_accepted(context, handle):
390
403
  await updater.cancel(
391
404
  message=updater.new_agent_message(parts=[Part(text="Request canceled")])
392
405
  )
393
406
  raise _RunCanceled()
394
- if event.event_type == EventType.APPROVAL_REQUESTED:
407
+ if isinstance(event, InteractionRequested):
395
408
  input_required = True
396
409
  payload_kind = "approval_decision"
397
410
  call_id = (
398
- str(event.payload.get("call_id") or event.payload.get("approval_id") or "")
411
+ str(event.request.call_id or event.interaction_id or "")
399
412
  or None
400
413
  )
401
- detail = event.payload.get("detail")
414
+ detail = event.request.detail
402
415
  if isinstance(detail, dict):
403
416
  input_prompt = self._coerce_text(
404
417
  detail.get("prompt") or detail.get("message") or input_prompt
405
418
  )
406
419
  continue
407
- if event.event_type == EventType.CHECKPOINT_CREATED:
408
- checkpoint_id = str(event.payload.get("checkpoint_id") or "") or None
420
+ if isinstance(event, ContinuationCreated):
421
+ checkpoint_id = event.continuation_id
409
422
  continue
410
- if event.event_type == EventType.RUN_INTERRUPTED:
423
+ if isinstance(event, RunInterrupted):
411
424
  input_required = True
412
- input_prompt = self._coerce_text(
413
- event.payload.get("prompt") or event.payload.get("message") or input_prompt
414
- )
415
- continue
416
- if event.event_type not in {
417
- EventType.TEXT_DELTA,
418
- EventType.TEXT_COMPLETED,
419
- EventType.REASONING_DELTA,
420
- EventType.REASONING_COMPLETED,
421
- }:
422
- continue
423
- text = self._coerce_text(event.payload.get("text"))
424
- if not text:
425
+ input_prompt = self._coerce_text(event.reason or input_prompt)
425
426
  continue
426
- if event.event_type == EventType.REASONING_COMPLETED:
427
- if not self.include_reasoning:
427
+ if isinstance(event, ItemUpdated):
428
+ if event.item_kind == "reasoning":
429
+ if not self.include_reasoning:
430
+ continue
431
+ if not isinstance(event.update, TextContent):
432
+ continue
433
+ text = event.update.text
434
+ if not text:
435
+ continue
436
+ await artifacts.push(
437
+ "thinking", text, replace_snapshot=(event.op == "replace")
438
+ )
428
439
  continue
429
- if not reasoning_text:
430
- delta = text
431
- reasoning_text = text
432
- elif text.startswith(reasoning_text):
433
- delta = text[len(reasoning_text) :]
434
- reasoning_text = text
435
- else:
436
- delta = text
437
- reasoning_text += text
438
- if delta:
439
- await artifacts.push("thinking", delta)
440
- continue
441
- if event.event_type == EventType.REASONING_DELTA:
442
- if not self.include_reasoning:
440
+ if event.item_kind == "message":
441
+ if not isinstance(event.update, TextContent):
442
+ continue
443
+ text = event.update.text
444
+ if not text:
445
+ continue
446
+ replace_snapshot = event.op == "replace"
447
+ if replace_snapshot:
448
+ output_text = text
449
+ else:
450
+ output_text += text
451
+ await artifacts.push("text", text, replace_snapshot=replace_snapshot)
443
452
  continue
444
- reasoning_text += text
445
- await artifacts.push("thinking", text)
446
453
  continue
447
- # TEXT_COMPLETED 是累计全文,去重只发新增 suffix;TEXT_DELTA 是增量直接透传。
448
- if event.event_type == EventType.TEXT_COMPLETED:
449
- if not output_text:
450
- delta = text
451
- output_text = text
452
- replace_snapshot = False
453
- elif text.startswith(output_text):
454
- delta = text[len(output_text) :]
455
- output_text = text
456
- replace_snapshot = False
457
- else:
458
- delta = text
454
+ if isinstance(event, ItemCompleted):
455
+ if event.item_kind == "reasoning":
456
+ if not self.include_reasoning:
457
+ continue
458
+ text = self._snapshot_text(event)
459
+ if not text:
460
+ continue
461
+ await artifacts.push("thinking", text, replace_snapshot=True)
462
+ continue
463
+ if event.item_kind == "message":
464
+ text = self._snapshot_text(event)
465
+ if not text:
466
+ continue
459
467
  output_text = text
460
- replace_snapshot = True
461
- else:
462
- delta = text
463
- output_text += text
464
- replace_snapshot = False
465
- if not delta:
468
+ await artifacts.push("text", text, replace_snapshot=True)
469
+ continue
466
470
  continue
467
- await artifacts.push("text", delta, replace_snapshot=replace_snapshot)
468
471
  if self._cancel_was_accepted(context, handle):
469
472
  await artifacts.close()
470
473
  raise _RunCanceled()
@@ -500,6 +503,14 @@ class A2ARuntimeExecutor(AgentExecutor):
500
503
  if inspect.isawaitable(result):
501
504
  await result
502
505
 
506
+ @staticmethod
507
+ def _snapshot_text(event: ItemCompleted) -> str:
508
+ """Extract text from the first TextContent part of an ItemCompleted snapshot."""
509
+ if not event.snapshot.parts:
510
+ return ""
511
+ part = event.snapshot.parts[0]
512
+ return part.text if isinstance(part, TextContent) else ""
513
+
503
514
  @classmethod
504
515
  def _coerce_text(cls, payload: Any) -> str:
505
516
  if payload is None:
@@ -516,3 +527,15 @@ class A2ARuntimeExecutor(AgentExecutor):
516
527
 
517
528
 
518
529
  __all__ = ["A2ARuntimeExecutor"]
530
+
531
+
532
+ def _a2a_envelope_projection(envelope) -> tuple[str, str] | None:
533
+ """Session envelope -> A2A 文本投影;cursor 仍用 envelope.seq。"""
534
+
535
+ payload = envelope.payload or {}
536
+ if envelope.event_type == "run.completed":
537
+ return "completed", str(payload.get("output_text") or "")
538
+ text = str(payload.get("delta") or payload.get("text") or "")
539
+ if text:
540
+ return "delta", text
541
+ return None
ksadk/a2a/routes.py CHANGED
@@ -19,7 +19,7 @@ A2A route、TaskStore、task adapter 和 card 构造**只有一份实现**,普
19
19
  from __future__ import annotations
20
20
 
21
21
  from dataclasses import dataclass, field
22
- from typing import Any, Optional, Sequence
22
+ from typing import Optional, Sequence
23
23
 
24
24
  from a2a.server.routes import add_a2a_routes_to_fastapi
25
25
  from a2a.server.tasks import TaskStore
@@ -57,7 +57,6 @@ class A2AConfig:
57
57
 
58
58
  def add_a2a_protocol_routes(
59
59
  app: FastAPI,
60
- runner: Any,
61
60
  config: A2AConfig,
62
61
  *,
63
62
  task_adapter: A2ARuntimeTaskAdapter,
@@ -85,19 +84,27 @@ def add_a2a_protocol_routes(
85
84
  create_table=config.create_table,
86
85
  )
87
86
  server = A2AProtocolServer(
88
- runner,
89
87
  agent_card=card,
90
88
  task_store=store,
91
89
  task_adapter=task_adapter,
92
90
  context_builder=context_builder,
93
- prefer_stream=config.prefer_stream,
94
91
  include_reasoning=config.include_reasoning,
95
92
  )
93
+ rest = server.rest_routes()
94
+ # a2a-sdk REST routes 附带贪婪 Mount('/{tenant}')(多租户 catch-all),
95
+ # 它会拦截 /v1/responses、/agentengine/api/v1/*、/chat 等单段前缀路径导致 404。
96
+ # 只丢弃贪婪 Mount('/{tenant}');保留其他 Mount(多租户显式路径如 /tenant-a/a2a/v1/*)。
97
+ from starlette.routing import Mount as _Mount
98
+
99
+ rest = [
100
+ route for route in rest
101
+ if not (isinstance(route, _Mount) and getattr(route, "path", "") == "/{tenant}")
102
+ ]
96
103
  add_a2a_routes_to_fastapi(
97
104
  app,
98
105
  agent_card_routes=server.agent_card_routes(),
99
106
  jsonrpc_routes=server.jsonrpc_routes(),
100
- rest_routes=server.rest_routes(),
107
+ rest_routes=rest,
101
108
  )
102
109
  return server
103
110
 
ksadk/a2a/server.py CHANGED
@@ -59,37 +59,30 @@ class _DurableRequestContextBuilder(SimpleRequestContextBuilder):
59
59
 
60
60
 
61
61
  class A2AProtocolServer:
62
- """把一个 ksadk runner 暴露为 A2A 协议数据面。
62
+ """把一个 RuntimeAdapter 暴露为 A2A 协议数据面。
63
63
 
64
64
  参数:
65
- runner: 当前 runtime 的 runner。
66
65
  agent_card: 符合 wire 1.0 的 AgentCard(``ksadk.a2a.card.build_agent_card``)。
67
66
  task_store: durable ``DatabaseTaskStore``(``ksadk.a2a.task_store``)。
68
67
  task_adapter: 可选 ``A2ARuntimeTaskAdapter``(提供则 cancel 走 RuntimeAdapter.cancel)。
69
- prefer_stream: 是否优先用 runner.stream(默认 True)。
70
68
  include_reasoning: 是否把 reasoning 输出为 ``adk_thought`` artifact。
71
69
  """
72
70
 
73
71
  def __init__(
74
72
  self,
75
- runner: Any,
76
73
  *,
77
74
  agent_card: AgentCard,
78
75
  task_store: TaskStore,
79
76
  task_adapter: A2ARuntimeTaskAdapter,
80
77
  context_builder: A2AOwnerContextBuilder | None = None,
81
- prefer_stream: bool = True,
82
78
  include_reasoning: bool = False,
83
79
  ) -> None:
84
- self.runner = runner
85
80
  self.agent_card = agent_card
86
81
  self.task_store = task_store
87
82
  self.task_adapter = task_adapter
88
83
  self.context_builder = context_builder or A2AOwnerContextBuilder()
89
84
  self.executor = A2ARuntimeExecutor(
90
- runner,
91
85
  task_adapter=task_adapter,
92
- prefer_stream=prefer_stream,
93
86
  include_reasoning=include_reasoning,
94
87
  )
95
88
  self.request_handler = DefaultRequestHandler(
@@ -0,0 +1,33 @@
1
+ """A2A Space 服务地址与凭证解析(对齐 ksadk/skills 的 KOP pull 模式)。
2
+
3
+ runtime 通过 KOP 公网网关访问 agentengine-server 的对外 A2A Action
4
+ (ListAToASpaceAgents,返回里已含完整投影后 AgentCard),与 Skill Space
5
+ 走同一套 AICP 连接解析:默认 aicp.api.ksyun.com,可被 KSADK_A2A_SERVICE_URL 覆盖。
6
+ runtime 拿到 card 后直接用 card.url 调用,不需要 gateway 域名。
7
+ """
8
+
9
+ from __future__ import annotations
10
+
11
+ import os
12
+
13
+ from ksadk.common.aicp_env import resolve_aicp_connection
14
+
15
+ ENV_A2A_SERVICE_URL = "KSADK_A2A_SERVICE_URL"
16
+ ENV_A2A_SERVICE_TOKEN = "KSADK_A2A_SERVICE_TOKEN"
17
+
18
+
19
+ def resolve_a2a_service_url() -> str:
20
+ """返回 A2A 控制面对外服务 origin(不含 path)。
21
+
22
+ 优先 KSADK_A2A_SERVICE_URL;否则用 AICP 连接解析(aicp.api.ksyun.com)。
23
+ """
24
+ explicit = os.environ.get(ENV_A2A_SERVICE_URL, "").strip()
25
+ if explicit:
26
+ return explicit
27
+ connection = resolve_aicp_connection("KSADK_A2A_SERVICE")
28
+ return f"{connection['scheme']}://{connection['endpoint']}".rstrip("/")
29
+
30
+
31
+ def resolve_a2a_service_token() -> str:
32
+ """返回 A2A 控制面服务 token(平台注入)。"""
33
+ return os.environ.get(ENV_A2A_SERVICE_TOKEN, "").strip()