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,304 @@
1
+ """ShortTermMemory - 短期记忆 (会话管理)
2
+
3
+ 封装 Google ADK 的 SessionService,提供统一的会话创建和管理接口。
4
+ 通过环境变量配置后端类型,由 ADKRunner 自动注入。
5
+
6
+ 参考 VeADK: veadk/memory/short_term_memory.py
7
+
8
+ 环境变量:
9
+ KSADK_SESSION_BACKEND: 统一 session 后端类型 (memory / local / sqlite / postgres)
10
+ KSADK_SESSION_DSN: 统一 session 数据库 DSN
11
+ KSADK_STM_BACKEND: 旧短期记忆后端类型 (local / sqlite / database)
12
+ KSADK_STM_DB_URL: 旧数据库连接 URL (sqlite/database 时需要)
13
+
14
+ 使用示例:
15
+ # InMemory (默认,开发测试)
16
+ stm = ShortTermMemory(backend="local")
17
+
18
+ # SQLite 持久化
19
+ stm = ShortTermMemory(backend="sqlite")
20
+
21
+ # 自定义数据库
22
+ stm = ShortTermMemory(db_url="postgresql+asyncpg://user:pass@host/db")
23
+ """
24
+
25
+ import logging
26
+ import os
27
+ from typing import Any, Literal, Optional
28
+
29
+ from google.adk.sessions import (
30
+ BaseSessionService,
31
+ InMemorySessionService,
32
+ Session,
33
+ )
34
+ from pydantic import BaseModel, PrivateAttr
35
+
36
+ logger = logging.getLogger(__name__)
37
+
38
+
39
+ def _env_first(*names: str) -> str:
40
+ for name in names:
41
+ value = str(os.environ.get(name, "")).strip()
42
+ if value:
43
+ return value
44
+ return ""
45
+
46
+
47
+ def _normalize_backend_name(backend: str) -> str:
48
+ normalized = str(backend or "").strip().lower()
49
+ if normalized == "memory":
50
+ return "local"
51
+ if normalized == "postgres":
52
+ return "database"
53
+ return normalized
54
+
55
+
56
+ def _normalize_database_url(db_url: str) -> str:
57
+ """Normalize sqlite URLs for google.adk DatabaseSessionService.
58
+
59
+ ADK uses SQLAlchemy async engines underneath, so plain `sqlite:///...`
60
+ URLs fail while `sqlite+aiosqlite:///...` works.
61
+ """
62
+ normalized = str(db_url or "").strip()
63
+ if not normalized:
64
+ return ""
65
+ if normalized.startswith("sqlite+aiosqlite:"):
66
+ return normalized
67
+ if normalized.startswith("sqlite:"):
68
+ return "sqlite+aiosqlite:" + normalized[len("sqlite:") :]
69
+ return normalized
70
+
71
+
72
+ def _session_backend_requires_database_url(backend: str) -> bool:
73
+ return _normalize_backend_name(backend) == "database"
74
+
75
+
76
+ class ShortTermMemory(BaseModel):
77
+ """短期记忆 - 会话管理
78
+
79
+ 封装 Google ADK 的 SessionService,所有短期记忆内容(系统提示、
80
+ 历史消息、模型回复)都会发送给模型。
81
+
82
+ Attributes:
83
+ backend: 后端类型
84
+ - "local": InMemorySessionService (默认,开发测试)
85
+ - "sqlite": DatabaseSessionService (SQLite 本地持久化)
86
+ - "database": DatabaseSessionService (自定义数据库 URL)
87
+ db_url: 数据库连接 URL (backend 为 sqlite/database 时使用)
88
+ local_database_path: SQLite 文件路径 (backend 为 sqlite 时使用)
89
+
90
+ Examples:
91
+ ```python
92
+ # InMemory (开发)
93
+ stm = ShortTermMemory(backend="local")
94
+
95
+ # SQLite 持久化
96
+ stm = ShortTermMemory(backend="sqlite", local_database_path="/tmp/ksadk.db")
97
+
98
+ # 从环境变量自动创建
99
+ stm = ShortTermMemory.from_env()
100
+ ```
101
+ """
102
+
103
+ backend: Literal["local", "sqlite", "database"] = "local"
104
+ db_url: str = ""
105
+ local_database_path: str = "/tmp/ksadk_local_database.db"
106
+
107
+ _session_service: BaseSessionService = PrivateAttr()
108
+
109
+ def model_post_init(self, __context: Any) -> None:
110
+ # 优先使用 db_url
111
+ if self.db_url:
112
+ logger.info("ShortTermMemory: using db_url (ignoring backend option)")
113
+ self._init_database_service(self.db_url)
114
+ return
115
+
116
+ match self.backend:
117
+ case "local":
118
+ self._session_service = InMemorySessionService()
119
+ logger.info("ShortTermMemory: using InMemorySessionService")
120
+
121
+ case "sqlite":
122
+ db_url = _normalize_database_url(
123
+ f"sqlite:///{self.local_database_path}"
124
+ )
125
+ self._init_database_service(db_url)
126
+ logger.info(
127
+ f"ShortTermMemory: using SQLite at "
128
+ f"{self.local_database_path}"
129
+ )
130
+
131
+ case "database":
132
+ if not self.db_url:
133
+ raise ValueError(
134
+ "KSADK_SESSION_DSN is required when ADK session backend "
135
+ "resolves to database/postgres"
136
+ )
137
+ else:
138
+ self._init_database_service(self.db_url)
139
+
140
+ case _:
141
+ logger.warning(
142
+ f"ShortTermMemory: unknown backend '{self.backend}', "
143
+ f"falling back to InMemorySessionService"
144
+ )
145
+ self._session_service = InMemorySessionService()
146
+
147
+ def _init_database_service(self, db_url: str) -> None:
148
+ """初始化数据库 SessionService"""
149
+ normalized_db_url = _normalize_database_url(db_url)
150
+ try:
151
+ from google.adk.sessions import DatabaseSessionService
152
+
153
+ from ksadk.memory.adk.resilient_session_service import ResilientADKSessionService
154
+ from ksadk.sessions.resilience import session_backend_timeout_seconds
155
+
156
+ service_kwargs = {}
157
+ if normalized_db_url.startswith(("postgresql://", "postgresql+asyncpg://")):
158
+ timeout = session_backend_timeout_seconds()
159
+ service_kwargs["connect_args"] = {
160
+ "timeout": timeout,
161
+ "command_timeout": timeout,
162
+ }
163
+
164
+ self._session_service = ResilientADKSessionService(
165
+ DatabaseSessionService(db_url=normalized_db_url, **service_kwargs)
166
+ )
167
+ logger.info(
168
+ f"ShortTermMemory: using DatabaseSessionService "
169
+ f"({normalized_db_url[:30]}...)"
170
+ )
171
+ except ImportError:
172
+ logger.warning(
173
+ "DatabaseSessionService not available. "
174
+ "Install google-adk with database support. "
175
+ "Falling back to InMemorySessionService."
176
+ )
177
+ self._session_service = InMemorySessionService()
178
+ self.backend = "local"
179
+ except Exception as e:
180
+ logger.error(
181
+ f"Failed to create DatabaseSessionService: {e}. "
182
+ f"Falling back to InMemorySessionService."
183
+ )
184
+ self._session_service = InMemorySessionService()
185
+ self.backend = "local"
186
+
187
+ @property
188
+ def session_service(self) -> BaseSessionService:
189
+ """获取底层的 SessionService 实例"""
190
+ return self._session_service
191
+
192
+ async def create_session(
193
+ self,
194
+ app_name: str,
195
+ user_id: str,
196
+ session_id: str = "",
197
+ ) -> Optional[Session]:
198
+ """创建或获取 session
199
+
200
+ 如果 session_id 对应的 session 已存在,直接返回。
201
+ 否则创建新的 session。
202
+
203
+ Args:
204
+ app_name: 应用名称
205
+ user_id: 用户 ID
206
+ session_id: 会话 ID (可选,为空时由 ADK 自动生成)
207
+
208
+ Returns:
209
+ Session 对象,创建失败时返回 None
210
+ """
211
+ # 尝试获取已存在的 session
212
+ if session_id:
213
+ try:
214
+ session = await self._session_service.get_session(
215
+ app_name=app_name,
216
+ user_id=user_id,
217
+ session_id=session_id,
218
+ )
219
+ if session:
220
+ logger.debug(
221
+ f"Session {session_id} already exists "
222
+ f"(app={app_name}, user={user_id})"
223
+ )
224
+ return session
225
+ except Exception as e:
226
+ logger.debug(f"Session {session_id} not found: {e}")
227
+
228
+ # 创建新 session
229
+ try:
230
+ if session_id:
231
+ session = await self._session_service.create_session(
232
+ app_name=app_name,
233
+ user_id=user_id,
234
+ session_id=session_id,
235
+ )
236
+ else:
237
+ session = await self._session_service.create_session(
238
+ app_name=app_name,
239
+ user_id=user_id,
240
+ )
241
+ logger.info(
242
+ f"Created session: id={session.id}, "
243
+ f"app={app_name}, user={user_id}"
244
+ )
245
+ return session
246
+ except Exception as e:
247
+ logger.error(f"Failed to create session: {e}")
248
+ return None
249
+
250
+ @classmethod
251
+ def from_env(cls) -> "ShortTermMemory":
252
+ """从环境变量创建 ShortTermMemory
253
+
254
+ 环境变量:
255
+ KSADK_ADK_SESSION_BACKEND: ADK 专用 backend
256
+ KSADK_ADK_SESSION_URL: ADK 专用数据库 URL
257
+ KSADK_ADK_SESSION_PATH: ADK 专用 SQLite 路径
258
+ KSADK_STM_BACKEND: 平台级 STM backend
259
+ KSADK_STM_URL / KSADK_STM_DB_URL: 平台级数据库 URL
260
+ KSADK_STM_PATH / KSADK_STM_DB_PATH: 平台级 SQLite 路径
261
+ KSADK_SESSION_BACKEND: 统一 session backend fallback
262
+ KSADK_SESSION_DSN: 统一 session DSN fallback
263
+ """
264
+ explicit_backend = _normalize_backend_name(
265
+ _env_first(
266
+ "KSADK_ADK_SESSION_BACKEND",
267
+ "KSADK_STM_BACKEND",
268
+ "KSADK_SESSION_BACKEND",
269
+ )
270
+ )
271
+ db_url = _normalize_database_url(
272
+ _env_first(
273
+ "KSADK_ADK_SESSION_URL",
274
+ "KSADK_STM_URL",
275
+ "KSADK_STM_DB_URL",
276
+ "KSADK_SESSION_DSN",
277
+ )
278
+ )
279
+ configured_db_path = _env_first(
280
+ "KSADK_ADK_SESSION_PATH",
281
+ "KSADK_STM_PATH",
282
+ "KSADK_STM_DB_PATH",
283
+ )
284
+ db_path = configured_db_path or "/tmp/ksadk_local_database.db"
285
+
286
+ backend = explicit_backend
287
+ if _session_backend_requires_database_url(backend) and not db_url:
288
+ raise ValueError(
289
+ "KSADK_SESSION_DSN is required when ADK session backend "
290
+ "resolves to database/postgres"
291
+ )
292
+ if not backend:
293
+ if db_url:
294
+ backend = "database"
295
+ elif configured_db_path:
296
+ backend = "sqlite"
297
+ else:
298
+ backend = "local"
299
+
300
+ return cls(
301
+ backend=backend,
302
+ db_url=db_url,
303
+ local_database_path=db_path,
304
+ )
@@ -0,0 +1,31 @@
1
+ """ADK wrapper for platform save_memory tool."""
2
+
3
+ from __future__ import annotations
4
+
5
+ import logging
6
+
7
+ from ksadk.memory.tool import save_memory as _save_memory
8
+
9
+ logger = logging.getLogger(__name__)
10
+
11
+
12
+ def save_memory(content: str) -> dict:
13
+ """保存一条长期记忆。"""
14
+
15
+ result = _save_memory(content)
16
+ return {
17
+ "result": result.get("message", ""),
18
+ **result,
19
+ }
20
+
21
+
22
+ def create_adk_tool():
23
+ try:
24
+ from google.adk.tools import FunctionTool
25
+
26
+ return FunctionTool(func=save_memory)
27
+ except ImportError:
28
+ logger.warning(
29
+ "google-adk not installed, returning raw function as tool. Install with: pip install ksadk[adk]"
30
+ )
31
+ return save_memory
@@ -0,0 +1,6 @@
1
+ """Memory Backends Package"""
2
+
3
+ from ksadk.memory.backends.base import BaseMemoryBackend
4
+ from ksadk.memory.backends.memory import InMemoryBackend
5
+
6
+ __all__ = ["BaseMemoryBackend", "InMemoryBackend"]
@@ -0,0 +1,103 @@
1
+ """Base Memory Backend - 抽象基类"""
2
+
3
+ from abc import ABC, abstractmethod
4
+ from typing import Any, Optional, List, Dict
5
+ from datetime import timedelta
6
+
7
+
8
+ class BaseMemoryBackend(ABC):
9
+ """记忆存储后端抽象基类
10
+
11
+ 所有后端实现必须继承此类并实现以下方法。
12
+ """
13
+
14
+ @abstractmethod
15
+ def get(self, key: str, session_id: Optional[str] = None) -> Optional[Any]:
16
+ """获取值
17
+
18
+ Args:
19
+ key: 键名
20
+ session_id: 可选的会话 ID,用于隔离不同会话的数据
21
+
22
+ Returns:
23
+ 存储的值,不存在返回 None
24
+ """
25
+ pass
26
+
27
+ @abstractmethod
28
+ def set(
29
+ self,
30
+ key: str,
31
+ value: Any,
32
+ session_id: Optional[str] = None,
33
+ ttl: Optional[timedelta] = None,
34
+ ) -> bool:
35
+ """设置值
36
+
37
+ Args:
38
+ key: 键名
39
+ value: 值 (会自动序列化)
40
+ session_id: 可选的会话 ID
41
+ ttl: 可选的过期时间
42
+
43
+ Returns:
44
+ 是否成功
45
+ """
46
+ pass
47
+
48
+ @abstractmethod
49
+ def delete(self, key: str, session_id: Optional[str] = None) -> bool:
50
+ """删除键
51
+
52
+ Args:
53
+ key: 键名
54
+ session_id: 可选的会话 ID
55
+
56
+ Returns:
57
+ 是否成功
58
+ """
59
+ pass
60
+
61
+ @abstractmethod
62
+ def exists(self, key: str, session_id: Optional[str] = None) -> bool:
63
+ """检查键是否存在"""
64
+ pass
65
+
66
+ @abstractmethod
67
+ def clear_session(self, session_id: str) -> bool:
68
+ """清除整个会话的所有数据"""
69
+ pass
70
+
71
+ # ===== 消息历史相关 (短期记忆) =====
72
+
73
+ @abstractmethod
74
+ def add_message(
75
+ self,
76
+ session_id: str,
77
+ role: str,
78
+ content: str,
79
+ metadata: Optional[Dict] = None,
80
+ ) -> bool:
81
+ """添加消息到会话历史"""
82
+ pass
83
+
84
+ @abstractmethod
85
+ def get_messages(
86
+ self,
87
+ session_id: str,
88
+ limit: Optional[int] = None,
89
+ ) -> List[Dict]:
90
+ """获取会话消息历史
91
+
92
+ Args:
93
+ session_id: 会话 ID
94
+ limit: 最近 N 条消息,None 表示全部
95
+
96
+ Returns:
97
+ 消息列表 [{role, content, timestamp, ...}]
98
+ """
99
+ pass
100
+
101
+ def close(self) -> None:
102
+ """关闭连接 (可选实现)"""
103
+ pass
@@ -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