agentengine-sdk-python 0.6.2__py3-none-any.whl → 0.6.9__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- agentengine_sdk_python-0.6.9.dist-info/METADATA +179 -0
- agentengine_sdk_python-0.6.9.dist-info/RECORD +487 -0
- {agentengine_sdk_python-0.6.2.dist-info → agentengine_sdk_python-0.6.9.dist-info}/WHEEL +1 -1
- agentengine_sdk_python-0.6.9.dist-info/entry_points.txt +3 -0
- agentengine_sdk_python-0.6.9.dist-info/licenses/LICENSE +175 -0
- agentengine_sdk_python-0.6.9.dist-info/top_level.txt +2 -0
- ksadk/__init__.py +13 -0
- ksadk/__main__.py +4 -0
- ksadk/a2a/__init__.py +15 -0
- ksadk/a2a/card_builder.py +64 -0
- ksadk/a2a/client.py +309 -0
- ksadk/a2a/executor.py +201 -0
- ksadk/a2a/server.py +79 -0
- ksadk/agents/__init__.py +20 -0
- ksadk/agents/base.py +370 -0
- ksadk/agents/context.py +38 -0
- ksadk/agents/event.py +35 -0
- ksadk/agents/loop_agent.py +71 -0
- ksadk/agents/parallel_agent.py +109 -0
- ksadk/agents/runner_adapter.py +24 -0
- ksadk/agents/sequential_agent.py +34 -0
- ksadk/api/__init__.py +3 -0
- ksadk/api/client.py +2227 -0
- ksadk/builders/__init__.py +20 -0
- ksadk/builders/base.py +66 -0
- ksadk/builders/code_builder.py +1990 -0
- ksadk/builders/container_builder.py +786 -0
- ksadk/builders/framework_requirements.py +59 -0
- ksadk/builders/ks3_uploader.py +389 -0
- ksadk/builders/mcp_builder.py +476 -0
- ksadk/builders/requirements_utils.py +75 -0
- ksadk/cli/__init__.py +531 -0
- ksadk/cli/__main__.py +4 -0
- ksadk/cli/agent_ref.py +204 -0
- ksadk/cli/cmd_a2a.py +167 -0
- ksadk/cli/cmd_agent.py +201 -0
- ksadk/cli/cmd_build.py +270 -0
- ksadk/cli/cmd_completion.py +304 -0
- ksadk/cli/cmd_config.py +758 -0
- ksadk/cli/cmd_create.py +2277 -0
- ksadk/cli/cmd_dashboard.py +900 -0
- ksadk/cli/cmd_deploy.py +704 -0
- ksadk/cli/cmd_destroy.py +345 -0
- ksadk/cli/cmd_files.py +1227 -0
- ksadk/cli/cmd_hermes.py +1259 -0
- ksadk/cli/cmd_invoke.py +1336 -0
- ksadk/cli/cmd_launch.py +564 -0
- ksadk/cli/cmd_mcp.py +1174 -0
- ksadk/cli/cmd_model.py +302 -0
- ksadk/cli/cmd_openclaw.py +3918 -0
- ksadk/cli/cmd_run.py +232 -0
- ksadk/cli/cmd_status.py +588 -0
- ksadk/cli/cmd_version.py +522 -0
- ksadk/cli/cmd_web.py +288 -0
- ksadk/cli/deploy_utils.py +87 -0
- ksadk/cli/dry_run.py +214 -0
- ksadk/cli/env_options.py +82 -0
- ksadk/cli/error_utils.py +525 -0
- ksadk/cli/global_options.py +31 -0
- ksadk/cli/local_runtime.py +97 -0
- ksadk/cli/model_catalog.py +136 -0
- ksadk/cli/network_options.py +410 -0
- ksadk/cli/resource_common.py +621 -0
- ksadk/cli/storage.py +84 -0
- ksadk/cli/ui.py +431 -0
- ksadk/cli/workflow_common.py +552 -0
- ksadk/common/__init__.py +14 -0
- ksadk/common/aicp_env.py +128 -0
- ksadk/common/auth.py +190 -0
- ksadk/common/constants.py +84 -0
- ksadk/common/llm_utils.py +61 -0
- ksadk/configs/__init__.py +61 -0
- ksadk/configs/env_registry.py +342 -0
- ksadk/configs/global_config.py +200 -0
- ksadk/configs/settings.py +706 -0
- ksadk/conversations/__init__.py +95 -0
- ksadk/conversations/attachment_storage.py +379 -0
- ksadk/conversations/attachments.py +774 -0
- ksadk/conversations/compaction_pipeline.py +387 -0
- ksadk/conversations/compaction_prompt.py +128 -0
- ksadk/conversations/context.py +303 -0
- ksadk/conversations/model_context.py +360 -0
- ksadk/conversations/model_options.py +136 -0
- ksadk/conversations/normalize.py +446 -0
- ksadk/conversations/reasoning_markup.py +91 -0
- ksadk/conversations/run_kinds.py +61 -0
- ksadk/conversations/run_status.py +53 -0
- ksadk/conversations/runtime.py +5208 -0
- ksadk/conversations/semantic_summary.py +359 -0
- ksadk/conversations/session_title.py +254 -0
- ksadk/deployment/__init__.py +83 -0
- ksadk/deployment/agent_access.py +226 -0
- ksadk/deployment/base.py +229 -0
- ksadk/deployment/manager.py +332 -0
- ksadk/deployment/providers/__init__.py +10 -0
- ksadk/deployment/providers/serverless.py +1105 -0
- ksadk/deployment/registry.py +120 -0
- ksadk/deployment/state.py +78 -0
- ksadk/deployment/ui_config.py +21 -0
- ksadk/detection/__init__.py +7 -0
- ksadk/detection/detector.py +431 -0
- ksadk/detection/mcp_detector.py +250 -0
- ksadk/hermes_terminal.py +467 -0
- ksadk/identity/__init__.py +17 -0
- ksadk/identity/resolver.py +385 -0
- ksadk/knowledge_base/__init__.py +62 -0
- ksadk/knowledge_base/adk_tool.py +47 -0
- ksadk/knowledge_base/client.py +297 -0
- ksadk/knowledge_base/langchain_tool.py +55 -0
- ksadk/knowledge_base/service.py +66 -0
- ksadk/knowledge_base/tool.py +50 -0
- ksadk/markdown.py +169 -0
- ksadk/mcp_runtime/__init__.py +231 -0
- ksadk/memory/__init__.py +57 -0
- ksadk/memory/adk/__init__.py +51 -0
- ksadk/memory/adk/backends/__init__.py +5 -0
- ksadk/memory/adk/backends/base_ltm_backend.py +52 -0
- ksadk/memory/adk/backends/http_ltm_backend.py +183 -0
- ksadk/memory/adk/backends/inmemory_ltm_backend.py +96 -0
- ksadk/memory/adk/backends/sdk_ltm_backend.py +456 -0
- ksadk/memory/adk/long_term_memory.py +273 -0
- ksadk/memory/adk/short_term_memory.py +289 -0
- ksadk/memory/adk_tool.py +31 -0
- ksadk/memory/backends/__init__.py +6 -0
- ksadk/memory/backends/base.py +103 -0
- ksadk/memory/backends/memory.py +112 -0
- ksadk/memory/backends/redis.py +146 -0
- ksadk/memory/langchain_tool.py +39 -0
- ksadk/memory/ltm_backend_factory.py +24 -0
- ksadk/memory/manager.py +215 -0
- ksadk/memory/service.py +172 -0
- ksadk/memory/tool.py +96 -0
- ksadk/model_policy.py +223 -0
- ksadk/openclaw_gateway.py +378 -0
- ksadk/runners/__init__.py +8 -0
- ksadk/runners/adk_runner.py +1135 -0
- ksadk/runners/base_runner.py +305 -0
- ksadk/runners/deepagents_runner.py +13 -0
- ksadk/runners/factory.py +73 -0
- ksadk/runners/langchain_runner.py +539 -0
- ksadk/runners/langgraph_runner.py +852 -0
- ksadk/runners/patch_langchain.py +187 -0
- ksadk/runners/remote_runner.py +667 -0
- ksadk/runners/usage_accumulator.py +38 -0
- ksadk/runners/utils/__init__.py +19 -0
- ksadk/runners/utils/langfuse.py +230 -0
- ksadk/runners/utils/loader.py +62 -0
- ksadk/runtime_context.py +166 -0
- ksadk/runtime_state.py +25 -0
- ksadk/sandbox/__init__.py +28 -0
- ksadk/sandbox/backends/__init__.py +9 -0
- ksadk/sandbox/backends/e2b.py +154 -0
- ksadk/sandbox/backends/local_process.py +131 -0
- ksadk/sandbox/base.py +101 -0
- ksadk/sandbox/factory.py +53 -0
- ksadk/sandbox/registry.py +187 -0
- ksadk/server/__init__.py +7 -0
- ksadk/server/api_models.py +73 -0
- ksadk/server/app.py +3789 -0
- ksadk/server/static/assets/ArtifactsPanel-C0meuOdi.js +1 -0
- ksadk/server/static/assets/CodeBlock-BbI4HPtJ.js +9 -0
- ksadk/server/static/assets/KaTeX_AMS-Regular-BQhdFMY1.woff2 +0 -0
- ksadk/server/static/assets/KaTeX_AMS-Regular-DMm9YOAa.woff +0 -0
- ksadk/server/static/assets/KaTeX_AMS-Regular-DRggAlZN.ttf +0 -0
- ksadk/server/static/assets/KaTeX_Caligraphic-Bold-ATXxdsX0.ttf +0 -0
- ksadk/server/static/assets/KaTeX_Caligraphic-Bold-BEiXGLvX.woff +0 -0
- ksadk/server/static/assets/KaTeX_Caligraphic-Bold-Dq_IR9rO.woff2 +0 -0
- ksadk/server/static/assets/KaTeX_Caligraphic-Regular-CTRA-rTL.woff +0 -0
- ksadk/server/static/assets/KaTeX_Caligraphic-Regular-Di6jR-x-.woff2 +0 -0
- ksadk/server/static/assets/KaTeX_Caligraphic-Regular-wX97UBjC.ttf +0 -0
- ksadk/server/static/assets/KaTeX_Fraktur-Bold-BdnERNNW.ttf +0 -0
- ksadk/server/static/assets/KaTeX_Fraktur-Bold-BsDP51OF.woff +0 -0
- ksadk/server/static/assets/KaTeX_Fraktur-Bold-CL6g_b3V.woff2 +0 -0
- ksadk/server/static/assets/KaTeX_Fraktur-Regular-CB_wures.ttf +0 -0
- ksadk/server/static/assets/KaTeX_Fraktur-Regular-CTYiF6lA.woff2 +0 -0
- ksadk/server/static/assets/KaTeX_Fraktur-Regular-Dxdc4cR9.woff +0 -0
- ksadk/server/static/assets/KaTeX_Main-Bold-Cx986IdX.woff2 +0 -0
- ksadk/server/static/assets/KaTeX_Main-Bold-Jm3AIy58.woff +0 -0
- ksadk/server/static/assets/KaTeX_Main-Bold-waoOVXN0.ttf +0 -0
- ksadk/server/static/assets/KaTeX_Main-BoldItalic-DxDJ3AOS.woff2 +0 -0
- ksadk/server/static/assets/KaTeX_Main-BoldItalic-DzxPMmG6.ttf +0 -0
- ksadk/server/static/assets/KaTeX_Main-BoldItalic-SpSLRI95.woff +0 -0
- ksadk/server/static/assets/KaTeX_Main-Italic-3WenGoN9.ttf +0 -0
- ksadk/server/static/assets/KaTeX_Main-Italic-BMLOBm91.woff +0 -0
- ksadk/server/static/assets/KaTeX_Main-Italic-NWA7e6Wa.woff2 +0 -0
- ksadk/server/static/assets/KaTeX_Main-Regular-B22Nviop.woff2 +0 -0
- ksadk/server/static/assets/KaTeX_Main-Regular-Dr94JaBh.woff +0 -0
- ksadk/server/static/assets/KaTeX_Main-Regular-ypZvNtVU.ttf +0 -0
- ksadk/server/static/assets/KaTeX_Math-BoldItalic-B3XSjfu4.ttf +0 -0
- ksadk/server/static/assets/KaTeX_Math-BoldItalic-CZnvNsCZ.woff2 +0 -0
- ksadk/server/static/assets/KaTeX_Math-BoldItalic-iY-2wyZ7.woff +0 -0
- ksadk/server/static/assets/KaTeX_Math-Italic-DA0__PXp.woff +0 -0
- ksadk/server/static/assets/KaTeX_Math-Italic-flOr_0UB.ttf +0 -0
- ksadk/server/static/assets/KaTeX_Math-Italic-t53AETM-.woff2 +0 -0
- ksadk/server/static/assets/KaTeX_SansSerif-Bold-CFMepnvq.ttf +0 -0
- ksadk/server/static/assets/KaTeX_SansSerif-Bold-D1sUS0GD.woff2 +0 -0
- ksadk/server/static/assets/KaTeX_SansSerif-Bold-DbIhKOiC.woff +0 -0
- ksadk/server/static/assets/KaTeX_SansSerif-Italic-C3H0VqGB.woff2 +0 -0
- ksadk/server/static/assets/KaTeX_SansSerif-Italic-DN2j7dab.woff +0 -0
- ksadk/server/static/assets/KaTeX_SansSerif-Italic-YYjJ1zSn.ttf +0 -0
- ksadk/server/static/assets/KaTeX_SansSerif-Regular-BNo7hRIc.ttf +0 -0
- ksadk/server/static/assets/KaTeX_SansSerif-Regular-CS6fqUqJ.woff +0 -0
- ksadk/server/static/assets/KaTeX_SansSerif-Regular-DDBCnlJ7.woff2 +0 -0
- ksadk/server/static/assets/KaTeX_Script-Regular-C5JkGWo-.ttf +0 -0
- ksadk/server/static/assets/KaTeX_Script-Regular-D3wIWfF6.woff2 +0 -0
- ksadk/server/static/assets/KaTeX_Script-Regular-D5yQViql.woff +0 -0
- ksadk/server/static/assets/KaTeX_Size1-Regular-C195tn64.woff +0 -0
- ksadk/server/static/assets/KaTeX_Size1-Regular-Dbsnue_I.ttf +0 -0
- ksadk/server/static/assets/KaTeX_Size1-Regular-mCD8mA8B.woff2 +0 -0
- ksadk/server/static/assets/KaTeX_Size2-Regular-B7gKUWhC.ttf +0 -0
- ksadk/server/static/assets/KaTeX_Size2-Regular-Dy4dx90m.woff2 +0 -0
- ksadk/server/static/assets/KaTeX_Size2-Regular-oD1tc_U0.woff +0 -0
- ksadk/server/static/assets/KaTeX_Size3-Regular-CTq5MqoE.woff +0 -0
- ksadk/server/static/assets/KaTeX_Size3-Regular-DgpXs0kz.ttf +0 -0
- ksadk/server/static/assets/KaTeX_Size4-Regular-BF-4gkZK.woff +0 -0
- ksadk/server/static/assets/KaTeX_Size4-Regular-DWFBv043.ttf +0 -0
- ksadk/server/static/assets/KaTeX_Size4-Regular-Dl5lxZxV.woff2 +0 -0
- ksadk/server/static/assets/KaTeX_Typewriter-Regular-C0xS9mPB.woff +0 -0
- ksadk/server/static/assets/KaTeX_Typewriter-Regular-CO6r4hn1.woff2 +0 -0
- ksadk/server/static/assets/KaTeX_Typewriter-Regular-D3Ib7_Hf.ttf +0 -0
- ksadk/server/static/assets/MathMessageMarkdown-DMLQYoLp.js +8 -0
- ksadk/server/static/assets/MathMessageMarkdown-DeYh8QPr.css +1 -0
- ksadk/server/static/assets/MermaidBlock-DCR8WZ17.js +303 -0
- ksadk/server/static/assets/NativeTerminalPanel-CHOd7Rch.css +1 -0
- ksadk/server/static/assets/NativeTerminalPanel-CKUvWhUz.js +1 -0
- ksadk/server/static/assets/addon-fit-DthTIhi3.js +1 -0
- ksadk/server/static/assets/apl-CnwPGSsG.js +1 -0
- ksadk/server/static/assets/arc-bj2rZnP5.js +1 -0
- ksadk/server/static/assets/architecture-7EHR7CIX-Cr6Xz1_c.js +1 -0
- ksadk/server/static/assets/architectureDiagram-3BPJPVTR-2u1ltDIj.js +36 -0
- ksadk/server/static/assets/asciiarmor-qTkVPQu6.js +1 -0
- ksadk/server/static/assets/asn1-Dr8qZg38.js +1 -0
- ksadk/server/static/assets/asterisk-Bja0s6e1.js +1 -0
- ksadk/server/static/assets/blockDiagram-GPEHLZMM-D6fvdK20.js +132 -0
- ksadk/server/static/assets/brainfuck-D5EjA2JK.js +1 -0
- ksadk/server/static/assets/c4Diagram-AAUBKEIU-BK82L5n5.js +10 -0
- ksadk/server/static/assets/channel-BSSOwFIb.js +1 -0
- ksadk/server/static/assets/chunk-2J33WTMH-DLVdkeyQ.js +1 -0
- ksadk/server/static/assets/chunk-4BX2VUAB-BbwsYcbW.js +1 -0
- ksadk/server/static/assets/chunk-55IACEB6-DOairxzw.js +1 -0
- ksadk/server/static/assets/chunk-727SXJPM-hCO487gs.js +206 -0
- ksadk/server/static/assets/chunk-AQP2D5EJ-XU8vDOuG.js +231 -0
- ksadk/server/static/assets/chunk-FMBD7UC4-PrapyfMu.js +15 -0
- ksadk/server/static/assets/chunk-ND2GUHAM-CboKhTZ3.js +1 -0
- ksadk/server/static/assets/chunk-QZHKN3VN-XXpdiwUL.js +1 -0
- ksadk/server/static/assets/classDiagram-4FO5ZUOK-C5HvGiyK.js +1 -0
- ksadk/server/static/assets/classDiagram-v2-Q7XG4LA2-C5HvGiyK.js +1 -0
- ksadk/server/static/assets/clike-DHH8Ad3s.js +1 -0
- ksadk/server/static/assets/clojure-BflJGmDX.js +1 -0
- ksadk/server/static/assets/cmake-CyVbuzPu.js +1 -0
- ksadk/server/static/assets/cobol-B_OZ4V-R.js +1 -0
- ksadk/server/static/assets/coffeescript-B2pKbFk8.js +1 -0
- ksadk/server/static/assets/commonlisp-CcllspGY.js +1 -0
- ksadk/server/static/assets/cose-bilkent-S5V4N54A-_N8bJ-EU.js +1 -0
- ksadk/server/static/assets/crystal-M5-qzICs.js +1 -0
- ksadk/server/static/assets/css-CYpP4FRV.js +1 -0
- ksadk/server/static/assets/cypher-p9eYesGn.js +1 -0
- ksadk/server/static/assets/cytoscape.esm-DelgaX4f.js +321 -0
- ksadk/server/static/assets/d-BhMjBjQP.js +1 -0
- ksadk/server/static/assets/dagre-BM42HDAG-FoDlo5J2.js +4 -0
- ksadk/server/static/assets/dagre-Bx709z4p.js +1 -0
- ksadk/server/static/assets/defaultLocale-C8Fc0cco.js +1 -0
- ksadk/server/static/assets/diagram-2AECGRRQ-BBp6ebBw.js +43 -0
- ksadk/server/static/assets/diagram-5GNKFQAL-CqOvG1PR.js +10 -0
- ksadk/server/static/assets/diagram-KO2AKTUF-O9T3t6ba.js +3 -0
- ksadk/server/static/assets/diagram-LMA3HP47-CGG8ekBO.js +24 -0
- ksadk/server/static/assets/diagram-OG6HWLK6-4BmH1EEg.js +24 -0
- ksadk/server/static/assets/diff-ChtP43wD.js +1 -0
- ksadk/server/static/assets/dist-6kSZvCZh.js +1 -0
- ksadk/server/static/assets/dist-B67uF2uK.js +1 -0
- ksadk/server/static/assets/dist-BMKM66B4.js +1 -0
- ksadk/server/static/assets/dist-BVzcWa6D.js +1 -0
- ksadk/server/static/assets/dist-Bk1l05Ni.js +1 -0
- ksadk/server/static/assets/dist-BkJjNih3.js +1 -0
- ksadk/server/static/assets/dist-BmuTWcm7.js +9 -0
- ksadk/server/static/assets/dist-C2DKRFVK.js +1 -0
- ksadk/server/static/assets/dist-CWiTDN_V.js +6 -0
- ksadk/server/static/assets/dist-CZ6C3x8B.js +23 -0
- ksadk/server/static/assets/dist-CiZHB6ZW.js +1 -0
- ksadk/server/static/assets/dist-Cp1_jKwf.js +1 -0
- ksadk/server/static/assets/dist-Cwhk4lwI.js +2 -0
- ksadk/server/static/assets/dist-D5JGcxBx.js +11 -0
- ksadk/server/static/assets/dist-D99wf6_X.js +1 -0
- ksadk/server/static/assets/dist-DCpZrjaK.js +1 -0
- ksadk/server/static/assets/dist-DI-oVAXw.js +1 -0
- ksadk/server/static/assets/dist-DLMjL01k.js +1 -0
- ksadk/server/static/assets/dist-DLeM1OCK.js +1 -0
- ksadk/server/static/assets/dist-DM0rEQPk.js +1 -0
- ksadk/server/static/assets/dist-DbaH3p5h.js +1 -0
- ksadk/server/static/assets/dist-S4klkK5W.js +1 -0
- ksadk/server/static/assets/dockerfile-BLkNEvjs.js +1 -0
- ksadk/server/static/assets/dtd-DTF72YNO.js +1 -0
- ksadk/server/static/assets/dylan-C6jEEEk-.js +1 -0
- ksadk/server/static/assets/ebnf-D4c0_ac3.js +1 -0
- ksadk/server/static/assets/ecl-BSZaIHnp.js +1 -0
- ksadk/server/static/assets/eiffel-BEjRio4Q.js +1 -0
- ksadk/server/static/assets/elm-Cshzl8qu.js +1 -0
- ksadk/server/static/assets/erDiagram-TEJ5UH35-oJhaci7S.js +85 -0
- ksadk/server/static/assets/erlang-DaB2Rkuy.js +1 -0
- ksadk/server/static/assets/eventmodeling-FCH6USID-CIgwHJLL.js +1 -0
- ksadk/server/static/assets/factor-D7LVTn2l.js +1 -0
- ksadk/server/static/assets/fcl-ClOhbFR7.js +1 -0
- ksadk/server/static/assets/flowDiagram-I6XJVG4X-DtTmUan-.js +162 -0
- ksadk/server/static/assets/forth-Cezjo90N.js +1 -0
- ksadk/server/static/assets/fortran-Bt6PBEDR.js +1 -0
- ksadk/server/static/assets/ganttDiagram-6RSMTGT7-BSsb_eij.js +292 -0
- ksadk/server/static/assets/gas-BHEdbvp9.js +1 -0
- ksadk/server/static/assets/gherkin-oBAE_ms0.js +1 -0
- ksadk/server/static/assets/gitGraph-WXDBUCRP-BVAJ7uo0.js +1 -0
- ksadk/server/static/assets/gitGraphDiagram-PVQCEYII-BR5s6Pws.js +106 -0
- ksadk/server/static/assets/graphlib-B8gBHxth.js +1 -0
- ksadk/server/static/assets/groovy-BC3IOsC8.js +1 -0
- ksadk/server/static/assets/haskell-BRsoo5mP.js +1 -0
- ksadk/server/static/assets/haxe-DIz0ZZqd.js +1 -0
- ksadk/server/static/assets/http-CLVgA2GD.js +1 -0
- ksadk/server/static/assets/idl-BUZw3wgd.js +1 -0
- ksadk/server/static/assets/index-BH7-pC0B.js +165 -0
- ksadk/server/static/assets/index-DAURbCsP.css +1 -0
- ksadk/server/static/assets/info-J43DQDTF-MT80V4ge.js +1 -0
- ksadk/server/static/assets/infoDiagram-5YYISTIA-DYPc5cvh.js +2 -0
- ksadk/server/static/assets/init-D6jRqBbL.js +1 -0
- ksadk/server/static/assets/ishikawaDiagram-YF4QCWOH-MoBdALDg.js +70 -0
- ksadk/server/static/assets/javascript-9Tg8ixDm.js +1 -0
- ksadk/server/static/assets/journeyDiagram-JHISSGLW-DgLiQT8l.js +139 -0
- ksadk/server/static/assets/julia-CQfgDRfP.js +1 -0
- ksadk/server/static/assets/kanban-definition-UN3LZRKU-CsFx112F.js +89 -0
- ksadk/server/static/assets/katex-DRsiwpM2.js +265 -0
- ksadk/server/static/assets/linear-TNRQ5Orv.js +1 -0
- ksadk/server/static/assets/livescript-BXxG0Yva.js +1 -0
- ksadk/server/static/assets/lua-CiA1ziua.js +1 -0
- ksadk/server/static/assets/mathematica-u8YMmbU0.js +1 -0
- ksadk/server/static/assets/mbox-BEMVcqjs.js +1 -0
- ksadk/server/static/assets/mermaid-parser.core-D2eMVOgo.js +161 -0
- ksadk/server/static/assets/mindmap-definition-RKZ34NQL-BtByYFhL.js +96 -0
- ksadk/server/static/assets/mirc-C9zpzAZU.js +1 -0
- ksadk/server/static/assets/mllike-B45xgp2S.js +1 -0
- ksadk/server/static/assets/modelica-CqHI_q-D.js +1 -0
- ksadk/server/static/assets/mscgen-qgSLujhx.js +1 -0
- ksadk/server/static/assets/mumps-CW_TBmxz.js +1 -0
- ksadk/server/static/assets/nginx-BMaDbqW3.js +1 -0
- ksadk/server/static/assets/nsis-AQ_alPln.js +1 -0
- ksadk/server/static/assets/ntriples-d28e9m0E.js +1 -0
- ksadk/server/static/assets/octave-D2Q8cUp1.js +1 -0
- ksadk/server/static/assets/ordinal-hYBb2elL.js +1 -0
- ksadk/server/static/assets/oz-BwTct_5T.js +1 -0
- ksadk/server/static/assets/packet-YPE3B663-BLKhbXZB.js +1 -0
- ksadk/server/static/assets/pascal-Dp_KdFgX.js +1 -0
- ksadk/server/static/assets/perl-CdEHsPfU.js +1 -0
- ksadk/server/static/assets/pie-LRSECV5Y-DFOikjSY.js +1 -0
- ksadk/server/static/assets/pieDiagram-4H26LBE5-DPnuCB8c.js +30 -0
- ksadk/server/static/assets/pig-AF4Hwhju.js +1 -0
- ksadk/server/static/assets/powershell-CzG71I4L.js +1 -0
- ksadk/server/static/assets/properties-C357ku5U.js +1 -0
- ksadk/server/static/assets/protobuf-D1ij_kNL.js +1 -0
- ksadk/server/static/assets/pug-Bugr-47h.js +1 -0
- ksadk/server/static/assets/puppet-B4hC2X4m.js +1 -0
- ksadk/server/static/assets/python-BqYw9LYJ.js +1 -0
- ksadk/server/static/assets/q-B9NhS7L_.js +1 -0
- ksadk/server/static/assets/quadrantDiagram-W4KKPZXB-miFpCPv4.js +7 -0
- ksadk/server/static/assets/r-DADKenSm.js +1 -0
- ksadk/server/static/assets/radar-GUYGQ44K-095b1Ikw.js +1 -0
- ksadk/server/static/assets/requirementDiagram-4Y6WPE33-mjB_yYkW.js +84 -0
- ksadk/server/static/assets/rpm-gpDK5sbt.js +1 -0
- ksadk/server/static/assets/ruby-DsYpTuWg.js +1 -0
- ksadk/server/static/assets/sankeyDiagram-5OEKKPKP-D7hSlZZZ.js +40 -0
- ksadk/server/static/assets/sas-C2OyD2Y6.js +1 -0
- ksadk/server/static/assets/scheme-CyDdOh7e.js +1 -0
- ksadk/server/static/assets/sequenceDiagram-3UESZ5HK-D9Cx6hC3.js +162 -0
- ksadk/server/static/assets/shell-Du5Qg9im.js +1 -0
- ksadk/server/static/assets/sieve-BAxa3IjF.js +1 -0
- ksadk/server/static/assets/simple-mode-DRpGK0lJ.js +1 -0
- ksadk/server/static/assets/smalltalk-BLp5-jwC.js +1 -0
- ksadk/server/static/assets/solr-BBopId9w.js +1 -0
- ksadk/server/static/assets/sparql-Dz-mlCAC.js +1 -0
- ksadk/server/static/assets/spreadsheet-CTIncYxj.js +1 -0
- ksadk/server/static/assets/sql-DcCJ9jop.js +1 -0
- ksadk/server/static/assets/stateDiagram-AJRCARHV-D_zrg47o.js +1 -0
- ksadk/server/static/assets/stateDiagram-v2-BHNVJYJU-J9kCb0nC.js +1 -0
- ksadk/server/static/assets/stex-sDrdk2BW.js +1 -0
- ksadk/server/static/assets/stylus-DLLZ8dgm.js +1 -0
- ksadk/server/static/assets/swift-DKB6_1j6.js +1 -0
- ksadk/server/static/assets/tcl-BGfruO1u.js +1 -0
- ksadk/server/static/assets/textile-DWBqthVk.js +1 -0
- ksadk/server/static/assets/tiddlywiki-VlUiK86J.js +1 -0
- ksadk/server/static/assets/tiki-CxVlf5KZ.js +1 -0
- ksadk/server/static/assets/timeline-definition-PNZ67QCA-CwSec0Wa.js +120 -0
- ksadk/server/static/assets/toml-LvoKBwCs.js +1 -0
- ksadk/server/static/assets/treeView-BLDUP644-yinfJEY6.js +1 -0
- ksadk/server/static/assets/treemap-LRROVOQU-DosUqN1Q.js +1 -0
- ksadk/server/static/assets/troff-C2dAgh7P.js +1 -0
- ksadk/server/static/assets/ttcn-BePYh-hG.js +1 -0
- ksadk/server/static/assets/ttcn-cfg-CY0aot7Q.js +1 -0
- ksadk/server/static/assets/turtle-BDLWE2cD.js +1 -0
- ksadk/server/static/assets/vb-BthdM_4N.js +1 -0
- ksadk/server/static/assets/vbscript-D9f6rSsU.js +1 -0
- ksadk/server/static/assets/velocity-CqftRsjg.js +1 -0
- ksadk/server/static/assets/vennDiagram-CIIHVFJN-agCVobiF.js +34 -0
- ksadk/server/static/assets/verilog-D-x6ne0Z.js +1 -0
- ksadk/server/static/assets/vhdl-CMrOq2q1.js +1 -0
- ksadk/server/static/assets/wardley-L42UT6IY-Bvp7-5uH.js +1 -0
- ksadk/server/static/assets/wardleyDiagram-YWT4CUSO-TmrlhWNt.js +78 -0
- ksadk/server/static/assets/webidl-D5jiJvOU.js +1 -0
- ksadk/server/static/assets/xquery-fj_R-kMw.js +1 -0
- ksadk/server/static/assets/xterm-DooSxjI5.js +36 -0
- ksadk/server/static/assets/xychartDiagram-2RQKCTM6-DV71V-ah.js +7 -0
- ksadk/server/static/assets/yacas-CXXgtw0p.js +1 -0
- ksadk/server/static/assets/z80-CL1naaMV.js +1 -0
- ksadk/server/static/favicon.svg +1 -0
- ksadk/server/static/icons.svg +24 -0
- ksadk/server/static/index.html +14 -0
- ksadk/server/terminal_sessions.py +551 -0
- ksadk/sessions/__init__.py +283 -0
- ksadk/sessions/base.py +354 -0
- ksadk/sessions/continuity.py +313 -0
- ksadk/sessions/errors.py +7 -0
- ksadk/sessions/in_memory.py +273 -0
- ksadk/sessions/local_service.py +949 -0
- ksadk/sessions/postgres_service.py +838 -0
- ksadk/sessions/sqlite_service.py +13 -0
- ksadk/skills/__init__.py +9 -0
- ksadk/skills/loader.py +46 -0
- ksadk/skills/models.py +120 -0
- ksadk/skills/package_store.py +104 -0
- ksadk/skills/runtime/__init__.py +17 -0
- ksadk/skills/runtime/agent.py +183 -0
- ksadk/skills/runtime/artifacts.py +39 -0
- ksadk/skills/runtime/backends/__init__.py +1 -0
- ksadk/skills/runtime/backends/disabled.py +8 -0
- ksadk/skills/runtime/backends/e2b.py +168 -0
- ksadk/skills/runtime/backends/local.py +95 -0
- ksadk/skills/runtime/base.py +103 -0
- ksadk/skills/runtime/executor.py +219 -0
- ksadk/skills/runtime/factory.py +37 -0
- ksadk/skills/runtime/loader.py +131 -0
- ksadk/skills/runtime/registry.py +150 -0
- ksadk/skills/runtime/request.py +67 -0
- ksadk/skills/service_client.py +239 -0
- ksadk/skills/service_env.py +58 -0
- ksadk/skills/tool_defs.py +221 -0
- ksadk/terminal_client.py +69 -0
- ksadk/terminal_exec_policy.py +229 -0
- ksadk/tools/__init__.py +17 -0
- ksadk/tools/gateway.py +230 -0
- ksadk/tools/result_budget.py +154 -0
- ksadk/toolsets/__init__.py +852 -0
- ksadk/toolsets/_langchain.py +11 -0
- ksadk/toolsets/platform.py +93 -0
- ksadk/toolsets/sandbox.py +310 -0
- ksadk/toolsets/skills.py +217 -0
- ksadk/toolsets/web.py +266 -0
- ksadk/toolsets/workspace.py +878 -0
- ksadk/toolsets/workspace_state.py +44 -0
- ksadk/tracing/__init__.py +37 -0
- ksadk/tracing/exporters/__init__.py +1 -0
- ksadk/tracing/exporters/inmemory_exporter.py +116 -0
- ksadk/tracing/exporters/langfuse_exporter.py +445 -0
- ksadk/tracing/setup.py +829 -0
- ksadk/tracing/span_utils.py +114 -0
- ksadk/tui/__init__.py +12 -0
- ksadk/tui/app.py +400 -0
- ksadk/tui/clipboard.py +100 -0
- ksadk/tui/widgets/__init__.py +22 -0
- ksadk/tui/widgets/assistant.py +89 -0
- ksadk/tui/widgets/base.py +54 -0
- ksadk/tui/widgets/chat_input.py +246 -0
- ksadk/tui/widgets/history.py +156 -0
- ksadk/tui/widgets/system.py +87 -0
- ksadk/tui/widgets/thinking.py +110 -0
- ksadk/tui/widgets/tool_call.py +161 -0
- ksadk/tui/widgets/user.py +37 -0
- ksadk/ui_config.py +168 -0
- ksadk/version.py +4 -0
- ksadk_runtime_common/__init__.py +20 -0
- ksadk_runtime_common/memory_backend/__init__.py +29 -0
- ksadk_runtime_common/memory_backend/manifest.py +79 -0
- ksadk_runtime_common/memory_backend/providers/__init__.py +6 -0
- ksadk_runtime_common/memory_backend/providers/lancedb.py +151 -0
- ksadk_runtime_common/memory_backend/providers/mem0.py +74 -0
- ksadk_runtime_common/memory_backend/registry.py +56 -0
- ksadk_runtime_common/memory_backend/render.py +71 -0
- ksadk_runtime_common/schemas/memory_backend_manifest.schema.json +148 -0
- ksadk_runtime_common/workspace_files/__init__.py +29 -0
- ksadk_runtime_common/workspace_files/bootstrap.py +56 -0
- ksadk_runtime_common/workspace_files/constants.py +9 -0
- ksadk_runtime_common/workspace_files/path_utils.py +71 -0
- ksadk_runtime_common/workspace_files/preview.py +96 -0
- ksadk_runtime_common/workspace_files/router.py +254 -0
- agentengine_sdk_python-0.6.2.dist-info/METADATA +0 -46
- agentengine_sdk_python-0.6.2.dist-info/RECORD +0 -4
- agentengine_sdk_python-0.6.2.dist-info/top_level.txt +0 -1
|
@@ -0,0 +1,231 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
import json
|
|
4
|
+
import os
|
|
5
|
+
import inspect
|
|
6
|
+
from dataclasses import dataclass
|
|
7
|
+
from typing import Any, Sequence
|
|
8
|
+
from urllib.parse import urlparse
|
|
9
|
+
|
|
10
|
+
import httpx
|
|
11
|
+
from google.adk.tools.mcp_tool.mcp_session_manager import (
|
|
12
|
+
CheckableMcpHttpClientFactory,
|
|
13
|
+
StreamableHTTPConnectionParams,
|
|
14
|
+
)
|
|
15
|
+
from google.adk.tools.mcp_tool.mcp_toolset import McpToolset
|
|
16
|
+
|
|
17
|
+
MCP_TOOLSET_KEY_ATTR = "_ksadk_mcp_toolset_key"
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
@dataclass(frozen=True)
|
|
21
|
+
class MCPServerConfig:
|
|
22
|
+
name: str
|
|
23
|
+
url: str
|
|
24
|
+
api_key: str | None = None
|
|
25
|
+
tool_filter: tuple[str, ...] = ()
|
|
26
|
+
tool_name_prefix: str | None = None
|
|
27
|
+
|
|
28
|
+
@property
|
|
29
|
+
def dedupe_key(self) -> str:
|
|
30
|
+
return f"{self.url}|{self.tool_name_prefix or ''}"
|
|
31
|
+
|
|
32
|
+
@property
|
|
33
|
+
def headers(self) -> dict[str, str] | None:
|
|
34
|
+
if not self.api_key:
|
|
35
|
+
return None
|
|
36
|
+
return {"Authorization": f"Bearer {self.api_key}"}
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
def mcp_tools_enabled() -> bool:
|
|
40
|
+
value = os.environ.get("KSADK_ENABLE_MCP_TOOLS", "1").strip().lower()
|
|
41
|
+
return value not in {"0", "false", "no", "off"}
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
def load_mcp_server_configs(raw_value: str | None = None) -> list[MCPServerConfig]:
|
|
45
|
+
raw = raw_value if raw_value is not None else os.environ.get("KSADK_MCP_SERVERS", "")
|
|
46
|
+
raw = raw.strip()
|
|
47
|
+
if not raw:
|
|
48
|
+
return []
|
|
49
|
+
|
|
50
|
+
try:
|
|
51
|
+
payload = json.loads(raw)
|
|
52
|
+
except json.JSONDecodeError as exc:
|
|
53
|
+
raise ValueError("KSADK_MCP_SERVERS must be a valid JSON array") from exc
|
|
54
|
+
|
|
55
|
+
if not isinstance(payload, list):
|
|
56
|
+
raise ValueError("KSADK_MCP_SERVERS must be a JSON array")
|
|
57
|
+
|
|
58
|
+
return [_parse_server_config(item, index) for index, item in enumerate(payload)]
|
|
59
|
+
|
|
60
|
+
|
|
61
|
+
def build_connection_params(
|
|
62
|
+
config: MCPServerConfig,
|
|
63
|
+
*,
|
|
64
|
+
httpx_client_factory: CheckableMcpHttpClientFactory | None = None,
|
|
65
|
+
) -> StreamableHTTPConnectionParams:
|
|
66
|
+
kwargs: dict[str, Any] = {"url": config.url, "headers": config.headers}
|
|
67
|
+
kwargs["httpx_client_factory"] = httpx_client_factory or _default_httpx_client_factory(config.url)
|
|
68
|
+
return StreamableHTTPConnectionParams(**kwargs)
|
|
69
|
+
|
|
70
|
+
|
|
71
|
+
def build_mcp_toolset(
|
|
72
|
+
config: MCPServerConfig,
|
|
73
|
+
*,
|
|
74
|
+
httpx_client_factory: CheckableMcpHttpClientFactory | None = None,
|
|
75
|
+
) -> McpToolset:
|
|
76
|
+
toolset = McpToolset(
|
|
77
|
+
connection_params=build_connection_params(
|
|
78
|
+
config,
|
|
79
|
+
httpx_client_factory=httpx_client_factory,
|
|
80
|
+
),
|
|
81
|
+
tool_filter=list(config.tool_filter) or None,
|
|
82
|
+
tool_name_prefix=config.tool_name_prefix,
|
|
83
|
+
)
|
|
84
|
+
setattr(toolset, MCP_TOOLSET_KEY_ATTR, config.dedupe_key)
|
|
85
|
+
setattr(toolset, "_ksadk_mcp_server_name", config.name)
|
|
86
|
+
return toolset
|
|
87
|
+
|
|
88
|
+
|
|
89
|
+
def load_mcp_toolsets_from_env() -> list[McpToolset]:
|
|
90
|
+
return [build_mcp_toolset(config) for config in load_mcp_server_configs()]
|
|
91
|
+
|
|
92
|
+
|
|
93
|
+
def register_mcp_toolset_descriptors(toolset: Any) -> list[str]:
|
|
94
|
+
"""Best-effort registration of MCP tool descriptors for ksadk tool_search.
|
|
95
|
+
|
|
96
|
+
Execution stays with the MCP runtime/toolset. This only makes the tools
|
|
97
|
+
discoverable in ksadk's unified tool catalog.
|
|
98
|
+
"""
|
|
99
|
+
|
|
100
|
+
try:
|
|
101
|
+
from ksadk.toolsets import register_external_tools
|
|
102
|
+
except Exception:
|
|
103
|
+
return []
|
|
104
|
+
|
|
105
|
+
tools = _mcp_toolset_tools_sync(toolset)
|
|
106
|
+
if not tools:
|
|
107
|
+
return []
|
|
108
|
+
server_name = str(getattr(toolset, "_ksadk_mcp_server_name", "") or "mcp").strip() or "mcp"
|
|
109
|
+
return register_external_tools(
|
|
110
|
+
tools,
|
|
111
|
+
group=f"mcp:{server_name}",
|
|
112
|
+
boundary="ksadk_managed_mcp_tool",
|
|
113
|
+
risk_level="medium",
|
|
114
|
+
enabled=True,
|
|
115
|
+
)
|
|
116
|
+
|
|
117
|
+
|
|
118
|
+
def _default_httpx_client_factory(url: str) -> CheckableMcpHttpClientFactory:
|
|
119
|
+
hostname = (urlparse(url).hostname or "").lower()
|
|
120
|
+
trust_env = hostname not in {"localhost", "127.0.0.1", "::1"}
|
|
121
|
+
|
|
122
|
+
def _factory(headers=None, timeout=None, auth=None):
|
|
123
|
+
return httpx.AsyncClient(
|
|
124
|
+
headers=headers,
|
|
125
|
+
timeout=timeout,
|
|
126
|
+
auth=auth,
|
|
127
|
+
follow_redirects=True,
|
|
128
|
+
trust_env=trust_env,
|
|
129
|
+
)
|
|
130
|
+
|
|
131
|
+
return _factory
|
|
132
|
+
|
|
133
|
+
|
|
134
|
+
def _mcp_toolset_tools_sync(toolset: Any) -> list[Any]:
|
|
135
|
+
get_tools = getattr(toolset, "get_tools_with_prefix", None)
|
|
136
|
+
if not callable(get_tools):
|
|
137
|
+
return []
|
|
138
|
+
try:
|
|
139
|
+
result = get_tools()
|
|
140
|
+
except Exception:
|
|
141
|
+
return []
|
|
142
|
+
if inspect.isawaitable(result):
|
|
143
|
+
try:
|
|
144
|
+
import asyncio
|
|
145
|
+
|
|
146
|
+
try:
|
|
147
|
+
asyncio.get_running_loop()
|
|
148
|
+
except RuntimeError:
|
|
149
|
+
result = asyncio.run(result)
|
|
150
|
+
else:
|
|
151
|
+
close = getattr(result, "close", None)
|
|
152
|
+
if callable(close):
|
|
153
|
+
close()
|
|
154
|
+
return []
|
|
155
|
+
except Exception:
|
|
156
|
+
return []
|
|
157
|
+
if isinstance(result, Sequence) and not isinstance(result, (str, bytes, bytearray)):
|
|
158
|
+
return list(result)
|
|
159
|
+
return []
|
|
160
|
+
|
|
161
|
+
|
|
162
|
+
def _parse_server_config(item: Any, index: int) -> MCPServerConfig:
|
|
163
|
+
if not isinstance(item, dict):
|
|
164
|
+
raise ValueError(f"KSADK_MCP_SERVERS[{index}] must be an object")
|
|
165
|
+
|
|
166
|
+
name = _require_non_empty_string(item.get("name"), f"KSADK_MCP_SERVERS[{index}].name")
|
|
167
|
+
url = _validate_mcp_url(
|
|
168
|
+
_require_non_empty_string(item.get("url"), f"KSADK_MCP_SERVERS[{index}].url")
|
|
169
|
+
)
|
|
170
|
+
api_key = _optional_string(item.get("api_key"))
|
|
171
|
+
tool_filter = tuple(
|
|
172
|
+
_string_list(
|
|
173
|
+
item.get("tool_filter"),
|
|
174
|
+
f"KSADK_MCP_SERVERS[{index}].tool_filter",
|
|
175
|
+
)
|
|
176
|
+
)
|
|
177
|
+
tool_name_prefix = _optional_string(item.get("tool_name_prefix"))
|
|
178
|
+
|
|
179
|
+
return MCPServerConfig(
|
|
180
|
+
name=name,
|
|
181
|
+
url=url,
|
|
182
|
+
api_key=api_key,
|
|
183
|
+
tool_filter=tool_filter,
|
|
184
|
+
tool_name_prefix=tool_name_prefix,
|
|
185
|
+
)
|
|
186
|
+
|
|
187
|
+
|
|
188
|
+
def _require_non_empty_string(value: Any, field_name: str) -> str:
|
|
189
|
+
if not isinstance(value, str) or not value.strip():
|
|
190
|
+
raise ValueError(f"{field_name} must be a non-empty string")
|
|
191
|
+
return value.strip()
|
|
192
|
+
|
|
193
|
+
|
|
194
|
+
def _optional_string(value: Any) -> str | None:
|
|
195
|
+
if value is None:
|
|
196
|
+
return None
|
|
197
|
+
if not isinstance(value, str):
|
|
198
|
+
raise ValueError("Optional MCP config fields must be strings")
|
|
199
|
+
stripped = value.strip()
|
|
200
|
+
return stripped or None
|
|
201
|
+
|
|
202
|
+
|
|
203
|
+
def _string_list(value: Any, field_name: str) -> Sequence[str]:
|
|
204
|
+
if value is None:
|
|
205
|
+
return ()
|
|
206
|
+
if not isinstance(value, list) or any(
|
|
207
|
+
not isinstance(item, str) or not item.strip() for item in value
|
|
208
|
+
):
|
|
209
|
+
raise ValueError(f"{field_name} must be a list of non-empty strings")
|
|
210
|
+
return [item.strip() for item in value]
|
|
211
|
+
|
|
212
|
+
|
|
213
|
+
def _validate_mcp_url(url: str) -> str:
|
|
214
|
+
parsed = urlparse(url)
|
|
215
|
+
if parsed.scheme not in {"http", "https"} or not parsed.netloc:
|
|
216
|
+
raise ValueError("MCP server url must be an absolute http(s) URL")
|
|
217
|
+
if not parsed.path.endswith("/mcp"):
|
|
218
|
+
raise ValueError("MCP server url must point to a /mcp endpoint")
|
|
219
|
+
return url
|
|
220
|
+
|
|
221
|
+
|
|
222
|
+
__all__ = [
|
|
223
|
+
"MCPServerConfig",
|
|
224
|
+
"MCP_TOOLSET_KEY_ATTR",
|
|
225
|
+
"build_connection_params",
|
|
226
|
+
"build_mcp_toolset",
|
|
227
|
+
"load_mcp_server_configs",
|
|
228
|
+
"load_mcp_toolsets_from_env",
|
|
229
|
+
"mcp_tools_enabled",
|
|
230
|
+
"register_mcp_toolset_descriptors",
|
|
231
|
+
]
|
ksadk/memory/__init__.py
ADDED
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
"""Memory SDK.
|
|
2
|
+
|
|
3
|
+
模块组成:
|
|
4
|
+
- ksadk.memory.manager: KV 存储 + 消息历史
|
|
5
|
+
- ksadk.memory.adk: ADK 专用 STM/LTM 集成
|
|
6
|
+
- ksadk.memory.service: 平台级长期记忆 service
|
|
7
|
+
- ksadk.memory.tool: 跨框架 load/save memory 工具
|
|
8
|
+
|
|
9
|
+
使用示例:
|
|
10
|
+
from ksadk.memory import load_memory, save_memory
|
|
11
|
+
from ksadk.memory import LongTermMemoryService
|
|
12
|
+
"""
|
|
13
|
+
|
|
14
|
+
from typing import TYPE_CHECKING
|
|
15
|
+
|
|
16
|
+
from ksadk.memory.manager import MemoryManager, get_memory_manager
|
|
17
|
+
from ksadk.memory.backends.base import BaseMemoryBackend
|
|
18
|
+
from ksadk.memory.backends.memory import InMemoryBackend
|
|
19
|
+
|
|
20
|
+
if TYPE_CHECKING:
|
|
21
|
+
from ksadk.memory.service import LongTermMemoryService
|
|
22
|
+
|
|
23
|
+
__all__ = [
|
|
24
|
+
"MemoryManager",
|
|
25
|
+
"get_memory_manager",
|
|
26
|
+
"BaseMemoryBackend",
|
|
27
|
+
"InMemoryBackend",
|
|
28
|
+
"LongTermMemoryService",
|
|
29
|
+
"load_memory",
|
|
30
|
+
"save_memory",
|
|
31
|
+
"create_langchain_tools",
|
|
32
|
+
"create_adk_tool",
|
|
33
|
+
]
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
def create_langchain_tools():
|
|
37
|
+
from ksadk.memory.langchain_tool import create_langchain_tools as _create
|
|
38
|
+
|
|
39
|
+
return _create()
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
def create_adk_tool():
|
|
43
|
+
from ksadk.memory.adk_tool import create_adk_tool as _create
|
|
44
|
+
|
|
45
|
+
return _create()
|
|
46
|
+
|
|
47
|
+
|
|
48
|
+
def __getattr__(name):
|
|
49
|
+
if name in {"load_memory", "save_memory"}:
|
|
50
|
+
from ksadk.memory.langchain_tool import load_memory, save_memory
|
|
51
|
+
|
|
52
|
+
return {"load_memory": load_memory, "save_memory": save_memory}[name]
|
|
53
|
+
if name == "LongTermMemoryService":
|
|
54
|
+
from ksadk.memory.service import LongTermMemoryService
|
|
55
|
+
|
|
56
|
+
return LongTermMemoryService
|
|
57
|
+
raise AttributeError(f"module 'ksadk.memory' has no attribute {name!r}")
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
"""ADK 记忆体集成 - 短期记忆 + 长期记忆
|
|
2
|
+
|
|
3
|
+
提供与 Google ADK 原生接口兼容的记忆体管理能力。
|
|
4
|
+
通过环境变量配置,由 ADKRunner 自动注入。
|
|
5
|
+
|
|
6
|
+
使用示例:
|
|
7
|
+
from ksadk.memory.adk import ShortTermMemory, LongTermMemory
|
|
8
|
+
|
|
9
|
+
# 短期记忆 (会话管理)
|
|
10
|
+
stm = ShortTermMemory(backend="local")
|
|
11
|
+
|
|
12
|
+
# 长期记忆 (跨 session 检索)
|
|
13
|
+
ltm = LongTermMemory(backend="local", app_name="my_app")
|
|
14
|
+
|
|
15
|
+
环境变量:
|
|
16
|
+
# 短期记忆
|
|
17
|
+
KSADK_ADK_SESSION_BACKEND=database
|
|
18
|
+
KSADK_ADK_SESSION_URL= # ADK 数据库 URL
|
|
19
|
+
KSADK_SESSION_BACKEND=postgres # unified fallback
|
|
20
|
+
KSADK_SESSION_DSN= # unified fallback
|
|
21
|
+
KSADK_STM_BACKEND=local # legacy fallback
|
|
22
|
+
KSADK_STM_DB_URL= # legacy fallback
|
|
23
|
+
|
|
24
|
+
# 长期记忆
|
|
25
|
+
KSADK_LTM_BACKEND=http # local | http
|
|
26
|
+
KSADK_LTM_HTTP_URL= # 记忆服务 HTTP 地址
|
|
27
|
+
KSADK_LTM_HTTP_TOKEN= # 认证 Token
|
|
28
|
+
KSADK_LTM_TOP_K=5 # 检索数量
|
|
29
|
+
"""
|
|
30
|
+
|
|
31
|
+
from typing import TYPE_CHECKING
|
|
32
|
+
|
|
33
|
+
if TYPE_CHECKING:
|
|
34
|
+
from ksadk.memory.adk.long_term_memory import LongTermMemory
|
|
35
|
+
from ksadk.memory.adk.short_term_memory import ShortTermMemory
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
# Lazy loading (避免在未安装 google-adk 时导入失败)
|
|
39
|
+
def __getattr__(name):
|
|
40
|
+
if name == "ShortTermMemory":
|
|
41
|
+
from ksadk.memory.adk.short_term_memory import ShortTermMemory
|
|
42
|
+
return ShortTermMemory
|
|
43
|
+
|
|
44
|
+
if name == "LongTermMemory":
|
|
45
|
+
from ksadk.memory.adk.long_term_memory import LongTermMemory
|
|
46
|
+
return LongTermMemory
|
|
47
|
+
|
|
48
|
+
raise AttributeError(f"module 'ksadk.memory.adk' has no attribute '{name}'")
|
|
49
|
+
|
|
50
|
+
|
|
51
|
+
__all__ = ["ShortTermMemory", "LongTermMemory"]
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
"""长期记忆后端抽象基类
|
|
2
|
+
|
|
3
|
+
所有长期记忆后端必须继承此类并实现 save_memory / search_memory 方法。
|
|
4
|
+
|
|
5
|
+
参考 VeADK: veadk/memory/long_term_memory_backends/base_backend.py
|
|
6
|
+
"""
|
|
7
|
+
|
|
8
|
+
from abc import ABC, abstractmethod
|
|
9
|
+
from typing import List
|
|
10
|
+
|
|
11
|
+
from pydantic import BaseModel
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
class BaseLongTermMemoryBackend(ABC, BaseModel):
|
|
15
|
+
"""长期记忆存储后端抽象基类
|
|
16
|
+
|
|
17
|
+
Attributes:
|
|
18
|
+
index: 索引/集合名称,用于隔离不同应用的记忆数据
|
|
19
|
+
"""
|
|
20
|
+
|
|
21
|
+
index: str = ""
|
|
22
|
+
|
|
23
|
+
@abstractmethod
|
|
24
|
+
def save_memory(
|
|
25
|
+
self, user_id: str, event_strings: List[str], **kwargs
|
|
26
|
+
) -> bool:
|
|
27
|
+
"""保存记忆
|
|
28
|
+
|
|
29
|
+
Args:
|
|
30
|
+
user_id: 用户 ID
|
|
31
|
+
event_strings: 序列化的事件字符串列表
|
|
32
|
+
|
|
33
|
+
Returns:
|
|
34
|
+
是否保存成功
|
|
35
|
+
"""
|
|
36
|
+
pass
|
|
37
|
+
|
|
38
|
+
@abstractmethod
|
|
39
|
+
def search_memory(
|
|
40
|
+
self, user_id: str, query: str, top_k: int = 5, **kwargs
|
|
41
|
+
) -> List[str]:
|
|
42
|
+
"""检索记忆
|
|
43
|
+
|
|
44
|
+
Args:
|
|
45
|
+
user_id: 用户 ID
|
|
46
|
+
query: 查询文本
|
|
47
|
+
top_k: 返回最相关的 N 条记忆
|
|
48
|
+
|
|
49
|
+
Returns:
|
|
50
|
+
匹配的记忆字符串列表
|
|
51
|
+
"""
|
|
52
|
+
pass
|
|
@@ -0,0 +1,183 @@
|
|
|
1
|
+
"""HTTP 长期记忆后端 - 远程记忆服务
|
|
2
|
+
|
|
3
|
+
通过 HTTP API 连接金山云记忆服务。
|
|
4
|
+
API 对接细节待提供后实现,当前为框架预留。
|
|
5
|
+
|
|
6
|
+
环境变量:
|
|
7
|
+
KSADK_LTM_HTTP_URL: 记忆服务 HTTP 地址
|
|
8
|
+
KSADK_LTM_HTTP_TOKEN: 认证 Token
|
|
9
|
+
"""
|
|
10
|
+
|
|
11
|
+
import logging
|
|
12
|
+
from typing import List, Optional
|
|
13
|
+
|
|
14
|
+
import httpx
|
|
15
|
+
from pydantic import ConfigDict, Field
|
|
16
|
+
|
|
17
|
+
from ksadk.memory.adk.backends.base_ltm_backend import BaseLongTermMemoryBackend
|
|
18
|
+
|
|
19
|
+
logger = logging.getLogger(__name__)
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
class HttpLTMBackend(BaseLongTermMemoryBackend):
|
|
23
|
+
"""HTTP 远程记忆服务后端
|
|
24
|
+
|
|
25
|
+
连接金山云记忆服务,通过 HTTP API 进行记忆的存储和检索。
|
|
26
|
+
|
|
27
|
+
Attributes:
|
|
28
|
+
base_url: 记忆服务 HTTP 基础地址
|
|
29
|
+
token: 认证 Token
|
|
30
|
+
timeout: HTTP 请求超时时间(秒)
|
|
31
|
+
|
|
32
|
+
Examples:
|
|
33
|
+
```python
|
|
34
|
+
backend = HttpLTMBackend(
|
|
35
|
+
index="my_app",
|
|
36
|
+
base_url="https://memory.ksyun.com/api/v1",
|
|
37
|
+
token="sk-xxx"
|
|
38
|
+
)
|
|
39
|
+
backend.save_memory("user_1", ["用户喜欢Python"])
|
|
40
|
+
results = backend.search_memory("user_1", "编程语言偏好")
|
|
41
|
+
```
|
|
42
|
+
"""
|
|
43
|
+
|
|
44
|
+
base_url: str = ""
|
|
45
|
+
token: str = ""
|
|
46
|
+
timeout: int = 30
|
|
47
|
+
|
|
48
|
+
_client: Optional[httpx.Client] = None
|
|
49
|
+
|
|
50
|
+
model_config = ConfigDict(arbitrary_types_allowed=True)
|
|
51
|
+
|
|
52
|
+
def model_post_init(self, __context) -> None:
|
|
53
|
+
if not self.base_url:
|
|
54
|
+
logger.warning(
|
|
55
|
+
"HttpLTMBackend: base_url is empty. "
|
|
56
|
+
"Set KSADK_LTM_HTTP_URL environment variable."
|
|
57
|
+
)
|
|
58
|
+
logger.info(
|
|
59
|
+
f"HttpLTMBackend initialized: base_url={self.base_url[:50]}... "
|
|
60
|
+
f"index={self.index}"
|
|
61
|
+
)
|
|
62
|
+
|
|
63
|
+
@property
|
|
64
|
+
def client(self) -> httpx.Client:
|
|
65
|
+
"""懒加载 HTTP 客户端"""
|
|
66
|
+
if self._client is None:
|
|
67
|
+
headers = {"Content-Type": "application/json"}
|
|
68
|
+
if self.token:
|
|
69
|
+
headers["Authorization"] = f"Bearer {self.token}"
|
|
70
|
+
|
|
71
|
+
self._client = httpx.Client(
|
|
72
|
+
base_url=self.base_url,
|
|
73
|
+
headers=headers,
|
|
74
|
+
timeout=self.timeout,
|
|
75
|
+
)
|
|
76
|
+
return self._client
|
|
77
|
+
|
|
78
|
+
def save_memory(
|
|
79
|
+
self, user_id: str, event_strings: List[str], **kwargs
|
|
80
|
+
) -> bool:
|
|
81
|
+
"""保存记忆到远程服务
|
|
82
|
+
|
|
83
|
+
TODO: 对接金山云记忆服务 API
|
|
84
|
+
预期请求格式:
|
|
85
|
+
POST {base_url}/memories
|
|
86
|
+
{
|
|
87
|
+
"index": "...",
|
|
88
|
+
"user_id": "...",
|
|
89
|
+
"events": ["...", "..."]
|
|
90
|
+
}
|
|
91
|
+
"""
|
|
92
|
+
if not self.base_url:
|
|
93
|
+
logger.warning("HttpLTMBackend: base_url not configured, skip save.")
|
|
94
|
+
return False
|
|
95
|
+
|
|
96
|
+
try:
|
|
97
|
+
payload = {
|
|
98
|
+
"index": self.index,
|
|
99
|
+
"user_id": user_id,
|
|
100
|
+
"events": event_strings,
|
|
101
|
+
}
|
|
102
|
+
payload.update(kwargs)
|
|
103
|
+
|
|
104
|
+
response = self.client.post("/memories", json=payload)
|
|
105
|
+
response.raise_for_status()
|
|
106
|
+
|
|
107
|
+
logger.info(
|
|
108
|
+
f"Saved {len(event_strings)} events to remote memory service "
|
|
109
|
+
f"for user={user_id}"
|
|
110
|
+
)
|
|
111
|
+
return True
|
|
112
|
+
|
|
113
|
+
except httpx.HTTPStatusError as e:
|
|
114
|
+
logger.error(
|
|
115
|
+
f"HTTP error saving memory: {e.response.status_code} "
|
|
116
|
+
f"{e.response.text[:200]}"
|
|
117
|
+
)
|
|
118
|
+
return False
|
|
119
|
+
except Exception as e:
|
|
120
|
+
logger.error(f"Error saving memory to remote service: {e}")
|
|
121
|
+
return False
|
|
122
|
+
|
|
123
|
+
def search_memory(
|
|
124
|
+
self, user_id: str, query: str, top_k: int = 5, **kwargs
|
|
125
|
+
) -> List[str]:
|
|
126
|
+
"""从远程服务检索记忆
|
|
127
|
+
|
|
128
|
+
TODO: 对接金山云记忆服务 API
|
|
129
|
+
预期请求格式:
|
|
130
|
+
POST {base_url}/memories/search
|
|
131
|
+
{
|
|
132
|
+
"index": "...",
|
|
133
|
+
"user_id": "...",
|
|
134
|
+
"query": "...",
|
|
135
|
+
"top_k": 5
|
|
136
|
+
}
|
|
137
|
+
预期响应格式:
|
|
138
|
+
{
|
|
139
|
+
"memories": ["...", "..."]
|
|
140
|
+
}
|
|
141
|
+
"""
|
|
142
|
+
if not self.base_url:
|
|
143
|
+
logger.warning(
|
|
144
|
+
"HttpLTMBackend: base_url not configured, return empty results."
|
|
145
|
+
)
|
|
146
|
+
return []
|
|
147
|
+
|
|
148
|
+
try:
|
|
149
|
+
payload = {
|
|
150
|
+
"index": self.index,
|
|
151
|
+
"user_id": user_id,
|
|
152
|
+
"query": query,
|
|
153
|
+
"top_k": top_k,
|
|
154
|
+
}
|
|
155
|
+
payload.update(kwargs)
|
|
156
|
+
|
|
157
|
+
response = self.client.post("/memories/search", json=payload)
|
|
158
|
+
response.raise_for_status()
|
|
159
|
+
|
|
160
|
+
data = response.json()
|
|
161
|
+
memories = data.get("memories", [])
|
|
162
|
+
|
|
163
|
+
logger.info(
|
|
164
|
+
f"Retrieved {len(memories)} memories from remote service "
|
|
165
|
+
f"for user={user_id} query='{query[:50]}'"
|
|
166
|
+
)
|
|
167
|
+
return memories
|
|
168
|
+
|
|
169
|
+
except httpx.HTTPStatusError as e:
|
|
170
|
+
logger.error(
|
|
171
|
+
f"HTTP error searching memory: {e.response.status_code} "
|
|
172
|
+
f"{e.response.text[:200]}"
|
|
173
|
+
)
|
|
174
|
+
return []
|
|
175
|
+
except Exception as e:
|
|
176
|
+
logger.error(f"Error searching memory from remote service: {e}")
|
|
177
|
+
return []
|
|
178
|
+
|
|
179
|
+
def close(self) -> None:
|
|
180
|
+
"""关闭 HTTP 客户端"""
|
|
181
|
+
if self._client:
|
|
182
|
+
self._client.close()
|
|
183
|
+
self._client = None
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
"""InMemory 长期记忆后端 - 开发/测试用
|
|
2
|
+
|
|
3
|
+
使用简单的内存字典存储和文本匹配检索。
|
|
4
|
+
数据在进程退出后丢失,仅适用于开发和测试场景。
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
import logging
|
|
8
|
+
from collections import defaultdict
|
|
9
|
+
from typing import List
|
|
10
|
+
|
|
11
|
+
from ksadk.memory.adk.backends.base_ltm_backend import BaseLongTermMemoryBackend
|
|
12
|
+
|
|
13
|
+
logger = logging.getLogger(__name__)
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
class InMemoryLTMBackend(BaseLongTermMemoryBackend):
|
|
17
|
+
"""内存长期记忆后端
|
|
18
|
+
|
|
19
|
+
使用 dict 存储记忆,文本关键词匹配检索。
|
|
20
|
+
适用于开发测试,不提供语义搜索能力。
|
|
21
|
+
|
|
22
|
+
Examples:
|
|
23
|
+
```python
|
|
24
|
+
backend = InMemoryLTMBackend(index="my_app")
|
|
25
|
+
backend.save_memory("user_1", ["我喜欢吃冰淇淋", "今天天气真好"])
|
|
26
|
+
results = backend.search_memory("user_1", "冰淇淋", top_k=5)
|
|
27
|
+
```
|
|
28
|
+
"""
|
|
29
|
+
|
|
30
|
+
# Pydantic v2 不允许直接声明 mutable default,使用 model_post_init
|
|
31
|
+
_storage: dict = None
|
|
32
|
+
|
|
33
|
+
def model_post_init(self, __context) -> None:
|
|
34
|
+
# {user_id: [event_string, ...]}
|
|
35
|
+
self._storage = defaultdict(list)
|
|
36
|
+
logger.info(
|
|
37
|
+
f"InMemoryLTMBackend initialized: index={self.index}"
|
|
38
|
+
)
|
|
39
|
+
|
|
40
|
+
def save_memory(
|
|
41
|
+
self, user_id: str, event_strings: List[str], **kwargs
|
|
42
|
+
) -> bool:
|
|
43
|
+
"""保存记忆到内存"""
|
|
44
|
+
if not event_strings:
|
|
45
|
+
return True
|
|
46
|
+
|
|
47
|
+
self._storage[user_id].extend(event_strings)
|
|
48
|
+
logger.debug(
|
|
49
|
+
f"Saved {len(event_strings)} events for user={user_id}, "
|
|
50
|
+
f"total={len(self._storage[user_id])}"
|
|
51
|
+
)
|
|
52
|
+
return True
|
|
53
|
+
|
|
54
|
+
def search_memory(
|
|
55
|
+
self, user_id: str, query: str, top_k: int = 5, **kwargs
|
|
56
|
+
) -> List[str]:
|
|
57
|
+
"""基于关键词匹配检索记忆
|
|
58
|
+
|
|
59
|
+
简单实现:对 query 分词后,按匹配关键词数量排序。
|
|
60
|
+
生产环境应使用向量搜索后端。
|
|
61
|
+
"""
|
|
62
|
+
user_memories = self._storage.get(user_id, [])
|
|
63
|
+
if not user_memories:
|
|
64
|
+
return []
|
|
65
|
+
|
|
66
|
+
# 简单的关键词匹配打分
|
|
67
|
+
query_lower = query.lower()
|
|
68
|
+
# 按字符分词(支持中英文混合)
|
|
69
|
+
query_terms = query_lower.split()
|
|
70
|
+
|
|
71
|
+
scored = []
|
|
72
|
+
for memory in user_memories:
|
|
73
|
+
memory_lower = memory.lower()
|
|
74
|
+
# 计算匹配分数:完整 query 匹配得高分,部分关键词匹配得低分
|
|
75
|
+
score = 0
|
|
76
|
+
if query_lower in memory_lower:
|
|
77
|
+
score += 10 # 完整匹配
|
|
78
|
+
for term in query_terms:
|
|
79
|
+
if term in memory_lower:
|
|
80
|
+
score += 1
|
|
81
|
+
if score > 0:
|
|
82
|
+
scored.append((score, memory))
|
|
83
|
+
|
|
84
|
+
# 如果没有匹配,返回最近的记忆
|
|
85
|
+
if not scored:
|
|
86
|
+
return user_memories[-top_k:]
|
|
87
|
+
|
|
88
|
+
# 按分数降序排列,取 top_k
|
|
89
|
+
scored.sort(key=lambda x: x[0], reverse=True)
|
|
90
|
+
results = [item[1] for item in scored[:top_k]]
|
|
91
|
+
|
|
92
|
+
logger.debug(
|
|
93
|
+
f"Search memory for user={user_id} query='{query[:50]}': "
|
|
94
|
+
f"found {len(results)} results from {len(user_memories)} total"
|
|
95
|
+
)
|
|
96
|
+
return results
|