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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (494) hide show
  1. {agentengine_sdk_python-0.8.0.dist-info → agentengine_sdk_python-0.8.2.dist-info}/METADATA +43 -7
  2. agentengine_sdk_python-0.8.2.dist-info/RECORD +778 -0
  3. {agentengine_sdk_python-0.8.0.dist-info → agentengine_sdk_python-0.8.2.dist-info}/WHEEL +1 -1
  4. ksadk/a2a/__init__.py +2 -0
  5. ksadk/a2a/_space_client_events.py +381 -0
  6. ksadk/a2a/bootstrap.py +0 -2
  7. ksadk/a2a/card.py +6 -111
  8. ksadk/a2a/control_plane.py +239 -1
  9. ksadk/a2a/event_adapter.py +156 -64
  10. ksadk/a2a/executor.py +195 -172
  11. ksadk/a2a/routes.py +12 -5
  12. ksadk/a2a/server.py +1 -8
  13. ksadk/a2a/service_env.py +33 -0
  14. ksadk/a2a/space_client.py +43 -349
  15. ksadk/a2a_card.py +101 -0
  16. ksadk/a2ui/core.py +222 -53
  17. ksadk/agui/_agent_helpers.py +243 -0
  18. ksadk/agui/a2ui_projection.py +12 -5
  19. ksadk/agui/agent.py +474 -275
  20. ksadk/agui/config.py +11 -5
  21. ksadk/agui/routes.py +7 -15
  22. ksadk/api/client.py +530 -40
  23. ksadk/api/environment.py +27 -0
  24. ksadk/builders/code_builder.py +352 -53
  25. ksadk/builders/container_builder.py +71 -44
  26. ksadk/builders/framework_requirements.py +2 -1
  27. ksadk/builders/ks3_uploader.py +2 -2
  28. ksadk/builders/managed_runtime_builder.py +60 -28
  29. ksadk/cli/__init__.py +25 -0
  30. ksadk/cli/cmd_a2a.py +18 -31
  31. ksadk/cli/cmd_create.py +13 -26
  32. ksadk/cli/cmd_dashboard.py +15 -1
  33. ksadk/cli/cmd_deploy.py +28 -3
  34. ksadk/cli/cmd_eval.py +443 -0
  35. ksadk/cli/cmd_evalset.py +284 -0
  36. ksadk/cli/cmd_files.py +5 -1
  37. ksadk/cli/cmd_hermes.py +137 -163
  38. ksadk/cli/cmd_invoke.py +28 -38
  39. ksadk/cli/cmd_launch.py +12 -0
  40. ksadk/cli/cmd_managed_runtime.py +95 -0
  41. ksadk/cli/cmd_observe.py +85 -0
  42. ksadk/cli/cmd_openclaw.py +85 -479
  43. ksadk/cli/cmd_replay.py +28 -4
  44. ksadk/cli/cmd_run.py +29 -67
  45. ksadk/cli/cmd_studio.py +201 -0
  46. ksadk/cli/cmd_web.py +15 -6
  47. ksadk/cli/dry_run.py +2 -1
  48. ksadk/cli/env_options.py +83 -0
  49. ksadk/cli/global_options.py +3 -1
  50. ksadk/cli/hermes_env.py +151 -0
  51. ksadk/cli/invoke_payload.py +49 -0
  52. ksadk/cli/network_options.py +7 -5
  53. ksadk/cli/openclaw_env.py +458 -0
  54. ksadk/cli/runtime_bootstrap.py +51 -0
  55. ksadk/cli/ui.py +6 -0
  56. ksadk/cli/workflow_common.py +5 -5
  57. ksadk/codex/__init__.py +3 -3
  58. ksadk/codex/client.py +833 -49
  59. ksadk/codex/phase.py +1 -1
  60. ksadk/codex/runtime.py +720 -127
  61. ksadk/common/kop_client.py +232 -0
  62. ksadk/configs/__init__.py +1 -3
  63. ksadk/configs/env_registry.py +244 -45
  64. ksadk/configs/env_registry_pcm.py +181 -0
  65. ksadk/configs/env_var_spec.py +18 -0
  66. ksadk/configs/global_config.py +6 -1
  67. ksadk/configs/settings.py +5 -108
  68. ksadk/context_engine/__init__.py +98 -0
  69. ksadk/context_engine/assembler.py +176 -0
  70. ksadk/context_engine/baseline.py +419 -0
  71. ksadk/context_engine/cache_observability.py +228 -0
  72. ksadk/context_engine/capabilities.py +443 -0
  73. ksadk/context_engine/contributors.py +344 -0
  74. ksadk/context_engine/hosted_pipeline.py +417 -0
  75. ksadk/context_engine/models.py +117 -0
  76. ksadk/context_engine/planner.py +698 -0
  77. ksadk/context_engine/policies.py +319 -0
  78. ksadk/context_engine/projection.py +31 -0
  79. ksadk/context_engine/shadow_plan.py +266 -0
  80. ksadk/context_engine/tokenizer.py +164 -0
  81. ksadk/conversations/__init__.py +85 -94
  82. ksadk/conversations/context.py +126 -6
  83. ksadk/conversations/message_projection.py +292 -28
  84. ksadk/conversations/model_context.py +49 -3
  85. ksadk/conversations/runtime_compaction.py +207 -5
  86. ksadk/conversations/runtime_input.py +193 -3
  87. ksadk/conversations/runtime_invocation.py +81 -3
  88. ksadk/conversations/runtime_observability.py +157 -4
  89. ksadk/conversations/runtime_payloads.py +42 -0
  90. ksadk/conversations/runtime_preparation.py +280 -2
  91. ksadk/conversations/runtime_resume.py +71 -32
  92. ksadk/conversations/runtime_stream_events.py +94 -9
  93. ksadk/conversations/runtime_streaming.py +175 -22
  94. ksadk/conversations/semantic_summary.py +311 -1
  95. ksadk/conversations/session_lock.py +51 -0
  96. ksadk/deployment/env_forward.py +72 -0
  97. ksadk/deployment/managed_runtime.py +38 -0
  98. ksadk/deployment/manager.py +24 -8
  99. ksadk/deployment/providers/serverless.py +228 -92
  100. ksadk/evaluation/__init__.py +116 -0
  101. ksadk/evaluation/a2a_adapter.py +452 -0
  102. ksadk/evaluation/adapters.py +67 -0
  103. ksadk/evaluation/agent_eval_client.py +395 -0
  104. ksadk/evaluation/cloud_binding.py +80 -0
  105. ksadk/evaluation/cloud_converter.py +194 -0
  106. ksadk/evaluation/cloud_service.py +199 -0
  107. ksadk/evaluation/contracts.py +478 -0
  108. ksadk/evaluation/evalset.py +351 -0
  109. ksadk/evaluation/evaluators.py +627 -0
  110. ksadk/evaluation/evidence.py +258 -0
  111. ksadk/evaluation/executor.py +143 -0
  112. ksadk/evaluation/local_adapter.py +550 -0
  113. ksadk/evaluation/service_env.py +27 -0
  114. ksadk/evaluation/storage.py +68 -0
  115. ksadk/evaluation/studio_build_adapter.py +253 -0
  116. ksadk/evaluation/target.py +82 -0
  117. ksadk/events/__init__.py +13 -13
  118. ksadk/events/_v1_compat/__init__.py +1 -0
  119. ksadk/events/_v1_compat/models.py +299 -0
  120. ksadk/events/_v1_compat/parser.py +247 -0
  121. ksadk/events/_v1_compat/projection.py +753 -0
  122. ksadk/events/adapters/__init__.py +34 -0
  123. ksadk/events/adapters/_a2a_snapshot.py +622 -0
  124. ksadk/events/adapters/_a2a_support.py +275 -0
  125. ksadk/events/adapters/_codex_interactions.py +375 -0
  126. ksadk/events/adapters/_codex_items.py +801 -0
  127. ksadk/events/adapters/_codex_validators.py +311 -0
  128. ksadk/events/adapters/_langgraph_support.py +785 -0
  129. ksadk/events/adapters/a2a.py +841 -0
  130. ksadk/events/adapters/adk.py +503 -0
  131. ksadk/events/adapters/codex.py +717 -0
  132. ksadk/events/adapters/langgraph.py +745 -0
  133. ksadk/events/canonical.py +440 -0
  134. ksadk/events/canonical_replay.py +497 -0
  135. ksadk/events/canonical_store.py +468 -0
  136. ksadk/events/cold_recovery.py +257 -0
  137. ksadk/events/content.py +89 -0
  138. ksadk/events/identity.py +86 -0
  139. ksadk/events/pipeline.py +455 -0
  140. ksadk/events/projections.py +66 -0
  141. ksadk/events/reducer.py +661 -0
  142. ksadk/events/replay.py +3 -36
  143. ksadk/events/runtime_event.py +20 -256
  144. ksadk/events/session_event.py +324 -0
  145. ksadk/events/store.py +3 -316
  146. ksadk/events/v1_compat.py +41 -0
  147. ksadk/harness/__init__.py +3 -2
  148. ksadk/harness/app.py +114 -123
  149. ksadk/harness/config.py +1 -1
  150. ksadk/harness/runtime.py +467 -0
  151. ksadk/hermes_terminal.py +5 -0
  152. ksadk/identity/resolver.py +4 -3
  153. ksadk/interaction/__init__.py +28 -0
  154. ksadk/interaction/contracts.py +136 -0
  155. ksadk/interaction/ledger.py +189 -0
  156. ksadk/interaction/provider.py +122 -0
  157. ksadk/interaction/providers/__init__.py +52 -0
  158. ksadk/interaction/providers/adk.py +40 -0
  159. ksadk/interaction/providers/codex.py +94 -0
  160. ksadk/interaction/providers/langgraph.py +58 -0
  161. ksadk/kernel/__init__.py +117 -0
  162. ksadk/kernel/authorization.py +258 -0
  163. ksadk/kernel/bootstrap.py +1074 -0
  164. ksadk/kernel/contract_fingerprints.py +61 -0
  165. ksadk/kernel/contracts.py +362 -0
  166. ksadk/kernel/control.py +219 -0
  167. ksadk/kernel/errors.py +79 -0
  168. ksadk/kernel/ingress.py +1102 -0
  169. ksadk/kernel/mapping.py +111 -0
  170. ksadk/kernel/memory_store.py +1133 -0
  171. ksadk/kernel/postgres_store.py +1756 -0
  172. ksadk/kernel/recovery.py +452 -0
  173. ksadk/kernel/runtime_identity.py +103 -0
  174. ksadk/kernel/sql/001_agent_kernel.sql +120 -0
  175. ksadk/kernel/sqlite_store.py +1410 -0
  176. ksadk/kernel/state.py +145 -0
  177. ksadk/kernel/store.py +232 -0
  178. ksadk/kernel/worker.py +953 -0
  179. ksadk/knowledge_base/client.py +22 -4
  180. ksadk/knowledge_base/service.py +32 -5
  181. ksadk/managed_a2a_card.py +160 -0
  182. ksadk/managed_runtime.py +16 -9
  183. ksadk/memory/__init__.py +61 -0
  184. ksadk/memory/adk/backends/base_ltm_backend.py +96 -1
  185. ksadk/memory/adk/backends/http_ltm_backend.py +14 -5
  186. ksadk/memory/adk/backends/inmemory_ltm_backend.py +136 -3
  187. ksadk/memory/adk/backends/sdk_ltm_backend.py +394 -5
  188. ksadk/memory/adk/backends/sqlite_ltm_backend.py +95 -0
  189. ksadk/memory/adk/long_term_memory.py +3 -2
  190. ksadk/memory/coordinator.py +461 -0
  191. ksadk/memory/events.py +202 -0
  192. ksadk/memory/extraction.py +228 -0
  193. ksadk/memory/ltm_backend_factory.py +16 -3
  194. ksadk/memory/models.py +316 -0
  195. ksadk/memory/policy.py +215 -0
  196. ksadk/memory/provider.py +47 -0
  197. ksadk/memory/provider_adapter.py +159 -0
  198. ksadk/memory/provider_resolver.py +71 -0
  199. ksadk/memory/providers/__init__.py +5 -0
  200. ksadk/memory/providers/local_sqlite.py +490 -0
  201. ksadk/memory/resolved_policy.py +145 -0
  202. ksadk/memory/service.py +198 -8
  203. ksadk/memory/tool.py +4 -0
  204. ksadk/model_proxy/bootstrap.py +16 -9
  205. ksadk/model_proxy/config.py +22 -1
  206. ksadk/model_proxy/detect.py +202 -9
  207. ksadk/model_proxy/namespace.py +67 -15
  208. ksadk/model_proxy/server.py +168 -6
  209. ksadk/model_proxy/transform.py +105 -3
  210. ksadk/observability/__init__.py +25 -0
  211. ksadk/observability/session_log.py +420 -0
  212. ksadk/observability/trajectory.py +105 -0
  213. ksadk/prompts/__init__.py +71 -0
  214. ksadk/prompts/compiler.py +215 -0
  215. ksadk/prompts/models.py +82 -0
  216. ksadk/prompts/projection.py +89 -0
  217. ksadk/prompts/resolved.py +137 -0
  218. ksadk/prompts/sources.py +233 -0
  219. ksadk/runners/_langgraph_runner_streams.py +822 -0
  220. ksadk/runners/adk_runner.py +14 -31
  221. ksadk/runners/base_runner.py +44 -3
  222. ksadk/runners/factory.py +3 -3
  223. ksadk/runners/langgraph_runner.py +252 -433
  224. ksadk/runners/utils/__init__.py +0 -10
  225. ksadk/runners/utils/loader.py +16 -0
  226. ksadk/runtime/__init__.py +67 -41
  227. ksadk/runtime/_runner_adapter/__init__.py +1 -0
  228. ksadk/runtime/_runner_adapter/stream_mapping.py +788 -0
  229. ksadk/runtime/adapter.py +199 -16
  230. ksadk/runtime/conversation_execution.py +687 -0
  231. ksadk/runtime/executor.py +392 -0
  232. ksadk/runtime/factory.py +342 -0
  233. ksadk/runtime/framework_adapters.py +6 -12
  234. ksadk/runtime/hosted_finalizer.py +268 -0
  235. ksadk/runtime/launch.py +61 -0
  236. ksadk/runtime/preprocessing.py +49 -14
  237. ksadk/runtime/runner_adapter.py +330 -391
  238. ksadk/runtime/runner_loading.py +36 -0
  239. ksadk/runtime/usage.py +33 -0
  240. ksadk/sandbox/backends/e2b.py +36 -3
  241. ksadk/server/__init__.py +39 -4
  242. ksadk/server/app.py +18 -492
  243. ksadk/server/composition.py +36 -2
  244. ksadk/server/factory.py +210 -149
  245. ksadk/server/routes/common.py +15 -46
  246. ksadk/server/routes/control.py +13 -9
  247. ksadk/server/routes/kernel_ingress.py +258 -0
  248. ksadk/server/routes/misc.py +10 -33
  249. ksadk/server/routes/models.py +14 -6
  250. ksadk/server/routes/openai_compat.py +129 -27
  251. ksadk/server/routes/projection.py +84 -16
  252. ksadk/server/routes/run.py +347 -460
  253. ksadk/server/routes/sessions.py +37 -40
  254. ksadk/server/routes/streaming.py +52 -7
  255. ksadk/server/routes/workspace.py +54 -21
  256. ksadk/server/static/assets/{ArtifactsPanel-Cjnqt-8W.js → ArtifactsPanel-DSU1sWD_.js} +1 -1
  257. ksadk/server/static/assets/{CodeBlock-BqyqZfuB.js → CodeBlock-DOH6MVcn.js} +4 -4
  258. ksadk/server/static/assets/{MathMessageMarkdown-BpH7jiFM.js → MathMessageMarkdown-BL8my1R2.js} +4 -4
  259. ksadk/server/static/assets/MathMessageMarkdown-BorAY7qD.css +1 -0
  260. ksadk/server/static/assets/MermaidBlock-Dz4IP-Tx.js +312 -0
  261. ksadk/server/static/assets/NativeTerminalPanel-DUrK0JpZ.js +1 -0
  262. ksadk/server/static/assets/abnfDiagram-VCTEODGH-g20pFzNV.js +1 -0
  263. ksadk/server/static/assets/arc-C4FzinUA.js +1 -0
  264. ksadk/server/static/assets/architecture-7GRP2DOG-DjKratdf.js +1 -0
  265. ksadk/server/static/assets/architectureDiagram-5GKGNRK7-DpIqL5h4.js +36 -0
  266. ksadk/server/static/assets/blockDiagram-NRAW4CY4-BjkljTNz.js +129 -0
  267. ksadk/server/static/assets/c4Diagram-UCG6FXSJ-Dk_ieq2X.js +38 -0
  268. ksadk/server/static/assets/channel-4cQHKtx1.js +1 -0
  269. ksadk/server/static/assets/chunk-2Q5K7J3B-DmgWkESh.js +1 -0
  270. ksadk/server/static/assets/{chunk-FMBD7UC4-BGhvzDYt.js → chunk-5VM5RSS4-BVHAchFb.js} +1 -1
  271. ksadk/server/static/assets/{chunk-ND2GUHAM-D98vPd-E.js → chunk-F27PBJKO-C-ipQzuS.js} +1 -1
  272. ksadk/server/static/assets/chunk-G27WJ6UU-C2EyJbIK.js +231 -0
  273. ksadk/server/static/assets/{chunk-4BX2VUAB-CsWIQRhc.js → chunk-JWPE2WC7-vYvVJb_M.js} +1 -1
  274. ksadk/server/static/assets/chunk-LCL6LL3I-BcI6ysPT.js +206 -0
  275. ksadk/server/static/assets/chunk-POPQ4Y6H-C030x_Z1.js +1 -0
  276. ksadk/server/static/assets/chunk-RHFEMEQ7-yyGpsz4n.js +168 -0
  277. ksadk/server/static/assets/chunk-SVP7TREG-BLTlmMU7.js +88 -0
  278. ksadk/server/static/assets/chunk-XXDRQBXY-C_32ArgP.js +1 -0
  279. ksadk/server/static/assets/classDiagram-DTDB5LWJ-DLFd9Xi0.js +1 -0
  280. ksadk/server/static/assets/classDiagram-v2-JRS7N3AN-DLFd9Xi0.js +1 -0
  281. ksadk/server/static/assets/{cose-bilkent-S5V4N54A-CX3yotHq.js → cose-bilkent-JH36ORCC-9YQYwdl0.js} +1 -1
  282. ksadk/server/static/assets/cynefin-OW5HDTMX-DjEM48Qp.js +1 -0
  283. ksadk/server/static/assets/cynefinDiagram-5FMLGOSQ-ErLF5N13.js +62 -0
  284. ksadk/server/static/assets/cytoscape.esm-CyCl8rPi.js +321 -0
  285. ksadk/server/static/assets/dagre-3AP2YEHR-DFiQF-6f.js +4 -0
  286. ksadk/server/static/assets/dagre-BuhGnRI1.js +1 -0
  287. ksadk/server/static/assets/diagram-S7CK7UJ4-Bt1v8-GC.js +30 -0
  288. ksadk/server/static/assets/diagram-UQ7AKVKN-DSCxJdBK.js +41 -0
  289. ksadk/server/static/assets/diagram-VSXAHHWV-DHfYwp_9.js +3 -0
  290. ksadk/server/static/assets/diagram-VX7I27RA-DdzD-4Le.js +24 -0
  291. ksadk/server/static/assets/diagram-Z3DM3KII-Du-nAJ9F.js +24 -0
  292. ksadk/server/static/assets/{dist-D82mtD2s.js → dist-8hqcx0sU.js} +1 -1
  293. ksadk/server/static/assets/dist-B7seoj3d.js +1 -0
  294. ksadk/server/static/assets/{dist-DHn6nBzr.js → dist-BE7bu-DL.js} +1 -1
  295. ksadk/server/static/assets/{dist-eoW6tZXA.js → dist-BVDffZ0U.js} +1 -1
  296. ksadk/server/static/assets/{dist-C2xjE7cO.js → dist-BX8z72IC.js} +1 -1
  297. ksadk/server/static/assets/{dist-CgF3fj15.js → dist-Bf2M8m3N.js} +1 -1
  298. ksadk/server/static/assets/{dist-Bs-jQcRX.js → dist-BjU6y-A2.js} +1 -1
  299. ksadk/server/static/assets/{dist-Djgl2wVZ.js → dist-BytlxIDT.js} +1 -1
  300. ksadk/server/static/assets/{dist-CVQRZjPu.js → dist-CSh_DE14.js} +1 -1
  301. ksadk/server/static/assets/{dist-6CVKuTAe.js → dist-CXYYBw3_.js} +1 -1
  302. ksadk/server/static/assets/{dist-DlzCRy0S.js → dist-C_wsv-Qd.js} +1 -1
  303. ksadk/server/static/assets/{dist-DF06ORQo.js → dist-ClxGviKw.js} +1 -1
  304. ksadk/server/static/assets/{dist-Cf23NY4L.js → dist-CttYUqzS.js} +1 -1
  305. ksadk/server/static/assets/{dist-ivOya1LD.js → dist-DNp6rLRA.js} +1 -1
  306. ksadk/server/static/assets/{dist-BibcG1V9.js → dist-DUX-id_F.js} +1 -1
  307. ksadk/server/static/assets/{dist-BUHRxvDG.js → dist-DmldrHd_.js} +1 -1
  308. ksadk/server/static/assets/{dist-BZ9n9AjO.js → dist-DnfXs8Vn.js} +2 -2
  309. ksadk/server/static/assets/{dist-DqNnNFrw.js → dist-Dq9gLD7L.js} +1 -1
  310. ksadk/server/static/assets/{dist-CGcp2ex8.js → dist-W-TIVntx.js} +1 -1
  311. ksadk/server/static/assets/{dist-Cwt7koer.js → dist-dDdADKFA.js} +1 -1
  312. ksadk/server/static/assets/{dist-C7-3jInC.js → dist-dydu68Fl.js} +1 -1
  313. ksadk/server/static/assets/{dist-C99THtIA.js → dist-ngtN0DJB.js} +1 -1
  314. ksadk/server/static/assets/ebnfDiagram-PWID7BFC-Da9C9NO1.js +1 -0
  315. ksadk/server/static/assets/erDiagram-SSCWMZ5O-EAGqqR79.js +99 -0
  316. ksadk/server/static/assets/eventmodeling-NTZA5JFV-CMgMaJrC.js +1 -0
  317. ksadk/server/static/assets/flowDiagram-A5DVABFB-BBKL0x3P.js +1 -0
  318. ksadk/server/static/assets/ganttDiagram-EL5Y4UJY-DqJsKb59.js +292 -0
  319. ksadk/server/static/assets/gitGraph-4MIJSDKK-Dw63mrhw.js +1 -0
  320. ksadk/server/static/assets/gitGraphDiagram-WWUBYQGX-B6g4dtDi.js +106 -0
  321. ksadk/server/static/assets/index-8ipRcQ-M.js +240 -0
  322. ksadk/server/static/assets/index-ByFCqjlh.css +2 -0
  323. ksadk/server/static/assets/info-A6RAGUB7-B6iAblII.js +1 -0
  324. ksadk/server/static/assets/infoDiagram-RXCK75RN-Djm_nbd5.js +2 -0
  325. ksadk/server/static/assets/{ishikawaDiagram-YF4QCWOH-DLOHGvWw.js → ishikawaDiagram-5VMMS53U-DWya9SG2.js} +6 -6
  326. ksadk/server/static/assets/{journeyDiagram-JHISSGLW-BIzKeejT.js → journeyDiagram-EYS64GPL-DutxhSNI.js} +6 -6
  327. ksadk/server/static/assets/{kanban-definition-UN3LZRKU-BWHoFSw2.js → kanban-definition-3QL26DDD-DJdOF8Fm.js} +10 -10
  328. ksadk/server/static/assets/katex-vFWytM5c.js +257 -0
  329. ksadk/server/static/assets/{linear-CvMBw9cA.js → linear-BHjG8b-J.js} +1 -1
  330. ksadk/server/static/assets/mermaid-parser.core-KGSy4jWT.js +166 -0
  331. ksadk/server/static/assets/{mindmap-definition-RKZ34NQL-CSAQxEAe.js → mindmap-definition-FBJOCRG2-9-HC88D4.js} +29 -29
  332. ksadk/server/static/assets/packet-AYTQ26CC-BOYAipuq.js +1 -0
  333. ksadk/server/static/assets/pegDiagram-XKGWAZYB-DrEZd4fD.js +1 -0
  334. ksadk/server/static/assets/pie-WAS4IAKB-Ctq0Kbku.js +1 -0
  335. ksadk/server/static/assets/pieDiagram-E7YTZNPT-DpjqOFFp.js +39 -0
  336. ksadk/server/static/assets/{quadrantDiagram-W4KKPZXB-CxIR4JXI.js → quadrantDiagram-AXDQQJYC-BiNhgOXX.js} +6 -6
  337. ksadk/server/static/assets/radar-RG4KPBEZ-DN0-ul_0.js +1 -0
  338. ksadk/server/static/assets/railroad-74A4TZTK-C6cC_to0.js +1 -0
  339. ksadk/server/static/assets/railroad-abnf-HS5TGJTU-BimjIuRc.js +1 -0
  340. ksadk/server/static/assets/railroad-ebnf-LZEXJU2U-CvY65ABq.js +1 -0
  341. ksadk/server/static/assets/railroad-peg-WCYAUIDC-D72Iq_Tv.js +1 -0
  342. ksadk/server/static/assets/railroadDiagram-O6MQD6OU-_Y3Ojg6G.js +1 -0
  343. ksadk/server/static/assets/requirementDiagram-EFPCY7ZU-DeCFdg9K.js +84 -0
  344. ksadk/server/static/assets/{sankeyDiagram-5OEKKPKP-DpGa6EAV.js → sankeyDiagram-P5KCCOFB-CPH75rhw.js} +7 -7
  345. ksadk/server/static/assets/{sequenceDiagram-3UESZ5HK-NTKNGGe5.js → sequenceDiagram-WJ2MYXX4-OEpQQdr4.js} +10 -10
  346. ksadk/server/static/assets/sizeCapture-X5ZJPWSS-heUErzhI.js +1 -0
  347. ksadk/server/static/assets/stateDiagram-HBIQ2CUA-DvA3jSMB.js +1 -0
  348. ksadk/server/static/assets/stateDiagram-v2-4QOOHH4V-BgQY03nz.js +1 -0
  349. ksadk/server/static/assets/swimlanes-XN3QIQJK-CR-dfN_t.js +1 -0
  350. ksadk/server/static/assets/swimlanesDiagram-VK2B7HYN-DLVw3q5Q.js +8 -0
  351. ksadk/server/static/assets/{timeline-definition-PNZ67QCA-jqoYs3jQ.js → timeline-definition-24CTP7MA-DAVJf1TX.js} +7 -7
  352. ksadk/server/static/assets/treeView-Q6P3EWNA-BMpO0wsB.js +1 -0
  353. ksadk/server/static/assets/treemap-WGGIJYW6-Et0aqzU3.js +1 -0
  354. ksadk/server/static/assets/vennDiagram-4TSXK5OY-DwM8eDkh.js +34 -0
  355. ksadk/server/static/assets/wardley-WFR3VGLG-CbY0mhpl.js +1 -0
  356. ksadk/server/static/assets/wardleyDiagram-VM6X3IG4-DZL-Zz2t.js +78 -0
  357. ksadk/server/static/assets/xychartDiagram-S5SC5T6Z-Dy6Yh_hu.js +7 -0
  358. ksadk/server/static/index.html +2 -2
  359. ksadk/sessions/__init__.py +26 -9
  360. ksadk/sessions/_local_service_sync.py +688 -0
  361. ksadk/sessions/_local_tables.py +21 -0
  362. ksadk/sessions/_postgres_schema.py +305 -0
  363. ksadk/sessions/_postgres_tables.py +15 -0
  364. ksadk/sessions/base.py +80 -1
  365. ksadk/sessions/in_memory.py +53 -2
  366. ksadk/sessions/local_service.py +63 -604
  367. ksadk/sessions/postgres_service.py +58 -148
  368. ksadk/sessions/resilient.py +35 -1
  369. ksadk/skills/runtime/backends/e2b.py +1 -1
  370. ksadk/skills/service_client.py +13 -3
  371. ksadk/studio/__init__.py +5 -0
  372. ksadk/studio/agent_avatar_assets.py +120 -0
  373. ksadk/studio/agent_lifecycle.py +51 -0
  374. ksadk/studio/api.py +1598 -0
  375. ksadk/studio/api_catalog_routes.py +324 -0
  376. ksadk/studio/api_contracts.py +286 -0
  377. ksadk/studio/api_helpers.py +132 -0
  378. ksadk/studio/api_memory_routes.py +82 -0
  379. ksadk/studio/authoring.py +749 -0
  380. ksadk/studio/authoring_coordinator.py +1017 -0
  381. ksadk/studio/builder.py +397 -0
  382. ksadk/studio/capabilities.py +368 -0
  383. ksadk/studio/cloud.py +2099 -0
  384. ksadk/studio/codex_agent_service.py +694 -0
  385. ksadk/studio/codex_authoring.py +469 -0
  386. ksadk/studio/codex_builder.py +437 -0
  387. ksadk/studio/codex_manifest.py +307 -0
  388. ksadk/studio/codex_run.py +395 -0
  389. ksadk/studio/compiler.py +190 -0
  390. ksadk/studio/contracts.py +755 -0
  391. ksadk/studio/errors.py +47 -0
  392. ksadk/studio/event_store.py +214 -0
  393. ksadk/studio/framework_run.py +342 -0
  394. ksadk/studio/hosted_kernel.py +317 -0
  395. ksadk/studio/identifiers.py +33 -0
  396. ksadk/studio/manifest_resolver.py +131 -0
  397. ksadk/studio/mcp_runtime.py +229 -0
  398. ksadk/studio/model_client.py +629 -0
  399. ksadk/studio/model_profile_service.py +214 -0
  400. ksadk/studio/operations.py +275 -0
  401. ksadk/studio/otel_trace.py +1060 -0
  402. ksadk/studio/pagination.py +182 -0
  403. ksadk/studio/pcm_memory.py +85 -0
  404. ksadk/studio/python_tool_inspection.py +183 -0
  405. ksadk/studio/repository.py +327 -0
  406. ksadk/studio/resource_catalog.py +1260 -0
  407. ksadk/studio/run_service.py +1133 -0
  408. ksadk/studio/runtime_catalog.py +74 -0
  409. ksadk/studio/runtime_source.py +365 -0
  410. ksadk/studio/service.py +2249 -0
  411. ksadk/studio/shared_web.py +1004 -0
  412. ksadk/studio/skill_discovery.py +628 -0
  413. ksadk/studio/static/assets/PrismRenderer-IYN-ffww.js +3 -0
  414. ksadk/studio/static/assets/index-BLpcdrgW.css +1 -0
  415. ksadk/studio/static/assets/index-CYekR2Xv.js +260 -0
  416. ksadk/studio/static/assets/react-vendor-BNmTiJ-I.js +9 -0
  417. ksadk/studio/static/assets/rolldown-runtime-hePW80VL.js +1 -0
  418. ksadk/studio/static/index.html +15 -0
  419. ksadk/studio/templates.py +722 -0
  420. ksadk/studio/validator.py +265 -0
  421. ksadk/studio/workspace.py +135 -0
  422. ksadk/tools/gateway.py +9 -0
  423. ksadk/toolsets/__init__.py +27 -1
  424. ksadk/toolsets/a2a.py +426 -0
  425. ksadk/tracing/__init__.py +19 -21
  426. ksadk/tracing/setup.py +317 -403
  427. ksadk/tracing/span_utils.py +0 -44
  428. ksadk/version.py +1 -1
  429. ksadk_runtime_common/memory_backend/registry.py +56 -56
  430. ksadk_runtime_common/schemas/runtime_event_v1.json +37 -0
  431. ksadk_runtime_common/schemas/runtime_event_v2.json +271 -0
  432. ksadk_runtime_common/workspace_files/router.py +8 -2
  433. agentengine_sdk_python-0.8.0.dist-info/RECORD +0 -578
  434. ksadk/a2a/card_builder.py +0 -64
  435. ksadk/a2a/client.py +0 -309
  436. ksadk/events/parser.py +0 -191
  437. ksadk/harness/runner.py +0 -211
  438. ksadk/runners/codex_runner.py +0 -132
  439. ksadk/runners/utils/langfuse.py +0 -230
  440. ksadk/server/static/assets/MathMessageMarkdown-DeYh8QPr.css +0 -1
  441. ksadk/server/static/assets/MermaidBlock-DWuxETaJ.js +0 -303
  442. ksadk/server/static/assets/NativeTerminalPanel-MDTopWMO.js +0 -1
  443. ksadk/server/static/assets/arc-CFKwSk_B.js +0 -1
  444. ksadk/server/static/assets/architecture-7EHR7CIX-CynqOWjZ.js +0 -1
  445. ksadk/server/static/assets/architectureDiagram-3BPJPVTR-Dej8jX8c.js +0 -36
  446. ksadk/server/static/assets/blockDiagram-GPEHLZMM-1F64jqvy.js +0 -132
  447. ksadk/server/static/assets/c4Diagram-AAUBKEIU-9q7AUAKb.js +0 -10
  448. ksadk/server/static/assets/channel-iUGv2N24.js +0 -1
  449. ksadk/server/static/assets/chunk-2J33WTMH-6qgwJm7Q.js +0 -1
  450. ksadk/server/static/assets/chunk-55IACEB6-BK8paA20.js +0 -1
  451. ksadk/server/static/assets/chunk-727SXJPM-B-JEhy7h.js +0 -206
  452. ksadk/server/static/assets/chunk-AQP2D5EJ-DYBvMHAa.js +0 -231
  453. ksadk/server/static/assets/chunk-QZHKN3VN-YQIEXeF6.js +0 -1
  454. ksadk/server/static/assets/classDiagram-4FO5ZUOK-CDAUuoXK.js +0 -1
  455. ksadk/server/static/assets/classDiagram-v2-Q7XG4LA2-CDAUuoXK.js +0 -1
  456. ksadk/server/static/assets/cytoscape.esm-DelgaX4f.js +0 -321
  457. ksadk/server/static/assets/dagre-BM42HDAG-C7TguAWo.js +0 -4
  458. ksadk/server/static/assets/dagre-Bx709z4p.js +0 -1
  459. ksadk/server/static/assets/diagram-2AECGRRQ-Dd17_kws.js +0 -43
  460. ksadk/server/static/assets/diagram-5GNKFQAL-DVIClIil.js +0 -10
  461. ksadk/server/static/assets/diagram-KO2AKTUF-Df_3gYQa.js +0 -3
  462. ksadk/server/static/assets/diagram-LMA3HP47-BhLk6ZtA.js +0 -24
  463. ksadk/server/static/assets/diagram-OG6HWLK6-D4GNGvuu.js +0 -24
  464. ksadk/server/static/assets/dist-DyvYLMW9.js +0 -1
  465. ksadk/server/static/assets/erDiagram-TEJ5UH35-CnfRcY2M.js +0 -85
  466. ksadk/server/static/assets/eventmodeling-FCH6USID-ChYO-ijM.js +0 -1
  467. ksadk/server/static/assets/flowDiagram-I6XJVG4X-DGaJjGNJ.js +0 -162
  468. ksadk/server/static/assets/ganttDiagram-6RSMTGT7-DpCoB2g9.js +0 -292
  469. ksadk/server/static/assets/gitGraph-WXDBUCRP-BN_0Fk-j.js +0 -1
  470. ksadk/server/static/assets/gitGraphDiagram-PVQCEYII-9IKVFBVT.js +0 -106
  471. ksadk/server/static/assets/graphlib-B8gBHxth.js +0 -1
  472. ksadk/server/static/assets/index-QSwCHuB8.js +0 -177
  473. ksadk/server/static/assets/index-jOPmTOZH.css +0 -2
  474. ksadk/server/static/assets/info-J43DQDTF-Cp6o3vId.js +0 -1
  475. ksadk/server/static/assets/infoDiagram-5YYISTIA-CYIIsb8y.js +0 -2
  476. ksadk/server/static/assets/katex-DATssjp1.js +0 -265
  477. ksadk/server/static/assets/mermaid-parser.core-mGAcEwcq.js +0 -161
  478. ksadk/server/static/assets/packet-YPE3B663-wQzct3cT.js +0 -1
  479. ksadk/server/static/assets/pie-LRSECV5Y-BgTQiv-9.js +0 -1
  480. ksadk/server/static/assets/pieDiagram-4H26LBE5-By-ra07M.js +0 -30
  481. ksadk/server/static/assets/radar-GUYGQ44K-BIq5fXsn.js +0 -1
  482. ksadk/server/static/assets/requirementDiagram-4Y6WPE33-DpW90iu3.js +0 -84
  483. ksadk/server/static/assets/stateDiagram-AJRCARHV-DGpd9yFG.js +0 -1
  484. ksadk/server/static/assets/stateDiagram-v2-BHNVJYJU-B3o579IQ.js +0 -1
  485. ksadk/server/static/assets/treeView-BLDUP644-Dqi-E0EM.js +0 -1
  486. ksadk/server/static/assets/treemap-LRROVOQU-ClQP9CJ9.js +0 -1
  487. ksadk/server/static/assets/vennDiagram-CIIHVFJN-l3Z7-wbP.js +0 -34
  488. ksadk/server/static/assets/wardley-L42UT6IY-8XLvnNIs.js +0 -1
  489. ksadk/server/static/assets/wardleyDiagram-YWT4CUSO-BR54GPmr.js +0 -78
  490. ksadk/server/static/assets/xychartDiagram-2RQKCTM6-SkiH8GsK.js +0 -7
  491. ksadk/tracing/exporters/langfuse_exporter.py +0 -460
  492. {agentengine_sdk_python-0.8.0.dist-info → agentengine_sdk_python-0.8.2.dist-info}/entry_points.txt +0 -0
  493. {agentengine_sdk_python-0.8.0.dist-info → agentengine_sdk_python-0.8.2.dist-info}/licenses/LICENSE +0 -0
  494. {agentengine_sdk_python-0.8.0.dist-info → agentengine_sdk_python-0.8.2.dist-info}/top_level.txt +0 -0
@@ -2,6 +2,7 @@
2
2
  Container Builder - Docker 镜像构建
3
3
  """
4
4
 
5
+ import json
5
6
  import os
6
7
  import platform
7
8
  import shutil
@@ -404,12 +405,12 @@ CMD ["python", "entrypoint.py"]
404
405
  "pydantic>=2.0.0",
405
406
  "pyyaml>=6.0.0",
406
407
  "httpx>=0.24.0",
407
- # Tracing
408
+ # Tracing — OTLP 双写收敛:只用 OTel + openinference 自动插桩,
409
+ # 不再安装 Langfuse SDK(callback 路径已删除,Langfuse 通过标准 OTLP 接收)。
408
410
  "opentelemetry-api>=1.37.0",
409
411
  "opentelemetry-sdk>=1.37.0",
410
412
  "opentelemetry-exporter-otlp>=1.37.0",
411
413
  "openinference-instrumentation-langchain>=0.1.0",
412
- "langfuse>=2.0.0",
413
414
  ]
414
415
 
415
416
  framework = detection_result.type.value
@@ -441,6 +442,9 @@ CMD ["python", "entrypoint.py"]
441
442
 
442
443
  def _generate_entrypoint(self, detection_result, package_name: str) -> str:
443
444
  """生成 entrypoint.py"""
445
+ runtime_config_json = json.dumps(
446
+ self._load_config(), ensure_ascii=False, separators=(",", ":"), default=str
447
+ )
444
448
  return f'''"""
445
449
  AgentEngine Container 模式入口
446
450
  """
@@ -448,6 +452,7 @@ AgentEngine Container 模式入口
448
452
  import sys
449
453
  import os
450
454
  import logging
455
+ import json
451
456
  from pathlib import Path
452
457
 
453
458
  # ========== 日志配置 ==========
@@ -489,15 +494,11 @@ except ImportError:
489
494
 
490
495
  env_keys = [
491
496
  "AGENT_RUNTIME_NAME", "AGENT_RUNTIME_ID", "ACCOUNT_ID", "PORT",
492
- "LANGFUSE_BASE_URL", "LANGFUSE_HOST", "LANGFUSE_PUBLIC_KEY",
493
- "LANGFUSE_SECRET_KEY", "LANGFUSE_USE_CALLBACK",
494
497
  "OTEL_EXPORTER_OTLP_ENDPOINT", "OTEL_EXPORTER_OTLP_TRACES_ENDPOINT",
495
498
  "OTEL_EXPORTER_OTLP_HEADERS", "OTEL_EXPORTER_OTLP_TRACES_HEADERS",
496
- "OTEL_SERVICE_NAME", "CLOUD_MONITOR_APP_KEY",
497
- "CLOUD_MONITOR_OTLP_ENABLED", "CLOUD_MONITOR_OTLP_ENDPOINT",
498
- "CLOUD_MONITOR_OTLP_TRACES_ENDPOINT", "CLOUD_MONITOR_OTLP_HEADERS",
499
- "CLOUD_MONITOR_LANGFUSE_HOST", "CLOUD_MONITOR_LANGFUSE_PUBLIC_KEY",
500
- "CLOUD_MONITOR_LANGFUSE_SECRET_KEY", "CLOUD_MONITOR_LANGFUSE_ENABLED",
499
+ "OTEL_SERVICE_NAME",
500
+ "CLOUD_MONITOR_OTLP_ENDPOINT", "CLOUD_MONITOR_OTLP_TRACES_ENDPOINT",
501
+ "CLOUD_MONITOR_OTLP_HEADERS", "CLOUD_MONITOR_OTLP_TRACES_HEADERS",
501
502
  "LANGCHAIN_TRACING_V2", "MODEL_NAME",
502
503
  ]
503
504
  for key in env_keys:
@@ -511,15 +512,9 @@ for key in env_keys:
511
512
  from ksadk.configs import setup_environment
512
513
  setup_environment(Path("/app"))
513
514
 
514
- try:
515
- from ksadk.runners.patch_langchain import apply_patch as apply_langchain_patch
516
- apply_langchain_patch()
517
- except ImportError:
518
- pass
519
-
520
- from ksadk.runners import create_runner
521
515
  from ksadk.detection import DetectionResult, FrameworkType
522
- from ksadk.server import app, set_runner
516
+ from ksadk.runtime import RuntimeExecutor, RuntimeLaunchContext, build_default_runtime_registry
517
+ from ksadk.server import RuntimeAppConfig, configure_runtime_app, create_runtime_app
523
518
  import uvicorn
524
519
 
525
520
  # 检测结果 (构建时固化)
@@ -535,49 +530,81 @@ detection_result = DetectionResult(
535
530
  logger.info(f"框架: {{detection_result.name}}")
536
531
  logger.info(f"入口: {{detection_result.entry_point}}")
537
532
 
538
- # 初始化 Tracing (如果配置了 Langfuse、标准 OTLP HTTP 或 CloudMonitor OTLP)
533
+ # 初始化 Tracing (如果配置了标准 OTLP HTTP 或 CloudMonitor OTLP)
539
534
  has_otlp = bool(
540
535
  os.environ.get("OTEL_EXPORTER_OTLP_ENDPOINT")
541
536
  or os.environ.get("OTEL_EXPORTER_OTLP_TRACES_ENDPOINT")
542
537
  )
543
538
  has_cloud_monitor_otlp = bool(
544
- os.environ.get("CLOUD_MONITOR_APP_KEY")
539
+ os.environ.get("CLOUD_MONITOR_OTLP_TRACES_HEADERS")
540
+ or os.environ.get("CLOUD_MONITOR_OTLP_HEADERS")
545
541
  or os.environ.get("CLOUD_MONITOR_OTLP_ENDPOINT")
546
542
  or os.environ.get("CLOUD_MONITOR_OTLP_TRACES_ENDPOINT")
543
+ or os.environ.get("CLOUD_MONITOR_APP_KEY")
547
544
  )
548
- has_cloud_monitor_langfuse = bool(
549
- os.environ.get("CLOUD_MONITOR_LANGFUSE_PUBLIC_KEY")
550
- or os.environ.get("CLOUD_MONITOR_LANGFUSE_SECRET_KEY")
551
- or os.environ.get("CLOUD_MONITOR_LANGFUSE_HOST")
552
- )
553
- if (
554
- os.environ.get("LANGFUSE_PUBLIC_KEY")
555
- or has_otlp
556
- or has_cloud_monitor_otlp
557
- or has_cloud_monitor_langfuse
558
- ):
545
+ if has_otlp or has_cloud_monitor_otlp:
559
546
  try:
560
547
  from ksadk.tracing import setup_tracing
561
- use_callback_only = (
562
- os.environ.get("LANGFUSE_USE_CALLBACK", "").strip().lower()
563
- in ("1", "true", "yes", "on")
564
- )
565
- setup_tracing(use_callback_only=use_callback_only)
548
+ setup_tracing()
566
549
  logger.info(
567
550
  f"Tracing 已启用 (OTLP={{has_otlp}}, "
568
- f"CloudMonitorOTLP={{has_cloud_monitor_otlp}}, "
569
- f"CloudMonitorLangfuse={{has_cloud_monitor_langfuse}}, "
570
- f"CallbackOnly={{use_callback_only}})"
551
+ f"CloudMonitorOTLP={{has_cloud_monitor_otlp}})"
571
552
  )
572
553
  except Exception as e:
573
554
  logger.warning(f"Tracing 初始化失败: {{e}}")
574
555
 
575
- # 创建 Runner 并加载 Agent
576
- logger.info("正在加载 Agent...")
577
- runner = create_runner(detection_result, "/app")
578
- runner.load_agent()
579
- set_runner(runner, loaded=True)
580
- logger.info("Agent 加载成功!")
556
+ # 只装配统一 RuntimeAdapter 执行链;具体 Adapter 在请求开始时由 Registry 创建。
557
+ runtime_build_config = json.loads({runtime_config_json!r})
558
+ runtime_context = RuntimeLaunchContext(
559
+ runtime_type=detection_result.type.value,
560
+ project_dir=Path("/app"),
561
+ detection=detection_result,
562
+ config=dict(runtime_build_config),
563
+ )
564
+ # managed A2A:KSADK_A2A_RUNTIME_ID 非空时挂 discovery card + 完整数据面 route。
565
+ # discovery card 让 server 探测;数据面 route 让 gateway 转发的 JSON-RPC/REST
566
+ # 能真正落到本 runtime 的 A2A 协议端点(路线 C 直连)。
567
+ _managed_a2a_card = None
568
+ _a2a_config = None
569
+ _a2a_adapter = None
570
+ if os.environ.get("KSADK_A2A_RUNTIME_ID", "").strip():
571
+ from ksadk.managed_a2a_card import build_managed_a2a_card_if_configured
572
+
573
+ _managed_a2a_card = build_managed_a2a_card_if_configured()
574
+ try:
575
+ from ksadk.a2a.routes import A2AConfig
576
+ from ksadk.runtime.factory import create_runtime_adapter
577
+
578
+ _a2a_adapter = create_runtime_adapter(runtime_context)
579
+ _base = (
580
+ os.environ.get("KSADK_A2A_INTERNAL_BASE_URL", "").strip()
581
+ or "http://localhost:8080"
582
+ )
583
+ _a2a_config = A2AConfig(
584
+ enabled=True,
585
+ base_url=_base,
586
+ agent_name=(
587
+ os.environ.get("KSADK_A2A_AGENT_NAME", "").strip()
588
+ or os.environ.get("KSADK_A2A_RUNTIME_ID", "").strip()
589
+ ),
590
+ streaming=True,
591
+ task_store_dsn="sqlite+aiosqlite:///.agentengine/a2a_tasks.db",
592
+ )
593
+ except Exception as _e:
594
+ logger.warning(f"managed A2A 数据面装配失败,回退 discovery-only: {{_e}}")
595
+ _a2a_config = None
596
+ _a2a_adapter = None
597
+ app = create_runtime_app(
598
+ RuntimeAppConfig(
599
+ runtime_type=detection_result.type.value,
600
+ runtime_executor=RuntimeExecutor(build_default_runtime_registry()),
601
+ launch_context=runtime_context,
602
+ a2a=_a2a_config or _managed_a2a_card,
603
+ a2a_runtime_adapter=_a2a_adapter,
604
+ ),
605
+ configure_runtime_app,
606
+ )
607
+ logger.info("RuntimeAdapter 执行链装配成功!")
581
608
 
582
609
  if __name__ == "__main__":
583
610
  port = int(os.environ.get("PORT", 8080))
@@ -4,7 +4,8 @@ from __future__ import annotations
4
4
 
5
5
  from typing import Iterable
6
6
 
7
- FASTAPI_REQUIREMENT = "fastapi>=0.100.0,<1.0.0"
7
+ FASTAPI_REQUIREMENT = "fastapi>=0.136.0,<0.137.0"
8
+ STARLETTE_REQUIREMENT = "starlette>=1.0,<1.4"
8
9
 
9
10
  ADK_REQUIREMENTS = (
10
11
  # goal-00: 与 ksadk 自身 adk extra 对齐,允许 1.34.x 与 2.x
@@ -10,7 +10,7 @@ from pathlib import Path
10
10
  from typing import Optional
11
11
 
12
12
  import click
13
- from ks3.upload import UploadTask
13
+ from ks3.upload import UploadTask # type: ignore[import-untyped]
14
14
 
15
15
  from ksadk.common.constants import get_ks3_endpoints
16
16
 
@@ -258,7 +258,7 @@ class KS3Uploader:
258
258
  return record_dir / f"{safe_key}.ks3resume"
259
259
 
260
260
  def _upload_via_host(self, file_path: Path, object_key: str, host: str) -> bool:
261
- from ks3.connection import Connection
261
+ from ks3.connection import Connection # type: ignore[import-untyped]
262
262
 
263
263
  ak = os.environ.get("KSYUN_ACCESS_KEY") or os.environ.get("KS3_ACCESS_KEY")
264
264
  sk = os.environ.get("KSYUN_SECRET_KEY") or os.environ.get("KS3_SECRET_KEY")
@@ -4,7 +4,6 @@ from __future__ import annotations
4
4
 
5
5
  import hashlib
6
6
  import json
7
- import zipfile
8
7
  from pathlib import Path
9
8
  from typing import Any
10
9
 
@@ -20,10 +19,51 @@ _MANIFEST_KEYS = (
20
19
  "artifact_type",
21
20
  "runtime",
22
21
  "model",
22
+ "models",
23
23
  "prompt",
24
+ "task_prompt",
25
+ "skills",
26
+ "mcp_servers",
27
+ "sandbox",
28
+ "approval_mode",
29
+ "context",
30
+ "memory",
24
31
  )
25
32
 
26
33
 
34
+ def managed_runtime_lock_path(manifest_path: Path) -> Path:
35
+ """Return the immutable lock that accompanies a YAML-only declaration.
36
+
37
+ ``ManagedRuntime`` is not a user-code artifact. Keeping its two small
38
+ declaration files next to one another makes that visible in both the
39
+ workspace and the build receipt, while still preserving a historical
40
+ manifest for rollback.
41
+ """
42
+
43
+ return manifest_path.with_suffix(".lock.json")
44
+
45
+
46
+ def serialize_managed_runtime_manifest(manifest: dict[str, Any]) -> bytes:
47
+ """Serialize the Server-canonical ManagedRuntime declaration.
48
+
49
+ The Server validates ``ManifestSHA256`` after parsing and re-dumping YAML
50
+ with sorted keys. Clients must hash those exact canonical bytes instead
51
+ of the editable source formatting, otherwise a valid Studio/CLI build is
52
+ rejected during ``CreateAgent``/``UpdateAgent`` admission.
53
+ """
54
+
55
+ canonical = yaml.safe_dump(
56
+ manifest,
57
+ allow_unicode=True,
58
+ sort_keys=True,
59
+ default_flow_style=False,
60
+ width=10_000,
61
+ )
62
+ if not canonical.endswith("\n"):
63
+ canonical += "\n"
64
+ return canonical.encode("utf-8")
65
+
66
+
27
67
  class ManagedRuntimeBuilder(BaseBuilder):
28
68
  """Build a deterministic YAML-only deployment artifact.
29
69
 
@@ -44,7 +84,10 @@ class ManagedRuntimeBuilder(BaseBuilder):
44
84
  self.build_dir = self.project_dir / ".agentengine" / "managed_runtime"
45
85
 
46
86
  def build(self) -> BuildResult:
47
- config = self._load_config()
87
+ # An explicitly supplied snapshot is authoritative. Studio can keep
88
+ # more than one Agent manifest in a workspace, so falling back to the
89
+ # root agentengine.yaml here would silently build the wrong Agent.
90
+ config = dict(self.config) if self.config else self._load_config()
48
91
  error = self._validate_config(config)
49
92
  if error:
50
93
  return BuildResult(success=False, error_message=error)
@@ -63,36 +106,35 @@ class ManagedRuntimeBuilder(BaseBuilder):
63
106
  runtime_name = str(runtime.get("name") or config.get("framework") or "").strip().lower()
64
107
  runtime = {"name": runtime_name, "version": version}
65
108
  manifest = self._normalized_manifest(config, runtime)
66
- manifest_bytes = yaml.safe_dump(
67
- manifest,
68
- allow_unicode=True,
69
- sort_keys=False,
70
- ).encode("utf-8")
109
+ manifest_bytes = serialize_managed_runtime_manifest(manifest)
71
110
  manifest_sha256 = hashlib.sha256(manifest_bytes).hexdigest()
72
111
  lock = {
73
112
  "schema_version": RUNTIME_MANIFEST_SCHEMA,
74
113
  "runtime": runtime,
75
114
  "manifest_sha256": manifest_sha256,
76
115
  }
77
- lock_bytes = (
78
- json.dumps(lock, ensure_ascii=False, indent=2, sort_keys=True) + "\n"
79
- ).encode("utf-8")
116
+ lock_bytes = (json.dumps(lock, ensure_ascii=False, indent=2, sort_keys=True) + "\n").encode(
117
+ "utf-8"
118
+ )
80
119
 
81
120
  self.build_dir.mkdir(parents=True, exist_ok=True)
82
121
  name = str(config.get("name") or self.project_dir.name).strip() or self.project_dir.name
83
122
  project_version = str(config.get("version") or "1.0.0").strip() or "1.0.0"
84
- artifact_path = self.build_dir / f"{name}-{project_version}-runtime.zip"
85
- self._write_bundle(
86
- artifact_path,
87
- {
88
- "agentengine.yaml": manifest_bytes,
89
- "runtime-lock.json": lock_bytes,
90
- },
123
+ # This local declaration receipt is retained for Studio rollback.
124
+ # It is deliberately *not* a ZIP: YAML agents have no user code, no
125
+ # KS3 artifact and no code-downloader path. Version alone is mutable
126
+ # in an editable Agent, so retain the exact canonical YAML plus its
127
+ # lock under the content digest.
128
+ artifact_path = self.build_dir / (
129
+ f"{name}-{project_version}-{manifest_sha256[:16]}-runtime.yaml"
91
130
  )
131
+ lock_path = managed_runtime_lock_path(artifact_path)
132
+ artifact_path.write_bytes(manifest_bytes)
133
+ lock_path.write_bytes(lock_bytes)
92
134
  return BuildResult(
93
135
  success=True,
94
136
  artifact_path=artifact_path,
95
- artifact_size=artifact_path.stat().st_size,
137
+ artifact_size=artifact_path.stat().st_size + lock_path.stat().st_size,
96
138
  metadata={
97
139
  "agent_name": name,
98
140
  "framework": str(config.get("framework") or ""),
@@ -133,13 +175,3 @@ class ManagedRuntimeBuilder(BaseBuilder):
133
175
  elif key in config:
134
176
  normalized[key] = config[key]
135
177
  return normalized
136
-
137
- @staticmethod
138
- def _write_bundle(path: Path, files: dict[str, bytes]) -> None:
139
- with zipfile.ZipFile(path, "w", compression=zipfile.ZIP_DEFLATED) as archive:
140
- for name in sorted(files):
141
- info = zipfile.ZipInfo(name)
142
- info.date_time = (1980, 1, 1, 0, 0, 0)
143
- info.compress_type = zipfile.ZIP_DEFLATED
144
- info.external_attr = 0o100644 << 16
145
- archive.writestr(info, files[name])
ksadk/cli/__init__.py CHANGED
@@ -67,13 +67,18 @@ ROOT_HELP_COMMANDS = {
67
67
  "completion",
68
68
  "dashboard",
69
69
  "deploy",
70
+ "eval",
71
+ "evalset",
70
72
  "files",
71
73
  "init",
72
74
  "hermes",
73
75
  "launch",
76
+ "managed-runtime",
74
77
  "mcp",
78
+ "observe",
75
79
  "openclaw",
76
80
  "run",
81
+ "studio",
77
82
  "version",
78
83
  "web",
79
84
  }
@@ -87,13 +92,18 @@ SHORT_HELP_MAP = {
87
92
  "completion": "Shell 补全管理",
88
93
  "dashboard": "打开云端 Agent Dashboard",
89
94
  "deploy": "部署到云端",
95
+ "eval": "评测本地、A2A 或 Codex Agent",
96
+ "evalset": "预览或上传 EvalSet 云端快照",
90
97
  "files": "管理 workspace 文件",
91
98
  "hermes": "Hermes Agent 资源管理",
92
99
  "init": "创建新项目",
93
100
  "launch": "一键构建+部署",
101
+ "managed-runtime": "启动平台托管的 YAML Agent",
94
102
  "mcp": "MCP 资源管理",
103
+ "observe": "导出本地 Agent 观测数据",
95
104
  "openclaw": "OpenClaw 资源管理",
96
105
  "run": "运行 Agent",
106
+ "studio": "启动本地 Agent 构建控制台",
97
107
  "version": "Agent 版本管理",
98
108
  "web": "本地调试 Agent Invoke UI",
99
109
  "config": "项目配置与模型设置",
@@ -173,12 +183,21 @@ class ColoredHelpGroup(click.Group):
173
183
  _write_colored_help_row(formatter, "agentengine init", "初始化项目")
174
184
  _write_colored_help_row(formatter, "agentengine run", "运行 API Server")
175
185
  _write_colored_help_row(formatter, "agentengine web", "本地调试 Agent Invoke UI")
186
+ _write_colored_help_row(formatter, "agentengine studio", "本地 Agent 构建控制台")
187
+ _write_colored_help_row(formatter, "agentengine eval", "评测本地、A2A 或 Codex Agent")
188
+ _write_colored_help_row(formatter, "agentengine evalset", "预览或上传 EvalSet 云端快照")
189
+ _write_colored_help_row(formatter, "agentengine observe", "导出本地 Agent 观测数据")
176
190
 
177
191
  # 云端部署
178
192
  formatter.write(click.style(" 🚀 云端部署:\n\n", fg="blue", bold=True))
179
193
  _write_colored_help_row(formatter, "agentengine build", "构建部署制品")
180
194
  _write_colored_help_row(formatter, "agentengine deploy", "部署到云端")
181
195
  _write_colored_help_row(formatter, "agentengine launch", "一键构建+部署")
196
+ _write_colored_help_row(
197
+ formatter,
198
+ "agentengine managed-runtime",
199
+ "启动平台托管的 YAML Agent",
200
+ )
182
201
  _write_colored_help_row(formatter, "agentengine agent", "Agent 资源管理")
183
202
  _write_colored_help_row(formatter, "agentengine version", "Agent 版本管理")
184
203
  _write_colored_help_row(formatter, "agentengine mcp", "MCP 资源管理")
@@ -319,6 +338,7 @@ def _register_optional_command(cli: click.Group, module_path: str, *cmd_names: s
319
338
  def _register_commands():
320
339
  from ksadk.cli.cmd_create import create
321
340
  from ksadk.cli.cmd_deploy import deploy
341
+ from ksadk.cli.cmd_managed_runtime import managed_runtime
322
342
  from ksadk.cli.cmd_run import run
323
343
  from ksadk.cli.cmd_web import web
324
344
 
@@ -326,6 +346,7 @@ def _register_commands():
326
346
  _add_command_once(cli, run)
327
347
  _add_command_once(cli, deploy)
328
348
  _add_command_once(cli, web)
349
+ _add_command_once(cli, managed_runtime)
329
350
 
330
351
  # init 作为主命令 (PRD 规范)
331
352
  _add_command_once(cli, create, name="init")
@@ -336,6 +357,10 @@ def _register_commands():
336
357
  _register_optional_command(cli, "ksadk.cli.cmd_config", "config")
337
358
  _register_optional_command(cli, "ksadk.cli.cmd_model", "model")
338
359
  _register_optional_command(cli, "ksadk.cli.cmd_build", "build")
360
+ _register_optional_command(cli, "ksadk.cli.cmd_studio", "studio")
361
+ _register_optional_command(cli, "ksadk.cli.cmd_eval", "eval")
362
+ _register_optional_command(cli, "ksadk.cli.cmd_evalset", "evalset")
363
+ _register_optional_command(cli, "ksadk.cli.cmd_observe", "observe")
339
364
  _register_optional_command(cli, "ksadk.cli.cmd_launch", "launch")
340
365
  _register_optional_command(cli, "ksadk.cli.cmd_agent", "agent")
341
366
  _register_optional_command(cli, "ksadk.cli.cmd_status", "status")
ksadk/cli/cmd_a2a.py CHANGED
@@ -32,10 +32,8 @@ from ksadk.a2a import (
32
32
  from ksadk.cli.local_runtime import reexec_with_project_venv_if_needed
33
33
  from ksadk.cli.resource_common import CONTEXT_SETTINGS
34
34
  from ksadk.detection import FrameworkDetector
35
- from ksadk.runners.factory import create_runner
36
- from ksadk.runtime.adapter import RuntimeAdapter
37
- from ksadk.runtime.framework_adapters import ADKRuntimeAdapter, LangGraphRuntimeAdapter
38
- from ksadk.runtime.runner_adapter import RunnerRuntimeAdapter
35
+ from ksadk.runtime.factory import create_runtime_adapter
36
+ from ksadk.runtime.launch import RuntimeLaunchContext
39
37
 
40
38
  _HELP = dict(help_option_names=["-h", "--help"])
41
39
  _DEFAULT_TASK_STORE_DSN = "sqlite+aiosqlite:///.agentengine/a2a_tasks.db"
@@ -121,7 +119,10 @@ def serve(
121
119
  command_args.append("--no-trace")
122
120
  reexec_with_project_venv_if_needed(agent_path, command_args)
123
121
  task_store_dsn = _resolve_task_store_dsn(task_store_dsn, agent_path)
124
- detection_result, runner = _load_runner(agent_path, no_trace=no_trace)
122
+ detection_result, runtime_adapter = _load_runtime_adapter(
123
+ agent_path,
124
+ no_trace=no_trace,
125
+ )
125
126
  from fastapi import FastAPI
126
127
 
127
128
  app = FastAPI(title=f"ksadk A2A: {detection_result.name}")
@@ -135,12 +136,10 @@ def serve(
135
136
  include_reasoning=include_reasoning,
136
137
  )
137
138
  runtime_type = detection_result.type.value
138
- runtime_adapter = _select_runtime_adapter(runtime_type, runner)
139
139
  from ksadk.a2a.task_adapter import A2ARuntimeTaskAdapter
140
140
 
141
141
  add_a2a_protocol_routes(
142
142
  app,
143
- runner,
144
143
  config,
145
144
  task_adapter=A2ARuntimeTaskAdapter(runtime_adapter, runtime_type=runtime_type),
146
145
  )
@@ -212,7 +211,8 @@ def _space_client(space_id: str | None = None) -> A2ASpaceClient:
212
211
  except ValueError as exc:
213
212
  raise click.ClickException(
214
213
  f"A2A Space 未配置:{exc}。"
215
- "请传 --space-id,或由 AgentEngine 部署注入 KSADK_A2A_SPACE_IDS;同时需要"
214
+ "请传 --space-id,或由 AgentEngine 部署注入 KSADK_A2A_SPACE_ID"
215
+ "(兼容 KSADK_A2A_SPACE_IDS);同时需要"
216
216
  "KSADK_A2A_CONTROL_PLANE_URL 和 audience workload token。"
217
217
  ) from exc
218
218
 
@@ -312,40 +312,27 @@ def _detect_project(agent_path: Path, *, configure_environment: bool = True):
312
312
  return result
313
313
 
314
314
 
315
- def _load_runner(agent_path: Path, *, no_trace: bool):
315
+ def _load_runtime_adapter(agent_path: Path, *, no_trace: bool):
316
316
  detection_result = _detect_project(agent_path)
317
+ runtime_type = detection_result.type.value
317
318
  if not no_trace:
318
- _setup_tracing(detection_result.type.value)
319
- runner = create_runner(detection_result, str(agent_path))
320
- runner.load_agent()
321
- return detection_result, runner
322
-
323
-
324
- def _select_runtime_adapter(runtime_type: str, runner) -> RuntimeAdapter:
325
- # langchain create_agent 产物是 LangGraph CompiledStateGraph,
326
- # 与 langgraph 共用 time-travel resume。
327
- if runtime_type in ("langgraph", "langchain"):
328
- return LangGraphRuntimeAdapter(runner)
329
- if runtime_type == "adk":
330
- return ADKRuntimeAdapter(runner)
331
- return RunnerRuntimeAdapter(runner, runtime_type=runtime_type)
319
+ _setup_tracing(runtime_type)
320
+ context = RuntimeLaunchContext(
321
+ runtime_type=runtime_type,
322
+ project_dir=agent_path,
323
+ detection=detection_result,
324
+ config=dict(getattr(detection_result, "raw_config", None) or {}),
325
+ )
326
+ return detection_result, create_runtime_adapter(context)
332
327
 
333
328
 
334
329
  def _setup_tracing(framework_type: str) -> None:
335
330
  try:
336
- import os
337
331
 
338
332
  from ksadk.tracing import setup_tracing
339
333
 
340
- use_callback_only = os.getenv("LANGFUSE_USE_CALLBACK", "").strip().lower() in (
341
- "1",
342
- "true",
343
- "yes",
344
- "on",
345
- )
346
334
  setup_tracing(
347
335
  enable_inmemory=True,
348
- use_callback_only=use_callback_only,
349
336
  )
350
337
  except Exception:
351
338
  return
ksadk/cli/cmd_create.py CHANGED
@@ -976,7 +976,7 @@ def _generate_deepagents_service_adapter_content(analysis: dict) -> str:
976
976
  runnable_build = """ try:
977
977
  runnable_module = importlib.import_module(RUNNABLE_MODULE, __package__)
978
978
  deep_agent_runnable = getattr(runnable_module, "DeepAgentRunnable")
979
- return deep_agent_runnable(agent, _NullLangfuseManager())
979
+ return deep_agent_runnable(agent, _NullObservabilityManager())
980
980
  except Exception:
981
981
  return None
982
982
  """
@@ -992,20 +992,11 @@ import asyncio
992
992
  import importlib
993
993
  from typing import Any
994
994
 
995
- try:
996
- from langchain_core.callbacks import BaseCallbackHandler
997
- except Exception: # pragma: no cover - dependency may be absent during static checks
998
- BaseCallbackHandler = object
999
-
1000
995
  INIT_MODULE = "{init_module}"
1001
996
  {runnable_module_constant}
1002
997
 
1003
- class _NoopCallbackHandler(BaseCallbackHandler):
1004
- pass
1005
-
1006
-
1007
- class _NullLangfuseManager:
1008
- callback_handler = _NoopCallbackHandler()
998
+ class _NullObservabilityManager:
999
+ callback_handler = None
1009
1000
 
1010
1001
 
1011
1002
  class AgentEngineDeepAgentsServiceAdapter:
@@ -1591,16 +1582,16 @@ deploy:
1591
1582
  def _write_codex_project_config(project_path: Path, package_name: str) -> None:
1592
1583
  """Write the minimal codex runtime project:yaml 驱动,无 package/agent.py。
1593
1584
 
1594
- codex 的 agent 逻辑由 prompt 承载(CodexRunner.load_agent 是 no-op),所以只生成
1585
+ codex 的 agent 逻辑由 prompt 承载,所以只生成
1595
1586
  canonical agentengine.yaml(framework: codex,model+prompt)+ requirements +
1596
- README。model/prompt 经 CodexRunner 传入 codex thread(开发者指令)。
1587
+ README。model/prompt 经 CodexRuntimeAdapter 传入 codex thread(开发者指令)。
1597
1588
  """
1598
1589
  (project_path / "agentengine.yaml").write_text(
1599
1590
  f"""# AgentEngine codex runtime 项目配置
1600
1591
  name: {package_name}
1601
1592
  version: "1.0.0"
1602
1593
 
1603
- # 框架:codex(开发态 CodexRunner → 部署态 codex-runtime)
1594
+ # 框架:codex(本地和部署统一使用 CodexRuntimeAdapter)
1604
1595
  framework: codex
1605
1596
  artifact_type: ManagedRuntime
1606
1597
 
@@ -1609,7 +1600,7 @@ artifact_type: ManagedRuntime
1609
1600
  runtime:
1610
1601
  name: codex
1611
1602
 
1612
- # codex 的模型与开发者指令(CodexRunner 读取并传入 codex thread)
1603
+ # codex 的模型与开发者指令(CodexRuntimeAdapter 传入 codex thread)
1613
1604
  model: glm-5.2
1614
1605
  prompt: |
1615
1606
  你是 codex 编码助手。简洁回答,能跑命令验证就跑(shell 工具),中文回复。
@@ -1639,7 +1630,9 @@ ksadk web .
1639
1630
  - codex 自动探测模型协议:OpenAI 官方直连,星流 chat 模型自动启用转换代理。
1640
1631
  - `agentengine build .` 只生成 YAML manifest bundle,不打包本机 Codex 二进制。若
1641
1632
  `runtime.version` 未指定,build 需要连接到已配置 Runtime catalog;离线构建请显式锁定版本。
1642
- - 部署时服务端解析 ManagedRuntime 版本和 Linux 镜像 digest。
1633
+ - 部署时服务端解析 ManagedRuntime 版本和 Linux 镜像 digest。云端必须已发布 Runtime
1634
+ catalog、对应镜像和内联 manifest 控制面;未发布时请继续使用本地 `ksadk web`,不要把
1635
+ `runtime.version` 随意改成开发机版本,KsADK 不回退为 Code 部署。
1643
1636
  """,
1644
1637
  encoding="utf-8-sig",
1645
1638
  )
@@ -1885,8 +1878,6 @@ PORT=8080
1885
1878
  elif framework == "codex":
1886
1879
  env_content = _generate_codex_env_content(global_env)
1887
1880
  else:
1888
- langfuse_url = global_env.get("LANGFUSE_BASE_URL", "")
1889
-
1890
1881
  env_content = """# ======================
1891
1882
  # 模型配置 (必填, 可以从星流平台获取https://ksp.console.ksyun.com/#/apiKey)
1892
1883
  # ======================
@@ -1909,13 +1900,9 @@ PORT=8080
1909
1900
  # 可观测性 (可选)
1910
1901
  # ======================
1911
1902
  """
1912
- env_content += "# LANGFUSE_PUBLIC_KEY=pk-xxx\n"
1913
- env_content += "# LANGFUSE_SECRET_KEY=sk-xxx\n"
1914
-
1915
- if langfuse_url:
1916
- env_content += f"LANGFUSE_BASE_URL={langfuse_url}\n"
1917
- else:
1918
- env_content += "# LANGFUSE_BASE_URL=https://cloud.langfuse.com\n"
1903
+ env_content += "# OTEL_EXPORTER_OTLP_PROTOCOL=http/protobuf\n"
1904
+ env_content += "# OTEL_EXPORTER_OTLP_TRACES_ENDPOINT=https://collector.example.com/v1/traces\n"
1905
+ env_content += "# OTEL_EXPORTER_OTLP_TRACES_HEADERS=Authorization=Bearer%20placeholder\n"
1919
1906
 
1920
1907
  env_content += """
1921
1908
  # ======================
@@ -64,6 +64,10 @@ _PATH_EMBEDDED_OPTION_HINTS = (
64
64
  DEFAULT_PRIVATE_LINK_EXPIRES_SECONDS = 24 * 60 * 60
65
65
  MAX_PRIVATE_LINK_EXPIRES_SECONDS = 365 * 24 * 60 * 60
66
66
  DEFAULT_REGION = "cn-beijing-6"
67
+ # Hosted UI is the shared interaction surface for platform-managed Agents.
68
+ # The access link keeps the user/session/Agent binding while this path keeps
69
+ # the Web release independent from the Agent runtime image.
70
+ HOSTED_INTERACTION_UI_PATH = "/hosted-ui/chat"
67
71
 
68
72
  DASHBOARD_RESOURCE = ResourceDescriptor(
69
73
  name="Dashboard",
@@ -528,7 +532,17 @@ def _open_dashboard(
528
532
  )
529
533
  normalized_path = _normalize_ui_path(resolved_ui.path or "/")
530
534
  custom_ui_enabled = str(resolved_ui.profile or "").strip().lower() == "custom"
531
- link_path = normalized_path if ui_path is not None or custom_ui_enabled else None
535
+ # Hermes owns its own dashboard surface and OpenClaw takes its gateway
536
+ # branch below. The shared Hosted UI is the default only for the generic
537
+ # ADK/LangChain-compatible profiles; an explicit/custom path always wins.
538
+ use_hosted_interaction_ui = resolved_ui.profile in {"adk", "langchain"}
539
+ link_path = (
540
+ normalized_path
541
+ if ui_path is not None or custom_ui_enabled
542
+ else HOSTED_INTERACTION_UI_PATH
543
+ if use_hosted_interaction_ui
544
+ else None
545
+ )
532
546
  base_url = _build_base_ui_url(endpoint, normalized_path)
533
547
 
534
548
  if direct: