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
@@ -6,14 +6,33 @@ import uuid
6
6
  from collections.abc import Mapping
7
7
  from typing import Any, Dict, List, Optional
8
8
 
9
+ from fastapi import HTTPException
9
10
  from fastapi.responses import StreamingResponse
10
11
  from pydantic import BaseModel
11
12
 
13
+ from ksadk.conversations.normalize import normalize_kop_messages, normalize_responses_input
12
14
  from ksadk.conversations.run_kinds import RUN_MODE_FOREGROUND, trigger_from_resume_input
15
+ from ksadk.conversations.runtime_payloads import (
16
+ build_chat_completions_payload,
17
+ build_responses_payload,
18
+ extract_responses_resume_input,
19
+ )
20
+ from ksadk.conversations.runtime_streaming import (
21
+ stream_runtime_conversation_turn,
22
+ stream_runtime_responses_conversation_turn,
23
+ )
24
+ from ksadk.kernel.ingress import kernel_route_active
25
+ from ksadk.runtime.conversation_execution import invoke_runtime_conversation_once
26
+ from ksadk.server.factory import get_runtime_execution
13
27
 
14
28
  from . import dependencies as deps
15
29
  from .checkpoint_resolution import _resolve_checkpoint_resume_input_from_session
16
- from .common import _prepare_runner_for_model, _resolve_active_runner
30
+ from .kernel_ingress import (
31
+ _kernel_error_response,
32
+ _kernel_submit,
33
+ kernel_conversation_turn,
34
+ kernel_stream_response,
35
+ )
17
36
  from .models import (
18
37
  ResponsesRequest,
19
38
  _clean_optional_string,
@@ -23,7 +42,10 @@ from .models import (
23
42
  _split_custom_metadata,
24
43
  )
25
44
  from .routers import openai_compat_router
26
- from .streaming import _detached_resume_key_from_input, _reject_if_detached_resume_active
45
+ from .streaming import (
46
+ _detached_resume_key_from_input,
47
+ _reject_if_detached_resume_active,
48
+ )
27
49
  from .workspace import _build_models_payload
28
50
 
29
51
 
@@ -46,6 +68,26 @@ async def list_openai_models():
46
68
  """Expose the current model catalog through the OpenAI-compatible path."""
47
69
 
48
70
  payload = await _build_models_payload()
71
+ try:
72
+ _executor, launch_context = get_runtime_execution()
73
+ except HTTPException:
74
+ launch_context = None
75
+ if launch_context is not None:
76
+ config = dict(launch_context.config)
77
+ raw_allowed = (
78
+ config.get("models") or config.get("allowed_models") or config.get("allowedModels")
79
+ )
80
+ if isinstance(raw_allowed, (list, tuple, set)):
81
+ allowed = {str(item).strip() for item in raw_allowed if str(item).strip()}
82
+ default_model = str(config.get("model") or "").strip()
83
+ if default_model:
84
+ allowed.add(default_model)
85
+ payload = dict(payload)
86
+ payload["data"] = [
87
+ item
88
+ for item in payload.get("data", [])
89
+ if str(item.get("id") or "").strip() in allowed
90
+ ]
49
91
  return {
50
92
  "object": "list",
51
93
  "data": payload.get("data", []),
@@ -57,22 +99,20 @@ async def list_openai_models():
57
99
  @openai_compat_router.post("/v1/responses")
58
100
  async def responses(request: ResponsesRequest):
59
101
  """OpenAI Responses 兼容接口。"""
60
- active_runner = _resolve_active_runner()
102
+ executor, launch_context = get_runtime_execution()
103
+ if kernel_route_active():
104
+ return await _kernel_responses(request, launch_context)
61
105
  resolved_session_id, resolved_user_id = _resolve_responses_session_and_user(request)
62
- agent_id = _runtime_agent_id(active_runner)
106
+ agent_id = _runtime_agent_id(launch_context)
63
107
 
64
- resume_input = deps.conversation().extract_responses_resume_input(request.input)
108
+ resume_input = extract_responses_resume_input(request.input)
65
109
  resume_input = await _resolve_checkpoint_resume_input_from_session(
66
110
  service=deps.resolve_session_service(),
67
111
  agent_id=agent_id,
68
112
  session_id=resolved_session_id,
69
113
  resume_input=resume_input,
70
114
  )
71
- messages = (
72
- []
73
- if resume_input is not None
74
- else deps.conversation().normalize_responses_input(request.input)
75
- )
115
+ messages = [] if resume_input is not None else normalize_responses_input(request.input)
76
116
  custom_metadata, request_metadata = _split_custom_metadata(request.metadata)
77
117
  if request.previous_response_id:
78
118
  request_metadata["previous_response_id"] = request.previous_response_id
@@ -90,11 +130,15 @@ async def responses(request: ResponsesRequest):
90
130
  invocation_id = _metadata_invocation_id(request_metadata)
91
131
 
92
132
  if request.stream:
133
+ runtime_preparation = (
134
+ None if resume_input is not None else await executor.prepare_start(launch_context)
135
+ )
93
136
  resume_key = _detached_resume_key_from_input(resolved_session_id, resume_input)
94
137
  _reject_if_detached_resume_active(resume_key)
95
138
  return deps.detached_streaming_response(
96
- deps.conversation().stream_responses_conversation_turn(
97
- runner=active_runner,
139
+ stream_runtime_responses_conversation_turn(
140
+ executor=executor,
141
+ launch_context=launch_context,
98
142
  agent_id=agent_id,
99
143
  user_id=resolved_user_id,
100
144
  messages=messages,
@@ -108,9 +152,9 @@ async def responses(request: ResponsesRequest):
108
152
  resume_input=resume_input,
109
153
  account_id=account_id,
110
154
  invocation_id=invocation_id,
111
- prepare_runner=_prepare_runner_for_model,
112
155
  session_service_provider=deps.resolve_session_service,
113
156
  run_mode=RUN_MODE_FOREGROUND,
157
+ runtime_preparation=runtime_preparation,
114
158
  ),
115
159
  invocation_id=invocation_id,
116
160
  resume_key=resume_key,
@@ -119,8 +163,9 @@ async def responses(request: ResponsesRequest):
119
163
  )
120
164
 
121
165
  response_id = f"resp_{uuid.uuid4().hex}"
122
- resolved_session_id, result = await deps.conversation().invoke_conversation_once(
123
- runner=active_runner,
166
+ resolved_session_id, result = await invoke_runtime_conversation_once(
167
+ executor=executor,
168
+ launch_context=launch_context,
124
169
  agent_id=agent_id,
125
170
  user_id=resolved_user_id,
126
171
  messages=messages,
@@ -135,11 +180,10 @@ async def responses(request: ResponsesRequest):
135
180
  response_id=response_id,
136
181
  account_id=account_id,
137
182
  invocation_id=invocation_id,
138
- prepare_runner=_prepare_runner_for_model,
139
183
  session_service_provider=deps.resolve_session_service,
140
184
  run_mode=RUN_MODE_FOREGROUND,
141
185
  )
142
- return deps.conversation().build_responses_payload(
186
+ return build_responses_payload(
143
187
  output_text=result["output_text"],
144
188
  model=request.model,
145
189
  session_id=resolved_session_id,
@@ -149,21 +193,79 @@ async def responses(request: ResponsesRequest):
149
193
  )
150
194
 
151
195
 
196
+ async def _kernel_responses(request: ResponsesRequest, launch_context):
197
+ """kernel 路径(灰度 opt-in):Responses -> AgentControlCommand -> receipt。"""
198
+
199
+ from ksadk.conversations.runtime_persistence import ensure_conversation_session
200
+
201
+ resolved_session_id, resolved_user_id = _resolve_responses_session_and_user(request)
202
+ session = await ensure_conversation_session(
203
+ agent_id=_runtime_agent_id(launch_context),
204
+ user_id=resolved_user_id,
205
+ session_id=resolved_session_id,
206
+ session_service_provider=deps.resolve_session_service,
207
+ )
208
+ session_id = session.id
209
+ metadata = request.metadata if isinstance(request.metadata, dict) else {}
210
+ idempotency_key = (
211
+ _clean_optional_string(metadata.get("idempotency_key"))
212
+ or _metadata_invocation_id(metadata)
213
+ or f"resp_{uuid.uuid4().hex}"
214
+ )
215
+ messages = normalize_responses_input(request.input)
216
+ response_id = f"resp_{uuid.uuid4().hex}"
217
+ receipt, trusted = await _kernel_submit(
218
+ mapper="map_responses_request",
219
+ session_id=session_id,
220
+ idempotency_key=idempotency_key,
221
+ content=messages,
222
+ correlation_ref=response_id,
223
+ source_kind="responses",
224
+ )
225
+ if receipt.status not in ("accepted", "duplicate"):
226
+ return _kernel_error_response(receipt)
227
+
228
+ def build_payload(output_text: str):
229
+ return build_responses_payload(
230
+ output_text=output_text,
231
+ model=request.model,
232
+ session_id=session_id,
233
+ response_id=response_id,
234
+ metadata=None,
235
+ usage=None,
236
+ )
237
+
238
+ if request.stream:
239
+ return kernel_stream_response(
240
+ receipt=receipt,
241
+ trusted=trusted,
242
+ session_id=session_id,
243
+ )
244
+ return await kernel_conversation_turn(
245
+ receipt=receipt,
246
+ trusted=trusted,
247
+ session_id=session_id,
248
+ build_payload=build_payload,
249
+ )
250
+
251
+
152
252
  @openai_compat_router.post("/v1/chat/completions")
153
253
  async def chat_completions(request: ChatCompletionRequest):
154
254
  """OpenAI 兼容的聊天补全接口 (支持流式和非流式)"""
155
- active_runner = _resolve_active_runner()
156
- messages = deps.conversation().normalize_kop_messages(request.messages)
157
- agent_id = _runtime_agent_id(active_runner)
255
+ executor, launch_context = get_runtime_execution()
256
+ messages = normalize_kop_messages(request.messages)
257
+ agent_id = _runtime_agent_id(launch_context)
158
258
  resolved_user_id = _clean_optional_string(request.user) or "user"
159
259
  account_id = _clean_optional_string(request.account_id)
160
260
  custom_metadata, request_metadata = _split_custom_metadata(request.metadata)
161
261
  invocation_id = _metadata_invocation_id(request_metadata)
162
262
 
163
263
  if request.stream:
264
+ runtime_preparation = await executor.prepare_start(launch_context)
164
265
  return StreamingResponse(
165
- deps.conversation().stream_conversation_turn(
166
- runner=active_runner,
266
+ stream_runtime_conversation_turn(
267
+ executor=executor,
268
+ launch_context=launch_context,
167
269
  agent_id=agent_id,
168
270
  user_id=resolved_user_id,
169
271
  messages=messages,
@@ -175,15 +277,16 @@ async def chat_completions(request: ChatCompletionRequest):
175
277
  custom_metadata=custom_metadata,
176
278
  invocation_id=invocation_id,
177
279
  account_id=account_id,
178
- prepare_runner=_prepare_runner_for_model,
179
280
  session_service_provider=deps.resolve_session_service,
180
281
  run_mode=RUN_MODE_FOREGROUND,
282
+ runtime_preparation=runtime_preparation,
181
283
  ),
182
284
  media_type="text/event-stream",
183
285
  )
184
286
 
185
- resolved_session_id, result = await deps.conversation().invoke_conversation_once(
186
- runner=active_runner,
287
+ resolved_session_id, result = await invoke_runtime_conversation_once(
288
+ executor=executor,
289
+ launch_context=launch_context,
187
290
  agent_id=agent_id,
188
291
  user_id=resolved_user_id,
189
292
  messages=messages,
@@ -195,11 +298,10 @@ async def chat_completions(request: ChatCompletionRequest):
195
298
  custom_metadata=custom_metadata,
196
299
  invocation_id=invocation_id,
197
300
  account_id=account_id,
198
- prepare_runner=_prepare_runner_for_model,
199
301
  session_service_provider=deps.resolve_session_service,
200
302
  run_mode=RUN_MODE_FOREGROUND,
201
303
  )
202
- return deps.conversation().build_chat_completions_payload(
304
+ return build_chat_completions_payload(
203
305
  output_text=result["output_text"],
204
306
  model=request.model,
205
307
  session_id=resolved_session_id,
@@ -15,8 +15,10 @@ from ksadk.conversations.session_title import (
15
15
  build_fallback_title,
16
16
  build_heuristic_title,
17
17
  )
18
- from ksadk.server.factory import get_state
19
- from ksadk.sessions import ConversationSessionCore, Session, SessionEvent
18
+ from ksadk.events.canonical import ContinuationCreated
19
+ from ksadk.events.canonical_store import session_event_to_runtime_event
20
+ from ksadk.server.factory import get_runtime_execution, get_state
21
+ from ksadk.sessions import Session, SessionEvent
20
22
 
21
23
  from . import dependencies as deps
22
24
  from .common import _sanitize_session_state_for_action
@@ -52,7 +54,6 @@ async def _require_action_session(
52
54
 
53
55
 
54
56
  async def _session_to_action_payload(session: Session) -> dict[str, Any]:
55
- runner = get_state().runner
56
57
  events = list(session.events or [])
57
58
  if not events:
58
59
  try:
@@ -106,21 +107,56 @@ async def _session_to_action_payload(session: Session) -> dict[str, Any]:
106
107
  "CreatedAt": session.created_at,
107
108
  "UpdatedAt": session.updated_at,
108
109
  "Version": session.version,
110
+ "Continuity": _runtime_continuity_payload(),
109
111
  }
110
- if runner is not None:
111
- try:
112
- continuity = await runner.get_session_adapter().describe_continuity(
113
- runner=runner,
114
- session=session,
115
- core=ConversationSessionCore(deps.resolve_session_service()),
116
- )
117
- payload["Continuity"] = continuity.to_payload()
118
- except Exception as exc:
119
- logger.debug("Failed to describe continuity for session %s: %s", session.id, exc)
120
112
  return payload
121
113
 
122
114
 
115
+ def _runtime_continuity_payload() -> dict[str, Any]:
116
+ """Describe continuity from the active RuntimeAdapter capability contract."""
117
+
118
+ state = get_state()
119
+ if state.executor is None or state.launch_context is None:
120
+ # Session storage is independently useful in route-manifest and
121
+ # control-plane-only apps. Do not make a metadata projection require a
122
+ # live runtime execution binding.
123
+ return {
124
+ "Level": "semantic",
125
+ "Path": "replay",
126
+ "Runtime": "unbound",
127
+ "Details": {
128
+ "CheckpointSupported": False,
129
+ "Reason": "RuntimeAdapter is not bound to this app",
130
+ },
131
+ }
132
+ executor, launch_context = get_runtime_execution()
133
+ capabilities = executor.native_capabilities(launch_context)
134
+ continuity = capabilities.get("SessionContinuity")
135
+ continuity = continuity if isinstance(continuity, Mapping) else {}
136
+ checkpoint = capabilities.get("Checkpoint")
137
+ checkpoint = checkpoint if isinstance(checkpoint, Mapping) else {}
138
+ level = str(continuity.get("Level") or "semantic").strip().lower()
139
+ if level not in {"ui_only", "semantic", "runtime", "exact"}:
140
+ level = "semantic"
141
+ return {
142
+ "Level": level,
143
+ "Path": "checkpoint" if checkpoint.get("Supported") else "replay",
144
+ "Runtime": launch_context.runtime_type,
145
+ "Details": {
146
+ "CheckpointSupported": bool(checkpoint.get("Supported")),
147
+ "Reason": str(continuity.get("Reason") or ""),
148
+ },
149
+ }
150
+
151
+
123
152
  def _event_to_action_payload(event: SessionEvent) -> dict[str, Any]:
153
+ """Serialize a stored SessionEvent for the REST action wire.
154
+
155
+ 公开承诺字段(契约声明见 ``ksadk/events/projections.py``):
156
+ ``EventId``/``SessionId``/``Author``/``EventType``/``Content``/``Timestamp``/
157
+ ``SeqId``(有值时附 ``InvocationId``)。这是存储事件形态本身的透传,
158
+ ``Content``/``Metadata`` 的内部结构不在承诺范围。
159
+ """
124
160
  payload = {
125
161
  "EventId": event.id,
126
162
  "SessionId": event.session_id,
@@ -203,9 +239,41 @@ async def _iter_with_idle_heartbeat(source: AsyncIterator[Any]):
203
239
 
204
240
 
205
241
  def _checkpoint_event_to_action_payload(event: SessionEvent) -> dict[str, Any] | None:
206
- if event.event_type != "run_checkpoint":
207
- return None
208
- metadata = event.metadata or {}
242
+ """Project a checkpoint-bearing event into the REST checkpoint action payload.
243
+
244
+ 公开承诺字段(契约声明见 ``ksadk/events/projections.py``):``EventId``/
245
+ ``SessionId``/``InvocationId``/``SeqId``/``Timestamp``/``RunId``/
246
+ ``CheckpointId``/``Framework``/``FrameworkRef``/``IsResumable``/
247
+ ``ResumeStatus``/``IsTerminal``/``NextNode``。来源为显式 ``run_checkpoint``
248
+ 事件元数据,或 ``continuation.created`` canonical 事件的投影。
249
+ 非 checkpoint 事件(或不可识别的 continuation_kind)返回 ``None``。
250
+ 内部不保证字段:其余元数据透传键(``Metadata`` 内容随存储演进可变)。
251
+ """
252
+ if event.event_type == "run_checkpoint":
253
+ metadata = event.metadata or {}
254
+ else:
255
+ canonical = session_event_to_runtime_event(event)
256
+ if not isinstance(canonical, ContinuationCreated):
257
+ return None
258
+ if canonical.continuation_kind != "graph_checkpoint":
259
+ return None
260
+ framework = canonical.source.framework
261
+ framework_ref = {framework: dict(canonical.ref)}
262
+ capability = canonical.source.metadata.get("capability")
263
+ capability = capability if isinstance(capability, Mapping) else {}
264
+ metadata = {
265
+ **dict(event.metadata or {}),
266
+ **dict(canonical.source.metadata),
267
+ "continuation_kind": canonical.continuation_kind,
268
+ "run_id": canonical.run_id,
269
+ "checkpoint_id": canonical.continuation_id,
270
+ "framework": framework,
271
+ "framework_ref": dict(framework_ref),
272
+ "backend": str(capability.get("backend") or "unknown"),
273
+ "scope": str(capability.get("scope") or "unknown"),
274
+ "durable": bool(capability.get("durable", False)),
275
+ "is_resumable": canonical.resumable,
276
+ }
209
277
  run_id = str(metadata.get("run_id") or "").strip()
210
278
  checkpoint_id = str(metadata.get("checkpoint_id") or "").strip()
211
279
  framework = str(metadata.get("framework") or "").strip()