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_hermes.py
CHANGED
|
@@ -5,7 +5,7 @@ from __future__ import annotations
|
|
|
5
5
|
import asyncio
|
|
6
6
|
import os
|
|
7
7
|
from pathlib import Path
|
|
8
|
-
from typing import Any, Callable, Optional
|
|
8
|
+
from typing import Any, Callable, Optional, cast
|
|
9
9
|
|
|
10
10
|
import click
|
|
11
11
|
from click.core import ParameterSource
|
|
@@ -15,8 +15,8 @@ from ksadk.cli.agent_ref import merge_agent_inputs, resolve_agent_ref
|
|
|
15
15
|
from ksadk.cli.cmd_dashboard import _open_dashboard
|
|
16
16
|
from ksadk.cli.dry_run import dry_run_option, effective_dry_run, run_async_with_dry_run
|
|
17
17
|
from ksadk.cli.error_utils import remote_error, resolution_error
|
|
18
|
+
from ksadk.cli.model_catalog import fetch_provider_model_metadata
|
|
18
19
|
from ksadk.cli.network_options import build_network_payload, network_cli_kwargs, network_options
|
|
19
|
-
from ksadk.cli.storage import build_storage_config
|
|
20
20
|
from ksadk.cli.resource_common import (
|
|
21
21
|
CONTEXT_SETTINGS,
|
|
22
22
|
ResourceActionSet,
|
|
@@ -32,37 +32,35 @@ from ksadk.cli.resource_common import (
|
|
|
32
32
|
render_descriptor_list,
|
|
33
33
|
render_descriptor_status,
|
|
34
34
|
)
|
|
35
|
+
from ksadk.cli.storage import build_storage_config
|
|
35
36
|
from ksadk.cli.ui import (
|
|
36
37
|
emit_json,
|
|
37
38
|
is_json_output,
|
|
38
|
-
output_option as cli_output_option,
|
|
39
39
|
print_info,
|
|
40
40
|
print_kv,
|
|
41
|
-
print_rule,
|
|
42
41
|
print_success,
|
|
43
42
|
print_title,
|
|
44
43
|
print_warn,
|
|
45
44
|
status_rich_style,
|
|
46
45
|
)
|
|
46
|
+
from ksadk.cli.ui import (
|
|
47
|
+
output_option as cli_output_option,
|
|
48
|
+
)
|
|
47
49
|
from ksadk.deployment.agent_access import (
|
|
48
50
|
get_latest_agent_access,
|
|
49
51
|
is_agent_not_found_error,
|
|
50
52
|
normalize_deployment_status,
|
|
51
53
|
)
|
|
52
54
|
from ksadk.deployment.state import clear_state, load_state, save_state
|
|
53
|
-
from ksadk.cli.model_catalog import fetch_provider_model_metadata
|
|
54
|
-
from ksadk.model_policy import build_runtime_model_policy_env
|
|
55
55
|
from ksadk.hermes_terminal import (
|
|
56
56
|
run_hermes_terminal_session,
|
|
57
57
|
validate_hermes_exec_argv,
|
|
58
58
|
validate_hermes_pairing_argv,
|
|
59
59
|
)
|
|
60
|
+
from ksadk.model_policy import build_runtime_model_policy_env
|
|
60
61
|
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
DEFAULT_HERMES_CONTEXT_LENGTHS = (
|
|
64
|
-
("glm-5.1", "200000"),
|
|
65
|
-
)
|
|
62
|
+
DEFAULT_HERMES_IMAGE = "ghcr.io/kingsoftcloud/hermes-agent:v2026.7.7.2-ksadk-v070"
|
|
63
|
+
DEFAULT_HERMES_CONTEXT_LENGTHS = (("glm-5.1", "200000"),)
|
|
66
64
|
DEFAULT_HERMES_MODEL_NAME = "glm-5.2"
|
|
67
65
|
DEFAULT_HERMES_PUBLIC_BASE_URL = "https://kspmas.ksyun.com/v1/"
|
|
68
66
|
DEFAULT_HERMES_RUNTIME_BASE_URL = DEFAULT_HERMES_PUBLIC_BASE_URL
|
|
@@ -232,14 +230,17 @@ async def _fetch_hermes_bootstrap_config(region: str) -> dict[str, Any] | None:
|
|
|
232
230
|
|
|
233
231
|
try:
|
|
234
232
|
async with AgentEngineClient(region=region) as client:
|
|
235
|
-
return
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
233
|
+
return cast(
|
|
234
|
+
dict[str, Any],
|
|
235
|
+
await client.get_client_bootstrap_config(
|
|
236
|
+
product="hermes",
|
|
237
|
+
framework="hermes",
|
|
238
|
+
region=region,
|
|
239
|
+
client_type="cli",
|
|
240
|
+
client_version=CLI_VERSION,
|
|
241
|
+
locale=_env_value("LANG", "LC_ALL"),
|
|
242
|
+
ignore_dry_run=True,
|
|
243
|
+
),
|
|
243
244
|
)
|
|
244
245
|
except Exception as e:
|
|
245
246
|
print_warn(f"拉取 Hermes 服务端默认配置失败,回退本地默认镜像: {e}")
|
|
@@ -279,7 +280,9 @@ def _build_hermes_env_vars(
|
|
|
279
280
|
if raw_model_base_url
|
|
280
281
|
else DEFAULT_HERMES_RUNTIME_BASE_URL
|
|
281
282
|
)
|
|
282
|
-
resolved_default_model =
|
|
283
|
+
resolved_default_model = (
|
|
284
|
+
default_model or _env_value("OPENAI_MODEL_NAME") or DEFAULT_HERMES_MODEL_NAME
|
|
285
|
+
)
|
|
283
286
|
metadata_context_length = ""
|
|
284
287
|
if isinstance(model_metadata, dict):
|
|
285
288
|
metadata_context_length = str(model_metadata.get("context_window_tokens") or "").strip()
|
|
@@ -307,7 +310,9 @@ def _build_hermes_env_vars(
|
|
|
307
310
|
if fallback_model:
|
|
308
311
|
raw["HERMES_FALLBACK_PROVIDER"] = _env_value("HERMES_FALLBACK_PROVIDER") or "custom"
|
|
309
312
|
raw["HERMES_FALLBACK_MODEL"] = fallback_model
|
|
310
|
-
raw["HERMES_FALLBACK_BASE_URL"] =
|
|
313
|
+
raw["HERMES_FALLBACK_BASE_URL"] = (
|
|
314
|
+
_env_value("HERMES_FALLBACK_BASE_URL") or resolved_model_base_url
|
|
315
|
+
)
|
|
311
316
|
api_server_key = _env_value("API_SERVER_KEY", "HERMES_API_SERVER_KEY")
|
|
312
317
|
if api_server_key:
|
|
313
318
|
raw["API_SERVER_KEY"] = api_server_key
|
|
@@ -316,7 +321,9 @@ def _build_hermes_env_vars(
|
|
|
316
321
|
if langfuse_public_key and langfuse_secret_key:
|
|
317
322
|
raw["HERMES_LANGFUSE_PUBLIC_KEY"] = langfuse_public_key
|
|
318
323
|
raw["HERMES_LANGFUSE_SECRET_KEY"] = langfuse_secret_key
|
|
319
|
-
langfuse_base_url = _env_value(
|
|
324
|
+
langfuse_base_url = _env_value(
|
|
325
|
+
"HERMES_LANGFUSE_BASE_URL", "LANGFUSE_BASE_URL", "LANGFUSE_HOST"
|
|
326
|
+
)
|
|
320
327
|
if langfuse_base_url:
|
|
321
328
|
raw["HERMES_LANGFUSE_BASE_URL"] = langfuse_base_url
|
|
322
329
|
for target_key, source_keys in {
|
|
@@ -344,10 +351,19 @@ def _build_hermes_env_vars(
|
|
|
344
351
|
raw[key] = value
|
|
345
352
|
raw = build_runtime_model_policy_env(raw, runtime="hermes")
|
|
346
353
|
if raw.get("HERMES_FALLBACK_MODEL"):
|
|
347
|
-
raw.setdefault(
|
|
348
|
-
|
|
354
|
+
raw.setdefault(
|
|
355
|
+
"HERMES_FALLBACK_PROVIDER", _env_value("HERMES_FALLBACK_PROVIDER") or "custom"
|
|
356
|
+
)
|
|
357
|
+
raw.setdefault(
|
|
358
|
+
"HERMES_FALLBACK_BASE_URL",
|
|
359
|
+
_env_value("HERMES_FALLBACK_BASE_URL") or resolved_model_base_url,
|
|
360
|
+
)
|
|
349
361
|
return [
|
|
350
|
-
{
|
|
362
|
+
{
|
|
363
|
+
"Key": key,
|
|
364
|
+
"Value": str(value),
|
|
365
|
+
"IsSensitive": any(token in key for token in ("KEY", "TOKEN", "SECRET")),
|
|
366
|
+
}
|
|
351
367
|
for key, value in raw.items()
|
|
352
368
|
if value is not None and str(value).strip() != ""
|
|
353
369
|
]
|
|
@@ -384,9 +400,12 @@ def _diagnostic_field_style(status_value: str) -> str:
|
|
|
384
400
|
|
|
385
401
|
|
|
386
402
|
def _flatten_agent_detail(agent: dict[str, Any]) -> dict[str, Any]:
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
403
|
+
basic_value = agent.get("basic")
|
|
404
|
+
deployment_value = agent.get("deployment")
|
|
405
|
+
quick_value = agent.get("quick_access")
|
|
406
|
+
basic = basic_value if isinstance(basic_value, dict) else {}
|
|
407
|
+
deployment = deployment_value if isinstance(deployment_value, dict) else {}
|
|
408
|
+
quick = quick_value if isinstance(quick_value, dict) else {}
|
|
390
409
|
return {
|
|
391
410
|
"agent_id": basic.get("agent_id") or agent.get("agent_id"),
|
|
392
411
|
"name": basic.get("name") or agent.get("name"),
|
|
@@ -395,17 +414,25 @@ def _flatten_agent_detail(agent: dict[str, Any]) -> dict[str, Any]:
|
|
|
395
414
|
"message": basic.get("message") or "",
|
|
396
415
|
"replicas": basic.get("replicas"),
|
|
397
416
|
"ready_replicas": basic.get("ready_replicas"),
|
|
398
|
-
"framework": deployment.get("framework")
|
|
417
|
+
"framework": deployment.get("framework")
|
|
418
|
+
or basic.get("framework")
|
|
419
|
+
or agent.get("framework"),
|
|
399
420
|
"region": basic.get("region") or agent.get("region"),
|
|
400
|
-
"endpoint": quick.get("public_endpoint")
|
|
421
|
+
"endpoint": quick.get("public_endpoint")
|
|
422
|
+
or quick.get("private_endpoint")
|
|
423
|
+
or agent.get("endpoint"),
|
|
401
424
|
"api_key": quick.get("api_key") or agent.get("api_key"),
|
|
402
425
|
"artifact_path": deployment.get("artifact_path") or agent.get("artifact_path"),
|
|
403
|
-
"langfuse_url": (agent.get("advanced") or {}).get("observability_url")
|
|
426
|
+
"langfuse_url": (agent.get("advanced") or {}).get("observability_url")
|
|
427
|
+
or agent.get("langfuse_trace_url")
|
|
428
|
+
or "",
|
|
404
429
|
}
|
|
405
430
|
|
|
406
431
|
|
|
407
432
|
def _resolve_hermes_ref(agent_ref: str | None) -> str:
|
|
408
|
-
resolved = resolve_agent_ref(
|
|
433
|
+
resolved = resolve_agent_ref(
|
|
434
|
+
agent_ref, cwd=Path(".").resolve(), include_state=True, include_project_config=True
|
|
435
|
+
)
|
|
409
436
|
if not resolved:
|
|
410
437
|
raise resolution_error(
|
|
411
438
|
HERMES_RESOURCE.missing_ref_message or "请指定 Hermes Agent。",
|
|
@@ -429,13 +456,19 @@ async def _get_hermes_detail_with_client(
|
|
|
429
456
|
detail = _flatten_agent_detail(agent)
|
|
430
457
|
framework = str(detail.get("framework") or "").strip().lower()
|
|
431
458
|
if framework and framework != "hermes":
|
|
432
|
-
raise resolution_error(
|
|
459
|
+
raise resolution_error(
|
|
460
|
+
f"目标 Agent 不是 Hermes: {agent_ref}", hints=["agentengine hermes list"]
|
|
461
|
+
)
|
|
433
462
|
return detail
|
|
434
463
|
|
|
435
464
|
|
|
436
|
-
async def _get_hermes_detail(
|
|
465
|
+
async def _get_hermes_detail(
|
|
466
|
+
region: str, agent_ref: str, *, include_api_key: bool = False
|
|
467
|
+
) -> dict[str, Any]:
|
|
437
468
|
async with AgentEngineClient(region=region) as client:
|
|
438
|
-
return await _get_hermes_detail_with_client(
|
|
469
|
+
return await _get_hermes_detail_with_client(
|
|
470
|
+
client, agent_ref, include_api_key=include_api_key
|
|
471
|
+
)
|
|
439
472
|
|
|
440
473
|
|
|
441
474
|
def _resolve_hermes_access(
|
|
@@ -451,7 +484,9 @@ def _resolve_hermes_access(
|
|
|
451
484
|
detail = asyncio.run(_get_hermes_detail(region, resolved, include_api_key=True))
|
|
452
485
|
endpoint_value = str(detail.get("endpoint") or "").strip()
|
|
453
486
|
if not endpoint_value:
|
|
454
|
-
raise resolution_error(
|
|
487
|
+
raise resolution_error(
|
|
488
|
+
"目标 Hermes Agent 未返回 Endpoint", hints=["agentengine hermes status <agent>"]
|
|
489
|
+
)
|
|
455
490
|
return {
|
|
456
491
|
"endpoint": endpoint_value,
|
|
457
492
|
"api_key": api_key or detail.get("api_key"),
|
|
@@ -477,7 +512,9 @@ def _split_terminal_agent_ref_and_argv(
|
|
|
477
512
|
raise direct_error
|
|
478
513
|
|
|
479
514
|
|
|
480
|
-
def _render_hermes_dry_run(
|
|
515
|
+
def _render_hermes_dry_run(
|
|
516
|
+
action: str, request: dict[str, Any], hints: tuple[str, ...] = ()
|
|
517
|
+
) -> None:
|
|
481
518
|
if is_json_output():
|
|
482
519
|
emit_json(
|
|
483
520
|
build_dry_run_envelope(
|
|
@@ -626,7 +663,9 @@ async def _deploy_hermes(
|
|
|
626
663
|
model_api_key=model_api_key,
|
|
627
664
|
default_model=default_model,
|
|
628
665
|
)
|
|
629
|
-
resolved_default_model =
|
|
666
|
+
resolved_default_model = (
|
|
667
|
+
default_model or _env_value("OPENAI_MODEL_NAME") or DEFAULT_HERMES_MODEL_NAME
|
|
668
|
+
)
|
|
630
669
|
model_metadata = await fetch_provider_model_metadata(
|
|
631
670
|
api_base=model_base_url or _env_value("OPENAI_BASE_URL"),
|
|
632
671
|
api_key=model_api_key or _env_value("OPENAI_API_KEY"),
|
|
@@ -659,7 +698,9 @@ async def _deploy_hermes(
|
|
|
659
698
|
if storage_config:
|
|
660
699
|
payload["storage"] = storage_config
|
|
661
700
|
if existing_agent_id and include_storage_on_update and no_storage:
|
|
662
|
-
print_warn(
|
|
701
|
+
print_warn(
|
|
702
|
+
"更新已有 Hermes 时 `--no-storage` 不会删除服务端既有挂盘配置;默认保留已有配置。"
|
|
703
|
+
)
|
|
663
704
|
network_payload = build_network_payload(
|
|
664
705
|
enable_public_access=enable_public_access,
|
|
665
706
|
enable_vpc_access=enable_vpc_access,
|
|
@@ -670,7 +711,7 @@ async def _deploy_hermes(
|
|
|
670
711
|
region=region,
|
|
671
712
|
dry_run=dry_run,
|
|
672
713
|
)
|
|
673
|
-
# create
|
|
714
|
+
# create 默认开公网;update 使用原始 payload,None 表示保留现有配置。
|
|
674
715
|
create_network_payload = dict(network_payload) if network_payload is not None else {}
|
|
675
716
|
if "enable_public_access" not in create_network_payload:
|
|
676
717
|
create_network_payload["enable_public_access"] = True
|
|
@@ -697,9 +738,7 @@ async def _deploy_hermes(
|
|
|
697
738
|
raise
|
|
698
739
|
# 本地 state 缓存的 agent_id 在服务端已不存在(已删除),
|
|
699
740
|
# 清掉失效 state 后回退为新建,避免 404 卡住用户。
|
|
700
|
-
print_warn(
|
|
701
|
-
f"本地状态失效 ({existing_agent_id}),将自动回退为新建: {update_err}"
|
|
702
|
-
)
|
|
741
|
+
print_warn(f"本地状态失效 ({existing_agent_id}),将自动回退为新建: {update_err}")
|
|
703
742
|
cleared = clear_state(project_dir, key=existing_agent_id)
|
|
704
743
|
if cleared:
|
|
705
744
|
print_info("已清理失效的 .agentengine.state")
|
|
@@ -723,10 +762,12 @@ async def _deploy_hermes(
|
|
|
723
762
|
attempts=12,
|
|
724
763
|
interval_seconds=5,
|
|
725
764
|
include_api_key=True,
|
|
726
|
-
detail_fetcher=lambda agent_ref, include_api_key:
|
|
727
|
-
|
|
728
|
-
|
|
729
|
-
|
|
765
|
+
detail_fetcher=lambda agent_ref, include_api_key: (
|
|
766
|
+
_get_hermes_detail_with_client(
|
|
767
|
+
client,
|
|
768
|
+
agent_ref,
|
|
769
|
+
include_api_key=include_api_key,
|
|
770
|
+
)
|
|
730
771
|
),
|
|
731
772
|
suppress_transient_not_found_log=True,
|
|
732
773
|
)
|
|
@@ -753,10 +794,12 @@ async def _deploy_hermes(
|
|
|
753
794
|
initial_delay_seconds=2,
|
|
754
795
|
require_complete_access=True,
|
|
755
796
|
include_api_key=True,
|
|
756
|
-
detail_fetcher=lambda agent_ref, include_api_key:
|
|
757
|
-
|
|
758
|
-
|
|
759
|
-
|
|
797
|
+
detail_fetcher=lambda agent_ref, include_api_key: (
|
|
798
|
+
_get_hermes_detail_with_client(
|
|
799
|
+
client,
|
|
800
|
+
agent_ref,
|
|
801
|
+
include_api_key=include_api_key,
|
|
802
|
+
)
|
|
760
803
|
),
|
|
761
804
|
suppress_transient_not_found_log=True,
|
|
762
805
|
)
|
|
@@ -792,6 +835,7 @@ async def _deploy_hermes(
|
|
|
792
835
|
},
|
|
793
836
|
)
|
|
794
837
|
if is_json_output():
|
|
838
|
+
status_schema = HERMES_RESOURCE.status_schema
|
|
795
839
|
emit_json(
|
|
796
840
|
build_result_envelope(
|
|
797
841
|
resource="hermes",
|
|
@@ -808,7 +852,7 @@ async def _deploy_hermes(
|
|
|
808
852
|
"ui_profile": "hermes",
|
|
809
853
|
"ui_path": "/",
|
|
810
854
|
},
|
|
811
|
-
hints=list(
|
|
855
|
+
hints=list(status_schema.next_steps) if status_schema is not None else [],
|
|
812
856
|
)
|
|
813
857
|
)
|
|
814
858
|
return
|
|
@@ -837,7 +881,9 @@ def list_hermes(region: str, page: int, size: int, dry_run: bool, output_mode: s
|
|
|
837
881
|
|
|
838
882
|
async def _list():
|
|
839
883
|
async with AgentEngineClient(region=region, dry_run=dry_run) as client:
|
|
840
|
-
resp = await client.list_agents(
|
|
884
|
+
resp = await client.list_agents(
|
|
885
|
+
region=region, framework="hermes", page=page, page_size=size
|
|
886
|
+
)
|
|
841
887
|
agents = resp.get("agents", []) or []
|
|
842
888
|
rows = []
|
|
843
889
|
items = []
|
|
@@ -870,7 +916,9 @@ def list_hermes(region: str, page: int, size: int, dry_run: bool, output_mode: s
|
|
|
870
916
|
items=items,
|
|
871
917
|
)
|
|
872
918
|
|
|
873
|
-
run_async_with_dry_run(
|
|
919
|
+
run_async_with_dry_run(
|
|
920
|
+
_list(), dry_run=dry_run, dry_run_resource="hermes", dry_run_action="list"
|
|
921
|
+
)
|
|
874
922
|
|
|
875
923
|
|
|
876
924
|
@hermes.command("status", context_settings=CONTEXT_SETTINGS)
|
|
@@ -897,40 +945,50 @@ def status(agent_ref: Optional[str], region: str, dry_run: bool, output_mode: st
|
|
|
897
945
|
replicas = detail.get("replicas")
|
|
898
946
|
ready = detail.get("ready_replicas")
|
|
899
947
|
if replicas is not None or ready is not None:
|
|
900
|
-
|
|
948
|
+
ready_text = ready if ready is not None else "-"
|
|
949
|
+
replicas_total_text = replicas if replicas is not None else "-"
|
|
950
|
+
replicas_text = f"{ready_text}/{replicas_total_text}"
|
|
901
951
|
replica_style = _diagnostic_field_style(status_value)
|
|
902
952
|
fields.append(("副本", replicas_text, replica_style))
|
|
903
953
|
if message:
|
|
904
954
|
message_style = _diagnostic_field_style(status_value)
|
|
905
955
|
fields.append(("消息", message, message_style))
|
|
906
|
-
fields.extend(
|
|
907
|
-
|
|
908
|
-
|
|
909
|
-
|
|
910
|
-
|
|
911
|
-
|
|
912
|
-
|
|
956
|
+
fields.extend(
|
|
957
|
+
[
|
|
958
|
+
("框架", str(detail.get("framework") or "-"), None),
|
|
959
|
+
("区域", str(detail.get("region") or region), None),
|
|
960
|
+
("Endpoint", str(detail.get("endpoint") or "-"), "#58a6ff"),
|
|
961
|
+
(
|
|
962
|
+
"Langfuse",
|
|
963
|
+
str(detail.get("langfuse_url") or "-"),
|
|
964
|
+
"#58a6ff" if detail.get("langfuse_url") else None,
|
|
965
|
+
),
|
|
966
|
+
("镜像", str(detail.get("artifact_path") or "-"), None),
|
|
967
|
+
]
|
|
968
|
+
)
|
|
913
969
|
render_descriptor_status(
|
|
914
970
|
HERMES_RESOURCE,
|
|
915
971
|
subtitle=str(detail.get("name") or resolved),
|
|
916
|
-
|
|
917
|
-
|
|
918
|
-
|
|
919
|
-
|
|
972
|
+
fields=fields,
|
|
973
|
+
item={
|
|
974
|
+
"id": str(detail.get("agent_id") or "-"),
|
|
975
|
+
"name": str(detail.get("name") or resolved),
|
|
920
976
|
"status": status_value,
|
|
921
977
|
"framework": str(detail.get("framework") or "-"),
|
|
922
|
-
|
|
923
|
-
|
|
924
|
-
|
|
925
|
-
|
|
926
|
-
|
|
927
|
-
|
|
928
|
-
|
|
929
|
-
|
|
930
|
-
|
|
931
|
-
|
|
978
|
+
"region": str(detail.get("region") or region),
|
|
979
|
+
"endpoint": str(detail.get("endpoint") or "-"),
|
|
980
|
+
"langfuse_url": str(detail.get("langfuse_url") or ""),
|
|
981
|
+
"image": str(detail.get("artifact_path") or "-"),
|
|
982
|
+
"message": message,
|
|
983
|
+
"phase": str(detail.get("phase") or ""),
|
|
984
|
+
"replicas": detail.get("replicas"),
|
|
985
|
+
"ready_replicas": detail.get("ready_replicas"),
|
|
986
|
+
},
|
|
987
|
+
)
|
|
932
988
|
|
|
933
|
-
run_async_with_dry_run(
|
|
989
|
+
run_async_with_dry_run(
|
|
990
|
+
_status(), dry_run=dry_run, dry_run_resource="hermes", dry_run_action="status"
|
|
991
|
+
)
|
|
934
992
|
|
|
935
993
|
|
|
936
994
|
@hermes.command("open", context_settings=CONTEXT_SETTINGS)
|
|
@@ -965,11 +1023,8 @@ def open_hermes(
|
|
|
965
1023
|
"""打开 Hermes 管理 UI,或使用 --chat 打开统一聊天页。"""
|
|
966
1024
|
_ = output_mode
|
|
967
1025
|
ctx = click.get_current_context(silent=True)
|
|
968
|
-
|
|
969
|
-
|
|
970
|
-
if ctx is not None and ctx.get_parameter_source("region") is not None
|
|
971
|
-
else ""
|
|
972
|
-
)
|
|
1026
|
+
parameter_source = ctx.get_parameter_source("region") if ctx is not None else None
|
|
1027
|
+
region_source = parameter_source.name.lower() if parameter_source is not None else ""
|
|
973
1028
|
if manage and chat:
|
|
974
1029
|
raise click.ClickException("--manage 与 --chat 不能同时使用")
|
|
975
1030
|
try:
|
|
@@ -978,7 +1033,11 @@ def open_hermes(
|
|
|
978
1033
|
raise click.ClickException(str(e)) from e
|
|
979
1034
|
dry_run = effective_dry_run(dry_run)
|
|
980
1035
|
target_path = ui_path or ("/chat" if chat else "/")
|
|
981
|
-
parsed_expires =
|
|
1036
|
+
parsed_expires = (
|
|
1037
|
+
int(expires_seconds)
|
|
1038
|
+
if expires_seconds is not None and expires_seconds not in {"never", "forever"}
|
|
1039
|
+
else 0 if expires_seconds else None
|
|
1040
|
+
)
|
|
982
1041
|
if dry_run:
|
|
983
1042
|
_render_hermes_dry_run(
|
|
984
1043
|
"open",
|
|
@@ -1052,7 +1111,9 @@ def exec_hermes(
|
|
|
1052
1111
|
hints=("dry-run 未解析远端 Agent,也未建立 websocket。",),
|
|
1053
1112
|
)
|
|
1054
1113
|
return
|
|
1055
|
-
access = _resolve_hermes_access(
|
|
1114
|
+
access = _resolve_hermes_access(
|
|
1115
|
+
agent_ref=agent_ref, region=region, endpoint=endpoint, api_key=api_key
|
|
1116
|
+
)
|
|
1056
1117
|
exit_code = asyncio.run(
|
|
1057
1118
|
run_hermes_terminal_session(
|
|
1058
1119
|
endpoint=str(access["endpoint"]),
|
|
@@ -1116,7 +1177,9 @@ def pairing_hermes(
|
|
|
1116
1177
|
hints=("dry-run 未解析远端 Agent,也未建立 websocket。",),
|
|
1117
1178
|
)
|
|
1118
1179
|
return
|
|
1119
|
-
access = _resolve_hermes_access(
|
|
1180
|
+
access = _resolve_hermes_access(
|
|
1181
|
+
agent_ref=agent_ref, region=region, endpoint=endpoint, api_key=api_key
|
|
1182
|
+
)
|
|
1120
1183
|
exit_code = asyncio.run(
|
|
1121
1184
|
run_hermes_terminal_session(
|
|
1122
1185
|
endpoint=str(access["endpoint"]),
|
|
@@ -1172,7 +1235,9 @@ def connect_hermes(
|
|
|
1172
1235
|
return
|
|
1173
1236
|
|
|
1174
1237
|
try:
|
|
1175
|
-
access = _resolve_hermes_access(
|
|
1238
|
+
access = _resolve_hermes_access(
|
|
1239
|
+
agent_ref=agent_ref, region=region, endpoint=endpoint, api_key=api_key
|
|
1240
|
+
)
|
|
1176
1241
|
exit_code = asyncio.run(
|
|
1177
1242
|
run_hermes_terminal_session(
|
|
1178
1243
|
endpoint=str(access["endpoint"]),
|
|
@@ -1217,7 +1282,9 @@ def _delete_impl(agent_refs: tuple[str, ...], region: str, assume_yes: bool, dry
|
|
|
1217
1282
|
raise remote_error(f"以下 Hermes 删除失败: {', '.join(failed)}")
|
|
1218
1283
|
return {"targets": list(agent_refs), "deleted": deleted, "failed": failed}
|
|
1219
1284
|
|
|
1220
|
-
result = run_async_with_dry_run(
|
|
1285
|
+
result = run_async_with_dry_run(
|
|
1286
|
+
_delete(), dry_run=dry_run, dry_run_resource="hermes", dry_run_action="delete"
|
|
1287
|
+
)
|
|
1221
1288
|
if result is not None:
|
|
1222
1289
|
deleted_text = ", ".join(result["deleted"]) or "-"
|
|
1223
1290
|
failed_text = ", ".join(result["failed"]) or "-"
|
|
@@ -1245,7 +1312,13 @@ def _delete_impl(agent_refs: tuple[str, ...], region: str, assume_yes: bool, dry
|
|
|
1245
1312
|
@confirm_options()
|
|
1246
1313
|
@dry_run_option()
|
|
1247
1314
|
@cli_output_option()
|
|
1248
|
-
def delete(
|
|
1315
|
+
def delete(
|
|
1316
|
+
agent_refs: tuple[str, ...],
|
|
1317
|
+
region: str,
|
|
1318
|
+
assume_yes: bool,
|
|
1319
|
+
dry_run: bool,
|
|
1320
|
+
output_mode: str | None,
|
|
1321
|
+
):
|
|
1249
1322
|
"""删除 Hermes Agent。"""
|
|
1250
1323
|
_ = output_mode
|
|
1251
1324
|
_delete_impl(agent_refs=agent_refs, region=region, assume_yes=assume_yes, dry_run=dry_run)
|
|
@@ -1257,7 +1330,13 @@ def delete(agent_refs: tuple[str, ...], region: str, assume_yes: bool, dry_run:
|
|
|
1257
1330
|
@confirm_options()
|
|
1258
1331
|
@dry_run_option()
|
|
1259
1332
|
@cli_output_option()
|
|
1260
|
-
def destroy(
|
|
1333
|
+
def destroy(
|
|
1334
|
+
agent_refs: tuple[str, ...],
|
|
1335
|
+
region: str,
|
|
1336
|
+
assume_yes: bool,
|
|
1337
|
+
dry_run: bool,
|
|
1338
|
+
output_mode: str | None,
|
|
1339
|
+
):
|
|
1261
1340
|
"""删除 Hermes Agent。"""
|
|
1262
1341
|
_ = output_mode
|
|
1263
1342
|
_delete_impl(agent_refs=agent_refs, region=region, assume_yes=assume_yes, dry_run=dry_run)
|