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_a2a.py
CHANGED
|
@@ -1,59 +1,110 @@
|
|
|
1
|
+
# -*- coding: utf-8 -*-
|
|
2
|
+
"""ksadk a2a 子命令 — A2A 协议服务与本地试调 (goal-16,a2a-center-productization-2026-07 清洁重做)。
|
|
3
|
+
|
|
4
|
+
基于 goal-05 清洁重写的 A2A API(``A2AProtocolServer`` / ``build_agent_card`` /
|
|
5
|
+
``add_a2a_protocol_routes`` / ``A2ASpaceClient``),不使用旧 0.3.x demo API
|
|
6
|
+
(``AgentCardBuilder`` / ``KsA2AServer``,已删)——那是 Windows ``No such command 'a2a'``
|
|
7
|
+
的根因(import 失败被 ``except ImportError: pass`` 静默吞)。
|
|
8
|
+
|
|
9
|
+
子命令:serve / card / register / discover / call / status / cancel。
|
|
10
|
+
"""
|
|
11
|
+
|
|
1
12
|
from __future__ import annotations
|
|
2
13
|
|
|
14
|
+
import asyncio
|
|
3
15
|
import json
|
|
4
16
|
from pathlib import Path
|
|
5
17
|
from typing import Sequence
|
|
6
18
|
|
|
7
19
|
import click
|
|
8
20
|
import uvicorn
|
|
21
|
+
from a2a.types import TaskState
|
|
22
|
+
from google.protobuf.json_format import MessageToJson
|
|
9
23
|
|
|
10
24
|
import ksadk.configs as configs
|
|
11
|
-
from ksadk.a2a import
|
|
25
|
+
from ksadk.a2a import (
|
|
26
|
+
A2AConfig,
|
|
27
|
+
A2APlatformTask,
|
|
28
|
+
A2ASpaceClient,
|
|
29
|
+
add_a2a_protocol_routes,
|
|
30
|
+
build_agent_card,
|
|
31
|
+
)
|
|
12
32
|
from ksadk.cli.local_runtime import reexec_with_project_venv_if_needed
|
|
13
33
|
from ksadk.cli.resource_common import CONTEXT_SETTINGS
|
|
14
34
|
from ksadk.detection import FrameworkDetector
|
|
15
35
|
from ksadk.runners.factory import create_runner
|
|
36
|
+
from ksadk.runtime.adapter import RuntimeAdapter
|
|
37
|
+
from ksadk.runtime.framework_adapters import ADKRuntimeAdapter, LangGraphRuntimeAdapter
|
|
38
|
+
from ksadk.runtime.runner_adapter import RunnerRuntimeAdapter
|
|
39
|
+
|
|
40
|
+
_HELP = dict(help_option_names=["-h", "--help"])
|
|
41
|
+
_DEFAULT_TASK_STORE_DSN = "sqlite+aiosqlite:///.agentengine/a2a_tasks.db"
|
|
16
42
|
|
|
17
43
|
|
|
18
|
-
|
|
44
|
+
def _resolve_task_store_dsn(task_store_dsn: str, agent_path: Path) -> str:
|
|
45
|
+
"""相对路径的 sqlite DSN 锚定到 agent_path(而非 cwd),并确保父目录存在。
|
|
46
|
+
|
|
47
|
+
绝对 DSN(postgresql:// 等)原样返回。
|
|
48
|
+
"""
|
|
49
|
+
prefix = "sqlite+aiosqlite:///"
|
|
50
|
+
if not task_store_dsn.startswith(prefix):
|
|
51
|
+
return task_store_dsn
|
|
52
|
+
raw_path = task_store_dsn[len(prefix) :]
|
|
53
|
+
if raw_path.startswith("/") or not raw_path:
|
|
54
|
+
return task_store_dsn
|
|
55
|
+
resolved = (agent_path / raw_path).resolve()
|
|
56
|
+
resolved.parent.mkdir(parents=True, exist_ok=True)
|
|
57
|
+
return f"{prefix}{resolved}"
|
|
58
|
+
|
|
59
|
+
|
|
60
|
+
@click.group("a2a", context_settings=CONTEXT_SETTINGS, help="A2A 协议服务与本地试调")
|
|
19
61
|
def a2a():
|
|
20
|
-
"""A2A
|
|
62
|
+
"""A2A 协议命令组(serve / card / register / discover / call / status / cancel)。"""
|
|
63
|
+
|
|
21
64
|
|
|
65
|
+
# ---------------------------------------------------------------------------
|
|
66
|
+
# serve / card(本地 A2A server 与 AgentCard)
|
|
67
|
+
# ---------------------------------------------------------------------------
|
|
22
68
|
|
|
23
|
-
|
|
69
|
+
|
|
70
|
+
@a2a.command("serve", context_settings=_HELP)
|
|
24
71
|
@click.argument(
|
|
25
|
-
"
|
|
26
|
-
default=".",
|
|
27
|
-
type=click.Path(exists=True, file_okay=False, path_type=Path),
|
|
72
|
+
"agent_path", type=click.Path(exists=True, file_okay=False, path_type=Path), default="."
|
|
28
73
|
)
|
|
29
|
-
@click.option("--host", default="
|
|
74
|
+
@click.option("--host", default="127.0.0.1", show_default=True, help="服务监听地址")
|
|
30
75
|
@click.option("--port", default=8081, show_default=True, type=int, help="服务端口")
|
|
31
|
-
@click.option("--url", default=None, help="Agent Card 对外宣告地址")
|
|
76
|
+
@click.option("--url", default=None, help="Agent Card 对外宣告地址(默认 http://host:port)")
|
|
32
77
|
@click.option("--name", default=None, help="覆盖 Agent 名称")
|
|
33
78
|
@click.option("--description", default="", help="覆盖 Agent 描述")
|
|
34
|
-
@click.option("--skill", "skills", multiple=True, help="
|
|
79
|
+
@click.option("--skill", "skills", multiple=True, help="可重复传入,追加 Agent Card 技能")
|
|
80
|
+
@click.option(
|
|
81
|
+
"--task-store-dsn",
|
|
82
|
+
default=_DEFAULT_TASK_STORE_DSN,
|
|
83
|
+
show_default=True,
|
|
84
|
+
help="durable task store DSN(生产用 postgresql+asyncpg://)",
|
|
85
|
+
)
|
|
86
|
+
@click.option(
|
|
87
|
+
"--include-reasoning/--no-include-reasoning",
|
|
88
|
+
default=True,
|
|
89
|
+
show_default=True,
|
|
90
|
+
help="将可展示的 reasoning 作为 adk_thought artifact 流式输出",
|
|
91
|
+
)
|
|
35
92
|
@click.option("--no-trace", is_flag=True, help="禁用 Tracing")
|
|
36
93
|
def serve(
|
|
37
|
-
|
|
94
|
+
agent_path: Path,
|
|
38
95
|
host: str,
|
|
39
96
|
port: int,
|
|
40
97
|
url: str | None,
|
|
41
98
|
name: str | None,
|
|
42
99
|
description: str,
|
|
43
100
|
skills: Sequence[str],
|
|
101
|
+
task_store_dsn: str,
|
|
102
|
+
include_reasoning: bool,
|
|
44
103
|
no_trace: bool,
|
|
45
104
|
):
|
|
46
|
-
"""
|
|
47
|
-
agent_path =
|
|
48
|
-
command_args = [
|
|
49
|
-
"a2a",
|
|
50
|
-
"serve",
|
|
51
|
-
str(agent_path),
|
|
52
|
-
"--host",
|
|
53
|
-
host,
|
|
54
|
-
"--port",
|
|
55
|
-
str(port),
|
|
56
|
-
]
|
|
105
|
+
"""把本地 agent 暴露为 A2A 协议服务(JSONRPC + REST + AgentCard)。"""
|
|
106
|
+
agent_path = agent_path.resolve()
|
|
107
|
+
command_args = ["a2a", "serve", str(agent_path), "--host", host, "--port", str(port)]
|
|
57
108
|
if url:
|
|
58
109
|
command_args.extend(["--url", url])
|
|
59
110
|
if name:
|
|
@@ -62,28 +113,44 @@ def serve(
|
|
|
62
113
|
command_args.extend(["--description", description])
|
|
63
114
|
for skill in skills:
|
|
64
115
|
command_args.extend(["--skill", skill])
|
|
116
|
+
if task_store_dsn != _DEFAULT_TASK_STORE_DSN:
|
|
117
|
+
command_args.extend(["--task-store-dsn", task_store_dsn])
|
|
118
|
+
if not include_reasoning:
|
|
119
|
+
command_args.append("--no-include-reasoning")
|
|
65
120
|
if no_trace:
|
|
66
121
|
command_args.append("--no-trace")
|
|
67
122
|
reexec_with_project_venv_if_needed(agent_path, command_args)
|
|
68
|
-
|
|
123
|
+
task_store_dsn = _resolve_task_store_dsn(task_store_dsn, agent_path)
|
|
69
124
|
detection_result, runner = _load_runner(agent_path, no_trace=no_trace)
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
url
|
|
125
|
+
from fastapi import FastAPI
|
|
126
|
+
|
|
127
|
+
app = FastAPI(title=f"ksadk A2A: {detection_result.name}")
|
|
128
|
+
config = A2AConfig(
|
|
129
|
+
enabled=True,
|
|
130
|
+
base_url=url or f"http://{host}:{port}",
|
|
131
|
+
agent_name=name or detection_result.name,
|
|
76
132
|
description=description,
|
|
77
|
-
skills=skills,
|
|
133
|
+
skills=list(skills),
|
|
134
|
+
task_store_dsn=task_store_dsn,
|
|
135
|
+
include_reasoning=include_reasoning,
|
|
136
|
+
)
|
|
137
|
+
runtime_type = detection_result.type.value
|
|
138
|
+
runtime_adapter = _select_runtime_adapter(runtime_type, runner)
|
|
139
|
+
from ksadk.a2a.task_adapter import A2ARuntimeTaskAdapter
|
|
140
|
+
|
|
141
|
+
add_a2a_protocol_routes(
|
|
142
|
+
app,
|
|
143
|
+
runner,
|
|
144
|
+
config,
|
|
145
|
+
task_adapter=A2ARuntimeTaskAdapter(runtime_adapter, runtime_type=runtime_type),
|
|
78
146
|
)
|
|
79
|
-
|
|
147
|
+
click.echo(f"A2A agent card: {(url or f'http://{host}:{port}')}/.well-known/agent-card.json")
|
|
148
|
+
uvicorn.run(app, host=host, port=port)
|
|
80
149
|
|
|
81
150
|
|
|
82
|
-
@a2a.command("card", context_settings=
|
|
151
|
+
@a2a.command("card", context_settings=_HELP)
|
|
83
152
|
@click.argument(
|
|
84
|
-
"
|
|
85
|
-
default=".",
|
|
86
|
-
type=click.Path(exists=True, file_okay=False, path_type=Path),
|
|
153
|
+
"agent_path", type=click.Path(exists=True, file_okay=False, path_type=Path), default="."
|
|
87
154
|
)
|
|
88
155
|
@click.option(
|
|
89
156
|
"--url",
|
|
@@ -93,28 +160,152 @@ def serve(
|
|
|
93
160
|
)
|
|
94
161
|
@click.option("--name", default=None, help="覆盖 Agent 名称")
|
|
95
162
|
@click.option("--description", default="", help="覆盖 Agent 描述")
|
|
96
|
-
@click.option("--skill", "skills", multiple=True, help="
|
|
97
|
-
def card(
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
163
|
+
@click.option("--skill", "skills", multiple=True, help="可重复传入,追加 Agent Card 技能")
|
|
164
|
+
def card(agent_path: Path, url: str, name: str | None, description: str, skills: Sequence[str]):
|
|
165
|
+
"""打印该 agent 的 wire 1.0 AgentCard(supportedInterfaces)。"""
|
|
166
|
+
# ``card`` is intentionally machine-readable: users commonly redirect it to
|
|
167
|
+
# ``agent-card.json``. Detection only needs the manifest, so avoid the
|
|
168
|
+
# environment bootstrap here; it may print helpful model-default banners.
|
|
169
|
+
detection_result = _detect_project(agent_path, configure_environment=False)
|
|
170
|
+
card_obj = build_agent_card(
|
|
171
|
+
name=name or detection_result.name,
|
|
172
|
+
base_url=url,
|
|
173
|
+
description=description,
|
|
174
|
+
skills=list(skills),
|
|
175
|
+
)
|
|
176
|
+
click.echo(MessageToJson(card_obj, indent=2))
|
|
177
|
+
|
|
178
|
+
|
|
179
|
+
@a2a.command("register", context_settings=_HELP)
|
|
180
|
+
@click.argument(
|
|
181
|
+
"agent_path", type=click.Path(exists=True, file_okay=False, path_type=Path), default="."
|
|
182
|
+
)
|
|
183
|
+
@click.option("--url", required=True, help="Agent Card 对外宣告地址")
|
|
184
|
+
@click.option("--name", default=None, help="覆盖 Agent 名称")
|
|
185
|
+
@click.option("--description", default="", help="覆盖 Agent 描述")
|
|
186
|
+
@click.option("--skill", "skills", multiple=True, help="可重复传入,追加 Agent Card 技能")
|
|
187
|
+
def register(agent_path: Path, url: str, name: str | None, description: str, skills: Sequence[str]):
|
|
188
|
+
"""构造并打印用于 Space 注册的 AgentCard(本地试调;server 侧 KOP 注册见产品化文档)。"""
|
|
189
|
+
detection_result = _detect_project(agent_path, configure_environment=False)
|
|
190
|
+
card_obj = build_agent_card(
|
|
191
|
+
name=name or detection_result.name,
|
|
192
|
+
base_url=url,
|
|
110
193
|
description=description,
|
|
111
|
-
skills=skills,
|
|
194
|
+
skills=list(skills),
|
|
112
195
|
)
|
|
113
|
-
click.echo(
|
|
196
|
+
click.echo(
|
|
197
|
+
"# 本地 AgentCard 预览;平台注册使用 GetA2AAgentCard + CreateA2AAgent,"
|
|
198
|
+
"hosted 注册不接收用户手写 Card:"
|
|
199
|
+
)
|
|
200
|
+
click.echo(MessageToJson(card_obj, indent=2))
|
|
201
|
+
|
|
202
|
+
|
|
203
|
+
# ---------------------------------------------------------------------------
|
|
204
|
+
# discover / call / status / cancel(Space 内动态发现与调用,经 A2ASpaceClient)
|
|
205
|
+
# ---------------------------------------------------------------------------
|
|
206
|
+
|
|
207
|
+
|
|
208
|
+
def _space_client(space_id: str | None = None) -> A2ASpaceClient:
|
|
209
|
+
"""从环境构造 A2ASpaceClient;Space 未配置时显式报错(不静默)。"""
|
|
210
|
+
try:
|
|
211
|
+
return A2ASpaceClient.from_env(space_id=space_id)
|
|
212
|
+
except ValueError as exc:
|
|
213
|
+
raise click.ClickException(
|
|
214
|
+
f"A2A Space 未配置:{exc}。"
|
|
215
|
+
"请传 --space-id,或由 AgentEngine 部署注入 KSADK_A2A_SPACE_IDS;同时需要"
|
|
216
|
+
"KSADK_A2A_CONTROL_PLANE_URL 和 audience workload token。"
|
|
217
|
+
) from exc
|
|
218
|
+
|
|
219
|
+
|
|
220
|
+
@a2a.command("discover", context_settings=_HELP)
|
|
221
|
+
@click.option("--space-id", default=None, help="本次发现使用的 A2A Space ID")
|
|
222
|
+
@click.option("--prompt", default=None, help="发现关键词(受控匹配)")
|
|
223
|
+
@click.option("--skill", default=None, help="按技能过滤")
|
|
224
|
+
def discover(space_id: str | None, prompt: str | None, skill: str | None):
|
|
225
|
+
"""发现 Space 中 hosted/external Agent 的 latest AgentCard。"""
|
|
226
|
+
|
|
227
|
+
async def _run() -> None:
|
|
228
|
+
client = _space_client(space_id)
|
|
229
|
+
agents = await client.discover(prompt=prompt, skill=skill)
|
|
230
|
+
for agent in agents:
|
|
231
|
+
click.echo(
|
|
232
|
+
json.dumps(
|
|
233
|
+
{
|
|
234
|
+
"agent_id": agent.agent_id,
|
|
235
|
+
"version_id": agent.version_id,
|
|
236
|
+
"source": agent.source,
|
|
237
|
+
"name": getattr(agent.agent_card, "name", ""),
|
|
238
|
+
"route_kind": agent.route_kind,
|
|
239
|
+
"callable": agent.callable,
|
|
240
|
+
"blocked_reason": agent.blocked_reason,
|
|
241
|
+
},
|
|
242
|
+
ensure_ascii=False,
|
|
243
|
+
)
|
|
244
|
+
)
|
|
245
|
+
|
|
246
|
+
asyncio.run(_run())
|
|
247
|
+
|
|
248
|
+
|
|
249
|
+
@a2a.command("call", context_settings=_HELP)
|
|
250
|
+
@click.option("--space-id", default=None, help="本次调用使用的 A2A Space ID")
|
|
251
|
+
@click.argument("agent_id")
|
|
252
|
+
@click.argument("message")
|
|
253
|
+
def call(space_id: str | None, agent_id: str, message: str):
|
|
254
|
+
"""向 Space 中某 Agent 发送消息,返回首个 Task。"""
|
|
255
|
+
|
|
256
|
+
async def _run() -> None:
|
|
257
|
+
client = _space_client(space_id)
|
|
258
|
+
task = await client.send_message(agent_id, message)
|
|
259
|
+
click.echo(json.dumps(_platform_task_summary(task), ensure_ascii=False))
|
|
260
|
+
|
|
261
|
+
asyncio.run(_run())
|
|
262
|
+
|
|
263
|
+
|
|
264
|
+
@a2a.command("status", context_settings=_HELP)
|
|
265
|
+
@click.option("--space-id", default=None, help="Task 创建时使用的 A2A Space ID")
|
|
266
|
+
@click.argument("task_id")
|
|
267
|
+
def status(space_id: str | None, task_id: str):
|
|
268
|
+
"""查询某 A2A Task 的状态。"""
|
|
269
|
+
|
|
270
|
+
async def _run() -> None:
|
|
271
|
+
client = _space_client(space_id)
|
|
272
|
+
task = await client.get_task(task_id)
|
|
273
|
+
click.echo(json.dumps(_platform_task_summary(task), ensure_ascii=False))
|
|
114
274
|
|
|
275
|
+
asyncio.run(_run())
|
|
115
276
|
|
|
116
|
-
|
|
117
|
-
|
|
277
|
+
|
|
278
|
+
@a2a.command("cancel", context_settings=_HELP)
|
|
279
|
+
@click.option("--space-id", default=None, help="Task 创建时使用的 A2A Space ID")
|
|
280
|
+
@click.argument("task_id")
|
|
281
|
+
def cancel(space_id: str | None, task_id: str):
|
|
282
|
+
"""取消某 A2A Task。"""
|
|
283
|
+
|
|
284
|
+
async def _run() -> None:
|
|
285
|
+
client = _space_client(space_id)
|
|
286
|
+
task = await client.cancel(task_id)
|
|
287
|
+
click.echo(json.dumps(_platform_task_summary(task), ensure_ascii=False))
|
|
288
|
+
|
|
289
|
+
asyncio.run(_run())
|
|
290
|
+
|
|
291
|
+
|
|
292
|
+
# ---------------------------------------------------------------------------
|
|
293
|
+
# 辅助(与旧版一致,框架无关)
|
|
294
|
+
# ---------------------------------------------------------------------------
|
|
295
|
+
|
|
296
|
+
|
|
297
|
+
def _platform_task_summary(task: A2APlatformTask) -> dict[str, str | None]:
|
|
298
|
+
remote_task = task.remote_task
|
|
299
|
+
remote_status = getattr(remote_task, "status", None)
|
|
300
|
+
return {
|
|
301
|
+
"task_id": task.id,
|
|
302
|
+
"status": TaskState.Name(remote_status.state) if remote_status is not None else None,
|
|
303
|
+
}
|
|
304
|
+
|
|
305
|
+
|
|
306
|
+
def _detect_project(agent_path: Path, *, configure_environment: bool = True):
|
|
307
|
+
if configure_environment:
|
|
308
|
+
configs.setup_environment(agent_path)
|
|
118
309
|
result = FrameworkDetector(str(agent_path)).detect()
|
|
119
310
|
if result.type.value == "unknown":
|
|
120
311
|
raise click.ClickException("未检测到支持的框架 (LangChain/LangGraph/DeepAgents/ADK)")
|
|
@@ -130,6 +321,16 @@ def _load_runner(agent_path: Path, *, no_trace: bool):
|
|
|
130
321
|
return detection_result, runner
|
|
131
322
|
|
|
132
323
|
|
|
324
|
+
def _select_runtime_adapter(runtime_type: str, runner) -> RuntimeAdapter:
|
|
325
|
+
# langchain create_agent 产物是 LangGraph CompiledStateGraph,
|
|
326
|
+
# 与 langgraph 共用 time-travel resume。
|
|
327
|
+
if runtime_type in ("langgraph", "langchain"):
|
|
328
|
+
return LangGraphRuntimeAdapter(runner)
|
|
329
|
+
if runtime_type == "adk":
|
|
330
|
+
return ADKRuntimeAdapter(runner)
|
|
331
|
+
return RunnerRuntimeAdapter(runner, runtime_type=runtime_type)
|
|
332
|
+
|
|
333
|
+
|
|
133
334
|
def _setup_tracing(framework_type: str) -> None:
|
|
134
335
|
try:
|
|
135
336
|
import os
|
|
@@ -144,24 +345,7 @@ def _setup_tracing(framework_type: str) -> None:
|
|
|
144
345
|
)
|
|
145
346
|
setup_tracing(
|
|
146
347
|
enable_inmemory=True,
|
|
147
|
-
enable_langfuse=None,
|
|
148
348
|
use_callback_only=use_callback_only,
|
|
149
349
|
)
|
|
150
350
|
except Exception:
|
|
151
351
|
return
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
def _build_agent_card_payload(
|
|
155
|
-
*,
|
|
156
|
-
app_name: str,
|
|
157
|
-
url: str,
|
|
158
|
-
description: str,
|
|
159
|
-
skills: Sequence[str],
|
|
160
|
-
) -> dict:
|
|
161
|
-
card = AgentCardBuilder(
|
|
162
|
-
name=app_name,
|
|
163
|
-
url=url,
|
|
164
|
-
description=description,
|
|
165
|
-
skills=skills,
|
|
166
|
-
).build()
|
|
167
|
-
return card.model_dump(mode="json")
|
ksadk/cli/cmd_agent.py
CHANGED
|
@@ -2,9 +2,10 @@
|
|
|
2
2
|
|
|
3
3
|
from __future__ import annotations
|
|
4
4
|
|
|
5
|
-
import click
|
|
6
5
|
from pathlib import Path
|
|
7
6
|
|
|
7
|
+
import click
|
|
8
|
+
|
|
8
9
|
from ksadk.cli.cmd_destroy import run_delete_command
|
|
9
10
|
from ksadk.cli.cmd_invoke import run_invoke_command
|
|
10
11
|
from ksadk.cli.cmd_status import run_status_command
|
|
@@ -22,7 +23,9 @@ def agent():
|
|
|
22
23
|
@agent.command("list", context_settings=CONTEXT_SETTINGS)
|
|
23
24
|
@pagination_options(default_page=1, default_size=20)
|
|
24
25
|
@click.option("--region", "-r", default="cn-beijing-6", envvar="KSYUN_REGION", help="区域")
|
|
25
|
-
@click.option(
|
|
26
|
+
@click.option(
|
|
27
|
+
"--account-id", envvar="KSYUN_ACCOUNT_ID", help="金山云账号 ID(可选;未设置时从 AK/SK 反查)"
|
|
28
|
+
)
|
|
26
29
|
@click.option("--framework", help="按框架过滤,支持逗号分隔多个值,如 langgraph,adk")
|
|
27
30
|
@dry_run_option()
|
|
28
31
|
@cli_output_option()
|
|
@@ -59,7 +62,9 @@ def list_agents(
|
|
|
59
62
|
@click.option("--watch", "-w", is_flag=True, help="Watch 模式,持续刷新")
|
|
60
63
|
@click.option("--interval", "-i", default=2, help="Watch 刷新间隔 (秒)")
|
|
61
64
|
@click.option("--region", "-r", default="cn-beijing-6", envvar="KSYUN_REGION", help="区域")
|
|
62
|
-
@click.option(
|
|
65
|
+
@click.option(
|
|
66
|
+
"--account-id", envvar="KSYUN_ACCOUNT_ID", help="金山云账号 ID(可选;未设置时从 AK/SK 反查)"
|
|
67
|
+
)
|
|
63
68
|
@dry_run_option()
|
|
64
69
|
@cli_output_option()
|
|
65
70
|
def status_agent(
|
|
@@ -172,11 +177,20 @@ def invoke_agent(
|
|
|
172
177
|
|
|
173
178
|
@agent.command("delete", context_settings=CONTEXT_SETTINGS)
|
|
174
179
|
@click.argument("agent_refs", nargs=-1)
|
|
175
|
-
@click.option(
|
|
180
|
+
@click.option(
|
|
181
|
+
"--agent",
|
|
182
|
+
"--agent-id",
|
|
183
|
+
"agent_options",
|
|
184
|
+
"-a",
|
|
185
|
+
multiple=True,
|
|
186
|
+
help="Agent 名称或 ID,可重复传入",
|
|
187
|
+
)
|
|
176
188
|
@click.option("--yes", "-y", "assume_yes", is_flag=True, help="跳过确认")
|
|
177
189
|
@click.option("--force", "-f", "assume_yes", is_flag=True, hidden=True, help="(兼容) 跳过确认")
|
|
178
190
|
@click.option("--region", "-r", default="cn-beijing-6", envvar="KSYUN_REGION", help="区域")
|
|
179
|
-
@click.option(
|
|
191
|
+
@click.option(
|
|
192
|
+
"--account-id", envvar="KSYUN_ACCOUNT_ID", help="金山云账号 ID(可选;未设置时从 AK/SK 反查)"
|
|
193
|
+
)
|
|
180
194
|
@dry_run_option()
|
|
181
195
|
@cli_output_option()
|
|
182
196
|
def delete_agent(
|