agentengine-sdk-python 0.8.1__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 (411) hide show
  1. {agentengine_sdk_python-0.8.1.dist-info → agentengine_sdk_python-0.8.2.dist-info}/METADATA +22 -2
  2. {agentengine_sdk_python-0.8.1.dist-info → agentengine_sdk_python-0.8.2.dist-info}/RECORD +356 -222
  3. ksadk/a2a/_space_client_events.py +381 -0
  4. ksadk/a2a/event_adapter.py +156 -64
  5. ksadk/a2a/executor.py +179 -63
  6. ksadk/a2a/space_client.py +6 -333
  7. ksadk/a2ui/core.py +222 -53
  8. ksadk/agui/_agent_helpers.py +243 -0
  9. ksadk/agui/a2ui_projection.py +12 -5
  10. ksadk/agui/agent.py +443 -259
  11. ksadk/api/client.py +525 -27
  12. ksadk/builders/code_builder.py +284 -8
  13. ksadk/builders/container_builder.py +8 -1
  14. ksadk/builders/managed_runtime_builder.py +39 -35
  15. ksadk/cli/__init__.py +17 -0
  16. ksadk/cli/cmd_dashboard.py +15 -1
  17. ksadk/cli/cmd_deploy.py +10 -2
  18. ksadk/cli/cmd_eval.py +66 -9
  19. ksadk/cli/cmd_evalset.py +284 -0
  20. ksadk/cli/cmd_files.py +5 -1
  21. ksadk/cli/cmd_hermes.py +1 -126
  22. ksadk/cli/cmd_invoke.py +28 -38
  23. ksadk/cli/cmd_managed_runtime.py +95 -0
  24. ksadk/cli/cmd_observe.py +85 -0
  25. ksadk/cli/cmd_openclaw.py +1 -435
  26. ksadk/cli/cmd_replay.py +28 -4
  27. ksadk/cli/cmd_studio.py +99 -8
  28. ksadk/cli/cmd_web.py +10 -2
  29. ksadk/cli/hermes_env.py +151 -0
  30. ksadk/cli/invoke_payload.py +49 -0
  31. ksadk/cli/openclaw_env.py +458 -0
  32. ksadk/codex/client.py +180 -30
  33. ksadk/codex/runtime.py +428 -326
  34. ksadk/configs/env_registry.py +66 -12
  35. ksadk/configs/env_registry_pcm.py +181 -0
  36. ksadk/configs/env_var_spec.py +18 -0
  37. ksadk/configs/global_config.py +5 -0
  38. ksadk/context_engine/__init__.py +98 -0
  39. ksadk/context_engine/assembler.py +176 -0
  40. ksadk/context_engine/baseline.py +419 -0
  41. ksadk/context_engine/cache_observability.py +228 -0
  42. ksadk/context_engine/capabilities.py +443 -0
  43. ksadk/context_engine/contributors.py +344 -0
  44. ksadk/context_engine/hosted_pipeline.py +417 -0
  45. ksadk/context_engine/models.py +117 -0
  46. ksadk/context_engine/planner.py +698 -0
  47. ksadk/context_engine/policies.py +319 -0
  48. ksadk/context_engine/projection.py +31 -0
  49. ksadk/context_engine/shadow_plan.py +266 -0
  50. ksadk/context_engine/tokenizer.py +164 -0
  51. ksadk/conversations/context.py +126 -6
  52. ksadk/conversations/message_projection.py +292 -28
  53. ksadk/conversations/model_context.py +49 -3
  54. ksadk/conversations/runtime_compaction.py +207 -5
  55. ksadk/conversations/runtime_input.py +184 -2
  56. ksadk/conversations/runtime_invocation.py +81 -3
  57. ksadk/conversations/runtime_observability.py +141 -0
  58. ksadk/conversations/runtime_payloads.py +42 -0
  59. ksadk/conversations/runtime_preparation.py +272 -2
  60. ksadk/conversations/runtime_resume.py +20 -1
  61. ksadk/conversations/runtime_stream_events.py +94 -9
  62. ksadk/conversations/semantic_summary.py +311 -1
  63. ksadk/conversations/session_lock.py +51 -0
  64. ksadk/deployment/env_forward.py +72 -0
  65. ksadk/deployment/managed_runtime.py +5 -0
  66. ksadk/deployment/providers/serverless.py +143 -69
  67. ksadk/evaluation/__init__.py +32 -0
  68. ksadk/evaluation/a2a_adapter.py +9 -1
  69. ksadk/evaluation/adapters.py +18 -5
  70. ksadk/evaluation/agent_eval_client.py +395 -0
  71. ksadk/evaluation/cloud_binding.py +80 -0
  72. ksadk/evaluation/cloud_converter.py +194 -0
  73. ksadk/evaluation/cloud_service.py +199 -0
  74. ksadk/evaluation/contracts.py +73 -4
  75. ksadk/evaluation/evaluators.py +183 -17
  76. ksadk/evaluation/evidence.py +258 -0
  77. ksadk/evaluation/executor.py +31 -6
  78. ksadk/evaluation/local_adapter.py +550 -0
  79. ksadk/evaluation/service_env.py +27 -0
  80. ksadk/evaluation/studio_build_adapter.py +253 -0
  81. ksadk/evaluation/target.py +15 -6
  82. ksadk/events/__init__.py +13 -13
  83. ksadk/events/_v1_compat/__init__.py +1 -0
  84. ksadk/events/_v1_compat/models.py +299 -0
  85. ksadk/events/_v1_compat/parser.py +247 -0
  86. ksadk/events/_v1_compat/projection.py +753 -0
  87. ksadk/events/adapters/__init__.py +34 -0
  88. ksadk/events/adapters/_a2a_snapshot.py +622 -0
  89. ksadk/events/adapters/_a2a_support.py +275 -0
  90. ksadk/events/adapters/_codex_interactions.py +375 -0
  91. ksadk/events/adapters/_codex_items.py +801 -0
  92. ksadk/events/adapters/_codex_validators.py +311 -0
  93. ksadk/events/adapters/_langgraph_support.py +785 -0
  94. ksadk/events/adapters/a2a.py +841 -0
  95. ksadk/events/adapters/adk.py +503 -0
  96. ksadk/events/adapters/codex.py +717 -0
  97. ksadk/events/adapters/langgraph.py +745 -0
  98. ksadk/events/canonical.py +440 -0
  99. ksadk/events/canonical_replay.py +497 -0
  100. ksadk/events/canonical_store.py +468 -0
  101. ksadk/events/cold_recovery.py +257 -0
  102. ksadk/events/content.py +89 -0
  103. ksadk/events/identity.py +86 -0
  104. ksadk/events/pipeline.py +455 -0
  105. ksadk/events/projections.py +66 -0
  106. ksadk/events/reducer.py +661 -0
  107. ksadk/events/replay.py +3 -36
  108. ksadk/events/runtime_event.py +20 -265
  109. ksadk/events/session_event.py +324 -0
  110. ksadk/events/store.py +3 -316
  111. ksadk/events/v1_compat.py +41 -0
  112. ksadk/harness/runtime.py +160 -57
  113. ksadk/identity/resolver.py +4 -3
  114. ksadk/interaction/__init__.py +28 -0
  115. ksadk/interaction/contracts.py +136 -0
  116. ksadk/interaction/ledger.py +189 -0
  117. ksadk/interaction/provider.py +122 -0
  118. ksadk/interaction/providers/__init__.py +52 -0
  119. ksadk/interaction/providers/adk.py +40 -0
  120. ksadk/interaction/providers/codex.py +94 -0
  121. ksadk/interaction/providers/langgraph.py +58 -0
  122. ksadk/kernel/__init__.py +117 -0
  123. ksadk/kernel/authorization.py +258 -0
  124. ksadk/kernel/bootstrap.py +1074 -0
  125. ksadk/kernel/contract_fingerprints.py +61 -0
  126. ksadk/kernel/contracts.py +362 -0
  127. ksadk/kernel/control.py +219 -0
  128. ksadk/kernel/errors.py +79 -0
  129. ksadk/kernel/ingress.py +1102 -0
  130. ksadk/kernel/mapping.py +111 -0
  131. ksadk/kernel/memory_store.py +1133 -0
  132. ksadk/kernel/postgres_store.py +1756 -0
  133. ksadk/kernel/recovery.py +452 -0
  134. ksadk/kernel/runtime_identity.py +103 -0
  135. ksadk/kernel/sql/001_agent_kernel.sql +120 -0
  136. ksadk/kernel/sqlite_store.py +1410 -0
  137. ksadk/kernel/state.py +145 -0
  138. ksadk/kernel/store.py +232 -0
  139. ksadk/kernel/worker.py +953 -0
  140. ksadk/knowledge_base/client.py +7 -0
  141. ksadk/knowledge_base/service.py +32 -5
  142. ksadk/memory/__init__.py +61 -0
  143. ksadk/memory/adk/backends/base_ltm_backend.py +96 -1
  144. ksadk/memory/adk/backends/http_ltm_backend.py +14 -5
  145. ksadk/memory/adk/backends/inmemory_ltm_backend.py +136 -3
  146. ksadk/memory/adk/backends/sdk_ltm_backend.py +384 -2
  147. ksadk/memory/adk/backends/sqlite_ltm_backend.py +95 -0
  148. ksadk/memory/coordinator.py +461 -0
  149. ksadk/memory/events.py +202 -0
  150. ksadk/memory/extraction.py +228 -0
  151. ksadk/memory/ltm_backend_factory.py +16 -3
  152. ksadk/memory/models.py +316 -0
  153. ksadk/memory/policy.py +215 -0
  154. ksadk/memory/provider.py +47 -0
  155. ksadk/memory/provider_adapter.py +159 -0
  156. ksadk/memory/provider_resolver.py +71 -0
  157. ksadk/memory/providers/__init__.py +5 -0
  158. ksadk/memory/providers/local_sqlite.py +490 -0
  159. ksadk/memory/resolved_policy.py +145 -0
  160. ksadk/memory/service.py +188 -6
  161. ksadk/model_proxy/bootstrap.py +16 -9
  162. ksadk/model_proxy/detect.py +202 -9
  163. ksadk/model_proxy/namespace.py +39 -15
  164. ksadk/model_proxy/server.py +24 -5
  165. ksadk/model_proxy/transform.py +60 -2
  166. ksadk/observability/__init__.py +25 -0
  167. ksadk/observability/session_log.py +420 -0
  168. ksadk/observability/trajectory.py +105 -0
  169. ksadk/prompts/__init__.py +71 -0
  170. ksadk/prompts/compiler.py +215 -0
  171. ksadk/prompts/models.py +82 -0
  172. ksadk/prompts/projection.py +89 -0
  173. ksadk/prompts/resolved.py +137 -0
  174. ksadk/prompts/sources.py +233 -0
  175. ksadk/runners/_langgraph_runner_streams.py +822 -0
  176. ksadk/runners/adk_runner.py +5 -5
  177. ksadk/runners/base_runner.py +16 -0
  178. ksadk/runners/factory.py +1 -2
  179. ksadk/runners/langgraph_runner.py +198 -437
  180. ksadk/runtime/_runner_adapter/__init__.py +1 -0
  181. ksadk/runtime/_runner_adapter/stream_mapping.py +788 -0
  182. ksadk/runtime/adapter.py +118 -2
  183. ksadk/runtime/conversation_execution.py +316 -182
  184. ksadk/runtime/executor.py +144 -3
  185. ksadk/runtime/factory.py +193 -7
  186. ksadk/runtime/hosted_finalizer.py +268 -0
  187. ksadk/runtime/launch.py +14 -1
  188. ksadk/runtime/preprocessing.py +25 -3
  189. ksadk/runtime/runner_adapter.py +288 -508
  190. ksadk/runtime/usage.py +33 -0
  191. ksadk/sandbox/backends/e2b.py +35 -2
  192. ksadk/server/composition.py +8 -0
  193. ksadk/server/factory.py +69 -6
  194. ksadk/server/routes/kernel_ingress.py +258 -0
  195. ksadk/server/routes/openai_compat.py +88 -8
  196. ksadk/server/routes/projection.py +35 -20
  197. ksadk/server/routes/run.py +94 -0
  198. ksadk/server/routes/sessions.py +2 -0
  199. ksadk/server/routes/streaming.py +5 -2
  200. ksadk/server/static/assets/{ArtifactsPanel-CakCqxEN.js → ArtifactsPanel-DSU1sWD_.js} +1 -1
  201. ksadk/server/static/assets/{CodeBlock-CynLknyO.js → CodeBlock-DOH6MVcn.js} +4 -4
  202. ksadk/server/static/assets/{MathMessageMarkdown-3sQdOysS.js → MathMessageMarkdown-BL8my1R2.js} +4 -4
  203. ksadk/server/static/assets/MathMessageMarkdown-BorAY7qD.css +1 -0
  204. ksadk/server/static/assets/MermaidBlock-Dz4IP-Tx.js +312 -0
  205. ksadk/server/static/assets/NativeTerminalPanel-DUrK0JpZ.js +1 -0
  206. ksadk/server/static/assets/abnfDiagram-VCTEODGH-g20pFzNV.js +1 -0
  207. ksadk/server/static/assets/arc-C4FzinUA.js +1 -0
  208. ksadk/server/static/assets/architecture-7GRP2DOG-DjKratdf.js +1 -0
  209. ksadk/server/static/assets/architectureDiagram-5GKGNRK7-DpIqL5h4.js +36 -0
  210. ksadk/server/static/assets/blockDiagram-NRAW4CY4-BjkljTNz.js +129 -0
  211. ksadk/server/static/assets/c4Diagram-UCG6FXSJ-Dk_ieq2X.js +38 -0
  212. ksadk/server/static/assets/channel-4cQHKtx1.js +1 -0
  213. ksadk/server/static/assets/chunk-2Q5K7J3B-DmgWkESh.js +1 -0
  214. ksadk/server/static/assets/{chunk-FMBD7UC4-B_fH2YuH.js → chunk-5VM5RSS4-BVHAchFb.js} +1 -1
  215. ksadk/server/static/assets/{chunk-ND2GUHAM-D6rFLaVV.js → chunk-F27PBJKO-C-ipQzuS.js} +1 -1
  216. ksadk/server/static/assets/chunk-G27WJ6UU-C2EyJbIK.js +231 -0
  217. ksadk/server/static/assets/{chunk-4BX2VUAB-B9drTgOW.js → chunk-JWPE2WC7-vYvVJb_M.js} +1 -1
  218. ksadk/server/static/assets/chunk-LCL6LL3I-BcI6ysPT.js +206 -0
  219. ksadk/server/static/assets/chunk-POPQ4Y6H-C030x_Z1.js +1 -0
  220. ksadk/server/static/assets/chunk-RHFEMEQ7-yyGpsz4n.js +168 -0
  221. ksadk/server/static/assets/chunk-SVP7TREG-BLTlmMU7.js +88 -0
  222. ksadk/server/static/assets/chunk-XXDRQBXY-C_32ArgP.js +1 -0
  223. ksadk/server/static/assets/classDiagram-DTDB5LWJ-DLFd9Xi0.js +1 -0
  224. ksadk/server/static/assets/classDiagram-v2-JRS7N3AN-DLFd9Xi0.js +1 -0
  225. ksadk/server/static/assets/{cose-bilkent-S5V4N54A-ChNs_Mdk.js → cose-bilkent-JH36ORCC-9YQYwdl0.js} +1 -1
  226. ksadk/server/static/assets/cynefin-OW5HDTMX-DjEM48Qp.js +1 -0
  227. ksadk/server/static/assets/cynefinDiagram-5FMLGOSQ-ErLF5N13.js +62 -0
  228. ksadk/server/static/assets/cytoscape.esm-CyCl8rPi.js +321 -0
  229. ksadk/server/static/assets/dagre-3AP2YEHR-DFiQF-6f.js +4 -0
  230. ksadk/server/static/assets/dagre-BuhGnRI1.js +1 -0
  231. ksadk/server/static/assets/diagram-S7CK7UJ4-Bt1v8-GC.js +30 -0
  232. ksadk/server/static/assets/diagram-UQ7AKVKN-DSCxJdBK.js +41 -0
  233. ksadk/server/static/assets/diagram-VSXAHHWV-DHfYwp_9.js +3 -0
  234. ksadk/server/static/assets/diagram-VX7I27RA-DdzD-4Le.js +24 -0
  235. ksadk/server/static/assets/diagram-Z3DM3KII-Du-nAJ9F.js +24 -0
  236. ksadk/server/static/assets/{dist-Dli7qW-B.js → dist-8hqcx0sU.js} +1 -1
  237. ksadk/server/static/assets/dist-B7seoj3d.js +1 -0
  238. ksadk/server/static/assets/{dist-C1sz5Eo3.js → dist-BE7bu-DL.js} +1 -1
  239. ksadk/server/static/assets/{dist-fhOuWds5.js → dist-BVDffZ0U.js} +1 -1
  240. ksadk/server/static/assets/{dist-BjOdlDjj.js → dist-BX8z72IC.js} +1 -1
  241. ksadk/server/static/assets/{dist-DsHPdk3W.js → dist-Bf2M8m3N.js} +1 -1
  242. ksadk/server/static/assets/{dist-o2OVmKvt.js → dist-BjU6y-A2.js} +1 -1
  243. ksadk/server/static/assets/{dist-DWKByxWV.js → dist-BytlxIDT.js} +1 -1
  244. ksadk/server/static/assets/{dist-DJN_6Y39.js → dist-CSh_DE14.js} +1 -1
  245. ksadk/server/static/assets/{dist-DQU9EWw-.js → dist-CXYYBw3_.js} +1 -1
  246. ksadk/server/static/assets/{dist-4N2NMVYg.js → dist-C_wsv-Qd.js} +1 -1
  247. ksadk/server/static/assets/{dist-gLnrGsoU.js → dist-ClxGviKw.js} +1 -1
  248. ksadk/server/static/assets/{dist-j6Dxmf_j.js → dist-CttYUqzS.js} +1 -1
  249. ksadk/server/static/assets/{dist-D6MpCZtz.js → dist-DNp6rLRA.js} +1 -1
  250. ksadk/server/static/assets/{dist-BB3-OwTQ.js → dist-DUX-id_F.js} +1 -1
  251. ksadk/server/static/assets/{dist-_pHPTyZ-.js → dist-DmldrHd_.js} +1 -1
  252. ksadk/server/static/assets/{dist-CWV4lDr1.js → dist-DnfXs8Vn.js} +2 -2
  253. ksadk/server/static/assets/{dist-B5oS1zcj.js → dist-Dq9gLD7L.js} +1 -1
  254. ksadk/server/static/assets/{dist-B-jNR6Vn.js → dist-W-TIVntx.js} +1 -1
  255. ksadk/server/static/assets/{dist-BIlKoW0k.js → dist-dDdADKFA.js} +1 -1
  256. ksadk/server/static/assets/{dist-X4TnqwOK.js → dist-dydu68Fl.js} +1 -1
  257. ksadk/server/static/assets/{dist-CmZHzlwZ.js → dist-ngtN0DJB.js} +1 -1
  258. ksadk/server/static/assets/ebnfDiagram-PWID7BFC-Da9C9NO1.js +1 -0
  259. ksadk/server/static/assets/erDiagram-SSCWMZ5O-EAGqqR79.js +99 -0
  260. ksadk/server/static/assets/eventmodeling-NTZA5JFV-CMgMaJrC.js +1 -0
  261. ksadk/server/static/assets/flowDiagram-A5DVABFB-BBKL0x3P.js +1 -0
  262. ksadk/server/static/assets/ganttDiagram-EL5Y4UJY-DqJsKb59.js +292 -0
  263. ksadk/server/static/assets/gitGraph-4MIJSDKK-Dw63mrhw.js +1 -0
  264. ksadk/server/static/assets/gitGraphDiagram-WWUBYQGX-B6g4dtDi.js +106 -0
  265. ksadk/server/static/assets/index-8ipRcQ-M.js +240 -0
  266. ksadk/server/static/assets/index-ByFCqjlh.css +2 -0
  267. ksadk/server/static/assets/info-A6RAGUB7-B6iAblII.js +1 -0
  268. ksadk/server/static/assets/infoDiagram-RXCK75RN-Djm_nbd5.js +2 -0
  269. ksadk/server/static/assets/{ishikawaDiagram-YF4QCWOH-K0OOfVna.js → ishikawaDiagram-5VMMS53U-DWya9SG2.js} +6 -6
  270. ksadk/server/static/assets/{journeyDiagram-JHISSGLW-8LeOJaZp.js → journeyDiagram-EYS64GPL-DutxhSNI.js} +6 -6
  271. ksadk/server/static/assets/{kanban-definition-UN3LZRKU-C6uCgZrW.js → kanban-definition-3QL26DDD-DJdOF8Fm.js} +10 -10
  272. ksadk/server/static/assets/katex-vFWytM5c.js +257 -0
  273. ksadk/server/static/assets/{linear-hdBcYzM8.js → linear-BHjG8b-J.js} +1 -1
  274. ksadk/server/static/assets/mermaid-parser.core-KGSy4jWT.js +166 -0
  275. ksadk/server/static/assets/{mindmap-definition-RKZ34NQL-Bjy_2v4_.js → mindmap-definition-FBJOCRG2-9-HC88D4.js} +29 -29
  276. ksadk/server/static/assets/packet-AYTQ26CC-BOYAipuq.js +1 -0
  277. ksadk/server/static/assets/pegDiagram-XKGWAZYB-DrEZd4fD.js +1 -0
  278. ksadk/server/static/assets/pie-WAS4IAKB-Ctq0Kbku.js +1 -0
  279. ksadk/server/static/assets/pieDiagram-E7YTZNPT-DpjqOFFp.js +39 -0
  280. ksadk/server/static/assets/{quadrantDiagram-W4KKPZXB-BmkRbwCg.js → quadrantDiagram-AXDQQJYC-BiNhgOXX.js} +6 -6
  281. ksadk/server/static/assets/radar-RG4KPBEZ-DN0-ul_0.js +1 -0
  282. ksadk/server/static/assets/railroad-74A4TZTK-C6cC_to0.js +1 -0
  283. ksadk/server/static/assets/railroad-abnf-HS5TGJTU-BimjIuRc.js +1 -0
  284. ksadk/server/static/assets/railroad-ebnf-LZEXJU2U-CvY65ABq.js +1 -0
  285. ksadk/server/static/assets/railroad-peg-WCYAUIDC-D72Iq_Tv.js +1 -0
  286. ksadk/server/static/assets/railroadDiagram-O6MQD6OU-_Y3Ojg6G.js +1 -0
  287. ksadk/server/static/assets/requirementDiagram-EFPCY7ZU-DeCFdg9K.js +84 -0
  288. ksadk/server/static/assets/{sankeyDiagram-5OEKKPKP-l6iXmU65.js → sankeyDiagram-P5KCCOFB-CPH75rhw.js} +7 -7
  289. ksadk/server/static/assets/{sequenceDiagram-3UESZ5HK-Cq6UBeQB.js → sequenceDiagram-WJ2MYXX4-OEpQQdr4.js} +10 -10
  290. ksadk/server/static/assets/sizeCapture-X5ZJPWSS-heUErzhI.js +1 -0
  291. ksadk/server/static/assets/stateDiagram-HBIQ2CUA-DvA3jSMB.js +1 -0
  292. ksadk/server/static/assets/stateDiagram-v2-4QOOHH4V-BgQY03nz.js +1 -0
  293. ksadk/server/static/assets/swimlanes-XN3QIQJK-CR-dfN_t.js +1 -0
  294. ksadk/server/static/assets/swimlanesDiagram-VK2B7HYN-DLVw3q5Q.js +8 -0
  295. ksadk/server/static/assets/{timeline-definition-PNZ67QCA-DEz24vV0.js → timeline-definition-24CTP7MA-DAVJf1TX.js} +7 -7
  296. ksadk/server/static/assets/treeView-Q6P3EWNA-BMpO0wsB.js +1 -0
  297. ksadk/server/static/assets/treemap-WGGIJYW6-Et0aqzU3.js +1 -0
  298. ksadk/server/static/assets/vennDiagram-4TSXK5OY-DwM8eDkh.js +34 -0
  299. ksadk/server/static/assets/wardley-WFR3VGLG-CbY0mhpl.js +1 -0
  300. ksadk/server/static/assets/wardleyDiagram-VM6X3IG4-DZL-Zz2t.js +78 -0
  301. ksadk/server/static/assets/xychartDiagram-S5SC5T6Z-Dy6Yh_hu.js +7 -0
  302. ksadk/server/static/index.html +2 -2
  303. ksadk/sessions/__init__.py +26 -9
  304. ksadk/sessions/_local_service_sync.py +688 -0
  305. ksadk/sessions/_local_tables.py +21 -0
  306. ksadk/sessions/_postgres_schema.py +305 -0
  307. ksadk/sessions/_postgres_tables.py +15 -0
  308. ksadk/sessions/base.py +80 -1
  309. ksadk/sessions/in_memory.py +53 -2
  310. ksadk/sessions/local_service.py +63 -604
  311. ksadk/sessions/postgres_service.py +58 -148
  312. ksadk/sessions/resilient.py +35 -1
  313. ksadk/studio/api.py +577 -25
  314. ksadk/studio/api_contracts.py +114 -5
  315. ksadk/studio/api_memory_routes.py +82 -0
  316. ksadk/studio/authoring.py +252 -27
  317. ksadk/studio/authoring_coordinator.py +799 -67
  318. ksadk/studio/builder.py +88 -11
  319. ksadk/studio/capabilities.py +17 -0
  320. ksadk/studio/cloud.py +1916 -95
  321. ksadk/studio/codex_agent_service.py +125 -14
  322. ksadk/studio/codex_authoring.py +469 -0
  323. ksadk/studio/codex_builder.py +138 -25
  324. ksadk/studio/codex_manifest.py +51 -22
  325. ksadk/studio/codex_run.py +46 -3
  326. ksadk/studio/compiler.py +1 -0
  327. ksadk/studio/contracts.py +114 -3
  328. ksadk/studio/event_store.py +25 -95
  329. ksadk/studio/framework_run.py +231 -3
  330. ksadk/studio/hosted_kernel.py +317 -0
  331. ksadk/studio/manifest_resolver.py +131 -0
  332. ksadk/studio/model_client.py +95 -9
  333. ksadk/studio/model_profile_service.py +1 -1
  334. ksadk/studio/operations.py +37 -5
  335. ksadk/studio/otel_trace.py +348 -42
  336. ksadk/studio/pcm_memory.py +85 -0
  337. ksadk/studio/repository.py +23 -2
  338. ksadk/studio/resource_catalog.py +43 -0
  339. ksadk/studio/run_service.py +563 -137
  340. ksadk/studio/runtime_source.py +42 -16
  341. ksadk/studio/service.py +1180 -72
  342. ksadk/studio/shared_web.py +32 -22
  343. ksadk/studio/static/assets/index-BLpcdrgW.css +1 -0
  344. ksadk/studio/static/assets/index-CYekR2Xv.js +260 -0
  345. ksadk/studio/static/index.html +2 -2
  346. ksadk/studio/templates.py +100 -8
  347. ksadk/studio/validator.py +19 -0
  348. ksadk/studio/workspace.py +30 -32
  349. ksadk/tracing/setup.py +304 -3
  350. ksadk/version.py +1 -1
  351. ksadk_runtime_common/schemas/runtime_event_v1.json +37 -0
  352. ksadk_runtime_common/schemas/runtime_event_v2.json +271 -0
  353. ksadk/events/parser.py +0 -191
  354. ksadk/server/static/assets/MathMessageMarkdown-DeYh8QPr.css +0 -1
  355. ksadk/server/static/assets/MermaidBlock-NERD_ef7.js +0 -303
  356. ksadk/server/static/assets/NativeTerminalPanel-CiHWf82q.js +0 -1
  357. ksadk/server/static/assets/arc-DrgjcKhl.js +0 -1
  358. ksadk/server/static/assets/architecture-7EHR7CIX-CpZLRCcY.js +0 -1
  359. ksadk/server/static/assets/architectureDiagram-3BPJPVTR-BXoVRbQ6.js +0 -36
  360. ksadk/server/static/assets/blockDiagram-GPEHLZMM-BnaB3Ywv.js +0 -132
  361. ksadk/server/static/assets/c4Diagram-AAUBKEIU-Dw4weZcp.js +0 -10
  362. ksadk/server/static/assets/channel-Dt3rQTFI.js +0 -1
  363. ksadk/server/static/assets/chunk-2J33WTMH-ChjpLK7j.js +0 -1
  364. ksadk/server/static/assets/chunk-55IACEB6-CK4ROATy.js +0 -1
  365. ksadk/server/static/assets/chunk-727SXJPM-B9KtTTgw.js +0 -206
  366. ksadk/server/static/assets/chunk-AQP2D5EJ-1O1mki3m.js +0 -231
  367. ksadk/server/static/assets/chunk-QZHKN3VN-iXEZtKQc.js +0 -1
  368. ksadk/server/static/assets/classDiagram-4FO5ZUOK-DIveV17Q.js +0 -1
  369. ksadk/server/static/assets/classDiagram-v2-Q7XG4LA2-DIveV17Q.js +0 -1
  370. ksadk/server/static/assets/cytoscape.esm-DelgaX4f.js +0 -321
  371. ksadk/server/static/assets/dagre-BM42HDAG-D0QXg_MQ.js +0 -4
  372. ksadk/server/static/assets/dagre-Bx709z4p.js +0 -1
  373. ksadk/server/static/assets/diagram-2AECGRRQ-DBDDKwBQ.js +0 -43
  374. ksadk/server/static/assets/diagram-5GNKFQAL-BkwDOxmO.js +0 -10
  375. ksadk/server/static/assets/diagram-KO2AKTUF-Bv8waYvY.js +0 -3
  376. ksadk/server/static/assets/diagram-LMA3HP47-e1VECDdu.js +0 -24
  377. ksadk/server/static/assets/diagram-OG6HWLK6-Ds9adfRl.js +0 -24
  378. ksadk/server/static/assets/dist-B5J2uhNk.js +0 -1
  379. ksadk/server/static/assets/erDiagram-TEJ5UH35-BPItFKH6.js +0 -85
  380. ksadk/server/static/assets/eventmodeling-FCH6USID-DYFSxbqr.js +0 -1
  381. ksadk/server/static/assets/flowDiagram-I6XJVG4X-BbYB9w5Y.js +0 -162
  382. ksadk/server/static/assets/ganttDiagram-6RSMTGT7-TQXa0KXv.js +0 -292
  383. ksadk/server/static/assets/gitGraph-WXDBUCRP-DyNYp6BN.js +0 -1
  384. ksadk/server/static/assets/gitGraphDiagram-PVQCEYII-bKblCnpa.js +0 -106
  385. ksadk/server/static/assets/graphlib-B8gBHxth.js +0 -1
  386. ksadk/server/static/assets/index-R52pJJvg.js +0 -177
  387. ksadk/server/static/assets/index-jJr3_955.css +0 -2
  388. ksadk/server/static/assets/info-J43DQDTF-WUx7qTde.js +0 -1
  389. ksadk/server/static/assets/infoDiagram-5YYISTIA-BGVT7J_i.js +0 -2
  390. ksadk/server/static/assets/katex-CYWseY5E.js +0 -265
  391. ksadk/server/static/assets/mermaid-parser.core-BWrDjSZM.js +0 -161
  392. ksadk/server/static/assets/packet-YPE3B663-BN13y_xl.js +0 -1
  393. ksadk/server/static/assets/pie-LRSECV5Y-ftSLXhhc.js +0 -1
  394. ksadk/server/static/assets/pieDiagram-4H26LBE5-GmmqNiVH.js +0 -30
  395. ksadk/server/static/assets/radar-GUYGQ44K-jaICkIeO.js +0 -1
  396. ksadk/server/static/assets/requirementDiagram-4Y6WPE33-DSWFqL7c.js +0 -84
  397. ksadk/server/static/assets/stateDiagram-AJRCARHV-qzTQpg3Y.js +0 -1
  398. ksadk/server/static/assets/stateDiagram-v2-BHNVJYJU-BYCoYGAN.js +0 -1
  399. ksadk/server/static/assets/treeView-BLDUP644-Cpib_vlz.js +0 -1
  400. ksadk/server/static/assets/treemap-LRROVOQU-DQxfmVHK.js +0 -1
  401. ksadk/server/static/assets/vennDiagram-CIIHVFJN-CMCixki2.js +0 -34
  402. ksadk/server/static/assets/wardley-L42UT6IY-BQYHnnkU.js +0 -1
  403. ksadk/server/static/assets/wardleyDiagram-YWT4CUSO-CVzB8F9K.js +0 -78
  404. ksadk/server/static/assets/xychartDiagram-2RQKCTM6-BFBqBLc1.js +0 -7
  405. ksadk/studio/evaluation.py +0 -192
  406. ksadk/studio/static/assets/index-CaEN0eTR.css +0 -1
  407. ksadk/studio/static/assets/index-DI2eY_NH.js +0 -252
  408. {agentengine_sdk_python-0.8.1.dist-info → agentengine_sdk_python-0.8.2.dist-info}/WHEEL +0 -0
  409. {agentengine_sdk_python-0.8.1.dist-info → agentengine_sdk_python-0.8.2.dist-info}/entry_points.txt +0 -0
  410. {agentengine_sdk_python-0.8.1.dist-info → agentengine_sdk_python-0.8.2.dist-info}/licenses/LICENSE +0 -0
  411. {agentengine_sdk_python-0.8.1.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
@@ -25,7 +26,6 @@ from ksadk.builders.container_builder import (
25
26
  resolve_registry_credentials,
26
27
  )
27
28
  from ksadk.builders.ks3_uploader import KS3Uploader
28
- from ksadk.configs.env_registry import ENV_VAR_REGISTRY
29
29
  from ksadk.configs.global_config import get_env_from_global_config
30
30
  from ksadk.configs.settings import DEFAULT_RUNTIME_TIMEZONE
31
31
  from ksadk.deployment.agent_access import get_latest_agent_access
@@ -36,55 +36,46 @@ from ksadk.deployment.base import (
36
36
  DeployTarget,
37
37
  PackageInfo,
38
38
  )
39
+ from ksadk.deployment.env_forward import should_forward_process_env
39
40
  from ksadk.deployment.registry import DeployProviderRegistry
40
41
  from ksadk.deployment.ui_config import resolve_ui_config, ui_config_to_state_fields
41
42
 
42
43
  logger = logging.getLogger(__name__)
43
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
+ )
44
59
 
45
- _DEPLOY_PROCESS_ENV_ALLOWLIST = frozenset(
46
- {
47
- spec.name
48
- for spec in ENV_VAR_REGISTRY
49
- if spec.module
50
- not in {
51
- "builders",
52
- "cli",
53
- "configs",
54
- "web",
55
- }
56
- }
57
- ) | 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(
58
70
  {
59
- "E2B_API_KEY",
60
- "E2B_API_URL",
61
- "OPENAI_API_BASE",
62
- "OPENAI_API_KEY",
63
- "OPENAI_BASE_URL",
64
- "OPENAI_MODEL_NAME",
65
- "SKILL_SPACE_ID",
71
+ "KCR_PASSWORD",
72
+ "KCR_REGISTRY",
73
+ "KCR_USERNAME",
66
74
  "KSYUN_ACCESS_KEY",
67
75
  "KSYUN_ACCOUNT_ID",
68
- "KSYUN_REGION",
69
76
  "KSYUN_SECRET_KEY",
70
77
  }
71
78
  )
72
- _DEPLOY_PROCESS_ENV_PREFIXES = ("KSADK_", "OPENAI_", "KSYUN_", "E2B_")
73
- _DEPLOY_PROCESS_ENV_DENYLIST = frozenset(
74
- {spec.name for spec in ENV_VAR_REGISTRY if spec.module in {"builders", "cli", "configs", "web"}}
75
- ) | frozenset(
76
- {
77
- "KSADK_GLOBAL_CONFIG_ENV_KEYS",
78
- "KSADK_UPDATED_AT",
79
- "KSADK_VERSION",
80
- }
81
- )
82
-
83
-
84
- def _should_forward_process_env(name: str) -> bool:
85
- if name in _DEPLOY_PROCESS_ENV_DENYLIST:
86
- return False
87
- return name in _DEPLOY_PROCESS_ENV_ALLOWLIST or name.startswith(_DEPLOY_PROCESS_ENV_PREFIXES)
88
79
 
89
80
 
90
81
  @DeployProviderRegistry.register("serverless")
@@ -212,11 +203,45 @@ class ServerlessProvider(BaseDeployProvider):
212
203
  for key, value in sorted(os.environ.items()):
213
204
  if value and _should_forward_process_env(key):
214
205
  env_vars[key] = value
215
- # explicit --env/--env-file (显式 CLI 意图最高)
216
- env_vars.update(explicit_env_vars or {})
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)
217
212
  env_vars.setdefault("TZ", DEFAULT_RUNTIME_TIMEZONE)
213
+ env_vars.setdefault("KSADK_DEPLOYMENT_MODE", "ksadk_managed_cloud")
218
214
  return env_vars, env_file.exists(), project_env_count
219
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
+
220
245
  @staticmethod
221
246
  def _inject_ui_runtime_env(
222
247
  env_vars: Dict[str, str],
@@ -264,6 +289,18 @@ class ServerlessProvider(BaseDeployProvider):
264
289
  with open(metadata_file, "w", encoding="utf-8") as f:
265
290
  json.dump(payload, f, indent=2, ensure_ascii=False)
266
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
+
267
304
  @staticmethod
268
305
  def _serialize_network_config(
269
306
  target: DeployTarget, *, is_update: bool = False
@@ -412,9 +449,20 @@ class ServerlessProvider(BaseDeployProvider):
412
449
  return package_info
413
450
 
414
451
  # 如果没有 no_cache 且有缓存,才使用缓存
415
- 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
+ ):
416
459
  logger.info(f"Using cached bundle: {cached_ks3_path}")
417
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 准入")
418
466
 
419
467
  # 2. 构建 ZIP 包
420
468
 
@@ -449,6 +497,7 @@ class ServerlessProvider(BaseDeployProvider):
449
497
  if zip_path is None:
450
498
  raise RuntimeError("代码构建成功但未生成 artifact_path")
451
499
  package_info.metadata.update(build_result.metadata)
500
+ package_info.metadata["code_checksum"] = self._sha256_file(zip_path)
452
501
  if build_result.metadata.get("manifest_sha256"):
453
502
  target.extra["manifest_sha256"] = build_result.metadata["manifest_sha256"]
454
503
  # click.echo(f" ✅ ZIP 已生成: {zip_path}")
@@ -690,6 +739,9 @@ class ServerlessProvider(BaseDeployProvider):
690
739
  "name": str(target.extra.get("runtime_name") or "").strip(),
691
740
  "version": str(target.extra.get("runtime_version") or "").strip(),
692
741
  "manifest_sha256": str(target.extra.get("manifest_sha256") or "").strip(),
742
+ "manifest": str(
743
+ package_info.metadata.get("managed_runtime_manifest") or ""
744
+ ),
693
745
  }
694
746
  missing = [key for key, value in runtime_config.items() if not value]
695
747
  if missing:
@@ -698,6 +750,11 @@ class ServerlessProvider(BaseDeployProvider):
698
750
  + ", ".join(f"runtime_config.{key}" for key in missing)
699
751
  )
700
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
+
701
758
  try:
702
759
  # 获取 dry_run 标识
703
760
  is_dry_run = target.extra.get("dry_run", False)
@@ -769,34 +826,37 @@ class ServerlessProvider(BaseDeployProvider):
769
826
  fg="green",
770
827
  )
771
828
 
772
- if existing_agent_id and not agent_exists:
773
- # 有本地状态 → 先检查服务器上是否存在
774
- click.echo(f" 检测到本地状态: {existing_agent_id}")
775
-
776
- try:
777
- # 尝试获取 agent,确认是否存在
778
- existing_agent = await client.get_agent(existing_agent_id)
779
- if existing_agent:
780
- agent_exists = True
781
- except Exception as e:
782
- # Agent 不存在或查询失败
783
- err_msg = str(e).lower()
784
- if "not found" in err_msg or "404" in err_msg or "不存在" in err_msg:
785
- click.secho(
786
- f" ⚠️ 服务器上未找到 Agent {existing_agent_id},将创建新 Agent",
787
- fg="yellow",
788
- )
789
- agent_exists = False
790
- # DryRun 异常表示真实请求被拦截,无法确认 Agent 是否存在。
791
- # 为安全起见,DryRun 假设它存在并走更新路径。
792
- elif "Dry Run" in str(e):
793
- click.secho(
794
- f" [Dry Run] 假设 Agent {existing_agent_id} 存在", fg="cyan"
795
- )
796
- agent_exists = True
797
- else:
798
- # 其他错误,重新抛出
799
- raise
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
800
860
 
801
861
  if agent_exists:
802
862
  # Agent 存在 → 执行更新
@@ -828,6 +888,9 @@ class ServerlessProvider(BaseDeployProvider):
828
888
 
829
889
  if ks3_config:
830
890
  update_data["ks3"] = ks3_config
891
+ if code_checksum:
892
+ update_data["code_checksum"] = code_checksum
893
+ update_data["code_command"] = code_command
831
894
  elif artifact_type == "Container":
832
895
  image_credential = self._image_credential_from_env(artifact_path)
833
896
  if image_credential:
@@ -843,6 +906,10 @@ class ServerlessProvider(BaseDeployProvider):
843
906
  project_dir,
844
907
  target.extra.get("env_vars") or {},
845
908
  )
909
+ env_vars = self._bind_managed_runtime_contract_env(
910
+ env_vars,
911
+ runtime_config,
912
+ )
846
913
  env_vars = self._inject_ui_runtime_env(env_vars, ui_state, local_state)
847
914
  if env_vars:
848
915
  update_data["env_vars"] = env_vars
@@ -951,6 +1018,9 @@ class ServerlessProvider(BaseDeployProvider):
951
1018
 
952
1019
  if ks3_config:
953
1020
  request_data["ks3"] = ks3_config
1021
+ if code_checksum:
1022
+ request_data["code_checksum"] = code_checksum
1023
+ request_data["code_command"] = code_command
954
1024
 
955
1025
  # Container 模式: 传递镜像凭证
956
1026
  if artifact_type == "Container":
@@ -967,6 +1037,10 @@ class ServerlessProvider(BaseDeployProvider):
967
1037
  project_dir,
968
1038
  target.extra.get("env_vars") or {},
969
1039
  )
1040
+ env_vars = self._bind_managed_runtime_contract_env(
1041
+ env_vars,
1042
+ runtime_config,
1043
+ )
970
1044
  env_vars = self._inject_ui_runtime_env(env_vars, ui_state, local_state)
971
1045
  if env_vars:
972
1046
  if env_file_exists:
@@ -7,10 +7,27 @@ from .adapters import (
7
7
  TargetAdapterError,
8
8
  create_target_adapter,
9
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
+ )
10
26
  from .contracts import (
11
27
  AssertionSpec,
12
28
  AssertionType,
13
29
  CaseRun,
30
+ CloudDatasetRef,
14
31
  DataPolicy,
15
32
  EvalCase,
16
33
  EvalRunReport,
@@ -47,6 +64,18 @@ __all__ = [
47
64
  "AssertionType",
48
65
  "A2ATargetAdapter",
49
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",
50
79
  "CaseRun",
51
80
  "DataPolicy",
52
81
  "EvalCase",
@@ -60,6 +89,7 @@ __all__ = [
60
89
  "EvalTurn",
61
90
  "EvaluationConfig",
62
91
  "EvaluationExecutionError",
92
+ "EvalSetCloudConversionError",
63
93
  "EvaluationNotImplementedError",
64
94
  "EvaluationRequest",
65
95
  "EvaluationStorage",
@@ -80,5 +110,7 @@ __all__ = [
80
110
  "load_evalset",
81
111
  "parse_evalset",
82
112
  "execute_evaluation",
113
+ "evalset_from_dataset_snapshot",
114
+ "evalset_to_dataset_snapshot",
83
115
  "create_target_adapter",
84
116
  ]
@@ -93,7 +93,15 @@ class _ResponseCollector:
93
93
  self.context_id = update.context_id or self.context_id
94
94
  text = _parts_text(update.artifact.parts)
95
95
  if text:
96
- self.artifact_chunks.append(text)
96
+ # canonical executor 的 replace 快照带 ksadk_output_snapshot 标记,
97
+ # 是权威全文;命中时重置而非继续拼接,避免 delta+快照翻倍。
98
+ if any(
99
+ dict(part.metadata or {}).get("ksadk_output_snapshot")
100
+ for part in update.artifact.parts
101
+ ):
102
+ self.artifact_chunks = [text]
103
+ else:
104
+ self.artifact_chunks.append(text)
97
105
 
98
106
  if response.message:
99
107
  self.task_id = response.message.task_id or self.task_id
@@ -2,10 +2,13 @@
2
2
 
3
3
  from __future__ import annotations
4
4
 
5
- from typing import Protocol
5
+ from typing import TYPE_CHECKING, Protocol
6
6
 
7
7
  from .contracts import EvalCase, EvalRunSpec, TargetKind, TargetRef, TargetRun, TargetSnapshot
8
8
 
9
+ if TYPE_CHECKING:
10
+ from .evidence import EvidenceStore
11
+
9
12
 
10
13
  class TargetAdapterError(RuntimeError):
11
14
  """Classified failure raised by a protocol adapter."""
@@ -27,19 +30,29 @@ class TargetAdapter(Protocol):
27
30
  async def snapshot(self, target: TargetRef) -> TargetSnapshot:
28
31
  """Resolve a target into an immutable snapshot."""
29
32
 
30
- async def run_case(
31
- self, spec: EvalRunSpec, case: EvalCase, *, attempt: int
32
- ) -> TargetRun:
33
+ async def run_case(self, spec: EvalRunSpec, case: EvalCase, *, attempt: int) -> TargetRun:
33
34
  """Execute one case and return its normalized result."""
34
35
 
35
36
 
36
- def create_target_adapter(target: TargetRef, *, timeout_seconds: int) -> TargetAdapter:
37
+ def create_target_adapter(
38
+ target: TargetRef,
39
+ *,
40
+ timeout_seconds: int,
41
+ evidence_store: EvidenceStore | None = None,
42
+ ) -> TargetAdapter:
37
43
  """Route a target reference to its protocol adapter."""
38
44
 
39
45
  if target.kind is TargetKind.A2A:
40
46
  from .a2a_adapter import A2ATargetAdapter
41
47
 
42
48
  return A2ATargetAdapter(timeout_seconds=timeout_seconds)
49
+ if target.kind is TargetKind.LOCAL_SOURCE:
50
+ from .local_adapter import LocalSourceTargetAdapter
51
+
52
+ return LocalSourceTargetAdapter(
53
+ timeout_seconds=timeout_seconds,
54
+ evidence_store=evidence_store,
55
+ )
43
56
  raise EvaluationNotImplementedError(
44
57
  f"{target.kind.value} target 的评测执行尚未实现;"
45
58
  "当前可使用 --validate-only 校验评测集和参数"