agentengine-sdk-python 0.6.9__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.6.9.dist-info → agentengine_sdk_python-0.8.0.dist-info}/METADATA +41 -23
- 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 +252 -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 +533 -726
- 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 +173 -90
- ksadk/cli/cmd_invoke.py +388 -159
- ksadk/cli/cmd_launch.py +64 -28
- ksadk/cli/cmd_mcp.py +103 -64
- ksadk/cli/cmd_model.py +14 -5
- ksadk/cli/cmd_openclaw.py +488 -228
- ksadk/cli/cmd_replay.py +71 -0
- ksadk/cli/cmd_run.py +44 -14
- 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 +38 -16
- 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 +501 -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 +656 -0
- ksadk/conversations/model_context.py +22 -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 -5187
- 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 +52 -39
- ksadk/deployment/manager.py +63 -65
- ksadk/deployment/providers/serverless.py +326 -209
- 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 +267 -0
- ksadk/memory/adk/short_term_memory.py +33 -27
- 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 +1248 -164
- 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 -530
- ksadk/runners/langgraph_runner.py +490 -95
- ksadk/runners/patch_langchain.py +16 -16
- ksadk/runners/remote_runner.py +264 -38
- 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 -3743
- 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-C0meuOdi.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-bj2rZnP5.js → arc-CFKwSk_B.js} +1 -1
- ksadk/server/static/assets/architecture-7EHR7CIX-CynqOWjZ.js +1 -0
- ksadk/server/static/assets/{architectureDiagram-3BPJPVTR-2u1ltDIj.js → architectureDiagram-3BPJPVTR-Dej8jX8c.js} +1 -1
- ksadk/server/static/assets/{blockDiagram-GPEHLZMM-D6fvdK20.js → blockDiagram-GPEHLZMM-1F64jqvy.js} +1 -1
- ksadk/server/static/assets/{c4Diagram-AAUBKEIU-BK82L5n5.js → c4Diagram-AAUBKEIU-9q7AUAKb.js} +1 -1
- ksadk/server/static/assets/channel-iUGv2N24.js +1 -0
- ksadk/server/static/assets/{chunk-2J33WTMH-DLVdkeyQ.js → chunk-2J33WTMH-6qgwJm7Q.js} +1 -1
- ksadk/server/static/assets/{chunk-4BX2VUAB-BbwsYcbW.js → chunk-4BX2VUAB-CsWIQRhc.js} +1 -1
- ksadk/server/static/assets/{chunk-55IACEB6-DOairxzw.js → chunk-55IACEB6-BK8paA20.js} +1 -1
- ksadk/server/static/assets/{chunk-727SXJPM-hCO487gs.js → chunk-727SXJPM-B-JEhy7h.js} +1 -1
- ksadk/server/static/assets/{chunk-AQP2D5EJ-XU8vDOuG.js → chunk-AQP2D5EJ-DYBvMHAa.js} +1 -1
- ksadk/server/static/assets/{chunk-FMBD7UC4-PrapyfMu.js → chunk-FMBD7UC4-BGhvzDYt.js} +1 -1
- ksadk/server/static/assets/{chunk-ND2GUHAM-CboKhTZ3.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-_N8bJ-EU.js → cose-bilkent-S5V4N54A-CX3yotHq.js} +1 -1
- ksadk/server/static/assets/{dagre-BM42HDAG-FoDlo5J2.js → dagre-BM42HDAG-C7TguAWo.js} +1 -1
- ksadk/server/static/assets/{diagram-2AECGRRQ-BBp6ebBw.js → diagram-2AECGRRQ-Dd17_kws.js} +1 -1
- ksadk/server/static/assets/{diagram-5GNKFQAL-CqOvG1PR.js → diagram-5GNKFQAL-DVIClIil.js} +1 -1
- ksadk/server/static/assets/{diagram-KO2AKTUF-O9T3t6ba.js → diagram-KO2AKTUF-Df_3gYQa.js} +1 -1
- ksadk/server/static/assets/{diagram-LMA3HP47-CGG8ekBO.js → diagram-LMA3HP47-BhLk6ZtA.js} +1 -1
- ksadk/server/static/assets/{diagram-OG6HWLK6-4BmH1EEg.js → diagram-OG6HWLK6-D4GNGvuu.js} +1 -1
- ksadk/server/static/assets/{dist-CiZHB6ZW.js → dist-6CVKuTAe.js} +1 -1
- ksadk/server/static/assets/{dist-BMKM66B4.js → dist-BUHRxvDG.js} +1 -1
- ksadk/server/static/assets/{dist-CZ6C3x8B.js → dist-BZ9n9AjO.js} +1 -1
- ksadk/server/static/assets/{dist-DbaH3p5h.js → dist-BibcG1V9.js} +1 -1
- ksadk/server/static/assets/{dist-BVzcWa6D.js → dist-Bs-jQcRX.js} +1 -1
- ksadk/server/static/assets/{dist-D99wf6_X.js → dist-C2xjE7cO.js} +1 -1
- ksadk/server/static/assets/{dist-DLMjL01k.js → dist-C7-3jInC.js} +1 -1
- ksadk/server/static/assets/{dist-DI-oVAXw.js → dist-C99THtIA.js} +1 -1
- ksadk/server/static/assets/{dist-BkJjNih3.js → dist-CGcp2ex8.js} +1 -1
- ksadk/server/static/assets/{dist-D5JGcxBx.js → dist-CVQRZjPu.js} +1 -1
- ksadk/server/static/assets/{dist-CWiTDN_V.js → dist-Cf23NY4L.js} +1 -1
- ksadk/server/static/assets/{dist-DLeM1OCK.js → dist-CgF3fj15.js} +1 -1
- ksadk/server/static/assets/{dist-BmuTWcm7.js → dist-Cwt7koer.js} +1 -1
- ksadk/server/static/assets/{dist-C2DKRFVK.js → dist-D82mtD2s.js} +1 -1
- ksadk/server/static/assets/{dist-B67uF2uK.js → dist-DF06ORQo.js} +1 -1
- ksadk/server/static/assets/{dist-Cwhk4lwI.js → dist-DHn6nBzr.js} +1 -1
- ksadk/server/static/assets/{dist-S4klkK5W.js → dist-Djgl2wVZ.js} +1 -1
- ksadk/server/static/assets/{dist-DCpZrjaK.js → dist-DlzCRy0S.js} +1 -1
- ksadk/server/static/assets/{dist-Cp1_jKwf.js → dist-DqNnNFrw.js} +1 -1
- ksadk/server/static/assets/{dist-6kSZvCZh.js → dist-DyvYLMW9.js} +1 -1
- ksadk/server/static/assets/{dist-DM0rEQPk.js → dist-eoW6tZXA.js} +1 -1
- ksadk/server/static/assets/{dist-Bk1l05Ni.js → dist-ivOya1LD.js} +1 -1
- ksadk/server/static/assets/{erDiagram-TEJ5UH35-oJhaci7S.js → erDiagram-TEJ5UH35-CnfRcY2M.js} +1 -1
- ksadk/server/static/assets/eventmodeling-FCH6USID-ChYO-ijM.js +1 -0
- ksadk/server/static/assets/{flowDiagram-I6XJVG4X-DtTmUan-.js → flowDiagram-I6XJVG4X-DGaJjGNJ.js} +1 -1
- ksadk/server/static/assets/{ganttDiagram-6RSMTGT7-BSsb_eij.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-BR5s6Pws.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-DYPc5cvh.js → infoDiagram-5YYISTIA-CYIIsb8y.js} +1 -1
- ksadk/server/static/assets/{ishikawaDiagram-YF4QCWOH-MoBdALDg.js → ishikawaDiagram-YF4QCWOH-DLOHGvWw.js} +1 -1
- ksadk/server/static/assets/{journeyDiagram-JHISSGLW-DgLiQT8l.js → journeyDiagram-JHISSGLW-BIzKeejT.js} +1 -1
- ksadk/server/static/assets/{kanban-definition-UN3LZRKU-CsFx112F.js → kanban-definition-UN3LZRKU-BWHoFSw2.js} +1 -1
- ksadk/server/static/assets/{katex-DRsiwpM2.js → katex-DATssjp1.js} +1 -1
- ksadk/server/static/assets/{linear-TNRQ5Orv.js → linear-CvMBw9cA.js} +1 -1
- ksadk/server/static/assets/{mermaid-parser.core-D2eMVOgo.js → mermaid-parser.core-mGAcEwcq.js} +2 -2
- ksadk/server/static/assets/{mindmap-definition-RKZ34NQL-BtByYFhL.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-DPnuCB8c.js → pieDiagram-4H26LBE5-By-ra07M.js} +1 -1
- ksadk/server/static/assets/{quadrantDiagram-W4KKPZXB-miFpCPv4.js → quadrantDiagram-W4KKPZXB-CxIR4JXI.js} +1 -1
- ksadk/server/static/assets/radar-GUYGQ44K-BIq5fXsn.js +1 -0
- ksadk/server/static/assets/{requirementDiagram-4Y6WPE33-mjB_yYkW.js → requirementDiagram-4Y6WPE33-DpW90iu3.js} +1 -1
- ksadk/server/static/assets/{sankeyDiagram-5OEKKPKP-D7hSlZZZ.js → sankeyDiagram-5OEKKPKP-DpGa6EAV.js} +1 -1
- ksadk/server/static/assets/{sequenceDiagram-3UESZ5HK-D9Cx6hC3.js → sequenceDiagram-3UESZ5HK-NTKNGGe5.js} +1 -1
- ksadk/server/static/assets/{stateDiagram-AJRCARHV-D_zrg47o.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-CwSec0Wa.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-agCVobiF.js → vennDiagram-CIIHVFJN-l3Z7-wbP.js} +1 -1
- ksadk/server/static/assets/wardley-L42UT6IY-8XLvnNIs.js +1 -0
- ksadk/server/static/assets/{wardleyDiagram-YWT4CUSO-TmrlhWNt.js → wardleyDiagram-YWT4CUSO-BR54GPmr.js} +1 -1
- ksadk/server/static/assets/{xychartDiagram-2RQKCTM6-DV71V-ah.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 +86 -40
- ksadk/sessions/base.py +31 -11
- ksadk/sessions/continuity.py +28 -5
- ksadk/sessions/in_memory.py +46 -2
- ksadk/sessions/local_service.py +148 -17
- ksadk/sessions/postgres_service.py +216 -35
- ksadk/sessions/resilience.py +52 -0
- ksadk/sessions/resilient.py +388 -0
- 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 +136 -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 +264 -114
- ksadk/tracing/exporters/inmemory_exporter.py +62 -51
- ksadk/tracing/exporters/langfuse_exporter.py +91 -76
- ksadk/tracing/setup.py +132 -53
- ksadk/tracing/span_utils.py +5 -2
- ksadk/tui/__init__.py +22 -7
- ksadk/tui/loop.py +1925 -0
- ksadk/tui/stream_render.py +69 -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.6.9.dist-info/RECORD +0 -487
- ksadk/server/static/assets/CodeBlock-BbI4HPtJ.js +0 -9
- ksadk/server/static/assets/MathMessageMarkdown-DMLQYoLp.js +0 -8
- ksadk/server/static/assets/MermaidBlock-DCR8WZ17.js +0 -303
- ksadk/server/static/assets/NativeTerminalPanel-CKUvWhUz.js +0 -1
- ksadk/server/static/assets/architecture-7EHR7CIX-Cr6Xz1_c.js +0 -1
- ksadk/server/static/assets/channel-BSSOwFIb.js +0 -1
- ksadk/server/static/assets/chunk-QZHKN3VN-XXpdiwUL.js +0 -1
- ksadk/server/static/assets/classDiagram-4FO5ZUOK-C5HvGiyK.js +0 -1
- ksadk/server/static/assets/classDiagram-v2-Q7XG4LA2-C5HvGiyK.js +0 -1
- ksadk/server/static/assets/eventmodeling-FCH6USID-CIgwHJLL.js +0 -1
- ksadk/server/static/assets/gitGraph-WXDBUCRP-BVAJ7uo0.js +0 -1
- ksadk/server/static/assets/index-BH7-pC0B.js +0 -165
- ksadk/server/static/assets/index-DAURbCsP.css +0 -1
- ksadk/server/static/assets/info-J43DQDTF-MT80V4ge.js +0 -1
- ksadk/server/static/assets/packet-YPE3B663-BLKhbXZB.js +0 -1
- ksadk/server/static/assets/pie-LRSECV5Y-DFOikjSY.js +0 -1
- ksadk/server/static/assets/radar-GUYGQ44K-095b1Ikw.js +0 -1
- ksadk/server/static/assets/stateDiagram-v2-BHNVJYJU-J9kCb0nC.js +0 -1
- ksadk/server/static/assets/treeView-BLDUP644-yinfJEY6.js +0 -1
- ksadk/server/static/assets/treemap-LRROVOQU-DosUqN1Q.js +0 -1
- ksadk/server/static/assets/wardley-L42UT6IY-Bvp7-5uH.js +0 -1
- ksadk/tui/app.py +0 -400
- ksadk/tui/clipboard.py +0 -100
- ksadk/tui/widgets/__init__.py +0 -22
- ksadk/tui/widgets/assistant.py +0 -89
- ksadk/tui/widgets/base.py +0 -54
- ksadk/tui/widgets/chat_input.py +0 -246
- ksadk/tui/widgets/history.py +0 -156
- ksadk/tui/widgets/system.py +0 -87
- ksadk/tui/widgets/thinking.py +0 -110
- ksadk/tui/widgets/tool_call.py +0 -161
- ksadk/tui/widgets/user.py +0 -37
- {agentengine_sdk_python-0.6.9.dist-info → agentengine_sdk_python-0.8.0.dist-info}/WHEEL +0 -0
- {agentengine_sdk_python-0.6.9.dist-info → agentengine_sdk_python-0.8.0.dist-info}/entry_points.txt +0 -0
- {agentengine_sdk_python-0.6.9.dist-info → agentengine_sdk_python-0.8.0.dist-info}/licenses/LICENSE +0 -0
- {agentengine_sdk_python-0.6.9.dist-info → agentengine_sdk_python-0.8.0.dist-info}/top_level.txt +0 -0
ksadk/cli/cmd_replay.py
ADDED
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
# -*- coding: utf-8 -*-
|
|
2
|
+
"""ksadk replay — 基于 RuntimeEvent store + session 级订阅的历史回放 (goal-16)。
|
|
3
|
+
|
|
4
|
+
CLI 是消费 RuntimeAdapter/RuntimeEvent 的薄壳(不含 runtime 逻辑):replay 复用 goal-10
|
|
5
|
+
``RuntimeEventStore`` 与 goal-12 共享 parser/replay,把某 session 的 RuntimeEvent 历史
|
|
6
|
+
回放为确定性 transcript(text/reasoning/tool/artifact/run + a2ui/a2a extras)。
|
|
7
|
+
|
|
8
|
+
注:回放的是经 RuntimeEvent 持久化的新事件模型(带 runtime marker);legacy SessionEvent
|
|
9
|
+
(旧 assistant_message 等)不在本模型内,不回放。
|
|
10
|
+
"""
|
|
11
|
+
|
|
12
|
+
from __future__ import annotations
|
|
13
|
+
|
|
14
|
+
import asyncio
|
|
15
|
+
import json
|
|
16
|
+
|
|
17
|
+
import click
|
|
18
|
+
|
|
19
|
+
from ksadk.cli.resource_common import CONTEXT_SETTINGS
|
|
20
|
+
from ksadk.events.replay import replay_transcript
|
|
21
|
+
from ksadk.events.store import RuntimeEventStore
|
|
22
|
+
|
|
23
|
+
_HELP = dict(help_option_names=["-h", "--help"])
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
@click.command(
|
|
27
|
+
"replay", context_settings=CONTEXT_SETTINGS, help="回放某 session 的 RuntimeEvent 历史"
|
|
28
|
+
)
|
|
29
|
+
@click.argument("session_id")
|
|
30
|
+
@click.option(
|
|
31
|
+
"--after-seq-id", default=0, show_default=True, type=int, help="从该 seq cursor 之后回放"
|
|
32
|
+
)
|
|
33
|
+
@click.option("--before-seq-id", default=None, type=int, help="回放上界(不含该 seq)")
|
|
34
|
+
@click.option(
|
|
35
|
+
"--format", "fmt", type=click.Choice(["json", "text"]), default="text", show_default=True
|
|
36
|
+
)
|
|
37
|
+
def replay(session_id: str, after_seq_id: int, before_seq_id: int | None, fmt: str):
|
|
38
|
+
"""回放 session 的 RuntimeEvent 历史(text/reasoning/tool/artifact/run)。"""
|
|
39
|
+
asyncio.run(_run(session_id, after_seq_id=after_seq_id, before_seq_id=before_seq_id, fmt=fmt))
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
async def _run(session_id: str, *, after_seq_id: int, before_seq_id: int | None, fmt: str) -> None:
|
|
43
|
+
from ksadk.sessions import resolve_session_service
|
|
44
|
+
|
|
45
|
+
store = RuntimeEventStore(resolve_session_service())
|
|
46
|
+
parser = await replay_transcript(
|
|
47
|
+
store, session_id, after_seq_id=after_seq_id, before_seq_id=before_seq_id
|
|
48
|
+
)
|
|
49
|
+
transcript = parser.transcript()
|
|
50
|
+
if fmt == "json":
|
|
51
|
+
click.echo(json.dumps(transcript, ensure_ascii=False, sort_keys=True))
|
|
52
|
+
return
|
|
53
|
+
|
|
54
|
+
items = transcript["items"]
|
|
55
|
+
if not items and not transcript["extras"]:
|
|
56
|
+
click.echo(f"session {session_id} 无 RuntimeEvent 历史(或该 session 未经新事件模型持久化)")
|
|
57
|
+
return
|
|
58
|
+
for item in items:
|
|
59
|
+
kind = item.get("kind")
|
|
60
|
+
if kind in ("text", "reasoning"):
|
|
61
|
+
marker = "▍final" if item.get("final") else "▍delta"
|
|
62
|
+
click.echo(f"[{kind}/{item.get('phase')}] {marker} {item.get('text')}")
|
|
63
|
+
elif kind == "tool_call":
|
|
64
|
+
done = "✓" if item.get("done") else "…"
|
|
65
|
+
click.echo(f"[tool] {done} {item.get('name')} ({item.get('call_id')})")
|
|
66
|
+
elif kind == "artifact":
|
|
67
|
+
click.echo(f"[artifact] {item.get('name')} v{item.get('version')}")
|
|
68
|
+
for inv, status in transcript["run_status"].items():
|
|
69
|
+
click.echo(f"[run] {inv}: {status}")
|
|
70
|
+
for extra in transcript["extras"]:
|
|
71
|
+
click.echo(f"[{extra['event_type']}] {json.dumps(extra['payload'], ensure_ascii=False)}")
|
ksadk/cli/cmd_run.py
CHANGED
|
@@ -5,12 +5,13 @@ ksadk run - 本地运行 Agent
|
|
|
5
5
|
对于 LangChain/LangGraph/DeepAgents 项目,使用自己的实现
|
|
6
6
|
"""
|
|
7
7
|
|
|
8
|
-
import
|
|
9
|
-
import asyncio
|
|
8
|
+
import os
|
|
10
9
|
import subprocess
|
|
11
10
|
import sys
|
|
12
|
-
import os
|
|
13
11
|
from pathlib import Path
|
|
12
|
+
|
|
13
|
+
import click
|
|
14
|
+
|
|
14
15
|
from ksadk.cli.error_utils import ensure_json_output_supported, print_exception
|
|
15
16
|
from ksadk.cli.local_runtime import reexec_with_project_venv_if_needed
|
|
16
17
|
from ksadk.cli.ui import (
|
|
@@ -32,16 +33,34 @@ from ksadk.cli.ui import (
|
|
|
32
33
|
@click.option("--model", help="指定模型名称 (覆盖 .env 配置)")
|
|
33
34
|
@click.option("--show-thinking", is_flag=True, help="显示模型思考过程")
|
|
34
35
|
@click.option("--no-stream", is_flag=True, help="禁用流式渲染 (等待完整响应后再渲染)")
|
|
35
|
-
|
|
36
|
+
@click.option(
|
|
37
|
+
"--no-alt-screen",
|
|
38
|
+
"no_alt_screen",
|
|
39
|
+
is_flag=True,
|
|
40
|
+
help="兼容参数;TUI 已默认使用 inline viewport 并保留终端 scrollback",
|
|
41
|
+
)
|
|
42
|
+
def run(
|
|
43
|
+
agent_dir: str,
|
|
44
|
+
port: int,
|
|
45
|
+
interactive: bool,
|
|
46
|
+
no_trace: bool,
|
|
47
|
+
model: str,
|
|
48
|
+
show_thinking: bool,
|
|
49
|
+
no_stream: bool,
|
|
50
|
+
no_alt_screen: bool,
|
|
51
|
+
):
|
|
36
52
|
"""运行 Agent (支持 LangChain / LangGraph / DeepAgents / ADK)
|
|
37
53
|
|
|
38
54
|
AGENT_DIR: Agent 项目目录 (默认: 当前目录)
|
|
39
55
|
"""
|
|
40
56
|
ensure_json_output_supported(
|
|
41
57
|
"agentengine run",
|
|
42
|
-
suggestion=
|
|
58
|
+
suggestion=(
|
|
59
|
+
"请改用 `agentengine agent status --output json` 或 "
|
|
60
|
+
"`agentengine build --output json` 获取结构化信息。"
|
|
61
|
+
),
|
|
43
62
|
)
|
|
44
|
-
from ksadk.detection import FrameworkDetector
|
|
63
|
+
from ksadk.detection import FrameworkDetector
|
|
45
64
|
|
|
46
65
|
agent_path = Path(agent_dir).resolve()
|
|
47
66
|
command_args = ["run", str(agent_path), "--port", str(port)]
|
|
@@ -85,7 +104,7 @@ def run(agent_dir: str, port: int, interactive: bool, no_trace: bool, model: str
|
|
|
85
104
|
"langchain": "LangChain",
|
|
86
105
|
"langgraph": "LangGraph",
|
|
87
106
|
"deepagents": "DeepAgents",
|
|
88
|
-
"unknown": "Unknown"
|
|
107
|
+
"unknown": "Unknown",
|
|
89
108
|
}
|
|
90
109
|
framework_name = framework_map.get(result.type.value, result.type.value)
|
|
91
110
|
|
|
@@ -93,10 +112,16 @@ def run(agent_dir: str, port: int, interactive: bool, no_trace: bool, model: str
|
|
|
93
112
|
print_kv("Agent 名称", str(result.name))
|
|
94
113
|
print_kv("入口点", str(result.entry_point))
|
|
95
114
|
|
|
115
|
+
from ksadk.cli.cmd_web import configure_local_runtime_persistence
|
|
116
|
+
|
|
117
|
+
configure_local_runtime_persistence(agent_path, result.type.value)
|
|
118
|
+
|
|
96
119
|
# 2. 根据框架类型选择处理方式
|
|
97
120
|
# 所有框架统一使用 _run_custom() 以支持 Langfuse 自动插桩
|
|
98
121
|
# (Langfuse instrumentation 需要在同一进程内生效)
|
|
99
|
-
_run_custom(
|
|
122
|
+
_run_custom(
|
|
123
|
+
result, agent_path, port, interactive, no_trace, show_thinking, no_stream, no_alt_screen
|
|
124
|
+
)
|
|
100
125
|
|
|
101
126
|
|
|
102
127
|
def _run_adk_cli(agent_path: Path, port: int = 8080, command: str = "run"):
|
|
@@ -164,6 +189,7 @@ def _run_custom(
|
|
|
164
189
|
no_trace: bool,
|
|
165
190
|
show_thinking: bool,
|
|
166
191
|
no_stream: bool = False,
|
|
192
|
+
no_alt_screen: bool = False,
|
|
167
193
|
):
|
|
168
194
|
"""使用自定义实现 (LangChain/LangGraph/DeepAgents)"""
|
|
169
195
|
from ksadk.runners.factory import create_runner
|
|
@@ -171,9 +197,10 @@ def _run_custom(
|
|
|
171
197
|
# 初始化 Tracing
|
|
172
198
|
if not no_trace:
|
|
173
199
|
try:
|
|
174
|
-
from ksadk.tracing import setup_tracing
|
|
175
200
|
import os
|
|
176
201
|
|
|
202
|
+
from ksadk.tracing import setup_tracing
|
|
203
|
+
|
|
177
204
|
has_langfuse = bool(os.getenv("LANGFUSE_PUBLIC_KEY"))
|
|
178
205
|
has_otlp = bool(
|
|
179
206
|
os.getenv("OTEL_EXPORTER_OTLP_ENDPOINT")
|
|
@@ -196,7 +223,9 @@ def _run_custom(
|
|
|
196
223
|
if has_otlp:
|
|
197
224
|
print_info("Tracing: Enabled (InMemory + OTLP HTTP)")
|
|
198
225
|
elif has_langfuse:
|
|
199
|
-
print_info(
|
|
226
|
+
print_info(
|
|
227
|
+
f"Tracing: Enabled (InMemory + Langfuse, CallbackOnly={use_callback_only})"
|
|
228
|
+
)
|
|
200
229
|
else:
|
|
201
230
|
print_info("Tracing: Enabled")
|
|
202
231
|
except Exception as e:
|
|
@@ -217,13 +246,14 @@ def _run_custom(
|
|
|
217
246
|
# 运行
|
|
218
247
|
if interactive:
|
|
219
248
|
# TUI 交互模式
|
|
220
|
-
from ksadk.tui import
|
|
221
|
-
|
|
222
|
-
|
|
249
|
+
from ksadk.tui.loop import run_tui
|
|
250
|
+
|
|
251
|
+
run_tui(
|
|
252
|
+
runner,
|
|
223
253
|
show_thinking=show_thinking,
|
|
224
254
|
project_dir=str(agent_path),
|
|
255
|
+
no_alt_screen=no_alt_screen,
|
|
225
256
|
)
|
|
226
|
-
app.run()
|
|
227
257
|
else:
|
|
228
258
|
print_success(f"Server running at http://0.0.0.0:{port}")
|
|
229
259
|
print_kv("API Docs", f"http://0.0.0.0:{port}/docs")
|
ksadk/cli/cmd_status.py
CHANGED
|
@@ -4,15 +4,17 @@ agentengine status - 查看 Agent 运行状态和 Endpoint
|
|
|
4
4
|
支持 watch 模式实时刷新
|
|
5
5
|
"""
|
|
6
6
|
|
|
7
|
-
import click
|
|
8
7
|
import asyncio
|
|
9
8
|
import time
|
|
10
|
-
from pathlib import Path
|
|
11
9
|
from datetime import datetime
|
|
10
|
+
from pathlib import Path
|
|
12
11
|
from typing import Sequence
|
|
12
|
+
|
|
13
|
+
import click
|
|
14
|
+
|
|
13
15
|
from ksadk.api.client import DryRunExit
|
|
14
16
|
from ksadk.cli.agent_ref import merge_agent_inputs, resolve_agent_ref
|
|
15
|
-
from ksadk.cli.dry_run import dry_run_option,
|
|
17
|
+
from ksadk.cli.dry_run import dry_run_option, effective_dry_run, run_async_with_dry_run
|
|
16
18
|
from ksadk.cli.error_utils import print_exception, resolution_error, usage_error
|
|
17
19
|
from ksadk.cli.resource_common import (
|
|
18
20
|
CONTEXT_SETTINGS,
|
|
@@ -24,14 +26,10 @@ from ksadk.cli.resource_common import (
|
|
|
24
26
|
from ksadk.cli.ui import (
|
|
25
27
|
get_console,
|
|
26
28
|
is_json_output,
|
|
27
|
-
print_error,
|
|
28
29
|
print_info,
|
|
29
|
-
|
|
30
|
-
print_title,
|
|
31
|
-
print_warn,
|
|
30
|
+
replica_rich_style,
|
|
32
31
|
status_click_color,
|
|
33
32
|
status_rich_style,
|
|
34
|
-
replica_rich_style,
|
|
35
33
|
summary_panel,
|
|
36
34
|
)
|
|
37
35
|
|
|
@@ -55,7 +53,9 @@ AGENT_LIST_HIDDEN_FRAMEWORK_LABELS = {
|
|
|
55
53
|
@click.option("--watch", "-w", is_flag=True, help="Watch 模式,持续刷新")
|
|
56
54
|
@click.option("--interval", "-i", default=2, help="Watch 刷新间隔 (秒)")
|
|
57
55
|
@click.option("--region", "-r", default="cn-beijing-6", envvar="KSYUN_REGION", help="区域")
|
|
58
|
-
@click.option(
|
|
56
|
+
@click.option(
|
|
57
|
+
"--account-id", envvar="KSYUN_ACCOUNT_ID", help="金山云账号 ID(可选;未设置时从 AK/SK 反查)"
|
|
58
|
+
)
|
|
59
59
|
@dry_run_option()
|
|
60
60
|
def status(
|
|
61
61
|
agent_ref: str,
|
|
@@ -125,9 +125,12 @@ def run_status_command(
|
|
|
125
125
|
if not resolved:
|
|
126
126
|
raise resolution_error(
|
|
127
127
|
"请指定 Agent(--agent 或位置参数),或在当前目录提供可解析的本地配置",
|
|
128
|
-
hints=[
|
|
128
|
+
hints=[
|
|
129
|
+
"自动解析顺序: .agentengine.state -> agentengine.yaml/ksadk.yaml",
|
|
130
|
+
"请先执行 `agentengine agent list`。",
|
|
131
|
+
],
|
|
129
132
|
)
|
|
130
|
-
agent = resolved.value
|
|
133
|
+
agent = str(resolved.value)
|
|
131
134
|
if resolved.source != "cli":
|
|
132
135
|
print_info(f"未显式指定 Agent,使用 {resolved.source_text}: {agent}")
|
|
133
136
|
|
|
@@ -136,23 +139,34 @@ def run_status_command(
|
|
|
136
139
|
if watch and dry_run:
|
|
137
140
|
raise usage_error("Watch 模式不支持 dry-run,请去掉 --watch 或取消 dry-run。")
|
|
138
141
|
if watch and is_json_output():
|
|
139
|
-
raise usage_error(
|
|
142
|
+
raise usage_error(
|
|
143
|
+
"Watch 模式不支持 `--output json`。",
|
|
144
|
+
hints=["请去掉 `--watch` 或改用 `agentengine agent status --output json`。"],
|
|
145
|
+
)
|
|
140
146
|
|
|
141
147
|
# Dry Run 模式由 AgentEngineClient 处理
|
|
142
148
|
# 只要传入 dry_run=True,底层 client 会抛出 DryRunExit 异常
|
|
143
149
|
|
|
150
|
+
resolved_account_id = account_id or ""
|
|
144
151
|
if show_all:
|
|
145
152
|
run_async_with_dry_run(
|
|
146
|
-
_list_all_agents(
|
|
153
|
+
_list_all_agents(
|
|
154
|
+
region,
|
|
155
|
+
resolved_account_id,
|
|
156
|
+
dry_run,
|
|
157
|
+
page=page,
|
|
158
|
+
size=size,
|
|
159
|
+
framework=framework,
|
|
160
|
+
),
|
|
147
161
|
dry_run=dry_run,
|
|
148
162
|
dry_run_resource="agent",
|
|
149
163
|
dry_run_action="list",
|
|
150
164
|
)
|
|
151
165
|
elif watch:
|
|
152
|
-
_watch_status(agent, region,
|
|
166
|
+
_watch_status(str(agent), region, resolved_account_id, interval)
|
|
153
167
|
else:
|
|
154
168
|
run_async_with_dry_run(
|
|
155
|
-
_show_agent_status(agent, region,
|
|
169
|
+
_show_agent_status(str(agent), region, resolved_account_id, dry_run),
|
|
156
170
|
dry_run=dry_run,
|
|
157
171
|
dry_run_resource="agent",
|
|
158
172
|
dry_run_action="status",
|
|
@@ -170,7 +184,7 @@ def _watch_status(agent: str, region: str, account_id: str, interval: int):
|
|
|
170
184
|
click.clear()
|
|
171
185
|
|
|
172
186
|
# 显示标题
|
|
173
|
-
click.secho(
|
|
187
|
+
click.secho("Agent Status Monitor", fg="blue", bold=True)
|
|
174
188
|
click.echo(f" Agent: {agent}")
|
|
175
189
|
click.echo(f" Region: {region}")
|
|
176
190
|
click.echo(f" 更新时间: {datetime.now().strftime('%H:%M:%S')}")
|
|
@@ -205,7 +219,9 @@ async def _show_agent_status(
|
|
|
205
219
|
# 先按 ID 查询,失败后再按名称查询,避免依赖字符串前缀判断。
|
|
206
220
|
result = await _get_agent_runtime(agent, region, account_id, dry_run, is_name=False)
|
|
207
221
|
if result.get("status") == "Error":
|
|
208
|
-
result_by_name = await _get_agent_runtime(
|
|
222
|
+
result_by_name = await _get_agent_runtime(
|
|
223
|
+
agent, region, account_id, dry_run, is_name=True
|
|
224
|
+
)
|
|
209
225
|
if result_by_name.get("status") != "Error":
|
|
210
226
|
result = result_by_name
|
|
211
227
|
|
|
@@ -219,14 +235,14 @@ async def _show_agent_status(
|
|
|
219
235
|
langfuse_url = result.get("langfuseTraceUrl")
|
|
220
236
|
from dateutil import parser
|
|
221
237
|
|
|
222
|
-
created_at = result.get(
|
|
238
|
+
created_at = result.get("createdAt")
|
|
223
239
|
if created_at:
|
|
224
240
|
dt = parser.parse(created_at)
|
|
225
241
|
created_at = dt.astimezone().isoformat()
|
|
226
242
|
else:
|
|
227
243
|
created_at = "-"
|
|
228
244
|
|
|
229
|
-
updated_at = result.get(
|
|
245
|
+
updated_at = result.get("updatedAt")
|
|
230
246
|
if updated_at:
|
|
231
247
|
dt = parser.parse(updated_at)
|
|
232
248
|
updated_at = dt.astimezone().isoformat()
|
|
@@ -378,8 +394,8 @@ async def _list_all_agents(
|
|
|
378
394
|
rows = []
|
|
379
395
|
items = []
|
|
380
396
|
for r in results:
|
|
381
|
-
agent_id =
|
|
382
|
-
name =
|
|
397
|
+
agent_id = r.get("agentRuntimeId") or "N/A"
|
|
398
|
+
name = r.get("agentRuntimeName") or "N/A"
|
|
383
399
|
status_val = r.get("status", "Unknown")
|
|
384
400
|
ready = int(r.get("readyReplicas", 0) or 0)
|
|
385
401
|
replicas = int(r.get("replicas", 0) or 0)
|
|
@@ -419,8 +435,20 @@ async def _list_all_agents(
|
|
|
419
435
|
columns=(
|
|
420
436
|
{"header": "ID", "key": "id", "style": "#58a6ff", "no_wrap": True, "min_width": 24},
|
|
421
437
|
{"header": "名称", "key": "name", "style": "#c9d1d9", "min_width": 20},
|
|
422
|
-
{
|
|
423
|
-
|
|
438
|
+
{
|
|
439
|
+
"header": "状态",
|
|
440
|
+
"key": "status",
|
|
441
|
+
"no_wrap": True,
|
|
442
|
+
"justify": "center",
|
|
443
|
+
"min_width": 10,
|
|
444
|
+
},
|
|
445
|
+
{
|
|
446
|
+
"header": "副本",
|
|
447
|
+
"key": "replicas_display",
|
|
448
|
+
"no_wrap": True,
|
|
449
|
+
"justify": "center",
|
|
450
|
+
"min_width": 8,
|
|
451
|
+
},
|
|
424
452
|
{"header": "Endpoint", "key": "endpoint", "style": "#8b949e", "overflow": "ellipsis"},
|
|
425
453
|
),
|
|
426
454
|
rows=rows,
|
|
@@ -446,7 +474,9 @@ async def _list_all_agents(
|
|
|
446
474
|
],
|
|
447
475
|
)
|
|
448
476
|
if not is_json_output():
|
|
449
|
-
console.print(
|
|
477
|
+
console.print(
|
|
478
|
+
summary_panel(total=len(results), healthy=running, attention=unhealthy, noun="Agent")
|
|
479
|
+
)
|
|
450
480
|
|
|
451
481
|
|
|
452
482
|
def _get_status_color(status: str) -> str:
|
|
@@ -454,19 +484,24 @@ def _get_status_color(status: str) -> str:
|
|
|
454
484
|
return status_click_color(status)
|
|
455
485
|
|
|
456
486
|
|
|
457
|
-
async def _get_agent_runtime(
|
|
487
|
+
async def _get_agent_runtime(
|
|
488
|
+
agent: str, region: str, account_id: str, dry_run: bool = False, is_name: bool = False
|
|
489
|
+
) -> dict:
|
|
458
490
|
"""获取 Agent 运行时状态
|
|
459
491
|
|
|
460
492
|
调用 AgentEngine Server API
|
|
461
493
|
"""
|
|
462
494
|
from ksadk.api import AgentEngineClient
|
|
495
|
+
|
|
463
496
|
try:
|
|
464
497
|
extra_headers = {}
|
|
465
498
|
# 传递 Account ID
|
|
466
499
|
if account_id:
|
|
467
500
|
extra_headers["X-Ksc-Account-Id"] = account_id
|
|
468
501
|
|
|
469
|
-
async with AgentEngineClient(
|
|
502
|
+
async with AgentEngineClient(
|
|
503
|
+
region=region, dry_run=dry_run, extra_headers=extra_headers
|
|
504
|
+
) as client:
|
|
470
505
|
if is_name:
|
|
471
506
|
response = await client.get_agent(name=agent)
|
|
472
507
|
else:
|
|
@@ -484,10 +519,21 @@ async def _get_agent_runtime(agent: str, region: str, account_id: str, dry_run:
|
|
|
484
519
|
"description": basic.get("description", "") or response.get("description", ""),
|
|
485
520
|
"status": basic.get("status", "") or response.get("status", "Unknown"),
|
|
486
521
|
"phase": basic.get("phase", "") or response.get("phase", ""),
|
|
487
|
-
"replicas":
|
|
488
|
-
|
|
489
|
-
|
|
490
|
-
|
|
522
|
+
"replicas": (
|
|
523
|
+
basic.get("replicas")
|
|
524
|
+
if basic.get("replicas") is not None
|
|
525
|
+
else response.get("replicas", deploy.get("scaling", {}).get("min_replicas", 1))
|
|
526
|
+
),
|
|
527
|
+
"readyReplicas": (
|
|
528
|
+
basic.get("ready_replicas")
|
|
529
|
+
if basic.get("ready_replicas") is not None
|
|
530
|
+
else response.get("ready_replicas", 0)
|
|
531
|
+
),
|
|
532
|
+
"endpoint": quick.get("public_endpoint")
|
|
533
|
+
or quick.get("private_endpoint")
|
|
534
|
+
or response.get("endpoint", ""),
|
|
535
|
+
"langfuseTraceUrl": adv.get("observability_url", "")
|
|
536
|
+
or response.get("langfuse_trace_url", ""),
|
|
491
537
|
"createdAt": basic.get("created_at", "") or response.get("created_at", ""),
|
|
492
538
|
"updatedAt": basic.get("updated_at", "") or response.get("updated_at", ""),
|
|
493
539
|
"message": basic.get("message", "") or response.get("message", ""),
|
|
@@ -517,13 +563,16 @@ async def _list_agent_runtimes(
|
|
|
517
563
|
调用 AgentEngine Server API
|
|
518
564
|
"""
|
|
519
565
|
from ksadk.api import AgentEngineClient
|
|
566
|
+
|
|
520
567
|
try:
|
|
521
568
|
extra_headers = {}
|
|
522
569
|
# 传递 Account ID
|
|
523
570
|
if account_id:
|
|
524
571
|
extra_headers["X-Ksc-Account-Id"] = account_id
|
|
525
572
|
|
|
526
|
-
async with AgentEngineClient(
|
|
573
|
+
async with AgentEngineClient(
|
|
574
|
+
region=region, dry_run=dry_run, extra_headers=extra_headers
|
|
575
|
+
) as client:
|
|
527
576
|
response = await client.list_agents(
|
|
528
577
|
region=region,
|
|
529
578
|
framework=framework,
|
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"):
|