agentengine-sdk-python 0.7.0__py3-none-any.whl → 0.8.0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (371) hide show
  1. {agentengine_sdk_python-0.7.0.dist-info → agentengine_sdk_python-0.8.0.dist-info}/METADATA +36 -20
  2. agentengine_sdk_python-0.8.0.dist-info/RECORD +578 -0
  3. ksadk/a2a/__init__.py +178 -11
  4. ksadk/a2a/bootstrap.py +334 -0
  5. ksadk/a2a/card.py +120 -0
  6. ksadk/a2a/context_store.py +203 -0
  7. ksadk/a2a/control_plane.py +818 -0
  8. ksadk/a2a/credential.py +99 -0
  9. ksadk/a2a/event_adapter.py +149 -0
  10. ksadk/a2a/executor.py +406 -89
  11. ksadk/a2a/external_transport.py +516 -0
  12. ksadk/a2a/identity.py +304 -0
  13. ksadk/a2a/ids.py +22 -0
  14. ksadk/a2a/langgraph.py +285 -0
  15. ksadk/a2a/resume_store.py +201 -0
  16. ksadk/a2a/routes.py +105 -0
  17. ksadk/a2a/server.py +107 -60
  18. ksadk/a2a/space_client.py +1101 -0
  19. ksadk/a2a/task_adapter.py +423 -0
  20. ksadk/a2a/task_event_dispatcher.py +167 -0
  21. ksadk/a2a/task_event_outbox.py +326 -0
  22. ksadk/a2a/task_store.py +206 -0
  23. ksadk/a2ui/__init__.py +27 -0
  24. ksadk/a2ui/core.py +186 -0
  25. ksadk/a2ui/models.py +166 -0
  26. ksadk/a2ui/renderer.py +198 -0
  27. ksadk/agui/__init__.py +9 -0
  28. ksadk/agui/a2ui_projection.py +92 -0
  29. ksadk/agui/agent.py +857 -0
  30. ksadk/agui/config.py +86 -0
  31. ksadk/agui/routes.py +55 -0
  32. ksadk/api/client.py +233 -191
  33. ksadk/builders/__init__.py +2 -0
  34. ksadk/builders/base.py +16 -14
  35. ksadk/builders/code_builder.py +318 -236
  36. ksadk/builders/container_builder.py +187 -167
  37. ksadk/builders/framework_requirements.py +29 -11
  38. ksadk/builders/ks3_uploader.py +58 -27
  39. ksadk/builders/managed_runtime_builder.py +145 -0
  40. ksadk/builders/mcp_builder.py +91 -92
  41. ksadk/builders/requirements_utils.py +1 -5
  42. ksadk/cli/__init__.py +89 -171
  43. ksadk/cli/cmd_a2a.py +254 -70
  44. ksadk/cli/cmd_agent.py +19 -5
  45. ksadk/cli/cmd_build.py +158 -29
  46. ksadk/cli/cmd_completion.py +47 -35
  47. ksadk/cli/cmd_config.py +267 -198
  48. ksadk/cli/cmd_create.py +500 -720
  49. ksadk/cli/cmd_dashboard.py +120 -45
  50. ksadk/cli/cmd_deploy.py +117 -58
  51. ksadk/cli/cmd_destroy.py +44 -14
  52. ksadk/cli/cmd_files.py +63 -24
  53. ksadk/cli/cmd_hermes.py +168 -89
  54. ksadk/cli/cmd_invoke.py +184 -122
  55. ksadk/cli/cmd_launch.py +64 -28
  56. ksadk/cli/cmd_mcp.py +98 -64
  57. ksadk/cli/cmd_model.py +14 -5
  58. ksadk/cli/cmd_openclaw.py +483 -227
  59. ksadk/cli/cmd_replay.py +71 -0
  60. ksadk/cli/cmd_run.py +33 -10
  61. ksadk/cli/cmd_status.py +80 -31
  62. ksadk/cli/cmd_version.py +20 -13
  63. ksadk/cli/cmd_web.py +89 -13
  64. ksadk/cli/deploy_utils.py +20 -20
  65. ksadk/cli/dry_run.py +5 -3
  66. ksadk/cli/error_utils.py +37 -12
  67. ksadk/cli/global_options.py +1 -2
  68. ksadk/cli/local_runtime.py +1 -2
  69. ksadk/cli/model_catalog.py +6 -2
  70. ksadk/cli/network_options.py +34 -14
  71. ksadk/cli/resource_common.py +6 -2
  72. ksadk/cli/storage.py +0 -1
  73. ksadk/cli/ui.py +5 -3
  74. ksadk/cli/workflow_common.py +51 -17
  75. ksadk/codex/__init__.py +12 -0
  76. ksadk/codex/client.py +408 -0
  77. ksadk/codex/phase.py +143 -0
  78. ksadk/codex/runtime.py +449 -0
  79. ksadk/common/aicp_env.py +0 -1
  80. ksadk/common/auth.py +2 -2
  81. ksadk/common/constants.py +1 -3
  82. ksadk/common/llm_utils.py +17 -13
  83. ksadk/compat/__init__.py +5 -0
  84. ksadk/compat/adk_compat.py +200 -0
  85. ksadk/compat/copilotkit_a2ui.py +330 -0
  86. ksadk/configs/__init__.py +12 -12
  87. ksadk/configs/env_registry.py +500 -100
  88. ksadk/configs/global_config.py +2 -1
  89. ksadk/configs/settings.py +151 -124
  90. ksadk/conversations/__init__.py +7 -5
  91. ksadk/conversations/attachment_storage.py +16 -11
  92. ksadk/conversations/attachments.py +44 -36
  93. ksadk/conversations/compaction_pipeline.py +12 -12
  94. ksadk/conversations/compaction_prompt.py +9 -5
  95. ksadk/conversations/context.py +221 -6
  96. ksadk/conversations/message_projection.py +438 -51
  97. ksadk/conversations/model_context.py +12 -6
  98. ksadk/conversations/model_options.py +0 -1
  99. ksadk/conversations/normalize.py +20 -16
  100. ksadk/conversations/reasoning_markup.py +1 -1
  101. ksadk/conversations/runtime.py +339 -5255
  102. ksadk/conversations/runtime_compaction.py +333 -0
  103. ksadk/conversations/runtime_constants.py +27 -0
  104. ksadk/conversations/runtime_governance.py +185 -0
  105. ksadk/conversations/runtime_input.py +652 -0
  106. ksadk/conversations/runtime_invocation.py +395 -0
  107. ksadk/conversations/runtime_metadata.py +475 -0
  108. ksadk/conversations/runtime_observability.py +355 -0
  109. ksadk/conversations/runtime_payloads.py +272 -0
  110. ksadk/conversations/runtime_persistence.py +440 -0
  111. ksadk/conversations/runtime_preparation.py +418 -0
  112. ksadk/conversations/runtime_resume.py +816 -0
  113. ksadk/conversations/runtime_stream_events.py +902 -0
  114. ksadk/conversations/runtime_streaming.py +547 -0
  115. ksadk/conversations/semantic_summary.py +17 -5
  116. ksadk/conversations/session_title.py +6 -3
  117. ksadk/deployment/__init__.py +15 -16
  118. ksadk/deployment/agent_access.py +12 -23
  119. ksadk/deployment/base.py +51 -38
  120. ksadk/deployment/manager.py +63 -65
  121. ksadk/deployment/providers/serverless.py +309 -202
  122. ksadk/deployment/registry.py +38 -32
  123. ksadk/deployment/state.py +11 -11
  124. ksadk/deployment/ui_config.py +1 -1
  125. ksadk/detection/__init__.py +1 -1
  126. ksadk/detection/detector.py +146 -83
  127. ksadk/detection/mcp_detector.py +9 -6
  128. ksadk/events/__init__.py +25 -0
  129. ksadk/events/parser.py +191 -0
  130. ksadk/events/replay.py +37 -0
  131. ksadk/events/runtime_event.py +264 -0
  132. ksadk/events/store.py +317 -0
  133. ksadk/harness/__init__.py +34 -0
  134. ksadk/harness/app.py +278 -0
  135. ksadk/harness/config.py +181 -0
  136. ksadk/harness/reasoner.py +105 -0
  137. ksadk/harness/runner.py +211 -0
  138. ksadk/harness/sandbox.py +141 -0
  139. ksadk/harness/tools.py +222 -0
  140. ksadk/hermes_terminal.py +23 -12
  141. ksadk/identity/resolver.py +15 -9
  142. ksadk/ids.py +32 -0
  143. ksadk/knowledge_base/adk_tool.py +1 -1
  144. ksadk/knowledge_base/client.py +23 -29
  145. ksadk/managed_runtime.py +188 -0
  146. ksadk/markdown.py +5 -2
  147. ksadk/mcp_runtime/__init__.py +9 -6
  148. ksadk/memory/__init__.py +1 -1
  149. ksadk/memory/adk/__init__.py +2 -0
  150. ksadk/memory/adk/backends/base_ltm_backend.py +2 -6
  151. ksadk/memory/adk/backends/http_ltm_backend.py +13 -21
  152. ksadk/memory/adk/backends/inmemory_ltm_backend.py +7 -13
  153. ksadk/memory/adk/backends/sdk_ltm_backend.py +26 -33
  154. ksadk/memory/adk/long_term_memory.py +31 -35
  155. ksadk/memory/adk/resilient_session_service.py +4 -5
  156. ksadk/memory/adk/short_term_memory.py +12 -21
  157. ksadk/memory/adk_tool.py +3 -2
  158. ksadk/memory/backends/base.py +19 -19
  159. ksadk/memory/backends/memory.py +24 -25
  160. ksadk/memory/backends/redis.py +31 -30
  161. ksadk/memory/langchain_tool.py +2 -1
  162. ksadk/memory/manager.py +52 -47
  163. ksadk/memory/service.py +10 -8
  164. ksadk/model_policy.py +15 -7
  165. ksadk/model_proxy/__init__.py +51 -0
  166. ksadk/model_proxy/bootstrap.py +80 -0
  167. ksadk/model_proxy/cache.py +165 -0
  168. ksadk/model_proxy/config.py +45 -0
  169. ksadk/model_proxy/demo_webui.py +115 -0
  170. ksadk/model_proxy/detect.py +145 -0
  171. ksadk/model_proxy/gate.py +68 -0
  172. ksadk/model_proxy/namespace.py +173 -0
  173. ksadk/model_proxy/protocol_proxy.py +22 -0
  174. ksadk/model_proxy/server.py +300 -0
  175. ksadk/model_proxy/transform.py +691 -0
  176. ksadk/openclaw_gateway.py +29 -14
  177. ksadk/runners/adk_runner.py +345 -120
  178. ksadk/runners/base_runner.py +46 -29
  179. ksadk/runners/codex_runner.py +132 -0
  180. ksadk/runners/deepagents_runner.py +0 -1
  181. ksadk/runners/factory.py +17 -5
  182. ksadk/runners/langchain_runner.py +29 -742
  183. ksadk/runners/langgraph_runner.py +352 -90
  184. ksadk/runners/patch_langchain.py +16 -16
  185. ksadk/runners/remote_runner.py +134 -33
  186. ksadk/runners/usage_accumulator.py +1 -0
  187. ksadk/runners/utils/langfuse.py +3 -3
  188. ksadk/runners/utils/loader.py +7 -7
  189. ksadk/runtime/__init__.py +41 -0
  190. ksadk/runtime/adapter.py +345 -0
  191. ksadk/runtime/framework_adapters.py +124 -0
  192. ksadk/runtime/preprocessing.py +118 -0
  193. ksadk/runtime/runner_adapter.py +873 -0
  194. ksadk/runtime_context.py +18 -3
  195. ksadk/runtime_state.py +0 -1
  196. ksadk/sandbox/__init__.py +4 -1
  197. ksadk/sandbox/backends/__init__.py +4 -1
  198. ksadk/sandbox/backends/e2b.py +13 -5
  199. ksadk/sandbox/backends/local_process.py +11 -3
  200. ksadk/sandbox/base.py +10 -15
  201. ksadk/sandbox/factory.py +14 -4
  202. ksadk/sandbox/registry.py +57 -6
  203. ksadk/server/api_models.py +15 -5
  204. ksadk/server/app.py +455 -3885
  205. ksadk/server/composition.py +21 -0
  206. ksadk/server/factory.py +624 -0
  207. ksadk/server/routes/__init__.py +1 -0
  208. ksadk/server/routes/checkpoint_resolution.py +116 -0
  209. ksadk/server/routes/common.py +713 -0
  210. ksadk/server/routes/control.py +327 -0
  211. ksadk/server/routes/dependencies.py +98 -0
  212. ksadk/server/routes/misc.py +448 -0
  213. ksadk/server/routes/models.py +443 -0
  214. ksadk/server/routes/openai_compat.py +207 -0
  215. ksadk/server/routes/projection.py +795 -0
  216. ksadk/server/routes/routers.py +52 -0
  217. ksadk/server/routes/run.py +726 -0
  218. ksadk/server/routes/sessions.py +649 -0
  219. ksadk/server/routes/streaming.py +223 -0
  220. ksadk/server/routes/workspace.py +381 -0
  221. ksadk/server/static/assets/{ArtifactsPanel-D-SSn2ee.js → ArtifactsPanel-Cjnqt-8W.js} +1 -1
  222. ksadk/server/static/assets/CodeBlock-BqyqZfuB.js +9 -0
  223. ksadk/server/static/assets/MathMessageMarkdown-BpH7jiFM.js +8 -0
  224. ksadk/server/static/assets/MermaidBlock-DWuxETaJ.js +303 -0
  225. ksadk/server/static/assets/NativeTerminalPanel-MDTopWMO.js +1 -0
  226. ksadk/server/static/assets/{arc-BA13sHc9.js → arc-CFKwSk_B.js} +1 -1
  227. ksadk/server/static/assets/architecture-7EHR7CIX-CynqOWjZ.js +1 -0
  228. ksadk/server/static/assets/{architectureDiagram-3BPJPVTR-DzJzgVoL.js → architectureDiagram-3BPJPVTR-Dej8jX8c.js} +1 -1
  229. ksadk/server/static/assets/{blockDiagram-GPEHLZMM-UTdVcZhn.js → blockDiagram-GPEHLZMM-1F64jqvy.js} +1 -1
  230. ksadk/server/static/assets/{c4Diagram-AAUBKEIU-Dix0GD4m.js → c4Diagram-AAUBKEIU-9q7AUAKb.js} +1 -1
  231. ksadk/server/static/assets/channel-iUGv2N24.js +1 -0
  232. ksadk/server/static/assets/{chunk-2J33WTMH-C2JxuZ42.js → chunk-2J33WTMH-6qgwJm7Q.js} +1 -1
  233. ksadk/server/static/assets/{chunk-4BX2VUAB-Be57QPgD.js → chunk-4BX2VUAB-CsWIQRhc.js} +1 -1
  234. ksadk/server/static/assets/{chunk-55IACEB6-WjSuy4nv.js → chunk-55IACEB6-BK8paA20.js} +1 -1
  235. ksadk/server/static/assets/{chunk-727SXJPM-BOovP-b5.js → chunk-727SXJPM-B-JEhy7h.js} +1 -1
  236. ksadk/server/static/assets/{chunk-AQP2D5EJ-DOmZNmWj.js → chunk-AQP2D5EJ-DYBvMHAa.js} +1 -1
  237. ksadk/server/static/assets/{chunk-FMBD7UC4-DzwlodkU.js → chunk-FMBD7UC4-BGhvzDYt.js} +1 -1
  238. ksadk/server/static/assets/{chunk-ND2GUHAM-DMqAikEU.js → chunk-ND2GUHAM-D98vPd-E.js} +1 -1
  239. ksadk/server/static/assets/chunk-QZHKN3VN-YQIEXeF6.js +1 -0
  240. ksadk/server/static/assets/classDiagram-4FO5ZUOK-CDAUuoXK.js +1 -0
  241. ksadk/server/static/assets/classDiagram-v2-Q7XG4LA2-CDAUuoXK.js +1 -0
  242. ksadk/server/static/assets/{cose-bilkent-S5V4N54A-Zhy2GBnP.js → cose-bilkent-S5V4N54A-CX3yotHq.js} +1 -1
  243. ksadk/server/static/assets/{dagre-BM42HDAG-CbKrtIUz.js → dagre-BM42HDAG-C7TguAWo.js} +1 -1
  244. ksadk/server/static/assets/{diagram-2AECGRRQ-BRApgQRK.js → diagram-2AECGRRQ-Dd17_kws.js} +1 -1
  245. ksadk/server/static/assets/{diagram-5GNKFQAL-D0xbnDiK.js → diagram-5GNKFQAL-DVIClIil.js} +1 -1
  246. ksadk/server/static/assets/{diagram-KO2AKTUF-CVugVI9L.js → diagram-KO2AKTUF-Df_3gYQa.js} +1 -1
  247. ksadk/server/static/assets/{diagram-LMA3HP47-DozUGgee.js → diagram-LMA3HP47-BhLk6ZtA.js} +1 -1
  248. ksadk/server/static/assets/{diagram-OG6HWLK6-ZOYsKlru.js → diagram-OG6HWLK6-D4GNGvuu.js} +1 -1
  249. ksadk/server/static/assets/{dist-DmFaq_Iy.js → dist-6CVKuTAe.js} +1 -1
  250. ksadk/server/static/assets/{dist-8EEyGgDx.js → dist-BUHRxvDG.js} +1 -1
  251. ksadk/server/static/assets/{dist-B0NP_Z0z.js → dist-BZ9n9AjO.js} +1 -1
  252. ksadk/server/static/assets/{dist-DMezvBGJ.js → dist-BibcG1V9.js} +1 -1
  253. ksadk/server/static/assets/{dist-C3HIIaN5.js → dist-Bs-jQcRX.js} +1 -1
  254. ksadk/server/static/assets/{dist-BrCcQ47T.js → dist-C2xjE7cO.js} +1 -1
  255. ksadk/server/static/assets/{dist-Dp0k7bWI.js → dist-C7-3jInC.js} +1 -1
  256. ksadk/server/static/assets/{dist-D-xOD048.js → dist-C99THtIA.js} +1 -1
  257. ksadk/server/static/assets/{dist-CkEKJFtk.js → dist-CGcp2ex8.js} +1 -1
  258. ksadk/server/static/assets/{dist-DyOkZmze.js → dist-CVQRZjPu.js} +1 -1
  259. ksadk/server/static/assets/{dist-BssVmjIo.js → dist-Cf23NY4L.js} +1 -1
  260. ksadk/server/static/assets/{dist-BIJVDMuB.js → dist-CgF3fj15.js} +1 -1
  261. ksadk/server/static/assets/{dist-2hInLS_J.js → dist-Cwt7koer.js} +1 -1
  262. ksadk/server/static/assets/{dist-DyWsb78Q.js → dist-D82mtD2s.js} +1 -1
  263. ksadk/server/static/assets/{dist-D-JMdWPQ.js → dist-DF06ORQo.js} +1 -1
  264. ksadk/server/static/assets/{dist-BmlMPsCc.js → dist-DHn6nBzr.js} +1 -1
  265. ksadk/server/static/assets/{dist-gX6GOLKq.js → dist-Djgl2wVZ.js} +1 -1
  266. ksadk/server/static/assets/{dist-DpKtt4Bo.js → dist-DlzCRy0S.js} +1 -1
  267. ksadk/server/static/assets/{dist-8_SfK1IP.js → dist-DqNnNFrw.js} +1 -1
  268. ksadk/server/static/assets/{dist-D57wnGWd.js → dist-DyvYLMW9.js} +1 -1
  269. ksadk/server/static/assets/{dist-CPBtqRTW.js → dist-eoW6tZXA.js} +1 -1
  270. ksadk/server/static/assets/{dist-DL_NKc_z.js → dist-ivOya1LD.js} +1 -1
  271. ksadk/server/static/assets/{erDiagram-TEJ5UH35-Bk-9bgE5.js → erDiagram-TEJ5UH35-CnfRcY2M.js} +1 -1
  272. ksadk/server/static/assets/eventmodeling-FCH6USID-ChYO-ijM.js +1 -0
  273. ksadk/server/static/assets/{flowDiagram-I6XJVG4X-Dn9kZVuZ.js → flowDiagram-I6XJVG4X-DGaJjGNJ.js} +1 -1
  274. ksadk/server/static/assets/{ganttDiagram-6RSMTGT7-BGxXlJqm.js → ganttDiagram-6RSMTGT7-DpCoB2g9.js} +1 -1
  275. ksadk/server/static/assets/gitGraph-WXDBUCRP-BN_0Fk-j.js +1 -0
  276. ksadk/server/static/assets/{gitGraphDiagram-PVQCEYII-C7Q0X-wi.js → gitGraphDiagram-PVQCEYII-9IKVFBVT.js} +1 -1
  277. ksadk/server/static/assets/index-QSwCHuB8.js +177 -0
  278. ksadk/server/static/assets/index-jOPmTOZH.css +2 -0
  279. ksadk/server/static/assets/info-J43DQDTF-Cp6o3vId.js +1 -0
  280. ksadk/server/static/assets/{infoDiagram-5YYISTIA-BO_CSqq5.js → infoDiagram-5YYISTIA-CYIIsb8y.js} +1 -1
  281. ksadk/server/static/assets/{ishikawaDiagram-YF4QCWOH-eYLPLd46.js → ishikawaDiagram-YF4QCWOH-DLOHGvWw.js} +1 -1
  282. ksadk/server/static/assets/{journeyDiagram-JHISSGLW-De9geSb0.js → journeyDiagram-JHISSGLW-BIzKeejT.js} +1 -1
  283. ksadk/server/static/assets/{kanban-definition-UN3LZRKU-Cs80kQto.js → kanban-definition-UN3LZRKU-BWHoFSw2.js} +1 -1
  284. ksadk/server/static/assets/{katex-DSrCFD8n.js → katex-DATssjp1.js} +1 -1
  285. ksadk/server/static/assets/{linear-CN9sbKTF.js → linear-CvMBw9cA.js} +1 -1
  286. ksadk/server/static/assets/{mermaid-parser.core-DlgSBU8l.js → mermaid-parser.core-mGAcEwcq.js} +2 -2
  287. ksadk/server/static/assets/{mindmap-definition-RKZ34NQL-9afz7Oug.js → mindmap-definition-RKZ34NQL-CSAQxEAe.js} +1 -1
  288. ksadk/server/static/assets/packet-YPE3B663-wQzct3cT.js +1 -0
  289. ksadk/server/static/assets/pie-LRSECV5Y-BgTQiv-9.js +1 -0
  290. ksadk/server/static/assets/{pieDiagram-4H26LBE5-DPv_VstN.js → pieDiagram-4H26LBE5-By-ra07M.js} +1 -1
  291. ksadk/server/static/assets/{quadrantDiagram-W4KKPZXB-o77wZ1XK.js → quadrantDiagram-W4KKPZXB-CxIR4JXI.js} +1 -1
  292. ksadk/server/static/assets/radar-GUYGQ44K-BIq5fXsn.js +1 -0
  293. ksadk/server/static/assets/{requirementDiagram-4Y6WPE33-BYVw81VC.js → requirementDiagram-4Y6WPE33-DpW90iu3.js} +1 -1
  294. ksadk/server/static/assets/{sankeyDiagram-5OEKKPKP-B7nZFMKT.js → sankeyDiagram-5OEKKPKP-DpGa6EAV.js} +1 -1
  295. ksadk/server/static/assets/{sequenceDiagram-3UESZ5HK-BGRRrFw5.js → sequenceDiagram-3UESZ5HK-NTKNGGe5.js} +1 -1
  296. ksadk/server/static/assets/{stateDiagram-AJRCARHV-BUfHCoPs.js → stateDiagram-AJRCARHV-DGpd9yFG.js} +1 -1
  297. ksadk/server/static/assets/stateDiagram-v2-BHNVJYJU-B3o579IQ.js +1 -0
  298. ksadk/server/static/assets/{timeline-definition-PNZ67QCA-FbCTGrf9.js → timeline-definition-PNZ67QCA-jqoYs3jQ.js} +1 -1
  299. ksadk/server/static/assets/treeView-BLDUP644-Dqi-E0EM.js +1 -0
  300. ksadk/server/static/assets/treemap-LRROVOQU-ClQP9CJ9.js +1 -0
  301. ksadk/server/static/assets/{vennDiagram-CIIHVFJN-DWgwtPsJ.js → vennDiagram-CIIHVFJN-l3Z7-wbP.js} +1 -1
  302. ksadk/server/static/assets/wardley-L42UT6IY-8XLvnNIs.js +1 -0
  303. ksadk/server/static/assets/{wardleyDiagram-YWT4CUSO-2x8G-tTM.js → wardleyDiagram-YWT4CUSO-BR54GPmr.js} +1 -1
  304. ksadk/server/static/assets/{xychartDiagram-2RQKCTM6-Drma3AYl.js → xychartDiagram-2RQKCTM6-SkiH8GsK.js} +1 -1
  305. ksadk/server/static/index.html +2 -2
  306. ksadk/server/terminal_sessions.py +111 -58
  307. ksadk/sessions/__init__.py +69 -19
  308. ksadk/sessions/base.py +31 -11
  309. ksadk/sessions/continuity.py +2 -3
  310. ksadk/sessions/in_memory.py +46 -2
  311. ksadk/sessions/local_service.py +148 -17
  312. ksadk/sessions/postgres_service.py +143 -25
  313. ksadk/sessions/resilient.py +36 -8
  314. ksadk/skills/models.py +17 -5
  315. ksadk/skills/package_store.py +5 -2
  316. ksadk/skills/runtime/agent.py +20 -5
  317. ksadk/skills/runtime/artifacts.py +1 -5
  318. ksadk/skills/runtime/backends/e2b.py +10 -4
  319. ksadk/skills/runtime/backends/local.py +15 -3
  320. ksadk/skills/runtime/base.py +1 -2
  321. ksadk/skills/runtime/executor.py +10 -3
  322. ksadk/skills/runtime/factory.py +4 -2
  323. ksadk/skills/runtime/loader.py +1 -2
  324. ksadk/skills/runtime/registry.py +15 -10
  325. ksadk/skills/runtime/request.py +3 -1
  326. ksadk/skills/service_client.py +38 -17
  327. ksadk/skills/tool_defs.py +15 -10
  328. ksadk/terminal_exec_policy.py +3 -4
  329. ksadk/tools/gateway.py +92 -15
  330. ksadk/tools/result_budget.py +12 -4
  331. ksadk/toolsets/__init__.py +134 -36
  332. ksadk/toolsets/platform.py +21 -5
  333. ksadk/toolsets/sandbox.py +82 -16
  334. ksadk/toolsets/skills.py +200 -39
  335. ksadk/toolsets/web.py +123 -26
  336. ksadk/toolsets/workspace.py +212 -101
  337. ksadk/tracing/exporters/inmemory_exporter.py +62 -51
  338. ksadk/tracing/exporters/langfuse_exporter.py +91 -76
  339. ksadk/tracing/setup.py +69 -53
  340. ksadk/tracing/span_utils.py +5 -2
  341. ksadk/tui/loop.py +78 -30
  342. ksadk/tui/stream_render.py +1 -0
  343. ksadk/ui_config.py +5 -3
  344. ksadk/version.py +1 -1
  345. ksadk_runtime_common/schemas/runtime_event_v1.json +95 -0
  346. agentengine_sdk_python-0.7.0.dist-info/RECORD +0 -482
  347. ksadk/server/static/assets/CodeBlock-P16VOLYi.js +0 -9
  348. ksadk/server/static/assets/MathMessageMarkdown-CdGiQWHR.js +0 -8
  349. ksadk/server/static/assets/MermaidBlock-IOcal8cm.js +0 -303
  350. ksadk/server/static/assets/NativeTerminalPanel-DGSDWsei.js +0 -1
  351. ksadk/server/static/assets/architecture-7EHR7CIX-BvUlsA6l.js +0 -1
  352. ksadk/server/static/assets/channel-CTuydARX.js +0 -1
  353. ksadk/server/static/assets/chunk-QZHKN3VN-BnCydivS.js +0 -1
  354. ksadk/server/static/assets/classDiagram-4FO5ZUOK-BNHg45Be.js +0 -1
  355. ksadk/server/static/assets/classDiagram-v2-Q7XG4LA2-BNHg45Be.js +0 -1
  356. ksadk/server/static/assets/eventmodeling-FCH6USID-DsAgWnlf.js +0 -1
  357. ksadk/server/static/assets/gitGraph-WXDBUCRP-BIao9Yjg.js +0 -1
  358. ksadk/server/static/assets/index-C00Lwg3L.js +0 -165
  359. ksadk/server/static/assets/index-DAURbCsP.css +0 -1
  360. ksadk/server/static/assets/info-J43DQDTF-CyipqGxU.js +0 -1
  361. ksadk/server/static/assets/packet-YPE3B663-CGkyRxlg.js +0 -1
  362. ksadk/server/static/assets/pie-LRSECV5Y-M0uWAf4n.js +0 -1
  363. ksadk/server/static/assets/radar-GUYGQ44K-Bdbm24-x.js +0 -1
  364. ksadk/server/static/assets/stateDiagram-v2-BHNVJYJU-8xBN_gLM.js +0 -1
  365. ksadk/server/static/assets/treeView-BLDUP644-npMo0ak1.js +0 -1
  366. ksadk/server/static/assets/treemap-LRROVOQU-CHdzrrdo.js +0 -1
  367. ksadk/server/static/assets/wardley-L42UT6IY-BEQz7wyy.js +0 -1
  368. {agentengine_sdk_python-0.7.0.dist-info → agentengine_sdk_python-0.8.0.dist-info}/WHEEL +0 -0
  369. {agentengine_sdk_python-0.7.0.dist-info → agentengine_sdk_python-0.8.0.dist-info}/entry_points.txt +0 -0
  370. {agentengine_sdk_python-0.7.0.dist-info → agentengine_sdk_python-0.8.0.dist-info}/licenses/LICENSE +0 -0
  371. {agentengine_sdk_python-0.7.0.dist-info → agentengine_sdk_python-0.8.0.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,345 @@
1
+ """RuntimeAdapter 平台接口 (goal-03 / G0.3 冻结稿)。
2
+
3
+ **只做签名与语义冻结,不实现具体 adapter**(具体 adapter 是后续 A4/A6,如 ADK/LangGraph
4
+ adapter)。本模块定义三层结构与六动词签名,供 Runtime 产生端、server 持久化、A2A
5
+ 真实 cancel 等共同消费。
6
+
7
+ 结构(H2 §4.2):
8
+
9
+ - :class:`BaseRuntime`:表达 Runtime **原生能力**(现有 ``BaseRunner`` 的演进目标,不推倒)。
10
+ - :class:`RuntimeAdapter`:把原生能力映射为**平台接口**(六动词)。
11
+ - :class:`RuntimeRegistry`:按 ``runtime_type`` 注册 adapter(替代 ``runners/factory.py``
12
+ 的 if/elif 分发)。
13
+
14
+ 六动词语义契约(2026-07-21 友商代码核验,见 docstring 各处):
15
+
16
+ 1. ``stream`` 返回 :class:`~ksadk.events.runtime_event.RuntimeEvent` 事件流(对接 G0.2),
17
+ 模型 = **事件流 + 独立命令/恢复通道**:审批回包走 ``resume``/``submit``,不在事件流
18
+ 回写(非 duplex stream)——codex/ADK/LangGraph 都是这个模型。
19
+ 2. ``cancel`` 是状态机,返回 :class:`CancelResult` 枚举(不是 bool——Wegent 实测 bool
20
+ 区分不了"记 pending"和"真 interrupt")。
21
+ 3. ``resume`` 拆 :class:`ResumeTarget`(恢复目标)与 :class:`ResumePayload`(回包)两个
22
+ 参数,不混成 union(ADK 区分 invocation_id 目标 vs function response 回包;Codex 区分
23
+ resume_thread_id vs Op 回包)。
24
+ 4. ``checkpoint`` 粒度用 :class:`CheckpointCapability` 声明(不承诺所有 runtime 同等能力,
25
+ 诚实暴露 capability matrix)。
26
+ 5. ``start`` 带 session/tenant 维度(:class:`StartRequest` 的 ``user_id`` + ``session_id``),
27
+ 不只是 prompt。
28
+ """
29
+
30
+ from __future__ import annotations
31
+
32
+ from abc import ABC, abstractmethod
33
+ from enum import Enum
34
+ from typing import Any, AsyncIterator, Literal, Optional
35
+
36
+ from pydantic import BaseModel, ConfigDict, Field
37
+
38
+ from ksadk.events.runtime_event import RuntimeEvent
39
+
40
+ # ---------------------------------------------------------------------------
41
+ # cancel 状态机
42
+ # ---------------------------------------------------------------------------
43
+
44
+
45
+ class CancelResult(str, Enum):
46
+ """cancel 的结果状态机。
47
+
48
+ Wegent ``cancel()`` 实测:无活跃 turn 记 pending 也返回 true、成功 interrupt 也返回
49
+ true,**bool 区分不了两种结果**——因此必须用枚举显式区分。
50
+ """
51
+
52
+ INTERRUPTED_ACTIVE_TURN = "interrupted_active_turn"
53
+ """有活跃 turn,已真实 interrupt。"""
54
+
55
+ PENDING_CANCEL_RECORDED = "pending_cancel_recorded"
56
+ """无活跃 turn,已记录 pending cancel,下一个 turn 开始时被消费。"""
57
+
58
+ NOT_RUNNING = "not_running"
59
+ """目标不在运行(无可取消的活跃/pending run)。"""
60
+
61
+ FAILED = "failed"
62
+ """取消动作本身失败(如底层 runtime 报错)。"""
63
+
64
+
65
+ # ---------------------------------------------------------------------------
66
+ # resume 目标与回包(两件拆开的的事)
67
+ # ---------------------------------------------------------------------------
68
+
69
+
70
+ class ResumeTarget(BaseModel):
71
+ """恢复目标:回到哪里。
72
+
73
+ - ``invocation_id``:精确到某次调用(ADK forward-only resume)。
74
+ - ``thread_id``:某条会话线程(Codex resume_thread_id)。
75
+ - ``checkpoint_id``:某个 checkpoint(LangGraph time-travel)。
76
+ """
77
+
78
+ kind: Literal["invocation_id", "thread_id", "checkpoint_id"]
79
+ id: str
80
+
81
+
82
+ class ResumePayload(BaseModel):
83
+ """恢复回包:带着什么输入恢复(可为空——纯粹续跑)。
84
+
85
+ - ``tool_result``:工具执行结果(function response)。
86
+ - ``approval_decision``:审批决定(对应 ``approval.requested`` 的回包,走命令通道)。
87
+ - ``hitl_answer``:human-in-the-loop 回答。
88
+ - ``free_text``:自由文本输入。
89
+ """
90
+
91
+ kind: Literal["tool_result", "approval_decision", "hitl_answer", "free_text"]
92
+ call_id: Optional[str] = None
93
+ """对应的 ``approval.requested`` / ``tool.call`` 的 id(如有)。"""
94
+ data: Any = None
95
+
96
+
97
+ # ---------------------------------------------------------------------------
98
+ # checkpoint 能力声明
99
+ # ---------------------------------------------------------------------------
100
+
101
+
102
+ class CheckpointCapability(BaseModel):
103
+ """checkpoint 粒度声明。诚实暴露,不承诺所有 runtime 同等能力。
104
+
105
+ 与现有 ``BaseRunner.describe_checkpoint_capability`` 对齐演进。
106
+ """
107
+
108
+ supported: bool
109
+ granularity: Literal["delta", "snapshot", "none"]
110
+ """delta(增量)vs snapshot(快照)vs none。"""
111
+ rollback_scope: Literal["turn", "invocation", "none"]
112
+ """可按 turn 还是 invocation 回滚。"""
113
+ fork_supported: bool
114
+ """是否支持从某 checkpoint fork 出新分支。"""
115
+ durable: bool
116
+ """是否持久化(跨进程/重启保留)。"""
117
+ shared_across_pods: bool
118
+ """是否跨 pod 共享(K8s 多副本可读同一 checkpoint)。"""
119
+ reason: str = ""
120
+
121
+
122
+ class CheckpointDescriptor(BaseModel):
123
+ """一次 checkpoint 的描述(checkpoint 动词的返回值)。"""
124
+
125
+ checkpoint_id: str
126
+ invocation_id: str
127
+ capability: CheckpointCapability
128
+ ref: dict[str, Any] = Field(default_factory=dict)
129
+ """runtime 私有引用(如 LangGraph checkpoint 的 (thread_id, checkpoint_id) 元组)。"""
130
+
131
+
132
+ # ---------------------------------------------------------------------------
133
+ # start 请求与 run 句柄
134
+ # ---------------------------------------------------------------------------
135
+
136
+
137
+ CONVERSATION_PREPROCESSING_METADATA_KEY = "conversation_request"
138
+ """StartRequest metadata key for the shared conversation preprocessing contract."""
139
+
140
+
141
+ class ConversationPreprocessingRequest(BaseModel):
142
+ """Transport-neutral input for the existing conversation preprocessing path.
143
+
144
+ Protocol adapters keep their wire-specific fields out of the runner payload and
145
+ place the canonical conversation inputs here. ``RunnerRuntimeAdapter`` then
146
+ reuses the same history, attachment, model-policy, platform-context, ambient
147
+ KB/memory and tracing preparation as the normal RunAgent/Responses entrypoints.
148
+
149
+ The model is additive and allows unknown fields so a newer protocol adapter can
150
+ talk to an older runtime without losing forward-compatible metadata.
151
+ """
152
+
153
+ model_config = ConfigDict(extra="allow")
154
+
155
+ messages: list[dict[str, Any]] = Field(default_factory=list)
156
+ model_metadata: dict[str, Any] = Field(default_factory=dict)
157
+ model_options: dict[str, Any] = Field(default_factory=dict)
158
+ state_delta: dict[str, Any] = Field(default_factory=dict)
159
+ instructions: Optional[str] = None
160
+ request_metadata: dict[str, Any] = Field(default_factory=dict)
161
+ custom_metadata: dict[str, Any] = Field(default_factory=dict)
162
+ account_id: Optional[str] = None
163
+ response_id: Optional[str] = None
164
+
165
+
166
+ class StartRequest(BaseModel):
167
+ """start 的输入:带 session/tenant 维度,不只是 prompt。"""
168
+
169
+ input: Any
170
+ """用户消息或结构化输入。"""
171
+ user_id: str
172
+ session_id: str
173
+ agent_id: Optional[str] = None
174
+ model: Optional[str] = None
175
+ config: dict[str, Any] = Field(default_factory=dict)
176
+ metadata: dict[str, Any] = Field(default_factory=dict)
177
+
178
+ def conversation_preprocessing(self) -> Optional[ConversationPreprocessingRequest]:
179
+ """Return the opt-in shared preprocessing request, if one was supplied."""
180
+
181
+ raw = self.metadata.get(CONVERSATION_PREPROCESSING_METADATA_KEY)
182
+ if raw is None:
183
+ return None
184
+ return ConversationPreprocessingRequest.model_validate(raw)
185
+
186
+
187
+ class RunHandle(BaseModel):
188
+ """一次 run 的不透明句柄(start 返回,后续 stream/cancel/resume/checkpoint/close 用)。"""
189
+
190
+ run_id: str
191
+ """= invocation_id。"""
192
+ session_id: str
193
+ runtime_type: str
194
+ native_ref: dict[str, Any] = Field(default_factory=dict)
195
+ """adapter 私有引用(如 ADK 的 (app_name, user_id, session_id)、Codex 的 thread_ref)。"""
196
+
197
+
198
+ # ---------------------------------------------------------------------------
199
+ # BaseRuntime:Runtime 原生能力
200
+ # ---------------------------------------------------------------------------
201
+
202
+
203
+ class BaseRuntime(ABC):
204
+ """Runtime 原生能力面(现有 ``BaseRunner`` 的演进目标,不推倒)。
205
+
206
+ ``BaseRunner`` 的 ``request_cancel`` / ``describe_checkpoint_capability`` /
207
+ ``invoke`` / ``stream`` 是原生能力的现状;``BaseRuntime`` 是其平台化抽象。
208
+ 具体 runner(ADK/LangGraph/...)以 ``BaseRuntime`` 表达原生能力,再由
209
+ :class:`RuntimeAdapter` 映射为平台六动词。
210
+ """
211
+
212
+ runtime_type: str = "unknown"
213
+
214
+ @abstractmethod
215
+ def native_capabilities(self) -> dict[str, Any]:
216
+ """原生能力声明(cancel / checkpoint / resume / session continuity 等)。"""
217
+ raise NotImplementedError
218
+
219
+
220
+ # ---------------------------------------------------------------------------
221
+ # RuntimeAdapter:平台六动词
222
+ # ---------------------------------------------------------------------------
223
+
224
+
225
+ class RuntimeAdapter(ABC):
226
+ """把 :class:`BaseRuntime` 的原生能力映射为平台接口(六动词)。
227
+
228
+ 签名冻结:以下六个方法的名字、参数、返回类型在 v1 冻结,只允许 additive 演进
229
+ (新增方法/可选参数),不允许改既有签名。
230
+ """
231
+
232
+ def __init__(self, runtime: BaseRuntime) -> None:
233
+ self._runtime = runtime
234
+
235
+ @property
236
+ def runtime(self) -> BaseRuntime:
237
+ return self._runtime
238
+
239
+ @abstractmethod
240
+ async def start(self, request: StartRequest) -> RunHandle:
241
+ """启动一次 run,返回句柄。"""
242
+ raise NotImplementedError
243
+
244
+ @abstractmethod
245
+ def stream(self, handle: RunHandle) -> AsyncIterator[RuntimeEvent]:
246
+ """订阅 run 的结构化事件流(对接 G0.2 RuntimeEvent)。
247
+
248
+ 注意:这是**事件流 + 独立命令/恢复通道**模型——审批回包/工具结果走
249
+ :meth:`resume`,不在本事件流上回写(非 duplex stream)。
250
+ """
251
+ raise NotImplementedError
252
+
253
+ @abstractmethod
254
+ async def cancel(self, handle: RunHandle) -> CancelResult:
255
+ """请求取消。返回状态机结果;成功 cancel 级联丢弃该 turn 的 pending 审批。"""
256
+ raise NotImplementedError
257
+
258
+ @abstractmethod
259
+ async def resume(
260
+ self,
261
+ handle: RunHandle,
262
+ target: ResumeTarget,
263
+ payload: Optional[ResumePayload],
264
+ ) -> RunHandle:
265
+ """恢复 run。``target`` 是恢复目标,``payload`` 是回包(可为空)。"""
266
+ raise NotImplementedError
267
+
268
+ async def attach(self, handle: RunHandle) -> RunHandle:
269
+ """Attach a persisted handle in this process before ``resume``/``stream``.
270
+
271
+ A handle restored from durable task metadata is not evidence that the
272
+ underlying runner exists in this process. Adapters which support
273
+ cross-process recovery must implement this seam using their framework's
274
+ durable checkpoint/session API. The default deliberately fails closed.
275
+ """
276
+ raise RuntimeError(
277
+ f"{type(self).__name__} does not support attaching persisted run "
278
+ f"{handle.run_id!r}; durable runtime restore is unavailable"
279
+ )
280
+
281
+ def is_handle_attached(self, handle: RunHandle) -> bool:
282
+ """Return whether ``handle`` is already attached to this adapter process."""
283
+ return False
284
+
285
+ @abstractmethod
286
+ async def checkpoint(self, handle: RunHandle) -> CheckpointDescriptor:
287
+ """在当前位置创建 checkpoint,返回描述(粒度见 capability)。"""
288
+ raise NotImplementedError
289
+
290
+ @abstractmethod
291
+ async def close(self, handle: RunHandle) -> None:
292
+ """释放 run 持有的运行期资源。"""
293
+ raise NotImplementedError
294
+
295
+
296
+ # ---------------------------------------------------------------------------
297
+ # RuntimeRegistry
298
+ # ---------------------------------------------------------------------------
299
+
300
+
301
+ class RuntimeRegistry:
302
+ """按 ``runtime_type`` 注册/查找 :class:`RuntimeAdapter`。
303
+
304
+ 替代 ``runners/factory.py`` 的 if/elif 分发:新 runtime 通过 ``register``
305
+ 注册,不再改 factory 分支。
306
+ """
307
+
308
+ def __init__(self) -> None:
309
+ self._adapters: dict[str, type[RuntimeAdapter]] = {}
310
+
311
+ def register(self, runtime_type: str, adapter_cls: type[RuntimeAdapter]) -> None:
312
+ if not isinstance(runtime_type, str) or not runtime_type.strip():
313
+ raise ValueError("runtime_type 必须是非空字符串")
314
+ if not (isinstance(adapter_cls, type) and issubclass(adapter_cls, RuntimeAdapter)):
315
+ raise TypeError(f"adapter_cls 必须是 RuntimeAdapter 子类: {adapter_cls!r}")
316
+ self._adapters[runtime_type.strip()] = adapter_cls
317
+
318
+ def get(self, runtime_type: str) -> type[RuntimeAdapter]:
319
+ try:
320
+ return self._adapters[runtime_type]
321
+ except KeyError:
322
+ raise KeyError(
323
+ f"未注册的 runtime_type: {runtime_type!r}(已注册: {sorted(self._adapters)})"
324
+ ) from None
325
+
326
+ def create(self, runtime_type: str, runtime: BaseRuntime) -> RuntimeAdapter:
327
+ """按 runtime_type 实例化 adapter(注入原生 runtime)。"""
328
+ return self.get(runtime_type)(runtime)
329
+
330
+ def registered_types(self) -> list[str]:
331
+ return sorted(self._adapters)
332
+
333
+
334
+ __all__ = [
335
+ "BaseRuntime",
336
+ "CancelResult",
337
+ "CheckpointCapability",
338
+ "CheckpointDescriptor",
339
+ "ResumePayload",
340
+ "ResumeTarget",
341
+ "RunHandle",
342
+ "RuntimeAdapter",
343
+ "RuntimeRegistry",
344
+ "StartRequest",
345
+ ]
@@ -0,0 +1,124 @@
1
+ """ADK / LangGraph 两个框架的 RuntimeAdapter (goal-07)。
2
+
3
+ 在通用 :class:`~ksadk.runtime.runner_adapter.RunnerRuntimeAdapter` 之上,只声明
4
+ 框架差异(resume 目标 + checkpoint 粒度),诚实暴露,不开接口后门:
5
+
6
+ - ADK:**forward-only**,resume 经 ``invocation_id``;不支持 time-travel/fork。
7
+ - LangGraph:**time-travel**,resume 经 ``checkpoint_id``;可按 turn 回滚/fork。
8
+
9
+ 并用 :func:`build_default_registry` 注册进 G0.3 ``RuntimeRegistry``。
10
+ """
11
+
12
+ from __future__ import annotations
13
+
14
+ from typing import Optional
15
+
16
+ from ksadk.runners.base_runner import BaseRunner
17
+ from ksadk.runtime.adapter import (
18
+ CheckpointCapability,
19
+ ResumePayload,
20
+ ResumeTarget,
21
+ RunHandle,
22
+ RuntimeRegistry,
23
+ )
24
+ from ksadk.runtime.runner_adapter import RunnerRuntimeAdapter
25
+
26
+
27
+ class ADKRuntimeAdapter(RunnerRuntimeAdapter):
28
+ """ADK 框架 adapter(forward-only resume)。"""
29
+
30
+ def __init__(self, runner: BaseRunner) -> None:
31
+ super().__init__(runner, runtime_type="adk")
32
+
33
+ async def _resume_native(
34
+ self,
35
+ handle: RunHandle,
36
+ target: ResumeTarget,
37
+ payload: Optional[ResumePayload],
38
+ ) -> Optional[dict]:
39
+ # ADK forward-only:恢复目标 = invocation_id。注入 adk_runner 真消费的
40
+ # ``checkpoint_resume`` + ``framework_ref.adk.invocation_id`` → run_async(invocation_id)。
41
+ return {
42
+ "checkpoint_resume": True,
43
+ "run_id": target.id,
44
+ "framework_ref": {"adk": {"invocation_id": target.id}},
45
+ "input": payload.data if payload else None,
46
+ }
47
+
48
+ def _checkpoint_capability(self) -> CheckpointCapability:
49
+ capability = super()._checkpoint_capability()
50
+ if not capability.supported:
51
+ return capability
52
+ return capability.model_copy(
53
+ update={
54
+ "granularity": "delta",
55
+ "rollback_scope": "invocation",
56
+ "fork_supported": False,
57
+ }
58
+ )
59
+
60
+
61
+ class LangGraphRuntimeAdapter(RunnerRuntimeAdapter):
62
+ """LangGraph 框架 adapter(time-travel resume)。"""
63
+
64
+ def __init__(self, runner: BaseRunner) -> None:
65
+ super().__init__(runner, runtime_type="langgraph")
66
+
67
+ async def _resume_native(
68
+ self,
69
+ handle: RunHandle,
70
+ target: ResumeTarget,
71
+ payload: Optional[ResumePayload],
72
+ ) -> Optional[dict]:
73
+ if target.kind != "checkpoint_id":
74
+ raise ValueError(f"LangGraph resume requires checkpoint_id target, got {target.kind!r}")
75
+ known_checkpoint_ids = {
76
+ str(checkpoint_id)
77
+ for checkpoint_id in handle.native_ref.get("known_checkpoint_ids", [])
78
+ }
79
+ if target.id not in known_checkpoint_ids:
80
+ raise ValueError(f"checkpoint {target.id!r} does not belong to run {handle.run_id!r}")
81
+ if payload is not None and payload.call_id:
82
+ pending_approval_ids = {
83
+ str(call_id) for call_id in handle.native_ref.get("pending_approval_ids", [])
84
+ }
85
+ if payload.call_id not in pending_approval_ids:
86
+ raise ValueError(f"unknown interrupt {payload.call_id!r}")
87
+ # LangGraph time-travel:恢复目标 = checkpoint_id。注入 langgraph_runner 真消费的
88
+ # ``checkpoint_resume`` + ``framework_ref.langgraph.{checkpoint_id,thread_id}``。
89
+ return {
90
+ "checkpoint_resume": True,
91
+ "resume_payload_provided": payload is not None,
92
+ "resume_interrupt_id": payload.call_id if payload else None,
93
+ "framework_ref": {
94
+ "langgraph": {"checkpoint_id": target.id, "thread_id": handle.session_id}
95
+ },
96
+ "input": payload.data if payload else None,
97
+ }
98
+
99
+ def _checkpoint_capability(self) -> CheckpointCapability:
100
+ capability = super()._checkpoint_capability()
101
+ if not capability.supported:
102
+ return capability
103
+ return capability.model_copy(
104
+ update={
105
+ "granularity": "snapshot",
106
+ "rollback_scope": "turn",
107
+ "fork_supported": True,
108
+ }
109
+ )
110
+
111
+
112
+ def build_default_registry() -> RuntimeRegistry:
113
+ """构造默认 RuntimeRegistry 并注册 ADK/LangGraph adapter 类型。"""
114
+ registry = RuntimeRegistry()
115
+ registry.register("adk", ADKRuntimeAdapter)
116
+ registry.register("langgraph", LangGraphRuntimeAdapter)
117
+ return registry
118
+
119
+
120
+ __all__ = [
121
+ "ADKRuntimeAdapter",
122
+ "LangGraphRuntimeAdapter",
123
+ "build_default_registry",
124
+ ]
@@ -0,0 +1,118 @@
1
+ """Shared conversation preprocessing for RuntimeAdapter-backed transports."""
2
+
3
+ from __future__ import annotations
4
+
5
+ from dataclasses import dataclass
6
+ from typing import Any
7
+
8
+ from ksadk.conversations.runtime_input import (
9
+ _build_runner_ambient_contexts,
10
+ _build_runner_request_payload,
11
+ _inject_runner_deferred_tools_for_request,
12
+ _runner_type_name,
13
+ )
14
+ from ksadk.conversations.runtime_preparation import build_run_input
15
+ from ksadk.runtime.adapter import (
16
+ CONVERSATION_PREPROCESSING_METADATA_KEY,
17
+ StartRequest,
18
+ )
19
+ from ksadk.runtime_context import PlatformInvocationContext
20
+
21
+
22
+ @dataclass
23
+ class PreparedRuntimeStart:
24
+ """Runner payload plus the ContextVar/tracing identity used to execute it."""
25
+
26
+ runner_input: dict[str, Any]
27
+ context: PlatformInvocationContext
28
+ input_text: str
29
+ response_id: str | None = None
30
+
31
+
32
+ def _fallback_messages(input_value: Any) -> list[dict[str, Any]]:
33
+ if isinstance(input_value, list) and all(isinstance(item, dict) for item in input_value):
34
+ return [dict(item) for item in input_value]
35
+ if isinstance(input_value, dict) and isinstance(input_value.get("messages"), list):
36
+ return [dict(item) for item in input_value["messages"] if isinstance(item, dict)]
37
+ return [{"role": "user", "content": input_value}]
38
+
39
+
40
+ async def prepare_runtime_start(request: StartRequest, runner: Any) -> PreparedRuntimeStart | None:
41
+ """Prepare an opted-in StartRequest through the canonical conversation pipeline.
42
+
43
+ Requests without ``conversation_request`` retain the frozen RuntimeAdapter v1
44
+ behavior. This keeps A2A, Harness and framework contract callers unchanged while
45
+ allowing AG-UI and future transports to share the production input semantics.
46
+ """
47
+
48
+ conversation = request.conversation_preprocessing()
49
+ if conversation is None:
50
+ return None
51
+
52
+ prepare_for_request = getattr(runner, "prepare_for_request", None)
53
+ if callable(prepare_for_request):
54
+ prepare_for_request(request.model)
55
+
56
+ outer_metadata = {
57
+ key: value
58
+ for key, value in request.metadata.items()
59
+ if key != CONVERSATION_PREPROCESSING_METADATA_KEY
60
+ }
61
+ request_metadata = {**outer_metadata, **conversation.request_metadata}
62
+ messages = conversation.messages or _fallback_messages(request.input)
63
+ prepared = await build_run_input(
64
+ agent_id=str(request.agent_id or "agent"),
65
+ user_id=request.user_id,
66
+ session_id=request.session_id,
67
+ messages=messages,
68
+ model=request.model,
69
+ model_metadata=conversation.model_metadata or None,
70
+ model_options=conversation.model_options or None,
71
+ state_delta=conversation.state_delta or None,
72
+ instructions=conversation.instructions,
73
+ request_metadata=request_metadata,
74
+ custom_metadata=conversation.custom_metadata,
75
+ invocation_id=str(request.metadata.get("invocation_id") or "") or None,
76
+ )
77
+ _inject_runner_deferred_tools_for_request(runner, prepared)
78
+ ambient_contexts = _build_runner_ambient_contexts(
79
+ runner=runner,
80
+ user_id=request.user_id,
81
+ user_input=prepared.user_input,
82
+ )
83
+ runtime_context = PlatformInvocationContext(
84
+ agent_id=str(request.agent_id or "agent"),
85
+ user_id=request.user_id,
86
+ account_id=str(conversation.account_id or ""),
87
+ session_id=prepared.session_id,
88
+ history=list(prepared.history),
89
+ input_content=list(prepared.input_content),
90
+ input_messages=list(prepared.input_messages),
91
+ input_parts=list(prepared.user_parts),
92
+ attachments=list(prepared.attachments),
93
+ attachment_results=list(prepared.attachment_results),
94
+ current_attachments=list(prepared.current_attachments),
95
+ current_attachment_results=list(prepared.current_attachment_results),
96
+ has_current_files=prepared.has_current_files,
97
+ runner_type=_runner_type_name(runner),
98
+ metadata=dict(conversation.custom_metadata),
99
+ model=request.model,
100
+ model_options=prepared.model_options,
101
+ kb_context=ambient_contexts.get("kb_context"),
102
+ memory_context=ambient_contexts.get("memory_context"),
103
+ )
104
+ canonical_payload = _build_runner_request_payload(
105
+ prepared=prepared,
106
+ model=request.model,
107
+ runtime_context=runtime_context,
108
+ runner=runner,
109
+ )
110
+ return PreparedRuntimeStart(
111
+ runner_input={**request.config, **canonical_payload},
112
+ context=runtime_context,
113
+ input_text=prepared.user_input or prepared.user_display_input,
114
+ response_id=conversation.response_id,
115
+ )
116
+
117
+
118
+ __all__ = ["PreparedRuntimeStart", "prepare_runtime_start"]