agentengine-sdk-python 0.7.0__py3-none-any.whl → 0.8.1__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 (450) hide show
  1. {agentengine_sdk_python-0.7.0.dist-info → agentengine_sdk_python-0.8.1.dist-info}/METADATA +52 -20
  2. agentengine_sdk_python-0.8.1.dist-info/RECORD +644 -0
  3. {agentengine_sdk_python-0.7.0.dist-info → agentengine_sdk_python-0.8.1.dist-info}/WHEEL +1 -1
  4. ksadk/a2a/__init__.py +180 -11
  5. ksadk/a2a/bootstrap.py +332 -0
  6. ksadk/a2a/card.py +15 -0
  7. ksadk/a2a/context_store.py +203 -0
  8. ksadk/a2a/control_plane.py +1056 -0
  9. ksadk/a2a/credential.py +99 -0
  10. ksadk/a2a/event_adapter.py +149 -0
  11. ksadk/a2a/executor.py +361 -137
  12. ksadk/a2a/external_transport.py +516 -0
  13. ksadk/a2a/identity.py +304 -0
  14. ksadk/a2a/ids.py +22 -0
  15. ksadk/a2a/langgraph.py +285 -0
  16. ksadk/a2a/resume_store.py +201 -0
  17. ksadk/a2a/routes.py +112 -0
  18. ksadk/a2a/server.py +102 -62
  19. ksadk/a2a/service_env.py +33 -0
  20. ksadk/a2a/space_client.py +1122 -0
  21. ksadk/a2a/task_adapter.py +423 -0
  22. ksadk/a2a/task_event_dispatcher.py +167 -0
  23. ksadk/a2a/task_event_outbox.py +326 -0
  24. ksadk/a2a/task_store.py +206 -0
  25. ksadk/a2a_card.py +101 -0
  26. ksadk/a2ui/__init__.py +27 -0
  27. ksadk/a2ui/core.py +186 -0
  28. ksadk/a2ui/models.py +166 -0
  29. ksadk/a2ui/renderer.py +198 -0
  30. ksadk/agui/__init__.py +9 -0
  31. ksadk/agui/a2ui_projection.py +92 -0
  32. ksadk/agui/agent.py +872 -0
  33. ksadk/agui/config.py +92 -0
  34. ksadk/agui/routes.py +47 -0
  35. ksadk/api/client.py +238 -204
  36. ksadk/api/environment.py +27 -0
  37. ksadk/builders/__init__.py +2 -0
  38. ksadk/builders/base.py +16 -14
  39. ksadk/builders/code_builder.py +375 -270
  40. ksadk/builders/container_builder.py +240 -200
  41. ksadk/builders/framework_requirements.py +31 -12
  42. ksadk/builders/ks3_uploader.py +60 -29
  43. ksadk/builders/managed_runtime_builder.py +173 -0
  44. ksadk/builders/mcp_builder.py +91 -92
  45. ksadk/builders/requirements_utils.py +1 -5
  46. ksadk/cli/__init__.py +97 -171
  47. ksadk/cli/cmd_a2a.py +255 -84
  48. ksadk/cli/cmd_agent.py +19 -5
  49. ksadk/cli/cmd_build.py +158 -29
  50. ksadk/cli/cmd_completion.py +47 -35
  51. ksadk/cli/cmd_config.py +267 -198
  52. ksadk/cli/cmd_create.py +507 -740
  53. ksadk/cli/cmd_dashboard.py +120 -45
  54. ksadk/cli/cmd_deploy.py +135 -59
  55. ksadk/cli/cmd_destroy.py +44 -14
  56. ksadk/cli/cmd_eval.py +386 -0
  57. ksadk/cli/cmd_files.py +63 -24
  58. ksadk/cli/cmd_hermes.py +313 -135
  59. ksadk/cli/cmd_invoke.py +184 -122
  60. ksadk/cli/cmd_launch.py +76 -28
  61. ksadk/cli/cmd_mcp.py +98 -64
  62. ksadk/cli/cmd_model.py +14 -5
  63. ksadk/cli/cmd_openclaw.py +564 -268
  64. ksadk/cli/cmd_replay.py +71 -0
  65. ksadk/cli/cmd_run.py +58 -73
  66. ksadk/cli/cmd_status.py +80 -31
  67. ksadk/cli/cmd_studio.py +110 -0
  68. ksadk/cli/cmd_version.py +20 -13
  69. ksadk/cli/cmd_web.py +95 -18
  70. ksadk/cli/deploy_utils.py +20 -20
  71. ksadk/cli/dry_run.py +7 -4
  72. ksadk/cli/env_options.py +83 -0
  73. ksadk/cli/error_utils.py +37 -12
  74. ksadk/cli/global_options.py +4 -3
  75. ksadk/cli/local_runtime.py +1 -2
  76. ksadk/cli/model_catalog.py +6 -2
  77. ksadk/cli/network_options.py +41 -19
  78. ksadk/cli/resource_common.py +6 -2
  79. ksadk/cli/runtime_bootstrap.py +51 -0
  80. ksadk/cli/storage.py +0 -1
  81. ksadk/cli/ui.py +11 -3
  82. ksadk/cli/workflow_common.py +52 -18
  83. ksadk/codex/__init__.py +12 -0
  84. ksadk/codex/client.py +1042 -0
  85. ksadk/codex/phase.py +143 -0
  86. ksadk/codex/runtime.py +940 -0
  87. ksadk/common/aicp_env.py +0 -1
  88. ksadk/common/auth.py +2 -2
  89. ksadk/common/constants.py +1 -3
  90. ksadk/common/kop_client.py +232 -0
  91. ksadk/common/llm_utils.py +17 -13
  92. ksadk/compat/__init__.py +5 -0
  93. ksadk/compat/adk_compat.py +200 -0
  94. ksadk/compat/copilotkit_a2ui.py +330 -0
  95. ksadk/configs/__init__.py +12 -14
  96. ksadk/configs/env_registry.py +661 -116
  97. ksadk/configs/global_config.py +3 -2
  98. ksadk/configs/settings.py +133 -209
  99. ksadk/conversations/__init__.py +85 -92
  100. ksadk/conversations/attachment_storage.py +16 -11
  101. ksadk/conversations/attachments.py +44 -36
  102. ksadk/conversations/compaction_pipeline.py +12 -12
  103. ksadk/conversations/compaction_prompt.py +9 -5
  104. ksadk/conversations/context.py +221 -6
  105. ksadk/conversations/message_projection.py +438 -51
  106. ksadk/conversations/model_context.py +12 -6
  107. ksadk/conversations/model_options.py +0 -1
  108. ksadk/conversations/normalize.py +20 -16
  109. ksadk/conversations/reasoning_markup.py +1 -1
  110. ksadk/conversations/runtime.py +339 -5255
  111. ksadk/conversations/runtime_compaction.py +333 -0
  112. ksadk/conversations/runtime_constants.py +27 -0
  113. ksadk/conversations/runtime_governance.py +185 -0
  114. ksadk/conversations/runtime_input.py +660 -0
  115. ksadk/conversations/runtime_invocation.py +395 -0
  116. ksadk/conversations/runtime_metadata.py +475 -0
  117. ksadk/conversations/runtime_observability.py +367 -0
  118. ksadk/conversations/runtime_payloads.py +272 -0
  119. ksadk/conversations/runtime_persistence.py +440 -0
  120. ksadk/conversations/runtime_preparation.py +426 -0
  121. ksadk/conversations/runtime_resume.py +836 -0
  122. ksadk/conversations/runtime_stream_events.py +902 -0
  123. ksadk/conversations/runtime_streaming.py +700 -0
  124. ksadk/conversations/semantic_summary.py +17 -5
  125. ksadk/conversations/session_title.py +6 -3
  126. ksadk/deployment/__init__.py +15 -16
  127. ksadk/deployment/agent_access.py +12 -23
  128. ksadk/deployment/base.py +51 -38
  129. ksadk/deployment/managed_runtime.py +33 -0
  130. ksadk/deployment/manager.py +85 -71
  131. ksadk/deployment/providers/serverless.py +379 -210
  132. ksadk/deployment/registry.py +38 -32
  133. ksadk/deployment/state.py +11 -11
  134. ksadk/deployment/ui_config.py +1 -1
  135. ksadk/detection/__init__.py +1 -1
  136. ksadk/detection/detector.py +146 -83
  137. ksadk/detection/mcp_detector.py +9 -6
  138. ksadk/evaluation/__init__.py +84 -0
  139. ksadk/evaluation/a2a_adapter.py +444 -0
  140. ksadk/evaluation/adapters.py +54 -0
  141. ksadk/evaluation/contracts.py +409 -0
  142. ksadk/evaluation/evalset.py +351 -0
  143. ksadk/evaluation/evaluators.py +461 -0
  144. ksadk/evaluation/executor.py +118 -0
  145. ksadk/evaluation/storage.py +68 -0
  146. ksadk/evaluation/target.py +73 -0
  147. ksadk/events/__init__.py +25 -0
  148. ksadk/events/parser.py +191 -0
  149. ksadk/events/replay.py +37 -0
  150. ksadk/events/runtime_event.py +273 -0
  151. ksadk/events/store.py +317 -0
  152. ksadk/harness/__init__.py +35 -0
  153. ksadk/harness/app.py +269 -0
  154. ksadk/harness/config.py +181 -0
  155. ksadk/harness/reasoner.py +105 -0
  156. ksadk/harness/runtime.py +364 -0
  157. ksadk/harness/sandbox.py +141 -0
  158. ksadk/harness/tools.py +222 -0
  159. ksadk/hermes_terminal.py +28 -12
  160. ksadk/identity/resolver.py +15 -9
  161. ksadk/ids.py +32 -0
  162. ksadk/knowledge_base/adk_tool.py +1 -1
  163. ksadk/knowledge_base/client.py +38 -33
  164. ksadk/managed_a2a_card.py +160 -0
  165. ksadk/managed_runtime.py +195 -0
  166. ksadk/markdown.py +5 -2
  167. ksadk/mcp_runtime/__init__.py +9 -6
  168. ksadk/memory/__init__.py +1 -1
  169. ksadk/memory/adk/__init__.py +2 -0
  170. ksadk/memory/adk/backends/base_ltm_backend.py +2 -6
  171. ksadk/memory/adk/backends/http_ltm_backend.py +13 -21
  172. ksadk/memory/adk/backends/inmemory_ltm_backend.py +7 -13
  173. ksadk/memory/adk/backends/sdk_ltm_backend.py +36 -36
  174. ksadk/memory/adk/long_term_memory.py +34 -37
  175. ksadk/memory/adk/resilient_session_service.py +4 -5
  176. ksadk/memory/adk/short_term_memory.py +12 -21
  177. ksadk/memory/adk_tool.py +3 -2
  178. ksadk/memory/backends/base.py +19 -19
  179. ksadk/memory/backends/memory.py +24 -25
  180. ksadk/memory/backends/redis.py +31 -30
  181. ksadk/memory/langchain_tool.py +2 -1
  182. ksadk/memory/manager.py +52 -47
  183. ksadk/memory/service.py +16 -6
  184. ksadk/memory/tool.py +4 -0
  185. ksadk/model_policy.py +15 -7
  186. ksadk/model_proxy/__init__.py +51 -0
  187. ksadk/model_proxy/bootstrap.py +80 -0
  188. ksadk/model_proxy/cache.py +165 -0
  189. ksadk/model_proxy/config.py +66 -0
  190. ksadk/model_proxy/demo_webui.py +115 -0
  191. ksadk/model_proxy/detect.py +145 -0
  192. ksadk/model_proxy/gate.py +68 -0
  193. ksadk/model_proxy/namespace.py +201 -0
  194. ksadk/model_proxy/protocol_proxy.py +22 -0
  195. ksadk/model_proxy/server.py +443 -0
  196. ksadk/model_proxy/transform.py +735 -0
  197. ksadk/openclaw_gateway.py +29 -14
  198. ksadk/runners/adk_runner.py +354 -146
  199. ksadk/runners/base_runner.py +71 -29
  200. ksadk/runners/deepagents_runner.py +0 -1
  201. ksadk/runners/factory.py +18 -5
  202. ksadk/runners/langchain_runner.py +29 -742
  203. ksadk/runners/langgraph_runner.py +417 -97
  204. ksadk/runners/patch_langchain.py +16 -16
  205. ksadk/runners/remote_runner.py +134 -33
  206. ksadk/runners/usage_accumulator.py +1 -0
  207. ksadk/runners/utils/__init__.py +0 -10
  208. ksadk/runners/utils/loader.py +23 -7
  209. ksadk/runtime/__init__.py +67 -0
  210. ksadk/runtime/adapter.py +412 -0
  211. ksadk/runtime/conversation_execution.py +553 -0
  212. ksadk/runtime/executor.py +251 -0
  213. ksadk/runtime/factory.py +156 -0
  214. ksadk/runtime/framework_adapters.py +118 -0
  215. ksadk/runtime/launch.py +48 -0
  216. ksadk/runtime/preprocessing.py +131 -0
  217. ksadk/runtime/runner_adapter.py +1032 -0
  218. ksadk/runtime/runner_loading.py +36 -0
  219. ksadk/runtime_context.py +18 -3
  220. ksadk/runtime_state.py +0 -1
  221. ksadk/sandbox/__init__.py +4 -1
  222. ksadk/sandbox/backends/__init__.py +4 -1
  223. ksadk/sandbox/backends/e2b.py +13 -5
  224. ksadk/sandbox/backends/local_process.py +11 -3
  225. ksadk/sandbox/base.py +10 -15
  226. ksadk/sandbox/factory.py +14 -4
  227. ksadk/sandbox/registry.py +57 -6
  228. ksadk/server/__init__.py +39 -4
  229. ksadk/server/api_models.py +15 -5
  230. ksadk/server/app.py +24 -3928
  231. ksadk/server/composition.py +47 -0
  232. ksadk/server/factory.py +622 -0
  233. ksadk/server/routes/__init__.py +1 -0
  234. ksadk/server/routes/checkpoint_resolution.py +116 -0
  235. ksadk/server/routes/common.py +682 -0
  236. ksadk/server/routes/control.py +331 -0
  237. ksadk/server/routes/dependencies.py +98 -0
  238. ksadk/server/routes/misc.py +425 -0
  239. ksadk/server/routes/models.py +451 -0
  240. ksadk/server/routes/openai_compat.py +229 -0
  241. ksadk/server/routes/projection.py +848 -0
  242. ksadk/server/routes/routers.py +52 -0
  243. ksadk/server/routes/run.py +519 -0
  244. ksadk/server/routes/sessions.py +644 -0
  245. ksadk/server/routes/streaming.py +265 -0
  246. ksadk/server/routes/workspace.py +414 -0
  247. ksadk/server/static/assets/{ArtifactsPanel-D-SSn2ee.js → ArtifactsPanel-CakCqxEN.js} +1 -1
  248. ksadk/server/static/assets/CodeBlock-CynLknyO.js +9 -0
  249. ksadk/server/static/assets/MathMessageMarkdown-3sQdOysS.js +8 -0
  250. ksadk/server/static/assets/MermaidBlock-NERD_ef7.js +303 -0
  251. ksadk/server/static/assets/NativeTerminalPanel-CiHWf82q.js +1 -0
  252. ksadk/server/static/assets/{arc-BA13sHc9.js → arc-DrgjcKhl.js} +1 -1
  253. ksadk/server/static/assets/architecture-7EHR7CIX-CpZLRCcY.js +1 -0
  254. ksadk/server/static/assets/{architectureDiagram-3BPJPVTR-DzJzgVoL.js → architectureDiagram-3BPJPVTR-BXoVRbQ6.js} +1 -1
  255. ksadk/server/static/assets/{blockDiagram-GPEHLZMM-UTdVcZhn.js → blockDiagram-GPEHLZMM-BnaB3Ywv.js} +1 -1
  256. ksadk/server/static/assets/{c4Diagram-AAUBKEIU-Dix0GD4m.js → c4Diagram-AAUBKEIU-Dw4weZcp.js} +1 -1
  257. ksadk/server/static/assets/channel-Dt3rQTFI.js +1 -0
  258. ksadk/server/static/assets/{chunk-2J33WTMH-C2JxuZ42.js → chunk-2J33WTMH-ChjpLK7j.js} +1 -1
  259. ksadk/server/static/assets/{chunk-4BX2VUAB-Be57QPgD.js → chunk-4BX2VUAB-B9drTgOW.js} +1 -1
  260. ksadk/server/static/assets/{chunk-55IACEB6-WjSuy4nv.js → chunk-55IACEB6-CK4ROATy.js} +1 -1
  261. ksadk/server/static/assets/{chunk-727SXJPM-BOovP-b5.js → chunk-727SXJPM-B9KtTTgw.js} +1 -1
  262. ksadk/server/static/assets/{chunk-AQP2D5EJ-DOmZNmWj.js → chunk-AQP2D5EJ-1O1mki3m.js} +1 -1
  263. ksadk/server/static/assets/{chunk-FMBD7UC4-DzwlodkU.js → chunk-FMBD7UC4-B_fH2YuH.js} +1 -1
  264. ksadk/server/static/assets/{chunk-ND2GUHAM-DMqAikEU.js → chunk-ND2GUHAM-D6rFLaVV.js} +1 -1
  265. ksadk/server/static/assets/chunk-QZHKN3VN-iXEZtKQc.js +1 -0
  266. ksadk/server/static/assets/classDiagram-4FO5ZUOK-DIveV17Q.js +1 -0
  267. ksadk/server/static/assets/classDiagram-v2-Q7XG4LA2-DIveV17Q.js +1 -0
  268. ksadk/server/static/assets/{cose-bilkent-S5V4N54A-Zhy2GBnP.js → cose-bilkent-S5V4N54A-ChNs_Mdk.js} +1 -1
  269. ksadk/server/static/assets/{dagre-BM42HDAG-CbKrtIUz.js → dagre-BM42HDAG-D0QXg_MQ.js} +1 -1
  270. ksadk/server/static/assets/{diagram-2AECGRRQ-BRApgQRK.js → diagram-2AECGRRQ-DBDDKwBQ.js} +1 -1
  271. ksadk/server/static/assets/{diagram-5GNKFQAL-D0xbnDiK.js → diagram-5GNKFQAL-BkwDOxmO.js} +1 -1
  272. ksadk/server/static/assets/{diagram-KO2AKTUF-CVugVI9L.js → diagram-KO2AKTUF-Bv8waYvY.js} +1 -1
  273. ksadk/server/static/assets/{diagram-LMA3HP47-DozUGgee.js → diagram-LMA3HP47-e1VECDdu.js} +1 -1
  274. ksadk/server/static/assets/{diagram-OG6HWLK6-ZOYsKlru.js → diagram-OG6HWLK6-Ds9adfRl.js} +1 -1
  275. ksadk/server/static/assets/{dist-DpKtt4Bo.js → dist-4N2NMVYg.js} +1 -1
  276. ksadk/server/static/assets/{dist-CkEKJFtk.js → dist-B-jNR6Vn.js} +1 -1
  277. ksadk/server/static/assets/{dist-D57wnGWd.js → dist-B5J2uhNk.js} +1 -1
  278. ksadk/server/static/assets/{dist-8_SfK1IP.js → dist-B5oS1zcj.js} +1 -1
  279. ksadk/server/static/assets/{dist-DMezvBGJ.js → dist-BB3-OwTQ.js} +1 -1
  280. ksadk/server/static/assets/{dist-2hInLS_J.js → dist-BIlKoW0k.js} +1 -1
  281. ksadk/server/static/assets/{dist-BrCcQ47T.js → dist-BjOdlDjj.js} +1 -1
  282. ksadk/server/static/assets/{dist-BmlMPsCc.js → dist-C1sz5Eo3.js} +1 -1
  283. ksadk/server/static/assets/{dist-B0NP_Z0z.js → dist-CWV4lDr1.js} +1 -1
  284. ksadk/server/static/assets/{dist-D-xOD048.js → dist-CmZHzlwZ.js} +1 -1
  285. ksadk/server/static/assets/{dist-DL_NKc_z.js → dist-D6MpCZtz.js} +1 -1
  286. ksadk/server/static/assets/{dist-DyOkZmze.js → dist-DJN_6Y39.js} +1 -1
  287. ksadk/server/static/assets/{dist-DmFaq_Iy.js → dist-DQU9EWw-.js} +1 -1
  288. ksadk/server/static/assets/{dist-gX6GOLKq.js → dist-DWKByxWV.js} +1 -1
  289. ksadk/server/static/assets/{dist-DyWsb78Q.js → dist-Dli7qW-B.js} +1 -1
  290. ksadk/server/static/assets/{dist-BIJVDMuB.js → dist-DsHPdk3W.js} +1 -1
  291. ksadk/server/static/assets/{dist-Dp0k7bWI.js → dist-X4TnqwOK.js} +1 -1
  292. ksadk/server/static/assets/{dist-8EEyGgDx.js → dist-_pHPTyZ-.js} +1 -1
  293. ksadk/server/static/assets/{dist-CPBtqRTW.js → dist-fhOuWds5.js} +1 -1
  294. ksadk/server/static/assets/{dist-D-JMdWPQ.js → dist-gLnrGsoU.js} +1 -1
  295. ksadk/server/static/assets/{dist-BssVmjIo.js → dist-j6Dxmf_j.js} +1 -1
  296. ksadk/server/static/assets/{dist-C3HIIaN5.js → dist-o2OVmKvt.js} +1 -1
  297. ksadk/server/static/assets/{erDiagram-TEJ5UH35-Bk-9bgE5.js → erDiagram-TEJ5UH35-BPItFKH6.js} +1 -1
  298. ksadk/server/static/assets/eventmodeling-FCH6USID-DYFSxbqr.js +1 -0
  299. ksadk/server/static/assets/{flowDiagram-I6XJVG4X-Dn9kZVuZ.js → flowDiagram-I6XJVG4X-BbYB9w5Y.js} +1 -1
  300. ksadk/server/static/assets/{ganttDiagram-6RSMTGT7-BGxXlJqm.js → ganttDiagram-6RSMTGT7-TQXa0KXv.js} +1 -1
  301. ksadk/server/static/assets/gitGraph-WXDBUCRP-DyNYp6BN.js +1 -0
  302. ksadk/server/static/assets/{gitGraphDiagram-PVQCEYII-C7Q0X-wi.js → gitGraphDiagram-PVQCEYII-bKblCnpa.js} +1 -1
  303. ksadk/server/static/assets/index-R52pJJvg.js +177 -0
  304. ksadk/server/static/assets/index-jJr3_955.css +2 -0
  305. ksadk/server/static/assets/info-J43DQDTF-WUx7qTde.js +1 -0
  306. ksadk/server/static/assets/{infoDiagram-5YYISTIA-BO_CSqq5.js → infoDiagram-5YYISTIA-BGVT7J_i.js} +1 -1
  307. ksadk/server/static/assets/{ishikawaDiagram-YF4QCWOH-eYLPLd46.js → ishikawaDiagram-YF4QCWOH-K0OOfVna.js} +1 -1
  308. ksadk/server/static/assets/{journeyDiagram-JHISSGLW-De9geSb0.js → journeyDiagram-JHISSGLW-8LeOJaZp.js} +1 -1
  309. ksadk/server/static/assets/{kanban-definition-UN3LZRKU-Cs80kQto.js → kanban-definition-UN3LZRKU-C6uCgZrW.js} +1 -1
  310. ksadk/server/static/assets/{katex-DSrCFD8n.js → katex-CYWseY5E.js} +1 -1
  311. ksadk/server/static/assets/{linear-CN9sbKTF.js → linear-hdBcYzM8.js} +1 -1
  312. ksadk/server/static/assets/{mermaid-parser.core-DlgSBU8l.js → mermaid-parser.core-BWrDjSZM.js} +2 -2
  313. ksadk/server/static/assets/{mindmap-definition-RKZ34NQL-9afz7Oug.js → mindmap-definition-RKZ34NQL-Bjy_2v4_.js} +1 -1
  314. ksadk/server/static/assets/packet-YPE3B663-BN13y_xl.js +1 -0
  315. ksadk/server/static/assets/pie-LRSECV5Y-ftSLXhhc.js +1 -0
  316. ksadk/server/static/assets/{pieDiagram-4H26LBE5-DPv_VstN.js → pieDiagram-4H26LBE5-GmmqNiVH.js} +1 -1
  317. ksadk/server/static/assets/{quadrantDiagram-W4KKPZXB-o77wZ1XK.js → quadrantDiagram-W4KKPZXB-BmkRbwCg.js} +1 -1
  318. ksadk/server/static/assets/radar-GUYGQ44K-jaICkIeO.js +1 -0
  319. ksadk/server/static/assets/{requirementDiagram-4Y6WPE33-BYVw81VC.js → requirementDiagram-4Y6WPE33-DSWFqL7c.js} +1 -1
  320. ksadk/server/static/assets/{sankeyDiagram-5OEKKPKP-B7nZFMKT.js → sankeyDiagram-5OEKKPKP-l6iXmU65.js} +1 -1
  321. ksadk/server/static/assets/{sequenceDiagram-3UESZ5HK-BGRRrFw5.js → sequenceDiagram-3UESZ5HK-Cq6UBeQB.js} +1 -1
  322. ksadk/server/static/assets/{stateDiagram-AJRCARHV-BUfHCoPs.js → stateDiagram-AJRCARHV-qzTQpg3Y.js} +1 -1
  323. ksadk/server/static/assets/stateDiagram-v2-BHNVJYJU-BYCoYGAN.js +1 -0
  324. ksadk/server/static/assets/{timeline-definition-PNZ67QCA-FbCTGrf9.js → timeline-definition-PNZ67QCA-DEz24vV0.js} +1 -1
  325. ksadk/server/static/assets/treeView-BLDUP644-Cpib_vlz.js +1 -0
  326. ksadk/server/static/assets/treemap-LRROVOQU-DQxfmVHK.js +1 -0
  327. ksadk/server/static/assets/{vennDiagram-CIIHVFJN-DWgwtPsJ.js → vennDiagram-CIIHVFJN-CMCixki2.js} +1 -1
  328. ksadk/server/static/assets/wardley-L42UT6IY-BQYHnnkU.js +1 -0
  329. ksadk/server/static/assets/{wardleyDiagram-YWT4CUSO-2x8G-tTM.js → wardleyDiagram-YWT4CUSO-CVzB8F9K.js} +1 -1
  330. ksadk/server/static/assets/{xychartDiagram-2RQKCTM6-Drma3AYl.js → xychartDiagram-2RQKCTM6-BFBqBLc1.js} +1 -1
  331. ksadk/server/static/index.html +2 -2
  332. ksadk/server/terminal_sessions.py +111 -58
  333. ksadk/sessions/__init__.py +69 -19
  334. ksadk/sessions/base.py +31 -11
  335. ksadk/sessions/continuity.py +2 -3
  336. ksadk/sessions/in_memory.py +46 -2
  337. ksadk/sessions/local_service.py +148 -17
  338. ksadk/sessions/postgres_service.py +143 -25
  339. ksadk/sessions/resilient.py +36 -8
  340. ksadk/skills/models.py +17 -5
  341. ksadk/skills/package_store.py +5 -2
  342. ksadk/skills/runtime/agent.py +20 -5
  343. ksadk/skills/runtime/artifacts.py +1 -5
  344. ksadk/skills/runtime/backends/e2b.py +10 -4
  345. ksadk/skills/runtime/backends/local.py +15 -3
  346. ksadk/skills/runtime/base.py +1 -2
  347. ksadk/skills/runtime/executor.py +10 -3
  348. ksadk/skills/runtime/factory.py +4 -2
  349. ksadk/skills/runtime/loader.py +1 -2
  350. ksadk/skills/runtime/registry.py +15 -10
  351. ksadk/skills/runtime/request.py +3 -1
  352. ksadk/skills/service_client.py +47 -16
  353. ksadk/skills/tool_defs.py +15 -10
  354. ksadk/studio/__init__.py +5 -0
  355. ksadk/studio/agent_avatar_assets.py +120 -0
  356. ksadk/studio/agent_lifecycle.py +51 -0
  357. ksadk/studio/api.py +1046 -0
  358. ksadk/studio/api_catalog_routes.py +324 -0
  359. ksadk/studio/api_contracts.py +177 -0
  360. ksadk/studio/api_helpers.py +132 -0
  361. ksadk/studio/authoring.py +524 -0
  362. ksadk/studio/authoring_coordinator.py +285 -0
  363. ksadk/studio/builder.py +320 -0
  364. ksadk/studio/capabilities.py +351 -0
  365. ksadk/studio/cloud.py +278 -0
  366. ksadk/studio/codex_agent_service.py +583 -0
  367. ksadk/studio/codex_builder.py +324 -0
  368. ksadk/studio/codex_manifest.py +278 -0
  369. ksadk/studio/codex_run.py +352 -0
  370. ksadk/studio/compiler.py +189 -0
  371. ksadk/studio/contracts.py +644 -0
  372. ksadk/studio/errors.py +47 -0
  373. ksadk/studio/evaluation.py +192 -0
  374. ksadk/studio/event_store.py +284 -0
  375. ksadk/studio/framework_run.py +114 -0
  376. ksadk/studio/identifiers.py +33 -0
  377. ksadk/studio/mcp_runtime.py +229 -0
  378. ksadk/studio/model_client.py +543 -0
  379. ksadk/studio/model_profile_service.py +214 -0
  380. ksadk/studio/operations.py +243 -0
  381. ksadk/studio/otel_trace.py +754 -0
  382. ksadk/studio/pagination.py +182 -0
  383. ksadk/studio/python_tool_inspection.py +183 -0
  384. ksadk/studio/repository.py +306 -0
  385. ksadk/studio/resource_catalog.py +1217 -0
  386. ksadk/studio/run_service.py +707 -0
  387. ksadk/studio/runtime_catalog.py +74 -0
  388. ksadk/studio/runtime_source.py +339 -0
  389. ksadk/studio/service.py +1141 -0
  390. ksadk/studio/shared_web.py +994 -0
  391. ksadk/studio/skill_discovery.py +628 -0
  392. ksadk/studio/static/assets/PrismRenderer-IYN-ffww.js +3 -0
  393. ksadk/studio/static/assets/index-CaEN0eTR.css +1 -0
  394. ksadk/studio/static/assets/index-DI2eY_NH.js +252 -0
  395. ksadk/studio/static/assets/react-vendor-BNmTiJ-I.js +9 -0
  396. ksadk/studio/static/assets/rolldown-runtime-hePW80VL.js +1 -0
  397. ksadk/studio/static/index.html +15 -0
  398. ksadk/studio/templates.py +630 -0
  399. ksadk/studio/validator.py +246 -0
  400. ksadk/studio/workspace.py +137 -0
  401. ksadk/terminal_exec_policy.py +3 -4
  402. ksadk/tools/gateway.py +101 -15
  403. ksadk/tools/result_budget.py +12 -4
  404. ksadk/toolsets/__init__.py +161 -37
  405. ksadk/toolsets/a2a.py +426 -0
  406. ksadk/toolsets/platform.py +21 -5
  407. ksadk/toolsets/sandbox.py +82 -16
  408. ksadk/toolsets/skills.py +200 -39
  409. ksadk/toolsets/web.py +123 -26
  410. ksadk/toolsets/workspace.py +212 -101
  411. ksadk/tracing/__init__.py +19 -21
  412. ksadk/tracing/exporters/inmemory_exporter.py +62 -51
  413. ksadk/tracing/setup.py +135 -506
  414. ksadk/tracing/span_utils.py +0 -41
  415. ksadk/tui/loop.py +78 -30
  416. ksadk/tui/stream_render.py +1 -0
  417. ksadk/ui_config.py +5 -3
  418. ksadk/version.py +1 -1
  419. ksadk_runtime_common/memory_backend/registry.py +56 -56
  420. ksadk_runtime_common/schemas/runtime_event_v1.json +95 -0
  421. ksadk_runtime_common/workspace_files/router.py +8 -2
  422. agentengine_sdk_python-0.7.0.dist-info/RECORD +0 -482
  423. ksadk/a2a/card_builder.py +0 -64
  424. ksadk/a2a/client.py +0 -309
  425. ksadk/runners/utils/langfuse.py +0 -230
  426. ksadk/server/static/assets/CodeBlock-P16VOLYi.js +0 -9
  427. ksadk/server/static/assets/MathMessageMarkdown-CdGiQWHR.js +0 -8
  428. ksadk/server/static/assets/MermaidBlock-IOcal8cm.js +0 -303
  429. ksadk/server/static/assets/NativeTerminalPanel-DGSDWsei.js +0 -1
  430. ksadk/server/static/assets/architecture-7EHR7CIX-BvUlsA6l.js +0 -1
  431. ksadk/server/static/assets/channel-CTuydARX.js +0 -1
  432. ksadk/server/static/assets/chunk-QZHKN3VN-BnCydivS.js +0 -1
  433. ksadk/server/static/assets/classDiagram-4FO5ZUOK-BNHg45Be.js +0 -1
  434. ksadk/server/static/assets/classDiagram-v2-Q7XG4LA2-BNHg45Be.js +0 -1
  435. ksadk/server/static/assets/eventmodeling-FCH6USID-DsAgWnlf.js +0 -1
  436. ksadk/server/static/assets/gitGraph-WXDBUCRP-BIao9Yjg.js +0 -1
  437. ksadk/server/static/assets/index-C00Lwg3L.js +0 -165
  438. ksadk/server/static/assets/index-DAURbCsP.css +0 -1
  439. ksadk/server/static/assets/info-J43DQDTF-CyipqGxU.js +0 -1
  440. ksadk/server/static/assets/packet-YPE3B663-CGkyRxlg.js +0 -1
  441. ksadk/server/static/assets/pie-LRSECV5Y-M0uWAf4n.js +0 -1
  442. ksadk/server/static/assets/radar-GUYGQ44K-Bdbm24-x.js +0 -1
  443. ksadk/server/static/assets/stateDiagram-v2-BHNVJYJU-8xBN_gLM.js +0 -1
  444. ksadk/server/static/assets/treeView-BLDUP644-npMo0ak1.js +0 -1
  445. ksadk/server/static/assets/treemap-LRROVOQU-CHdzrrdo.js +0 -1
  446. ksadk/server/static/assets/wardley-L42UT6IY-BEQz7wyy.js +0 -1
  447. ksadk/tracing/exporters/langfuse_exporter.py +0 -445
  448. {agentengine_sdk_python-0.7.0.dist-info → agentengine_sdk_python-0.8.1.dist-info}/entry_points.txt +0 -0
  449. {agentengine_sdk_python-0.7.0.dist-info → agentengine_sdk_python-0.8.1.dist-info}/licenses/LICENSE +0 -0
  450. {agentengine_sdk_python-0.7.0.dist-info → agentengine_sdk_python-0.8.1.dist-info}/top_level.txt +0 -0
@@ -12,7 +12,7 @@ import logging
12
12
  from typing import List, Optional
13
13
 
14
14
  import httpx
15
- from pydantic import ConfigDict, Field
15
+ from pydantic import ConfigDict
16
16
 
17
17
  from ksadk.memory.adk.backends.base_ltm_backend import BaseLongTermMemoryBackend
18
18
 
@@ -52,12 +52,10 @@ class HttpLTMBackend(BaseLongTermMemoryBackend):
52
52
  def model_post_init(self, __context) -> None:
53
53
  if not self.base_url:
54
54
  logger.warning(
55
- "HttpLTMBackend: base_url is empty. "
56
- "Set KSADK_LTM_HTTP_URL environment variable."
55
+ "HttpLTMBackend: base_url is empty. " "Set KSADK_LTM_HTTP_URL environment variable."
57
56
  )
58
57
  logger.info(
59
- f"HttpLTMBackend initialized: base_url={self.base_url[:50]}... "
60
- f"index={self.index}"
58
+ f"HttpLTMBackend initialized: base_url={self.base_url[:50]}... " f"index={self.index}"
61
59
  )
62
60
 
63
61
  @property
@@ -75,9 +73,7 @@ class HttpLTMBackend(BaseLongTermMemoryBackend):
75
73
  )
76
74
  return self._client
77
75
 
78
- def save_memory(
79
- self, user_id: str, event_strings: List[str], **kwargs
80
- ) -> bool:
76
+ def save_memory(self, user_id: str, event_strings: List[str], **kwargs) -> bool:
81
77
  """保存记忆到远程服务
82
78
 
83
79
  TODO: 对接金山云记忆服务 API
@@ -105,24 +101,20 @@ class HttpLTMBackend(BaseLongTermMemoryBackend):
105
101
  response.raise_for_status()
106
102
 
107
103
  logger.info(
108
- f"Saved {len(event_strings)} events to remote memory service "
109
- f"for user={user_id}"
104
+ f"Saved {len(event_strings)} events to remote memory service " f"for user={user_id}"
110
105
  )
111
106
  return True
112
107
 
113
108
  except httpx.HTTPStatusError as e:
114
109
  logger.error(
115
- f"HTTP error saving memory: {e.response.status_code} "
116
- f"{e.response.text[:200]}"
110
+ f"HTTP error saving memory: {e.response.status_code} " f"{e.response.text[:200]}"
117
111
  )
118
112
  return False
119
113
  except Exception as e:
120
114
  logger.error(f"Error saving memory to remote service: {e}")
121
115
  return False
122
116
 
123
- def search_memory(
124
- self, user_id: str, query: str, top_k: int = 5, **kwargs
125
- ) -> List[str]:
117
+ def search_memory(self, user_id: str, query: str, top_k: int = 5, **kwargs) -> List[str]:
126
118
  """从远程服务检索记忆
127
119
 
128
120
  TODO: 对接金山云记忆服务 API
@@ -140,9 +132,7 @@ class HttpLTMBackend(BaseLongTermMemoryBackend):
140
132
  }
141
133
  """
142
134
  if not self.base_url:
143
- logger.warning(
144
- "HttpLTMBackend: base_url not configured, return empty results."
145
- )
135
+ logger.warning("HttpLTMBackend: base_url not configured, return empty results.")
146
136
  return []
147
137
 
148
138
  try:
@@ -158,7 +148,10 @@ class HttpLTMBackend(BaseLongTermMemoryBackend):
158
148
  response.raise_for_status()
159
149
 
160
150
  data = response.json()
161
- memories = data.get("memories", [])
151
+ raw_memories = data.get("memories", [])
152
+ memories = (
153
+ [str(memory) for memory in raw_memories] if isinstance(raw_memories, list) else []
154
+ )
162
155
 
163
156
  logger.info(
164
157
  f"Retrieved {len(memories)} memories from remote service "
@@ -168,8 +161,7 @@ class HttpLTMBackend(BaseLongTermMemoryBackend):
168
161
 
169
162
  except httpx.HTTPStatusError as e:
170
163
  logger.error(
171
- f"HTTP error searching memory: {e.response.status_code} "
172
- f"{e.response.text[:200]}"
164
+ f"HTTP error searching memory: {e.response.status_code} " f"{e.response.text[:200]}"
173
165
  )
174
166
  return []
175
167
  except Exception as e:
@@ -8,6 +8,8 @@ import logging
8
8
  from collections import defaultdict
9
9
  from typing import List
10
10
 
11
+ from pydantic import PrivateAttr
12
+
11
13
  from ksadk.memory.adk.backends.base_ltm_backend import BaseLongTermMemoryBackend
12
14
 
13
15
  logger = logging.getLogger(__name__)
@@ -27,19 +29,13 @@ class InMemoryLTMBackend(BaseLongTermMemoryBackend):
27
29
  ```
28
30
  """
29
31
 
30
- # Pydantic v2 不允许直接声明 mutable default,使用 model_post_init
31
- _storage: dict = None
32
+ _storage: defaultdict[str, list[str]] = PrivateAttr(default_factory=lambda: defaultdict(list))
32
33
 
33
34
  def model_post_init(self, __context) -> None:
34
35
  # {user_id: [event_string, ...]}
35
- self._storage = defaultdict(list)
36
- logger.info(
37
- f"InMemoryLTMBackend initialized: index={self.index}"
38
- )
36
+ logger.info(f"InMemoryLTMBackend initialized: index={self.index}")
39
37
 
40
- def save_memory(
41
- self, user_id: str, event_strings: List[str], **kwargs
42
- ) -> bool:
38
+ def save_memory(self, user_id: str, event_strings: List[str], **kwargs) -> bool:
43
39
  """保存记忆到内存"""
44
40
  if not event_strings:
45
41
  return True
@@ -51,9 +47,7 @@ class InMemoryLTMBackend(BaseLongTermMemoryBackend):
51
47
  )
52
48
  return True
53
49
 
54
- def search_memory(
55
- self, user_id: str, query: str, top_k: int = 5, **kwargs
56
- ) -> List[str]:
50
+ def search_memory(self, user_id: str, query: str, top_k: int = 5, **kwargs) -> List[str]:
57
51
  """基于关键词匹配检索记忆
58
52
 
59
53
  简单实现:对 query 分词后,按匹配关键词数量排序。
@@ -68,7 +62,7 @@ class InMemoryLTMBackend(BaseLongTermMemoryBackend):
68
62
  # 按字符分词(支持中英文混合)
69
63
  query_terms = query_lower.split()
70
64
 
71
- scored = []
65
+ scored: list[tuple[int, str]] = []
72
66
  for memory in user_memories:
73
67
  memory_lower = memory.lower()
74
68
  # 计算匹配分数:完整 query 匹配得高分,部分关键词匹配得低分
@@ -8,8 +8,9 @@
8
8
 
9
9
  环境变量:
10
10
  KSADK_LTM_BACKEND: sdk
11
- KSADK_LTM_ACCESS_KEY: AK (可选,默认取 KSYUN_ACCESS_KEY)
12
- KSADK_LTM_SECRET_KEY: SK (可选,默认取 KSYUN_SECRET_KEY)
11
+ KSADK_LTM_ACCESS_KEY: AK (可选,默认取 KSYUN_ACCESS_KEY / KSYUN_ACCESS_KEY_ID)
12
+ KSADK_LTM_SECRET_KEY: SK (可选,默认取 KSYUN_SECRET_KEY / KSYUN_SECRET_ACCESS_KEY)
13
+ KSADK_LTM_SESSION_TOKEN: STS 临时会话 token (可选,默认取 KSYUN_SESSION_TOKEN)
13
14
  KSADK_LTM_REGION: 区域 (默认 cn-beijing-6)
14
15
  KSADK_LTM_ENDPOINT: API 端点 (默认 aicp.api.ksyun.com)
15
16
  KSADK_LTM_SCHEME: http/https (默认 https)
@@ -42,6 +43,7 @@ class SdkLTMBackend(BaseLongTermMemoryBackend):
42
43
  Attributes:
43
44
  access_key: 访问密钥 ID (AK)
44
45
  secret_key: 访问密钥 (SK)
46
+ session_token: STS 临时会话 token
45
47
  region: API 区域
46
48
  endpoint: API 端点
47
49
  scheme: http 或 https
@@ -64,6 +66,7 @@ class SdkLTMBackend(BaseLongTermMemoryBackend):
64
66
 
65
67
  access_key: str = ""
66
68
  secret_key: str = ""
69
+ session_token: str = ""
67
70
  region: str = "cn-beijing-6"
68
71
  endpoint: str = "aicp.api.ksyun.com"
69
72
  scheme: str = "https"
@@ -105,9 +108,13 @@ class SdkLTMBackend(BaseLongTermMemoryBackend):
105
108
  return self._aicp_client
106
109
 
107
110
  try:
108
- from ksyun.common import credential
109
- from ksyun.common.profile.client_profile import ClientProfile
110
- from ksyun.common.profile.http_profile import HttpProfile
111
+ from ksyun.common import credential # type: ignore[import-untyped]
112
+ from ksyun.common.profile.client_profile import ( # type: ignore[import-untyped]
113
+ ClientProfile,
114
+ )
115
+ from ksyun.common.profile.http_profile import ( # type: ignore[import-untyped]
116
+ HttpProfile,
117
+ )
111
118
  except ImportError:
112
119
  raise ImportError(
113
120
  "kingsoftcloud-sdk-python is required for SDK memory backend. "
@@ -133,7 +140,9 @@ class SdkLTMBackend(BaseLongTermMemoryBackend):
133
140
  "Ensure kingsoftcloud-sdk-python>=1.5.8.94 is installed."
134
141
  )
135
142
 
136
- cred = credential.Credential(self.access_key, self.secret_key)
143
+ cred = credential.Credential(
144
+ self.access_key, self.secret_key, self.session_token or None
145
+ )
137
146
 
138
147
  http_profile = HttpProfile()
139
148
  http_profile.endpoint = self.endpoint
@@ -144,9 +153,7 @@ class SdkLTMBackend(BaseLongTermMemoryBackend):
144
153
  client_profile = ClientProfile()
145
154
  client_profile.httpProfile = http_profile
146
155
 
147
- self._aicp_client = aicp_module.AicpClient(
148
- cred, self.region, profile=client_profile
149
- )
156
+ self._aicp_client = aicp_module.AicpClient(cred, self.region, profile=client_profile)
150
157
 
151
158
  # 强制覆写 API 版本为记忆库 API 所需的 2025-11-14
152
159
  self._aicp_client._apiVersion = "2025-11-14"
@@ -181,12 +188,14 @@ class SdkLTMBackend(BaseLongTermMemoryBackend):
181
188
  if not text:
182
189
  continue
183
190
 
184
- conversation.append({
185
- "Role": role,
186
- "CreatedAt": int(time.time() * 1000),
187
- "MessageId": str(uuid.uuid4()),
188
- "Content": [{"Type": "input_text", "Text": text}],
189
- })
191
+ conversation.append(
192
+ {
193
+ "Role": role,
194
+ "CreatedAt": int(time.time() * 1000),
195
+ "MessageId": str(uuid.uuid4()),
196
+ "Content": [{"Type": "input_text", "Text": text}],
197
+ }
198
+ )
190
199
  return conversation
191
200
 
192
201
  def _effective_memory_collection_id(self) -> str:
@@ -195,9 +204,7 @@ class SdkLTMBackend(BaseLongTermMemoryBackend):
195
204
  def _effective_scene_id(self) -> str:
196
205
  return self.scene_id or DEFAULT_SCENE_ID
197
206
 
198
- def save_memory(
199
- self, user_id: str, event_strings: list[str], **kwargs
200
- ) -> bool:
207
+ def save_memory(self, user_id: str, event_strings: list[str], **kwargs) -> bool:
201
208
  """调用 CreateMemorySdk 写入记忆
202
209
 
203
210
  Args:
@@ -221,7 +228,10 @@ class SdkLTMBackend(BaseLongTermMemoryBackend):
221
228
  logger.info("No valid conversation items to save")
222
229
  return True
223
230
 
224
- metadata = kwargs.get("metadata") if isinstance(kwargs.get("metadata"), dict) else {}
231
+ metadata_value = kwargs.get("metadata")
232
+ metadata: dict[str, Any] = (
233
+ dict(metadata_value) if isinstance(metadata_value, dict) else {}
234
+ )
225
235
  agent_id = metadata.get("agent_id") or self.agent_id
226
236
  session_id = metadata.get("session_id") or kwargs.get("session_id")
227
237
  params = {
@@ -235,15 +245,15 @@ class SdkLTMBackend(BaseLongTermMemoryBackend):
235
245
  params["AgentId"] = agent_id
236
246
  if session_id:
237
247
  params["SessionId"] = session_id
248
+ if metadata.get("flush") is True or kwargs.get("flush") is True:
249
+ params["Flush"] = True
238
250
 
239
251
  logger.info(
240
252
  f"CreateMemorySdk: memory_collection_id={memory_collection_id}, "
241
253
  f"user_id={user_id}, messages={len(conversation)}"
242
254
  )
243
255
 
244
- response = client.call(
245
- "CreateMemorySdk", params, options={"IsPostJson": True}
246
- )
256
+ response = client.call("CreateMemorySdk", params, options={"IsPostJson": True})
247
257
  self.last_create_response = self._parse_json_response(response) or {}
248
258
  self.last_session_status = {
249
259
  "SessionId": session_id,
@@ -252,8 +262,7 @@ class SdkLTMBackend(BaseLongTermMemoryBackend):
252
262
  }
253
263
 
254
264
  logger.info(
255
- f"Saved {len(conversation)} messages to AICP memory service "
256
- f"for user={user_id}"
265
+ f"Saved {len(conversation)} messages to AICP memory service " f"for user={user_id}"
257
266
  )
258
267
  return True
259
268
 
@@ -262,9 +271,7 @@ class SdkLTMBackend(BaseLongTermMemoryBackend):
262
271
  logger.error(f"CreateMemorySdk failed: {e}")
263
272
  return False
264
273
 
265
- def search_memory(
266
- self, user_id: str, query: str, top_k: int = 5, **kwargs
267
- ) -> list[str]:
274
+ def search_memory(self, user_id: str, query: str, top_k: int = 5, **kwargs) -> list[str]:
268
275
  """调用 QueryMemorySdk 检索记忆
269
276
 
270
277
  Args:
@@ -306,9 +313,7 @@ class SdkLTMBackend(BaseLongTermMemoryBackend):
306
313
  f"user_id={user_id}, query='{query[:50]}'"
307
314
  )
308
315
 
309
- response = client.call(
310
- "QueryMemorySdk", params, options={"IsPostJson": True}
311
- )
316
+ response = client.call("QueryMemorySdk", params, options={"IsPostJson": True})
312
317
 
313
318
  # 解析响应
314
319
  memories = self._parse_query_response(response)
@@ -443,12 +448,7 @@ class SdkLTMBackend(BaseLongTermMemoryBackend):
443
448
  parsed.extend(self._parse_memory_item(memory))
444
449
  return parsed
445
450
 
446
- text = (
447
- item.get("Content")
448
- or item.get("Text")
449
- or item.get("Memory")
450
- or item.get("Data")
451
- )
451
+ text = item.get("Content") or item.get("Text") or item.get("Memory") or item.get("Data")
452
452
  if text is None:
453
453
  return []
454
454
  if isinstance(text, (dict, list)):
@@ -23,19 +23,19 @@
23
23
  import json
24
24
  import logging
25
25
  import os
26
- from typing import Any, List, Literal
26
+ from typing import Any, List, Literal, Optional, cast
27
27
 
28
- from google.adk.events.event import Event
29
- from google.adk.memory.base_memory_service import (
28
+ from pydantic import BaseModel, ConfigDict, Field, PrivateAttr
29
+ from typing_extensions import Union, override
30
+
31
+ from ksadk.compat.adk_compat import (
30
32
  BaseMemoryService,
33
+ Event,
34
+ MemoryEntry,
31
35
  SearchMemoryResponse,
36
+ Session,
32
37
  )
33
- from google.adk.memory.memory_entry import MemoryEntry
34
- from google.adk.sessions import Session
35
- from google.genai import types
36
- from pydantic import BaseModel, ConfigDict, Field
37
- from typing_extensions import Union, override
38
-
38
+ from ksadk.compat.adk_compat import genai_types as types
39
39
  from ksadk.memory.adk.backends.base_ltm_backend import BaseLongTermMemoryBackend
40
40
  from ksadk.memory.service import LongTermMemoryService
41
41
 
@@ -83,8 +83,8 @@ class LongTermMemory(BaseMemoryService, BaseModel):
83
83
  index: str = ""
84
84
  app_name: str = ""
85
85
 
86
- _backend: BaseLongTermMemoryBackend = None
87
- _service: LongTermMemoryService = None
86
+ _backend: Optional[BaseLongTermMemoryBackend] = PrivateAttr(default=None)
87
+ _service: Optional[LongTermMemoryService] = PrivateAttr(default=None)
88
88
 
89
89
  model_config = ConfigDict(arbitrary_types_allowed=True)
90
90
 
@@ -105,14 +105,18 @@ class LongTermMemory(BaseMemoryService, BaseModel):
105
105
  )
106
106
 
107
107
  def _get_service(self) -> LongTermMemoryService:
108
- if self._service is None:
108
+ service = self._service
109
+ if service is None:
109
110
  self.model_post_init(None)
110
- if self._backend is not None and self._service._backend is not self._backend:
111
- self._service.backend = self._backend
112
- self._service._backend = self._backend
113
- self._service.index = getattr(self._backend, "index", self._service.index)
114
- self.index = self._service.index
115
- return self._service
111
+ service = self._service
112
+ if service is None:
113
+ raise RuntimeError("LongTermMemory service initialization failed")
114
+ if self._backend is not None and service._backend is not self._backend:
115
+ service.backend = self._backend
116
+ service._backend = self._backend
117
+ service.index = getattr(self._backend, "index", service.index)
118
+ self.index = service.index
119
+ return service
116
120
 
117
121
  def _filter_and_convert_events(self, events: List[Event]) -> List[str]:
118
122
  """过滤并序列化 session 事件
@@ -157,9 +161,7 @@ class LongTermMemory(BaseMemoryService, BaseModel):
157
161
  event_strings = self._filter_and_convert_events(session.events)
158
162
 
159
163
  if not event_strings:
160
- logger.info(
161
- f"No user events to save for session={session.id}"
162
- )
164
+ logger.info(f"No user events to save for session={session.id}")
163
165
  return
164
166
 
165
167
  logger.info(
@@ -200,9 +202,7 @@ class LongTermMemory(BaseMemoryService, BaseModel):
200
202
  query=query, top_k=self.top_k, user_id=user_id
201
203
  )
202
204
  except Exception as e:
203
- logger.error(
204
- f"Error during memory search: {e}. Returning empty results."
205
- )
205
+ logger.error(f"Error during memory search: {e}. Returning empty results.")
206
206
 
207
207
  # 转换为 MemoryEntry 格式
208
208
  memory_events = []
@@ -213,9 +213,7 @@ class LongTermMemory(BaseMemoryService, BaseModel):
213
213
  text = memory_dict["parts"][0]["text"]
214
214
  role = memory_dict.get("role", "user")
215
215
  except (KeyError, IndexError):
216
- logger.warning(
217
- f"Non-standard memory format: {memory[:100]}. Skipping."
218
- )
216
+ logger.warning(f"Non-standard memory format: {memory[:100]}. Skipping.")
219
217
  continue
220
218
  except json.JSONDecodeError:
221
219
  # 非 JSON 格式的记忆字符串,直接作为 text
@@ -225,9 +223,7 @@ class LongTermMemory(BaseMemoryService, BaseModel):
225
223
  memory_events.append(
226
224
  MemoryEntry(
227
225
  author="user",
228
- content=types.Content(
229
- parts=[types.Part(text=text)], role=role
230
- ),
226
+ content=types.Content(parts=[types.Part(text=text)], role=role),
231
227
  )
232
228
  )
233
229
 
@@ -250,22 +246,23 @@ class LongTermMemory(BaseMemoryService, BaseModel):
250
246
  KSADK_LTM_BACKEND: local / http / sdk
251
247
  KSADK_LTM_HTTP_URL: HTTP 记忆服务地址
252
248
  KSADK_LTM_HTTP_TOKEN: HTTP 认证 Token
253
- KSADK_LTM_ACCESS_KEY: SDK AK (fallback to KSYUN_ACCESS_KEY)
254
- KSADK_LTM_SECRET_KEY: SDK SK (fallback to KSYUN_SECRET_KEY)
249
+ KSADK_LTM_ACCESS_KEY: SDK AK (fallback to KSYUN_ACCESS_KEY / KSYUN_ACCESS_KEY_ID)
250
+ KSADK_LTM_SECRET_KEY: SDK SK (fallback to KSYUN_SECRET_KEY / KSYUN_SECRET_ACCESS_KEY)
251
+ KSADK_LTM_SESSION_TOKEN: SDK STS token (fallback to KSYUN_SESSION_TOKEN)
255
252
  KSADK_LTM_TOP_K: 检索数量 (默认 5)
256
253
  KSADK_LTM_INDEX: 索引名称
257
254
  """
258
255
  service = LongTermMemoryService.from_env(app_name=app_name, backend=backend)
259
- backend_name = (
260
- backend
261
- or os.environ.get("KSADK_LTM_BACKEND", "local")
262
- )
256
+ backend_name = backend or os.environ.get("KSADK_LTM_BACKEND", "local")
263
257
  backend_config = dict(service.backend_config)
264
258
  if "index" in backend_config and backend_name != "local":
265
259
  backend_config.pop("index", None)
266
260
 
261
+ if backend_name not in {"local", "http", "sdk"}:
262
+ raise ValueError(f"Unsupported long-term memory backend: {backend_name}")
263
+ normalized_backend = cast(Literal["local", "http", "sdk"], backend_name)
267
264
  return cls(
268
- backend=backend_name,
265
+ backend=normalized_backend,
269
266
  backend_config=backend_config,
270
267
  top_k=service.top_k,
271
268
  index=service.index,
@@ -4,15 +4,14 @@ import asyncio
4
4
  import logging
5
5
  from typing import Any, Optional
6
6
 
7
- from google.adk.events.event import Event
8
- from google.adk.sessions import InMemorySessionService
9
- from google.adk.sessions.base_session_service import (
7
+ from ksadk.compat.adk_compat import (
10
8
  BaseSessionService,
9
+ Event,
11
10
  GetSessionConfig,
11
+ InMemorySessionService,
12
12
  ListSessionsResponse,
13
+ Session,
13
14
  )
14
- from google.adk.sessions.session import Session
15
-
16
15
  from ksadk.sessions.resilience import is_session_backend_failure
17
16
 
18
17
  logger = logging.getLogger(__name__)
@@ -24,14 +24,15 @@
24
24
 
25
25
  import logging
26
26
  import os
27
- from typing import Any, Literal, Optional
27
+ from typing import Any, Literal, Optional, cast
28
28
 
29
- from google.adk.sessions import (
29
+ from pydantic import BaseModel, PrivateAttr
30
+
31
+ from ksadk.compat.adk_compat import (
30
32
  BaseSessionService,
31
33
  InMemorySessionService,
32
34
  Session,
33
35
  )
34
- from pydantic import BaseModel, PrivateAttr
35
36
 
36
37
  logger = logging.getLogger(__name__)
37
38
 
@@ -119,14 +120,9 @@ class ShortTermMemory(BaseModel):
119
120
  logger.info("ShortTermMemory: using InMemorySessionService")
120
121
 
121
122
  case "sqlite":
122
- db_url = _normalize_database_url(
123
- f"sqlite:///{self.local_database_path}"
124
- )
123
+ db_url = _normalize_database_url(f"sqlite:///{self.local_database_path}")
125
124
  self._init_database_service(db_url)
126
- logger.info(
127
- f"ShortTermMemory: using SQLite at "
128
- f"{self.local_database_path}"
129
- )
125
+ logger.info(f"ShortTermMemory: using SQLite at " f"{self.local_database_path}")
130
126
 
131
127
  case "database":
132
128
  if not self.db_url:
@@ -148,8 +144,7 @@ class ShortTermMemory(BaseModel):
148
144
  """初始化数据库 SessionService"""
149
145
  normalized_db_url = _normalize_database_url(db_url)
150
146
  try:
151
- from google.adk.sessions import DatabaseSessionService
152
-
147
+ from ksadk.compat.adk_compat import DatabaseSessionService
153
148
  from ksadk.memory.adk.resilient_session_service import ResilientADKSessionService
154
149
  from ksadk.sessions.resilience import session_backend_timeout_seconds
155
150
 
@@ -165,8 +160,7 @@ class ShortTermMemory(BaseModel):
165
160
  DatabaseSessionService(db_url=normalized_db_url, **service_kwargs)
166
161
  )
167
162
  logger.info(
168
- f"ShortTermMemory: using DatabaseSessionService "
169
- f"({normalized_db_url[:30]}...)"
163
+ f"ShortTermMemory: using DatabaseSessionService " f"({normalized_db_url[:30]}...)"
170
164
  )
171
165
  except ImportError:
172
166
  logger.warning(
@@ -218,8 +212,7 @@ class ShortTermMemory(BaseModel):
218
212
  )
219
213
  if session:
220
214
  logger.debug(
221
- f"Session {session_id} already exists "
222
- f"(app={app_name}, user={user_id})"
215
+ f"Session {session_id} already exists " f"(app={app_name}, user={user_id})"
223
216
  )
224
217
  return session
225
218
  except Exception as e:
@@ -238,10 +231,7 @@ class ShortTermMemory(BaseModel):
238
231
  app_name=app_name,
239
232
  user_id=user_id,
240
233
  )
241
- logger.info(
242
- f"Created session: id={session.id}, "
243
- f"app={app_name}, user={user_id}"
244
- )
234
+ logger.info(f"Created session: id={session.id}, " f"app={app_name}, user={user_id}")
245
235
  return session
246
236
  except Exception as e:
247
237
  logger.error(f"Failed to create session: {e}")
@@ -297,8 +287,9 @@ class ShortTermMemory(BaseModel):
297
287
  else:
298
288
  backend = "local"
299
289
 
290
+ backend_name = cast(Literal["local", "sqlite", "database"], backend)
300
291
  return cls(
301
- backend=backend,
292
+ backend=backend_name,
302
293
  db_url=db_url,
303
294
  local_database_path=db_path,
304
295
  )
ksadk/memory/adk_tool.py CHANGED
@@ -21,11 +21,12 @@ def save_memory(content: str) -> dict:
21
21
 
22
22
  def create_adk_tool():
23
23
  try:
24
- from google.adk.tools import FunctionTool
24
+ from ksadk.compat.adk_compat import FunctionTool
25
25
 
26
26
  return FunctionTool(func=save_memory)
27
27
  except ImportError:
28
28
  logger.warning(
29
- "google-adk not installed, returning raw function as tool. Install with: pip install ksadk[adk]"
29
+ "google-adk not installed, returning raw function as tool. "
30
+ "Install with: pip install ksadk[adk]"
30
31
  )
31
32
  return save_memory