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,112 @@
1
+ """In-Memory Backend - 内存存储 (开发/测试用)"""
2
+
3
+ import json
4
+ from datetime import datetime, timedelta
5
+ from typing import Any, Optional, List, Dict
6
+ from collections import defaultdict
7
+
8
+ from ksadk.memory.backends.base import BaseMemoryBackend
9
+
10
+
11
+ class InMemoryBackend(BaseMemoryBackend):
12
+ """内存存储后端
13
+
14
+ 适用于开发和测试,数据在进程退出后丢失。
15
+ """
16
+
17
+ def __init__(self):
18
+ # {session_id: {key: (value, expires_at)}}
19
+ self._data: Dict[str, Dict[str, tuple]] = defaultdict(dict)
20
+ # {session_id: [messages]}
21
+ self._messages: Dict[str, List[Dict]] = defaultdict(list)
22
+
23
+ def _make_key(self, key: str, session_id: Optional[str]) -> tuple:
24
+ """生成复合键"""
25
+ sid = session_id or "__global__"
26
+ return sid, key
27
+
28
+ def _is_expired(self, expires_at: Optional[datetime]) -> bool:
29
+ if expires_at is None:
30
+ return False
31
+ return datetime.utcnow() > expires_at
32
+
33
+ def get(self, key: str, session_id: Optional[str] = None) -> Optional[Any]:
34
+ sid, k = self._make_key(key, session_id)
35
+
36
+ if sid not in self._data or k not in self._data[sid]:
37
+ return None
38
+
39
+ value, expires_at = self._data[sid][k]
40
+
41
+ if self._is_expired(expires_at):
42
+ del self._data[sid][k]
43
+ return None
44
+
45
+ return value
46
+
47
+ def set(
48
+ self,
49
+ key: str,
50
+ value: Any,
51
+ session_id: Optional[str] = None,
52
+ ttl: Optional[timedelta] = None,
53
+ ) -> bool:
54
+ sid, k = self._make_key(key, session_id)
55
+
56
+ expires_at = None
57
+ if ttl:
58
+ expires_at = datetime.utcnow() + ttl
59
+
60
+ self._data[sid][k] = (value, expires_at)
61
+ return True
62
+
63
+ def delete(self, key: str, session_id: Optional[str] = None) -> bool:
64
+ sid, k = self._make_key(key, session_id)
65
+
66
+ if sid in self._data and k in self._data[sid]:
67
+ del self._data[sid][k]
68
+ return True
69
+ return False
70
+
71
+ def exists(self, key: str, session_id: Optional[str] = None) -> bool:
72
+ return self.get(key, session_id) is not None
73
+
74
+ def clear_session(self, session_id: str) -> bool:
75
+ if session_id in self._data:
76
+ del self._data[session_id]
77
+ if session_id in self._messages:
78
+ del self._messages[session_id]
79
+ return True
80
+
81
+ def add_message(
82
+ self,
83
+ session_id: str,
84
+ role: str,
85
+ content: str,
86
+ metadata: Optional[Dict] = None,
87
+ ) -> bool:
88
+ msg = {
89
+ "role": role,
90
+ "content": content,
91
+ "timestamp": datetime.utcnow().isoformat() + "Z",
92
+ }
93
+ if metadata:
94
+ msg["metadata"] = metadata
95
+
96
+ self._messages[session_id].append(msg)
97
+ return True
98
+
99
+ def get_messages(
100
+ self,
101
+ session_id: str,
102
+ limit: Optional[int] = None,
103
+ ) -> List[Dict]:
104
+ messages = self._messages.get(session_id, [])
105
+
106
+ if limit:
107
+ return messages[-limit:]
108
+ return messages.copy()
109
+
110
+ def close(self) -> None:
111
+ self._data.clear()
112
+ self._messages.clear()
@@ -0,0 +1,146 @@
1
+ """Redis Backend - Redis 存储 (短期记忆)"""
2
+
3
+ import json
4
+ from datetime import datetime, timedelta
5
+ from typing import Any, Optional, List, Dict
6
+
7
+ from ksadk.memory.backends.base import BaseMemoryBackend
8
+
9
+
10
+ class RedisBackend(BaseMemoryBackend):
11
+ """Redis 存储后端
12
+
13
+ 适用于短期记忆和会话状态存储。
14
+
15
+ 使用示例:
16
+ backend = RedisBackend(url="redis://localhost:6379/0")
17
+ """
18
+
19
+ def __init__(
20
+ self,
21
+ url: str = "redis://localhost:6379/0",
22
+ prefix: str = "ksadk:memory:",
23
+ default_ttl: Optional[timedelta] = None,
24
+ ):
25
+ self.url = url
26
+ self.prefix = prefix
27
+ self.default_ttl = default_ttl
28
+ self._client = None
29
+
30
+ @property
31
+ def client(self):
32
+ """懒加载 Redis 客户端"""
33
+ if self._client is None:
34
+ try:
35
+ import redis
36
+ self._client = redis.from_url(self.url, decode_responses=True)
37
+ except ImportError:
38
+ raise ImportError("redis package required. Install with: pip install redis")
39
+ return self._client
40
+
41
+ def _make_key(self, key: str, session_id: Optional[str]) -> str:
42
+ """生成 Redis 键"""
43
+ if session_id:
44
+ return f"{self.prefix}session:{session_id}:{key}"
45
+ return f"{self.prefix}global:{key}"
46
+
47
+ def _messages_key(self, session_id: str) -> str:
48
+ return f"{self.prefix}messages:{session_id}"
49
+
50
+ def get(self, key: str, session_id: Optional[str] = None) -> Optional[Any]:
51
+ redis_key = self._make_key(key, session_id)
52
+ value = self.client.get(redis_key)
53
+
54
+ if value is None:
55
+ return None
56
+
57
+ try:
58
+ return json.loads(value)
59
+ except json.JSONDecodeError:
60
+ return value
61
+
62
+ def set(
63
+ self,
64
+ key: str,
65
+ value: Any,
66
+ session_id: Optional[str] = None,
67
+ ttl: Optional[timedelta] = None,
68
+ ) -> bool:
69
+ redis_key = self._make_key(key, session_id)
70
+
71
+ # 序列化
72
+ if not isinstance(value, str):
73
+ value = json.dumps(value, ensure_ascii=False)
74
+
75
+ # 设置过期时间
76
+ ex = None
77
+ if ttl:
78
+ ex = int(ttl.total_seconds())
79
+ elif self.default_ttl:
80
+ ex = int(self.default_ttl.total_seconds())
81
+
82
+ self.client.set(redis_key, value, ex=ex)
83
+ return True
84
+
85
+ def delete(self, key: str, session_id: Optional[str] = None) -> bool:
86
+ redis_key = self._make_key(key, session_id)
87
+ return self.client.delete(redis_key) > 0
88
+
89
+ def exists(self, key: str, session_id: Optional[str] = None) -> bool:
90
+ redis_key = self._make_key(key, session_id)
91
+ return self.client.exists(redis_key) > 0
92
+
93
+ def clear_session(self, session_id: str) -> bool:
94
+ pattern = f"{self.prefix}session:{session_id}:*"
95
+ keys = list(self.client.scan_iter(match=pattern))
96
+
97
+ # 也删除消息
98
+ keys.append(self._messages_key(session_id))
99
+
100
+ if keys:
101
+ self.client.delete(*keys)
102
+ return True
103
+
104
+ def add_message(
105
+ self,
106
+ session_id: str,
107
+ role: str,
108
+ content: str,
109
+ metadata: Optional[Dict] = None,
110
+ ) -> bool:
111
+ msg = {
112
+ "role": role,
113
+ "content": content,
114
+ "timestamp": datetime.utcnow().isoformat() + "Z",
115
+ }
116
+ if metadata:
117
+ msg["metadata"] = metadata
118
+
119
+ redis_key = self._messages_key(session_id)
120
+ self.client.rpush(redis_key, json.dumps(msg, ensure_ascii=False))
121
+
122
+ # 可以设置消息历史的过期时间
123
+ if self.default_ttl:
124
+ self.client.expire(redis_key, int(self.default_ttl.total_seconds()))
125
+
126
+ return True
127
+
128
+ def get_messages(
129
+ self,
130
+ session_id: str,
131
+ limit: Optional[int] = None,
132
+ ) -> List[Dict]:
133
+ redis_key = self._messages_key(session_id)
134
+
135
+ if limit:
136
+ # 获取最后 N 条
137
+ raw = self.client.lrange(redis_key, -limit, -1)
138
+ else:
139
+ raw = self.client.lrange(redis_key, 0, -1)
140
+
141
+ return [json.loads(m) for m in raw]
142
+
143
+ def close(self) -> None:
144
+ if self._client:
145
+ self._client.close()
146
+ self._client = None
@@ -0,0 +1,39 @@
1
+ """LangChain / LangGraph long-term memory tool wrappers."""
2
+
3
+ from __future__ import annotations
4
+
5
+ import logging
6
+
7
+ from ksadk.memory.tool import load_memory as _load_memory
8
+ from ksadk.memory.tool import save_memory as _save_memory
9
+
10
+ logger = logging.getLogger(__name__)
11
+
12
+
13
+ def create_langchain_tools():
14
+ try:
15
+ from langchain_core.tools import tool
16
+
17
+ @tool
18
+ def load_memory_tool(query: str) -> str:
19
+ """检索当前用户的长期记忆。"""
20
+
21
+ return _load_memory(query)
22
+
23
+ @tool
24
+ def save_memory_tool(content: str) -> dict:
25
+ """保存一条长期记忆。"""
26
+
27
+ return _save_memory(content)
28
+
29
+ load_memory_tool.name = "load_memory"
30
+ save_memory_tool.name = "save_memory"
31
+ return load_memory_tool, save_memory_tool
32
+ except ImportError:
33
+ logger.warning(
34
+ "langchain-core not installed, returning raw functions. Install with: pip install langchain-core"
35
+ )
36
+ return _load_memory, _save_memory
37
+
38
+
39
+ load_memory, save_memory = create_langchain_tools()
@@ -0,0 +1,24 @@
1
+ """Shared long-term memory backend resolution."""
2
+
3
+ from __future__ import annotations
4
+
5
+
6
+ def get_long_term_memory_backend_cls(backend: str) -> type:
7
+ if backend == "local":
8
+ from ksadk.memory.adk.backends.inmemory_ltm_backend import InMemoryLTMBackend
9
+
10
+ return InMemoryLTMBackend
11
+
12
+ if backend == "http":
13
+ from ksadk.memory.adk.backends.http_ltm_backend import HttpLTMBackend
14
+
15
+ return HttpLTMBackend
16
+
17
+ if backend == "sdk":
18
+ from ksadk.memory.adk.backends.sdk_ltm_backend import SdkLTMBackend
19
+
20
+ return SdkLTMBackend
21
+
22
+ raise ValueError(
23
+ f"Unsupported long term memory backend: {backend}. Available: local, http, sdk"
24
+ )
@@ -0,0 +1,215 @@
1
+ """Memory Manager - 统一记忆管理接口"""
2
+
3
+ import os
4
+ import logging
5
+ from datetime import timedelta
6
+ from typing import Any, Optional, List, Dict, Type
7
+
8
+ from ksadk.memory.backends.base import BaseMemoryBackend
9
+ from ksadk.memory.backends.memory import InMemoryBackend
10
+
11
+ logger = logging.getLogger(__name__)
12
+
13
+
14
+ # 后端注册表
15
+ _BACKENDS: Dict[str, Type[BaseMemoryBackend]] = {
16
+ "memory": InMemoryBackend,
17
+ }
18
+
19
+
20
+ def register_backend(name: str, backend_class: Type[BaseMemoryBackend]):
21
+ """注册自定义后端"""
22
+ _BACKENDS[name] = backend_class
23
+
24
+
25
+ class MemoryManager:
26
+ """统一记忆管理器
27
+
28
+ 支持可插拔后端,自动从环境变量读取配置。
29
+
30
+ 使用示例:
31
+ # 从环境变量自动配置
32
+ memory = MemoryManager.from_env()
33
+
34
+ # 手动配置
35
+ memory = MemoryManager(backend="redis", url="redis://localhost:6379")
36
+
37
+ # 存取数据
38
+ memory.set("key", {"data": "value"}, session_id="sess-123")
39
+ data = memory.get("key", session_id="sess-123")
40
+
41
+ # 消息历史
42
+ memory.add_message("sess-123", "user", "你好")
43
+ memory.add_message("sess-123", "assistant", "你好!有什么可以帮助你的?")
44
+ messages = memory.get_messages("sess-123")
45
+ """
46
+
47
+ def __init__(
48
+ self,
49
+ backend: str = "memory",
50
+ url: Optional[str] = None,
51
+ prefix: str = "ksadk:memory:",
52
+ default_ttl: Optional[timedelta] = None,
53
+ **kwargs,
54
+ ):
55
+ """初始化 Memory Manager
56
+
57
+ Args:
58
+ backend: 后端类型 ("memory", "redis")
59
+ url: 后端连接 URL
60
+ prefix: 键名前缀
61
+ default_ttl: 默认过期时间
62
+ **kwargs: 传递给后端的额外参数
63
+ """
64
+ self.backend_name = backend
65
+ self._backend = self._create_backend(backend, url, prefix, default_ttl, **kwargs)
66
+
67
+ def _create_backend(
68
+ self,
69
+ backend: str,
70
+ url: Optional[str],
71
+ prefix: str,
72
+ default_ttl: Optional[timedelta],
73
+ **kwargs,
74
+ ) -> BaseMemoryBackend:
75
+ """创建后端实例"""
76
+ # 延迟导入 Redis backend
77
+ if backend == "redis":
78
+ from ksadk.memory.backends.redis import RedisBackend
79
+ _BACKENDS["redis"] = RedisBackend
80
+
81
+ if backend not in _BACKENDS:
82
+ raise ValueError(f"Unknown backend: {backend}. Available: {list(_BACKENDS.keys())}")
83
+
84
+ backend_class = _BACKENDS[backend]
85
+
86
+ # 根据后端类型传递参数
87
+ if backend == "memory":
88
+ return backend_class()
89
+ elif backend == "redis":
90
+ return backend_class(url=url, prefix=prefix, default_ttl=default_ttl, **kwargs)
91
+ else:
92
+ return backend_class(**kwargs)
93
+
94
+ @classmethod
95
+ def from_env(cls) -> "MemoryManager":
96
+ """从环境变量创建 MemoryManager
97
+
98
+ 环境变量:
99
+ KSADK_MEMORY_BACKEND: 后端类型 (默认 "memory")
100
+ KSADK_MEMORY_URL: 连接 URL (如 redis://localhost:6379)
101
+ KSADK_MEMORY_PREFIX: 键名前缀 (默认 "ksadk:memory:")
102
+ KSADK_MEMORY_TTL: 默认 TTL 秒数 (可选)
103
+ """
104
+ backend = os.environ.get("KSADK_MEMORY_BACKEND", "memory")
105
+ url = os.environ.get("KSADK_MEMORY_URL", "")
106
+ prefix = os.environ.get("KSADK_MEMORY_PREFIX", "ksadk:memory:")
107
+
108
+ ttl = None
109
+ ttl_str = os.environ.get("KSADK_MEMORY_TTL", "")
110
+ if ttl_str:
111
+ ttl = timedelta(seconds=int(ttl_str))
112
+
113
+ logger.debug(f"MemoryManager.from_env: backend={backend}, url={url[:20]}...")
114
+
115
+ return cls(
116
+ backend=backend,
117
+ url=url or None,
118
+ prefix=prefix,
119
+ default_ttl=ttl,
120
+ )
121
+
122
+ # ===== 键值操作 =====
123
+
124
+ def get(self, key: str, session_id: Optional[str] = None) -> Optional[Any]:
125
+ """获取值"""
126
+ return self._backend.get(key, session_id)
127
+
128
+ def set(
129
+ self,
130
+ key: str,
131
+ value: Any,
132
+ session_id: Optional[str] = None,
133
+ ttl: Optional[timedelta] = None,
134
+ ) -> bool:
135
+ """设置值"""
136
+ return self._backend.set(key, value, session_id, ttl)
137
+
138
+ def delete(self, key: str, session_id: Optional[str] = None) -> bool:
139
+ """删除键"""
140
+ return self._backend.delete(key, session_id)
141
+
142
+ def exists(self, key: str, session_id: Optional[str] = None) -> bool:
143
+ """检查键是否存在"""
144
+ return self._backend.exists(key, session_id)
145
+
146
+ # ===== 会话操作 =====
147
+
148
+ def clear_session(self, session_id: str) -> bool:
149
+ """清除会话所有数据"""
150
+ return self._backend.clear_session(session_id)
151
+
152
+ # ===== 消息历史 =====
153
+
154
+ def add_message(
155
+ self,
156
+ session_id: str,
157
+ role: str,
158
+ content: str,
159
+ metadata: Optional[Dict] = None,
160
+ ) -> bool:
161
+ """添加消息"""
162
+ return self._backend.add_message(session_id, role, content, metadata)
163
+
164
+ def get_messages(
165
+ self,
166
+ session_id: str,
167
+ limit: Optional[int] = None,
168
+ ) -> List[Dict]:
169
+ """获取消息历史"""
170
+ return self._backend.get_messages(session_id, limit)
171
+
172
+ # ===== 便捷方法 =====
173
+
174
+ def get_state(self, session_id: str) -> Dict:
175
+ """获取会话状态 (短期记忆)"""
176
+ return self.get("__state__", session_id) or {}
177
+
178
+ def set_state(self, session_id: str, state: Dict, ttl: Optional[timedelta] = None) -> bool:
179
+ """设置会话状态"""
180
+ return self.set("__state__", state, session_id, ttl)
181
+
182
+ def update_state(self, session_id: str, updates: Dict) -> bool:
183
+ """更新会话状态 (合并)"""
184
+ current = self.get_state(session_id)
185
+ current.update(updates)
186
+ return self.set_state(session_id, current)
187
+
188
+ def close(self) -> None:
189
+ """关闭连接"""
190
+ self._backend.close()
191
+
192
+ def __enter__(self):
193
+ return self
194
+
195
+ def __exit__(self, exc_type, exc_val, exc_tb):
196
+ self.close()
197
+
198
+
199
+ # 全局单例 (懒加载)
200
+ _global_manager: Optional[MemoryManager] = None
201
+
202
+
203
+ def get_memory_manager() -> MemoryManager:
204
+ """获取全局 MemoryManager 单例
205
+
206
+ 在 Agent 代码中使用:
207
+ from ksadk.memory import get_memory_manager
208
+
209
+ memory = get_memory_manager()
210
+ memory.set("key", "value")
211
+ """
212
+ global _global_manager
213
+ if _global_manager is None:
214
+ _global_manager = MemoryManager.from_env()
215
+ return _global_manager