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
ksadk/cli/cmd_replay.py CHANGED
@@ -17,8 +17,13 @@ import json
17
17
  import click
18
18
 
19
19
  from ksadk.cli.resource_common import CONTEXT_SETTINGS
20
- from ksadk.events.replay import replay_transcript
20
+ from ksadk.events.reducer import StreamReducer
21
21
  from ksadk.events.store import RuntimeEventStore
22
+ from ksadk.events.v1_compat import (
23
+ RuntimeEventV1Parser,
24
+ RuntimeEventV1ProjectionContext,
25
+ project_to_v1,
26
+ )
22
27
 
23
28
  _HELP = dict(help_option_names=["-h", "--help"])
24
29
 
@@ -43,9 +48,28 @@ async def _run(session_id: str, *, after_seq_id: int, before_seq_id: int | None,
43
48
  from ksadk.sessions import resolve_session_service
44
49
 
45
50
  store = RuntimeEventStore(resolve_session_service())
46
- parser = await replay_transcript(
47
- store, session_id, after_seq_id=after_seq_id, before_seq_id=before_seq_id
48
- )
51
+ service = resolve_session_service()
52
+ session = await service.get_session(session_id)
53
+ events = await store.list(session_id)
54
+ parser = RuntimeEventV1Parser()
55
+ reducers: dict[str, StreamReducer] = {}
56
+ for event in events:
57
+ reducer = reducers.get(event.run_id)
58
+ if reducer is not None and reducer.snapshot().status in {"completed", "failed", "canceled"}:
59
+ reducer = None
60
+ if reducer is None:
61
+ reducer = StreamReducer()
62
+ reducers[event.run_id] = reducer
63
+ reducer.apply(event)
64
+ projection = reducer.snapshot()
65
+ context = RuntimeEventV1ProjectionContext(
66
+ agent_id=session.agent_id if session else "",
67
+ user_id=session.user_id if session else "",
68
+ session_id=session_id,
69
+ projection=projection,
70
+ )
71
+ for v1_event in project_to_v1(event, mode="identity_replace", context=context):
72
+ parser.feed(v1_event)
49
73
  transcript = parser.transcript()
50
74
  if fmt == "json":
51
75
  click.echo(json.dumps(transcript, ensure_ascii=False, sort_keys=True))
ksadk/cli/cmd_run.py CHANGED
@@ -11,14 +11,15 @@ import sys
11
11
  from pathlib import Path
12
12
 
13
13
  import click
14
+ import uvicorn
14
15
 
15
16
  from ksadk.cli.error_utils import ensure_json_output_supported, print_exception
16
17
  from ksadk.cli.local_runtime import reexec_with_project_venv_if_needed
18
+ from ksadk.cli.runtime_bootstrap import create_runtime_web_app
17
19
  from ksadk.cli.ui import (
18
20
  print_error,
19
21
  print_info,
20
22
  print_kv,
21
- print_rule,
22
23
  print_success,
23
24
  print_title,
24
25
  print_warn,
@@ -117,59 +118,45 @@ def run(
117
118
  configure_local_runtime_persistence(agent_path, result.type.value)
118
119
 
119
120
  # 2. 根据框架类型选择处理方式
120
- # 所有框架统一使用 _run_custom() 以支持 Langfuse 自动插桩
121
- # (Langfuse instrumentation 需要在同一进程内生效)
121
+ # 所有框架统一使用 _run_custom(),让 OTel instrumentation 在同一进程生效。
122
122
  _run_custom(
123
123
  result, agent_path, port, interactive, no_trace, show_thinking, no_stream, no_alt_screen
124
124
  )
125
125
 
126
126
 
127
127
  def _run_adk_cli(agent_path: Path, port: int = 8080, command: str = "run"):
128
- """运行 ADK Agent,支持 Langfuse tracing
129
-
130
- 对于 Langfuse 集成,我们需要在同一进程内运行 ADK,
131
- 因为 OpenTelemetry instrumentation 只在进程内生效。
132
- """
128
+ """运行 ADK Agent,使用标准 OTLP 配置。"""
133
129
  import os
134
130
 
135
- has_langfuse = bool(os.getenv("LANGFUSE_PUBLIC_KEY"))
131
+ has_otlp = bool(
132
+ os.getenv("OTEL_EXPORTER_OTLP_ENDPOINT")
133
+ or os.getenv("OTEL_EXPORTER_OTLP_TRACES_ENDPOINT")
134
+ or os.getenv("CLOUD_MONITOR_OTLP_ENDPOINT")
135
+ or os.getenv("CLOUD_MONITOR_OTLP_TRACES_ENDPOINT")
136
+ )
136
137
 
137
138
  # 必须先初始化 Tracing(在导入 ADK 之前)
138
- if has_langfuse:
139
+ if has_otlp:
139
140
  try:
140
141
  from ksadk.tracing import setup_tracing
141
142
 
142
143
  setup_tracing(
143
144
  enable_inmemory=False,
144
- enable_langfuse=True,
145
145
  enable_adk_instrumentation=True,
146
146
  )
147
- print_info("Tracing: Enabled (Langfuse + ADK Instrumentation)")
147
+ print_info("Tracing: Enabled (OTLP + ADK Instrumentation)")
148
148
  except Exception as e:
149
- print_warn(f"Langfuse 初始化失败: {e}")
149
+ print_warn(f"OTLP tracing 初始化失败: {e}")
150
150
 
151
151
  print_kv("调用 ADK 原生 CLI", f"adk {command}")
152
152
 
153
- # 使用 subprocess(Langfuse instrumentation 在子进程中不生效,但环境变量会传递)
154
- # ADK CLI 本身不支持 Langfuse,需要用户在项目中集成
153
+ # 子进程继承标准 OTLP 环境变量;项目内 instrumentation 负责创建 spans。
155
154
  if command == "run":
156
155
  cmd = [sys.executable, "-m", "google.adk.cli", "run", "."]
157
156
  else:
158
157
  cmd = [sys.executable, "-m", "google.adk.cli", "web", ".", "--port", str(port)]
159
158
 
160
- # 传递 Langfuse 环境变量
161
159
  env = os.environ.copy()
162
- langfuse_vars = ["LANGFUSE_PUBLIC_KEY", "LANGFUSE_SECRET_KEY", "LANGFUSE_BASE_URL"]
163
- for var in langfuse_vars:
164
- if var in os.environ:
165
- env[var] = os.environ[var]
166
-
167
- # 提示用户如何在 ADK 项目中启用 Langfuse
168
- if has_langfuse:
169
- print_rule("ADK 项目 Langfuse 集成提示")
170
- print_info("在 agent.py 中添加以下代码:")
171
- print_info("from openinference.instrumentation.google_adk import GoogleADKInstrumentor")
172
- print_info("GoogleADKInstrumentor().instrument()")
173
160
 
174
161
  try:
175
162
  subprocess.run(cmd, cwd=str(agent_path), check=True, env=env)
@@ -191,8 +178,7 @@ def _run_custom(
191
178
  no_stream: bool = False,
192
179
  no_alt_screen: bool = False,
193
180
  ):
194
- """使用自定义实现 (LangChain/LangGraph/DeepAgents)"""
195
- from ksadk.runners.factory import create_runner
181
+ """Run one detected project through the canonical RuntimeAdapter composition."""
196
182
 
197
183
  # 初始化 Tracing
198
184
  if not no_trace:
@@ -201,62 +187,38 @@ def _run_custom(
201
187
 
202
188
  from ksadk.tracing import setup_tracing
203
189
 
204
- has_langfuse = bool(os.getenv("LANGFUSE_PUBLIC_KEY"))
205
190
  has_otlp = bool(
206
191
  os.getenv("OTEL_EXPORTER_OTLP_ENDPOINT")
207
192
  or os.getenv("OTEL_EXPORTER_OTLP_TRACES_ENDPOINT")
208
193
  )
209
194
 
210
- use_callback_only = os.getenv("LANGFUSE_USE_CALLBACK", "").strip().lower() in (
211
- "1",
212
- "true",
213
- "yes",
214
- "on",
215
- )
216
-
217
195
  setup_tracing(
218
196
  enable_inmemory=True,
219
197
  enable_langfuse=None,
220
- use_callback_only=use_callback_only,
221
198
  )
222
199
 
223
200
  if has_otlp:
224
201
  print_info("Tracing: Enabled (InMemory + OTLP HTTP)")
225
- elif has_langfuse:
226
- print_info(
227
- f"Tracing: Enabled (InMemory + Langfuse, CallbackOnly={use_callback_only})"
228
- )
229
202
  else:
230
203
  print_info("Tracing: Enabled")
231
204
  except Exception as e:
232
205
  print_warn(f"Tracing 初始化失败: {e}")
233
206
 
234
- # 创建 Runner
207
+ if interactive:
208
+ del show_thinking, no_stream, no_alt_screen
209
+ print_error(
210
+ "RuntimeAdapter TUI 尚未接通;请使用 `ksadk web` 或不带 --interactive 启动"
211
+ )
212
+ raise SystemExit(2)
213
+
235
214
  try:
236
- print_info("初始化 Runner...")
237
- runner = create_runner(result, str(agent_path))
238
- runner.load_agent()
239
- print_success("Agent 加载成功")
215
+ runtime_app = create_runtime_web_app(result, agent_path)
240
216
  except Exception as e:
241
- print_exception("Agent 加载失败", e)
242
- # import traceback
243
- # traceback.print_exc()
217
+ print_exception("RuntimeAdapter 初始化失败", e)
244
218
  raise SystemExit(1)
245
219
 
246
- # 运行
247
- if interactive:
248
- # TUI 交互模式
249
- from ksadk.tui.loop import run_tui
250
-
251
- run_tui(
252
- runner,
253
- show_thinking=show_thinking,
254
- project_dir=str(agent_path),
255
- no_alt_screen=no_alt_screen,
256
- )
257
- else:
258
- print_success(f"Server running at http://0.0.0.0:{port}")
259
- print_kv("API Docs", f"http://0.0.0.0:{port}/docs")
260
- print_kv("Chat API", f"http://0.0.0.0:{port}/chat")
261
- print_info("Press Ctrl+C to stop")
262
- runner.run_server(port=port)
220
+ print_success(f"Server running at http://127.0.0.1:{port}")
221
+ print_kv("API Docs", f"http://127.0.0.1:{port}/docs")
222
+ print_kv("Chat API", f"http://127.0.0.1:{port}/chat")
223
+ print_info("Press Ctrl+C to stop")
224
+ uvicorn.run(runtime_app, host="127.0.0.1", port=port)
@@ -0,0 +1,201 @@
1
+ """agentengine studio - start the local-first Agent authoring control plane."""
2
+
3
+ from __future__ import annotations
4
+
5
+ import logging
6
+ import os
7
+ import secrets
8
+ import webbrowser
9
+ from pathlib import Path
10
+
11
+ import click
12
+ import uvicorn
13
+
14
+ from ksadk.cli.env_options import load_env_file
15
+ from ksadk.cli.ui import print_info, print_kv, print_success, print_title
16
+
17
+ # veadk 风格:日志行带模块名与行号(filename:lineno),本地排障时能直接定位代码。
18
+ _LOG_FORMAT = "%(asctime)s %(levelname)s %(name)s %(filename)s:%(lineno)d %(message)s"
19
+
20
+ _STUDIO_LOG_CONFIG = {
21
+ "version": 1,
22
+ "disable_existing_loggers": False,
23
+ "formatters": {
24
+ "default": {"format": _LOG_FORMAT},
25
+ "access": {"format": _LOG_FORMAT},
26
+ },
27
+ "handlers": {
28
+ "default": {
29
+ "class": "logging.StreamHandler",
30
+ "formatter": "default",
31
+ "stream": "ext://sys.stderr",
32
+ },
33
+ "access": {
34
+ "class": "logging.StreamHandler",
35
+ "formatter": "access",
36
+ "stream": "ext://sys.stdout",
37
+ },
38
+ },
39
+ "loggers": {
40
+ "uvicorn": {"handlers": ["default"], "level": "INFO", "propagate": False},
41
+ "uvicorn.error": {"level": "INFO"},
42
+ "uvicorn.access": {"handlers": ["access"], "level": "INFO", "propagate": False},
43
+ },
44
+ "root": {"handlers": ["default"], "level": "INFO"},
45
+ }
46
+
47
+ from ksadk.studio.api import create_studio_app
48
+ from ksadk.studio.service import StudioService
49
+
50
+ # 模型环境变量白名单。OPENAI_BASE_URL 与 OPENAI_API_BASE 互为别名,两者都接受;
51
+ # 加载时做别名归一(见 studio()),运行时统一 OPENAI_BASE_URL 优先(与 cmd_config/cmd_model
52
+ # /api.py 一致,方案 §2.4 第 5 点)。
53
+ _MODEL_ENV_KEYS = (
54
+ "OPENAI_BASE_URL",
55
+ "OPENAI_API_BASE",
56
+ "OPENAI_API_KEY",
57
+ "OPENAI_MODEL_NAME",
58
+ )
59
+ # Cloud-control credentials are intentionally process-only as well. Studio
60
+ # needs them to use the Server Action API for a deployed Agent, but they must
61
+ # never become browser settings, workspace files, or runtime environment.
62
+ _CLOUD_CONTROL_ENV_KEYS = (
63
+ "KSYUN_ACCESS_KEY",
64
+ "KSYUN_SECRET_KEY",
65
+ "KSYUN_REGION",
66
+ "AGENTENGINE_REGION",
67
+ "AGENTENGINE_SERVER_URL",
68
+ "AGENTENGINE_STREAM_SERVER_URL",
69
+ "AGENTENGINE_SIGN_SERVICE",
70
+ "KS3_BUCKET",
71
+ "KS3_ACCESS_KEY",
72
+ "KS3_SECRET_KEY",
73
+ )
74
+ _STUDIO_ENV_FILE_KEYS = (*_MODEL_ENV_KEYS, *_CLOUD_CONTROL_ENV_KEYS)
75
+ # 别名归一:两者任一有值时,把另一个也设上,保证下游无论读哪个都命中。
76
+ _MODEL_BASE_URL_ALIASES = ("OPENAI_BASE_URL", "OPENAI_API_BASE")
77
+
78
+
79
+ @click.command(context_settings=dict(help_option_names=["-h", "--help"]))
80
+ @click.argument("workspace", default=".", type=click.Path())
81
+ @click.option("--port", "-p", default=8080, type=click.IntRange(1, 65535))
82
+ @click.option("--no-open", is_flag=True, help="仅打印 URL,不自动打开浏览器")
83
+ @click.option(
84
+ "--env-file",
85
+ type=click.Path(exists=True, dir_okay=False),
86
+ help=(
87
+ "本地模型与云端控制环境文件;只读取允许的 OPENAI/KSYUN/KS3 "
88
+ "字段,且仅保留在 Studio 进程"
89
+ ),
90
+ )
91
+ @click.option(
92
+ "--codex-proxy",
93
+ type=click.Choice(["inherit", "auto", "forced", "direct"]),
94
+ default="inherit",
95
+ show_default=True,
96
+ help="Codex Responses→Chat 代理策略",
97
+ )
98
+ def studio(
99
+ workspace: str,
100
+ port: int,
101
+ no_open: bool,
102
+ env_file: str | None,
103
+ codex_proxy: str,
104
+ ) -> None:
105
+ """启动本地 AgentKit Studio。
106
+
107
+ \b
108
+ WORKSPACE: Agent 工作区目录,目录不存在时自动初始化。
109
+ """
110
+
111
+ root = Path(workspace).expanduser().resolve()
112
+ managed_keys = (*_STUDIO_ENV_FILE_KEYS, "KSADK_CODEX_USE_PROXY")
113
+ previous = {key: os.environ.get(key) for key in managed_keys}
114
+ previously_present = {key for key in managed_keys if key in os.environ}
115
+ try:
116
+ if env_file:
117
+ try:
118
+ values = load_env_file(env_file)
119
+ except ValueError as exc:
120
+ raise click.ClickException(str(exc)) from exc
121
+ loaded_models = 0
122
+ loaded_cloud_control = 0
123
+ for key, value in values.items():
124
+ if key not in _STUDIO_ENV_FILE_KEYS or not value:
125
+ continue
126
+ if key in _MODEL_ENV_KEYS:
127
+ loaded_models += 1
128
+ else:
129
+ loaded_cloud_control += 1
130
+ # An explicit --env-file is the operator's selected cloud
131
+ # identity. Do not silently reuse inherited AK/SK from the
132
+ # shell, which can point Studio at another tenant. Model
133
+ # values keep their historical shell-first precedence.
134
+ if key in _CLOUD_CONTROL_ENV_KEYS or key not in os.environ:
135
+ os.environ[key] = value
136
+ # 别名归一(方案 §2.4 第 5 点):OPENAI_BASE_URL 与 OPENAI_API_BASE 互为别名。
137
+ # 加载后任一有值则把另一个也设上,保证下游无论读哪个都命中;OPENAI_BASE_URL 优先。
138
+ resolved_base_url = os.environ.get("OPENAI_BASE_URL") or os.environ.get(
139
+ "OPENAI_API_BASE"
140
+ )
141
+ if resolved_base_url:
142
+ os.environ["OPENAI_BASE_URL"] = resolved_base_url
143
+ os.environ["OPENAI_API_BASE"] = resolved_base_url
144
+ # base_url 至少算一次,避免显示 0/4 误导。
145
+ loaded_models = max(loaded_models, 2)
146
+ print_kv(
147
+ "模型环境",
148
+ f"已安全加载 {loaded_models}/{len(_MODEL_ENV_KEYS)} 个字段",
149
+ )
150
+ if loaded_cloud_control:
151
+ print_kv(
152
+ "云端控制",
153
+ "已安全加载 "
154
+ f"{loaded_cloud_control}/{len(_CLOUD_CONTROL_ENV_KEYS)} 个字段"
155
+ "(仅本地进程)",
156
+ )
157
+ if codex_proxy == "forced":
158
+ os.environ["KSADK_CODEX_USE_PROXY"] = "1"
159
+ elif codex_proxy == "direct":
160
+ os.environ["KSADK_CODEX_USE_PROXY"] = "0"
161
+ elif codex_proxy == "auto":
162
+ os.environ.pop("KSADK_CODEX_USE_PROXY", None)
163
+ session_token = os.environ.get("KSADK_STUDIO_SESSION_TOKEN") or secrets.token_urlsafe(32)
164
+ csrf_token = secrets.token_urlsafe(24)
165
+ service = StudioService(root)
166
+ app = create_studio_app(
167
+ root,
168
+ service=service,
169
+ session_token=session_token,
170
+ csrf_token=csrf_token,
171
+ security_enabled=os.environ.get("KSADK_STUDIO_NO_SECURITY") != "1",
172
+ )
173
+ base_url = f"http://127.0.0.1:{port}/"
174
+ launch_url = f"{base_url}#session={session_token}"
175
+
176
+ print_title("启动 AgentKit Local Studio")
177
+ print_kv("工作区", str(root))
178
+ print_kv("访问地址", launch_url, value_style="#58a6ff")
179
+ print_success("构建与运行均在本地执行")
180
+ print_info("按 Ctrl+C 停止")
181
+ if not no_open:
182
+ webbrowser.open(launch_url)
183
+ # 业务日志(ksadk.*)走 root handler,同样带 filename:lineno。
184
+ logging.basicConfig(level=logging.INFO, format=_LOG_FORMAT)
185
+ uvicorn.run(
186
+ app,
187
+ host="127.0.0.1",
188
+ port=port,
189
+ log_level="info",
190
+ # Access logging stays enabled through the Studio log config while
191
+ # retaining filename/line-number context for both API and business
192
+ # logs. This preserves master's observability intent and the
193
+ # branch's richer diagnostic format.
194
+ log_config=_STUDIO_LOG_CONFIG,
195
+ )
196
+ finally:
197
+ for key in managed_keys:
198
+ if key in previously_present:
199
+ os.environ[key] = previous[key] or ""
200
+ else:
201
+ os.environ.pop(key, None)
ksadk/cli/cmd_web.py CHANGED
@@ -6,10 +6,12 @@ import webbrowser
6
6
  from pathlib import Path
7
7
 
8
8
  import click
9
+ import uvicorn
9
10
  import yaml
10
11
 
11
12
  from ksadk.cli.error_utils import ensure_json_output_supported, print_exception
12
13
  from ksadk.cli.local_runtime import reexec_with_project_venv_if_needed
14
+ from ksadk.cli.runtime_bootstrap import create_runtime_web_app
13
15
  from ksadk.cli.ui import (
14
16
  print_error,
15
17
  print_info,
@@ -20,7 +22,6 @@ from ksadk.cli.ui import (
20
22
  )
21
23
  from ksadk.configs import setup_environment
22
24
  from ksadk.detection import FrameworkDetector
23
- from ksadk.runners.factory import create_runner
24
25
 
25
26
  _PERSISTENT_STM_FRAMEWORKS = {"adk", "langgraph", "langchain", "deepagents"}
26
27
  _STM_ENV_NAMES = (
@@ -226,9 +227,14 @@ def configure_local_runtime_persistence(
226
227
  @click.command(context_settings=dict(help_option_names=["-h", "--help"]))
227
228
  @click.argument("agent_dir", default=".", type=click.Path(exists=True))
228
229
  @click.option("--port", "-p", default=8080, help="Web UI 端口")
230
+ @click.option(
231
+ "--host",
232
+ default="127.0.0.1",
233
+ help="Web UI 绑定地址(容器部署用 0.0.0.0)",
234
+ )
229
235
  @click.option("--model", help="指定模型名称 (覆盖 .env 配置)")
230
236
  @click.option("--no-open", is_flag=True, help="仅打印 URL,不自动打开浏览器")
231
- def web(agent_dir: str, port: int, model: str, no_open: bool):
237
+ def web(agent_dir: str, port: int, host: str, model: str, no_open: bool):
232
238
  """启动本地统一 Web UI(Invoke UI)
233
239
 
234
240
  \b
@@ -248,6 +254,9 @@ def web(agent_dir: str, port: int, model: str, no_open: bool):
248
254
 
249
255
  agent_path = Path(agent_dir).resolve()
250
256
  command_args = ["web", str(agent_path), "--port", str(port)]
257
+ if host != "127.0.0.1":
258
+ # re-exec 进项目 venv 时透传非默认 host(容器/远端托管场景绑 0.0.0.0)
259
+ command_args.extend(["--host", host])
251
260
  if model:
252
261
  command_args.extend(["--model", model])
253
262
  if no_open:
@@ -340,10 +349,10 @@ def web(agent_dir: str, port: int, model: str, no_open: bool):
340
349
  launch_path = _configure_custom_ui_env(agent_path)
341
350
 
342
351
  try:
343
- print_info("初始化 Runner...")
344
- runner = create_runner(result, str(agent_path))
352
+ print_info("初始化 RuntimeAdapter...")
353
+ runtime_app = create_runtime_web_app(result, agent_path)
345
354
  except Exception as e:
346
- print_exception("Runner 初始化失败", e)
355
+ print_exception("RuntimeAdapter 初始化失败", e)
347
356
  raise SystemExit(1)
348
357
 
349
358
  print_success("启动统一 Web UI")
@@ -356,7 +365,7 @@ def web(agent_dir: str, port: int, model: str, no_open: bool):
356
365
  webbrowser.open(launch_url)
357
366
 
358
367
  try:
359
- runner.run_server(port=port)
368
+ uvicorn.run(runtime_app, host=host, port=port)
360
369
  except KeyboardInterrupt:
361
370
  raise SystemExit(0)
362
371
  except Exception as e:
ksadk/cli/dry_run.py CHANGED
@@ -13,6 +13,7 @@ from click.core import ParameterSource
13
13
  from ksadk.api.client import DryRunExit
14
14
  from ksadk.cli.resource_common import build_dry_run_envelope
15
15
  from ksadk.cli.ui import emit_json, is_json_output
16
+ from ksadk.configs.env_registry import is_sensitive_env_var
16
17
 
17
18
  _T = TypeVar("_T")
18
19
  _DEFAULT_DONE_MSG = "✅ Dry Run Completed: 请求已打印,未执行实际变更。"
@@ -117,7 +118,7 @@ def _mask_if_sensitive(value: Any, *, sensitive: bool) -> Any:
117
118
  def _sanitize_dry_run_value(value: Any, *, parent_key: str | None = None) -> Any:
118
119
  if isinstance(value, dict):
119
120
  env_key = str(value.get("Key") or "")
120
- env_sensitive = bool(value.get("IsSensitive")) or _is_sensitive_key(env_key)
121
+ env_sensitive = bool(value.get("IsSensitive")) or is_sensitive_env_var(env_key)
121
122
  sanitized: dict[str, Any] = {}
122
123
  for key, item in value.items():
123
124
  key_text = str(key)
ksadk/cli/env_options.py CHANGED
@@ -1,6 +1,7 @@
1
1
  from __future__ import annotations
2
2
 
3
3
  import json
4
+ import os
4
5
  import re
5
6
  from pathlib import Path
6
7
 
@@ -62,11 +63,93 @@ def resolve_explicit_env_vars(
62
63
  env_pairs: tuple[str, ...] | list[str] | None,
63
64
  base_dir: Path,
64
65
  ) -> dict[str, str]:
66
+ """Resolve explicit env vars from ``--env-file``/``--env`` (no auto-``./.env``).
67
+
68
+ Used by the generic ``agentengine deploy``/``launch`` which read model
69
+ config from ``agentengine.yaml``, not from ``./.env``. Framework-specific
70
+ deploys (hermes/openclaw) use ``resolve_runtime_env_overrides`` instead,
71
+ which auto-discovers ``./.env`` and returns shell_keys for os.environ merge.
72
+ """
65
73
  env_vars = load_env_file(env_file, base_dir=base_dir)
66
74
  env_vars.update(parse_env_pairs(env_pairs))
67
75
  return env_vars
68
76
 
69
77
 
78
+ def apply_explicit_env_with_shell_priority(
79
+ base_env: dict[str, str],
80
+ cli_env: dict[str, str],
81
+ auto_dotenv: dict[str, str],
82
+ shell_keys: set[str],
83
+ ) -> dict[str, str]:
84
+ """Merge env into base with precedence: cli_env > shell > auto_dotenv.
85
+
86
+ ``shell_keys`` is the snapshot of ``os.environ`` keys captured BEFORE any
87
+ env load. ``cli_env`` (``--env``/``--env-file``) is the highest explicit
88
+ CLI intent and overwrites everything. ``auto_dotenv`` (auto-discovered
89
+ ``./.env``) only fills keys not already set by shell.
90
+ """
91
+ for key, value in auto_dotenv.items():
92
+ if key in shell_keys:
93
+ continue
94
+ base_env.setdefault(key, value)
95
+ for key, value in cli_env.items():
96
+ base_env[key] = value
97
+ return base_env
98
+
99
+
100
+ def inject_env_to_environ(
101
+ cli_env: dict[str, str],
102
+ auto_dotenv: dict[str, str],
103
+ shell_keys: set[str],
104
+ ) -> int:
105
+ """Apply env to ``os.environ`` with precedence: cli_env > shell > auto_dotenv.
106
+
107
+ ``auto_dotenv`` only fills keys absent from shell (shell wins over auto
108
+ ``./.env``). ``cli_env`` overwrites shell (explicit CLI intent wins).
109
+ Returns the number of keys injected from ``auto_dotenv`` (for user-facing
110
+ messages); ``cli_env`` overwrites are not counted.
111
+ """
112
+ loaded = 0
113
+ for key, value in auto_dotenv.items():
114
+ if key in shell_keys:
115
+ continue
116
+ os.environ.setdefault(key, value)
117
+ loaded += 1
118
+ for key, value in cli_env.items():
119
+ os.environ[key] = value
120
+ return loaded
121
+
122
+
123
+ def resolve_runtime_env_overrides(
124
+ *,
125
+ env_file: str | None,
126
+ extra_env: tuple[str, ...] | list[str] | None,
127
+ base_dir: Path,
128
+ ) -> tuple[dict[str, str], dict[str, str], set[str], str | None]:
129
+ """Resolve runtime env overrides with precedence ``--env > --env-file > shell > auto ./.env``.
130
+
131
+ Returns ``(cli_env, auto_dotenv, shell_keys, source)``:
132
+ - ``cli_env``: merged ``--env-file`` + ``--env`` (``--env`` wins); explicit
133
+ CLI intent, overwrites shell at merge time.
134
+ - ``auto_dotenv``: auto-discovered ``./.env`` (only when ``env_file`` is
135
+ None); does NOT overwrite shell.
136
+ - ``shell_keys``: snapshot of ``os.environ`` captured before any load.
137
+ - ``source``: the file path used (for user-facing messages) or ``None``.
138
+ """
139
+ shell_keys = set(os.environ)
140
+ explicit_file_env = load_env_file(env_file, base_dir=base_dir) if env_file else {}
141
+ auto_dotenv: dict[str, str] = {}
142
+ auto_source: str | None = None
143
+ if not env_file:
144
+ auto_path = base_dir / ".env"
145
+ if auto_path.exists():
146
+ auto_dotenv = load_env_file(str(auto_path), base_dir=base_dir)
147
+ auto_source = str(auto_path)
148
+ pair_env = parse_env_pairs(extra_env)
149
+ cli_env = {**explicit_file_env, **pair_env}
150
+ return cli_env, auto_dotenv, shell_keys, env_file or auto_source
151
+
152
+
70
153
  def env_options(func):
71
154
  func = click.option(
72
155
  "--env-file",
@@ -18,7 +18,9 @@ def ensure_global_cli_options(command: click.Command) -> click.Command:
18
18
  """Inject hidden common options into groups/commands that do not declare them locally."""
19
19
  if not _has_long_option(command, "--dry-run"):
20
20
  command.params.insert(0, build_dry_run_click_option(hidden=True, expose_value=False))
21
- if not _has_long_option(command, "--output"):
21
+ if not getattr(command, "disable_global_output_option", False) and not _has_long_option(
22
+ command, "--output"
23
+ ):
22
24
  command.params.insert(0, build_output_click_option(hidden=True, expose_value=False))
23
25
  if not _has_long_option(command, "--no-color"):
24
26
  command.params.insert(0, build_no_color_click_option(hidden=True, expose_value=False))