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,297 @@
|
|
|
1
|
+
"""KnowledgeBaseClient - 金山云知识库检索客户端
|
|
2
|
+
|
|
3
|
+
封装 AICP RetrieveKnowledge API,通过 kingsoftcloud SDK 调用。
|
|
4
|
+
支持从环境变量自动配置,由各框架 Runner 自动集成。
|
|
5
|
+
|
|
6
|
+
环境变量:
|
|
7
|
+
KSADK_KB_DATASET_ID: 知识库 ID (必填,存在即启用)
|
|
8
|
+
KSADK_KB_ACCESS_KEY: AK (可选,默认取 KSYUN_ACCESS_KEY)
|
|
9
|
+
KSADK_KB_SECRET_KEY: SK (可选,默认取 KSYUN_SECRET_KEY)
|
|
10
|
+
KSADK_KB_REGION: 区域 (默认 cn-beijing-6)
|
|
11
|
+
KSADK_KB_ENDPOINT: API 端点 (默认 aicp.api.ksyun.com)
|
|
12
|
+
KSADK_KB_TOP_K: 返回结果数 (默认 5)
|
|
13
|
+
KSADK_KB_SEARCH_METHOD: 检索方法 (默认 intelligence_search)
|
|
14
|
+
KSADK_KB_SCORE_THRESHOLD: 分数阈值 (可选)
|
|
15
|
+
KSADK_KB_RERANKING_ENABLE: 是否启用重排序 (默认 false)
|
|
16
|
+
|
|
17
|
+
使用示例:
|
|
18
|
+
# 自动从环境变量配置 (推荐)
|
|
19
|
+
client = KnowledgeBaseClient.from_env()
|
|
20
|
+
results = client.search("如何使用知识库?")
|
|
21
|
+
|
|
22
|
+
# 手动创建
|
|
23
|
+
client = KnowledgeBaseClient(
|
|
24
|
+
dataset_id="your-kb-id",
|
|
25
|
+
access_key="ak",
|
|
26
|
+
secret_key="sk",
|
|
27
|
+
)
|
|
28
|
+
"""
|
|
29
|
+
|
|
30
|
+
import json
|
|
31
|
+
import logging
|
|
32
|
+
import os
|
|
33
|
+
from typing import Any, List, Optional
|
|
34
|
+
|
|
35
|
+
from pydantic import BaseModel, ConfigDict
|
|
36
|
+
|
|
37
|
+
from ksadk.common.aicp_env import resolve_aicp_connection
|
|
38
|
+
|
|
39
|
+
logger = logging.getLogger(__name__)
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
class KnowledgeBaseResult(BaseModel):
|
|
43
|
+
"""单条知识库检索结果"""
|
|
44
|
+
|
|
45
|
+
content: str = ""
|
|
46
|
+
score: float = 0.0
|
|
47
|
+
segment_id: str = ""
|
|
48
|
+
document_id: str = ""
|
|
49
|
+
document_name: str = ""
|
|
50
|
+
position: int = 0
|
|
51
|
+
answer: str = ""
|
|
52
|
+
keywords: List[str] = []
|
|
53
|
+
|
|
54
|
+
|
|
55
|
+
class KnowledgeBaseClient(BaseModel):
|
|
56
|
+
"""金山云知识库检索客户端
|
|
57
|
+
|
|
58
|
+
Attributes:
|
|
59
|
+
dataset_id: 知识库 ID (DatasetId)
|
|
60
|
+
access_key: 访问密钥 ID (AK)
|
|
61
|
+
secret_key: 访问密钥 (SK)
|
|
62
|
+
region: API 区域
|
|
63
|
+
endpoint: API 端点
|
|
64
|
+
top_k: 返回结果数
|
|
65
|
+
search_method: 检索方法
|
|
66
|
+
score_threshold: 分数阈值
|
|
67
|
+
score_threshold_enabled: 是否启用阈值过滤
|
|
68
|
+
reranking_enable: 是否启用重排序
|
|
69
|
+
"""
|
|
70
|
+
|
|
71
|
+
dataset_id: str
|
|
72
|
+
access_key: str = ""
|
|
73
|
+
secret_key: str = ""
|
|
74
|
+
region: str = "cn-beijing-6"
|
|
75
|
+
endpoint: str = "aicp.api.ksyun.com"
|
|
76
|
+
scheme: str = "https"
|
|
77
|
+
top_k: int = 5
|
|
78
|
+
search_method: str = "intelligence_search"
|
|
79
|
+
score_threshold: float = 0.0
|
|
80
|
+
score_threshold_enabled: bool = False
|
|
81
|
+
reranking_enable: bool = False
|
|
82
|
+
|
|
83
|
+
_aicp_client: Any = None
|
|
84
|
+
|
|
85
|
+
model_config = ConfigDict(arbitrary_types_allowed=True)
|
|
86
|
+
|
|
87
|
+
def model_post_init(self, __context: Any) -> None:
|
|
88
|
+
if not self.dataset_id:
|
|
89
|
+
raise ValueError("dataset_id is required for KnowledgeBaseClient")
|
|
90
|
+
|
|
91
|
+
if not self.access_key or not self.secret_key:
|
|
92
|
+
logger.warning(
|
|
93
|
+
"KnowledgeBaseClient: AK/SK not provided, "
|
|
94
|
+
"API calls will fail. Set KSADK_KB_ACCESS_KEY/KSADK_KB_SECRET_KEY "
|
|
95
|
+
"or KSYUN_ACCESS_KEY/KSYUN_SECRET_KEY."
|
|
96
|
+
)
|
|
97
|
+
|
|
98
|
+
def _get_client(self):
|
|
99
|
+
"""懒加载 AICP 客户端"""
|
|
100
|
+
if self._aicp_client is not None:
|
|
101
|
+
return self._aicp_client
|
|
102
|
+
|
|
103
|
+
try:
|
|
104
|
+
from ksyun.common import credential
|
|
105
|
+
from ksyun.common.profile.client_profile import ClientProfile
|
|
106
|
+
from ksyun.common.profile.http_profile import HttpProfile
|
|
107
|
+
except ImportError:
|
|
108
|
+
raise ImportError(
|
|
109
|
+
"kingsoftcloud-sdk-python is required for knowledge base. "
|
|
110
|
+
"Install it with: pip install kingsoftcloud-sdk-python"
|
|
111
|
+
)
|
|
112
|
+
|
|
113
|
+
# 尝试导入 aicp client (多版本 fallback)
|
|
114
|
+
aicp_module = None
|
|
115
|
+
for version in ["v20251114", "v20251212", "v20240612"]:
|
|
116
|
+
try:
|
|
117
|
+
aicp_module = __import__(
|
|
118
|
+
f"ksyun.client.aicp.{version}.client",
|
|
119
|
+
fromlist=["AicpClient"],
|
|
120
|
+
)
|
|
121
|
+
logger.debug(f"Using aicp client version: {version}")
|
|
122
|
+
break
|
|
123
|
+
except ImportError:
|
|
124
|
+
continue
|
|
125
|
+
|
|
126
|
+
if aicp_module is None:
|
|
127
|
+
raise ImportError(
|
|
128
|
+
"Cannot import ksyun.client.aicp client. "
|
|
129
|
+
"Ensure kingsoftcloud-sdk-python is installed and up to date."
|
|
130
|
+
)
|
|
131
|
+
|
|
132
|
+
cred = credential.Credential(self.access_key, self.secret_key)
|
|
133
|
+
|
|
134
|
+
http_profile = HttpProfile()
|
|
135
|
+
http_profile.endpoint = self.endpoint
|
|
136
|
+
http_profile.reqMethod = "POST"
|
|
137
|
+
http_profile.reqTimeout = 60
|
|
138
|
+
http_profile.scheme = self.scheme
|
|
139
|
+
|
|
140
|
+
client_profile = ClientProfile()
|
|
141
|
+
client_profile.httpProfile = http_profile
|
|
142
|
+
|
|
143
|
+
self._aicp_client = aicp_module.AicpClient(
|
|
144
|
+
cred, self.region, profile=client_profile
|
|
145
|
+
)
|
|
146
|
+
|
|
147
|
+
# 强制覆写 API 版本为 RetrieveKnowledge 所需的 2025-11-14
|
|
148
|
+
# SDK 的 _apiVersion 由导入的模块版本决定,可能不匹配
|
|
149
|
+
self._aicp_client._apiVersion = "2025-11-14"
|
|
150
|
+
|
|
151
|
+
logger.info(
|
|
152
|
+
f"KnowledgeBaseClient initialized: "
|
|
153
|
+
f"dataset_id={self.dataset_id}, region={self.region}, "
|
|
154
|
+
f"endpoint={self.endpoint}"
|
|
155
|
+
)
|
|
156
|
+
return self._aicp_client
|
|
157
|
+
|
|
158
|
+
def _build_params(self, query: str, top_k: Optional[int] = None) -> dict:
|
|
159
|
+
"""构建 RetrieveKnowledge 请求参数 (JSON 嵌套格式)"""
|
|
160
|
+
effective_top_k = top_k if top_k is not None else self.top_k
|
|
161
|
+
|
|
162
|
+
params = {
|
|
163
|
+
"DatasetId": self.dataset_id,
|
|
164
|
+
"Query": query,
|
|
165
|
+
"RetrievalModel": {
|
|
166
|
+
"SearchMethod": self.search_method,
|
|
167
|
+
"TopK": effective_top_k,
|
|
168
|
+
"RerankingEnable": self.reranking_enable,
|
|
169
|
+
},
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
if self.score_threshold_enabled:
|
|
173
|
+
params["RetrievalModel"]["ScoreThresholdEnabled"] = True
|
|
174
|
+
params["RetrievalModel"]["ScoreThreshold"] = self.score_threshold
|
|
175
|
+
|
|
176
|
+
return params
|
|
177
|
+
|
|
178
|
+
def _parse_response(self, response: str) -> List[KnowledgeBaseResult]:
|
|
179
|
+
"""解析 RetrieveKnowledge 响应"""
|
|
180
|
+
try:
|
|
181
|
+
data = json.loads(response) if isinstance(response, str) else response
|
|
182
|
+
except (json.JSONDecodeError, TypeError):
|
|
183
|
+
logger.error(f"Failed to parse response: {str(response)[:200]}")
|
|
184
|
+
return []
|
|
185
|
+
|
|
186
|
+
records = data.get("Records", [])
|
|
187
|
+
results = []
|
|
188
|
+
|
|
189
|
+
for record in records:
|
|
190
|
+
segment = record.get("Segment", {})
|
|
191
|
+
document = segment.get("Document", {})
|
|
192
|
+
|
|
193
|
+
results.append(
|
|
194
|
+
KnowledgeBaseResult(
|
|
195
|
+
content=segment.get("Content", ""),
|
|
196
|
+
score=record.get("Score", 0.0),
|
|
197
|
+
segment_id=segment.get("Id", ""),
|
|
198
|
+
document_id=segment.get("DocumentId", ""),
|
|
199
|
+
document_name=document.get("Name", ""),
|
|
200
|
+
position=segment.get("Position", 0),
|
|
201
|
+
answer=segment.get("Answer", ""),
|
|
202
|
+
keywords=segment.get("Keywords", []),
|
|
203
|
+
)
|
|
204
|
+
)
|
|
205
|
+
|
|
206
|
+
return results
|
|
207
|
+
|
|
208
|
+
def search(
|
|
209
|
+
self, query: str, top_k: Optional[int] = None
|
|
210
|
+
) -> List[KnowledgeBaseResult]:
|
|
211
|
+
"""检索知识库
|
|
212
|
+
|
|
213
|
+
Args:
|
|
214
|
+
query: 检索关键词
|
|
215
|
+
top_k: 返回结果数 (覆盖默认值)
|
|
216
|
+
|
|
217
|
+
Returns:
|
|
218
|
+
匹配的文档片段列表
|
|
219
|
+
"""
|
|
220
|
+
client = self._get_client()
|
|
221
|
+
params = self._build_params(query, top_k)
|
|
222
|
+
|
|
223
|
+
logger.info(
|
|
224
|
+
f"Searching knowledge base: dataset_id={self.dataset_id}, "
|
|
225
|
+
f"query='{query[:50]}'"
|
|
226
|
+
)
|
|
227
|
+
|
|
228
|
+
try:
|
|
229
|
+
response = client.call(
|
|
230
|
+
"RetrieveKnowledge", params, options={"IsPostJson": True}
|
|
231
|
+
)
|
|
232
|
+
results = self._parse_response(response)
|
|
233
|
+
logger.info(
|
|
234
|
+
f"Knowledge base returned {len(results)} results "
|
|
235
|
+
f"for query='{query[:50]}'"
|
|
236
|
+
)
|
|
237
|
+
return results
|
|
238
|
+
except Exception as e:
|
|
239
|
+
logger.error(f"Knowledge base search failed: {e}")
|
|
240
|
+
raise
|
|
241
|
+
|
|
242
|
+
@classmethod
|
|
243
|
+
def from_env(cls) -> "KnowledgeBaseClient":
|
|
244
|
+
"""从环境变量创建 KnowledgeBaseClient
|
|
245
|
+
|
|
246
|
+
Returns:
|
|
247
|
+
KnowledgeBaseClient 实例
|
|
248
|
+
|
|
249
|
+
Raises:
|
|
250
|
+
ValueError: 如果 KSADK_KB_DATASET_ID 未设置
|
|
251
|
+
"""
|
|
252
|
+
dataset_id = os.environ.get("KSADK_KB_DATASET_ID", "")
|
|
253
|
+
if not dataset_id:
|
|
254
|
+
raise ValueError(
|
|
255
|
+
"KSADK_KB_DATASET_ID environment variable is required "
|
|
256
|
+
"to enable knowledge base."
|
|
257
|
+
)
|
|
258
|
+
|
|
259
|
+
access_key = (
|
|
260
|
+
os.environ.get("KSADK_KB_ACCESS_KEY")
|
|
261
|
+
or os.environ.get("KSYUN_ACCESS_KEY")
|
|
262
|
+
or os.environ.get("KSYUN_SECRET_ID", "")
|
|
263
|
+
)
|
|
264
|
+
secret_key = (
|
|
265
|
+
os.environ.get("KSADK_KB_SECRET_KEY")
|
|
266
|
+
or os.environ.get("KSYUN_SECRET_KEY")
|
|
267
|
+
or os.environ.get("KSYUN_SECRET_KEY", "")
|
|
268
|
+
)
|
|
269
|
+
|
|
270
|
+
score_threshold_str = os.environ.get("KSADK_KB_SCORE_THRESHOLD", "")
|
|
271
|
+
score_threshold = float(score_threshold_str) if score_threshold_str else 0.0
|
|
272
|
+
score_threshold_enabled = bool(score_threshold_str)
|
|
273
|
+
|
|
274
|
+
reranking_str = os.environ.get("KSADK_KB_RERANKING_ENABLE", "false")
|
|
275
|
+
reranking_enable = reranking_str.lower() in ("true", "1", "yes")
|
|
276
|
+
connection = resolve_aicp_connection("KSADK_KB")
|
|
277
|
+
|
|
278
|
+
return cls(
|
|
279
|
+
dataset_id=dataset_id,
|
|
280
|
+
access_key=access_key,
|
|
281
|
+
secret_key=secret_key,
|
|
282
|
+
region=connection["region"],
|
|
283
|
+
endpoint=connection["endpoint"],
|
|
284
|
+
scheme=connection["scheme"],
|
|
285
|
+
top_k=int(os.environ.get("KSADK_KB_TOP_K", "5")),
|
|
286
|
+
search_method=os.environ.get(
|
|
287
|
+
"KSADK_KB_SEARCH_METHOD", "intelligence_search"
|
|
288
|
+
),
|
|
289
|
+
score_threshold=score_threshold,
|
|
290
|
+
score_threshold_enabled=score_threshold_enabled,
|
|
291
|
+
reranking_enable=reranking_enable,
|
|
292
|
+
)
|
|
293
|
+
|
|
294
|
+
@staticmethod
|
|
295
|
+
def is_configured() -> bool:
|
|
296
|
+
"""检查环境变量是否已配置知识库"""
|
|
297
|
+
return bool(os.environ.get("KSADK_KB_DATASET_ID"))
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
"""LangChain / LangGraph 知识库工具包装
|
|
2
|
+
|
|
3
|
+
将通用 search_knowledge 函数包装为 LangChain Tool。
|
|
4
|
+
用户在 LangGraph/LangChain 的 agent 中一行 import 即可使用。
|
|
5
|
+
|
|
6
|
+
使用示例:
|
|
7
|
+
from ksadk.knowledge_base.langchain_tool import search_knowledge_base
|
|
8
|
+
tools = [search_knowledge_base, ...]
|
|
9
|
+
"""
|
|
10
|
+
|
|
11
|
+
import logging
|
|
12
|
+
|
|
13
|
+
from ksadk.knowledge_base.tool import search_knowledge
|
|
14
|
+
|
|
15
|
+
logger = logging.getLogger(__name__)
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
def create_langchain_tool():
|
|
19
|
+
"""创建 LangChain Tool
|
|
20
|
+
|
|
21
|
+
Returns:
|
|
22
|
+
LangChain @tool 装饰的函数
|
|
23
|
+
"""
|
|
24
|
+
try:
|
|
25
|
+
from langchain_core.tools import tool
|
|
26
|
+
|
|
27
|
+
@tool
|
|
28
|
+
def search_knowledge_base(query: str) -> str:
|
|
29
|
+
"""搜索知识库获取相关信息。
|
|
30
|
+
|
|
31
|
+
当需要查找专业知识、文档内容或特定领域信息时使用此工具。
|
|
32
|
+
会自动从已配置的金山云知识库中检索最相关的内容。
|
|
33
|
+
|
|
34
|
+
Args:
|
|
35
|
+
query: 检索关键词或问题
|
|
36
|
+
"""
|
|
37
|
+
return search_knowledge(query)
|
|
38
|
+
|
|
39
|
+
return search_knowledge_base
|
|
40
|
+
|
|
41
|
+
except ImportError:
|
|
42
|
+
logger.warning(
|
|
43
|
+
"langchain-core not installed, returning raw function. "
|
|
44
|
+
"Install with: pip install langchain-core"
|
|
45
|
+
)
|
|
46
|
+
|
|
47
|
+
def search_knowledge_base(query: str) -> str:
|
|
48
|
+
"""搜索知识库获取相关信息"""
|
|
49
|
+
return search_knowledge(query)
|
|
50
|
+
|
|
51
|
+
return search_knowledge_base
|
|
52
|
+
|
|
53
|
+
|
|
54
|
+
# 预创建实例,方便直接 import 使用
|
|
55
|
+
search_knowledge_base = create_langchain_tool()
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
"""Platform-level knowledge base service helpers."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
import logging
|
|
6
|
+
from typing import Optional
|
|
7
|
+
|
|
8
|
+
from ksadk.knowledge_base.client import KnowledgeBaseClient, KnowledgeBaseResult
|
|
9
|
+
|
|
10
|
+
logger = logging.getLogger(__name__)
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
def format_knowledge_results(results: list[KnowledgeBaseResult]) -> str:
|
|
14
|
+
if not results:
|
|
15
|
+
return "未找到相关知识库内容。"
|
|
16
|
+
|
|
17
|
+
formatted_parts: list[str] = []
|
|
18
|
+
for i, result in enumerate(results, 1):
|
|
19
|
+
part = f"[{i}] "
|
|
20
|
+
if result.document_name:
|
|
21
|
+
part += f"(来源: {result.document_name}) "
|
|
22
|
+
part += result.content
|
|
23
|
+
if result.answer:
|
|
24
|
+
part += f"\n 答案: {result.answer}"
|
|
25
|
+
formatted_parts.append(part)
|
|
26
|
+
|
|
27
|
+
return "\n\n".join(formatted_parts)
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
class KnowledgeBaseService:
|
|
31
|
+
def __init__(self, client: KnowledgeBaseClient | None = None):
|
|
32
|
+
self._client = client
|
|
33
|
+
|
|
34
|
+
@classmethod
|
|
35
|
+
def from_env(cls) -> "KnowledgeBaseService":
|
|
36
|
+
return cls(KnowledgeBaseClient.from_env())
|
|
37
|
+
|
|
38
|
+
@staticmethod
|
|
39
|
+
def is_configured() -> bool:
|
|
40
|
+
return KnowledgeBaseClient.is_configured()
|
|
41
|
+
|
|
42
|
+
def _get_client(self) -> KnowledgeBaseClient:
|
|
43
|
+
if self._client is None:
|
|
44
|
+
self._client = KnowledgeBaseClient.from_env()
|
|
45
|
+
return self._client
|
|
46
|
+
|
|
47
|
+
def search(self, query: str, top_k: Optional[int] = None) -> list[KnowledgeBaseResult]:
|
|
48
|
+
return self._get_client().search(query, top_k)
|
|
49
|
+
|
|
50
|
+
def search_text(self, query: str, top_k: Optional[int] = None) -> str:
|
|
51
|
+
try:
|
|
52
|
+
return format_knowledge_results(self.search(query, top_k))
|
|
53
|
+
except Exception as exc:
|
|
54
|
+
logger.error("search_knowledge failed: %s", exc)
|
|
55
|
+
return f"知识库检索失败: {exc}"
|
|
56
|
+
|
|
57
|
+
def build_context(self, query: str, top_k: Optional[int] = None) -> dict[str, str] | None:
|
|
58
|
+
normalized = str(query or "").strip()
|
|
59
|
+
if not normalized:
|
|
60
|
+
return None
|
|
61
|
+
if not self.is_configured():
|
|
62
|
+
return None
|
|
63
|
+
return {
|
|
64
|
+
"query": normalized,
|
|
65
|
+
"formatted_text": self.search_text(normalized, top_k),
|
|
66
|
+
}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
"""通用知识库检索函数
|
|
2
|
+
|
|
3
|
+
提供跨框架的 search_knowledge 函数,由各框架工具包装调用。
|
|
4
|
+
客户端实例通过单例模式懒加载,自动从环境变量配置。
|
|
5
|
+
|
|
6
|
+
使用示例:
|
|
7
|
+
from ksadk.knowledge_base.tool import search_knowledge
|
|
8
|
+
result = search_knowledge("如何配置知识库?")
|
|
9
|
+
print(result)
|
|
10
|
+
"""
|
|
11
|
+
|
|
12
|
+
import logging
|
|
13
|
+
from typing import Optional
|
|
14
|
+
|
|
15
|
+
from ksadk.knowledge_base.service import KnowledgeBaseService
|
|
16
|
+
|
|
17
|
+
logger = logging.getLogger(__name__)
|
|
18
|
+
|
|
19
|
+
# 单例客户端
|
|
20
|
+
_service: Optional[KnowledgeBaseService] = None
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
def _get_or_create_service() -> KnowledgeBaseService:
|
|
24
|
+
"""获取或创建知识库 service (单例)"""
|
|
25
|
+
global _service
|
|
26
|
+
if _service is None:
|
|
27
|
+
_service = KnowledgeBaseService.from_env()
|
|
28
|
+
logger.info("KnowledgeBaseService singleton created from environment")
|
|
29
|
+
return _service
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
def search_knowledge(query: str, top_k: Optional[int] = None) -> str:
|
|
33
|
+
"""检索知识库
|
|
34
|
+
|
|
35
|
+
从环境变量自动配置的知识库中检索相关内容。
|
|
36
|
+
返回格式化的文本结果,供 LLM 参考。
|
|
37
|
+
|
|
38
|
+
Args:
|
|
39
|
+
query: 检索关键词/问题
|
|
40
|
+
top_k: 返回结果数 (可选,覆盖环境变量配置)
|
|
41
|
+
|
|
42
|
+
Returns:
|
|
43
|
+
格式化的检索结果文本
|
|
44
|
+
"""
|
|
45
|
+
try:
|
|
46
|
+
service = _get_or_create_service()
|
|
47
|
+
return service.search_text(query, top_k)
|
|
48
|
+
except Exception as e:
|
|
49
|
+
logger.error(f"search_knowledge failed: {e}")
|
|
50
|
+
return f"知识库检索失败: {e}"
|
ksadk/markdown.py
ADDED
|
@@ -0,0 +1,169 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
from typing import Any
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
_FENCE_MARKER_CHARS = ("`", "~")
|
|
7
|
+
_LIST_PREFIXES = ("- ", "* ", "+ ")
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
def repair_markdown(text: Any, *, enabled: bool = False) -> str:
|
|
11
|
+
"""尽量修复 LLM 输出中的常见 Markdown 形态问题。
|
|
12
|
+
|
|
13
|
+
这是业务侧按需调用的保守修复工具。KsADK runtime 默认保留模型原文,
|
|
14
|
+
不会自动调用这个函数。
|
|
15
|
+
"""
|
|
16
|
+
|
|
17
|
+
if text is None:
|
|
18
|
+
return ""
|
|
19
|
+
value = str(text)
|
|
20
|
+
if not enabled:
|
|
21
|
+
return value
|
|
22
|
+
if value == "":
|
|
23
|
+
return ""
|
|
24
|
+
|
|
25
|
+
normalized = value.replace("\r\n", "\n").replace("\r", "\n")
|
|
26
|
+
lines = _strip_terminal_empty_lines(normalized.split("\n"))
|
|
27
|
+
if not lines:
|
|
28
|
+
return ""
|
|
29
|
+
|
|
30
|
+
lines = _normalize_block_spacing(lines)
|
|
31
|
+
lines = _close_unclosed_fence(lines)
|
|
32
|
+
|
|
33
|
+
return "\n".join(lines) + "\n"
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
def _strip_terminal_empty_lines(lines: list[str]) -> list[str]:
|
|
37
|
+
start = 0
|
|
38
|
+
end = len(lines)
|
|
39
|
+
while start < end and lines[start] == "":
|
|
40
|
+
start += 1
|
|
41
|
+
while end > start and lines[end - 1] == "":
|
|
42
|
+
end -= 1
|
|
43
|
+
return lines[start:end]
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
def _normalize_block_spacing(lines: list[str]) -> list[str]:
|
|
47
|
+
result: list[str] = []
|
|
48
|
+
in_fence = False
|
|
49
|
+
fence_marker = ""
|
|
50
|
+
previous_block = ""
|
|
51
|
+
|
|
52
|
+
for index, line in enumerate(lines):
|
|
53
|
+
stripped = line.lstrip()
|
|
54
|
+
block = _line_block_type(line, in_fence)
|
|
55
|
+
|
|
56
|
+
if block == "fence":
|
|
57
|
+
marker = _fence_marker(stripped) or ""
|
|
58
|
+
if not in_fence:
|
|
59
|
+
_append_blank_before_block(result, previous_block)
|
|
60
|
+
in_fence = True
|
|
61
|
+
fence_marker = marker
|
|
62
|
+
elif _is_closing_fence(marker, fence_marker):
|
|
63
|
+
in_fence = False
|
|
64
|
+
fence_marker = ""
|
|
65
|
+
elif not in_fence:
|
|
66
|
+
if block in {"table", "list"}:
|
|
67
|
+
_append_blank_before_block(result, previous_block)
|
|
68
|
+
elif block == "paragraph":
|
|
69
|
+
_append_blank_after_block(result, previous_block)
|
|
70
|
+
|
|
71
|
+
result.append(line)
|
|
72
|
+
|
|
73
|
+
if line == "":
|
|
74
|
+
previous_block = ""
|
|
75
|
+
elif not in_fence or block == "fence":
|
|
76
|
+
previous_block = block
|
|
77
|
+
|
|
78
|
+
next_line = lines[index + 1] if index + 1 < len(lines) else None
|
|
79
|
+
if next_line is None or in_fence:
|
|
80
|
+
continue
|
|
81
|
+
next_block = _line_block_type(next_line, in_fence)
|
|
82
|
+
if block in {"table", "list"} and next_block == "paragraph":
|
|
83
|
+
_append_blank_once(result)
|
|
84
|
+
previous_block = ""
|
|
85
|
+
|
|
86
|
+
return result
|
|
87
|
+
|
|
88
|
+
|
|
89
|
+
def _append_blank_before_block(result: list[str], previous_block: str) -> None:
|
|
90
|
+
if not result or result[-1] == "":
|
|
91
|
+
return
|
|
92
|
+
if previous_block in {"", "table", "list", "fence"}:
|
|
93
|
+
return
|
|
94
|
+
result.append("")
|
|
95
|
+
|
|
96
|
+
|
|
97
|
+
def _append_blank_after_block(result: list[str], previous_block: str) -> None:
|
|
98
|
+
if result and result[-1] != "" and previous_block in {"list", "table", "fence"}:
|
|
99
|
+
result.append("")
|
|
100
|
+
|
|
101
|
+
|
|
102
|
+
def _append_blank_once(result: list[str]) -> None:
|
|
103
|
+
if result and result[-1] != "":
|
|
104
|
+
result.append("")
|
|
105
|
+
|
|
106
|
+
|
|
107
|
+
def _close_unclosed_fence(lines: list[str]) -> list[str]:
|
|
108
|
+
open_marker = ""
|
|
109
|
+
for line in lines:
|
|
110
|
+
marker = _fence_marker(line.lstrip())
|
|
111
|
+
if marker is None:
|
|
112
|
+
continue
|
|
113
|
+
if not open_marker:
|
|
114
|
+
open_marker = marker
|
|
115
|
+
elif _is_closing_fence(marker, open_marker):
|
|
116
|
+
open_marker = ""
|
|
117
|
+
if open_marker:
|
|
118
|
+
return [*lines, open_marker]
|
|
119
|
+
return lines
|
|
120
|
+
|
|
121
|
+
|
|
122
|
+
def _line_block_type(line: str, in_fence: bool) -> str:
|
|
123
|
+
if line == "":
|
|
124
|
+
return ""
|
|
125
|
+
stripped = line.lstrip()
|
|
126
|
+
if _fence_marker(stripped):
|
|
127
|
+
return "fence"
|
|
128
|
+
if in_fence:
|
|
129
|
+
return "code"
|
|
130
|
+
if _is_table_line(stripped):
|
|
131
|
+
return "table"
|
|
132
|
+
if _is_list_line(stripped):
|
|
133
|
+
return "list"
|
|
134
|
+
return "paragraph"
|
|
135
|
+
|
|
136
|
+
|
|
137
|
+
def _fence_marker(stripped_line: str) -> str | None:
|
|
138
|
+
for char in _FENCE_MARKER_CHARS:
|
|
139
|
+
if not stripped_line.startswith(char * 3):
|
|
140
|
+
continue
|
|
141
|
+
length = 0
|
|
142
|
+
for value in stripped_line:
|
|
143
|
+
if value != char:
|
|
144
|
+
break
|
|
145
|
+
length += 1
|
|
146
|
+
return char * length
|
|
147
|
+
return None
|
|
148
|
+
|
|
149
|
+
|
|
150
|
+
def _is_closing_fence(candidate: str, open_marker: str) -> bool:
|
|
151
|
+
return (
|
|
152
|
+
bool(candidate)
|
|
153
|
+
and bool(open_marker)
|
|
154
|
+
and candidate[0] == open_marker[0]
|
|
155
|
+
and len(candidate) >= len(open_marker)
|
|
156
|
+
)
|
|
157
|
+
|
|
158
|
+
|
|
159
|
+
def _is_table_line(stripped_line: str) -> bool:
|
|
160
|
+
return stripped_line.startswith("|") and stripped_line.endswith("|") and stripped_line.count("|") >= 2
|
|
161
|
+
|
|
162
|
+
|
|
163
|
+
def _is_list_line(stripped_line: str) -> bool:
|
|
164
|
+
if stripped_line.startswith(_LIST_PREFIXES):
|
|
165
|
+
return True
|
|
166
|
+
dot_index = stripped_line.find(". ")
|
|
167
|
+
if dot_index <= 0:
|
|
168
|
+
return False
|
|
169
|
+
return stripped_line[:dot_index].isdigit()
|