agentengine-sdk-python 0.6.4__py3-none-any.whl → 0.7.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 (486) hide show
  1. agentengine_sdk_python-0.7.0.dist-info/METADATA +181 -0
  2. agentengine_sdk_python-0.7.0.dist-info/RECORD +482 -0
  3. {agentengine_sdk_python-0.6.4.dist-info → agentengine_sdk_python-0.7.0.dist-info}/WHEEL +1 -1
  4. agentengine_sdk_python-0.7.0.dist-info/entry_points.txt +3 -0
  5. agentengine_sdk_python-0.7.0.dist-info/licenses/LICENSE +175 -0
  6. agentengine_sdk_python-0.7.0.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 +2246 -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 +2304 -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 +1263 -0
  46. ksadk/cli/cmd_invoke.py +1503 -0
  47. ksadk/cli/cmd_launch.py +564 -0
  48. ksadk/cli/cmd_mcp.py +1179 -0
  49. ksadk/cli/cmd_model.py +302 -0
  50. ksadk/cli/cmd_openclaw.py +3922 -0
  51. ksadk/cli/cmd_run.py +239 -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 +412 -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 +343 -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/message_projection.py +269 -0
  83. ksadk/conversations/model_context.py +370 -0
  84. ksadk/conversations/model_options.py +136 -0
  85. ksadk/conversations/normalize.py +446 -0
  86. ksadk/conversations/reasoning_markup.py +91 -0
  87. ksadk/conversations/run_kinds.py +61 -0
  88. ksadk/conversations/run_status.py +53 -0
  89. ksadk/conversations/runtime.py +5276 -0
  90. ksadk/conversations/semantic_summary.py +359 -0
  91. ksadk/conversations/session_title.py +254 -0
  92. ksadk/deployment/__init__.py +83 -0
  93. ksadk/deployment/agent_access.py +226 -0
  94. ksadk/deployment/base.py +229 -0
  95. ksadk/deployment/manager.py +332 -0
  96. ksadk/deployment/providers/__init__.py +10 -0
  97. ksadk/deployment/providers/serverless.py +1115 -0
  98. ksadk/deployment/registry.py +120 -0
  99. ksadk/deployment/state.py +78 -0
  100. ksadk/deployment/ui_config.py +21 -0
  101. ksadk/detection/__init__.py +7 -0
  102. ksadk/detection/detector.py +431 -0
  103. ksadk/detection/mcp_detector.py +250 -0
  104. ksadk/hermes_terminal.py +467 -0
  105. ksadk/identity/__init__.py +17 -0
  106. ksadk/identity/resolver.py +385 -0
  107. ksadk/knowledge_base/__init__.py +62 -0
  108. ksadk/knowledge_base/adk_tool.py +47 -0
  109. ksadk/knowledge_base/client.py +297 -0
  110. ksadk/knowledge_base/langchain_tool.py +55 -0
  111. ksadk/knowledge_base/service.py +66 -0
  112. ksadk/knowledge_base/tool.py +50 -0
  113. ksadk/markdown.py +169 -0
  114. ksadk/mcp_runtime/__init__.py +231 -0
  115. ksadk/memory/__init__.py +57 -0
  116. ksadk/memory/adk/__init__.py +51 -0
  117. ksadk/memory/adk/backends/__init__.py +5 -0
  118. ksadk/memory/adk/backends/base_ltm_backend.py +52 -0
  119. ksadk/memory/adk/backends/http_ltm_backend.py +183 -0
  120. ksadk/memory/adk/backends/inmemory_ltm_backend.py +96 -0
  121. ksadk/memory/adk/backends/sdk_ltm_backend.py +456 -0
  122. ksadk/memory/adk/long_term_memory.py +273 -0
  123. ksadk/memory/adk/resilient_session_service.py +268 -0
  124. ksadk/memory/adk/short_term_memory.py +304 -0
  125. ksadk/memory/adk_tool.py +31 -0
  126. ksadk/memory/backends/__init__.py +6 -0
  127. ksadk/memory/backends/base.py +103 -0
  128. ksadk/memory/backends/memory.py +112 -0
  129. ksadk/memory/backends/redis.py +146 -0
  130. ksadk/memory/langchain_tool.py +39 -0
  131. ksadk/memory/ltm_backend_factory.py +24 -0
  132. ksadk/memory/manager.py +215 -0
  133. ksadk/memory/service.py +172 -0
  134. ksadk/memory/tool.py +96 -0
  135. ksadk/model_policy.py +223 -0
  136. ksadk/openclaw_gateway.py +378 -0
  137. ksadk/runners/__init__.py +8 -0
  138. ksadk/runners/adk_runner.py +1994 -0
  139. ksadk/runners/base_runner.py +305 -0
  140. ksadk/runners/deepagents_runner.py +13 -0
  141. ksadk/runners/factory.py +73 -0
  142. ksadk/runners/langchain_runner.py +751 -0
  143. ksadk/runners/langgraph_runner.py +985 -0
  144. ksadk/runners/patch_langchain.py +187 -0
  145. ksadk/runners/remote_runner.py +792 -0
  146. ksadk/runners/usage_accumulator.py +38 -0
  147. ksadk/runners/utils/__init__.py +19 -0
  148. ksadk/runners/utils/langfuse.py +230 -0
  149. ksadk/runners/utils/loader.py +62 -0
  150. ksadk/runtime_context.py +166 -0
  151. ksadk/runtime_state.py +25 -0
  152. ksadk/sandbox/__init__.py +28 -0
  153. ksadk/sandbox/backends/__init__.py +9 -0
  154. ksadk/sandbox/backends/e2b.py +154 -0
  155. ksadk/sandbox/backends/local_process.py +131 -0
  156. ksadk/sandbox/base.py +101 -0
  157. ksadk/sandbox/factory.py +53 -0
  158. ksadk/sandbox/registry.py +187 -0
  159. ksadk/server/__init__.py +7 -0
  160. ksadk/server/api_models.py +73 -0
  161. ksadk/server/app.py +3931 -0
  162. ksadk/server/static/assets/ArtifactsPanel-D-SSn2ee.js +1 -0
  163. ksadk/server/static/assets/CodeBlock-P16VOLYi.js +9 -0
  164. ksadk/server/static/assets/KaTeX_AMS-Regular-BQhdFMY1.woff2 +0 -0
  165. ksadk/server/static/assets/KaTeX_AMS-Regular-DMm9YOAa.woff +0 -0
  166. ksadk/server/static/assets/KaTeX_AMS-Regular-DRggAlZN.ttf +0 -0
  167. ksadk/server/static/assets/KaTeX_Caligraphic-Bold-ATXxdsX0.ttf +0 -0
  168. ksadk/server/static/assets/KaTeX_Caligraphic-Bold-BEiXGLvX.woff +0 -0
  169. ksadk/server/static/assets/KaTeX_Caligraphic-Bold-Dq_IR9rO.woff2 +0 -0
  170. ksadk/server/static/assets/KaTeX_Caligraphic-Regular-CTRA-rTL.woff +0 -0
  171. ksadk/server/static/assets/KaTeX_Caligraphic-Regular-Di6jR-x-.woff2 +0 -0
  172. ksadk/server/static/assets/KaTeX_Caligraphic-Regular-wX97UBjC.ttf +0 -0
  173. ksadk/server/static/assets/KaTeX_Fraktur-Bold-BdnERNNW.ttf +0 -0
  174. ksadk/server/static/assets/KaTeX_Fraktur-Bold-BsDP51OF.woff +0 -0
  175. ksadk/server/static/assets/KaTeX_Fraktur-Bold-CL6g_b3V.woff2 +0 -0
  176. ksadk/server/static/assets/KaTeX_Fraktur-Regular-CB_wures.ttf +0 -0
  177. ksadk/server/static/assets/KaTeX_Fraktur-Regular-CTYiF6lA.woff2 +0 -0
  178. ksadk/server/static/assets/KaTeX_Fraktur-Regular-Dxdc4cR9.woff +0 -0
  179. ksadk/server/static/assets/KaTeX_Main-Bold-Cx986IdX.woff2 +0 -0
  180. ksadk/server/static/assets/KaTeX_Main-Bold-Jm3AIy58.woff +0 -0
  181. ksadk/server/static/assets/KaTeX_Main-Bold-waoOVXN0.ttf +0 -0
  182. ksadk/server/static/assets/KaTeX_Main-BoldItalic-DxDJ3AOS.woff2 +0 -0
  183. ksadk/server/static/assets/KaTeX_Main-BoldItalic-DzxPMmG6.ttf +0 -0
  184. ksadk/server/static/assets/KaTeX_Main-BoldItalic-SpSLRI95.woff +0 -0
  185. ksadk/server/static/assets/KaTeX_Main-Italic-3WenGoN9.ttf +0 -0
  186. ksadk/server/static/assets/KaTeX_Main-Italic-BMLOBm91.woff +0 -0
  187. ksadk/server/static/assets/KaTeX_Main-Italic-NWA7e6Wa.woff2 +0 -0
  188. ksadk/server/static/assets/KaTeX_Main-Regular-B22Nviop.woff2 +0 -0
  189. ksadk/server/static/assets/KaTeX_Main-Regular-Dr94JaBh.woff +0 -0
  190. ksadk/server/static/assets/KaTeX_Main-Regular-ypZvNtVU.ttf +0 -0
  191. ksadk/server/static/assets/KaTeX_Math-BoldItalic-B3XSjfu4.ttf +0 -0
  192. ksadk/server/static/assets/KaTeX_Math-BoldItalic-CZnvNsCZ.woff2 +0 -0
  193. ksadk/server/static/assets/KaTeX_Math-BoldItalic-iY-2wyZ7.woff +0 -0
  194. ksadk/server/static/assets/KaTeX_Math-Italic-DA0__PXp.woff +0 -0
  195. ksadk/server/static/assets/KaTeX_Math-Italic-flOr_0UB.ttf +0 -0
  196. ksadk/server/static/assets/KaTeX_Math-Italic-t53AETM-.woff2 +0 -0
  197. ksadk/server/static/assets/KaTeX_SansSerif-Bold-CFMepnvq.ttf +0 -0
  198. ksadk/server/static/assets/KaTeX_SansSerif-Bold-D1sUS0GD.woff2 +0 -0
  199. ksadk/server/static/assets/KaTeX_SansSerif-Bold-DbIhKOiC.woff +0 -0
  200. ksadk/server/static/assets/KaTeX_SansSerif-Italic-C3H0VqGB.woff2 +0 -0
  201. ksadk/server/static/assets/KaTeX_SansSerif-Italic-DN2j7dab.woff +0 -0
  202. ksadk/server/static/assets/KaTeX_SansSerif-Italic-YYjJ1zSn.ttf +0 -0
  203. ksadk/server/static/assets/KaTeX_SansSerif-Regular-BNo7hRIc.ttf +0 -0
  204. ksadk/server/static/assets/KaTeX_SansSerif-Regular-CS6fqUqJ.woff +0 -0
  205. ksadk/server/static/assets/KaTeX_SansSerif-Regular-DDBCnlJ7.woff2 +0 -0
  206. ksadk/server/static/assets/KaTeX_Script-Regular-C5JkGWo-.ttf +0 -0
  207. ksadk/server/static/assets/KaTeX_Script-Regular-D3wIWfF6.woff2 +0 -0
  208. ksadk/server/static/assets/KaTeX_Script-Regular-D5yQViql.woff +0 -0
  209. ksadk/server/static/assets/KaTeX_Size1-Regular-C195tn64.woff +0 -0
  210. ksadk/server/static/assets/KaTeX_Size1-Regular-Dbsnue_I.ttf +0 -0
  211. ksadk/server/static/assets/KaTeX_Size1-Regular-mCD8mA8B.woff2 +0 -0
  212. ksadk/server/static/assets/KaTeX_Size2-Regular-B7gKUWhC.ttf +0 -0
  213. ksadk/server/static/assets/KaTeX_Size2-Regular-Dy4dx90m.woff2 +0 -0
  214. ksadk/server/static/assets/KaTeX_Size2-Regular-oD1tc_U0.woff +0 -0
  215. ksadk/server/static/assets/KaTeX_Size3-Regular-CTq5MqoE.woff +0 -0
  216. ksadk/server/static/assets/KaTeX_Size3-Regular-DgpXs0kz.ttf +0 -0
  217. ksadk/server/static/assets/KaTeX_Size4-Regular-BF-4gkZK.woff +0 -0
  218. ksadk/server/static/assets/KaTeX_Size4-Regular-DWFBv043.ttf +0 -0
  219. ksadk/server/static/assets/KaTeX_Size4-Regular-Dl5lxZxV.woff2 +0 -0
  220. ksadk/server/static/assets/KaTeX_Typewriter-Regular-C0xS9mPB.woff +0 -0
  221. ksadk/server/static/assets/KaTeX_Typewriter-Regular-CO6r4hn1.woff2 +0 -0
  222. ksadk/server/static/assets/KaTeX_Typewriter-Regular-D3Ib7_Hf.ttf +0 -0
  223. ksadk/server/static/assets/MathMessageMarkdown-CdGiQWHR.js +8 -0
  224. ksadk/server/static/assets/MathMessageMarkdown-DeYh8QPr.css +1 -0
  225. ksadk/server/static/assets/MermaidBlock-IOcal8cm.js +303 -0
  226. ksadk/server/static/assets/NativeTerminalPanel-CHOd7Rch.css +1 -0
  227. ksadk/server/static/assets/NativeTerminalPanel-DGSDWsei.js +1 -0
  228. ksadk/server/static/assets/addon-fit-DthTIhi3.js +1 -0
  229. ksadk/server/static/assets/apl-CnwPGSsG.js +1 -0
  230. ksadk/server/static/assets/arc-BA13sHc9.js +1 -0
  231. ksadk/server/static/assets/architecture-7EHR7CIX-BvUlsA6l.js +1 -0
  232. ksadk/server/static/assets/architectureDiagram-3BPJPVTR-DzJzgVoL.js +36 -0
  233. ksadk/server/static/assets/asciiarmor-qTkVPQu6.js +1 -0
  234. ksadk/server/static/assets/asn1-Dr8qZg38.js +1 -0
  235. ksadk/server/static/assets/asterisk-Bja0s6e1.js +1 -0
  236. ksadk/server/static/assets/blockDiagram-GPEHLZMM-UTdVcZhn.js +132 -0
  237. ksadk/server/static/assets/brainfuck-D5EjA2JK.js +1 -0
  238. ksadk/server/static/assets/c4Diagram-AAUBKEIU-Dix0GD4m.js +10 -0
  239. ksadk/server/static/assets/channel-CTuydARX.js +1 -0
  240. ksadk/server/static/assets/chunk-2J33WTMH-C2JxuZ42.js +1 -0
  241. ksadk/server/static/assets/chunk-4BX2VUAB-Be57QPgD.js +1 -0
  242. ksadk/server/static/assets/chunk-55IACEB6-WjSuy4nv.js +1 -0
  243. ksadk/server/static/assets/chunk-727SXJPM-BOovP-b5.js +206 -0
  244. ksadk/server/static/assets/chunk-AQP2D5EJ-DOmZNmWj.js +231 -0
  245. ksadk/server/static/assets/chunk-FMBD7UC4-DzwlodkU.js +15 -0
  246. ksadk/server/static/assets/chunk-ND2GUHAM-DMqAikEU.js +1 -0
  247. ksadk/server/static/assets/chunk-QZHKN3VN-BnCydivS.js +1 -0
  248. ksadk/server/static/assets/classDiagram-4FO5ZUOK-BNHg45Be.js +1 -0
  249. ksadk/server/static/assets/classDiagram-v2-Q7XG4LA2-BNHg45Be.js +1 -0
  250. ksadk/server/static/assets/clike-DHH8Ad3s.js +1 -0
  251. ksadk/server/static/assets/clojure-BflJGmDX.js +1 -0
  252. ksadk/server/static/assets/cmake-CyVbuzPu.js +1 -0
  253. ksadk/server/static/assets/cobol-B_OZ4V-R.js +1 -0
  254. ksadk/server/static/assets/coffeescript-B2pKbFk8.js +1 -0
  255. ksadk/server/static/assets/commonlisp-CcllspGY.js +1 -0
  256. ksadk/server/static/assets/cose-bilkent-S5V4N54A-Zhy2GBnP.js +1 -0
  257. ksadk/server/static/assets/crystal-M5-qzICs.js +1 -0
  258. ksadk/server/static/assets/css-CYpP4FRV.js +1 -0
  259. ksadk/server/static/assets/cypher-p9eYesGn.js +1 -0
  260. ksadk/server/static/assets/cytoscape.esm-DelgaX4f.js +321 -0
  261. ksadk/server/static/assets/d-BhMjBjQP.js +1 -0
  262. ksadk/server/static/assets/dagre-BM42HDAG-CbKrtIUz.js +4 -0
  263. ksadk/server/static/assets/dagre-Bx709z4p.js +1 -0
  264. ksadk/server/static/assets/defaultLocale-C8Fc0cco.js +1 -0
  265. ksadk/server/static/assets/diagram-2AECGRRQ-BRApgQRK.js +43 -0
  266. ksadk/server/static/assets/diagram-5GNKFQAL-D0xbnDiK.js +10 -0
  267. ksadk/server/static/assets/diagram-KO2AKTUF-CVugVI9L.js +3 -0
  268. ksadk/server/static/assets/diagram-LMA3HP47-DozUGgee.js +24 -0
  269. ksadk/server/static/assets/diagram-OG6HWLK6-ZOYsKlru.js +24 -0
  270. ksadk/server/static/assets/diff-ChtP43wD.js +1 -0
  271. ksadk/server/static/assets/dist-2hInLS_J.js +9 -0
  272. ksadk/server/static/assets/dist-8EEyGgDx.js +1 -0
  273. ksadk/server/static/assets/dist-8_SfK1IP.js +1 -0
  274. ksadk/server/static/assets/dist-B0NP_Z0z.js +23 -0
  275. ksadk/server/static/assets/dist-BIJVDMuB.js +1 -0
  276. ksadk/server/static/assets/dist-BmlMPsCc.js +2 -0
  277. ksadk/server/static/assets/dist-BrCcQ47T.js +1 -0
  278. ksadk/server/static/assets/dist-BssVmjIo.js +6 -0
  279. ksadk/server/static/assets/dist-C3HIIaN5.js +1 -0
  280. ksadk/server/static/assets/dist-CPBtqRTW.js +1 -0
  281. ksadk/server/static/assets/dist-CkEKJFtk.js +1 -0
  282. ksadk/server/static/assets/dist-D-JMdWPQ.js +1 -0
  283. ksadk/server/static/assets/dist-D-xOD048.js +1 -0
  284. ksadk/server/static/assets/dist-D57wnGWd.js +1 -0
  285. ksadk/server/static/assets/dist-DL_NKc_z.js +1 -0
  286. ksadk/server/static/assets/dist-DMezvBGJ.js +1 -0
  287. ksadk/server/static/assets/dist-DmFaq_Iy.js +1 -0
  288. ksadk/server/static/assets/dist-Dp0k7bWI.js +1 -0
  289. ksadk/server/static/assets/dist-DpKtt4Bo.js +1 -0
  290. ksadk/server/static/assets/dist-DyOkZmze.js +11 -0
  291. ksadk/server/static/assets/dist-DyWsb78Q.js +1 -0
  292. ksadk/server/static/assets/dist-gX6GOLKq.js +1 -0
  293. ksadk/server/static/assets/dockerfile-BLkNEvjs.js +1 -0
  294. ksadk/server/static/assets/dtd-DTF72YNO.js +1 -0
  295. ksadk/server/static/assets/dylan-C6jEEEk-.js +1 -0
  296. ksadk/server/static/assets/ebnf-D4c0_ac3.js +1 -0
  297. ksadk/server/static/assets/ecl-BSZaIHnp.js +1 -0
  298. ksadk/server/static/assets/eiffel-BEjRio4Q.js +1 -0
  299. ksadk/server/static/assets/elm-Cshzl8qu.js +1 -0
  300. ksadk/server/static/assets/erDiagram-TEJ5UH35-Bk-9bgE5.js +85 -0
  301. ksadk/server/static/assets/erlang-DaB2Rkuy.js +1 -0
  302. ksadk/server/static/assets/eventmodeling-FCH6USID-DsAgWnlf.js +1 -0
  303. ksadk/server/static/assets/factor-D7LVTn2l.js +1 -0
  304. ksadk/server/static/assets/fcl-ClOhbFR7.js +1 -0
  305. ksadk/server/static/assets/flowDiagram-I6XJVG4X-Dn9kZVuZ.js +162 -0
  306. ksadk/server/static/assets/forth-Cezjo90N.js +1 -0
  307. ksadk/server/static/assets/fortran-Bt6PBEDR.js +1 -0
  308. ksadk/server/static/assets/ganttDiagram-6RSMTGT7-BGxXlJqm.js +292 -0
  309. ksadk/server/static/assets/gas-BHEdbvp9.js +1 -0
  310. ksadk/server/static/assets/gherkin-oBAE_ms0.js +1 -0
  311. ksadk/server/static/assets/gitGraph-WXDBUCRP-BIao9Yjg.js +1 -0
  312. ksadk/server/static/assets/gitGraphDiagram-PVQCEYII-C7Q0X-wi.js +106 -0
  313. ksadk/server/static/assets/graphlib-B8gBHxth.js +1 -0
  314. ksadk/server/static/assets/groovy-BC3IOsC8.js +1 -0
  315. ksadk/server/static/assets/haskell-BRsoo5mP.js +1 -0
  316. ksadk/server/static/assets/haxe-DIz0ZZqd.js +1 -0
  317. ksadk/server/static/assets/http-CLVgA2GD.js +1 -0
  318. ksadk/server/static/assets/idl-BUZw3wgd.js +1 -0
  319. ksadk/server/static/assets/index-C00Lwg3L.js +165 -0
  320. ksadk/server/static/assets/index-DAURbCsP.css +1 -0
  321. ksadk/server/static/assets/info-J43DQDTF-CyipqGxU.js +1 -0
  322. ksadk/server/static/assets/infoDiagram-5YYISTIA-BO_CSqq5.js +2 -0
  323. ksadk/server/static/assets/init-D6jRqBbL.js +1 -0
  324. ksadk/server/static/assets/ishikawaDiagram-YF4QCWOH-eYLPLd46.js +70 -0
  325. ksadk/server/static/assets/javascript-9Tg8ixDm.js +1 -0
  326. ksadk/server/static/assets/journeyDiagram-JHISSGLW-De9geSb0.js +139 -0
  327. ksadk/server/static/assets/julia-CQfgDRfP.js +1 -0
  328. ksadk/server/static/assets/kanban-definition-UN3LZRKU-Cs80kQto.js +89 -0
  329. ksadk/server/static/assets/katex-DSrCFD8n.js +265 -0
  330. ksadk/server/static/assets/linear-CN9sbKTF.js +1 -0
  331. ksadk/server/static/assets/livescript-BXxG0Yva.js +1 -0
  332. ksadk/server/static/assets/lua-CiA1ziua.js +1 -0
  333. ksadk/server/static/assets/mathematica-u8YMmbU0.js +1 -0
  334. ksadk/server/static/assets/mbox-BEMVcqjs.js +1 -0
  335. ksadk/server/static/assets/mermaid-parser.core-DlgSBU8l.js +161 -0
  336. ksadk/server/static/assets/mindmap-definition-RKZ34NQL-9afz7Oug.js +96 -0
  337. ksadk/server/static/assets/mirc-C9zpzAZU.js +1 -0
  338. ksadk/server/static/assets/mllike-B45xgp2S.js +1 -0
  339. ksadk/server/static/assets/modelica-CqHI_q-D.js +1 -0
  340. ksadk/server/static/assets/mscgen-qgSLujhx.js +1 -0
  341. ksadk/server/static/assets/mumps-CW_TBmxz.js +1 -0
  342. ksadk/server/static/assets/nginx-BMaDbqW3.js +1 -0
  343. ksadk/server/static/assets/nsis-AQ_alPln.js +1 -0
  344. ksadk/server/static/assets/ntriples-d28e9m0E.js +1 -0
  345. ksadk/server/static/assets/octave-D2Q8cUp1.js +1 -0
  346. ksadk/server/static/assets/ordinal-hYBb2elL.js +1 -0
  347. ksadk/server/static/assets/oz-BwTct_5T.js +1 -0
  348. ksadk/server/static/assets/packet-YPE3B663-CGkyRxlg.js +1 -0
  349. ksadk/server/static/assets/pascal-Dp_KdFgX.js +1 -0
  350. ksadk/server/static/assets/perl-CdEHsPfU.js +1 -0
  351. ksadk/server/static/assets/pie-LRSECV5Y-M0uWAf4n.js +1 -0
  352. ksadk/server/static/assets/pieDiagram-4H26LBE5-DPv_VstN.js +30 -0
  353. ksadk/server/static/assets/pig-AF4Hwhju.js +1 -0
  354. ksadk/server/static/assets/powershell-CzG71I4L.js +1 -0
  355. ksadk/server/static/assets/properties-C357ku5U.js +1 -0
  356. ksadk/server/static/assets/protobuf-D1ij_kNL.js +1 -0
  357. ksadk/server/static/assets/pug-Bugr-47h.js +1 -0
  358. ksadk/server/static/assets/puppet-B4hC2X4m.js +1 -0
  359. ksadk/server/static/assets/python-BqYw9LYJ.js +1 -0
  360. ksadk/server/static/assets/q-B9NhS7L_.js +1 -0
  361. ksadk/server/static/assets/quadrantDiagram-W4KKPZXB-o77wZ1XK.js +7 -0
  362. ksadk/server/static/assets/r-DADKenSm.js +1 -0
  363. ksadk/server/static/assets/radar-GUYGQ44K-Bdbm24-x.js +1 -0
  364. ksadk/server/static/assets/requirementDiagram-4Y6WPE33-BYVw81VC.js +84 -0
  365. ksadk/server/static/assets/rpm-gpDK5sbt.js +1 -0
  366. ksadk/server/static/assets/ruby-DsYpTuWg.js +1 -0
  367. ksadk/server/static/assets/sankeyDiagram-5OEKKPKP-B7nZFMKT.js +40 -0
  368. ksadk/server/static/assets/sas-C2OyD2Y6.js +1 -0
  369. ksadk/server/static/assets/scheme-CyDdOh7e.js +1 -0
  370. ksadk/server/static/assets/sequenceDiagram-3UESZ5HK-BGRRrFw5.js +162 -0
  371. ksadk/server/static/assets/shell-Du5Qg9im.js +1 -0
  372. ksadk/server/static/assets/sieve-BAxa3IjF.js +1 -0
  373. ksadk/server/static/assets/simple-mode-DRpGK0lJ.js +1 -0
  374. ksadk/server/static/assets/smalltalk-BLp5-jwC.js +1 -0
  375. ksadk/server/static/assets/solr-BBopId9w.js +1 -0
  376. ksadk/server/static/assets/sparql-Dz-mlCAC.js +1 -0
  377. ksadk/server/static/assets/spreadsheet-CTIncYxj.js +1 -0
  378. ksadk/server/static/assets/sql-DcCJ9jop.js +1 -0
  379. ksadk/server/static/assets/stateDiagram-AJRCARHV-BUfHCoPs.js +1 -0
  380. ksadk/server/static/assets/stateDiagram-v2-BHNVJYJU-8xBN_gLM.js +1 -0
  381. ksadk/server/static/assets/stex-sDrdk2BW.js +1 -0
  382. ksadk/server/static/assets/stylus-DLLZ8dgm.js +1 -0
  383. ksadk/server/static/assets/swift-DKB6_1j6.js +1 -0
  384. ksadk/server/static/assets/tcl-BGfruO1u.js +1 -0
  385. ksadk/server/static/assets/textile-DWBqthVk.js +1 -0
  386. ksadk/server/static/assets/tiddlywiki-VlUiK86J.js +1 -0
  387. ksadk/server/static/assets/tiki-CxVlf5KZ.js +1 -0
  388. ksadk/server/static/assets/timeline-definition-PNZ67QCA-FbCTGrf9.js +120 -0
  389. ksadk/server/static/assets/toml-LvoKBwCs.js +1 -0
  390. ksadk/server/static/assets/treeView-BLDUP644-npMo0ak1.js +1 -0
  391. ksadk/server/static/assets/treemap-LRROVOQU-CHdzrrdo.js +1 -0
  392. ksadk/server/static/assets/troff-C2dAgh7P.js +1 -0
  393. ksadk/server/static/assets/ttcn-BePYh-hG.js +1 -0
  394. ksadk/server/static/assets/ttcn-cfg-CY0aot7Q.js +1 -0
  395. ksadk/server/static/assets/turtle-BDLWE2cD.js +1 -0
  396. ksadk/server/static/assets/vb-BthdM_4N.js +1 -0
  397. ksadk/server/static/assets/vbscript-D9f6rSsU.js +1 -0
  398. ksadk/server/static/assets/velocity-CqftRsjg.js +1 -0
  399. ksadk/server/static/assets/vennDiagram-CIIHVFJN-DWgwtPsJ.js +34 -0
  400. ksadk/server/static/assets/verilog-D-x6ne0Z.js +1 -0
  401. ksadk/server/static/assets/vhdl-CMrOq2q1.js +1 -0
  402. ksadk/server/static/assets/wardley-L42UT6IY-BEQz7wyy.js +1 -0
  403. ksadk/server/static/assets/wardleyDiagram-YWT4CUSO-2x8G-tTM.js +78 -0
  404. ksadk/server/static/assets/webidl-D5jiJvOU.js +1 -0
  405. ksadk/server/static/assets/xquery-fj_R-kMw.js +1 -0
  406. ksadk/server/static/assets/xterm-DooSxjI5.js +36 -0
  407. ksadk/server/static/assets/xychartDiagram-2RQKCTM6-Drma3AYl.js +7 -0
  408. ksadk/server/static/assets/yacas-CXXgtw0p.js +1 -0
  409. ksadk/server/static/assets/z80-CL1naaMV.js +1 -0
  410. ksadk/server/static/favicon.svg +1 -0
  411. ksadk/server/static/icons.svg +24 -0
  412. ksadk/server/static/index.html +14 -0
  413. ksadk/server/terminal_sessions.py +551 -0
  414. ksadk/sessions/__init__.py +279 -0
  415. ksadk/sessions/base.py +354 -0
  416. ksadk/sessions/continuity.py +337 -0
  417. ksadk/sessions/errors.py +7 -0
  418. ksadk/sessions/in_memory.py +273 -0
  419. ksadk/sessions/local_service.py +949 -0
  420. ksadk/sessions/postgres_service.py +901 -0
  421. ksadk/sessions/resilience.py +52 -0
  422. ksadk/sessions/resilient.py +360 -0
  423. ksadk/sessions/sqlite_service.py +13 -0
  424. ksadk/skills/__init__.py +9 -0
  425. ksadk/skills/loader.py +46 -0
  426. ksadk/skills/models.py +120 -0
  427. ksadk/skills/package_store.py +104 -0
  428. ksadk/skills/runtime/__init__.py +17 -0
  429. ksadk/skills/runtime/agent.py +183 -0
  430. ksadk/skills/runtime/artifacts.py +39 -0
  431. ksadk/skills/runtime/backends/__init__.py +1 -0
  432. ksadk/skills/runtime/backends/disabled.py +8 -0
  433. ksadk/skills/runtime/backends/e2b.py +168 -0
  434. ksadk/skills/runtime/backends/local.py +95 -0
  435. ksadk/skills/runtime/base.py +103 -0
  436. ksadk/skills/runtime/executor.py +219 -0
  437. ksadk/skills/runtime/factory.py +37 -0
  438. ksadk/skills/runtime/loader.py +131 -0
  439. ksadk/skills/runtime/registry.py +150 -0
  440. ksadk/skills/runtime/request.py +67 -0
  441. ksadk/skills/service_client.py +239 -0
  442. ksadk/skills/service_env.py +58 -0
  443. ksadk/skills/tool_defs.py +221 -0
  444. ksadk/terminal_client.py +69 -0
  445. ksadk/terminal_exec_policy.py +229 -0
  446. ksadk/tools/__init__.py +17 -0
  447. ksadk/tools/gateway.py +230 -0
  448. ksadk/tools/result_budget.py +154 -0
  449. ksadk/toolsets/__init__.py +854 -0
  450. ksadk/toolsets/_langchain.py +11 -0
  451. ksadk/toolsets/platform.py +93 -0
  452. ksadk/toolsets/sandbox.py +310 -0
  453. ksadk/toolsets/skills.py +217 -0
  454. ksadk/toolsets/web.py +266 -0
  455. ksadk/toolsets/workspace.py +917 -0
  456. ksadk/toolsets/workspace_state.py +44 -0
  457. ksadk/tracing/__init__.py +37 -0
  458. ksadk/tracing/exporters/__init__.py +1 -0
  459. ksadk/tracing/exporters/inmemory_exporter.py +116 -0
  460. ksadk/tracing/exporters/langfuse_exporter.py +445 -0
  461. ksadk/tracing/setup.py +892 -0
  462. ksadk/tracing/span_utils.py +114 -0
  463. ksadk/tui/__init__.py +27 -0
  464. ksadk/tui/loop.py +1877 -0
  465. ksadk/tui/stream_render.py +68 -0
  466. ksadk/ui_config.py +168 -0
  467. ksadk/version.py +4 -0
  468. ksadk_runtime_common/__init__.py +20 -0
  469. ksadk_runtime_common/memory_backend/__init__.py +29 -0
  470. ksadk_runtime_common/memory_backend/manifest.py +79 -0
  471. ksadk_runtime_common/memory_backend/providers/__init__.py +6 -0
  472. ksadk_runtime_common/memory_backend/providers/lancedb.py +151 -0
  473. ksadk_runtime_common/memory_backend/providers/mem0.py +74 -0
  474. ksadk_runtime_common/memory_backend/registry.py +56 -0
  475. ksadk_runtime_common/memory_backend/render.py +71 -0
  476. ksadk_runtime_common/schemas/memory_backend_manifest.schema.json +148 -0
  477. ksadk_runtime_common/workspace_files/__init__.py +29 -0
  478. ksadk_runtime_common/workspace_files/bootstrap.py +56 -0
  479. ksadk_runtime_common/workspace_files/constants.py +9 -0
  480. ksadk_runtime_common/workspace_files/path_utils.py +71 -0
  481. ksadk_runtime_common/workspace_files/preview.py +96 -0
  482. ksadk_runtime_common/workspace_files/router.py +254 -0
  483. agentengine_sdk_python/__init__.py +0 -3
  484. agentengine_sdk_python-0.6.4.dist-info/METADATA +0 -48
  485. agentengine_sdk_python-0.6.4.dist-info/RECORD +0 -5
  486. agentengine_sdk_python-0.6.4.dist-info/top_level.txt +0 -1
@@ -0,0 +1,59 @@
1
+ """Validated dependency windows for supported Python agent frameworks."""
2
+
3
+ from __future__ import annotations
4
+
5
+ from typing import Iterable
6
+
7
+
8
+ FASTAPI_REQUIREMENT = "fastapi>=0.100.0,<1.0.0"
9
+
10
+ ADK_REQUIREMENTS = (
11
+ "google-adk>=1.34.0,<2.0.0",
12
+ "litellm>=1.0.0",
13
+ )
14
+
15
+ LANGCHAIN_ECOSYSTEM_REQUIREMENTS = (
16
+ "langchain>=1.3.0,<2.0.0",
17
+ "langchain-openai>=1.2.0,<2.0.0",
18
+ "langchain-core>=1.4.0,<2.0.0",
19
+ "langgraph>=1.2.0,<1.3.0",
20
+ )
21
+
22
+ DEEPAGENTS_REQUIREMENTS = (
23
+ "deepagents>=0.6.2,<1.0.0",
24
+ )
25
+
26
+
27
+ def requirements_for_framework(framework: str) -> list[str]:
28
+ normalized = (framework or "").strip().lower()
29
+ if normalized == "adk":
30
+ return list(ADK_REQUIREMENTS)
31
+ if normalized in {"langchain", "langgraph", "deepagents"}:
32
+ requirements = list(LANGCHAIN_ECOSYSTEM_REQUIREMENTS)
33
+ if normalized == "deepagents":
34
+ requirements.extend(DEEPAGENTS_REQUIREMENTS)
35
+ return requirements
36
+ return []
37
+
38
+
39
+ def minimal_requirements_for_framework(framework: str) -> list[str]:
40
+ """Return deploy-manager requirements without optional MCP adapter packages."""
41
+ normalized = (framework or "").strip().lower()
42
+ if normalized == "adk":
43
+ return list(ADK_REQUIREMENTS)
44
+ if normalized in {"langchain", "langgraph", "deepagents"}:
45
+ requirements = [
46
+ "langchain>=1.3.0,<2.0.0",
47
+ "langchain-openai>=1.2.0,<2.0.0",
48
+ "langchain-core>=1.4.0,<2.0.0",
49
+ ]
50
+ if normalized in {"langgraph", "deepagents"}:
51
+ requirements.append("langgraph>=1.2.0,<1.3.0")
52
+ if normalized == "deepagents":
53
+ requirements.extend(DEEPAGENTS_REQUIREMENTS)
54
+ return requirements
55
+ return []
56
+
57
+
58
+ def as_lines(requirements: Iterable[str]) -> str:
59
+ return "\n".join(requirements)
@@ -0,0 +1,389 @@
1
+ """
2
+ KS3 上传模块 - 金山云对象存储上传
3
+ """
4
+
5
+ import os
6
+ import socket
7
+ import time
8
+ from pathlib import Path
9
+ from concurrent.futures import ThreadPoolExecutor, as_completed
10
+ from typing import Optional
11
+ import click
12
+
13
+ from ks3.upload import UploadTask
14
+
15
+
16
+ from ksadk.common.constants import get_ks3_endpoints
17
+
18
+ # KS3 Region 映射表 已移动到 ksadk.common.constants
19
+
20
+
21
+ class KS3Uploader:
22
+ """KS3 上传器"""
23
+
24
+ ENDPOINT_PROBE_TIMEOUT_SECONDS = 1.5
25
+ UPLOAD_CONNECT_PORT = 443
26
+ UPLOAD_CONNECT_TIMEOUT_SECONDS = 60
27
+ UPLOAD_TIMEOUT_BASE_SECONDS = 300
28
+ UPLOAD_TIMEOUT_PER_MB_SECONDS = 4.0
29
+ UPLOAD_TIMEOUT_MAX_SECONDS = 3600
30
+
31
+ def __init__(self, region: str = "cn-beijing-6", bucket: str = None):
32
+ """初始化 KS3 上传器
33
+
34
+ Args:
35
+ region: KS3 区域 (默认 cn-beijing-6)
36
+ bucket: bucket 名称 (可选)
37
+ - 如果指定,使用指定的 bucket
38
+ - 如果未指定,优先从环境变量 KS3_BUCKET 读取
39
+ - 如果环境变量也未设置,默认使用 agentengine-{region}
40
+ """
41
+ self.region = region
42
+
43
+ # 确定 bucket 名称 (优先级: 参数 > 环境变量 > 默认值)
44
+ if bucket:
45
+ self.bucket_name = bucket
46
+ elif os.getenv("KS3_BUCKET"):
47
+ self.bucket_name = os.getenv("KS3_BUCKET")
48
+ else:
49
+ # Bucket 名称格式: agentengine-{account_id}-{region}
50
+ account_id = os.getenv("KSYUN_ACCOUNT_ID")
51
+ if not account_id:
52
+ # fallback: 从 AK/SK 反查主账号 ID
53
+ try:
54
+ from ksadk.cli.network_options import _resolve_ksyun_credentials
55
+ from ksadk.identity import resolve_identity
56
+
57
+ ak, sk = _resolve_ksyun_credentials()
58
+ if ak and sk:
59
+ identity = resolve_identity(access_key=ak, secret_key=sk)
60
+ account_id = identity.main_account_id if identity else None
61
+ except Exception:
62
+ account_id = None
63
+ if not account_id:
64
+ raise ValueError(
65
+ "❌ 缺少 KSYUN_ACCOUNT_ID 且 AK/SK 反查主账号 ID 失败\n"
66
+ " Bucket 名称格式必须为: agentengine-{account_id}-{region}\n"
67
+ " 请在 .env 文件中设置: KSYUN_ACCOUNT_ID=你的账号ID\n"
68
+ " 或设置 KS3_BUCKET 显式指定 bucket 名称"
69
+ )
70
+ self.bucket_name = f"agentengine-{account_id}-{region}"
71
+
72
+ self.custom_domain = None # 可选的自定义域名
73
+
74
+ def get_endpoint(self) -> str:
75
+ """根据 region 获取首选 endpoint (自动测速/回退)。"""
76
+ targets, _summary = self._rank_upload_endpoints()
77
+ return targets[0]["host"]
78
+
79
+ def _endpoint_mode(self) -> str:
80
+ mode = (os.getenv("KS3_ENDPOINT_MODE") or "auto").strip().lower()
81
+ if mode in {"auto", "internal", "public"}:
82
+ return mode
83
+ return "auto"
84
+
85
+ def _endpoint_probe_timeout_seconds(self) -> float:
86
+ configured = os.getenv("KS3_ENDPOINT_PROBE_TIMEOUT_SECONDS")
87
+ if configured:
88
+ try:
89
+ return max(0.2, float(configured))
90
+ except ValueError:
91
+ pass
92
+ return self.ENDPOINT_PROBE_TIMEOUT_SECONDS
93
+
94
+ def _upload_timeout_seconds(self, file_path: Path) -> int:
95
+ configured = os.getenv("KS3_UPLOAD_TIMEOUT_SECONDS")
96
+ if configured:
97
+ try:
98
+ return max(30, int(float(configured)))
99
+ except ValueError:
100
+ pass
101
+
102
+ size_mb = file_path.stat().st_size / (1024 * 1024)
103
+ calculated = self.UPLOAD_TIMEOUT_BASE_SECONDS + int(size_mb * self.UPLOAD_TIMEOUT_PER_MB_SECONDS)
104
+ return min(self.UPLOAD_TIMEOUT_MAX_SECONDS, max(self.UPLOAD_CONNECT_TIMEOUT_SECONDS, calculated))
105
+
106
+ def _probe_endpoint_latency(self, host: str) -> Optional[float]:
107
+ started_at = time.monotonic()
108
+ try:
109
+ with socket.create_connection(
110
+ (host, self.UPLOAD_CONNECT_PORT),
111
+ timeout=self._endpoint_probe_timeout_seconds(),
112
+ ):
113
+ return time.monotonic() - started_at
114
+ except OSError:
115
+ return None
116
+
117
+ def _rank_upload_endpoints(self) -> tuple[list[dict[str, str]], str]:
118
+ if self.custom_domain:
119
+ return (
120
+ [{"host": self.custom_domain, "label": "自定义域名"}],
121
+ f"使用自定义域名 {self.custom_domain}",
122
+ )
123
+
124
+ public_endpoint, internal_endpoint = get_ks3_endpoints(self.region)
125
+ mode = self._endpoint_mode()
126
+
127
+ candidates: list[dict[str, str]] = []
128
+ seen: set[str] = set()
129
+
130
+ def add_candidate(host: Optional[str], label: str) -> None:
131
+ normalized = (host or "").strip()
132
+ if not normalized or normalized in seen:
133
+ return
134
+ seen.add(normalized)
135
+ candidates.append({"host": normalized, "label": label})
136
+
137
+ if mode == "internal":
138
+ add_candidate(internal_endpoint, "内网")
139
+ add_candidate(public_endpoint, "公网")
140
+ return candidates, f"强制优先内网 {candidates[0]['host']}" if candidates else "未找到可用 KS3 endpoint"
141
+
142
+ if mode == "public":
143
+ add_candidate(public_endpoint, "公网")
144
+ add_candidate(internal_endpoint, "内网")
145
+ return candidates, f"强制优先公网 {candidates[0]['host']}" if candidates else "未找到可用 KS3 endpoint"
146
+
147
+ add_candidate(internal_endpoint, "内网")
148
+ add_candidate(public_endpoint, "公网")
149
+ if not candidates:
150
+ return [], "未找到可用 KS3 endpoint"
151
+
152
+ timings: dict[str, Optional[float]] = {}
153
+ with ThreadPoolExecutor(max_workers=min(2, len(candidates))) as executor:
154
+ future_to_host = {
155
+ executor.submit(self._probe_endpoint_latency, item["host"]): item["host"]
156
+ for item in candidates
157
+ }
158
+ for future in as_completed(future_to_host):
159
+ host = future_to_host[future]
160
+ try:
161
+ timings[host] = future.result()
162
+ except Exception:
163
+ timings[host] = None
164
+
165
+ reachable = [item for item in candidates if timings.get(item["host"]) is not None]
166
+ unreachable = [item for item in candidates if timings.get(item["host"]) is None]
167
+
168
+ if not reachable:
169
+ return candidates, "测速失败,按默认顺序尝试内外网端点"
170
+
171
+ ordered = sorted(reachable, key=lambda item: timings[item["host"]] or float("inf"))
172
+ best = ordered[0]
173
+ best_ms = round((timings[best["host"]] or 0.0) * 1000)
174
+ skipped = ""
175
+ if unreachable:
176
+ skipped_hosts = ", ".join(item["host"] for item in unreachable)
177
+ skipped = f",跳过不可达端点 {skipped_hosts}"
178
+ return ordered, f"测速优先 {best['label']} {best['host']} ({best_ms} ms){skipped}"
179
+
180
+ def _ensure_bucket(self, conn):
181
+ bucket = conn.get_bucket(self.bucket_name)
182
+ bucket_exists = False
183
+
184
+ try:
185
+ list(bucket.list(max_keys=1))
186
+ bucket_exists = True
187
+ click.echo(f" ✓ Bucket 已存在: {self.bucket_name}")
188
+ except Exception as e:
189
+ error_str = str(e)
190
+ if "NoSuchBucket" in error_str or "404" in error_str:
191
+ click.echo(f" Bucket 不存在,正在创建: {self.bucket_name}")
192
+ bucket_exists = False
193
+ else:
194
+ if "AccessDenied" in error_str or "403" in error_str:
195
+ click.secho(f" ⚠️ 提示: Bucket '{self.bucket_name}' 名称冲突或无权限访问 (403)。", fg="yellow")
196
+ click.secho(" 注意: KS3 Bucket 名称在全网范围内是全局唯一的!", fg="yellow")
197
+ click.secho(" 该名称已被其他用户占用,您无法使用。", fg="yellow")
198
+ click.secho(" 👉 解决方案:", fg="cyan")
199
+ click.secho(" 1. (推荐) 在 .env 中设置 KSYUN_ACCOUNT_ID 为您的账户 ID (自动生成唯一名称)。", fg="cyan")
200
+ click.secho(" 2. 或者,在 .env 中设置 KS3_BUCKET 为一个没人用过的唯一名称。", fg="cyan")
201
+ raise
202
+
203
+ if not bucket_exists:
204
+ try:
205
+ bucket = conn.create_bucket(self.bucket_name)
206
+ click.secho(f" ✓ Bucket 创建成功: {self.bucket_name}", fg="green")
207
+ except Exception as create_err:
208
+ create_err_str = str(create_err)
209
+ if "Conflict" in create_err_str or "409" in create_err_str or "BucketAlreadyExists" in create_err_str:
210
+ click.secho(f" ⚠️ 提示: Bucket '{self.bucket_name}' 名称已被其他用户占用。", fg="yellow")
211
+ click.secho(" 注意: KS3 Bucket 名称是全局唯一的。", fg="yellow")
212
+ click.secho(" 👉 解决方法: 修改 .env 中的 KS3_BUCKET,换一个更复杂的名字再试。", fg="cyan")
213
+ raise
214
+
215
+ return bucket
216
+
217
+ @staticmethod
218
+ def _should_use_resumable_upload(file_path: Path) -> bool:
219
+ try:
220
+ return file_path.stat().st_size > 100 * 1024 * 1024
221
+ except OSError:
222
+ return False
223
+
224
+ @staticmethod
225
+ def _resumable_record_path(file_path: Path, object_key: str) -> Path:
226
+ safe_key = object_key.strip().replace("/", "_").replace("\\", "_")
227
+ record_dir = file_path.parent / ".agentengine" / "ks3_resume"
228
+ record_dir.mkdir(parents=True, exist_ok=True)
229
+ return record_dir / f"{safe_key}.ks3resume"
230
+
231
+ def _upload_via_host(self, file_path: Path, object_key: str, host: str) -> bool:
232
+ from ks3.connection import Connection
233
+
234
+ ak = os.environ.get("KSYUN_ACCESS_KEY") or os.environ.get("KS3_ACCESS_KEY")
235
+ sk = os.environ.get("KSYUN_SECRET_KEY") or os.environ.get("KS3_SECRET_KEY")
236
+
237
+ conn = Connection(
238
+ ak,
239
+ sk,
240
+ host=host,
241
+ port=self.UPLOAD_CONNECT_PORT,
242
+ is_secure=True,
243
+ timeout=self._upload_timeout_seconds(file_path),
244
+ )
245
+
246
+ bucket = self._ensure_bucket(conn)
247
+
248
+ key = bucket.new_key(object_key)
249
+ if self._should_use_resumable_upload(file_path):
250
+ worker_count = max(2, min(8, (os.cpu_count() or 4)))
251
+ resume_path = self._resumable_record_path(file_path, object_key)
252
+ click.echo(
253
+ f" 启用断点续传: {file_path.stat().st_size / (1024 * 1024):.2f} MB, "
254
+ f"workers={worker_count}"
255
+ )
256
+ click.echo(f" 续传记录: {resume_path}")
257
+ upload_task = UploadTask(
258
+ key,
259
+ bucket,
260
+ str(file_path),
261
+ executor=ThreadPoolExecutor(max_workers=worker_count),
262
+ resumable=True,
263
+ resumable_filename=str(resume_path),
264
+ )
265
+ result = upload_task.upload(headers={"x-kss-acl": "public-read"})
266
+ else:
267
+ click.echo(f" 普通上传: {file_path.stat().st_size / (1024 * 1024):.2f} MB")
268
+ result = key.set_contents_from_filename(str(file_path), policy="public-read")
269
+
270
+ status = getattr(result, "status", None)
271
+ if status is None:
272
+ response_metadata = getattr(result, "response_metadata", None)
273
+ status = getattr(response_metadata, "status", None)
274
+ return bool(status == 200)
275
+
276
+ async def upload(self, file_path: Path, object_key: str) -> Optional[str]:
277
+ """上传文件到 KS3
278
+
279
+ Args:
280
+ file_path: 本地文件路径
281
+ object_key: KS3 对象键 (如 agents/my_agent/code.zip)
282
+
283
+ Returns:
284
+ 成功返回 ks3:// URI, 失败返回 None
285
+ """
286
+ # 检查环境变量 (优先使用 KSYUN_* 金山云 IAM 凭证)
287
+ ak = os.environ.get("KSYUN_ACCESS_KEY") or os.environ.get("KS3_ACCESS_KEY")
288
+ sk = os.environ.get("KSYUN_SECRET_KEY") or os.environ.get("KS3_SECRET_KEY")
289
+
290
+ if not ak or not sk:
291
+ click.secho("❌ 请在 .env 文件中设置金山云 IAM 凭证:", fg="red")
292
+ click.echo(" KSYUN_ACCESS_KEY=your_access_key")
293
+ click.echo(" KSYUN_SECRET_KEY=your_secret_key")
294
+ return None
295
+
296
+ upload_targets, selection_summary = self._rank_upload_endpoints()
297
+ if not upload_targets:
298
+ click.secho("❌ 未找到可用的 KS3 Endpoint", fg="red")
299
+ return None
300
+
301
+ click.echo(f" KS3 Endpoint 策略: {selection_summary}")
302
+ click.echo(f" 上传文件: {file_path.name} ({file_path.stat().st_size / (1024 * 1024):.2f} MB)")
303
+ click.echo(f" 上传超时: {self._upload_timeout_seconds(file_path)} 秒")
304
+
305
+ # 临时禁用系统代理 (ClashX 等会导致 KS3 上传走代理而失败)
306
+ proxy_env_vars = [
307
+ "HTTP_PROXY",
308
+ "HTTPS_PROXY",
309
+ "http_proxy",
310
+ "https_proxy",
311
+ "ALL_PROXY",
312
+ "all_proxy",
313
+ ]
314
+ saved_proxies = {}
315
+ for var in proxy_env_vars:
316
+ if var in os.environ:
317
+ saved_proxies[var] = os.environ.pop(var)
318
+
319
+ try:
320
+ from ks3.connection import Connection as _Connection # noqa: F401
321
+ except ImportError:
322
+ click.secho("❌ ks3sdk 导入失败,请确保已安装: pip install ksadk[runtime]", fg="red")
323
+ return None
324
+
325
+ try:
326
+ last_error: Optional[Exception] = None
327
+ for index, target in enumerate(upload_targets, start=1):
328
+ host = target["host"]
329
+ label = target["label"]
330
+ click.echo(f" 尝试上传 [{index}/{len(upload_targets)}]: {label} {host}")
331
+ try:
332
+ if self._upload_via_host(file_path, object_key, host):
333
+ click.secho(f" ✓ 上传成功 ({label})", fg="green")
334
+ return f"ks3://{self.bucket_name}/{object_key}"
335
+ click.secho(f" ⚠ 上传未确认成功,准备切换其他端点: {host}", fg="yellow")
336
+ except Exception as e:
337
+ last_error = e
338
+ click.secho(f" ⚠ {label} 上传失败: {e}", fg="yellow")
339
+
340
+ if last_error is not None:
341
+ click.secho(f"❌ KS3 上传失败: {last_error}", fg="red")
342
+ else:
343
+ click.secho("❌ KS3 上传失败: 所有端点均未返回成功状态", fg="red")
344
+ return None
345
+ finally:
346
+ # 恢复代理环境变量
347
+ for var, val in saved_proxies.items():
348
+ os.environ[var] = val
349
+
350
+ @staticmethod
351
+ def _normalize_object_key(object_key: str) -> str:
352
+ """规范化 object_key,避免 URL 出现双斜杠。"""
353
+ return object_key.lstrip("/")
354
+
355
+ def get_public_url_by_key(self, object_key: str) -> str:
356
+ """获取指定 object_key 的公网访问 URL。"""
357
+ endpoint, _ = get_ks3_endpoints(self.region)
358
+ key = self._normalize_object_key(object_key)
359
+ return f"https://{self.bucket_name}.{endpoint}/{key}"
360
+
361
+ def get_internal_url_by_key(self, object_key: str) -> str:
362
+ """获取指定 object_key 的内网访问 URL。"""
363
+ _, endpoint = get_ks3_endpoints(self.region)
364
+ if not endpoint:
365
+ endpoint = f"ks3-internal.{self.region}.ksyun.com"
366
+ key = self._normalize_object_key(object_key)
367
+ return f"https://{self.bucket_name}.{endpoint}/{key}"
368
+
369
+ async def upload_with_url(self, file_path: Path, presigned_url: str) -> bool:
370
+ """使用预签名 URL 上传文件 (不依赖本地 AK/SK)"""
371
+ import httpx
372
+
373
+ click.echo(f" 上传中 (使用预签名 URL)...")
374
+
375
+ try:
376
+ async with httpx.AsyncClient() as client:
377
+ with open(file_path, 'rb') as f:
378
+ response = await client.put(
379
+ presigned_url,
380
+ content=f.read(),
381
+ headers={"Content-Type": "application/octet-stream"},
382
+ timeout=300.0
383
+ )
384
+ response.raise_for_status()
385
+ click.secho(" ✓ 上传成功", fg="green")
386
+ return True
387
+ except Exception as e:
388
+ click.secho(f"❌ 上传失败: {e}", fg="red")
389
+ return False