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
@@ -0,0 +1,27 @@
1
+ """Small control-plane payload helpers shared by Agent API operations."""
2
+
3
+ from __future__ import annotations
4
+
5
+ from typing import Any
6
+
7
+ from ksadk.configs.env_registry import is_sensitive_env_var
8
+
9
+
10
+ def environment_variables_payload(value: Any) -> list[dict[str, Any]]:
11
+ """Normalize environment variables while preserving their sensitivity flag."""
12
+
13
+ if isinstance(value, dict):
14
+ return [
15
+ {
16
+ "Key": str(key),
17
+ "Value": str(item),
18
+ "IsSensitive": is_sensitive_env_var(str(key)),
19
+ }
20
+ for key, item in value.items()
21
+ ]
22
+ if isinstance(value, list):
23
+ return value
24
+ return []
25
+
26
+
27
+ __all__ = ["environment_variables_payload"]
@@ -9,6 +9,7 @@ Code Builder - zip 打包模式构建
9
9
 
10
10
  import ast
11
11
  import hashlib
12
+ import importlib.metadata as importlib_metadata
12
13
  import json
13
14
  import os
14
15
  import re
@@ -19,8 +20,9 @@ import threading
19
20
  import time
20
21
  import zipfile
21
22
  from concurrent.futures import ThreadPoolExecutor, as_completed
23
+ from datetime import datetime, timezone
22
24
  from pathlib import Path
23
- from typing import List, Optional, Set
25
+ from typing import Any, List, Optional, Set
24
26
  from urllib.parse import urlparse
25
27
  from urllib.request import Request, urlopen
26
28
 
@@ -30,6 +32,7 @@ from packaging.requirements import InvalidRequirement, Requirement
30
32
  from ksadk.builders.base import BaseBuilder, BuildResult
31
33
  from ksadk.builders.framework_requirements import (
32
34
  FASTAPI_REQUIREMENT,
35
+ STARLETTE_REQUIREMENT,
33
36
  code_requirements_for_framework,
34
37
  )
35
38
  from ksadk.builders.requirements_utils import (
@@ -38,6 +41,154 @@ from ksadk.builders.requirements_utils import (
38
41
  parse_requirements_text,
39
42
  )
40
43
 
44
+ BUILD_INFO_SCHEMA = "ksadk-build-info/v1"
45
+ BUILD_INFO_ARCNAME = "ksadk/BUILD-INFO.json"
46
+
47
+
48
+ def _sha256_file(path: Path) -> str:
49
+ digest = hashlib.sha256()
50
+ with open(path, "rb") as f:
51
+ for chunk in iter(lambda: f.read(1024 * 1024), b""):
52
+ digest.update(chunk)
53
+ return digest.hexdigest()
54
+
55
+
56
+ def _bundled_content_fingerprint(files: List[Any]) -> str:
57
+ """对 (relative, file_path) 列表计算确定性内容指纹。
58
+
59
+ 指纹只依赖相对路径与逐文件 sha256,同一来源目录重复打包结果一致,
60
+ 可用于在线上快速判断 zip 里的源码快照是否与某次构建/提交一致。
61
+ """
62
+
63
+ digest = hashlib.sha256()
64
+ digest.update(f"fingerprint:{BUILD_INFO_SCHEMA}\n".encode("utf-8"))
65
+ for relative, file_path in sorted(files, key=lambda item: item[0]):
66
+ digest.update(relative.encode("utf-8"))
67
+ digest.update(b"\0")
68
+ digest.update(_sha256_file(file_path).encode("ascii"))
69
+ digest.update(b"\n")
70
+ return digest.hexdigest()
71
+
72
+
73
+ def _git_provenance(start: Path) -> Optional[dict]:
74
+ """返回 start 所在 git 仓库的提交信息;非 git 目录返回 None。"""
75
+
76
+ def _git(*args: str) -> Optional[str]:
77
+ try:
78
+ proc = subprocess.run(
79
+ ["git", "-C", str(start), *args],
80
+ capture_output=True,
81
+ text=True,
82
+ timeout=10,
83
+ )
84
+ except Exception:
85
+ return None
86
+ if proc.returncode != 0:
87
+ return None
88
+ return proc.stdout.strip()
89
+
90
+ toplevel = _git("rev-parse", "--show-toplevel")
91
+ if not toplevel:
92
+ return None
93
+ commit = _git("rev-parse", "HEAD")
94
+ branch = _git("rev-parse", "--abbrev-ref", "HEAD")
95
+ status = _git("status", "--porcelain")
96
+ return {
97
+ "repo_root": toplevel,
98
+ "commit": commit,
99
+ "branch": branch or None,
100
+ "dirty": bool(status),
101
+ }
102
+
103
+
104
+ def _package_provenance(package_name: str, package_root: Path) -> dict:
105
+ """采集被 vendored 包的安装来源:dist 元信息 / 本地路径 / git 提交。"""
106
+
107
+ info: dict[str, Any] = {
108
+ "source_dir": str(package_root),
109
+ "dist_version": None,
110
+ "installer": None,
111
+ "direct_url": None,
112
+ "source_type": "unknown",
113
+ "git": None,
114
+ }
115
+ try:
116
+ dist = importlib_metadata.distribution(package_name)
117
+ except Exception:
118
+ dist = None
119
+ if dist is not None:
120
+ info["dist_version"] = dist.version
121
+ installer = (dist.read_text("INSTALLER") or "").strip()
122
+ info["installer"] = installer or None
123
+ raw_direct_url = dist.read_text("direct_url.json")
124
+ if raw_direct_url:
125
+ try:
126
+ direct_url = json.loads(raw_direct_url)
127
+ except ValueError:
128
+ direct_url = None
129
+ if isinstance(direct_url, dict):
130
+ info["direct_url"] = direct_url.get("url")
131
+ url = str(direct_url.get("url") or "")
132
+ dir_info = direct_url.get("dir_info") or {}
133
+ archive_info = direct_url.get("archive_info") or {}
134
+ if url.startswith("file://"):
135
+ if dir_info.get("editable"):
136
+ info["source_type"] = "editable-install"
137
+ elif url.endswith(".whl"):
138
+ info["source_type"] = "local-wheel"
139
+ else:
140
+ info["source_type"] = "local-path"
141
+ elif archive_info:
142
+ info["source_type"] = "remote-dist"
143
+ if info["direct_url"] is None and info["dist_version"] is not None:
144
+ # pip 从 index 安装的常规 dist 通常不写 direct_url.json
145
+ info["source_type"] = "installed-dist"
146
+ if info["source_type"] in {"editable-install", "local-path", "unknown"}:
147
+ info["git"] = _git_provenance(package_root)
148
+ return info
149
+
150
+
151
+ def build_bundled_source_manifest(
152
+ package_roots: dict,
153
+ bundled_files: List[Any],
154
+ ) -> dict:
155
+ """生成随 zip 下发的 BUILD-INFO 内容。
156
+
157
+ - ``package_roots``: {package_name: 源码目录}
158
+ - ``bundled_files``: _iter_bundled_source_files() 的 (name, relative, path) 三元组
159
+ """
160
+
161
+ grouped: dict[str, List[Any]] = {}
162
+ for package_name, relative, file_path in bundled_files:
163
+ grouped.setdefault(package_name, []).append((relative, file_path))
164
+
165
+ packages: dict[str, Any] = {}
166
+ for package_name, files in sorted(grouped.items()):
167
+ package_root = package_roots.get(package_name)
168
+ provenance = (
169
+ _package_provenance(package_name, package_root)
170
+ if package_root is not None
171
+ else {"source_dir": None, "source_type": "unknown"}
172
+ )
173
+ packages[package_name] = {
174
+ **provenance,
175
+ "file_count": len(files),
176
+ "content_fingerprint_sha256": _bundled_content_fingerprint(files),
177
+ }
178
+
179
+ return {
180
+ "schema": BUILD_INFO_SCHEMA,
181
+ "built_at": datetime.now(timezone.utc).isoformat(timespec="seconds"),
182
+ "packages": packages,
183
+ }
184
+
185
+
186
+ _NONRELEASE_SOURCE_TYPES = {"editable-install", "local-path", "local-wheel", "unknown"}
187
+
188
+
189
+ def _is_release_like_source(provenance: dict) -> bool:
190
+ return provenance.get("source_type") in {"installed-dist", "remote-dist"}
191
+
41
192
 
42
193
  class CodeBuilder(BaseBuilder):
43
194
  """Code 模式构建器 - 打包 zip + 依赖"""
@@ -111,10 +262,14 @@ class CodeBuilder(BaseBuilder):
111
262
  }
112
263
  BUNDLED_KSADK_CORE_RUNTIME_REQUIREMENTS = (
113
264
  "a2a-sdk>=0.3.22",
265
+ "culsans>=0.11.0",
114
266
  "httpx-sse>=0.4.0",
115
267
  "sse-starlette>=2.1.0",
116
268
  "python-multipart>=0.0.9,<1.0.0",
117
269
  "requests>=2.28.0",
270
+ "sqlalchemy>=2.0.0",
271
+ "aiosqlite>=0.19.0",
272
+ "greenlet>=3.0.0",
118
273
  "requests-aws4auth>=1.2.0",
119
274
  "kingsoftcloud-sdk-python>=1.5.8.94",
120
275
  "cryptography>=44.0.0",
@@ -224,6 +379,7 @@ class CodeBuilder(BaseBuilder):
224
379
  self._save_input_fingerprint(zip_path, detection_result)
225
380
  zip_size = zip_path.stat().st_size / (1024 * 1024)
226
381
  click.secho(f"\n✅ 使用已有构建: {zip_path.name} ({zip_size:.2f} MB)", fg="green")
382
+ self._emit_bundled_ksadk_identity(zip_path)
227
383
  click.echo(
228
384
  " (如需只重新打包当前代码/runtime,请使用 --repackage;"
229
385
  "如需重装依赖,请使用 --no-cache)"
@@ -270,6 +426,7 @@ class CodeBuilder(BaseBuilder):
270
426
  package_started_at = time.monotonic()
271
427
  self._package_zip(zip_path, detection_result)
272
428
  click.echo(f" ✓ 打包耗时: {self._format_elapsed(package_started_at)}")
429
+ self._emit_bundled_ksadk_identity(zip_path)
273
430
  self._save_input_fingerprint(zip_path, detection_result)
274
431
 
275
432
  zip_size = zip_path.stat().st_size
@@ -652,15 +809,18 @@ class CodeBuilder(BaseBuilder):
652
809
  "file_digests": file_digests,
653
810
  }
654
811
 
655
- def _iter_bundled_source_files(self):
812
+ def _bundled_source_package_roots(self) -> dict:
656
813
  import ksadk
657
814
  import ksadk_runtime_common
658
815
 
659
- yield from self._iter_bundled_source_package("ksadk", Path(ksadk.__file__).resolve().parent)
660
- yield from self._iter_bundled_source_package(
661
- "ksadk_runtime_common",
662
- Path(ksadk_runtime_common.__file__).resolve().parent,
663
- )
816
+ return {
817
+ "ksadk": Path(ksadk.__file__).resolve().parent,
818
+ "ksadk_runtime_common": Path(ksadk_runtime_common.__file__).resolve().parent,
819
+ }
820
+
821
+ def _iter_bundled_source_files(self):
822
+ for package_name, package_root in self._bundled_source_package_roots().items():
823
+ yield from self._iter_bundled_source_package(package_name, package_root)
664
824
 
665
825
  def _iter_bundled_source_package(self, package_name: str, package_root: Path):
666
826
  for file_path in sorted(package_root.rglob("*")):
@@ -680,6 +840,32 @@ class CodeBuilder(BaseBuilder):
680
840
  parts = relative_path.parts
681
841
  return len(parts) >= 2 and parts[0] == "server" and parts[1] == "web-ui"
682
842
 
843
+ def _warn_on_nonrelease_bundled_source(self, build_info: dict) -> None:
844
+ """vendored ksadk 源码来自本地路径/editable/来源不明时给出醒目提示。
845
+
846
+ 历史事故:打包机 environment 里的 ksadk 是正式 release 之前的 dev 快照,
847
+ vendored 进 zip 上线后 runtime 行为与正式版不一致且无从追溯。
848
+ """
849
+
850
+ for package_name, package_info in (build_info.get("packages") or {}).items():
851
+ if _is_release_like_source(package_info):
852
+ continue
853
+ source_desc = (
854
+ f"type={package_info.get('source_type')} " f"dir={package_info.get('source_dir')}"
855
+ )
856
+ git_info = package_info.get("git") or {}
857
+ if git_info.get("commit"):
858
+ dirty = " (有未提交改动)" if git_info.get("dirty") else ""
859
+ source_desc += (
860
+ f" git={git_info.get('branch') or '?'}@{str(git_info['commit'])[:12]}{dirty}"
861
+ )
862
+ click.secho(
863
+ f" ⚠ 打包进 zip 的 {package_name} 不是正式发行版来源 ({source_desc})。"
864
+ "若这不是有意为之,请先用官方渠道的正式版本重装后再打包; "
865
+ f"解压 zip 后查看 {BUILD_INFO_ARCNAME} 可核对来源与内容指纹。",
866
+ fg="yellow",
867
+ )
868
+
683
869
  def _iter_project_files(self):
684
870
  for item in sorted(self.project_dir.iterdir(), key=lambda p: p.name):
685
871
  if self._should_skip_root_path(item):
@@ -796,17 +982,18 @@ class CodeBuilder(BaseBuilder):
796
982
  deps = [
797
983
  # Core
798
984
  FASTAPI_REQUIREMENT,
985
+ STARLETTE_REQUIREMENT,
799
986
  "uvicorn>=0.23.0",
800
987
  "python-dotenv>=1.0.0",
801
988
  "pydantic>=2.0.0",
802
989
  "pyyaml>=6.0.0",
803
990
  "httpx>=0.24.0",
804
- # Tracing
991
+ # Tracing — OTLP 双写收敛:只用 OTel + openinference 自动插桩,
992
+ # 不再安装 Langfuse SDK(callback 路径已删除,Langfuse 通过标准 OTLP 接收)。
805
993
  "opentelemetry-api>=1.37.0",
806
994
  "opentelemetry-sdk>=1.37.0",
807
995
  "opentelemetry-exporter-otlp>=1.37.0",
808
996
  "openinference-instrumentation-langchain>=0.1.0",
809
- "langfuse>=2.0.0",
810
997
  ]
811
998
 
812
999
  framework = detection_result.type.value
@@ -1611,6 +1798,26 @@ class CodeBuilder(BaseBuilder):
1611
1798
  )
1612
1799
  self._finish_package_progress()
1613
1800
 
1801
+ # This provenance module is written after the bundled source so a
1802
+ # Code archive can attest to the KsADK source it actually imports.
1803
+ # It deliberately comes from local package bytes / Git only; no
1804
+ # environment value is copied into the archive.
1805
+ zf.writestr(
1806
+ "ksadk/_bundle_identity.py",
1807
+ self._bundle_runtime_identity_source(bundled_source_files),
1808
+ )
1809
+ # 写入 runtime 来源清单:排查"zip 里 vendored 的 ksadk 到底是什么快照"时,
1810
+ # 解压 ksadk/BUILD-INFO.json 即可看到来源/版本/commit/内容指纹,不用进 pod 翻文件。
1811
+ build_info = build_bundled_source_manifest(
1812
+ self._bundled_source_package_roots(),
1813
+ bundled_source_files,
1814
+ )
1815
+ zf.writestr(
1816
+ BUILD_INFO_ARCNAME,
1817
+ json.dumps(build_info, ensure_ascii=False, indent=2, sort_keys=True) + "\n",
1818
+ )
1819
+ self._warn_on_nonrelease_bundled_source(build_info)
1820
+
1614
1821
  click.echo(f" ✓ 打包运行时源码: {bundled_source_count} 个文件")
1615
1822
 
1616
1823
  # 添加 entrypoint
@@ -1620,6 +1827,75 @@ class CodeBuilder(BaseBuilder):
1620
1827
  click.echo(f" ✓ 打包完成: {len(project_files)} 个项目文件 + {deps_count} 个依赖文件")
1621
1828
  self._emit_package_size_report(zip_path)
1622
1829
 
1830
+ def _bundle_runtime_identity_source(self, bundled_source_files) -> str:
1831
+ """Generate package-local provenance for a Code archive."""
1832
+
1833
+ digest = hashlib.sha256()
1834
+ for package_name, relative, file_path in bundled_source_files:
1835
+ if package_name != "ksadk":
1836
+ continue
1837
+ digest.update(relative.encode("utf-8"))
1838
+ digest.update(b"\0")
1839
+ digest.update(file_path.read_bytes())
1840
+ digest.update(b"\0")
1841
+
1842
+ import ksadk
1843
+ from ksadk.version import VERSION
1844
+
1845
+ source_root = Path(ksadk.__file__).resolve().parent
1846
+ commit = ""
1847
+ try:
1848
+ result = subprocess.run(
1849
+ ["git", "-C", str(source_root.parent), "rev-parse", "HEAD"],
1850
+ capture_output=True,
1851
+ check=True,
1852
+ text=True,
1853
+ timeout=3,
1854
+ )
1855
+ candidate = result.stdout.strip().lower()
1856
+ if re.fullmatch(r"[0-9a-f]{40,64}", candidate):
1857
+ commit = candidate
1858
+ except (OSError, subprocess.SubprocessError):
1859
+ pass
1860
+
1861
+ payload = {
1862
+ "ksadk_version": VERSION,
1863
+ "ksadk_commit": commit,
1864
+ "ksadk_source_digest": digest.hexdigest(),
1865
+ }
1866
+ return (
1867
+ "# Generated by KsADK CodeBuilder; do not edit.\n"
1868
+ f"BUNDLE_IDENTITY = {payload!r}\n"
1869
+ )
1870
+
1871
+ def _emit_bundled_ksadk_identity(self, zip_path: Path) -> None:
1872
+ """Print the KsADK provenance embedded in *this exact* Code archive.
1873
+
1874
+ The code archive shadows packages from the base image. Reading the
1875
+ generated archive back here prevents a build log from accidentally
1876
+ describing the local CLI environment instead of what will run in the
1877
+ workload.
1878
+ """
1879
+
1880
+ try:
1881
+ with zipfile.ZipFile(zip_path) as zf:
1882
+ source = zf.read("ksadk/_bundle_identity.py").decode("utf-8")
1883
+ _prefix, raw_payload = source.split("=", 1)
1884
+ identity = ast.literal_eval(raw_payload.strip())
1885
+ except (OSError, KeyError, UnicodeDecodeError, ValueError, SyntaxError):
1886
+ click.secho(" ⚠ 未能读取 ZIP 内的 KsADK 来源信息", fg="yellow")
1887
+ return
1888
+
1889
+ if not isinstance(identity, dict):
1890
+ click.secho(" ⚠ ZIP 内的 KsADK 来源信息格式无效", fg="yellow")
1891
+ return
1892
+ version = str(identity.get("ksadk_version") or "unknown")
1893
+ commit = str(identity.get("ksadk_commit") or "unavailable")
1894
+ source_digest = str(identity.get("ksadk_source_digest") or "unavailable")
1895
+ click.echo(f" KsADK: version={version}")
1896
+ click.echo(f" KsADK source: commit={commit}")
1897
+ click.echo(f" KsADK source digest: sha256={source_digest}")
1898
+
1623
1899
  def _emit_package_size_report(self, zip_path: Path, *, limit: int = 8) -> None:
1624
1900
  try:
1625
1901
  with zipfile.ZipFile(zip_path, "r") as zf:
@@ -1735,6 +2011,9 @@ class CodeBuilder(BaseBuilder):
1735
2011
  def _generate_entrypoint(self, detection_result) -> str:
1736
2012
  """生成 entrypoint.py"""
1737
2013
  package_name = Path(detection_result.package_path).name
2014
+ runtime_config_json = json.dumps(
2015
+ self._load_config(), ensure_ascii=False, separators=(",", ":"), default=str
2016
+ )
1738
2017
  return f'''"""
1739
2018
  AgentEngine Code 模式入口
1740
2019
 
@@ -1748,6 +2027,7 @@ zip 包结构:
1748
2027
  import sys
1749
2028
  import os
1750
2029
  import logging
2030
+ import json
1751
2031
  from pathlib import Path
1752
2032
 
1753
2033
  # ========== 日志配置 ==========
@@ -1808,15 +2088,11 @@ logger.info(f"PYTHONPATH: {{os.environ.get('PYTHONPATH', 'N/A')}}")
1808
2088
  # 打印关键环境变量 (隐藏敏感信息)
1809
2089
  env_keys = [
1810
2090
  "AGENT_RUNTIME_NAME", "AGENT_RUNTIME_ID", "ACCOUNT_ID", "PORT",
1811
- "LANGFUSE_BASE_URL", "LANGFUSE_HOST", "LANGFUSE_PUBLIC_KEY",
1812
- "LANGFUSE_SECRET_KEY", "LANGFUSE_USE_CALLBACK",
1813
2091
  "OTEL_EXPORTER_OTLP_ENDPOINT", "OTEL_EXPORTER_OTLP_TRACES_ENDPOINT",
1814
2092
  "OTEL_EXPORTER_OTLP_HEADERS", "OTEL_EXPORTER_OTLP_TRACES_HEADERS",
1815
- "OTEL_SERVICE_NAME", "CLOUD_MONITOR_APP_KEY",
1816
- "CLOUD_MONITOR_OTLP_ENABLED", "CLOUD_MONITOR_OTLP_ENDPOINT",
1817
- "CLOUD_MONITOR_OTLP_TRACES_ENDPOINT", "CLOUD_MONITOR_OTLP_HEADERS",
1818
- "CLOUD_MONITOR_LANGFUSE_HOST", "CLOUD_MONITOR_LANGFUSE_PUBLIC_KEY",
1819
- "CLOUD_MONITOR_LANGFUSE_SECRET_KEY", "CLOUD_MONITOR_LANGFUSE_ENABLED",
2093
+ "OTEL_SERVICE_NAME",
2094
+ "CLOUD_MONITOR_OTLP_ENDPOINT", "CLOUD_MONITOR_OTLP_TRACES_ENDPOINT",
2095
+ "CLOUD_MONITOR_OTLP_HEADERS", "CLOUD_MONITOR_OTLP_TRACES_HEADERS",
1820
2096
  "LANGCHAIN_TRACING_V2", "MODEL_NAME",
1821
2097
  ]
1822
2098
  for key in env_keys:
@@ -1833,15 +2109,9 @@ logger.info("=" * 60)
1833
2109
  from ksadk.configs import setup_environment
1834
2110
  setup_environment(Path(CODE_ROOT))
1835
2111
 
1836
- try:
1837
- from ksadk.runners.patch_langchain import apply_patch as apply_langchain_patch
1838
- apply_langchain_patch()
1839
- except ImportError:
1840
- pass
1841
-
1842
- from ksadk.runners import create_runner
1843
2112
  from ksadk.detection import DetectionResult, FrameworkType
1844
- from ksadk.server import app, set_runner
2113
+ from ksadk.runtime import RuntimeExecutor, RuntimeLaunchContext, build_default_runtime_registry
2114
+ from ksadk.server import RuntimeAppConfig, configure_runtime_app, create_runtime_app
1845
2115
  import uvicorn
1846
2116
 
1847
2117
  # 检测结果 (构建时固化)
@@ -1851,57 +2121,86 @@ detection_result = DetectionResult(
1851
2121
  entry_point="{detection_result.entry_point}",
1852
2122
  package_path=os.path.join(CODE_ROOT, "{package_name}"),
1853
2123
  agent_variable="{detection_result.agent_variable}",
1854
- runner_class="{getattr(detection_result, 'runner_class', '')}"
2124
+ runner_class="{getattr(detection_result, "runner_class", "")}"
1855
2125
  )
1856
2126
 
1857
2127
  logger.info(f"框架: {{detection_result.name}}")
1858
2128
  logger.info(f"入口: {{detection_result.entry_point}}")
1859
2129
 
1860
- # 初始化 Tracing (如果配置了 Langfuse、标准 OTLP HTTP 或 CloudMonitor OTLP)
2130
+ # 初始化 Tracing (如果配置了标准 OTLP HTTP 或 CloudMonitor OTLP)
1861
2131
  has_otlp = bool(
1862
2132
  os.environ.get("OTEL_EXPORTER_OTLP_ENDPOINT")
1863
2133
  or os.environ.get("OTEL_EXPORTER_OTLP_TRACES_ENDPOINT")
1864
2134
  )
1865
2135
  has_cloud_monitor_otlp = bool(
1866
- os.environ.get("CLOUD_MONITOR_APP_KEY")
2136
+ os.environ.get("CLOUD_MONITOR_OTLP_TRACES_HEADERS")
2137
+ or os.environ.get("CLOUD_MONITOR_OTLP_HEADERS")
1867
2138
  or os.environ.get("CLOUD_MONITOR_OTLP_ENDPOINT")
1868
2139
  or os.environ.get("CLOUD_MONITOR_OTLP_TRACES_ENDPOINT")
2140
+ or os.environ.get("CLOUD_MONITOR_APP_KEY")
1869
2141
  )
1870
- has_cloud_monitor_langfuse = bool(
1871
- os.environ.get("CLOUD_MONITOR_LANGFUSE_PUBLIC_KEY")
1872
- or os.environ.get("CLOUD_MONITOR_LANGFUSE_SECRET_KEY")
1873
- or os.environ.get("CLOUD_MONITOR_LANGFUSE_HOST")
1874
- )
1875
- if (
1876
- os.environ.get("LANGFUSE_PUBLIC_KEY")
1877
- or has_otlp
1878
- or has_cloud_monitor_otlp
1879
- or has_cloud_monitor_langfuse
1880
- ):
2142
+ if has_otlp or has_cloud_monitor_otlp:
1881
2143
  try:
1882
2144
  from ksadk.tracing import setup_tracing
1883
2145
 
1884
- use_callback_only = (
1885
- os.environ.get("LANGFUSE_USE_CALLBACK", "").strip().lower()
1886
- in ("1", "true", "yes", "on")
1887
- )
1888
-
1889
- setup_tracing(use_callback_only=use_callback_only)
2146
+ setup_tracing()
1890
2147
  logger.info(
1891
2148
  f"Tracing 已启用 (OTLP={{has_otlp}}, "
1892
- f"CloudMonitorOTLP={{has_cloud_monitor_otlp}}, "
1893
- f"CloudMonitorLangfuse={{has_cloud_monitor_langfuse}}, "
1894
- f"CallbackOnly={{use_callback_only}})"
2149
+ f"CloudMonitorOTLP={{has_cloud_monitor_otlp}})"
1895
2150
  )
1896
2151
  except Exception as e:
1897
2152
  logger.warning(f"Tracing 初始化失败: {{e}}")
1898
2153
 
1899
- # 创建 Runner 并加载 Agent
1900
- logger.info("正在加载 Agent...")
1901
- runner = create_runner(detection_result, CODE_ROOT)
1902
- runner.load_agent()
1903
- set_runner(runner, loaded=True)
1904
- logger.info("Agent 加载成功!")
2154
+ # 只装配统一 RuntimeAdapter 执行链;具体 Adapter 在请求开始时由 Registry 创建。
2155
+ runtime_build_config = json.loads({runtime_config_json!r})
2156
+ runtime_context = RuntimeLaunchContext(
2157
+ runtime_type=detection_result.type.value,
2158
+ project_dir=Path(CODE_ROOT),
2159
+ detection=detection_result,
2160
+ config=dict(runtime_build_config),
2161
+ )
2162
+ # managed A2A:KSADK_A2A_RUNTIME_ID 非空时挂 discovery card + 完整数据面 route。
2163
+ _managed_a2a_card = None
2164
+ _a2a_config = None
2165
+ _a2a_adapter = None
2166
+ if os.environ.get("KSADK_A2A_RUNTIME_ID", "").strip():
2167
+ from ksadk.managed_a2a_card import build_managed_a2a_card_if_configured
2168
+
2169
+ _managed_a2a_card = build_managed_a2a_card_if_configured()
2170
+ try:
2171
+ from ksadk.a2a.routes import A2AConfig
2172
+ from ksadk.runtime.factory import create_runtime_adapter
2173
+
2174
+ _a2a_adapter = create_runtime_adapter(runtime_context)
2175
+ _base = (
2176
+ os.environ.get("KSADK_A2A_INTERNAL_BASE_URL", "").strip()
2177
+ or "http://localhost:8080"
2178
+ )
2179
+ _a2a_config = A2AConfig(
2180
+ enabled=True,
2181
+ base_url=_base,
2182
+ agent_name=(
2183
+ os.environ.get("KSADK_A2A_AGENT_NAME", "").strip()
2184
+ or os.environ.get("KSADK_A2A_RUNTIME_ID", "").strip()
2185
+ ),
2186
+ streaming=True,
2187
+ task_store_dsn="sqlite+aiosqlite:///.agentengine/a2a_tasks.db",
2188
+ )
2189
+ except Exception as _e:
2190
+ logger.warning(f"managed A2A 数据面装配失败,回退 discovery-only: {{_e}}")
2191
+ _a2a_config = None
2192
+ _a2a_adapter = None
2193
+ app = create_runtime_app(
2194
+ RuntimeAppConfig(
2195
+ runtime_type=detection_result.type.value,
2196
+ runtime_executor=RuntimeExecutor(build_default_runtime_registry()),
2197
+ launch_context=runtime_context,
2198
+ a2a=_a2a_config or _managed_a2a_card,
2199
+ a2a_runtime_adapter=_a2a_adapter,
2200
+ ),
2201
+ configure_runtime_app,
2202
+ )
2203
+ logger.info("RuntimeAdapter 执行链装配成功!")
1905
2204
 
1906
2205
  if __name__ == "__main__":
1907
2206
  port = int(os.environ.get("PORT", 8080))