agentengine-sdk-python 0.6.4__py3-none-any.whl → 0.7.0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- agentengine_sdk_python-0.7.0.dist-info/METADATA +181 -0
- agentengine_sdk_python-0.7.0.dist-info/RECORD +482 -0
- {agentengine_sdk_python-0.6.4.dist-info → agentengine_sdk_python-0.7.0.dist-info}/WHEEL +1 -1
- agentengine_sdk_python-0.7.0.dist-info/entry_points.txt +3 -0
- agentengine_sdk_python-0.7.0.dist-info/licenses/LICENSE +175 -0
- agentengine_sdk_python-0.7.0.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 +2246 -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 +2304 -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 +1263 -0
- ksadk/cli/cmd_invoke.py +1503 -0
- ksadk/cli/cmd_launch.py +564 -0
- ksadk/cli/cmd_mcp.py +1179 -0
- ksadk/cli/cmd_model.py +302 -0
- ksadk/cli/cmd_openclaw.py +3922 -0
- ksadk/cli/cmd_run.py +239 -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 +412 -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 +343 -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/message_projection.py +269 -0
- ksadk/conversations/model_context.py +370 -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 +5276 -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 +1115 -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/resilient_session_service.py +268 -0
- ksadk/memory/adk/short_term_memory.py +304 -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 +1994 -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 +751 -0
- ksadk/runners/langgraph_runner.py +985 -0
- ksadk/runners/patch_langchain.py +187 -0
- ksadk/runners/remote_runner.py +792 -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 +3931 -0
- ksadk/server/static/assets/ArtifactsPanel-D-SSn2ee.js +1 -0
- ksadk/server/static/assets/CodeBlock-P16VOLYi.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-CdGiQWHR.js +8 -0
- ksadk/server/static/assets/MathMessageMarkdown-DeYh8QPr.css +1 -0
- ksadk/server/static/assets/MermaidBlock-IOcal8cm.js +303 -0
- ksadk/server/static/assets/NativeTerminalPanel-CHOd7Rch.css +1 -0
- ksadk/server/static/assets/NativeTerminalPanel-DGSDWsei.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-BA13sHc9.js +1 -0
- ksadk/server/static/assets/architecture-7EHR7CIX-BvUlsA6l.js +1 -0
- ksadk/server/static/assets/architectureDiagram-3BPJPVTR-DzJzgVoL.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-UTdVcZhn.js +132 -0
- ksadk/server/static/assets/brainfuck-D5EjA2JK.js +1 -0
- ksadk/server/static/assets/c4Diagram-AAUBKEIU-Dix0GD4m.js +10 -0
- ksadk/server/static/assets/channel-CTuydARX.js +1 -0
- ksadk/server/static/assets/chunk-2J33WTMH-C2JxuZ42.js +1 -0
- ksadk/server/static/assets/chunk-4BX2VUAB-Be57QPgD.js +1 -0
- ksadk/server/static/assets/chunk-55IACEB6-WjSuy4nv.js +1 -0
- ksadk/server/static/assets/chunk-727SXJPM-BOovP-b5.js +206 -0
- ksadk/server/static/assets/chunk-AQP2D5EJ-DOmZNmWj.js +231 -0
- ksadk/server/static/assets/chunk-FMBD7UC4-DzwlodkU.js +15 -0
- ksadk/server/static/assets/chunk-ND2GUHAM-DMqAikEU.js +1 -0
- ksadk/server/static/assets/chunk-QZHKN3VN-BnCydivS.js +1 -0
- ksadk/server/static/assets/classDiagram-4FO5ZUOK-BNHg45Be.js +1 -0
- ksadk/server/static/assets/classDiagram-v2-Q7XG4LA2-BNHg45Be.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-Zhy2GBnP.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-CbKrtIUz.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-BRApgQRK.js +43 -0
- ksadk/server/static/assets/diagram-5GNKFQAL-D0xbnDiK.js +10 -0
- ksadk/server/static/assets/diagram-KO2AKTUF-CVugVI9L.js +3 -0
- ksadk/server/static/assets/diagram-LMA3HP47-DozUGgee.js +24 -0
- ksadk/server/static/assets/diagram-OG6HWLK6-ZOYsKlru.js +24 -0
- ksadk/server/static/assets/diff-ChtP43wD.js +1 -0
- ksadk/server/static/assets/dist-2hInLS_J.js +9 -0
- ksadk/server/static/assets/dist-8EEyGgDx.js +1 -0
- ksadk/server/static/assets/dist-8_SfK1IP.js +1 -0
- ksadk/server/static/assets/dist-B0NP_Z0z.js +23 -0
- ksadk/server/static/assets/dist-BIJVDMuB.js +1 -0
- ksadk/server/static/assets/dist-BmlMPsCc.js +2 -0
- ksadk/server/static/assets/dist-BrCcQ47T.js +1 -0
- ksadk/server/static/assets/dist-BssVmjIo.js +6 -0
- ksadk/server/static/assets/dist-C3HIIaN5.js +1 -0
- ksadk/server/static/assets/dist-CPBtqRTW.js +1 -0
- ksadk/server/static/assets/dist-CkEKJFtk.js +1 -0
- ksadk/server/static/assets/dist-D-JMdWPQ.js +1 -0
- ksadk/server/static/assets/dist-D-xOD048.js +1 -0
- ksadk/server/static/assets/dist-D57wnGWd.js +1 -0
- ksadk/server/static/assets/dist-DL_NKc_z.js +1 -0
- ksadk/server/static/assets/dist-DMezvBGJ.js +1 -0
- ksadk/server/static/assets/dist-DmFaq_Iy.js +1 -0
- ksadk/server/static/assets/dist-Dp0k7bWI.js +1 -0
- ksadk/server/static/assets/dist-DpKtt4Bo.js +1 -0
- ksadk/server/static/assets/dist-DyOkZmze.js +11 -0
- ksadk/server/static/assets/dist-DyWsb78Q.js +1 -0
- ksadk/server/static/assets/dist-gX6GOLKq.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-Bk-9bgE5.js +85 -0
- ksadk/server/static/assets/erlang-DaB2Rkuy.js +1 -0
- ksadk/server/static/assets/eventmodeling-FCH6USID-DsAgWnlf.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-Dn9kZVuZ.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-BGxXlJqm.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-BIao9Yjg.js +1 -0
- ksadk/server/static/assets/gitGraphDiagram-PVQCEYII-C7Q0X-wi.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-C00Lwg3L.js +165 -0
- ksadk/server/static/assets/index-DAURbCsP.css +1 -0
- ksadk/server/static/assets/info-J43DQDTF-CyipqGxU.js +1 -0
- ksadk/server/static/assets/infoDiagram-5YYISTIA-BO_CSqq5.js +2 -0
- ksadk/server/static/assets/init-D6jRqBbL.js +1 -0
- ksadk/server/static/assets/ishikawaDiagram-YF4QCWOH-eYLPLd46.js +70 -0
- ksadk/server/static/assets/javascript-9Tg8ixDm.js +1 -0
- ksadk/server/static/assets/journeyDiagram-JHISSGLW-De9geSb0.js +139 -0
- ksadk/server/static/assets/julia-CQfgDRfP.js +1 -0
- ksadk/server/static/assets/kanban-definition-UN3LZRKU-Cs80kQto.js +89 -0
- ksadk/server/static/assets/katex-DSrCFD8n.js +265 -0
- ksadk/server/static/assets/linear-CN9sbKTF.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-DlgSBU8l.js +161 -0
- ksadk/server/static/assets/mindmap-definition-RKZ34NQL-9afz7Oug.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-CGkyRxlg.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-M0uWAf4n.js +1 -0
- ksadk/server/static/assets/pieDiagram-4H26LBE5-DPv_VstN.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-o77wZ1XK.js +7 -0
- ksadk/server/static/assets/r-DADKenSm.js +1 -0
- ksadk/server/static/assets/radar-GUYGQ44K-Bdbm24-x.js +1 -0
- ksadk/server/static/assets/requirementDiagram-4Y6WPE33-BYVw81VC.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-B7nZFMKT.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-BGRRrFw5.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-BUfHCoPs.js +1 -0
- ksadk/server/static/assets/stateDiagram-v2-BHNVJYJU-8xBN_gLM.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-FbCTGrf9.js +120 -0
- ksadk/server/static/assets/toml-LvoKBwCs.js +1 -0
- ksadk/server/static/assets/treeView-BLDUP644-npMo0ak1.js +1 -0
- ksadk/server/static/assets/treemap-LRROVOQU-CHdzrrdo.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-DWgwtPsJ.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-BEQz7wyy.js +1 -0
- ksadk/server/static/assets/wardleyDiagram-YWT4CUSO-2x8G-tTM.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-Drma3AYl.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 +279 -0
- ksadk/sessions/base.py +354 -0
- ksadk/sessions/continuity.py +337 -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 +901 -0
- ksadk/sessions/resilience.py +52 -0
- ksadk/sessions/resilient.py +360 -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 +854 -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 +917 -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 +892 -0
- ksadk/tracing/span_utils.py +114 -0
- ksadk/tui/__init__.py +27 -0
- ksadk/tui/loop.py +1877 -0
- ksadk/tui/stream_render.py +68 -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/__init__.py +0 -3
- agentengine_sdk_python-0.6.4.dist-info/METADATA +0 -48
- agentengine_sdk_python-0.6.4.dist-info/RECORD +0 -5
- agentengine_sdk_python-0.6.4.dist-info/top_level.txt +0 -1
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
"""TUI 流式渲染共享纯函数。
|
|
2
|
+
|
|
3
|
+
从 RemoteRunner.stream 的归一化 chunk 提取 delta/usage/终止信号,格式化 usage 文本。
|
|
4
|
+
被 loop.py(交互 TUI)和 cmd_invoke._invoke_once(-m 单次)共用,保证两路径渲染口径一致。
|
|
5
|
+
"""
|
|
6
|
+
from __future__ import annotations
|
|
7
|
+
|
|
8
|
+
import re
|
|
9
|
+
from typing import Any, Optional
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
def clean_response(text: str) -> str:
|
|
13
|
+
"""清理 LLM 响应中的内部调试伪影。
|
|
14
|
+
|
|
15
|
+
只删内部调试残留(Tool Result 标记、python repr 片段、tool_call_id),
|
|
16
|
+
不动正常的 XML/HTML 标签(用户可能需要 <tag> 输出)。
|
|
17
|
+
"""
|
|
18
|
+
text = re.sub(r"\[Tool Result:.*?\]", "", text, flags=re.DOTALL)
|
|
19
|
+
text = re.sub(r"<think>.*?</think>", "", text, flags=re.DOTALL)
|
|
20
|
+
text = re.sub(r"name='[^']*'\s*tool_call_id='[^']*'", "", text)
|
|
21
|
+
return text.strip()
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
def extract_stream_delta(chunk: dict) -> tuple[str, dict | None, bool]:
|
|
25
|
+
"""从 RemoteRunner.stream 的 chunk 提取 (delta 文本, usage, 是否终止信号)。
|
|
26
|
+
|
|
27
|
+
- text/thinking 等普通 chunk:取 delta,非终止。
|
|
28
|
+
- final(chat 路径结束,output=完整文本)/ responses_output(responses 路径
|
|
29
|
+
response.completed,output=list):只取 usage,不把 output 当 delta——
|
|
30
|
+
否则末尾会把完整文本或 list 再 append 一遍(重复/乱码)。
|
|
31
|
+
"""
|
|
32
|
+
chunk_type = str(chunk.get("type") or "text")
|
|
33
|
+
if chunk_type in {"final", "responses_output"}:
|
|
34
|
+
usage = chunk.get("usage")
|
|
35
|
+
usage = dict(usage) if isinstance(usage, dict) else None
|
|
36
|
+
# terminal chunk 可能带 metadata.last_usage(上下文用量),合并进 usage
|
|
37
|
+
# 让 TUI 能显示 context 占比,不丢这条 metadata。
|
|
38
|
+
metadata = chunk.get("metadata")
|
|
39
|
+
if isinstance(metadata, dict) and isinstance(metadata.get("last_usage"), dict):
|
|
40
|
+
if usage is None:
|
|
41
|
+
usage = {}
|
|
42
|
+
usage.setdefault("last_usage", dict(metadata["last_usage"]))
|
|
43
|
+
return "", (usage or None), True
|
|
44
|
+
delta = chunk.get("delta") or ""
|
|
45
|
+
if not isinstance(delta, str):
|
|
46
|
+
delta = str(delta or "")
|
|
47
|
+
return delta, None, False
|
|
48
|
+
|
|
49
|
+
|
|
50
|
+
def format_usage(usage: Optional[dict[str, Any]]) -> str:
|
|
51
|
+
"""把 usage dict 格式成紧凑文本:↑输入 ↓输出 ⌀总计。
|
|
52
|
+
|
|
53
|
+
兼容 input_tokens/output_tokens(chat 路径)与 prompt_tokens/completion_tokens
|
|
54
|
+
(responses 路径)两种字段名。
|
|
55
|
+
"""
|
|
56
|
+
if not isinstance(usage, dict) or not usage:
|
|
57
|
+
return ""
|
|
58
|
+
inp = usage.get("input_tokens") or usage.get("prompt_tokens")
|
|
59
|
+
out = usage.get("output_tokens") or usage.get("completion_tokens")
|
|
60
|
+
total = usage.get("total_tokens")
|
|
61
|
+
parts = []
|
|
62
|
+
if inp:
|
|
63
|
+
parts.append(f"↑{inp}")
|
|
64
|
+
if out:
|
|
65
|
+
parts.append(f"↓{out}")
|
|
66
|
+
if total:
|
|
67
|
+
parts.append(f"⌀{total}")
|
|
68
|
+
return " ".join(parts)
|
ksadk/ui_config.py
ADDED
|
@@ -0,0 +1,168 @@
|
|
|
1
|
+
"""UI configuration helpers shared by CLI, deployment, and runtime."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
from dataclasses import dataclass
|
|
6
|
+
from typing import Any, Dict, Optional, Tuple
|
|
7
|
+
from urllib.parse import urlsplit
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
UI_PROFILE_AUTO = "auto"
|
|
11
|
+
UI_PROFILE_ADK = "adk"
|
|
12
|
+
UI_PROFILE_LANGCHAIN = "langchain"
|
|
13
|
+
UI_PROFILE_OPENCLAW = "openclaw"
|
|
14
|
+
UI_PROFILE_HERMES = "hermes"
|
|
15
|
+
UI_PROFILE_CUSTOM = "custom"
|
|
16
|
+
|
|
17
|
+
SUPPORTED_UI_PROFILES = (
|
|
18
|
+
UI_PROFILE_AUTO,
|
|
19
|
+
UI_PROFILE_ADK,
|
|
20
|
+
UI_PROFILE_LANGCHAIN,
|
|
21
|
+
UI_PROFILE_OPENCLAW,
|
|
22
|
+
UI_PROFILE_HERMES,
|
|
23
|
+
UI_PROFILE_CUSTOM,
|
|
24
|
+
)
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
_FRAMEWORK_TO_PROFILE = {
|
|
28
|
+
"adk": UI_PROFILE_ADK,
|
|
29
|
+
"langchain": UI_PROFILE_LANGCHAIN,
|
|
30
|
+
"langgraph": UI_PROFILE_LANGCHAIN,
|
|
31
|
+
"deepagents": UI_PROFILE_LANGCHAIN,
|
|
32
|
+
"openclaw": UI_PROFILE_OPENCLAW,
|
|
33
|
+
"hermes": UI_PROFILE_HERMES,
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
_DEFAULT_PATH_BY_PROFILE = {
|
|
37
|
+
UI_PROFILE_ADK: "/chat",
|
|
38
|
+
UI_PROFILE_LANGCHAIN: "/chat",
|
|
39
|
+
UI_PROFILE_OPENCLAW: "/chat",
|
|
40
|
+
UI_PROFILE_HERMES: "/chat",
|
|
41
|
+
UI_PROFILE_CUSTOM: "/",
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
|
|
45
|
+
@dataclass(frozen=True)
|
|
46
|
+
class UIConfig:
|
|
47
|
+
"""Resolved UI configuration."""
|
|
48
|
+
|
|
49
|
+
profile: str
|
|
50
|
+
path: str
|
|
51
|
+
url: Optional[str] = None
|
|
52
|
+
|
|
53
|
+
|
|
54
|
+
def normalize_ui_profile(profile: Optional[str], *, default: str = UI_PROFILE_AUTO) -> str:
|
|
55
|
+
value = (profile or "").strip().lower()
|
|
56
|
+
if not value:
|
|
57
|
+
return default
|
|
58
|
+
if value not in SUPPORTED_UI_PROFILES:
|
|
59
|
+
raise ValueError(f"unsupported ui_profile: {profile}")
|
|
60
|
+
return value
|
|
61
|
+
|
|
62
|
+
|
|
63
|
+
def normalize_ui_path(path: Optional[str]) -> Optional[str]:
|
|
64
|
+
if path is None:
|
|
65
|
+
return None
|
|
66
|
+
|
|
67
|
+
value = path.strip()
|
|
68
|
+
if not value:
|
|
69
|
+
return None
|
|
70
|
+
|
|
71
|
+
if not value.startswith("/"):
|
|
72
|
+
value = "/" + value
|
|
73
|
+
return value
|
|
74
|
+
|
|
75
|
+
|
|
76
|
+
def normalize_ui_url(url: Optional[str]) -> Optional[str]:
|
|
77
|
+
if url is None:
|
|
78
|
+
return None
|
|
79
|
+
value = url.strip()
|
|
80
|
+
return value or None
|
|
81
|
+
|
|
82
|
+
|
|
83
|
+
def infer_ui_profile_from_framework(framework: Optional[str]) -> str:
|
|
84
|
+
key = (framework or "").strip().lower()
|
|
85
|
+
return _FRAMEWORK_TO_PROFILE.get(key, UI_PROFILE_ADK)
|
|
86
|
+
|
|
87
|
+
|
|
88
|
+
def default_ui_path(profile: str) -> str:
|
|
89
|
+
return _DEFAULT_PATH_BY_PROFILE.get(profile, "/")
|
|
90
|
+
|
|
91
|
+
|
|
92
|
+
def extract_ui_state(state: Optional[Dict[str, Any]]) -> Tuple[Optional[str], Optional[str], Optional[str]]:
|
|
93
|
+
if not isinstance(state, dict):
|
|
94
|
+
return None, None, None
|
|
95
|
+
|
|
96
|
+
nested = state.get("ui") if isinstance(state.get("ui"), dict) else {}
|
|
97
|
+
|
|
98
|
+
profile = state.get("ui_profile") or nested.get("profile")
|
|
99
|
+
path = state.get("ui_path") or nested.get("path")
|
|
100
|
+
url = state.get("ui_url") or nested.get("url")
|
|
101
|
+
|
|
102
|
+
return profile, path, url
|
|
103
|
+
|
|
104
|
+
|
|
105
|
+
def resolve_ui_config(
|
|
106
|
+
*,
|
|
107
|
+
framework: Optional[str],
|
|
108
|
+
state: Optional[Dict[str, Any]],
|
|
109
|
+
cli_profile: Optional[str],
|
|
110
|
+
cli_path: Optional[str],
|
|
111
|
+
cli_url: Optional[str],
|
|
112
|
+
) -> UIConfig:
|
|
113
|
+
"""Merge CLI + state + framework defaults into the final UI config.
|
|
114
|
+
|
|
115
|
+
Priority:
|
|
116
|
+
1) CLI arguments
|
|
117
|
+
2) .agentengine.state
|
|
118
|
+
3) framework default
|
|
119
|
+
4) global default
|
|
120
|
+
"""
|
|
121
|
+
|
|
122
|
+
state_profile, state_path, state_url = extract_ui_state(state)
|
|
123
|
+
|
|
124
|
+
profile = normalize_ui_profile(cli_profile or state_profile or UI_PROFILE_AUTO)
|
|
125
|
+
if profile == UI_PROFILE_AUTO:
|
|
126
|
+
profile = infer_ui_profile_from_framework(framework)
|
|
127
|
+
|
|
128
|
+
path = normalize_ui_path(cli_path) if cli_path is not None else normalize_ui_path(state_path)
|
|
129
|
+
url = normalize_ui_url(cli_url) if cli_url is not None else normalize_ui_url(state_url)
|
|
130
|
+
|
|
131
|
+
if profile in {UI_PROFILE_ADK, UI_PROFILE_LANGCHAIN, UI_PROFILE_OPENCLAW, UI_PROFILE_HERMES}:
|
|
132
|
+
normalized_legacy_path = (path or "").rstrip("/") or "/"
|
|
133
|
+
legacy_paths = {"/langchain"}
|
|
134
|
+
if cli_path is None:
|
|
135
|
+
legacy_paths.add("/")
|
|
136
|
+
if normalized_legacy_path in legacy_paths:
|
|
137
|
+
path = "/chat"
|
|
138
|
+
|
|
139
|
+
if not path:
|
|
140
|
+
path = default_ui_path(profile)
|
|
141
|
+
if profile == UI_PROFILE_CUSTOM and path == "/chat":
|
|
142
|
+
path = "/"
|
|
143
|
+
|
|
144
|
+
return UIConfig(profile=profile, path=path, url=url)
|
|
145
|
+
|
|
146
|
+
|
|
147
|
+
def ui_config_to_state_fields(config: UIConfig) -> Dict[str, Any]:
|
|
148
|
+
return {
|
|
149
|
+
"ui_profile": config.profile,
|
|
150
|
+
"ui_path": config.path,
|
|
151
|
+
"ui_url": config.url,
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
|
|
155
|
+
def is_same_origin(url: str, endpoint: str) -> bool:
|
|
156
|
+
if not url or not endpoint:
|
|
157
|
+
return False
|
|
158
|
+
|
|
159
|
+
left = urlsplit(url)
|
|
160
|
+
right = urlsplit(endpoint)
|
|
161
|
+
|
|
162
|
+
if not left.scheme or not left.netloc or not right.scheme or not right.netloc:
|
|
163
|
+
return False
|
|
164
|
+
|
|
165
|
+
return (left.scheme.lower(), left.netloc.lower()) == (
|
|
166
|
+
right.scheme.lower(),
|
|
167
|
+
right.netloc.lower(),
|
|
168
|
+
)
|
ksadk/version.py
ADDED
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
"""Shared runtime components bundled inside ksadk-python."""
|
|
2
|
+
|
|
3
|
+
__version__ = "0.1.0"
|
|
4
|
+
|
|
5
|
+
from ksadk_runtime_common.workspace_files.bootstrap import (
|
|
6
|
+
build_workspace_files_bootstrap,
|
|
7
|
+
workspace_files_enabled,
|
|
8
|
+
workspace_files_max_upload_bytes,
|
|
9
|
+
workspace_files_root_label,
|
|
10
|
+
)
|
|
11
|
+
from ksadk_runtime_common.workspace_files.router import create_workspace_files_router
|
|
12
|
+
|
|
13
|
+
__all__ = [
|
|
14
|
+
"__version__",
|
|
15
|
+
"create_workspace_files_router",
|
|
16
|
+
"build_workspace_files_bootstrap",
|
|
17
|
+
"workspace_files_enabled",
|
|
18
|
+
"workspace_files_root_label",
|
|
19
|
+
"workspace_files_max_upload_bytes",
|
|
20
|
+
]
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
"""Memory backend manifest parsing and config rendering helpers."""
|
|
2
|
+
|
|
3
|
+
from ksadk_runtime_common.memory_backend.manifest import (
|
|
4
|
+
MemoryBackendManifest,
|
|
5
|
+
parse_manifest,
|
|
6
|
+
)
|
|
7
|
+
from ksadk_runtime_common.memory_backend.registry import (
|
|
8
|
+
RenderResult,
|
|
9
|
+
get_provider,
|
|
10
|
+
list_providers,
|
|
11
|
+
register_provider,
|
|
12
|
+
)
|
|
13
|
+
from ksadk_runtime_common.memory_backend.render import (
|
|
14
|
+
MANIFEST_ENV_VAR,
|
|
15
|
+
render_memory_backend_config,
|
|
16
|
+
render_to_json,
|
|
17
|
+
)
|
|
18
|
+
|
|
19
|
+
__all__ = [
|
|
20
|
+
"MemoryBackendManifest",
|
|
21
|
+
"parse_manifest",
|
|
22
|
+
"render_memory_backend_config",
|
|
23
|
+
"render_to_json",
|
|
24
|
+
"MANIFEST_ENV_VAR",
|
|
25
|
+
"RenderResult",
|
|
26
|
+
"register_provider",
|
|
27
|
+
"get_provider",
|
|
28
|
+
"list_providers",
|
|
29
|
+
]
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
"""Memory backend manifest model validated against the bundled JSON Schema."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
import json
|
|
6
|
+
from collections.abc import Mapping
|
|
7
|
+
from functools import lru_cache
|
|
8
|
+
from pathlib import Path
|
|
9
|
+
from typing import Any, Literal
|
|
10
|
+
|
|
11
|
+
from jsonschema import Draft202012Validator
|
|
12
|
+
from jsonschema import ValidationError as JsonSchemaValidationError
|
|
13
|
+
from pydantic import BaseModel, Field
|
|
14
|
+
|
|
15
|
+
_SCHEMA_PATH = Path(__file__).parent.parent / "schemas" / "memory_backend_manifest.schema.json"
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
class MemoryBackendManifest(BaseModel):
|
|
19
|
+
"""Memory backend manifest for OpenClaw runtime."""
|
|
20
|
+
|
|
21
|
+
schema_version: Literal["v1"] = "v1"
|
|
22
|
+
backend_type: Literal["openclaw_default", "mem0", "lancedb"]
|
|
23
|
+
config: dict[str, Any] = Field(default_factory=dict)
|
|
24
|
+
secrets_env: dict[str, str] = Field(default_factory=dict)
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
@lru_cache(maxsize=1)
|
|
28
|
+
def _schema_validator() -> Draft202012Validator:
|
|
29
|
+
"""Build and cache the canonical JSON Schema validator."""
|
|
30
|
+
schema = json.loads(_SCHEMA_PATH.read_text(encoding="utf-8"))
|
|
31
|
+
Draft202012Validator.check_schema(schema)
|
|
32
|
+
return Draft202012Validator(
|
|
33
|
+
schema,
|
|
34
|
+
format_checker=Draft202012Validator.FORMAT_CHECKER,
|
|
35
|
+
)
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
def _format_schema_error(error: JsonSchemaValidationError) -> str:
|
|
39
|
+
"""Format schema validation errors with a stable dotted path."""
|
|
40
|
+
location = ".".join(str(part) for part in error.absolute_path) or "<root>"
|
|
41
|
+
return f"Invalid manifest at '{location}': {error.message}"
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
def _validate_against_schema(data: object) -> dict[str, Any]:
|
|
45
|
+
"""Validate a raw manifest payload against the bundled JSON Schema."""
|
|
46
|
+
errors = sorted(
|
|
47
|
+
_schema_validator().iter_errors(data),
|
|
48
|
+
key=lambda error: error.json_path,
|
|
49
|
+
)
|
|
50
|
+
if errors:
|
|
51
|
+
first_error = errors[0]
|
|
52
|
+
raise ValueError(_format_schema_error(first_error)) from first_error
|
|
53
|
+
if not isinstance(data, Mapping):
|
|
54
|
+
raise ValueError("Invalid manifest at '<root>': manifest must be an object")
|
|
55
|
+
return dict(data)
|
|
56
|
+
|
|
57
|
+
|
|
58
|
+
def parse_manifest(
|
|
59
|
+
raw: MemoryBackendManifest | str | Mapping[str, Any] | None,
|
|
60
|
+
) -> MemoryBackendManifest | None:
|
|
61
|
+
"""Parse a memory backend manifest from model, JSON string, or mapping."""
|
|
62
|
+
if raw is None:
|
|
63
|
+
return None
|
|
64
|
+
|
|
65
|
+
if isinstance(raw, MemoryBackendManifest):
|
|
66
|
+
data: object = raw.model_dump(mode="python")
|
|
67
|
+
elif isinstance(raw, str):
|
|
68
|
+
raw = raw.strip()
|
|
69
|
+
if not raw:
|
|
70
|
+
return None
|
|
71
|
+
try:
|
|
72
|
+
data = json.loads(raw)
|
|
73
|
+
except json.JSONDecodeError as e:
|
|
74
|
+
raise ValueError(f"Invalid JSON: {e}") from e
|
|
75
|
+
else:
|
|
76
|
+
data = dict(raw)
|
|
77
|
+
|
|
78
|
+
validated = _validate_against_schema(data)
|
|
79
|
+
return MemoryBackendManifest.model_validate(validated)
|
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
"""LanceDB memory backend provider."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
from typing import Any
|
|
6
|
+
|
|
7
|
+
from ksadk_runtime_common.memory_backend.manifest import MemoryBackendManifest
|
|
8
|
+
from ksadk_runtime_common.memory_backend.registry import RenderResult
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
class LanceDBProvider:
|
|
12
|
+
"""Provider for the in-process LanceDB OpenClaw memory plugin."""
|
|
13
|
+
|
|
14
|
+
def render(self, manifest: MemoryBackendManifest) -> RenderResult:
|
|
15
|
+
"""Render LanceDB plugin config for OpenClaw.
|
|
16
|
+
|
|
17
|
+
Maps the platform manifest config fields onto the memory-lancedb
|
|
18
|
+
plugin schema. This must stay in sync with the inline renderer in
|
|
19
|
+
``deploy/openclaw/bootstrap.sh`` so both code paths produce the same
|
|
20
|
+
plugin entry.
|
|
21
|
+
"""
|
|
22
|
+
entry: dict[str, Any] = {"enabled": True}
|
|
23
|
+
config = self._render_plugin_config(manifest.config or {})
|
|
24
|
+
if config:
|
|
25
|
+
entry["config"] = config
|
|
26
|
+
|
|
27
|
+
return RenderResult(
|
|
28
|
+
backend_type="lancedb",
|
|
29
|
+
config_patch={
|
|
30
|
+
"plugins": {
|
|
31
|
+
"slots": {
|
|
32
|
+
"memory": "memory-lancedb",
|
|
33
|
+
},
|
|
34
|
+
"entries": {
|
|
35
|
+
"memory-lancedb": entry,
|
|
36
|
+
},
|
|
37
|
+
},
|
|
38
|
+
},
|
|
39
|
+
plugin_ids=["memory-lancedb"],
|
|
40
|
+
disabled_plugin_ids=["openclaw-mem0"],
|
|
41
|
+
)
|
|
42
|
+
|
|
43
|
+
@staticmethod
|
|
44
|
+
def _first(config: dict[str, Any], *keys: str) -> Any:
|
|
45
|
+
for key in keys:
|
|
46
|
+
value = config.get(key)
|
|
47
|
+
if isinstance(value, str):
|
|
48
|
+
value = value.strip()
|
|
49
|
+
if value:
|
|
50
|
+
return value
|
|
51
|
+
elif value is not None:
|
|
52
|
+
return value
|
|
53
|
+
return None
|
|
54
|
+
|
|
55
|
+
@classmethod
|
|
56
|
+
def _render_plugin_config(cls, config: dict[str, Any]) -> dict[str, Any]:
|
|
57
|
+
if not config:
|
|
58
|
+
return {}
|
|
59
|
+
|
|
60
|
+
output: dict[str, Any] = {}
|
|
61
|
+
|
|
62
|
+
embedding: dict[str, Any] = {}
|
|
63
|
+
for target_key, *source_keys in (
|
|
64
|
+
("provider", "provider", "embedding_provider"),
|
|
65
|
+
("model", "model", "embedding_model"),
|
|
66
|
+
("apiKey", "apiKey", "api_key", "embedding_api_key"),
|
|
67
|
+
("baseUrl", "baseUrl", "base_url", "embedding_base_url"),
|
|
68
|
+
):
|
|
69
|
+
value = cls._first(config, *source_keys)
|
|
70
|
+
if value is not None:
|
|
71
|
+
embedding[target_key] = value
|
|
72
|
+
dimensions = cls._first(
|
|
73
|
+
config, "dimensions", "embedding_dimensions"
|
|
74
|
+
)
|
|
75
|
+
if isinstance(dimensions, int) or (
|
|
76
|
+
isinstance(dimensions, str) and dimensions.strip().isdigit()
|
|
77
|
+
):
|
|
78
|
+
embedding["dimensions"] = int(dimensions)
|
|
79
|
+
if embedding:
|
|
80
|
+
output["embedding"] = embedding
|
|
81
|
+
|
|
82
|
+
db_path = cls._first(
|
|
83
|
+
config, "dbPath", "db_path", "data_path",
|
|
84
|
+
"database_uri", "databaseUri", "database_url",
|
|
85
|
+
)
|
|
86
|
+
if db_path is not None:
|
|
87
|
+
output["dbPath"] = db_path
|
|
88
|
+
|
|
89
|
+
for target_key, *source_keys in (
|
|
90
|
+
("autoCapture", "autoCapture", "auto_capture"),
|
|
91
|
+
("autoRecall", "autoRecall", "auto_recall"),
|
|
92
|
+
):
|
|
93
|
+
value = cls._first(config, *source_keys)
|
|
94
|
+
if isinstance(value, bool):
|
|
95
|
+
output[target_key] = value
|
|
96
|
+
elif isinstance(value, str):
|
|
97
|
+
normalized = value.strip().lower()
|
|
98
|
+
if normalized in {"1", "true", "yes", "on"}:
|
|
99
|
+
output[target_key] = True
|
|
100
|
+
elif normalized in {"0", "false", "no", "off"}:
|
|
101
|
+
output[target_key] = False
|
|
102
|
+
|
|
103
|
+
for target_key, *source_keys in (
|
|
104
|
+
("captureMaxChars", "captureMaxChars", "capture_max_chars"),
|
|
105
|
+
("recallMaxChars", "recallMaxChars", "recall_max_chars"),
|
|
106
|
+
):
|
|
107
|
+
value = cls._first(config, *source_keys)
|
|
108
|
+
if isinstance(value, int) and not isinstance(value, bool):
|
|
109
|
+
output[target_key] = value
|
|
110
|
+
elif isinstance(value, str) and value.strip().lstrip("-").isdigit():
|
|
111
|
+
output[target_key] = int(value)
|
|
112
|
+
|
|
113
|
+
custom_triggers = config.get("customTriggers", config.get("custom_triggers"))
|
|
114
|
+
if isinstance(custom_triggers, list):
|
|
115
|
+
output["customTriggers"] = custom_triggers
|
|
116
|
+
|
|
117
|
+
for target_key, *source_keys in (
|
|
118
|
+
("dreaming", "dreaming"),
|
|
119
|
+
("storageOptions", "storageOptions", "storage_options"),
|
|
120
|
+
):
|
|
121
|
+
value = cls._first(config, *source_keys)
|
|
122
|
+
if isinstance(value, dict):
|
|
123
|
+
output[target_key] = value
|
|
124
|
+
|
|
125
|
+
storage_options = output.get("storageOptions")
|
|
126
|
+
if not isinstance(storage_options, dict):
|
|
127
|
+
storage_options = {}
|
|
128
|
+
for target_key, *source_keys in (
|
|
129
|
+
("endpoint", "storage_endpoint", "storageEndpoint"),
|
|
130
|
+
("region", "storage_region", "storageRegion"),
|
|
131
|
+
("bucket", "storage_bucket", "storageBucket"),
|
|
132
|
+
("prefix", "storage_prefix", "storagePrefix"),
|
|
133
|
+
("accessKeyId", "storage_access_key_id", "storageAccessKeyId"),
|
|
134
|
+
("secretAccessKey", "storage_secret_access_key", "storageSecretAccessKey"),
|
|
135
|
+
):
|
|
136
|
+
value = cls._first(config, *source_keys)
|
|
137
|
+
if value is not None:
|
|
138
|
+
storage_options[target_key] = value
|
|
139
|
+
allow_http = cls._first(config, "storage_allow_http", "storageAllowHttp")
|
|
140
|
+
if isinstance(allow_http, bool):
|
|
141
|
+
storage_options["allowHttp"] = "true" if allow_http else "false"
|
|
142
|
+
elif isinstance(allow_http, str):
|
|
143
|
+
normalized = allow_http.strip().lower()
|
|
144
|
+
if normalized in {"1", "true", "yes", "on"}:
|
|
145
|
+
storage_options["allowHttp"] = "true"
|
|
146
|
+
elif normalized in {"0", "false", "no", "off"}:
|
|
147
|
+
storage_options["allowHttp"] = "false"
|
|
148
|
+
if storage_options:
|
|
149
|
+
output["storageOptions"] = storage_options
|
|
150
|
+
|
|
151
|
+
return output
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
"""Mem0 memory backend provider."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
import os
|
|
6
|
+
from typing import Any
|
|
7
|
+
|
|
8
|
+
from ksadk_runtime_common.memory_backend.manifest import MemoryBackendManifest
|
|
9
|
+
from ksadk_runtime_common.memory_backend.registry import RenderResult
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
def _resolve_env_name(secrets_env: dict[str, str], key: str, default: str) -> str:
|
|
13
|
+
"""Resolve an env var name from secrets_env, falling back to a default."""
|
|
14
|
+
return str(secrets_env.get(key) or default).strip() or default
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
def _require_env(name: str) -> None:
|
|
18
|
+
"""Require a non-empty environment variable in the current process."""
|
|
19
|
+
if not str(os.getenv(name) or "").strip():
|
|
20
|
+
raise ValueError(f"mem0 backend requires environment variable '{name}'")
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
def _require_env_value(name: str) -> str:
|
|
24
|
+
"""Return a required env var value after validating it is non-empty."""
|
|
25
|
+
_require_env(name)
|
|
26
|
+
return str(os.getenv(name) or "").strip()
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
class Mem0Provider:
|
|
30
|
+
"""Provider for the mem0 memory backend."""
|
|
31
|
+
|
|
32
|
+
def render(self, manifest: MemoryBackendManifest) -> RenderResult:
|
|
33
|
+
"""Render mem0 config for OpenClaw."""
|
|
34
|
+
config = manifest.config
|
|
35
|
+
secrets_env = manifest.secrets_env
|
|
36
|
+
|
|
37
|
+
mem0_instance_id = config.get("mem0_instance_id")
|
|
38
|
+
if not mem0_instance_id:
|
|
39
|
+
raise ValueError("mem0 backend requires 'mem0_instance_id' in config")
|
|
40
|
+
|
|
41
|
+
api_key_env = _resolve_env_name(secrets_env, "api_key", "MEM0_API_KEY")
|
|
42
|
+
user_id_env = _resolve_env_name(secrets_env, "user_id", "MEM0_USER_ID")
|
|
43
|
+
base_url_env = _resolve_env_name(secrets_env, "base_url", "MEM0_BASE_URL")
|
|
44
|
+
|
|
45
|
+
required_env = [api_key_env, user_id_env, base_url_env]
|
|
46
|
+
api_key = _require_env_value(api_key_env)
|
|
47
|
+
user_id = _require_env_value(user_id_env)
|
|
48
|
+
base_url = _require_env_value(base_url_env)
|
|
49
|
+
|
|
50
|
+
config_patch: dict[str, Any] = {
|
|
51
|
+
"plugins": {
|
|
52
|
+
"slots": {
|
|
53
|
+
"memory": "openclaw-mem0",
|
|
54
|
+
},
|
|
55
|
+
"entries": {
|
|
56
|
+
"openclaw-mem0": {
|
|
57
|
+
"enabled": True,
|
|
58
|
+
"config": {
|
|
59
|
+
"mode": "platform",
|
|
60
|
+
"apiKey": api_key,
|
|
61
|
+
"baseUrl": base_url,
|
|
62
|
+
"userId": user_id,
|
|
63
|
+
},
|
|
64
|
+
},
|
|
65
|
+
},
|
|
66
|
+
},
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
return RenderResult(
|
|
70
|
+
backend_type="mem0",
|
|
71
|
+
config_patch=config_patch,
|
|
72
|
+
required_env=required_env,
|
|
73
|
+
plugin_ids=["openclaw-mem0"],
|
|
74
|
+
)
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
"""Memory backend provider registry."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
from typing import Any, Protocol
|
|
6
|
+
|
|
7
|
+
from pydantic import BaseModel, Field
|
|
8
|
+
|
|
9
|
+
from ksadk_runtime_common.memory_backend.manifest import MemoryBackendManifest
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
class RenderResult(BaseModel):
|
|
13
|
+
"""Result from rendering a memory backend config."""
|
|
14
|
+
|
|
15
|
+
backend_type: str
|
|
16
|
+
config_patch: dict[str, Any] = Field(default_factory=dict)
|
|
17
|
+
required_env: list[str] = Field(default_factory=list)
|
|
18
|
+
plugin_ids: list[str] = Field(default_factory=list)
|
|
19
|
+
disabled_plugin_ids: list[str] = Field(default_factory=list)
|
|
20
|
+
clear_plugin_slots: list[str] = Field(default_factory=list)
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
class ProviderProtocol(Protocol):
|
|
24
|
+
"""Protocol for memory backend providers."""
|
|
25
|
+
|
|
26
|
+
def render(self, manifest: MemoryBackendManifest) -> RenderResult: ...
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
_PROVIDERS: dict[str, ProviderProtocol] = {}
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
def register_provider(backend_type: str, provider: ProviderProtocol) -> None:
|
|
33
|
+
"""Register a memory backend provider."""
|
|
34
|
+
_PROVIDERS[backend_type] = provider
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
def get_provider(backend_type: str) -> ProviderProtocol | None:
|
|
38
|
+
"""Get a registered provider by backend type."""
|
|
39
|
+
return _PROVIDERS.get(backend_type)
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
def list_providers() -> list[str]:
|
|
43
|
+
"""List registered backend type identifiers."""
|
|
44
|
+
return list(_PROVIDERS.keys())
|
|
45
|
+
|
|
46
|
+
|
|
47
|
+
def _register_builtin_providers() -> None:
|
|
48
|
+
"""Register providers shipped in this repo copy."""
|
|
49
|
+
from ksadk_runtime_common.memory_backend.providers.mem0 import Mem0Provider
|
|
50
|
+
from ksadk_runtime_common.memory_backend.providers.lancedb import LanceDBProvider
|
|
51
|
+
|
|
52
|
+
register_provider("mem0", Mem0Provider())
|
|
53
|
+
register_provider("lancedb", LanceDBProvider())
|
|
54
|
+
|
|
55
|
+
|
|
56
|
+
_register_builtin_providers()
|