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/server/composition.py
CHANGED
|
@@ -2,16 +2,25 @@
|
|
|
2
2
|
|
|
3
3
|
from fastapi import FastAPI
|
|
4
4
|
|
|
5
|
-
from ksadk.server.factory import RuntimeAppState
|
|
6
|
-
from ksadk.server.routes.common import _register_integrated_routers
|
|
5
|
+
from ksadk.server.factory import RuntimeAppState, get_state
|
|
6
|
+
from ksadk.server.routes.common import _register_integrated_routers, _resolve_agent_ui_spec
|
|
7
7
|
from ksadk.server.routes.routers import GROUP_ROUTERS, load_route_modules
|
|
8
8
|
|
|
9
9
|
|
|
10
10
|
def configure_runtime_app(app: FastAPI, state: RuntimeAppState, groups: set[str]) -> None:
|
|
11
11
|
"""Attach integrated resources and the selected route groups to one app."""
|
|
12
12
|
load_route_modules()
|
|
13
|
+
_configure_route_dependencies()
|
|
13
14
|
_register_integrated_routers(app, state)
|
|
14
15
|
|
|
16
|
+
# Agent Kernel canonical ingress(/agent-kernel/v1/*)必须先于 route group
|
|
17
|
+
# 注册:group 内的静态 UI catch-all(GET /{path}) 会吞掉所有未匹配 GET,
|
|
18
|
+
# 后注册的 kernel GET 路由(health / SubscribeSessionEvents)将被遮蔽 404。
|
|
19
|
+
# 灰度开关关闭时 bootstrap 返回 None、路由统一回 503,不影响旧路径。
|
|
20
|
+
from ksadk.kernel import ingress as _kernel_ingress
|
|
21
|
+
|
|
22
|
+
app.include_router(_kernel_ingress.agent_kernel_router())
|
|
23
|
+
|
|
15
24
|
ordered = sorted(group for group in groups if group != "health_meta")
|
|
16
25
|
if "health_meta" in groups:
|
|
17
26
|
ordered.append("health_meta")
|
|
@@ -19,3 +28,28 @@ def configure_runtime_app(app: FastAPI, state: RuntimeAppState, groups: set[str]
|
|
|
19
28
|
router = GROUP_ROUTERS.get(group)
|
|
20
29
|
if router is not None:
|
|
21
30
|
app.include_router(router)
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
def _configure_route_dependencies() -> None:
|
|
34
|
+
"""Install dynamic providers that always resolve the request-bound app state."""
|
|
35
|
+
|
|
36
|
+
import ksadk.conversations as conversation
|
|
37
|
+
from ksadk.server.routes import dependencies
|
|
38
|
+
from ksadk.server.routes.streaming import (
|
|
39
|
+
SSE_HEARTBEAT_INTERVAL_SECONDS,
|
|
40
|
+
_DetachedSSEStream,
|
|
41
|
+
detached_streaming_response,
|
|
42
|
+
)
|
|
43
|
+
|
|
44
|
+
dependencies.configure(
|
|
45
|
+
dependencies.ServerRouteDependencies(
|
|
46
|
+
resolve_session_service=lambda: get_state().resolve_session_service(),
|
|
47
|
+
describe_session_backend=lambda: get_state().describe_session_backend(),
|
|
48
|
+
resolve_agent_ui_spec=_resolve_agent_ui_spec,
|
|
49
|
+
conversation=lambda: conversation,
|
|
50
|
+
detached_streaming_response=detached_streaming_response,
|
|
51
|
+
detached_stream_class=lambda: _DetachedSSEStream,
|
|
52
|
+
heartbeat_interval=lambda: SSE_HEARTBEAT_INTERVAL_SECONDS,
|
|
53
|
+
runtime_app=lambda: get_state().app,
|
|
54
|
+
)
|
|
55
|
+
)
|
ksadk/server/factory.py
CHANGED
|
@@ -5,7 +5,7 @@ H2 §4.2:这是三线公共装配入口,替代 `ksadk/server/app.py` 的模块
|
|
|
5
5
|
|
|
6
6
|
设计要点:
|
|
7
7
|
|
|
8
|
-
- **per-app state**:
|
|
8
|
+
- **per-app state**:RuntimeExecutor / RuntimeLaunchContext / detached-stream registry 全部挂在
|
|
9
9
|
`app.state.runtime`(:class:`RuntimeAppState`)上,每个 app 实例一份,普通 app 与
|
|
10
10
|
HarnessApp 互不共享。不再有模块级 ``runner`` / ``_DETACHED_*`` 全局可变态。
|
|
11
11
|
- **请求级桥接**:中间件把当前 app 的 state 写入 :data:`current_state` 的
|
|
@@ -26,11 +26,12 @@ import asyncio
|
|
|
26
26
|
import contextvars
|
|
27
27
|
import logging
|
|
28
28
|
from contextlib import contextmanager
|
|
29
|
-
from typing import TYPE_CHECKING, Any, Callable, Iterator, Optional
|
|
29
|
+
from typing import TYPE_CHECKING, Any, Callable, Iterator, Optional
|
|
30
30
|
|
|
31
31
|
from fastapi import FastAPI
|
|
32
32
|
|
|
33
|
-
from ksadk.
|
|
33
|
+
from ksadk.runtime.adapter import RuntimeAdapter, RuntimeLaunchContext
|
|
34
|
+
from ksadk.runtime.executor import RuntimeExecutor
|
|
34
35
|
from ksadk.sandbox.registry import (
|
|
35
36
|
SandboxRegistry,
|
|
36
37
|
bind_sandbox_registry,
|
|
@@ -103,14 +104,15 @@ class RuntimeAppState:
|
|
|
103
104
|
|
|
104
105
|
def __init__(
|
|
105
106
|
self,
|
|
106
|
-
runner: Optional[BaseRunner] = None,
|
|
107
107
|
*,
|
|
108
|
+
executor: RuntimeExecutor | None = None,
|
|
109
|
+
launch_context: RuntimeLaunchContext | None = None,
|
|
108
110
|
session_service_provider: Callable[[], Any] | None = None,
|
|
109
111
|
session_backend_provider: Callable[[], dict[str, Any]] | None = None,
|
|
110
112
|
) -> None:
|
|
111
113
|
self.app: Optional[FastAPI] = None
|
|
112
|
-
self.
|
|
113
|
-
self.
|
|
114
|
+
self.executor = executor
|
|
115
|
+
self.launch_context = launch_context
|
|
114
116
|
self.stream_registry = StreamRegistry()
|
|
115
117
|
self.sandbox_registry = SandboxRegistry()
|
|
116
118
|
self.session_service: Any = None
|
|
@@ -175,8 +177,8 @@ class RuntimeAppState:
|
|
|
175
177
|
class RuntimeAppConfig:
|
|
176
178
|
"""create_runtime_app 的装配配置。
|
|
177
179
|
|
|
178
|
-
- ``
|
|
179
|
-
|
|
180
|
+
- ``runtime_executor``:统一 Runtime 生命周期入口。
|
|
181
|
+
- ``launch_context``:当前 Runtime 与项目的不可变启动上下文。
|
|
180
182
|
- ``runtime_type``:runtime 类型标识(普通 / harness / codex ...)。
|
|
181
183
|
- ``route_groups``:要装配的 route group 集合;默认 :data:`ALL_GROUPS`,
|
|
182
184
|
HarnessApp 传 :data:`DATA_PLANE_GROUPS`。
|
|
@@ -184,17 +186,18 @@ class RuntimeAppConfig:
|
|
|
184
186
|
|
|
185
187
|
def __init__(
|
|
186
188
|
self,
|
|
187
|
-
runner: Optional[BaseRunner] = None,
|
|
188
189
|
*,
|
|
189
190
|
runtime_type: str = "local",
|
|
190
191
|
route_groups: Optional[set[str]] = None,
|
|
191
192
|
a2a: Optional[Any] = None,
|
|
192
|
-
|
|
193
|
+
a2a_runtime_adapter: RuntimeAdapter | None = None,
|
|
193
194
|
agui: Optional[Any] = None,
|
|
195
|
+
runtime_executor: RuntimeExecutor | None = None,
|
|
196
|
+
launch_context: RuntimeLaunchContext | None = None,
|
|
197
|
+
kernel_adapter_provider: Callable[[], RuntimeAdapter] | None = None,
|
|
194
198
|
session_service_provider: Callable[[], Any] | None = None,
|
|
195
199
|
session_backend_provider: Callable[[], dict[str, Any]] | None = None,
|
|
196
200
|
) -> None:
|
|
197
|
-
self.runner = runner
|
|
198
201
|
self.runtime_type = runtime_type
|
|
199
202
|
self.route_groups: set[str] = (
|
|
200
203
|
set(route_groups) if route_groups is not None else set(ALL_GROUPS)
|
|
@@ -202,8 +205,13 @@ class RuntimeAppConfig:
|
|
|
202
205
|
# A2A 协议装配配置(``ksadk.a2a.routes.A2AConfig``);enabled 时 factory 装配
|
|
203
206
|
# A2A 数据面端点(契约 §8)。用 Any 避免本模块硬依赖可选的 a2a-sdk。
|
|
204
207
|
self.a2a = a2a
|
|
205
|
-
self.
|
|
208
|
+
self.a2a_runtime_adapter = a2a_runtime_adapter
|
|
206
209
|
self.agui = agui
|
|
210
|
+
self.runtime_executor = runtime_executor
|
|
211
|
+
self.launch_context = launch_context
|
|
212
|
+
# 特殊 runtime 可显式提供 worker/recovery 的 adapter;常规部署从
|
|
213
|
+
# runtime_executor 的同一 registry 派生,见 _kernel_adapter_provider。
|
|
214
|
+
self.kernel_adapter_provider = kernel_adapter_provider
|
|
207
215
|
self.session_service_provider = session_service_provider
|
|
208
216
|
self.session_backend_provider = session_backend_provider
|
|
209
217
|
|
|
@@ -234,6 +242,17 @@ def get_state() -> RuntimeAppState:
|
|
|
234
242
|
return state if state is not None else _fallback_state
|
|
235
243
|
|
|
236
244
|
|
|
245
|
+
def get_runtime_execution() -> tuple[RuntimeExecutor, RuntimeLaunchContext]:
|
|
246
|
+
"""Resolve the current app's canonical runtime execution dependencies."""
|
|
247
|
+
|
|
248
|
+
from fastapi import HTTPException
|
|
249
|
+
|
|
250
|
+
state = get_state()
|
|
251
|
+
if state.executor is None or state.launch_context is None:
|
|
252
|
+
raise HTTPException(status_code=500, detail="RuntimeExecutor 未初始化")
|
|
253
|
+
return state.executor, state.launch_context
|
|
254
|
+
|
|
255
|
+
|
|
237
256
|
@contextmanager
|
|
238
257
|
def bind_runtime_state(state: RuntimeAppState) -> Iterator[None]:
|
|
239
258
|
"""Bind one app state for non-HTTP scopes such as WebSockets."""
|
|
@@ -245,26 +264,6 @@ def bind_runtime_state(state: RuntimeAppState) -> Iterator[None]:
|
|
|
245
264
|
_current_state.reset(token)
|
|
246
265
|
|
|
247
266
|
|
|
248
|
-
def get_runner() -> BaseRunner:
|
|
249
|
-
"""取当前 app 的 runner(懒加载 agent)。等价旧的 ``_resolve_active_runner``。"""
|
|
250
|
-
from fastapi import HTTPException
|
|
251
|
-
|
|
252
|
-
state = get_state()
|
|
253
|
-
runner = state.runner
|
|
254
|
-
if runner is None:
|
|
255
|
-
raise HTTPException(status_code=500, detail="Runner 未初始化")
|
|
256
|
-
if not state.runner_loaded:
|
|
257
|
-
try:
|
|
258
|
-
runner.load_agent()
|
|
259
|
-
except HTTPException:
|
|
260
|
-
raise
|
|
261
|
-
except Exception as exc: # noqa: BLE001
|
|
262
|
-
logger.warning("Runner 加载失败: %s", exc)
|
|
263
|
-
raise HTTPException(status_code=500, detail=str(exc) or "Runner 加载失败") from exc
|
|
264
|
-
state.runner_loaded = True
|
|
265
|
-
return runner
|
|
266
|
-
|
|
267
|
-
|
|
268
267
|
# ---------------------------------------------------------------------------
|
|
269
268
|
# factory
|
|
270
269
|
# ---------------------------------------------------------------------------
|
|
@@ -290,14 +289,11 @@ async def shutdown_runtime_resources(state: RuntimeAppState) -> None:
|
|
|
290
289
|
await asyncio.gather(*pending_streams, return_exceptions=True)
|
|
291
290
|
registry.clear()
|
|
292
291
|
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
await close()
|
|
299
|
-
except Exception:
|
|
300
|
-
logger.exception("failed to close runner on shutdown")
|
|
292
|
+
if state.executor is not None:
|
|
293
|
+
try:
|
|
294
|
+
await state.executor.close_all()
|
|
295
|
+
except Exception:
|
|
296
|
+
logger.exception("failed to close runtime adapters on shutdown")
|
|
301
297
|
|
|
302
298
|
for service in state.session_services():
|
|
303
299
|
close = getattr(service, "aclose", None)
|
|
@@ -313,6 +309,26 @@ async def shutdown_runtime_resources(state: RuntimeAppState) -> None:
|
|
|
313
309
|
logger.exception("failed to clear sandbox registry on shutdown")
|
|
314
310
|
|
|
315
311
|
|
|
312
|
+
def _is_agent_execution_path(path: str, method: str) -> bool:
|
|
313
|
+
"""是否 agent 执行类请求(需要 root span 兜底,让 tool 内 outbound 挂到该 trace)。
|
|
314
|
+
|
|
315
|
+
session 管理(GetAgentUiBootstrap/ListSessionMessages 等轮询)与 UI/health 不建 span。
|
|
316
|
+
"""
|
|
317
|
+
m = (method or "").upper()
|
|
318
|
+
p = (path or "").strip()
|
|
319
|
+
if m == "POST" and p in {
|
|
320
|
+
"/v1/responses",
|
|
321
|
+
"/v1/chat/completions",
|
|
322
|
+
"/run",
|
|
323
|
+
"/run_sse",
|
|
324
|
+
"/agentengine/api/v1/RunAgent",
|
|
325
|
+
}:
|
|
326
|
+
return True
|
|
327
|
+
if m == "GET" and p in {"/agentengine/api/v1/SubscribeRunEvents"}:
|
|
328
|
+
return True
|
|
329
|
+
return False
|
|
330
|
+
|
|
331
|
+
|
|
316
332
|
def create_runtime_app(
|
|
317
333
|
config: RuntimeAppConfig,
|
|
318
334
|
configure: Optional[ConfigureApp] = None,
|
|
@@ -320,7 +336,7 @@ def create_runtime_app(
|
|
|
320
336
|
"""装配一个 runtime app。
|
|
321
337
|
|
|
322
338
|
参数:
|
|
323
|
-
config: :class:`RuntimeAppConfig`(
|
|
339
|
+
config: :class:`RuntimeAppConfig`(executor / launch_context / route_groups)。
|
|
324
340
|
configure: 路由装配回调 ``configure(app, state, route_groups)``;由
|
|
325
341
|
``ksadk/server/app.py`` 提供,负责按 group 把 domain router include 进 app。
|
|
326
342
|
factory 自身只负责 FastAPI 实例、state、中间件、lifespan、异常处理器,
|
|
@@ -333,13 +349,48 @@ def create_runtime_app(
|
|
|
333
349
|
from fastapi.responses import Response
|
|
334
350
|
|
|
335
351
|
state = RuntimeAppState(
|
|
336
|
-
|
|
352
|
+
executor=config.runtime_executor,
|
|
353
|
+
launch_context=config.launch_context,
|
|
337
354
|
session_service_provider=config.session_service_provider,
|
|
338
355
|
session_backend_provider=config.session_backend_provider,
|
|
339
356
|
)
|
|
340
357
|
|
|
341
358
|
@asynccontextmanager
|
|
342
359
|
async def _lifespan(app: FastAPI) -> AsyncIterator[None]:
|
|
360
|
+
# 生产 kernel 的 composition root 必须启动 worker/lease/recovery,
|
|
361
|
+
# 不能只注册一个可接收命令、却永远不会消费的 ingress kernel。
|
|
362
|
+
from ksadk.kernel import ingress as _kernel_ingress
|
|
363
|
+
from ksadk.kernel.bootstrap import (
|
|
364
|
+
bootstrap_agent_kernel_runtime_from_env,
|
|
365
|
+
clear_agent_kernel_runtime,
|
|
366
|
+
)
|
|
367
|
+
from ksadk.runtime.factory import kernel_start_request_defaults
|
|
368
|
+
|
|
369
|
+
adapter_provider = _kernel_adapter_provider(config)
|
|
370
|
+
request_defaults = (
|
|
371
|
+
kernel_start_request_defaults(config.launch_context)
|
|
372
|
+
if config.launch_context is not None
|
|
373
|
+
else {}
|
|
374
|
+
)
|
|
375
|
+
kernel_runtime = await bootstrap_agent_kernel_runtime_from_env(
|
|
376
|
+
adapter_provider=adapter_provider,
|
|
377
|
+
runtime_executor=config.runtime_executor,
|
|
378
|
+
launch_context=config.launch_context,
|
|
379
|
+
start_request_defaults=request_defaults,
|
|
380
|
+
session_service=state.resolve_session_service(),
|
|
381
|
+
)
|
|
382
|
+
app.state.agent_kernel_runtime = kernel_runtime
|
|
383
|
+
if kernel_runtime is not None:
|
|
384
|
+
# Kernel canonical events are the replay authority for the normal
|
|
385
|
+
# Session APIs as well. In memory/ephemeral mode bootstrap reuses
|
|
386
|
+
# the app-owned service above; in PostgreSQL mode it owns the
|
|
387
|
+
# durable service and the HTTP routes must adopt that exact one.
|
|
388
|
+
# Keeping two services made foreground SSE look correct while a
|
|
389
|
+
# later ListSessionEvents call returned an empty history forever.
|
|
390
|
+
kernel_session_service = kernel_runtime.config.session_service
|
|
391
|
+
if kernel_session_service is None: # pragma: no cover - defensive
|
|
392
|
+
raise RuntimeError("agent kernel runtime has no Session service")
|
|
393
|
+
state.session_service = kernel_session_service
|
|
343
394
|
try:
|
|
344
395
|
if state.a2a_bootstrap is not None:
|
|
345
396
|
await state.a2a_bootstrap.start()
|
|
@@ -347,6 +398,10 @@ def create_runtime_app(
|
|
|
347
398
|
finally:
|
|
348
399
|
if state.a2a_bootstrap is not None:
|
|
349
400
|
await state.a2a_bootstrap.stop()
|
|
401
|
+
if kernel_runtime is not None:
|
|
402
|
+
await kernel_runtime.close()
|
|
403
|
+
clear_agent_kernel_runtime()
|
|
404
|
+
_kernel_ingress.clear_agent_kernel()
|
|
350
405
|
await shutdown_runtime_resources(state)
|
|
351
406
|
|
|
352
407
|
app = FastAPI(
|
|
@@ -370,8 +425,68 @@ def create_runtime_app(
|
|
|
370
425
|
backend=state.describe_session_backend(),
|
|
371
426
|
),
|
|
372
427
|
):
|
|
373
|
-
#
|
|
374
|
-
|
|
428
|
+
# 提取 inbound OTel trace context(traceparent);无有效 inbound 时建一个
|
|
429
|
+
# 覆盖整个请求的 root server span,让 langchain/openinference 的 agent span 与
|
|
430
|
+
# tool 内 outbound(A2A)调用都挂到这条 trace 上(openinference 只在 LLM 调用
|
|
431
|
+
# 期间建 span,tool 执行时其 span 已 detach,需一个贯穿 span 兜底)。
|
|
432
|
+
# 只对 agent 执行类路径建 root span;session/UI 管理路径(GetAgentUiBootstrap/
|
|
433
|
+
# ListSessionMessages 等轮询)不建,避免一次问答产生一堆独立 trace。
|
|
434
|
+
try:
|
|
435
|
+
from opentelemetry import context as _otel_ctx
|
|
436
|
+
from opentelemetry import propagate
|
|
437
|
+
from opentelemetry import trace as _otel_trace
|
|
438
|
+
|
|
439
|
+
_carrier = dict(request.headers)
|
|
440
|
+
_parent = propagate.extract(_carrier)
|
|
441
|
+
_parent_span_ctx = _otel_trace.get_current_span(_parent).get_span_context()
|
|
442
|
+
except Exception:
|
|
443
|
+
logger.exception("failed to initialize request tracing; continuing without OTel")
|
|
444
|
+
response = await call_next(request)
|
|
445
|
+
else:
|
|
446
|
+
if _parent_span_ctx.is_valid:
|
|
447
|
+
try:
|
|
448
|
+
_token = _otel_ctx.attach(_parent)
|
|
449
|
+
except Exception:
|
|
450
|
+
logger.exception(
|
|
451
|
+
"failed to attach inbound trace context; continuing without OTel"
|
|
452
|
+
)
|
|
453
|
+
response = await call_next(request)
|
|
454
|
+
else:
|
|
455
|
+
try:
|
|
456
|
+
response = await call_next(request)
|
|
457
|
+
finally:
|
|
458
|
+
try:
|
|
459
|
+
_otel_ctx.detach(_token)
|
|
460
|
+
except Exception:
|
|
461
|
+
logger.exception("failed to detach inbound trace context")
|
|
462
|
+
elif _is_agent_execution_path(request.url.path, request.method):
|
|
463
|
+
try:
|
|
464
|
+
_tracer = _otel_trace.get_tracer("ksadk.server")
|
|
465
|
+
_span_scope = _tracer.start_as_current_span(
|
|
466
|
+
f"{request.method} {request.url.path}"
|
|
467
|
+
)
|
|
468
|
+
_span_scope.__enter__()
|
|
469
|
+
except Exception:
|
|
470
|
+
logger.exception(
|
|
471
|
+
"failed to start request span; continuing without OTel"
|
|
472
|
+
)
|
|
473
|
+
response = await call_next(request)
|
|
474
|
+
else:
|
|
475
|
+
try:
|
|
476
|
+
response = await call_next(request)
|
|
477
|
+
except BaseException as exc:
|
|
478
|
+
try:
|
|
479
|
+
_span_scope.__exit__(type(exc), exc, exc.__traceback__)
|
|
480
|
+
except Exception:
|
|
481
|
+
logger.exception("failed to close request span after handler error")
|
|
482
|
+
raise
|
|
483
|
+
else:
|
|
484
|
+
try:
|
|
485
|
+
_span_scope.__exit__(None, None, None)
|
|
486
|
+
except Exception:
|
|
487
|
+
logger.exception("failed to close request span")
|
|
488
|
+
else:
|
|
489
|
+
response = await call_next(request)
|
|
375
490
|
path = request.url.path
|
|
376
491
|
if path == "/" or path.endswith(".html"):
|
|
377
492
|
response.headers["Cache-Control"] = "no-cache, no-store, must-revalidate"
|
|
@@ -415,67 +530,58 @@ def create_runtime_app(
|
|
|
415
530
|
return app
|
|
416
531
|
|
|
417
532
|
|
|
418
|
-
|
|
419
|
-
|
|
533
|
+
def _kernel_adapter_provider(
|
|
534
|
+
config: RuntimeAppConfig,
|
|
535
|
+
) -> Callable[[], RuntimeAdapter] | None:
|
|
536
|
+
"""Return the adapter source used by the durable kernel runtime.
|
|
420
537
|
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
转发)。
|
|
538
|
+
Hosted startup deliberately fails when neither a provider nor a Runtime
|
|
539
|
+
launch context is available. It must never construct an unrelated local
|
|
540
|
+
adapter merely to make the ingress look healthy.
|
|
425
541
|
"""
|
|
426
542
|
|
|
427
|
-
|
|
428
|
-
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
|
|
434
|
-
raise RuntimeError("A2A: runner 尚未装配(set_runner 未调用)")
|
|
435
|
-
if not state.runner_loaded:
|
|
436
|
-
runner.load_agent()
|
|
437
|
-
state.runner_loaded = True
|
|
438
|
-
return runner
|
|
439
|
-
|
|
440
|
-
def load_agent(self) -> BaseRunner:
|
|
441
|
-
return self._real()
|
|
442
|
-
|
|
443
|
-
def stream(self, input_data: Any) -> Any:
|
|
444
|
-
# 与普通方法(非 async def)返回真实 runner.stream 的结果(async gen 或 coroutine),
|
|
445
|
-
# 由 RunnerRuntimeAdapter/executor 按既有分支处理。
|
|
446
|
-
return self._real().stream(input_data)
|
|
447
|
-
|
|
448
|
-
async def invoke(self, input_data: Any) -> Any:
|
|
449
|
-
return await self._real().invoke(input_data)
|
|
450
|
-
|
|
451
|
-
def __getattr__(self, name: str) -> Any:
|
|
452
|
-
return getattr(self._real(), name)
|
|
543
|
+
if config.kernel_adapter_provider is not None:
|
|
544
|
+
return config.kernel_adapter_provider
|
|
545
|
+
if config.a2a_runtime_adapter is not None:
|
|
546
|
+
return lambda: config.a2a_runtime_adapter
|
|
547
|
+
if config.runtime_executor is not None and config.launch_context is not None:
|
|
548
|
+
return lambda: config.runtime_executor.create_adapter(config.launch_context)
|
|
549
|
+
return None
|
|
453
550
|
|
|
454
551
|
|
|
455
552
|
def _wire_a2a_if_enabled(app: FastAPI, state: RuntimeAppState, config: RuntimeAppConfig) -> None:
|
|
456
|
-
"""
|
|
553
|
+
"""Mount A2A with an explicitly injected RuntimeAdapter.
|
|
457
554
|
|
|
458
|
-
|
|
459
|
-
|
|
555
|
+
The server composition root never resolves or wraps a Runner. Framework
|
|
556
|
+
internals may still use one behind their adapter factory, but A2A only sees
|
|
557
|
+
the frozen RuntimeAdapter contract.
|
|
460
558
|
"""
|
|
461
559
|
a2a_cfg = config.a2a
|
|
462
560
|
if a2a_cfg is None:
|
|
463
561
|
return
|
|
562
|
+
from ksadk.managed_a2a_card import ManagedA2ACardMount
|
|
563
|
+
|
|
564
|
+
if isinstance(a2a_cfg, ManagedA2ACardMount):
|
|
565
|
+
a2a_cfg.mount(app)
|
|
566
|
+
state.a2a_bootstrap = a2a_cfg
|
|
567
|
+
logger.info(
|
|
568
|
+
"managed A2A discovery card mounted(agent_name=%s base_url=%s)",
|
|
569
|
+
a2a_cfg.config.agent_name,
|
|
570
|
+
a2a_cfg.config.base_url,
|
|
571
|
+
)
|
|
572
|
+
return
|
|
464
573
|
from ksadk.a2a.bootstrap import AgentEngineA2ABootstrap
|
|
465
574
|
|
|
466
|
-
|
|
467
|
-
|
|
575
|
+
adapter = config.a2a_runtime_adapter
|
|
576
|
+
if adapter is None:
|
|
577
|
+
raise ValueError("A2A requires an explicitly injected RuntimeAdapter")
|
|
578
|
+
runtime_type = adapter.runtime.runtime_type or config.runtime_type
|
|
468
579
|
|
|
469
|
-
|
|
470
|
-
runtime_adapter = config.runtime_adapter or RunnerRuntimeAdapter(
|
|
471
|
-
cast("BaseRunner", proxy),
|
|
472
|
-
runtime_type=config.runtime_type,
|
|
473
|
-
)
|
|
580
|
+
if isinstance(a2a_cfg, AgentEngineA2ABootstrap):
|
|
474
581
|
server = a2a_cfg.mount(
|
|
475
582
|
app,
|
|
476
|
-
|
|
477
|
-
|
|
478
|
-
runtime_type=config.runtime_type,
|
|
583
|
+
runtime_adapter=adapter,
|
|
584
|
+
runtime_type=runtime_type,
|
|
479
585
|
)
|
|
480
586
|
state.a2a_bootstrap = a2a_cfg
|
|
481
587
|
state.a2a_server = server
|
|
@@ -489,12 +595,9 @@ def _wire_a2a_if_enabled(app: FastAPI, state: RuntimeAppState, config: RuntimeAp
|
|
|
489
595
|
return
|
|
490
596
|
from ksadk.a2a.routes import add_a2a_protocol_routes
|
|
491
597
|
from ksadk.a2a.task_adapter import A2ARuntimeTaskAdapter
|
|
492
|
-
from ksadk.runtime.runner_adapter import RunnerRuntimeAdapter
|
|
493
598
|
|
|
494
|
-
|
|
495
|
-
|
|
496
|
-
task_adapter = A2ARuntimeTaskAdapter(adapter, runtime_type=config.runtime_type)
|
|
497
|
-
server = add_a2a_protocol_routes(app, proxy, a2a_cfg, task_adapter=task_adapter)
|
|
599
|
+
task_adapter = A2ARuntimeTaskAdapter(adapter, runtime_type=runtime_type)
|
|
600
|
+
server = add_a2a_protocol_routes(app, a2a_cfg, task_adapter=task_adapter)
|
|
498
601
|
state.a2a_server = server
|
|
499
602
|
logger.info("A2A 协议端点已装配进 runtime app(agent=%s)", a2a_cfg.agent_name)
|
|
500
603
|
|
|
@@ -517,7 +620,8 @@ def _wire_agui_if_enabled(app: FastAPI, state: RuntimeAppState, config: RuntimeA
|
|
|
517
620
|
from ksadk.events.store import RuntimeEventStore
|
|
518
621
|
from ksadk.server.routes import dependencies as route_dependencies
|
|
519
622
|
|
|
520
|
-
|
|
623
|
+
if state.executor is None or state.launch_context is None:
|
|
624
|
+
raise ValueError("AG-UI requires RuntimeExecutor and RuntimeLaunchContext")
|
|
521
625
|
|
|
522
626
|
class _AutoSessionRuntimeEventStore:
|
|
523
627
|
"""Create a session on first AG-UI event when HttpAgent starts fresh."""
|
|
@@ -526,15 +630,17 @@ def _wire_agui_if_enabled(app: FastAPI, state: RuntimeAppState, config: RuntimeA
|
|
|
526
630
|
self._service = service
|
|
527
631
|
self._store = RuntimeEventStore(service)
|
|
528
632
|
|
|
529
|
-
async def append_one(self, event: Any) -> Any:
|
|
530
|
-
existing = await self._service.get_session(
|
|
633
|
+
async def append_one(self, session_id: str, event: Any) -> Any:
|
|
634
|
+
existing = await self._service.get_session(session_id)
|
|
531
635
|
if existing is None:
|
|
636
|
+
metadata = getattr(event, "source", None)
|
|
637
|
+
meta = metadata.metadata if metadata is not None else {}
|
|
532
638
|
await self._service.create_session(
|
|
533
|
-
|
|
534
|
-
|
|
535
|
-
|
|
639
|
+
str(meta.get("agent_id") or "agent"),
|
|
640
|
+
str(meta.get("user_id") or "user"),
|
|
641
|
+
session_id,
|
|
536
642
|
)
|
|
537
|
-
return await self._store.append_one(event)
|
|
643
|
+
return await self._store.append_one(session_id, event)
|
|
538
644
|
|
|
539
645
|
async def reserve_once(self, event: Any) -> Any:
|
|
540
646
|
existing = await self._service.get_session(event.session_id)
|
|
@@ -551,7 +657,8 @@ def _wire_agui_if_enabled(app: FastAPI, state: RuntimeAppState, config: RuntimeA
|
|
|
551
657
|
|
|
552
658
|
agent = add_ksadk_agui_endpoint(
|
|
553
659
|
app,
|
|
554
|
-
|
|
660
|
+
state.executor,
|
|
661
|
+
state.launch_context,
|
|
555
662
|
agui_cfg,
|
|
556
663
|
event_store_factory=lambda: _AutoSessionRuntimeEventStore(
|
|
557
664
|
route_dependencies.resolve_session_service()
|
|
@@ -563,51 +670,6 @@ def _wire_agui_if_enabled(app: FastAPI, state: RuntimeAppState, config: RuntimeA
|
|
|
563
670
|
logger.info("AG-UI endpoint mounted at %s", agui_cfg.path)
|
|
564
671
|
|
|
565
672
|
|
|
566
|
-
def wire_default_agui_for_runner(state: RuntimeAppState, runner: BaseRunner) -> None:
|
|
567
|
-
"""Mount AG-UI for legacy ``app`` + ``set_runner`` production entrypoints.
|
|
568
|
-
|
|
569
|
-
Those entrypoints create the FastAPI app before the framework runner exists.
|
|
570
|
-
Mounting immediately after ``set_runner`` is still startup-time wiring. New
|
|
571
|
-
protocol routes are moved ahead of the static catch-all to preserve routing
|
|
572
|
-
order exactly as the normal factory path does.
|
|
573
|
-
"""
|
|
574
|
-
if state.app is None or state.agui_agent is not None:
|
|
575
|
-
return
|
|
576
|
-
|
|
577
|
-
from ksadk.agui.config import default_agui_config
|
|
578
|
-
|
|
579
|
-
agui_config = default_agui_config(runner)
|
|
580
|
-
if not agui_config.enabled:
|
|
581
|
-
return
|
|
582
|
-
|
|
583
|
-
app = state.app
|
|
584
|
-
routes = app.router.routes
|
|
585
|
-
previous_count = len(routes)
|
|
586
|
-
_wire_agui_if_enabled(
|
|
587
|
-
app,
|
|
588
|
-
state,
|
|
589
|
-
RuntimeAppConfig(
|
|
590
|
-
runner=runner,
|
|
591
|
-
runtime_type=agui_config.runtime_type,
|
|
592
|
-
route_groups={"agui"},
|
|
593
|
-
agui=agui_config,
|
|
594
|
-
),
|
|
595
|
-
)
|
|
596
|
-
new_routes = routes[previous_count:]
|
|
597
|
-
if not new_routes:
|
|
598
|
-
return
|
|
599
|
-
del routes[previous_count:]
|
|
600
|
-
catch_all_index = next(
|
|
601
|
-
(
|
|
602
|
-
index
|
|
603
|
-
for index, route in enumerate(routes)
|
|
604
|
-
if getattr(route, "path", None) == "/{requested_path:path}"
|
|
605
|
-
),
|
|
606
|
-
len(routes),
|
|
607
|
-
)
|
|
608
|
-
routes[catch_all_index:catch_all_index] = new_routes
|
|
609
|
-
|
|
610
|
-
|
|
611
673
|
__all__ = [
|
|
612
674
|
"ALL_GROUPS",
|
|
613
675
|
"CONTROL_PLANE_GROUPS",
|
|
@@ -617,8 +679,7 @@ __all__ = [
|
|
|
617
679
|
"bind_runtime_state",
|
|
618
680
|
"StreamRegistry",
|
|
619
681
|
"create_runtime_app",
|
|
620
|
-
"
|
|
682
|
+
"get_runtime_execution",
|
|
621
683
|
"get_state",
|
|
622
684
|
"set_fallback_state",
|
|
623
|
-
"wire_default_agui_for_runner",
|
|
624
685
|
]
|