agentengine-sdk-python 0.7.0__py3-none-any.whl → 0.8.0__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 (371) hide show
  1. {agentengine_sdk_python-0.7.0.dist-info → agentengine_sdk_python-0.8.0.dist-info}/METADATA +36 -20
  2. agentengine_sdk_python-0.8.0.dist-info/RECORD +578 -0
  3. ksadk/a2a/__init__.py +178 -11
  4. ksadk/a2a/bootstrap.py +334 -0
  5. ksadk/a2a/card.py +120 -0
  6. ksadk/a2a/context_store.py +203 -0
  7. ksadk/a2a/control_plane.py +818 -0
  8. ksadk/a2a/credential.py +99 -0
  9. ksadk/a2a/event_adapter.py +149 -0
  10. ksadk/a2a/executor.py +406 -89
  11. ksadk/a2a/external_transport.py +516 -0
  12. ksadk/a2a/identity.py +304 -0
  13. ksadk/a2a/ids.py +22 -0
  14. ksadk/a2a/langgraph.py +285 -0
  15. ksadk/a2a/resume_store.py +201 -0
  16. ksadk/a2a/routes.py +105 -0
  17. ksadk/a2a/server.py +107 -60
  18. ksadk/a2a/space_client.py +1101 -0
  19. ksadk/a2a/task_adapter.py +423 -0
  20. ksadk/a2a/task_event_dispatcher.py +167 -0
  21. ksadk/a2a/task_event_outbox.py +326 -0
  22. ksadk/a2a/task_store.py +206 -0
  23. ksadk/a2ui/__init__.py +27 -0
  24. ksadk/a2ui/core.py +186 -0
  25. ksadk/a2ui/models.py +166 -0
  26. ksadk/a2ui/renderer.py +198 -0
  27. ksadk/agui/__init__.py +9 -0
  28. ksadk/agui/a2ui_projection.py +92 -0
  29. ksadk/agui/agent.py +857 -0
  30. ksadk/agui/config.py +86 -0
  31. ksadk/agui/routes.py +55 -0
  32. ksadk/api/client.py +233 -191
  33. ksadk/builders/__init__.py +2 -0
  34. ksadk/builders/base.py +16 -14
  35. ksadk/builders/code_builder.py +318 -236
  36. ksadk/builders/container_builder.py +187 -167
  37. ksadk/builders/framework_requirements.py +29 -11
  38. ksadk/builders/ks3_uploader.py +58 -27
  39. ksadk/builders/managed_runtime_builder.py +145 -0
  40. ksadk/builders/mcp_builder.py +91 -92
  41. ksadk/builders/requirements_utils.py +1 -5
  42. ksadk/cli/__init__.py +89 -171
  43. ksadk/cli/cmd_a2a.py +254 -70
  44. ksadk/cli/cmd_agent.py +19 -5
  45. ksadk/cli/cmd_build.py +158 -29
  46. ksadk/cli/cmd_completion.py +47 -35
  47. ksadk/cli/cmd_config.py +267 -198
  48. ksadk/cli/cmd_create.py +500 -720
  49. ksadk/cli/cmd_dashboard.py +120 -45
  50. ksadk/cli/cmd_deploy.py +117 -58
  51. ksadk/cli/cmd_destroy.py +44 -14
  52. ksadk/cli/cmd_files.py +63 -24
  53. ksadk/cli/cmd_hermes.py +168 -89
  54. ksadk/cli/cmd_invoke.py +184 -122
  55. ksadk/cli/cmd_launch.py +64 -28
  56. ksadk/cli/cmd_mcp.py +98 -64
  57. ksadk/cli/cmd_model.py +14 -5
  58. ksadk/cli/cmd_openclaw.py +483 -227
  59. ksadk/cli/cmd_replay.py +71 -0
  60. ksadk/cli/cmd_run.py +33 -10
  61. ksadk/cli/cmd_status.py +80 -31
  62. ksadk/cli/cmd_version.py +20 -13
  63. ksadk/cli/cmd_web.py +89 -13
  64. ksadk/cli/deploy_utils.py +20 -20
  65. ksadk/cli/dry_run.py +5 -3
  66. ksadk/cli/error_utils.py +37 -12
  67. ksadk/cli/global_options.py +1 -2
  68. ksadk/cli/local_runtime.py +1 -2
  69. ksadk/cli/model_catalog.py +6 -2
  70. ksadk/cli/network_options.py +34 -14
  71. ksadk/cli/resource_common.py +6 -2
  72. ksadk/cli/storage.py +0 -1
  73. ksadk/cli/ui.py +5 -3
  74. ksadk/cli/workflow_common.py +51 -17
  75. ksadk/codex/__init__.py +12 -0
  76. ksadk/codex/client.py +408 -0
  77. ksadk/codex/phase.py +143 -0
  78. ksadk/codex/runtime.py +449 -0
  79. ksadk/common/aicp_env.py +0 -1
  80. ksadk/common/auth.py +2 -2
  81. ksadk/common/constants.py +1 -3
  82. ksadk/common/llm_utils.py +17 -13
  83. ksadk/compat/__init__.py +5 -0
  84. ksadk/compat/adk_compat.py +200 -0
  85. ksadk/compat/copilotkit_a2ui.py +330 -0
  86. ksadk/configs/__init__.py +12 -12
  87. ksadk/configs/env_registry.py +500 -100
  88. ksadk/configs/global_config.py +2 -1
  89. ksadk/configs/settings.py +151 -124
  90. ksadk/conversations/__init__.py +7 -5
  91. ksadk/conversations/attachment_storage.py +16 -11
  92. ksadk/conversations/attachments.py +44 -36
  93. ksadk/conversations/compaction_pipeline.py +12 -12
  94. ksadk/conversations/compaction_prompt.py +9 -5
  95. ksadk/conversations/context.py +221 -6
  96. ksadk/conversations/message_projection.py +438 -51
  97. ksadk/conversations/model_context.py +12 -6
  98. ksadk/conversations/model_options.py +0 -1
  99. ksadk/conversations/normalize.py +20 -16
  100. ksadk/conversations/reasoning_markup.py +1 -1
  101. ksadk/conversations/runtime.py +339 -5255
  102. ksadk/conversations/runtime_compaction.py +333 -0
  103. ksadk/conversations/runtime_constants.py +27 -0
  104. ksadk/conversations/runtime_governance.py +185 -0
  105. ksadk/conversations/runtime_input.py +652 -0
  106. ksadk/conversations/runtime_invocation.py +395 -0
  107. ksadk/conversations/runtime_metadata.py +475 -0
  108. ksadk/conversations/runtime_observability.py +355 -0
  109. ksadk/conversations/runtime_payloads.py +272 -0
  110. ksadk/conversations/runtime_persistence.py +440 -0
  111. ksadk/conversations/runtime_preparation.py +418 -0
  112. ksadk/conversations/runtime_resume.py +816 -0
  113. ksadk/conversations/runtime_stream_events.py +902 -0
  114. ksadk/conversations/runtime_streaming.py +547 -0
  115. ksadk/conversations/semantic_summary.py +17 -5
  116. ksadk/conversations/session_title.py +6 -3
  117. ksadk/deployment/__init__.py +15 -16
  118. ksadk/deployment/agent_access.py +12 -23
  119. ksadk/deployment/base.py +51 -38
  120. ksadk/deployment/manager.py +63 -65
  121. ksadk/deployment/providers/serverless.py +309 -202
  122. ksadk/deployment/registry.py +38 -32
  123. ksadk/deployment/state.py +11 -11
  124. ksadk/deployment/ui_config.py +1 -1
  125. ksadk/detection/__init__.py +1 -1
  126. ksadk/detection/detector.py +146 -83
  127. ksadk/detection/mcp_detector.py +9 -6
  128. ksadk/events/__init__.py +25 -0
  129. ksadk/events/parser.py +191 -0
  130. ksadk/events/replay.py +37 -0
  131. ksadk/events/runtime_event.py +264 -0
  132. ksadk/events/store.py +317 -0
  133. ksadk/harness/__init__.py +34 -0
  134. ksadk/harness/app.py +278 -0
  135. ksadk/harness/config.py +181 -0
  136. ksadk/harness/reasoner.py +105 -0
  137. ksadk/harness/runner.py +211 -0
  138. ksadk/harness/sandbox.py +141 -0
  139. ksadk/harness/tools.py +222 -0
  140. ksadk/hermes_terminal.py +23 -12
  141. ksadk/identity/resolver.py +15 -9
  142. ksadk/ids.py +32 -0
  143. ksadk/knowledge_base/adk_tool.py +1 -1
  144. ksadk/knowledge_base/client.py +23 -29
  145. ksadk/managed_runtime.py +188 -0
  146. ksadk/markdown.py +5 -2
  147. ksadk/mcp_runtime/__init__.py +9 -6
  148. ksadk/memory/__init__.py +1 -1
  149. ksadk/memory/adk/__init__.py +2 -0
  150. ksadk/memory/adk/backends/base_ltm_backend.py +2 -6
  151. ksadk/memory/adk/backends/http_ltm_backend.py +13 -21
  152. ksadk/memory/adk/backends/inmemory_ltm_backend.py +7 -13
  153. ksadk/memory/adk/backends/sdk_ltm_backend.py +26 -33
  154. ksadk/memory/adk/long_term_memory.py +31 -35
  155. ksadk/memory/adk/resilient_session_service.py +4 -5
  156. ksadk/memory/adk/short_term_memory.py +12 -21
  157. ksadk/memory/adk_tool.py +3 -2
  158. ksadk/memory/backends/base.py +19 -19
  159. ksadk/memory/backends/memory.py +24 -25
  160. ksadk/memory/backends/redis.py +31 -30
  161. ksadk/memory/langchain_tool.py +2 -1
  162. ksadk/memory/manager.py +52 -47
  163. ksadk/memory/service.py +10 -8
  164. ksadk/model_policy.py +15 -7
  165. ksadk/model_proxy/__init__.py +51 -0
  166. ksadk/model_proxy/bootstrap.py +80 -0
  167. ksadk/model_proxy/cache.py +165 -0
  168. ksadk/model_proxy/config.py +45 -0
  169. ksadk/model_proxy/demo_webui.py +115 -0
  170. ksadk/model_proxy/detect.py +145 -0
  171. ksadk/model_proxy/gate.py +68 -0
  172. ksadk/model_proxy/namespace.py +173 -0
  173. ksadk/model_proxy/protocol_proxy.py +22 -0
  174. ksadk/model_proxy/server.py +300 -0
  175. ksadk/model_proxy/transform.py +691 -0
  176. ksadk/openclaw_gateway.py +29 -14
  177. ksadk/runners/adk_runner.py +345 -120
  178. ksadk/runners/base_runner.py +46 -29
  179. ksadk/runners/codex_runner.py +132 -0
  180. ksadk/runners/deepagents_runner.py +0 -1
  181. ksadk/runners/factory.py +17 -5
  182. ksadk/runners/langchain_runner.py +29 -742
  183. ksadk/runners/langgraph_runner.py +352 -90
  184. ksadk/runners/patch_langchain.py +16 -16
  185. ksadk/runners/remote_runner.py +134 -33
  186. ksadk/runners/usage_accumulator.py +1 -0
  187. ksadk/runners/utils/langfuse.py +3 -3
  188. ksadk/runners/utils/loader.py +7 -7
  189. ksadk/runtime/__init__.py +41 -0
  190. ksadk/runtime/adapter.py +345 -0
  191. ksadk/runtime/framework_adapters.py +124 -0
  192. ksadk/runtime/preprocessing.py +118 -0
  193. ksadk/runtime/runner_adapter.py +873 -0
  194. ksadk/runtime_context.py +18 -3
  195. ksadk/runtime_state.py +0 -1
  196. ksadk/sandbox/__init__.py +4 -1
  197. ksadk/sandbox/backends/__init__.py +4 -1
  198. ksadk/sandbox/backends/e2b.py +13 -5
  199. ksadk/sandbox/backends/local_process.py +11 -3
  200. ksadk/sandbox/base.py +10 -15
  201. ksadk/sandbox/factory.py +14 -4
  202. ksadk/sandbox/registry.py +57 -6
  203. ksadk/server/api_models.py +15 -5
  204. ksadk/server/app.py +455 -3885
  205. ksadk/server/composition.py +21 -0
  206. ksadk/server/factory.py +624 -0
  207. ksadk/server/routes/__init__.py +1 -0
  208. ksadk/server/routes/checkpoint_resolution.py +116 -0
  209. ksadk/server/routes/common.py +713 -0
  210. ksadk/server/routes/control.py +327 -0
  211. ksadk/server/routes/dependencies.py +98 -0
  212. ksadk/server/routes/misc.py +448 -0
  213. ksadk/server/routes/models.py +443 -0
  214. ksadk/server/routes/openai_compat.py +207 -0
  215. ksadk/server/routes/projection.py +795 -0
  216. ksadk/server/routes/routers.py +52 -0
  217. ksadk/server/routes/run.py +726 -0
  218. ksadk/server/routes/sessions.py +649 -0
  219. ksadk/server/routes/streaming.py +223 -0
  220. ksadk/server/routes/workspace.py +381 -0
  221. ksadk/server/static/assets/{ArtifactsPanel-D-SSn2ee.js → ArtifactsPanel-Cjnqt-8W.js} +1 -1
  222. ksadk/server/static/assets/CodeBlock-BqyqZfuB.js +9 -0
  223. ksadk/server/static/assets/MathMessageMarkdown-BpH7jiFM.js +8 -0
  224. ksadk/server/static/assets/MermaidBlock-DWuxETaJ.js +303 -0
  225. ksadk/server/static/assets/NativeTerminalPanel-MDTopWMO.js +1 -0
  226. ksadk/server/static/assets/{arc-BA13sHc9.js → arc-CFKwSk_B.js} +1 -1
  227. ksadk/server/static/assets/architecture-7EHR7CIX-CynqOWjZ.js +1 -0
  228. ksadk/server/static/assets/{architectureDiagram-3BPJPVTR-DzJzgVoL.js → architectureDiagram-3BPJPVTR-Dej8jX8c.js} +1 -1
  229. ksadk/server/static/assets/{blockDiagram-GPEHLZMM-UTdVcZhn.js → blockDiagram-GPEHLZMM-1F64jqvy.js} +1 -1
  230. ksadk/server/static/assets/{c4Diagram-AAUBKEIU-Dix0GD4m.js → c4Diagram-AAUBKEIU-9q7AUAKb.js} +1 -1
  231. ksadk/server/static/assets/channel-iUGv2N24.js +1 -0
  232. ksadk/server/static/assets/{chunk-2J33WTMH-C2JxuZ42.js → chunk-2J33WTMH-6qgwJm7Q.js} +1 -1
  233. ksadk/server/static/assets/{chunk-4BX2VUAB-Be57QPgD.js → chunk-4BX2VUAB-CsWIQRhc.js} +1 -1
  234. ksadk/server/static/assets/{chunk-55IACEB6-WjSuy4nv.js → chunk-55IACEB6-BK8paA20.js} +1 -1
  235. ksadk/server/static/assets/{chunk-727SXJPM-BOovP-b5.js → chunk-727SXJPM-B-JEhy7h.js} +1 -1
  236. ksadk/server/static/assets/{chunk-AQP2D5EJ-DOmZNmWj.js → chunk-AQP2D5EJ-DYBvMHAa.js} +1 -1
  237. ksadk/server/static/assets/{chunk-FMBD7UC4-DzwlodkU.js → chunk-FMBD7UC4-BGhvzDYt.js} +1 -1
  238. ksadk/server/static/assets/{chunk-ND2GUHAM-DMqAikEU.js → chunk-ND2GUHAM-D98vPd-E.js} +1 -1
  239. ksadk/server/static/assets/chunk-QZHKN3VN-YQIEXeF6.js +1 -0
  240. ksadk/server/static/assets/classDiagram-4FO5ZUOK-CDAUuoXK.js +1 -0
  241. ksadk/server/static/assets/classDiagram-v2-Q7XG4LA2-CDAUuoXK.js +1 -0
  242. ksadk/server/static/assets/{cose-bilkent-S5V4N54A-Zhy2GBnP.js → cose-bilkent-S5V4N54A-CX3yotHq.js} +1 -1
  243. ksadk/server/static/assets/{dagre-BM42HDAG-CbKrtIUz.js → dagre-BM42HDAG-C7TguAWo.js} +1 -1
  244. ksadk/server/static/assets/{diagram-2AECGRRQ-BRApgQRK.js → diagram-2AECGRRQ-Dd17_kws.js} +1 -1
  245. ksadk/server/static/assets/{diagram-5GNKFQAL-D0xbnDiK.js → diagram-5GNKFQAL-DVIClIil.js} +1 -1
  246. ksadk/server/static/assets/{diagram-KO2AKTUF-CVugVI9L.js → diagram-KO2AKTUF-Df_3gYQa.js} +1 -1
  247. ksadk/server/static/assets/{diagram-LMA3HP47-DozUGgee.js → diagram-LMA3HP47-BhLk6ZtA.js} +1 -1
  248. ksadk/server/static/assets/{diagram-OG6HWLK6-ZOYsKlru.js → diagram-OG6HWLK6-D4GNGvuu.js} +1 -1
  249. ksadk/server/static/assets/{dist-DmFaq_Iy.js → dist-6CVKuTAe.js} +1 -1
  250. ksadk/server/static/assets/{dist-8EEyGgDx.js → dist-BUHRxvDG.js} +1 -1
  251. ksadk/server/static/assets/{dist-B0NP_Z0z.js → dist-BZ9n9AjO.js} +1 -1
  252. ksadk/server/static/assets/{dist-DMezvBGJ.js → dist-BibcG1V9.js} +1 -1
  253. ksadk/server/static/assets/{dist-C3HIIaN5.js → dist-Bs-jQcRX.js} +1 -1
  254. ksadk/server/static/assets/{dist-BrCcQ47T.js → dist-C2xjE7cO.js} +1 -1
  255. ksadk/server/static/assets/{dist-Dp0k7bWI.js → dist-C7-3jInC.js} +1 -1
  256. ksadk/server/static/assets/{dist-D-xOD048.js → dist-C99THtIA.js} +1 -1
  257. ksadk/server/static/assets/{dist-CkEKJFtk.js → dist-CGcp2ex8.js} +1 -1
  258. ksadk/server/static/assets/{dist-DyOkZmze.js → dist-CVQRZjPu.js} +1 -1
  259. ksadk/server/static/assets/{dist-BssVmjIo.js → dist-Cf23NY4L.js} +1 -1
  260. ksadk/server/static/assets/{dist-BIJVDMuB.js → dist-CgF3fj15.js} +1 -1
  261. ksadk/server/static/assets/{dist-2hInLS_J.js → dist-Cwt7koer.js} +1 -1
  262. ksadk/server/static/assets/{dist-DyWsb78Q.js → dist-D82mtD2s.js} +1 -1
  263. ksadk/server/static/assets/{dist-D-JMdWPQ.js → dist-DF06ORQo.js} +1 -1
  264. ksadk/server/static/assets/{dist-BmlMPsCc.js → dist-DHn6nBzr.js} +1 -1
  265. ksadk/server/static/assets/{dist-gX6GOLKq.js → dist-Djgl2wVZ.js} +1 -1
  266. ksadk/server/static/assets/{dist-DpKtt4Bo.js → dist-DlzCRy0S.js} +1 -1
  267. ksadk/server/static/assets/{dist-8_SfK1IP.js → dist-DqNnNFrw.js} +1 -1
  268. ksadk/server/static/assets/{dist-D57wnGWd.js → dist-DyvYLMW9.js} +1 -1
  269. ksadk/server/static/assets/{dist-CPBtqRTW.js → dist-eoW6tZXA.js} +1 -1
  270. ksadk/server/static/assets/{dist-DL_NKc_z.js → dist-ivOya1LD.js} +1 -1
  271. ksadk/server/static/assets/{erDiagram-TEJ5UH35-Bk-9bgE5.js → erDiagram-TEJ5UH35-CnfRcY2M.js} +1 -1
  272. ksadk/server/static/assets/eventmodeling-FCH6USID-ChYO-ijM.js +1 -0
  273. ksadk/server/static/assets/{flowDiagram-I6XJVG4X-Dn9kZVuZ.js → flowDiagram-I6XJVG4X-DGaJjGNJ.js} +1 -1
  274. ksadk/server/static/assets/{ganttDiagram-6RSMTGT7-BGxXlJqm.js → ganttDiagram-6RSMTGT7-DpCoB2g9.js} +1 -1
  275. ksadk/server/static/assets/gitGraph-WXDBUCRP-BN_0Fk-j.js +1 -0
  276. ksadk/server/static/assets/{gitGraphDiagram-PVQCEYII-C7Q0X-wi.js → gitGraphDiagram-PVQCEYII-9IKVFBVT.js} +1 -1
  277. ksadk/server/static/assets/index-QSwCHuB8.js +177 -0
  278. ksadk/server/static/assets/index-jOPmTOZH.css +2 -0
  279. ksadk/server/static/assets/info-J43DQDTF-Cp6o3vId.js +1 -0
  280. ksadk/server/static/assets/{infoDiagram-5YYISTIA-BO_CSqq5.js → infoDiagram-5YYISTIA-CYIIsb8y.js} +1 -1
  281. ksadk/server/static/assets/{ishikawaDiagram-YF4QCWOH-eYLPLd46.js → ishikawaDiagram-YF4QCWOH-DLOHGvWw.js} +1 -1
  282. ksadk/server/static/assets/{journeyDiagram-JHISSGLW-De9geSb0.js → journeyDiagram-JHISSGLW-BIzKeejT.js} +1 -1
  283. ksadk/server/static/assets/{kanban-definition-UN3LZRKU-Cs80kQto.js → kanban-definition-UN3LZRKU-BWHoFSw2.js} +1 -1
  284. ksadk/server/static/assets/{katex-DSrCFD8n.js → katex-DATssjp1.js} +1 -1
  285. ksadk/server/static/assets/{linear-CN9sbKTF.js → linear-CvMBw9cA.js} +1 -1
  286. ksadk/server/static/assets/{mermaid-parser.core-DlgSBU8l.js → mermaid-parser.core-mGAcEwcq.js} +2 -2
  287. ksadk/server/static/assets/{mindmap-definition-RKZ34NQL-9afz7Oug.js → mindmap-definition-RKZ34NQL-CSAQxEAe.js} +1 -1
  288. ksadk/server/static/assets/packet-YPE3B663-wQzct3cT.js +1 -0
  289. ksadk/server/static/assets/pie-LRSECV5Y-BgTQiv-9.js +1 -0
  290. ksadk/server/static/assets/{pieDiagram-4H26LBE5-DPv_VstN.js → pieDiagram-4H26LBE5-By-ra07M.js} +1 -1
  291. ksadk/server/static/assets/{quadrantDiagram-W4KKPZXB-o77wZ1XK.js → quadrantDiagram-W4KKPZXB-CxIR4JXI.js} +1 -1
  292. ksadk/server/static/assets/radar-GUYGQ44K-BIq5fXsn.js +1 -0
  293. ksadk/server/static/assets/{requirementDiagram-4Y6WPE33-BYVw81VC.js → requirementDiagram-4Y6WPE33-DpW90iu3.js} +1 -1
  294. ksadk/server/static/assets/{sankeyDiagram-5OEKKPKP-B7nZFMKT.js → sankeyDiagram-5OEKKPKP-DpGa6EAV.js} +1 -1
  295. ksadk/server/static/assets/{sequenceDiagram-3UESZ5HK-BGRRrFw5.js → sequenceDiagram-3UESZ5HK-NTKNGGe5.js} +1 -1
  296. ksadk/server/static/assets/{stateDiagram-AJRCARHV-BUfHCoPs.js → stateDiagram-AJRCARHV-DGpd9yFG.js} +1 -1
  297. ksadk/server/static/assets/stateDiagram-v2-BHNVJYJU-B3o579IQ.js +1 -0
  298. ksadk/server/static/assets/{timeline-definition-PNZ67QCA-FbCTGrf9.js → timeline-definition-PNZ67QCA-jqoYs3jQ.js} +1 -1
  299. ksadk/server/static/assets/treeView-BLDUP644-Dqi-E0EM.js +1 -0
  300. ksadk/server/static/assets/treemap-LRROVOQU-ClQP9CJ9.js +1 -0
  301. ksadk/server/static/assets/{vennDiagram-CIIHVFJN-DWgwtPsJ.js → vennDiagram-CIIHVFJN-l3Z7-wbP.js} +1 -1
  302. ksadk/server/static/assets/wardley-L42UT6IY-8XLvnNIs.js +1 -0
  303. ksadk/server/static/assets/{wardleyDiagram-YWT4CUSO-2x8G-tTM.js → wardleyDiagram-YWT4CUSO-BR54GPmr.js} +1 -1
  304. ksadk/server/static/assets/{xychartDiagram-2RQKCTM6-Drma3AYl.js → xychartDiagram-2RQKCTM6-SkiH8GsK.js} +1 -1
  305. ksadk/server/static/index.html +2 -2
  306. ksadk/server/terminal_sessions.py +111 -58
  307. ksadk/sessions/__init__.py +69 -19
  308. ksadk/sessions/base.py +31 -11
  309. ksadk/sessions/continuity.py +2 -3
  310. ksadk/sessions/in_memory.py +46 -2
  311. ksadk/sessions/local_service.py +148 -17
  312. ksadk/sessions/postgres_service.py +143 -25
  313. ksadk/sessions/resilient.py +36 -8
  314. ksadk/skills/models.py +17 -5
  315. ksadk/skills/package_store.py +5 -2
  316. ksadk/skills/runtime/agent.py +20 -5
  317. ksadk/skills/runtime/artifacts.py +1 -5
  318. ksadk/skills/runtime/backends/e2b.py +10 -4
  319. ksadk/skills/runtime/backends/local.py +15 -3
  320. ksadk/skills/runtime/base.py +1 -2
  321. ksadk/skills/runtime/executor.py +10 -3
  322. ksadk/skills/runtime/factory.py +4 -2
  323. ksadk/skills/runtime/loader.py +1 -2
  324. ksadk/skills/runtime/registry.py +15 -10
  325. ksadk/skills/runtime/request.py +3 -1
  326. ksadk/skills/service_client.py +38 -17
  327. ksadk/skills/tool_defs.py +15 -10
  328. ksadk/terminal_exec_policy.py +3 -4
  329. ksadk/tools/gateway.py +92 -15
  330. ksadk/tools/result_budget.py +12 -4
  331. ksadk/toolsets/__init__.py +134 -36
  332. ksadk/toolsets/platform.py +21 -5
  333. ksadk/toolsets/sandbox.py +82 -16
  334. ksadk/toolsets/skills.py +200 -39
  335. ksadk/toolsets/web.py +123 -26
  336. ksadk/toolsets/workspace.py +212 -101
  337. ksadk/tracing/exporters/inmemory_exporter.py +62 -51
  338. ksadk/tracing/exporters/langfuse_exporter.py +91 -76
  339. ksadk/tracing/setup.py +69 -53
  340. ksadk/tracing/span_utils.py +5 -2
  341. ksadk/tui/loop.py +78 -30
  342. ksadk/tui/stream_render.py +1 -0
  343. ksadk/ui_config.py +5 -3
  344. ksadk/version.py +1 -1
  345. ksadk_runtime_common/schemas/runtime_event_v1.json +95 -0
  346. agentengine_sdk_python-0.7.0.dist-info/RECORD +0 -482
  347. ksadk/server/static/assets/CodeBlock-P16VOLYi.js +0 -9
  348. ksadk/server/static/assets/MathMessageMarkdown-CdGiQWHR.js +0 -8
  349. ksadk/server/static/assets/MermaidBlock-IOcal8cm.js +0 -303
  350. ksadk/server/static/assets/NativeTerminalPanel-DGSDWsei.js +0 -1
  351. ksadk/server/static/assets/architecture-7EHR7CIX-BvUlsA6l.js +0 -1
  352. ksadk/server/static/assets/channel-CTuydARX.js +0 -1
  353. ksadk/server/static/assets/chunk-QZHKN3VN-BnCydivS.js +0 -1
  354. ksadk/server/static/assets/classDiagram-4FO5ZUOK-BNHg45Be.js +0 -1
  355. ksadk/server/static/assets/classDiagram-v2-Q7XG4LA2-BNHg45Be.js +0 -1
  356. ksadk/server/static/assets/eventmodeling-FCH6USID-DsAgWnlf.js +0 -1
  357. ksadk/server/static/assets/gitGraph-WXDBUCRP-BIao9Yjg.js +0 -1
  358. ksadk/server/static/assets/index-C00Lwg3L.js +0 -165
  359. ksadk/server/static/assets/index-DAURbCsP.css +0 -1
  360. ksadk/server/static/assets/info-J43DQDTF-CyipqGxU.js +0 -1
  361. ksadk/server/static/assets/packet-YPE3B663-CGkyRxlg.js +0 -1
  362. ksadk/server/static/assets/pie-LRSECV5Y-M0uWAf4n.js +0 -1
  363. ksadk/server/static/assets/radar-GUYGQ44K-Bdbm24-x.js +0 -1
  364. ksadk/server/static/assets/stateDiagram-v2-BHNVJYJU-8xBN_gLM.js +0 -1
  365. ksadk/server/static/assets/treeView-BLDUP644-npMo0ak1.js +0 -1
  366. ksadk/server/static/assets/treemap-LRROVOQU-CHdzrrdo.js +0 -1
  367. ksadk/server/static/assets/wardley-L42UT6IY-BEQz7wyy.js +0 -1
  368. {agentengine_sdk_python-0.7.0.dist-info → agentengine_sdk_python-0.8.0.dist-info}/WHEEL +0 -0
  369. {agentengine_sdk_python-0.7.0.dist-info → agentengine_sdk_python-0.8.0.dist-info}/entry_points.txt +0 -0
  370. {agentengine_sdk_python-0.7.0.dist-info → agentengine_sdk_python-0.8.0.dist-info}/licenses/LICENSE +0 -0
  371. {agentengine_sdk_python-0.7.0.dist-info → agentengine_sdk_python-0.8.0.dist-info}/top_level.txt +0 -0
ksadk/cli/cmd_launch.py CHANGED
@@ -2,14 +2,26 @@
2
2
  agentengine launch - 一键完成构建和部署
3
3
  """
4
4
 
5
- import click
6
- import asyncio
7
5
  from pathlib import Path
6
+ from typing import Any
7
+
8
+ import click
9
+
8
10
  from ksadk.api.client import DryRunExit
9
- from ksadk.cli.cmd_deploy import _apply_network_config, _resolve_artifact_type_input, _resolve_ui_config_inputs
11
+ from ksadk.cli.cmd_deploy import (
12
+ _apply_network_config,
13
+ _resolve_artifact_type_input,
14
+ _resolve_ui_config_inputs,
15
+ )
10
16
  from ksadk.cli.dry_run import effective_dry_run, run_async_with_dry_run
11
17
  from ksadk.cli.env_options import env_options, resolve_explicit_env_vars
12
- from ksadk.cli.error_utils import cli_error_from_exception, is_debug_mode_enabled, remote_error, usage_error, validation_error
18
+ from ksadk.cli.error_utils import (
19
+ cli_error_from_exception,
20
+ is_debug_mode_enabled,
21
+ remote_error,
22
+ usage_error,
23
+ validation_error,
24
+ )
13
25
  from ksadk.cli.network_options import (
14
26
  apply_network_cli_overrides,
15
27
  network_cli_kwargs,
@@ -18,6 +30,18 @@ from ksadk.cli.network_options import (
18
30
  validate_deploy_target_network,
19
31
  )
20
32
  from ksadk.cli.storage import build_storage_config
33
+ from ksadk.cli.ui import (
34
+ capture_standard_output,
35
+ is_json_output,
36
+ print_info,
37
+ print_kv,
38
+ print_rule,
39
+ print_success,
40
+ print_warn,
41
+ )
42
+ from ksadk.cli.ui import (
43
+ output_option as cli_output_option,
44
+ )
21
45
  from ksadk.cli.workflow_common import (
22
46
  build_workflow_local_plan,
23
47
  clear_build_metadata,
@@ -31,17 +55,10 @@ from ksadk.cli.workflow_common import (
31
55
  resolve_artifact_build_plan,
32
56
  )
33
57
  from ksadk.deployment.ui_config import SUPPORTED_UI_PROFILES
34
- from ksadk.cli.ui import (
35
- capture_standard_output,
36
- is_json_output,
37
- output_option as cli_output_option,
38
- print_error,
39
- print_info,
40
- print_kv,
41
- print_rule,
42
- print_success,
43
- print_warn,
44
- )
58
+
59
+
60
+ def _dict_or_none(value: object) -> dict[str, Any] | None:
61
+ return dict(value) if isinstance(value, dict) and value else None
45
62
 
46
63
 
47
64
  @click.command(context_settings=dict(help_option_names=["-h", "--help"]))
@@ -54,8 +71,12 @@ from ksadk.cli.ui import (
54
71
  help="部署目标 (default: serverless)",
55
72
  )
56
73
  @click.option("--name", "-n", help="部署名称")
57
- @click.option("--region", "-r", default="cn-beijing-6", envvar="KSYUN_REGION", help="区域 (serverless)")
58
- @click.option("--account-id", envvar="KSYUN_ACCOUNT_ID", help="金山云账号 ID(可选;未设置时从 AK/SK 反查)")
74
+ @click.option(
75
+ "--region", "-r", default="cn-beijing-6", envvar="KSYUN_REGION", help="区域 (serverless)"
76
+ )
77
+ @click.option(
78
+ "--account-id", envvar="KSYUN_ACCOUNT_ID", help="金山云账号 ID(可选;未设置时从 AK/SK 反查)"
79
+ )
59
80
  @click.option("--observability/--no-observability", default=True, help="是否启用可观测性")
60
81
  @click.option("--no-cache", is_flag=True, help="强制重新构建,不使用缓存")
61
82
  @click.option("--port", "-p", default=8000, help="服务端口 (default: 8000)")
@@ -71,7 +92,10 @@ from ksadk.cli.ui import (
71
92
  @click.option(
72
93
  "--storage-mount-path",
73
94
  default=None,
74
- help="PVC 挂载目录(hermes/openclaw 默认按框架推导;adk/langgraph 等其他框架默认不挂盘,需显式指定)",
95
+ help=(
96
+ "PVC 挂载目录(hermes/openclaw 默认按框架推导;"
97
+ "adk/langgraph 等其他框架默认不挂盘,需显式指定)"
98
+ ),
75
99
  )
76
100
  @click.option("--no-storage", is_flag=True, help="禁用默认 PVC 挂载")
77
101
  @network_options
@@ -181,7 +205,7 @@ def launch(
181
205
  lambda exc: render_workflow_dry_run(
182
206
  action="launch",
183
207
  request=dict(exc.payload or {}),
184
- plan=dict(dry_run_context.get("plan") or {}) or None,
208
+ plan=_dict_or_none(dry_run_context.get("plan")),
185
209
  )
186
210
  ),
187
211
  )
@@ -223,8 +247,8 @@ async def _launch_async(
223
247
  env_file: str | None = None,
224
248
  dry_run_context: dict[str, object] | None = None,
225
249
  ):
226
- from ksadk.detection import FrameworkDetector
227
250
  from ksadk.deployment import DeploymentManager, DeployTarget
251
+ from ksadk.detection import FrameworkDetector
228
252
 
229
253
  agent_path = Path(agent_dir).resolve()
230
254
  config = _load_config(agent_path)
@@ -236,7 +260,11 @@ async def _launch_async(
236
260
  )
237
261
  except ValueError as e:
238
262
  raise validation_error(str(e))
239
- effective_artifact_type = _resolve_artifact_type_input(config, artifact_type) if target == "serverless" else artifact_type
263
+ effective_artifact_type = (
264
+ _resolve_artifact_type_input(config, artifact_type)
265
+ if target == "serverless"
266
+ else artifact_type
267
+ )
240
268
  print_workflow_header(
241
269
  title="Agent Launch",
242
270
  subtitle=f"target: {target}",
@@ -337,7 +365,9 @@ async def _launch_async(
337
365
  explicit_artifact_reference = ks3_path if normalized_artifact_type == "code" else image
338
366
  cached_artifact_reference = None
339
367
  if not artifact_plan.should_clear_metadata:
340
- cached_artifact_reference = load_cached_artifact_reference(agent_path, effective_artifact_type)
368
+ cached_artifact_reference = load_cached_artifact_reference(
369
+ agent_path, effective_artifact_type
370
+ )
341
371
  resolved_artifact_plan = resolve_artifact_build_plan(
342
372
  plan=artifact_plan,
343
373
  target=target,
@@ -381,7 +411,7 @@ async def _launch_async(
381
411
  package_info.metadata["image"] = resolved_artifact_plan.reference
382
412
  else:
383
413
  package_info.metadata["ks3_path"] = resolved_artifact_plan.reference
384
-
414
+
385
415
  print_kv("构建目录", str(package_info.build_dir))
386
416
  except Exception as e:
387
417
  raise cli_error_from_exception(e, context="打包失败")
@@ -412,7 +442,7 @@ async def _launch_async(
412
442
  if ks3:
413
443
  print_kv("KS3 路径", ks3)
414
444
  else:
415
- print_kv("镜像", package_info.image)
445
+ print_kv("镜像", package_info.image or "-")
416
446
 
417
447
  except Exception as e:
418
448
  raise cli_error_from_exception(e, context="构建失败")
@@ -458,10 +488,11 @@ async def _launch_async(
458
488
  print_warn("请妥善保存此 API Key,它仅在首次部署时显示")
459
489
  if result.message:
460
490
  print_kv("信息", result.message)
461
-
491
+
462
492
  # 9. 自动创建版本快照 (除非指定 --no-version)
463
493
  if result.agent_id and not no_version and not dry_run:
464
494
  from ksadk.cli.deploy_utils import auto_release_version
495
+
465
496
  with capture_standard_output():
466
497
  await auto_release_version(result.agent_id, region, deploy_name)
467
498
 
@@ -494,7 +525,11 @@ async def _launch_async(
494
525
  }
495
526
  else:
496
527
  if result.status.name == "SKIPPED":
497
- dry_run_request = result.metadata.get("dry_run_request") if isinstance(result.metadata, dict) else None
528
+ dry_run_request = (
529
+ result.metadata.get("dry_run_request")
530
+ if isinstance(result.metadata, dict)
531
+ else None
532
+ )
498
533
  if dry_run and dry_run_request:
499
534
  raise DryRunExit(result.message or "Dry Run finished.", payload=dry_run_request)
500
535
  print_warn(f"部署状态: {result.status.value}")
@@ -531,10 +566,11 @@ async def _launch_async(
531
566
  )
532
567
  if result.message:
533
568
  print_info(result.message)
534
-
569
+
535
570
  # 10. 自动回滚
536
571
  if auto_rollback and result.agent_id and result.status.name not in ["SKIPPED"]:
537
572
  from ksadk.cli.deploy_utils import auto_rollback_to_previous
573
+
538
574
  with capture_standard_output():
539
575
  await auto_rollback_to_previous(result.agent_id, region)
540
576
 
@@ -558,7 +594,7 @@ def _load_config(agent_path: Path) -> dict:
558
594
 
559
595
  if config_path.exists():
560
596
  # 使用 utf-8-sig 自动处理 BOM,确保 Windows 兼容性
561
- with open(config_path, encoding='utf-8-sig') as f:
597
+ with open(config_path, encoding="utf-8-sig") as f:
562
598
  return yaml.safe_load(f) or {}
563
599
 
564
600
  return {}
ksadk/cli/cmd_mcp.py CHANGED
@@ -4,13 +4,23 @@ import os
4
4
  from dataclasses import asdict, is_dataclass, replace
5
5
  from datetime import datetime
6
6
  from pathlib import Path
7
+ from typing import Any
7
8
 
8
9
  import click
9
10
 
10
11
  from ksadk.api.client import DryRunExit
12
+ from ksadk.builders.container_builder import (
13
+ registry_kind_label,
14
+ resolve_registry_credentials,
15
+ )
11
16
  from ksadk.cli.agent_ref import resolve_mcp_ref
12
- from ksadk.cli.dry_run import dry_run_option, run_async_with_dry_run, effective_dry_run
13
- from ksadk.cli.error_utils import abort_with_cli_error, remote_error, resolution_error, usage_error, validation_error
17
+ from ksadk.cli.dry_run import dry_run_option, effective_dry_run, run_async_with_dry_run
18
+ from ksadk.cli.error_utils import (
19
+ abort_with_cli_error,
20
+ remote_error,
21
+ resolution_error,
22
+ validation_error,
23
+ )
14
24
  from ksadk.cli.network_options import build_network_payload, network_cli_kwargs, network_options
15
25
  from ksadk.cli.resource_common import (
16
26
  CONTEXT_SETTINGS,
@@ -22,24 +32,24 @@ from ksadk.cli.resource_common import (
22
32
  confirm_destructive,
23
33
  confirm_options,
24
34
  pagination_options,
25
- print_next_action_hint,
35
+ region_option,
26
36
  render_descriptor_list,
27
37
  render_descriptor_status,
28
- region_option,
29
38
  )
30
39
  from ksadk.cli.ui import (
31
40
  capture_standard_output,
32
41
  get_console,
33
42
  is_json_output,
34
- output_option as cli_output_option,
35
43
  print_info,
36
44
  print_kv,
37
45
  print_rule,
38
46
  print_success,
39
- print_title,
40
47
  print_warn,
41
48
  status_rich_style,
42
49
  )
50
+ from ksadk.cli.ui import (
51
+ output_option as cli_output_option,
52
+ )
43
53
  from ksadk.cli.workflow_common import (
44
54
  build_workflow_local_plan,
45
55
  clear_build_metadata,
@@ -51,10 +61,6 @@ from ksadk.cli.workflow_common import (
51
61
  render_workflow_result,
52
62
  resolve_artifact_build_plan,
53
63
  )
54
- from ksadk.builders.container_builder import (
55
- registry_kind_label,
56
- resolve_registry_credentials,
57
- )
58
64
 
59
65
  console = get_console()
60
66
 
@@ -127,14 +133,14 @@ def mcp():
127
133
  @click.option("--tag", help="镜像标签 (Container 模式)")
128
134
  @click.option("--registry", help="镜像仓库地址 (Container 模式)")
129
135
  @click.option(
130
- "--region", "-r",
136
+ "--region",
137
+ "-r",
131
138
  default="cn-beijing-6",
132
139
  envvar="KSYUN_REGION",
133
140
  help="构建使用的区域 (Code 模式用于 KS3,Container 模式用于默认镜像仓库推断)",
134
141
  )
135
142
  @click.option(
136
- "--ks3-bucket",
137
- help="KS3 存储桶名称 (Code 模式,默认: agentengine-{account_id}-{region})"
143
+ "--ks3-bucket", help="KS3 存储桶名称 (Code 模式,默认: agentengine-{account_id}-{region})"
138
144
  )
139
145
  @click.option(
140
146
  "--no-cache",
@@ -177,28 +183,18 @@ def build(
177
183
  render_workflow_result(action="build", result=result)
178
184
 
179
185
 
180
- @mcp.command("deploy", context_settings=CONTEXT_SETTINGS)
186
+ @mcp.command("deploy", context_settings=CONTEXT_SETTINGS, short_help="部署 MCP Server 到云端")
181
187
  @click.argument("mcp_dir", default=".", type=click.Path(exists=True))
188
+ @click.option("--name", "-n", help="MCP Server 名称 (默认: 目录名)")
182
189
  @click.option(
183
- "--name", "-n",
184
- help="MCP Server 名称 (默认: 目录名)"
185
- )
186
- @click.option(
187
- "--region", "-r",
190
+ "--region",
191
+ "-r",
188
192
  default="cn-beijing-6",
189
193
  envvar="KSYUN_REGION",
190
- help="部署区域 (default: cn-beijing-6)"
191
- )
192
- @click.option(
193
- "--ks3-bucket",
194
- help="KS3 存储桶名称 (默认: agentengine-{region})"
195
- )
196
- @click.option(
197
- "--enable-auth",
198
- is_flag=True,
199
- default=False,
200
- help="启用 API Key 保护 (可选)"
194
+ help="部署区域 (default: cn-beijing-6)",
201
195
  )
196
+ @click.option("--ks3-bucket", help="KS3 存储桶名称 (默认: agentengine-{region})")
197
+ @click.option("--enable-auth", is_flag=True, default=False, help="启用 API Key 保护 (可选)")
202
198
  @dry_run_option("仅显示请求内容,不实际部署")
203
199
  @click.option(
204
200
  "--artifact-type",
@@ -232,10 +228,10 @@ def deploy(
232
228
  output_mode: str | None,
233
229
  ):
234
230
  """部署 MCP Server 到云端
235
-
231
+
236
232
  \b
237
233
  MCP_DIR: MCP 项目目录 (默认: 当前目录)
238
-
234
+
239
235
  \b
240
236
  示例:
241
237
  # 1) 默认部署 (Code 模式)
@@ -244,7 +240,7 @@ def deploy(
244
240
  agentengine mcp deploy ./my-mcp --name my-tools --artifact-type Container
245
241
  # 3) 显式指定区域
246
242
  KSYUN_REGION=cn-beijing-6 agentengine mcp deploy . --dry-run
247
-
243
+
248
244
  \b
249
245
  部署后的 endpoint 兼容标准 MCP 协议,可以被:
250
246
  - LangGraph/LangChain (via langchain-mcp-adapters)
@@ -255,6 +251,15 @@ def deploy(
255
251
  _ = output_mode
256
252
  dry_run = effective_dry_run(dry_run)
257
253
  dry_run_context: dict[str, object] = {}
254
+
255
+ def render_mcp_deploy_dry_run(exc: DryRunExit) -> None:
256
+ plan_value = dry_run_context.get("plan")
257
+ render_workflow_dry_run(
258
+ action="deploy",
259
+ request=dict(exc.payload) if isinstance(exc.payload, dict) else {},
260
+ plan=dict(plan_value) if isinstance(plan_value, dict) else None,
261
+ )
262
+
258
263
  try:
259
264
  result = run_async_with_dry_run(
260
265
  _deploy_mcp_async(
@@ -277,13 +282,7 @@ def deploy(
277
282
  dry_run_context=dry_run_context,
278
283
  ),
279
284
  dry_run=dry_run,
280
- on_dry_run=(
281
- lambda exc: render_workflow_dry_run(
282
- action="deploy",
283
- request=dict(exc.payload or {}),
284
- plan=dict(dry_run_context.get("plan") or {}) or None,
285
- )
286
- ),
285
+ on_dry_run=render_mcp_deploy_dry_run,
287
286
  )
288
287
  except Exception as e:
289
288
  _abort_mcp_error(e, context="部署失败", argv=["mcp", "deploy"])
@@ -403,9 +402,11 @@ def _print_mcp_build_summary(
403
402
  print_kv("工具", ", ".join(build_result.metadata["tools"]))
404
403
 
405
404
 
406
- def _persist_mcp_build_metadata(mcp_path: Path, build_result, *, artifact_type: str, artifact_reference: str) -> None:
405
+ def _persist_mcp_build_metadata(
406
+ mcp_path: Path, build_result, *, artifact_type: str, artifact_reference: str
407
+ ) -> None:
407
408
  metadata_file = mcp_path / ".agentengine" / "build-metadata.json"
408
- if is_dataclass(build_result):
409
+ if is_dataclass(build_result) and not isinstance(build_result, type):
409
410
  payload = asdict(build_result)
410
411
  else:
411
412
  payload = {
@@ -462,8 +463,11 @@ async def _build_code_artifact(
462
463
  uploader = KS3Uploader(region=upload_region, bucket=ks3_bucket)
463
464
  timestamp = datetime.now().strftime("%Y%m%d%H%M%S")
464
465
  object_key = f"mcps/{mcp_name}/code_{timestamp}.zip"
466
+ artifact_path = build_result.artifact_path
467
+ if artifact_path is None:
468
+ raise validation_error("构建成功但未生成 artifact_path")
465
469
  with capture_standard_output():
466
- ks3_path = await uploader.upload(build_result.artifact_path, object_key)
470
+ ks3_path = await uploader.upload(artifact_path, object_key)
467
471
  if not ks3_path:
468
472
  raise remote_error("KS3 上传失败")
469
473
  artifact_reference = ks3_path
@@ -528,7 +532,7 @@ def _build_mcp_request_data(
528
532
  ) -> dict:
529
533
  resources = config.get("resources") or {}
530
534
  scaling = config.get("scaling") or {}
531
- request_data = {
535
+ request_data: dict[str, Any] = {
532
536
  "name": mcp_name,
533
537
  "type": "mcp",
534
538
  "artifact_type": artifact_type,
@@ -564,15 +568,19 @@ def _build_mcp_request_data(
564
568
  else:
565
569
  kcr_username, kcr_password, registry_kind = resolve_registry_credentials(artifact_reference)
566
570
  if kcr_username and kcr_password:
567
- request_data["image_credential"] = {
571
+ image_credential = {
568
572
  "endpoint": artifact_reference.split("/", 1)[0],
569
573
  "username": kcr_username,
570
574
  "password": kcr_password,
571
575
  }
572
- print_kv("镜像凭证", f"{kcr_username}@{request_data['image_credential']['endpoint']}")
576
+ request_data["image_credential"] = image_credential
577
+ print_kv("镜像凭证", f"{kcr_username}@{image_credential['endpoint']}")
573
578
  else:
574
579
  if registry_kind == "personal_kcr":
575
- print_warn("未配置个人版 KCR 镜像凭证 (KSYUN_ACCOUNT_ID/KCR_PASSWORD),私有镜像可能无法拉取")
580
+ print_warn(
581
+ "未配置个人版 KCR 镜像凭证 "
582
+ "(KSYUN_ACCOUNT_ID/KCR_PASSWORD),私有镜像可能无法拉取"
583
+ )
576
584
  else:
577
585
  print_warn(
578
586
  f"未配置{registry_kind_label(registry_kind)} 镜像凭证 "
@@ -670,8 +678,7 @@ async def _build_mcp_async(
670
678
  "artifact_source": (
671
679
  "built_and_uploaded"
672
680
  if normalized_artifact_type == "Code" and push
673
- else "built_and_pushed" if normalized_artifact_type == "Container" and push
674
- else "built"
681
+ else "built_and_pushed" if normalized_artifact_type == "Container" and push else "built"
675
682
  ),
676
683
  "artifact_reused": bool(build_result.metadata.get("reused", False)),
677
684
  "artifact_built": True,
@@ -753,7 +760,9 @@ async def _deploy_mcp_async(
753
760
 
754
761
  cached_artifact_reference = None
755
762
  if not artifact_plan.should_clear_metadata:
756
- cached_artifact_reference = load_cached_artifact_reference(mcp_path, normalized_artifact_type)
763
+ cached_artifact_reference = load_cached_artifact_reference(
764
+ mcp_path, normalized_artifact_type
765
+ )
757
766
 
758
767
  resolved_artifact_plan = resolve_artifact_build_plan(
759
768
  plan=artifact_plan,
@@ -869,7 +878,7 @@ async def _deploy_mcp_async(
869
878
  res = await client.update_mcp(existing_mcp_id, request_data)
870
879
  mcp_id = existing_mcp_id
871
880
  else:
872
- # create 默认开公网(network 未显式 enable_public_access 时补 True);update 分支用原始 request_data(network 缺省=保留服务端现有配置)
881
+ # create 默认开公网;update 缺省 network 时保留服务端配置。
873
882
  create_network = dict(request_data.get("network") or {})
874
883
  if "enable_public_access" not in create_network:
875
884
  create_network["enable_public_access"] = True
@@ -935,7 +944,7 @@ def list_mcps(region: str, page: int, size: int, dry_run: bool, output_mode: str
935
944
  _ = output_mode
936
945
  dry_run = effective_dry_run(dry_run)
937
946
  from ksadk.api import AgentEngineClient
938
-
947
+
939
948
  async def _list():
940
949
  async with AgentEngineClient(region=region, dry_run=dry_run) as client:
941
950
  resp = await client.list_mcps(region=region, page=page, page_size=size)
@@ -984,14 +993,14 @@ def list_mcps(region: str, page: int, size: int, dry_run: bool, output_mode: str
984
993
  _abort_mcp_error(e, context="获取列表失败", argv=["mcp", "list"])
985
994
 
986
995
 
987
- @mcp.command("status", context_settings=CONTEXT_SETTINGS)
996
+ @mcp.command("status", context_settings=CONTEXT_SETTINGS, short_help="查看 MCP 状态")
988
997
  @click.argument("mcp_ref", required=False)
989
998
  @region_option(default=None, envvar=None, help_text="区域 (默认优先读取 .agentengine.state)")
990
999
  @dry_run_option()
991
1000
  @cli_output_option()
992
1001
  def status(mcp_ref: str | None, region: str | None, dry_run: bool, output_mode: str | None):
993
1002
  """查看 MCP 状态
994
-
1003
+
995
1004
  MCP_ID: MCP 的 ID
996
1005
  """
997
1006
  _ = output_mode
@@ -1015,7 +1024,7 @@ def status(mcp_ref: str | None, region: str | None, dry_run: bool, output_mode:
1015
1024
  target_ref = resolved.value
1016
1025
  if resolved.source != "cli":
1017
1026
  print_info(f"未显式指定 MCP,使用 {resolved.source_text}: {target_ref}")
1018
-
1027
+
1019
1028
  async def _get():
1020
1029
  async with AgentEngineClient(region=region, dry_run=dry_run) as client:
1021
1030
  mcp = None
@@ -1027,7 +1036,7 @@ def status(mcp_ref: str | None, region: str | None, dry_run: bool, output_mode:
1027
1036
  mcp = await client.get_mcp_by_name(target_ref, region=region)
1028
1037
  if not mcp:
1029
1038
  raise resolution_error(f"未找到 MCP: {target_ref}", hints=["agentengine mcp list"])
1030
-
1039
+
1031
1040
  status_text = (mcp.get("status") or "UNKNOWN").upper()
1032
1041
  fields = [
1033
1042
  ("ID", str(mcp.get("mcp_id", "-")), None),
@@ -1037,7 +1046,7 @@ def status(mcp_ref: str | None, region: str | None, dry_run: bool, output_mode:
1037
1046
  ("MCP URL", str(mcp.get("mcp_endpoint", "N/A")), "#58a6ff"),
1038
1047
  ("认证", "已开启" if mcp.get("enable_auth") else "未开启", None),
1039
1048
  ]
1040
- if mcp.get('tools'):
1049
+ if mcp.get("tools"):
1041
1050
  fields.append(("工具", ", ".join(mcp["tools"]), None))
1042
1051
  fields.extend(
1043
1052
  [
@@ -1088,19 +1097,32 @@ def _delete_impl(mcp_ids: tuple[str, ...], region: str, assume_yes: bool, dry_ru
1088
1097
  prompt=f"确定要删除这 {len(mcp_ids)} 个 MCP 吗?",
1089
1098
  ):
1090
1099
  return
1091
-
1100
+
1092
1101
  async def _delete():
1093
1102
  async with AgentEngineClient(region=region, dry_run=dry_run) as client:
1094
1103
  failed_ids: list[str] = []
1095
1104
  deleted_ids: list[str] = []
1105
+ failure_reasons: dict[str, str] = {}
1096
1106
  for mcp_id in mcp_ids:
1097
- success = await client.delete_mcp(mcp_id)
1107
+ try:
1108
+ success = await client.delete_mcp(mcp_id)
1109
+ except DryRunExit:
1110
+ raise
1111
+ except Exception as exc:
1112
+ failed_ids.append(mcp_id)
1113
+ reason = str(exc)
1114
+ request_id = str(getattr(exc, "details", {}).get("request_id") or "")
1115
+ if request_id:
1116
+ reason = f"{reason} (RequestId: {request_id})"
1117
+ failure_reasons[mcp_id] = reason
1118
+ continue
1098
1119
  if success:
1099
1120
  deleted_ids.append(mcp_id)
1100
1121
  print_success(f"MCP 已删除: {mcp_id}")
1101
1122
 
1102
1123
  # 尝试清理本地状态文件 (如果在项目目录中)
1103
1124
  from ksadk.deployment.state import clear_state
1125
+
1104
1126
  try:
1105
1127
  removed = clear_state(Path("."), key=mcp_id)
1106
1128
  if removed:
@@ -1111,11 +1133,19 @@ def _delete_impl(mcp_ids: tuple[str, ...], region: str, assume_yes: bool, dry_ru
1111
1133
  pass
1112
1134
  else:
1113
1135
  failed_ids.append(mcp_id)
1136
+ failure_reasons[mcp_id] = "服务端未确认删除"
1114
1137
 
1115
1138
  if failed_ids:
1139
+ reason_text = "; ".join(
1140
+ f"{mcp_id}: {failure_reasons[mcp_id]}" for mcp_id in failed_ids
1141
+ )
1116
1142
  raise remote_error(
1117
- f"以下 MCP 删除失败: {', '.join(failed_ids)}",
1118
- details={"deleted": deleted_ids, "failed": failed_ids},
1143
+ f"以下 MCP 删除失败: {', '.join(failed_ids)}。原因: {reason_text}",
1144
+ details={
1145
+ "deleted": deleted_ids,
1146
+ "failed": failed_ids,
1147
+ "errors": failure_reasons,
1148
+ },
1119
1149
  )
1120
1150
  return {
1121
1151
  "targets": list(mcp_ids),
@@ -1123,7 +1153,7 @@ def _delete_impl(mcp_ids: tuple[str, ...], region: str, assume_yes: bool, dry_ru
1123
1153
  "failed": failed_ids,
1124
1154
  }
1125
1155
 
1126
- dry_run_kwargs = {"dry_run": dry_run}
1156
+ dry_run_kwargs: dict[str, Any] = {"dry_run": dry_run}
1127
1157
  if is_json_output():
1128
1158
  dry_run_kwargs.update(
1129
1159
  dry_run_resource="mcp",
@@ -1161,7 +1191,9 @@ def _delete_impl(mcp_ids: tuple[str, ...], region: str, assume_yes: bool, dry_ru
1161
1191
  @confirm_options()
1162
1192
  @dry_run_option()
1163
1193
  @cli_output_option()
1164
- def delete(mcp_ids: tuple[str, ...], region: str, assume_yes: bool, dry_run: bool, output_mode: str | None):
1194
+ def delete(
1195
+ mcp_ids: tuple[str, ...], region: str, assume_yes: bool, dry_run: bool, output_mode: str | None
1196
+ ):
1165
1197
  """删除 MCP。"""
1166
1198
  _ = output_mode
1167
1199
  _delete_impl(mcp_ids=mcp_ids, region=region, assume_yes=assume_yes, dry_run=dry_run)
@@ -1173,7 +1205,9 @@ def delete(mcp_ids: tuple[str, ...], region: str, assume_yes: bool, dry_run: boo
1173
1205
  @confirm_options()
1174
1206
  @dry_run_option()
1175
1207
  @cli_output_option()
1176
- def destroy(mcp_ids: tuple[str, ...], region: str, assume_yes: bool, dry_run: bool, output_mode: str | None):
1208
+ def destroy(
1209
+ mcp_ids: tuple[str, ...], region: str, assume_yes: bool, dry_run: bool, output_mode: str | None
1210
+ ):
1177
1211
  """删除 MCP。"""
1178
1212
  _ = output_mode
1179
1213
  _delete_impl(mcp_ids=mcp_ids, region=region, assume_yes=assume_yes, dry_run=dry_run)
ksadk/cli/cmd_model.py CHANGED
@@ -3,15 +3,20 @@ agentengine model - 切换模型
3
3
  """
4
4
 
5
5
  import os
6
+ from pathlib import Path
7
+
6
8
  import click
7
9
  import httpx
8
10
  import questionary
9
11
  import yaml
10
- from pathlib import Path
11
12
  from dotenv import set_key
12
- from ksadk.deployment.state import load_state
13
+
13
14
  from ksadk.cli.error_utils import abort_with_cli_error, print_exception, usage_error
14
- from ksadk.cli.resource_common import CONTEXT_SETTINGS, CompatibilityAliasCommand, print_compatibility_hint
15
+ from ksadk.cli.resource_common import (
16
+ CONTEXT_SETTINGS,
17
+ CompatibilityAliasCommand,
18
+ print_compatibility_hint,
19
+ )
15
20
  from ksadk.cli.ui import (
16
21
  is_color_disabled,
17
22
  is_stdout_tty,
@@ -22,6 +27,7 @@ from ksadk.cli.ui import (
22
27
  print_title,
23
28
  print_warn,
24
29
  )
30
+ from ksadk.deployment.state import load_state
25
31
 
26
32
 
27
33
  def _parse_model_selection(raw: str | None) -> list[str]:
@@ -71,7 +77,9 @@ def _write_default_model(selected_model: str) -> Path:
71
77
  if not selected_model:
72
78
  raise click.ClickException("未选择模型")
73
79
  env_file = _resolve_env_file()
74
- success, _key, _value = set_key(env_file, "OPENAI_MODEL_NAME", selected_model, quote_mode="never")
80
+ success, _key, _value = set_key(
81
+ env_file, "OPENAI_MODEL_NAME", selected_model, quote_mode="never"
82
+ )
75
83
  if not success:
76
84
  raise click.ClickException("更新 OPENAI_MODEL_NAME 失败")
77
85
  return env_file
@@ -145,7 +153,8 @@ def run_model_command(
145
153
  hints=[
146
154
  "查看当前模型配置请使用 `agentengine config show`。",
147
155
  "非交互修改请使用 `agentengine config set OPENAI_MODEL_NAME=<model>`。",
148
- "为 Agent/deploy 生成环境变量请使用 `agentengine config model --env <model[,model...]>`。",
156
+ "为 Agent/deploy 生成环境变量请使用 "
157
+ "`agentengine config model --env <model[,model...]>`。",
149
158
  ],
150
159
  ),
151
160
  argv=["config", "model"],