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,231 @@
1
+ from __future__ import annotations
2
+
3
+ import json
4
+ import os
5
+ import inspect
6
+ from dataclasses import dataclass
7
+ from typing import Any, Sequence
8
+ from urllib.parse import urlparse
9
+
10
+ import httpx
11
+ from google.adk.tools.mcp_tool.mcp_session_manager import (
12
+ CheckableMcpHttpClientFactory,
13
+ StreamableHTTPConnectionParams,
14
+ )
15
+ from google.adk.tools.mcp_tool.mcp_toolset import McpToolset
16
+
17
+ MCP_TOOLSET_KEY_ATTR = "_ksadk_mcp_toolset_key"
18
+
19
+
20
+ @dataclass(frozen=True)
21
+ class MCPServerConfig:
22
+ name: str
23
+ url: str
24
+ api_key: str | None = None
25
+ tool_filter: tuple[str, ...] = ()
26
+ tool_name_prefix: str | None = None
27
+
28
+ @property
29
+ def dedupe_key(self) -> str:
30
+ return f"{self.url}|{self.tool_name_prefix or ''}"
31
+
32
+ @property
33
+ def headers(self) -> dict[str, str] | None:
34
+ if not self.api_key:
35
+ return None
36
+ return {"Authorization": f"Bearer {self.api_key}"}
37
+
38
+
39
+ def mcp_tools_enabled() -> bool:
40
+ value = os.environ.get("KSADK_ENABLE_MCP_TOOLS", "1").strip().lower()
41
+ return value not in {"0", "false", "no", "off"}
42
+
43
+
44
+ def load_mcp_server_configs(raw_value: str | None = None) -> list[MCPServerConfig]:
45
+ raw = raw_value if raw_value is not None else os.environ.get("KSADK_MCP_SERVERS", "")
46
+ raw = raw.strip()
47
+ if not raw:
48
+ return []
49
+
50
+ try:
51
+ payload = json.loads(raw)
52
+ except json.JSONDecodeError as exc:
53
+ raise ValueError("KSADK_MCP_SERVERS must be a valid JSON array") from exc
54
+
55
+ if not isinstance(payload, list):
56
+ raise ValueError("KSADK_MCP_SERVERS must be a JSON array")
57
+
58
+ return [_parse_server_config(item, index) for index, item in enumerate(payload)]
59
+
60
+
61
+ def build_connection_params(
62
+ config: MCPServerConfig,
63
+ *,
64
+ httpx_client_factory: CheckableMcpHttpClientFactory | None = None,
65
+ ) -> StreamableHTTPConnectionParams:
66
+ kwargs: dict[str, Any] = {"url": config.url, "headers": config.headers}
67
+ kwargs["httpx_client_factory"] = httpx_client_factory or _default_httpx_client_factory(config.url)
68
+ return StreamableHTTPConnectionParams(**kwargs)
69
+
70
+
71
+ def build_mcp_toolset(
72
+ config: MCPServerConfig,
73
+ *,
74
+ httpx_client_factory: CheckableMcpHttpClientFactory | None = None,
75
+ ) -> McpToolset:
76
+ toolset = McpToolset(
77
+ connection_params=build_connection_params(
78
+ config,
79
+ httpx_client_factory=httpx_client_factory,
80
+ ),
81
+ tool_filter=list(config.tool_filter) or None,
82
+ tool_name_prefix=config.tool_name_prefix,
83
+ )
84
+ setattr(toolset, MCP_TOOLSET_KEY_ATTR, config.dedupe_key)
85
+ setattr(toolset, "_ksadk_mcp_server_name", config.name)
86
+ return toolset
87
+
88
+
89
+ def load_mcp_toolsets_from_env() -> list[McpToolset]:
90
+ return [build_mcp_toolset(config) for config in load_mcp_server_configs()]
91
+
92
+
93
+ def register_mcp_toolset_descriptors(toolset: Any) -> list[str]:
94
+ """Best-effort registration of MCP tool descriptors for ksadk tool_search.
95
+
96
+ Execution stays with the MCP runtime/toolset. This only makes the tools
97
+ discoverable in ksadk's unified tool catalog.
98
+ """
99
+
100
+ try:
101
+ from ksadk.toolsets import register_external_tools
102
+ except Exception:
103
+ return []
104
+
105
+ tools = _mcp_toolset_tools_sync(toolset)
106
+ if not tools:
107
+ return []
108
+ server_name = str(getattr(toolset, "_ksadk_mcp_server_name", "") or "mcp").strip() or "mcp"
109
+ return register_external_tools(
110
+ tools,
111
+ group=f"mcp:{server_name}",
112
+ boundary="ksadk_managed_mcp_tool",
113
+ risk_level="medium",
114
+ enabled=True,
115
+ )
116
+
117
+
118
+ def _default_httpx_client_factory(url: str) -> CheckableMcpHttpClientFactory:
119
+ hostname = (urlparse(url).hostname or "").lower()
120
+ trust_env = hostname not in {"localhost", "127.0.0.1", "::1"}
121
+
122
+ def _factory(headers=None, timeout=None, auth=None):
123
+ return httpx.AsyncClient(
124
+ headers=headers,
125
+ timeout=timeout,
126
+ auth=auth,
127
+ follow_redirects=True,
128
+ trust_env=trust_env,
129
+ )
130
+
131
+ return _factory
132
+
133
+
134
+ def _mcp_toolset_tools_sync(toolset: Any) -> list[Any]:
135
+ get_tools = getattr(toolset, "get_tools_with_prefix", None)
136
+ if not callable(get_tools):
137
+ return []
138
+ try:
139
+ result = get_tools()
140
+ except Exception:
141
+ return []
142
+ if inspect.isawaitable(result):
143
+ try:
144
+ import asyncio
145
+
146
+ try:
147
+ asyncio.get_running_loop()
148
+ except RuntimeError:
149
+ result = asyncio.run(result)
150
+ else:
151
+ close = getattr(result, "close", None)
152
+ if callable(close):
153
+ close()
154
+ return []
155
+ except Exception:
156
+ return []
157
+ if isinstance(result, Sequence) and not isinstance(result, (str, bytes, bytearray)):
158
+ return list(result)
159
+ return []
160
+
161
+
162
+ def _parse_server_config(item: Any, index: int) -> MCPServerConfig:
163
+ if not isinstance(item, dict):
164
+ raise ValueError(f"KSADK_MCP_SERVERS[{index}] must be an object")
165
+
166
+ name = _require_non_empty_string(item.get("name"), f"KSADK_MCP_SERVERS[{index}].name")
167
+ url = _validate_mcp_url(
168
+ _require_non_empty_string(item.get("url"), f"KSADK_MCP_SERVERS[{index}].url")
169
+ )
170
+ api_key = _optional_string(item.get("api_key"))
171
+ tool_filter = tuple(
172
+ _string_list(
173
+ item.get("tool_filter"),
174
+ f"KSADK_MCP_SERVERS[{index}].tool_filter",
175
+ )
176
+ )
177
+ tool_name_prefix = _optional_string(item.get("tool_name_prefix"))
178
+
179
+ return MCPServerConfig(
180
+ name=name,
181
+ url=url,
182
+ api_key=api_key,
183
+ tool_filter=tool_filter,
184
+ tool_name_prefix=tool_name_prefix,
185
+ )
186
+
187
+
188
+ def _require_non_empty_string(value: Any, field_name: str) -> str:
189
+ if not isinstance(value, str) or not value.strip():
190
+ raise ValueError(f"{field_name} must be a non-empty string")
191
+ return value.strip()
192
+
193
+
194
+ def _optional_string(value: Any) -> str | None:
195
+ if value is None:
196
+ return None
197
+ if not isinstance(value, str):
198
+ raise ValueError("Optional MCP config fields must be strings")
199
+ stripped = value.strip()
200
+ return stripped or None
201
+
202
+
203
+ def _string_list(value: Any, field_name: str) -> Sequence[str]:
204
+ if value is None:
205
+ return ()
206
+ if not isinstance(value, list) or any(
207
+ not isinstance(item, str) or not item.strip() for item in value
208
+ ):
209
+ raise ValueError(f"{field_name} must be a list of non-empty strings")
210
+ return [item.strip() for item in value]
211
+
212
+
213
+ def _validate_mcp_url(url: str) -> str:
214
+ parsed = urlparse(url)
215
+ if parsed.scheme not in {"http", "https"} or not parsed.netloc:
216
+ raise ValueError("MCP server url must be an absolute http(s) URL")
217
+ if not parsed.path.endswith("/mcp"):
218
+ raise ValueError("MCP server url must point to a /mcp endpoint")
219
+ return url
220
+
221
+
222
+ __all__ = [
223
+ "MCPServerConfig",
224
+ "MCP_TOOLSET_KEY_ATTR",
225
+ "build_connection_params",
226
+ "build_mcp_toolset",
227
+ "load_mcp_server_configs",
228
+ "load_mcp_toolsets_from_env",
229
+ "mcp_tools_enabled",
230
+ "register_mcp_toolset_descriptors",
231
+ ]
@@ -0,0 +1,57 @@
1
+ """Memory SDK.
2
+
3
+ 模块组成:
4
+ - ksadk.memory.manager: KV 存储 + 消息历史
5
+ - ksadk.memory.adk: ADK 专用 STM/LTM 集成
6
+ - ksadk.memory.service: 平台级长期记忆 service
7
+ - ksadk.memory.tool: 跨框架 load/save memory 工具
8
+
9
+ 使用示例:
10
+ from ksadk.memory import load_memory, save_memory
11
+ from ksadk.memory import LongTermMemoryService
12
+ """
13
+
14
+ from typing import TYPE_CHECKING
15
+
16
+ from ksadk.memory.manager import MemoryManager, get_memory_manager
17
+ from ksadk.memory.backends.base import BaseMemoryBackend
18
+ from ksadk.memory.backends.memory import InMemoryBackend
19
+
20
+ if TYPE_CHECKING:
21
+ from ksadk.memory.service import LongTermMemoryService
22
+
23
+ __all__ = [
24
+ "MemoryManager",
25
+ "get_memory_manager",
26
+ "BaseMemoryBackend",
27
+ "InMemoryBackend",
28
+ "LongTermMemoryService",
29
+ "load_memory",
30
+ "save_memory",
31
+ "create_langchain_tools",
32
+ "create_adk_tool",
33
+ ]
34
+
35
+
36
+ def create_langchain_tools():
37
+ from ksadk.memory.langchain_tool import create_langchain_tools as _create
38
+
39
+ return _create()
40
+
41
+
42
+ def create_adk_tool():
43
+ from ksadk.memory.adk_tool import create_adk_tool as _create
44
+
45
+ return _create()
46
+
47
+
48
+ def __getattr__(name):
49
+ if name in {"load_memory", "save_memory"}:
50
+ from ksadk.memory.langchain_tool import load_memory, save_memory
51
+
52
+ return {"load_memory": load_memory, "save_memory": save_memory}[name]
53
+ if name == "LongTermMemoryService":
54
+ from ksadk.memory.service import LongTermMemoryService
55
+
56
+ return LongTermMemoryService
57
+ raise AttributeError(f"module 'ksadk.memory' has no attribute {name!r}")
@@ -0,0 +1,51 @@
1
+ """ADK 记忆体集成 - 短期记忆 + 长期记忆
2
+
3
+ 提供与 Google ADK 原生接口兼容的记忆体管理能力。
4
+ 通过环境变量配置,由 ADKRunner 自动注入。
5
+
6
+ 使用示例:
7
+ from ksadk.memory.adk import ShortTermMemory, LongTermMemory
8
+
9
+ # 短期记忆 (会话管理)
10
+ stm = ShortTermMemory(backend="local")
11
+
12
+ # 长期记忆 (跨 session 检索)
13
+ ltm = LongTermMemory(backend="local", app_name="my_app")
14
+
15
+ 环境变量:
16
+ # 短期记忆
17
+ KSADK_ADK_SESSION_BACKEND=database
18
+ KSADK_ADK_SESSION_URL= # ADK 数据库 URL
19
+ KSADK_SESSION_BACKEND=postgres # unified fallback
20
+ KSADK_SESSION_DSN= # unified fallback
21
+ KSADK_STM_BACKEND=local # legacy fallback
22
+ KSADK_STM_DB_URL= # legacy fallback
23
+
24
+ # 长期记忆
25
+ KSADK_LTM_BACKEND=http # local | http
26
+ KSADK_LTM_HTTP_URL= # 记忆服务 HTTP 地址
27
+ KSADK_LTM_HTTP_TOKEN= # 认证 Token
28
+ KSADK_LTM_TOP_K=5 # 检索数量
29
+ """
30
+
31
+ from typing import TYPE_CHECKING
32
+
33
+ if TYPE_CHECKING:
34
+ from ksadk.memory.adk.long_term_memory import LongTermMemory
35
+ from ksadk.memory.adk.short_term_memory import ShortTermMemory
36
+
37
+
38
+ # Lazy loading (避免在未安装 google-adk 时导入失败)
39
+ def __getattr__(name):
40
+ if name == "ShortTermMemory":
41
+ from ksadk.memory.adk.short_term_memory import ShortTermMemory
42
+ return ShortTermMemory
43
+
44
+ if name == "LongTermMemory":
45
+ from ksadk.memory.adk.long_term_memory import LongTermMemory
46
+ return LongTermMemory
47
+
48
+ raise AttributeError(f"module 'ksadk.memory.adk' has no attribute '{name}'")
49
+
50
+
51
+ __all__ = ["ShortTermMemory", "LongTermMemory"]
@@ -0,0 +1,5 @@
1
+ """ADK 长期记忆后端"""
2
+
3
+ from ksadk.memory.adk.backends.base_ltm_backend import BaseLongTermMemoryBackend
4
+
5
+ __all__ = ["BaseLongTermMemoryBackend"]
@@ -0,0 +1,52 @@
1
+ """长期记忆后端抽象基类
2
+
3
+ 所有长期记忆后端必须继承此类并实现 save_memory / search_memory 方法。
4
+
5
+ 参考 VeADK: veadk/memory/long_term_memory_backends/base_backend.py
6
+ """
7
+
8
+ from abc import ABC, abstractmethod
9
+ from typing import List
10
+
11
+ from pydantic import BaseModel
12
+
13
+
14
+ class BaseLongTermMemoryBackend(ABC, BaseModel):
15
+ """长期记忆存储后端抽象基类
16
+
17
+ Attributes:
18
+ index: 索引/集合名称,用于隔离不同应用的记忆数据
19
+ """
20
+
21
+ index: str = ""
22
+
23
+ @abstractmethod
24
+ def save_memory(
25
+ self, user_id: str, event_strings: List[str], **kwargs
26
+ ) -> bool:
27
+ """保存记忆
28
+
29
+ Args:
30
+ user_id: 用户 ID
31
+ event_strings: 序列化的事件字符串列表
32
+
33
+ Returns:
34
+ 是否保存成功
35
+ """
36
+ pass
37
+
38
+ @abstractmethod
39
+ def search_memory(
40
+ self, user_id: str, query: str, top_k: int = 5, **kwargs
41
+ ) -> List[str]:
42
+ """检索记忆
43
+
44
+ Args:
45
+ user_id: 用户 ID
46
+ query: 查询文本
47
+ top_k: 返回最相关的 N 条记忆
48
+
49
+ Returns:
50
+ 匹配的记忆字符串列表
51
+ """
52
+ pass
@@ -0,0 +1,183 @@
1
+ """HTTP 长期记忆后端 - 远程记忆服务
2
+
3
+ 通过 HTTP API 连接金山云记忆服务。
4
+ API 对接细节待提供后实现,当前为框架预留。
5
+
6
+ 环境变量:
7
+ KSADK_LTM_HTTP_URL: 记忆服务 HTTP 地址
8
+ KSADK_LTM_HTTP_TOKEN: 认证 Token
9
+ """
10
+
11
+ import logging
12
+ from typing import List, Optional
13
+
14
+ import httpx
15
+ from pydantic import ConfigDict, Field
16
+
17
+ from ksadk.memory.adk.backends.base_ltm_backend import BaseLongTermMemoryBackend
18
+
19
+ logger = logging.getLogger(__name__)
20
+
21
+
22
+ class HttpLTMBackend(BaseLongTermMemoryBackend):
23
+ """HTTP 远程记忆服务后端
24
+
25
+ 连接金山云记忆服务,通过 HTTP API 进行记忆的存储和检索。
26
+
27
+ Attributes:
28
+ base_url: 记忆服务 HTTP 基础地址
29
+ token: 认证 Token
30
+ timeout: HTTP 请求超时时间(秒)
31
+
32
+ Examples:
33
+ ```python
34
+ backend = HttpLTMBackend(
35
+ index="my_app",
36
+ base_url="https://memory.ksyun.com/api/v1",
37
+ token="sk-xxx"
38
+ )
39
+ backend.save_memory("user_1", ["用户喜欢Python"])
40
+ results = backend.search_memory("user_1", "编程语言偏好")
41
+ ```
42
+ """
43
+
44
+ base_url: str = ""
45
+ token: str = ""
46
+ timeout: int = 30
47
+
48
+ _client: Optional[httpx.Client] = None
49
+
50
+ model_config = ConfigDict(arbitrary_types_allowed=True)
51
+
52
+ def model_post_init(self, __context) -> None:
53
+ if not self.base_url:
54
+ logger.warning(
55
+ "HttpLTMBackend: base_url is empty. "
56
+ "Set KSADK_LTM_HTTP_URL environment variable."
57
+ )
58
+ logger.info(
59
+ f"HttpLTMBackend initialized: base_url={self.base_url[:50]}... "
60
+ f"index={self.index}"
61
+ )
62
+
63
+ @property
64
+ def client(self) -> httpx.Client:
65
+ """懒加载 HTTP 客户端"""
66
+ if self._client is None:
67
+ headers = {"Content-Type": "application/json"}
68
+ if self.token:
69
+ headers["Authorization"] = f"Bearer {self.token}"
70
+
71
+ self._client = httpx.Client(
72
+ base_url=self.base_url,
73
+ headers=headers,
74
+ timeout=self.timeout,
75
+ )
76
+ return self._client
77
+
78
+ def save_memory(
79
+ self, user_id: str, event_strings: List[str], **kwargs
80
+ ) -> bool:
81
+ """保存记忆到远程服务
82
+
83
+ TODO: 对接金山云记忆服务 API
84
+ 预期请求格式:
85
+ POST {base_url}/memories
86
+ {
87
+ "index": "...",
88
+ "user_id": "...",
89
+ "events": ["...", "..."]
90
+ }
91
+ """
92
+ if not self.base_url:
93
+ logger.warning("HttpLTMBackend: base_url not configured, skip save.")
94
+ return False
95
+
96
+ try:
97
+ payload = {
98
+ "index": self.index,
99
+ "user_id": user_id,
100
+ "events": event_strings,
101
+ }
102
+ payload.update(kwargs)
103
+
104
+ response = self.client.post("/memories", json=payload)
105
+ response.raise_for_status()
106
+
107
+ logger.info(
108
+ f"Saved {len(event_strings)} events to remote memory service "
109
+ f"for user={user_id}"
110
+ )
111
+ return True
112
+
113
+ except httpx.HTTPStatusError as e:
114
+ logger.error(
115
+ f"HTTP error saving memory: {e.response.status_code} "
116
+ f"{e.response.text[:200]}"
117
+ )
118
+ return False
119
+ except Exception as e:
120
+ logger.error(f"Error saving memory to remote service: {e}")
121
+ return False
122
+
123
+ def search_memory(
124
+ self, user_id: str, query: str, top_k: int = 5, **kwargs
125
+ ) -> List[str]:
126
+ """从远程服务检索记忆
127
+
128
+ TODO: 对接金山云记忆服务 API
129
+ 预期请求格式:
130
+ POST {base_url}/memories/search
131
+ {
132
+ "index": "...",
133
+ "user_id": "...",
134
+ "query": "...",
135
+ "top_k": 5
136
+ }
137
+ 预期响应格式:
138
+ {
139
+ "memories": ["...", "..."]
140
+ }
141
+ """
142
+ if not self.base_url:
143
+ logger.warning(
144
+ "HttpLTMBackend: base_url not configured, return empty results."
145
+ )
146
+ return []
147
+
148
+ try:
149
+ payload = {
150
+ "index": self.index,
151
+ "user_id": user_id,
152
+ "query": query,
153
+ "top_k": top_k,
154
+ }
155
+ payload.update(kwargs)
156
+
157
+ response = self.client.post("/memories/search", json=payload)
158
+ response.raise_for_status()
159
+
160
+ data = response.json()
161
+ memories = data.get("memories", [])
162
+
163
+ logger.info(
164
+ f"Retrieved {len(memories)} memories from remote service "
165
+ f"for user={user_id} query='{query[:50]}'"
166
+ )
167
+ return memories
168
+
169
+ except httpx.HTTPStatusError as e:
170
+ logger.error(
171
+ f"HTTP error searching memory: {e.response.status_code} "
172
+ f"{e.response.text[:200]}"
173
+ )
174
+ return []
175
+ except Exception as e:
176
+ logger.error(f"Error searching memory from remote service: {e}")
177
+ return []
178
+
179
+ def close(self) -> None:
180
+ """关闭 HTTP 客户端"""
181
+ if self._client:
182
+ self._client.close()
183
+ self._client = None
@@ -0,0 +1,96 @@
1
+ """InMemory 长期记忆后端 - 开发/测试用
2
+
3
+ 使用简单的内存字典存储和文本匹配检索。
4
+ 数据在进程退出后丢失,仅适用于开发和测试场景。
5
+ """
6
+
7
+ import logging
8
+ from collections import defaultdict
9
+ from typing import List
10
+
11
+ from ksadk.memory.adk.backends.base_ltm_backend import BaseLongTermMemoryBackend
12
+
13
+ logger = logging.getLogger(__name__)
14
+
15
+
16
+ class InMemoryLTMBackend(BaseLongTermMemoryBackend):
17
+ """内存长期记忆后端
18
+
19
+ 使用 dict 存储记忆,文本关键词匹配检索。
20
+ 适用于开发测试,不提供语义搜索能力。
21
+
22
+ Examples:
23
+ ```python
24
+ backend = InMemoryLTMBackend(index="my_app")
25
+ backend.save_memory("user_1", ["我喜欢吃冰淇淋", "今天天气真好"])
26
+ results = backend.search_memory("user_1", "冰淇淋", top_k=5)
27
+ ```
28
+ """
29
+
30
+ # Pydantic v2 不允许直接声明 mutable default,使用 model_post_init
31
+ _storage: dict = None
32
+
33
+ def model_post_init(self, __context) -> None:
34
+ # {user_id: [event_string, ...]}
35
+ self._storage = defaultdict(list)
36
+ logger.info(
37
+ f"InMemoryLTMBackend initialized: index={self.index}"
38
+ )
39
+
40
+ def save_memory(
41
+ self, user_id: str, event_strings: List[str], **kwargs
42
+ ) -> bool:
43
+ """保存记忆到内存"""
44
+ if not event_strings:
45
+ return True
46
+
47
+ self._storage[user_id].extend(event_strings)
48
+ logger.debug(
49
+ f"Saved {len(event_strings)} events for user={user_id}, "
50
+ f"total={len(self._storage[user_id])}"
51
+ )
52
+ return True
53
+
54
+ def search_memory(
55
+ self, user_id: str, query: str, top_k: int = 5, **kwargs
56
+ ) -> List[str]:
57
+ """基于关键词匹配检索记忆
58
+
59
+ 简单实现:对 query 分词后,按匹配关键词数量排序。
60
+ 生产环境应使用向量搜索后端。
61
+ """
62
+ user_memories = self._storage.get(user_id, [])
63
+ if not user_memories:
64
+ return []
65
+
66
+ # 简单的关键词匹配打分
67
+ query_lower = query.lower()
68
+ # 按字符分词(支持中英文混合)
69
+ query_terms = query_lower.split()
70
+
71
+ scored = []
72
+ for memory in user_memories:
73
+ memory_lower = memory.lower()
74
+ # 计算匹配分数:完整 query 匹配得高分,部分关键词匹配得低分
75
+ score = 0
76
+ if query_lower in memory_lower:
77
+ score += 10 # 完整匹配
78
+ for term in query_terms:
79
+ if term in memory_lower:
80
+ score += 1
81
+ if score > 0:
82
+ scored.append((score, memory))
83
+
84
+ # 如果没有匹配,返回最近的记忆
85
+ if not scored:
86
+ return user_memories[-top_k:]
87
+
88
+ # 按分数降序排列,取 top_k
89
+ scored.sort(key=lambda x: x[0], reverse=True)
90
+ results = [item[1] for item in scored[:top_k]]
91
+
92
+ logger.debug(
93
+ f"Search memory for user={user_id} query='{query[:50]}': "
94
+ f"found {len(results)} results from {len(user_memories)} total"
95
+ )
96
+ return results