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,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
@@ -0,0 +1,172 @@
1
+ """Platform-level long-term memory service helpers."""
2
+
3
+ from __future__ import annotations
4
+
5
+ import json
6
+ import logging
7
+ import os
8
+ from typing import Any
9
+
10
+ from ksadk.common.aicp_env import resolve_aicp_connection
11
+ from ksadk.memory.adk.backends.base_ltm_backend import BaseLongTermMemoryBackend
12
+ from ksadk.memory.ltm_backend_factory import get_long_term_memory_backend_cls
13
+
14
+ logger = logging.getLogger(__name__)
15
+
16
+
17
+ def format_memory_entries(entries: list[str]) -> str:
18
+ if not entries:
19
+ return "未找到相关长期记忆。"
20
+
21
+ formatted_entries: list[str] = []
22
+ for index, entry in enumerate(entries, 1):
23
+ text = entry
24
+ try:
25
+ payload = json.loads(entry)
26
+ except (json.JSONDecodeError, TypeError):
27
+ payload = None
28
+
29
+ if isinstance(payload, dict):
30
+ parts = payload.get("parts") or []
31
+ if parts and isinstance(parts[0], dict):
32
+ text = str(parts[0].get("text") or text)
33
+ formatted_entries.append(f"[{index}] {text}")
34
+
35
+ return "\n\n".join(formatted_entries)
36
+
37
+
38
+ class LongTermMemoryService:
39
+ def __init__(
40
+ self,
41
+ *,
42
+ backend: str | BaseLongTermMemoryBackend = "local",
43
+ backend_config: dict[str, Any] | None = None,
44
+ top_k: int = 5,
45
+ index: str = "",
46
+ app_name: str = "",
47
+ ):
48
+ self.backend = backend
49
+ self.backend_config = dict(backend_config or {})
50
+ self.top_k = top_k
51
+ self.app_name = app_name
52
+ backend_index = getattr(backend, "index", "") if isinstance(backend, BaseLongTermMemoryBackend) else ""
53
+ self.index = index or backend_index or app_name or "default_app"
54
+ self._backend = self._resolve_backend()
55
+
56
+ @classmethod
57
+ def from_env(
58
+ cls,
59
+ *,
60
+ app_name: str = "",
61
+ backend: str | None = None,
62
+ ) -> "LongTermMemoryService":
63
+ resolved_backend = backend or os.environ.get("KSADK_LTM_BACKEND", "local")
64
+ top_k = int(os.environ.get("KSADK_LTM_TOP_K", "5"))
65
+ index = os.environ.get("KSADK_LTM_INDEX", "")
66
+ app_name = os.environ.get("KSADK_LTM_APP_NAME", "") or app_name
67
+
68
+ backend_config: dict[str, Any] = {}
69
+ if resolved_backend == "http":
70
+ backend_config = {
71
+ "base_url": os.environ.get("KSADK_LTM_HTTP_URL", ""),
72
+ "token": os.environ.get("KSADK_LTM_HTTP_TOKEN", ""),
73
+ }
74
+ elif resolved_backend == "sdk":
75
+ connection = resolve_aicp_connection("KSADK_LTM")
76
+ backend_config = {
77
+ "access_key": (
78
+ os.environ.get("KSADK_LTM_ACCESS_KEY")
79
+ or os.environ.get("KSYUN_ACCESS_KEY", "")
80
+ ),
81
+ "secret_key": (
82
+ os.environ.get("KSADK_LTM_SECRET_KEY")
83
+ or os.environ.get("KSYUN_SECRET_KEY", "")
84
+ ),
85
+ "region": connection["region"],
86
+ "endpoint": connection["endpoint"],
87
+ "scheme": connection["scheme"],
88
+ "namespace": os.environ.get("KSADK_LTM_NAMESPACE", ""),
89
+ "agent_id": os.environ.get("KSADK_LTM_AGENT_ID", ""),
90
+ "scene_id": os.environ.get("KSADK_LTM_SCENE_ID", "_sys_general"),
91
+ }
92
+
93
+ return cls(
94
+ backend=resolved_backend,
95
+ backend_config=backend_config,
96
+ top_k=top_k,
97
+ index=index,
98
+ app_name=app_name,
99
+ )
100
+
101
+ @staticmethod
102
+ def is_configured() -> bool:
103
+ return bool(str(os.environ.get("KSADK_LTM_BACKEND", "")).strip())
104
+
105
+ def _resolve_backend(self) -> BaseLongTermMemoryBackend:
106
+ if isinstance(self.backend, BaseLongTermMemoryBackend):
107
+ return self.backend
108
+
109
+ backend_cls = get_long_term_memory_backend_cls(str(self.backend))
110
+ config = dict(self.backend_config)
111
+ config.setdefault("index", self.index)
112
+ return backend_cls(**config)
113
+
114
+ def search_entries(self, *, user_id: str, query: str, top_k: int | None = None) -> list[str]:
115
+ return self._backend.search_memory(
116
+ user_id=user_id,
117
+ query=query,
118
+ top_k=top_k if top_k is not None else self.top_k,
119
+ )
120
+
121
+ def search_text(self, *, user_id: str, query: str, top_k: int | None = None) -> str:
122
+ try:
123
+ return format_memory_entries(
124
+ self.search_entries(user_id=user_id, query=query, top_k=top_k)
125
+ )
126
+ except Exception as exc:
127
+ logger.error("load_memory failed: %s", exc)
128
+ return f"长期记忆检索失败: {exc}"
129
+
130
+ def save_event_strings(
131
+ self,
132
+ *,
133
+ user_id: str,
134
+ event_strings: list[str],
135
+ metadata: dict[str, Any] | None = None,
136
+ ) -> bool:
137
+ return bool(
138
+ self._backend.save_memory(
139
+ user_id=user_id,
140
+ event_strings=event_strings,
141
+ metadata=metadata or {},
142
+ )
143
+ )
144
+
145
+ def save_text(self, *, user_id: str, content: str, metadata: dict[str, Any] | None = None) -> bool:
146
+ payload = {
147
+ "role": "user",
148
+ "parts": [{"text": content}],
149
+ "metadata": metadata or {},
150
+ }
151
+ return self.save_event_strings(
152
+ user_id=user_id,
153
+ event_strings=[json.dumps(payload, ensure_ascii=False)],
154
+ metadata=metadata,
155
+ )
156
+
157
+ def build_context(
158
+ self,
159
+ *,
160
+ user_id: str,
161
+ query: str,
162
+ top_k: int | None = None,
163
+ ) -> dict[str, str] | None:
164
+ normalized = str(query or "").strip()
165
+ if not normalized:
166
+ return None
167
+ if not self.is_configured():
168
+ return None
169
+ return {
170
+ "query": normalized,
171
+ "formatted_text": self.search_text(user_id=user_id, query=normalized, top_k=top_k),
172
+ }
ksadk/memory/tool.py ADDED
@@ -0,0 +1,96 @@
1
+ """Cross-framework long-term memory tools."""
2
+
3
+ from __future__ import annotations
4
+
5
+ import logging
6
+
7
+ from ksadk.memory.service import LongTermMemoryService
8
+ from ksadk.runtime_context import get_current_invocation_context
9
+
10
+ logger = logging.getLogger(__name__)
11
+
12
+ _service: LongTermMemoryService | None = None
13
+
14
+
15
+ def _get_or_create_service() -> LongTermMemoryService:
16
+ global _service
17
+ if _service is None:
18
+ _service = LongTermMemoryService.from_env()
19
+ return _service
20
+
21
+
22
+ def load_memory(query: str) -> str:
23
+ context = get_current_invocation_context()
24
+ if context is None:
25
+ return "长期记忆检索失败: 缺少运行时上下文。"
26
+
27
+ try:
28
+ service = _get_or_create_service()
29
+ return service.search_text(user_id=context.user_id, query=query)
30
+ except Exception as exc:
31
+ logger.error("load_memory failed: %s", exc)
32
+ return f"长期记忆检索失败: {exc}"
33
+
34
+
35
+ def _is_sdk_backend(service: LongTermMemoryService) -> bool:
36
+ backend = getattr(service, "_backend", None)
37
+ return backend.__class__.__name__ == "SdkLTMBackend"
38
+
39
+
40
+ def _sdk_pending_result(service: LongTermMemoryService, context) -> dict:
41
+ backend = getattr(service, "_backend", None)
42
+ session_status = None
43
+ get_session_status = getattr(backend, "get_session_status", None)
44
+ if callable(get_session_status):
45
+ session_status = get_session_status(
46
+ user_id=context.user_id,
47
+ session_id=context.session_id,
48
+ )
49
+
50
+ result = {
51
+ "ok": False,
52
+ "status": "accepted_not_extracted",
53
+ "message": "记忆保存请求已被后端受理,但尚未抽取成可检索记忆。",
54
+ }
55
+ if isinstance(session_status, dict):
56
+ result["session_state"] = session_status.get("State")
57
+ result["session_id"] = session_status.get("SessionId") or context.session_id
58
+ elif context.session_id:
59
+ result["session_id"] = context.session_id
60
+ return result
61
+
62
+
63
+ def save_memory(content: str) -> dict:
64
+ context = get_current_invocation_context()
65
+ if context is None:
66
+ return {
67
+ "ok": False,
68
+ "status": "failed",
69
+ "message": "记忆保存失败: 缺少运行时上下文。",
70
+ }
71
+
72
+ try:
73
+ service = _get_or_create_service()
74
+ ok = service.save_text(
75
+ user_id=context.user_id,
76
+ content=content,
77
+ metadata={
78
+ "agent_id": context.agent_id,
79
+ "session_id": context.session_id,
80
+ "runner_type": context.runner_type,
81
+ },
82
+ )
83
+ if ok:
84
+ if _is_sdk_backend(service):
85
+ entries = service.search_entries(user_id=context.user_id, query=content, top_k=1)
86
+ if not entries:
87
+ return _sdk_pending_result(service, context)
88
+ return {"ok": True, "status": "persisted", "message": "记忆已保存。"}
89
+
90
+ backend = getattr(service, "_backend", None)
91
+ last_error = str(getattr(backend, "last_error", "") or "").strip()
92
+ message = f"记忆保存失败: {last_error}" if last_error else "记忆保存失败。"
93
+ return {"ok": False, "status": "failed", "message": message}
94
+ except Exception as exc:
95
+ logger.error("save_memory failed: %s", exc)
96
+ return {"ok": False, "status": "failed", "message": f"记忆保存失败: {exc}"}