agentengine-sdk-python 0.6.2__py3-none-any.whl → 0.6.9__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 (490) hide show
  1. agentengine_sdk_python-0.6.9.dist-info/METADATA +179 -0
  2. agentengine_sdk_python-0.6.9.dist-info/RECORD +487 -0
  3. {agentengine_sdk_python-0.6.2.dist-info → agentengine_sdk_python-0.6.9.dist-info}/WHEEL +1 -1
  4. agentengine_sdk_python-0.6.9.dist-info/entry_points.txt +3 -0
  5. agentengine_sdk_python-0.6.9.dist-info/licenses/LICENSE +175 -0
  6. agentengine_sdk_python-0.6.9.dist-info/top_level.txt +2 -0
  7. ksadk/__init__.py +13 -0
  8. ksadk/__main__.py +4 -0
  9. ksadk/a2a/__init__.py +15 -0
  10. ksadk/a2a/card_builder.py +64 -0
  11. ksadk/a2a/client.py +309 -0
  12. ksadk/a2a/executor.py +201 -0
  13. ksadk/a2a/server.py +79 -0
  14. ksadk/agents/__init__.py +20 -0
  15. ksadk/agents/base.py +370 -0
  16. ksadk/agents/context.py +38 -0
  17. ksadk/agents/event.py +35 -0
  18. ksadk/agents/loop_agent.py +71 -0
  19. ksadk/agents/parallel_agent.py +109 -0
  20. ksadk/agents/runner_adapter.py +24 -0
  21. ksadk/agents/sequential_agent.py +34 -0
  22. ksadk/api/__init__.py +3 -0
  23. ksadk/api/client.py +2227 -0
  24. ksadk/builders/__init__.py +20 -0
  25. ksadk/builders/base.py +66 -0
  26. ksadk/builders/code_builder.py +1990 -0
  27. ksadk/builders/container_builder.py +786 -0
  28. ksadk/builders/framework_requirements.py +59 -0
  29. ksadk/builders/ks3_uploader.py +389 -0
  30. ksadk/builders/mcp_builder.py +476 -0
  31. ksadk/builders/requirements_utils.py +75 -0
  32. ksadk/cli/__init__.py +531 -0
  33. ksadk/cli/__main__.py +4 -0
  34. ksadk/cli/agent_ref.py +204 -0
  35. ksadk/cli/cmd_a2a.py +167 -0
  36. ksadk/cli/cmd_agent.py +201 -0
  37. ksadk/cli/cmd_build.py +270 -0
  38. ksadk/cli/cmd_completion.py +304 -0
  39. ksadk/cli/cmd_config.py +758 -0
  40. ksadk/cli/cmd_create.py +2277 -0
  41. ksadk/cli/cmd_dashboard.py +900 -0
  42. ksadk/cli/cmd_deploy.py +704 -0
  43. ksadk/cli/cmd_destroy.py +345 -0
  44. ksadk/cli/cmd_files.py +1227 -0
  45. ksadk/cli/cmd_hermes.py +1259 -0
  46. ksadk/cli/cmd_invoke.py +1336 -0
  47. ksadk/cli/cmd_launch.py +564 -0
  48. ksadk/cli/cmd_mcp.py +1174 -0
  49. ksadk/cli/cmd_model.py +302 -0
  50. ksadk/cli/cmd_openclaw.py +3918 -0
  51. ksadk/cli/cmd_run.py +232 -0
  52. ksadk/cli/cmd_status.py +588 -0
  53. ksadk/cli/cmd_version.py +522 -0
  54. ksadk/cli/cmd_web.py +288 -0
  55. ksadk/cli/deploy_utils.py +87 -0
  56. ksadk/cli/dry_run.py +214 -0
  57. ksadk/cli/env_options.py +82 -0
  58. ksadk/cli/error_utils.py +525 -0
  59. ksadk/cli/global_options.py +31 -0
  60. ksadk/cli/local_runtime.py +97 -0
  61. ksadk/cli/model_catalog.py +136 -0
  62. ksadk/cli/network_options.py +410 -0
  63. ksadk/cli/resource_common.py +621 -0
  64. ksadk/cli/storage.py +84 -0
  65. ksadk/cli/ui.py +431 -0
  66. ksadk/cli/workflow_common.py +552 -0
  67. ksadk/common/__init__.py +14 -0
  68. ksadk/common/aicp_env.py +128 -0
  69. ksadk/common/auth.py +190 -0
  70. ksadk/common/constants.py +84 -0
  71. ksadk/common/llm_utils.py +61 -0
  72. ksadk/configs/__init__.py +61 -0
  73. ksadk/configs/env_registry.py +342 -0
  74. ksadk/configs/global_config.py +200 -0
  75. ksadk/configs/settings.py +706 -0
  76. ksadk/conversations/__init__.py +95 -0
  77. ksadk/conversations/attachment_storage.py +379 -0
  78. ksadk/conversations/attachments.py +774 -0
  79. ksadk/conversations/compaction_pipeline.py +387 -0
  80. ksadk/conversations/compaction_prompt.py +128 -0
  81. ksadk/conversations/context.py +303 -0
  82. ksadk/conversations/model_context.py +360 -0
  83. ksadk/conversations/model_options.py +136 -0
  84. ksadk/conversations/normalize.py +446 -0
  85. ksadk/conversations/reasoning_markup.py +91 -0
  86. ksadk/conversations/run_kinds.py +61 -0
  87. ksadk/conversations/run_status.py +53 -0
  88. ksadk/conversations/runtime.py +5208 -0
  89. ksadk/conversations/semantic_summary.py +359 -0
  90. ksadk/conversations/session_title.py +254 -0
  91. ksadk/deployment/__init__.py +83 -0
  92. ksadk/deployment/agent_access.py +226 -0
  93. ksadk/deployment/base.py +229 -0
  94. ksadk/deployment/manager.py +332 -0
  95. ksadk/deployment/providers/__init__.py +10 -0
  96. ksadk/deployment/providers/serverless.py +1105 -0
  97. ksadk/deployment/registry.py +120 -0
  98. ksadk/deployment/state.py +78 -0
  99. ksadk/deployment/ui_config.py +21 -0
  100. ksadk/detection/__init__.py +7 -0
  101. ksadk/detection/detector.py +431 -0
  102. ksadk/detection/mcp_detector.py +250 -0
  103. ksadk/hermes_terminal.py +467 -0
  104. ksadk/identity/__init__.py +17 -0
  105. ksadk/identity/resolver.py +385 -0
  106. ksadk/knowledge_base/__init__.py +62 -0
  107. ksadk/knowledge_base/adk_tool.py +47 -0
  108. ksadk/knowledge_base/client.py +297 -0
  109. ksadk/knowledge_base/langchain_tool.py +55 -0
  110. ksadk/knowledge_base/service.py +66 -0
  111. ksadk/knowledge_base/tool.py +50 -0
  112. ksadk/markdown.py +169 -0
  113. ksadk/mcp_runtime/__init__.py +231 -0
  114. ksadk/memory/__init__.py +57 -0
  115. ksadk/memory/adk/__init__.py +51 -0
  116. ksadk/memory/adk/backends/__init__.py +5 -0
  117. ksadk/memory/adk/backends/base_ltm_backend.py +52 -0
  118. ksadk/memory/adk/backends/http_ltm_backend.py +183 -0
  119. ksadk/memory/adk/backends/inmemory_ltm_backend.py +96 -0
  120. ksadk/memory/adk/backends/sdk_ltm_backend.py +456 -0
  121. ksadk/memory/adk/long_term_memory.py +273 -0
  122. ksadk/memory/adk/short_term_memory.py +289 -0
  123. ksadk/memory/adk_tool.py +31 -0
  124. ksadk/memory/backends/__init__.py +6 -0
  125. ksadk/memory/backends/base.py +103 -0
  126. ksadk/memory/backends/memory.py +112 -0
  127. ksadk/memory/backends/redis.py +146 -0
  128. ksadk/memory/langchain_tool.py +39 -0
  129. ksadk/memory/ltm_backend_factory.py +24 -0
  130. ksadk/memory/manager.py +215 -0
  131. ksadk/memory/service.py +172 -0
  132. ksadk/memory/tool.py +96 -0
  133. ksadk/model_policy.py +223 -0
  134. ksadk/openclaw_gateway.py +378 -0
  135. ksadk/runners/__init__.py +8 -0
  136. ksadk/runners/adk_runner.py +1135 -0
  137. ksadk/runners/base_runner.py +305 -0
  138. ksadk/runners/deepagents_runner.py +13 -0
  139. ksadk/runners/factory.py +73 -0
  140. ksadk/runners/langchain_runner.py +539 -0
  141. ksadk/runners/langgraph_runner.py +852 -0
  142. ksadk/runners/patch_langchain.py +187 -0
  143. ksadk/runners/remote_runner.py +667 -0
  144. ksadk/runners/usage_accumulator.py +38 -0
  145. ksadk/runners/utils/__init__.py +19 -0
  146. ksadk/runners/utils/langfuse.py +230 -0
  147. ksadk/runners/utils/loader.py +62 -0
  148. ksadk/runtime_context.py +166 -0
  149. ksadk/runtime_state.py +25 -0
  150. ksadk/sandbox/__init__.py +28 -0
  151. ksadk/sandbox/backends/__init__.py +9 -0
  152. ksadk/sandbox/backends/e2b.py +154 -0
  153. ksadk/sandbox/backends/local_process.py +131 -0
  154. ksadk/sandbox/base.py +101 -0
  155. ksadk/sandbox/factory.py +53 -0
  156. ksadk/sandbox/registry.py +187 -0
  157. ksadk/server/__init__.py +7 -0
  158. ksadk/server/api_models.py +73 -0
  159. ksadk/server/app.py +3789 -0
  160. ksadk/server/static/assets/ArtifactsPanel-C0meuOdi.js +1 -0
  161. ksadk/server/static/assets/CodeBlock-BbI4HPtJ.js +9 -0
  162. ksadk/server/static/assets/KaTeX_AMS-Regular-BQhdFMY1.woff2 +0 -0
  163. ksadk/server/static/assets/KaTeX_AMS-Regular-DMm9YOAa.woff +0 -0
  164. ksadk/server/static/assets/KaTeX_AMS-Regular-DRggAlZN.ttf +0 -0
  165. ksadk/server/static/assets/KaTeX_Caligraphic-Bold-ATXxdsX0.ttf +0 -0
  166. ksadk/server/static/assets/KaTeX_Caligraphic-Bold-BEiXGLvX.woff +0 -0
  167. ksadk/server/static/assets/KaTeX_Caligraphic-Bold-Dq_IR9rO.woff2 +0 -0
  168. ksadk/server/static/assets/KaTeX_Caligraphic-Regular-CTRA-rTL.woff +0 -0
  169. ksadk/server/static/assets/KaTeX_Caligraphic-Regular-Di6jR-x-.woff2 +0 -0
  170. ksadk/server/static/assets/KaTeX_Caligraphic-Regular-wX97UBjC.ttf +0 -0
  171. ksadk/server/static/assets/KaTeX_Fraktur-Bold-BdnERNNW.ttf +0 -0
  172. ksadk/server/static/assets/KaTeX_Fraktur-Bold-BsDP51OF.woff +0 -0
  173. ksadk/server/static/assets/KaTeX_Fraktur-Bold-CL6g_b3V.woff2 +0 -0
  174. ksadk/server/static/assets/KaTeX_Fraktur-Regular-CB_wures.ttf +0 -0
  175. ksadk/server/static/assets/KaTeX_Fraktur-Regular-CTYiF6lA.woff2 +0 -0
  176. ksadk/server/static/assets/KaTeX_Fraktur-Regular-Dxdc4cR9.woff +0 -0
  177. ksadk/server/static/assets/KaTeX_Main-Bold-Cx986IdX.woff2 +0 -0
  178. ksadk/server/static/assets/KaTeX_Main-Bold-Jm3AIy58.woff +0 -0
  179. ksadk/server/static/assets/KaTeX_Main-Bold-waoOVXN0.ttf +0 -0
  180. ksadk/server/static/assets/KaTeX_Main-BoldItalic-DxDJ3AOS.woff2 +0 -0
  181. ksadk/server/static/assets/KaTeX_Main-BoldItalic-DzxPMmG6.ttf +0 -0
  182. ksadk/server/static/assets/KaTeX_Main-BoldItalic-SpSLRI95.woff +0 -0
  183. ksadk/server/static/assets/KaTeX_Main-Italic-3WenGoN9.ttf +0 -0
  184. ksadk/server/static/assets/KaTeX_Main-Italic-BMLOBm91.woff +0 -0
  185. ksadk/server/static/assets/KaTeX_Main-Italic-NWA7e6Wa.woff2 +0 -0
  186. ksadk/server/static/assets/KaTeX_Main-Regular-B22Nviop.woff2 +0 -0
  187. ksadk/server/static/assets/KaTeX_Main-Regular-Dr94JaBh.woff +0 -0
  188. ksadk/server/static/assets/KaTeX_Main-Regular-ypZvNtVU.ttf +0 -0
  189. ksadk/server/static/assets/KaTeX_Math-BoldItalic-B3XSjfu4.ttf +0 -0
  190. ksadk/server/static/assets/KaTeX_Math-BoldItalic-CZnvNsCZ.woff2 +0 -0
  191. ksadk/server/static/assets/KaTeX_Math-BoldItalic-iY-2wyZ7.woff +0 -0
  192. ksadk/server/static/assets/KaTeX_Math-Italic-DA0__PXp.woff +0 -0
  193. ksadk/server/static/assets/KaTeX_Math-Italic-flOr_0UB.ttf +0 -0
  194. ksadk/server/static/assets/KaTeX_Math-Italic-t53AETM-.woff2 +0 -0
  195. ksadk/server/static/assets/KaTeX_SansSerif-Bold-CFMepnvq.ttf +0 -0
  196. ksadk/server/static/assets/KaTeX_SansSerif-Bold-D1sUS0GD.woff2 +0 -0
  197. ksadk/server/static/assets/KaTeX_SansSerif-Bold-DbIhKOiC.woff +0 -0
  198. ksadk/server/static/assets/KaTeX_SansSerif-Italic-C3H0VqGB.woff2 +0 -0
  199. ksadk/server/static/assets/KaTeX_SansSerif-Italic-DN2j7dab.woff +0 -0
  200. ksadk/server/static/assets/KaTeX_SansSerif-Italic-YYjJ1zSn.ttf +0 -0
  201. ksadk/server/static/assets/KaTeX_SansSerif-Regular-BNo7hRIc.ttf +0 -0
  202. ksadk/server/static/assets/KaTeX_SansSerif-Regular-CS6fqUqJ.woff +0 -0
  203. ksadk/server/static/assets/KaTeX_SansSerif-Regular-DDBCnlJ7.woff2 +0 -0
  204. ksadk/server/static/assets/KaTeX_Script-Regular-C5JkGWo-.ttf +0 -0
  205. ksadk/server/static/assets/KaTeX_Script-Regular-D3wIWfF6.woff2 +0 -0
  206. ksadk/server/static/assets/KaTeX_Script-Regular-D5yQViql.woff +0 -0
  207. ksadk/server/static/assets/KaTeX_Size1-Regular-C195tn64.woff +0 -0
  208. ksadk/server/static/assets/KaTeX_Size1-Regular-Dbsnue_I.ttf +0 -0
  209. ksadk/server/static/assets/KaTeX_Size1-Regular-mCD8mA8B.woff2 +0 -0
  210. ksadk/server/static/assets/KaTeX_Size2-Regular-B7gKUWhC.ttf +0 -0
  211. ksadk/server/static/assets/KaTeX_Size2-Regular-Dy4dx90m.woff2 +0 -0
  212. ksadk/server/static/assets/KaTeX_Size2-Regular-oD1tc_U0.woff +0 -0
  213. ksadk/server/static/assets/KaTeX_Size3-Regular-CTq5MqoE.woff +0 -0
  214. ksadk/server/static/assets/KaTeX_Size3-Regular-DgpXs0kz.ttf +0 -0
  215. ksadk/server/static/assets/KaTeX_Size4-Regular-BF-4gkZK.woff +0 -0
  216. ksadk/server/static/assets/KaTeX_Size4-Regular-DWFBv043.ttf +0 -0
  217. ksadk/server/static/assets/KaTeX_Size4-Regular-Dl5lxZxV.woff2 +0 -0
  218. ksadk/server/static/assets/KaTeX_Typewriter-Regular-C0xS9mPB.woff +0 -0
  219. ksadk/server/static/assets/KaTeX_Typewriter-Regular-CO6r4hn1.woff2 +0 -0
  220. ksadk/server/static/assets/KaTeX_Typewriter-Regular-D3Ib7_Hf.ttf +0 -0
  221. ksadk/server/static/assets/MathMessageMarkdown-DMLQYoLp.js +8 -0
  222. ksadk/server/static/assets/MathMessageMarkdown-DeYh8QPr.css +1 -0
  223. ksadk/server/static/assets/MermaidBlock-DCR8WZ17.js +303 -0
  224. ksadk/server/static/assets/NativeTerminalPanel-CHOd7Rch.css +1 -0
  225. ksadk/server/static/assets/NativeTerminalPanel-CKUvWhUz.js +1 -0
  226. ksadk/server/static/assets/addon-fit-DthTIhi3.js +1 -0
  227. ksadk/server/static/assets/apl-CnwPGSsG.js +1 -0
  228. ksadk/server/static/assets/arc-bj2rZnP5.js +1 -0
  229. ksadk/server/static/assets/architecture-7EHR7CIX-Cr6Xz1_c.js +1 -0
  230. ksadk/server/static/assets/architectureDiagram-3BPJPVTR-2u1ltDIj.js +36 -0
  231. ksadk/server/static/assets/asciiarmor-qTkVPQu6.js +1 -0
  232. ksadk/server/static/assets/asn1-Dr8qZg38.js +1 -0
  233. ksadk/server/static/assets/asterisk-Bja0s6e1.js +1 -0
  234. ksadk/server/static/assets/blockDiagram-GPEHLZMM-D6fvdK20.js +132 -0
  235. ksadk/server/static/assets/brainfuck-D5EjA2JK.js +1 -0
  236. ksadk/server/static/assets/c4Diagram-AAUBKEIU-BK82L5n5.js +10 -0
  237. ksadk/server/static/assets/channel-BSSOwFIb.js +1 -0
  238. ksadk/server/static/assets/chunk-2J33WTMH-DLVdkeyQ.js +1 -0
  239. ksadk/server/static/assets/chunk-4BX2VUAB-BbwsYcbW.js +1 -0
  240. ksadk/server/static/assets/chunk-55IACEB6-DOairxzw.js +1 -0
  241. ksadk/server/static/assets/chunk-727SXJPM-hCO487gs.js +206 -0
  242. ksadk/server/static/assets/chunk-AQP2D5EJ-XU8vDOuG.js +231 -0
  243. ksadk/server/static/assets/chunk-FMBD7UC4-PrapyfMu.js +15 -0
  244. ksadk/server/static/assets/chunk-ND2GUHAM-CboKhTZ3.js +1 -0
  245. ksadk/server/static/assets/chunk-QZHKN3VN-XXpdiwUL.js +1 -0
  246. ksadk/server/static/assets/classDiagram-4FO5ZUOK-C5HvGiyK.js +1 -0
  247. ksadk/server/static/assets/classDiagram-v2-Q7XG4LA2-C5HvGiyK.js +1 -0
  248. ksadk/server/static/assets/clike-DHH8Ad3s.js +1 -0
  249. ksadk/server/static/assets/clojure-BflJGmDX.js +1 -0
  250. ksadk/server/static/assets/cmake-CyVbuzPu.js +1 -0
  251. ksadk/server/static/assets/cobol-B_OZ4V-R.js +1 -0
  252. ksadk/server/static/assets/coffeescript-B2pKbFk8.js +1 -0
  253. ksadk/server/static/assets/commonlisp-CcllspGY.js +1 -0
  254. ksadk/server/static/assets/cose-bilkent-S5V4N54A-_N8bJ-EU.js +1 -0
  255. ksadk/server/static/assets/crystal-M5-qzICs.js +1 -0
  256. ksadk/server/static/assets/css-CYpP4FRV.js +1 -0
  257. ksadk/server/static/assets/cypher-p9eYesGn.js +1 -0
  258. ksadk/server/static/assets/cytoscape.esm-DelgaX4f.js +321 -0
  259. ksadk/server/static/assets/d-BhMjBjQP.js +1 -0
  260. ksadk/server/static/assets/dagre-BM42HDAG-FoDlo5J2.js +4 -0
  261. ksadk/server/static/assets/dagre-Bx709z4p.js +1 -0
  262. ksadk/server/static/assets/defaultLocale-C8Fc0cco.js +1 -0
  263. ksadk/server/static/assets/diagram-2AECGRRQ-BBp6ebBw.js +43 -0
  264. ksadk/server/static/assets/diagram-5GNKFQAL-CqOvG1PR.js +10 -0
  265. ksadk/server/static/assets/diagram-KO2AKTUF-O9T3t6ba.js +3 -0
  266. ksadk/server/static/assets/diagram-LMA3HP47-CGG8ekBO.js +24 -0
  267. ksadk/server/static/assets/diagram-OG6HWLK6-4BmH1EEg.js +24 -0
  268. ksadk/server/static/assets/diff-ChtP43wD.js +1 -0
  269. ksadk/server/static/assets/dist-6kSZvCZh.js +1 -0
  270. ksadk/server/static/assets/dist-B67uF2uK.js +1 -0
  271. ksadk/server/static/assets/dist-BMKM66B4.js +1 -0
  272. ksadk/server/static/assets/dist-BVzcWa6D.js +1 -0
  273. ksadk/server/static/assets/dist-Bk1l05Ni.js +1 -0
  274. ksadk/server/static/assets/dist-BkJjNih3.js +1 -0
  275. ksadk/server/static/assets/dist-BmuTWcm7.js +9 -0
  276. ksadk/server/static/assets/dist-C2DKRFVK.js +1 -0
  277. ksadk/server/static/assets/dist-CWiTDN_V.js +6 -0
  278. ksadk/server/static/assets/dist-CZ6C3x8B.js +23 -0
  279. ksadk/server/static/assets/dist-CiZHB6ZW.js +1 -0
  280. ksadk/server/static/assets/dist-Cp1_jKwf.js +1 -0
  281. ksadk/server/static/assets/dist-Cwhk4lwI.js +2 -0
  282. ksadk/server/static/assets/dist-D5JGcxBx.js +11 -0
  283. ksadk/server/static/assets/dist-D99wf6_X.js +1 -0
  284. ksadk/server/static/assets/dist-DCpZrjaK.js +1 -0
  285. ksadk/server/static/assets/dist-DI-oVAXw.js +1 -0
  286. ksadk/server/static/assets/dist-DLMjL01k.js +1 -0
  287. ksadk/server/static/assets/dist-DLeM1OCK.js +1 -0
  288. ksadk/server/static/assets/dist-DM0rEQPk.js +1 -0
  289. ksadk/server/static/assets/dist-DbaH3p5h.js +1 -0
  290. ksadk/server/static/assets/dist-S4klkK5W.js +1 -0
  291. ksadk/server/static/assets/dockerfile-BLkNEvjs.js +1 -0
  292. ksadk/server/static/assets/dtd-DTF72YNO.js +1 -0
  293. ksadk/server/static/assets/dylan-C6jEEEk-.js +1 -0
  294. ksadk/server/static/assets/ebnf-D4c0_ac3.js +1 -0
  295. ksadk/server/static/assets/ecl-BSZaIHnp.js +1 -0
  296. ksadk/server/static/assets/eiffel-BEjRio4Q.js +1 -0
  297. ksadk/server/static/assets/elm-Cshzl8qu.js +1 -0
  298. ksadk/server/static/assets/erDiagram-TEJ5UH35-oJhaci7S.js +85 -0
  299. ksadk/server/static/assets/erlang-DaB2Rkuy.js +1 -0
  300. ksadk/server/static/assets/eventmodeling-FCH6USID-CIgwHJLL.js +1 -0
  301. ksadk/server/static/assets/factor-D7LVTn2l.js +1 -0
  302. ksadk/server/static/assets/fcl-ClOhbFR7.js +1 -0
  303. ksadk/server/static/assets/flowDiagram-I6XJVG4X-DtTmUan-.js +162 -0
  304. ksadk/server/static/assets/forth-Cezjo90N.js +1 -0
  305. ksadk/server/static/assets/fortran-Bt6PBEDR.js +1 -0
  306. ksadk/server/static/assets/ganttDiagram-6RSMTGT7-BSsb_eij.js +292 -0
  307. ksadk/server/static/assets/gas-BHEdbvp9.js +1 -0
  308. ksadk/server/static/assets/gherkin-oBAE_ms0.js +1 -0
  309. ksadk/server/static/assets/gitGraph-WXDBUCRP-BVAJ7uo0.js +1 -0
  310. ksadk/server/static/assets/gitGraphDiagram-PVQCEYII-BR5s6Pws.js +106 -0
  311. ksadk/server/static/assets/graphlib-B8gBHxth.js +1 -0
  312. ksadk/server/static/assets/groovy-BC3IOsC8.js +1 -0
  313. ksadk/server/static/assets/haskell-BRsoo5mP.js +1 -0
  314. ksadk/server/static/assets/haxe-DIz0ZZqd.js +1 -0
  315. ksadk/server/static/assets/http-CLVgA2GD.js +1 -0
  316. ksadk/server/static/assets/idl-BUZw3wgd.js +1 -0
  317. ksadk/server/static/assets/index-BH7-pC0B.js +165 -0
  318. ksadk/server/static/assets/index-DAURbCsP.css +1 -0
  319. ksadk/server/static/assets/info-J43DQDTF-MT80V4ge.js +1 -0
  320. ksadk/server/static/assets/infoDiagram-5YYISTIA-DYPc5cvh.js +2 -0
  321. ksadk/server/static/assets/init-D6jRqBbL.js +1 -0
  322. ksadk/server/static/assets/ishikawaDiagram-YF4QCWOH-MoBdALDg.js +70 -0
  323. ksadk/server/static/assets/javascript-9Tg8ixDm.js +1 -0
  324. ksadk/server/static/assets/journeyDiagram-JHISSGLW-DgLiQT8l.js +139 -0
  325. ksadk/server/static/assets/julia-CQfgDRfP.js +1 -0
  326. ksadk/server/static/assets/kanban-definition-UN3LZRKU-CsFx112F.js +89 -0
  327. ksadk/server/static/assets/katex-DRsiwpM2.js +265 -0
  328. ksadk/server/static/assets/linear-TNRQ5Orv.js +1 -0
  329. ksadk/server/static/assets/livescript-BXxG0Yva.js +1 -0
  330. ksadk/server/static/assets/lua-CiA1ziua.js +1 -0
  331. ksadk/server/static/assets/mathematica-u8YMmbU0.js +1 -0
  332. ksadk/server/static/assets/mbox-BEMVcqjs.js +1 -0
  333. ksadk/server/static/assets/mermaid-parser.core-D2eMVOgo.js +161 -0
  334. ksadk/server/static/assets/mindmap-definition-RKZ34NQL-BtByYFhL.js +96 -0
  335. ksadk/server/static/assets/mirc-C9zpzAZU.js +1 -0
  336. ksadk/server/static/assets/mllike-B45xgp2S.js +1 -0
  337. ksadk/server/static/assets/modelica-CqHI_q-D.js +1 -0
  338. ksadk/server/static/assets/mscgen-qgSLujhx.js +1 -0
  339. ksadk/server/static/assets/mumps-CW_TBmxz.js +1 -0
  340. ksadk/server/static/assets/nginx-BMaDbqW3.js +1 -0
  341. ksadk/server/static/assets/nsis-AQ_alPln.js +1 -0
  342. ksadk/server/static/assets/ntriples-d28e9m0E.js +1 -0
  343. ksadk/server/static/assets/octave-D2Q8cUp1.js +1 -0
  344. ksadk/server/static/assets/ordinal-hYBb2elL.js +1 -0
  345. ksadk/server/static/assets/oz-BwTct_5T.js +1 -0
  346. ksadk/server/static/assets/packet-YPE3B663-BLKhbXZB.js +1 -0
  347. ksadk/server/static/assets/pascal-Dp_KdFgX.js +1 -0
  348. ksadk/server/static/assets/perl-CdEHsPfU.js +1 -0
  349. ksadk/server/static/assets/pie-LRSECV5Y-DFOikjSY.js +1 -0
  350. ksadk/server/static/assets/pieDiagram-4H26LBE5-DPnuCB8c.js +30 -0
  351. ksadk/server/static/assets/pig-AF4Hwhju.js +1 -0
  352. ksadk/server/static/assets/powershell-CzG71I4L.js +1 -0
  353. ksadk/server/static/assets/properties-C357ku5U.js +1 -0
  354. ksadk/server/static/assets/protobuf-D1ij_kNL.js +1 -0
  355. ksadk/server/static/assets/pug-Bugr-47h.js +1 -0
  356. ksadk/server/static/assets/puppet-B4hC2X4m.js +1 -0
  357. ksadk/server/static/assets/python-BqYw9LYJ.js +1 -0
  358. ksadk/server/static/assets/q-B9NhS7L_.js +1 -0
  359. ksadk/server/static/assets/quadrantDiagram-W4KKPZXB-miFpCPv4.js +7 -0
  360. ksadk/server/static/assets/r-DADKenSm.js +1 -0
  361. ksadk/server/static/assets/radar-GUYGQ44K-095b1Ikw.js +1 -0
  362. ksadk/server/static/assets/requirementDiagram-4Y6WPE33-mjB_yYkW.js +84 -0
  363. ksadk/server/static/assets/rpm-gpDK5sbt.js +1 -0
  364. ksadk/server/static/assets/ruby-DsYpTuWg.js +1 -0
  365. ksadk/server/static/assets/sankeyDiagram-5OEKKPKP-D7hSlZZZ.js +40 -0
  366. ksadk/server/static/assets/sas-C2OyD2Y6.js +1 -0
  367. ksadk/server/static/assets/scheme-CyDdOh7e.js +1 -0
  368. ksadk/server/static/assets/sequenceDiagram-3UESZ5HK-D9Cx6hC3.js +162 -0
  369. ksadk/server/static/assets/shell-Du5Qg9im.js +1 -0
  370. ksadk/server/static/assets/sieve-BAxa3IjF.js +1 -0
  371. ksadk/server/static/assets/simple-mode-DRpGK0lJ.js +1 -0
  372. ksadk/server/static/assets/smalltalk-BLp5-jwC.js +1 -0
  373. ksadk/server/static/assets/solr-BBopId9w.js +1 -0
  374. ksadk/server/static/assets/sparql-Dz-mlCAC.js +1 -0
  375. ksadk/server/static/assets/spreadsheet-CTIncYxj.js +1 -0
  376. ksadk/server/static/assets/sql-DcCJ9jop.js +1 -0
  377. ksadk/server/static/assets/stateDiagram-AJRCARHV-D_zrg47o.js +1 -0
  378. ksadk/server/static/assets/stateDiagram-v2-BHNVJYJU-J9kCb0nC.js +1 -0
  379. ksadk/server/static/assets/stex-sDrdk2BW.js +1 -0
  380. ksadk/server/static/assets/stylus-DLLZ8dgm.js +1 -0
  381. ksadk/server/static/assets/swift-DKB6_1j6.js +1 -0
  382. ksadk/server/static/assets/tcl-BGfruO1u.js +1 -0
  383. ksadk/server/static/assets/textile-DWBqthVk.js +1 -0
  384. ksadk/server/static/assets/tiddlywiki-VlUiK86J.js +1 -0
  385. ksadk/server/static/assets/tiki-CxVlf5KZ.js +1 -0
  386. ksadk/server/static/assets/timeline-definition-PNZ67QCA-CwSec0Wa.js +120 -0
  387. ksadk/server/static/assets/toml-LvoKBwCs.js +1 -0
  388. ksadk/server/static/assets/treeView-BLDUP644-yinfJEY6.js +1 -0
  389. ksadk/server/static/assets/treemap-LRROVOQU-DosUqN1Q.js +1 -0
  390. ksadk/server/static/assets/troff-C2dAgh7P.js +1 -0
  391. ksadk/server/static/assets/ttcn-BePYh-hG.js +1 -0
  392. ksadk/server/static/assets/ttcn-cfg-CY0aot7Q.js +1 -0
  393. ksadk/server/static/assets/turtle-BDLWE2cD.js +1 -0
  394. ksadk/server/static/assets/vb-BthdM_4N.js +1 -0
  395. ksadk/server/static/assets/vbscript-D9f6rSsU.js +1 -0
  396. ksadk/server/static/assets/velocity-CqftRsjg.js +1 -0
  397. ksadk/server/static/assets/vennDiagram-CIIHVFJN-agCVobiF.js +34 -0
  398. ksadk/server/static/assets/verilog-D-x6ne0Z.js +1 -0
  399. ksadk/server/static/assets/vhdl-CMrOq2q1.js +1 -0
  400. ksadk/server/static/assets/wardley-L42UT6IY-Bvp7-5uH.js +1 -0
  401. ksadk/server/static/assets/wardleyDiagram-YWT4CUSO-TmrlhWNt.js +78 -0
  402. ksadk/server/static/assets/webidl-D5jiJvOU.js +1 -0
  403. ksadk/server/static/assets/xquery-fj_R-kMw.js +1 -0
  404. ksadk/server/static/assets/xterm-DooSxjI5.js +36 -0
  405. ksadk/server/static/assets/xychartDiagram-2RQKCTM6-DV71V-ah.js +7 -0
  406. ksadk/server/static/assets/yacas-CXXgtw0p.js +1 -0
  407. ksadk/server/static/assets/z80-CL1naaMV.js +1 -0
  408. ksadk/server/static/favicon.svg +1 -0
  409. ksadk/server/static/icons.svg +24 -0
  410. ksadk/server/static/index.html +14 -0
  411. ksadk/server/terminal_sessions.py +551 -0
  412. ksadk/sessions/__init__.py +283 -0
  413. ksadk/sessions/base.py +354 -0
  414. ksadk/sessions/continuity.py +313 -0
  415. ksadk/sessions/errors.py +7 -0
  416. ksadk/sessions/in_memory.py +273 -0
  417. ksadk/sessions/local_service.py +949 -0
  418. ksadk/sessions/postgres_service.py +838 -0
  419. ksadk/sessions/sqlite_service.py +13 -0
  420. ksadk/skills/__init__.py +9 -0
  421. ksadk/skills/loader.py +46 -0
  422. ksadk/skills/models.py +120 -0
  423. ksadk/skills/package_store.py +104 -0
  424. ksadk/skills/runtime/__init__.py +17 -0
  425. ksadk/skills/runtime/agent.py +183 -0
  426. ksadk/skills/runtime/artifacts.py +39 -0
  427. ksadk/skills/runtime/backends/__init__.py +1 -0
  428. ksadk/skills/runtime/backends/disabled.py +8 -0
  429. ksadk/skills/runtime/backends/e2b.py +168 -0
  430. ksadk/skills/runtime/backends/local.py +95 -0
  431. ksadk/skills/runtime/base.py +103 -0
  432. ksadk/skills/runtime/executor.py +219 -0
  433. ksadk/skills/runtime/factory.py +37 -0
  434. ksadk/skills/runtime/loader.py +131 -0
  435. ksadk/skills/runtime/registry.py +150 -0
  436. ksadk/skills/runtime/request.py +67 -0
  437. ksadk/skills/service_client.py +239 -0
  438. ksadk/skills/service_env.py +58 -0
  439. ksadk/skills/tool_defs.py +221 -0
  440. ksadk/terminal_client.py +69 -0
  441. ksadk/terminal_exec_policy.py +229 -0
  442. ksadk/tools/__init__.py +17 -0
  443. ksadk/tools/gateway.py +230 -0
  444. ksadk/tools/result_budget.py +154 -0
  445. ksadk/toolsets/__init__.py +852 -0
  446. ksadk/toolsets/_langchain.py +11 -0
  447. ksadk/toolsets/platform.py +93 -0
  448. ksadk/toolsets/sandbox.py +310 -0
  449. ksadk/toolsets/skills.py +217 -0
  450. ksadk/toolsets/web.py +266 -0
  451. ksadk/toolsets/workspace.py +878 -0
  452. ksadk/toolsets/workspace_state.py +44 -0
  453. ksadk/tracing/__init__.py +37 -0
  454. ksadk/tracing/exporters/__init__.py +1 -0
  455. ksadk/tracing/exporters/inmemory_exporter.py +116 -0
  456. ksadk/tracing/exporters/langfuse_exporter.py +445 -0
  457. ksadk/tracing/setup.py +829 -0
  458. ksadk/tracing/span_utils.py +114 -0
  459. ksadk/tui/__init__.py +12 -0
  460. ksadk/tui/app.py +400 -0
  461. ksadk/tui/clipboard.py +100 -0
  462. ksadk/tui/widgets/__init__.py +22 -0
  463. ksadk/tui/widgets/assistant.py +89 -0
  464. ksadk/tui/widgets/base.py +54 -0
  465. ksadk/tui/widgets/chat_input.py +246 -0
  466. ksadk/tui/widgets/history.py +156 -0
  467. ksadk/tui/widgets/system.py +87 -0
  468. ksadk/tui/widgets/thinking.py +110 -0
  469. ksadk/tui/widgets/tool_call.py +161 -0
  470. ksadk/tui/widgets/user.py +37 -0
  471. ksadk/ui_config.py +168 -0
  472. ksadk/version.py +4 -0
  473. ksadk_runtime_common/__init__.py +20 -0
  474. ksadk_runtime_common/memory_backend/__init__.py +29 -0
  475. ksadk_runtime_common/memory_backend/manifest.py +79 -0
  476. ksadk_runtime_common/memory_backend/providers/__init__.py +6 -0
  477. ksadk_runtime_common/memory_backend/providers/lancedb.py +151 -0
  478. ksadk_runtime_common/memory_backend/providers/mem0.py +74 -0
  479. ksadk_runtime_common/memory_backend/registry.py +56 -0
  480. ksadk_runtime_common/memory_backend/render.py +71 -0
  481. ksadk_runtime_common/schemas/memory_backend_manifest.schema.json +148 -0
  482. ksadk_runtime_common/workspace_files/__init__.py +29 -0
  483. ksadk_runtime_common/workspace_files/bootstrap.py +56 -0
  484. ksadk_runtime_common/workspace_files/constants.py +9 -0
  485. ksadk_runtime_common/workspace_files/path_utils.py +71 -0
  486. ksadk_runtime_common/workspace_files/preview.py +96 -0
  487. ksadk_runtime_common/workspace_files/router.py +254 -0
  488. agentengine_sdk_python-0.6.2.dist-info/METADATA +0 -46
  489. agentengine_sdk_python-0.6.2.dist-info/RECORD +0 -4
  490. agentengine_sdk_python-0.6.2.dist-info/top_level.txt +0 -1
@@ -0,0 +1,704 @@
1
+ """
2
+ agentengine deploy - 部署 Agent 到云端
3
+
4
+ 支持多种部署目标:
5
+ - serverless: 金山云 Serverless 计算引擎 (默认)
6
+ - docker: 本地 Docker 容器
7
+ - k8s: Kubernetes 集群
8
+ """
9
+
10
+ import os
11
+ import click
12
+ import asyncio
13
+ from pathlib import Path
14
+ from ksadk.api.client import DryRunExit
15
+ from ksadk.cli.env_options import env_options, resolve_explicit_env_vars
16
+ from ksadk.cli.storage import build_storage_config
17
+ from ksadk.common.constants import (
18
+ get_ks3_endpoints,
19
+ DEFAULT_SERVERLESS_ENDPOINT,
20
+ )
21
+ from ksadk.cli.dry_run import effective_dry_run, run_async_with_dry_run
22
+ from ksadk.cli.error_utils import cli_error_from_exception, is_debug_mode_enabled, remote_error, usage_error, validation_error
23
+ from ksadk.cli.network_options import (
24
+ apply_network_cli_overrides,
25
+ apply_network_config as _apply_network_config_shared,
26
+ network_cli_kwargs,
27
+ network_options,
28
+ resolve_deploy_target_network,
29
+ validate_deploy_target_network,
30
+ )
31
+ from ksadk.cli.workflow_common import (
32
+ build_workflow_local_plan,
33
+ clear_build_metadata,
34
+ emit_no_cache_hint,
35
+ load_cached_artifact_reference,
36
+ plan_artifact_build,
37
+ print_agent_next_steps,
38
+ print_workflow_header,
39
+ render_workflow_dry_run,
40
+ render_workflow_result,
41
+ resolve_artifact_build_plan,
42
+ should_build_artifact as _workflow_should_build_artifact,
43
+ )
44
+ from ksadk.deployment.ui_config import SUPPORTED_UI_PROFILES, extract_ui_state
45
+ from ksadk.cli.ui import (
46
+ capture_standard_output,
47
+ get_console,
48
+ is_json_output,
49
+ new_table,
50
+ output_option as cli_output_option,
51
+ print_error,
52
+ print_info,
53
+ print_kv,
54
+ print_rule,
55
+ print_success,
56
+ print_warn,
57
+ )
58
+
59
+ console = get_console()
60
+
61
+
62
+ @click.command(context_settings=dict(help_option_names=["-h", "--help"]))
63
+ @click.argument("agent_dir", default=".", type=click.Path(exists=True))
64
+ @click.option(
65
+ "--target",
66
+ "-t",
67
+ type=click.Choice(["serverless", "kcf", "kce"]),
68
+ default="serverless",
69
+ help="部署目标 (default: serverless)",
70
+ )
71
+ @click.option("--name", "-n", help="部署名称")
72
+ @click.option("--region", "-r", default="cn-beijing-6", envvar="KSYUN_REGION", help="区域 (default: cn-beijing-6)")
73
+ @click.option("--account-id", envvar="KSYUN_ACCOUNT_ID", help="金山云账号 ID(可选;未设置时从 AK/SK 反查)")
74
+ @click.option(
75
+ "--artifact-type",
76
+ type=click.Choice(["Code", "Container"]),
77
+ default="Code",
78
+ help="Serverless 部署模式 (default: Code)",
79
+ )
80
+ @click.option("--namespace", default="default", help="K8s 命名空间")
81
+ @click.option("--port", "-p", default=8000, help="服务端口 (default: 8000)")
82
+ @click.option("--registry", help="镜像仓库地址 (k8s/serverless Container 模式)")
83
+ @click.option("--ks3-path", help="KS3 代码包路径 (Serverless Code 模式)")
84
+ @click.option("--ks3-bucket", help="KS3 bucket 名称 (Serverless Code 模式, 默认: agentengine-{region})")
85
+ @click.option("--image", help="Docker 镜像地址 (Container 模式)")
86
+ @click.option("--ui-profile", type=click.Choice(SUPPORTED_UI_PROFILES), help="Dashboard UI 类型")
87
+ @click.option("--ui-path", help="Dashboard UI 路径 (例如 /)")
88
+ @click.option("--ui-url", help="完整 Dashboard URL(自研前端)")
89
+ @click.option("--storage-size-gi", type=int, default=20, show_default=True, help="PVC 容量(Gi)")
90
+ @click.option(
91
+ "--storage-mount-path",
92
+ default=None,
93
+ help="PVC 挂载目录(hermes/openclaw 默认按框架推导;adk/langgraph 等其他框架默认不挂盘,需显式指定)",
94
+ )
95
+ @click.option("--no-storage", is_flag=True, help="禁用默认 PVC 挂载")
96
+ @network_options
97
+ @env_options
98
+ @click.option(
99
+ "--observability/--no-observability", default=True, help="是否启用可观测性 (默认开启)"
100
+ )
101
+ @click.option("--push", is_flag=True, help="构建后推送镜像")
102
+ @click.option("--no-cache", is_flag=True, help="强制重新构建,不使用缓存")
103
+ @click.option("--repackage", is_flag=True, help="Code 模式复用依赖缓存,但强制重新打包当前代码/runtime")
104
+ @click.option("--no-version", is_flag=True, help="部署成功后不自动创建版本快照")
105
+ @click.option("--auto-rollback", is_flag=True, help="部署失败时自动回滚到上一版本")
106
+ @click.option("--dry-run", is_flag=True, help="只生成配置,打印 curl 请求,不执行部署")
107
+ @click.option("--list-providers", "list_providers", is_flag=True, help="列出可用的部署目标")
108
+ @cli_output_option()
109
+ def deploy(
110
+ agent_dir: str,
111
+ target: str,
112
+ name: str,
113
+ region: str,
114
+ account_id: str,
115
+ artifact_type: str,
116
+ namespace: str,
117
+ port: int,
118
+ registry: str,
119
+ ks3_path: str,
120
+ ks3_bucket: str,
121
+ image: str,
122
+ ui_profile: str,
123
+ ui_path: str,
124
+ ui_url: str,
125
+ storage_size_gi: int,
126
+ storage_mount_path: str | None,
127
+ no_storage: bool,
128
+ enable_public_access: bool | None,
129
+ enable_vpc_access: bool,
130
+ vpc_id: str | None,
131
+ subnet_id: str | None,
132
+ security_group_id: str | None,
133
+ availability_zone: str | None,
134
+ extra_env: tuple[str, ...],
135
+ env_file: str | None,
136
+ observability: bool,
137
+ push: bool,
138
+ no_cache: bool,
139
+ repackage: bool,
140
+ no_version: bool,
141
+ auto_rollback: bool,
142
+ dry_run: bool,
143
+ list_providers: bool,
144
+ output_mode: str | None,
145
+ ):
146
+ """部署 Agent 到云端
147
+
148
+ \b
149
+ AGENT_DIR: Agent 项目目录 (默认: 当前目录)
150
+
151
+ \b
152
+ 示例:
153
+ # 1) 默认部署 (serverless)
154
+ agentengine deploy .
155
+ # 2) 显式指定部署参数
156
+ agentengine deploy . --target kcf --account-id X-Ksc-Account-Id
157
+ # 3) 显式指定区域
158
+ KSYUN_REGION=cn-beijing-6 agentengine deploy . --target serverless --dry-run
159
+ """
160
+ dry_run = effective_dry_run(dry_run)
161
+
162
+ # 列出 Provider
163
+ if list_providers:
164
+ _list_providers()
165
+ return
166
+
167
+ # 执行部署
168
+ _ = output_mode
169
+ dry_run_context: dict[str, object] = {}
170
+ result = run_async_with_dry_run(
171
+ _deploy_async(
172
+ agent_dir,
173
+ target,
174
+ name,
175
+ region,
176
+ account_id,
177
+ artifact_type,
178
+ namespace,
179
+ port,
180
+ registry,
181
+ ks3_path,
182
+ ks3_bucket,
183
+ image,
184
+ ui_profile,
185
+ ui_path,
186
+ ui_url,
187
+ observability,
188
+ push,
189
+ no_cache,
190
+ no_version,
191
+ auto_rollback,
192
+ dry_run,
193
+ storage_size_gi,
194
+ storage_mount_path,
195
+ no_storage,
196
+ **network_cli_kwargs(
197
+ enable_public_access=enable_public_access,
198
+ enable_vpc_access=enable_vpc_access,
199
+ vpc_id=vpc_id,
200
+ subnet_id=subnet_id,
201
+ security_group_id=security_group_id,
202
+ availability_zone=availability_zone,
203
+ ),
204
+ extra_env=extra_env,
205
+ env_file=env_file,
206
+ repackage=repackage,
207
+ dry_run_context=dry_run_context,
208
+ ),
209
+ dry_run=dry_run,
210
+ on_dry_run=(
211
+ lambda exc: render_workflow_dry_run(
212
+ action="deploy",
213
+ request=dict(exc.payload or {}),
214
+ plan=dict(dry_run_context.get("plan") or {}) or None,
215
+ )
216
+ ),
217
+ )
218
+ if result is not None and is_json_output():
219
+ render_workflow_result(action="deploy", result=result)
220
+
221
+
222
+
223
+
224
+ def _list_providers():
225
+
226
+ """列出所有可用的部署 Provider"""
227
+ from ksadk.deployment import DeploymentManager
228
+
229
+ providers = DeploymentManager.list_providers()
230
+
231
+ table = new_table("可用的部署目标")
232
+ table.add_column("名称", style="#58a6ff", no_wrap=True)
233
+ table.add_column("显示名", style="white")
234
+ table.add_column("说明", style="#8b949e")
235
+ table.add_column("特性", style="#c9d1d9")
236
+
237
+ for p in providers:
238
+ features = []
239
+ if p.get("supports_scaling"):
240
+ features.append("扩缩容")
241
+ if p.get("supports_streaming"):
242
+ features.append("流式")
243
+ if p.get("requires_image_registry"):
244
+ features.append("需镜像仓库")
245
+
246
+ table.add_row(
247
+ p["name"],
248
+ p.get("display_name", p["name"]),
249
+ p.get("description", "-"),
250
+ ", ".join(features) if features else "-",
251
+ )
252
+
253
+ console.print(table)
254
+
255
+
256
+ async def _deploy_async(
257
+ agent_dir: str,
258
+ target: str,
259
+ name: str,
260
+ region: str,
261
+ account_id: str,
262
+ artifact_type: str,
263
+ namespace: str,
264
+ port: int,
265
+ registry: str,
266
+ ks3_path: str,
267
+ ks3_bucket: str,
268
+ image: str,
269
+ ui_profile: str,
270
+ ui_path: str,
271
+ ui_url: str,
272
+ observability: bool,
273
+ push: bool,
274
+ no_cache: bool,
275
+ no_version: bool,
276
+ auto_rollback: bool,
277
+ dry_run: bool,
278
+ storage_size_gi: int = 20,
279
+ storage_mount_path: str | None = None,
280
+ no_storage: bool = False,
281
+ enable_public_access: bool | None = None,
282
+ enable_vpc_access: bool = False,
283
+ vpc_id: str | None = None,
284
+ subnet_id: str | None = None,
285
+ security_group_id: str | None = None,
286
+ availability_zone: str | None = None,
287
+ extra_env: tuple[str, ...] = (),
288
+ env_file: str | None = None,
289
+ dry_run_context: dict[str, object] | None = None,
290
+ *,
291
+ repackage: bool = False,
292
+ ):
293
+ """异步部署流程"""
294
+ from ksadk.detection import FrameworkDetector
295
+ from ksadk.deployment import DeploymentManager, DeployTarget, DeployStatus
296
+
297
+ agent_path = Path(agent_dir).resolve()
298
+ config = _load_config(agent_path)
299
+ try:
300
+ explicit_env_vars = resolve_explicit_env_vars(
301
+ env_file=env_file,
302
+ env_pairs=extra_env,
303
+ base_dir=agent_path,
304
+ )
305
+ except ValueError as e:
306
+ raise validation_error(str(e))
307
+ effective_artifact_type = _resolve_artifact_type_input(config, artifact_type)
308
+ print_workflow_header(
309
+ title="Agent 部署",
310
+ subtitle=f"target: {target}",
311
+ project_dir=agent_path,
312
+ target=target,
313
+ region=region,
314
+ mode_label="部署模式" if target == "serverless" else None,
315
+ mode_value=effective_artifact_type if target == "serverless" else None,
316
+ account_id=account_id,
317
+ observability=observability if target == "serverless" else None,
318
+ )
319
+
320
+ # 1. 检测框架
321
+ detector = FrameworkDetector(str(agent_path))
322
+ detection_result = detector.detect()
323
+
324
+ if detection_result.type.value == "unknown":
325
+ raise validation_error("未检测到支持的框架")
326
+
327
+ print_kv("框架", detection_result.name, value_style="#2da44e")
328
+
329
+ if detection_result.type.value == "hermes":
330
+ raise usage_error(
331
+ "Hermes 项目请使用 `agentengine hermes deploy`,不要使用通用 `agentengine deploy`。",
332
+ hints=[
333
+ "Hermes 部署会走专用模板和镜像构建流程。",
334
+ "可先执行 `agentengine hermes --help` 查看专用命令。",
335
+ ],
336
+ argv=["deploy"],
337
+ )
338
+ if detection_result.type.value == "openclaw":
339
+ raise usage_error(
340
+ "OpenClaw 项目请使用 `agentengine openclaw deploy`,不要使用通用 `agentengine deploy`。",
341
+ hints=[
342
+ "OpenClaw 部署会走专用网关与容器配置流程。",
343
+ "可先执行 `agentengine openclaw --help` 查看专用命令。",
344
+ ],
345
+ argv=["deploy"],
346
+ )
347
+
348
+ # 2. 确定部署名称
349
+ deploy_name = name or config.get("name") or agent_path.name.replace("-", "_").replace(".", "_")
350
+ print_kv("部署名称", deploy_name)
351
+ resolved_ui_profile, resolved_ui_path, resolved_ui_url = _resolve_ui_config_inputs(
352
+ config,
353
+ ui_profile=ui_profile,
354
+ ui_path=ui_path,
355
+ ui_url=ui_url,
356
+ )
357
+
358
+ # 4. 获取 Provider
359
+ try:
360
+ provider = DeploymentManager.get_provider(target)
361
+ except ValueError as e:
362
+ raise usage_error(str(e), hints=["使用 `agentengine deploy --list-providers` 查看可用目标。"])
363
+
364
+ # 5. 构建部署目标配置
365
+ deploy_target = DeployTarget(
366
+ provider=target,
367
+ region=region,
368
+ project_id=config.get("project_id", "default"),
369
+ extra={
370
+ "account_id": account_id,
371
+ "namespace": namespace,
372
+ "port": port,
373
+ "registry": registry or config.get("image", {}).get("registry", ""),
374
+ "kubeconfig": config.get("deploy", {}).get("k8s", {}).get("kubeconfig"),
375
+ "artifact_type": effective_artifact_type,
376
+ "ks3_path": ks3_path,
377
+ "ks3_bucket": ks3_bucket,
378
+ "image": image,
379
+ "ui_profile": resolved_ui_profile,
380
+ "ui_path": resolved_ui_path,
381
+ "ui_url": resolved_ui_url,
382
+ "enable_observability": observability,
383
+ "dry_run": dry_run,
384
+ "no_cache": no_cache,
385
+ "repackage": repackage,
386
+ "env_vars": explicit_env_vars,
387
+ },
388
+ )
389
+
390
+ artifact_plan = plan_artifact_build(
391
+ target=target,
392
+ artifact_type=effective_artifact_type,
393
+ ks3_path=ks3_path,
394
+ image=image,
395
+ no_cache=no_cache,
396
+ repackage=repackage,
397
+ )
398
+ if artifact_plan.should_clear_metadata:
399
+ try:
400
+ if clear_build_metadata(agent_path):
401
+ print_warn("已清除旧构建元数据 (--no-cache)")
402
+ except Exception as e:
403
+ print_warn(f"清理旧构建元数据失败: {e}")
404
+ emit_no_cache_hint(plan=artifact_plan, no_cache=no_cache)
405
+
406
+ # 更新资源配置
407
+ if "resources" in config:
408
+ deploy_target.resources.cpu = config["resources"].get("cpu", "2")
409
+ deploy_target.resources.memory = config["resources"].get("memory", "4Gi")
410
+
411
+ if "scaling" in config:
412
+ deploy_target.scaling.min_replicas = config["scaling"].get("min_replicas", 1)
413
+ deploy_target.scaling.max_replicas = config["scaling"].get("max_replicas", 10)
414
+ deploy_target.scaling.concurrency = config["scaling"].get("concurrency", 10)
415
+
416
+ _apply_network_config(config, deploy_target)
417
+ apply_network_cli_overrides(
418
+ deploy_target,
419
+ enable_public_access=enable_public_access,
420
+ enable_vpc_access=enable_vpc_access,
421
+ vpc_id=vpc_id,
422
+ subnet_id=subnet_id,
423
+ security_group_id=security_group_id,
424
+ availability_zone=availability_zone,
425
+ )
426
+ validate_deploy_target_network(deploy_target)
427
+ resolve_deploy_target_network(deploy_target, region=region, dry_run=dry_run)
428
+ storage_config = build_storage_config(
429
+ detection_result.type.value,
430
+ target=target,
431
+ no_storage=no_storage,
432
+ mount_path=storage_mount_path,
433
+ size_gi=storage_size_gi,
434
+ )
435
+ if storage_config:
436
+ deploy_target.storage.mount_path = storage_config["mount_path"]
437
+ deploy_target.storage.size_gi = storage_config["size_gi"]
438
+
439
+ normalized_artifact_type = (effective_artifact_type or "Code").strip().lower()
440
+ explicit_artifact_reference = ks3_path if normalized_artifact_type == "code" else image
441
+ cached_artifact_reference = None
442
+ if not artifact_plan.should_clear_metadata:
443
+ cached_artifact_reference = load_cached_artifact_reference(agent_path, effective_artifact_type)
444
+ resolved_artifact_plan = resolve_artifact_build_plan(
445
+ plan=artifact_plan,
446
+ target=target,
447
+ artifact_type=effective_artifact_type,
448
+ dry_run=dry_run,
449
+ deploy_name=deploy_name,
450
+ region=region,
451
+ account_id=account_id,
452
+ ks3_bucket=ks3_bucket,
453
+ registry=registry or config.get("image", {}).get("registry", ""),
454
+ explicit_reference=explicit_artifact_reference,
455
+ cached_reference=cached_artifact_reference,
456
+ )
457
+
458
+ # 6. 验证配置
459
+ with capture_standard_output():
460
+ valid, error_msg = await provider.validate_config(deploy_target)
461
+ if not valid:
462
+ raise validation_error(f"配置验证失败: {error_msg}")
463
+
464
+ # 7. 打包 (Package 步骤仍需保留以获取框架信息等,但不构建制品)
465
+ total_steps = 3 if resolved_artifact_plan.will_build else 2
466
+ print_rule(f"Step 1/{total_steps} 准备配置")
467
+ try:
468
+ with capture_standard_output():
469
+ package_info = await provider.package(str(agent_path), detection_result, config)
470
+ package_info.name = deploy_name
471
+
472
+ if resolved_artifact_plan.reference:
473
+ if normalized_artifact_type == "container":
474
+ package_info.image = resolved_artifact_plan.reference
475
+ package_info.metadata["image"] = resolved_artifact_plan.reference
476
+ else:
477
+ package_info.metadata["ks3_path"] = resolved_artifact_plan.reference
478
+
479
+ print_kv("构建目录", str(package_info.build_dir))
480
+ print_kv("框架", package_info.framework)
481
+ except Exception as e:
482
+ raise cli_error_from_exception(e, context="打包失败")
483
+
484
+ if not resolved_artifact_plan.will_build and resolved_artifact_plan.reference:
485
+ source_label = {
486
+ "external": "外部制品",
487
+ "cached": "缓存制品",
488
+ "planned_build": "预测制品",
489
+ }.get(resolved_artifact_plan.source or "", "制品引用")
490
+ print_kv(source_label, resolved_artifact_plan.reference)
491
+ if resolved_artifact_plan.source == "cached":
492
+ print_info("检测到缓存制品,跳过重新构建")
493
+ elif resolved_artifact_plan.source == "planned_build":
494
+ print_info("Dry Run: 仅生成本地构建计划,不执行真实构建/上传")
495
+
496
+ if resolved_artifact_plan.will_build:
497
+ print_rule(f"Step 2/{total_steps} 构建与上传")
498
+ try:
499
+ with capture_standard_output():
500
+ package_info = await provider.build(package_info, deploy_target)
501
+
502
+ if target == "serverless":
503
+ if effective_artifact_type == "Code":
504
+ ks3 = package_info.metadata.get("ks3_path")
505
+ if ks3:
506
+ print_kv("KS3 路径", ks3)
507
+ elif package_info.image:
508
+ print_kv("镜像", package_info.image)
509
+ except Exception as e:
510
+ raise cli_error_from_exception(e, context="构建失败")
511
+
512
+ artifact_reference = (
513
+ package_info.metadata.get("ks3_path")
514
+ or package_info.image
515
+ or resolved_artifact_plan.reference
516
+ or ks3_path
517
+ or image
518
+ or ""
519
+ )
520
+ local_plan = build_workflow_local_plan(
521
+ project_dir=agent_path,
522
+ framework=detection_result.name,
523
+ target=target,
524
+ region=region,
525
+ deploy_name=deploy_name,
526
+ artifact_type=effective_artifact_type,
527
+ artifact_plan=resolved_artifact_plan,
528
+ build_dir=str(package_info.build_dir),
529
+ artifact_reference=str(artifact_reference),
530
+ no_cache=no_cache,
531
+ repackage=repackage,
532
+ )
533
+ if dry_run_context is not None:
534
+ dry_run_context["plan"] = local_plan
535
+
536
+ # 8. 部署
537
+ print_rule(f"Step {total_steps}/{total_steps} 部署到 {target}")
538
+ try:
539
+ with capture_standard_output():
540
+ result = await provider.deploy(package_info, deploy_target)
541
+
542
+ if result.is_success():
543
+ print_success("部署成功")
544
+ print_rule()
545
+ print_kv("名称", result.agent_name or deploy_name)
546
+ if result.agent_id:
547
+ print_kv("ID", result.agent_id)
548
+ print_kv("状态", result.status.value, value_style="#2da44e")
549
+ if result.endpoint:
550
+ print_kv("Endpoint", result.endpoint, value_style="#58a6ff")
551
+ if result.api_key:
552
+ print_kv("API Key", result.api_key, value_style="#d29922")
553
+ # 首次部署提示 API Key 仅显示一次
554
+ if result.message and "首次部署" in result.message:
555
+ print_warn("⚠️ API Key 仅在首次部署时明文显示,请妥善保存!")
556
+ if result.message:
557
+ print_kv("信息", result.message)
558
+
559
+ # 9. 自动创建版本快照 (仅热更新时,首次部署平台自动创建 v1)
560
+ is_update = result.message and "已更新" in result.message
561
+ if result.agent_id and is_update and not no_version and not dry_run:
562
+ from ksadk.cli.deploy_utils import auto_release_version
563
+ with capture_standard_output():
564
+ await auto_release_version(result.agent_id, region, deploy_name)
565
+
566
+ target_ref = result.agent_id or deploy_name
567
+ print_agent_next_steps(target_ref)
568
+ return {
569
+ "framework": detection_result.name,
570
+ "artifact_type": effective_artifact_type.lower(),
571
+ "artifact_source": str(resolved_artifact_plan.source or ""),
572
+ "artifact_reused": bool((resolved_artifact_plan.source or "") == "cached"),
573
+ "artifact_built": bool(resolved_artifact_plan.will_build),
574
+ "artifact_reference": str(
575
+ package_info.metadata.get("ks3_path")
576
+ or package_info.image
577
+ or resolved_artifact_plan.reference
578
+ or ks3_path
579
+ or image
580
+ or ""
581
+ ),
582
+ "agent_id": str(result.agent_id or ""),
583
+ "agent_name": str(result.agent_name or deploy_name),
584
+ "endpoint": str(result.endpoint or ""),
585
+ "api_key_present": bool(result.api_key),
586
+ "status": result.status.value,
587
+ "message": str(result.message or ""),
588
+ "region": region,
589
+ "target": target,
590
+ }
591
+ else:
592
+ # 可能是 DryRun 的 SKIPPED
593
+ if result.status.name == "SKIPPED":
594
+ dry_run_request = result.metadata.get("dry_run_request") if isinstance(result.metadata, dict) else None
595
+ if dry_run and dry_run_request:
596
+ raise DryRunExit(result.message or "Dry Run finished.", payload=dry_run_request)
597
+ print_warn(f"部署状态: {result.status.value}")
598
+ return {
599
+ "framework": detection_result.name,
600
+ "artifact_type": effective_artifact_type.lower(),
601
+ "artifact_source": str(resolved_artifact_plan.source or ""),
602
+ "artifact_reused": bool((resolved_artifact_plan.source or "") == "cached"),
603
+ "artifact_built": bool(resolved_artifact_plan.will_build),
604
+ "artifact_reference": str(
605
+ package_info.metadata.get("ks3_path")
606
+ or package_info.image
607
+ or resolved_artifact_plan.reference
608
+ or ks3_path
609
+ or image
610
+ or ""
611
+ ),
612
+ "agent_id": str(result.agent_id or ""),
613
+ "agent_name": str(result.agent_name or deploy_name),
614
+ "endpoint": str(result.endpoint or ""),
615
+ "api_key_present": bool(result.api_key),
616
+ "status": result.status.value,
617
+ "message": str(result.message or ""),
618
+ "region": region,
619
+ "target": target,
620
+ }
621
+ else:
622
+ raise remote_error(
623
+ f"部署状态: {result.status.value}",
624
+ details={
625
+ "status": result.status.value,
626
+ "message": result.message or "",
627
+ "agent_id": result.agent_id or "",
628
+ },
629
+ )
630
+ if result.message:
631
+ print_info(result.message)
632
+
633
+ # 10. 部署失败时自动回滚 (如果启用了 --auto-rollback)
634
+ if auto_rollback and result.agent_id and result.status.name not in ["SKIPPED"]:
635
+ from ksadk.cli.deploy_utils import auto_rollback_to_previous
636
+ with capture_standard_output():
637
+ await auto_rollback_to_previous(result.agent_id, region)
638
+
639
+ except DryRunExit:
640
+ raise
641
+ except Exception as e:
642
+ if is_debug_mode_enabled():
643
+ import traceback
644
+
645
+ traceback.print_exc()
646
+ raise cli_error_from_exception(e, context="部署失败")
647
+
648
+
649
+ def _should_build_artifact(*, target: str, artifact_type: str, ks3_path: str, image: str) -> bool:
650
+ """判断 deploy 是否需要本地重新构建制品。"""
651
+ return _workflow_should_build_artifact(
652
+ target=target,
653
+ artifact_type=artifact_type,
654
+ ks3_path=ks3_path,
655
+ image=image,
656
+ )
657
+
658
+
659
+
660
+
661
+
662
+ def _load_config(agent_path: Path) -> dict:
663
+ """加载配置文件"""
664
+ import yaml
665
+
666
+ # 优先 agentengine.yaml
667
+ config_path = agent_path / "agentengine.yaml"
668
+ if not config_path.exists():
669
+ config_path = agent_path / "ksadk.yaml"
670
+
671
+ if config_path.exists():
672
+ # 使用 utf-8-sig 自动处理 BOM,确保 Windows 兼容性
673
+ with open(config_path, encoding='utf-8-sig') as f:
674
+ return yaml.safe_load(f) or {}
675
+
676
+ return {}
677
+
678
+
679
+ def _resolve_ui_config_inputs(
680
+ config: dict,
681
+ *,
682
+ ui_profile: str | None,
683
+ ui_path: str | None,
684
+ ui_url: str | None,
685
+ ) -> tuple[str | None, str | None, str | None]:
686
+ config_profile, config_path, config_url = extract_ui_state(config if isinstance(config, dict) else None)
687
+ return (
688
+ ui_profile if ui_profile is not None else config_profile,
689
+ ui_path if ui_path is not None else config_path,
690
+ ui_url if ui_url is not None else config_url,
691
+ )
692
+
693
+
694
+ def _resolve_artifact_type_input(config: dict, cli_artifact_type: str | None) -> str:
695
+ raw = cli_artifact_type
696
+ if raw is None and isinstance(config, dict):
697
+ deploy_config = config.get("deploy") if isinstance(config.get("deploy"), dict) else {}
698
+ raw = config.get("artifact_type") or deploy_config.get("artifact_type")
699
+ normalized = str(raw or "Code").strip().lower()
700
+ return "Container" if normalized == "container" else "Code"
701
+
702
+
703
+ def _apply_network_config(config: dict, deploy_target: "DeployTarget") -> None:
704
+ _apply_network_config_shared(config, deploy_target)