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.
- {agentengine_sdk_python-0.7.0.dist-info → agentengine_sdk_python-0.8.1.dist-info}/METADATA +52 -20
- agentengine_sdk_python-0.8.1.dist-info/RECORD +644 -0
- {agentengine_sdk_python-0.7.0.dist-info → agentengine_sdk_python-0.8.1.dist-info}/WHEEL +1 -1
- ksadk/a2a/__init__.py +180 -11
- ksadk/a2a/bootstrap.py +332 -0
- ksadk/a2a/card.py +15 -0
- ksadk/a2a/context_store.py +203 -0
- ksadk/a2a/control_plane.py +1056 -0
- ksadk/a2a/credential.py +99 -0
- ksadk/a2a/event_adapter.py +149 -0
- ksadk/a2a/executor.py +361 -137
- ksadk/a2a/external_transport.py +516 -0
- ksadk/a2a/identity.py +304 -0
- ksadk/a2a/ids.py +22 -0
- ksadk/a2a/langgraph.py +285 -0
- ksadk/a2a/resume_store.py +201 -0
- ksadk/a2a/routes.py +112 -0
- ksadk/a2a/server.py +102 -62
- ksadk/a2a/service_env.py +33 -0
- ksadk/a2a/space_client.py +1122 -0
- ksadk/a2a/task_adapter.py +423 -0
- ksadk/a2a/task_event_dispatcher.py +167 -0
- ksadk/a2a/task_event_outbox.py +326 -0
- ksadk/a2a/task_store.py +206 -0
- ksadk/a2a_card.py +101 -0
- ksadk/a2ui/__init__.py +27 -0
- ksadk/a2ui/core.py +186 -0
- ksadk/a2ui/models.py +166 -0
- ksadk/a2ui/renderer.py +198 -0
- ksadk/agui/__init__.py +9 -0
- ksadk/agui/a2ui_projection.py +92 -0
- ksadk/agui/agent.py +872 -0
- ksadk/agui/config.py +92 -0
- ksadk/agui/routes.py +47 -0
- ksadk/api/client.py +238 -204
- ksadk/api/environment.py +27 -0
- ksadk/builders/__init__.py +2 -0
- ksadk/builders/base.py +16 -14
- ksadk/builders/code_builder.py +375 -270
- ksadk/builders/container_builder.py +240 -200
- ksadk/builders/framework_requirements.py +31 -12
- ksadk/builders/ks3_uploader.py +60 -29
- ksadk/builders/managed_runtime_builder.py +173 -0
- ksadk/builders/mcp_builder.py +91 -92
- ksadk/builders/requirements_utils.py +1 -5
- ksadk/cli/__init__.py +97 -171
- ksadk/cli/cmd_a2a.py +255 -84
- ksadk/cli/cmd_agent.py +19 -5
- ksadk/cli/cmd_build.py +158 -29
- ksadk/cli/cmd_completion.py +47 -35
- ksadk/cli/cmd_config.py +267 -198
- ksadk/cli/cmd_create.py +507 -740
- ksadk/cli/cmd_dashboard.py +120 -45
- ksadk/cli/cmd_deploy.py +135 -59
- ksadk/cli/cmd_destroy.py +44 -14
- ksadk/cli/cmd_eval.py +386 -0
- ksadk/cli/cmd_files.py +63 -24
- ksadk/cli/cmd_hermes.py +313 -135
- ksadk/cli/cmd_invoke.py +184 -122
- ksadk/cli/cmd_launch.py +76 -28
- ksadk/cli/cmd_mcp.py +98 -64
- ksadk/cli/cmd_model.py +14 -5
- ksadk/cli/cmd_openclaw.py +564 -268
- ksadk/cli/cmd_replay.py +71 -0
- ksadk/cli/cmd_run.py +58 -73
- ksadk/cli/cmd_status.py +80 -31
- ksadk/cli/cmd_studio.py +110 -0
- ksadk/cli/cmd_version.py +20 -13
- ksadk/cli/cmd_web.py +95 -18
- ksadk/cli/deploy_utils.py +20 -20
- ksadk/cli/dry_run.py +7 -4
- ksadk/cli/env_options.py +83 -0
- ksadk/cli/error_utils.py +37 -12
- ksadk/cli/global_options.py +4 -3
- ksadk/cli/local_runtime.py +1 -2
- ksadk/cli/model_catalog.py +6 -2
- ksadk/cli/network_options.py +41 -19
- ksadk/cli/resource_common.py +6 -2
- ksadk/cli/runtime_bootstrap.py +51 -0
- ksadk/cli/storage.py +0 -1
- ksadk/cli/ui.py +11 -3
- ksadk/cli/workflow_common.py +52 -18
- ksadk/codex/__init__.py +12 -0
- ksadk/codex/client.py +1042 -0
- ksadk/codex/phase.py +143 -0
- ksadk/codex/runtime.py +940 -0
- ksadk/common/aicp_env.py +0 -1
- ksadk/common/auth.py +2 -2
- ksadk/common/constants.py +1 -3
- ksadk/common/kop_client.py +232 -0
- ksadk/common/llm_utils.py +17 -13
- ksadk/compat/__init__.py +5 -0
- ksadk/compat/adk_compat.py +200 -0
- ksadk/compat/copilotkit_a2ui.py +330 -0
- ksadk/configs/__init__.py +12 -14
- ksadk/configs/env_registry.py +661 -116
- ksadk/configs/global_config.py +3 -2
- ksadk/configs/settings.py +133 -209
- ksadk/conversations/__init__.py +85 -92
- ksadk/conversations/attachment_storage.py +16 -11
- ksadk/conversations/attachments.py +44 -36
- ksadk/conversations/compaction_pipeline.py +12 -12
- ksadk/conversations/compaction_prompt.py +9 -5
- ksadk/conversations/context.py +221 -6
- ksadk/conversations/message_projection.py +438 -51
- ksadk/conversations/model_context.py +12 -6
- ksadk/conversations/model_options.py +0 -1
- ksadk/conversations/normalize.py +20 -16
- ksadk/conversations/reasoning_markup.py +1 -1
- ksadk/conversations/runtime.py +339 -5255
- ksadk/conversations/runtime_compaction.py +333 -0
- ksadk/conversations/runtime_constants.py +27 -0
- ksadk/conversations/runtime_governance.py +185 -0
- ksadk/conversations/runtime_input.py +660 -0
- ksadk/conversations/runtime_invocation.py +395 -0
- ksadk/conversations/runtime_metadata.py +475 -0
- ksadk/conversations/runtime_observability.py +367 -0
- ksadk/conversations/runtime_payloads.py +272 -0
- ksadk/conversations/runtime_persistence.py +440 -0
- ksadk/conversations/runtime_preparation.py +426 -0
- ksadk/conversations/runtime_resume.py +836 -0
- ksadk/conversations/runtime_stream_events.py +902 -0
- ksadk/conversations/runtime_streaming.py +700 -0
- ksadk/conversations/semantic_summary.py +17 -5
- ksadk/conversations/session_title.py +6 -3
- ksadk/deployment/__init__.py +15 -16
- ksadk/deployment/agent_access.py +12 -23
- ksadk/deployment/base.py +51 -38
- ksadk/deployment/managed_runtime.py +33 -0
- ksadk/deployment/manager.py +85 -71
- ksadk/deployment/providers/serverless.py +379 -210
- ksadk/deployment/registry.py +38 -32
- ksadk/deployment/state.py +11 -11
- ksadk/deployment/ui_config.py +1 -1
- ksadk/detection/__init__.py +1 -1
- ksadk/detection/detector.py +146 -83
- ksadk/detection/mcp_detector.py +9 -6
- ksadk/evaluation/__init__.py +84 -0
- ksadk/evaluation/a2a_adapter.py +444 -0
- ksadk/evaluation/adapters.py +54 -0
- ksadk/evaluation/contracts.py +409 -0
- ksadk/evaluation/evalset.py +351 -0
- ksadk/evaluation/evaluators.py +461 -0
- ksadk/evaluation/executor.py +118 -0
- ksadk/evaluation/storage.py +68 -0
- ksadk/evaluation/target.py +73 -0
- ksadk/events/__init__.py +25 -0
- ksadk/events/parser.py +191 -0
- ksadk/events/replay.py +37 -0
- ksadk/events/runtime_event.py +273 -0
- ksadk/events/store.py +317 -0
- ksadk/harness/__init__.py +35 -0
- ksadk/harness/app.py +269 -0
- ksadk/harness/config.py +181 -0
- ksadk/harness/reasoner.py +105 -0
- ksadk/harness/runtime.py +364 -0
- ksadk/harness/sandbox.py +141 -0
- ksadk/harness/tools.py +222 -0
- ksadk/hermes_terminal.py +28 -12
- ksadk/identity/resolver.py +15 -9
- ksadk/ids.py +32 -0
- ksadk/knowledge_base/adk_tool.py +1 -1
- ksadk/knowledge_base/client.py +38 -33
- ksadk/managed_a2a_card.py +160 -0
- ksadk/managed_runtime.py +195 -0
- ksadk/markdown.py +5 -2
- ksadk/mcp_runtime/__init__.py +9 -6
- ksadk/memory/__init__.py +1 -1
- ksadk/memory/adk/__init__.py +2 -0
- ksadk/memory/adk/backends/base_ltm_backend.py +2 -6
- ksadk/memory/adk/backends/http_ltm_backend.py +13 -21
- ksadk/memory/adk/backends/inmemory_ltm_backend.py +7 -13
- ksadk/memory/adk/backends/sdk_ltm_backend.py +36 -36
- ksadk/memory/adk/long_term_memory.py +34 -37
- ksadk/memory/adk/resilient_session_service.py +4 -5
- ksadk/memory/adk/short_term_memory.py +12 -21
- ksadk/memory/adk_tool.py +3 -2
- ksadk/memory/backends/base.py +19 -19
- ksadk/memory/backends/memory.py +24 -25
- ksadk/memory/backends/redis.py +31 -30
- ksadk/memory/langchain_tool.py +2 -1
- ksadk/memory/manager.py +52 -47
- ksadk/memory/service.py +16 -6
- ksadk/memory/tool.py +4 -0
- ksadk/model_policy.py +15 -7
- ksadk/model_proxy/__init__.py +51 -0
- ksadk/model_proxy/bootstrap.py +80 -0
- ksadk/model_proxy/cache.py +165 -0
- ksadk/model_proxy/config.py +66 -0
- ksadk/model_proxy/demo_webui.py +115 -0
- ksadk/model_proxy/detect.py +145 -0
- ksadk/model_proxy/gate.py +68 -0
- ksadk/model_proxy/namespace.py +201 -0
- ksadk/model_proxy/protocol_proxy.py +22 -0
- ksadk/model_proxy/server.py +443 -0
- ksadk/model_proxy/transform.py +735 -0
- ksadk/openclaw_gateway.py +29 -14
- ksadk/runners/adk_runner.py +354 -146
- ksadk/runners/base_runner.py +71 -29
- ksadk/runners/deepagents_runner.py +0 -1
- ksadk/runners/factory.py +18 -5
- ksadk/runners/langchain_runner.py +29 -742
- ksadk/runners/langgraph_runner.py +417 -97
- ksadk/runners/patch_langchain.py +16 -16
- ksadk/runners/remote_runner.py +134 -33
- ksadk/runners/usage_accumulator.py +1 -0
- ksadk/runners/utils/__init__.py +0 -10
- ksadk/runners/utils/loader.py +23 -7
- ksadk/runtime/__init__.py +67 -0
- ksadk/runtime/adapter.py +412 -0
- ksadk/runtime/conversation_execution.py +553 -0
- ksadk/runtime/executor.py +251 -0
- ksadk/runtime/factory.py +156 -0
- ksadk/runtime/framework_adapters.py +118 -0
- ksadk/runtime/launch.py +48 -0
- ksadk/runtime/preprocessing.py +131 -0
- ksadk/runtime/runner_adapter.py +1032 -0
- ksadk/runtime/runner_loading.py +36 -0
- ksadk/runtime_context.py +18 -3
- ksadk/runtime_state.py +0 -1
- ksadk/sandbox/__init__.py +4 -1
- ksadk/sandbox/backends/__init__.py +4 -1
- ksadk/sandbox/backends/e2b.py +13 -5
- ksadk/sandbox/backends/local_process.py +11 -3
- ksadk/sandbox/base.py +10 -15
- ksadk/sandbox/factory.py +14 -4
- ksadk/sandbox/registry.py +57 -6
- ksadk/server/__init__.py +39 -4
- ksadk/server/api_models.py +15 -5
- ksadk/server/app.py +24 -3928
- ksadk/server/composition.py +47 -0
- ksadk/server/factory.py +622 -0
- ksadk/server/routes/__init__.py +1 -0
- ksadk/server/routes/checkpoint_resolution.py +116 -0
- ksadk/server/routes/common.py +682 -0
- ksadk/server/routes/control.py +331 -0
- ksadk/server/routes/dependencies.py +98 -0
- ksadk/server/routes/misc.py +425 -0
- ksadk/server/routes/models.py +451 -0
- ksadk/server/routes/openai_compat.py +229 -0
- ksadk/server/routes/projection.py +848 -0
- ksadk/server/routes/routers.py +52 -0
- ksadk/server/routes/run.py +519 -0
- ksadk/server/routes/sessions.py +644 -0
- ksadk/server/routes/streaming.py +265 -0
- ksadk/server/routes/workspace.py +414 -0
- ksadk/server/static/assets/{ArtifactsPanel-D-SSn2ee.js → ArtifactsPanel-CakCqxEN.js} +1 -1
- ksadk/server/static/assets/CodeBlock-CynLknyO.js +9 -0
- ksadk/server/static/assets/MathMessageMarkdown-3sQdOysS.js +8 -0
- ksadk/server/static/assets/MermaidBlock-NERD_ef7.js +303 -0
- ksadk/server/static/assets/NativeTerminalPanel-CiHWf82q.js +1 -0
- ksadk/server/static/assets/{arc-BA13sHc9.js → arc-DrgjcKhl.js} +1 -1
- ksadk/server/static/assets/architecture-7EHR7CIX-CpZLRCcY.js +1 -0
- ksadk/server/static/assets/{architectureDiagram-3BPJPVTR-DzJzgVoL.js → architectureDiagram-3BPJPVTR-BXoVRbQ6.js} +1 -1
- ksadk/server/static/assets/{blockDiagram-GPEHLZMM-UTdVcZhn.js → blockDiagram-GPEHLZMM-BnaB3Ywv.js} +1 -1
- ksadk/server/static/assets/{c4Diagram-AAUBKEIU-Dix0GD4m.js → c4Diagram-AAUBKEIU-Dw4weZcp.js} +1 -1
- ksadk/server/static/assets/channel-Dt3rQTFI.js +1 -0
- ksadk/server/static/assets/{chunk-2J33WTMH-C2JxuZ42.js → chunk-2J33WTMH-ChjpLK7j.js} +1 -1
- ksadk/server/static/assets/{chunk-4BX2VUAB-Be57QPgD.js → chunk-4BX2VUAB-B9drTgOW.js} +1 -1
- ksadk/server/static/assets/{chunk-55IACEB6-WjSuy4nv.js → chunk-55IACEB6-CK4ROATy.js} +1 -1
- ksadk/server/static/assets/{chunk-727SXJPM-BOovP-b5.js → chunk-727SXJPM-B9KtTTgw.js} +1 -1
- ksadk/server/static/assets/{chunk-AQP2D5EJ-DOmZNmWj.js → chunk-AQP2D5EJ-1O1mki3m.js} +1 -1
- ksadk/server/static/assets/{chunk-FMBD7UC4-DzwlodkU.js → chunk-FMBD7UC4-B_fH2YuH.js} +1 -1
- ksadk/server/static/assets/{chunk-ND2GUHAM-DMqAikEU.js → chunk-ND2GUHAM-D6rFLaVV.js} +1 -1
- ksadk/server/static/assets/chunk-QZHKN3VN-iXEZtKQc.js +1 -0
- ksadk/server/static/assets/classDiagram-4FO5ZUOK-DIveV17Q.js +1 -0
- ksadk/server/static/assets/classDiagram-v2-Q7XG4LA2-DIveV17Q.js +1 -0
- ksadk/server/static/assets/{cose-bilkent-S5V4N54A-Zhy2GBnP.js → cose-bilkent-S5V4N54A-ChNs_Mdk.js} +1 -1
- ksadk/server/static/assets/{dagre-BM42HDAG-CbKrtIUz.js → dagre-BM42HDAG-D0QXg_MQ.js} +1 -1
- ksadk/server/static/assets/{diagram-2AECGRRQ-BRApgQRK.js → diagram-2AECGRRQ-DBDDKwBQ.js} +1 -1
- ksadk/server/static/assets/{diagram-5GNKFQAL-D0xbnDiK.js → diagram-5GNKFQAL-BkwDOxmO.js} +1 -1
- ksadk/server/static/assets/{diagram-KO2AKTUF-CVugVI9L.js → diagram-KO2AKTUF-Bv8waYvY.js} +1 -1
- ksadk/server/static/assets/{diagram-LMA3HP47-DozUGgee.js → diagram-LMA3HP47-e1VECDdu.js} +1 -1
- ksadk/server/static/assets/{diagram-OG6HWLK6-ZOYsKlru.js → diagram-OG6HWLK6-Ds9adfRl.js} +1 -1
- ksadk/server/static/assets/{dist-DpKtt4Bo.js → dist-4N2NMVYg.js} +1 -1
- ksadk/server/static/assets/{dist-CkEKJFtk.js → dist-B-jNR6Vn.js} +1 -1
- ksadk/server/static/assets/{dist-D57wnGWd.js → dist-B5J2uhNk.js} +1 -1
- ksadk/server/static/assets/{dist-8_SfK1IP.js → dist-B5oS1zcj.js} +1 -1
- ksadk/server/static/assets/{dist-DMezvBGJ.js → dist-BB3-OwTQ.js} +1 -1
- ksadk/server/static/assets/{dist-2hInLS_J.js → dist-BIlKoW0k.js} +1 -1
- ksadk/server/static/assets/{dist-BrCcQ47T.js → dist-BjOdlDjj.js} +1 -1
- ksadk/server/static/assets/{dist-BmlMPsCc.js → dist-C1sz5Eo3.js} +1 -1
- ksadk/server/static/assets/{dist-B0NP_Z0z.js → dist-CWV4lDr1.js} +1 -1
- ksadk/server/static/assets/{dist-D-xOD048.js → dist-CmZHzlwZ.js} +1 -1
- ksadk/server/static/assets/{dist-DL_NKc_z.js → dist-D6MpCZtz.js} +1 -1
- ksadk/server/static/assets/{dist-DyOkZmze.js → dist-DJN_6Y39.js} +1 -1
- ksadk/server/static/assets/{dist-DmFaq_Iy.js → dist-DQU9EWw-.js} +1 -1
- ksadk/server/static/assets/{dist-gX6GOLKq.js → dist-DWKByxWV.js} +1 -1
- ksadk/server/static/assets/{dist-DyWsb78Q.js → dist-Dli7qW-B.js} +1 -1
- ksadk/server/static/assets/{dist-BIJVDMuB.js → dist-DsHPdk3W.js} +1 -1
- ksadk/server/static/assets/{dist-Dp0k7bWI.js → dist-X4TnqwOK.js} +1 -1
- ksadk/server/static/assets/{dist-8EEyGgDx.js → dist-_pHPTyZ-.js} +1 -1
- ksadk/server/static/assets/{dist-CPBtqRTW.js → dist-fhOuWds5.js} +1 -1
- ksadk/server/static/assets/{dist-D-JMdWPQ.js → dist-gLnrGsoU.js} +1 -1
- ksadk/server/static/assets/{dist-BssVmjIo.js → dist-j6Dxmf_j.js} +1 -1
- ksadk/server/static/assets/{dist-C3HIIaN5.js → dist-o2OVmKvt.js} +1 -1
- ksadk/server/static/assets/{erDiagram-TEJ5UH35-Bk-9bgE5.js → erDiagram-TEJ5UH35-BPItFKH6.js} +1 -1
- ksadk/server/static/assets/eventmodeling-FCH6USID-DYFSxbqr.js +1 -0
- ksadk/server/static/assets/{flowDiagram-I6XJVG4X-Dn9kZVuZ.js → flowDiagram-I6XJVG4X-BbYB9w5Y.js} +1 -1
- ksadk/server/static/assets/{ganttDiagram-6RSMTGT7-BGxXlJqm.js → ganttDiagram-6RSMTGT7-TQXa0KXv.js} +1 -1
- ksadk/server/static/assets/gitGraph-WXDBUCRP-DyNYp6BN.js +1 -0
- ksadk/server/static/assets/{gitGraphDiagram-PVQCEYII-C7Q0X-wi.js → gitGraphDiagram-PVQCEYII-bKblCnpa.js} +1 -1
- ksadk/server/static/assets/index-R52pJJvg.js +177 -0
- ksadk/server/static/assets/index-jJr3_955.css +2 -0
- ksadk/server/static/assets/info-J43DQDTF-WUx7qTde.js +1 -0
- ksadk/server/static/assets/{infoDiagram-5YYISTIA-BO_CSqq5.js → infoDiagram-5YYISTIA-BGVT7J_i.js} +1 -1
- ksadk/server/static/assets/{ishikawaDiagram-YF4QCWOH-eYLPLd46.js → ishikawaDiagram-YF4QCWOH-K0OOfVna.js} +1 -1
- ksadk/server/static/assets/{journeyDiagram-JHISSGLW-De9geSb0.js → journeyDiagram-JHISSGLW-8LeOJaZp.js} +1 -1
- ksadk/server/static/assets/{kanban-definition-UN3LZRKU-Cs80kQto.js → kanban-definition-UN3LZRKU-C6uCgZrW.js} +1 -1
- ksadk/server/static/assets/{katex-DSrCFD8n.js → katex-CYWseY5E.js} +1 -1
- ksadk/server/static/assets/{linear-CN9sbKTF.js → linear-hdBcYzM8.js} +1 -1
- ksadk/server/static/assets/{mermaid-parser.core-DlgSBU8l.js → mermaid-parser.core-BWrDjSZM.js} +2 -2
- ksadk/server/static/assets/{mindmap-definition-RKZ34NQL-9afz7Oug.js → mindmap-definition-RKZ34NQL-Bjy_2v4_.js} +1 -1
- ksadk/server/static/assets/packet-YPE3B663-BN13y_xl.js +1 -0
- ksadk/server/static/assets/pie-LRSECV5Y-ftSLXhhc.js +1 -0
- ksadk/server/static/assets/{pieDiagram-4H26LBE5-DPv_VstN.js → pieDiagram-4H26LBE5-GmmqNiVH.js} +1 -1
- ksadk/server/static/assets/{quadrantDiagram-W4KKPZXB-o77wZ1XK.js → quadrantDiagram-W4KKPZXB-BmkRbwCg.js} +1 -1
- ksadk/server/static/assets/radar-GUYGQ44K-jaICkIeO.js +1 -0
- ksadk/server/static/assets/{requirementDiagram-4Y6WPE33-BYVw81VC.js → requirementDiagram-4Y6WPE33-DSWFqL7c.js} +1 -1
- ksadk/server/static/assets/{sankeyDiagram-5OEKKPKP-B7nZFMKT.js → sankeyDiagram-5OEKKPKP-l6iXmU65.js} +1 -1
- ksadk/server/static/assets/{sequenceDiagram-3UESZ5HK-BGRRrFw5.js → sequenceDiagram-3UESZ5HK-Cq6UBeQB.js} +1 -1
- ksadk/server/static/assets/{stateDiagram-AJRCARHV-BUfHCoPs.js → stateDiagram-AJRCARHV-qzTQpg3Y.js} +1 -1
- ksadk/server/static/assets/stateDiagram-v2-BHNVJYJU-BYCoYGAN.js +1 -0
- ksadk/server/static/assets/{timeline-definition-PNZ67QCA-FbCTGrf9.js → timeline-definition-PNZ67QCA-DEz24vV0.js} +1 -1
- ksadk/server/static/assets/treeView-BLDUP644-Cpib_vlz.js +1 -0
- ksadk/server/static/assets/treemap-LRROVOQU-DQxfmVHK.js +1 -0
- ksadk/server/static/assets/{vennDiagram-CIIHVFJN-DWgwtPsJ.js → vennDiagram-CIIHVFJN-CMCixki2.js} +1 -1
- ksadk/server/static/assets/wardley-L42UT6IY-BQYHnnkU.js +1 -0
- ksadk/server/static/assets/{wardleyDiagram-YWT4CUSO-2x8G-tTM.js → wardleyDiagram-YWT4CUSO-CVzB8F9K.js} +1 -1
- ksadk/server/static/assets/{xychartDiagram-2RQKCTM6-Drma3AYl.js → xychartDiagram-2RQKCTM6-BFBqBLc1.js} +1 -1
- ksadk/server/static/index.html +2 -2
- ksadk/server/terminal_sessions.py +111 -58
- ksadk/sessions/__init__.py +69 -19
- ksadk/sessions/base.py +31 -11
- ksadk/sessions/continuity.py +2 -3
- ksadk/sessions/in_memory.py +46 -2
- ksadk/sessions/local_service.py +148 -17
- ksadk/sessions/postgres_service.py +143 -25
- ksadk/sessions/resilient.py +36 -8
- ksadk/skills/models.py +17 -5
- ksadk/skills/package_store.py +5 -2
- ksadk/skills/runtime/agent.py +20 -5
- ksadk/skills/runtime/artifacts.py +1 -5
- ksadk/skills/runtime/backends/e2b.py +10 -4
- ksadk/skills/runtime/backends/local.py +15 -3
- ksadk/skills/runtime/base.py +1 -2
- ksadk/skills/runtime/executor.py +10 -3
- ksadk/skills/runtime/factory.py +4 -2
- ksadk/skills/runtime/loader.py +1 -2
- ksadk/skills/runtime/registry.py +15 -10
- ksadk/skills/runtime/request.py +3 -1
- ksadk/skills/service_client.py +47 -16
- ksadk/skills/tool_defs.py +15 -10
- ksadk/studio/__init__.py +5 -0
- ksadk/studio/agent_avatar_assets.py +120 -0
- ksadk/studio/agent_lifecycle.py +51 -0
- ksadk/studio/api.py +1046 -0
- ksadk/studio/api_catalog_routes.py +324 -0
- ksadk/studio/api_contracts.py +177 -0
- ksadk/studio/api_helpers.py +132 -0
- ksadk/studio/authoring.py +524 -0
- ksadk/studio/authoring_coordinator.py +285 -0
- ksadk/studio/builder.py +320 -0
- ksadk/studio/capabilities.py +351 -0
- ksadk/studio/cloud.py +278 -0
- ksadk/studio/codex_agent_service.py +583 -0
- ksadk/studio/codex_builder.py +324 -0
- ksadk/studio/codex_manifest.py +278 -0
- ksadk/studio/codex_run.py +352 -0
- ksadk/studio/compiler.py +189 -0
- ksadk/studio/contracts.py +644 -0
- ksadk/studio/errors.py +47 -0
- ksadk/studio/evaluation.py +192 -0
- ksadk/studio/event_store.py +284 -0
- ksadk/studio/framework_run.py +114 -0
- ksadk/studio/identifiers.py +33 -0
- ksadk/studio/mcp_runtime.py +229 -0
- ksadk/studio/model_client.py +543 -0
- ksadk/studio/model_profile_service.py +214 -0
- ksadk/studio/operations.py +243 -0
- ksadk/studio/otel_trace.py +754 -0
- ksadk/studio/pagination.py +182 -0
- ksadk/studio/python_tool_inspection.py +183 -0
- ksadk/studio/repository.py +306 -0
- ksadk/studio/resource_catalog.py +1217 -0
- ksadk/studio/run_service.py +707 -0
- ksadk/studio/runtime_catalog.py +74 -0
- ksadk/studio/runtime_source.py +339 -0
- ksadk/studio/service.py +1141 -0
- ksadk/studio/shared_web.py +994 -0
- ksadk/studio/skill_discovery.py +628 -0
- ksadk/studio/static/assets/PrismRenderer-IYN-ffww.js +3 -0
- ksadk/studio/static/assets/index-CaEN0eTR.css +1 -0
- ksadk/studio/static/assets/index-DI2eY_NH.js +252 -0
- ksadk/studio/static/assets/react-vendor-BNmTiJ-I.js +9 -0
- ksadk/studio/static/assets/rolldown-runtime-hePW80VL.js +1 -0
- ksadk/studio/static/index.html +15 -0
- ksadk/studio/templates.py +630 -0
- ksadk/studio/validator.py +246 -0
- ksadk/studio/workspace.py +137 -0
- ksadk/terminal_exec_policy.py +3 -4
- ksadk/tools/gateway.py +101 -15
- ksadk/tools/result_budget.py +12 -4
- ksadk/toolsets/__init__.py +161 -37
- ksadk/toolsets/a2a.py +426 -0
- ksadk/toolsets/platform.py +21 -5
- ksadk/toolsets/sandbox.py +82 -16
- ksadk/toolsets/skills.py +200 -39
- ksadk/toolsets/web.py +123 -26
- ksadk/toolsets/workspace.py +212 -101
- ksadk/tracing/__init__.py +19 -21
- ksadk/tracing/exporters/inmemory_exporter.py +62 -51
- ksadk/tracing/setup.py +135 -506
- ksadk/tracing/span_utils.py +0 -41
- ksadk/tui/loop.py +78 -30
- ksadk/tui/stream_render.py +1 -0
- ksadk/ui_config.py +5 -3
- ksadk/version.py +1 -1
- ksadk_runtime_common/memory_backend/registry.py +56 -56
- ksadk_runtime_common/schemas/runtime_event_v1.json +95 -0
- ksadk_runtime_common/workspace_files/router.py +8 -2
- agentengine_sdk_python-0.7.0.dist-info/RECORD +0 -482
- ksadk/a2a/card_builder.py +0 -64
- ksadk/a2a/client.py +0 -309
- ksadk/runners/utils/langfuse.py +0 -230
- ksadk/server/static/assets/CodeBlock-P16VOLYi.js +0 -9
- ksadk/server/static/assets/MathMessageMarkdown-CdGiQWHR.js +0 -8
- ksadk/server/static/assets/MermaidBlock-IOcal8cm.js +0 -303
- ksadk/server/static/assets/NativeTerminalPanel-DGSDWsei.js +0 -1
- ksadk/server/static/assets/architecture-7EHR7CIX-BvUlsA6l.js +0 -1
- ksadk/server/static/assets/channel-CTuydARX.js +0 -1
- ksadk/server/static/assets/chunk-QZHKN3VN-BnCydivS.js +0 -1
- ksadk/server/static/assets/classDiagram-4FO5ZUOK-BNHg45Be.js +0 -1
- ksadk/server/static/assets/classDiagram-v2-Q7XG4LA2-BNHg45Be.js +0 -1
- ksadk/server/static/assets/eventmodeling-FCH6USID-DsAgWnlf.js +0 -1
- ksadk/server/static/assets/gitGraph-WXDBUCRP-BIao9Yjg.js +0 -1
- ksadk/server/static/assets/index-C00Lwg3L.js +0 -165
- ksadk/server/static/assets/index-DAURbCsP.css +0 -1
- ksadk/server/static/assets/info-J43DQDTF-CyipqGxU.js +0 -1
- ksadk/server/static/assets/packet-YPE3B663-CGkyRxlg.js +0 -1
- ksadk/server/static/assets/pie-LRSECV5Y-M0uWAf4n.js +0 -1
- ksadk/server/static/assets/radar-GUYGQ44K-Bdbm24-x.js +0 -1
- ksadk/server/static/assets/stateDiagram-v2-BHNVJYJU-8xBN_gLM.js +0 -1
- ksadk/server/static/assets/treeView-BLDUP644-npMo0ak1.js +0 -1
- ksadk/server/static/assets/treemap-LRROVOQU-CHdzrrdo.js +0 -1
- ksadk/server/static/assets/wardley-L42UT6IY-BEQz7wyy.js +0 -1
- ksadk/tracing/exporters/langfuse_exporter.py +0 -445
- {agentengine_sdk_python-0.7.0.dist-info → agentengine_sdk_python-0.8.1.dist-info}/entry_points.txt +0 -0
- {agentengine_sdk_python-0.7.0.dist-info → agentengine_sdk_python-0.8.1.dist-info}/licenses/LICENSE +0 -0
- {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
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
110
|
-
|
|
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(
|
|
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
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
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
|
-
|
|
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
|
|
29
|
-
from
|
|
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
|
|
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
|
-
|
|
108
|
+
service = self._service
|
|
109
|
+
if service is None:
|
|
109
110
|
self.model_post_init(None)
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
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=
|
|
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
|
|
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
|
|
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
|
|
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=
|
|
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
|
|
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.
|
|
29
|
+
"google-adk not installed, returning raw function as tool. "
|
|
30
|
+
"Install with: pip install ksadk[adk]"
|
|
30
31
|
)
|
|
31
32
|
return save_memory
|