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
@@ -2,16 +2,25 @@
2
2
 
3
3
  from fastapi import FastAPI
4
4
 
5
- from ksadk.server.factory import RuntimeAppState
6
- from ksadk.server.routes.common import _register_integrated_routers
5
+ from ksadk.server.factory import RuntimeAppState, get_state
6
+ from ksadk.server.routes.common import _register_integrated_routers, _resolve_agent_ui_spec
7
7
  from ksadk.server.routes.routers import GROUP_ROUTERS, load_route_modules
8
8
 
9
9
 
10
10
  def configure_runtime_app(app: FastAPI, state: RuntimeAppState, groups: set[str]) -> None:
11
11
  """Attach integrated resources and the selected route groups to one app."""
12
12
  load_route_modules()
13
+ _configure_route_dependencies()
13
14
  _register_integrated_routers(app, state)
14
15
 
16
+ # Agent Kernel canonical ingress(/agent-kernel/v1/*)必须先于 route group
17
+ # 注册:group 内的静态 UI catch-all(GET /{path}) 会吞掉所有未匹配 GET,
18
+ # 后注册的 kernel GET 路由(health / SubscribeSessionEvents)将被遮蔽 404。
19
+ # 灰度开关关闭时 bootstrap 返回 None、路由统一回 503,不影响旧路径。
20
+ from ksadk.kernel import ingress as _kernel_ingress
21
+
22
+ app.include_router(_kernel_ingress.agent_kernel_router())
23
+
15
24
  ordered = sorted(group for group in groups if group != "health_meta")
16
25
  if "health_meta" in groups:
17
26
  ordered.append("health_meta")
@@ -19,3 +28,28 @@ def configure_runtime_app(app: FastAPI, state: RuntimeAppState, groups: set[str]
19
28
  router = GROUP_ROUTERS.get(group)
20
29
  if router is not None:
21
30
  app.include_router(router)
31
+
32
+
33
+ def _configure_route_dependencies() -> None:
34
+ """Install dynamic providers that always resolve the request-bound app state."""
35
+
36
+ import ksadk.conversations as conversation
37
+ from ksadk.server.routes import dependencies
38
+ from ksadk.server.routes.streaming import (
39
+ SSE_HEARTBEAT_INTERVAL_SECONDS,
40
+ _DetachedSSEStream,
41
+ detached_streaming_response,
42
+ )
43
+
44
+ dependencies.configure(
45
+ dependencies.ServerRouteDependencies(
46
+ resolve_session_service=lambda: get_state().resolve_session_service(),
47
+ describe_session_backend=lambda: get_state().describe_session_backend(),
48
+ resolve_agent_ui_spec=_resolve_agent_ui_spec,
49
+ conversation=lambda: conversation,
50
+ detached_streaming_response=detached_streaming_response,
51
+ detached_stream_class=lambda: _DetachedSSEStream,
52
+ heartbeat_interval=lambda: SSE_HEARTBEAT_INTERVAL_SECONDS,
53
+ runtime_app=lambda: get_state().app,
54
+ )
55
+ )
ksadk/server/factory.py CHANGED
@@ -5,7 +5,7 @@ H2 §4.2:这是三线公共装配入口,替代 `ksadk/server/app.py` 的模块
5
5
 
6
6
  设计要点:
7
7
 
8
- - **per-app state**:runner / runner_loaded / detached-stream registry 全部挂在
8
+ - **per-app state**:RuntimeExecutor / RuntimeLaunchContext / detached-stream registry 全部挂在
9
9
  `app.state.runtime`(:class:`RuntimeAppState`)上,每个 app 实例一份,普通 app 与
10
10
  HarnessApp 互不共享。不再有模块级 ``runner`` / ``_DETACHED_*`` 全局可变态。
11
11
  - **请求级桥接**:中间件把当前 app 的 state 写入 :data:`current_state` 的
@@ -26,11 +26,12 @@ import asyncio
26
26
  import contextvars
27
27
  import logging
28
28
  from contextlib import contextmanager
29
- from typing import TYPE_CHECKING, Any, Callable, Iterator, Optional, cast
29
+ from typing import TYPE_CHECKING, Any, Callable, Iterator, Optional
30
30
 
31
31
  from fastapi import FastAPI
32
32
 
33
- from ksadk.runners.base_runner import BaseRunner
33
+ from ksadk.runtime.adapter import RuntimeAdapter, RuntimeLaunchContext
34
+ from ksadk.runtime.executor import RuntimeExecutor
34
35
  from ksadk.sandbox.registry import (
35
36
  SandboxRegistry,
36
37
  bind_sandbox_registry,
@@ -103,14 +104,15 @@ class RuntimeAppState:
103
104
 
104
105
  def __init__(
105
106
  self,
106
- runner: Optional[BaseRunner] = None,
107
107
  *,
108
+ executor: RuntimeExecutor | None = None,
109
+ launch_context: RuntimeLaunchContext | None = None,
108
110
  session_service_provider: Callable[[], Any] | None = None,
109
111
  session_backend_provider: Callable[[], dict[str, Any]] | None = None,
110
112
  ) -> None:
111
113
  self.app: Optional[FastAPI] = None
112
- self.runner: Optional[BaseRunner] = runner
113
- self.runner_loaded: bool = False
114
+ self.executor = executor
115
+ self.launch_context = launch_context
114
116
  self.stream_registry = StreamRegistry()
115
117
  self.sandbox_registry = SandboxRegistry()
116
118
  self.session_service: Any = None
@@ -175,8 +177,8 @@ class RuntimeAppState:
175
177
  class RuntimeAppConfig:
176
178
  """create_runtime_app 的装配配置。
177
179
 
178
- - ``runner``:依赖注入的 runner(替代 set_runner 全局态);可在装配后由
179
- 兼容壳 ``set_runner`` 再写入 ``app.state.runtime.runner``。
180
+ - ``runtime_executor``:统一 Runtime 生命周期入口。
181
+ - ``launch_context``:当前 Runtime 与项目的不可变启动上下文。
180
182
  - ``runtime_type``:runtime 类型标识(普通 / harness / codex ...)。
181
183
  - ``route_groups``:要装配的 route group 集合;默认 :data:`ALL_GROUPS`,
182
184
  HarnessApp 传 :data:`DATA_PLANE_GROUPS`。
@@ -184,17 +186,18 @@ class RuntimeAppConfig:
184
186
 
185
187
  def __init__(
186
188
  self,
187
- runner: Optional[BaseRunner] = None,
188
189
  *,
189
190
  runtime_type: str = "local",
190
191
  route_groups: Optional[set[str]] = None,
191
192
  a2a: Optional[Any] = None,
192
- runtime_adapter: Any = None,
193
+ a2a_runtime_adapter: RuntimeAdapter | None = None,
193
194
  agui: Optional[Any] = None,
195
+ runtime_executor: RuntimeExecutor | None = None,
196
+ launch_context: RuntimeLaunchContext | None = None,
197
+ kernel_adapter_provider: Callable[[], RuntimeAdapter] | None = None,
194
198
  session_service_provider: Callable[[], Any] | None = None,
195
199
  session_backend_provider: Callable[[], dict[str, Any]] | None = None,
196
200
  ) -> None:
197
- self.runner = runner
198
201
  self.runtime_type = runtime_type
199
202
  self.route_groups: set[str] = (
200
203
  set(route_groups) if route_groups is not None else set(ALL_GROUPS)
@@ -202,8 +205,13 @@ class RuntimeAppConfig:
202
205
  # A2A 协议装配配置(``ksadk.a2a.routes.A2AConfig``);enabled 时 factory 装配
203
206
  # A2A 数据面端点(契约 §8)。用 Any 避免本模块硬依赖可选的 a2a-sdk。
204
207
  self.a2a = a2a
205
- self.runtime_adapter = runtime_adapter
208
+ self.a2a_runtime_adapter = a2a_runtime_adapter
206
209
  self.agui = agui
210
+ self.runtime_executor = runtime_executor
211
+ self.launch_context = launch_context
212
+ # 特殊 runtime 可显式提供 worker/recovery 的 adapter;常规部署从
213
+ # runtime_executor 的同一 registry 派生,见 _kernel_adapter_provider。
214
+ self.kernel_adapter_provider = kernel_adapter_provider
207
215
  self.session_service_provider = session_service_provider
208
216
  self.session_backend_provider = session_backend_provider
209
217
 
@@ -234,6 +242,17 @@ def get_state() -> RuntimeAppState:
234
242
  return state if state is not None else _fallback_state
235
243
 
236
244
 
245
+ def get_runtime_execution() -> tuple[RuntimeExecutor, RuntimeLaunchContext]:
246
+ """Resolve the current app's canonical runtime execution dependencies."""
247
+
248
+ from fastapi import HTTPException
249
+
250
+ state = get_state()
251
+ if state.executor is None or state.launch_context is None:
252
+ raise HTTPException(status_code=500, detail="RuntimeExecutor 未初始化")
253
+ return state.executor, state.launch_context
254
+
255
+
237
256
  @contextmanager
238
257
  def bind_runtime_state(state: RuntimeAppState) -> Iterator[None]:
239
258
  """Bind one app state for non-HTTP scopes such as WebSockets."""
@@ -245,26 +264,6 @@ def bind_runtime_state(state: RuntimeAppState) -> Iterator[None]:
245
264
  _current_state.reset(token)
246
265
 
247
266
 
248
- def get_runner() -> BaseRunner:
249
- """取当前 app 的 runner(懒加载 agent)。等价旧的 ``_resolve_active_runner``。"""
250
- from fastapi import HTTPException
251
-
252
- state = get_state()
253
- runner = state.runner
254
- if runner is None:
255
- raise HTTPException(status_code=500, detail="Runner 未初始化")
256
- if not state.runner_loaded:
257
- try:
258
- runner.load_agent()
259
- except HTTPException:
260
- raise
261
- except Exception as exc: # noqa: BLE001
262
- logger.warning("Runner 加载失败: %s", exc)
263
- raise HTTPException(status_code=500, detail=str(exc) or "Runner 加载失败") from exc
264
- state.runner_loaded = True
265
- return runner
266
-
267
-
268
267
  # ---------------------------------------------------------------------------
269
268
  # factory
270
269
  # ---------------------------------------------------------------------------
@@ -290,14 +289,11 @@ async def shutdown_runtime_resources(state: RuntimeAppState) -> None:
290
289
  await asyncio.gather(*pending_streams, return_exceptions=True)
291
290
  registry.clear()
292
291
 
293
- active_runner = state.runner
294
- if active_runner is not None:
295
- close = getattr(active_runner, "close", None)
296
- if callable(close):
297
- try:
298
- await close()
299
- except Exception:
300
- logger.exception("failed to close runner on shutdown")
292
+ if state.executor is not None:
293
+ try:
294
+ await state.executor.close_all()
295
+ except Exception:
296
+ logger.exception("failed to close runtime adapters on shutdown")
301
297
 
302
298
  for service in state.session_services():
303
299
  close = getattr(service, "aclose", None)
@@ -313,6 +309,26 @@ async def shutdown_runtime_resources(state: RuntimeAppState) -> None:
313
309
  logger.exception("failed to clear sandbox registry on shutdown")
314
310
 
315
311
 
312
+ def _is_agent_execution_path(path: str, method: str) -> bool:
313
+ """是否 agent 执行类请求(需要 root span 兜底,让 tool 内 outbound 挂到该 trace)。
314
+
315
+ session 管理(GetAgentUiBootstrap/ListSessionMessages 等轮询)与 UI/health 不建 span。
316
+ """
317
+ m = (method or "").upper()
318
+ p = (path or "").strip()
319
+ if m == "POST" and p in {
320
+ "/v1/responses",
321
+ "/v1/chat/completions",
322
+ "/run",
323
+ "/run_sse",
324
+ "/agentengine/api/v1/RunAgent",
325
+ }:
326
+ return True
327
+ if m == "GET" and p in {"/agentengine/api/v1/SubscribeRunEvents"}:
328
+ return True
329
+ return False
330
+
331
+
316
332
  def create_runtime_app(
317
333
  config: RuntimeAppConfig,
318
334
  configure: Optional[ConfigureApp] = None,
@@ -320,7 +336,7 @@ def create_runtime_app(
320
336
  """装配一个 runtime app。
321
337
 
322
338
  参数:
323
- config: :class:`RuntimeAppConfig`(runner / runtime_type / route_groups)。
339
+ config: :class:`RuntimeAppConfig`(executor / launch_context / route_groups)。
324
340
  configure: 路由装配回调 ``configure(app, state, route_groups)``;由
325
341
  ``ksadk/server/app.py`` 提供,负责按 group 把 domain router include 进 app。
326
342
  factory 自身只负责 FastAPI 实例、state、中间件、lifespan、异常处理器,
@@ -333,13 +349,48 @@ def create_runtime_app(
333
349
  from fastapi.responses import Response
334
350
 
335
351
  state = RuntimeAppState(
336
- runner=config.runner,
352
+ executor=config.runtime_executor,
353
+ launch_context=config.launch_context,
337
354
  session_service_provider=config.session_service_provider,
338
355
  session_backend_provider=config.session_backend_provider,
339
356
  )
340
357
 
341
358
  @asynccontextmanager
342
359
  async def _lifespan(app: FastAPI) -> AsyncIterator[None]:
360
+ # 生产 kernel 的 composition root 必须启动 worker/lease/recovery,
361
+ # 不能只注册一个可接收命令、却永远不会消费的 ingress kernel。
362
+ from ksadk.kernel import ingress as _kernel_ingress
363
+ from ksadk.kernel.bootstrap import (
364
+ bootstrap_agent_kernel_runtime_from_env,
365
+ clear_agent_kernel_runtime,
366
+ )
367
+ from ksadk.runtime.factory import kernel_start_request_defaults
368
+
369
+ adapter_provider = _kernel_adapter_provider(config)
370
+ request_defaults = (
371
+ kernel_start_request_defaults(config.launch_context)
372
+ if config.launch_context is not None
373
+ else {}
374
+ )
375
+ kernel_runtime = await bootstrap_agent_kernel_runtime_from_env(
376
+ adapter_provider=adapter_provider,
377
+ runtime_executor=config.runtime_executor,
378
+ launch_context=config.launch_context,
379
+ start_request_defaults=request_defaults,
380
+ session_service=state.resolve_session_service(),
381
+ )
382
+ app.state.agent_kernel_runtime = kernel_runtime
383
+ if kernel_runtime is not None:
384
+ # Kernel canonical events are the replay authority for the normal
385
+ # Session APIs as well. In memory/ephemeral mode bootstrap reuses
386
+ # the app-owned service above; in PostgreSQL mode it owns the
387
+ # durable service and the HTTP routes must adopt that exact one.
388
+ # Keeping two services made foreground SSE look correct while a
389
+ # later ListSessionEvents call returned an empty history forever.
390
+ kernel_session_service = kernel_runtime.config.session_service
391
+ if kernel_session_service is None: # pragma: no cover - defensive
392
+ raise RuntimeError("agent kernel runtime has no Session service")
393
+ state.session_service = kernel_session_service
343
394
  try:
344
395
  if state.a2a_bootstrap is not None:
345
396
  await state.a2a_bootstrap.start()
@@ -347,6 +398,10 @@ def create_runtime_app(
347
398
  finally:
348
399
  if state.a2a_bootstrap is not None:
349
400
  await state.a2a_bootstrap.stop()
401
+ if kernel_runtime is not None:
402
+ await kernel_runtime.close()
403
+ clear_agent_kernel_runtime()
404
+ _kernel_ingress.clear_agent_kernel()
350
405
  await shutdown_runtime_resources(state)
351
406
 
352
407
  app = FastAPI(
@@ -370,8 +425,68 @@ def create_runtime_app(
370
425
  backend=state.describe_session_backend(),
371
426
  ),
372
427
  ):
373
- # 保持旧行为:前端入口禁缓存。
374
- response = await call_next(request)
428
+ # 提取 inbound OTel trace context(traceparent);无有效 inbound 时建一个
429
+ # 覆盖整个请求的 root server span,让 langchain/openinference 的 agent span 与
430
+ # tool 内 outbound(A2A)调用都挂到这条 trace 上(openinference 只在 LLM 调用
431
+ # 期间建 span,tool 执行时其 span 已 detach,需一个贯穿 span 兜底)。
432
+ # 只对 agent 执行类路径建 root span;session/UI 管理路径(GetAgentUiBootstrap/
433
+ # ListSessionMessages 等轮询)不建,避免一次问答产生一堆独立 trace。
434
+ try:
435
+ from opentelemetry import context as _otel_ctx
436
+ from opentelemetry import propagate
437
+ from opentelemetry import trace as _otel_trace
438
+
439
+ _carrier = dict(request.headers)
440
+ _parent = propagate.extract(_carrier)
441
+ _parent_span_ctx = _otel_trace.get_current_span(_parent).get_span_context()
442
+ except Exception:
443
+ logger.exception("failed to initialize request tracing; continuing without OTel")
444
+ response = await call_next(request)
445
+ else:
446
+ if _parent_span_ctx.is_valid:
447
+ try:
448
+ _token = _otel_ctx.attach(_parent)
449
+ except Exception:
450
+ logger.exception(
451
+ "failed to attach inbound trace context; continuing without OTel"
452
+ )
453
+ response = await call_next(request)
454
+ else:
455
+ try:
456
+ response = await call_next(request)
457
+ finally:
458
+ try:
459
+ _otel_ctx.detach(_token)
460
+ except Exception:
461
+ logger.exception("failed to detach inbound trace context")
462
+ elif _is_agent_execution_path(request.url.path, request.method):
463
+ try:
464
+ _tracer = _otel_trace.get_tracer("ksadk.server")
465
+ _span_scope = _tracer.start_as_current_span(
466
+ f"{request.method} {request.url.path}"
467
+ )
468
+ _span_scope.__enter__()
469
+ except Exception:
470
+ logger.exception(
471
+ "failed to start request span; continuing without OTel"
472
+ )
473
+ response = await call_next(request)
474
+ else:
475
+ try:
476
+ response = await call_next(request)
477
+ except BaseException as exc:
478
+ try:
479
+ _span_scope.__exit__(type(exc), exc, exc.__traceback__)
480
+ except Exception:
481
+ logger.exception("failed to close request span after handler error")
482
+ raise
483
+ else:
484
+ try:
485
+ _span_scope.__exit__(None, None, None)
486
+ except Exception:
487
+ logger.exception("failed to close request span")
488
+ else:
489
+ response = await call_next(request)
375
490
  path = request.url.path
376
491
  if path == "/" or path.endswith(".html"):
377
492
  response.headers["Cache-Control"] = "no-cache, no-store, must-revalidate"
@@ -415,67 +530,58 @@ def create_runtime_app(
415
530
  return app
416
531
 
417
532
 
418
- class _LazyRunnerProxy:
419
- """把 app.state 的 runner 以惰性方式暴露给 A2A executor/adapter。
533
+ def _kernel_adapter_provider(
534
+ config: RuntimeAppConfig,
535
+ ) -> Callable[[], RuntimeAdapter] | None:
536
+ """Return the adapter source used by the durable kernel runtime.
420
537
 
421
- 兼容壳常在 factory 建 app 后才 ``set_runner`` 写入真实 runner,因此不能在装配期
422
- 固化 runner 引用。代理在每次调用时从 ``state`` 解析真实 runner 并懒加载,
423
- 接口与 ``BaseRunner`` 对齐(load_agent / stream / invoke,其余属性经 __getattr__
424
- 转发)。
538
+ Hosted startup deliberately fails when neither a provider nor a Runtime
539
+ launch context is available. It must never construct an unrelated local
540
+ adapter merely to make the ingress look healthy.
425
541
  """
426
542
 
427
- def __init__(self, state: RuntimeAppState) -> None:
428
- self.__dict__["_state"] = state
429
-
430
- def _real(self) -> BaseRunner:
431
- state: RuntimeAppState = self.__dict__["_state"]
432
- runner = state.runner
433
- if runner is None:
434
- raise RuntimeError("A2A: runner 尚未装配(set_runner 未调用)")
435
- if not state.runner_loaded:
436
- runner.load_agent()
437
- state.runner_loaded = True
438
- return runner
439
-
440
- def load_agent(self) -> BaseRunner:
441
- return self._real()
442
-
443
- def stream(self, input_data: Any) -> Any:
444
- # 与普通方法(非 async def)返回真实 runner.stream 的结果(async gen 或 coroutine),
445
- # 由 RunnerRuntimeAdapter/executor 按既有分支处理。
446
- return self._real().stream(input_data)
447
-
448
- async def invoke(self, input_data: Any) -> Any:
449
- return await self._real().invoke(input_data)
450
-
451
- def __getattr__(self, name: str) -> Any:
452
- return getattr(self._real(), name)
543
+ if config.kernel_adapter_provider is not None:
544
+ return config.kernel_adapter_provider
545
+ if config.a2a_runtime_adapter is not None:
546
+ return lambda: config.a2a_runtime_adapter
547
+ if config.runtime_executor is not None and config.launch_context is not None:
548
+ return lambda: config.runtime_executor.create_adapter(config.launch_context)
549
+ return None
453
550
 
454
551
 
455
552
  def _wire_a2a_if_enabled(app: FastAPI, state: RuntimeAppState, config: RuntimeAppConfig) -> None:
456
- """契约 §8:``config.a2a.enabled`` 时把 A2A 协议端点装配进 app(数据面)。
553
+ """Mount A2A with an explicitly injected RuntimeAdapter.
457
554
 
458
- runner 经 :class:`_LazyRunnerProxy` 惰性解析;RuntimeAdapter 用通用
459
- ``RunnerRuntimeAdapter``(经 P0-2 后 cancel 走真实 asyncio 任务中断)。
555
+ The server composition root never resolves or wraps a Runner. Framework
556
+ internals may still use one behind their adapter factory, but A2A only sees
557
+ the frozen RuntimeAdapter contract.
460
558
  """
461
559
  a2a_cfg = config.a2a
462
560
  if a2a_cfg is None:
463
561
  return
562
+ from ksadk.managed_a2a_card import ManagedA2ACardMount
563
+
564
+ if isinstance(a2a_cfg, ManagedA2ACardMount):
565
+ a2a_cfg.mount(app)
566
+ state.a2a_bootstrap = a2a_cfg
567
+ logger.info(
568
+ "managed A2A discovery card mounted(agent_name=%s base_url=%s)",
569
+ a2a_cfg.config.agent_name,
570
+ a2a_cfg.config.base_url,
571
+ )
572
+ return
464
573
  from ksadk.a2a.bootstrap import AgentEngineA2ABootstrap
465
574
 
466
- if isinstance(a2a_cfg, AgentEngineA2ABootstrap):
467
- from ksadk.runtime.runner_adapter import RunnerRuntimeAdapter
575
+ adapter = config.a2a_runtime_adapter
576
+ if adapter is None:
577
+ raise ValueError("A2A requires an explicitly injected RuntimeAdapter")
578
+ runtime_type = adapter.runtime.runtime_type or config.runtime_type
468
579
 
469
- proxy = _LazyRunnerProxy(state)
470
- runtime_adapter = config.runtime_adapter or RunnerRuntimeAdapter(
471
- cast("BaseRunner", proxy),
472
- runtime_type=config.runtime_type,
473
- )
580
+ if isinstance(a2a_cfg, AgentEngineA2ABootstrap):
474
581
  server = a2a_cfg.mount(
475
582
  app,
476
- runner=proxy,
477
- runtime_adapter=runtime_adapter,
478
- runtime_type=config.runtime_type,
583
+ runtime_adapter=adapter,
584
+ runtime_type=runtime_type,
479
585
  )
480
586
  state.a2a_bootstrap = a2a_cfg
481
587
  state.a2a_server = server
@@ -489,12 +595,9 @@ def _wire_a2a_if_enabled(app: FastAPI, state: RuntimeAppState, config: RuntimeAp
489
595
  return
490
596
  from ksadk.a2a.routes import add_a2a_protocol_routes
491
597
  from ksadk.a2a.task_adapter import A2ARuntimeTaskAdapter
492
- from ksadk.runtime.runner_adapter import RunnerRuntimeAdapter
493
598
 
494
- proxy = _LazyRunnerProxy(state)
495
- adapter = RunnerRuntimeAdapter(cast("BaseRunner", proxy), runtime_type=config.runtime_type)
496
- task_adapter = A2ARuntimeTaskAdapter(adapter, runtime_type=config.runtime_type)
497
- server = add_a2a_protocol_routes(app, proxy, a2a_cfg, task_adapter=task_adapter)
599
+ task_adapter = A2ARuntimeTaskAdapter(adapter, runtime_type=runtime_type)
600
+ server = add_a2a_protocol_routes(app, a2a_cfg, task_adapter=task_adapter)
498
601
  state.a2a_server = server
499
602
  logger.info("A2A 协议端点已装配进 runtime app(agent=%s)", a2a_cfg.agent_name)
500
603
 
@@ -517,7 +620,8 @@ def _wire_agui_if_enabled(app: FastAPI, state: RuntimeAppState, config: RuntimeA
517
620
  from ksadk.events.store import RuntimeEventStore
518
621
  from ksadk.server.routes import dependencies as route_dependencies
519
622
 
520
- proxy = _LazyRunnerProxy(state)
623
+ if state.executor is None or state.launch_context is None:
624
+ raise ValueError("AG-UI requires RuntimeExecutor and RuntimeLaunchContext")
521
625
 
522
626
  class _AutoSessionRuntimeEventStore:
523
627
  """Create a session on first AG-UI event when HttpAgent starts fresh."""
@@ -526,15 +630,17 @@ def _wire_agui_if_enabled(app: FastAPI, state: RuntimeAppState, config: RuntimeA
526
630
  self._service = service
527
631
  self._store = RuntimeEventStore(service)
528
632
 
529
- async def append_one(self, event: Any) -> Any:
530
- existing = await self._service.get_session(event.session_id)
633
+ async def append_one(self, session_id: str, event: Any) -> Any:
634
+ existing = await self._service.get_session(session_id)
531
635
  if existing is None:
636
+ metadata = getattr(event, "source", None)
637
+ meta = metadata.metadata if metadata is not None else {}
532
638
  await self._service.create_session(
533
- event.agent_id,
534
- event.user_id,
535
- event.session_id,
639
+ str(meta.get("agent_id") or "agent"),
640
+ str(meta.get("user_id") or "user"),
641
+ session_id,
536
642
  )
537
- return await self._store.append_one(event)
643
+ return await self._store.append_one(session_id, event)
538
644
 
539
645
  async def reserve_once(self, event: Any) -> Any:
540
646
  existing = await self._service.get_session(event.session_id)
@@ -551,7 +657,8 @@ def _wire_agui_if_enabled(app: FastAPI, state: RuntimeAppState, config: RuntimeA
551
657
 
552
658
  agent = add_ksadk_agui_endpoint(
553
659
  app,
554
- cast("BaseRunner", proxy),
660
+ state.executor,
661
+ state.launch_context,
555
662
  agui_cfg,
556
663
  event_store_factory=lambda: _AutoSessionRuntimeEventStore(
557
664
  route_dependencies.resolve_session_service()
@@ -563,51 +670,6 @@ def _wire_agui_if_enabled(app: FastAPI, state: RuntimeAppState, config: RuntimeA
563
670
  logger.info("AG-UI endpoint mounted at %s", agui_cfg.path)
564
671
 
565
672
 
566
- def wire_default_agui_for_runner(state: RuntimeAppState, runner: BaseRunner) -> None:
567
- """Mount AG-UI for legacy ``app`` + ``set_runner`` production entrypoints.
568
-
569
- Those entrypoints create the FastAPI app before the framework runner exists.
570
- Mounting immediately after ``set_runner`` is still startup-time wiring. New
571
- protocol routes are moved ahead of the static catch-all to preserve routing
572
- order exactly as the normal factory path does.
573
- """
574
- if state.app is None or state.agui_agent is not None:
575
- return
576
-
577
- from ksadk.agui.config import default_agui_config
578
-
579
- agui_config = default_agui_config(runner)
580
- if not agui_config.enabled:
581
- return
582
-
583
- app = state.app
584
- routes = app.router.routes
585
- previous_count = len(routes)
586
- _wire_agui_if_enabled(
587
- app,
588
- state,
589
- RuntimeAppConfig(
590
- runner=runner,
591
- runtime_type=agui_config.runtime_type,
592
- route_groups={"agui"},
593
- agui=agui_config,
594
- ),
595
- )
596
- new_routes = routes[previous_count:]
597
- if not new_routes:
598
- return
599
- del routes[previous_count:]
600
- catch_all_index = next(
601
- (
602
- index
603
- for index, route in enumerate(routes)
604
- if getattr(route, "path", None) == "/{requested_path:path}"
605
- ),
606
- len(routes),
607
- )
608
- routes[catch_all_index:catch_all_index] = new_routes
609
-
610
-
611
673
  __all__ = [
612
674
  "ALL_GROUPS",
613
675
  "CONTROL_PLANE_GROUPS",
@@ -617,8 +679,7 @@ __all__ = [
617
679
  "bind_runtime_state",
618
680
  "StreamRegistry",
619
681
  "create_runtime_app",
620
- "get_runner",
682
+ "get_runtime_execution",
621
683
  "get_state",
622
684
  "set_fallback_state",
623
- "wire_default_agui_for_runner",
624
685
  ]