agentengine-sdk-python 0.7.0__py3-none-any.whl → 0.8.0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {agentengine_sdk_python-0.7.0.dist-info → agentengine_sdk_python-0.8.0.dist-info}/METADATA +36 -20
- agentengine_sdk_python-0.8.0.dist-info/RECORD +578 -0
- ksadk/a2a/__init__.py +178 -11
- ksadk/a2a/bootstrap.py +334 -0
- ksadk/a2a/card.py +120 -0
- ksadk/a2a/context_store.py +203 -0
- ksadk/a2a/control_plane.py +818 -0
- ksadk/a2a/credential.py +99 -0
- ksadk/a2a/event_adapter.py +149 -0
- ksadk/a2a/executor.py +406 -89
- ksadk/a2a/external_transport.py +516 -0
- ksadk/a2a/identity.py +304 -0
- ksadk/a2a/ids.py +22 -0
- ksadk/a2a/langgraph.py +285 -0
- ksadk/a2a/resume_store.py +201 -0
- ksadk/a2a/routes.py +105 -0
- ksadk/a2a/server.py +107 -60
- ksadk/a2a/space_client.py +1101 -0
- ksadk/a2a/task_adapter.py +423 -0
- ksadk/a2a/task_event_dispatcher.py +167 -0
- ksadk/a2a/task_event_outbox.py +326 -0
- ksadk/a2a/task_store.py +206 -0
- ksadk/a2ui/__init__.py +27 -0
- ksadk/a2ui/core.py +186 -0
- ksadk/a2ui/models.py +166 -0
- ksadk/a2ui/renderer.py +198 -0
- ksadk/agui/__init__.py +9 -0
- ksadk/agui/a2ui_projection.py +92 -0
- ksadk/agui/agent.py +857 -0
- ksadk/agui/config.py +86 -0
- ksadk/agui/routes.py +55 -0
- ksadk/api/client.py +233 -191
- ksadk/builders/__init__.py +2 -0
- ksadk/builders/base.py +16 -14
- ksadk/builders/code_builder.py +318 -236
- ksadk/builders/container_builder.py +187 -167
- ksadk/builders/framework_requirements.py +29 -11
- ksadk/builders/ks3_uploader.py +58 -27
- ksadk/builders/managed_runtime_builder.py +145 -0
- ksadk/builders/mcp_builder.py +91 -92
- ksadk/builders/requirements_utils.py +1 -5
- ksadk/cli/__init__.py +89 -171
- ksadk/cli/cmd_a2a.py +254 -70
- ksadk/cli/cmd_agent.py +19 -5
- ksadk/cli/cmd_build.py +158 -29
- ksadk/cli/cmd_completion.py +47 -35
- ksadk/cli/cmd_config.py +267 -198
- ksadk/cli/cmd_create.py +500 -720
- ksadk/cli/cmd_dashboard.py +120 -45
- ksadk/cli/cmd_deploy.py +117 -58
- ksadk/cli/cmd_destroy.py +44 -14
- ksadk/cli/cmd_files.py +63 -24
- ksadk/cli/cmd_hermes.py +168 -89
- ksadk/cli/cmd_invoke.py +184 -122
- ksadk/cli/cmd_launch.py +64 -28
- ksadk/cli/cmd_mcp.py +98 -64
- ksadk/cli/cmd_model.py +14 -5
- ksadk/cli/cmd_openclaw.py +483 -227
- ksadk/cli/cmd_replay.py +71 -0
- ksadk/cli/cmd_run.py +33 -10
- ksadk/cli/cmd_status.py +80 -31
- ksadk/cli/cmd_version.py +20 -13
- ksadk/cli/cmd_web.py +89 -13
- ksadk/cli/deploy_utils.py +20 -20
- ksadk/cli/dry_run.py +5 -3
- ksadk/cli/error_utils.py +37 -12
- ksadk/cli/global_options.py +1 -2
- ksadk/cli/local_runtime.py +1 -2
- ksadk/cli/model_catalog.py +6 -2
- ksadk/cli/network_options.py +34 -14
- ksadk/cli/resource_common.py +6 -2
- ksadk/cli/storage.py +0 -1
- ksadk/cli/ui.py +5 -3
- ksadk/cli/workflow_common.py +51 -17
- ksadk/codex/__init__.py +12 -0
- ksadk/codex/client.py +408 -0
- ksadk/codex/phase.py +143 -0
- ksadk/codex/runtime.py +449 -0
- ksadk/common/aicp_env.py +0 -1
- ksadk/common/auth.py +2 -2
- ksadk/common/constants.py +1 -3
- ksadk/common/llm_utils.py +17 -13
- ksadk/compat/__init__.py +5 -0
- ksadk/compat/adk_compat.py +200 -0
- ksadk/compat/copilotkit_a2ui.py +330 -0
- ksadk/configs/__init__.py +12 -12
- ksadk/configs/env_registry.py +500 -100
- ksadk/configs/global_config.py +2 -1
- ksadk/configs/settings.py +151 -124
- ksadk/conversations/__init__.py +7 -5
- ksadk/conversations/attachment_storage.py +16 -11
- ksadk/conversations/attachments.py +44 -36
- ksadk/conversations/compaction_pipeline.py +12 -12
- ksadk/conversations/compaction_prompt.py +9 -5
- ksadk/conversations/context.py +221 -6
- ksadk/conversations/message_projection.py +438 -51
- ksadk/conversations/model_context.py +12 -6
- ksadk/conversations/model_options.py +0 -1
- ksadk/conversations/normalize.py +20 -16
- ksadk/conversations/reasoning_markup.py +1 -1
- ksadk/conversations/runtime.py +339 -5255
- ksadk/conversations/runtime_compaction.py +333 -0
- ksadk/conversations/runtime_constants.py +27 -0
- ksadk/conversations/runtime_governance.py +185 -0
- ksadk/conversations/runtime_input.py +652 -0
- ksadk/conversations/runtime_invocation.py +395 -0
- ksadk/conversations/runtime_metadata.py +475 -0
- ksadk/conversations/runtime_observability.py +355 -0
- ksadk/conversations/runtime_payloads.py +272 -0
- ksadk/conversations/runtime_persistence.py +440 -0
- ksadk/conversations/runtime_preparation.py +418 -0
- ksadk/conversations/runtime_resume.py +816 -0
- ksadk/conversations/runtime_stream_events.py +902 -0
- ksadk/conversations/runtime_streaming.py +547 -0
- ksadk/conversations/semantic_summary.py +17 -5
- ksadk/conversations/session_title.py +6 -3
- ksadk/deployment/__init__.py +15 -16
- ksadk/deployment/agent_access.py +12 -23
- ksadk/deployment/base.py +51 -38
- ksadk/deployment/manager.py +63 -65
- ksadk/deployment/providers/serverless.py +309 -202
- ksadk/deployment/registry.py +38 -32
- ksadk/deployment/state.py +11 -11
- ksadk/deployment/ui_config.py +1 -1
- ksadk/detection/__init__.py +1 -1
- ksadk/detection/detector.py +146 -83
- ksadk/detection/mcp_detector.py +9 -6
- ksadk/events/__init__.py +25 -0
- ksadk/events/parser.py +191 -0
- ksadk/events/replay.py +37 -0
- ksadk/events/runtime_event.py +264 -0
- ksadk/events/store.py +317 -0
- ksadk/harness/__init__.py +34 -0
- ksadk/harness/app.py +278 -0
- ksadk/harness/config.py +181 -0
- ksadk/harness/reasoner.py +105 -0
- ksadk/harness/runner.py +211 -0
- ksadk/harness/sandbox.py +141 -0
- ksadk/harness/tools.py +222 -0
- ksadk/hermes_terminal.py +23 -12
- ksadk/identity/resolver.py +15 -9
- ksadk/ids.py +32 -0
- ksadk/knowledge_base/adk_tool.py +1 -1
- ksadk/knowledge_base/client.py +23 -29
- ksadk/managed_runtime.py +188 -0
- ksadk/markdown.py +5 -2
- ksadk/mcp_runtime/__init__.py +9 -6
- ksadk/memory/__init__.py +1 -1
- ksadk/memory/adk/__init__.py +2 -0
- ksadk/memory/adk/backends/base_ltm_backend.py +2 -6
- ksadk/memory/adk/backends/http_ltm_backend.py +13 -21
- ksadk/memory/adk/backends/inmemory_ltm_backend.py +7 -13
- ksadk/memory/adk/backends/sdk_ltm_backend.py +26 -33
- ksadk/memory/adk/long_term_memory.py +31 -35
- ksadk/memory/adk/resilient_session_service.py +4 -5
- ksadk/memory/adk/short_term_memory.py +12 -21
- ksadk/memory/adk_tool.py +3 -2
- ksadk/memory/backends/base.py +19 -19
- ksadk/memory/backends/memory.py +24 -25
- ksadk/memory/backends/redis.py +31 -30
- ksadk/memory/langchain_tool.py +2 -1
- ksadk/memory/manager.py +52 -47
- ksadk/memory/service.py +10 -8
- ksadk/model_policy.py +15 -7
- ksadk/model_proxy/__init__.py +51 -0
- ksadk/model_proxy/bootstrap.py +80 -0
- ksadk/model_proxy/cache.py +165 -0
- ksadk/model_proxy/config.py +45 -0
- ksadk/model_proxy/demo_webui.py +115 -0
- ksadk/model_proxy/detect.py +145 -0
- ksadk/model_proxy/gate.py +68 -0
- ksadk/model_proxy/namespace.py +173 -0
- ksadk/model_proxy/protocol_proxy.py +22 -0
- ksadk/model_proxy/server.py +300 -0
- ksadk/model_proxy/transform.py +691 -0
- ksadk/openclaw_gateway.py +29 -14
- ksadk/runners/adk_runner.py +345 -120
- ksadk/runners/base_runner.py +46 -29
- ksadk/runners/codex_runner.py +132 -0
- ksadk/runners/deepagents_runner.py +0 -1
- ksadk/runners/factory.py +17 -5
- ksadk/runners/langchain_runner.py +29 -742
- ksadk/runners/langgraph_runner.py +352 -90
- ksadk/runners/patch_langchain.py +16 -16
- ksadk/runners/remote_runner.py +134 -33
- ksadk/runners/usage_accumulator.py +1 -0
- ksadk/runners/utils/langfuse.py +3 -3
- ksadk/runners/utils/loader.py +7 -7
- ksadk/runtime/__init__.py +41 -0
- ksadk/runtime/adapter.py +345 -0
- ksadk/runtime/framework_adapters.py +124 -0
- ksadk/runtime/preprocessing.py +118 -0
- ksadk/runtime/runner_adapter.py +873 -0
- ksadk/runtime_context.py +18 -3
- ksadk/runtime_state.py +0 -1
- ksadk/sandbox/__init__.py +4 -1
- ksadk/sandbox/backends/__init__.py +4 -1
- ksadk/sandbox/backends/e2b.py +13 -5
- ksadk/sandbox/backends/local_process.py +11 -3
- ksadk/sandbox/base.py +10 -15
- ksadk/sandbox/factory.py +14 -4
- ksadk/sandbox/registry.py +57 -6
- ksadk/server/api_models.py +15 -5
- ksadk/server/app.py +455 -3885
- ksadk/server/composition.py +21 -0
- ksadk/server/factory.py +624 -0
- ksadk/server/routes/__init__.py +1 -0
- ksadk/server/routes/checkpoint_resolution.py +116 -0
- ksadk/server/routes/common.py +713 -0
- ksadk/server/routes/control.py +327 -0
- ksadk/server/routes/dependencies.py +98 -0
- ksadk/server/routes/misc.py +448 -0
- ksadk/server/routes/models.py +443 -0
- ksadk/server/routes/openai_compat.py +207 -0
- ksadk/server/routes/projection.py +795 -0
- ksadk/server/routes/routers.py +52 -0
- ksadk/server/routes/run.py +726 -0
- ksadk/server/routes/sessions.py +649 -0
- ksadk/server/routes/streaming.py +223 -0
- ksadk/server/routes/workspace.py +381 -0
- ksadk/server/static/assets/{ArtifactsPanel-D-SSn2ee.js → ArtifactsPanel-Cjnqt-8W.js} +1 -1
- ksadk/server/static/assets/CodeBlock-BqyqZfuB.js +9 -0
- ksadk/server/static/assets/MathMessageMarkdown-BpH7jiFM.js +8 -0
- ksadk/server/static/assets/MermaidBlock-DWuxETaJ.js +303 -0
- ksadk/server/static/assets/NativeTerminalPanel-MDTopWMO.js +1 -0
- ksadk/server/static/assets/{arc-BA13sHc9.js → arc-CFKwSk_B.js} +1 -1
- ksadk/server/static/assets/architecture-7EHR7CIX-CynqOWjZ.js +1 -0
- ksadk/server/static/assets/{architectureDiagram-3BPJPVTR-DzJzgVoL.js → architectureDiagram-3BPJPVTR-Dej8jX8c.js} +1 -1
- ksadk/server/static/assets/{blockDiagram-GPEHLZMM-UTdVcZhn.js → blockDiagram-GPEHLZMM-1F64jqvy.js} +1 -1
- ksadk/server/static/assets/{c4Diagram-AAUBKEIU-Dix0GD4m.js → c4Diagram-AAUBKEIU-9q7AUAKb.js} +1 -1
- ksadk/server/static/assets/channel-iUGv2N24.js +1 -0
- ksadk/server/static/assets/{chunk-2J33WTMH-C2JxuZ42.js → chunk-2J33WTMH-6qgwJm7Q.js} +1 -1
- ksadk/server/static/assets/{chunk-4BX2VUAB-Be57QPgD.js → chunk-4BX2VUAB-CsWIQRhc.js} +1 -1
- ksadk/server/static/assets/{chunk-55IACEB6-WjSuy4nv.js → chunk-55IACEB6-BK8paA20.js} +1 -1
- ksadk/server/static/assets/{chunk-727SXJPM-BOovP-b5.js → chunk-727SXJPM-B-JEhy7h.js} +1 -1
- ksadk/server/static/assets/{chunk-AQP2D5EJ-DOmZNmWj.js → chunk-AQP2D5EJ-DYBvMHAa.js} +1 -1
- ksadk/server/static/assets/{chunk-FMBD7UC4-DzwlodkU.js → chunk-FMBD7UC4-BGhvzDYt.js} +1 -1
- ksadk/server/static/assets/{chunk-ND2GUHAM-DMqAikEU.js → chunk-ND2GUHAM-D98vPd-E.js} +1 -1
- ksadk/server/static/assets/chunk-QZHKN3VN-YQIEXeF6.js +1 -0
- ksadk/server/static/assets/classDiagram-4FO5ZUOK-CDAUuoXK.js +1 -0
- ksadk/server/static/assets/classDiagram-v2-Q7XG4LA2-CDAUuoXK.js +1 -0
- ksadk/server/static/assets/{cose-bilkent-S5V4N54A-Zhy2GBnP.js → cose-bilkent-S5V4N54A-CX3yotHq.js} +1 -1
- ksadk/server/static/assets/{dagre-BM42HDAG-CbKrtIUz.js → dagre-BM42HDAG-C7TguAWo.js} +1 -1
- ksadk/server/static/assets/{diagram-2AECGRRQ-BRApgQRK.js → diagram-2AECGRRQ-Dd17_kws.js} +1 -1
- ksadk/server/static/assets/{diagram-5GNKFQAL-D0xbnDiK.js → diagram-5GNKFQAL-DVIClIil.js} +1 -1
- ksadk/server/static/assets/{diagram-KO2AKTUF-CVugVI9L.js → diagram-KO2AKTUF-Df_3gYQa.js} +1 -1
- ksadk/server/static/assets/{diagram-LMA3HP47-DozUGgee.js → diagram-LMA3HP47-BhLk6ZtA.js} +1 -1
- ksadk/server/static/assets/{diagram-OG6HWLK6-ZOYsKlru.js → diagram-OG6HWLK6-D4GNGvuu.js} +1 -1
- ksadk/server/static/assets/{dist-DmFaq_Iy.js → dist-6CVKuTAe.js} +1 -1
- ksadk/server/static/assets/{dist-8EEyGgDx.js → dist-BUHRxvDG.js} +1 -1
- ksadk/server/static/assets/{dist-B0NP_Z0z.js → dist-BZ9n9AjO.js} +1 -1
- ksadk/server/static/assets/{dist-DMezvBGJ.js → dist-BibcG1V9.js} +1 -1
- ksadk/server/static/assets/{dist-C3HIIaN5.js → dist-Bs-jQcRX.js} +1 -1
- ksadk/server/static/assets/{dist-BrCcQ47T.js → dist-C2xjE7cO.js} +1 -1
- ksadk/server/static/assets/{dist-Dp0k7bWI.js → dist-C7-3jInC.js} +1 -1
- ksadk/server/static/assets/{dist-D-xOD048.js → dist-C99THtIA.js} +1 -1
- ksadk/server/static/assets/{dist-CkEKJFtk.js → dist-CGcp2ex8.js} +1 -1
- ksadk/server/static/assets/{dist-DyOkZmze.js → dist-CVQRZjPu.js} +1 -1
- ksadk/server/static/assets/{dist-BssVmjIo.js → dist-Cf23NY4L.js} +1 -1
- ksadk/server/static/assets/{dist-BIJVDMuB.js → dist-CgF3fj15.js} +1 -1
- ksadk/server/static/assets/{dist-2hInLS_J.js → dist-Cwt7koer.js} +1 -1
- ksadk/server/static/assets/{dist-DyWsb78Q.js → dist-D82mtD2s.js} +1 -1
- ksadk/server/static/assets/{dist-D-JMdWPQ.js → dist-DF06ORQo.js} +1 -1
- ksadk/server/static/assets/{dist-BmlMPsCc.js → dist-DHn6nBzr.js} +1 -1
- ksadk/server/static/assets/{dist-gX6GOLKq.js → dist-Djgl2wVZ.js} +1 -1
- ksadk/server/static/assets/{dist-DpKtt4Bo.js → dist-DlzCRy0S.js} +1 -1
- ksadk/server/static/assets/{dist-8_SfK1IP.js → dist-DqNnNFrw.js} +1 -1
- ksadk/server/static/assets/{dist-D57wnGWd.js → dist-DyvYLMW9.js} +1 -1
- ksadk/server/static/assets/{dist-CPBtqRTW.js → dist-eoW6tZXA.js} +1 -1
- ksadk/server/static/assets/{dist-DL_NKc_z.js → dist-ivOya1LD.js} +1 -1
- ksadk/server/static/assets/{erDiagram-TEJ5UH35-Bk-9bgE5.js → erDiagram-TEJ5UH35-CnfRcY2M.js} +1 -1
- ksadk/server/static/assets/eventmodeling-FCH6USID-ChYO-ijM.js +1 -0
- ksadk/server/static/assets/{flowDiagram-I6XJVG4X-Dn9kZVuZ.js → flowDiagram-I6XJVG4X-DGaJjGNJ.js} +1 -1
- ksadk/server/static/assets/{ganttDiagram-6RSMTGT7-BGxXlJqm.js → ganttDiagram-6RSMTGT7-DpCoB2g9.js} +1 -1
- ksadk/server/static/assets/gitGraph-WXDBUCRP-BN_0Fk-j.js +1 -0
- ksadk/server/static/assets/{gitGraphDiagram-PVQCEYII-C7Q0X-wi.js → gitGraphDiagram-PVQCEYII-9IKVFBVT.js} +1 -1
- ksadk/server/static/assets/index-QSwCHuB8.js +177 -0
- ksadk/server/static/assets/index-jOPmTOZH.css +2 -0
- ksadk/server/static/assets/info-J43DQDTF-Cp6o3vId.js +1 -0
- ksadk/server/static/assets/{infoDiagram-5YYISTIA-BO_CSqq5.js → infoDiagram-5YYISTIA-CYIIsb8y.js} +1 -1
- ksadk/server/static/assets/{ishikawaDiagram-YF4QCWOH-eYLPLd46.js → ishikawaDiagram-YF4QCWOH-DLOHGvWw.js} +1 -1
- ksadk/server/static/assets/{journeyDiagram-JHISSGLW-De9geSb0.js → journeyDiagram-JHISSGLW-BIzKeejT.js} +1 -1
- ksadk/server/static/assets/{kanban-definition-UN3LZRKU-Cs80kQto.js → kanban-definition-UN3LZRKU-BWHoFSw2.js} +1 -1
- ksadk/server/static/assets/{katex-DSrCFD8n.js → katex-DATssjp1.js} +1 -1
- ksadk/server/static/assets/{linear-CN9sbKTF.js → linear-CvMBw9cA.js} +1 -1
- ksadk/server/static/assets/{mermaid-parser.core-DlgSBU8l.js → mermaid-parser.core-mGAcEwcq.js} +2 -2
- ksadk/server/static/assets/{mindmap-definition-RKZ34NQL-9afz7Oug.js → mindmap-definition-RKZ34NQL-CSAQxEAe.js} +1 -1
- ksadk/server/static/assets/packet-YPE3B663-wQzct3cT.js +1 -0
- ksadk/server/static/assets/pie-LRSECV5Y-BgTQiv-9.js +1 -0
- ksadk/server/static/assets/{pieDiagram-4H26LBE5-DPv_VstN.js → pieDiagram-4H26LBE5-By-ra07M.js} +1 -1
- ksadk/server/static/assets/{quadrantDiagram-W4KKPZXB-o77wZ1XK.js → quadrantDiagram-W4KKPZXB-CxIR4JXI.js} +1 -1
- ksadk/server/static/assets/radar-GUYGQ44K-BIq5fXsn.js +1 -0
- ksadk/server/static/assets/{requirementDiagram-4Y6WPE33-BYVw81VC.js → requirementDiagram-4Y6WPE33-DpW90iu3.js} +1 -1
- ksadk/server/static/assets/{sankeyDiagram-5OEKKPKP-B7nZFMKT.js → sankeyDiagram-5OEKKPKP-DpGa6EAV.js} +1 -1
- ksadk/server/static/assets/{sequenceDiagram-3UESZ5HK-BGRRrFw5.js → sequenceDiagram-3UESZ5HK-NTKNGGe5.js} +1 -1
- ksadk/server/static/assets/{stateDiagram-AJRCARHV-BUfHCoPs.js → stateDiagram-AJRCARHV-DGpd9yFG.js} +1 -1
- ksadk/server/static/assets/stateDiagram-v2-BHNVJYJU-B3o579IQ.js +1 -0
- ksadk/server/static/assets/{timeline-definition-PNZ67QCA-FbCTGrf9.js → timeline-definition-PNZ67QCA-jqoYs3jQ.js} +1 -1
- ksadk/server/static/assets/treeView-BLDUP644-Dqi-E0EM.js +1 -0
- ksadk/server/static/assets/treemap-LRROVOQU-ClQP9CJ9.js +1 -0
- ksadk/server/static/assets/{vennDiagram-CIIHVFJN-DWgwtPsJ.js → vennDiagram-CIIHVFJN-l3Z7-wbP.js} +1 -1
- ksadk/server/static/assets/wardley-L42UT6IY-8XLvnNIs.js +1 -0
- ksadk/server/static/assets/{wardleyDiagram-YWT4CUSO-2x8G-tTM.js → wardleyDiagram-YWT4CUSO-BR54GPmr.js} +1 -1
- ksadk/server/static/assets/{xychartDiagram-2RQKCTM6-Drma3AYl.js → xychartDiagram-2RQKCTM6-SkiH8GsK.js} +1 -1
- ksadk/server/static/index.html +2 -2
- ksadk/server/terminal_sessions.py +111 -58
- ksadk/sessions/__init__.py +69 -19
- ksadk/sessions/base.py +31 -11
- ksadk/sessions/continuity.py +2 -3
- ksadk/sessions/in_memory.py +46 -2
- ksadk/sessions/local_service.py +148 -17
- ksadk/sessions/postgres_service.py +143 -25
- ksadk/sessions/resilient.py +36 -8
- ksadk/skills/models.py +17 -5
- ksadk/skills/package_store.py +5 -2
- ksadk/skills/runtime/agent.py +20 -5
- ksadk/skills/runtime/artifacts.py +1 -5
- ksadk/skills/runtime/backends/e2b.py +10 -4
- ksadk/skills/runtime/backends/local.py +15 -3
- ksadk/skills/runtime/base.py +1 -2
- ksadk/skills/runtime/executor.py +10 -3
- ksadk/skills/runtime/factory.py +4 -2
- ksadk/skills/runtime/loader.py +1 -2
- ksadk/skills/runtime/registry.py +15 -10
- ksadk/skills/runtime/request.py +3 -1
- ksadk/skills/service_client.py +38 -17
- ksadk/skills/tool_defs.py +15 -10
- ksadk/terminal_exec_policy.py +3 -4
- ksadk/tools/gateway.py +92 -15
- ksadk/tools/result_budget.py +12 -4
- ksadk/toolsets/__init__.py +134 -36
- ksadk/toolsets/platform.py +21 -5
- ksadk/toolsets/sandbox.py +82 -16
- ksadk/toolsets/skills.py +200 -39
- ksadk/toolsets/web.py +123 -26
- ksadk/toolsets/workspace.py +212 -101
- ksadk/tracing/exporters/inmemory_exporter.py +62 -51
- ksadk/tracing/exporters/langfuse_exporter.py +91 -76
- ksadk/tracing/setup.py +69 -53
- ksadk/tracing/span_utils.py +5 -2
- ksadk/tui/loop.py +78 -30
- ksadk/tui/stream_render.py +1 -0
- ksadk/ui_config.py +5 -3
- ksadk/version.py +1 -1
- ksadk_runtime_common/schemas/runtime_event_v1.json +95 -0
- agentengine_sdk_python-0.7.0.dist-info/RECORD +0 -482
- ksadk/server/static/assets/CodeBlock-P16VOLYi.js +0 -9
- ksadk/server/static/assets/MathMessageMarkdown-CdGiQWHR.js +0 -8
- ksadk/server/static/assets/MermaidBlock-IOcal8cm.js +0 -303
- ksadk/server/static/assets/NativeTerminalPanel-DGSDWsei.js +0 -1
- ksadk/server/static/assets/architecture-7EHR7CIX-BvUlsA6l.js +0 -1
- ksadk/server/static/assets/channel-CTuydARX.js +0 -1
- ksadk/server/static/assets/chunk-QZHKN3VN-BnCydivS.js +0 -1
- ksadk/server/static/assets/classDiagram-4FO5ZUOK-BNHg45Be.js +0 -1
- ksadk/server/static/assets/classDiagram-v2-Q7XG4LA2-BNHg45Be.js +0 -1
- ksadk/server/static/assets/eventmodeling-FCH6USID-DsAgWnlf.js +0 -1
- ksadk/server/static/assets/gitGraph-WXDBUCRP-BIao9Yjg.js +0 -1
- ksadk/server/static/assets/index-C00Lwg3L.js +0 -165
- ksadk/server/static/assets/index-DAURbCsP.css +0 -1
- ksadk/server/static/assets/info-J43DQDTF-CyipqGxU.js +0 -1
- ksadk/server/static/assets/packet-YPE3B663-CGkyRxlg.js +0 -1
- ksadk/server/static/assets/pie-LRSECV5Y-M0uWAf4n.js +0 -1
- ksadk/server/static/assets/radar-GUYGQ44K-Bdbm24-x.js +0 -1
- ksadk/server/static/assets/stateDiagram-v2-BHNVJYJU-8xBN_gLM.js +0 -1
- ksadk/server/static/assets/treeView-BLDUP644-npMo0ak1.js +0 -1
- ksadk/server/static/assets/treemap-LRROVOQU-CHdzrrdo.js +0 -1
- ksadk/server/static/assets/wardley-L42UT6IY-BEQz7wyy.js +0 -1
- {agentengine_sdk_python-0.7.0.dist-info → agentengine_sdk_python-0.8.0.dist-info}/WHEEL +0 -0
- {agentengine_sdk_python-0.7.0.dist-info → agentengine_sdk_python-0.8.0.dist-info}/entry_points.txt +0 -0
- {agentengine_sdk_python-0.7.0.dist-info → agentengine_sdk_python-0.8.0.dist-info}/licenses/LICENSE +0 -0
- {agentengine_sdk_python-0.7.0.dist-info → agentengine_sdk_python-0.8.0.dist-info}/top_level.txt +0 -0
ksadk/cli/cmd_launch.py
CHANGED
|
@@ -2,14 +2,26 @@
|
|
|
2
2
|
agentengine launch - 一键完成构建和部署
|
|
3
3
|
"""
|
|
4
4
|
|
|
5
|
-
import click
|
|
6
|
-
import asyncio
|
|
7
5
|
from pathlib import Path
|
|
6
|
+
from typing import Any
|
|
7
|
+
|
|
8
|
+
import click
|
|
9
|
+
|
|
8
10
|
from ksadk.api.client import DryRunExit
|
|
9
|
-
from ksadk.cli.cmd_deploy import
|
|
11
|
+
from ksadk.cli.cmd_deploy import (
|
|
12
|
+
_apply_network_config,
|
|
13
|
+
_resolve_artifact_type_input,
|
|
14
|
+
_resolve_ui_config_inputs,
|
|
15
|
+
)
|
|
10
16
|
from ksadk.cli.dry_run import effective_dry_run, run_async_with_dry_run
|
|
11
17
|
from ksadk.cli.env_options import env_options, resolve_explicit_env_vars
|
|
12
|
-
from ksadk.cli.error_utils import
|
|
18
|
+
from ksadk.cli.error_utils import (
|
|
19
|
+
cli_error_from_exception,
|
|
20
|
+
is_debug_mode_enabled,
|
|
21
|
+
remote_error,
|
|
22
|
+
usage_error,
|
|
23
|
+
validation_error,
|
|
24
|
+
)
|
|
13
25
|
from ksadk.cli.network_options import (
|
|
14
26
|
apply_network_cli_overrides,
|
|
15
27
|
network_cli_kwargs,
|
|
@@ -18,6 +30,18 @@ from ksadk.cli.network_options import (
|
|
|
18
30
|
validate_deploy_target_network,
|
|
19
31
|
)
|
|
20
32
|
from ksadk.cli.storage import build_storage_config
|
|
33
|
+
from ksadk.cli.ui import (
|
|
34
|
+
capture_standard_output,
|
|
35
|
+
is_json_output,
|
|
36
|
+
print_info,
|
|
37
|
+
print_kv,
|
|
38
|
+
print_rule,
|
|
39
|
+
print_success,
|
|
40
|
+
print_warn,
|
|
41
|
+
)
|
|
42
|
+
from ksadk.cli.ui import (
|
|
43
|
+
output_option as cli_output_option,
|
|
44
|
+
)
|
|
21
45
|
from ksadk.cli.workflow_common import (
|
|
22
46
|
build_workflow_local_plan,
|
|
23
47
|
clear_build_metadata,
|
|
@@ -31,17 +55,10 @@ from ksadk.cli.workflow_common import (
|
|
|
31
55
|
resolve_artifact_build_plan,
|
|
32
56
|
)
|
|
33
57
|
from ksadk.deployment.ui_config import SUPPORTED_UI_PROFILES
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
print_error,
|
|
39
|
-
print_info,
|
|
40
|
-
print_kv,
|
|
41
|
-
print_rule,
|
|
42
|
-
print_success,
|
|
43
|
-
print_warn,
|
|
44
|
-
)
|
|
58
|
+
|
|
59
|
+
|
|
60
|
+
def _dict_or_none(value: object) -> dict[str, Any] | None:
|
|
61
|
+
return dict(value) if isinstance(value, dict) and value else None
|
|
45
62
|
|
|
46
63
|
|
|
47
64
|
@click.command(context_settings=dict(help_option_names=["-h", "--help"]))
|
|
@@ -54,8 +71,12 @@ from ksadk.cli.ui import (
|
|
|
54
71
|
help="部署目标 (default: serverless)",
|
|
55
72
|
)
|
|
56
73
|
@click.option("--name", "-n", help="部署名称")
|
|
57
|
-
@click.option(
|
|
58
|
-
|
|
74
|
+
@click.option(
|
|
75
|
+
"--region", "-r", default="cn-beijing-6", envvar="KSYUN_REGION", help="区域 (serverless)"
|
|
76
|
+
)
|
|
77
|
+
@click.option(
|
|
78
|
+
"--account-id", envvar="KSYUN_ACCOUNT_ID", help="金山云账号 ID(可选;未设置时从 AK/SK 反查)"
|
|
79
|
+
)
|
|
59
80
|
@click.option("--observability/--no-observability", default=True, help="是否启用可观测性")
|
|
60
81
|
@click.option("--no-cache", is_flag=True, help="强制重新构建,不使用缓存")
|
|
61
82
|
@click.option("--port", "-p", default=8000, help="服务端口 (default: 8000)")
|
|
@@ -71,7 +92,10 @@ from ksadk.cli.ui import (
|
|
|
71
92
|
@click.option(
|
|
72
93
|
"--storage-mount-path",
|
|
73
94
|
default=None,
|
|
74
|
-
help=
|
|
95
|
+
help=(
|
|
96
|
+
"PVC 挂载目录(hermes/openclaw 默认按框架推导;"
|
|
97
|
+
"adk/langgraph 等其他框架默认不挂盘,需显式指定)"
|
|
98
|
+
),
|
|
75
99
|
)
|
|
76
100
|
@click.option("--no-storage", is_flag=True, help="禁用默认 PVC 挂载")
|
|
77
101
|
@network_options
|
|
@@ -181,7 +205,7 @@ def launch(
|
|
|
181
205
|
lambda exc: render_workflow_dry_run(
|
|
182
206
|
action="launch",
|
|
183
207
|
request=dict(exc.payload or {}),
|
|
184
|
-
plan=
|
|
208
|
+
plan=_dict_or_none(dry_run_context.get("plan")),
|
|
185
209
|
)
|
|
186
210
|
),
|
|
187
211
|
)
|
|
@@ -223,8 +247,8 @@ async def _launch_async(
|
|
|
223
247
|
env_file: str | None = None,
|
|
224
248
|
dry_run_context: dict[str, object] | None = None,
|
|
225
249
|
):
|
|
226
|
-
from ksadk.detection import FrameworkDetector
|
|
227
250
|
from ksadk.deployment import DeploymentManager, DeployTarget
|
|
251
|
+
from ksadk.detection import FrameworkDetector
|
|
228
252
|
|
|
229
253
|
agent_path = Path(agent_dir).resolve()
|
|
230
254
|
config = _load_config(agent_path)
|
|
@@ -236,7 +260,11 @@ async def _launch_async(
|
|
|
236
260
|
)
|
|
237
261
|
except ValueError as e:
|
|
238
262
|
raise validation_error(str(e))
|
|
239
|
-
effective_artifact_type =
|
|
263
|
+
effective_artifact_type = (
|
|
264
|
+
_resolve_artifact_type_input(config, artifact_type)
|
|
265
|
+
if target == "serverless"
|
|
266
|
+
else artifact_type
|
|
267
|
+
)
|
|
240
268
|
print_workflow_header(
|
|
241
269
|
title="Agent Launch",
|
|
242
270
|
subtitle=f"target: {target}",
|
|
@@ -337,7 +365,9 @@ async def _launch_async(
|
|
|
337
365
|
explicit_artifact_reference = ks3_path if normalized_artifact_type == "code" else image
|
|
338
366
|
cached_artifact_reference = None
|
|
339
367
|
if not artifact_plan.should_clear_metadata:
|
|
340
|
-
cached_artifact_reference = load_cached_artifact_reference(
|
|
368
|
+
cached_artifact_reference = load_cached_artifact_reference(
|
|
369
|
+
agent_path, effective_artifact_type
|
|
370
|
+
)
|
|
341
371
|
resolved_artifact_plan = resolve_artifact_build_plan(
|
|
342
372
|
plan=artifact_plan,
|
|
343
373
|
target=target,
|
|
@@ -381,7 +411,7 @@ async def _launch_async(
|
|
|
381
411
|
package_info.metadata["image"] = resolved_artifact_plan.reference
|
|
382
412
|
else:
|
|
383
413
|
package_info.metadata["ks3_path"] = resolved_artifact_plan.reference
|
|
384
|
-
|
|
414
|
+
|
|
385
415
|
print_kv("构建目录", str(package_info.build_dir))
|
|
386
416
|
except Exception as e:
|
|
387
417
|
raise cli_error_from_exception(e, context="打包失败")
|
|
@@ -412,7 +442,7 @@ async def _launch_async(
|
|
|
412
442
|
if ks3:
|
|
413
443
|
print_kv("KS3 路径", ks3)
|
|
414
444
|
else:
|
|
415
|
-
print_kv("镜像", package_info.image)
|
|
445
|
+
print_kv("镜像", package_info.image or "-")
|
|
416
446
|
|
|
417
447
|
except Exception as e:
|
|
418
448
|
raise cli_error_from_exception(e, context="构建失败")
|
|
@@ -458,10 +488,11 @@ async def _launch_async(
|
|
|
458
488
|
print_warn("请妥善保存此 API Key,它仅在首次部署时显示")
|
|
459
489
|
if result.message:
|
|
460
490
|
print_kv("信息", result.message)
|
|
461
|
-
|
|
491
|
+
|
|
462
492
|
# 9. 自动创建版本快照 (除非指定 --no-version)
|
|
463
493
|
if result.agent_id and not no_version and not dry_run:
|
|
464
494
|
from ksadk.cli.deploy_utils import auto_release_version
|
|
495
|
+
|
|
465
496
|
with capture_standard_output():
|
|
466
497
|
await auto_release_version(result.agent_id, region, deploy_name)
|
|
467
498
|
|
|
@@ -494,7 +525,11 @@ async def _launch_async(
|
|
|
494
525
|
}
|
|
495
526
|
else:
|
|
496
527
|
if result.status.name == "SKIPPED":
|
|
497
|
-
dry_run_request =
|
|
528
|
+
dry_run_request = (
|
|
529
|
+
result.metadata.get("dry_run_request")
|
|
530
|
+
if isinstance(result.metadata, dict)
|
|
531
|
+
else None
|
|
532
|
+
)
|
|
498
533
|
if dry_run and dry_run_request:
|
|
499
534
|
raise DryRunExit(result.message or "Dry Run finished.", payload=dry_run_request)
|
|
500
535
|
print_warn(f"部署状态: {result.status.value}")
|
|
@@ -531,10 +566,11 @@ async def _launch_async(
|
|
|
531
566
|
)
|
|
532
567
|
if result.message:
|
|
533
568
|
print_info(result.message)
|
|
534
|
-
|
|
569
|
+
|
|
535
570
|
# 10. 自动回滚
|
|
536
571
|
if auto_rollback and result.agent_id and result.status.name not in ["SKIPPED"]:
|
|
537
572
|
from ksadk.cli.deploy_utils import auto_rollback_to_previous
|
|
573
|
+
|
|
538
574
|
with capture_standard_output():
|
|
539
575
|
await auto_rollback_to_previous(result.agent_id, region)
|
|
540
576
|
|
|
@@ -558,7 +594,7 @@ def _load_config(agent_path: Path) -> dict:
|
|
|
558
594
|
|
|
559
595
|
if config_path.exists():
|
|
560
596
|
# 使用 utf-8-sig 自动处理 BOM,确保 Windows 兼容性
|
|
561
|
-
with open(config_path, encoding=
|
|
597
|
+
with open(config_path, encoding="utf-8-sig") as f:
|
|
562
598
|
return yaml.safe_load(f) or {}
|
|
563
599
|
|
|
564
600
|
return {}
|
ksadk/cli/cmd_mcp.py
CHANGED
|
@@ -4,13 +4,23 @@ import os
|
|
|
4
4
|
from dataclasses import asdict, is_dataclass, replace
|
|
5
5
|
from datetime import datetime
|
|
6
6
|
from pathlib import Path
|
|
7
|
+
from typing import Any
|
|
7
8
|
|
|
8
9
|
import click
|
|
9
10
|
|
|
10
11
|
from ksadk.api.client import DryRunExit
|
|
12
|
+
from ksadk.builders.container_builder import (
|
|
13
|
+
registry_kind_label,
|
|
14
|
+
resolve_registry_credentials,
|
|
15
|
+
)
|
|
11
16
|
from ksadk.cli.agent_ref import resolve_mcp_ref
|
|
12
|
-
from ksadk.cli.dry_run import dry_run_option,
|
|
13
|
-
from ksadk.cli.error_utils import
|
|
17
|
+
from ksadk.cli.dry_run import dry_run_option, effective_dry_run, run_async_with_dry_run
|
|
18
|
+
from ksadk.cli.error_utils import (
|
|
19
|
+
abort_with_cli_error,
|
|
20
|
+
remote_error,
|
|
21
|
+
resolution_error,
|
|
22
|
+
validation_error,
|
|
23
|
+
)
|
|
14
24
|
from ksadk.cli.network_options import build_network_payload, network_cli_kwargs, network_options
|
|
15
25
|
from ksadk.cli.resource_common import (
|
|
16
26
|
CONTEXT_SETTINGS,
|
|
@@ -22,24 +32,24 @@ from ksadk.cli.resource_common import (
|
|
|
22
32
|
confirm_destructive,
|
|
23
33
|
confirm_options,
|
|
24
34
|
pagination_options,
|
|
25
|
-
|
|
35
|
+
region_option,
|
|
26
36
|
render_descriptor_list,
|
|
27
37
|
render_descriptor_status,
|
|
28
|
-
region_option,
|
|
29
38
|
)
|
|
30
39
|
from ksadk.cli.ui import (
|
|
31
40
|
capture_standard_output,
|
|
32
41
|
get_console,
|
|
33
42
|
is_json_output,
|
|
34
|
-
output_option as cli_output_option,
|
|
35
43
|
print_info,
|
|
36
44
|
print_kv,
|
|
37
45
|
print_rule,
|
|
38
46
|
print_success,
|
|
39
|
-
print_title,
|
|
40
47
|
print_warn,
|
|
41
48
|
status_rich_style,
|
|
42
49
|
)
|
|
50
|
+
from ksadk.cli.ui import (
|
|
51
|
+
output_option as cli_output_option,
|
|
52
|
+
)
|
|
43
53
|
from ksadk.cli.workflow_common import (
|
|
44
54
|
build_workflow_local_plan,
|
|
45
55
|
clear_build_metadata,
|
|
@@ -51,10 +61,6 @@ from ksadk.cli.workflow_common import (
|
|
|
51
61
|
render_workflow_result,
|
|
52
62
|
resolve_artifact_build_plan,
|
|
53
63
|
)
|
|
54
|
-
from ksadk.builders.container_builder import (
|
|
55
|
-
registry_kind_label,
|
|
56
|
-
resolve_registry_credentials,
|
|
57
|
-
)
|
|
58
64
|
|
|
59
65
|
console = get_console()
|
|
60
66
|
|
|
@@ -127,14 +133,14 @@ def mcp():
|
|
|
127
133
|
@click.option("--tag", help="镜像标签 (Container 模式)")
|
|
128
134
|
@click.option("--registry", help="镜像仓库地址 (Container 模式)")
|
|
129
135
|
@click.option(
|
|
130
|
-
"--region",
|
|
136
|
+
"--region",
|
|
137
|
+
"-r",
|
|
131
138
|
default="cn-beijing-6",
|
|
132
139
|
envvar="KSYUN_REGION",
|
|
133
140
|
help="构建使用的区域 (Code 模式用于 KS3,Container 模式用于默认镜像仓库推断)",
|
|
134
141
|
)
|
|
135
142
|
@click.option(
|
|
136
|
-
"--ks3-bucket",
|
|
137
|
-
help="KS3 存储桶名称 (Code 模式,默认: agentengine-{account_id}-{region})"
|
|
143
|
+
"--ks3-bucket", help="KS3 存储桶名称 (Code 模式,默认: agentengine-{account_id}-{region})"
|
|
138
144
|
)
|
|
139
145
|
@click.option(
|
|
140
146
|
"--no-cache",
|
|
@@ -177,28 +183,18 @@ def build(
|
|
|
177
183
|
render_workflow_result(action="build", result=result)
|
|
178
184
|
|
|
179
185
|
|
|
180
|
-
@mcp.command("deploy", context_settings=CONTEXT_SETTINGS)
|
|
186
|
+
@mcp.command("deploy", context_settings=CONTEXT_SETTINGS, short_help="部署 MCP Server 到云端")
|
|
181
187
|
@click.argument("mcp_dir", default=".", type=click.Path(exists=True))
|
|
188
|
+
@click.option("--name", "-n", help="MCP Server 名称 (默认: 目录名)")
|
|
182
189
|
@click.option(
|
|
183
|
-
"--
|
|
184
|
-
|
|
185
|
-
)
|
|
186
|
-
@click.option(
|
|
187
|
-
"--region", "-r",
|
|
190
|
+
"--region",
|
|
191
|
+
"-r",
|
|
188
192
|
default="cn-beijing-6",
|
|
189
193
|
envvar="KSYUN_REGION",
|
|
190
|
-
help="部署区域 (default: cn-beijing-6)"
|
|
191
|
-
)
|
|
192
|
-
@click.option(
|
|
193
|
-
"--ks3-bucket",
|
|
194
|
-
help="KS3 存储桶名称 (默认: agentengine-{region})"
|
|
195
|
-
)
|
|
196
|
-
@click.option(
|
|
197
|
-
"--enable-auth",
|
|
198
|
-
is_flag=True,
|
|
199
|
-
default=False,
|
|
200
|
-
help="启用 API Key 保护 (可选)"
|
|
194
|
+
help="部署区域 (default: cn-beijing-6)",
|
|
201
195
|
)
|
|
196
|
+
@click.option("--ks3-bucket", help="KS3 存储桶名称 (默认: agentengine-{region})")
|
|
197
|
+
@click.option("--enable-auth", is_flag=True, default=False, help="启用 API Key 保护 (可选)")
|
|
202
198
|
@dry_run_option("仅显示请求内容,不实际部署")
|
|
203
199
|
@click.option(
|
|
204
200
|
"--artifact-type",
|
|
@@ -232,10 +228,10 @@ def deploy(
|
|
|
232
228
|
output_mode: str | None,
|
|
233
229
|
):
|
|
234
230
|
"""部署 MCP Server 到云端
|
|
235
|
-
|
|
231
|
+
|
|
236
232
|
\b
|
|
237
233
|
MCP_DIR: MCP 项目目录 (默认: 当前目录)
|
|
238
|
-
|
|
234
|
+
|
|
239
235
|
\b
|
|
240
236
|
示例:
|
|
241
237
|
# 1) 默认部署 (Code 模式)
|
|
@@ -244,7 +240,7 @@ def deploy(
|
|
|
244
240
|
agentengine mcp deploy ./my-mcp --name my-tools --artifact-type Container
|
|
245
241
|
# 3) 显式指定区域
|
|
246
242
|
KSYUN_REGION=cn-beijing-6 agentengine mcp deploy . --dry-run
|
|
247
|
-
|
|
243
|
+
|
|
248
244
|
\b
|
|
249
245
|
部署后的 endpoint 兼容标准 MCP 协议,可以被:
|
|
250
246
|
- LangGraph/LangChain (via langchain-mcp-adapters)
|
|
@@ -255,6 +251,15 @@ def deploy(
|
|
|
255
251
|
_ = output_mode
|
|
256
252
|
dry_run = effective_dry_run(dry_run)
|
|
257
253
|
dry_run_context: dict[str, object] = {}
|
|
254
|
+
|
|
255
|
+
def render_mcp_deploy_dry_run(exc: DryRunExit) -> None:
|
|
256
|
+
plan_value = dry_run_context.get("plan")
|
|
257
|
+
render_workflow_dry_run(
|
|
258
|
+
action="deploy",
|
|
259
|
+
request=dict(exc.payload) if isinstance(exc.payload, dict) else {},
|
|
260
|
+
plan=dict(plan_value) if isinstance(plan_value, dict) else None,
|
|
261
|
+
)
|
|
262
|
+
|
|
258
263
|
try:
|
|
259
264
|
result = run_async_with_dry_run(
|
|
260
265
|
_deploy_mcp_async(
|
|
@@ -277,13 +282,7 @@ def deploy(
|
|
|
277
282
|
dry_run_context=dry_run_context,
|
|
278
283
|
),
|
|
279
284
|
dry_run=dry_run,
|
|
280
|
-
on_dry_run=
|
|
281
|
-
lambda exc: render_workflow_dry_run(
|
|
282
|
-
action="deploy",
|
|
283
|
-
request=dict(exc.payload or {}),
|
|
284
|
-
plan=dict(dry_run_context.get("plan") or {}) or None,
|
|
285
|
-
)
|
|
286
|
-
),
|
|
285
|
+
on_dry_run=render_mcp_deploy_dry_run,
|
|
287
286
|
)
|
|
288
287
|
except Exception as e:
|
|
289
288
|
_abort_mcp_error(e, context="部署失败", argv=["mcp", "deploy"])
|
|
@@ -403,9 +402,11 @@ def _print_mcp_build_summary(
|
|
|
403
402
|
print_kv("工具", ", ".join(build_result.metadata["tools"]))
|
|
404
403
|
|
|
405
404
|
|
|
406
|
-
def _persist_mcp_build_metadata(
|
|
405
|
+
def _persist_mcp_build_metadata(
|
|
406
|
+
mcp_path: Path, build_result, *, artifact_type: str, artifact_reference: str
|
|
407
|
+
) -> None:
|
|
407
408
|
metadata_file = mcp_path / ".agentengine" / "build-metadata.json"
|
|
408
|
-
if is_dataclass(build_result):
|
|
409
|
+
if is_dataclass(build_result) and not isinstance(build_result, type):
|
|
409
410
|
payload = asdict(build_result)
|
|
410
411
|
else:
|
|
411
412
|
payload = {
|
|
@@ -462,8 +463,11 @@ async def _build_code_artifact(
|
|
|
462
463
|
uploader = KS3Uploader(region=upload_region, bucket=ks3_bucket)
|
|
463
464
|
timestamp = datetime.now().strftime("%Y%m%d%H%M%S")
|
|
464
465
|
object_key = f"mcps/{mcp_name}/code_{timestamp}.zip"
|
|
466
|
+
artifact_path = build_result.artifact_path
|
|
467
|
+
if artifact_path is None:
|
|
468
|
+
raise validation_error("构建成功但未生成 artifact_path")
|
|
465
469
|
with capture_standard_output():
|
|
466
|
-
ks3_path = await uploader.upload(
|
|
470
|
+
ks3_path = await uploader.upload(artifact_path, object_key)
|
|
467
471
|
if not ks3_path:
|
|
468
472
|
raise remote_error("KS3 上传失败")
|
|
469
473
|
artifact_reference = ks3_path
|
|
@@ -528,7 +532,7 @@ def _build_mcp_request_data(
|
|
|
528
532
|
) -> dict:
|
|
529
533
|
resources = config.get("resources") or {}
|
|
530
534
|
scaling = config.get("scaling") or {}
|
|
531
|
-
request_data = {
|
|
535
|
+
request_data: dict[str, Any] = {
|
|
532
536
|
"name": mcp_name,
|
|
533
537
|
"type": "mcp",
|
|
534
538
|
"artifact_type": artifact_type,
|
|
@@ -564,15 +568,19 @@ def _build_mcp_request_data(
|
|
|
564
568
|
else:
|
|
565
569
|
kcr_username, kcr_password, registry_kind = resolve_registry_credentials(artifact_reference)
|
|
566
570
|
if kcr_username and kcr_password:
|
|
567
|
-
|
|
571
|
+
image_credential = {
|
|
568
572
|
"endpoint": artifact_reference.split("/", 1)[0],
|
|
569
573
|
"username": kcr_username,
|
|
570
574
|
"password": kcr_password,
|
|
571
575
|
}
|
|
572
|
-
|
|
576
|
+
request_data["image_credential"] = image_credential
|
|
577
|
+
print_kv("镜像凭证", f"{kcr_username}@{image_credential['endpoint']}")
|
|
573
578
|
else:
|
|
574
579
|
if registry_kind == "personal_kcr":
|
|
575
|
-
print_warn(
|
|
580
|
+
print_warn(
|
|
581
|
+
"未配置个人版 KCR 镜像凭证 "
|
|
582
|
+
"(KSYUN_ACCOUNT_ID/KCR_PASSWORD),私有镜像可能无法拉取"
|
|
583
|
+
)
|
|
576
584
|
else:
|
|
577
585
|
print_warn(
|
|
578
586
|
f"未配置{registry_kind_label(registry_kind)} 镜像凭证 "
|
|
@@ -670,8 +678,7 @@ async def _build_mcp_async(
|
|
|
670
678
|
"artifact_source": (
|
|
671
679
|
"built_and_uploaded"
|
|
672
680
|
if normalized_artifact_type == "Code" and push
|
|
673
|
-
else "built_and_pushed" if normalized_artifact_type == "Container" and push
|
|
674
|
-
else "built"
|
|
681
|
+
else "built_and_pushed" if normalized_artifact_type == "Container" and push else "built"
|
|
675
682
|
),
|
|
676
683
|
"artifact_reused": bool(build_result.metadata.get("reused", False)),
|
|
677
684
|
"artifact_built": True,
|
|
@@ -753,7 +760,9 @@ async def _deploy_mcp_async(
|
|
|
753
760
|
|
|
754
761
|
cached_artifact_reference = None
|
|
755
762
|
if not artifact_plan.should_clear_metadata:
|
|
756
|
-
cached_artifact_reference = load_cached_artifact_reference(
|
|
763
|
+
cached_artifact_reference = load_cached_artifact_reference(
|
|
764
|
+
mcp_path, normalized_artifact_type
|
|
765
|
+
)
|
|
757
766
|
|
|
758
767
|
resolved_artifact_plan = resolve_artifact_build_plan(
|
|
759
768
|
plan=artifact_plan,
|
|
@@ -869,7 +878,7 @@ async def _deploy_mcp_async(
|
|
|
869
878
|
res = await client.update_mcp(existing_mcp_id, request_data)
|
|
870
879
|
mcp_id = existing_mcp_id
|
|
871
880
|
else:
|
|
872
|
-
# create
|
|
881
|
+
# create 默认开公网;update 缺省 network 时保留服务端配置。
|
|
873
882
|
create_network = dict(request_data.get("network") or {})
|
|
874
883
|
if "enable_public_access" not in create_network:
|
|
875
884
|
create_network["enable_public_access"] = True
|
|
@@ -935,7 +944,7 @@ def list_mcps(region: str, page: int, size: int, dry_run: bool, output_mode: str
|
|
|
935
944
|
_ = output_mode
|
|
936
945
|
dry_run = effective_dry_run(dry_run)
|
|
937
946
|
from ksadk.api import AgentEngineClient
|
|
938
|
-
|
|
947
|
+
|
|
939
948
|
async def _list():
|
|
940
949
|
async with AgentEngineClient(region=region, dry_run=dry_run) as client:
|
|
941
950
|
resp = await client.list_mcps(region=region, page=page, page_size=size)
|
|
@@ -984,14 +993,14 @@ def list_mcps(region: str, page: int, size: int, dry_run: bool, output_mode: str
|
|
|
984
993
|
_abort_mcp_error(e, context="获取列表失败", argv=["mcp", "list"])
|
|
985
994
|
|
|
986
995
|
|
|
987
|
-
@mcp.command("status", context_settings=CONTEXT_SETTINGS)
|
|
996
|
+
@mcp.command("status", context_settings=CONTEXT_SETTINGS, short_help="查看 MCP 状态")
|
|
988
997
|
@click.argument("mcp_ref", required=False)
|
|
989
998
|
@region_option(default=None, envvar=None, help_text="区域 (默认优先读取 .agentengine.state)")
|
|
990
999
|
@dry_run_option()
|
|
991
1000
|
@cli_output_option()
|
|
992
1001
|
def status(mcp_ref: str | None, region: str | None, dry_run: bool, output_mode: str | None):
|
|
993
1002
|
"""查看 MCP 状态
|
|
994
|
-
|
|
1003
|
+
|
|
995
1004
|
MCP_ID: MCP 的 ID
|
|
996
1005
|
"""
|
|
997
1006
|
_ = output_mode
|
|
@@ -1015,7 +1024,7 @@ def status(mcp_ref: str | None, region: str | None, dry_run: bool, output_mode:
|
|
|
1015
1024
|
target_ref = resolved.value
|
|
1016
1025
|
if resolved.source != "cli":
|
|
1017
1026
|
print_info(f"未显式指定 MCP,使用 {resolved.source_text}: {target_ref}")
|
|
1018
|
-
|
|
1027
|
+
|
|
1019
1028
|
async def _get():
|
|
1020
1029
|
async with AgentEngineClient(region=region, dry_run=dry_run) as client:
|
|
1021
1030
|
mcp = None
|
|
@@ -1027,7 +1036,7 @@ def status(mcp_ref: str | None, region: str | None, dry_run: bool, output_mode:
|
|
|
1027
1036
|
mcp = await client.get_mcp_by_name(target_ref, region=region)
|
|
1028
1037
|
if not mcp:
|
|
1029
1038
|
raise resolution_error(f"未找到 MCP: {target_ref}", hints=["agentengine mcp list"])
|
|
1030
|
-
|
|
1039
|
+
|
|
1031
1040
|
status_text = (mcp.get("status") or "UNKNOWN").upper()
|
|
1032
1041
|
fields = [
|
|
1033
1042
|
("ID", str(mcp.get("mcp_id", "-")), None),
|
|
@@ -1037,7 +1046,7 @@ def status(mcp_ref: str | None, region: str | None, dry_run: bool, output_mode:
|
|
|
1037
1046
|
("MCP URL", str(mcp.get("mcp_endpoint", "N/A")), "#58a6ff"),
|
|
1038
1047
|
("认证", "已开启" if mcp.get("enable_auth") else "未开启", None),
|
|
1039
1048
|
]
|
|
1040
|
-
if mcp.get(
|
|
1049
|
+
if mcp.get("tools"):
|
|
1041
1050
|
fields.append(("工具", ", ".join(mcp["tools"]), None))
|
|
1042
1051
|
fields.extend(
|
|
1043
1052
|
[
|
|
@@ -1088,19 +1097,32 @@ def _delete_impl(mcp_ids: tuple[str, ...], region: str, assume_yes: bool, dry_ru
|
|
|
1088
1097
|
prompt=f"确定要删除这 {len(mcp_ids)} 个 MCP 吗?",
|
|
1089
1098
|
):
|
|
1090
1099
|
return
|
|
1091
|
-
|
|
1100
|
+
|
|
1092
1101
|
async def _delete():
|
|
1093
1102
|
async with AgentEngineClient(region=region, dry_run=dry_run) as client:
|
|
1094
1103
|
failed_ids: list[str] = []
|
|
1095
1104
|
deleted_ids: list[str] = []
|
|
1105
|
+
failure_reasons: dict[str, str] = {}
|
|
1096
1106
|
for mcp_id in mcp_ids:
|
|
1097
|
-
|
|
1107
|
+
try:
|
|
1108
|
+
success = await client.delete_mcp(mcp_id)
|
|
1109
|
+
except DryRunExit:
|
|
1110
|
+
raise
|
|
1111
|
+
except Exception as exc:
|
|
1112
|
+
failed_ids.append(mcp_id)
|
|
1113
|
+
reason = str(exc)
|
|
1114
|
+
request_id = str(getattr(exc, "details", {}).get("request_id") or "")
|
|
1115
|
+
if request_id:
|
|
1116
|
+
reason = f"{reason} (RequestId: {request_id})"
|
|
1117
|
+
failure_reasons[mcp_id] = reason
|
|
1118
|
+
continue
|
|
1098
1119
|
if success:
|
|
1099
1120
|
deleted_ids.append(mcp_id)
|
|
1100
1121
|
print_success(f"MCP 已删除: {mcp_id}")
|
|
1101
1122
|
|
|
1102
1123
|
# 尝试清理本地状态文件 (如果在项目目录中)
|
|
1103
1124
|
from ksadk.deployment.state import clear_state
|
|
1125
|
+
|
|
1104
1126
|
try:
|
|
1105
1127
|
removed = clear_state(Path("."), key=mcp_id)
|
|
1106
1128
|
if removed:
|
|
@@ -1111,11 +1133,19 @@ def _delete_impl(mcp_ids: tuple[str, ...], region: str, assume_yes: bool, dry_ru
|
|
|
1111
1133
|
pass
|
|
1112
1134
|
else:
|
|
1113
1135
|
failed_ids.append(mcp_id)
|
|
1136
|
+
failure_reasons[mcp_id] = "服务端未确认删除"
|
|
1114
1137
|
|
|
1115
1138
|
if failed_ids:
|
|
1139
|
+
reason_text = "; ".join(
|
|
1140
|
+
f"{mcp_id}: {failure_reasons[mcp_id]}" for mcp_id in failed_ids
|
|
1141
|
+
)
|
|
1116
1142
|
raise remote_error(
|
|
1117
|
-
f"以下 MCP 删除失败: {', '.join(failed_ids)}",
|
|
1118
|
-
details={
|
|
1143
|
+
f"以下 MCP 删除失败: {', '.join(failed_ids)}。原因: {reason_text}",
|
|
1144
|
+
details={
|
|
1145
|
+
"deleted": deleted_ids,
|
|
1146
|
+
"failed": failed_ids,
|
|
1147
|
+
"errors": failure_reasons,
|
|
1148
|
+
},
|
|
1119
1149
|
)
|
|
1120
1150
|
return {
|
|
1121
1151
|
"targets": list(mcp_ids),
|
|
@@ -1123,7 +1153,7 @@ def _delete_impl(mcp_ids: tuple[str, ...], region: str, assume_yes: bool, dry_ru
|
|
|
1123
1153
|
"failed": failed_ids,
|
|
1124
1154
|
}
|
|
1125
1155
|
|
|
1126
|
-
dry_run_kwargs = {"dry_run": dry_run}
|
|
1156
|
+
dry_run_kwargs: dict[str, Any] = {"dry_run": dry_run}
|
|
1127
1157
|
if is_json_output():
|
|
1128
1158
|
dry_run_kwargs.update(
|
|
1129
1159
|
dry_run_resource="mcp",
|
|
@@ -1161,7 +1191,9 @@ def _delete_impl(mcp_ids: tuple[str, ...], region: str, assume_yes: bool, dry_ru
|
|
|
1161
1191
|
@confirm_options()
|
|
1162
1192
|
@dry_run_option()
|
|
1163
1193
|
@cli_output_option()
|
|
1164
|
-
def delete(
|
|
1194
|
+
def delete(
|
|
1195
|
+
mcp_ids: tuple[str, ...], region: str, assume_yes: bool, dry_run: bool, output_mode: str | None
|
|
1196
|
+
):
|
|
1165
1197
|
"""删除 MCP。"""
|
|
1166
1198
|
_ = output_mode
|
|
1167
1199
|
_delete_impl(mcp_ids=mcp_ids, region=region, assume_yes=assume_yes, dry_run=dry_run)
|
|
@@ -1173,7 +1205,9 @@ def delete(mcp_ids: tuple[str, ...], region: str, assume_yes: bool, dry_run: boo
|
|
|
1173
1205
|
@confirm_options()
|
|
1174
1206
|
@dry_run_option()
|
|
1175
1207
|
@cli_output_option()
|
|
1176
|
-
def destroy(
|
|
1208
|
+
def destroy(
|
|
1209
|
+
mcp_ids: tuple[str, ...], region: str, assume_yes: bool, dry_run: bool, output_mode: str | None
|
|
1210
|
+
):
|
|
1177
1211
|
"""删除 MCP。"""
|
|
1178
1212
|
_ = output_mode
|
|
1179
1213
|
_delete_impl(mcp_ids=mcp_ids, region=region, assume_yes=assume_yes, dry_run=dry_run)
|
ksadk/cli/cmd_model.py
CHANGED
|
@@ -3,15 +3,20 @@ agentengine model - 切换模型
|
|
|
3
3
|
"""
|
|
4
4
|
|
|
5
5
|
import os
|
|
6
|
+
from pathlib import Path
|
|
7
|
+
|
|
6
8
|
import click
|
|
7
9
|
import httpx
|
|
8
10
|
import questionary
|
|
9
11
|
import yaml
|
|
10
|
-
from pathlib import Path
|
|
11
12
|
from dotenv import set_key
|
|
12
|
-
|
|
13
|
+
|
|
13
14
|
from ksadk.cli.error_utils import abort_with_cli_error, print_exception, usage_error
|
|
14
|
-
from ksadk.cli.resource_common import
|
|
15
|
+
from ksadk.cli.resource_common import (
|
|
16
|
+
CONTEXT_SETTINGS,
|
|
17
|
+
CompatibilityAliasCommand,
|
|
18
|
+
print_compatibility_hint,
|
|
19
|
+
)
|
|
15
20
|
from ksadk.cli.ui import (
|
|
16
21
|
is_color_disabled,
|
|
17
22
|
is_stdout_tty,
|
|
@@ -22,6 +27,7 @@ from ksadk.cli.ui import (
|
|
|
22
27
|
print_title,
|
|
23
28
|
print_warn,
|
|
24
29
|
)
|
|
30
|
+
from ksadk.deployment.state import load_state
|
|
25
31
|
|
|
26
32
|
|
|
27
33
|
def _parse_model_selection(raw: str | None) -> list[str]:
|
|
@@ -71,7 +77,9 @@ def _write_default_model(selected_model: str) -> Path:
|
|
|
71
77
|
if not selected_model:
|
|
72
78
|
raise click.ClickException("未选择模型")
|
|
73
79
|
env_file = _resolve_env_file()
|
|
74
|
-
success, _key, _value = set_key(
|
|
80
|
+
success, _key, _value = set_key(
|
|
81
|
+
env_file, "OPENAI_MODEL_NAME", selected_model, quote_mode="never"
|
|
82
|
+
)
|
|
75
83
|
if not success:
|
|
76
84
|
raise click.ClickException("更新 OPENAI_MODEL_NAME 失败")
|
|
77
85
|
return env_file
|
|
@@ -145,7 +153,8 @@ def run_model_command(
|
|
|
145
153
|
hints=[
|
|
146
154
|
"查看当前模型配置请使用 `agentengine config show`。",
|
|
147
155
|
"非交互修改请使用 `agentengine config set OPENAI_MODEL_NAME=<model>`。",
|
|
148
|
-
"为 Agent/deploy 生成环境变量请使用
|
|
156
|
+
"为 Agent/deploy 生成环境变量请使用 "
|
|
157
|
+
"`agentengine config model --env <model[,model...]>`。",
|
|
149
158
|
],
|
|
150
159
|
),
|
|
151
160
|
argv=["config", "model"],
|