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
|
@@ -0,0 +1,201 @@
|
|
|
1
|
+
"""Runtime-local storage for opaque A2A input-required recovery state."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
import asyncio
|
|
6
|
+
import hashlib
|
|
7
|
+
import json
|
|
8
|
+
import os
|
|
9
|
+
import sqlite3
|
|
10
|
+
from abc import ABC, abstractmethod
|
|
11
|
+
from dataclasses import dataclass
|
|
12
|
+
from pathlib import Path
|
|
13
|
+
from typing import Literal, TypeAlias
|
|
14
|
+
|
|
15
|
+
from ksadk.runtime.adapter import ResumePayload, ResumeTarget, RunHandle
|
|
16
|
+
|
|
17
|
+
A2AResumePayloadKind: TypeAlias = Literal[
|
|
18
|
+
"tool_result",
|
|
19
|
+
"approval_decision",
|
|
20
|
+
"hitl_answer",
|
|
21
|
+
"free_text",
|
|
22
|
+
]
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
@dataclass(frozen=True)
|
|
26
|
+
class A2AResumeState:
|
|
27
|
+
"""Private Runtime state needed to resume one protocol Task."""
|
|
28
|
+
|
|
29
|
+
handle: RunHandle
|
|
30
|
+
target: ResumeTarget
|
|
31
|
+
payload_kind: A2AResumePayloadKind
|
|
32
|
+
call_id: str | None = None
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
class A2AResumeStateStore(ABC):
|
|
36
|
+
"""Persists recovery state outside public A2A Task metadata."""
|
|
37
|
+
|
|
38
|
+
@abstractmethod
|
|
39
|
+
async def initialize(self) -> None:
|
|
40
|
+
raise NotImplementedError
|
|
41
|
+
|
|
42
|
+
@abstractmethod
|
|
43
|
+
async def put(self, key: str, state: A2AResumeState) -> None:
|
|
44
|
+
raise NotImplementedError
|
|
45
|
+
|
|
46
|
+
@abstractmethod
|
|
47
|
+
async def get(self, key: str) -> A2AResumeState | None:
|
|
48
|
+
raise NotImplementedError
|
|
49
|
+
|
|
50
|
+
@abstractmethod
|
|
51
|
+
async def delete(self, key: str) -> None:
|
|
52
|
+
raise NotImplementedError
|
|
53
|
+
|
|
54
|
+
|
|
55
|
+
class InMemoryA2AResumeStateStore(A2AResumeStateStore):
|
|
56
|
+
"""Local-development store; it intentionally does not survive a restart."""
|
|
57
|
+
|
|
58
|
+
def __init__(self) -> None:
|
|
59
|
+
self._states: dict[str, A2AResumeState] = {}
|
|
60
|
+
|
|
61
|
+
async def initialize(self) -> None:
|
|
62
|
+
return None
|
|
63
|
+
|
|
64
|
+
async def put(self, key: str, state: A2AResumeState) -> None:
|
|
65
|
+
self._states[key] = state
|
|
66
|
+
|
|
67
|
+
async def get(self, key: str) -> A2AResumeState | None:
|
|
68
|
+
return self._states.get(key)
|
|
69
|
+
|
|
70
|
+
async def delete(self, key: str) -> None:
|
|
71
|
+
self._states.pop(key, None)
|
|
72
|
+
|
|
73
|
+
|
|
74
|
+
class SQLiteA2AResumeStateStore(A2AResumeStateStore):
|
|
75
|
+
"""Crash-safe Runtime-local store for single-replica/persistent-volume deployments."""
|
|
76
|
+
|
|
77
|
+
def __init__(self, path: str | os.PathLike[str]) -> None:
|
|
78
|
+
self._path = Path(path)
|
|
79
|
+
self._initialized = False
|
|
80
|
+
self._init_lock = asyncio.Lock()
|
|
81
|
+
|
|
82
|
+
@property
|
|
83
|
+
def path(self) -> Path:
|
|
84
|
+
return self._path
|
|
85
|
+
|
|
86
|
+
async def initialize(self) -> None:
|
|
87
|
+
if self._initialized:
|
|
88
|
+
return
|
|
89
|
+
async with self._init_lock:
|
|
90
|
+
if self._initialized:
|
|
91
|
+
return
|
|
92
|
+
await asyncio.to_thread(self._initialize_sync)
|
|
93
|
+
self._initialized = True
|
|
94
|
+
|
|
95
|
+
async def put(self, key: str, state: A2AResumeState) -> None:
|
|
96
|
+
await self.initialize()
|
|
97
|
+
payload = json.dumps(
|
|
98
|
+
{
|
|
99
|
+
"handle": state.handle.model_dump(mode="json"),
|
|
100
|
+
"target": state.target.model_dump(mode="json"),
|
|
101
|
+
"payload_kind": state.payload_kind,
|
|
102
|
+
"call_id": state.call_id,
|
|
103
|
+
},
|
|
104
|
+
separators=(",", ":"),
|
|
105
|
+
sort_keys=True,
|
|
106
|
+
)
|
|
107
|
+
await asyncio.to_thread(self._put_sync, key, payload)
|
|
108
|
+
|
|
109
|
+
async def get(self, key: str) -> A2AResumeState | None:
|
|
110
|
+
await self.initialize()
|
|
111
|
+
payload = await asyncio.to_thread(self._get_sync, key)
|
|
112
|
+
if payload is None:
|
|
113
|
+
return None
|
|
114
|
+
try:
|
|
115
|
+
raw = json.loads(payload)
|
|
116
|
+
return A2AResumeState(
|
|
117
|
+
handle=RunHandle.model_validate(raw["handle"]),
|
|
118
|
+
target=ResumeTarget.model_validate(raw["target"]),
|
|
119
|
+
payload_kind=ResumePayload.model_validate(
|
|
120
|
+
{"kind": raw["payload_kind"]}
|
|
121
|
+
).kind,
|
|
122
|
+
call_id=str(raw["call_id"]) if raw.get("call_id") is not None else None,
|
|
123
|
+
)
|
|
124
|
+
except (KeyError, TypeError, ValueError, json.JSONDecodeError) as exc:
|
|
125
|
+
raise RuntimeError("A2A resume state is invalid") from exc
|
|
126
|
+
|
|
127
|
+
async def delete(self, key: str) -> None:
|
|
128
|
+
await self.initialize()
|
|
129
|
+
await asyncio.to_thread(self._delete_sync, key)
|
|
130
|
+
|
|
131
|
+
def _initialize_sync(self) -> None:
|
|
132
|
+
self._path.parent.mkdir(parents=True, exist_ok=True)
|
|
133
|
+
connection = sqlite3.connect(self._path, timeout=5)
|
|
134
|
+
try:
|
|
135
|
+
connection.execute("PRAGMA journal_mode=WAL")
|
|
136
|
+
connection.execute("PRAGMA synchronous=FULL")
|
|
137
|
+
connection.execute(
|
|
138
|
+
"""
|
|
139
|
+
CREATE TABLE IF NOT EXISTS ksadk_a2a_resume_states (
|
|
140
|
+
resume_key_sha256 TEXT PRIMARY KEY,
|
|
141
|
+
state_json TEXT NOT NULL,
|
|
142
|
+
updated_at TEXT NOT NULL DEFAULT CURRENT_TIMESTAMP
|
|
143
|
+
)
|
|
144
|
+
"""
|
|
145
|
+
)
|
|
146
|
+
connection.commit()
|
|
147
|
+
finally:
|
|
148
|
+
connection.close()
|
|
149
|
+
os.chmod(self._path, 0o600)
|
|
150
|
+
|
|
151
|
+
@staticmethod
|
|
152
|
+
def _hash(key: str) -> str:
|
|
153
|
+
return hashlib.sha256(key.encode("utf-8")).hexdigest()
|
|
154
|
+
|
|
155
|
+
def _put_sync(self, key: str, payload: str) -> None:
|
|
156
|
+
connection = sqlite3.connect(self._path, timeout=5)
|
|
157
|
+
try:
|
|
158
|
+
connection.execute(
|
|
159
|
+
"""
|
|
160
|
+
INSERT INTO ksadk_a2a_resume_states(resume_key_sha256, state_json)
|
|
161
|
+
VALUES (?, ?)
|
|
162
|
+
ON CONFLICT(resume_key_sha256) DO UPDATE SET
|
|
163
|
+
state_json = excluded.state_json,
|
|
164
|
+
updated_at = CURRENT_TIMESTAMP
|
|
165
|
+
""",
|
|
166
|
+
(self._hash(key), payload),
|
|
167
|
+
)
|
|
168
|
+
connection.commit()
|
|
169
|
+
finally:
|
|
170
|
+
connection.close()
|
|
171
|
+
|
|
172
|
+
def _get_sync(self, key: str) -> str | None:
|
|
173
|
+
connection = sqlite3.connect(self._path, timeout=5)
|
|
174
|
+
try:
|
|
175
|
+
row = connection.execute(
|
|
176
|
+
"SELECT state_json FROM ksadk_a2a_resume_states WHERE resume_key_sha256 = ?",
|
|
177
|
+
(self._hash(key),),
|
|
178
|
+
).fetchone()
|
|
179
|
+
return str(row[0]) if row is not None else None
|
|
180
|
+
finally:
|
|
181
|
+
connection.close()
|
|
182
|
+
|
|
183
|
+
def _delete_sync(self, key: str) -> None:
|
|
184
|
+
connection = sqlite3.connect(self._path, timeout=5)
|
|
185
|
+
try:
|
|
186
|
+
connection.execute(
|
|
187
|
+
"DELETE FROM ksadk_a2a_resume_states WHERE resume_key_sha256 = ?",
|
|
188
|
+
(self._hash(key),),
|
|
189
|
+
)
|
|
190
|
+
connection.commit()
|
|
191
|
+
finally:
|
|
192
|
+
connection.close()
|
|
193
|
+
|
|
194
|
+
|
|
195
|
+
__all__ = [
|
|
196
|
+
"A2AResumeState",
|
|
197
|
+
"A2AResumePayloadKind",
|
|
198
|
+
"A2AResumeStateStore",
|
|
199
|
+
"InMemoryA2AResumeStateStore",
|
|
200
|
+
"SQLiteA2AResumeStateStore",
|
|
201
|
+
]
|
ksadk/a2a/routes.py
ADDED
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
"""A2A 协议路由装配 — create_runtime_app 的 A2A seam (goal-05 §8)。
|
|
2
|
+
|
|
3
|
+
契约 §8:
|
|
4
|
+
|
|
5
|
+
```python
|
|
6
|
+
def create_runtime_app(config):
|
|
7
|
+
app = create_base_data_plane_app(config)
|
|
8
|
+
if config.a2a.enabled:
|
|
9
|
+
add_a2a_protocol_routes(app, config.a2a)
|
|
10
|
+
return app
|
|
11
|
+
```
|
|
12
|
+
|
|
13
|
+
A2A route、TaskStore、task adapter 和 card 构造**只有一份实现**,普通 runtime app
|
|
14
|
+
与 HarnessApp 共用;A2A 是数据面 route group,不承载注册副作用。``A2AConfig``
|
|
15
|
+
保留给本地开发和协议一致性测试;AgentEngine 产品 Runtime 必须通过
|
|
16
|
+
``AgentEngineA2ABootstrap`` 装配 durable storage、trusted ingress 和 egress guard。
|
|
17
|
+
"""
|
|
18
|
+
|
|
19
|
+
from __future__ import annotations
|
|
20
|
+
|
|
21
|
+
from dataclasses import dataclass, field
|
|
22
|
+
from typing import Any, Optional, Sequence
|
|
23
|
+
|
|
24
|
+
from a2a.server.routes import add_a2a_routes_to_fastapi
|
|
25
|
+
from a2a.server.tasks import TaskStore
|
|
26
|
+
from a2a.types import AgentSkill
|
|
27
|
+
from fastapi import FastAPI
|
|
28
|
+
from sqlalchemy.ext.asyncio import AsyncEngine
|
|
29
|
+
|
|
30
|
+
from ksadk.a2a.card import build_agent_card
|
|
31
|
+
from ksadk.a2a.server import A2AProtocolServer
|
|
32
|
+
from ksadk.a2a.task_adapter import A2ARuntimeTaskAdapter
|
|
33
|
+
from ksadk.a2a.task_store import A2A_TASK_TABLE, A2AOwnerContextBuilder, build_a2a_task_store
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
@dataclass
|
|
37
|
+
class A2AConfig:
|
|
38
|
+
"""本地/一致性测试使用的 A2A 协议装配配置(数据面 route group)。"""
|
|
39
|
+
|
|
40
|
+
enabled: bool = False
|
|
41
|
+
base_url: str = "http://127.0.0.1:8000"
|
|
42
|
+
agent_name: str = "agent"
|
|
43
|
+
description: str = ""
|
|
44
|
+
version: str = "1.0.0"
|
|
45
|
+
skills: Sequence[str | AgentSkill] = field(default_factory=tuple)
|
|
46
|
+
streaming: bool = True
|
|
47
|
+
prefer_stream: bool = True
|
|
48
|
+
# 本地调试可显式开放 reasoning artifact;托管 Runtime 默认关闭,避免把
|
|
49
|
+
# 模型内部推理写入公开 A2A Task。
|
|
50
|
+
include_reasoning: bool = False
|
|
51
|
+
# durable task store:dsn(如 sqlite+aiosqlite:///.agentengine/a2a_tasks.db 或
|
|
52
|
+
# postgresql+asyncpg://...)或外部传入 engine/task_store。
|
|
53
|
+
task_store_dsn: Optional[str] = None
|
|
54
|
+
task_table: str = A2A_TASK_TABLE
|
|
55
|
+
create_table: bool = True
|
|
56
|
+
|
|
57
|
+
|
|
58
|
+
def add_a2a_protocol_routes(
|
|
59
|
+
app: FastAPI,
|
|
60
|
+
runner: Any,
|
|
61
|
+
config: A2AConfig,
|
|
62
|
+
*,
|
|
63
|
+
task_adapter: A2ARuntimeTaskAdapter,
|
|
64
|
+
task_store: Optional[TaskStore] = None,
|
|
65
|
+
engine: Optional[AsyncEngine] = None,
|
|
66
|
+
context_builder: A2AOwnerContextBuilder | None = None,
|
|
67
|
+
) -> A2AProtocolServer:
|
|
68
|
+
"""把 A2A 协议路由(JSONRPC + HTTP+JSON + AgentCard)装配到 app。
|
|
69
|
+
|
|
70
|
+
返回构建好的 :class:`A2AProtocolServer`(便于调用方取 request_handler /
|
|
71
|
+
task_store 做后续 subscribe/cancel 或测试)。
|
|
72
|
+
"""
|
|
73
|
+
card = build_agent_card(
|
|
74
|
+
name=config.agent_name,
|
|
75
|
+
base_url=config.base_url,
|
|
76
|
+
description=config.description,
|
|
77
|
+
version=config.version,
|
|
78
|
+
skills=config.skills,
|
|
79
|
+
streaming=config.streaming,
|
|
80
|
+
)
|
|
81
|
+
store = task_store or build_a2a_task_store(
|
|
82
|
+
dsn=config.task_store_dsn,
|
|
83
|
+
engine=engine,
|
|
84
|
+
table_name=config.task_table,
|
|
85
|
+
create_table=config.create_table,
|
|
86
|
+
)
|
|
87
|
+
server = A2AProtocolServer(
|
|
88
|
+
runner,
|
|
89
|
+
agent_card=card,
|
|
90
|
+
task_store=store,
|
|
91
|
+
task_adapter=task_adapter,
|
|
92
|
+
context_builder=context_builder,
|
|
93
|
+
prefer_stream=config.prefer_stream,
|
|
94
|
+
include_reasoning=config.include_reasoning,
|
|
95
|
+
)
|
|
96
|
+
add_a2a_routes_to_fastapi(
|
|
97
|
+
app,
|
|
98
|
+
agent_card_routes=server.agent_card_routes(),
|
|
99
|
+
jsonrpc_routes=server.jsonrpc_routes(),
|
|
100
|
+
rest_routes=server.rest_routes(),
|
|
101
|
+
)
|
|
102
|
+
return server
|
|
103
|
+
|
|
104
|
+
|
|
105
|
+
__all__ = ["A2AConfig", "add_a2a_protocol_routes"]
|
ksadk/a2a/server.py
CHANGED
|
@@ -1,79 +1,126 @@
|
|
|
1
|
-
"""
|
|
1
|
+
"""A2AProtocolServer — 托管 Agent 的 A2A 协议数据面 (goal-05)。
|
|
2
|
+
|
|
3
|
+
契约 §3.2:``A2AProtocolServer`` = latest SDK route factories + AgentCard +
|
|
4
|
+
request handler + durable task store。装配进 create_runtime_app(§8),
|
|
5
|
+
**不再是独立 Starlette app**(旧 demo 的 ``A2AStarletteApplication`` 已废弃)。
|
|
6
|
+
|
|
7
|
+
路由由 ``ksadk.a2a.routes.add_a2a_protocol_routes`` 统一装配,一份实现,
|
|
8
|
+
普通 runtime app 与 HarnessApp 共用。
|
|
9
|
+
"""
|
|
2
10
|
|
|
3
11
|
from __future__ import annotations
|
|
4
12
|
|
|
5
|
-
from
|
|
6
|
-
from typing import Any
|
|
13
|
+
from typing import Any, cast
|
|
7
14
|
|
|
8
|
-
from a2a.server.
|
|
15
|
+
from a2a.server.agent_execution import RequestContext, SimpleRequestContextBuilder
|
|
16
|
+
from a2a.server.context import ServerCallContext
|
|
9
17
|
from a2a.server.request_handlers import DefaultRequestHandler
|
|
10
|
-
from a2a.server.
|
|
11
|
-
|
|
18
|
+
from a2a.server.routes import (
|
|
19
|
+
create_agent_card_routes,
|
|
20
|
+
create_jsonrpc_routes,
|
|
21
|
+
create_rest_routes,
|
|
22
|
+
)
|
|
23
|
+
from a2a.server.tasks import TaskStore
|
|
24
|
+
from a2a.types import AgentCard, SendMessageRequest, Task
|
|
25
|
+
|
|
26
|
+
from ksadk.a2a.card import JSONRPC_PATH, REST_PATH_PREFIX
|
|
27
|
+
from ksadk.a2a.executor import A2ARuntimeExecutor
|
|
28
|
+
from ksadk.a2a.task_adapter import A2ARuntimeTaskAdapter
|
|
29
|
+
from ksadk.a2a.task_store import A2AOwnerContextBuilder
|
|
30
|
+
|
|
12
31
|
|
|
13
|
-
|
|
14
|
-
|
|
32
|
+
class _DurableRequestContextBuilder(SimpleRequestContextBuilder):
|
|
33
|
+
"""Recover the persisted context when a follow-up only carries task_id."""
|
|
34
|
+
|
|
35
|
+
def __init__(self, task_store: TaskStore) -> None:
|
|
36
|
+
super().__init__(should_populate_referred_tasks=False, task_store=task_store)
|
|
37
|
+
self._durable_task_store = task_store
|
|
38
|
+
|
|
39
|
+
async def build(
|
|
40
|
+
self,
|
|
41
|
+
context: ServerCallContext,
|
|
42
|
+
params: SendMessageRequest | None = None,
|
|
43
|
+
task_id: str | None = None,
|
|
44
|
+
context_id: str | None = None,
|
|
45
|
+
task: Task | None = None,
|
|
46
|
+
) -> RequestContext:
|
|
47
|
+
if task_id and (task is None or not context_id):
|
|
48
|
+
persisted = await self._durable_task_store.get(task_id, context)
|
|
49
|
+
if persisted is not None:
|
|
50
|
+
task = persisted
|
|
51
|
+
context_id = context_id or persisted.context_id
|
|
52
|
+
return await super().build(
|
|
53
|
+
context=context,
|
|
54
|
+
params=params,
|
|
55
|
+
task_id=task_id,
|
|
56
|
+
context_id=context_id,
|
|
57
|
+
task=task,
|
|
58
|
+
)
|
|
15
59
|
|
|
16
60
|
|
|
17
|
-
class
|
|
18
|
-
"""
|
|
61
|
+
class A2AProtocolServer:
|
|
62
|
+
"""把一个 ksadk runner 暴露为 A2A 协议数据面。
|
|
63
|
+
|
|
64
|
+
参数:
|
|
65
|
+
runner: 当前 runtime 的 runner。
|
|
66
|
+
agent_card: 符合 wire 1.0 的 AgentCard(``ksadk.a2a.card.build_agent_card``)。
|
|
67
|
+
task_store: durable ``DatabaseTaskStore``(``ksadk.a2a.task_store``)。
|
|
68
|
+
task_adapter: 可选 ``A2ARuntimeTaskAdapter``(提供则 cancel 走 RuntimeAdapter.cancel)。
|
|
69
|
+
prefer_stream: 是否优先用 runner.stream(默认 True)。
|
|
70
|
+
include_reasoning: 是否把 reasoning 输出为 ``adk_thought`` artifact。
|
|
71
|
+
"""
|
|
19
72
|
|
|
20
73
|
def __init__(
|
|
21
74
|
self,
|
|
22
75
|
runner: Any,
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
76
|
+
*,
|
|
77
|
+
agent_card: AgentCard,
|
|
78
|
+
task_store: TaskStore,
|
|
79
|
+
task_adapter: A2ARuntimeTaskAdapter,
|
|
80
|
+
context_builder: A2AOwnerContextBuilder | None = None,
|
|
81
|
+
prefer_stream: bool = True,
|
|
82
|
+
include_reasoning: bool = False,
|
|
28
83
|
) -> None:
|
|
29
84
|
self.runner = runner
|
|
30
|
-
self.
|
|
31
|
-
self.
|
|
32
|
-
self.
|
|
33
|
-
self.
|
|
34
|
-
self.
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
skills=self.skills,
|
|
41
|
-
version=version,
|
|
42
|
-
).build()
|
|
43
|
-
self.executor = KsAgentExecutor(runner=runner)
|
|
44
|
-
self.task_store = InMemoryTaskStore()
|
|
85
|
+
self.agent_card = agent_card
|
|
86
|
+
self.task_store = task_store
|
|
87
|
+
self.task_adapter = task_adapter
|
|
88
|
+
self.context_builder = context_builder or A2AOwnerContextBuilder()
|
|
89
|
+
self.executor = A2ARuntimeExecutor(
|
|
90
|
+
runner,
|
|
91
|
+
task_adapter=task_adapter,
|
|
92
|
+
prefer_stream=prefer_stream,
|
|
93
|
+
include_reasoning=include_reasoning,
|
|
94
|
+
)
|
|
45
95
|
self.request_handler = DefaultRequestHandler(
|
|
46
96
|
agent_executor=self.executor,
|
|
47
|
-
task_store=
|
|
97
|
+
task_store=task_store,
|
|
98
|
+
agent_card=agent_card,
|
|
99
|
+
request_context_builder=_DurableRequestContextBuilder(task_store),
|
|
48
100
|
)
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
101
|
+
|
|
102
|
+
def agent_card_routes(self) -> list[Any]:
|
|
103
|
+
return cast(list[Any], create_agent_card_routes(self.agent_card))
|
|
104
|
+
|
|
105
|
+
def jsonrpc_routes(self) -> list[Any]:
|
|
106
|
+
return cast(
|
|
107
|
+
list[Any],
|
|
108
|
+
create_jsonrpc_routes(
|
|
109
|
+
self.request_handler,
|
|
110
|
+
rpc_url=JSONRPC_PATH,
|
|
111
|
+
context_builder=self.context_builder,
|
|
112
|
+
),
|
|
52
113
|
)
|
|
53
114
|
|
|
54
|
-
def
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
url: str,
|
|
67
|
-
description: str = "",
|
|
68
|
-
skills: Sequence[str] | None = None,
|
|
69
|
-
version: str = "1.0.0",
|
|
70
|
-
) -> KsA2AServer:
|
|
71
|
-
"""Convenience helper for building a KsA2AServer."""
|
|
72
|
-
return KsA2AServer(
|
|
73
|
-
runner=runner,
|
|
74
|
-
app_name=app_name,
|
|
75
|
-
url=url,
|
|
76
|
-
description=description,
|
|
77
|
-
skills=skills,
|
|
78
|
-
version=version,
|
|
79
|
-
)
|
|
115
|
+
def rest_routes(self) -> list[Any]:
|
|
116
|
+
return cast(
|
|
117
|
+
list[Any],
|
|
118
|
+
create_rest_routes(
|
|
119
|
+
self.request_handler,
|
|
120
|
+
path_prefix=REST_PATH_PREFIX,
|
|
121
|
+
context_builder=self.context_builder,
|
|
122
|
+
),
|
|
123
|
+
)
|
|
124
|
+
|
|
125
|
+
|
|
126
|
+
__all__ = ["A2AProtocolServer"]
|