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,385 @@
|
|
|
1
|
+
"""从 AK/SK 反查金山云子账号身份(user uuid + 主账号 ID)。
|
|
2
|
+
|
|
3
|
+
控制面 ctx.sub_account_id 只从请求头 X-Ksc-User-uuid 取,KOP 不会根据 AK/SK 自动注入。
|
|
4
|
+
本模块用 AK/SK 调 IAM 的 ListAllUserAccessKeys + GetUser 两步反查:
|
|
5
|
+
1. ListAllUserAccessKeys(无参)返回所有子用户 AK + UserName
|
|
6
|
+
2. GetUser(UserName) 返回 User.UserId(子账号 uuid)+ User.Krn(含主账号 ID)
|
|
7
|
+
|
|
8
|
+
反查结果缓存到 ~/.agentengine/settings.json 的 cloud.IDENTITY_CACHE(按 AK 指纹索引,
|
|
9
|
+
多账号安全)。任何失败返回 None,不抛异常,调用方降级为不注入 header(退化为当前行为)。
|
|
10
|
+
"""
|
|
11
|
+
|
|
12
|
+
from __future__ import annotations
|
|
13
|
+
|
|
14
|
+
import hashlib
|
|
15
|
+
import json
|
|
16
|
+
import logging
|
|
17
|
+
import os
|
|
18
|
+
import re
|
|
19
|
+
from dataclasses import dataclass
|
|
20
|
+
from datetime import datetime, timezone
|
|
21
|
+
from typing import Optional
|
|
22
|
+
from urllib.parse import urlparse
|
|
23
|
+
|
|
24
|
+
logger = logging.getLogger(__name__)
|
|
25
|
+
|
|
26
|
+
# krn:ksc:iam::<主账号ID>:user/<name>
|
|
27
|
+
_KRN_ACCOUNT_RE = re.compile(r"krn:ksc:iam::([^:]+):user/")
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
@dataclass(frozen=True)
|
|
31
|
+
class ResolvedIdentity:
|
|
32
|
+
"""AK/SK 反查到的身份信息。"""
|
|
33
|
+
|
|
34
|
+
user_uuid: Optional[str] # 子账号 UserId(X-Ksc-User-uuid 值);主账号 AK 时 None
|
|
35
|
+
main_account_id: Optional[str] # 从 Krn 提取的主账号 ID
|
|
36
|
+
user_name: Optional[str] # 子账号 UserName(调试用)
|
|
37
|
+
krn: Optional[str] # 原始 Krn(调试用)
|
|
38
|
+
ak_fingerprint: str # sha256(AK)[:16],缓存 key
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
# ---------------------------------------------------------------------------
|
|
42
|
+
# AK 指纹 + Krn 解析
|
|
43
|
+
# ---------------------------------------------------------------------------
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
def _ak_fingerprint(access_key: str) -> str:
|
|
47
|
+
"""sha256(AK)[:16],防碰撞且不暴露明文 AK。"""
|
|
48
|
+
return hashlib.sha256(access_key.encode("utf-8")).hexdigest()[:16]
|
|
49
|
+
|
|
50
|
+
|
|
51
|
+
def _extract_main_account_id_from_krn(krn: Optional[str]) -> Optional[str]:
|
|
52
|
+
"""从 krn:ksc:iam::<主账号ID>:user/<name> 提取主账号 ID。"""
|
|
53
|
+
if not krn:
|
|
54
|
+
return None
|
|
55
|
+
match = _KRN_ACCOUNT_RE.search(krn)
|
|
56
|
+
if not match:
|
|
57
|
+
return None
|
|
58
|
+
account_id = match.group(1).strip()
|
|
59
|
+
return account_id or None
|
|
60
|
+
|
|
61
|
+
|
|
62
|
+
# ---------------------------------------------------------------------------
|
|
63
|
+
# IAM endpoint 解析
|
|
64
|
+
# ---------------------------------------------------------------------------
|
|
65
|
+
|
|
66
|
+
|
|
67
|
+
def _resolve_iam_endpoint() -> tuple[str, str]:
|
|
68
|
+
"""解析 IAM endpoint,返回 (host, scheme)。优先级:KSYUN_IAM_URL > IAM_URL > 默认。"""
|
|
69
|
+
raw = (os.getenv("KSYUN_IAM_URL") or os.getenv("IAM_URL") or "").strip()
|
|
70
|
+
if not raw:
|
|
71
|
+
return "iam.api.ksyun.com", "https"
|
|
72
|
+
if "://" not in raw:
|
|
73
|
+
raw = "https://" + raw
|
|
74
|
+
parsed = urlparse(raw)
|
|
75
|
+
host = (parsed.netloc or parsed.path or "iam.api.ksyun.com").strip()
|
|
76
|
+
scheme = (parsed.scheme or "https").strip().lower() or "https"
|
|
77
|
+
return host, scheme
|
|
78
|
+
|
|
79
|
+
|
|
80
|
+
def _resolve_iam_intranet_endpoint() -> tuple[str, str] | None:
|
|
81
|
+
"""解析显式配置的 IAM 内网 endpoint。未配置时不启用内网 fallback。"""
|
|
82
|
+
raw = (os.getenv("KSYUN_IAM_INTRANET_URL") or os.getenv("IAM_INTRANET_URL") or "").strip()
|
|
83
|
+
if not raw:
|
|
84
|
+
return None
|
|
85
|
+
if "://" not in raw:
|
|
86
|
+
raw = "http://" + raw
|
|
87
|
+
parsed = urlparse(raw)
|
|
88
|
+
host = (parsed.netloc or parsed.path or "").strip()
|
|
89
|
+
if not host:
|
|
90
|
+
return None
|
|
91
|
+
scheme = (parsed.scheme or "http").strip().lower() or "http"
|
|
92
|
+
return host, scheme
|
|
93
|
+
|
|
94
|
+
|
|
95
|
+
def _should_retry_intranet(error: Exception | None) -> bool:
|
|
96
|
+
"""判断是否应回退到内网 endpoint(内部账号只能内网访问时)。"""
|
|
97
|
+
if error is None:
|
|
98
|
+
return False
|
|
99
|
+
return "InnerAccountCanOnlyAccessThroughIntranet" in str(error)
|
|
100
|
+
|
|
101
|
+
|
|
102
|
+
# ---------------------------------------------------------------------------
|
|
103
|
+
# ksyun SDK 惰性导入
|
|
104
|
+
# ---------------------------------------------------------------------------
|
|
105
|
+
|
|
106
|
+
|
|
107
|
+
def _import_iam_sdk():
|
|
108
|
+
"""惰性导入 ksyun IAM SDK,失败返回 None。"""
|
|
109
|
+
try:
|
|
110
|
+
from ksyun.client.iam.v20151101.client import IamClient
|
|
111
|
+
from ksyun.client.iam.v20151101.models import (
|
|
112
|
+
GetUserRequest,
|
|
113
|
+
ListAllUserAccessKeysRequest,
|
|
114
|
+
)
|
|
115
|
+
from ksyun.common.credential import Credential
|
|
116
|
+
from ksyun.common.profile.client_profile import ClientProfile
|
|
117
|
+
from ksyun.common.profile.http_profile import HttpProfile
|
|
118
|
+
except Exception as exc:
|
|
119
|
+
logger.warning("导入 ksyun IAM SDK 失败: %s", exc)
|
|
120
|
+
return None
|
|
121
|
+
return (
|
|
122
|
+
IamClient,
|
|
123
|
+
ListAllUserAccessKeysRequest,
|
|
124
|
+
GetUserRequest,
|
|
125
|
+
Credential,
|
|
126
|
+
ClientProfile,
|
|
127
|
+
HttpProfile,
|
|
128
|
+
)
|
|
129
|
+
|
|
130
|
+
|
|
131
|
+
def _build_iam_client(*, access_key: str, secret_key: str, host: str, scheme: str, sdk_parts):
|
|
132
|
+
"""构造 IamClient(复用服务端 iam/client.py 模式)。"""
|
|
133
|
+
IamClient, _, _, Credential, ClientProfile, HttpProfile = sdk_parts
|
|
134
|
+
http_profile = HttpProfile()
|
|
135
|
+
http_profile.endpoint = host
|
|
136
|
+
http_profile.reqMethod = "POST"
|
|
137
|
+
http_profile.reqTimeout = 30
|
|
138
|
+
http_profile.scheme = scheme
|
|
139
|
+
client_profile = ClientProfile()
|
|
140
|
+
client_profile.httpProfile = http_profile
|
|
141
|
+
cred = Credential(access_key, secret_key)
|
|
142
|
+
return IamClient(cred, "cn-beijing-6", profile=client_profile)
|
|
143
|
+
|
|
144
|
+
|
|
145
|
+
# ---------------------------------------------------------------------------
|
|
146
|
+
# IAM 调用
|
|
147
|
+
# ---------------------------------------------------------------------------
|
|
148
|
+
|
|
149
|
+
|
|
150
|
+
def _call_list_all_user_access_keys(client, sdk_parts) -> list[dict]:
|
|
151
|
+
"""调 ListAllUserAccessKeys,返回 AccessKey 列表(每项含 AccessKey + UserName)。"""
|
|
152
|
+
_, ListAllUserAccessKeysRequest, _, _, _, _ = sdk_parts
|
|
153
|
+
resp = client.ListAllUserAccessKeys(ListAllUserAccessKeysRequest())
|
|
154
|
+
if isinstance(resp, str):
|
|
155
|
+
resp = json.loads(resp)
|
|
156
|
+
if not isinstance(resp, dict):
|
|
157
|
+
return []
|
|
158
|
+
keys = resp.get("AccessKeyList") or resp.get("AccessKeys") or []
|
|
159
|
+
return [k for k in keys if isinstance(k, dict)]
|
|
160
|
+
|
|
161
|
+
|
|
162
|
+
def _call_get_user(client, user_name: str, sdk_parts) -> dict:
|
|
163
|
+
"""调 GetUser(UserName),返回 User dict。"""
|
|
164
|
+
_, _, GetUserRequest, _, _, _ = sdk_parts
|
|
165
|
+
req = GetUserRequest()
|
|
166
|
+
req.UserName = user_name
|
|
167
|
+
resp = client.GetUser(req)
|
|
168
|
+
if isinstance(resp, str):
|
|
169
|
+
resp = json.loads(resp)
|
|
170
|
+
if not isinstance(resp, dict):
|
|
171
|
+
return {}
|
|
172
|
+
return resp.get("GetUserResult", {}).get("User", {}) or {}
|
|
173
|
+
|
|
174
|
+
|
|
175
|
+
def _find_username_by_ak(access_keys: list[dict], target_ak: str) -> Optional[str]:
|
|
176
|
+
"""在 AccessKey 列表里找目标 AK 对应的 UserName。"""
|
|
177
|
+
for item in access_keys:
|
|
178
|
+
ak = str(item.get("AccessKey") or item.get("AccessKeyId") or "").strip()
|
|
179
|
+
if ak and ak == target_ak:
|
|
180
|
+
return str(item.get("UserName") or "").strip() or None
|
|
181
|
+
return None
|
|
182
|
+
|
|
183
|
+
|
|
184
|
+
# ---------------------------------------------------------------------------
|
|
185
|
+
# 缓存读写(settings.json 的 cloud.IDENTITY_CACHE)
|
|
186
|
+
# ---------------------------------------------------------------------------
|
|
187
|
+
|
|
188
|
+
|
|
189
|
+
def _load_identity_cache() -> dict:
|
|
190
|
+
"""读 settings.json 的 cloud.IDENTITY_CACHE,失败返回空 dict。"""
|
|
191
|
+
try:
|
|
192
|
+
from ksadk.configs.global_config import load_global_config
|
|
193
|
+
|
|
194
|
+
config = load_global_config()
|
|
195
|
+
except Exception as exc:
|
|
196
|
+
logger.warning("读取 global_config 失败: %s", exc)
|
|
197
|
+
return {}
|
|
198
|
+
cloud = config.get("cloud") or {}
|
|
199
|
+
cache = cloud.get("IDENTITY_CACHE") if isinstance(cloud, dict) else None
|
|
200
|
+
return cache if isinstance(cache, dict) else {}
|
|
201
|
+
|
|
202
|
+
|
|
203
|
+
def _save_identity_cache(cache: dict) -> None:
|
|
204
|
+
"""写 settings.json 的 cloud.IDENTITY_CACHE(merge,保留其他字段)。"""
|
|
205
|
+
try:
|
|
206
|
+
from ksadk.configs.global_config import load_global_config, save_global_config
|
|
207
|
+
|
|
208
|
+
config = load_global_config()
|
|
209
|
+
cloud = dict(config.get("cloud") or {})
|
|
210
|
+
cloud["IDENTITY_CACHE"] = cache
|
|
211
|
+
config["cloud"] = cloud
|
|
212
|
+
save_global_config(config)
|
|
213
|
+
except Exception as exc:
|
|
214
|
+
logger.warning("写入 identity 缓存失败: %s", exc)
|
|
215
|
+
|
|
216
|
+
|
|
217
|
+
def _read_cache_entry(access_key: str) -> Optional[dict]:
|
|
218
|
+
"""读指定 AK 的缓存条目,指纹不匹配返回 None。"""
|
|
219
|
+
if not access_key:
|
|
220
|
+
return None
|
|
221
|
+
fingerprint = _ak_fingerprint(access_key)
|
|
222
|
+
cache = _load_identity_cache()
|
|
223
|
+
entry = cache.get(fingerprint)
|
|
224
|
+
if not isinstance(entry, dict):
|
|
225
|
+
return None
|
|
226
|
+
if entry.get("ak_fingerprint") != fingerprint:
|
|
227
|
+
return None
|
|
228
|
+
return entry
|
|
229
|
+
|
|
230
|
+
|
|
231
|
+
def _write_cache_entry(access_key: str, entry: dict) -> None:
|
|
232
|
+
"""写指定 AK 的缓存条目(merge,不破坏其他条目)。"""
|
|
233
|
+
if not access_key:
|
|
234
|
+
return
|
|
235
|
+
fingerprint = _ak_fingerprint(access_key)
|
|
236
|
+
cache = _load_identity_cache()
|
|
237
|
+
cache[fingerprint] = entry
|
|
238
|
+
_save_identity_cache(cache)
|
|
239
|
+
|
|
240
|
+
|
|
241
|
+
# ---------------------------------------------------------------------------
|
|
242
|
+
# 公开 API
|
|
243
|
+
# ---------------------------------------------------------------------------
|
|
244
|
+
|
|
245
|
+
|
|
246
|
+
def resolve_identity(
|
|
247
|
+
*,
|
|
248
|
+
access_key: str,
|
|
249
|
+
secret_key: str,
|
|
250
|
+
force_refresh: bool = False,
|
|
251
|
+
) -> Optional[ResolvedIdentity]:
|
|
252
|
+
"""用 AK/SK 反查子账号身份。
|
|
253
|
+
|
|
254
|
+
先读缓存命中即返回;未命中调 IAM 两步链路并写缓存。
|
|
255
|
+
任何失败返回 None(不抛异常,调用方降级)。
|
|
256
|
+
"""
|
|
257
|
+
if not access_key or not secret_key:
|
|
258
|
+
return None
|
|
259
|
+
|
|
260
|
+
fingerprint = _ak_fingerprint(access_key)
|
|
261
|
+
|
|
262
|
+
# 1. 读缓存
|
|
263
|
+
if not force_refresh:
|
|
264
|
+
entry = _read_cache_entry(access_key)
|
|
265
|
+
if entry:
|
|
266
|
+
return ResolvedIdentity(
|
|
267
|
+
user_uuid=entry.get("user_uuid"),
|
|
268
|
+
main_account_id=entry.get("main_account_id"),
|
|
269
|
+
user_name=entry.get("user_name"),
|
|
270
|
+
krn=entry.get("krn"),
|
|
271
|
+
ak_fingerprint=fingerprint,
|
|
272
|
+
)
|
|
273
|
+
|
|
274
|
+
# 2. 调 IAM 反查。公网失败时 fallback 内网 endpoint(内部账号只能内网访问时)。
|
|
275
|
+
# 内网地址优先用显式配置的 IAM_INTRANET_URL,未配置时用默认 iam.inner.api.ksyun.com。
|
|
276
|
+
# 该地址外部不可访问(内网专属),open_source_audit 白名单已放行,内部账号开箱即用。
|
|
277
|
+
sdk_parts = _import_iam_sdk()
|
|
278
|
+
if sdk_parts is None:
|
|
279
|
+
return None
|
|
280
|
+
|
|
281
|
+
host, scheme = _resolve_iam_endpoint()
|
|
282
|
+
candidates = [(host, scheme)]
|
|
283
|
+
intranet_endpoint = _resolve_iam_intranet_endpoint() or ("iam.inner.api.ksyun.com", "http")
|
|
284
|
+
if intranet_endpoint not in candidates:
|
|
285
|
+
candidates.append(intranet_endpoint)
|
|
286
|
+
|
|
287
|
+
user_name: Optional[str] = None
|
|
288
|
+
user: dict = {}
|
|
289
|
+
last_exc: Optional[Exception] = None
|
|
290
|
+
for cand_host, cand_scheme in candidates:
|
|
291
|
+
try:
|
|
292
|
+
client = _build_iam_client(
|
|
293
|
+
access_key=access_key,
|
|
294
|
+
secret_key=secret_key,
|
|
295
|
+
host=cand_host,
|
|
296
|
+
scheme=cand_scheme,
|
|
297
|
+
sdk_parts=sdk_parts,
|
|
298
|
+
)
|
|
299
|
+
access_keys = _call_list_all_user_access_keys(client, sdk_parts)
|
|
300
|
+
user_name = _find_username_by_ak(access_keys, access_key)
|
|
301
|
+
if not user_name:
|
|
302
|
+
# AK 不在子用户列表(可能是主账号 AK),无法反查 user uuid
|
|
303
|
+
logger.warning(
|
|
304
|
+
"AK 指纹 %s 未在 ListAllUserAccessKeys 找到匹配(可能是主账号 AK)",
|
|
305
|
+
fingerprint,
|
|
306
|
+
)
|
|
307
|
+
return None
|
|
308
|
+
user = _call_get_user(client, user_name, sdk_parts)
|
|
309
|
+
host, scheme = cand_host, cand_scheme # 记录成功的 endpoint 用于缓存
|
|
310
|
+
last_exc = None
|
|
311
|
+
break
|
|
312
|
+
except Exception as exc:
|
|
313
|
+
last_exc = exc
|
|
314
|
+
# 仅在"内部账号需内网访问"时才 fallback 到内网 endpoint
|
|
315
|
+
if not _should_retry_intranet(exc):
|
|
316
|
+
break
|
|
317
|
+
|
|
318
|
+
if last_exc is not None:
|
|
319
|
+
logger.warning("反查子账号身份失败 (AK 指纹 %s): %s", fingerprint, last_exc)
|
|
320
|
+
return None
|
|
321
|
+
|
|
322
|
+
user_uuid = str(user.get("UserId") or "").strip() or None
|
|
323
|
+
krn = str(user.get("Krn") or "").strip() or None
|
|
324
|
+
main_account_id = _extract_main_account_id_from_krn(krn)
|
|
325
|
+
|
|
326
|
+
identity = ResolvedIdentity(
|
|
327
|
+
user_uuid=user_uuid,
|
|
328
|
+
main_account_id=main_account_id,
|
|
329
|
+
user_name=user_name,
|
|
330
|
+
krn=krn,
|
|
331
|
+
ak_fingerprint=fingerprint,
|
|
332
|
+
)
|
|
333
|
+
|
|
334
|
+
# 3. 写缓存
|
|
335
|
+
_write_cache_entry(
|
|
336
|
+
access_key,
|
|
337
|
+
{
|
|
338
|
+
"ak_fingerprint": fingerprint,
|
|
339
|
+
"user_uuid": user_uuid,
|
|
340
|
+
"main_account_id": main_account_id,
|
|
341
|
+
"user_name": user_name,
|
|
342
|
+
"krn": krn,
|
|
343
|
+
"resolved_at": datetime.now(timezone.utc).isoformat(),
|
|
344
|
+
"iam_endpoint": host,
|
|
345
|
+
"iam_scheme": scheme,
|
|
346
|
+
},
|
|
347
|
+
)
|
|
348
|
+
|
|
349
|
+
return identity
|
|
350
|
+
|
|
351
|
+
|
|
352
|
+
def get_cached_user_uuid(access_key: str) -> Optional[str]:
|
|
353
|
+
"""只读缓存拿 user uuid,不触发反查(dry-run 用)。"""
|
|
354
|
+
entry = _read_cache_entry(access_key)
|
|
355
|
+
if not entry:
|
|
356
|
+
return None
|
|
357
|
+
uuid = entry.get("user_uuid")
|
|
358
|
+
return str(uuid).strip() or None if uuid else None
|
|
359
|
+
|
|
360
|
+
|
|
361
|
+
def get_cached_identity(access_key: str) -> Optional[ResolvedIdentity]:
|
|
362
|
+
"""只读缓存拿完整身份(含 main_account_id),不触发反查(dry-run 用)。"""
|
|
363
|
+
if not access_key:
|
|
364
|
+
return None
|
|
365
|
+
entry = _read_cache_entry(access_key)
|
|
366
|
+
if not entry:
|
|
367
|
+
return None
|
|
368
|
+
return ResolvedIdentity(
|
|
369
|
+
user_uuid=entry.get("user_uuid"),
|
|
370
|
+
main_account_id=entry.get("main_account_id"),
|
|
371
|
+
user_name=entry.get("user_name"),
|
|
372
|
+
krn=entry.get("krn"),
|
|
373
|
+
ak_fingerprint=_ak_fingerprint(access_key),
|
|
374
|
+
)
|
|
375
|
+
|
|
376
|
+
|
|
377
|
+
def invalidate_cache(access_key: Optional[str] = None) -> None:
|
|
378
|
+
"""删除指定 AK 的缓存条目;access_key=None 清空所有。"""
|
|
379
|
+
cache = _load_identity_cache()
|
|
380
|
+
if access_key is None:
|
|
381
|
+
cache = {}
|
|
382
|
+
else:
|
|
383
|
+
fingerprint = _ak_fingerprint(access_key)
|
|
384
|
+
cache.pop(fingerprint, None)
|
|
385
|
+
_save_identity_cache(cache)
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
"""KsADK 知识库集成模块
|
|
2
|
+
|
|
3
|
+
提供金山云知识库 (AICP RetrieveKnowledge) 的集成能力。
|
|
4
|
+
用户通过环境变量配置即可自动启用知识库检索。
|
|
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
|
+
|
|
15
|
+
使用方式:
|
|
16
|
+
# ADK: 设置环境变量后自动注入,无需代码改动
|
|
17
|
+
|
|
18
|
+
# LangGraph / LangChain / DeepAgents:
|
|
19
|
+
# 1) 仅配 env,平台会在调用前自动注入知识库上下文
|
|
20
|
+
# 2) 也支持一行 import 手动加入 tools
|
|
21
|
+
from ksadk.knowledge_base import search_knowledge_base
|
|
22
|
+
tools = [search_knowledge_base, ...]
|
|
23
|
+
|
|
24
|
+
# 直接使用通用函数
|
|
25
|
+
from ksadk.knowledge_base import search_knowledge
|
|
26
|
+
result = search_knowledge("你的问题")
|
|
27
|
+
"""
|
|
28
|
+
|
|
29
|
+
from ksadk.knowledge_base.client import KnowledgeBaseClient, KnowledgeBaseResult
|
|
30
|
+
from ksadk.knowledge_base.tool import search_knowledge
|
|
31
|
+
|
|
32
|
+
__all__ = [
|
|
33
|
+
"KnowledgeBaseClient",
|
|
34
|
+
"KnowledgeBaseResult",
|
|
35
|
+
"search_knowledge",
|
|
36
|
+
"search_knowledge_base",
|
|
37
|
+
"create_adk_tool",
|
|
38
|
+
"create_langchain_tool",
|
|
39
|
+
]
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
def create_adk_tool():
|
|
43
|
+
"""创建 ADK 知识库工具"""
|
|
44
|
+
from ksadk.knowledge_base.adk_tool import create_adk_tool as _create
|
|
45
|
+
|
|
46
|
+
return _create()
|
|
47
|
+
|
|
48
|
+
|
|
49
|
+
def create_langchain_tool():
|
|
50
|
+
"""创建 LangChain 知识库工具"""
|
|
51
|
+
from ksadk.knowledge_base.langchain_tool import create_langchain_tool as _create
|
|
52
|
+
|
|
53
|
+
return _create()
|
|
54
|
+
|
|
55
|
+
|
|
56
|
+
# LangChain/LangGraph 用户可直接 import 使用
|
|
57
|
+
def __getattr__(name):
|
|
58
|
+
if name == "search_knowledge_base":
|
|
59
|
+
from ksadk.knowledge_base.langchain_tool import search_knowledge_base
|
|
60
|
+
|
|
61
|
+
return search_knowledge_base
|
|
62
|
+
raise AttributeError(f"module 'ksadk.knowledge_base' has no attribute {name!r}")
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
"""ADK 知识库工具包装
|
|
2
|
+
|
|
3
|
+
将通用 search_knowledge 函数包装为 Google ADK 可用的工具。
|
|
4
|
+
由 ADKRunner 在检测到知识库配置时自动注入到 Agent。
|
|
5
|
+
|
|
6
|
+
注意: 此模块依赖 google-adk,仅在 ADK 框架下使用。
|
|
7
|
+
"""
|
|
8
|
+
|
|
9
|
+
import logging
|
|
10
|
+
|
|
11
|
+
from ksadk.knowledge_base.tool import search_knowledge
|
|
12
|
+
|
|
13
|
+
logger = logging.getLogger(__name__)
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
def search_knowledge_base(query: str) -> dict:
|
|
17
|
+
"""搜索知识库获取相关信息
|
|
18
|
+
|
|
19
|
+
当用户的问题需要查找专业知识、文档内容或特定领域信息时,
|
|
20
|
+
使用此工具从知识库中检索相关内容。
|
|
21
|
+
|
|
22
|
+
Args:
|
|
23
|
+
query: 检索关键词或问题
|
|
24
|
+
|
|
25
|
+
Returns:
|
|
26
|
+
包含检索结果的字典
|
|
27
|
+
"""
|
|
28
|
+
result = search_knowledge(query)
|
|
29
|
+
return {"result": result}
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
def create_adk_tool():
|
|
33
|
+
"""创建 ADK FunctionTool
|
|
34
|
+
|
|
35
|
+
Returns:
|
|
36
|
+
可直接注入到 ADK Agent 的工具对象
|
|
37
|
+
"""
|
|
38
|
+
try:
|
|
39
|
+
from google.adk.tools import FunctionTool
|
|
40
|
+
|
|
41
|
+
return FunctionTool(func=search_knowledge_base)
|
|
42
|
+
except ImportError:
|
|
43
|
+
logger.warning(
|
|
44
|
+
"google-adk not installed, returning raw function as tool. "
|
|
45
|
+
"Install with: pip install ksadk[adk]"
|
|
46
|
+
)
|
|
47
|
+
return search_knowledge_base
|