agentengine-sdk-python 0.7.0__py3-none-any.whl → 0.8.1__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.1.dist-info}/METADATA +52 -20
- agentengine_sdk_python-0.8.1.dist-info/RECORD +644 -0
- {agentengine_sdk_python-0.7.0.dist-info → agentengine_sdk_python-0.8.1.dist-info}/WHEEL +1 -1
- ksadk/a2a/__init__.py +180 -11
- ksadk/a2a/bootstrap.py +332 -0
- ksadk/a2a/card.py +15 -0
- ksadk/a2a/context_store.py +203 -0
- ksadk/a2a/control_plane.py +1056 -0
- ksadk/a2a/credential.py +99 -0
- ksadk/a2a/event_adapter.py +149 -0
- ksadk/a2a/executor.py +361 -137
- 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 +112 -0
- ksadk/a2a/server.py +102 -62
- ksadk/a2a/service_env.py +33 -0
- ksadk/a2a/space_client.py +1122 -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/a2a_card.py +101 -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 +872 -0
- ksadk/agui/config.py +92 -0
- ksadk/agui/routes.py +47 -0
- ksadk/api/client.py +238 -204
- ksadk/api/environment.py +27 -0
- ksadk/builders/__init__.py +2 -0
- ksadk/builders/base.py +16 -14
- ksadk/builders/code_builder.py +375 -270
- ksadk/builders/container_builder.py +240 -200
- ksadk/builders/framework_requirements.py +31 -12
- ksadk/builders/ks3_uploader.py +60 -29
- ksadk/builders/managed_runtime_builder.py +173 -0
- ksadk/builders/mcp_builder.py +91 -92
- ksadk/builders/requirements_utils.py +1 -5
- ksadk/cli/__init__.py +97 -171
- ksadk/cli/cmd_a2a.py +255 -84
- 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 +507 -740
- ksadk/cli/cmd_dashboard.py +120 -45
- ksadk/cli/cmd_deploy.py +135 -59
- ksadk/cli/cmd_destroy.py +44 -14
- ksadk/cli/cmd_eval.py +386 -0
- ksadk/cli/cmd_files.py +63 -24
- ksadk/cli/cmd_hermes.py +313 -135
- ksadk/cli/cmd_invoke.py +184 -122
- ksadk/cli/cmd_launch.py +76 -28
- ksadk/cli/cmd_mcp.py +98 -64
- ksadk/cli/cmd_model.py +14 -5
- ksadk/cli/cmd_openclaw.py +564 -268
- ksadk/cli/cmd_replay.py +71 -0
- ksadk/cli/cmd_run.py +58 -73
- ksadk/cli/cmd_status.py +80 -31
- ksadk/cli/cmd_studio.py +110 -0
- ksadk/cli/cmd_version.py +20 -13
- ksadk/cli/cmd_web.py +95 -18
- ksadk/cli/deploy_utils.py +20 -20
- ksadk/cli/dry_run.py +7 -4
- ksadk/cli/env_options.py +83 -0
- ksadk/cli/error_utils.py +37 -12
- ksadk/cli/global_options.py +4 -3
- ksadk/cli/local_runtime.py +1 -2
- ksadk/cli/model_catalog.py +6 -2
- ksadk/cli/network_options.py +41 -19
- ksadk/cli/resource_common.py +6 -2
- ksadk/cli/runtime_bootstrap.py +51 -0
- ksadk/cli/storage.py +0 -1
- ksadk/cli/ui.py +11 -3
- ksadk/cli/workflow_common.py +52 -18
- ksadk/codex/__init__.py +12 -0
- ksadk/codex/client.py +1042 -0
- ksadk/codex/phase.py +143 -0
- ksadk/codex/runtime.py +940 -0
- ksadk/common/aicp_env.py +0 -1
- ksadk/common/auth.py +2 -2
- ksadk/common/constants.py +1 -3
- ksadk/common/kop_client.py +232 -0
- 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 -14
- ksadk/configs/env_registry.py +661 -116
- ksadk/configs/global_config.py +3 -2
- ksadk/configs/settings.py +133 -209
- ksadk/conversations/__init__.py +85 -92
- 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 +660 -0
- ksadk/conversations/runtime_invocation.py +395 -0
- ksadk/conversations/runtime_metadata.py +475 -0
- ksadk/conversations/runtime_observability.py +367 -0
- ksadk/conversations/runtime_payloads.py +272 -0
- ksadk/conversations/runtime_persistence.py +440 -0
- ksadk/conversations/runtime_preparation.py +426 -0
- ksadk/conversations/runtime_resume.py +836 -0
- ksadk/conversations/runtime_stream_events.py +902 -0
- ksadk/conversations/runtime_streaming.py +700 -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/managed_runtime.py +33 -0
- ksadk/deployment/manager.py +85 -71
- ksadk/deployment/providers/serverless.py +379 -210
- 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/evaluation/__init__.py +84 -0
- ksadk/evaluation/a2a_adapter.py +444 -0
- ksadk/evaluation/adapters.py +54 -0
- ksadk/evaluation/contracts.py +409 -0
- ksadk/evaluation/evalset.py +351 -0
- ksadk/evaluation/evaluators.py +461 -0
- ksadk/evaluation/executor.py +118 -0
- ksadk/evaluation/storage.py +68 -0
- ksadk/evaluation/target.py +73 -0
- ksadk/events/__init__.py +25 -0
- ksadk/events/parser.py +191 -0
- ksadk/events/replay.py +37 -0
- ksadk/events/runtime_event.py +273 -0
- ksadk/events/store.py +317 -0
- ksadk/harness/__init__.py +35 -0
- ksadk/harness/app.py +269 -0
- ksadk/harness/config.py +181 -0
- ksadk/harness/reasoner.py +105 -0
- ksadk/harness/runtime.py +364 -0
- ksadk/harness/sandbox.py +141 -0
- ksadk/harness/tools.py +222 -0
- ksadk/hermes_terminal.py +28 -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 +38 -33
- ksadk/managed_a2a_card.py +160 -0
- ksadk/managed_runtime.py +195 -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 +36 -36
- ksadk/memory/adk/long_term_memory.py +34 -37
- 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 +16 -6
- ksadk/memory/tool.py +4 -0
- 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 +66 -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 +201 -0
- ksadk/model_proxy/protocol_proxy.py +22 -0
- ksadk/model_proxy/server.py +443 -0
- ksadk/model_proxy/transform.py +735 -0
- ksadk/openclaw_gateway.py +29 -14
- ksadk/runners/adk_runner.py +354 -146
- ksadk/runners/base_runner.py +71 -29
- ksadk/runners/deepagents_runner.py +0 -1
- ksadk/runners/factory.py +18 -5
- ksadk/runners/langchain_runner.py +29 -742
- ksadk/runners/langgraph_runner.py +417 -97
- ksadk/runners/patch_langchain.py +16 -16
- ksadk/runners/remote_runner.py +134 -33
- ksadk/runners/usage_accumulator.py +1 -0
- ksadk/runners/utils/__init__.py +0 -10
- ksadk/runners/utils/loader.py +23 -7
- ksadk/runtime/__init__.py +67 -0
- ksadk/runtime/adapter.py +412 -0
- ksadk/runtime/conversation_execution.py +553 -0
- ksadk/runtime/executor.py +251 -0
- ksadk/runtime/factory.py +156 -0
- ksadk/runtime/framework_adapters.py +118 -0
- ksadk/runtime/launch.py +48 -0
- ksadk/runtime/preprocessing.py +131 -0
- ksadk/runtime/runner_adapter.py +1032 -0
- ksadk/runtime/runner_loading.py +36 -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/__init__.py +39 -4
- ksadk/server/api_models.py +15 -5
- ksadk/server/app.py +24 -3928
- ksadk/server/composition.py +47 -0
- ksadk/server/factory.py +622 -0
- ksadk/server/routes/__init__.py +1 -0
- ksadk/server/routes/checkpoint_resolution.py +116 -0
- ksadk/server/routes/common.py +682 -0
- ksadk/server/routes/control.py +331 -0
- ksadk/server/routes/dependencies.py +98 -0
- ksadk/server/routes/misc.py +425 -0
- ksadk/server/routes/models.py +451 -0
- ksadk/server/routes/openai_compat.py +229 -0
- ksadk/server/routes/projection.py +848 -0
- ksadk/server/routes/routers.py +52 -0
- ksadk/server/routes/run.py +519 -0
- ksadk/server/routes/sessions.py +644 -0
- ksadk/server/routes/streaming.py +265 -0
- ksadk/server/routes/workspace.py +414 -0
- ksadk/server/static/assets/{ArtifactsPanel-D-SSn2ee.js → ArtifactsPanel-CakCqxEN.js} +1 -1
- ksadk/server/static/assets/CodeBlock-CynLknyO.js +9 -0
- ksadk/server/static/assets/MathMessageMarkdown-3sQdOysS.js +8 -0
- ksadk/server/static/assets/MermaidBlock-NERD_ef7.js +303 -0
- ksadk/server/static/assets/NativeTerminalPanel-CiHWf82q.js +1 -0
- ksadk/server/static/assets/{arc-BA13sHc9.js → arc-DrgjcKhl.js} +1 -1
- ksadk/server/static/assets/architecture-7EHR7CIX-CpZLRCcY.js +1 -0
- ksadk/server/static/assets/{architectureDiagram-3BPJPVTR-DzJzgVoL.js → architectureDiagram-3BPJPVTR-BXoVRbQ6.js} +1 -1
- ksadk/server/static/assets/{blockDiagram-GPEHLZMM-UTdVcZhn.js → blockDiagram-GPEHLZMM-BnaB3Ywv.js} +1 -1
- ksadk/server/static/assets/{c4Diagram-AAUBKEIU-Dix0GD4m.js → c4Diagram-AAUBKEIU-Dw4weZcp.js} +1 -1
- ksadk/server/static/assets/channel-Dt3rQTFI.js +1 -0
- ksadk/server/static/assets/{chunk-2J33WTMH-C2JxuZ42.js → chunk-2J33WTMH-ChjpLK7j.js} +1 -1
- ksadk/server/static/assets/{chunk-4BX2VUAB-Be57QPgD.js → chunk-4BX2VUAB-B9drTgOW.js} +1 -1
- ksadk/server/static/assets/{chunk-55IACEB6-WjSuy4nv.js → chunk-55IACEB6-CK4ROATy.js} +1 -1
- ksadk/server/static/assets/{chunk-727SXJPM-BOovP-b5.js → chunk-727SXJPM-B9KtTTgw.js} +1 -1
- ksadk/server/static/assets/{chunk-AQP2D5EJ-DOmZNmWj.js → chunk-AQP2D5EJ-1O1mki3m.js} +1 -1
- ksadk/server/static/assets/{chunk-FMBD7UC4-DzwlodkU.js → chunk-FMBD7UC4-B_fH2YuH.js} +1 -1
- ksadk/server/static/assets/{chunk-ND2GUHAM-DMqAikEU.js → chunk-ND2GUHAM-D6rFLaVV.js} +1 -1
- ksadk/server/static/assets/chunk-QZHKN3VN-iXEZtKQc.js +1 -0
- ksadk/server/static/assets/classDiagram-4FO5ZUOK-DIveV17Q.js +1 -0
- ksadk/server/static/assets/classDiagram-v2-Q7XG4LA2-DIveV17Q.js +1 -0
- ksadk/server/static/assets/{cose-bilkent-S5V4N54A-Zhy2GBnP.js → cose-bilkent-S5V4N54A-ChNs_Mdk.js} +1 -1
- ksadk/server/static/assets/{dagre-BM42HDAG-CbKrtIUz.js → dagre-BM42HDAG-D0QXg_MQ.js} +1 -1
- ksadk/server/static/assets/{diagram-2AECGRRQ-BRApgQRK.js → diagram-2AECGRRQ-DBDDKwBQ.js} +1 -1
- ksadk/server/static/assets/{diagram-5GNKFQAL-D0xbnDiK.js → diagram-5GNKFQAL-BkwDOxmO.js} +1 -1
- ksadk/server/static/assets/{diagram-KO2AKTUF-CVugVI9L.js → diagram-KO2AKTUF-Bv8waYvY.js} +1 -1
- ksadk/server/static/assets/{diagram-LMA3HP47-DozUGgee.js → diagram-LMA3HP47-e1VECDdu.js} +1 -1
- ksadk/server/static/assets/{diagram-OG6HWLK6-ZOYsKlru.js → diagram-OG6HWLK6-Ds9adfRl.js} +1 -1
- ksadk/server/static/assets/{dist-DpKtt4Bo.js → dist-4N2NMVYg.js} +1 -1
- ksadk/server/static/assets/{dist-CkEKJFtk.js → dist-B-jNR6Vn.js} +1 -1
- ksadk/server/static/assets/{dist-D57wnGWd.js → dist-B5J2uhNk.js} +1 -1
- ksadk/server/static/assets/{dist-8_SfK1IP.js → dist-B5oS1zcj.js} +1 -1
- ksadk/server/static/assets/{dist-DMezvBGJ.js → dist-BB3-OwTQ.js} +1 -1
- ksadk/server/static/assets/{dist-2hInLS_J.js → dist-BIlKoW0k.js} +1 -1
- ksadk/server/static/assets/{dist-BrCcQ47T.js → dist-BjOdlDjj.js} +1 -1
- ksadk/server/static/assets/{dist-BmlMPsCc.js → dist-C1sz5Eo3.js} +1 -1
- ksadk/server/static/assets/{dist-B0NP_Z0z.js → dist-CWV4lDr1.js} +1 -1
- ksadk/server/static/assets/{dist-D-xOD048.js → dist-CmZHzlwZ.js} +1 -1
- ksadk/server/static/assets/{dist-DL_NKc_z.js → dist-D6MpCZtz.js} +1 -1
- ksadk/server/static/assets/{dist-DyOkZmze.js → dist-DJN_6Y39.js} +1 -1
- ksadk/server/static/assets/{dist-DmFaq_Iy.js → dist-DQU9EWw-.js} +1 -1
- ksadk/server/static/assets/{dist-gX6GOLKq.js → dist-DWKByxWV.js} +1 -1
- ksadk/server/static/assets/{dist-DyWsb78Q.js → dist-Dli7qW-B.js} +1 -1
- ksadk/server/static/assets/{dist-BIJVDMuB.js → dist-DsHPdk3W.js} +1 -1
- ksadk/server/static/assets/{dist-Dp0k7bWI.js → dist-X4TnqwOK.js} +1 -1
- ksadk/server/static/assets/{dist-8EEyGgDx.js → dist-_pHPTyZ-.js} +1 -1
- ksadk/server/static/assets/{dist-CPBtqRTW.js → dist-fhOuWds5.js} +1 -1
- ksadk/server/static/assets/{dist-D-JMdWPQ.js → dist-gLnrGsoU.js} +1 -1
- ksadk/server/static/assets/{dist-BssVmjIo.js → dist-j6Dxmf_j.js} +1 -1
- ksadk/server/static/assets/{dist-C3HIIaN5.js → dist-o2OVmKvt.js} +1 -1
- ksadk/server/static/assets/{erDiagram-TEJ5UH35-Bk-9bgE5.js → erDiagram-TEJ5UH35-BPItFKH6.js} +1 -1
- ksadk/server/static/assets/eventmodeling-FCH6USID-DYFSxbqr.js +1 -0
- ksadk/server/static/assets/{flowDiagram-I6XJVG4X-Dn9kZVuZ.js → flowDiagram-I6XJVG4X-BbYB9w5Y.js} +1 -1
- ksadk/server/static/assets/{ganttDiagram-6RSMTGT7-BGxXlJqm.js → ganttDiagram-6RSMTGT7-TQXa0KXv.js} +1 -1
- ksadk/server/static/assets/gitGraph-WXDBUCRP-DyNYp6BN.js +1 -0
- ksadk/server/static/assets/{gitGraphDiagram-PVQCEYII-C7Q0X-wi.js → gitGraphDiagram-PVQCEYII-bKblCnpa.js} +1 -1
- ksadk/server/static/assets/index-R52pJJvg.js +177 -0
- ksadk/server/static/assets/index-jJr3_955.css +2 -0
- ksadk/server/static/assets/info-J43DQDTF-WUx7qTde.js +1 -0
- ksadk/server/static/assets/{infoDiagram-5YYISTIA-BO_CSqq5.js → infoDiagram-5YYISTIA-BGVT7J_i.js} +1 -1
- ksadk/server/static/assets/{ishikawaDiagram-YF4QCWOH-eYLPLd46.js → ishikawaDiagram-YF4QCWOH-K0OOfVna.js} +1 -1
- ksadk/server/static/assets/{journeyDiagram-JHISSGLW-De9geSb0.js → journeyDiagram-JHISSGLW-8LeOJaZp.js} +1 -1
- ksadk/server/static/assets/{kanban-definition-UN3LZRKU-Cs80kQto.js → kanban-definition-UN3LZRKU-C6uCgZrW.js} +1 -1
- ksadk/server/static/assets/{katex-DSrCFD8n.js → katex-CYWseY5E.js} +1 -1
- ksadk/server/static/assets/{linear-CN9sbKTF.js → linear-hdBcYzM8.js} +1 -1
- ksadk/server/static/assets/{mermaid-parser.core-DlgSBU8l.js → mermaid-parser.core-BWrDjSZM.js} +2 -2
- ksadk/server/static/assets/{mindmap-definition-RKZ34NQL-9afz7Oug.js → mindmap-definition-RKZ34NQL-Bjy_2v4_.js} +1 -1
- ksadk/server/static/assets/packet-YPE3B663-BN13y_xl.js +1 -0
- ksadk/server/static/assets/pie-LRSECV5Y-ftSLXhhc.js +1 -0
- ksadk/server/static/assets/{pieDiagram-4H26LBE5-DPv_VstN.js → pieDiagram-4H26LBE5-GmmqNiVH.js} +1 -1
- ksadk/server/static/assets/{quadrantDiagram-W4KKPZXB-o77wZ1XK.js → quadrantDiagram-W4KKPZXB-BmkRbwCg.js} +1 -1
- ksadk/server/static/assets/radar-GUYGQ44K-jaICkIeO.js +1 -0
- ksadk/server/static/assets/{requirementDiagram-4Y6WPE33-BYVw81VC.js → requirementDiagram-4Y6WPE33-DSWFqL7c.js} +1 -1
- ksadk/server/static/assets/{sankeyDiagram-5OEKKPKP-B7nZFMKT.js → sankeyDiagram-5OEKKPKP-l6iXmU65.js} +1 -1
- ksadk/server/static/assets/{sequenceDiagram-3UESZ5HK-BGRRrFw5.js → sequenceDiagram-3UESZ5HK-Cq6UBeQB.js} +1 -1
- ksadk/server/static/assets/{stateDiagram-AJRCARHV-BUfHCoPs.js → stateDiagram-AJRCARHV-qzTQpg3Y.js} +1 -1
- ksadk/server/static/assets/stateDiagram-v2-BHNVJYJU-BYCoYGAN.js +1 -0
- ksadk/server/static/assets/{timeline-definition-PNZ67QCA-FbCTGrf9.js → timeline-definition-PNZ67QCA-DEz24vV0.js} +1 -1
- ksadk/server/static/assets/treeView-BLDUP644-Cpib_vlz.js +1 -0
- ksadk/server/static/assets/treemap-LRROVOQU-DQxfmVHK.js +1 -0
- ksadk/server/static/assets/{vennDiagram-CIIHVFJN-DWgwtPsJ.js → vennDiagram-CIIHVFJN-CMCixki2.js} +1 -1
- ksadk/server/static/assets/wardley-L42UT6IY-BQYHnnkU.js +1 -0
- ksadk/server/static/assets/{wardleyDiagram-YWT4CUSO-2x8G-tTM.js → wardleyDiagram-YWT4CUSO-CVzB8F9K.js} +1 -1
- ksadk/server/static/assets/{xychartDiagram-2RQKCTM6-Drma3AYl.js → xychartDiagram-2RQKCTM6-BFBqBLc1.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 +47 -16
- ksadk/skills/tool_defs.py +15 -10
- ksadk/studio/__init__.py +5 -0
- ksadk/studio/agent_avatar_assets.py +120 -0
- ksadk/studio/agent_lifecycle.py +51 -0
- ksadk/studio/api.py +1046 -0
- ksadk/studio/api_catalog_routes.py +324 -0
- ksadk/studio/api_contracts.py +177 -0
- ksadk/studio/api_helpers.py +132 -0
- ksadk/studio/authoring.py +524 -0
- ksadk/studio/authoring_coordinator.py +285 -0
- ksadk/studio/builder.py +320 -0
- ksadk/studio/capabilities.py +351 -0
- ksadk/studio/cloud.py +278 -0
- ksadk/studio/codex_agent_service.py +583 -0
- ksadk/studio/codex_builder.py +324 -0
- ksadk/studio/codex_manifest.py +278 -0
- ksadk/studio/codex_run.py +352 -0
- ksadk/studio/compiler.py +189 -0
- ksadk/studio/contracts.py +644 -0
- ksadk/studio/errors.py +47 -0
- ksadk/studio/evaluation.py +192 -0
- ksadk/studio/event_store.py +284 -0
- ksadk/studio/framework_run.py +114 -0
- ksadk/studio/identifiers.py +33 -0
- ksadk/studio/mcp_runtime.py +229 -0
- ksadk/studio/model_client.py +543 -0
- ksadk/studio/model_profile_service.py +214 -0
- ksadk/studio/operations.py +243 -0
- ksadk/studio/otel_trace.py +754 -0
- ksadk/studio/pagination.py +182 -0
- ksadk/studio/python_tool_inspection.py +183 -0
- ksadk/studio/repository.py +306 -0
- ksadk/studio/resource_catalog.py +1217 -0
- ksadk/studio/run_service.py +707 -0
- ksadk/studio/runtime_catalog.py +74 -0
- ksadk/studio/runtime_source.py +339 -0
- ksadk/studio/service.py +1141 -0
- ksadk/studio/shared_web.py +994 -0
- ksadk/studio/skill_discovery.py +628 -0
- ksadk/studio/static/assets/PrismRenderer-IYN-ffww.js +3 -0
- ksadk/studio/static/assets/index-CaEN0eTR.css +1 -0
- ksadk/studio/static/assets/index-DI2eY_NH.js +252 -0
- ksadk/studio/static/assets/react-vendor-BNmTiJ-I.js +9 -0
- ksadk/studio/static/assets/rolldown-runtime-hePW80VL.js +1 -0
- ksadk/studio/static/index.html +15 -0
- ksadk/studio/templates.py +630 -0
- ksadk/studio/validator.py +246 -0
- ksadk/studio/workspace.py +137 -0
- ksadk/terminal_exec_policy.py +3 -4
- ksadk/tools/gateway.py +101 -15
- ksadk/tools/result_budget.py +12 -4
- ksadk/toolsets/__init__.py +161 -37
- ksadk/toolsets/a2a.py +426 -0
- 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/__init__.py +19 -21
- ksadk/tracing/exporters/inmemory_exporter.py +62 -51
- ksadk/tracing/setup.py +135 -506
- ksadk/tracing/span_utils.py +0 -41
- 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/memory_backend/registry.py +56 -56
- ksadk_runtime_common/schemas/runtime_event_v1.json +95 -0
- ksadk_runtime_common/workspace_files/router.py +8 -2
- agentengine_sdk_python-0.7.0.dist-info/RECORD +0 -482
- ksadk/a2a/card_builder.py +0 -64
- ksadk/a2a/client.py +0 -309
- ksadk/runners/utils/langfuse.py +0 -230
- 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
- ksadk/tracing/exporters/langfuse_exporter.py +0 -445
- {agentengine_sdk_python-0.7.0.dist-info → agentengine_sdk_python-0.8.1.dist-info}/entry_points.txt +0 -0
- {agentengine_sdk_python-0.7.0.dist-info → agentengine_sdk_python-0.8.1.dist-info}/licenses/LICENSE +0 -0
- {agentengine_sdk_python-0.7.0.dist-info → agentengine_sdk_python-0.8.1.dist-info}/top_level.txt +0 -0
ksadk/cli/cmd_version.py
CHANGED
|
@@ -1,14 +1,15 @@
|
|
|
1
1
|
"""agentengine version - Agent 版本资源管理。"""
|
|
2
2
|
|
|
3
3
|
import os
|
|
4
|
-
import
|
|
4
|
+
from datetime import datetime, timedelta, timezone
|
|
5
5
|
from pathlib import Path
|
|
6
6
|
from typing import Optional
|
|
7
|
-
|
|
7
|
+
|
|
8
|
+
import click
|
|
8
9
|
|
|
9
10
|
from ksadk.api.client import DryRunExit
|
|
10
11
|
from ksadk.cli.agent_ref import merge_agent_inputs, resolve_agent_ref
|
|
11
|
-
from ksadk.cli.dry_run import dry_run_option,
|
|
12
|
+
from ksadk.cli.dry_run import dry_run_option, effective_dry_run, run_async_with_dry_run
|
|
12
13
|
from ksadk.cli.error_utils import abort_with_cli_error, resolution_error
|
|
13
14
|
from ksadk.cli.resource_common import (
|
|
14
15
|
CONTEXT_SETTINGS,
|
|
@@ -23,7 +24,8 @@ from ksadk.cli.resource_common import (
|
|
|
23
24
|
render_descriptor_list,
|
|
24
25
|
render_descriptor_status,
|
|
25
26
|
)
|
|
26
|
-
from ksadk.cli.ui import get_console,
|
|
27
|
+
from ksadk.cli.ui import get_console, status_rich_style
|
|
28
|
+
from ksadk.cli.ui import output_option as cli_output_option
|
|
27
29
|
|
|
28
30
|
console = get_console()
|
|
29
31
|
|
|
@@ -94,8 +96,9 @@ def _extract_agent_id(agent: dict) -> Optional[str]:
|
|
|
94
96
|
if isinstance(basic, dict):
|
|
95
97
|
agent_id = basic.get("agent_id")
|
|
96
98
|
if agent_id:
|
|
97
|
-
return agent_id
|
|
98
|
-
|
|
99
|
+
return str(agent_id)
|
|
100
|
+
fallback = agent.get("agent_id") or agent.get("id")
|
|
101
|
+
return str(fallback) if fallback else None
|
|
99
102
|
|
|
100
103
|
|
|
101
104
|
async def _resolve_agent_id(agent_ref: str, client) -> Optional[str]:
|
|
@@ -147,9 +150,7 @@ async def _resolve_target_agent_id(
|
|
|
147
150
|
include_project_config=True,
|
|
148
151
|
)
|
|
149
152
|
if not resolved:
|
|
150
|
-
raise ValueError(
|
|
151
|
-
"请指定 Agent(--agent 或位置参数),或在当前目录提供可解析的本地配置"
|
|
152
|
-
)
|
|
153
|
+
raise ValueError("请指定 Agent(--agent 或位置参数),或在当前目录提供可解析的本地配置")
|
|
153
154
|
|
|
154
155
|
if resolved.source != "cli":
|
|
155
156
|
console.print(
|
|
@@ -162,7 +163,9 @@ async def _resolve_target_agent_id(
|
|
|
162
163
|
return agent_id
|
|
163
164
|
|
|
164
165
|
|
|
165
|
-
@click.group(
|
|
166
|
+
@click.group(
|
|
167
|
+
"version", context_settings=CONTEXT_SETTINGS, help=build_resource_group_help(VERSION_RESOURCE)
|
|
168
|
+
)
|
|
166
169
|
def version():
|
|
167
170
|
pass
|
|
168
171
|
|
|
@@ -345,7 +348,9 @@ def release_version(
|
|
|
345
348
|
dry_run = effective_dry_run(dry_run)
|
|
346
349
|
try:
|
|
347
350
|
run_async_with_dry_run(
|
|
348
|
-
_release_version_async(
|
|
351
|
+
_release_version_async(
|
|
352
|
+
agent_ref, agent_option, name, region, tag, description, dry_run
|
|
353
|
+
),
|
|
349
354
|
dry_run=dry_run,
|
|
350
355
|
dry_run_resource="version",
|
|
351
356
|
dry_run_action="release",
|
|
@@ -437,7 +442,9 @@ def rollback_version(
|
|
|
437
442
|
dry_run = effective_dry_run(dry_run)
|
|
438
443
|
try:
|
|
439
444
|
run_async_with_dry_run(
|
|
440
|
-
_rollback_version_async(
|
|
445
|
+
_rollback_version_async(
|
|
446
|
+
agent_ref, agent_option, name, region, target, assume_yes, dry_run
|
|
447
|
+
),
|
|
441
448
|
dry_run=dry_run,
|
|
442
449
|
dry_run_resource="version",
|
|
443
450
|
dry_run_action="rollback",
|
|
@@ -496,7 +503,7 @@ async def _rollback_version_async(
|
|
|
496
503
|
ks3_secret_key=secret_key,
|
|
497
504
|
)
|
|
498
505
|
|
|
499
|
-
fields = [
|
|
506
|
+
fields: list[tuple[str, str, str | None]] = [
|
|
500
507
|
("当前版本", str(result.get("current_tag") or "-"), "#58a6ff"),
|
|
501
508
|
]
|
|
502
509
|
if result.get("message"):
|
ksadk/cli/cmd_web.py
CHANGED
|
@@ -1,23 +1,27 @@
|
|
|
1
1
|
"""ksadk web - 启动统一本地 Web UI。"""
|
|
2
2
|
|
|
3
|
-
import
|
|
3
|
+
import asyncio
|
|
4
|
+
import os
|
|
4
5
|
import webbrowser
|
|
5
6
|
from pathlib import Path
|
|
6
|
-
|
|
7
|
+
|
|
8
|
+
import click
|
|
9
|
+
import uvicorn
|
|
7
10
|
import yaml
|
|
11
|
+
|
|
8
12
|
from ksadk.cli.error_utils import ensure_json_output_supported, print_exception
|
|
9
13
|
from ksadk.cli.local_runtime import reexec_with_project_venv_if_needed
|
|
14
|
+
from ksadk.cli.runtime_bootstrap import create_runtime_web_app
|
|
10
15
|
from ksadk.cli.ui import (
|
|
11
16
|
print_error,
|
|
12
17
|
print_info,
|
|
13
18
|
print_kv,
|
|
14
19
|
print_success,
|
|
15
20
|
print_title,
|
|
21
|
+
print_warn,
|
|
16
22
|
)
|
|
17
23
|
from ksadk.configs import setup_environment
|
|
18
24
|
from ksadk.detection import FrameworkDetector
|
|
19
|
-
from ksadk.runners.factory import create_runner
|
|
20
|
-
|
|
21
25
|
|
|
22
26
|
_PERSISTENT_STM_FRAMEWORKS = {"adk", "langgraph", "langchain", "deepagents"}
|
|
23
27
|
_STM_ENV_NAMES = (
|
|
@@ -179,6 +183,47 @@ def _default_project_stm_if_unset(
|
|
|
179
183
|
)
|
|
180
184
|
|
|
181
185
|
|
|
186
|
+
def configure_local_runtime_persistence(
|
|
187
|
+
agent_path: Path,
|
|
188
|
+
framework: str,
|
|
189
|
+
*,
|
|
190
|
+
explicit_session_env_names: set[str] | None = None,
|
|
191
|
+
explicit_checkpoint_env_names: set[str] | None = None,
|
|
192
|
+
explicit_local_ui_env_names: set[str] | None = None,
|
|
193
|
+
) -> None:
|
|
194
|
+
"""Bind locally-run agent state to its project unless the shell overrides it."""
|
|
195
|
+
|
|
196
|
+
project_dotenv = _project_dotenv_values(agent_path)
|
|
197
|
+
if explicit_session_env_names is None:
|
|
198
|
+
explicit_session_env_names = _explicit_env_names_excluding_project_dotenv(
|
|
199
|
+
(*_STM_ENV_NAMES, *_SESSION_ENV_NAMES),
|
|
200
|
+
project_dotenv,
|
|
201
|
+
)
|
|
202
|
+
if explicit_checkpoint_env_names is None:
|
|
203
|
+
explicit_checkpoint_env_names = _explicit_env_names_excluding_project_dotenv(
|
|
204
|
+
_CHECKPOINT_ENV_NAMES,
|
|
205
|
+
project_dotenv,
|
|
206
|
+
)
|
|
207
|
+
if explicit_local_ui_env_names is None:
|
|
208
|
+
explicit_local_ui_env_names = _explicit_env_names_excluding_project_dotenv(
|
|
209
|
+
_LOCAL_UI_ENV_NAMES,
|
|
210
|
+
project_dotenv,
|
|
211
|
+
)
|
|
212
|
+
|
|
213
|
+
os.environ["KSADK_PROJECT_DIR"] = str(agent_path)
|
|
214
|
+
local_ui_dir = str(agent_path / ".agentengine" / "ui")
|
|
215
|
+
if "AGENTENGINE_UI_DIR" not in explicit_local_ui_env_names:
|
|
216
|
+
os.environ["AGENTENGINE_UI_DIR"] = local_ui_dir
|
|
217
|
+
else:
|
|
218
|
+
os.environ.setdefault("AGENTENGINE_UI_DIR", local_ui_dir)
|
|
219
|
+
_default_project_stm_if_unset(
|
|
220
|
+
framework,
|
|
221
|
+
agent_path,
|
|
222
|
+
explicit_session_env_names=explicit_session_env_names,
|
|
223
|
+
explicit_checkpoint_env_names=explicit_checkpoint_env_names,
|
|
224
|
+
)
|
|
225
|
+
|
|
226
|
+
|
|
182
227
|
@click.command(context_settings=dict(help_option_names=["-h", "--help"]))
|
|
183
228
|
@click.argument("agent_dir", default=".", type=click.Path(exists=True))
|
|
184
229
|
@click.option("--port", "-p", default=8080, help="Web UI 端口")
|
|
@@ -197,13 +242,18 @@ def web(agent_dir: str, port: int, model: str, no_open: bool):
|
|
|
197
242
|
"""
|
|
198
243
|
ensure_json_output_supported(
|
|
199
244
|
"agentengine web",
|
|
200
|
-
suggestion=
|
|
245
|
+
suggestion=(
|
|
246
|
+
"请改用 `agentengine dashboard open` 或 " "`agentengine agent status --output json`。"
|
|
247
|
+
),
|
|
201
248
|
)
|
|
202
249
|
|
|
203
250
|
agent_path = Path(agent_dir).resolve()
|
|
204
251
|
command_args = ["web", str(agent_path), "--port", str(port)]
|
|
205
252
|
if model:
|
|
206
253
|
command_args.extend(["--model", model])
|
|
254
|
+
if no_open:
|
|
255
|
+
# re-exec 进项目 venv 时透传 --no-open,否则子进程仍会打开浏览器
|
|
256
|
+
command_args.append("--no-open")
|
|
207
257
|
reexec_with_project_venv_if_needed(agent_path, command_args)
|
|
208
258
|
project_dotenv = _project_dotenv_values(agent_path)
|
|
209
259
|
explicit_session_env_names = _explicit_env_names_excluding_project_dotenv(
|
|
@@ -238,36 +288,63 @@ def web(agent_dir: str, port: int, model: str, no_open: bool):
|
|
|
238
288
|
print_error("未检测到支持的框架")
|
|
239
289
|
raise SystemExit(1)
|
|
240
290
|
|
|
291
|
+
if result.type.value == "codex":
|
|
292
|
+
raw_config = getattr(result, "raw_config", None) or {}
|
|
293
|
+
if str(raw_config.get("artifact_type") or "").strip().lower() == "managedruntime":
|
|
294
|
+
from ksadk.managed_runtime import (
|
|
295
|
+
ManagedRuntimeError,
|
|
296
|
+
resolve_local_managed_runtime,
|
|
297
|
+
)
|
|
298
|
+
|
|
299
|
+
try:
|
|
300
|
+
resolved_runtime = asyncio.run(
|
|
301
|
+
resolve_local_managed_runtime(
|
|
302
|
+
raw_config,
|
|
303
|
+
region=os.getenv("KSYUN_REGION", "cn-beijing-6"),
|
|
304
|
+
)
|
|
305
|
+
)
|
|
306
|
+
except ManagedRuntimeError as exc:
|
|
307
|
+
print_error(str(exc))
|
|
308
|
+
raise SystemExit(1) from exc
|
|
309
|
+
runtime_config = raw_config.setdefault("runtime", {})
|
|
310
|
+
if isinstance(runtime_config, dict):
|
|
311
|
+
runtime_config["version"] = resolved_runtime.version
|
|
312
|
+
print_kv(
|
|
313
|
+
"Runtime",
|
|
314
|
+
f"{resolved_runtime.name}@{resolved_runtime.version}",
|
|
315
|
+
value_style="#58a6ff",
|
|
316
|
+
)
|
|
317
|
+
if resolved_runtime.source == "installed-unlocked":
|
|
318
|
+
print_warn(
|
|
319
|
+
"离线使用本机已安装 Runtime;云端构建前请显式锁定版本"
|
|
320
|
+
"或连接 AgentEngine 获取默认版本"
|
|
321
|
+
)
|
|
322
|
+
|
|
241
323
|
# Map framework types to display names
|
|
242
324
|
framework_map = {
|
|
243
325
|
"adk": "ADK",
|
|
244
326
|
"langchain": "LangChain",
|
|
245
327
|
"langgraph": "LangGraph",
|
|
246
328
|
"deepagents": "DeepAgents",
|
|
329
|
+
"codex": "Codex",
|
|
247
330
|
}
|
|
248
331
|
display_name = framework_map.get(result.type.value, result.name)
|
|
249
332
|
print_kv("框架", display_name, value_style="#2da44e")
|
|
250
333
|
|
|
251
|
-
|
|
252
|
-
os.environ["KSADK_PROJECT_DIR"] = str(agent_path)
|
|
253
|
-
local_ui_dir = str(agent_path / ".agentengine" / "ui")
|
|
254
|
-
if "AGENTENGINE_UI_DIR" not in explicit_local_ui_env_names:
|
|
255
|
-
os.environ["AGENTENGINE_UI_DIR"] = local_ui_dir
|
|
256
|
-
else:
|
|
257
|
-
os.environ.setdefault("AGENTENGINE_UI_DIR", local_ui_dir)
|
|
258
|
-
_default_project_stm_if_unset(
|
|
259
|
-
result.type.value,
|
|
334
|
+
configure_local_runtime_persistence(
|
|
260
335
|
agent_path,
|
|
336
|
+
result.type.value,
|
|
261
337
|
explicit_session_env_names=explicit_session_env_names,
|
|
262
338
|
explicit_checkpoint_env_names=explicit_checkpoint_env_names,
|
|
339
|
+
explicit_local_ui_env_names=explicit_local_ui_env_names,
|
|
263
340
|
)
|
|
264
341
|
launch_path = _configure_custom_ui_env(agent_path)
|
|
265
342
|
|
|
266
343
|
try:
|
|
267
|
-
print_info("初始化
|
|
268
|
-
|
|
344
|
+
print_info("初始化 RuntimeAdapter...")
|
|
345
|
+
runtime_app = create_runtime_web_app(result, agent_path)
|
|
269
346
|
except Exception as e:
|
|
270
|
-
print_exception("
|
|
347
|
+
print_exception("RuntimeAdapter 初始化失败", e)
|
|
271
348
|
raise SystemExit(1)
|
|
272
349
|
|
|
273
350
|
print_success("启动统一 Web UI")
|
|
@@ -280,7 +357,7 @@ def web(agent_dir: str, port: int, model: str, no_open: bool):
|
|
|
280
357
|
webbrowser.open(launch_url)
|
|
281
358
|
|
|
282
359
|
try:
|
|
283
|
-
|
|
360
|
+
uvicorn.run(runtime_app, host="127.0.0.1", port=port)
|
|
284
361
|
except KeyboardInterrupt:
|
|
285
362
|
raise SystemExit(0)
|
|
286
363
|
except Exception as e:
|
ksadk/cli/deploy_utils.py
CHANGED
|
@@ -1,28 +1,28 @@
|
|
|
1
1
|
import os
|
|
2
|
+
|
|
2
3
|
import click
|
|
4
|
+
|
|
3
5
|
from ksadk.api import AgentEngineClient
|
|
4
6
|
|
|
7
|
+
|
|
5
8
|
async def auto_release_version(agent_id: str, region: str, deploy_name: str):
|
|
6
9
|
"""部署成功后自动创建版本快照"""
|
|
7
|
-
|
|
8
|
-
|
|
10
|
+
|
|
9
11
|
access_key = os.getenv("KSYUN_ACCESS_KEY") or os.getenv("KS3_ACCESS_KEY")
|
|
10
12
|
secret_key = os.getenv("KSYUN_SECRET_KEY") or os.getenv("KS3_SECRET_KEY")
|
|
11
|
-
|
|
13
|
+
|
|
12
14
|
client = AgentEngineClient(
|
|
13
15
|
access_key=access_key,
|
|
14
16
|
secret_key=secret_key,
|
|
15
17
|
region=region,
|
|
16
18
|
)
|
|
17
|
-
|
|
19
|
+
|
|
18
20
|
try:
|
|
19
21
|
description = "部署后自动发布"
|
|
20
22
|
result = await client.release_version(
|
|
21
|
-
agent_id=agent_id,
|
|
22
|
-
tag=None, # 自动生成
|
|
23
|
-
description=description
|
|
23
|
+
agent_id=agent_id, tag=None, description=description # 自动生成
|
|
24
24
|
)
|
|
25
|
-
|
|
25
|
+
|
|
26
26
|
click.echo("")
|
|
27
27
|
click.secho(f"✓ 版本快照已创建: {result.get('tag')}", fg="green")
|
|
28
28
|
except Exception as e:
|
|
@@ -34,53 +34,53 @@ async def auto_release_version(agent_id: str, region: str, deploy_name: str):
|
|
|
34
34
|
|
|
35
35
|
async def auto_rollback_to_previous(agent_id: str, region: str):
|
|
36
36
|
"""部署失败时自动回滚到上一版本"""
|
|
37
|
-
|
|
37
|
+
|
|
38
38
|
access_key = os.getenv("KSYUN_ACCESS_KEY") or os.getenv("KS3_ACCESS_KEY")
|
|
39
39
|
secret_key = os.getenv("KSYUN_SECRET_KEY") or os.getenv("KS3_SECRET_KEY")
|
|
40
|
-
|
|
40
|
+
|
|
41
41
|
client = AgentEngineClient(
|
|
42
42
|
access_key=access_key,
|
|
43
43
|
secret_key=secret_key,
|
|
44
44
|
region=region,
|
|
45
45
|
)
|
|
46
|
-
|
|
46
|
+
|
|
47
47
|
try:
|
|
48
48
|
# 获取版本列表,找到最近的历史版本
|
|
49
49
|
versions_result = await client.list_versions(agent_id, page=1, size=5)
|
|
50
50
|
versions = versions_result.get("versions", [])
|
|
51
|
-
|
|
51
|
+
|
|
52
52
|
# 找到需要回滚的目标版本 (统一 snake_case)
|
|
53
53
|
target_version = None
|
|
54
54
|
for v in versions:
|
|
55
55
|
if (v.get("status") or "").lower() == "current":
|
|
56
56
|
target_version = v
|
|
57
57
|
break
|
|
58
|
-
|
|
58
|
+
|
|
59
59
|
# 如果没有 Current,则找最新的 Historical
|
|
60
60
|
if not target_version:
|
|
61
61
|
for v in versions:
|
|
62
62
|
if (v.get("status") or "").lower() == "historical":
|
|
63
63
|
target_version = v
|
|
64
64
|
break
|
|
65
|
-
|
|
65
|
+
|
|
66
66
|
if not target_version:
|
|
67
67
|
click.secho("⚠ 无可用稳定版本,跳过自动回滚", fg="yellow")
|
|
68
68
|
return
|
|
69
|
-
|
|
69
|
+
|
|
70
70
|
target_tag = target_version.get("tag")
|
|
71
71
|
click.echo("")
|
|
72
72
|
click.secho(f"⏪ 正在自动回滚到版本: {target_tag}...", fg="yellow")
|
|
73
|
-
|
|
73
|
+
|
|
74
74
|
# 执行回滚
|
|
75
|
-
|
|
75
|
+
await client.rollback_version(
|
|
76
76
|
agent_id=agent_id,
|
|
77
77
|
target_tag=target_tag,
|
|
78
78
|
ks3_access_key=access_key,
|
|
79
|
-
ks3_secret_key=secret_key
|
|
79
|
+
ks3_secret_key=secret_key,
|
|
80
80
|
)
|
|
81
|
-
|
|
81
|
+
|
|
82
82
|
click.secho(f"✓ 已回滚到版本: {target_tag}", fg="green")
|
|
83
|
-
|
|
83
|
+
|
|
84
84
|
except Exception as e:
|
|
85
85
|
click.secho(f"⚠ 自动回滚失败: {e}", fg="red")
|
|
86
86
|
finally:
|
ksadk/cli/dry_run.py
CHANGED
|
@@ -5,7 +5,7 @@ from __future__ import annotations
|
|
|
5
5
|
import asyncio
|
|
6
6
|
import json
|
|
7
7
|
import os
|
|
8
|
-
from typing import Any,
|
|
8
|
+
from typing import Any, Callable, Coroutine, Optional, TypeVar
|
|
9
9
|
|
|
10
10
|
import click
|
|
11
11
|
from click.core import ParameterSource
|
|
@@ -13,6 +13,7 @@ from click.core import ParameterSource
|
|
|
13
13
|
from ksadk.api.client import DryRunExit
|
|
14
14
|
from ksadk.cli.resource_common import build_dry_run_envelope
|
|
15
15
|
from ksadk.cli.ui import emit_json, is_json_output
|
|
16
|
+
from ksadk.configs.env_registry import is_sensitive_env_var
|
|
16
17
|
|
|
17
18
|
_T = TypeVar("_T")
|
|
18
19
|
_DEFAULT_DONE_MSG = "✅ Dry Run Completed: 请求已打印,未执行实际变更。"
|
|
@@ -117,7 +118,7 @@ def _mask_if_sensitive(value: Any, *, sensitive: bool) -> Any:
|
|
|
117
118
|
def _sanitize_dry_run_value(value: Any, *, parent_key: str | None = None) -> Any:
|
|
118
119
|
if isinstance(value, dict):
|
|
119
120
|
env_key = str(value.get("Key") or "")
|
|
120
|
-
env_sensitive = bool(value.get("IsSensitive")) or
|
|
121
|
+
env_sensitive = bool(value.get("IsSensitive")) or is_sensitive_env_var(env_key)
|
|
121
122
|
sanitized: dict[str, Any] = {}
|
|
122
123
|
for key, item in value.items():
|
|
123
124
|
key_text = str(key)
|
|
@@ -172,7 +173,7 @@ def sanitize_dry_run_request(payload: dict[str, Any] | None) -> dict[str, Any]:
|
|
|
172
173
|
|
|
173
174
|
|
|
174
175
|
def run_async_with_dry_run(
|
|
175
|
-
coro:
|
|
176
|
+
coro: Coroutine[Any, Any, _T],
|
|
176
177
|
*,
|
|
177
178
|
dry_run: bool,
|
|
178
179
|
done_message: str = _DEFAULT_DONE_MSG,
|
|
@@ -200,7 +201,9 @@ def run_async_with_dry_run(
|
|
|
200
201
|
)
|
|
201
202
|
elif safe_payload:
|
|
202
203
|
click.echo("=" * 60)
|
|
203
|
-
|
|
204
|
+
method = safe_payload.get("method", "REQUEST")
|
|
205
|
+
url = safe_payload.get("url", "")
|
|
206
|
+
click.echo(f"Dry Run Mode: {method} {url}")
|
|
204
207
|
click.echo("=" * 60)
|
|
205
208
|
click.echo(f"Headers: {safe_payload.get('headers')}")
|
|
206
209
|
if safe_payload.get("body") is not None:
|
ksadk/cli/env_options.py
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
from __future__ import annotations
|
|
2
2
|
|
|
3
3
|
import json
|
|
4
|
+
import os
|
|
4
5
|
import re
|
|
5
6
|
from pathlib import Path
|
|
6
7
|
|
|
@@ -62,11 +63,93 @@ def resolve_explicit_env_vars(
|
|
|
62
63
|
env_pairs: tuple[str, ...] | list[str] | None,
|
|
63
64
|
base_dir: Path,
|
|
64
65
|
) -> dict[str, str]:
|
|
66
|
+
"""Resolve explicit env vars from ``--env-file``/``--env`` (no auto-``./.env``).
|
|
67
|
+
|
|
68
|
+
Used by the generic ``agentengine deploy``/``launch`` which read model
|
|
69
|
+
config from ``agentengine.yaml``, not from ``./.env``. Framework-specific
|
|
70
|
+
deploys (hermes/openclaw) use ``resolve_runtime_env_overrides`` instead,
|
|
71
|
+
which auto-discovers ``./.env`` and returns shell_keys for os.environ merge.
|
|
72
|
+
"""
|
|
65
73
|
env_vars = load_env_file(env_file, base_dir=base_dir)
|
|
66
74
|
env_vars.update(parse_env_pairs(env_pairs))
|
|
67
75
|
return env_vars
|
|
68
76
|
|
|
69
77
|
|
|
78
|
+
def apply_explicit_env_with_shell_priority(
|
|
79
|
+
base_env: dict[str, str],
|
|
80
|
+
cli_env: dict[str, str],
|
|
81
|
+
auto_dotenv: dict[str, str],
|
|
82
|
+
shell_keys: set[str],
|
|
83
|
+
) -> dict[str, str]:
|
|
84
|
+
"""Merge env into base with precedence: cli_env > shell > auto_dotenv.
|
|
85
|
+
|
|
86
|
+
``shell_keys`` is the snapshot of ``os.environ`` keys captured BEFORE any
|
|
87
|
+
env load. ``cli_env`` (``--env``/``--env-file``) is the highest explicit
|
|
88
|
+
CLI intent and overwrites everything. ``auto_dotenv`` (auto-discovered
|
|
89
|
+
``./.env``) only fills keys not already set by shell.
|
|
90
|
+
"""
|
|
91
|
+
for key, value in auto_dotenv.items():
|
|
92
|
+
if key in shell_keys:
|
|
93
|
+
continue
|
|
94
|
+
base_env.setdefault(key, value)
|
|
95
|
+
for key, value in cli_env.items():
|
|
96
|
+
base_env[key] = value
|
|
97
|
+
return base_env
|
|
98
|
+
|
|
99
|
+
|
|
100
|
+
def inject_env_to_environ(
|
|
101
|
+
cli_env: dict[str, str],
|
|
102
|
+
auto_dotenv: dict[str, str],
|
|
103
|
+
shell_keys: set[str],
|
|
104
|
+
) -> int:
|
|
105
|
+
"""Apply env to ``os.environ`` with precedence: cli_env > shell > auto_dotenv.
|
|
106
|
+
|
|
107
|
+
``auto_dotenv`` only fills keys absent from shell (shell wins over auto
|
|
108
|
+
``./.env``). ``cli_env`` overwrites shell (explicit CLI intent wins).
|
|
109
|
+
Returns the number of keys injected from ``auto_dotenv`` (for user-facing
|
|
110
|
+
messages); ``cli_env`` overwrites are not counted.
|
|
111
|
+
"""
|
|
112
|
+
loaded = 0
|
|
113
|
+
for key, value in auto_dotenv.items():
|
|
114
|
+
if key in shell_keys:
|
|
115
|
+
continue
|
|
116
|
+
os.environ.setdefault(key, value)
|
|
117
|
+
loaded += 1
|
|
118
|
+
for key, value in cli_env.items():
|
|
119
|
+
os.environ[key] = value
|
|
120
|
+
return loaded
|
|
121
|
+
|
|
122
|
+
|
|
123
|
+
def resolve_runtime_env_overrides(
|
|
124
|
+
*,
|
|
125
|
+
env_file: str | None,
|
|
126
|
+
extra_env: tuple[str, ...] | list[str] | None,
|
|
127
|
+
base_dir: Path,
|
|
128
|
+
) -> tuple[dict[str, str], dict[str, str], set[str], str | None]:
|
|
129
|
+
"""Resolve runtime env overrides with precedence ``--env > --env-file > shell > auto ./.env``.
|
|
130
|
+
|
|
131
|
+
Returns ``(cli_env, auto_dotenv, shell_keys, source)``:
|
|
132
|
+
- ``cli_env``: merged ``--env-file`` + ``--env`` (``--env`` wins); explicit
|
|
133
|
+
CLI intent, overwrites shell at merge time.
|
|
134
|
+
- ``auto_dotenv``: auto-discovered ``./.env`` (only when ``env_file`` is
|
|
135
|
+
None); does NOT overwrite shell.
|
|
136
|
+
- ``shell_keys``: snapshot of ``os.environ`` captured before any load.
|
|
137
|
+
- ``source``: the file path used (for user-facing messages) or ``None``.
|
|
138
|
+
"""
|
|
139
|
+
shell_keys = set(os.environ)
|
|
140
|
+
explicit_file_env = load_env_file(env_file, base_dir=base_dir) if env_file else {}
|
|
141
|
+
auto_dotenv: dict[str, str] = {}
|
|
142
|
+
auto_source: str | None = None
|
|
143
|
+
if not env_file:
|
|
144
|
+
auto_path = base_dir / ".env"
|
|
145
|
+
if auto_path.exists():
|
|
146
|
+
auto_dotenv = load_env_file(str(auto_path), base_dir=base_dir)
|
|
147
|
+
auto_source = str(auto_path)
|
|
148
|
+
pair_env = parse_env_pairs(extra_env)
|
|
149
|
+
cli_env = {**explicit_file_env, **pair_env}
|
|
150
|
+
return cli_env, auto_dotenv, shell_keys, env_file or auto_source
|
|
151
|
+
|
|
152
|
+
|
|
70
153
|
def env_options(func):
|
|
71
154
|
func = click.option(
|
|
72
155
|
"--env-file",
|
ksadk/cli/error_utils.py
CHANGED
|
@@ -2,10 +2,10 @@
|
|
|
2
2
|
|
|
3
3
|
from __future__ import annotations
|
|
4
4
|
|
|
5
|
-
from dataclasses import dataclass, field
|
|
6
5
|
import os
|
|
7
6
|
import re
|
|
8
7
|
import sys
|
|
8
|
+
from dataclasses import dataclass, field
|
|
9
9
|
from typing import Any, Optional, Sequence, Tuple
|
|
10
10
|
|
|
11
11
|
import click
|
|
@@ -128,9 +128,16 @@ def _looks_like_invalid_cloud_credentials(details: dict[str, Any], msg_lower: st
|
|
|
128
128
|
return any(marker in msg_lower for marker in markers)
|
|
129
129
|
|
|
130
130
|
|
|
131
|
-
def _looks_like_runtime_permission_error(
|
|
131
|
+
def _looks_like_runtime_permission_error(
|
|
132
|
+
details: dict[str, Any], msg_lower: str, code: int | None
|
|
133
|
+
) -> bool:
|
|
132
134
|
remote_code = str(details.get("remote_error_code") or "").strip().lower()
|
|
133
|
-
if remote_code in {
|
|
135
|
+
if remote_code in {
|
|
136
|
+
"accessdenied",
|
|
137
|
+
"accessdeniedexception",
|
|
138
|
+
"unauthorized",
|
|
139
|
+
"unauthorizedoperation",
|
|
140
|
+
}:
|
|
134
141
|
return True
|
|
135
142
|
if code in {401, 403} and (
|
|
136
143
|
("权限" in msg_lower)
|
|
@@ -145,7 +152,8 @@ def _looks_like_runtime_permission_error(details: dict[str, Any], msg_lower: str
|
|
|
145
152
|
|
|
146
153
|
def _credential_setup_hints() -> list[str]:
|
|
147
154
|
return [
|
|
148
|
-
"请检查当前 shell 或项目 `.env` 中是否设置了 `KSYUN_ACCESS_KEY` /
|
|
155
|
+
"请检查当前 shell 或项目 `.env` 中是否设置了 `KSYUN_ACCESS_KEY` / "
|
|
156
|
+
"`KSYUN_SECRET_KEY`(兼容 `KS3_ACCESS_KEY` / `KS3_SECRET_KEY`)。",
|
|
149
157
|
"先到 AgentEngine Runtime 控制台确认账号是否具备运行时权限: https://ksp.console.ksyun.com/#/agentEngineRuntime",
|
|
150
158
|
"如当前子账号没有权限,请到 IAM 授权页授权: https://uc.console.ksyun.com/pro/iam/#/permission/authorize",
|
|
151
159
|
"如果还没有金山云 AK/SK,请让主账号先到 IAM 控制台创建子账号并生成访问密钥: https://uc.console.ksyun.com/pro/iam/",
|
|
@@ -154,7 +162,8 @@ def _credential_setup_hints() -> list[str]:
|
|
|
154
162
|
|
|
155
163
|
def _invalid_credential_hints() -> list[str]:
|
|
156
164
|
return [
|
|
157
|
-
"请检查当前 shell 或项目 `.env` 中的 `KSYUN_ACCESS_KEY` /
|
|
165
|
+
"请检查当前 shell 或项目 `.env` 中的 `KSYUN_ACCESS_KEY` / "
|
|
166
|
+
"`KSYUN_SECRET_KEY` 是否填写正确,且没有多余空格。",
|
|
158
167
|
"确认该 AK/SK 未被禁用、删除或重置,并且属于当前要操作的金山云账号。",
|
|
159
168
|
"如需确认账号是否具备 AgentEngine Runtime 权限,可先查看: https://ksp.console.ksyun.com/#/agentEngineRuntime",
|
|
160
169
|
"如果凭证属于子账号但仍然被拒绝,请到 IAM 授权页检查授权: https://uc.console.ksyun.com/pro/iam/#/permission/authorize",
|
|
@@ -188,7 +197,9 @@ def _matches_resource_not_found(msg_lower: str, args: Sequence[str], *, resource
|
|
|
188
197
|
return args[0] == resource
|
|
189
198
|
|
|
190
199
|
|
|
191
|
-
def explain_exception(
|
|
200
|
+
def explain_exception(
|
|
201
|
+
err: Exception, argv: Optional[Sequence[str]] = None
|
|
202
|
+
) -> Tuple[str, list[str]]:
|
|
192
203
|
cli_error = cli_error_from_exception(err, argv=argv)
|
|
193
204
|
return cli_error.message, cli_error.hints
|
|
194
205
|
|
|
@@ -384,7 +395,9 @@ def cli_error_from_exception(
|
|
|
384
395
|
|
|
385
396
|
if code == 404 and len(args) >= 2 and args[0] == "dashboard" and args[1] == "share":
|
|
386
397
|
summary = "未找到 Dashboard 分享链接或目标 Agent。"
|
|
387
|
-
hints.append(
|
|
398
|
+
hints.append(
|
|
399
|
+
"请先执行 `agentengine dashboard share list --agent <AgentName|AgentId>` 查看分享链接。"
|
|
400
|
+
)
|
|
388
401
|
hints.append("如需先确认 Agent,请执行 `agentengine agent list`。")
|
|
389
402
|
error_code = "resolution_error"
|
|
390
403
|
exit_code = EXIT_CODE_RESOLUTION
|
|
@@ -396,22 +409,34 @@ def cli_error_from_exception(
|
|
|
396
409
|
exit_code = EXIT_CODE_RESOLUTION
|
|
397
410
|
elif code == 404 and _matches_resource_not_found(msg_lower, args, resource="agent"):
|
|
398
411
|
summary = "未找到 Agent。"
|
|
399
|
-
hints.append(
|
|
412
|
+
hints.append(
|
|
413
|
+
"请确认 Agent 名称/ID 是否正确,可先执行 `agentengine agent list` 查看已部署 Agent。"
|
|
414
|
+
)
|
|
400
415
|
if len(args) >= 2 and args[0] == "dashboard" and args[1] == "list":
|
|
401
416
|
hints.append("`agentengine dashboard list` 不是有效命令。")
|
|
402
|
-
hints.append(
|
|
417
|
+
hints.append(
|
|
418
|
+
"如果要查看分享链接,请使用 "
|
|
419
|
+
"`agentengine dashboard share list --agent <AgentName|AgentId>`。"
|
|
420
|
+
)
|
|
403
421
|
elif args and args[0] == "dashboard":
|
|
404
|
-
hints.append(
|
|
422
|
+
hints.append(
|
|
423
|
+
"可显式指定 Agent:`agentengine dashboard open --agent <AgentName|AgentId>`。"
|
|
424
|
+
)
|
|
405
425
|
error_code = "resolution_error"
|
|
406
426
|
exit_code = EXIT_CODE_RESOLUTION
|
|
407
427
|
elif code == 404 and _matches_resource_not_found(msg_lower, args, resource="mcp"):
|
|
408
428
|
summary = "未找到 MCP。"
|
|
409
|
-
hints.append(
|
|
429
|
+
hints.append(
|
|
430
|
+
"请确认 MCP 名称/ID 是否正确,可先执行 `agentengine mcp list` 查看已部署 MCP。"
|
|
431
|
+
)
|
|
410
432
|
error_code = "resolution_error"
|
|
411
433
|
exit_code = EXIT_CODE_RESOLUTION
|
|
412
434
|
elif code == 404 and _matches_resource_not_found(msg_lower, args, resource="openclaw"):
|
|
413
435
|
summary = "未找到 OpenClaw。"
|
|
414
|
-
hints.append(
|
|
436
|
+
hints.append(
|
|
437
|
+
"请确认 OpenClaw 名称/ID 是否正确,可先执行 "
|
|
438
|
+
"`agentengine openclaw list` 查看已部署实例。"
|
|
439
|
+
)
|
|
415
440
|
error_code = "resolution_error"
|
|
416
441
|
exit_code = EXIT_CODE_RESOLUTION
|
|
417
442
|
elif _looks_like_missing_cloud_credentials(details, msg_lower):
|
ksadk/cli/global_options.py
CHANGED
|
@@ -10,8 +10,7 @@ from ksadk.cli.ui import build_no_color_click_option, build_output_click_option
|
|
|
10
10
|
|
|
11
11
|
def _has_long_option(command: click.Command, option_name: str) -> bool:
|
|
12
12
|
return any(
|
|
13
|
-
isinstance(param, click.Option) and option_name in param.opts
|
|
14
|
-
for param in command.params
|
|
13
|
+
isinstance(param, click.Option) and option_name in param.opts for param in command.params
|
|
15
14
|
)
|
|
16
15
|
|
|
17
16
|
|
|
@@ -19,7 +18,9 @@ def ensure_global_cli_options(command: click.Command) -> click.Command:
|
|
|
19
18
|
"""Inject hidden common options into groups/commands that do not declare them locally."""
|
|
20
19
|
if not _has_long_option(command, "--dry-run"):
|
|
21
20
|
command.params.insert(0, build_dry_run_click_option(hidden=True, expose_value=False))
|
|
22
|
-
if not
|
|
21
|
+
if not getattr(command, "disable_global_output_option", False) and not _has_long_option(
|
|
22
|
+
command, "--output"
|
|
23
|
+
):
|
|
23
24
|
command.params.insert(0, build_output_click_option(hidden=True, expose_value=False))
|
|
24
25
|
if not _has_long_option(command, "--no-color"):
|
|
25
26
|
command.params.insert(0, build_no_color_click_option(hidden=True, expose_value=False))
|
ksadk/cli/local_runtime.py
CHANGED
|
@@ -3,12 +3,11 @@
|
|
|
3
3
|
from __future__ import annotations
|
|
4
4
|
|
|
5
5
|
import os
|
|
6
|
-
from pathlib import Path
|
|
7
6
|
import site
|
|
8
7
|
import sys
|
|
8
|
+
from pathlib import Path
|
|
9
9
|
from typing import Sequence
|
|
10
10
|
|
|
11
|
-
|
|
12
11
|
LOCAL_RUNTIME_VENV_REEXEC_ENV = "AGENTENGINE_LOCAL_RUNTIME_VENV_REEXEC"
|
|
13
12
|
LEGACY_WEB_VENV_REEXEC_ENV = "AGENTENGINE_WEB_VENV_REEXEC"
|
|
14
13
|
|