agentengine-sdk-python 0.8.0__py3-none-any.whl → 0.8.2__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.8.0.dist-info → agentengine_sdk_python-0.8.2.dist-info}/METADATA +43 -7
- agentengine_sdk_python-0.8.2.dist-info/RECORD +778 -0
- {agentengine_sdk_python-0.8.0.dist-info → agentengine_sdk_python-0.8.2.dist-info}/WHEEL +1 -1
- ksadk/a2a/__init__.py +2 -0
- ksadk/a2a/_space_client_events.py +381 -0
- ksadk/a2a/bootstrap.py +0 -2
- ksadk/a2a/card.py +6 -111
- ksadk/a2a/control_plane.py +239 -1
- ksadk/a2a/event_adapter.py +156 -64
- ksadk/a2a/executor.py +195 -172
- ksadk/a2a/routes.py +12 -5
- ksadk/a2a/server.py +1 -8
- ksadk/a2a/service_env.py +33 -0
- ksadk/a2a/space_client.py +43 -349
- ksadk/a2a_card.py +101 -0
- ksadk/a2ui/core.py +222 -53
- ksadk/agui/_agent_helpers.py +243 -0
- ksadk/agui/a2ui_projection.py +12 -5
- ksadk/agui/agent.py +474 -275
- ksadk/agui/config.py +11 -5
- ksadk/agui/routes.py +7 -15
- ksadk/api/client.py +530 -40
- ksadk/api/environment.py +27 -0
- ksadk/builders/code_builder.py +352 -53
- ksadk/builders/container_builder.py +71 -44
- ksadk/builders/framework_requirements.py +2 -1
- ksadk/builders/ks3_uploader.py +2 -2
- ksadk/builders/managed_runtime_builder.py +60 -28
- ksadk/cli/__init__.py +25 -0
- ksadk/cli/cmd_a2a.py +18 -31
- ksadk/cli/cmd_create.py +13 -26
- ksadk/cli/cmd_dashboard.py +15 -1
- ksadk/cli/cmd_deploy.py +28 -3
- ksadk/cli/cmd_eval.py +443 -0
- ksadk/cli/cmd_evalset.py +284 -0
- ksadk/cli/cmd_files.py +5 -1
- ksadk/cli/cmd_hermes.py +137 -163
- ksadk/cli/cmd_invoke.py +28 -38
- ksadk/cli/cmd_launch.py +12 -0
- ksadk/cli/cmd_managed_runtime.py +95 -0
- ksadk/cli/cmd_observe.py +85 -0
- ksadk/cli/cmd_openclaw.py +85 -479
- ksadk/cli/cmd_replay.py +28 -4
- ksadk/cli/cmd_run.py +29 -67
- ksadk/cli/cmd_studio.py +201 -0
- ksadk/cli/cmd_web.py +15 -6
- ksadk/cli/dry_run.py +2 -1
- ksadk/cli/env_options.py +83 -0
- ksadk/cli/global_options.py +3 -1
- ksadk/cli/hermes_env.py +151 -0
- ksadk/cli/invoke_payload.py +49 -0
- ksadk/cli/network_options.py +7 -5
- ksadk/cli/openclaw_env.py +458 -0
- ksadk/cli/runtime_bootstrap.py +51 -0
- ksadk/cli/ui.py +6 -0
- ksadk/cli/workflow_common.py +5 -5
- ksadk/codex/__init__.py +3 -3
- ksadk/codex/client.py +833 -49
- ksadk/codex/phase.py +1 -1
- ksadk/codex/runtime.py +720 -127
- ksadk/common/kop_client.py +232 -0
- ksadk/configs/__init__.py +1 -3
- ksadk/configs/env_registry.py +244 -45
- ksadk/configs/env_registry_pcm.py +181 -0
- ksadk/configs/env_var_spec.py +18 -0
- ksadk/configs/global_config.py +6 -1
- ksadk/configs/settings.py +5 -108
- ksadk/context_engine/__init__.py +98 -0
- ksadk/context_engine/assembler.py +176 -0
- ksadk/context_engine/baseline.py +419 -0
- ksadk/context_engine/cache_observability.py +228 -0
- ksadk/context_engine/capabilities.py +443 -0
- ksadk/context_engine/contributors.py +344 -0
- ksadk/context_engine/hosted_pipeline.py +417 -0
- ksadk/context_engine/models.py +117 -0
- ksadk/context_engine/planner.py +698 -0
- ksadk/context_engine/policies.py +319 -0
- ksadk/context_engine/projection.py +31 -0
- ksadk/context_engine/shadow_plan.py +266 -0
- ksadk/context_engine/tokenizer.py +164 -0
- ksadk/conversations/__init__.py +85 -94
- ksadk/conversations/context.py +126 -6
- ksadk/conversations/message_projection.py +292 -28
- ksadk/conversations/model_context.py +49 -3
- ksadk/conversations/runtime_compaction.py +207 -5
- ksadk/conversations/runtime_input.py +193 -3
- ksadk/conversations/runtime_invocation.py +81 -3
- ksadk/conversations/runtime_observability.py +157 -4
- ksadk/conversations/runtime_payloads.py +42 -0
- ksadk/conversations/runtime_preparation.py +280 -2
- ksadk/conversations/runtime_resume.py +71 -32
- ksadk/conversations/runtime_stream_events.py +94 -9
- ksadk/conversations/runtime_streaming.py +175 -22
- ksadk/conversations/semantic_summary.py +311 -1
- ksadk/conversations/session_lock.py +51 -0
- ksadk/deployment/env_forward.py +72 -0
- ksadk/deployment/managed_runtime.py +38 -0
- ksadk/deployment/manager.py +24 -8
- ksadk/deployment/providers/serverless.py +228 -92
- ksadk/evaluation/__init__.py +116 -0
- ksadk/evaluation/a2a_adapter.py +452 -0
- ksadk/evaluation/adapters.py +67 -0
- ksadk/evaluation/agent_eval_client.py +395 -0
- ksadk/evaluation/cloud_binding.py +80 -0
- ksadk/evaluation/cloud_converter.py +194 -0
- ksadk/evaluation/cloud_service.py +199 -0
- ksadk/evaluation/contracts.py +478 -0
- ksadk/evaluation/evalset.py +351 -0
- ksadk/evaluation/evaluators.py +627 -0
- ksadk/evaluation/evidence.py +258 -0
- ksadk/evaluation/executor.py +143 -0
- ksadk/evaluation/local_adapter.py +550 -0
- ksadk/evaluation/service_env.py +27 -0
- ksadk/evaluation/storage.py +68 -0
- ksadk/evaluation/studio_build_adapter.py +253 -0
- ksadk/evaluation/target.py +82 -0
- ksadk/events/__init__.py +13 -13
- ksadk/events/_v1_compat/__init__.py +1 -0
- ksadk/events/_v1_compat/models.py +299 -0
- ksadk/events/_v1_compat/parser.py +247 -0
- ksadk/events/_v1_compat/projection.py +753 -0
- ksadk/events/adapters/__init__.py +34 -0
- ksadk/events/adapters/_a2a_snapshot.py +622 -0
- ksadk/events/adapters/_a2a_support.py +275 -0
- ksadk/events/adapters/_codex_interactions.py +375 -0
- ksadk/events/adapters/_codex_items.py +801 -0
- ksadk/events/adapters/_codex_validators.py +311 -0
- ksadk/events/adapters/_langgraph_support.py +785 -0
- ksadk/events/adapters/a2a.py +841 -0
- ksadk/events/adapters/adk.py +503 -0
- ksadk/events/adapters/codex.py +717 -0
- ksadk/events/adapters/langgraph.py +745 -0
- ksadk/events/canonical.py +440 -0
- ksadk/events/canonical_replay.py +497 -0
- ksadk/events/canonical_store.py +468 -0
- ksadk/events/cold_recovery.py +257 -0
- ksadk/events/content.py +89 -0
- ksadk/events/identity.py +86 -0
- ksadk/events/pipeline.py +455 -0
- ksadk/events/projections.py +66 -0
- ksadk/events/reducer.py +661 -0
- ksadk/events/replay.py +3 -36
- ksadk/events/runtime_event.py +20 -256
- ksadk/events/session_event.py +324 -0
- ksadk/events/store.py +3 -316
- ksadk/events/v1_compat.py +41 -0
- ksadk/harness/__init__.py +3 -2
- ksadk/harness/app.py +114 -123
- ksadk/harness/config.py +1 -1
- ksadk/harness/runtime.py +467 -0
- ksadk/hermes_terminal.py +5 -0
- ksadk/identity/resolver.py +4 -3
- ksadk/interaction/__init__.py +28 -0
- ksadk/interaction/contracts.py +136 -0
- ksadk/interaction/ledger.py +189 -0
- ksadk/interaction/provider.py +122 -0
- ksadk/interaction/providers/__init__.py +52 -0
- ksadk/interaction/providers/adk.py +40 -0
- ksadk/interaction/providers/codex.py +94 -0
- ksadk/interaction/providers/langgraph.py +58 -0
- ksadk/kernel/__init__.py +117 -0
- ksadk/kernel/authorization.py +258 -0
- ksadk/kernel/bootstrap.py +1074 -0
- ksadk/kernel/contract_fingerprints.py +61 -0
- ksadk/kernel/contracts.py +362 -0
- ksadk/kernel/control.py +219 -0
- ksadk/kernel/errors.py +79 -0
- ksadk/kernel/ingress.py +1102 -0
- ksadk/kernel/mapping.py +111 -0
- ksadk/kernel/memory_store.py +1133 -0
- ksadk/kernel/postgres_store.py +1756 -0
- ksadk/kernel/recovery.py +452 -0
- ksadk/kernel/runtime_identity.py +103 -0
- ksadk/kernel/sql/001_agent_kernel.sql +120 -0
- ksadk/kernel/sqlite_store.py +1410 -0
- ksadk/kernel/state.py +145 -0
- ksadk/kernel/store.py +232 -0
- ksadk/kernel/worker.py +953 -0
- ksadk/knowledge_base/client.py +22 -4
- ksadk/knowledge_base/service.py +32 -5
- ksadk/managed_a2a_card.py +160 -0
- ksadk/managed_runtime.py +16 -9
- ksadk/memory/__init__.py +61 -0
- ksadk/memory/adk/backends/base_ltm_backend.py +96 -1
- ksadk/memory/adk/backends/http_ltm_backend.py +14 -5
- ksadk/memory/adk/backends/inmemory_ltm_backend.py +136 -3
- ksadk/memory/adk/backends/sdk_ltm_backend.py +394 -5
- ksadk/memory/adk/backends/sqlite_ltm_backend.py +95 -0
- ksadk/memory/adk/long_term_memory.py +3 -2
- ksadk/memory/coordinator.py +461 -0
- ksadk/memory/events.py +202 -0
- ksadk/memory/extraction.py +228 -0
- ksadk/memory/ltm_backend_factory.py +16 -3
- ksadk/memory/models.py +316 -0
- ksadk/memory/policy.py +215 -0
- ksadk/memory/provider.py +47 -0
- ksadk/memory/provider_adapter.py +159 -0
- ksadk/memory/provider_resolver.py +71 -0
- ksadk/memory/providers/__init__.py +5 -0
- ksadk/memory/providers/local_sqlite.py +490 -0
- ksadk/memory/resolved_policy.py +145 -0
- ksadk/memory/service.py +198 -8
- ksadk/memory/tool.py +4 -0
- ksadk/model_proxy/bootstrap.py +16 -9
- ksadk/model_proxy/config.py +22 -1
- ksadk/model_proxy/detect.py +202 -9
- ksadk/model_proxy/namespace.py +67 -15
- ksadk/model_proxy/server.py +168 -6
- ksadk/model_proxy/transform.py +105 -3
- ksadk/observability/__init__.py +25 -0
- ksadk/observability/session_log.py +420 -0
- ksadk/observability/trajectory.py +105 -0
- ksadk/prompts/__init__.py +71 -0
- ksadk/prompts/compiler.py +215 -0
- ksadk/prompts/models.py +82 -0
- ksadk/prompts/projection.py +89 -0
- ksadk/prompts/resolved.py +137 -0
- ksadk/prompts/sources.py +233 -0
- ksadk/runners/_langgraph_runner_streams.py +822 -0
- ksadk/runners/adk_runner.py +14 -31
- ksadk/runners/base_runner.py +44 -3
- ksadk/runners/factory.py +3 -3
- ksadk/runners/langgraph_runner.py +252 -433
- ksadk/runners/utils/__init__.py +0 -10
- ksadk/runners/utils/loader.py +16 -0
- ksadk/runtime/__init__.py +67 -41
- ksadk/runtime/_runner_adapter/__init__.py +1 -0
- ksadk/runtime/_runner_adapter/stream_mapping.py +788 -0
- ksadk/runtime/adapter.py +199 -16
- ksadk/runtime/conversation_execution.py +687 -0
- ksadk/runtime/executor.py +392 -0
- ksadk/runtime/factory.py +342 -0
- ksadk/runtime/framework_adapters.py +6 -12
- ksadk/runtime/hosted_finalizer.py +268 -0
- ksadk/runtime/launch.py +61 -0
- ksadk/runtime/preprocessing.py +49 -14
- ksadk/runtime/runner_adapter.py +330 -391
- ksadk/runtime/runner_loading.py +36 -0
- ksadk/runtime/usage.py +33 -0
- ksadk/sandbox/backends/e2b.py +36 -3
- ksadk/server/__init__.py +39 -4
- ksadk/server/app.py +18 -492
- ksadk/server/composition.py +36 -2
- ksadk/server/factory.py +210 -149
- ksadk/server/routes/common.py +15 -46
- ksadk/server/routes/control.py +13 -9
- ksadk/server/routes/kernel_ingress.py +258 -0
- ksadk/server/routes/misc.py +10 -33
- ksadk/server/routes/models.py +14 -6
- ksadk/server/routes/openai_compat.py +129 -27
- ksadk/server/routes/projection.py +84 -16
- ksadk/server/routes/run.py +347 -460
- ksadk/server/routes/sessions.py +37 -40
- ksadk/server/routes/streaming.py +52 -7
- ksadk/server/routes/workspace.py +54 -21
- ksadk/server/static/assets/{ArtifactsPanel-Cjnqt-8W.js → ArtifactsPanel-DSU1sWD_.js} +1 -1
- ksadk/server/static/assets/{CodeBlock-BqyqZfuB.js → CodeBlock-DOH6MVcn.js} +4 -4
- ksadk/server/static/assets/{MathMessageMarkdown-BpH7jiFM.js → MathMessageMarkdown-BL8my1R2.js} +4 -4
- ksadk/server/static/assets/MathMessageMarkdown-BorAY7qD.css +1 -0
- ksadk/server/static/assets/MermaidBlock-Dz4IP-Tx.js +312 -0
- ksadk/server/static/assets/NativeTerminalPanel-DUrK0JpZ.js +1 -0
- ksadk/server/static/assets/abnfDiagram-VCTEODGH-g20pFzNV.js +1 -0
- ksadk/server/static/assets/arc-C4FzinUA.js +1 -0
- ksadk/server/static/assets/architecture-7GRP2DOG-DjKratdf.js +1 -0
- ksadk/server/static/assets/architectureDiagram-5GKGNRK7-DpIqL5h4.js +36 -0
- ksadk/server/static/assets/blockDiagram-NRAW4CY4-BjkljTNz.js +129 -0
- ksadk/server/static/assets/c4Diagram-UCG6FXSJ-Dk_ieq2X.js +38 -0
- ksadk/server/static/assets/channel-4cQHKtx1.js +1 -0
- ksadk/server/static/assets/chunk-2Q5K7J3B-DmgWkESh.js +1 -0
- ksadk/server/static/assets/{chunk-FMBD7UC4-BGhvzDYt.js → chunk-5VM5RSS4-BVHAchFb.js} +1 -1
- ksadk/server/static/assets/{chunk-ND2GUHAM-D98vPd-E.js → chunk-F27PBJKO-C-ipQzuS.js} +1 -1
- ksadk/server/static/assets/chunk-G27WJ6UU-C2EyJbIK.js +231 -0
- ksadk/server/static/assets/{chunk-4BX2VUAB-CsWIQRhc.js → chunk-JWPE2WC7-vYvVJb_M.js} +1 -1
- ksadk/server/static/assets/chunk-LCL6LL3I-BcI6ysPT.js +206 -0
- ksadk/server/static/assets/chunk-POPQ4Y6H-C030x_Z1.js +1 -0
- ksadk/server/static/assets/chunk-RHFEMEQ7-yyGpsz4n.js +168 -0
- ksadk/server/static/assets/chunk-SVP7TREG-BLTlmMU7.js +88 -0
- ksadk/server/static/assets/chunk-XXDRQBXY-C_32ArgP.js +1 -0
- ksadk/server/static/assets/classDiagram-DTDB5LWJ-DLFd9Xi0.js +1 -0
- ksadk/server/static/assets/classDiagram-v2-JRS7N3AN-DLFd9Xi0.js +1 -0
- ksadk/server/static/assets/{cose-bilkent-S5V4N54A-CX3yotHq.js → cose-bilkent-JH36ORCC-9YQYwdl0.js} +1 -1
- ksadk/server/static/assets/cynefin-OW5HDTMX-DjEM48Qp.js +1 -0
- ksadk/server/static/assets/cynefinDiagram-5FMLGOSQ-ErLF5N13.js +62 -0
- ksadk/server/static/assets/cytoscape.esm-CyCl8rPi.js +321 -0
- ksadk/server/static/assets/dagre-3AP2YEHR-DFiQF-6f.js +4 -0
- ksadk/server/static/assets/dagre-BuhGnRI1.js +1 -0
- ksadk/server/static/assets/diagram-S7CK7UJ4-Bt1v8-GC.js +30 -0
- ksadk/server/static/assets/diagram-UQ7AKVKN-DSCxJdBK.js +41 -0
- ksadk/server/static/assets/diagram-VSXAHHWV-DHfYwp_9.js +3 -0
- ksadk/server/static/assets/diagram-VX7I27RA-DdzD-4Le.js +24 -0
- ksadk/server/static/assets/diagram-Z3DM3KII-Du-nAJ9F.js +24 -0
- ksadk/server/static/assets/{dist-D82mtD2s.js → dist-8hqcx0sU.js} +1 -1
- ksadk/server/static/assets/dist-B7seoj3d.js +1 -0
- ksadk/server/static/assets/{dist-DHn6nBzr.js → dist-BE7bu-DL.js} +1 -1
- ksadk/server/static/assets/{dist-eoW6tZXA.js → dist-BVDffZ0U.js} +1 -1
- ksadk/server/static/assets/{dist-C2xjE7cO.js → dist-BX8z72IC.js} +1 -1
- ksadk/server/static/assets/{dist-CgF3fj15.js → dist-Bf2M8m3N.js} +1 -1
- ksadk/server/static/assets/{dist-Bs-jQcRX.js → dist-BjU6y-A2.js} +1 -1
- ksadk/server/static/assets/{dist-Djgl2wVZ.js → dist-BytlxIDT.js} +1 -1
- ksadk/server/static/assets/{dist-CVQRZjPu.js → dist-CSh_DE14.js} +1 -1
- ksadk/server/static/assets/{dist-6CVKuTAe.js → dist-CXYYBw3_.js} +1 -1
- ksadk/server/static/assets/{dist-DlzCRy0S.js → dist-C_wsv-Qd.js} +1 -1
- ksadk/server/static/assets/{dist-DF06ORQo.js → dist-ClxGviKw.js} +1 -1
- ksadk/server/static/assets/{dist-Cf23NY4L.js → dist-CttYUqzS.js} +1 -1
- ksadk/server/static/assets/{dist-ivOya1LD.js → dist-DNp6rLRA.js} +1 -1
- ksadk/server/static/assets/{dist-BibcG1V9.js → dist-DUX-id_F.js} +1 -1
- ksadk/server/static/assets/{dist-BUHRxvDG.js → dist-DmldrHd_.js} +1 -1
- ksadk/server/static/assets/{dist-BZ9n9AjO.js → dist-DnfXs8Vn.js} +2 -2
- ksadk/server/static/assets/{dist-DqNnNFrw.js → dist-Dq9gLD7L.js} +1 -1
- ksadk/server/static/assets/{dist-CGcp2ex8.js → dist-W-TIVntx.js} +1 -1
- ksadk/server/static/assets/{dist-Cwt7koer.js → dist-dDdADKFA.js} +1 -1
- ksadk/server/static/assets/{dist-C7-3jInC.js → dist-dydu68Fl.js} +1 -1
- ksadk/server/static/assets/{dist-C99THtIA.js → dist-ngtN0DJB.js} +1 -1
- ksadk/server/static/assets/ebnfDiagram-PWID7BFC-Da9C9NO1.js +1 -0
- ksadk/server/static/assets/erDiagram-SSCWMZ5O-EAGqqR79.js +99 -0
- ksadk/server/static/assets/eventmodeling-NTZA5JFV-CMgMaJrC.js +1 -0
- ksadk/server/static/assets/flowDiagram-A5DVABFB-BBKL0x3P.js +1 -0
- ksadk/server/static/assets/ganttDiagram-EL5Y4UJY-DqJsKb59.js +292 -0
- ksadk/server/static/assets/gitGraph-4MIJSDKK-Dw63mrhw.js +1 -0
- ksadk/server/static/assets/gitGraphDiagram-WWUBYQGX-B6g4dtDi.js +106 -0
- ksadk/server/static/assets/index-8ipRcQ-M.js +240 -0
- ksadk/server/static/assets/index-ByFCqjlh.css +2 -0
- ksadk/server/static/assets/info-A6RAGUB7-B6iAblII.js +1 -0
- ksadk/server/static/assets/infoDiagram-RXCK75RN-Djm_nbd5.js +2 -0
- ksadk/server/static/assets/{ishikawaDiagram-YF4QCWOH-DLOHGvWw.js → ishikawaDiagram-5VMMS53U-DWya9SG2.js} +6 -6
- ksadk/server/static/assets/{journeyDiagram-JHISSGLW-BIzKeejT.js → journeyDiagram-EYS64GPL-DutxhSNI.js} +6 -6
- ksadk/server/static/assets/{kanban-definition-UN3LZRKU-BWHoFSw2.js → kanban-definition-3QL26DDD-DJdOF8Fm.js} +10 -10
- ksadk/server/static/assets/katex-vFWytM5c.js +257 -0
- ksadk/server/static/assets/{linear-CvMBw9cA.js → linear-BHjG8b-J.js} +1 -1
- ksadk/server/static/assets/mermaid-parser.core-KGSy4jWT.js +166 -0
- ksadk/server/static/assets/{mindmap-definition-RKZ34NQL-CSAQxEAe.js → mindmap-definition-FBJOCRG2-9-HC88D4.js} +29 -29
- ksadk/server/static/assets/packet-AYTQ26CC-BOYAipuq.js +1 -0
- ksadk/server/static/assets/pegDiagram-XKGWAZYB-DrEZd4fD.js +1 -0
- ksadk/server/static/assets/pie-WAS4IAKB-Ctq0Kbku.js +1 -0
- ksadk/server/static/assets/pieDiagram-E7YTZNPT-DpjqOFFp.js +39 -0
- ksadk/server/static/assets/{quadrantDiagram-W4KKPZXB-CxIR4JXI.js → quadrantDiagram-AXDQQJYC-BiNhgOXX.js} +6 -6
- ksadk/server/static/assets/radar-RG4KPBEZ-DN0-ul_0.js +1 -0
- ksadk/server/static/assets/railroad-74A4TZTK-C6cC_to0.js +1 -0
- ksadk/server/static/assets/railroad-abnf-HS5TGJTU-BimjIuRc.js +1 -0
- ksadk/server/static/assets/railroad-ebnf-LZEXJU2U-CvY65ABq.js +1 -0
- ksadk/server/static/assets/railroad-peg-WCYAUIDC-D72Iq_Tv.js +1 -0
- ksadk/server/static/assets/railroadDiagram-O6MQD6OU-_Y3Ojg6G.js +1 -0
- ksadk/server/static/assets/requirementDiagram-EFPCY7ZU-DeCFdg9K.js +84 -0
- ksadk/server/static/assets/{sankeyDiagram-5OEKKPKP-DpGa6EAV.js → sankeyDiagram-P5KCCOFB-CPH75rhw.js} +7 -7
- ksadk/server/static/assets/{sequenceDiagram-3UESZ5HK-NTKNGGe5.js → sequenceDiagram-WJ2MYXX4-OEpQQdr4.js} +10 -10
- ksadk/server/static/assets/sizeCapture-X5ZJPWSS-heUErzhI.js +1 -0
- ksadk/server/static/assets/stateDiagram-HBIQ2CUA-DvA3jSMB.js +1 -0
- ksadk/server/static/assets/stateDiagram-v2-4QOOHH4V-BgQY03nz.js +1 -0
- ksadk/server/static/assets/swimlanes-XN3QIQJK-CR-dfN_t.js +1 -0
- ksadk/server/static/assets/swimlanesDiagram-VK2B7HYN-DLVw3q5Q.js +8 -0
- ksadk/server/static/assets/{timeline-definition-PNZ67QCA-jqoYs3jQ.js → timeline-definition-24CTP7MA-DAVJf1TX.js} +7 -7
- ksadk/server/static/assets/treeView-Q6P3EWNA-BMpO0wsB.js +1 -0
- ksadk/server/static/assets/treemap-WGGIJYW6-Et0aqzU3.js +1 -0
- ksadk/server/static/assets/vennDiagram-4TSXK5OY-DwM8eDkh.js +34 -0
- ksadk/server/static/assets/wardley-WFR3VGLG-CbY0mhpl.js +1 -0
- ksadk/server/static/assets/wardleyDiagram-VM6X3IG4-DZL-Zz2t.js +78 -0
- ksadk/server/static/assets/xychartDiagram-S5SC5T6Z-Dy6Yh_hu.js +7 -0
- ksadk/server/static/index.html +2 -2
- ksadk/sessions/__init__.py +26 -9
- ksadk/sessions/_local_service_sync.py +688 -0
- ksadk/sessions/_local_tables.py +21 -0
- ksadk/sessions/_postgres_schema.py +305 -0
- ksadk/sessions/_postgres_tables.py +15 -0
- ksadk/sessions/base.py +80 -1
- ksadk/sessions/in_memory.py +53 -2
- ksadk/sessions/local_service.py +63 -604
- ksadk/sessions/postgres_service.py +58 -148
- ksadk/sessions/resilient.py +35 -1
- ksadk/skills/runtime/backends/e2b.py +1 -1
- ksadk/skills/service_client.py +13 -3
- ksadk/studio/__init__.py +5 -0
- ksadk/studio/agent_avatar_assets.py +120 -0
- ksadk/studio/agent_lifecycle.py +51 -0
- ksadk/studio/api.py +1598 -0
- ksadk/studio/api_catalog_routes.py +324 -0
- ksadk/studio/api_contracts.py +286 -0
- ksadk/studio/api_helpers.py +132 -0
- ksadk/studio/api_memory_routes.py +82 -0
- ksadk/studio/authoring.py +749 -0
- ksadk/studio/authoring_coordinator.py +1017 -0
- ksadk/studio/builder.py +397 -0
- ksadk/studio/capabilities.py +368 -0
- ksadk/studio/cloud.py +2099 -0
- ksadk/studio/codex_agent_service.py +694 -0
- ksadk/studio/codex_authoring.py +469 -0
- ksadk/studio/codex_builder.py +437 -0
- ksadk/studio/codex_manifest.py +307 -0
- ksadk/studio/codex_run.py +395 -0
- ksadk/studio/compiler.py +190 -0
- ksadk/studio/contracts.py +755 -0
- ksadk/studio/errors.py +47 -0
- ksadk/studio/event_store.py +214 -0
- ksadk/studio/framework_run.py +342 -0
- ksadk/studio/hosted_kernel.py +317 -0
- ksadk/studio/identifiers.py +33 -0
- ksadk/studio/manifest_resolver.py +131 -0
- ksadk/studio/mcp_runtime.py +229 -0
- ksadk/studio/model_client.py +629 -0
- ksadk/studio/model_profile_service.py +214 -0
- ksadk/studio/operations.py +275 -0
- ksadk/studio/otel_trace.py +1060 -0
- ksadk/studio/pagination.py +182 -0
- ksadk/studio/pcm_memory.py +85 -0
- ksadk/studio/python_tool_inspection.py +183 -0
- ksadk/studio/repository.py +327 -0
- ksadk/studio/resource_catalog.py +1260 -0
- ksadk/studio/run_service.py +1133 -0
- ksadk/studio/runtime_catalog.py +74 -0
- ksadk/studio/runtime_source.py +365 -0
- ksadk/studio/service.py +2249 -0
- ksadk/studio/shared_web.py +1004 -0
- ksadk/studio/skill_discovery.py +628 -0
- ksadk/studio/static/assets/PrismRenderer-IYN-ffww.js +3 -0
- ksadk/studio/static/assets/index-BLpcdrgW.css +1 -0
- ksadk/studio/static/assets/index-CYekR2Xv.js +260 -0
- ksadk/studio/static/assets/react-vendor-BNmTiJ-I.js +9 -0
- ksadk/studio/static/assets/rolldown-runtime-hePW80VL.js +1 -0
- ksadk/studio/static/index.html +15 -0
- ksadk/studio/templates.py +722 -0
- ksadk/studio/validator.py +265 -0
- ksadk/studio/workspace.py +135 -0
- ksadk/tools/gateway.py +9 -0
- ksadk/toolsets/__init__.py +27 -1
- ksadk/toolsets/a2a.py +426 -0
- ksadk/tracing/__init__.py +19 -21
- ksadk/tracing/setup.py +317 -403
- ksadk/tracing/span_utils.py +0 -44
- ksadk/version.py +1 -1
- ksadk_runtime_common/memory_backend/registry.py +56 -56
- ksadk_runtime_common/schemas/runtime_event_v1.json +37 -0
- ksadk_runtime_common/schemas/runtime_event_v2.json +271 -0
- ksadk_runtime_common/workspace_files/router.py +8 -2
- agentengine_sdk_python-0.8.0.dist-info/RECORD +0 -578
- ksadk/a2a/card_builder.py +0 -64
- ksadk/a2a/client.py +0 -309
- ksadk/events/parser.py +0 -191
- ksadk/harness/runner.py +0 -211
- ksadk/runners/codex_runner.py +0 -132
- ksadk/runners/utils/langfuse.py +0 -230
- ksadk/server/static/assets/MathMessageMarkdown-DeYh8QPr.css +0 -1
- ksadk/server/static/assets/MermaidBlock-DWuxETaJ.js +0 -303
- ksadk/server/static/assets/NativeTerminalPanel-MDTopWMO.js +0 -1
- ksadk/server/static/assets/arc-CFKwSk_B.js +0 -1
- ksadk/server/static/assets/architecture-7EHR7CIX-CynqOWjZ.js +0 -1
- ksadk/server/static/assets/architectureDiagram-3BPJPVTR-Dej8jX8c.js +0 -36
- ksadk/server/static/assets/blockDiagram-GPEHLZMM-1F64jqvy.js +0 -132
- ksadk/server/static/assets/c4Diagram-AAUBKEIU-9q7AUAKb.js +0 -10
- ksadk/server/static/assets/channel-iUGv2N24.js +0 -1
- ksadk/server/static/assets/chunk-2J33WTMH-6qgwJm7Q.js +0 -1
- ksadk/server/static/assets/chunk-55IACEB6-BK8paA20.js +0 -1
- ksadk/server/static/assets/chunk-727SXJPM-B-JEhy7h.js +0 -206
- ksadk/server/static/assets/chunk-AQP2D5EJ-DYBvMHAa.js +0 -231
- ksadk/server/static/assets/chunk-QZHKN3VN-YQIEXeF6.js +0 -1
- ksadk/server/static/assets/classDiagram-4FO5ZUOK-CDAUuoXK.js +0 -1
- ksadk/server/static/assets/classDiagram-v2-Q7XG4LA2-CDAUuoXK.js +0 -1
- ksadk/server/static/assets/cytoscape.esm-DelgaX4f.js +0 -321
- ksadk/server/static/assets/dagre-BM42HDAG-C7TguAWo.js +0 -4
- ksadk/server/static/assets/dagre-Bx709z4p.js +0 -1
- ksadk/server/static/assets/diagram-2AECGRRQ-Dd17_kws.js +0 -43
- ksadk/server/static/assets/diagram-5GNKFQAL-DVIClIil.js +0 -10
- ksadk/server/static/assets/diagram-KO2AKTUF-Df_3gYQa.js +0 -3
- ksadk/server/static/assets/diagram-LMA3HP47-BhLk6ZtA.js +0 -24
- ksadk/server/static/assets/diagram-OG6HWLK6-D4GNGvuu.js +0 -24
- ksadk/server/static/assets/dist-DyvYLMW9.js +0 -1
- ksadk/server/static/assets/erDiagram-TEJ5UH35-CnfRcY2M.js +0 -85
- ksadk/server/static/assets/eventmodeling-FCH6USID-ChYO-ijM.js +0 -1
- ksadk/server/static/assets/flowDiagram-I6XJVG4X-DGaJjGNJ.js +0 -162
- ksadk/server/static/assets/ganttDiagram-6RSMTGT7-DpCoB2g9.js +0 -292
- ksadk/server/static/assets/gitGraph-WXDBUCRP-BN_0Fk-j.js +0 -1
- ksadk/server/static/assets/gitGraphDiagram-PVQCEYII-9IKVFBVT.js +0 -106
- ksadk/server/static/assets/graphlib-B8gBHxth.js +0 -1
- ksadk/server/static/assets/index-QSwCHuB8.js +0 -177
- ksadk/server/static/assets/index-jOPmTOZH.css +0 -2
- ksadk/server/static/assets/info-J43DQDTF-Cp6o3vId.js +0 -1
- ksadk/server/static/assets/infoDiagram-5YYISTIA-CYIIsb8y.js +0 -2
- ksadk/server/static/assets/katex-DATssjp1.js +0 -265
- ksadk/server/static/assets/mermaid-parser.core-mGAcEwcq.js +0 -161
- ksadk/server/static/assets/packet-YPE3B663-wQzct3cT.js +0 -1
- ksadk/server/static/assets/pie-LRSECV5Y-BgTQiv-9.js +0 -1
- ksadk/server/static/assets/pieDiagram-4H26LBE5-By-ra07M.js +0 -30
- ksadk/server/static/assets/radar-GUYGQ44K-BIq5fXsn.js +0 -1
- ksadk/server/static/assets/requirementDiagram-4Y6WPE33-DpW90iu3.js +0 -84
- ksadk/server/static/assets/stateDiagram-AJRCARHV-DGpd9yFG.js +0 -1
- ksadk/server/static/assets/stateDiagram-v2-BHNVJYJU-B3o579IQ.js +0 -1
- ksadk/server/static/assets/treeView-BLDUP644-Dqi-E0EM.js +0 -1
- ksadk/server/static/assets/treemap-LRROVOQU-ClQP9CJ9.js +0 -1
- ksadk/server/static/assets/vennDiagram-CIIHVFJN-l3Z7-wbP.js +0 -34
- ksadk/server/static/assets/wardley-L42UT6IY-8XLvnNIs.js +0 -1
- ksadk/server/static/assets/wardleyDiagram-YWT4CUSO-BR54GPmr.js +0 -78
- ksadk/server/static/assets/xychartDiagram-2RQKCTM6-SkiH8GsK.js +0 -7
- ksadk/tracing/exporters/langfuse_exporter.py +0 -460
- {agentengine_sdk_python-0.8.0.dist-info → agentengine_sdk_python-0.8.2.dist-info}/entry_points.txt +0 -0
- {agentengine_sdk_python-0.8.0.dist-info → agentengine_sdk_python-0.8.2.dist-info}/licenses/LICENSE +0 -0
- {agentengine_sdk_python-0.8.0.dist-info → agentengine_sdk_python-0.8.2.dist-info}/top_level.txt +0 -0
ksadk/a2a/executor.py
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
"""A2ARuntimeExecutor — 把
|
|
1
|
+
"""A2ARuntimeExecutor — 把 RuntimeAdapter 桥接进 A2A 请求生命周期。
|
|
2
2
|
|
|
3
3
|
契约 §7.2:A2A ``context_id`` ↔ Runtime ``session_id``;``canceled`` ↔
|
|
4
4
|
``RuntimeAdapter.cancel(invocation_id)``。executor 不在此自造 cancel,而是委托
|
|
@@ -23,7 +23,18 @@ from a2a.types import Part, Task, TaskState, TaskStatus
|
|
|
23
23
|
from a2a.utils.errors import TaskNotCancelableError
|
|
24
24
|
|
|
25
25
|
from ksadk.a2a.resume_store import A2AResumePayloadKind
|
|
26
|
-
from ksadk.events import
|
|
26
|
+
from ksadk.events.canonical import (
|
|
27
|
+
ContinuationCreated,
|
|
28
|
+
EventEnvelope,
|
|
29
|
+
InteractionRequested,
|
|
30
|
+
ItemCompleted,
|
|
31
|
+
ItemUpdated,
|
|
32
|
+
RunCanceled,
|
|
33
|
+
RunFailed,
|
|
34
|
+
RunInterrupted,
|
|
35
|
+
RuntimeEvent,
|
|
36
|
+
)
|
|
37
|
+
from ksadk.events.content import TextContent
|
|
27
38
|
from ksadk.runtime import CancelResult, RunHandle
|
|
28
39
|
|
|
29
40
|
logger = logging.getLogger(__name__)
|
|
@@ -136,31 +147,52 @@ async def _enqueue_initial_task(context: RequestContext, event_queue: EventQueue
|
|
|
136
147
|
|
|
137
148
|
|
|
138
149
|
class _InputRequired(Exception):
|
|
139
|
-
"""
|
|
150
|
+
"""Runtime 请求用户输入的信号(内部用于跳出 execute,task 停 input-required)。"""
|
|
140
151
|
|
|
141
152
|
|
|
142
153
|
class _RunCanceled(Exception):
|
|
143
154
|
"""Runtime 已取消本次执行,executor 不得再发 completed。"""
|
|
144
155
|
|
|
145
156
|
|
|
157
|
+
def _require_resume_capability(task_adapter: Any) -> None:
|
|
158
|
+
"""当 runtime adapter 显式声明 typed capability matrix 时,校验 resume 是否 supported。
|
|
159
|
+
|
|
160
|
+
只有 adapter **覆写**了 ``capabilities()`` 才执行强校验(声明 unsupported 必须
|
|
161
|
+
fail-closed);沿用基类默认矩阵的旧版/第三方 adapter 不受影响,避免把
|
|
162
|
+
"未迁移到 v1 matrix" 误判为 "声明不支持"。
|
|
163
|
+
"""
|
|
164
|
+
|
|
165
|
+
from ksadk.runtime.adapter import RuntimeAdapter
|
|
166
|
+
|
|
167
|
+
runtime_adapter = getattr(task_adapter, "runtime_adapter", None)
|
|
168
|
+
declared = getattr(type(runtime_adapter), "capabilities", None)
|
|
169
|
+
if declared is None or declared is RuntimeAdapter.capabilities:
|
|
170
|
+
return
|
|
171
|
+
matrix = declared(runtime_adapter)
|
|
172
|
+
if not matrix.resume.supported:
|
|
173
|
+
from ksadk.kernel.errors import UnsupportedControlError
|
|
174
|
+
|
|
175
|
+
raise UnsupportedControlError(
|
|
176
|
+
"runtime capability matrix declares resume unsupported: "
|
|
177
|
+
f"{matrix.resume.reason}"
|
|
178
|
+
)
|
|
179
|
+
|
|
180
|
+
|
|
146
181
|
class A2ARuntimeExecutor(AgentExecutor):
|
|
147
|
-
"""在 A2A 请求生命周期内执行
|
|
182
|
+
"""在 A2A 请求生命周期内执行 RuntimeAdapter。
|
|
148
183
|
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
- cancel: 委托 ``task_adapter.cancel_task``(内部走 RuntimeAdapter.cancel)。
|
|
184
|
+
start/stream/resume/cancel 全部委托 ``A2ARuntimeTaskAdapter``;协议层不再
|
|
185
|
+
保留 Runner fallback,因此所有入口共享同一 RuntimeEvent 合同。
|
|
152
186
|
"""
|
|
153
187
|
|
|
154
188
|
def __init__(
|
|
155
189
|
self,
|
|
156
|
-
|
|
157
|
-
task_adapter: Any = None,
|
|
158
|
-
prefer_stream: bool = True,
|
|
190
|
+
task_adapter: Any,
|
|
159
191
|
include_reasoning: bool = False,
|
|
160
192
|
) -> None:
|
|
161
|
-
|
|
193
|
+
if task_adapter is None:
|
|
194
|
+
raise TypeError("task_adapter is required")
|
|
162
195
|
self.task_adapter = task_adapter
|
|
163
|
-
self.prefer_stream = prefer_stream
|
|
164
196
|
self.include_reasoning = include_reasoning
|
|
165
197
|
|
|
166
198
|
async def execute(self, context: RequestContext, event_queue: EventQueue) -> None:
|
|
@@ -178,14 +210,19 @@ class A2ARuntimeExecutor(AgentExecutor):
|
|
|
178
210
|
and getattr(getattr(current_task, "status", None), "state", None)
|
|
179
211
|
== TaskState.TASK_STATE_INPUT_REQUIRED
|
|
180
212
|
)
|
|
213
|
+
from ksadk.kernel.ingress import kernel_route_active
|
|
214
|
+
|
|
215
|
+
if kernel_route_active() and not is_resume:
|
|
216
|
+
await self._kernel_execute(context, updater)
|
|
217
|
+
return
|
|
218
|
+
|
|
181
219
|
interaction_response: Any = None
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
if is_resume and self.task_adapter is not None:
|
|
220
|
+
# Third-party/local adapters written before durable context mapping do not
|
|
221
|
+
# necessarily provide this optional lifecycle hook.
|
|
222
|
+
prepare_context = getattr(self.task_adapter, "prepare_context", None)
|
|
223
|
+
if callable(prepare_context):
|
|
224
|
+
await prepare_context(context)
|
|
225
|
+
if is_resume:
|
|
189
226
|
interaction_response = self.task_adapter.answer_from_context(context)
|
|
190
227
|
# Invalid resume tokens/decisions are request errors. Validate before emitting
|
|
191
228
|
# working so the durable Task remains input-required and retryable.
|
|
@@ -194,6 +231,9 @@ class A2ARuntimeExecutor(AgentExecutor):
|
|
|
194
231
|
context,
|
|
195
232
|
answer=interaction_response,
|
|
196
233
|
)
|
|
234
|
+
# 诚实 capability:runtime 声明 resume unsupported 时 fail-closed,
|
|
235
|
+
# 不允许协议层吞掉 matrix 并假装续跑成功。
|
|
236
|
+
_require_resume_capability(self.task_adapter)
|
|
197
237
|
|
|
198
238
|
handle: RunHandle | None = None
|
|
199
239
|
try:
|
|
@@ -206,25 +246,20 @@ class A2ARuntimeExecutor(AgentExecutor):
|
|
|
206
246
|
TaskState.TASK_STATE_WORKING,
|
|
207
247
|
metadata=dict(ADK_V2_INTEGRATION_METADATA),
|
|
208
248
|
)
|
|
209
|
-
runner_input = self._build_runner_input(context)
|
|
210
249
|
if is_resume:
|
|
211
|
-
if self.task_adapter is None:
|
|
212
|
-
raise RuntimeError("runtime task adapter is required to resume A2A task")
|
|
213
250
|
handle = await self.task_adapter.resume_task(
|
|
214
251
|
context.task_id or "",
|
|
215
252
|
context,
|
|
216
253
|
answer=interaction_response,
|
|
217
254
|
)
|
|
218
255
|
output = await self._run_runtime(context, updater, handle)
|
|
219
|
-
|
|
256
|
+
else:
|
|
220
257
|
handle = await self.task_adapter.start_task(
|
|
221
258
|
task_id=str(context.task_id or ""),
|
|
222
259
|
context=context,
|
|
223
|
-
input_data=
|
|
260
|
+
input_data=context.get_user_input(),
|
|
224
261
|
)
|
|
225
262
|
output = await self._run_runtime(context, updater, handle)
|
|
226
|
-
else:
|
|
227
|
-
output = await self._run_runner(context, updater, runner_input)
|
|
228
263
|
# completed 携带全文消息:非流式消费端与 text.completed 投影(§ event_adapter
|
|
229
264
|
# message_to_event final)依赖它拿最终结果;流式消费端的重复由 adk_runner
|
|
230
265
|
# 在 handoff 分支对"增量累积"去重解决(不在此处删消息)。
|
|
@@ -246,6 +281,70 @@ class A2ARuntimeExecutor(AgentExecutor):
|
|
|
246
281
|
)
|
|
247
282
|
await self._forget_task(context, handle)
|
|
248
283
|
|
|
284
|
+
async def _kernel_execute(self, context: RequestContext, updater: TaskUpdater) -> None:
|
|
285
|
+
"""kernel 路径(灰度 opt-in):A2A task -> AgentControlCommand -> receipt。
|
|
286
|
+
|
|
287
|
+
mutation 只走 kernel.submit;A2A task 事件 shape 保留,cursor 源自同一
|
|
288
|
+
Session seq(SessionEventSubscription.after_seq)。
|
|
289
|
+
"""
|
|
290
|
+
from ksadk.kernel import ingress as _kernel_ingress
|
|
291
|
+
|
|
292
|
+
task_id = str(context.task_id or "")
|
|
293
|
+
session_id = str(context.context_id or task_id)
|
|
294
|
+
try:
|
|
295
|
+
trusted = _kernel_ingress.trusted_context(
|
|
296
|
+
source_kind="a2a",
|
|
297
|
+
source_ref=task_id,
|
|
298
|
+
session_id=session_id,
|
|
299
|
+
operations=("enqueue",),
|
|
300
|
+
)
|
|
301
|
+
command = _kernel_ingress.map_a2a_task(
|
|
302
|
+
session_id=session_id,
|
|
303
|
+
idempotency_key=task_id,
|
|
304
|
+
content={"input": context.get_user_input()},
|
|
305
|
+
task_id=task_id,
|
|
306
|
+
trusted=trusted,
|
|
307
|
+
)
|
|
308
|
+
receipt = await _kernel_ingress.submit_command(command, permit=trusted.permit)
|
|
309
|
+
if receipt.status not in ("accepted", "duplicate"):
|
|
310
|
+
await updater.failed(
|
|
311
|
+
message=updater.new_agent_message(
|
|
312
|
+
parts=[Part(text=f"agent kernel rejected command: {receipt.status}")]
|
|
313
|
+
)
|
|
314
|
+
)
|
|
315
|
+
return
|
|
316
|
+
await updater.update_status(
|
|
317
|
+
TaskState.TASK_STATE_WORKING,
|
|
318
|
+
metadata=dict(ADK_V2_INTEGRATION_METADATA),
|
|
319
|
+
)
|
|
320
|
+
output_text = ""
|
|
321
|
+
async for _seq, projected in _kernel_ingress.subscribe_projected(
|
|
322
|
+
session_id,
|
|
323
|
+
trusted=trusted,
|
|
324
|
+
after_seq=int(receipt.accepted_seq or 0),
|
|
325
|
+
projector=_a2a_envelope_projection,
|
|
326
|
+
):
|
|
327
|
+
if projected is None:
|
|
328
|
+
continue
|
|
329
|
+
kind, value = projected
|
|
330
|
+
if kind == "delta":
|
|
331
|
+
output_text += value
|
|
332
|
+
elif kind == "completed":
|
|
333
|
+
output_text = value or output_text
|
|
334
|
+
completion = (
|
|
335
|
+
updater.new_agent_message(parts=[Part(text=output_text)])
|
|
336
|
+
if output_text
|
|
337
|
+
else None
|
|
338
|
+
)
|
|
339
|
+
await updater.complete(message=completion)
|
|
340
|
+
except Exception as exc: # noqa: BLE001
|
|
341
|
+
logger.error("A2A kernel ingress failed (%s)", type(exc).__name__)
|
|
342
|
+
await updater.failed(
|
|
343
|
+
message=updater.new_agent_message(
|
|
344
|
+
parts=[Part(text="A2A task execution failed")]
|
|
345
|
+
)
|
|
346
|
+
)
|
|
347
|
+
|
|
249
348
|
async def cancel(self, context: RequestContext, event_queue: EventQueue) -> None:
|
|
250
349
|
# §7.4:cancel 统一由 adapter 提供。有 RuntimeAdapter → 尊重其 CancelResult,
|
|
251
350
|
# 只有底层真取消(CANCELLED)才把协议 Task 置 canceled;其余状态如实抛
|
|
@@ -259,8 +358,6 @@ class A2ARuntimeExecutor(AgentExecutor):
|
|
|
259
358
|
getattr(current_task, "context_id", "") or context.context_id or "unknown-context"
|
|
260
359
|
),
|
|
261
360
|
)
|
|
262
|
-
if self.task_adapter is None:
|
|
263
|
-
raise TaskNotCancelableError(message="runtime task adapter is not configured")
|
|
264
361
|
result = await self.task_adapter.cancel_task(context.task_id or "", context)
|
|
265
362
|
# 只有底层真的接受了取消(已中断活跃 turn,或已登记 pending cancel)才把
|
|
266
363
|
# 协议 Task 置 canceled;其他结果如实拒绝,包括未来新增的 UNSUPPORTED。
|
|
@@ -281,89 +378,6 @@ class A2ARuntimeExecutor(AgentExecutor):
|
|
|
281
378
|
if inspect.isawaitable(result):
|
|
282
379
|
await result
|
|
283
380
|
|
|
284
|
-
async def _run_runner(
|
|
285
|
-
self, context: RequestContext, updater: TaskUpdater, runner_input: dict[str, Any]
|
|
286
|
-
) -> str:
|
|
287
|
-
stream = getattr(self.runner, "stream", None)
|
|
288
|
-
if self.prefer_stream and callable(stream):
|
|
289
|
-
return await self._run_streaming(context, updater, stream, runner_input)
|
|
290
|
-
|
|
291
|
-
result = await self.runner.invoke(runner_input)
|
|
292
|
-
text = self._coerce_text(result)
|
|
293
|
-
if text:
|
|
294
|
-
await updater.add_artifact(
|
|
295
|
-
parts=[Part(text=text)],
|
|
296
|
-
artifact_id=f"{context.task_id}-response",
|
|
297
|
-
name="response",
|
|
298
|
-
last_chunk=True,
|
|
299
|
-
)
|
|
300
|
-
return text
|
|
301
|
-
|
|
302
|
-
async def _run_streaming(
|
|
303
|
-
self,
|
|
304
|
-
context: RequestContext,
|
|
305
|
-
updater: TaskUpdater,
|
|
306
|
-
stream: Any,
|
|
307
|
-
runner_input: dict[str, Any],
|
|
308
|
-
) -> str:
|
|
309
|
-
output_text = ""
|
|
310
|
-
artifacts = _ArtifactStreamEmitter(updater, str(context.task_id))
|
|
311
|
-
|
|
312
|
-
async for chunk in stream(runner_input):
|
|
313
|
-
chunk_type = chunk.get("type") if isinstance(chunk, dict) else None
|
|
314
|
-
if chunk_type == "input_required":
|
|
315
|
-
raise RuntimeError(
|
|
316
|
-
"runner emitted input_required without a RuntimeAdapter execution path"
|
|
317
|
-
)
|
|
318
|
-
if chunk_type == "final":
|
|
319
|
-
final_text = (
|
|
320
|
-
self._coerce_text(chunk.get("output")) if isinstance(chunk, dict) else ""
|
|
321
|
-
)
|
|
322
|
-
if not final_text:
|
|
323
|
-
continue
|
|
324
|
-
if not output_text:
|
|
325
|
-
output_text = final_text
|
|
326
|
-
await artifacts.push("text", final_text)
|
|
327
|
-
elif final_text.startswith(output_text):
|
|
328
|
-
suffix = final_text[len(output_text) :]
|
|
329
|
-
output_text = final_text
|
|
330
|
-
if suffix:
|
|
331
|
-
await artifacts.push("text", suffix)
|
|
332
|
-
continue
|
|
333
|
-
else:
|
|
334
|
-
output_text = final_text
|
|
335
|
-
await artifacts.push("text", final_text, replace_snapshot=True)
|
|
336
|
-
continue
|
|
337
|
-
|
|
338
|
-
text = self._coerce_text(chunk)
|
|
339
|
-
if not text:
|
|
340
|
-
continue
|
|
341
|
-
if chunk_type == "thinking":
|
|
342
|
-
if self.include_reasoning:
|
|
343
|
-
await artifacts.push("thinking", text)
|
|
344
|
-
continue
|
|
345
|
-
output_text += text
|
|
346
|
-
await artifacts.push("text", text)
|
|
347
|
-
|
|
348
|
-
await artifacts.close()
|
|
349
|
-
return output_text
|
|
350
|
-
|
|
351
|
-
def _build_runner_input(self, context: RequestContext) -> dict[str, Any]:
|
|
352
|
-
metadata = dict(getattr(context, "metadata", None) or {})
|
|
353
|
-
state = metadata.get("state", {})
|
|
354
|
-
if not isinstance(state, dict):
|
|
355
|
-
state = {}
|
|
356
|
-
# §7.2: A2A context_id ↔ Runtime session_id。
|
|
357
|
-
return {
|
|
358
|
-
"input": context.get_user_input(),
|
|
359
|
-
"task_id": context.task_id,
|
|
360
|
-
"context_id": context.context_id,
|
|
361
|
-
"session_id": context.context_id,
|
|
362
|
-
"state": dict(state),
|
|
363
|
-
"branch": metadata.get("branch", ""),
|
|
364
|
-
"metadata": metadata,
|
|
365
|
-
}
|
|
366
|
-
|
|
367
381
|
async def _run_runtime(
|
|
368
382
|
self,
|
|
369
383
|
context: RequestContext,
|
|
@@ -372,7 +386,6 @@ class A2ARuntimeExecutor(AgentExecutor):
|
|
|
372
386
|
) -> str:
|
|
373
387
|
output_text = ""
|
|
374
388
|
artifacts = _ArtifactStreamEmitter(updater, str(context.task_id))
|
|
375
|
-
reasoning_text = ""
|
|
376
389
|
input_required = False
|
|
377
390
|
input_prompt = "Input required"
|
|
378
391
|
checkpoint_id: str | None = None
|
|
@@ -380,91 +393,81 @@ class A2ARuntimeExecutor(AgentExecutor):
|
|
|
380
393
|
payload_kind: A2AResumePayloadKind = "hitl_answer"
|
|
381
394
|
|
|
382
395
|
async for event in self.task_adapter.stream_task(handle):
|
|
383
|
-
if not isinstance(event,
|
|
396
|
+
if not isinstance(event, EventEnvelope):
|
|
384
397
|
raise TypeError("RuntimeAdapter.stream must yield RuntimeEvent")
|
|
385
|
-
if event
|
|
386
|
-
raise RuntimeError(self._coerce_text(event.
|
|
387
|
-
if event
|
|
398
|
+
if isinstance(event, RunFailed):
|
|
399
|
+
raise RuntimeError(self._coerce_text(event.error.message))
|
|
400
|
+
if isinstance(event, RunCanceled):
|
|
388
401
|
await artifacts.close()
|
|
389
402
|
if not self._cancel_was_accepted(context, handle):
|
|
390
403
|
await updater.cancel(
|
|
391
404
|
message=updater.new_agent_message(parts=[Part(text="Request canceled")])
|
|
392
405
|
)
|
|
393
406
|
raise _RunCanceled()
|
|
394
|
-
if event
|
|
407
|
+
if isinstance(event, InteractionRequested):
|
|
395
408
|
input_required = True
|
|
396
409
|
payload_kind = "approval_decision"
|
|
397
410
|
call_id = (
|
|
398
|
-
str(event.
|
|
411
|
+
str(event.request.call_id or event.interaction_id or "")
|
|
399
412
|
or None
|
|
400
413
|
)
|
|
401
|
-
detail = event.
|
|
414
|
+
detail = event.request.detail
|
|
402
415
|
if isinstance(detail, dict):
|
|
403
416
|
input_prompt = self._coerce_text(
|
|
404
417
|
detail.get("prompt") or detail.get("message") or input_prompt
|
|
405
418
|
)
|
|
406
419
|
continue
|
|
407
|
-
if event
|
|
408
|
-
checkpoint_id =
|
|
420
|
+
if isinstance(event, ContinuationCreated):
|
|
421
|
+
checkpoint_id = event.continuation_id
|
|
409
422
|
continue
|
|
410
|
-
if event
|
|
423
|
+
if isinstance(event, RunInterrupted):
|
|
411
424
|
input_required = True
|
|
412
|
-
input_prompt = self._coerce_text(
|
|
413
|
-
event.payload.get("prompt") or event.payload.get("message") or input_prompt
|
|
414
|
-
)
|
|
415
|
-
continue
|
|
416
|
-
if event.event_type not in {
|
|
417
|
-
EventType.TEXT_DELTA,
|
|
418
|
-
EventType.TEXT_COMPLETED,
|
|
419
|
-
EventType.REASONING_DELTA,
|
|
420
|
-
EventType.REASONING_COMPLETED,
|
|
421
|
-
}:
|
|
422
|
-
continue
|
|
423
|
-
text = self._coerce_text(event.payload.get("text"))
|
|
424
|
-
if not text:
|
|
425
|
+
input_prompt = self._coerce_text(event.reason or input_prompt)
|
|
425
426
|
continue
|
|
426
|
-
if event
|
|
427
|
-
if
|
|
427
|
+
if isinstance(event, ItemUpdated):
|
|
428
|
+
if event.item_kind == "reasoning":
|
|
429
|
+
if not self.include_reasoning:
|
|
430
|
+
continue
|
|
431
|
+
if not isinstance(event.update, TextContent):
|
|
432
|
+
continue
|
|
433
|
+
text = event.update.text
|
|
434
|
+
if not text:
|
|
435
|
+
continue
|
|
436
|
+
await artifacts.push(
|
|
437
|
+
"thinking", text, replace_snapshot=(event.op == "replace")
|
|
438
|
+
)
|
|
428
439
|
continue
|
|
429
|
-
if
|
|
430
|
-
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
|
|
441
|
-
if event.event_type == EventType.REASONING_DELTA:
|
|
442
|
-
if not self.include_reasoning:
|
|
440
|
+
if event.item_kind == "message":
|
|
441
|
+
if not isinstance(event.update, TextContent):
|
|
442
|
+
continue
|
|
443
|
+
text = event.update.text
|
|
444
|
+
if not text:
|
|
445
|
+
continue
|
|
446
|
+
replace_snapshot = event.op == "replace"
|
|
447
|
+
if replace_snapshot:
|
|
448
|
+
output_text = text
|
|
449
|
+
else:
|
|
450
|
+
output_text += text
|
|
451
|
+
await artifacts.push("text", text, replace_snapshot=replace_snapshot)
|
|
443
452
|
continue
|
|
444
|
-
reasoning_text += text
|
|
445
|
-
await artifacts.push("thinking", text)
|
|
446
453
|
continue
|
|
447
|
-
|
|
448
|
-
|
|
449
|
-
|
|
450
|
-
|
|
451
|
-
|
|
452
|
-
|
|
453
|
-
|
|
454
|
-
|
|
455
|
-
|
|
456
|
-
|
|
457
|
-
|
|
458
|
-
|
|
454
|
+
if isinstance(event, ItemCompleted):
|
|
455
|
+
if event.item_kind == "reasoning":
|
|
456
|
+
if not self.include_reasoning:
|
|
457
|
+
continue
|
|
458
|
+
text = self._snapshot_text(event)
|
|
459
|
+
if not text:
|
|
460
|
+
continue
|
|
461
|
+
await artifacts.push("thinking", text, replace_snapshot=True)
|
|
462
|
+
continue
|
|
463
|
+
if event.item_kind == "message":
|
|
464
|
+
text = self._snapshot_text(event)
|
|
465
|
+
if not text:
|
|
466
|
+
continue
|
|
459
467
|
output_text = text
|
|
460
|
-
replace_snapshot
|
|
461
|
-
|
|
462
|
-
delta = text
|
|
463
|
-
output_text += text
|
|
464
|
-
replace_snapshot = False
|
|
465
|
-
if not delta:
|
|
468
|
+
await artifacts.push("text", text, replace_snapshot=True)
|
|
469
|
+
continue
|
|
466
470
|
continue
|
|
467
|
-
await artifacts.push("text", delta, replace_snapshot=replace_snapshot)
|
|
468
471
|
if self._cancel_was_accepted(context, handle):
|
|
469
472
|
await artifacts.close()
|
|
470
473
|
raise _RunCanceled()
|
|
@@ -500,6 +503,14 @@ class A2ARuntimeExecutor(AgentExecutor):
|
|
|
500
503
|
if inspect.isawaitable(result):
|
|
501
504
|
await result
|
|
502
505
|
|
|
506
|
+
@staticmethod
|
|
507
|
+
def _snapshot_text(event: ItemCompleted) -> str:
|
|
508
|
+
"""Extract text from the first TextContent part of an ItemCompleted snapshot."""
|
|
509
|
+
if not event.snapshot.parts:
|
|
510
|
+
return ""
|
|
511
|
+
part = event.snapshot.parts[0]
|
|
512
|
+
return part.text if isinstance(part, TextContent) else ""
|
|
513
|
+
|
|
503
514
|
@classmethod
|
|
504
515
|
def _coerce_text(cls, payload: Any) -> str:
|
|
505
516
|
if payload is None:
|
|
@@ -516,3 +527,15 @@ class A2ARuntimeExecutor(AgentExecutor):
|
|
|
516
527
|
|
|
517
528
|
|
|
518
529
|
__all__ = ["A2ARuntimeExecutor"]
|
|
530
|
+
|
|
531
|
+
|
|
532
|
+
def _a2a_envelope_projection(envelope) -> tuple[str, str] | None:
|
|
533
|
+
"""Session envelope -> A2A 文本投影;cursor 仍用 envelope.seq。"""
|
|
534
|
+
|
|
535
|
+
payload = envelope.payload or {}
|
|
536
|
+
if envelope.event_type == "run.completed":
|
|
537
|
+
return "completed", str(payload.get("output_text") or "")
|
|
538
|
+
text = str(payload.get("delta") or payload.get("text") or "")
|
|
539
|
+
if text:
|
|
540
|
+
return "delta", text
|
|
541
|
+
return None
|
ksadk/a2a/routes.py
CHANGED
|
@@ -19,7 +19,7 @@ A2A route、TaskStore、task adapter 和 card 构造**只有一份实现**,普
|
|
|
19
19
|
from __future__ import annotations
|
|
20
20
|
|
|
21
21
|
from dataclasses import dataclass, field
|
|
22
|
-
from typing import
|
|
22
|
+
from typing import Optional, Sequence
|
|
23
23
|
|
|
24
24
|
from a2a.server.routes import add_a2a_routes_to_fastapi
|
|
25
25
|
from a2a.server.tasks import TaskStore
|
|
@@ -57,7 +57,6 @@ class A2AConfig:
|
|
|
57
57
|
|
|
58
58
|
def add_a2a_protocol_routes(
|
|
59
59
|
app: FastAPI,
|
|
60
|
-
runner: Any,
|
|
61
60
|
config: A2AConfig,
|
|
62
61
|
*,
|
|
63
62
|
task_adapter: A2ARuntimeTaskAdapter,
|
|
@@ -85,19 +84,27 @@ def add_a2a_protocol_routes(
|
|
|
85
84
|
create_table=config.create_table,
|
|
86
85
|
)
|
|
87
86
|
server = A2AProtocolServer(
|
|
88
|
-
runner,
|
|
89
87
|
agent_card=card,
|
|
90
88
|
task_store=store,
|
|
91
89
|
task_adapter=task_adapter,
|
|
92
90
|
context_builder=context_builder,
|
|
93
|
-
prefer_stream=config.prefer_stream,
|
|
94
91
|
include_reasoning=config.include_reasoning,
|
|
95
92
|
)
|
|
93
|
+
rest = server.rest_routes()
|
|
94
|
+
# a2a-sdk REST routes 附带贪婪 Mount('/{tenant}')(多租户 catch-all),
|
|
95
|
+
# 它会拦截 /v1/responses、/agentengine/api/v1/*、/chat 等单段前缀路径导致 404。
|
|
96
|
+
# 只丢弃贪婪 Mount('/{tenant}');保留其他 Mount(多租户显式路径如 /tenant-a/a2a/v1/*)。
|
|
97
|
+
from starlette.routing import Mount as _Mount
|
|
98
|
+
|
|
99
|
+
rest = [
|
|
100
|
+
route for route in rest
|
|
101
|
+
if not (isinstance(route, _Mount) and getattr(route, "path", "") == "/{tenant}")
|
|
102
|
+
]
|
|
96
103
|
add_a2a_routes_to_fastapi(
|
|
97
104
|
app,
|
|
98
105
|
agent_card_routes=server.agent_card_routes(),
|
|
99
106
|
jsonrpc_routes=server.jsonrpc_routes(),
|
|
100
|
-
rest_routes=
|
|
107
|
+
rest_routes=rest,
|
|
101
108
|
)
|
|
102
109
|
return server
|
|
103
110
|
|
ksadk/a2a/server.py
CHANGED
|
@@ -59,37 +59,30 @@ class _DurableRequestContextBuilder(SimpleRequestContextBuilder):
|
|
|
59
59
|
|
|
60
60
|
|
|
61
61
|
class A2AProtocolServer:
|
|
62
|
-
"""把一个
|
|
62
|
+
"""把一个 RuntimeAdapter 暴露为 A2A 协议数据面。
|
|
63
63
|
|
|
64
64
|
参数:
|
|
65
|
-
runner: 当前 runtime 的 runner。
|
|
66
65
|
agent_card: 符合 wire 1.0 的 AgentCard(``ksadk.a2a.card.build_agent_card``)。
|
|
67
66
|
task_store: durable ``DatabaseTaskStore``(``ksadk.a2a.task_store``)。
|
|
68
67
|
task_adapter: 可选 ``A2ARuntimeTaskAdapter``(提供则 cancel 走 RuntimeAdapter.cancel)。
|
|
69
|
-
prefer_stream: 是否优先用 runner.stream(默认 True)。
|
|
70
68
|
include_reasoning: 是否把 reasoning 输出为 ``adk_thought`` artifact。
|
|
71
69
|
"""
|
|
72
70
|
|
|
73
71
|
def __init__(
|
|
74
72
|
self,
|
|
75
|
-
runner: Any,
|
|
76
73
|
*,
|
|
77
74
|
agent_card: AgentCard,
|
|
78
75
|
task_store: TaskStore,
|
|
79
76
|
task_adapter: A2ARuntimeTaskAdapter,
|
|
80
77
|
context_builder: A2AOwnerContextBuilder | None = None,
|
|
81
|
-
prefer_stream: bool = True,
|
|
82
78
|
include_reasoning: bool = False,
|
|
83
79
|
) -> None:
|
|
84
|
-
self.runner = runner
|
|
85
80
|
self.agent_card = agent_card
|
|
86
81
|
self.task_store = task_store
|
|
87
82
|
self.task_adapter = task_adapter
|
|
88
83
|
self.context_builder = context_builder or A2AOwnerContextBuilder()
|
|
89
84
|
self.executor = A2ARuntimeExecutor(
|
|
90
|
-
runner,
|
|
91
85
|
task_adapter=task_adapter,
|
|
92
|
-
prefer_stream=prefer_stream,
|
|
93
86
|
include_reasoning=include_reasoning,
|
|
94
87
|
)
|
|
95
88
|
self.request_handler = DefaultRequestHandler(
|
ksadk/a2a/service_env.py
ADDED
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
"""A2A Space 服务地址与凭证解析(对齐 ksadk/skills 的 KOP pull 模式)。
|
|
2
|
+
|
|
3
|
+
runtime 通过 KOP 公网网关访问 agentengine-server 的对外 A2A Action
|
|
4
|
+
(ListAToASpaceAgents,返回里已含完整投影后 AgentCard),与 Skill Space
|
|
5
|
+
走同一套 AICP 连接解析:默认 aicp.api.ksyun.com,可被 KSADK_A2A_SERVICE_URL 覆盖。
|
|
6
|
+
runtime 拿到 card 后直接用 card.url 调用,不需要 gateway 域名。
|
|
7
|
+
"""
|
|
8
|
+
|
|
9
|
+
from __future__ import annotations
|
|
10
|
+
|
|
11
|
+
import os
|
|
12
|
+
|
|
13
|
+
from ksadk.common.aicp_env import resolve_aicp_connection
|
|
14
|
+
|
|
15
|
+
ENV_A2A_SERVICE_URL = "KSADK_A2A_SERVICE_URL"
|
|
16
|
+
ENV_A2A_SERVICE_TOKEN = "KSADK_A2A_SERVICE_TOKEN"
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
def resolve_a2a_service_url() -> str:
|
|
20
|
+
"""返回 A2A 控制面对外服务 origin(不含 path)。
|
|
21
|
+
|
|
22
|
+
优先 KSADK_A2A_SERVICE_URL;否则用 AICP 连接解析(aicp.api.ksyun.com)。
|
|
23
|
+
"""
|
|
24
|
+
explicit = os.environ.get(ENV_A2A_SERVICE_URL, "").strip()
|
|
25
|
+
if explicit:
|
|
26
|
+
return explicit
|
|
27
|
+
connection = resolve_aicp_connection("KSADK_A2A_SERVICE")
|
|
28
|
+
return f"{connection['scheme']}://{connection['endpoint']}".rstrip("/")
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
def resolve_a2a_service_token() -> str:
|
|
32
|
+
"""返回 A2A 控制面服务 token(平台注入)。"""
|
|
33
|
+
return os.environ.get(ENV_A2A_SERVICE_TOKEN, "").strip()
|