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,706 @@
1
+ """
2
+ AgentEngine 统一配置管理
3
+
4
+ 从环境变量加载配置。
5
+ 优先使用开源/业界标准变量名,同时兼容 Serverless 平台定制变量。
6
+
7
+ 使用方式:
8
+ from ksadk.configs import settings
9
+
10
+ # 访问模型配置
11
+ print(settings.model.api_key)
12
+ print(settings.model.api_base)
13
+
14
+ # 访问 Langfuse 配置
15
+ print(settings.langfuse.public_key)
16
+
17
+ # 访问 Agent 运行时信息
18
+ print(settings.agent.agent_id)
19
+ """
20
+
21
+ import os
22
+ import json
23
+ import logging
24
+ import time
25
+ from typing import Optional, List, Dict, Any
26
+ from dataclasses import dataclass, field
27
+ from urllib.parse import urlsplit, urlunsplit
28
+
29
+ logger = logging.getLogger(__name__)
30
+
31
+
32
+ def _get_env(*keys: str, default: str = None) -> Optional[str]:
33
+ """从多个环境变量 key 中获取第一个存在的值
34
+
35
+ 按优先级顺序匹配,支持别名兼容。
36
+ """
37
+ for key in keys:
38
+ value = os.getenv(key)
39
+ if value:
40
+ return value
41
+ return default
42
+
43
+
44
+ # =============================================================================
45
+ # 网络检测工具 (通用)
46
+ # =============================================================================
47
+
48
+ # 缓存检测结果 {host: is_reachable}
49
+ _endpoint_cache: Dict[str, bool] = {}
50
+
51
+
52
+ def _is_internal_runtime_env() -> bool:
53
+ return any(
54
+ os.getenv(key)
55
+ for key in (
56
+ "AGENT_RUNTIME_ID",
57
+ "K_SERVICE",
58
+ "KUBERNETES_SERVICE_HOST",
59
+ )
60
+ )
61
+
62
+
63
+ def _is_public_kspmas_url(url: Optional[str]) -> bool:
64
+ value = (url or "").strip().rstrip("/")
65
+ if not value:
66
+ return False
67
+ return "kspmas.ksyun.com/v1" in value
68
+
69
+
70
+ def check_endpoint_reachable(host: str, port: int = 80, timeout: float = 1.0) -> bool:
71
+ """检测指定端点是否可达
72
+
73
+ 通用函数,可用于检测任意服务的内网地址是否可达。
74
+ 结果会被缓存,相同 host 只检测一次。
75
+
76
+ Args:
77
+ host: 主机名或 IP 地址
78
+ port: 端口号 (默认 80)
79
+ timeout: 超时时间 (默认 1.0 秒)
80
+
81
+ Returns:
82
+ True 如果可达, False 否则
83
+
84
+ Usage:
85
+ # KSPMAS 内网检测
86
+ if check_endpoint_reachable("kspmas-internal.sdns.ksyun.com"):
87
+ api_base = "http://kspmas-internal.sdns.ksyun.com/v1"
88
+
89
+ # KS3 内网检测
90
+ if check_endpoint_reachable("ks3-cn-beijing-internal.ksyuncs.com"):
91
+ ks3_endpoint = "http://ks3-cn-beijing-internal.ksyuncs.com"
92
+ """
93
+ if host in _endpoint_cache:
94
+ return _endpoint_cache[host]
95
+
96
+ try:
97
+ import socket
98
+ # 尝试建立 TCP 连接 (比 ping 更可靠,且不依赖 ICMP)
99
+ s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
100
+ s.settimeout(timeout)
101
+ s.connect((host, port))
102
+ s.close()
103
+
104
+ _endpoint_cache[host] = True
105
+ logger.debug(f"Endpoint reachable: {host}:{port}")
106
+ except (socket.timeout, socket.error, OSError):
107
+ _endpoint_cache[host] = False
108
+ logger.debug(f"Endpoint not reachable: {host}:{port}")
109
+
110
+ return _endpoint_cache[host]
111
+
112
+
113
+ # =============================================================================
114
+ # 金山云模型服务 (KSPMAS)
115
+ # =============================================================================
116
+
117
+ # 服务地址
118
+ KSPMAS_INTERNAL_HOST = "kspmas-internal.sdns.ksyun.com"
119
+ KSPMAS_INTERNAL_URL = f"http://{KSPMAS_INTERNAL_HOST}/v1"
120
+ KSPMAS_PUBLIC_URL = "https://kspmas.ksyun.com/v1"
121
+
122
+ # 默认模型
123
+ DEFAULT_MODEL_NAME = "glm-5.2"
124
+
125
+
126
+ def optimize_kspmas_url(url: str) -> str:
127
+ """优化 KSPMAS URL
128
+
129
+ 如果是 KSPMAS 的公网地址,且检测到内网可达(或在 Serverless 环境),
130
+ 将其替换为内网地址以提高速度和稳定性。
131
+ """
132
+ if not url:
133
+ return url
134
+
135
+ parsed = urlsplit(url)
136
+ if parsed.hostname != "kspmas.ksyun.com":
137
+ return url
138
+
139
+ use_internal = False
140
+ if _is_internal_runtime_env():
141
+ use_internal = True
142
+ elif check_endpoint_reachable(KSPMAS_INTERNAL_HOST):
143
+ use_internal = True
144
+
145
+ if use_internal:
146
+ netloc = KSPMAS_INTERNAL_HOST
147
+ if parsed.port:
148
+ netloc = f"{netloc}:{parsed.port}"
149
+ return urlunsplit(("http", netloc, parsed.path, parsed.query, parsed.fragment))
150
+
151
+ return url
152
+
153
+
154
+ def get_kspmas_api_base() -> str:
155
+ """获取 KSPMAS 模型服务的 API Base URL
156
+
157
+ 自动检测内网可达性,优先使用内网地址。
158
+ **特殊逻辑**: 如果在 Serverless 托管环境 (AGENT_RUNTIME_ID 存在),强制使用内网地址。
159
+ """
160
+ # 1. 托管 / 集群环境强制使用内网
161
+ if _is_internal_runtime_env():
162
+ return KSPMAS_INTERNAL_URL
163
+
164
+ # 2. 自动检测内网可达性
165
+ if check_endpoint_reachable(KSPMAS_INTERNAL_HOST):
166
+ return KSPMAS_INTERNAL_URL
167
+
168
+ # 3. 默认使用公网
169
+ return KSPMAS_PUBLIC_URL
170
+
171
+
172
+ # =============================================================================
173
+ # 模型配置 (LLM)
174
+ # =============================================================================
175
+
176
+ @dataclass
177
+ class ModelConfig:
178
+ """模型配置
179
+
180
+ 标准环境变量 (优先):
181
+ OPENAI_API_KEY - API Key (OpenAI 标准)
182
+ OPENAI_BASE_URL - API Base URL (OpenAI 标准)
183
+ OPENAI_MODEL_NAME - 模型名称
184
+
185
+ 通用格式:
186
+ MODEL_NAME - 模型名称
187
+
188
+ Serverless 平台兼容:
189
+ LLM_API_KEY - 模型 API Key
190
+ LLM_API_BASE - 模型 API 地址
191
+ LLM_MODEL - 模型名称
192
+
193
+ 别名 (兼容):
194
+ OPENAI_API_BASE - API Base URL 别名
195
+
196
+ 默认值:
197
+ OPENAI_BASE_URL: 自动检测内网/外网,使用金山云模型服务
198
+ MODEL_NAME: glm-5.2
199
+ """
200
+
201
+ @property
202
+ def api_key(self) -> Optional[str]:
203
+ """获取模型 API Key"""
204
+ return _get_env(
205
+ "OPENAI_API_KEY", # OpenAI 标准 (优先)
206
+ "LLM_API_KEY", # Serverless 平台兼容
207
+ "MODEL_API_KEY", # 通用
208
+ )
209
+
210
+ @property
211
+ def api_base(self) -> str:
212
+ """获取模型 API Base URL
213
+
214
+ 如果未配置,默认使用金山云模型服务地址(自动检测内网)。
215
+ 如果已配置且为 KSPMAS 公网地址,也会尝试优化为内网地址。
216
+ """
217
+ configured = _get_env(
218
+ "OPENAI_BASE_URL", # OpenAI 标准 (优先)
219
+ "OPENAI_API_BASE", # OpenAI 别名 (兼容)
220
+ "LLM_API_BASE", # Serverless 平台兼容
221
+ "MODEL_API_BASE", # 通用
222
+ )
223
+
224
+ if configured:
225
+ return optimize_kspmas_url(configured)
226
+
227
+ return get_kspmas_api_base()
228
+
229
+ @property
230
+ def model_name(self) -> str:
231
+ """获取模型名称
232
+
233
+ 如果未配置,默认使用 glm-5.2。
234
+ """
235
+ configured = _get_env(
236
+ "OPENAI_MODEL_NAME", # OpenAI 格式 (优先)
237
+ "MODEL_NAME", # 通用
238
+ "LLM_MODEL", # Serverless 平台兼容
239
+ )
240
+ return configured or DEFAULT_MODEL_NAME
241
+
242
+ @property
243
+ def is_configured(self) -> bool:
244
+ """是否已配置 API Key"""
245
+ return bool(self.api_key)
246
+
247
+ @property
248
+ def is_using_internal_network(self) -> bool:
249
+ """是否使用内网地址"""
250
+ return KSPMAS_INTERNAL_URL in self.api_base
251
+
252
+ def to_dict(self) -> dict:
253
+ """转换为字典 (用于 LiteLLM 等)"""
254
+ result = {}
255
+ if self.api_key:
256
+ result["api_key"] = self.api_key
257
+ result["api_base"] = self.api_base
258
+ result["model"] = self.model_name
259
+ return result
260
+
261
+
262
+ # =============================================================================
263
+ # Langfuse 配置
264
+ # =============================================================================
265
+
266
+ @dataclass
267
+ class LangfuseConfig:
268
+ """Langfuse 可观测性配置
269
+
270
+ 标准环境变量 (Langfuse 官方):
271
+ LANGFUSE_PUBLIC_KEY - API Public Key
272
+ LANGFUSE_SECRET_KEY - API Secret Key
273
+ LANGFUSE_HOST - Langfuse 服务地址
274
+
275
+ Serverless 平台扩展:
276
+ LANGFUSE_PROJECT_ID - 项目 ID (区分用户)
277
+ LANGCHAIN_TRACING_V2 - 启用 LangChain 追踪
278
+ """
279
+
280
+ @property
281
+ def public_key(self) -> Optional[str]:
282
+ return os.getenv("LANGFUSE_PUBLIC_KEY")
283
+
284
+ @property
285
+ def secret_key(self) -> Optional[str]:
286
+ return os.getenv("LANGFUSE_SECRET_KEY")
287
+
288
+ @property
289
+ def host(self) -> str:
290
+ return _get_env(
291
+ "LANGFUSE_HOST",
292
+ "LANGFUSE_BASE_URL",
293
+ default="http://localhost:3000"
294
+ )
295
+
296
+ @property
297
+ def project_id(self) -> Optional[str]:
298
+ """Langfuse 项目 ID (Serverless 平台扩展)"""
299
+ return os.getenv("LANGFUSE_PROJECT_ID")
300
+
301
+ @property
302
+ def tracing_enabled(self) -> bool:
303
+ """是否启用 LangChain tracing"""
304
+ return os.getenv("LANGCHAIN_TRACING_V2", "").lower() == "true"
305
+
306
+ @property
307
+ def is_enabled(self) -> bool:
308
+ """是否启用 Langfuse (有 public_key 就启用)"""
309
+ return bool(self.public_key)
310
+
311
+ @property
312
+ def is_configured(self) -> bool:
313
+ """是否完整配置"""
314
+ return bool(self.public_key and self.secret_key)
315
+
316
+ def to_dict(self) -> dict:
317
+ """转换为字典"""
318
+ return {
319
+ "public_key": self.public_key,
320
+ "secret_key": self.secret_key,
321
+ "host": self.host,
322
+ }
323
+
324
+
325
+ # =============================================================================
326
+ # Agent 配置
327
+ # =============================================================================
328
+
329
+ @dataclass
330
+ class AgentConfig:
331
+ """Agent 配置
332
+
333
+ 标准环境变量 (OpenTelemetry 兼容):
334
+ OTEL_SERVICE_NAME - 服务名称 (映射到 agent_name)
335
+ OTEL_RESOURCE_ATTRIBUTES - 资源属性 (key=value 格式)
336
+
337
+ 通用环境变量:
338
+ AGENT_ID - Agent 唯一 ID
339
+ AGENT_NAME - Agent 名称
340
+ TENANT_ID - 租户 ID
341
+ USER_ID - 用户 ID
342
+ ENVIRONMENT - 运行环境 (dev/staging/prod)
343
+ VERSION - 版本号
344
+
345
+ Serverless 平台兼容:
346
+ AGENT_RUNTIME_ID - Agent 唯一 ID
347
+ AGENT_RUNTIME_NAME - Agent 名称
348
+ ACCOUNT_ID - 账户 ID (租户)
349
+ """
350
+
351
+ @property
352
+ def agent_id(self) -> Optional[str]:
353
+ """Agent 唯一 ID"""
354
+ return _get_env(
355
+ "AGENT_ID", # 通用 (优先)
356
+ "AGENT_RUNTIME_ID", # Serverless 平台兼容
357
+ )
358
+
359
+ @property
360
+ def agent_name(self) -> Optional[str]:
361
+ """Agent 名称"""
362
+ return _get_env(
363
+ "AGENT_NAME", # 通用 (优先)
364
+ "AGENT_RUNTIME_NAME", # Serverless 平台兼容
365
+ "OTEL_SERVICE_NAME", # OpenTelemetry 标准
366
+ )
367
+
368
+ @property
369
+ def tenant_id(self) -> Optional[str]:
370
+ """租户 ID"""
371
+ return _get_env(
372
+ "TENANT_ID", # 通用 (优先)
373
+ "ACCOUNT_ID", # Serverless 平台兼容
374
+ )
375
+
376
+ @property
377
+ def user_id(self) -> Optional[str]:
378
+ """用户 ID"""
379
+ return os.getenv("USER_ID")
380
+
381
+ @property
382
+ def session_id(self) -> Optional[str]:
383
+ """会话 ID (用于 Langfuse Sessions 功能)"""
384
+ return os.getenv("SESSION_ID")
385
+
386
+ @property
387
+ def environment(self) -> Optional[str]:
388
+ """运行环境 (dev/staging/prod)"""
389
+ return os.getenv("ENVIRONMENT")
390
+
391
+ @property
392
+ def version(self) -> Optional[str]:
393
+ """Agent 版本"""
394
+ return os.getenv("VERSION")
395
+
396
+ @property
397
+ def tags(self) -> Optional[List[str]]:
398
+ """标签列表 (逗号分隔)"""
399
+ tags_str = os.getenv("TAGS", "")
400
+ tags = [t.strip() for t in tags_str.split(",") if t.strip()]
401
+ return tags if tags else None
402
+
403
+ @property
404
+ def extra_metadata(self) -> Optional[Dict[str, Any]]:
405
+ """额外的元数据"""
406
+ extra = {}
407
+
408
+ # 1. 解析 JSON 格式的 metadata
409
+ extra_json = os.getenv("METADATA")
410
+ if extra_json:
411
+ try:
412
+ extra.update(json.loads(extra_json))
413
+ except json.JSONDecodeError:
414
+ logger.warning(f"Invalid METADATA JSON: {extra_json}")
415
+
416
+ # 2. 解析 OTEL_RESOURCE_ATTRIBUTES
417
+ otel_attrs = os.getenv("OTEL_RESOURCE_ATTRIBUTES", "")
418
+ if otel_attrs:
419
+ for pair in otel_attrs.split(","):
420
+ if "=" in pair:
421
+ key, value = pair.split("=", 1)
422
+ if key not in ("service.name", "service.version"):
423
+ extra[key] = value
424
+
425
+ return extra if extra else None
426
+
427
+ @property
428
+ def is_configured(self) -> bool:
429
+ """是否有 Agent 信息"""
430
+ return bool(self.agent_id or self.agent_name)
431
+
432
+ # ------------------
433
+ # Langfuse 集成方法
434
+ # ------------------
435
+
436
+ def to_langfuse_params(self) -> dict:
437
+ """转换为 Langfuse trace() 方法的原生参数"""
438
+ params = {}
439
+ if self.session_id:
440
+ params["session_id"] = self.session_id
441
+ if self.user_id:
442
+ params["user_id"] = self.user_id
443
+ if self.tags:
444
+ params["tags"] = self.tags
445
+ if self.version:
446
+ params["version"] = self.version
447
+ return params
448
+
449
+ def to_langfuse_metadata(self) -> dict:
450
+ """转换为 Langfuse metadata 字段"""
451
+ metadata = {}
452
+ if self.agent_id:
453
+ metadata["agent_id"] = self.agent_id
454
+ if self.agent_name:
455
+ metadata["agent_name"] = self.agent_name
456
+ if self.tenant_id:
457
+ metadata["tenant_id"] = self.tenant_id
458
+ if self.environment:
459
+ metadata["environment"] = self.environment
460
+ if self.extra_metadata:
461
+ metadata.update(self.extra_metadata)
462
+ return metadata
463
+
464
+
465
+ # =============================================================================
466
+ # 金山云配置
467
+ # =============================================================================
468
+
469
+ @dataclass
470
+ class KingsoftCloudConfig:
471
+ """金山云 SDK 配置
472
+
473
+ 环境变量:
474
+ KS_ACCESS_KEY_ID - Access Key ID
475
+ KS_SECRET_ACCESS_KEY - Secret Access Key
476
+ KS_REGION - 区域 (默认 cn-beijing-6)
477
+ """
478
+
479
+ @property
480
+ def access_key_id(self) -> Optional[str]:
481
+ return os.getenv("KS_ACCESS_KEY_ID")
482
+
483
+ @property
484
+ def secret_access_key(self) -> Optional[str]:
485
+ return os.getenv("KS_SECRET_ACCESS_KEY")
486
+
487
+ @property
488
+ def region(self) -> str:
489
+ return os.getenv("KS_REGION", "cn-beijing-6")
490
+
491
+ @property
492
+ def is_configured(self) -> bool:
493
+ """是否已配置"""
494
+ return bool(self.access_key_id and self.secret_access_key)
495
+
496
+
497
+ # =============================================================================
498
+ # Code 模式配置
499
+ # =============================================================================
500
+
501
+ @dataclass
502
+ class CodeModeConfig:
503
+ """Code 模式配置 (Serverless 平台)
504
+
505
+ 环境变量:
506
+ PYTHONPATH - Python 模块路径
507
+ CODE_PATH - 代码目录
508
+ """
509
+
510
+ @property
511
+ def python_path(self) -> Optional[str]:
512
+ return os.getenv("PYTHONPATH")
513
+
514
+ @property
515
+ def code_path(self) -> Optional[str]:
516
+ return os.getenv("CODE_PATH")
517
+
518
+ @property
519
+ def is_code_mode(self) -> bool:
520
+ """是否为 Code 模式"""
521
+ return bool(self.code_path)
522
+
523
+
524
+ # =============================================================================
525
+ # OpenTelemetry 配置
526
+ # =============================================================================
527
+
528
+ @dataclass
529
+ class OTelConfig:
530
+ """OpenTelemetry 配置 (标准环境变量)
531
+
532
+ 环境变量:
533
+ OTEL_SERVICE_NAME - 服务名称
534
+ OTEL_RESOURCE_ATTRIBUTES - 资源属性 (key=value,key2=value2)
535
+ OTEL_EXPORTER_OTLP_ENDPOINT - OTLP 导出端点
536
+ """
537
+
538
+ @property
539
+ def service_name(self) -> Optional[str]:
540
+ return os.getenv("OTEL_SERVICE_NAME")
541
+
542
+ @property
543
+ def resource_attributes(self) -> Optional[Dict[str, str]]:
544
+ """解析 OTEL_RESOURCE_ATTRIBUTES"""
545
+ attrs_str = os.getenv("OTEL_RESOURCE_ATTRIBUTES", "")
546
+ if not attrs_str:
547
+ return None
548
+
549
+ attrs = {}
550
+ for pair in attrs_str.split(","):
551
+ if "=" in pair:
552
+ key, value = pair.split("=", 1)
553
+ attrs[key] = value
554
+ return attrs if attrs else None
555
+
556
+ @property
557
+ def otlp_endpoint(self) -> Optional[str]:
558
+ return _get_env(
559
+ "OTEL_EXPORTER_OTLP_ENDPOINT",
560
+ "OTEL_EXPORTER_OTLP_TRACES_ENDPOINT",
561
+ )
562
+
563
+ @property
564
+ def is_enabled(self) -> bool:
565
+ """是否启用 OTLP 导出"""
566
+ return bool(self.otlp_endpoint)
567
+
568
+
569
+ # =============================================================================
570
+ # 统一配置入口
571
+ # =============================================================================
572
+
573
+ @dataclass
574
+ class Settings:
575
+ """统一配置入口
576
+
577
+ 使用方式:
578
+ from ksadk.configs import settings
579
+
580
+ # 模型配置
581
+ if settings.model.is_configured:
582
+ llm = LiteLLM(api_key=settings.model.api_key)
583
+
584
+ # Langfuse 配置
585
+ if settings.langfuse.is_enabled:
586
+ setup_tracing(langfuse_config=settings.langfuse.to_dict())
587
+
588
+ # Agent 信息
589
+ print(settings.agent.agent_id)
590
+ """
591
+ model: ModelConfig = field(default_factory=ModelConfig)
592
+ langfuse: LangfuseConfig = field(default_factory=LangfuseConfig)
593
+ agent: AgentConfig = field(default_factory=AgentConfig)
594
+ cloud: KingsoftCloudConfig = field(default_factory=KingsoftCloudConfig)
595
+ code: CodeModeConfig = field(default_factory=CodeModeConfig)
596
+ otel: OTelConfig = field(default_factory=OTelConfig)
597
+
598
+ def summary(self) -> str:
599
+ """输出配置摘要"""
600
+ lines = ["AgentEngine Configuration:"]
601
+ lines.append(f" Model: {'✅ Configured' if self.model.is_configured else '❌ Not configured'}")
602
+ lines.append(f" Langfuse: {'✅ Enabled' if self.langfuse.is_enabled else '⚪ Disabled'}")
603
+
604
+ agent_info = self.agent.agent_id or self.agent.agent_name
605
+ lines.append(f" Agent: {'✅ ' + agent_info if agent_info else '⚪ No info'}")
606
+
607
+ lines.append(f" Cloud: {'✅ Configured' if self.cloud.is_configured else '⚪ Not configured'}")
608
+ lines.append(f" CodeMode: {'✅ ' + self.code.code_path if self.code.is_code_mode else '⚪ Container mode'}")
609
+ lines.append(f" OTEL: {'✅ Enabled' if self.otel.is_enabled else '⚪ Disabled'}")
610
+ return "\n".join(lines)
611
+
612
+ def __repr__(self) -> str:
613
+ return self.summary()
614
+
615
+
616
+ # 全局单例
617
+ settings = Settings()
618
+
619
+
620
+ # ------------------
621
+ # 环境初始化工具
622
+ # ------------------
623
+
624
+ DEFAULT_RUNTIME_TIMEZONE = "Asia/Shanghai"
625
+
626
+
627
+ def setup_environment(agent_path: "Path"):
628
+ """加载环境变量并注入智能默认配置
629
+
630
+ 1. 加载项目根目录的 .env 文件 (override=True)
631
+ 2. 注入 OPENAI_API_BASE (智能检测)
632
+ 3. 注入 OPENAI_MODEL_NAME (默认值)
633
+ """
634
+ import click
635
+ import os
636
+ from pathlib import Path
637
+ try:
638
+ from dotenv import load_dotenv
639
+ except ImportError:
640
+ # 如果没有安装 python-dotenv,则跳过 loading .env
641
+ load_dotenv = None
642
+
643
+ # 1. 加载 .env
644
+ if load_dotenv:
645
+ # Ensure agent_path is a Path object
646
+ if isinstance(agent_path, str):
647
+ agent_path = Path(agent_path)
648
+
649
+ env_file = agent_path / ".env"
650
+ if env_file.exists():
651
+ # override=False: 保留通过 API/Serverless 平台注入的环境变量 (优先级高)
652
+ load_dotenv(env_file, override=False)
653
+
654
+ # 本地调试与托管运行时统一默认北京时间;用户通过 shell/.env/平台显式指定 TZ 时不覆盖。
655
+ os.environ.setdefault("TZ", DEFAULT_RUNTIME_TIMEZONE)
656
+ if hasattr(time, "tzset"):
657
+ time.tzset()
658
+
659
+ # 1.5. 托管运行时里不要保留公网 KSPMAS 地址,否则用户代码优先读取 OPENAI_BASE_URL
660
+ # 会绕开后续的内网自动探测,导致 Serverless Pod 访问公网模型网关超时。
661
+ if _is_internal_runtime_env():
662
+ for env_key in ("OPENAI_BASE_URL", "OPENAI_API_BASE"):
663
+ raw_value = os.getenv(env_key, "")
664
+ if _is_public_kspmas_url(raw_value):
665
+ os.environ.pop(env_key, None)
666
+
667
+ # 2. Coze SDK 兼容映射
668
+ # 某些 Coze 导出项目(tool 内使用 coze_coding_dev_sdk)会强依赖 COZE_* 环境变量,
669
+ # 本地通常只配置了 OPENAI_*,这里做一次非覆盖式映射。
670
+ coze_api_key = os.getenv("COZE_WORKLOAD_IDENTITY_API_KEY")
671
+ coze_base_url = os.getenv("COZE_INTEGRATION_BASE_URL")
672
+ coze_model_base_url = os.getenv("COZE_INTEGRATION_MODEL_BASE_URL")
673
+
674
+ openai_api_key = _get_env("OPENAI_API_KEY", "LLM_API_KEY", "MODEL_API_KEY")
675
+ openai_base_url = _get_env(
676
+ "OPENAI_BASE_URL",
677
+ "OPENAI_API_BASE",
678
+ "LLM_API_BASE",
679
+ "MODEL_API_BASE",
680
+ )
681
+
682
+ if not coze_api_key and openai_api_key:
683
+ os.environ["COZE_WORKLOAD_IDENTITY_API_KEY"] = openai_api_key
684
+ if not coze_base_url and openai_base_url:
685
+ os.environ["COZE_INTEGRATION_BASE_URL"] = openai_base_url
686
+ if not coze_model_base_url and openai_base_url:
687
+ os.environ["COZE_INTEGRATION_MODEL_BASE_URL"] = openai_base_url
688
+
689
+ # 3. 注入 Intelligent Defaults
690
+ # API Base. 兼容 OpenAI SDK/LangChain 常见的 OPENAI_BASE_URL 与历史 OPENAI_API_BASE。
691
+ if not os.getenv("OPENAI_BASE_URL") or not os.getenv("OPENAI_API_BASE"):
692
+ api_base = settings.model.api_base
693
+ if api_base:
694
+ if not os.getenv("OPENAI_BASE_URL"):
695
+ os.environ["OPENAI_BASE_URL"] = api_base
696
+ if not os.getenv("OPENAI_API_BASE"):
697
+ os.environ["OPENAI_API_BASE"] = api_base
698
+ click.echo(f"🔧 API Base: {click.style(api_base, fg='cyan')} (Auto-detected)")
699
+
700
+ # Model Name
701
+ if not os.getenv("OPENAI_MODEL_NAME"):
702
+ model_name = settings.model.model_name
703
+ os.environ["OPENAI_MODEL_NAME"] = model_name
704
+ click.echo(f"🧠 Model: {click.style(model_name, fg='cyan')} (Default)")
705
+ if not os.getenv("MODEL_NAME") and os.getenv("OPENAI_MODEL_NAME"):
706
+ os.environ["MODEL_NAME"] = os.getenv("OPENAI_MODEL_NAME", "")