agentengine-sdk-python 0.6.9__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 (384) hide show
  1. {agentengine_sdk_python-0.6.9.dist-info → agentengine_sdk_python-0.8.0.dist-info}/METADATA +41 -23
  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 +252 -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 +533 -726
  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 +173 -90
  54. ksadk/cli/cmd_invoke.py +388 -159
  55. ksadk/cli/cmd_launch.py +64 -28
  56. ksadk/cli/cmd_mcp.py +103 -64
  57. ksadk/cli/cmd_model.py +14 -5
  58. ksadk/cli/cmd_openclaw.py +488 -228
  59. ksadk/cli/cmd_replay.py +71 -0
  60. ksadk/cli/cmd_run.py +44 -14
  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 +38 -16
  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 +501 -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 +656 -0
  97. ksadk/conversations/model_context.py +22 -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 -5187
  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 +52 -39
  120. ksadk/deployment/manager.py +63 -65
  121. ksadk/deployment/providers/serverless.py +326 -209
  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 +267 -0
  156. ksadk/memory/adk/short_term_memory.py +33 -27
  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 +1248 -164
  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 -530
  183. ksadk/runners/langgraph_runner.py +490 -95
  184. ksadk/runners/patch_langchain.py +16 -16
  185. ksadk/runners/remote_runner.py +264 -38
  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 -3743
  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-C0meuOdi.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-bj2rZnP5.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-2u1ltDIj.js → architectureDiagram-3BPJPVTR-Dej8jX8c.js} +1 -1
  229. ksadk/server/static/assets/{blockDiagram-GPEHLZMM-D6fvdK20.js → blockDiagram-GPEHLZMM-1F64jqvy.js} +1 -1
  230. ksadk/server/static/assets/{c4Diagram-AAUBKEIU-BK82L5n5.js → c4Diagram-AAUBKEIU-9q7AUAKb.js} +1 -1
  231. ksadk/server/static/assets/channel-iUGv2N24.js +1 -0
  232. ksadk/server/static/assets/{chunk-2J33WTMH-DLVdkeyQ.js → chunk-2J33WTMH-6qgwJm7Q.js} +1 -1
  233. ksadk/server/static/assets/{chunk-4BX2VUAB-BbwsYcbW.js → chunk-4BX2VUAB-CsWIQRhc.js} +1 -1
  234. ksadk/server/static/assets/{chunk-55IACEB6-DOairxzw.js → chunk-55IACEB6-BK8paA20.js} +1 -1
  235. ksadk/server/static/assets/{chunk-727SXJPM-hCO487gs.js → chunk-727SXJPM-B-JEhy7h.js} +1 -1
  236. ksadk/server/static/assets/{chunk-AQP2D5EJ-XU8vDOuG.js → chunk-AQP2D5EJ-DYBvMHAa.js} +1 -1
  237. ksadk/server/static/assets/{chunk-FMBD7UC4-PrapyfMu.js → chunk-FMBD7UC4-BGhvzDYt.js} +1 -1
  238. ksadk/server/static/assets/{chunk-ND2GUHAM-CboKhTZ3.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-_N8bJ-EU.js → cose-bilkent-S5V4N54A-CX3yotHq.js} +1 -1
  243. ksadk/server/static/assets/{dagre-BM42HDAG-FoDlo5J2.js → dagre-BM42HDAG-C7TguAWo.js} +1 -1
  244. ksadk/server/static/assets/{diagram-2AECGRRQ-BBp6ebBw.js → diagram-2AECGRRQ-Dd17_kws.js} +1 -1
  245. ksadk/server/static/assets/{diagram-5GNKFQAL-CqOvG1PR.js → diagram-5GNKFQAL-DVIClIil.js} +1 -1
  246. ksadk/server/static/assets/{diagram-KO2AKTUF-O9T3t6ba.js → diagram-KO2AKTUF-Df_3gYQa.js} +1 -1
  247. ksadk/server/static/assets/{diagram-LMA3HP47-CGG8ekBO.js → diagram-LMA3HP47-BhLk6ZtA.js} +1 -1
  248. ksadk/server/static/assets/{diagram-OG6HWLK6-4BmH1EEg.js → diagram-OG6HWLK6-D4GNGvuu.js} +1 -1
  249. ksadk/server/static/assets/{dist-CiZHB6ZW.js → dist-6CVKuTAe.js} +1 -1
  250. ksadk/server/static/assets/{dist-BMKM66B4.js → dist-BUHRxvDG.js} +1 -1
  251. ksadk/server/static/assets/{dist-CZ6C3x8B.js → dist-BZ9n9AjO.js} +1 -1
  252. ksadk/server/static/assets/{dist-DbaH3p5h.js → dist-BibcG1V9.js} +1 -1
  253. ksadk/server/static/assets/{dist-BVzcWa6D.js → dist-Bs-jQcRX.js} +1 -1
  254. ksadk/server/static/assets/{dist-D99wf6_X.js → dist-C2xjE7cO.js} +1 -1
  255. ksadk/server/static/assets/{dist-DLMjL01k.js → dist-C7-3jInC.js} +1 -1
  256. ksadk/server/static/assets/{dist-DI-oVAXw.js → dist-C99THtIA.js} +1 -1
  257. ksadk/server/static/assets/{dist-BkJjNih3.js → dist-CGcp2ex8.js} +1 -1
  258. ksadk/server/static/assets/{dist-D5JGcxBx.js → dist-CVQRZjPu.js} +1 -1
  259. ksadk/server/static/assets/{dist-CWiTDN_V.js → dist-Cf23NY4L.js} +1 -1
  260. ksadk/server/static/assets/{dist-DLeM1OCK.js → dist-CgF3fj15.js} +1 -1
  261. ksadk/server/static/assets/{dist-BmuTWcm7.js → dist-Cwt7koer.js} +1 -1
  262. ksadk/server/static/assets/{dist-C2DKRFVK.js → dist-D82mtD2s.js} +1 -1
  263. ksadk/server/static/assets/{dist-B67uF2uK.js → dist-DF06ORQo.js} +1 -1
  264. ksadk/server/static/assets/{dist-Cwhk4lwI.js → dist-DHn6nBzr.js} +1 -1
  265. ksadk/server/static/assets/{dist-S4klkK5W.js → dist-Djgl2wVZ.js} +1 -1
  266. ksadk/server/static/assets/{dist-DCpZrjaK.js → dist-DlzCRy0S.js} +1 -1
  267. ksadk/server/static/assets/{dist-Cp1_jKwf.js → dist-DqNnNFrw.js} +1 -1
  268. ksadk/server/static/assets/{dist-6kSZvCZh.js → dist-DyvYLMW9.js} +1 -1
  269. ksadk/server/static/assets/{dist-DM0rEQPk.js → dist-eoW6tZXA.js} +1 -1
  270. ksadk/server/static/assets/{dist-Bk1l05Ni.js → dist-ivOya1LD.js} +1 -1
  271. ksadk/server/static/assets/{erDiagram-TEJ5UH35-oJhaci7S.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-DtTmUan-.js → flowDiagram-I6XJVG4X-DGaJjGNJ.js} +1 -1
  274. ksadk/server/static/assets/{ganttDiagram-6RSMTGT7-BSsb_eij.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-BR5s6Pws.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-DYPc5cvh.js → infoDiagram-5YYISTIA-CYIIsb8y.js} +1 -1
  281. ksadk/server/static/assets/{ishikawaDiagram-YF4QCWOH-MoBdALDg.js → ishikawaDiagram-YF4QCWOH-DLOHGvWw.js} +1 -1
  282. ksadk/server/static/assets/{journeyDiagram-JHISSGLW-DgLiQT8l.js → journeyDiagram-JHISSGLW-BIzKeejT.js} +1 -1
  283. ksadk/server/static/assets/{kanban-definition-UN3LZRKU-CsFx112F.js → kanban-definition-UN3LZRKU-BWHoFSw2.js} +1 -1
  284. ksadk/server/static/assets/{katex-DRsiwpM2.js → katex-DATssjp1.js} +1 -1
  285. ksadk/server/static/assets/{linear-TNRQ5Orv.js → linear-CvMBw9cA.js} +1 -1
  286. ksadk/server/static/assets/{mermaid-parser.core-D2eMVOgo.js → mermaid-parser.core-mGAcEwcq.js} +2 -2
  287. ksadk/server/static/assets/{mindmap-definition-RKZ34NQL-BtByYFhL.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-DPnuCB8c.js → pieDiagram-4H26LBE5-By-ra07M.js} +1 -1
  291. ksadk/server/static/assets/{quadrantDiagram-W4KKPZXB-miFpCPv4.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-mjB_yYkW.js → requirementDiagram-4Y6WPE33-DpW90iu3.js} +1 -1
  294. ksadk/server/static/assets/{sankeyDiagram-5OEKKPKP-D7hSlZZZ.js → sankeyDiagram-5OEKKPKP-DpGa6EAV.js} +1 -1
  295. ksadk/server/static/assets/{sequenceDiagram-3UESZ5HK-D9Cx6hC3.js → sequenceDiagram-3UESZ5HK-NTKNGGe5.js} +1 -1
  296. ksadk/server/static/assets/{stateDiagram-AJRCARHV-D_zrg47o.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-CwSec0Wa.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-agCVobiF.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-TmrlhWNt.js → wardleyDiagram-YWT4CUSO-BR54GPmr.js} +1 -1
  304. ksadk/server/static/assets/{xychartDiagram-2RQKCTM6-DV71V-ah.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 +86 -40
  308. ksadk/sessions/base.py +31 -11
  309. ksadk/sessions/continuity.py +28 -5
  310. ksadk/sessions/in_memory.py +46 -2
  311. ksadk/sessions/local_service.py +148 -17
  312. ksadk/sessions/postgres_service.py +216 -35
  313. ksadk/sessions/resilience.py +52 -0
  314. ksadk/sessions/resilient.py +388 -0
  315. ksadk/skills/models.py +17 -5
  316. ksadk/skills/package_store.py +5 -2
  317. ksadk/skills/runtime/agent.py +20 -5
  318. ksadk/skills/runtime/artifacts.py +1 -5
  319. ksadk/skills/runtime/backends/e2b.py +10 -4
  320. ksadk/skills/runtime/backends/local.py +15 -3
  321. ksadk/skills/runtime/base.py +1 -2
  322. ksadk/skills/runtime/executor.py +10 -3
  323. ksadk/skills/runtime/factory.py +4 -2
  324. ksadk/skills/runtime/loader.py +1 -2
  325. ksadk/skills/runtime/registry.py +15 -10
  326. ksadk/skills/runtime/request.py +3 -1
  327. ksadk/skills/service_client.py +38 -17
  328. ksadk/skills/tool_defs.py +15 -10
  329. ksadk/terminal_exec_policy.py +3 -4
  330. ksadk/tools/gateway.py +92 -15
  331. ksadk/tools/result_budget.py +12 -4
  332. ksadk/toolsets/__init__.py +136 -36
  333. ksadk/toolsets/platform.py +21 -5
  334. ksadk/toolsets/sandbox.py +82 -16
  335. ksadk/toolsets/skills.py +200 -39
  336. ksadk/toolsets/web.py +123 -26
  337. ksadk/toolsets/workspace.py +264 -114
  338. ksadk/tracing/exporters/inmemory_exporter.py +62 -51
  339. ksadk/tracing/exporters/langfuse_exporter.py +91 -76
  340. ksadk/tracing/setup.py +132 -53
  341. ksadk/tracing/span_utils.py +5 -2
  342. ksadk/tui/__init__.py +22 -7
  343. ksadk/tui/loop.py +1925 -0
  344. ksadk/tui/stream_render.py +69 -0
  345. ksadk/ui_config.py +5 -3
  346. ksadk/version.py +1 -1
  347. ksadk_runtime_common/schemas/runtime_event_v1.json +95 -0
  348. agentengine_sdk_python-0.6.9.dist-info/RECORD +0 -487
  349. ksadk/server/static/assets/CodeBlock-BbI4HPtJ.js +0 -9
  350. ksadk/server/static/assets/MathMessageMarkdown-DMLQYoLp.js +0 -8
  351. ksadk/server/static/assets/MermaidBlock-DCR8WZ17.js +0 -303
  352. ksadk/server/static/assets/NativeTerminalPanel-CKUvWhUz.js +0 -1
  353. ksadk/server/static/assets/architecture-7EHR7CIX-Cr6Xz1_c.js +0 -1
  354. ksadk/server/static/assets/channel-BSSOwFIb.js +0 -1
  355. ksadk/server/static/assets/chunk-QZHKN3VN-XXpdiwUL.js +0 -1
  356. ksadk/server/static/assets/classDiagram-4FO5ZUOK-C5HvGiyK.js +0 -1
  357. ksadk/server/static/assets/classDiagram-v2-Q7XG4LA2-C5HvGiyK.js +0 -1
  358. ksadk/server/static/assets/eventmodeling-FCH6USID-CIgwHJLL.js +0 -1
  359. ksadk/server/static/assets/gitGraph-WXDBUCRP-BVAJ7uo0.js +0 -1
  360. ksadk/server/static/assets/index-BH7-pC0B.js +0 -165
  361. ksadk/server/static/assets/index-DAURbCsP.css +0 -1
  362. ksadk/server/static/assets/info-J43DQDTF-MT80V4ge.js +0 -1
  363. ksadk/server/static/assets/packet-YPE3B663-BLKhbXZB.js +0 -1
  364. ksadk/server/static/assets/pie-LRSECV5Y-DFOikjSY.js +0 -1
  365. ksadk/server/static/assets/radar-GUYGQ44K-095b1Ikw.js +0 -1
  366. ksadk/server/static/assets/stateDiagram-v2-BHNVJYJU-J9kCb0nC.js +0 -1
  367. ksadk/server/static/assets/treeView-BLDUP644-yinfJEY6.js +0 -1
  368. ksadk/server/static/assets/treemap-LRROVOQU-DosUqN1Q.js +0 -1
  369. ksadk/server/static/assets/wardley-L42UT6IY-Bvp7-5uH.js +0 -1
  370. ksadk/tui/app.py +0 -400
  371. ksadk/tui/clipboard.py +0 -100
  372. ksadk/tui/widgets/__init__.py +0 -22
  373. ksadk/tui/widgets/assistant.py +0 -89
  374. ksadk/tui/widgets/base.py +0 -54
  375. ksadk/tui/widgets/chat_input.py +0 -246
  376. ksadk/tui/widgets/history.py +0 -156
  377. ksadk/tui/widgets/system.py +0 -87
  378. ksadk/tui/widgets/thinking.py +0 -110
  379. ksadk/tui/widgets/tool_call.py +0 -161
  380. ksadk/tui/widgets/user.py +0 -37
  381. {agentengine_sdk_python-0.6.9.dist-info → agentengine_sdk_python-0.8.0.dist-info}/WHEEL +0 -0
  382. {agentengine_sdk_python-0.6.9.dist-info → agentengine_sdk_python-0.8.0.dist-info}/entry_points.txt +0 -0
  383. {agentengine_sdk_python-0.6.9.dist-info → agentengine_sdk_python-0.8.0.dist-info}/licenses/LICENSE +0 -0
  384. {agentengine_sdk_python-0.6.9.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,12 @@ 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
- res = await client.create_mcp(request_data)
881
+ # create 默认开公网;update 缺省 network 时保留服务端配置。
882
+ create_network = dict(request_data.get("network") or {})
883
+ if "enable_public_access" not in create_network:
884
+ create_network["enable_public_access"] = True
885
+ create_request = {**request_data, "network": create_network}
886
+ res = await client.create_mcp(create_request)
873
887
  if not res:
874
888
  raise remote_error("Server 返回空响应,请检查 MCP 名称是否冲突或服务端日志。")
875
889
  mcp_id = res.get("mcp_id")
@@ -930,7 +944,7 @@ def list_mcps(region: str, page: int, size: int, dry_run: bool, output_mode: str
930
944
  _ = output_mode
931
945
  dry_run = effective_dry_run(dry_run)
932
946
  from ksadk.api import AgentEngineClient
933
-
947
+
934
948
  async def _list():
935
949
  async with AgentEngineClient(region=region, dry_run=dry_run) as client:
936
950
  resp = await client.list_mcps(region=region, page=page, page_size=size)
@@ -979,14 +993,14 @@ def list_mcps(region: str, page: int, size: int, dry_run: bool, output_mode: str
979
993
  _abort_mcp_error(e, context="获取列表失败", argv=["mcp", "list"])
980
994
 
981
995
 
982
- @mcp.command("status", context_settings=CONTEXT_SETTINGS)
996
+ @mcp.command("status", context_settings=CONTEXT_SETTINGS, short_help="查看 MCP 状态")
983
997
  @click.argument("mcp_ref", required=False)
984
998
  @region_option(default=None, envvar=None, help_text="区域 (默认优先读取 .agentengine.state)")
985
999
  @dry_run_option()
986
1000
  @cli_output_option()
987
1001
  def status(mcp_ref: str | None, region: str | None, dry_run: bool, output_mode: str | None):
988
1002
  """查看 MCP 状态
989
-
1003
+
990
1004
  MCP_ID: MCP 的 ID
991
1005
  """
992
1006
  _ = output_mode
@@ -1010,7 +1024,7 @@ def status(mcp_ref: str | None, region: str | None, dry_run: bool, output_mode:
1010
1024
  target_ref = resolved.value
1011
1025
  if resolved.source != "cli":
1012
1026
  print_info(f"未显式指定 MCP,使用 {resolved.source_text}: {target_ref}")
1013
-
1027
+
1014
1028
  async def _get():
1015
1029
  async with AgentEngineClient(region=region, dry_run=dry_run) as client:
1016
1030
  mcp = None
@@ -1022,7 +1036,7 @@ def status(mcp_ref: str | None, region: str | None, dry_run: bool, output_mode:
1022
1036
  mcp = await client.get_mcp_by_name(target_ref, region=region)
1023
1037
  if not mcp:
1024
1038
  raise resolution_error(f"未找到 MCP: {target_ref}", hints=["agentengine mcp list"])
1025
-
1039
+
1026
1040
  status_text = (mcp.get("status") or "UNKNOWN").upper()
1027
1041
  fields = [
1028
1042
  ("ID", str(mcp.get("mcp_id", "-")), None),
@@ -1032,7 +1046,7 @@ def status(mcp_ref: str | None, region: str | None, dry_run: bool, output_mode:
1032
1046
  ("MCP URL", str(mcp.get("mcp_endpoint", "N/A")), "#58a6ff"),
1033
1047
  ("认证", "已开启" if mcp.get("enable_auth") else "未开启", None),
1034
1048
  ]
1035
- if mcp.get('tools'):
1049
+ if mcp.get("tools"):
1036
1050
  fields.append(("工具", ", ".join(mcp["tools"]), None))
1037
1051
  fields.extend(
1038
1052
  [
@@ -1083,19 +1097,32 @@ def _delete_impl(mcp_ids: tuple[str, ...], region: str, assume_yes: bool, dry_ru
1083
1097
  prompt=f"确定要删除这 {len(mcp_ids)} 个 MCP 吗?",
1084
1098
  ):
1085
1099
  return
1086
-
1100
+
1087
1101
  async def _delete():
1088
1102
  async with AgentEngineClient(region=region, dry_run=dry_run) as client:
1089
1103
  failed_ids: list[str] = []
1090
1104
  deleted_ids: list[str] = []
1105
+ failure_reasons: dict[str, str] = {}
1091
1106
  for mcp_id in mcp_ids:
1092
- 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
1093
1119
  if success:
1094
1120
  deleted_ids.append(mcp_id)
1095
1121
  print_success(f"MCP 已删除: {mcp_id}")
1096
1122
 
1097
1123
  # 尝试清理本地状态文件 (如果在项目目录中)
1098
1124
  from ksadk.deployment.state import clear_state
1125
+
1099
1126
  try:
1100
1127
  removed = clear_state(Path("."), key=mcp_id)
1101
1128
  if removed:
@@ -1106,11 +1133,19 @@ def _delete_impl(mcp_ids: tuple[str, ...], region: str, assume_yes: bool, dry_ru
1106
1133
  pass
1107
1134
  else:
1108
1135
  failed_ids.append(mcp_id)
1136
+ failure_reasons[mcp_id] = "服务端未确认删除"
1109
1137
 
1110
1138
  if failed_ids:
1139
+ reason_text = "; ".join(
1140
+ f"{mcp_id}: {failure_reasons[mcp_id]}" for mcp_id in failed_ids
1141
+ )
1111
1142
  raise remote_error(
1112
- f"以下 MCP 删除失败: {', '.join(failed_ids)}",
1113
- 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
+ },
1114
1149
  )
1115
1150
  return {
1116
1151
  "targets": list(mcp_ids),
@@ -1118,7 +1153,7 @@ def _delete_impl(mcp_ids: tuple[str, ...], region: str, assume_yes: bool, dry_ru
1118
1153
  "failed": failed_ids,
1119
1154
  }
1120
1155
 
1121
- dry_run_kwargs = {"dry_run": dry_run}
1156
+ dry_run_kwargs: dict[str, Any] = {"dry_run": dry_run}
1122
1157
  if is_json_output():
1123
1158
  dry_run_kwargs.update(
1124
1159
  dry_run_resource="mcp",
@@ -1156,7 +1191,9 @@ def _delete_impl(mcp_ids: tuple[str, ...], region: str, assume_yes: bool, dry_ru
1156
1191
  @confirm_options()
1157
1192
  @dry_run_option()
1158
1193
  @cli_output_option()
1159
- 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
+ ):
1160
1197
  """删除 MCP。"""
1161
1198
  _ = output_mode
1162
1199
  _delete_impl(mcp_ids=mcp_ids, region=region, assume_yes=assume_yes, dry_run=dry_run)
@@ -1168,7 +1205,9 @@ def delete(mcp_ids: tuple[str, ...], region: str, assume_yes: bool, dry_run: boo
1168
1205
  @confirm_options()
1169
1206
  @dry_run_option()
1170
1207
  @cli_output_option()
1171
- 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
+ ):
1172
1211
  """删除 MCP。"""
1173
1212
  _ = output_mode
1174
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"],