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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (494) hide show
  1. {agentengine_sdk_python-0.8.0.dist-info → agentengine_sdk_python-0.8.2.dist-info}/METADATA +43 -7
  2. agentengine_sdk_python-0.8.2.dist-info/RECORD +778 -0
  3. {agentengine_sdk_python-0.8.0.dist-info → agentengine_sdk_python-0.8.2.dist-info}/WHEEL +1 -1
  4. ksadk/a2a/__init__.py +2 -0
  5. ksadk/a2a/_space_client_events.py +381 -0
  6. ksadk/a2a/bootstrap.py +0 -2
  7. ksadk/a2a/card.py +6 -111
  8. ksadk/a2a/control_plane.py +239 -1
  9. ksadk/a2a/event_adapter.py +156 -64
  10. ksadk/a2a/executor.py +195 -172
  11. ksadk/a2a/routes.py +12 -5
  12. ksadk/a2a/server.py +1 -8
  13. ksadk/a2a/service_env.py +33 -0
  14. ksadk/a2a/space_client.py +43 -349
  15. ksadk/a2a_card.py +101 -0
  16. ksadk/a2ui/core.py +222 -53
  17. ksadk/agui/_agent_helpers.py +243 -0
  18. ksadk/agui/a2ui_projection.py +12 -5
  19. ksadk/agui/agent.py +474 -275
  20. ksadk/agui/config.py +11 -5
  21. ksadk/agui/routes.py +7 -15
  22. ksadk/api/client.py +530 -40
  23. ksadk/api/environment.py +27 -0
  24. ksadk/builders/code_builder.py +352 -53
  25. ksadk/builders/container_builder.py +71 -44
  26. ksadk/builders/framework_requirements.py +2 -1
  27. ksadk/builders/ks3_uploader.py +2 -2
  28. ksadk/builders/managed_runtime_builder.py +60 -28
  29. ksadk/cli/__init__.py +25 -0
  30. ksadk/cli/cmd_a2a.py +18 -31
  31. ksadk/cli/cmd_create.py +13 -26
  32. ksadk/cli/cmd_dashboard.py +15 -1
  33. ksadk/cli/cmd_deploy.py +28 -3
  34. ksadk/cli/cmd_eval.py +443 -0
  35. ksadk/cli/cmd_evalset.py +284 -0
  36. ksadk/cli/cmd_files.py +5 -1
  37. ksadk/cli/cmd_hermes.py +137 -163
  38. ksadk/cli/cmd_invoke.py +28 -38
  39. ksadk/cli/cmd_launch.py +12 -0
  40. ksadk/cli/cmd_managed_runtime.py +95 -0
  41. ksadk/cli/cmd_observe.py +85 -0
  42. ksadk/cli/cmd_openclaw.py +85 -479
  43. ksadk/cli/cmd_replay.py +28 -4
  44. ksadk/cli/cmd_run.py +29 -67
  45. ksadk/cli/cmd_studio.py +201 -0
  46. ksadk/cli/cmd_web.py +15 -6
  47. ksadk/cli/dry_run.py +2 -1
  48. ksadk/cli/env_options.py +83 -0
  49. ksadk/cli/global_options.py +3 -1
  50. ksadk/cli/hermes_env.py +151 -0
  51. ksadk/cli/invoke_payload.py +49 -0
  52. ksadk/cli/network_options.py +7 -5
  53. ksadk/cli/openclaw_env.py +458 -0
  54. ksadk/cli/runtime_bootstrap.py +51 -0
  55. ksadk/cli/ui.py +6 -0
  56. ksadk/cli/workflow_common.py +5 -5
  57. ksadk/codex/__init__.py +3 -3
  58. ksadk/codex/client.py +833 -49
  59. ksadk/codex/phase.py +1 -1
  60. ksadk/codex/runtime.py +720 -127
  61. ksadk/common/kop_client.py +232 -0
  62. ksadk/configs/__init__.py +1 -3
  63. ksadk/configs/env_registry.py +244 -45
  64. ksadk/configs/env_registry_pcm.py +181 -0
  65. ksadk/configs/env_var_spec.py +18 -0
  66. ksadk/configs/global_config.py +6 -1
  67. ksadk/configs/settings.py +5 -108
  68. ksadk/context_engine/__init__.py +98 -0
  69. ksadk/context_engine/assembler.py +176 -0
  70. ksadk/context_engine/baseline.py +419 -0
  71. ksadk/context_engine/cache_observability.py +228 -0
  72. ksadk/context_engine/capabilities.py +443 -0
  73. ksadk/context_engine/contributors.py +344 -0
  74. ksadk/context_engine/hosted_pipeline.py +417 -0
  75. ksadk/context_engine/models.py +117 -0
  76. ksadk/context_engine/planner.py +698 -0
  77. ksadk/context_engine/policies.py +319 -0
  78. ksadk/context_engine/projection.py +31 -0
  79. ksadk/context_engine/shadow_plan.py +266 -0
  80. ksadk/context_engine/tokenizer.py +164 -0
  81. ksadk/conversations/__init__.py +85 -94
  82. ksadk/conversations/context.py +126 -6
  83. ksadk/conversations/message_projection.py +292 -28
  84. ksadk/conversations/model_context.py +49 -3
  85. ksadk/conversations/runtime_compaction.py +207 -5
  86. ksadk/conversations/runtime_input.py +193 -3
  87. ksadk/conversations/runtime_invocation.py +81 -3
  88. ksadk/conversations/runtime_observability.py +157 -4
  89. ksadk/conversations/runtime_payloads.py +42 -0
  90. ksadk/conversations/runtime_preparation.py +280 -2
  91. ksadk/conversations/runtime_resume.py +71 -32
  92. ksadk/conversations/runtime_stream_events.py +94 -9
  93. ksadk/conversations/runtime_streaming.py +175 -22
  94. ksadk/conversations/semantic_summary.py +311 -1
  95. ksadk/conversations/session_lock.py +51 -0
  96. ksadk/deployment/env_forward.py +72 -0
  97. ksadk/deployment/managed_runtime.py +38 -0
  98. ksadk/deployment/manager.py +24 -8
  99. ksadk/deployment/providers/serverless.py +228 -92
  100. ksadk/evaluation/__init__.py +116 -0
  101. ksadk/evaluation/a2a_adapter.py +452 -0
  102. ksadk/evaluation/adapters.py +67 -0
  103. ksadk/evaluation/agent_eval_client.py +395 -0
  104. ksadk/evaluation/cloud_binding.py +80 -0
  105. ksadk/evaluation/cloud_converter.py +194 -0
  106. ksadk/evaluation/cloud_service.py +199 -0
  107. ksadk/evaluation/contracts.py +478 -0
  108. ksadk/evaluation/evalset.py +351 -0
  109. ksadk/evaluation/evaluators.py +627 -0
  110. ksadk/evaluation/evidence.py +258 -0
  111. ksadk/evaluation/executor.py +143 -0
  112. ksadk/evaluation/local_adapter.py +550 -0
  113. ksadk/evaluation/service_env.py +27 -0
  114. ksadk/evaluation/storage.py +68 -0
  115. ksadk/evaluation/studio_build_adapter.py +253 -0
  116. ksadk/evaluation/target.py +82 -0
  117. ksadk/events/__init__.py +13 -13
  118. ksadk/events/_v1_compat/__init__.py +1 -0
  119. ksadk/events/_v1_compat/models.py +299 -0
  120. ksadk/events/_v1_compat/parser.py +247 -0
  121. ksadk/events/_v1_compat/projection.py +753 -0
  122. ksadk/events/adapters/__init__.py +34 -0
  123. ksadk/events/adapters/_a2a_snapshot.py +622 -0
  124. ksadk/events/adapters/_a2a_support.py +275 -0
  125. ksadk/events/adapters/_codex_interactions.py +375 -0
  126. ksadk/events/adapters/_codex_items.py +801 -0
  127. ksadk/events/adapters/_codex_validators.py +311 -0
  128. ksadk/events/adapters/_langgraph_support.py +785 -0
  129. ksadk/events/adapters/a2a.py +841 -0
  130. ksadk/events/adapters/adk.py +503 -0
  131. ksadk/events/adapters/codex.py +717 -0
  132. ksadk/events/adapters/langgraph.py +745 -0
  133. ksadk/events/canonical.py +440 -0
  134. ksadk/events/canonical_replay.py +497 -0
  135. ksadk/events/canonical_store.py +468 -0
  136. ksadk/events/cold_recovery.py +257 -0
  137. ksadk/events/content.py +89 -0
  138. ksadk/events/identity.py +86 -0
  139. ksadk/events/pipeline.py +455 -0
  140. ksadk/events/projections.py +66 -0
  141. ksadk/events/reducer.py +661 -0
  142. ksadk/events/replay.py +3 -36
  143. ksadk/events/runtime_event.py +20 -256
  144. ksadk/events/session_event.py +324 -0
  145. ksadk/events/store.py +3 -316
  146. ksadk/events/v1_compat.py +41 -0
  147. ksadk/harness/__init__.py +3 -2
  148. ksadk/harness/app.py +114 -123
  149. ksadk/harness/config.py +1 -1
  150. ksadk/harness/runtime.py +467 -0
  151. ksadk/hermes_terminal.py +5 -0
  152. ksadk/identity/resolver.py +4 -3
  153. ksadk/interaction/__init__.py +28 -0
  154. ksadk/interaction/contracts.py +136 -0
  155. ksadk/interaction/ledger.py +189 -0
  156. ksadk/interaction/provider.py +122 -0
  157. ksadk/interaction/providers/__init__.py +52 -0
  158. ksadk/interaction/providers/adk.py +40 -0
  159. ksadk/interaction/providers/codex.py +94 -0
  160. ksadk/interaction/providers/langgraph.py +58 -0
  161. ksadk/kernel/__init__.py +117 -0
  162. ksadk/kernel/authorization.py +258 -0
  163. ksadk/kernel/bootstrap.py +1074 -0
  164. ksadk/kernel/contract_fingerprints.py +61 -0
  165. ksadk/kernel/contracts.py +362 -0
  166. ksadk/kernel/control.py +219 -0
  167. ksadk/kernel/errors.py +79 -0
  168. ksadk/kernel/ingress.py +1102 -0
  169. ksadk/kernel/mapping.py +111 -0
  170. ksadk/kernel/memory_store.py +1133 -0
  171. ksadk/kernel/postgres_store.py +1756 -0
  172. ksadk/kernel/recovery.py +452 -0
  173. ksadk/kernel/runtime_identity.py +103 -0
  174. ksadk/kernel/sql/001_agent_kernel.sql +120 -0
  175. ksadk/kernel/sqlite_store.py +1410 -0
  176. ksadk/kernel/state.py +145 -0
  177. ksadk/kernel/store.py +232 -0
  178. ksadk/kernel/worker.py +953 -0
  179. ksadk/knowledge_base/client.py +22 -4
  180. ksadk/knowledge_base/service.py +32 -5
  181. ksadk/managed_a2a_card.py +160 -0
  182. ksadk/managed_runtime.py +16 -9
  183. ksadk/memory/__init__.py +61 -0
  184. ksadk/memory/adk/backends/base_ltm_backend.py +96 -1
  185. ksadk/memory/adk/backends/http_ltm_backend.py +14 -5
  186. ksadk/memory/adk/backends/inmemory_ltm_backend.py +136 -3
  187. ksadk/memory/adk/backends/sdk_ltm_backend.py +394 -5
  188. ksadk/memory/adk/backends/sqlite_ltm_backend.py +95 -0
  189. ksadk/memory/adk/long_term_memory.py +3 -2
  190. ksadk/memory/coordinator.py +461 -0
  191. ksadk/memory/events.py +202 -0
  192. ksadk/memory/extraction.py +228 -0
  193. ksadk/memory/ltm_backend_factory.py +16 -3
  194. ksadk/memory/models.py +316 -0
  195. ksadk/memory/policy.py +215 -0
  196. ksadk/memory/provider.py +47 -0
  197. ksadk/memory/provider_adapter.py +159 -0
  198. ksadk/memory/provider_resolver.py +71 -0
  199. ksadk/memory/providers/__init__.py +5 -0
  200. ksadk/memory/providers/local_sqlite.py +490 -0
  201. ksadk/memory/resolved_policy.py +145 -0
  202. ksadk/memory/service.py +198 -8
  203. ksadk/memory/tool.py +4 -0
  204. ksadk/model_proxy/bootstrap.py +16 -9
  205. ksadk/model_proxy/config.py +22 -1
  206. ksadk/model_proxy/detect.py +202 -9
  207. ksadk/model_proxy/namespace.py +67 -15
  208. ksadk/model_proxy/server.py +168 -6
  209. ksadk/model_proxy/transform.py +105 -3
  210. ksadk/observability/__init__.py +25 -0
  211. ksadk/observability/session_log.py +420 -0
  212. ksadk/observability/trajectory.py +105 -0
  213. ksadk/prompts/__init__.py +71 -0
  214. ksadk/prompts/compiler.py +215 -0
  215. ksadk/prompts/models.py +82 -0
  216. ksadk/prompts/projection.py +89 -0
  217. ksadk/prompts/resolved.py +137 -0
  218. ksadk/prompts/sources.py +233 -0
  219. ksadk/runners/_langgraph_runner_streams.py +822 -0
  220. ksadk/runners/adk_runner.py +14 -31
  221. ksadk/runners/base_runner.py +44 -3
  222. ksadk/runners/factory.py +3 -3
  223. ksadk/runners/langgraph_runner.py +252 -433
  224. ksadk/runners/utils/__init__.py +0 -10
  225. ksadk/runners/utils/loader.py +16 -0
  226. ksadk/runtime/__init__.py +67 -41
  227. ksadk/runtime/_runner_adapter/__init__.py +1 -0
  228. ksadk/runtime/_runner_adapter/stream_mapping.py +788 -0
  229. ksadk/runtime/adapter.py +199 -16
  230. ksadk/runtime/conversation_execution.py +687 -0
  231. ksadk/runtime/executor.py +392 -0
  232. ksadk/runtime/factory.py +342 -0
  233. ksadk/runtime/framework_adapters.py +6 -12
  234. ksadk/runtime/hosted_finalizer.py +268 -0
  235. ksadk/runtime/launch.py +61 -0
  236. ksadk/runtime/preprocessing.py +49 -14
  237. ksadk/runtime/runner_adapter.py +330 -391
  238. ksadk/runtime/runner_loading.py +36 -0
  239. ksadk/runtime/usage.py +33 -0
  240. ksadk/sandbox/backends/e2b.py +36 -3
  241. ksadk/server/__init__.py +39 -4
  242. ksadk/server/app.py +18 -492
  243. ksadk/server/composition.py +36 -2
  244. ksadk/server/factory.py +210 -149
  245. ksadk/server/routes/common.py +15 -46
  246. ksadk/server/routes/control.py +13 -9
  247. ksadk/server/routes/kernel_ingress.py +258 -0
  248. ksadk/server/routes/misc.py +10 -33
  249. ksadk/server/routes/models.py +14 -6
  250. ksadk/server/routes/openai_compat.py +129 -27
  251. ksadk/server/routes/projection.py +84 -16
  252. ksadk/server/routes/run.py +347 -460
  253. ksadk/server/routes/sessions.py +37 -40
  254. ksadk/server/routes/streaming.py +52 -7
  255. ksadk/server/routes/workspace.py +54 -21
  256. ksadk/server/static/assets/{ArtifactsPanel-Cjnqt-8W.js → ArtifactsPanel-DSU1sWD_.js} +1 -1
  257. ksadk/server/static/assets/{CodeBlock-BqyqZfuB.js → CodeBlock-DOH6MVcn.js} +4 -4
  258. ksadk/server/static/assets/{MathMessageMarkdown-BpH7jiFM.js → MathMessageMarkdown-BL8my1R2.js} +4 -4
  259. ksadk/server/static/assets/MathMessageMarkdown-BorAY7qD.css +1 -0
  260. ksadk/server/static/assets/MermaidBlock-Dz4IP-Tx.js +312 -0
  261. ksadk/server/static/assets/NativeTerminalPanel-DUrK0JpZ.js +1 -0
  262. ksadk/server/static/assets/abnfDiagram-VCTEODGH-g20pFzNV.js +1 -0
  263. ksadk/server/static/assets/arc-C4FzinUA.js +1 -0
  264. ksadk/server/static/assets/architecture-7GRP2DOG-DjKratdf.js +1 -0
  265. ksadk/server/static/assets/architectureDiagram-5GKGNRK7-DpIqL5h4.js +36 -0
  266. ksadk/server/static/assets/blockDiagram-NRAW4CY4-BjkljTNz.js +129 -0
  267. ksadk/server/static/assets/c4Diagram-UCG6FXSJ-Dk_ieq2X.js +38 -0
  268. ksadk/server/static/assets/channel-4cQHKtx1.js +1 -0
  269. ksadk/server/static/assets/chunk-2Q5K7J3B-DmgWkESh.js +1 -0
  270. ksadk/server/static/assets/{chunk-FMBD7UC4-BGhvzDYt.js → chunk-5VM5RSS4-BVHAchFb.js} +1 -1
  271. ksadk/server/static/assets/{chunk-ND2GUHAM-D98vPd-E.js → chunk-F27PBJKO-C-ipQzuS.js} +1 -1
  272. ksadk/server/static/assets/chunk-G27WJ6UU-C2EyJbIK.js +231 -0
  273. ksadk/server/static/assets/{chunk-4BX2VUAB-CsWIQRhc.js → chunk-JWPE2WC7-vYvVJb_M.js} +1 -1
  274. ksadk/server/static/assets/chunk-LCL6LL3I-BcI6ysPT.js +206 -0
  275. ksadk/server/static/assets/chunk-POPQ4Y6H-C030x_Z1.js +1 -0
  276. ksadk/server/static/assets/chunk-RHFEMEQ7-yyGpsz4n.js +168 -0
  277. ksadk/server/static/assets/chunk-SVP7TREG-BLTlmMU7.js +88 -0
  278. ksadk/server/static/assets/chunk-XXDRQBXY-C_32ArgP.js +1 -0
  279. ksadk/server/static/assets/classDiagram-DTDB5LWJ-DLFd9Xi0.js +1 -0
  280. ksadk/server/static/assets/classDiagram-v2-JRS7N3AN-DLFd9Xi0.js +1 -0
  281. ksadk/server/static/assets/{cose-bilkent-S5V4N54A-CX3yotHq.js → cose-bilkent-JH36ORCC-9YQYwdl0.js} +1 -1
  282. ksadk/server/static/assets/cynefin-OW5HDTMX-DjEM48Qp.js +1 -0
  283. ksadk/server/static/assets/cynefinDiagram-5FMLGOSQ-ErLF5N13.js +62 -0
  284. ksadk/server/static/assets/cytoscape.esm-CyCl8rPi.js +321 -0
  285. ksadk/server/static/assets/dagre-3AP2YEHR-DFiQF-6f.js +4 -0
  286. ksadk/server/static/assets/dagre-BuhGnRI1.js +1 -0
  287. ksadk/server/static/assets/diagram-S7CK7UJ4-Bt1v8-GC.js +30 -0
  288. ksadk/server/static/assets/diagram-UQ7AKVKN-DSCxJdBK.js +41 -0
  289. ksadk/server/static/assets/diagram-VSXAHHWV-DHfYwp_9.js +3 -0
  290. ksadk/server/static/assets/diagram-VX7I27RA-DdzD-4Le.js +24 -0
  291. ksadk/server/static/assets/diagram-Z3DM3KII-Du-nAJ9F.js +24 -0
  292. ksadk/server/static/assets/{dist-D82mtD2s.js → dist-8hqcx0sU.js} +1 -1
  293. ksadk/server/static/assets/dist-B7seoj3d.js +1 -0
  294. ksadk/server/static/assets/{dist-DHn6nBzr.js → dist-BE7bu-DL.js} +1 -1
  295. ksadk/server/static/assets/{dist-eoW6tZXA.js → dist-BVDffZ0U.js} +1 -1
  296. ksadk/server/static/assets/{dist-C2xjE7cO.js → dist-BX8z72IC.js} +1 -1
  297. ksadk/server/static/assets/{dist-CgF3fj15.js → dist-Bf2M8m3N.js} +1 -1
  298. ksadk/server/static/assets/{dist-Bs-jQcRX.js → dist-BjU6y-A2.js} +1 -1
  299. ksadk/server/static/assets/{dist-Djgl2wVZ.js → dist-BytlxIDT.js} +1 -1
  300. ksadk/server/static/assets/{dist-CVQRZjPu.js → dist-CSh_DE14.js} +1 -1
  301. ksadk/server/static/assets/{dist-6CVKuTAe.js → dist-CXYYBw3_.js} +1 -1
  302. ksadk/server/static/assets/{dist-DlzCRy0S.js → dist-C_wsv-Qd.js} +1 -1
  303. ksadk/server/static/assets/{dist-DF06ORQo.js → dist-ClxGviKw.js} +1 -1
  304. ksadk/server/static/assets/{dist-Cf23NY4L.js → dist-CttYUqzS.js} +1 -1
  305. ksadk/server/static/assets/{dist-ivOya1LD.js → dist-DNp6rLRA.js} +1 -1
  306. ksadk/server/static/assets/{dist-BibcG1V9.js → dist-DUX-id_F.js} +1 -1
  307. ksadk/server/static/assets/{dist-BUHRxvDG.js → dist-DmldrHd_.js} +1 -1
  308. ksadk/server/static/assets/{dist-BZ9n9AjO.js → dist-DnfXs8Vn.js} +2 -2
  309. ksadk/server/static/assets/{dist-DqNnNFrw.js → dist-Dq9gLD7L.js} +1 -1
  310. ksadk/server/static/assets/{dist-CGcp2ex8.js → dist-W-TIVntx.js} +1 -1
  311. ksadk/server/static/assets/{dist-Cwt7koer.js → dist-dDdADKFA.js} +1 -1
  312. ksadk/server/static/assets/{dist-C7-3jInC.js → dist-dydu68Fl.js} +1 -1
  313. ksadk/server/static/assets/{dist-C99THtIA.js → dist-ngtN0DJB.js} +1 -1
  314. ksadk/server/static/assets/ebnfDiagram-PWID7BFC-Da9C9NO1.js +1 -0
  315. ksadk/server/static/assets/erDiagram-SSCWMZ5O-EAGqqR79.js +99 -0
  316. ksadk/server/static/assets/eventmodeling-NTZA5JFV-CMgMaJrC.js +1 -0
  317. ksadk/server/static/assets/flowDiagram-A5DVABFB-BBKL0x3P.js +1 -0
  318. ksadk/server/static/assets/ganttDiagram-EL5Y4UJY-DqJsKb59.js +292 -0
  319. ksadk/server/static/assets/gitGraph-4MIJSDKK-Dw63mrhw.js +1 -0
  320. ksadk/server/static/assets/gitGraphDiagram-WWUBYQGX-B6g4dtDi.js +106 -0
  321. ksadk/server/static/assets/index-8ipRcQ-M.js +240 -0
  322. ksadk/server/static/assets/index-ByFCqjlh.css +2 -0
  323. ksadk/server/static/assets/info-A6RAGUB7-B6iAblII.js +1 -0
  324. ksadk/server/static/assets/infoDiagram-RXCK75RN-Djm_nbd5.js +2 -0
  325. ksadk/server/static/assets/{ishikawaDiagram-YF4QCWOH-DLOHGvWw.js → ishikawaDiagram-5VMMS53U-DWya9SG2.js} +6 -6
  326. ksadk/server/static/assets/{journeyDiagram-JHISSGLW-BIzKeejT.js → journeyDiagram-EYS64GPL-DutxhSNI.js} +6 -6
  327. ksadk/server/static/assets/{kanban-definition-UN3LZRKU-BWHoFSw2.js → kanban-definition-3QL26DDD-DJdOF8Fm.js} +10 -10
  328. ksadk/server/static/assets/katex-vFWytM5c.js +257 -0
  329. ksadk/server/static/assets/{linear-CvMBw9cA.js → linear-BHjG8b-J.js} +1 -1
  330. ksadk/server/static/assets/mermaid-parser.core-KGSy4jWT.js +166 -0
  331. ksadk/server/static/assets/{mindmap-definition-RKZ34NQL-CSAQxEAe.js → mindmap-definition-FBJOCRG2-9-HC88D4.js} +29 -29
  332. ksadk/server/static/assets/packet-AYTQ26CC-BOYAipuq.js +1 -0
  333. ksadk/server/static/assets/pegDiagram-XKGWAZYB-DrEZd4fD.js +1 -0
  334. ksadk/server/static/assets/pie-WAS4IAKB-Ctq0Kbku.js +1 -0
  335. ksadk/server/static/assets/pieDiagram-E7YTZNPT-DpjqOFFp.js +39 -0
  336. ksadk/server/static/assets/{quadrantDiagram-W4KKPZXB-CxIR4JXI.js → quadrantDiagram-AXDQQJYC-BiNhgOXX.js} +6 -6
  337. ksadk/server/static/assets/radar-RG4KPBEZ-DN0-ul_0.js +1 -0
  338. ksadk/server/static/assets/railroad-74A4TZTK-C6cC_to0.js +1 -0
  339. ksadk/server/static/assets/railroad-abnf-HS5TGJTU-BimjIuRc.js +1 -0
  340. ksadk/server/static/assets/railroad-ebnf-LZEXJU2U-CvY65ABq.js +1 -0
  341. ksadk/server/static/assets/railroad-peg-WCYAUIDC-D72Iq_Tv.js +1 -0
  342. ksadk/server/static/assets/railroadDiagram-O6MQD6OU-_Y3Ojg6G.js +1 -0
  343. ksadk/server/static/assets/requirementDiagram-EFPCY7ZU-DeCFdg9K.js +84 -0
  344. ksadk/server/static/assets/{sankeyDiagram-5OEKKPKP-DpGa6EAV.js → sankeyDiagram-P5KCCOFB-CPH75rhw.js} +7 -7
  345. ksadk/server/static/assets/{sequenceDiagram-3UESZ5HK-NTKNGGe5.js → sequenceDiagram-WJ2MYXX4-OEpQQdr4.js} +10 -10
  346. ksadk/server/static/assets/sizeCapture-X5ZJPWSS-heUErzhI.js +1 -0
  347. ksadk/server/static/assets/stateDiagram-HBIQ2CUA-DvA3jSMB.js +1 -0
  348. ksadk/server/static/assets/stateDiagram-v2-4QOOHH4V-BgQY03nz.js +1 -0
  349. ksadk/server/static/assets/swimlanes-XN3QIQJK-CR-dfN_t.js +1 -0
  350. ksadk/server/static/assets/swimlanesDiagram-VK2B7HYN-DLVw3q5Q.js +8 -0
  351. ksadk/server/static/assets/{timeline-definition-PNZ67QCA-jqoYs3jQ.js → timeline-definition-24CTP7MA-DAVJf1TX.js} +7 -7
  352. ksadk/server/static/assets/treeView-Q6P3EWNA-BMpO0wsB.js +1 -0
  353. ksadk/server/static/assets/treemap-WGGIJYW6-Et0aqzU3.js +1 -0
  354. ksadk/server/static/assets/vennDiagram-4TSXK5OY-DwM8eDkh.js +34 -0
  355. ksadk/server/static/assets/wardley-WFR3VGLG-CbY0mhpl.js +1 -0
  356. ksadk/server/static/assets/wardleyDiagram-VM6X3IG4-DZL-Zz2t.js +78 -0
  357. ksadk/server/static/assets/xychartDiagram-S5SC5T6Z-Dy6Yh_hu.js +7 -0
  358. ksadk/server/static/index.html +2 -2
  359. ksadk/sessions/__init__.py +26 -9
  360. ksadk/sessions/_local_service_sync.py +688 -0
  361. ksadk/sessions/_local_tables.py +21 -0
  362. ksadk/sessions/_postgres_schema.py +305 -0
  363. ksadk/sessions/_postgres_tables.py +15 -0
  364. ksadk/sessions/base.py +80 -1
  365. ksadk/sessions/in_memory.py +53 -2
  366. ksadk/sessions/local_service.py +63 -604
  367. ksadk/sessions/postgres_service.py +58 -148
  368. ksadk/sessions/resilient.py +35 -1
  369. ksadk/skills/runtime/backends/e2b.py +1 -1
  370. ksadk/skills/service_client.py +13 -3
  371. ksadk/studio/__init__.py +5 -0
  372. ksadk/studio/agent_avatar_assets.py +120 -0
  373. ksadk/studio/agent_lifecycle.py +51 -0
  374. ksadk/studio/api.py +1598 -0
  375. ksadk/studio/api_catalog_routes.py +324 -0
  376. ksadk/studio/api_contracts.py +286 -0
  377. ksadk/studio/api_helpers.py +132 -0
  378. ksadk/studio/api_memory_routes.py +82 -0
  379. ksadk/studio/authoring.py +749 -0
  380. ksadk/studio/authoring_coordinator.py +1017 -0
  381. ksadk/studio/builder.py +397 -0
  382. ksadk/studio/capabilities.py +368 -0
  383. ksadk/studio/cloud.py +2099 -0
  384. ksadk/studio/codex_agent_service.py +694 -0
  385. ksadk/studio/codex_authoring.py +469 -0
  386. ksadk/studio/codex_builder.py +437 -0
  387. ksadk/studio/codex_manifest.py +307 -0
  388. ksadk/studio/codex_run.py +395 -0
  389. ksadk/studio/compiler.py +190 -0
  390. ksadk/studio/contracts.py +755 -0
  391. ksadk/studio/errors.py +47 -0
  392. ksadk/studio/event_store.py +214 -0
  393. ksadk/studio/framework_run.py +342 -0
  394. ksadk/studio/hosted_kernel.py +317 -0
  395. ksadk/studio/identifiers.py +33 -0
  396. ksadk/studio/manifest_resolver.py +131 -0
  397. ksadk/studio/mcp_runtime.py +229 -0
  398. ksadk/studio/model_client.py +629 -0
  399. ksadk/studio/model_profile_service.py +214 -0
  400. ksadk/studio/operations.py +275 -0
  401. ksadk/studio/otel_trace.py +1060 -0
  402. ksadk/studio/pagination.py +182 -0
  403. ksadk/studio/pcm_memory.py +85 -0
  404. ksadk/studio/python_tool_inspection.py +183 -0
  405. ksadk/studio/repository.py +327 -0
  406. ksadk/studio/resource_catalog.py +1260 -0
  407. ksadk/studio/run_service.py +1133 -0
  408. ksadk/studio/runtime_catalog.py +74 -0
  409. ksadk/studio/runtime_source.py +365 -0
  410. ksadk/studio/service.py +2249 -0
  411. ksadk/studio/shared_web.py +1004 -0
  412. ksadk/studio/skill_discovery.py +628 -0
  413. ksadk/studio/static/assets/PrismRenderer-IYN-ffww.js +3 -0
  414. ksadk/studio/static/assets/index-BLpcdrgW.css +1 -0
  415. ksadk/studio/static/assets/index-CYekR2Xv.js +260 -0
  416. ksadk/studio/static/assets/react-vendor-BNmTiJ-I.js +9 -0
  417. ksadk/studio/static/assets/rolldown-runtime-hePW80VL.js +1 -0
  418. ksadk/studio/static/index.html +15 -0
  419. ksadk/studio/templates.py +722 -0
  420. ksadk/studio/validator.py +265 -0
  421. ksadk/studio/workspace.py +135 -0
  422. ksadk/tools/gateway.py +9 -0
  423. ksadk/toolsets/__init__.py +27 -1
  424. ksadk/toolsets/a2a.py +426 -0
  425. ksadk/tracing/__init__.py +19 -21
  426. ksadk/tracing/setup.py +317 -403
  427. ksadk/tracing/span_utils.py +0 -44
  428. ksadk/version.py +1 -1
  429. ksadk_runtime_common/memory_backend/registry.py +56 -56
  430. ksadk_runtime_common/schemas/runtime_event_v1.json +37 -0
  431. ksadk_runtime_common/schemas/runtime_event_v2.json +271 -0
  432. ksadk_runtime_common/workspace_files/router.py +8 -2
  433. agentengine_sdk_python-0.8.0.dist-info/RECORD +0 -578
  434. ksadk/a2a/card_builder.py +0 -64
  435. ksadk/a2a/client.py +0 -309
  436. ksadk/events/parser.py +0 -191
  437. ksadk/harness/runner.py +0 -211
  438. ksadk/runners/codex_runner.py +0 -132
  439. ksadk/runners/utils/langfuse.py +0 -230
  440. ksadk/server/static/assets/MathMessageMarkdown-DeYh8QPr.css +0 -1
  441. ksadk/server/static/assets/MermaidBlock-DWuxETaJ.js +0 -303
  442. ksadk/server/static/assets/NativeTerminalPanel-MDTopWMO.js +0 -1
  443. ksadk/server/static/assets/arc-CFKwSk_B.js +0 -1
  444. ksadk/server/static/assets/architecture-7EHR7CIX-CynqOWjZ.js +0 -1
  445. ksadk/server/static/assets/architectureDiagram-3BPJPVTR-Dej8jX8c.js +0 -36
  446. ksadk/server/static/assets/blockDiagram-GPEHLZMM-1F64jqvy.js +0 -132
  447. ksadk/server/static/assets/c4Diagram-AAUBKEIU-9q7AUAKb.js +0 -10
  448. ksadk/server/static/assets/channel-iUGv2N24.js +0 -1
  449. ksadk/server/static/assets/chunk-2J33WTMH-6qgwJm7Q.js +0 -1
  450. ksadk/server/static/assets/chunk-55IACEB6-BK8paA20.js +0 -1
  451. ksadk/server/static/assets/chunk-727SXJPM-B-JEhy7h.js +0 -206
  452. ksadk/server/static/assets/chunk-AQP2D5EJ-DYBvMHAa.js +0 -231
  453. ksadk/server/static/assets/chunk-QZHKN3VN-YQIEXeF6.js +0 -1
  454. ksadk/server/static/assets/classDiagram-4FO5ZUOK-CDAUuoXK.js +0 -1
  455. ksadk/server/static/assets/classDiagram-v2-Q7XG4LA2-CDAUuoXK.js +0 -1
  456. ksadk/server/static/assets/cytoscape.esm-DelgaX4f.js +0 -321
  457. ksadk/server/static/assets/dagre-BM42HDAG-C7TguAWo.js +0 -4
  458. ksadk/server/static/assets/dagre-Bx709z4p.js +0 -1
  459. ksadk/server/static/assets/diagram-2AECGRRQ-Dd17_kws.js +0 -43
  460. ksadk/server/static/assets/diagram-5GNKFQAL-DVIClIil.js +0 -10
  461. ksadk/server/static/assets/diagram-KO2AKTUF-Df_3gYQa.js +0 -3
  462. ksadk/server/static/assets/diagram-LMA3HP47-BhLk6ZtA.js +0 -24
  463. ksadk/server/static/assets/diagram-OG6HWLK6-D4GNGvuu.js +0 -24
  464. ksadk/server/static/assets/dist-DyvYLMW9.js +0 -1
  465. ksadk/server/static/assets/erDiagram-TEJ5UH35-CnfRcY2M.js +0 -85
  466. ksadk/server/static/assets/eventmodeling-FCH6USID-ChYO-ijM.js +0 -1
  467. ksadk/server/static/assets/flowDiagram-I6XJVG4X-DGaJjGNJ.js +0 -162
  468. ksadk/server/static/assets/ganttDiagram-6RSMTGT7-DpCoB2g9.js +0 -292
  469. ksadk/server/static/assets/gitGraph-WXDBUCRP-BN_0Fk-j.js +0 -1
  470. ksadk/server/static/assets/gitGraphDiagram-PVQCEYII-9IKVFBVT.js +0 -106
  471. ksadk/server/static/assets/graphlib-B8gBHxth.js +0 -1
  472. ksadk/server/static/assets/index-QSwCHuB8.js +0 -177
  473. ksadk/server/static/assets/index-jOPmTOZH.css +0 -2
  474. ksadk/server/static/assets/info-J43DQDTF-Cp6o3vId.js +0 -1
  475. ksadk/server/static/assets/infoDiagram-5YYISTIA-CYIIsb8y.js +0 -2
  476. ksadk/server/static/assets/katex-DATssjp1.js +0 -265
  477. ksadk/server/static/assets/mermaid-parser.core-mGAcEwcq.js +0 -161
  478. ksadk/server/static/assets/packet-YPE3B663-wQzct3cT.js +0 -1
  479. ksadk/server/static/assets/pie-LRSECV5Y-BgTQiv-9.js +0 -1
  480. ksadk/server/static/assets/pieDiagram-4H26LBE5-By-ra07M.js +0 -30
  481. ksadk/server/static/assets/radar-GUYGQ44K-BIq5fXsn.js +0 -1
  482. ksadk/server/static/assets/requirementDiagram-4Y6WPE33-DpW90iu3.js +0 -84
  483. ksadk/server/static/assets/stateDiagram-AJRCARHV-DGpd9yFG.js +0 -1
  484. ksadk/server/static/assets/stateDiagram-v2-BHNVJYJU-B3o579IQ.js +0 -1
  485. ksadk/server/static/assets/treeView-BLDUP644-Dqi-E0EM.js +0 -1
  486. ksadk/server/static/assets/treemap-LRROVOQU-ClQP9CJ9.js +0 -1
  487. ksadk/server/static/assets/vennDiagram-CIIHVFJN-l3Z7-wbP.js +0 -34
  488. ksadk/server/static/assets/wardley-L42UT6IY-8XLvnNIs.js +0 -1
  489. ksadk/server/static/assets/wardleyDiagram-YWT4CUSO-BR54GPmr.js +0 -78
  490. ksadk/server/static/assets/xychartDiagram-2RQKCTM6-SkiH8GsK.js +0 -7
  491. ksadk/tracing/exporters/langfuse_exporter.py +0 -460
  492. {agentengine_sdk_python-0.8.0.dist-info → agentengine_sdk_python-0.8.2.dist-info}/entry_points.txt +0 -0
  493. {agentengine_sdk_python-0.8.0.dist-info → agentengine_sdk_python-0.8.2.dist-info}/licenses/LICENSE +0 -0
  494. {agentengine_sdk_python-0.8.0.dist-info → agentengine_sdk_python-0.8.2.dist-info}/top_level.txt +0 -0
@@ -6,6 +6,7 @@ Serverless Provider - 金山云 Serverless 计算引擎 (AgentEngine 托管)
6
6
  - Deploy 阶段: 客户端调用 AgentEngine Server API 发起部署
7
7
  """
8
8
 
9
+ import hashlib
9
10
  import json
10
11
  import logging
11
12
  import os
@@ -17,6 +18,7 @@ import click
17
18
  import yaml
18
19
 
19
20
  from ksadk.api import AgentEngineClient, DryRunExit
21
+ from ksadk.builders.base import BaseBuilder
20
22
  from ksadk.builders.code_builder import CodeBuilder
21
23
  from ksadk.builders.container_builder import (
22
24
  ContainerBuilder,
@@ -24,7 +26,6 @@ from ksadk.builders.container_builder import (
24
26
  resolve_registry_credentials,
25
27
  )
26
28
  from ksadk.builders.ks3_uploader import KS3Uploader
27
- from ksadk.configs.env_registry import ENV_VAR_REGISTRY
28
29
  from ksadk.configs.global_config import get_env_from_global_config
29
30
  from ksadk.configs.settings import DEFAULT_RUNTIME_TIMEZONE
30
31
  from ksadk.deployment.agent_access import get_latest_agent_access
@@ -35,55 +36,46 @@ from ksadk.deployment.base import (
35
36
  DeployTarget,
36
37
  PackageInfo,
37
38
  )
39
+ from ksadk.deployment.env_forward import should_forward_process_env
38
40
  from ksadk.deployment.registry import DeployProviderRegistry
39
41
  from ksadk.deployment.ui_config import resolve_ui_config, ui_config_to_state_fields
40
42
 
41
43
  logger = logging.getLogger(__name__)
42
44
 
45
+ # CodeBuilder archives put the runnable application below ``runtime/``. The
46
+ # command and checksum travel together: sending the command for an arbitrary
47
+ # legacy ``--ks3-path`` archive could change its launch semantics, while a
48
+ # fresh locally built archive can be attested and safely admitted as v1.
49
+ _HOSTED_CODE_COMMAND = (
50
+ "ksadk",
51
+ "web",
52
+ "/app/code/runtime",
53
+ "--port",
54
+ "8080",
55
+ "--host",
56
+ "0.0.0.0",
57
+ "--no-open",
58
+ )
43
59
 
44
- _DEPLOY_PROCESS_ENV_ALLOWLIST = frozenset(
45
- {
46
- spec.name
47
- for spec in ENV_VAR_REGISTRY
48
- if spec.module
49
- not in {
50
- "builders",
51
- "cli",
52
- "configs",
53
- "web",
54
- }
55
- }
56
- ) | frozenset(
60
+
61
+ # 转发规则已迁移至 ksadk.deployment.env_forward(hermes/openclaw deploy 共用);
62
+ # 保留私有别名以兼容既有调用与测试。
63
+ _should_forward_process_env = should_forward_process_env
64
+
65
+ # These values authenticate or configure the local deploy/build control plane.
66
+ # They must never enter an Agent runtime merely because they exist in global
67
+ # config, the caller's shell, or a project .env file. A caller can still opt in
68
+ # deliberately through explicit ``--env`` / ``--env-file`` values.
69
+ _CONTROL_PLANE_ONLY_ENV_KEYS = frozenset(
57
70
  {
58
- "E2B_API_KEY",
59
- "E2B_API_URL",
60
- "OPENAI_API_BASE",
61
- "OPENAI_API_KEY",
62
- "OPENAI_BASE_URL",
63
- "OPENAI_MODEL_NAME",
64
- "SKILL_SPACE_ID",
71
+ "KCR_PASSWORD",
72
+ "KCR_REGISTRY",
73
+ "KCR_USERNAME",
65
74
  "KSYUN_ACCESS_KEY",
66
75
  "KSYUN_ACCOUNT_ID",
67
- "KSYUN_REGION",
68
76
  "KSYUN_SECRET_KEY",
69
77
  }
70
78
  )
71
- _DEPLOY_PROCESS_ENV_PREFIXES = ("KSADK_", "OPENAI_", "KSYUN_", "E2B_")
72
- _DEPLOY_PROCESS_ENV_DENYLIST = frozenset(
73
- {spec.name for spec in ENV_VAR_REGISTRY if spec.module in {"builders", "cli", "configs", "web"}}
74
- ) | frozenset(
75
- {
76
- "KSADK_GLOBAL_CONFIG_ENV_KEYS",
77
- "KSADK_UPDATED_AT",
78
- "KSADK_VERSION",
79
- }
80
- )
81
-
82
-
83
- def _should_forward_process_env(name: str) -> bool:
84
- if name in _DEPLOY_PROCESS_ENV_DENYLIST:
85
- return False
86
- return name in _DEPLOY_PROCESS_ENV_ALLOWLIST or name.startswith(_DEPLOY_PROCESS_ENV_PREFIXES)
87
79
 
88
80
 
89
81
  @DeployProviderRegistry.register("serverless")
@@ -193,23 +185,63 @@ class ServerlessProvider(BaseDeployProvider):
193
185
  ) -> tuple[Dict[str, str], bool, int]:
194
186
  """读取部署时注入到托管运行时的环境变量。
195
187
 
196
- 全局配置作为兜底,项目 .env 作为项目级覆盖;真实 .env 文件不会随
197
- Code/Container 制品打包,只通过 deploy payload 注入到 Pod 环境变量。
188
+ 优先级: --env/--env-file (explicit) > shell env (转发白名单前缀) > 项目 .env > 全局配置。
189
+ 真实 .env 文件不会随 Code/Container 制品打包,只通过 deploy payload 注入到 Pod 环境变量。
198
190
  """
191
+ shell_keys = set(os.environ)
199
192
  env_vars: Dict[str, str] = dict(get_env_from_global_config())
200
193
  env_file = Path(project_dir) / ".env"
201
194
  project_env_count = 0
202
- for key, value in sorted(os.environ.items()):
203
- if value and _should_forward_process_env(key):
204
- env_vars.setdefault(key, value)
205
195
  if env_file.exists():
206
196
  project_env = cls._load_project_env_vars(env_file)
207
197
  project_env_count = len(project_env)
208
- env_vars.update(project_env)
209
- env_vars.update(explicit_env_vars or {})
198
+ # auto .env 覆盖 global_config,但不覆盖 shell (shell 优先于 auto .env)
199
+ for key, value in project_env.items():
200
+ if key not in shell_keys:
201
+ env_vars[key] = value
202
+ # shell 转发 (仅 KSADK_/OPENAI_/KSYUN_/E2B_ 前缀 + 白名单);shell 覆盖 auto .env 与全局配置
203
+ for key, value in sorted(os.environ.items()):
204
+ if value and _should_forward_process_env(key):
205
+ env_vars[key] = value
206
+ explicit = dict(explicit_env_vars or {})
207
+ for key in _CONTROL_PLANE_ONLY_ENV_KEYS:
208
+ if key not in explicit:
209
+ env_vars.pop(key, None)
210
+ # explicit --env/--env-file (显式 CLI 意图最高,可选择性注入运行时凭证)
211
+ env_vars.update(explicit)
210
212
  env_vars.setdefault("TZ", DEFAULT_RUNTIME_TIMEZONE)
213
+ env_vars.setdefault("KSADK_DEPLOYMENT_MODE", "ksadk_managed_cloud")
211
214
  return env_vars, env_file.exists(), project_env_count
212
215
 
216
+ @staticmethod
217
+ def _bind_managed_runtime_contract_env(
218
+ env_vars: Dict[str, str],
219
+ runtime_config: Optional[Dict[str, str]],
220
+ ) -> Dict[str, str]:
221
+ """Keep the deployed provider model aligned with the admitted manifest.
222
+
223
+ Credential env files are reusable across projects and commonly contain
224
+ ``OPENAI_MODEL_NAME``. For a ManagedRuntime declaration, however, the
225
+ manifest's ``model`` is the admitted source of truth. Letting a generic
226
+ credential file override it makes capability probing and the actual
227
+ provider request select different upstream protocols.
228
+ """
229
+
230
+ if not runtime_config:
231
+ return env_vars
232
+ try:
233
+ manifest = yaml.safe_load(str(runtime_config.get("manifest") or ""))
234
+ except yaml.YAMLError:
235
+ return env_vars
236
+ if not isinstance(manifest, dict):
237
+ return env_vars
238
+ model = str(manifest.get("model") or "").strip()
239
+ if not model:
240
+ return env_vars
241
+ bound = dict(env_vars)
242
+ bound["OPENAI_MODEL_NAME"] = model
243
+ return bound
244
+
213
245
  @staticmethod
214
246
  def _inject_ui_runtime_env(
215
247
  env_vars: Dict[str, str],
@@ -257,6 +289,18 @@ class ServerlessProvider(BaseDeployProvider):
257
289
  with open(metadata_file, "w", encoding="utf-8") as f:
258
290
  json.dump(payload, f, indent=2, ensure_ascii=False)
259
291
 
292
+ @staticmethod
293
+ def _sha256_file(path: Path) -> str:
294
+ digest = hashlib.sha256()
295
+ with path.open("rb") as source:
296
+ for chunk in iter(lambda: source.read(1024 * 1024), b""):
297
+ digest.update(chunk)
298
+ return digest.hexdigest()
299
+
300
+ @staticmethod
301
+ def _is_sha256_digest(value: str) -> bool:
302
+ return len(value) == 64 and all(char in "0123456789abcdef" for char in value.lower())
303
+
260
304
  @staticmethod
261
305
  def _serialize_network_config(
262
306
  target: DeployTarget, *, is_update: bool = False
@@ -387,23 +431,9 @@ class ServerlessProvider(BaseDeployProvider):
387
431
  artifact_type = target.extra.get("artifact_type", "Code")
388
432
 
389
433
  if artifact_type == "ManagedRuntime":
390
- # Declarative runtimes are delivered by Server -> Runtime Service as
391
- # an inline manifest. Keep a local bundle only for inspection; do
392
- # not acquire credentials or upload it to KS3.
393
- from ksadk.builders.managed_runtime_builder import ManagedRuntimeBuilder
394
-
395
- builder = ManagedRuntimeBuilder(
396
- Path(package_info.project_dir),
397
- config=target.extra.copy(),
398
- runtime_version=str(target.extra.get("runtime_version") or ""),
399
- )
400
- build_result = builder.build()
401
- if not build_result.success:
402
- raise Exception(f"构建失败: {build_result.error_message}")
403
- package_info.metadata.update(build_result.metadata)
404
- if build_result.artifact_path is not None:
405
- package_info.metadata["managed_manifest_path"] = str(build_result.artifact_path)
406
- return package_info
434
+ from ksadk.deployment.managed_runtime import build_managed_runtime_package
435
+
436
+ return build_managed_runtime_package(package_info, target)
407
437
 
408
438
  if artifact_type == "Code":
409
439
  # 1. 检查是否已有 KS3 路径
@@ -419,9 +449,20 @@ class ServerlessProvider(BaseDeployProvider):
419
449
  return package_info
420
450
 
421
451
  # 如果没有 no_cache 且有缓存,才使用缓存
422
- if not no_cache and not repackage and cached_ks3_path:
452
+ cached_checksum = str(package_info.metadata.get("code_checksum") or "").strip()
453
+ if (
454
+ not no_cache
455
+ and not repackage
456
+ and cached_ks3_path
457
+ and self._is_sha256_digest(cached_checksum)
458
+ ):
423
459
  logger.info(f"Using cached bundle: {cached_ks3_path}")
424
460
  return package_info
461
+ if cached_ks3_path and not no_cache and not repackage:
462
+ # Older metadata had only a KS3 URI. Re-upload instead of
463
+ # silently creating a legacy agent that cannot be admitted to
464
+ # the hosted Kernel path.
465
+ click.echo(" 缓存代码包缺少 SHA-256,重新打包并上传以启用 Kernel 准入")
425
466
 
426
467
  # 2. 构建 ZIP 包
427
468
 
@@ -430,20 +471,24 @@ class ServerlessProvider(BaseDeployProvider):
430
471
  builder_config["no_cache"] = no_cache
431
472
  builder_config["repackage"] = repackage
432
473
 
474
+ artifact_builder: BaseBuilder
433
475
  if artifact_type == "ManagedRuntime":
434
476
  from ksadk.builders.managed_runtime_builder import ManagedRuntimeBuilder
435
477
 
436
- builder = ManagedRuntimeBuilder(
478
+ artifact_builder = ManagedRuntimeBuilder(
437
479
  Path(package_info.project_dir),
438
480
  config=builder_config,
439
481
  runtime_version=str(target.extra.get("runtime_version") or ""),
440
482
  )
441
483
  else:
442
484
  # CodeBuilder 直接操作原始 project_dir。
443
- builder = CodeBuilder(Path(package_info.project_dir), config=builder_config)
485
+ artifact_builder = CodeBuilder(
486
+ Path(package_info.project_dir),
487
+ config=builder_config,
488
+ )
444
489
 
445
490
  # 执行构建
446
- build_result = builder.build()
491
+ build_result = artifact_builder.build()
447
492
 
448
493
  if not build_result.success:
449
494
  raise Exception(f"构建失败: {build_result.error_message}")
@@ -452,6 +497,7 @@ class ServerlessProvider(BaseDeployProvider):
452
497
  if zip_path is None:
453
498
  raise RuntimeError("代码构建成功但未生成 artifact_path")
454
499
  package_info.metadata.update(build_result.metadata)
500
+ package_info.metadata["code_checksum"] = self._sha256_file(zip_path)
455
501
  if build_result.metadata.get("manifest_sha256"):
456
502
  target.extra["manifest_sha256"] = build_result.metadata["manifest_sha256"]
457
503
  # click.echo(f" ✅ ZIP 已生成: {zip_path}")
@@ -692,6 +738,10 @@ class ServerlessProvider(BaseDeployProvider):
692
738
  runtime_config = {
693
739
  "name": str(target.extra.get("runtime_name") or "").strip(),
694
740
  "version": str(target.extra.get("runtime_version") or "").strip(),
741
+ "manifest_sha256": str(target.extra.get("manifest_sha256") or "").strip(),
742
+ "manifest": str(
743
+ package_info.metadata.get("managed_runtime_manifest") or ""
744
+ ),
695
745
  }
696
746
  missing = [key for key, value in runtime_config.items() if not value]
697
747
  if missing:
@@ -700,6 +750,11 @@ class ServerlessProvider(BaseDeployProvider):
700
750
  + ", ".join(f"runtime_config.{key}" for key in missing)
701
751
  )
702
752
 
753
+ code_checksum = str(package_info.metadata.get("code_checksum") or "").strip()
754
+ if not self._is_sha256_digest(code_checksum):
755
+ code_checksum = ""
756
+ code_command = list(_HOSTED_CODE_COMMAND) if code_backed and code_checksum else None
757
+
703
758
  try:
704
759
  # 获取 dry_run 标识
705
760
  is_dry_run = target.extra.get("dry_run", False)
@@ -707,34 +762,101 @@ class ServerlessProvider(BaseDeployProvider):
707
762
  async with AgentEngineClient(region=target.region, dry_run=is_dry_run) as client:
708
763
  agent_exists = False
709
764
 
710
- if existing_agent_id:
711
- # 有本地状态 → 先检查服务器上是否存在
712
- click.echo(f" 检测到本地状态: {existing_agent_id}")
713
-
714
- try:
715
- # 尝试获取 agent,确认是否存在
716
- existing_agent = await client.get_agent(existing_agent_id)
717
- if existing_agent:
718
- agent_exists = True
719
- except Exception as e:
720
- # Agent 不存在或查询失败
721
- err_msg = str(e).lower()
722
- if "not found" in err_msg or "404" in err_msg or "不存在" in err_msg:
723
- click.secho(
724
- f" ⚠️ 服务器上未找到 Agent {existing_agent_id},将创建新 Agent",
725
- fg="yellow",
765
+ # 显式 --agent-id:优先于本地 state,用于状态丢失后重新关联已有 Agent。
766
+ explicit_agent_id = (target.extra.get("agent_id") or "").strip() or None
767
+ if explicit_agent_id:
768
+ if existing_agent_id and existing_agent_id != explicit_agent_id:
769
+ click.secho(
770
+ f" ⚠️ --agent-id ({explicit_agent_id}) 与本地状态 "
771
+ f"({existing_agent_id}) 不一致,以 --agent-id 为准",
772
+ fg="yellow",
773
+ )
774
+ if is_dry_run:
775
+ # DryRun 无法真实校验,假设存在并走更新路径
776
+ existing_agent_id = explicit_agent_id
777
+ agent_exists = True
778
+ click.secho(
779
+ f" [Dry Run] 假设 Agent {explicit_agent_id} 存在", fg="cyan"
780
+ )
781
+ else:
782
+ try:
783
+ detail = await client.get_agent(
784
+ explicit_agent_id, include_api_key=True
726
785
  )
727
- agent_exists = False
728
- # DryRun 异常表示真实请求被拦截,无法确认 Agent 是否存在。
729
- # 为安全起见,DryRun 假设它存在并走更新路径。
730
- elif "Dry Run" in str(e):
731
- click.secho(
732
- f" [Dry Run] 假设 Agent {existing_agent_id} 存在", fg="cyan"
786
+ except Exception as e:
787
+ return DeployResult(
788
+ status=DeployStatus.FAILED,
789
+ agent_id=explicit_agent_id,
790
+ message=(
791
+ f"❌ 指定的 Agent ID '{explicit_agent_id}' 不存在,"
792
+ f"或当前凭证无权限访问。\n"
793
+ f" 详情: {e}\n"
794
+ " 👉 请确认 agent_id 正确,且当前 AK/SK / 账号"
795
+ "有该 Agent 的权限。"
796
+ ),
733
797
  )
734
- agent_exists = True
735
- else:
736
- # 其他错误,重新抛出
737
- raise
798
+
799
+ # 校验通过 → 关联并回填 state,走热更新
800
+ qa = detail.get("quick_access", {}) or {}
801
+ basic = detail.get("basic", {}) or {}
802
+ recovered_state = local_state.copy()
803
+ recovered_state.update(
804
+ {
805
+ "agent_id": explicit_agent_id,
806
+ "name": basic.get("name") or package_info.name,
807
+ "region": target.region,
808
+ "endpoint": qa.get("public_endpoint"),
809
+ "updated_at": self._now_iso(),
810
+ }
811
+ )
812
+ if qa.get("api_key"):
813
+ recovered_state["api_key"] = qa["api_key"]
814
+ # 去掉 None 值,避免覆盖掉旧的有效字段
815
+ recovered_state = {
816
+ k: v for k, v in recovered_state.items() if v is not None
817
+ }
818
+ self._save_state(state_file, recovered_state)
819
+ local_state = recovered_state
820
+
821
+ existing_agent_id = explicit_agent_id
822
+ agent_exists = True
823
+ click.secho(
824
+ f" 🔗 已通过 --agent-id 关联 Agent: {explicit_agent_id} "
825
+ f"(已回填 .agentengine.state)",
826
+ fg="green",
827
+ )
828
+
829
+ # ``agent_exists`` means the target has already been resolved
830
+ # (including an explicit ``--agent-id``). Both that path and
831
+ # the normal state-file lookup must enter the same hot-update
832
+ # branch. The explicit path must not need a second GetAgent
833
+ # request merely to enter that branch.
834
+ if existing_agent_id:
835
+ if not agent_exists:
836
+ # 有本地状态 → 先检查服务器上是否存在
837
+ click.echo(f" 检测到本地状态: {existing_agent_id}")
838
+ try:
839
+ existing_agent = await client.get_agent(existing_agent_id)
840
+ if existing_agent:
841
+ agent_exists = True
842
+ except Exception as e:
843
+ err_msg = str(e).lower()
844
+ if "not found" in err_msg or "404" in err_msg or "不存在" in err_msg:
845
+ click.secho(
846
+ " ⚠️ 服务器上未找到 Agent "
847
+ f"{existing_agent_id},将创建新 Agent",
848
+ fg="yellow",
849
+ )
850
+ agent_exists = False
851
+ # DryRun 异常表示真实请求被拦截,无法确认 Agent 是否存在。
852
+ # 为安全起见,DryRun 假设它存在并走更新路径。
853
+ elif "Dry Run" in str(e):
854
+ click.secho(
855
+ f" [Dry Run] 假设 Agent {existing_agent_id} 存在", fg="cyan"
856
+ )
857
+ agent_exists = True
858
+ else:
859
+ raise
738
860
 
739
861
  if agent_exists:
740
862
  # Agent 存在 → 执行更新
@@ -766,6 +888,9 @@ class ServerlessProvider(BaseDeployProvider):
766
888
 
767
889
  if ks3_config:
768
890
  update_data["ks3"] = ks3_config
891
+ if code_checksum:
892
+ update_data["code_checksum"] = code_checksum
893
+ update_data["code_command"] = code_command
769
894
  elif artifact_type == "Container":
770
895
  image_credential = self._image_credential_from_env(artifact_path)
771
896
  if image_credential:
@@ -781,6 +906,10 @@ class ServerlessProvider(BaseDeployProvider):
781
906
  project_dir,
782
907
  target.extra.get("env_vars") or {},
783
908
  )
909
+ env_vars = self._bind_managed_runtime_contract_env(
910
+ env_vars,
911
+ runtime_config,
912
+ )
784
913
  env_vars = self._inject_ui_runtime_env(env_vars, ui_state, local_state)
785
914
  if env_vars:
786
915
  update_data["env_vars"] = env_vars
@@ -889,6 +1018,9 @@ class ServerlessProvider(BaseDeployProvider):
889
1018
 
890
1019
  if ks3_config:
891
1020
  request_data["ks3"] = ks3_config
1021
+ if code_checksum:
1022
+ request_data["code_checksum"] = code_checksum
1023
+ request_data["code_command"] = code_command
892
1024
 
893
1025
  # Container 模式: 传递镜像凭证
894
1026
  if artifact_type == "Container":
@@ -905,6 +1037,10 @@ class ServerlessProvider(BaseDeployProvider):
905
1037
  project_dir,
906
1038
  target.extra.get("env_vars") or {},
907
1039
  )
1040
+ env_vars = self._bind_managed_runtime_contract_env(
1041
+ env_vars,
1042
+ runtime_config,
1043
+ )
908
1044
  env_vars = self._inject_ui_runtime_env(env_vars, ui_state, local_state)
909
1045
  if env_vars:
910
1046
  if env_file_exists:
@@ -0,0 +1,116 @@
1
+ """Public contracts and file loading for local Agent evaluation."""
2
+
3
+ from .a2a_adapter import A2ATargetAdapter, A2ATargetError
4
+ from .adapters import (
5
+ EvaluationNotImplementedError,
6
+ TargetAdapter,
7
+ TargetAdapterError,
8
+ create_target_adapter,
9
+ )
10
+ from .cloud_binding import CloudBinding, CloudBindingError, CloudBindingStore
11
+ from .cloud_converter import (
12
+ CloudDatasetColumn,
13
+ CloudDatasetRow,
14
+ CloudDatasetSnapshot,
15
+ EvalSetCloudConversionError,
16
+ evalset_from_dataset_snapshot,
17
+ evalset_to_dataset_snapshot,
18
+ )
19
+ from .cloud_service import (
20
+ CloudEvalSetPreviewError,
21
+ CloudEvalSetCatalogItem,
22
+ CloudEvalSetPublishResult,
23
+ CloudEvalSetPullResult,
24
+ CloudEvalSetService,
25
+ )
26
+ from .contracts import (
27
+ AssertionSpec,
28
+ AssertionType,
29
+ CaseRun,
30
+ CloudDatasetRef,
31
+ DataPolicy,
32
+ EvalCase,
33
+ EvalRunReport,
34
+ EvalRunSpec,
35
+ EvalRunStatus,
36
+ EvalRunSummary,
37
+ EvalSetVersion,
38
+ EvalTurn,
39
+ EvaluationConfig,
40
+ EvaluationRequest,
41
+ MetricResult,
42
+ MetricStatus,
43
+ TargetKind,
44
+ TargetRef,
45
+ TargetRun,
46
+ TargetRunStatus,
47
+ TargetSnapshot,
48
+ TraceRef,
49
+ UsageSnapshot,
50
+ )
51
+ from .evalset import (
52
+ EvalSetFormat,
53
+ EvalSetParseError,
54
+ identify_evalset_format,
55
+ load_evalset,
56
+ parse_evalset,
57
+ )
58
+ from .executor import EvaluationExecutionError, execute_evaluation
59
+ from .storage import EvaluationStorage, EvaluationStorageError
60
+ from .target import EvaluationTarget
61
+
62
+ __all__ = [
63
+ "AssertionSpec",
64
+ "AssertionType",
65
+ "A2ATargetAdapter",
66
+ "A2ATargetError",
67
+ "CloudBinding",
68
+ "CloudBindingError",
69
+ "CloudBindingStore",
70
+ "CloudDatasetRef",
71
+ "CloudDatasetColumn",
72
+ "CloudDatasetRow",
73
+ "CloudDatasetSnapshot",
74
+ "CloudEvalSetPreviewError",
75
+ "CloudEvalSetCatalogItem",
76
+ "CloudEvalSetPublishResult",
77
+ "CloudEvalSetPullResult",
78
+ "CloudEvalSetService",
79
+ "CaseRun",
80
+ "DataPolicy",
81
+ "EvalCase",
82
+ "EvalRunReport",
83
+ "EvalRunSummary",
84
+ "EvalRunSpec",
85
+ "EvalRunStatus",
86
+ "EvalSetFormat",
87
+ "EvalSetParseError",
88
+ "EvalSetVersion",
89
+ "EvalTurn",
90
+ "EvaluationConfig",
91
+ "EvaluationExecutionError",
92
+ "EvalSetCloudConversionError",
93
+ "EvaluationNotImplementedError",
94
+ "EvaluationRequest",
95
+ "EvaluationStorage",
96
+ "EvaluationStorageError",
97
+ "EvaluationTarget",
98
+ "MetricResult",
99
+ "MetricStatus",
100
+ "TargetKind",
101
+ "TargetAdapter",
102
+ "TargetAdapterError",
103
+ "TargetRun",
104
+ "TargetRunStatus",
105
+ "TargetSnapshot",
106
+ "TargetRef",
107
+ "TraceRef",
108
+ "UsageSnapshot",
109
+ "identify_evalset_format",
110
+ "load_evalset",
111
+ "parse_evalset",
112
+ "execute_evaluation",
113
+ "evalset_from_dataset_snapshot",
114
+ "evalset_to_dataset_snapshot",
115
+ "create_target_adapter",
116
+ ]