agentengine-sdk-python 0.7.0__py3-none-any.whl → 0.8.1__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 (450) hide show
  1. {agentengine_sdk_python-0.7.0.dist-info → agentengine_sdk_python-0.8.1.dist-info}/METADATA +52 -20
  2. agentengine_sdk_python-0.8.1.dist-info/RECORD +644 -0
  3. {agentengine_sdk_python-0.7.0.dist-info → agentengine_sdk_python-0.8.1.dist-info}/WHEEL +1 -1
  4. ksadk/a2a/__init__.py +180 -11
  5. ksadk/a2a/bootstrap.py +332 -0
  6. ksadk/a2a/card.py +15 -0
  7. ksadk/a2a/context_store.py +203 -0
  8. ksadk/a2a/control_plane.py +1056 -0
  9. ksadk/a2a/credential.py +99 -0
  10. ksadk/a2a/event_adapter.py +149 -0
  11. ksadk/a2a/executor.py +361 -137
  12. ksadk/a2a/external_transport.py +516 -0
  13. ksadk/a2a/identity.py +304 -0
  14. ksadk/a2a/ids.py +22 -0
  15. ksadk/a2a/langgraph.py +285 -0
  16. ksadk/a2a/resume_store.py +201 -0
  17. ksadk/a2a/routes.py +112 -0
  18. ksadk/a2a/server.py +102 -62
  19. ksadk/a2a/service_env.py +33 -0
  20. ksadk/a2a/space_client.py +1122 -0
  21. ksadk/a2a/task_adapter.py +423 -0
  22. ksadk/a2a/task_event_dispatcher.py +167 -0
  23. ksadk/a2a/task_event_outbox.py +326 -0
  24. ksadk/a2a/task_store.py +206 -0
  25. ksadk/a2a_card.py +101 -0
  26. ksadk/a2ui/__init__.py +27 -0
  27. ksadk/a2ui/core.py +186 -0
  28. ksadk/a2ui/models.py +166 -0
  29. ksadk/a2ui/renderer.py +198 -0
  30. ksadk/agui/__init__.py +9 -0
  31. ksadk/agui/a2ui_projection.py +92 -0
  32. ksadk/agui/agent.py +872 -0
  33. ksadk/agui/config.py +92 -0
  34. ksadk/agui/routes.py +47 -0
  35. ksadk/api/client.py +238 -204
  36. ksadk/api/environment.py +27 -0
  37. ksadk/builders/__init__.py +2 -0
  38. ksadk/builders/base.py +16 -14
  39. ksadk/builders/code_builder.py +375 -270
  40. ksadk/builders/container_builder.py +240 -200
  41. ksadk/builders/framework_requirements.py +31 -12
  42. ksadk/builders/ks3_uploader.py +60 -29
  43. ksadk/builders/managed_runtime_builder.py +173 -0
  44. ksadk/builders/mcp_builder.py +91 -92
  45. ksadk/builders/requirements_utils.py +1 -5
  46. ksadk/cli/__init__.py +97 -171
  47. ksadk/cli/cmd_a2a.py +255 -84
  48. ksadk/cli/cmd_agent.py +19 -5
  49. ksadk/cli/cmd_build.py +158 -29
  50. ksadk/cli/cmd_completion.py +47 -35
  51. ksadk/cli/cmd_config.py +267 -198
  52. ksadk/cli/cmd_create.py +507 -740
  53. ksadk/cli/cmd_dashboard.py +120 -45
  54. ksadk/cli/cmd_deploy.py +135 -59
  55. ksadk/cli/cmd_destroy.py +44 -14
  56. ksadk/cli/cmd_eval.py +386 -0
  57. ksadk/cli/cmd_files.py +63 -24
  58. ksadk/cli/cmd_hermes.py +313 -135
  59. ksadk/cli/cmd_invoke.py +184 -122
  60. ksadk/cli/cmd_launch.py +76 -28
  61. ksadk/cli/cmd_mcp.py +98 -64
  62. ksadk/cli/cmd_model.py +14 -5
  63. ksadk/cli/cmd_openclaw.py +564 -268
  64. ksadk/cli/cmd_replay.py +71 -0
  65. ksadk/cli/cmd_run.py +58 -73
  66. ksadk/cli/cmd_status.py +80 -31
  67. ksadk/cli/cmd_studio.py +110 -0
  68. ksadk/cli/cmd_version.py +20 -13
  69. ksadk/cli/cmd_web.py +95 -18
  70. ksadk/cli/deploy_utils.py +20 -20
  71. ksadk/cli/dry_run.py +7 -4
  72. ksadk/cli/env_options.py +83 -0
  73. ksadk/cli/error_utils.py +37 -12
  74. ksadk/cli/global_options.py +4 -3
  75. ksadk/cli/local_runtime.py +1 -2
  76. ksadk/cli/model_catalog.py +6 -2
  77. ksadk/cli/network_options.py +41 -19
  78. ksadk/cli/resource_common.py +6 -2
  79. ksadk/cli/runtime_bootstrap.py +51 -0
  80. ksadk/cli/storage.py +0 -1
  81. ksadk/cli/ui.py +11 -3
  82. ksadk/cli/workflow_common.py +52 -18
  83. ksadk/codex/__init__.py +12 -0
  84. ksadk/codex/client.py +1042 -0
  85. ksadk/codex/phase.py +143 -0
  86. ksadk/codex/runtime.py +940 -0
  87. ksadk/common/aicp_env.py +0 -1
  88. ksadk/common/auth.py +2 -2
  89. ksadk/common/constants.py +1 -3
  90. ksadk/common/kop_client.py +232 -0
  91. ksadk/common/llm_utils.py +17 -13
  92. ksadk/compat/__init__.py +5 -0
  93. ksadk/compat/adk_compat.py +200 -0
  94. ksadk/compat/copilotkit_a2ui.py +330 -0
  95. ksadk/configs/__init__.py +12 -14
  96. ksadk/configs/env_registry.py +661 -116
  97. ksadk/configs/global_config.py +3 -2
  98. ksadk/configs/settings.py +133 -209
  99. ksadk/conversations/__init__.py +85 -92
  100. ksadk/conversations/attachment_storage.py +16 -11
  101. ksadk/conversations/attachments.py +44 -36
  102. ksadk/conversations/compaction_pipeline.py +12 -12
  103. ksadk/conversations/compaction_prompt.py +9 -5
  104. ksadk/conversations/context.py +221 -6
  105. ksadk/conversations/message_projection.py +438 -51
  106. ksadk/conversations/model_context.py +12 -6
  107. ksadk/conversations/model_options.py +0 -1
  108. ksadk/conversations/normalize.py +20 -16
  109. ksadk/conversations/reasoning_markup.py +1 -1
  110. ksadk/conversations/runtime.py +339 -5255
  111. ksadk/conversations/runtime_compaction.py +333 -0
  112. ksadk/conversations/runtime_constants.py +27 -0
  113. ksadk/conversations/runtime_governance.py +185 -0
  114. ksadk/conversations/runtime_input.py +660 -0
  115. ksadk/conversations/runtime_invocation.py +395 -0
  116. ksadk/conversations/runtime_metadata.py +475 -0
  117. ksadk/conversations/runtime_observability.py +367 -0
  118. ksadk/conversations/runtime_payloads.py +272 -0
  119. ksadk/conversations/runtime_persistence.py +440 -0
  120. ksadk/conversations/runtime_preparation.py +426 -0
  121. ksadk/conversations/runtime_resume.py +836 -0
  122. ksadk/conversations/runtime_stream_events.py +902 -0
  123. ksadk/conversations/runtime_streaming.py +700 -0
  124. ksadk/conversations/semantic_summary.py +17 -5
  125. ksadk/conversations/session_title.py +6 -3
  126. ksadk/deployment/__init__.py +15 -16
  127. ksadk/deployment/agent_access.py +12 -23
  128. ksadk/deployment/base.py +51 -38
  129. ksadk/deployment/managed_runtime.py +33 -0
  130. ksadk/deployment/manager.py +85 -71
  131. ksadk/deployment/providers/serverless.py +379 -210
  132. ksadk/deployment/registry.py +38 -32
  133. ksadk/deployment/state.py +11 -11
  134. ksadk/deployment/ui_config.py +1 -1
  135. ksadk/detection/__init__.py +1 -1
  136. ksadk/detection/detector.py +146 -83
  137. ksadk/detection/mcp_detector.py +9 -6
  138. ksadk/evaluation/__init__.py +84 -0
  139. ksadk/evaluation/a2a_adapter.py +444 -0
  140. ksadk/evaluation/adapters.py +54 -0
  141. ksadk/evaluation/contracts.py +409 -0
  142. ksadk/evaluation/evalset.py +351 -0
  143. ksadk/evaluation/evaluators.py +461 -0
  144. ksadk/evaluation/executor.py +118 -0
  145. ksadk/evaluation/storage.py +68 -0
  146. ksadk/evaluation/target.py +73 -0
  147. ksadk/events/__init__.py +25 -0
  148. ksadk/events/parser.py +191 -0
  149. ksadk/events/replay.py +37 -0
  150. ksadk/events/runtime_event.py +273 -0
  151. ksadk/events/store.py +317 -0
  152. ksadk/harness/__init__.py +35 -0
  153. ksadk/harness/app.py +269 -0
  154. ksadk/harness/config.py +181 -0
  155. ksadk/harness/reasoner.py +105 -0
  156. ksadk/harness/runtime.py +364 -0
  157. ksadk/harness/sandbox.py +141 -0
  158. ksadk/harness/tools.py +222 -0
  159. ksadk/hermes_terminal.py +28 -12
  160. ksadk/identity/resolver.py +15 -9
  161. ksadk/ids.py +32 -0
  162. ksadk/knowledge_base/adk_tool.py +1 -1
  163. ksadk/knowledge_base/client.py +38 -33
  164. ksadk/managed_a2a_card.py +160 -0
  165. ksadk/managed_runtime.py +195 -0
  166. ksadk/markdown.py +5 -2
  167. ksadk/mcp_runtime/__init__.py +9 -6
  168. ksadk/memory/__init__.py +1 -1
  169. ksadk/memory/adk/__init__.py +2 -0
  170. ksadk/memory/adk/backends/base_ltm_backend.py +2 -6
  171. ksadk/memory/adk/backends/http_ltm_backend.py +13 -21
  172. ksadk/memory/adk/backends/inmemory_ltm_backend.py +7 -13
  173. ksadk/memory/adk/backends/sdk_ltm_backend.py +36 -36
  174. ksadk/memory/adk/long_term_memory.py +34 -37
  175. ksadk/memory/adk/resilient_session_service.py +4 -5
  176. ksadk/memory/adk/short_term_memory.py +12 -21
  177. ksadk/memory/adk_tool.py +3 -2
  178. ksadk/memory/backends/base.py +19 -19
  179. ksadk/memory/backends/memory.py +24 -25
  180. ksadk/memory/backends/redis.py +31 -30
  181. ksadk/memory/langchain_tool.py +2 -1
  182. ksadk/memory/manager.py +52 -47
  183. ksadk/memory/service.py +16 -6
  184. ksadk/memory/tool.py +4 -0
  185. ksadk/model_policy.py +15 -7
  186. ksadk/model_proxy/__init__.py +51 -0
  187. ksadk/model_proxy/bootstrap.py +80 -0
  188. ksadk/model_proxy/cache.py +165 -0
  189. ksadk/model_proxy/config.py +66 -0
  190. ksadk/model_proxy/demo_webui.py +115 -0
  191. ksadk/model_proxy/detect.py +145 -0
  192. ksadk/model_proxy/gate.py +68 -0
  193. ksadk/model_proxy/namespace.py +201 -0
  194. ksadk/model_proxy/protocol_proxy.py +22 -0
  195. ksadk/model_proxy/server.py +443 -0
  196. ksadk/model_proxy/transform.py +735 -0
  197. ksadk/openclaw_gateway.py +29 -14
  198. ksadk/runners/adk_runner.py +354 -146
  199. ksadk/runners/base_runner.py +71 -29
  200. ksadk/runners/deepagents_runner.py +0 -1
  201. ksadk/runners/factory.py +18 -5
  202. ksadk/runners/langchain_runner.py +29 -742
  203. ksadk/runners/langgraph_runner.py +417 -97
  204. ksadk/runners/patch_langchain.py +16 -16
  205. ksadk/runners/remote_runner.py +134 -33
  206. ksadk/runners/usage_accumulator.py +1 -0
  207. ksadk/runners/utils/__init__.py +0 -10
  208. ksadk/runners/utils/loader.py +23 -7
  209. ksadk/runtime/__init__.py +67 -0
  210. ksadk/runtime/adapter.py +412 -0
  211. ksadk/runtime/conversation_execution.py +553 -0
  212. ksadk/runtime/executor.py +251 -0
  213. ksadk/runtime/factory.py +156 -0
  214. ksadk/runtime/framework_adapters.py +118 -0
  215. ksadk/runtime/launch.py +48 -0
  216. ksadk/runtime/preprocessing.py +131 -0
  217. ksadk/runtime/runner_adapter.py +1032 -0
  218. ksadk/runtime/runner_loading.py +36 -0
  219. ksadk/runtime_context.py +18 -3
  220. ksadk/runtime_state.py +0 -1
  221. ksadk/sandbox/__init__.py +4 -1
  222. ksadk/sandbox/backends/__init__.py +4 -1
  223. ksadk/sandbox/backends/e2b.py +13 -5
  224. ksadk/sandbox/backends/local_process.py +11 -3
  225. ksadk/sandbox/base.py +10 -15
  226. ksadk/sandbox/factory.py +14 -4
  227. ksadk/sandbox/registry.py +57 -6
  228. ksadk/server/__init__.py +39 -4
  229. ksadk/server/api_models.py +15 -5
  230. ksadk/server/app.py +24 -3928
  231. ksadk/server/composition.py +47 -0
  232. ksadk/server/factory.py +622 -0
  233. ksadk/server/routes/__init__.py +1 -0
  234. ksadk/server/routes/checkpoint_resolution.py +116 -0
  235. ksadk/server/routes/common.py +682 -0
  236. ksadk/server/routes/control.py +331 -0
  237. ksadk/server/routes/dependencies.py +98 -0
  238. ksadk/server/routes/misc.py +425 -0
  239. ksadk/server/routes/models.py +451 -0
  240. ksadk/server/routes/openai_compat.py +229 -0
  241. ksadk/server/routes/projection.py +848 -0
  242. ksadk/server/routes/routers.py +52 -0
  243. ksadk/server/routes/run.py +519 -0
  244. ksadk/server/routes/sessions.py +644 -0
  245. ksadk/server/routes/streaming.py +265 -0
  246. ksadk/server/routes/workspace.py +414 -0
  247. ksadk/server/static/assets/{ArtifactsPanel-D-SSn2ee.js → ArtifactsPanel-CakCqxEN.js} +1 -1
  248. ksadk/server/static/assets/CodeBlock-CynLknyO.js +9 -0
  249. ksadk/server/static/assets/MathMessageMarkdown-3sQdOysS.js +8 -0
  250. ksadk/server/static/assets/MermaidBlock-NERD_ef7.js +303 -0
  251. ksadk/server/static/assets/NativeTerminalPanel-CiHWf82q.js +1 -0
  252. ksadk/server/static/assets/{arc-BA13sHc9.js → arc-DrgjcKhl.js} +1 -1
  253. ksadk/server/static/assets/architecture-7EHR7CIX-CpZLRCcY.js +1 -0
  254. ksadk/server/static/assets/{architectureDiagram-3BPJPVTR-DzJzgVoL.js → architectureDiagram-3BPJPVTR-BXoVRbQ6.js} +1 -1
  255. ksadk/server/static/assets/{blockDiagram-GPEHLZMM-UTdVcZhn.js → blockDiagram-GPEHLZMM-BnaB3Ywv.js} +1 -1
  256. ksadk/server/static/assets/{c4Diagram-AAUBKEIU-Dix0GD4m.js → c4Diagram-AAUBKEIU-Dw4weZcp.js} +1 -1
  257. ksadk/server/static/assets/channel-Dt3rQTFI.js +1 -0
  258. ksadk/server/static/assets/{chunk-2J33WTMH-C2JxuZ42.js → chunk-2J33WTMH-ChjpLK7j.js} +1 -1
  259. ksadk/server/static/assets/{chunk-4BX2VUAB-Be57QPgD.js → chunk-4BX2VUAB-B9drTgOW.js} +1 -1
  260. ksadk/server/static/assets/{chunk-55IACEB6-WjSuy4nv.js → chunk-55IACEB6-CK4ROATy.js} +1 -1
  261. ksadk/server/static/assets/{chunk-727SXJPM-BOovP-b5.js → chunk-727SXJPM-B9KtTTgw.js} +1 -1
  262. ksadk/server/static/assets/{chunk-AQP2D5EJ-DOmZNmWj.js → chunk-AQP2D5EJ-1O1mki3m.js} +1 -1
  263. ksadk/server/static/assets/{chunk-FMBD7UC4-DzwlodkU.js → chunk-FMBD7UC4-B_fH2YuH.js} +1 -1
  264. ksadk/server/static/assets/{chunk-ND2GUHAM-DMqAikEU.js → chunk-ND2GUHAM-D6rFLaVV.js} +1 -1
  265. ksadk/server/static/assets/chunk-QZHKN3VN-iXEZtKQc.js +1 -0
  266. ksadk/server/static/assets/classDiagram-4FO5ZUOK-DIveV17Q.js +1 -0
  267. ksadk/server/static/assets/classDiagram-v2-Q7XG4LA2-DIveV17Q.js +1 -0
  268. ksadk/server/static/assets/{cose-bilkent-S5V4N54A-Zhy2GBnP.js → cose-bilkent-S5V4N54A-ChNs_Mdk.js} +1 -1
  269. ksadk/server/static/assets/{dagre-BM42HDAG-CbKrtIUz.js → dagre-BM42HDAG-D0QXg_MQ.js} +1 -1
  270. ksadk/server/static/assets/{diagram-2AECGRRQ-BRApgQRK.js → diagram-2AECGRRQ-DBDDKwBQ.js} +1 -1
  271. ksadk/server/static/assets/{diagram-5GNKFQAL-D0xbnDiK.js → diagram-5GNKFQAL-BkwDOxmO.js} +1 -1
  272. ksadk/server/static/assets/{diagram-KO2AKTUF-CVugVI9L.js → diagram-KO2AKTUF-Bv8waYvY.js} +1 -1
  273. ksadk/server/static/assets/{diagram-LMA3HP47-DozUGgee.js → diagram-LMA3HP47-e1VECDdu.js} +1 -1
  274. ksadk/server/static/assets/{diagram-OG6HWLK6-ZOYsKlru.js → diagram-OG6HWLK6-Ds9adfRl.js} +1 -1
  275. ksadk/server/static/assets/{dist-DpKtt4Bo.js → dist-4N2NMVYg.js} +1 -1
  276. ksadk/server/static/assets/{dist-CkEKJFtk.js → dist-B-jNR6Vn.js} +1 -1
  277. ksadk/server/static/assets/{dist-D57wnGWd.js → dist-B5J2uhNk.js} +1 -1
  278. ksadk/server/static/assets/{dist-8_SfK1IP.js → dist-B5oS1zcj.js} +1 -1
  279. ksadk/server/static/assets/{dist-DMezvBGJ.js → dist-BB3-OwTQ.js} +1 -1
  280. ksadk/server/static/assets/{dist-2hInLS_J.js → dist-BIlKoW0k.js} +1 -1
  281. ksadk/server/static/assets/{dist-BrCcQ47T.js → dist-BjOdlDjj.js} +1 -1
  282. ksadk/server/static/assets/{dist-BmlMPsCc.js → dist-C1sz5Eo3.js} +1 -1
  283. ksadk/server/static/assets/{dist-B0NP_Z0z.js → dist-CWV4lDr1.js} +1 -1
  284. ksadk/server/static/assets/{dist-D-xOD048.js → dist-CmZHzlwZ.js} +1 -1
  285. ksadk/server/static/assets/{dist-DL_NKc_z.js → dist-D6MpCZtz.js} +1 -1
  286. ksadk/server/static/assets/{dist-DyOkZmze.js → dist-DJN_6Y39.js} +1 -1
  287. ksadk/server/static/assets/{dist-DmFaq_Iy.js → dist-DQU9EWw-.js} +1 -1
  288. ksadk/server/static/assets/{dist-gX6GOLKq.js → dist-DWKByxWV.js} +1 -1
  289. ksadk/server/static/assets/{dist-DyWsb78Q.js → dist-Dli7qW-B.js} +1 -1
  290. ksadk/server/static/assets/{dist-BIJVDMuB.js → dist-DsHPdk3W.js} +1 -1
  291. ksadk/server/static/assets/{dist-Dp0k7bWI.js → dist-X4TnqwOK.js} +1 -1
  292. ksadk/server/static/assets/{dist-8EEyGgDx.js → dist-_pHPTyZ-.js} +1 -1
  293. ksadk/server/static/assets/{dist-CPBtqRTW.js → dist-fhOuWds5.js} +1 -1
  294. ksadk/server/static/assets/{dist-D-JMdWPQ.js → dist-gLnrGsoU.js} +1 -1
  295. ksadk/server/static/assets/{dist-BssVmjIo.js → dist-j6Dxmf_j.js} +1 -1
  296. ksadk/server/static/assets/{dist-C3HIIaN5.js → dist-o2OVmKvt.js} +1 -1
  297. ksadk/server/static/assets/{erDiagram-TEJ5UH35-Bk-9bgE5.js → erDiagram-TEJ5UH35-BPItFKH6.js} +1 -1
  298. ksadk/server/static/assets/eventmodeling-FCH6USID-DYFSxbqr.js +1 -0
  299. ksadk/server/static/assets/{flowDiagram-I6XJVG4X-Dn9kZVuZ.js → flowDiagram-I6XJVG4X-BbYB9w5Y.js} +1 -1
  300. ksadk/server/static/assets/{ganttDiagram-6RSMTGT7-BGxXlJqm.js → ganttDiagram-6RSMTGT7-TQXa0KXv.js} +1 -1
  301. ksadk/server/static/assets/gitGraph-WXDBUCRP-DyNYp6BN.js +1 -0
  302. ksadk/server/static/assets/{gitGraphDiagram-PVQCEYII-C7Q0X-wi.js → gitGraphDiagram-PVQCEYII-bKblCnpa.js} +1 -1
  303. ksadk/server/static/assets/index-R52pJJvg.js +177 -0
  304. ksadk/server/static/assets/index-jJr3_955.css +2 -0
  305. ksadk/server/static/assets/info-J43DQDTF-WUx7qTde.js +1 -0
  306. ksadk/server/static/assets/{infoDiagram-5YYISTIA-BO_CSqq5.js → infoDiagram-5YYISTIA-BGVT7J_i.js} +1 -1
  307. ksadk/server/static/assets/{ishikawaDiagram-YF4QCWOH-eYLPLd46.js → ishikawaDiagram-YF4QCWOH-K0OOfVna.js} +1 -1
  308. ksadk/server/static/assets/{journeyDiagram-JHISSGLW-De9geSb0.js → journeyDiagram-JHISSGLW-8LeOJaZp.js} +1 -1
  309. ksadk/server/static/assets/{kanban-definition-UN3LZRKU-Cs80kQto.js → kanban-definition-UN3LZRKU-C6uCgZrW.js} +1 -1
  310. ksadk/server/static/assets/{katex-DSrCFD8n.js → katex-CYWseY5E.js} +1 -1
  311. ksadk/server/static/assets/{linear-CN9sbKTF.js → linear-hdBcYzM8.js} +1 -1
  312. ksadk/server/static/assets/{mermaid-parser.core-DlgSBU8l.js → mermaid-parser.core-BWrDjSZM.js} +2 -2
  313. ksadk/server/static/assets/{mindmap-definition-RKZ34NQL-9afz7Oug.js → mindmap-definition-RKZ34NQL-Bjy_2v4_.js} +1 -1
  314. ksadk/server/static/assets/packet-YPE3B663-BN13y_xl.js +1 -0
  315. ksadk/server/static/assets/pie-LRSECV5Y-ftSLXhhc.js +1 -0
  316. ksadk/server/static/assets/{pieDiagram-4H26LBE5-DPv_VstN.js → pieDiagram-4H26LBE5-GmmqNiVH.js} +1 -1
  317. ksadk/server/static/assets/{quadrantDiagram-W4KKPZXB-o77wZ1XK.js → quadrantDiagram-W4KKPZXB-BmkRbwCg.js} +1 -1
  318. ksadk/server/static/assets/radar-GUYGQ44K-jaICkIeO.js +1 -0
  319. ksadk/server/static/assets/{requirementDiagram-4Y6WPE33-BYVw81VC.js → requirementDiagram-4Y6WPE33-DSWFqL7c.js} +1 -1
  320. ksadk/server/static/assets/{sankeyDiagram-5OEKKPKP-B7nZFMKT.js → sankeyDiagram-5OEKKPKP-l6iXmU65.js} +1 -1
  321. ksadk/server/static/assets/{sequenceDiagram-3UESZ5HK-BGRRrFw5.js → sequenceDiagram-3UESZ5HK-Cq6UBeQB.js} +1 -1
  322. ksadk/server/static/assets/{stateDiagram-AJRCARHV-BUfHCoPs.js → stateDiagram-AJRCARHV-qzTQpg3Y.js} +1 -1
  323. ksadk/server/static/assets/stateDiagram-v2-BHNVJYJU-BYCoYGAN.js +1 -0
  324. ksadk/server/static/assets/{timeline-definition-PNZ67QCA-FbCTGrf9.js → timeline-definition-PNZ67QCA-DEz24vV0.js} +1 -1
  325. ksadk/server/static/assets/treeView-BLDUP644-Cpib_vlz.js +1 -0
  326. ksadk/server/static/assets/treemap-LRROVOQU-DQxfmVHK.js +1 -0
  327. ksadk/server/static/assets/{vennDiagram-CIIHVFJN-DWgwtPsJ.js → vennDiagram-CIIHVFJN-CMCixki2.js} +1 -1
  328. ksadk/server/static/assets/wardley-L42UT6IY-BQYHnnkU.js +1 -0
  329. ksadk/server/static/assets/{wardleyDiagram-YWT4CUSO-2x8G-tTM.js → wardleyDiagram-YWT4CUSO-CVzB8F9K.js} +1 -1
  330. ksadk/server/static/assets/{xychartDiagram-2RQKCTM6-Drma3AYl.js → xychartDiagram-2RQKCTM6-BFBqBLc1.js} +1 -1
  331. ksadk/server/static/index.html +2 -2
  332. ksadk/server/terminal_sessions.py +111 -58
  333. ksadk/sessions/__init__.py +69 -19
  334. ksadk/sessions/base.py +31 -11
  335. ksadk/sessions/continuity.py +2 -3
  336. ksadk/sessions/in_memory.py +46 -2
  337. ksadk/sessions/local_service.py +148 -17
  338. ksadk/sessions/postgres_service.py +143 -25
  339. ksadk/sessions/resilient.py +36 -8
  340. ksadk/skills/models.py +17 -5
  341. ksadk/skills/package_store.py +5 -2
  342. ksadk/skills/runtime/agent.py +20 -5
  343. ksadk/skills/runtime/artifacts.py +1 -5
  344. ksadk/skills/runtime/backends/e2b.py +10 -4
  345. ksadk/skills/runtime/backends/local.py +15 -3
  346. ksadk/skills/runtime/base.py +1 -2
  347. ksadk/skills/runtime/executor.py +10 -3
  348. ksadk/skills/runtime/factory.py +4 -2
  349. ksadk/skills/runtime/loader.py +1 -2
  350. ksadk/skills/runtime/registry.py +15 -10
  351. ksadk/skills/runtime/request.py +3 -1
  352. ksadk/skills/service_client.py +47 -16
  353. ksadk/skills/tool_defs.py +15 -10
  354. ksadk/studio/__init__.py +5 -0
  355. ksadk/studio/agent_avatar_assets.py +120 -0
  356. ksadk/studio/agent_lifecycle.py +51 -0
  357. ksadk/studio/api.py +1046 -0
  358. ksadk/studio/api_catalog_routes.py +324 -0
  359. ksadk/studio/api_contracts.py +177 -0
  360. ksadk/studio/api_helpers.py +132 -0
  361. ksadk/studio/authoring.py +524 -0
  362. ksadk/studio/authoring_coordinator.py +285 -0
  363. ksadk/studio/builder.py +320 -0
  364. ksadk/studio/capabilities.py +351 -0
  365. ksadk/studio/cloud.py +278 -0
  366. ksadk/studio/codex_agent_service.py +583 -0
  367. ksadk/studio/codex_builder.py +324 -0
  368. ksadk/studio/codex_manifest.py +278 -0
  369. ksadk/studio/codex_run.py +352 -0
  370. ksadk/studio/compiler.py +189 -0
  371. ksadk/studio/contracts.py +644 -0
  372. ksadk/studio/errors.py +47 -0
  373. ksadk/studio/evaluation.py +192 -0
  374. ksadk/studio/event_store.py +284 -0
  375. ksadk/studio/framework_run.py +114 -0
  376. ksadk/studio/identifiers.py +33 -0
  377. ksadk/studio/mcp_runtime.py +229 -0
  378. ksadk/studio/model_client.py +543 -0
  379. ksadk/studio/model_profile_service.py +214 -0
  380. ksadk/studio/operations.py +243 -0
  381. ksadk/studio/otel_trace.py +754 -0
  382. ksadk/studio/pagination.py +182 -0
  383. ksadk/studio/python_tool_inspection.py +183 -0
  384. ksadk/studio/repository.py +306 -0
  385. ksadk/studio/resource_catalog.py +1217 -0
  386. ksadk/studio/run_service.py +707 -0
  387. ksadk/studio/runtime_catalog.py +74 -0
  388. ksadk/studio/runtime_source.py +339 -0
  389. ksadk/studio/service.py +1141 -0
  390. ksadk/studio/shared_web.py +994 -0
  391. ksadk/studio/skill_discovery.py +628 -0
  392. ksadk/studio/static/assets/PrismRenderer-IYN-ffww.js +3 -0
  393. ksadk/studio/static/assets/index-CaEN0eTR.css +1 -0
  394. ksadk/studio/static/assets/index-DI2eY_NH.js +252 -0
  395. ksadk/studio/static/assets/react-vendor-BNmTiJ-I.js +9 -0
  396. ksadk/studio/static/assets/rolldown-runtime-hePW80VL.js +1 -0
  397. ksadk/studio/static/index.html +15 -0
  398. ksadk/studio/templates.py +630 -0
  399. ksadk/studio/validator.py +246 -0
  400. ksadk/studio/workspace.py +137 -0
  401. ksadk/terminal_exec_policy.py +3 -4
  402. ksadk/tools/gateway.py +101 -15
  403. ksadk/tools/result_budget.py +12 -4
  404. ksadk/toolsets/__init__.py +161 -37
  405. ksadk/toolsets/a2a.py +426 -0
  406. ksadk/toolsets/platform.py +21 -5
  407. ksadk/toolsets/sandbox.py +82 -16
  408. ksadk/toolsets/skills.py +200 -39
  409. ksadk/toolsets/web.py +123 -26
  410. ksadk/toolsets/workspace.py +212 -101
  411. ksadk/tracing/__init__.py +19 -21
  412. ksadk/tracing/exporters/inmemory_exporter.py +62 -51
  413. ksadk/tracing/setup.py +135 -506
  414. ksadk/tracing/span_utils.py +0 -41
  415. ksadk/tui/loop.py +78 -30
  416. ksadk/tui/stream_render.py +1 -0
  417. ksadk/ui_config.py +5 -3
  418. ksadk/version.py +1 -1
  419. ksadk_runtime_common/memory_backend/registry.py +56 -56
  420. ksadk_runtime_common/schemas/runtime_event_v1.json +95 -0
  421. ksadk_runtime_common/workspace_files/router.py +8 -2
  422. agentengine_sdk_python-0.7.0.dist-info/RECORD +0 -482
  423. ksadk/a2a/card_builder.py +0 -64
  424. ksadk/a2a/client.py +0 -309
  425. ksadk/runners/utils/langfuse.py +0 -230
  426. ksadk/server/static/assets/CodeBlock-P16VOLYi.js +0 -9
  427. ksadk/server/static/assets/MathMessageMarkdown-CdGiQWHR.js +0 -8
  428. ksadk/server/static/assets/MermaidBlock-IOcal8cm.js +0 -303
  429. ksadk/server/static/assets/NativeTerminalPanel-DGSDWsei.js +0 -1
  430. ksadk/server/static/assets/architecture-7EHR7CIX-BvUlsA6l.js +0 -1
  431. ksadk/server/static/assets/channel-CTuydARX.js +0 -1
  432. ksadk/server/static/assets/chunk-QZHKN3VN-BnCydivS.js +0 -1
  433. ksadk/server/static/assets/classDiagram-4FO5ZUOK-BNHg45Be.js +0 -1
  434. ksadk/server/static/assets/classDiagram-v2-Q7XG4LA2-BNHg45Be.js +0 -1
  435. ksadk/server/static/assets/eventmodeling-FCH6USID-DsAgWnlf.js +0 -1
  436. ksadk/server/static/assets/gitGraph-WXDBUCRP-BIao9Yjg.js +0 -1
  437. ksadk/server/static/assets/index-C00Lwg3L.js +0 -165
  438. ksadk/server/static/assets/index-DAURbCsP.css +0 -1
  439. ksadk/server/static/assets/info-J43DQDTF-CyipqGxU.js +0 -1
  440. ksadk/server/static/assets/packet-YPE3B663-CGkyRxlg.js +0 -1
  441. ksadk/server/static/assets/pie-LRSECV5Y-M0uWAf4n.js +0 -1
  442. ksadk/server/static/assets/radar-GUYGQ44K-Bdbm24-x.js +0 -1
  443. ksadk/server/static/assets/stateDiagram-v2-BHNVJYJU-8xBN_gLM.js +0 -1
  444. ksadk/server/static/assets/treeView-BLDUP644-npMo0ak1.js +0 -1
  445. ksadk/server/static/assets/treemap-LRROVOQU-CHdzrrdo.js +0 -1
  446. ksadk/server/static/assets/wardley-L42UT6IY-BEQz7wyy.js +0 -1
  447. ksadk/tracing/exporters/langfuse_exporter.py +0 -445
  448. {agentengine_sdk_python-0.7.0.dist-info → agentengine_sdk_python-0.8.1.dist-info}/entry_points.txt +0 -0
  449. {agentengine_sdk_python-0.7.0.dist-info → agentengine_sdk_python-0.8.1.dist-info}/licenses/LICENSE +0 -0
  450. {agentengine_sdk_python-0.7.0.dist-info → agentengine_sdk_python-0.8.1.dist-info}/top_level.txt +0 -0
ksadk/cli/cmd_version.py CHANGED
@@ -1,14 +1,15 @@
1
1
  """agentengine version - Agent 版本资源管理。"""
2
2
 
3
3
  import os
4
- import click
4
+ from datetime import datetime, timedelta, timezone
5
5
  from pathlib import Path
6
6
  from typing import Optional
7
- from datetime import datetime, timedelta, timezone
7
+
8
+ import click
8
9
 
9
10
  from ksadk.api.client import DryRunExit
10
11
  from ksadk.cli.agent_ref import merge_agent_inputs, resolve_agent_ref
11
- from ksadk.cli.dry_run import dry_run_option, run_async_with_dry_run, effective_dry_run
12
+ from ksadk.cli.dry_run import dry_run_option, effective_dry_run, run_async_with_dry_run
12
13
  from ksadk.cli.error_utils import abort_with_cli_error, resolution_error
13
14
  from ksadk.cli.resource_common import (
14
15
  CONTEXT_SETTINGS,
@@ -23,7 +24,8 @@ from ksadk.cli.resource_common import (
23
24
  render_descriptor_list,
24
25
  render_descriptor_status,
25
26
  )
26
- from ksadk.cli.ui import get_console, output_option as cli_output_option, status_rich_style
27
+ from ksadk.cli.ui import get_console, status_rich_style
28
+ from ksadk.cli.ui import output_option as cli_output_option
27
29
 
28
30
  console = get_console()
29
31
 
@@ -94,8 +96,9 @@ def _extract_agent_id(agent: dict) -> Optional[str]:
94
96
  if isinstance(basic, dict):
95
97
  agent_id = basic.get("agent_id")
96
98
  if agent_id:
97
- return agent_id
98
- return agent.get("agent_id") or agent.get("id")
99
+ return str(agent_id)
100
+ fallback = agent.get("agent_id") or agent.get("id")
101
+ return str(fallback) if fallback else None
99
102
 
100
103
 
101
104
  async def _resolve_agent_id(agent_ref: str, client) -> Optional[str]:
@@ -147,9 +150,7 @@ async def _resolve_target_agent_id(
147
150
  include_project_config=True,
148
151
  )
149
152
  if not resolved:
150
- raise ValueError(
151
- "请指定 Agent(--agent 或位置参数),或在当前目录提供可解析的本地配置"
152
- )
153
+ raise ValueError("请指定 Agent(--agent 或位置参数),或在当前目录提供可解析的本地配置")
153
154
 
154
155
  if resolved.source != "cli":
155
156
  console.print(
@@ -162,7 +163,9 @@ async def _resolve_target_agent_id(
162
163
  return agent_id
163
164
 
164
165
 
165
- @click.group("version", context_settings=CONTEXT_SETTINGS, help=build_resource_group_help(VERSION_RESOURCE))
166
+ @click.group(
167
+ "version", context_settings=CONTEXT_SETTINGS, help=build_resource_group_help(VERSION_RESOURCE)
168
+ )
166
169
  def version():
167
170
  pass
168
171
 
@@ -345,7 +348,9 @@ def release_version(
345
348
  dry_run = effective_dry_run(dry_run)
346
349
  try:
347
350
  run_async_with_dry_run(
348
- _release_version_async(agent_ref, agent_option, name, region, tag, description, dry_run),
351
+ _release_version_async(
352
+ agent_ref, agent_option, name, region, tag, description, dry_run
353
+ ),
349
354
  dry_run=dry_run,
350
355
  dry_run_resource="version",
351
356
  dry_run_action="release",
@@ -437,7 +442,9 @@ def rollback_version(
437
442
  dry_run = effective_dry_run(dry_run)
438
443
  try:
439
444
  run_async_with_dry_run(
440
- _rollback_version_async(agent_ref, agent_option, name, region, target, assume_yes, dry_run),
445
+ _rollback_version_async(
446
+ agent_ref, agent_option, name, region, target, assume_yes, dry_run
447
+ ),
441
448
  dry_run=dry_run,
442
449
  dry_run_resource="version",
443
450
  dry_run_action="rollback",
@@ -496,7 +503,7 @@ async def _rollback_version_async(
496
503
  ks3_secret_key=secret_key,
497
504
  )
498
505
 
499
- fields = [
506
+ fields: list[tuple[str, str, str | None]] = [
500
507
  ("当前版本", str(result.get("current_tag") or "-"), "#58a6ff"),
501
508
  ]
502
509
  if result.get("message"):
ksadk/cli/cmd_web.py CHANGED
@@ -1,23 +1,27 @@
1
1
  """ksadk web - 启动统一本地 Web UI。"""
2
2
 
3
- import click
3
+ import asyncio
4
+ import os
4
5
  import webbrowser
5
6
  from pathlib import Path
6
- import os
7
+
8
+ import click
9
+ import uvicorn
7
10
  import yaml
11
+
8
12
  from ksadk.cli.error_utils import ensure_json_output_supported, print_exception
9
13
  from ksadk.cli.local_runtime import reexec_with_project_venv_if_needed
14
+ from ksadk.cli.runtime_bootstrap import create_runtime_web_app
10
15
  from ksadk.cli.ui import (
11
16
  print_error,
12
17
  print_info,
13
18
  print_kv,
14
19
  print_success,
15
20
  print_title,
21
+ print_warn,
16
22
  )
17
23
  from ksadk.configs import setup_environment
18
24
  from ksadk.detection import FrameworkDetector
19
- from ksadk.runners.factory import create_runner
20
-
21
25
 
22
26
  _PERSISTENT_STM_FRAMEWORKS = {"adk", "langgraph", "langchain", "deepagents"}
23
27
  _STM_ENV_NAMES = (
@@ -179,6 +183,47 @@ def _default_project_stm_if_unset(
179
183
  )
180
184
 
181
185
 
186
+ def configure_local_runtime_persistence(
187
+ agent_path: Path,
188
+ framework: str,
189
+ *,
190
+ explicit_session_env_names: set[str] | None = None,
191
+ explicit_checkpoint_env_names: set[str] | None = None,
192
+ explicit_local_ui_env_names: set[str] | None = None,
193
+ ) -> None:
194
+ """Bind locally-run agent state to its project unless the shell overrides it."""
195
+
196
+ project_dotenv = _project_dotenv_values(agent_path)
197
+ if explicit_session_env_names is None:
198
+ explicit_session_env_names = _explicit_env_names_excluding_project_dotenv(
199
+ (*_STM_ENV_NAMES, *_SESSION_ENV_NAMES),
200
+ project_dotenv,
201
+ )
202
+ if explicit_checkpoint_env_names is None:
203
+ explicit_checkpoint_env_names = _explicit_env_names_excluding_project_dotenv(
204
+ _CHECKPOINT_ENV_NAMES,
205
+ project_dotenv,
206
+ )
207
+ if explicit_local_ui_env_names is None:
208
+ explicit_local_ui_env_names = _explicit_env_names_excluding_project_dotenv(
209
+ _LOCAL_UI_ENV_NAMES,
210
+ project_dotenv,
211
+ )
212
+
213
+ os.environ["KSADK_PROJECT_DIR"] = str(agent_path)
214
+ local_ui_dir = str(agent_path / ".agentengine" / "ui")
215
+ if "AGENTENGINE_UI_DIR" not in explicit_local_ui_env_names:
216
+ os.environ["AGENTENGINE_UI_DIR"] = local_ui_dir
217
+ else:
218
+ os.environ.setdefault("AGENTENGINE_UI_DIR", local_ui_dir)
219
+ _default_project_stm_if_unset(
220
+ framework,
221
+ agent_path,
222
+ explicit_session_env_names=explicit_session_env_names,
223
+ explicit_checkpoint_env_names=explicit_checkpoint_env_names,
224
+ )
225
+
226
+
182
227
  @click.command(context_settings=dict(help_option_names=["-h", "--help"]))
183
228
  @click.argument("agent_dir", default=".", type=click.Path(exists=True))
184
229
  @click.option("--port", "-p", default=8080, help="Web UI 端口")
@@ -197,13 +242,18 @@ def web(agent_dir: str, port: int, model: str, no_open: bool):
197
242
  """
198
243
  ensure_json_output_supported(
199
244
  "agentengine web",
200
- suggestion="请改用 `agentengine dashboard open` 或 `agentengine agent status --output json`。",
245
+ suggestion=(
246
+ "请改用 `agentengine dashboard open` 或 " "`agentengine agent status --output json`。"
247
+ ),
201
248
  )
202
249
 
203
250
  agent_path = Path(agent_dir).resolve()
204
251
  command_args = ["web", str(agent_path), "--port", str(port)]
205
252
  if model:
206
253
  command_args.extend(["--model", model])
254
+ if no_open:
255
+ # re-exec 进项目 venv 时透传 --no-open,否则子进程仍会打开浏览器
256
+ command_args.append("--no-open")
207
257
  reexec_with_project_venv_if_needed(agent_path, command_args)
208
258
  project_dotenv = _project_dotenv_values(agent_path)
209
259
  explicit_session_env_names = _explicit_env_names_excluding_project_dotenv(
@@ -238,36 +288,63 @@ def web(agent_dir: str, port: int, model: str, no_open: bool):
238
288
  print_error("未检测到支持的框架")
239
289
  raise SystemExit(1)
240
290
 
291
+ if result.type.value == "codex":
292
+ raw_config = getattr(result, "raw_config", None) or {}
293
+ if str(raw_config.get("artifact_type") or "").strip().lower() == "managedruntime":
294
+ from ksadk.managed_runtime import (
295
+ ManagedRuntimeError,
296
+ resolve_local_managed_runtime,
297
+ )
298
+
299
+ try:
300
+ resolved_runtime = asyncio.run(
301
+ resolve_local_managed_runtime(
302
+ raw_config,
303
+ region=os.getenv("KSYUN_REGION", "cn-beijing-6"),
304
+ )
305
+ )
306
+ except ManagedRuntimeError as exc:
307
+ print_error(str(exc))
308
+ raise SystemExit(1) from exc
309
+ runtime_config = raw_config.setdefault("runtime", {})
310
+ if isinstance(runtime_config, dict):
311
+ runtime_config["version"] = resolved_runtime.version
312
+ print_kv(
313
+ "Runtime",
314
+ f"{resolved_runtime.name}@{resolved_runtime.version}",
315
+ value_style="#58a6ff",
316
+ )
317
+ if resolved_runtime.source == "installed-unlocked":
318
+ print_warn(
319
+ "离线使用本机已安装 Runtime;云端构建前请显式锁定版本"
320
+ "或连接 AgentEngine 获取默认版本"
321
+ )
322
+
241
323
  # Map framework types to display names
242
324
  framework_map = {
243
325
  "adk": "ADK",
244
326
  "langchain": "LangChain",
245
327
  "langgraph": "LangGraph",
246
328
  "deepagents": "DeepAgents",
329
+ "codex": "Codex",
247
330
  }
248
331
  display_name = framework_map.get(result.type.value, result.name)
249
332
  print_kv("框架", display_name, value_style="#2da44e")
250
333
 
251
- # 本地 UI 的持久化目录与项目根绑定
252
- os.environ["KSADK_PROJECT_DIR"] = str(agent_path)
253
- local_ui_dir = str(agent_path / ".agentengine" / "ui")
254
- if "AGENTENGINE_UI_DIR" not in explicit_local_ui_env_names:
255
- os.environ["AGENTENGINE_UI_DIR"] = local_ui_dir
256
- else:
257
- os.environ.setdefault("AGENTENGINE_UI_DIR", local_ui_dir)
258
- _default_project_stm_if_unset(
259
- result.type.value,
334
+ configure_local_runtime_persistence(
260
335
  agent_path,
336
+ result.type.value,
261
337
  explicit_session_env_names=explicit_session_env_names,
262
338
  explicit_checkpoint_env_names=explicit_checkpoint_env_names,
339
+ explicit_local_ui_env_names=explicit_local_ui_env_names,
263
340
  )
264
341
  launch_path = _configure_custom_ui_env(agent_path)
265
342
 
266
343
  try:
267
- print_info("初始化 Runner...")
268
- runner = create_runner(result, str(agent_path))
344
+ print_info("初始化 RuntimeAdapter...")
345
+ runtime_app = create_runtime_web_app(result, agent_path)
269
346
  except Exception as e:
270
- print_exception("Runner 初始化失败", e)
347
+ print_exception("RuntimeAdapter 初始化失败", e)
271
348
  raise SystemExit(1)
272
349
 
273
350
  print_success("启动统一 Web UI")
@@ -280,7 +357,7 @@ def web(agent_dir: str, port: int, model: str, no_open: bool):
280
357
  webbrowser.open(launch_url)
281
358
 
282
359
  try:
283
- runner.run_server(port=port)
360
+ uvicorn.run(runtime_app, host="127.0.0.1", port=port)
284
361
  except KeyboardInterrupt:
285
362
  raise SystemExit(0)
286
363
  except Exception as e:
ksadk/cli/deploy_utils.py CHANGED
@@ -1,28 +1,28 @@
1
1
  import os
2
+
2
3
  import click
4
+
3
5
  from ksadk.api import AgentEngineClient
4
6
 
7
+
5
8
  async def auto_release_version(agent_id: str, region: str, deploy_name: str):
6
9
  """部署成功后自动创建版本快照"""
7
- from datetime import datetime
8
-
10
+
9
11
  access_key = os.getenv("KSYUN_ACCESS_KEY") or os.getenv("KS3_ACCESS_KEY")
10
12
  secret_key = os.getenv("KSYUN_SECRET_KEY") or os.getenv("KS3_SECRET_KEY")
11
-
13
+
12
14
  client = AgentEngineClient(
13
15
  access_key=access_key,
14
16
  secret_key=secret_key,
15
17
  region=region,
16
18
  )
17
-
19
+
18
20
  try:
19
21
  description = "部署后自动发布"
20
22
  result = await client.release_version(
21
- agent_id=agent_id,
22
- tag=None, # 自动生成
23
- description=description
23
+ agent_id=agent_id, tag=None, description=description # 自动生成
24
24
  )
25
-
25
+
26
26
  click.echo("")
27
27
  click.secho(f"✓ 版本快照已创建: {result.get('tag')}", fg="green")
28
28
  except Exception as e:
@@ -34,53 +34,53 @@ async def auto_release_version(agent_id: str, region: str, deploy_name: str):
34
34
 
35
35
  async def auto_rollback_to_previous(agent_id: str, region: str):
36
36
  """部署失败时自动回滚到上一版本"""
37
-
37
+
38
38
  access_key = os.getenv("KSYUN_ACCESS_KEY") or os.getenv("KS3_ACCESS_KEY")
39
39
  secret_key = os.getenv("KSYUN_SECRET_KEY") or os.getenv("KS3_SECRET_KEY")
40
-
40
+
41
41
  client = AgentEngineClient(
42
42
  access_key=access_key,
43
43
  secret_key=secret_key,
44
44
  region=region,
45
45
  )
46
-
46
+
47
47
  try:
48
48
  # 获取版本列表,找到最近的历史版本
49
49
  versions_result = await client.list_versions(agent_id, page=1, size=5)
50
50
  versions = versions_result.get("versions", [])
51
-
51
+
52
52
  # 找到需要回滚的目标版本 (统一 snake_case)
53
53
  target_version = None
54
54
  for v in versions:
55
55
  if (v.get("status") or "").lower() == "current":
56
56
  target_version = v
57
57
  break
58
-
58
+
59
59
  # 如果没有 Current,则找最新的 Historical
60
60
  if not target_version:
61
61
  for v in versions:
62
62
  if (v.get("status") or "").lower() == "historical":
63
63
  target_version = v
64
64
  break
65
-
65
+
66
66
  if not target_version:
67
67
  click.secho("⚠ 无可用稳定版本,跳过自动回滚", fg="yellow")
68
68
  return
69
-
69
+
70
70
  target_tag = target_version.get("tag")
71
71
  click.echo("")
72
72
  click.secho(f"⏪ 正在自动回滚到版本: {target_tag}...", fg="yellow")
73
-
73
+
74
74
  # 执行回滚
75
- result = await client.rollback_version(
75
+ await client.rollback_version(
76
76
  agent_id=agent_id,
77
77
  target_tag=target_tag,
78
78
  ks3_access_key=access_key,
79
- ks3_secret_key=secret_key
79
+ ks3_secret_key=secret_key,
80
80
  )
81
-
81
+
82
82
  click.secho(f"✓ 已回滚到版本: {target_tag}", fg="green")
83
-
83
+
84
84
  except Exception as e:
85
85
  click.secho(f"⚠ 自动回滚失败: {e}", fg="red")
86
86
  finally:
ksadk/cli/dry_run.py CHANGED
@@ -5,7 +5,7 @@ from __future__ import annotations
5
5
  import asyncio
6
6
  import json
7
7
  import os
8
- from typing import Any, Awaitable, Callable, Optional, TypeVar
8
+ from typing import Any, Callable, Coroutine, Optional, TypeVar
9
9
 
10
10
  import click
11
11
  from click.core import ParameterSource
@@ -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)
@@ -172,7 +173,7 @@ def sanitize_dry_run_request(payload: dict[str, Any] | None) -> dict[str, Any]:
172
173
 
173
174
 
174
175
  def run_async_with_dry_run(
175
- coro: Awaitable[_T],
176
+ coro: Coroutine[Any, Any, _T],
176
177
  *,
177
178
  dry_run: bool,
178
179
  done_message: str = _DEFAULT_DONE_MSG,
@@ -200,7 +201,9 @@ def run_async_with_dry_run(
200
201
  )
201
202
  elif safe_payload:
202
203
  click.echo("=" * 60)
203
- click.echo(f"Dry Run Mode: {safe_payload.get('method', 'REQUEST')} {safe_payload.get('url', '')}")
204
+ method = safe_payload.get("method", "REQUEST")
205
+ url = safe_payload.get("url", "")
206
+ click.echo(f"Dry Run Mode: {method} {url}")
204
207
  click.echo("=" * 60)
205
208
  click.echo(f"Headers: {safe_payload.get('headers')}")
206
209
  if safe_payload.get("body") is not None:
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",
ksadk/cli/error_utils.py CHANGED
@@ -2,10 +2,10 @@
2
2
 
3
3
  from __future__ import annotations
4
4
 
5
- from dataclasses import dataclass, field
6
5
  import os
7
6
  import re
8
7
  import sys
8
+ from dataclasses import dataclass, field
9
9
  from typing import Any, Optional, Sequence, Tuple
10
10
 
11
11
  import click
@@ -128,9 +128,16 @@ def _looks_like_invalid_cloud_credentials(details: dict[str, Any], msg_lower: st
128
128
  return any(marker in msg_lower for marker in markers)
129
129
 
130
130
 
131
- def _looks_like_runtime_permission_error(details: dict[str, Any], msg_lower: str, code: int | None) -> bool:
131
+ def _looks_like_runtime_permission_error(
132
+ details: dict[str, Any], msg_lower: str, code: int | None
133
+ ) -> bool:
132
134
  remote_code = str(details.get("remote_error_code") or "").strip().lower()
133
- if remote_code in {"accessdenied", "accessdeniedexception", "unauthorized", "unauthorizedoperation"}:
135
+ if remote_code in {
136
+ "accessdenied",
137
+ "accessdeniedexception",
138
+ "unauthorized",
139
+ "unauthorizedoperation",
140
+ }:
134
141
  return True
135
142
  if code in {401, 403} and (
136
143
  ("权限" in msg_lower)
@@ -145,7 +152,8 @@ def _looks_like_runtime_permission_error(details: dict[str, Any], msg_lower: str
145
152
 
146
153
  def _credential_setup_hints() -> list[str]:
147
154
  return [
148
- "请检查当前 shell 或项目 `.env` 中是否设置了 `KSYUN_ACCESS_KEY` / `KSYUN_SECRET_KEY`(兼容 `KS3_ACCESS_KEY` / `KS3_SECRET_KEY`)。",
155
+ "请检查当前 shell 或项目 `.env` 中是否设置了 `KSYUN_ACCESS_KEY` / "
156
+ "`KSYUN_SECRET_KEY`(兼容 `KS3_ACCESS_KEY` / `KS3_SECRET_KEY`)。",
149
157
  "先到 AgentEngine Runtime 控制台确认账号是否具备运行时权限: https://ksp.console.ksyun.com/#/agentEngineRuntime",
150
158
  "如当前子账号没有权限,请到 IAM 授权页授权: https://uc.console.ksyun.com/pro/iam/#/permission/authorize",
151
159
  "如果还没有金山云 AK/SK,请让主账号先到 IAM 控制台创建子账号并生成访问密钥: https://uc.console.ksyun.com/pro/iam/",
@@ -154,7 +162,8 @@ def _credential_setup_hints() -> list[str]:
154
162
 
155
163
  def _invalid_credential_hints() -> list[str]:
156
164
  return [
157
- "请检查当前 shell 或项目 `.env` 中的 `KSYUN_ACCESS_KEY` / `KSYUN_SECRET_KEY` 是否填写正确,且没有多余空格。",
165
+ "请检查当前 shell 或项目 `.env` 中的 `KSYUN_ACCESS_KEY` / "
166
+ "`KSYUN_SECRET_KEY` 是否填写正确,且没有多余空格。",
158
167
  "确认该 AK/SK 未被禁用、删除或重置,并且属于当前要操作的金山云账号。",
159
168
  "如需确认账号是否具备 AgentEngine Runtime 权限,可先查看: https://ksp.console.ksyun.com/#/agentEngineRuntime",
160
169
  "如果凭证属于子账号但仍然被拒绝,请到 IAM 授权页检查授权: https://uc.console.ksyun.com/pro/iam/#/permission/authorize",
@@ -188,7 +197,9 @@ def _matches_resource_not_found(msg_lower: str, args: Sequence[str], *, resource
188
197
  return args[0] == resource
189
198
 
190
199
 
191
- def explain_exception(err: Exception, argv: Optional[Sequence[str]] = None) -> Tuple[str, list[str]]:
200
+ def explain_exception(
201
+ err: Exception, argv: Optional[Sequence[str]] = None
202
+ ) -> Tuple[str, list[str]]:
192
203
  cli_error = cli_error_from_exception(err, argv=argv)
193
204
  return cli_error.message, cli_error.hints
194
205
 
@@ -384,7 +395,9 @@ def cli_error_from_exception(
384
395
 
385
396
  if code == 404 and len(args) >= 2 and args[0] == "dashboard" and args[1] == "share":
386
397
  summary = "未找到 Dashboard 分享链接或目标 Agent。"
387
- hints.append("请先执行 `agentengine dashboard share list --agent <AgentName|AgentId>` 查看分享链接。")
398
+ hints.append(
399
+ "请先执行 `agentengine dashboard share list --agent <AgentName|AgentId>` 查看分享链接。"
400
+ )
388
401
  hints.append("如需先确认 Agent,请执行 `agentengine agent list`。")
389
402
  error_code = "resolution_error"
390
403
  exit_code = EXIT_CODE_RESOLUTION
@@ -396,22 +409,34 @@ def cli_error_from_exception(
396
409
  exit_code = EXIT_CODE_RESOLUTION
397
410
  elif code == 404 and _matches_resource_not_found(msg_lower, args, resource="agent"):
398
411
  summary = "未找到 Agent。"
399
- hints.append("请确认 Agent 名称/ID 是否正确,可先执行 `agentengine agent list` 查看已部署 Agent。")
412
+ hints.append(
413
+ "请确认 Agent 名称/ID 是否正确,可先执行 `agentengine agent list` 查看已部署 Agent。"
414
+ )
400
415
  if len(args) >= 2 and args[0] == "dashboard" and args[1] == "list":
401
416
  hints.append("`agentengine dashboard list` 不是有效命令。")
402
- hints.append("如果要查看分享链接,请使用 `agentengine dashboard share list --agent <AgentName|AgentId>`。")
417
+ hints.append(
418
+ "如果要查看分享链接,请使用 "
419
+ "`agentengine dashboard share list --agent <AgentName|AgentId>`。"
420
+ )
403
421
  elif args and args[0] == "dashboard":
404
- hints.append("可显式指定 Agent:`agentengine dashboard open --agent <AgentName|AgentId>`。")
422
+ hints.append(
423
+ "可显式指定 Agent:`agentengine dashboard open --agent <AgentName|AgentId>`。"
424
+ )
405
425
  error_code = "resolution_error"
406
426
  exit_code = EXIT_CODE_RESOLUTION
407
427
  elif code == 404 and _matches_resource_not_found(msg_lower, args, resource="mcp"):
408
428
  summary = "未找到 MCP。"
409
- hints.append("请确认 MCP 名称/ID 是否正确,可先执行 `agentengine mcp list` 查看已部署 MCP。")
429
+ hints.append(
430
+ "请确认 MCP 名称/ID 是否正确,可先执行 `agentengine mcp list` 查看已部署 MCP。"
431
+ )
410
432
  error_code = "resolution_error"
411
433
  exit_code = EXIT_CODE_RESOLUTION
412
434
  elif code == 404 and _matches_resource_not_found(msg_lower, args, resource="openclaw"):
413
435
  summary = "未找到 OpenClaw。"
414
- hints.append("请确认 OpenClaw 名称/ID 是否正确,可先执行 `agentengine openclaw list` 查看已部署实例。")
436
+ hints.append(
437
+ "请确认 OpenClaw 名称/ID 是否正确,可先执行 "
438
+ "`agentengine openclaw list` 查看已部署实例。"
439
+ )
415
440
  error_code = "resolution_error"
416
441
  exit_code = EXIT_CODE_RESOLUTION
417
442
  elif _looks_like_missing_cloud_credentials(details, msg_lower):
@@ -10,8 +10,7 @@ from ksadk.cli.ui import build_no_color_click_option, build_output_click_option
10
10
 
11
11
  def _has_long_option(command: click.Command, option_name: str) -> bool:
12
12
  return any(
13
- isinstance(param, click.Option) and option_name in param.opts
14
- for param in command.params
13
+ isinstance(param, click.Option) and option_name in param.opts for param in command.params
15
14
  )
16
15
 
17
16
 
@@ -19,7 +18,9 @@ def ensure_global_cli_options(command: click.Command) -> click.Command:
19
18
  """Inject hidden common options into groups/commands that do not declare them locally."""
20
19
  if not _has_long_option(command, "--dry-run"):
21
20
  command.params.insert(0, build_dry_run_click_option(hidden=True, expose_value=False))
22
- 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
+ ):
23
24
  command.params.insert(0, build_output_click_option(hidden=True, expose_value=False))
24
25
  if not _has_long_option(command, "--no-color"):
25
26
  command.params.insert(0, build_no_color_click_option(hidden=True, expose_value=False))
@@ -3,12 +3,11 @@
3
3
  from __future__ import annotations
4
4
 
5
5
  import os
6
- from pathlib import Path
7
6
  import site
8
7
  import sys
8
+ from pathlib import Path
9
9
  from typing import Sequence
10
10
 
11
-
12
11
  LOCAL_RUNTIME_VENV_REEXEC_ENV = "AGENTENGINE_LOCAL_RUNTIME_VENV_REEXEC"
13
12
  LEGACY_WEB_VENV_REEXEC_ENV = "AGENTENGINE_WEB_VENV_REEXEC"
14
13