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,131 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
import os
|
|
4
|
+
import shutil
|
|
5
|
+
import tempfile
|
|
6
|
+
from dataclasses import dataclass, field
|
|
7
|
+
from pathlib import Path
|
|
8
|
+
|
|
9
|
+
import httpx
|
|
10
|
+
|
|
11
|
+
from ksadk.skills.loader import LocalSkill, load_local_skill
|
|
12
|
+
from ksadk.skills.models import SkillRef
|
|
13
|
+
from ksadk.skills.package_store import PackageStore, SkillPackageError
|
|
14
|
+
from ksadk.skills.runtime import registry
|
|
15
|
+
from ksadk.skills.service_client import SkillServiceClient
|
|
16
|
+
from ksadk.skills.service_env import resolve_skill_service_url
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
@dataclass
|
|
20
|
+
class SkillLoadResult:
|
|
21
|
+
skills: list[LocalSkill] = field(default_factory=list)
|
|
22
|
+
warnings: list[str] = field(default_factory=list)
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
def load_skills(
|
|
26
|
+
*,
|
|
27
|
+
prompt: str = "",
|
|
28
|
+
skill_names: list[str] | None = None,
|
|
29
|
+
service_transport: httpx.BaseTransport | None = None,
|
|
30
|
+
) -> SkillLoadResult:
|
|
31
|
+
warnings: list[str] = []
|
|
32
|
+
skills: list[LocalSkill] = []
|
|
33
|
+
skills.extend(load_local_skills())
|
|
34
|
+
|
|
35
|
+
service_url = resolve_skill_service_url(require_spaces=True)
|
|
36
|
+
if not service_url:
|
|
37
|
+
return SkillLoadResult(skills=skills, warnings=warnings)
|
|
38
|
+
|
|
39
|
+
cache_dir = Path(
|
|
40
|
+
os.environ.get("KSADK_SKILL_CACHE_DIR")
|
|
41
|
+
or Path(tempfile.gettempdir()) / "ksadk-skill-cache"
|
|
42
|
+
)
|
|
43
|
+
client = SkillServiceClient(
|
|
44
|
+
base_url=service_url,
|
|
45
|
+
token=os.environ.get("KSADK_SKILL_SERVICE_TOKEN", ""),
|
|
46
|
+
transport=service_transport,
|
|
47
|
+
)
|
|
48
|
+
store = PackageStore(cache_dir=cache_dir)
|
|
49
|
+
selected_refs: list[SkillRef] = []
|
|
50
|
+
seen_names: set[str] = {skill.name.lower() for skill in skills if skill.name}
|
|
51
|
+
for space_id in registry.user_skill_space_ids():
|
|
52
|
+
listing = client.list_skills_by_space_id(space_id)
|
|
53
|
+
selected_refs.extend(
|
|
54
|
+
registry.dedupe_skill_refs(
|
|
55
|
+
registry.select_remote_skill_refs(
|
|
56
|
+
listing.active_skills(),
|
|
57
|
+
prompt,
|
|
58
|
+
skill_names=skill_names,
|
|
59
|
+
),
|
|
60
|
+
seen_names=seen_names,
|
|
61
|
+
)
|
|
62
|
+
)
|
|
63
|
+
|
|
64
|
+
if registry.public_skill_space_ids():
|
|
65
|
+
listing = client.list_available_premade_skills()
|
|
66
|
+
selected_refs.extend(
|
|
67
|
+
registry.dedupe_skill_refs(
|
|
68
|
+
registry.select_public_skill_refs(listing.active_skills()),
|
|
69
|
+
seen_names=seen_names,
|
|
70
|
+
)
|
|
71
|
+
)
|
|
72
|
+
|
|
73
|
+
for skill in selected_refs:
|
|
74
|
+
package = store.get_cached(skill)
|
|
75
|
+
if package is None:
|
|
76
|
+
archive = client.download_skill_archive(skill)
|
|
77
|
+
try:
|
|
78
|
+
package = store.store_archive(skill, archive)
|
|
79
|
+
except SkillPackageError as exc:
|
|
80
|
+
if not _allow_hash_mismatch():
|
|
81
|
+
raise
|
|
82
|
+
package = _store_unverified_archive(store, skill, archive)
|
|
83
|
+
warnings.append(str(exc))
|
|
84
|
+
skills.append(load_local_skill(package.root_dir))
|
|
85
|
+
return SkillLoadResult(skills=skills, warnings=warnings)
|
|
86
|
+
|
|
87
|
+
|
|
88
|
+
def load_local_skills() -> list[LocalSkill]:
|
|
89
|
+
skills_dir = os.environ.get("KSADK_LOCAL_SKILLS_DIR", "").strip()
|
|
90
|
+
if not skills_dir:
|
|
91
|
+
return []
|
|
92
|
+
root = Path(skills_dir)
|
|
93
|
+
if not root.exists():
|
|
94
|
+
return []
|
|
95
|
+
return [
|
|
96
|
+
load_local_skill(path)
|
|
97
|
+
for path in sorted(root.iterdir())
|
|
98
|
+
if path.is_dir() and (path / "SKILL.md").exists()
|
|
99
|
+
]
|
|
100
|
+
|
|
101
|
+
|
|
102
|
+
def _allow_hash_mismatch() -> bool:
|
|
103
|
+
return os.environ.get("KSADK_SKILL_ALLOW_HASH_MISMATCH", "").strip().lower() in {
|
|
104
|
+
"1",
|
|
105
|
+
"true",
|
|
106
|
+
"yes",
|
|
107
|
+
"on",
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
|
|
111
|
+
def _store_unverified_archive(store: PackageStore, skill: SkillRef, archive: bytes):
|
|
112
|
+
skill_dir = store.cache_dir / f"unverified-{skill.cache_key or skill.name or 'skill'}"
|
|
113
|
+
if skill_dir.exists():
|
|
114
|
+
shutil.rmtree(skill_dir)
|
|
115
|
+
skill_dir.mkdir(parents=True, exist_ok=True)
|
|
116
|
+
archive_path = skill_dir / "archive.zip"
|
|
117
|
+
extract_dir = skill_dir / "extracted"
|
|
118
|
+
archive_path.write_bytes(archive)
|
|
119
|
+
extract_dir.mkdir(parents=True, exist_ok=True)
|
|
120
|
+
store._safe_extract(archive_path, extract_dir)
|
|
121
|
+
return type(
|
|
122
|
+
"UnverifiedSkillPackage",
|
|
123
|
+
(),
|
|
124
|
+
{
|
|
125
|
+
"ref": skill,
|
|
126
|
+
"archive_path": archive_path,
|
|
127
|
+
"extract_dir": extract_dir,
|
|
128
|
+
"root_dir": store._find_skill_root(extract_dir),
|
|
129
|
+
"cache_hit": False,
|
|
130
|
+
},
|
|
131
|
+
)()
|
|
@@ -0,0 +1,150 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
import os
|
|
4
|
+
import re
|
|
5
|
+
|
|
6
|
+
from ksadk.skills.models import SkillRef
|
|
7
|
+
from ksadk.skills.runtime.base import normalize_skill_names
|
|
8
|
+
from ksadk.skills.service_env import (
|
|
9
|
+
parse_skill_space_ids,
|
|
10
|
+
public_skill_space_ids as configured_public_skill_space_ids,
|
|
11
|
+
skill_space_ids as configured_skill_space_ids,
|
|
12
|
+
user_skill_space_ids as configured_user_skill_space_ids,
|
|
13
|
+
)
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
def skill_space_ids() -> list[str]:
|
|
17
|
+
return configured_skill_space_ids()
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
def user_skill_space_ids() -> list[str]:
|
|
21
|
+
return configured_user_skill_space_ids()
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
def public_skill_space_ids() -> list[str]:
|
|
25
|
+
return configured_public_skill_space_ids()
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
def parse_space_ids(*raw_values: str) -> list[str]:
|
|
29
|
+
return parse_skill_space_ids(*raw_values)
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
def dedupe_skill_refs(skill_refs: list[SkillRef], *, seen_names: set[str]) -> list[SkillRef]:
|
|
33
|
+
selected: list[SkillRef] = []
|
|
34
|
+
seen_keys: set[str] = set()
|
|
35
|
+
for skill in skill_refs:
|
|
36
|
+
name_key = skill.name.lower() if skill.name else ""
|
|
37
|
+
key = skill.cache_key or skill.skill_id or skill.name
|
|
38
|
+
if not name_key or name_key in seen_names or key in seen_keys:
|
|
39
|
+
continue
|
|
40
|
+
seen_names.add(name_key)
|
|
41
|
+
seen_keys.add(key)
|
|
42
|
+
selected.append(skill)
|
|
43
|
+
return selected
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
def select_public_skill_refs(skill_refs: list[SkillRef]) -> list[SkillRef]:
|
|
47
|
+
allowlist = {name.lower() for name in normalize_skill_names(os.environ.get("KSADK_PUBLIC_SKILL_ALLOWLIST", ""))}
|
|
48
|
+
if not allowlist:
|
|
49
|
+
return [skill for skill in skill_refs if skill.name]
|
|
50
|
+
return [
|
|
51
|
+
skill
|
|
52
|
+
for skill in skill_refs
|
|
53
|
+
if skill.name and skill.name.lower() in allowlist
|
|
54
|
+
]
|
|
55
|
+
|
|
56
|
+
|
|
57
|
+
def select_remote_skill_refs(
|
|
58
|
+
skill_refs: list[SkillRef],
|
|
59
|
+
prompt: str,
|
|
60
|
+
*,
|
|
61
|
+
skill_names: list[str] | None = None,
|
|
62
|
+
) -> list[SkillRef]:
|
|
63
|
+
if not prompt and not normalize_skill_names(skill_names):
|
|
64
|
+
return []
|
|
65
|
+
return [match.skill for match in match_skill_refs(skill_refs, prompt, skill_names=skill_names)]
|
|
66
|
+
|
|
67
|
+
|
|
68
|
+
class SkillMatch:
|
|
69
|
+
def __init__(self, skill: SkillRef, score: int, reason: str):
|
|
70
|
+
self.skill = skill
|
|
71
|
+
self.score = score
|
|
72
|
+
self.reason = reason
|
|
73
|
+
|
|
74
|
+
def to_dict(self) -> dict[str, object]:
|
|
75
|
+
return {
|
|
76
|
+
"name": self.skill.name,
|
|
77
|
+
"description": self.skill.description,
|
|
78
|
+
"version": self.skill.version,
|
|
79
|
+
"score": self.score,
|
|
80
|
+
"reason": self.reason,
|
|
81
|
+
"aliases": list(self.skill.aliases),
|
|
82
|
+
"tags": list(self.skill.tags),
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
|
|
86
|
+
def match_skill_refs(
|
|
87
|
+
skill_refs: list[SkillRef],
|
|
88
|
+
prompt: str,
|
|
89
|
+
*,
|
|
90
|
+
skill_names: list[str] | None = None,
|
|
91
|
+
limit: int | None = None,
|
|
92
|
+
) -> list[SkillMatch]:
|
|
93
|
+
requested_names = {name.lower() for name in normalize_skill_names(skill_names)}
|
|
94
|
+
normalized_prompt = prompt.lower()
|
|
95
|
+
prompt_tokens = _tokens(normalized_prompt)
|
|
96
|
+
matches: list[SkillMatch] = []
|
|
97
|
+
seen: set[str] = set()
|
|
98
|
+
for skill in skill_refs:
|
|
99
|
+
if not skill.name:
|
|
100
|
+
continue
|
|
101
|
+
skill_name = skill.name.lower()
|
|
102
|
+
if requested_names:
|
|
103
|
+
if skill_name not in requested_names:
|
|
104
|
+
continue
|
|
105
|
+
score, reason = 100, "exact_name"
|
|
106
|
+
else:
|
|
107
|
+
score, reason = _metadata_score(skill, normalized_prompt, prompt_tokens)
|
|
108
|
+
if score <= 0:
|
|
109
|
+
continue
|
|
110
|
+
key = skill.cache_key or skill.skill_id or skill.name
|
|
111
|
+
if key in seen:
|
|
112
|
+
continue
|
|
113
|
+
seen.add(key)
|
|
114
|
+
matches.append(SkillMatch(skill=skill, score=score, reason=reason))
|
|
115
|
+
matches.sort(key=lambda item: (-item.score, item.skill.name.lower()))
|
|
116
|
+
if limit is not None:
|
|
117
|
+
return matches[: max(0, limit)]
|
|
118
|
+
return matches
|
|
119
|
+
|
|
120
|
+
|
|
121
|
+
def _metadata_score(skill: SkillRef, normalized_prompt: str, prompt_tokens: set[str]) -> tuple[int, str]:
|
|
122
|
+
if skill.name and skill.name.lower() in normalized_prompt:
|
|
123
|
+
return 90, "name"
|
|
124
|
+
for alias in skill.aliases:
|
|
125
|
+
if alias.lower() in normalized_prompt:
|
|
126
|
+
return 80, "alias"
|
|
127
|
+
for tag in skill.tags:
|
|
128
|
+
tag_key = tag.lower()
|
|
129
|
+
if tag_key and (tag_key in normalized_prompt or tag_key in prompt_tokens):
|
|
130
|
+
return 65, "tag"
|
|
131
|
+
|
|
132
|
+
text = " ".join(
|
|
133
|
+
[
|
|
134
|
+
skill.description or "",
|
|
135
|
+
" ".join(skill.examples),
|
|
136
|
+
]
|
|
137
|
+
).lower()
|
|
138
|
+
skill_tokens = _tokens(text)
|
|
139
|
+
overlap = prompt_tokens & skill_tokens
|
|
140
|
+
if overlap:
|
|
141
|
+
return min(55, 20 + len(overlap) * 10), "metadata"
|
|
142
|
+
return 0, ""
|
|
143
|
+
|
|
144
|
+
|
|
145
|
+
def _tokens(value: str) -> set[str]:
|
|
146
|
+
return {
|
|
147
|
+
token
|
|
148
|
+
for token in re.split(r"[^0-9a-zA-Z\u4e00-\u9fff]+", value.lower())
|
|
149
|
+
if len(token) >= 2
|
|
150
|
+
}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
import json
|
|
4
|
+
from dataclasses import dataclass, field
|
|
5
|
+
from pathlib import Path
|
|
6
|
+
from typing import Any
|
|
7
|
+
|
|
8
|
+
from ksadk.skills.runtime.base import normalize_skill_names
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
class SkillWorkflowRequestError(ValueError):
|
|
12
|
+
pass
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
@dataclass(frozen=True)
|
|
16
|
+
class SkillWorkflowRequest:
|
|
17
|
+
workflow_prompt: str = ""
|
|
18
|
+
skill_names: list[str] = field(default_factory=list)
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
def parse_workflow_request(argv: list[str]) -> SkillWorkflowRequest:
|
|
22
|
+
args = list(argv)
|
|
23
|
+
has_prompt_file = "--prompt-file" in args
|
|
24
|
+
has_request_file = "--request-file" in args
|
|
25
|
+
if has_prompt_file and has_request_file:
|
|
26
|
+
raise SkillWorkflowRequestError("--prompt-file and --request-file cannot be used together")
|
|
27
|
+
|
|
28
|
+
if has_request_file:
|
|
29
|
+
return _request_from_json_file(_option_value(args, "--request-file"))
|
|
30
|
+
if has_prompt_file:
|
|
31
|
+
return SkillWorkflowRequest(workflow_prompt=Path(_option_value(args, "--prompt-file")).read_text(encoding="utf-8"))
|
|
32
|
+
if not args:
|
|
33
|
+
return SkillWorkflowRequest()
|
|
34
|
+
return SkillWorkflowRequest(workflow_prompt=args[0])
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
def _option_value(args: list[str], name: str) -> str:
|
|
38
|
+
try:
|
|
39
|
+
index = args.index(name)
|
|
40
|
+
value = args[index + 1]
|
|
41
|
+
except (ValueError, IndexError) as exc:
|
|
42
|
+
raise SkillWorkflowRequestError(f"{name} requires a file path") from exc
|
|
43
|
+
if value.startswith("--"):
|
|
44
|
+
raise SkillWorkflowRequestError(f"{name} requires a file path")
|
|
45
|
+
return value
|
|
46
|
+
|
|
47
|
+
|
|
48
|
+
def _request_from_json_file(path: str) -> SkillWorkflowRequest:
|
|
49
|
+
try:
|
|
50
|
+
payload = json.loads(Path(path).read_text(encoding="utf-8"))
|
|
51
|
+
except json.JSONDecodeError as exc:
|
|
52
|
+
raise SkillWorkflowRequestError(f"invalid request file JSON: {exc}") from exc
|
|
53
|
+
if not isinstance(payload, dict):
|
|
54
|
+
raise SkillWorkflowRequestError("request file must contain a JSON object")
|
|
55
|
+
prompt = payload.get("workflow_prompt", payload.get("prompt", ""))
|
|
56
|
+
skill_names = _skill_names_from_payload(payload)
|
|
57
|
+
return SkillWorkflowRequest(
|
|
58
|
+
workflow_prompt=str(prompt or ""),
|
|
59
|
+
skill_names=skill_names,
|
|
60
|
+
)
|
|
61
|
+
|
|
62
|
+
|
|
63
|
+
def _skill_names_from_payload(payload: dict[str, Any]) -> list[str]:
|
|
64
|
+
for key in ("skill_names", "selected_skills"):
|
|
65
|
+
if key in payload:
|
|
66
|
+
return normalize_skill_names(payload.get(key))
|
|
67
|
+
return []
|
|
@@ -0,0 +1,239 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
import os
|
|
4
|
+
from collections.abc import Mapping
|
|
5
|
+
from typing import Any
|
|
6
|
+
from urllib.parse import quote, urlsplit, urlunsplit
|
|
7
|
+
|
|
8
|
+
import httpx
|
|
9
|
+
import requests
|
|
10
|
+
|
|
11
|
+
from ksadk.common.auth import AWSV4Auth
|
|
12
|
+
|
|
13
|
+
from ksadk.skills.models import SkillListResponse, SkillRef
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
class SkillServiceClient:
|
|
17
|
+
def __init__(
|
|
18
|
+
self,
|
|
19
|
+
*,
|
|
20
|
+
base_url: str,
|
|
21
|
+
token: str = "",
|
|
22
|
+
access_key: str = "",
|
|
23
|
+
secret_key: str = "",
|
|
24
|
+
account_id: str = "",
|
|
25
|
+
region: str = "",
|
|
26
|
+
api_version: str = "",
|
|
27
|
+
sign_service: str = "",
|
|
28
|
+
extra_headers: Mapping[str, str] | None = None,
|
|
29
|
+
timeout: float = 60.0,
|
|
30
|
+
transport: httpx.BaseTransport | None = None,
|
|
31
|
+
):
|
|
32
|
+
self.base_url = _normalize_base_url(base_url)
|
|
33
|
+
self.token = token
|
|
34
|
+
self.access_key = access_key or _env("KSADK_SKILL_SERVICE_ACCESS_KEY", "KSYUN_ACCESS_KEY", "KS3_ACCESS_KEY")
|
|
35
|
+
self.secret_key = secret_key or _env("KSADK_SKILL_SERVICE_SECRET_KEY", "KSYUN_SECRET_KEY", "KS3_SECRET_KEY")
|
|
36
|
+
self.account_id = account_id or _env("KSADK_SKILL_SERVICE_ACCOUNT_ID", "KSYUN_ACCOUNT_ID")
|
|
37
|
+
self.logical_region = region or _env("KSADK_SKILL_SERVICE_REGION", "KSYUN_REGION") or "cn-beijing-6"
|
|
38
|
+
self.region = _normalize_control_region(self.logical_region)
|
|
39
|
+
self.custom_source = _resolve_custom_source(self.logical_region)
|
|
40
|
+
self.api_version = api_version or os.environ.get("KSADK_SKILL_SERVICE_API_VERSION", "2024-06-12")
|
|
41
|
+
self.sign_service = sign_service or os.environ.get("KSADK_SKILL_SERVICE_SIGN_SERVICE", "aicp")
|
|
42
|
+
self.extra_headers = dict(extra_headers or {})
|
|
43
|
+
self.timeout = timeout
|
|
44
|
+
self.transport = transport
|
|
45
|
+
self._requests_session: requests.Session | None = None
|
|
46
|
+
self._auth = AWSV4Auth(
|
|
47
|
+
access_key_id=self.access_key,
|
|
48
|
+
secret_access_key=self.secret_key,
|
|
49
|
+
region=self.region,
|
|
50
|
+
service=self.sign_service,
|
|
51
|
+
)
|
|
52
|
+
|
|
53
|
+
def action_url(self, action: str) -> str:
|
|
54
|
+
if self._is_kop_mode():
|
|
55
|
+
return (
|
|
56
|
+
f"{self._kop_base_url()}/?Action={quote(action.lstrip('/'))}"
|
|
57
|
+
f"&Version={quote(self.api_version)}"
|
|
58
|
+
)
|
|
59
|
+
return f"{self.base_url}/{action.lstrip('/')}"
|
|
60
|
+
|
|
61
|
+
def list_skill_spaces(self, *, page_number: int = 1, page_size: int = 100) -> dict[str, Any]:
|
|
62
|
+
return self._get_json(
|
|
63
|
+
"ListSkillSpaces",
|
|
64
|
+
{"PageNumber": page_number, "PageSize": page_size},
|
|
65
|
+
)
|
|
66
|
+
|
|
67
|
+
def list_skills_by_space_id(self, space_id: str) -> SkillListResponse:
|
|
68
|
+
if self._is_kop_mode():
|
|
69
|
+
payload = self._get_json(
|
|
70
|
+
"ListSkillsBySpaceId",
|
|
71
|
+
{"SpaceId": space_id, "PageNumber": 1, "PageSize": 100},
|
|
72
|
+
)
|
|
73
|
+
else:
|
|
74
|
+
payload = self._get_json("ListSkillsBySpaceId", {"SpaceId": space_id})
|
|
75
|
+
return SkillListResponse.from_payload(payload, space_id=space_id)
|
|
76
|
+
|
|
77
|
+
def list_available_premade_skills(self) -> SkillListResponse:
|
|
78
|
+
payload = self._get_json("ListAvailablePremadeSkills", {})
|
|
79
|
+
return SkillListResponse.from_payload(payload, space_id="public", space_name="Public Skills")
|
|
80
|
+
|
|
81
|
+
def get_skill_download_url(self, skill: SkillRef) -> str:
|
|
82
|
+
action = "GetSkillDownloadUrl" if skill.version_id else "GetPremadeSkillDownloadUrl"
|
|
83
|
+
payload = self._get_json(
|
|
84
|
+
action,
|
|
85
|
+
{
|
|
86
|
+
"SkillId": skill.skill_id,
|
|
87
|
+
"VersionId": skill.version_id,
|
|
88
|
+
},
|
|
89
|
+
)
|
|
90
|
+
data = payload.get("Data") or payload.get("data") or {}
|
|
91
|
+
return str(data.get("DownloadUrl") or data.get("download_url") or "")
|
|
92
|
+
|
|
93
|
+
def download_skill_archive(self, skill: SkillRef) -> bytes:
|
|
94
|
+
download_url = self.get_skill_download_url(skill)
|
|
95
|
+
if not download_url:
|
|
96
|
+
raise ValueError(f"Skill Service did not return DownloadUrl for {skill.skill_id}")
|
|
97
|
+
with httpx.Client(**self._client_kwargs()) as client:
|
|
98
|
+
response = client.get(download_url)
|
|
99
|
+
response.raise_for_status()
|
|
100
|
+
return response.content
|
|
101
|
+
|
|
102
|
+
def _get_json(self, action: str, params: dict[str, Any]) -> dict[str, Any]:
|
|
103
|
+
if self._is_kop_mode():
|
|
104
|
+
return self._get_json_kop(action, params)
|
|
105
|
+
with httpx.Client(**self._client_kwargs()) as client:
|
|
106
|
+
response = client.get(self.action_url(action), params=params, headers=self._headers())
|
|
107
|
+
response.raise_for_status()
|
|
108
|
+
return self._decode_response(action, response)
|
|
109
|
+
|
|
110
|
+
def _post_json(self, action: str, payload: dict[str, Any]) -> dict[str, Any]:
|
|
111
|
+
with httpx.Client(**self._client_kwargs()) as client:
|
|
112
|
+
response = client.post(self.action_url(action), json=payload, headers=self._headers())
|
|
113
|
+
response.raise_for_status()
|
|
114
|
+
return self._decode_response(action, response)
|
|
115
|
+
|
|
116
|
+
def _decode_response(self, action: str, response: httpx.Response) -> dict[str, Any]:
|
|
117
|
+
data = response.json()
|
|
118
|
+
if not isinstance(data, dict):
|
|
119
|
+
raise ValueError(f"Skill Service returned non-object response for {action}")
|
|
120
|
+
code = data.get("Code", data.get("code"))
|
|
121
|
+
if code not in (None, 0, 200, "0", "200"):
|
|
122
|
+
request_id = str(data.get("RequestId") or data.get("request_id") or "")
|
|
123
|
+
message = str(data.get("Message") or data.get("message") or "")
|
|
124
|
+
raise ValueError(
|
|
125
|
+
f"Skill Service {action} failed: code={code}, "
|
|
126
|
+
f"request_id={request_id}, message={message}"
|
|
127
|
+
)
|
|
128
|
+
return data
|
|
129
|
+
|
|
130
|
+
def _client_kwargs(self) -> dict[str, Any]:
|
|
131
|
+
kwargs: dict[str, Any] = {"timeout": self.timeout}
|
|
132
|
+
if self.transport is not None:
|
|
133
|
+
kwargs["transport"] = self.transport
|
|
134
|
+
return kwargs
|
|
135
|
+
|
|
136
|
+
def _headers(self, *, action: str = "") -> dict[str, str]:
|
|
137
|
+
headers = {"Accept": "application/json", "Content-Type": "application/json"}
|
|
138
|
+
if self.token:
|
|
139
|
+
headers["Authorization"] = f"Bearer {self.token}"
|
|
140
|
+
if self.account_id:
|
|
141
|
+
headers["X-Ksc-Account-Id"] = self.account_id
|
|
142
|
+
if self._is_kop_mode():
|
|
143
|
+
headers.update(
|
|
144
|
+
{
|
|
145
|
+
"Host": urlsplit(self._kop_base_url()).netloc,
|
|
146
|
+
"X-Ksc-Region": self.region,
|
|
147
|
+
"X-Ksc-Source": "ksadk-skill-runtime",
|
|
148
|
+
}
|
|
149
|
+
)
|
|
150
|
+
if self.custom_source:
|
|
151
|
+
headers["X-KSC-CUSTOM-SOURCE"] = self.custom_source
|
|
152
|
+
if action:
|
|
153
|
+
headers["X-Action"] = action
|
|
154
|
+
headers["X-Version"] = self.api_version
|
|
155
|
+
headers.update(self.extra_headers)
|
|
156
|
+
return headers
|
|
157
|
+
|
|
158
|
+
def _get_json_kop(self, action: str, params: dict[str, Any]) -> dict[str, Any]:
|
|
159
|
+
query = {"Action": action, "Version": self.api_version, **params}
|
|
160
|
+
headers = self._headers(action=action)
|
|
161
|
+
if self.transport is not None:
|
|
162
|
+
with httpx.Client(**self._client_kwargs()) as client:
|
|
163
|
+
response = client.get(self._kop_base_url() + "/", params=query, headers=headers)
|
|
164
|
+
response.raise_for_status()
|
|
165
|
+
return self._decode_response(action, response)
|
|
166
|
+
if not self._auth.is_enabled:
|
|
167
|
+
raise ValueError(
|
|
168
|
+
"AICP Skill Service endpoint requires signing credentials. "
|
|
169
|
+
"Set KSADK_SKILL_SERVICE_ACCESS_KEY/KSADK_SKILL_SERVICE_SECRET_KEY "
|
|
170
|
+
"or KSYUN_ACCESS_KEY/KSYUN_SECRET_KEY."
|
|
171
|
+
)
|
|
172
|
+
response = self._requests().get(
|
|
173
|
+
self._kop_base_url() + "/",
|
|
174
|
+
params=query,
|
|
175
|
+
headers=headers,
|
|
176
|
+
auth=self._auth.get_auth(),
|
|
177
|
+
timeout=self.timeout,
|
|
178
|
+
)
|
|
179
|
+
response.raise_for_status()
|
|
180
|
+
data = response.json()
|
|
181
|
+
if not isinstance(data, dict):
|
|
182
|
+
raise ValueError(f"Skill Service returned non-object response for {action}")
|
|
183
|
+
code = data.get("Code", data.get("code"))
|
|
184
|
+
if code not in (None, 0, 200, "0", "200"):
|
|
185
|
+
request_id = str(data.get("RequestId") or data.get("request_id") or "")
|
|
186
|
+
message = str(data.get("Message") or data.get("message") or data.get("Error") or "")
|
|
187
|
+
raise ValueError(
|
|
188
|
+
f"Skill Service {action} failed: code={code}, "
|
|
189
|
+
f"request_id={request_id}, message={message}"
|
|
190
|
+
)
|
|
191
|
+
return data
|
|
192
|
+
|
|
193
|
+
def _requests(self) -> requests.Session:
|
|
194
|
+
if self._requests_session is None:
|
|
195
|
+
self._requests_session = requests.Session()
|
|
196
|
+
return self._requests_session
|
|
197
|
+
|
|
198
|
+
def _is_kop_mode(self) -> bool:
|
|
199
|
+
host = urlsplit(self.base_url).netloc.lower()
|
|
200
|
+
return (
|
|
201
|
+
host.endswith("aicp.inner.api.ksyun.com")
|
|
202
|
+
or host.endswith("aicp.internal.api.ksyun.com")
|
|
203
|
+
or host.endswith("aicp.api.ksyun.com")
|
|
204
|
+
)
|
|
205
|
+
|
|
206
|
+
def _kop_base_url(self) -> str:
|
|
207
|
+
parsed = urlsplit(self.base_url)
|
|
208
|
+
return urlunsplit((parsed.scheme, parsed.netloc, "", "", "")).rstrip("/")
|
|
209
|
+
|
|
210
|
+
|
|
211
|
+
def _env(*names: str) -> str:
|
|
212
|
+
for name in names:
|
|
213
|
+
value = os.environ.get(name, "").strip()
|
|
214
|
+
if value:
|
|
215
|
+
return value
|
|
216
|
+
return ""
|
|
217
|
+
|
|
218
|
+
|
|
219
|
+
def _normalize_control_region(region: str) -> str:
|
|
220
|
+
region = (region or "cn-beijing-6").strip()
|
|
221
|
+
if region.lower() == "pre-online":
|
|
222
|
+
return os.environ.get("AGENTENGINE_PRE_CONTROL_REGION", "cn-beijing-6")
|
|
223
|
+
return region
|
|
224
|
+
|
|
225
|
+
|
|
226
|
+
def _resolve_custom_source(region: str) -> str:
|
|
227
|
+
if (region or "").strip().lower() == "pre-online":
|
|
228
|
+
return os.environ.get("AGENTENGINE_PRE_CUSTOM_SOURCE", "pre")
|
|
229
|
+
return ""
|
|
230
|
+
|
|
231
|
+
|
|
232
|
+
def _normalize_base_url(base_url: str) -> str:
|
|
233
|
+
parsed = urlsplit(base_url.strip())
|
|
234
|
+
path = parsed.path.rstrip("/")
|
|
235
|
+
if path.endswith("/openapi.json"):
|
|
236
|
+
path = path[: -len("/openapi.json")]
|
|
237
|
+
elif path.endswith("/docs"):
|
|
238
|
+
path = path[: -len("/docs")] + "/api/v1"
|
|
239
|
+
return urlunsplit((parsed.scheme, parsed.netloc, path, "", "")).rstrip("/")
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
import os
|
|
4
|
+
|
|
5
|
+
from ksadk.common.aicp_env import resolve_aicp_connection
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
def parse_skill_space_ids(*raw_values: str) -> list[str]:
|
|
9
|
+
spaces: list[str] = []
|
|
10
|
+
seen: set[str] = set()
|
|
11
|
+
for raw in raw_values:
|
|
12
|
+
for part in raw.split(","):
|
|
13
|
+
space_id = part.strip()
|
|
14
|
+
if not space_id or space_id in seen:
|
|
15
|
+
continue
|
|
16
|
+
seen.add(space_id)
|
|
17
|
+
spaces.append(space_id)
|
|
18
|
+
return spaces
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
def user_skill_space_ids() -> list[str]:
|
|
22
|
+
return parse_skill_space_ids(
|
|
23
|
+
os.environ.get("KSADK_SKILL_SPACE_IDS") or os.environ.get("SKILL_SPACE_ID") or ""
|
|
24
|
+
)
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
def public_skill_space_ids() -> list[str]:
|
|
28
|
+
return parse_skill_space_ids(os.environ.get("KSADK_PUBLIC_SKILL_SPACE_IDS") or "")
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
def skill_space_ids() -> list[str]:
|
|
32
|
+
return parse_skill_space_ids(
|
|
33
|
+
os.environ.get("KSADK_SKILL_SPACE_IDS") or os.environ.get("SKILL_SPACE_ID") or "",
|
|
34
|
+
os.environ.get("KSADK_PUBLIC_SKILL_SPACE_IDS") or "",
|
|
35
|
+
)
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
def resolve_skill_service_url(*, require_spaces: bool = True) -> str:
|
|
39
|
+
explicit = os.environ.get("KSADK_SKILL_SERVICE_URL", "").strip()
|
|
40
|
+
if explicit:
|
|
41
|
+
return explicit
|
|
42
|
+
if require_spaces and not skill_space_ids():
|
|
43
|
+
return ""
|
|
44
|
+
|
|
45
|
+
connection = resolve_aicp_connection("KSADK_SKILL_SERVICE")
|
|
46
|
+
return f"{connection['scheme']}://{connection['endpoint']}".rstrip("/")
|
|
47
|
+
|
|
48
|
+
|
|
49
|
+
def should_resolve_child_skill_service_url() -> bool:
|
|
50
|
+
if os.environ.get("KSADK_SKILL_SERVICE_URL", "").strip():
|
|
51
|
+
return True
|
|
52
|
+
if os.environ.get("KSADK_SKILL_SERVICE_ENDPOINT", "").strip():
|
|
53
|
+
return True
|
|
54
|
+
if os.environ.get("KSADK_SKILL_SERVICE_SCHEME", "").strip():
|
|
55
|
+
return True
|
|
56
|
+
|
|
57
|
+
mode = os.environ.get("KSADK_AICP_ENDPOINT_MODE", "").strip().lower()
|
|
58
|
+
return mode not in {"", "auto", "detect"}
|