agentengine-sdk-python 0.7.0__py3-none-any.whl → 0.8.0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {agentengine_sdk_python-0.7.0.dist-info → agentengine_sdk_python-0.8.0.dist-info}/METADATA +36 -20
- agentengine_sdk_python-0.8.0.dist-info/RECORD +578 -0
- ksadk/a2a/__init__.py +178 -11
- ksadk/a2a/bootstrap.py +334 -0
- ksadk/a2a/card.py +120 -0
- ksadk/a2a/context_store.py +203 -0
- ksadk/a2a/control_plane.py +818 -0
- ksadk/a2a/credential.py +99 -0
- ksadk/a2a/event_adapter.py +149 -0
- ksadk/a2a/executor.py +406 -89
- ksadk/a2a/external_transport.py +516 -0
- ksadk/a2a/identity.py +304 -0
- ksadk/a2a/ids.py +22 -0
- ksadk/a2a/langgraph.py +285 -0
- ksadk/a2a/resume_store.py +201 -0
- ksadk/a2a/routes.py +105 -0
- ksadk/a2a/server.py +107 -60
- ksadk/a2a/space_client.py +1101 -0
- ksadk/a2a/task_adapter.py +423 -0
- ksadk/a2a/task_event_dispatcher.py +167 -0
- ksadk/a2a/task_event_outbox.py +326 -0
- ksadk/a2a/task_store.py +206 -0
- ksadk/a2ui/__init__.py +27 -0
- ksadk/a2ui/core.py +186 -0
- ksadk/a2ui/models.py +166 -0
- ksadk/a2ui/renderer.py +198 -0
- ksadk/agui/__init__.py +9 -0
- ksadk/agui/a2ui_projection.py +92 -0
- ksadk/agui/agent.py +857 -0
- ksadk/agui/config.py +86 -0
- ksadk/agui/routes.py +55 -0
- ksadk/api/client.py +233 -191
- ksadk/builders/__init__.py +2 -0
- ksadk/builders/base.py +16 -14
- ksadk/builders/code_builder.py +318 -236
- ksadk/builders/container_builder.py +187 -167
- ksadk/builders/framework_requirements.py +29 -11
- ksadk/builders/ks3_uploader.py +58 -27
- ksadk/builders/managed_runtime_builder.py +145 -0
- ksadk/builders/mcp_builder.py +91 -92
- ksadk/builders/requirements_utils.py +1 -5
- ksadk/cli/__init__.py +89 -171
- ksadk/cli/cmd_a2a.py +254 -70
- ksadk/cli/cmd_agent.py +19 -5
- ksadk/cli/cmd_build.py +158 -29
- ksadk/cli/cmd_completion.py +47 -35
- ksadk/cli/cmd_config.py +267 -198
- ksadk/cli/cmd_create.py +500 -720
- ksadk/cli/cmd_dashboard.py +120 -45
- ksadk/cli/cmd_deploy.py +117 -58
- ksadk/cli/cmd_destroy.py +44 -14
- ksadk/cli/cmd_files.py +63 -24
- ksadk/cli/cmd_hermes.py +168 -89
- ksadk/cli/cmd_invoke.py +184 -122
- ksadk/cli/cmd_launch.py +64 -28
- ksadk/cli/cmd_mcp.py +98 -64
- ksadk/cli/cmd_model.py +14 -5
- ksadk/cli/cmd_openclaw.py +483 -227
- ksadk/cli/cmd_replay.py +71 -0
- ksadk/cli/cmd_run.py +33 -10
- ksadk/cli/cmd_status.py +80 -31
- ksadk/cli/cmd_version.py +20 -13
- ksadk/cli/cmd_web.py +89 -13
- ksadk/cli/deploy_utils.py +20 -20
- ksadk/cli/dry_run.py +5 -3
- ksadk/cli/error_utils.py +37 -12
- ksadk/cli/global_options.py +1 -2
- ksadk/cli/local_runtime.py +1 -2
- ksadk/cli/model_catalog.py +6 -2
- ksadk/cli/network_options.py +34 -14
- ksadk/cli/resource_common.py +6 -2
- ksadk/cli/storage.py +0 -1
- ksadk/cli/ui.py +5 -3
- ksadk/cli/workflow_common.py +51 -17
- ksadk/codex/__init__.py +12 -0
- ksadk/codex/client.py +408 -0
- ksadk/codex/phase.py +143 -0
- ksadk/codex/runtime.py +449 -0
- ksadk/common/aicp_env.py +0 -1
- ksadk/common/auth.py +2 -2
- ksadk/common/constants.py +1 -3
- ksadk/common/llm_utils.py +17 -13
- ksadk/compat/__init__.py +5 -0
- ksadk/compat/adk_compat.py +200 -0
- ksadk/compat/copilotkit_a2ui.py +330 -0
- ksadk/configs/__init__.py +12 -12
- ksadk/configs/env_registry.py +500 -100
- ksadk/configs/global_config.py +2 -1
- ksadk/configs/settings.py +151 -124
- ksadk/conversations/__init__.py +7 -5
- ksadk/conversations/attachment_storage.py +16 -11
- ksadk/conversations/attachments.py +44 -36
- ksadk/conversations/compaction_pipeline.py +12 -12
- ksadk/conversations/compaction_prompt.py +9 -5
- ksadk/conversations/context.py +221 -6
- ksadk/conversations/message_projection.py +438 -51
- ksadk/conversations/model_context.py +12 -6
- ksadk/conversations/model_options.py +0 -1
- ksadk/conversations/normalize.py +20 -16
- ksadk/conversations/reasoning_markup.py +1 -1
- ksadk/conversations/runtime.py +339 -5255
- ksadk/conversations/runtime_compaction.py +333 -0
- ksadk/conversations/runtime_constants.py +27 -0
- ksadk/conversations/runtime_governance.py +185 -0
- ksadk/conversations/runtime_input.py +652 -0
- ksadk/conversations/runtime_invocation.py +395 -0
- ksadk/conversations/runtime_metadata.py +475 -0
- ksadk/conversations/runtime_observability.py +355 -0
- ksadk/conversations/runtime_payloads.py +272 -0
- ksadk/conversations/runtime_persistence.py +440 -0
- ksadk/conversations/runtime_preparation.py +418 -0
- ksadk/conversations/runtime_resume.py +816 -0
- ksadk/conversations/runtime_stream_events.py +902 -0
- ksadk/conversations/runtime_streaming.py +547 -0
- ksadk/conversations/semantic_summary.py +17 -5
- ksadk/conversations/session_title.py +6 -3
- ksadk/deployment/__init__.py +15 -16
- ksadk/deployment/agent_access.py +12 -23
- ksadk/deployment/base.py +51 -38
- ksadk/deployment/manager.py +63 -65
- ksadk/deployment/providers/serverless.py +309 -202
- ksadk/deployment/registry.py +38 -32
- ksadk/deployment/state.py +11 -11
- ksadk/deployment/ui_config.py +1 -1
- ksadk/detection/__init__.py +1 -1
- ksadk/detection/detector.py +146 -83
- ksadk/detection/mcp_detector.py +9 -6
- ksadk/events/__init__.py +25 -0
- ksadk/events/parser.py +191 -0
- ksadk/events/replay.py +37 -0
- ksadk/events/runtime_event.py +264 -0
- ksadk/events/store.py +317 -0
- ksadk/harness/__init__.py +34 -0
- ksadk/harness/app.py +278 -0
- ksadk/harness/config.py +181 -0
- ksadk/harness/reasoner.py +105 -0
- ksadk/harness/runner.py +211 -0
- ksadk/harness/sandbox.py +141 -0
- ksadk/harness/tools.py +222 -0
- ksadk/hermes_terminal.py +23 -12
- ksadk/identity/resolver.py +15 -9
- ksadk/ids.py +32 -0
- ksadk/knowledge_base/adk_tool.py +1 -1
- ksadk/knowledge_base/client.py +23 -29
- ksadk/managed_runtime.py +188 -0
- ksadk/markdown.py +5 -2
- ksadk/mcp_runtime/__init__.py +9 -6
- ksadk/memory/__init__.py +1 -1
- ksadk/memory/adk/__init__.py +2 -0
- ksadk/memory/adk/backends/base_ltm_backend.py +2 -6
- ksadk/memory/adk/backends/http_ltm_backend.py +13 -21
- ksadk/memory/adk/backends/inmemory_ltm_backend.py +7 -13
- ksadk/memory/adk/backends/sdk_ltm_backend.py +26 -33
- ksadk/memory/adk/long_term_memory.py +31 -35
- ksadk/memory/adk/resilient_session_service.py +4 -5
- ksadk/memory/adk/short_term_memory.py +12 -21
- ksadk/memory/adk_tool.py +3 -2
- ksadk/memory/backends/base.py +19 -19
- ksadk/memory/backends/memory.py +24 -25
- ksadk/memory/backends/redis.py +31 -30
- ksadk/memory/langchain_tool.py +2 -1
- ksadk/memory/manager.py +52 -47
- ksadk/memory/service.py +10 -8
- ksadk/model_policy.py +15 -7
- ksadk/model_proxy/__init__.py +51 -0
- ksadk/model_proxy/bootstrap.py +80 -0
- ksadk/model_proxy/cache.py +165 -0
- ksadk/model_proxy/config.py +45 -0
- ksadk/model_proxy/demo_webui.py +115 -0
- ksadk/model_proxy/detect.py +145 -0
- ksadk/model_proxy/gate.py +68 -0
- ksadk/model_proxy/namespace.py +173 -0
- ksadk/model_proxy/protocol_proxy.py +22 -0
- ksadk/model_proxy/server.py +300 -0
- ksadk/model_proxy/transform.py +691 -0
- ksadk/openclaw_gateway.py +29 -14
- ksadk/runners/adk_runner.py +345 -120
- ksadk/runners/base_runner.py +46 -29
- ksadk/runners/codex_runner.py +132 -0
- ksadk/runners/deepagents_runner.py +0 -1
- ksadk/runners/factory.py +17 -5
- ksadk/runners/langchain_runner.py +29 -742
- ksadk/runners/langgraph_runner.py +352 -90
- ksadk/runners/patch_langchain.py +16 -16
- ksadk/runners/remote_runner.py +134 -33
- ksadk/runners/usage_accumulator.py +1 -0
- ksadk/runners/utils/langfuse.py +3 -3
- ksadk/runners/utils/loader.py +7 -7
- ksadk/runtime/__init__.py +41 -0
- ksadk/runtime/adapter.py +345 -0
- ksadk/runtime/framework_adapters.py +124 -0
- ksadk/runtime/preprocessing.py +118 -0
- ksadk/runtime/runner_adapter.py +873 -0
- ksadk/runtime_context.py +18 -3
- ksadk/runtime_state.py +0 -1
- ksadk/sandbox/__init__.py +4 -1
- ksadk/sandbox/backends/__init__.py +4 -1
- ksadk/sandbox/backends/e2b.py +13 -5
- ksadk/sandbox/backends/local_process.py +11 -3
- ksadk/sandbox/base.py +10 -15
- ksadk/sandbox/factory.py +14 -4
- ksadk/sandbox/registry.py +57 -6
- ksadk/server/api_models.py +15 -5
- ksadk/server/app.py +455 -3885
- ksadk/server/composition.py +21 -0
- ksadk/server/factory.py +624 -0
- ksadk/server/routes/__init__.py +1 -0
- ksadk/server/routes/checkpoint_resolution.py +116 -0
- ksadk/server/routes/common.py +713 -0
- ksadk/server/routes/control.py +327 -0
- ksadk/server/routes/dependencies.py +98 -0
- ksadk/server/routes/misc.py +448 -0
- ksadk/server/routes/models.py +443 -0
- ksadk/server/routes/openai_compat.py +207 -0
- ksadk/server/routes/projection.py +795 -0
- ksadk/server/routes/routers.py +52 -0
- ksadk/server/routes/run.py +726 -0
- ksadk/server/routes/sessions.py +649 -0
- ksadk/server/routes/streaming.py +223 -0
- ksadk/server/routes/workspace.py +381 -0
- ksadk/server/static/assets/{ArtifactsPanel-D-SSn2ee.js → ArtifactsPanel-Cjnqt-8W.js} +1 -1
- ksadk/server/static/assets/CodeBlock-BqyqZfuB.js +9 -0
- ksadk/server/static/assets/MathMessageMarkdown-BpH7jiFM.js +8 -0
- ksadk/server/static/assets/MermaidBlock-DWuxETaJ.js +303 -0
- ksadk/server/static/assets/NativeTerminalPanel-MDTopWMO.js +1 -0
- ksadk/server/static/assets/{arc-BA13sHc9.js → arc-CFKwSk_B.js} +1 -1
- ksadk/server/static/assets/architecture-7EHR7CIX-CynqOWjZ.js +1 -0
- ksadk/server/static/assets/{architectureDiagram-3BPJPVTR-DzJzgVoL.js → architectureDiagram-3BPJPVTR-Dej8jX8c.js} +1 -1
- ksadk/server/static/assets/{blockDiagram-GPEHLZMM-UTdVcZhn.js → blockDiagram-GPEHLZMM-1F64jqvy.js} +1 -1
- ksadk/server/static/assets/{c4Diagram-AAUBKEIU-Dix0GD4m.js → c4Diagram-AAUBKEIU-9q7AUAKb.js} +1 -1
- ksadk/server/static/assets/channel-iUGv2N24.js +1 -0
- ksadk/server/static/assets/{chunk-2J33WTMH-C2JxuZ42.js → chunk-2J33WTMH-6qgwJm7Q.js} +1 -1
- ksadk/server/static/assets/{chunk-4BX2VUAB-Be57QPgD.js → chunk-4BX2VUAB-CsWIQRhc.js} +1 -1
- ksadk/server/static/assets/{chunk-55IACEB6-WjSuy4nv.js → chunk-55IACEB6-BK8paA20.js} +1 -1
- ksadk/server/static/assets/{chunk-727SXJPM-BOovP-b5.js → chunk-727SXJPM-B-JEhy7h.js} +1 -1
- ksadk/server/static/assets/{chunk-AQP2D5EJ-DOmZNmWj.js → chunk-AQP2D5EJ-DYBvMHAa.js} +1 -1
- ksadk/server/static/assets/{chunk-FMBD7UC4-DzwlodkU.js → chunk-FMBD7UC4-BGhvzDYt.js} +1 -1
- ksadk/server/static/assets/{chunk-ND2GUHAM-DMqAikEU.js → chunk-ND2GUHAM-D98vPd-E.js} +1 -1
- ksadk/server/static/assets/chunk-QZHKN3VN-YQIEXeF6.js +1 -0
- ksadk/server/static/assets/classDiagram-4FO5ZUOK-CDAUuoXK.js +1 -0
- ksadk/server/static/assets/classDiagram-v2-Q7XG4LA2-CDAUuoXK.js +1 -0
- ksadk/server/static/assets/{cose-bilkent-S5V4N54A-Zhy2GBnP.js → cose-bilkent-S5V4N54A-CX3yotHq.js} +1 -1
- ksadk/server/static/assets/{dagre-BM42HDAG-CbKrtIUz.js → dagre-BM42HDAG-C7TguAWo.js} +1 -1
- ksadk/server/static/assets/{diagram-2AECGRRQ-BRApgQRK.js → diagram-2AECGRRQ-Dd17_kws.js} +1 -1
- ksadk/server/static/assets/{diagram-5GNKFQAL-D0xbnDiK.js → diagram-5GNKFQAL-DVIClIil.js} +1 -1
- ksadk/server/static/assets/{diagram-KO2AKTUF-CVugVI9L.js → diagram-KO2AKTUF-Df_3gYQa.js} +1 -1
- ksadk/server/static/assets/{diagram-LMA3HP47-DozUGgee.js → diagram-LMA3HP47-BhLk6ZtA.js} +1 -1
- ksadk/server/static/assets/{diagram-OG6HWLK6-ZOYsKlru.js → diagram-OG6HWLK6-D4GNGvuu.js} +1 -1
- ksadk/server/static/assets/{dist-DmFaq_Iy.js → dist-6CVKuTAe.js} +1 -1
- ksadk/server/static/assets/{dist-8EEyGgDx.js → dist-BUHRxvDG.js} +1 -1
- ksadk/server/static/assets/{dist-B0NP_Z0z.js → dist-BZ9n9AjO.js} +1 -1
- ksadk/server/static/assets/{dist-DMezvBGJ.js → dist-BibcG1V9.js} +1 -1
- ksadk/server/static/assets/{dist-C3HIIaN5.js → dist-Bs-jQcRX.js} +1 -1
- ksadk/server/static/assets/{dist-BrCcQ47T.js → dist-C2xjE7cO.js} +1 -1
- ksadk/server/static/assets/{dist-Dp0k7bWI.js → dist-C7-3jInC.js} +1 -1
- ksadk/server/static/assets/{dist-D-xOD048.js → dist-C99THtIA.js} +1 -1
- ksadk/server/static/assets/{dist-CkEKJFtk.js → dist-CGcp2ex8.js} +1 -1
- ksadk/server/static/assets/{dist-DyOkZmze.js → dist-CVQRZjPu.js} +1 -1
- ksadk/server/static/assets/{dist-BssVmjIo.js → dist-Cf23NY4L.js} +1 -1
- ksadk/server/static/assets/{dist-BIJVDMuB.js → dist-CgF3fj15.js} +1 -1
- ksadk/server/static/assets/{dist-2hInLS_J.js → dist-Cwt7koer.js} +1 -1
- ksadk/server/static/assets/{dist-DyWsb78Q.js → dist-D82mtD2s.js} +1 -1
- ksadk/server/static/assets/{dist-D-JMdWPQ.js → dist-DF06ORQo.js} +1 -1
- ksadk/server/static/assets/{dist-BmlMPsCc.js → dist-DHn6nBzr.js} +1 -1
- ksadk/server/static/assets/{dist-gX6GOLKq.js → dist-Djgl2wVZ.js} +1 -1
- ksadk/server/static/assets/{dist-DpKtt4Bo.js → dist-DlzCRy0S.js} +1 -1
- ksadk/server/static/assets/{dist-8_SfK1IP.js → dist-DqNnNFrw.js} +1 -1
- ksadk/server/static/assets/{dist-D57wnGWd.js → dist-DyvYLMW9.js} +1 -1
- ksadk/server/static/assets/{dist-CPBtqRTW.js → dist-eoW6tZXA.js} +1 -1
- ksadk/server/static/assets/{dist-DL_NKc_z.js → dist-ivOya1LD.js} +1 -1
- ksadk/server/static/assets/{erDiagram-TEJ5UH35-Bk-9bgE5.js → erDiagram-TEJ5UH35-CnfRcY2M.js} +1 -1
- ksadk/server/static/assets/eventmodeling-FCH6USID-ChYO-ijM.js +1 -0
- ksadk/server/static/assets/{flowDiagram-I6XJVG4X-Dn9kZVuZ.js → flowDiagram-I6XJVG4X-DGaJjGNJ.js} +1 -1
- ksadk/server/static/assets/{ganttDiagram-6RSMTGT7-BGxXlJqm.js → ganttDiagram-6RSMTGT7-DpCoB2g9.js} +1 -1
- ksadk/server/static/assets/gitGraph-WXDBUCRP-BN_0Fk-j.js +1 -0
- ksadk/server/static/assets/{gitGraphDiagram-PVQCEYII-C7Q0X-wi.js → gitGraphDiagram-PVQCEYII-9IKVFBVT.js} +1 -1
- ksadk/server/static/assets/index-QSwCHuB8.js +177 -0
- ksadk/server/static/assets/index-jOPmTOZH.css +2 -0
- ksadk/server/static/assets/info-J43DQDTF-Cp6o3vId.js +1 -0
- ksadk/server/static/assets/{infoDiagram-5YYISTIA-BO_CSqq5.js → infoDiagram-5YYISTIA-CYIIsb8y.js} +1 -1
- ksadk/server/static/assets/{ishikawaDiagram-YF4QCWOH-eYLPLd46.js → ishikawaDiagram-YF4QCWOH-DLOHGvWw.js} +1 -1
- ksadk/server/static/assets/{journeyDiagram-JHISSGLW-De9geSb0.js → journeyDiagram-JHISSGLW-BIzKeejT.js} +1 -1
- ksadk/server/static/assets/{kanban-definition-UN3LZRKU-Cs80kQto.js → kanban-definition-UN3LZRKU-BWHoFSw2.js} +1 -1
- ksadk/server/static/assets/{katex-DSrCFD8n.js → katex-DATssjp1.js} +1 -1
- ksadk/server/static/assets/{linear-CN9sbKTF.js → linear-CvMBw9cA.js} +1 -1
- ksadk/server/static/assets/{mermaid-parser.core-DlgSBU8l.js → mermaid-parser.core-mGAcEwcq.js} +2 -2
- ksadk/server/static/assets/{mindmap-definition-RKZ34NQL-9afz7Oug.js → mindmap-definition-RKZ34NQL-CSAQxEAe.js} +1 -1
- ksadk/server/static/assets/packet-YPE3B663-wQzct3cT.js +1 -0
- ksadk/server/static/assets/pie-LRSECV5Y-BgTQiv-9.js +1 -0
- ksadk/server/static/assets/{pieDiagram-4H26LBE5-DPv_VstN.js → pieDiagram-4H26LBE5-By-ra07M.js} +1 -1
- ksadk/server/static/assets/{quadrantDiagram-W4KKPZXB-o77wZ1XK.js → quadrantDiagram-W4KKPZXB-CxIR4JXI.js} +1 -1
- ksadk/server/static/assets/radar-GUYGQ44K-BIq5fXsn.js +1 -0
- ksadk/server/static/assets/{requirementDiagram-4Y6WPE33-BYVw81VC.js → requirementDiagram-4Y6WPE33-DpW90iu3.js} +1 -1
- ksadk/server/static/assets/{sankeyDiagram-5OEKKPKP-B7nZFMKT.js → sankeyDiagram-5OEKKPKP-DpGa6EAV.js} +1 -1
- ksadk/server/static/assets/{sequenceDiagram-3UESZ5HK-BGRRrFw5.js → sequenceDiagram-3UESZ5HK-NTKNGGe5.js} +1 -1
- ksadk/server/static/assets/{stateDiagram-AJRCARHV-BUfHCoPs.js → stateDiagram-AJRCARHV-DGpd9yFG.js} +1 -1
- ksadk/server/static/assets/stateDiagram-v2-BHNVJYJU-B3o579IQ.js +1 -0
- ksadk/server/static/assets/{timeline-definition-PNZ67QCA-FbCTGrf9.js → timeline-definition-PNZ67QCA-jqoYs3jQ.js} +1 -1
- ksadk/server/static/assets/treeView-BLDUP644-Dqi-E0EM.js +1 -0
- ksadk/server/static/assets/treemap-LRROVOQU-ClQP9CJ9.js +1 -0
- ksadk/server/static/assets/{vennDiagram-CIIHVFJN-DWgwtPsJ.js → vennDiagram-CIIHVFJN-l3Z7-wbP.js} +1 -1
- ksadk/server/static/assets/wardley-L42UT6IY-8XLvnNIs.js +1 -0
- ksadk/server/static/assets/{wardleyDiagram-YWT4CUSO-2x8G-tTM.js → wardleyDiagram-YWT4CUSO-BR54GPmr.js} +1 -1
- ksadk/server/static/assets/{xychartDiagram-2RQKCTM6-Drma3AYl.js → xychartDiagram-2RQKCTM6-SkiH8GsK.js} +1 -1
- ksadk/server/static/index.html +2 -2
- ksadk/server/terminal_sessions.py +111 -58
- ksadk/sessions/__init__.py +69 -19
- ksadk/sessions/base.py +31 -11
- ksadk/sessions/continuity.py +2 -3
- ksadk/sessions/in_memory.py +46 -2
- ksadk/sessions/local_service.py +148 -17
- ksadk/sessions/postgres_service.py +143 -25
- ksadk/sessions/resilient.py +36 -8
- ksadk/skills/models.py +17 -5
- ksadk/skills/package_store.py +5 -2
- ksadk/skills/runtime/agent.py +20 -5
- ksadk/skills/runtime/artifacts.py +1 -5
- ksadk/skills/runtime/backends/e2b.py +10 -4
- ksadk/skills/runtime/backends/local.py +15 -3
- ksadk/skills/runtime/base.py +1 -2
- ksadk/skills/runtime/executor.py +10 -3
- ksadk/skills/runtime/factory.py +4 -2
- ksadk/skills/runtime/loader.py +1 -2
- ksadk/skills/runtime/registry.py +15 -10
- ksadk/skills/runtime/request.py +3 -1
- ksadk/skills/service_client.py +38 -17
- ksadk/skills/tool_defs.py +15 -10
- ksadk/terminal_exec_policy.py +3 -4
- ksadk/tools/gateway.py +92 -15
- ksadk/tools/result_budget.py +12 -4
- ksadk/toolsets/__init__.py +134 -36
- ksadk/toolsets/platform.py +21 -5
- ksadk/toolsets/sandbox.py +82 -16
- ksadk/toolsets/skills.py +200 -39
- ksadk/toolsets/web.py +123 -26
- ksadk/toolsets/workspace.py +212 -101
- ksadk/tracing/exporters/inmemory_exporter.py +62 -51
- ksadk/tracing/exporters/langfuse_exporter.py +91 -76
- ksadk/tracing/setup.py +69 -53
- ksadk/tracing/span_utils.py +5 -2
- ksadk/tui/loop.py +78 -30
- ksadk/tui/stream_render.py +1 -0
- ksadk/ui_config.py +5 -3
- ksadk/version.py +1 -1
- ksadk_runtime_common/schemas/runtime_event_v1.json +95 -0
- agentengine_sdk_python-0.7.0.dist-info/RECORD +0 -482
- ksadk/server/static/assets/CodeBlock-P16VOLYi.js +0 -9
- ksadk/server/static/assets/MathMessageMarkdown-CdGiQWHR.js +0 -8
- ksadk/server/static/assets/MermaidBlock-IOcal8cm.js +0 -303
- ksadk/server/static/assets/NativeTerminalPanel-DGSDWsei.js +0 -1
- ksadk/server/static/assets/architecture-7EHR7CIX-BvUlsA6l.js +0 -1
- ksadk/server/static/assets/channel-CTuydARX.js +0 -1
- ksadk/server/static/assets/chunk-QZHKN3VN-BnCydivS.js +0 -1
- ksadk/server/static/assets/classDiagram-4FO5ZUOK-BNHg45Be.js +0 -1
- ksadk/server/static/assets/classDiagram-v2-Q7XG4LA2-BNHg45Be.js +0 -1
- ksadk/server/static/assets/eventmodeling-FCH6USID-DsAgWnlf.js +0 -1
- ksadk/server/static/assets/gitGraph-WXDBUCRP-BIao9Yjg.js +0 -1
- ksadk/server/static/assets/index-C00Lwg3L.js +0 -165
- ksadk/server/static/assets/index-DAURbCsP.css +0 -1
- ksadk/server/static/assets/info-J43DQDTF-CyipqGxU.js +0 -1
- ksadk/server/static/assets/packet-YPE3B663-CGkyRxlg.js +0 -1
- ksadk/server/static/assets/pie-LRSECV5Y-M0uWAf4n.js +0 -1
- ksadk/server/static/assets/radar-GUYGQ44K-Bdbm24-x.js +0 -1
- ksadk/server/static/assets/stateDiagram-v2-BHNVJYJU-8xBN_gLM.js +0 -1
- ksadk/server/static/assets/treeView-BLDUP644-npMo0ak1.js +0 -1
- ksadk/server/static/assets/treemap-LRROVOQU-CHdzrrdo.js +0 -1
- ksadk/server/static/assets/wardley-L42UT6IY-BEQz7wyy.js +0 -1
- {agentengine_sdk_python-0.7.0.dist-info → agentengine_sdk_python-0.8.0.dist-info}/WHEEL +0 -0
- {agentengine_sdk_python-0.7.0.dist-info → agentengine_sdk_python-0.8.0.dist-info}/entry_points.txt +0 -0
- {agentengine_sdk_python-0.7.0.dist-info → agentengine_sdk_python-0.8.0.dist-info}/licenses/LICENSE +0 -0
- {agentengine_sdk_python-0.7.0.dist-info → agentengine_sdk_python-0.8.0.dist-info}/top_level.txt +0 -0
ksadk/a2a/__init__.py
CHANGED
|
@@ -1,15 +1,182 @@
|
|
|
1
|
-
"""A2A
|
|
1
|
+
"""A2A 协议数据面 (goal-05 清洁重写,wire 1.0 / a2a-sdk 1.1.0)。
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
3
|
+
旧 0.3 demo(``A2AStarletteApplication`` + ``InMemoryTaskStore`` + 顶层 ``url``)
|
|
4
|
+
已整体推倒,不保留兼容。本包:
|
|
5
|
+
|
|
6
|
+
- :mod:`ksadk.a2a.card` — wire 1.0 AgentCard(``supportedInterfaces``)。
|
|
7
|
+
- :mod:`ksadk.a2a.task_store` — durable ``DatabaseTaskStore``(表 ``ksadk_a2a_tasks``)。
|
|
8
|
+
- :mod:`ksadk.a2a.executor` — runner → A2A 请求生命周期桥接。
|
|
9
|
+
- :mod:`ksadk.a2a.task_adapter` — A2A Task ↔ Runtime 映射(§7.2),cancel 走 RuntimeAdapter。
|
|
10
|
+
- :mod:`ksadk.a2a.event_adapter` — A2A Message/Task/Artifact ↔ RuntimeEvent。
|
|
11
|
+
- :mod:`ksadk.a2a.server` — ``A2AProtocolServer``(route factories + handler + store)。
|
|
12
|
+
- :mod:`ksadk.a2a.routes` — ``add_a2a_protocol_routes`` 装配进 create_runtime_app。
|
|
13
|
+
|
|
14
|
+
client 侧(``A2ASpaceClient`` 动态发现)见 goal-06。
|
|
15
|
+
"""
|
|
16
|
+
|
|
17
|
+
from ksadk.a2a.bootstrap import A2ACheckpointStore, AgentEngineA2ABootstrap, RuntimeA2AMetadata
|
|
18
|
+
from ksadk.a2a.card import (
|
|
19
|
+
A2A_PROTOCOL_VERSION,
|
|
20
|
+
JSONRPC_PATH,
|
|
21
|
+
REST_PATH_PREFIX,
|
|
22
|
+
build_agent_card,
|
|
23
|
+
)
|
|
24
|
+
from ksadk.a2a.context_store import (
|
|
25
|
+
A2AContextIdentity,
|
|
26
|
+
A2AContextStore,
|
|
27
|
+
SQLiteA2AContextStore,
|
|
28
|
+
)
|
|
29
|
+
from ksadk.a2a.control_plane import (
|
|
30
|
+
A2A_INTERNAL_ACTIONS,
|
|
31
|
+
A2A_INTERNAL_PATH_PREFIX,
|
|
32
|
+
ENV_A2A_CONTROL_PLANE_URL,
|
|
33
|
+
ENV_A2A_TOKEN_DIR,
|
|
34
|
+
A2AControlPlane,
|
|
35
|
+
A2AControlPlaneError,
|
|
36
|
+
A2AInternalAction,
|
|
37
|
+
A2AOperation,
|
|
38
|
+
A2ARoute,
|
|
39
|
+
A2ARouteInterface,
|
|
40
|
+
A2ATarget,
|
|
41
|
+
CredentialInjection,
|
|
42
|
+
FileWorkloadTokenProvider,
|
|
43
|
+
InternalA2AControlPlaneClient,
|
|
44
|
+
PreparedA2AOperation,
|
|
45
|
+
RemoteTaskReference,
|
|
46
|
+
WorkloadTokenProvider,
|
|
47
|
+
build_a2a_internal_action_path,
|
|
48
|
+
)
|
|
49
|
+
from ksadk.a2a.event_adapter import A2AEventAdapter
|
|
50
|
+
from ksadk.a2a.executor import A2ARuntimeExecutor
|
|
51
|
+
from ksadk.a2a.external_transport import (
|
|
52
|
+
ERR_VPC_EGRESS_DIALER_REQUIRED,
|
|
53
|
+
A2AExternalTransport,
|
|
54
|
+
A2ARouteOpener,
|
|
55
|
+
A2ATransportLease,
|
|
56
|
+
CallableA2ARouteOpener,
|
|
57
|
+
GuardedA2AExternalTransport,
|
|
58
|
+
RuntimeLocalA2AExternalTransport,
|
|
59
|
+
)
|
|
60
|
+
from ksadk.a2a.identity import (
|
|
61
|
+
A2AGatewayIdentityMiddleware,
|
|
62
|
+
A2AIngressIdentity,
|
|
63
|
+
A2AIngressTargetBinding,
|
|
64
|
+
A2ATrustedIdentityResolver,
|
|
65
|
+
CallableGatewayIdentityVerifier,
|
|
66
|
+
CallableGatewayProbeVerifier,
|
|
67
|
+
GatewayIdentityVerifier,
|
|
68
|
+
GatewayProbeVerifier,
|
|
69
|
+
)
|
|
70
|
+
from ksadk.a2a.langgraph import (
|
|
71
|
+
A2AStreamEvent,
|
|
72
|
+
stream_a2a_agent,
|
|
73
|
+
stream_a2a_agent_events,
|
|
74
|
+
stream_a2a_agent_to_writer,
|
|
75
|
+
)
|
|
76
|
+
from ksadk.a2a.resume_store import (
|
|
77
|
+
A2AResumePayloadKind,
|
|
78
|
+
A2AResumeState,
|
|
79
|
+
A2AResumeStateStore,
|
|
80
|
+
InMemoryA2AResumeStateStore,
|
|
81
|
+
SQLiteA2AResumeStateStore,
|
|
82
|
+
)
|
|
83
|
+
from ksadk.a2a.routes import A2AConfig, add_a2a_protocol_routes
|
|
84
|
+
from ksadk.a2a.server import A2AProtocolServer
|
|
85
|
+
from ksadk.a2a.space_client import (
|
|
86
|
+
ENV_A2A_ENABLE_PUBLIC_EGRESS,
|
|
87
|
+
ENV_A2A_SPACE_IDS,
|
|
88
|
+
ERR_PUBLIC_EGRESS_DISABLED,
|
|
89
|
+
A2APlatformTask,
|
|
90
|
+
A2ASpaceClient,
|
|
91
|
+
DiscoveredAgent,
|
|
92
|
+
SpaceAgentPage,
|
|
93
|
+
)
|
|
94
|
+
from ksadk.a2a.task_adapter import A2ARuntimeTaskAdapter
|
|
95
|
+
from ksadk.a2a.task_event_dispatcher import A2ATaskEventDispatcher, A2ATaskEventSink
|
|
96
|
+
from ksadk.a2a.task_event_outbox import (
|
|
97
|
+
DEFAULT_A2A_EVENT_OUTBOX_PATH,
|
|
98
|
+
ENV_A2A_EVENT_OUTBOX_PATH,
|
|
99
|
+
A2ATaskEventBatch,
|
|
100
|
+
A2ATaskEventOutbox,
|
|
101
|
+
InMemoryA2ATaskEventOutbox,
|
|
102
|
+
SQLiteA2ATaskEventOutbox,
|
|
103
|
+
)
|
|
104
|
+
from ksadk.a2a.task_store import A2A_TASK_TABLE, build_a2a_task_store
|
|
7
105
|
|
|
8
106
|
__all__ = [
|
|
9
|
-
"
|
|
10
|
-
"
|
|
11
|
-
"
|
|
12
|
-
"
|
|
13
|
-
"
|
|
14
|
-
"
|
|
107
|
+
"A2AConfig",
|
|
108
|
+
"A2ACheckpointStore",
|
|
109
|
+
"A2AContextIdentity",
|
|
110
|
+
"A2AContextStore",
|
|
111
|
+
"A2AControlPlane",
|
|
112
|
+
"A2AControlPlaneError",
|
|
113
|
+
"A2AInternalAction",
|
|
114
|
+
"A2A_INTERNAL_ACTIONS",
|
|
115
|
+
"A2A_INTERNAL_PATH_PREFIX",
|
|
116
|
+
"A2AOperation",
|
|
117
|
+
"A2AEventAdapter",
|
|
118
|
+
"A2AExternalTransport",
|
|
119
|
+
"A2AGatewayIdentityMiddleware",
|
|
120
|
+
"A2AIngressIdentity",
|
|
121
|
+
"A2AIngressTargetBinding",
|
|
122
|
+
"A2APlatformTask",
|
|
123
|
+
"A2AProtocolServer",
|
|
124
|
+
"A2ARuntimeExecutor",
|
|
125
|
+
"A2ARuntimeTaskAdapter",
|
|
126
|
+
"A2AResumeState",
|
|
127
|
+
"A2AResumePayloadKind",
|
|
128
|
+
"A2AResumeStateStore",
|
|
129
|
+
"A2ASpaceClient",
|
|
130
|
+
"A2AStreamEvent",
|
|
131
|
+
"A2A_PROTOCOL_VERSION",
|
|
132
|
+
"A2ARoute",
|
|
133
|
+
"A2ARouteOpener",
|
|
134
|
+
"A2ARouteInterface",
|
|
135
|
+
"A2A_TASK_TABLE",
|
|
136
|
+
"A2ATarget",
|
|
137
|
+
"A2ATaskEventBatch",
|
|
138
|
+
"A2ATaskEventDispatcher",
|
|
139
|
+
"A2ATaskEventSink",
|
|
140
|
+
"A2ATaskEventOutbox",
|
|
141
|
+
"A2ATransportLease",
|
|
142
|
+
"A2ATrustedIdentityResolver",
|
|
143
|
+
"AgentEngineA2ABootstrap",
|
|
144
|
+
"CallableA2ARouteOpener",
|
|
145
|
+
"CallableGatewayIdentityVerifier",
|
|
146
|
+
"CallableGatewayProbeVerifier",
|
|
147
|
+
"CredentialInjection",
|
|
148
|
+
"DiscoveredAgent",
|
|
149
|
+
"ERR_VPC_EGRESS_DIALER_REQUIRED",
|
|
150
|
+
"DEFAULT_A2A_EVENT_OUTBOX_PATH",
|
|
151
|
+
"ENV_A2A_CONTROL_PLANE_URL",
|
|
152
|
+
"ENV_A2A_ENABLE_PUBLIC_EGRESS",
|
|
153
|
+
"ENV_A2A_EVENT_OUTBOX_PATH",
|
|
154
|
+
"ENV_A2A_SPACE_IDS",
|
|
155
|
+
"ENV_A2A_TOKEN_DIR",
|
|
156
|
+
"ERR_PUBLIC_EGRESS_DISABLED",
|
|
157
|
+
"FileWorkloadTokenProvider",
|
|
158
|
+
"GatewayIdentityVerifier",
|
|
159
|
+
"GatewayProbeVerifier",
|
|
160
|
+
"GuardedA2AExternalTransport",
|
|
161
|
+
"InMemoryA2ATaskEventOutbox",
|
|
162
|
+
"InMemoryA2AResumeStateStore",
|
|
163
|
+
"JSONRPC_PATH",
|
|
164
|
+
"InternalA2AControlPlaneClient",
|
|
165
|
+
"PreparedA2AOperation",
|
|
166
|
+
"RemoteTaskReference",
|
|
167
|
+
"REST_PATH_PREFIX",
|
|
168
|
+
"SpaceAgentPage",
|
|
169
|
+
"SQLiteA2ATaskEventOutbox",
|
|
170
|
+
"SQLiteA2AContextStore",
|
|
171
|
+
"SQLiteA2AResumeStateStore",
|
|
172
|
+
"RuntimeA2AMetadata",
|
|
173
|
+
"RuntimeLocalA2AExternalTransport",
|
|
174
|
+
"WorkloadTokenProvider",
|
|
175
|
+
"add_a2a_protocol_routes",
|
|
176
|
+
"build_a2a_task_store",
|
|
177
|
+
"build_a2a_internal_action_path",
|
|
178
|
+
"build_agent_card",
|
|
179
|
+
"stream_a2a_agent",
|
|
180
|
+
"stream_a2a_agent_events",
|
|
181
|
+
"stream_a2a_agent_to_writer",
|
|
15
182
|
]
|
ksadk/a2a/bootstrap.py
ADDED
|
@@ -0,0 +1,334 @@
|
|
|
1
|
+
"""AgentEngine product composition root for managed inbound and outbound A2A."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
import inspect
|
|
6
|
+
from dataclasses import dataclass
|
|
7
|
+
from typing import Any, Protocol, Sequence
|
|
8
|
+
from urllib.parse import urlsplit
|
|
9
|
+
|
|
10
|
+
import httpx
|
|
11
|
+
from a2a.server.tasks import TaskStore
|
|
12
|
+
from a2a.types import AgentSkill
|
|
13
|
+
from fastapi import FastAPI
|
|
14
|
+
|
|
15
|
+
from ksadk.a2a.context_store import A2AContextStore
|
|
16
|
+
from ksadk.a2a.external_transport import RuntimeLocalA2AExternalTransport
|
|
17
|
+
from ksadk.a2a.identity import (
|
|
18
|
+
A2AGatewayIdentityMiddleware,
|
|
19
|
+
A2AIngressTargetBinding,
|
|
20
|
+
A2ATrustedIdentityResolver,
|
|
21
|
+
GatewayIdentityVerifier,
|
|
22
|
+
GatewayProbeVerifier,
|
|
23
|
+
)
|
|
24
|
+
from ksadk.a2a.ids import require_a2a_resource_id
|
|
25
|
+
from ksadk.a2a.resume_store import A2AResumeStateStore
|
|
26
|
+
from ksadk.a2a.routes import A2AConfig, add_a2a_protocol_routes
|
|
27
|
+
from ksadk.a2a.task_adapter import A2ARuntimeTaskAdapter
|
|
28
|
+
from ksadk.a2a.task_event_dispatcher import A2ATaskEventDispatcher
|
|
29
|
+
from ksadk.a2a.task_event_outbox import A2ATaskEventOutbox
|
|
30
|
+
from ksadk.a2a.task_store import A2AOwnerContextBuilder
|
|
31
|
+
from ksadk.runtime.adapter import RuntimeAdapter
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
@dataclass(frozen=True)
|
|
35
|
+
class RuntimeA2AMetadata:
|
|
36
|
+
account_id: str
|
|
37
|
+
tenant_id: str
|
|
38
|
+
agent_id: str
|
|
39
|
+
a2a_agent_id: str
|
|
40
|
+
runtime_id: str
|
|
41
|
+
internal_base_url: str
|
|
42
|
+
name: str
|
|
43
|
+
version: str
|
|
44
|
+
skills: Sequence[AgentSkill]
|
|
45
|
+
description: str = ""
|
|
46
|
+
|
|
47
|
+
def validate(self) -> None:
|
|
48
|
+
values = {
|
|
49
|
+
"account_id": self.account_id,
|
|
50
|
+
"agent_id": self.agent_id,
|
|
51
|
+
"a2a_agent_id": self.a2a_agent_id,
|
|
52
|
+
"runtime_id": self.runtime_id,
|
|
53
|
+
"internal_base_url": self.internal_base_url,
|
|
54
|
+
"name": self.name,
|
|
55
|
+
"version": self.version,
|
|
56
|
+
}
|
|
57
|
+
missing = [name for name, value in values.items() if not str(value).strip()]
|
|
58
|
+
if missing:
|
|
59
|
+
raise ValueError(f"RuntimeA2AMetadata is missing required fields: {', '.join(missing)}")
|
|
60
|
+
if not self.agent_id.startswith("ar-"):
|
|
61
|
+
raise ValueError("RuntimeA2AMetadata.agent_id must be an ar-* Agent ID")
|
|
62
|
+
require_a2a_resource_id(
|
|
63
|
+
self.a2a_agent_id,
|
|
64
|
+
"a2a-agent-",
|
|
65
|
+
field_name="RuntimeA2AMetadata.a2a_agent_id",
|
|
66
|
+
)
|
|
67
|
+
for field_name, limit in (
|
|
68
|
+
("account_id", 64),
|
|
69
|
+
("tenant_id", 64),
|
|
70
|
+
("agent_id", 64),
|
|
71
|
+
("a2a_agent_id", 64),
|
|
72
|
+
("runtime_id", 64),
|
|
73
|
+
("name", 128),
|
|
74
|
+
("description", 1024),
|
|
75
|
+
("version", 64),
|
|
76
|
+
):
|
|
77
|
+
if len(str(getattr(self, field_name))) > limit:
|
|
78
|
+
raise ValueError(f"RuntimeA2AMetadata.{field_name} exceeds {limit} characters")
|
|
79
|
+
if len(self.skills) > 100 or not all(
|
|
80
|
+
isinstance(skill, AgentSkill) for skill in self.skills
|
|
81
|
+
):
|
|
82
|
+
raise ValueError(
|
|
83
|
+
"RuntimeA2AMetadata.skills must contain at most 100 AgentSkill objects"
|
|
84
|
+
)
|
|
85
|
+
parsed = urlsplit(self.internal_base_url)
|
|
86
|
+
try:
|
|
87
|
+
port = parsed.port
|
|
88
|
+
except ValueError as exc:
|
|
89
|
+
raise ValueError(
|
|
90
|
+
"RuntimeA2AMetadata.internal_base_url must be an absolute HTTP(S) origin"
|
|
91
|
+
) from exc
|
|
92
|
+
if (
|
|
93
|
+
parsed.scheme not in {"http", "https"}
|
|
94
|
+
or not parsed.hostname
|
|
95
|
+
or parsed.username is not None
|
|
96
|
+
or parsed.password is not None
|
|
97
|
+
or parsed.path
|
|
98
|
+
or parsed.query
|
|
99
|
+
or parsed.fragment
|
|
100
|
+
or parsed.netloc.rsplit("@", 1)[-1].endswith(":")
|
|
101
|
+
or port is not None and not 1 <= port <= 65535
|
|
102
|
+
):
|
|
103
|
+
raise ValueError(
|
|
104
|
+
"RuntimeA2AMetadata.internal_base_url must be an absolute HTTP(S) origin"
|
|
105
|
+
)
|
|
106
|
+
|
|
107
|
+
|
|
108
|
+
class A2ACheckpointStore(Protocol):
|
|
109
|
+
"""Durable checkpoint backend readiness contract owned by the Runtime adapter."""
|
|
110
|
+
|
|
111
|
+
async def initialize(self) -> None: ...
|
|
112
|
+
|
|
113
|
+
|
|
114
|
+
class AgentEngineA2ABootstrap:
|
|
115
|
+
"""Single product-owned composition root for managed A2A Runtime dependencies."""
|
|
116
|
+
|
|
117
|
+
def __init__(
|
|
118
|
+
self,
|
|
119
|
+
*,
|
|
120
|
+
runtime_metadata: RuntimeA2AMetadata,
|
|
121
|
+
task_store: TaskStore | None = None,
|
|
122
|
+
context_store: A2AContextStore | None = None,
|
|
123
|
+
checkpoint_store: A2ACheckpointStore | None = None,
|
|
124
|
+
resume_state_store: A2AResumeStateStore | None = None,
|
|
125
|
+
gateway_identity_verifier: GatewayIdentityVerifier | None = None,
|
|
126
|
+
gateway_probe_verifier: GatewayProbeVerifier | None = None,
|
|
127
|
+
external_transport: RuntimeLocalA2AExternalTransport | None = None,
|
|
128
|
+
control_plane: Any | None = None,
|
|
129
|
+
hosted_http_client: httpx.AsyncClient | None = None,
|
|
130
|
+
event_outbox: A2ATaskEventOutbox | None = None,
|
|
131
|
+
inbound_enabled: bool = True,
|
|
132
|
+
outbound_enabled: bool = True,
|
|
133
|
+
public_egress_enabled: bool = False,
|
|
134
|
+
outbox_retry_interval_seconds: float = 1.0,
|
|
135
|
+
) -> None:
|
|
136
|
+
runtime_metadata.validate()
|
|
137
|
+
required: dict[str, Any] = {}
|
|
138
|
+
if outbound_enabled:
|
|
139
|
+
required.update(
|
|
140
|
+
{
|
|
141
|
+
"control_plane": control_plane,
|
|
142
|
+
"hosted_http_client": hosted_http_client,
|
|
143
|
+
"event_outbox": event_outbox,
|
|
144
|
+
}
|
|
145
|
+
)
|
|
146
|
+
if inbound_enabled:
|
|
147
|
+
required.update(
|
|
148
|
+
{
|
|
149
|
+
"task_store": task_store,
|
|
150
|
+
"context_store": context_store,
|
|
151
|
+
"checkpoint_store": checkpoint_store,
|
|
152
|
+
"resume_state_store": resume_state_store,
|
|
153
|
+
"gateway_identity_verifier": gateway_identity_verifier,
|
|
154
|
+
"gateway_probe_verifier": gateway_probe_verifier,
|
|
155
|
+
}
|
|
156
|
+
)
|
|
157
|
+
missing = [name for name, value in required.items() if value is None]
|
|
158
|
+
if missing:
|
|
159
|
+
raise ValueError(
|
|
160
|
+
"AgentEngineA2ABootstrap requires: " + ", ".join(missing)
|
|
161
|
+
)
|
|
162
|
+
if external_transport is not None and not isinstance(
|
|
163
|
+
external_transport, RuntimeLocalA2AExternalTransport
|
|
164
|
+
):
|
|
165
|
+
raise TypeError(
|
|
166
|
+
"AgentEngineA2ABootstrap requires RuntimeLocalA2AExternalTransport "
|
|
167
|
+
"for external_public routes"
|
|
168
|
+
)
|
|
169
|
+
if not outbound_enabled and external_transport is not None:
|
|
170
|
+
raise ValueError("external_transport requires outbound_enabled=True")
|
|
171
|
+
if inbound_enabled:
|
|
172
|
+
_require_initializable(task_store, "task_store")
|
|
173
|
+
_require_initializable(context_store, "context_store")
|
|
174
|
+
_require_initializable(checkpoint_store, "checkpoint_store")
|
|
175
|
+
_require_initializable(resume_state_store, "resume_state_store")
|
|
176
|
+
self.runtime_metadata = runtime_metadata
|
|
177
|
+
self._target_binding = A2AIngressTargetBinding(
|
|
178
|
+
account_id=runtime_metadata.account_id,
|
|
179
|
+
tenant_id=runtime_metadata.tenant_id,
|
|
180
|
+
agent_id=runtime_metadata.agent_id,
|
|
181
|
+
runtime_id=runtime_metadata.runtime_id,
|
|
182
|
+
a2a_agent_id=runtime_metadata.a2a_agent_id,
|
|
183
|
+
)
|
|
184
|
+
self.inbound_enabled = inbound_enabled
|
|
185
|
+
self.outbound_enabled = outbound_enabled
|
|
186
|
+
self.public_egress_enabled = public_egress_enabled
|
|
187
|
+
self._task_store = task_store
|
|
188
|
+
self._context_store = context_store
|
|
189
|
+
self._checkpoint_store = checkpoint_store
|
|
190
|
+
self._resume_state_store = resume_state_store
|
|
191
|
+
self._gateway_identity_verifier = gateway_identity_verifier
|
|
192
|
+
self._gateway_probe_verifier = gateway_probe_verifier
|
|
193
|
+
self._external_transport = external_transport
|
|
194
|
+
self._control_plane = control_plane
|
|
195
|
+
self._hosted_http_client = hosted_http_client
|
|
196
|
+
self._dispatcher = (
|
|
197
|
+
A2ATaskEventDispatcher(
|
|
198
|
+
_require(event_outbox, "event_outbox"),
|
|
199
|
+
_require(control_plane, "control_plane"),
|
|
200
|
+
retry_interval_seconds=outbox_retry_interval_seconds,
|
|
201
|
+
)
|
|
202
|
+
if outbound_enabled
|
|
203
|
+
else None
|
|
204
|
+
)
|
|
205
|
+
self._mounted = False
|
|
206
|
+
self._server: Any = None
|
|
207
|
+
|
|
208
|
+
@classmethod
|
|
209
|
+
def from_platform(cls, **kwargs: Any) -> "AgentEngineA2ABootstrap":
|
|
210
|
+
"""Explicit product factory; dependencies are injected by the platform layer."""
|
|
211
|
+
|
|
212
|
+
return cls(**kwargs)
|
|
213
|
+
|
|
214
|
+
@property
|
|
215
|
+
def event_dispatcher(self) -> A2ATaskEventDispatcher:
|
|
216
|
+
if self._dispatcher is None:
|
|
217
|
+
raise RuntimeError("A2A outbound client is disabled for this Runtime")
|
|
218
|
+
return self._dispatcher
|
|
219
|
+
|
|
220
|
+
@property
|
|
221
|
+
def server(self) -> Any:
|
|
222
|
+
return self._server
|
|
223
|
+
|
|
224
|
+
def client_for_space(self, space_id: str):
|
|
225
|
+
"""Create a Space-scoped client sharing Runtime identity, clients, and outbox."""
|
|
226
|
+
|
|
227
|
+
from ksadk.a2a.space_client import A2ASpaceClient
|
|
228
|
+
|
|
229
|
+
if not self.outbound_enabled:
|
|
230
|
+
raise RuntimeError("A2A outbound client is disabled for this Runtime")
|
|
231
|
+
return A2ASpaceClient(
|
|
232
|
+
space_id,
|
|
233
|
+
_require(self._control_plane, "control_plane"),
|
|
234
|
+
egress_enabled=self.public_egress_enabled,
|
|
235
|
+
httpx_client=_require(self._hosted_http_client, "hosted_http_client"),
|
|
236
|
+
external_transport=self._external_transport,
|
|
237
|
+
event_dispatcher=self.event_dispatcher,
|
|
238
|
+
)
|
|
239
|
+
|
|
240
|
+
def mount(
|
|
241
|
+
self,
|
|
242
|
+
app: FastAPI,
|
|
243
|
+
*,
|
|
244
|
+
runner: Any,
|
|
245
|
+
runtime_adapter: RuntimeAdapter,
|
|
246
|
+
runtime_type: str,
|
|
247
|
+
) -> Any | None:
|
|
248
|
+
"""Mount exactly one managed inbound A2A server into an app."""
|
|
249
|
+
|
|
250
|
+
if self._mounted:
|
|
251
|
+
raise RuntimeError("AgentEngineA2ABootstrap may only be mounted once")
|
|
252
|
+
self._mounted = True
|
|
253
|
+
app.state.a2a_bootstrap = self
|
|
254
|
+
if not self.inbound_enabled:
|
|
255
|
+
return None
|
|
256
|
+
app.add_middleware(
|
|
257
|
+
A2AGatewayIdentityMiddleware,
|
|
258
|
+
verifier=_require(self._gateway_identity_verifier, "gateway_identity_verifier"),
|
|
259
|
+
probe_verifier=_require(self._gateway_probe_verifier, "gateway_probe_verifier"),
|
|
260
|
+
target_binding=self._target_binding,
|
|
261
|
+
)
|
|
262
|
+
config = A2AConfig(
|
|
263
|
+
enabled=True,
|
|
264
|
+
base_url=self.runtime_metadata.internal_base_url,
|
|
265
|
+
agent_name=self.runtime_metadata.name,
|
|
266
|
+
description=self.runtime_metadata.description,
|
|
267
|
+
version=self.runtime_metadata.version,
|
|
268
|
+
skills=self.runtime_metadata.skills,
|
|
269
|
+
create_table=False,
|
|
270
|
+
)
|
|
271
|
+
task_adapter = A2ARuntimeTaskAdapter(
|
|
272
|
+
runtime_adapter,
|
|
273
|
+
runtime_type=runtime_type,
|
|
274
|
+
context_store=_require(self._context_store, "context_store"),
|
|
275
|
+
resume_state_store=_require(self._resume_state_store, "resume_state_store"),
|
|
276
|
+
)
|
|
277
|
+
self._server = add_a2a_protocol_routes(
|
|
278
|
+
app,
|
|
279
|
+
runner,
|
|
280
|
+
config,
|
|
281
|
+
task_adapter=task_adapter,
|
|
282
|
+
task_store=_require(self._task_store, "task_store"),
|
|
283
|
+
context_builder=A2AOwnerContextBuilder(
|
|
284
|
+
identity_resolver=A2ATrustedIdentityResolver(
|
|
285
|
+
target_binding=self._target_binding,
|
|
286
|
+
),
|
|
287
|
+
allow_unverified_identity=False,
|
|
288
|
+
),
|
|
289
|
+
)
|
|
290
|
+
return self._server
|
|
291
|
+
|
|
292
|
+
async def start(self) -> None:
|
|
293
|
+
if self.inbound_enabled:
|
|
294
|
+
await _initialize_required(_require(self._task_store, "task_store"), "task_store")
|
|
295
|
+
await _initialize_required(
|
|
296
|
+
_require(self._context_store, "context_store"), "context_store"
|
|
297
|
+
)
|
|
298
|
+
await _initialize_required(
|
|
299
|
+
_require(self._checkpoint_store, "checkpoint_store"), "checkpoint_store"
|
|
300
|
+
)
|
|
301
|
+
await _initialize_required(
|
|
302
|
+
_require(self._resume_state_store, "resume_state_store"),
|
|
303
|
+
"resume_state_store",
|
|
304
|
+
)
|
|
305
|
+
if self._dispatcher is not None:
|
|
306
|
+
await self._dispatcher.start()
|
|
307
|
+
|
|
308
|
+
async def stop(self, *, flush_timeout_seconds: float = 5.0) -> None:
|
|
309
|
+
if self._dispatcher is not None:
|
|
310
|
+
await self._dispatcher.stop(flush_timeout_seconds=flush_timeout_seconds)
|
|
311
|
+
|
|
312
|
+
|
|
313
|
+
def _require_initializable(value: Any, name: str) -> None:
|
|
314
|
+
initialize = getattr(value, "initialize", None)
|
|
315
|
+
if not callable(initialize):
|
|
316
|
+
raise TypeError(f"{name} must implement async initialize()")
|
|
317
|
+
|
|
318
|
+
|
|
319
|
+
async def _initialize_required(value: Any, name: str) -> None:
|
|
320
|
+
_require_initializable(value, name)
|
|
321
|
+
initialize = value.initialize
|
|
322
|
+
result = initialize()
|
|
323
|
+
if not inspect.isawaitable(result):
|
|
324
|
+
raise TypeError(f"{name}.initialize() must return an awaitable")
|
|
325
|
+
await result
|
|
326
|
+
|
|
327
|
+
|
|
328
|
+
def _require(value: Any, name: str) -> Any:
|
|
329
|
+
if value is None:
|
|
330
|
+
raise RuntimeError(f"AgentEngineA2ABootstrap is missing {name}")
|
|
331
|
+
return value
|
|
332
|
+
|
|
333
|
+
|
|
334
|
+
__all__ = ["A2ACheckpointStore", "AgentEngineA2ABootstrap", "RuntimeA2AMetadata"]
|
ksadk/a2a/card.py
ADDED
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
"""A2A AgentCard 构造 (goal-05,wire 1.0)。
|
|
2
|
+
|
|
3
|
+
契约(`a2a-center-productization-2026-07.md` §2.1):
|
|
4
|
+
- AgentCard 使用 ``supportedInterfaces[]``,每项 ``url`` / ``protocolBinding`` /
|
|
5
|
+
``protocolVersion: "1.0"``;**不用顶层 ``url``,不提供 0.3 fallback,不挂
|
|
6
|
+
``/.well-known/agent.json`` 旧路径**。
|
|
7
|
+
- 我方托管 Agent 7 月优先暴露 ``JSONRPC``,同时挂 SDK 已提供的 ``HTTP+JSON`` 路由。
|
|
8
|
+
- a2a-sdk 1.1.0 的 wire 对象是 protobuf(``a2a_pb2``),非 pydantic。
|
|
9
|
+
"""
|
|
10
|
+
|
|
11
|
+
from __future__ import annotations
|
|
12
|
+
|
|
13
|
+
from collections.abc import Sequence
|
|
14
|
+
|
|
15
|
+
from a2a.types import (
|
|
16
|
+
AgentCapabilities,
|
|
17
|
+
AgentCard,
|
|
18
|
+
AgentInterface,
|
|
19
|
+
AgentSkill,
|
|
20
|
+
)
|
|
21
|
+
|
|
22
|
+
#: wire 协议版本(契约 §2.1 固定 1.0)。
|
|
23
|
+
A2A_PROTOCOL_VERSION = "1.0"
|
|
24
|
+
#: 托管 Agent 的 A2A 路由路径(契约 §3.3:/a2a/jsonrpc 与 /a2a/v1/*)。
|
|
25
|
+
JSONRPC_PATH = "/a2a/jsonrpc"
|
|
26
|
+
REST_PATH_PREFIX = "/a2a/v1"
|
|
27
|
+
|
|
28
|
+
_DEFAULT_IO_MODES = ["text/plain"]
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
def build_agent_card(
|
|
32
|
+
*,
|
|
33
|
+
name: str,
|
|
34
|
+
base_url: str,
|
|
35
|
+
description: str = "",
|
|
36
|
+
version: str = "1.0.0",
|
|
37
|
+
skills: Sequence[str | AgentSkill] | None = None,
|
|
38
|
+
streaming: bool = True,
|
|
39
|
+
provider: dict[str, str] | None = None,
|
|
40
|
+
) -> AgentCard:
|
|
41
|
+
"""构造符合 wire 1.0 的 AgentCard(supportedInterfaces)。
|
|
42
|
+
|
|
43
|
+
参数:
|
|
44
|
+
name: Agent 名称。
|
|
45
|
+
base_url: 该 Agent 对外宣告的基础地址(各 interface url 由此拼出)。
|
|
46
|
+
description: 描述。
|
|
47
|
+
version: 业务版本。
|
|
48
|
+
skills: 标准 ``AgentSkill`` 列表,或本地配置使用的技能 id 列表(空则给 general)。
|
|
49
|
+
streaming: 是否声明 streaming 能力。
|
|
50
|
+
provider: 可选 provider 信息(如 {"organization": ..., "url": ...})。
|
|
51
|
+
"""
|
|
52
|
+
base = base_url.rstrip("/")
|
|
53
|
+
supported_interfaces = [
|
|
54
|
+
AgentInterface(
|
|
55
|
+
url=f"{base}{JSONRPC_PATH}",
|
|
56
|
+
protocol_binding="JSONRPC",
|
|
57
|
+
protocol_version=A2A_PROTOCOL_VERSION,
|
|
58
|
+
),
|
|
59
|
+
AgentInterface(
|
|
60
|
+
url=f"{base}{REST_PATH_PREFIX}",
|
|
61
|
+
protocol_binding="HTTP+JSON",
|
|
62
|
+
protocol_version=A2A_PROTOCOL_VERSION,
|
|
63
|
+
),
|
|
64
|
+
]
|
|
65
|
+
|
|
66
|
+
card_kwargs: dict = {
|
|
67
|
+
"name": name,
|
|
68
|
+
"description": description or f"{name} agent powered by ksadk",
|
|
69
|
+
"version": version,
|
|
70
|
+
"supported_interfaces": supported_interfaces,
|
|
71
|
+
"capabilities": AgentCapabilities(streaming=streaming, push_notifications=False),
|
|
72
|
+
"default_input_modes": list(_DEFAULT_IO_MODES),
|
|
73
|
+
"default_output_modes": list(_DEFAULT_IO_MODES),
|
|
74
|
+
"skills": _build_skills(skills),
|
|
75
|
+
}
|
|
76
|
+
if provider:
|
|
77
|
+
from a2a.types import AgentProvider
|
|
78
|
+
|
|
79
|
+
card_kwargs["provider"] = AgentProvider(
|
|
80
|
+
organization=provider.get("organization", ""),
|
|
81
|
+
url=provider.get("url", ""),
|
|
82
|
+
)
|
|
83
|
+
return AgentCard(**card_kwargs)
|
|
84
|
+
|
|
85
|
+
|
|
86
|
+
def _build_skills(skills: Sequence[str | AgentSkill] | None) -> list[AgentSkill]:
|
|
87
|
+
if not skills:
|
|
88
|
+
return [
|
|
89
|
+
AgentSkill(
|
|
90
|
+
id="general",
|
|
91
|
+
name="General",
|
|
92
|
+
description="General purpose agent powered by ksadk",
|
|
93
|
+
tags=["general"],
|
|
94
|
+
)
|
|
95
|
+
]
|
|
96
|
+
result: list[AgentSkill] = []
|
|
97
|
+
for skill in skills:
|
|
98
|
+
if isinstance(skill, AgentSkill):
|
|
99
|
+
result.append(skill)
|
|
100
|
+
continue
|
|
101
|
+
if not isinstance(skill, str) or not skill.strip():
|
|
102
|
+
raise TypeError("AgentCard skills must be non-empty strings or AgentSkill objects")
|
|
103
|
+
skill_id = skill.strip()
|
|
104
|
+
result.append(
|
|
105
|
+
AgentSkill(
|
|
106
|
+
id=skill_id,
|
|
107
|
+
name=skill_id.replace("_", " ").title(),
|
|
108
|
+
description=f"Skill: {skill_id}",
|
|
109
|
+
tags=[skill_id],
|
|
110
|
+
)
|
|
111
|
+
)
|
|
112
|
+
return result
|
|
113
|
+
|
|
114
|
+
|
|
115
|
+
__all__ = [
|
|
116
|
+
"A2A_PROTOCOL_VERSION",
|
|
117
|
+
"JSONRPC_PATH",
|
|
118
|
+
"REST_PATH_PREFIX",
|
|
119
|
+
"build_agent_card",
|
|
120
|
+
]
|