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/routes/common.py
CHANGED
|
@@ -16,12 +16,10 @@ from fastapi.responses import FileResponse, Response
|
|
|
16
16
|
|
|
17
17
|
from ksadk.conversations.attachments import compact_attachment_result_for_session
|
|
18
18
|
from ksadk.conversations.model_context import normalize_model_metadata
|
|
19
|
-
from ksadk.runners.base_runner import BaseRunner
|
|
20
19
|
from ksadk.runtime_state import load_state as load_runtime_state
|
|
21
20
|
from ksadk.server.factory import (
|
|
22
21
|
RuntimeAppState,
|
|
23
22
|
bind_runtime_state,
|
|
24
|
-
get_runner,
|
|
25
23
|
get_state,
|
|
26
24
|
)
|
|
27
25
|
from ksadk.server.terminal_sessions import (
|
|
@@ -102,11 +100,8 @@ _NATIVE_TUI_FRAMEWORKS = {"hermes", "openclaw"}
|
|
|
102
100
|
|
|
103
101
|
|
|
104
102
|
def _current_framework() -> str:
|
|
105
|
-
|
|
106
|
-
if not
|
|
107
|
-
return ""
|
|
108
|
-
detection_type = getattr(getattr(runner, "detection_result", None), "type", None)
|
|
109
|
-
return str(getattr(detection_type, "value", detection_type) or "").strip().lower()
|
|
103
|
+
context = get_state().launch_context
|
|
104
|
+
return str(context.runtime_type if context is not None else "").strip().lower()
|
|
110
105
|
|
|
111
106
|
|
|
112
107
|
def _build_native_terminal_capability(framework: str) -> dict[str, Any]:
|
|
@@ -145,32 +140,6 @@ def _register_integrated_routers(app: FastAPI, state: RuntimeAppState) -> None:
|
|
|
145
140
|
)
|
|
146
141
|
|
|
147
142
|
|
|
148
|
-
def set_runner(r: BaseRunner, *, loaded: bool = False):
|
|
149
|
-
"""Bind a runner and record whether its agent has already been loaded."""
|
|
150
|
-
state = get_state()
|
|
151
|
-
state.runner = r
|
|
152
|
-
state.runner_loaded = loaded
|
|
153
|
-
from ksadk.server.factory import wire_default_agui_for_runner
|
|
154
|
-
|
|
155
|
-
wire_default_agui_for_runner(state, r)
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
def _ensure_runner_loaded() -> BaseRunner:
|
|
159
|
-
return get_runner()
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
def _resolve_active_runner() -> BaseRunner:
|
|
163
|
-
return get_runner()
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
def _prepare_runner_for_model(active_runner: BaseRunner, model: Optional[str]) -> None:
|
|
167
|
-
try:
|
|
168
|
-
active_runner.prepare_for_request(model)
|
|
169
|
-
except Exception as exc:
|
|
170
|
-
logger.warning("Runner 模型切换失败: %s", exc)
|
|
171
|
-
raise HTTPException(status_code=500, detail=str(exc) or "Runner 模型切换失败") from exc
|
|
172
|
-
|
|
173
|
-
|
|
174
143
|
def _resolve_current_model() -> tuple[Optional[str], Optional[str]]:
|
|
175
144
|
candidates = (
|
|
176
145
|
("OPENAI_MODEL_NAME", os.getenv("OPENAI_MODEL_NAME")),
|
|
@@ -194,11 +163,11 @@ def _build_bootstrap_model_payload() -> Optional[dict[str, Any]]:
|
|
|
194
163
|
return payload
|
|
195
164
|
|
|
196
165
|
|
|
197
|
-
def
|
|
198
|
-
|
|
199
|
-
if
|
|
166
|
+
def _runtime_project_dir() -> Path:
|
|
167
|
+
context = get_state().launch_context
|
|
168
|
+
if context is not None:
|
|
200
169
|
try:
|
|
201
|
-
return Path(str(
|
|
170
|
+
return Path(str(context.project_dir)).resolve()
|
|
202
171
|
except Exception:
|
|
203
172
|
pass
|
|
204
173
|
return Path(".").resolve()
|
|
@@ -223,7 +192,7 @@ def _ui_state_with_env_fallback(state: dict[str, Any]) -> dict[str, Any]:
|
|
|
223
192
|
|
|
224
193
|
|
|
225
194
|
def _resolve_agent_ui_spec() -> dict[str, Any]:
|
|
226
|
-
project_dir =
|
|
195
|
+
project_dir = _runtime_project_dir()
|
|
227
196
|
state = _ui_state_with_env_fallback(load_runtime_state(project_dir))
|
|
228
197
|
framework = _current_framework()
|
|
229
198
|
auto_custom_bundle_dir = _default_custom_ui_bundle_dir(project_dir)
|
|
@@ -696,18 +665,18 @@ async def _workspace_runtime_request(
|
|
|
696
665
|
|
|
697
666
|
@health_meta_router.get("/health")
|
|
698
667
|
async def health_check():
|
|
699
|
-
|
|
700
|
-
framework = "unknown"
|
|
701
|
-
|
|
702
|
-
|
|
703
|
-
framework = runner.detection_result.type.value # langgraph, langchain, adk
|
|
704
|
-
agent_name = runner.detection_result.name
|
|
668
|
+
context = get_state().launch_context
|
|
669
|
+
framework = context.runtime_type if context is not None else "unknown"
|
|
670
|
+
detection = context.detection if context is not None else None
|
|
671
|
+
agent_name = str(getattr(detection, "name", "") or "unknown")
|
|
705
672
|
return {"status": "ok", "framework": framework, "agent": agent_name}
|
|
706
673
|
|
|
707
674
|
|
|
708
675
|
@health_meta_router.get("/list-apps")
|
|
709
676
|
async def list_apps(relative_path: str = "./"):
|
|
710
677
|
"""Return available apps. For KsADK single-agent mode, returns the current agent."""
|
|
711
|
-
|
|
712
|
-
|
|
678
|
+
del relative_path
|
|
679
|
+
context = get_state().launch_context
|
|
680
|
+
detection = context.detection if context is not None else None
|
|
681
|
+
name = str(getattr(detection, "name", "") or "default_agent")
|
|
713
682
|
return [name]
|
ksadk/server/routes/control.py
CHANGED
|
@@ -17,10 +17,14 @@ from ksadk.conversations.run_kinds import (
|
|
|
17
17
|
RUN_MODE_FOREGROUND,
|
|
18
18
|
RUN_TRIGGER_CHECKPOINT_RESUME,
|
|
19
19
|
)
|
|
20
|
+
from ksadk.conversations.runtime_payloads import build_responses_payload
|
|
21
|
+
from ksadk.conversations.runtime_streaming import stream_runtime_responses_conversation_turn
|
|
22
|
+
from ksadk.runtime.conversation_execution import invoke_runtime_conversation_once
|
|
23
|
+
from ksadk.server.factory import get_runtime_execution
|
|
20
24
|
|
|
21
25
|
from . import dependencies as deps
|
|
22
26
|
from .checkpoint_resolution import _find_session_checkpoint
|
|
23
|
-
from .common import _action_response
|
|
27
|
+
from .common import _action_response
|
|
24
28
|
from .models import (
|
|
25
29
|
_MAX_PREVIEW_TOOL_RECEIPTS,
|
|
26
30
|
_RUN_TERMINAL_STATUSES,
|
|
@@ -108,6 +112,7 @@ async def get_checkpoint_resume_preview_action(request: GetCheckpointResumePrevi
|
|
|
108
112
|
|
|
109
113
|
@control_router.post("/agentengine/api/v1/ResumeRun")
|
|
110
114
|
async def resume_run_action(request: ResumeRunActionRequest):
|
|
115
|
+
executor, launch_context = get_runtime_execution()
|
|
111
116
|
service = deps.resolve_session_service()
|
|
112
117
|
session = await _require_action_session(
|
|
113
118
|
service,
|
|
@@ -174,7 +179,6 @@ async def resume_run_action(request: ResumeRunActionRequest):
|
|
|
174
179
|
"resume_instruction_enabled": bool(getattr(request, "ResumeInstructionEnabled", False)),
|
|
175
180
|
"resume_instruction": str(getattr(request, "ResumeInstruction", "") or "").strip(),
|
|
176
181
|
}
|
|
177
|
-
active_runner = _resolve_active_runner()
|
|
178
182
|
user_id = session.user_id or "user"
|
|
179
183
|
custom_metadata, _metadata_runtime_controls = _split_custom_metadata(request.Metadata)
|
|
180
184
|
resume_request_metadata = {
|
|
@@ -201,8 +205,9 @@ async def resume_run_action(request: ResumeRunActionRequest):
|
|
|
201
205
|
run_trigger=RUN_TRIGGER_CHECKPOINT_RESUME,
|
|
202
206
|
)
|
|
203
207
|
return deps.detached_streaming_response(
|
|
204
|
-
|
|
205
|
-
|
|
208
|
+
stream_runtime_responses_conversation_turn(
|
|
209
|
+
executor=executor,
|
|
210
|
+
launch_context=launch_context,
|
|
206
211
|
agent_id=request.AgentId,
|
|
207
212
|
user_id=user_id,
|
|
208
213
|
messages=[],
|
|
@@ -215,7 +220,6 @@ async def resume_run_action(request: ResumeRunActionRequest):
|
|
|
215
220
|
include_agentengine_metadata=True,
|
|
216
221
|
resume_input=resume_input,
|
|
217
222
|
invocation_id=resume_invocation_id,
|
|
218
|
-
prepare_runner=_prepare_runner_for_model,
|
|
219
223
|
session_service_provider=deps.resolve_session_service,
|
|
220
224
|
run_mode=RUN_MODE_BACKGROUND,
|
|
221
225
|
),
|
|
@@ -226,8 +230,9 @@ async def resume_run_action(request: ResumeRunActionRequest):
|
|
|
226
230
|
)
|
|
227
231
|
|
|
228
232
|
response_id = f"resp_{uuid.uuid4().hex}"
|
|
229
|
-
resolved_session_id, result = await
|
|
230
|
-
|
|
233
|
+
resolved_session_id, result = await invoke_runtime_conversation_once(
|
|
234
|
+
executor=executor,
|
|
235
|
+
launch_context=launch_context,
|
|
231
236
|
agent_id=request.AgentId,
|
|
232
237
|
user_id=user_id,
|
|
233
238
|
messages=[],
|
|
@@ -240,11 +245,10 @@ async def resume_run_action(request: ResumeRunActionRequest):
|
|
|
240
245
|
resume_input=resume_input,
|
|
241
246
|
response_id=response_id,
|
|
242
247
|
invocation_id=str(resume_input["resume_attempt_id"]),
|
|
243
|
-
prepare_runner=_prepare_runner_for_model,
|
|
244
248
|
session_service_provider=deps.resolve_session_service,
|
|
245
249
|
run_mode=RUN_MODE_FOREGROUND,
|
|
246
250
|
)
|
|
247
|
-
payload =
|
|
251
|
+
payload = build_responses_payload(
|
|
248
252
|
output_text=result["output_text"],
|
|
249
253
|
model=request.Model,
|
|
250
254
|
session_id=resolved_session_id,
|
|
@@ -0,0 +1,258 @@
|
|
|
1
|
+
# -*- coding: utf-8 -*-
|
|
2
|
+
"""RunAgent / Responses 入口的 kernel 路径(Phase 1 Task 8 Step 3-5)。
|
|
3
|
+
|
|
4
|
+
只在 ``kernel_route_active()`` 时启用(灰度 opt-in);旧 HTTP 行为保持兼容:
|
|
5
|
+
- accepted -> 202、duplicate -> 200、rejected -> 400、unsupported -> 409、
|
|
6
|
+
queue_full -> 429、persistence_uncertain -> 503(RECEIPT_HTTP_STATUS)。
|
|
7
|
+
- 旧响应 shape 不变;非流式在 receipt accepted 后才开始消费 stream。
|
|
8
|
+
- SSE 的 reconnect cursor 源自同一 Session seq(SessionEventSubscription)。
|
|
9
|
+
"""
|
|
10
|
+
|
|
11
|
+
from __future__ import annotations
|
|
12
|
+
|
|
13
|
+
import json
|
|
14
|
+
import logging
|
|
15
|
+
from typing import Any
|
|
16
|
+
|
|
17
|
+
from fastapi.responses import JSONResponse, StreamingResponse
|
|
18
|
+
|
|
19
|
+
from ksadk.kernel import ingress
|
|
20
|
+
from ksadk.kernel.contracts import AgentControlReceipt
|
|
21
|
+
|
|
22
|
+
logger = logging.getLogger(__name__)
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
def _envelope_text(payload: dict[str, Any]) -> str:
|
|
26
|
+
return str(payload.get("delta") or payload.get("text") or "")
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
async def _kernel_submit(
|
|
30
|
+
*,
|
|
31
|
+
mapper: str,
|
|
32
|
+
session_id: str,
|
|
33
|
+
idempotency_key: str,
|
|
34
|
+
content: Any,
|
|
35
|
+
correlation_ref: str | None,
|
|
36
|
+
source_kind: str,
|
|
37
|
+
runtime_options: dict[str, Any] | None = None,
|
|
38
|
+
) -> tuple[AgentControlReceipt, ingress.TrustedRuntimeContext]:
|
|
39
|
+
trusted = ingress.trusted_context(
|
|
40
|
+
source_kind=source_kind,
|
|
41
|
+
source_ref=idempotency_key,
|
|
42
|
+
session_id=session_id,
|
|
43
|
+
# A foreground compatibility request admits a mutation and then reads
|
|
44
|
+
# the same session's canonical stream. It remains session-bound, but
|
|
45
|
+
# needs explicit authority for both operations.
|
|
46
|
+
operations=("enqueue", "subscribe_events"),
|
|
47
|
+
)
|
|
48
|
+
correlation_kwarg = {
|
|
49
|
+
"map_run_request": "invocation_id",
|
|
50
|
+
"map_responses_request": "response_id",
|
|
51
|
+
"map_agui_request": "run_id",
|
|
52
|
+
"map_a2a_task": "task_id",
|
|
53
|
+
"map_studio_request": "run_id",
|
|
54
|
+
}[mapper]
|
|
55
|
+
command = getattr(ingress, mapper)(
|
|
56
|
+
trusted=trusted,
|
|
57
|
+
session_id=session_id,
|
|
58
|
+
idempotency_key=idempotency_key,
|
|
59
|
+
content=content,
|
|
60
|
+
**({correlation_kwarg: correlation_ref} if correlation_ref else {}),
|
|
61
|
+
**({"runtime_options": runtime_options} if runtime_options else {}),
|
|
62
|
+
)
|
|
63
|
+
receipt = await ingress.submit_command(command, permit=trusted.permit)
|
|
64
|
+
return receipt, trusted
|
|
65
|
+
|
|
66
|
+
|
|
67
|
+
def _kernel_error_response(receipt: AgentControlReceipt) -> JSONResponse:
|
|
68
|
+
return JSONResponse(
|
|
69
|
+
status_code=ingress.receipt_http_status(receipt),
|
|
70
|
+
content={
|
|
71
|
+
"error": ingress.receipt_error_payload(receipt),
|
|
72
|
+
},
|
|
73
|
+
headers=ingress.receipt_response_headers(receipt),
|
|
74
|
+
)
|
|
75
|
+
|
|
76
|
+
|
|
77
|
+
def _sse_chunk(payload: dict[str, Any], *, event: str | None, seq: int) -> str:
|
|
78
|
+
prefix = f"event: {event}\n" if event else ""
|
|
79
|
+
return f"id: {seq}\n{prefix}data: {json.dumps(payload, ensure_ascii=False)}\n\n"
|
|
80
|
+
|
|
81
|
+
|
|
82
|
+
def kernel_stream_response(
|
|
83
|
+
*,
|
|
84
|
+
receipt: AgentControlReceipt,
|
|
85
|
+
trusted: ingress.TrustedRuntimeContext,
|
|
86
|
+
session_id: str,
|
|
87
|
+
) -> StreamingResponse:
|
|
88
|
+
"""统一 cursor:从 receipt.accepted_seq 之后读 Session 事件。"""
|
|
89
|
+
|
|
90
|
+
after_seq = int(receipt.accepted_seq or 0)
|
|
91
|
+
|
|
92
|
+
async def generator():
|
|
93
|
+
async for seq, projected in ingress.subscribe_projected(
|
|
94
|
+
session_id,
|
|
95
|
+
trusted=trusted,
|
|
96
|
+
after_seq=after_seq,
|
|
97
|
+
projector=_new_responses_projector(),
|
|
98
|
+
):
|
|
99
|
+
if projected is None:
|
|
100
|
+
continue
|
|
101
|
+
kind, payload = projected
|
|
102
|
+
yield _sse_chunk(payload, event=kind, seq=seq)
|
|
103
|
+
if kind == "response.output_item.done" and (
|
|
104
|
+
(payload.get("item") or {}).get("type") == "mcp_approval_request"
|
|
105
|
+
):
|
|
106
|
+
yield _sse_chunk(
|
|
107
|
+
{"type": "response.incomplete"},
|
|
108
|
+
event="response.incomplete",
|
|
109
|
+
seq=seq,
|
|
110
|
+
)
|
|
111
|
+
return
|
|
112
|
+
# A foreground response stream is scoped to one admitted run.
|
|
113
|
+
# SessionEventStore subscriptions are deliberately long-lived for
|
|
114
|
+
# replay/SSE clients, so do not leave this HTTP response open after
|
|
115
|
+
# the terminal fact has been projected.
|
|
116
|
+
if kind in {"response.completed", "response.failed", "response.canceled"}:
|
|
117
|
+
return
|
|
118
|
+
|
|
119
|
+
return StreamingResponse(generator(), media_type="text/event-stream")
|
|
120
|
+
|
|
121
|
+
|
|
122
|
+
def _responses_projector(envelope: Any) -> tuple[str, dict[str, Any]] | None:
|
|
123
|
+
"""Session envelope -> 旧 Responses SSE shape(cursor 仍用 envelope.seq)。"""
|
|
124
|
+
|
|
125
|
+
payload = envelope.payload or {}
|
|
126
|
+
event_type = envelope.event_type
|
|
127
|
+
if event_type == "interaction.requested":
|
|
128
|
+
request = payload.get("request") or {}
|
|
129
|
+
presentation = request.get("presentation") or {}
|
|
130
|
+
description = presentation.get("description") or ""
|
|
131
|
+
try:
|
|
132
|
+
visible = json.loads(description) if description else {}
|
|
133
|
+
except (TypeError, json.JSONDecodeError):
|
|
134
|
+
visible = {}
|
|
135
|
+
arguments = visible.get("arguments") if isinstance(visible, dict) else {}
|
|
136
|
+
return "response.output_item.done", {
|
|
137
|
+
"type": "response.output_item.done",
|
|
138
|
+
"item": {
|
|
139
|
+
"id": str(payload.get("interaction_id") or ""),
|
|
140
|
+
"type": "mcp_approval_request",
|
|
141
|
+
"name": str(presentation.get("title") or payload.get("kind") or "approval"),
|
|
142
|
+
"arguments": json.dumps(arguments or {}, ensure_ascii=False),
|
|
143
|
+
},
|
|
144
|
+
}
|
|
145
|
+
if event_type == "run.completed":
|
|
146
|
+
text = str(payload.get("output_text") or "")
|
|
147
|
+
return "response.completed", {
|
|
148
|
+
"type": "response.completed",
|
|
149
|
+
"output_text": text,
|
|
150
|
+
"delta": text,
|
|
151
|
+
}
|
|
152
|
+
if event_type == "run.failed":
|
|
153
|
+
return "response.failed", {
|
|
154
|
+
"type": "response.failed",
|
|
155
|
+
"error": payload.get("error") or {"code": "runtime_failed"},
|
|
156
|
+
}
|
|
157
|
+
if event_type in {"run.canceled", "run.interrupted"}:
|
|
158
|
+
return "response.canceled", {
|
|
159
|
+
"type": "response.canceled",
|
|
160
|
+
"reason": payload.get("reason") or event_type,
|
|
161
|
+
}
|
|
162
|
+
text = _envelope_text(payload)
|
|
163
|
+
if text:
|
|
164
|
+
return "response.output_text.delta", {
|
|
165
|
+
"type": "response.output_text.delta",
|
|
166
|
+
"delta": text,
|
|
167
|
+
}
|
|
168
|
+
return None
|
|
169
|
+
|
|
170
|
+
|
|
171
|
+
def _new_responses_projector():
|
|
172
|
+
"""Create a session-scoped canonical RuntimeEvent -> Responses projector.
|
|
173
|
+
|
|
174
|
+
``run.completed.output_refs`` deliberately point at canonical items instead
|
|
175
|
+
of duplicating answer text. A projector therefore keeps only the small
|
|
176
|
+
item snapshot needed for this one HTTP/SSE response and resolves those
|
|
177
|
+
refs when the terminal fact arrives.
|
|
178
|
+
"""
|
|
179
|
+
|
|
180
|
+
item_text: dict[str, str] = {}
|
|
181
|
+
|
|
182
|
+
def project(envelope: Any) -> tuple[str, dict[str, Any]] | None:
|
|
183
|
+
payload = envelope.payload or {}
|
|
184
|
+
event_type = envelope.event_type
|
|
185
|
+
if event_type == "item.updated":
|
|
186
|
+
item_id = str(payload.get("item_id") or "")
|
|
187
|
+
update = payload.get("update") or {}
|
|
188
|
+
text = str(update.get("text") or "")
|
|
189
|
+
if item_id and text:
|
|
190
|
+
item_text[item_id] = (
|
|
191
|
+
text if payload.get("op") == "replace" else item_text.get(item_id, "") + text
|
|
192
|
+
)
|
|
193
|
+
return None
|
|
194
|
+
if event_type == "item.completed":
|
|
195
|
+
item_id = str(payload.get("item_id") or "")
|
|
196
|
+
parts = (payload.get("snapshot") or {}).get("parts") or []
|
|
197
|
+
if item_id and isinstance(parts, list):
|
|
198
|
+
item_text[item_id] = "".join(
|
|
199
|
+
str(part.get("text") or "") for part in parts if isinstance(part, dict)
|
|
200
|
+
)
|
|
201
|
+
return None
|
|
202
|
+
if event_type == "run.completed":
|
|
203
|
+
refs = payload.get("output_refs") or []
|
|
204
|
+
output = "".join(
|
|
205
|
+
item_text.get(str(ref.get("item_id") or ""), "")
|
|
206
|
+
for ref in refs
|
|
207
|
+
if isinstance(ref, dict)
|
|
208
|
+
)
|
|
209
|
+
projected_payload = dict(payload)
|
|
210
|
+
projected_payload["output_text"] = output or str(payload.get("output_text") or "")
|
|
211
|
+
return _responses_projector(
|
|
212
|
+
type("Envelope", (), {"event_type": event_type, "payload": projected_payload})()
|
|
213
|
+
)
|
|
214
|
+
return _responses_projector(envelope)
|
|
215
|
+
|
|
216
|
+
return project
|
|
217
|
+
|
|
218
|
+
|
|
219
|
+
async def kernel_conversation_turn(
|
|
220
|
+
*,
|
|
221
|
+
receipt: AgentControlReceipt,
|
|
222
|
+
trusted: ingress.TrustedRuntimeContext,
|
|
223
|
+
session_id: str,
|
|
224
|
+
build_payload,
|
|
225
|
+
):
|
|
226
|
+
"""非流式 kernel 路径:receipt accepted 后订阅聚合 output_text。"""
|
|
227
|
+
|
|
228
|
+
if receipt.status not in ("accepted", "duplicate"):
|
|
229
|
+
return _kernel_error_response(receipt)
|
|
230
|
+
output_text = ""
|
|
231
|
+
async for _seq, projected in ingress.subscribe_projected(
|
|
232
|
+
session_id,
|
|
233
|
+
trusted=trusted,
|
|
234
|
+
after_seq=int(receipt.accepted_seq or 0),
|
|
235
|
+
projector=_new_responses_projector(),
|
|
236
|
+
):
|
|
237
|
+
if projected and projected[0] == "response.completed":
|
|
238
|
+
output_text = str(projected[1].get("output_text") or output_text)
|
|
239
|
+
break
|
|
240
|
+
if projected and projected[0] in {"response.failed", "response.canceled"}:
|
|
241
|
+
return JSONResponse(
|
|
242
|
+
status_code=502,
|
|
243
|
+
content={"error": projected[1]},
|
|
244
|
+
)
|
|
245
|
+
elif projected:
|
|
246
|
+
output_text += str(projected[1].get("delta") or "")
|
|
247
|
+
payload = build_payload(output_text)
|
|
248
|
+
return JSONResponse(
|
|
249
|
+
status_code=ingress.receipt_http_status(receipt),
|
|
250
|
+
content=payload,
|
|
251
|
+
headers=ingress.receipt_response_headers(receipt),
|
|
252
|
+
)
|
|
253
|
+
|
|
254
|
+
|
|
255
|
+
__all__ = [
|
|
256
|
+
"kernel_conversation_turn",
|
|
257
|
+
"kernel_stream_response",
|
|
258
|
+
]
|
ksadk/server/routes/misc.py
CHANGED
|
@@ -16,7 +16,6 @@ from ksadk.tracing import get_memory_exporter
|
|
|
16
16
|
from . import dependencies as deps
|
|
17
17
|
from .common import (
|
|
18
18
|
_action_response,
|
|
19
|
-
_ensure_runner_loaded,
|
|
20
19
|
_ensure_session,
|
|
21
20
|
_hydrate_session,
|
|
22
21
|
_resolve_ui_static_response,
|
|
@@ -393,40 +392,18 @@ async def delete_session(app_name: str, user_id: str, session_id: str):
|
|
|
393
392
|
"/apps/{app_name}/users/{user_id}/sessions/{session_id}/save_memory"
|
|
394
393
|
)
|
|
395
394
|
async def save_session_to_memory(app_name: str, user_id: str, session_id: str):
|
|
396
|
-
"""
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
if not isinstance(active_runner, _ADKRunner):
|
|
407
|
-
raise HTTPException(
|
|
408
|
-
status_code=400, detail="Long-term memory is only supported with ADK runner"
|
|
409
|
-
)
|
|
410
|
-
|
|
411
|
-
if not active_runner._long_term_memory:
|
|
412
|
-
raise HTTPException(
|
|
413
|
-
status_code=400,
|
|
414
|
-
detail="Long-term memory not configured. Set KSADK_LTM_BACKEND environment variable.",
|
|
415
|
-
)
|
|
416
|
-
|
|
417
|
-
# 查找 ADK 内部 session ID
|
|
418
|
-
internal_session_id = active_runner._session_map.get(session_id, session_id)
|
|
419
|
-
|
|
420
|
-
success = await active_runner.save_session_to_long_term_memory(
|
|
421
|
-
session_id=internal_session_id,
|
|
422
|
-
user_id=user_id,
|
|
395
|
+
"""Fail closed until long-term memory is exposed as a Runtime capability."""
|
|
396
|
+
|
|
397
|
+
del app_name, user_id, session_id
|
|
398
|
+
raise HTTPException(
|
|
399
|
+
status_code=501,
|
|
400
|
+
detail={
|
|
401
|
+
"code": "RUNTIME_NOT_SUPPORTED",
|
|
402
|
+
"message": "当前 RuntimeAdapter 未声明长期记忆写入能力",
|
|
403
|
+
"hint": "请通过 Runtime Catalog 检查长期记忆能力后重试",
|
|
404
|
+
},
|
|
423
405
|
)
|
|
424
406
|
|
|
425
|
-
if success:
|
|
426
|
-
return {"status": "saved", "session_id": session_id}
|
|
427
|
-
else:
|
|
428
|
-
raise HTTPException(status_code=500, detail="Failed to save session to long-term memory")
|
|
429
|
-
|
|
430
407
|
|
|
431
408
|
@sessions_adk_compat_router.get(
|
|
432
409
|
"/apps/{app_name}/users/{user_id}/sessions/{session_id}/events/{event_id}/graph"
|
ksadk/server/routes/models.py
CHANGED
|
@@ -11,7 +11,7 @@ from pydantic import BaseModel, Field, field_validator
|
|
|
11
11
|
|
|
12
12
|
from ksadk.conversations.run_kinds import RUN_MODE_UNKNOWN, RUN_TRIGGER_UNKNOWN
|
|
13
13
|
from ksadk.conversations.run_status import RUN_STATUS_ACTIVE, RUN_STATUS_TERMINAL
|
|
14
|
-
from ksadk.
|
|
14
|
+
from ksadk.runtime.launch import RuntimeLaunchContext
|
|
15
15
|
from ksadk.sessions import SessionEvent
|
|
16
16
|
|
|
17
17
|
_RUN_TERMINAL_STATUSES = RUN_STATUS_TERMINAL
|
|
@@ -258,11 +258,11 @@ def _resolve_responses_session_and_user(request: ResponsesRequest) -> tuple[str
|
|
|
258
258
|
return resolved_session_id, resolved_user_id
|
|
259
259
|
|
|
260
260
|
|
|
261
|
-
def _runtime_agent_id(
|
|
261
|
+
def _runtime_agent_id(launch_context: RuntimeLaunchContext) -> str:
|
|
262
262
|
runtime_id = _clean_optional_string(os.getenv("AGENT_RUNTIME_ID"))
|
|
263
263
|
if runtime_id:
|
|
264
264
|
return runtime_id
|
|
265
|
-
return str(getattr(
|
|
265
|
+
return str(getattr(launch_context.detection, "name", "") or "agent")
|
|
266
266
|
|
|
267
267
|
|
|
268
268
|
def _metadata_invocation_id(metadata: Mapping[str, Any] | None) -> str | None:
|
|
@@ -425,9 +425,17 @@ def _latest_session_run_metadata(
|
|
|
425
425
|
if not _is_run_lifecycle_event(event) or _event_run_id(event) != invocation_id:
|
|
426
426
|
continue
|
|
427
427
|
metadata = event.metadata or {}
|
|
428
|
-
|
|
429
|
-
|
|
430
|
-
|
|
428
|
+
candidate_mode = str(metadata.get("run_mode") or RUN_MODE_UNKNOWN)
|
|
429
|
+
candidate_trigger = str(metadata.get("run_trigger") or RUN_TRIGGER_UNKNOWN)
|
|
430
|
+
# Canonical RuntimeEvents and their legacy ``run_status`` projection
|
|
431
|
+
# coexist in the session log. RuntimeEvents intentionally carry only
|
|
432
|
+
# the transport-neutral marker, while the projection owns run kind
|
|
433
|
+
# metadata. Keep scanning past an unclassified RuntimeEvent so the UI
|
|
434
|
+
# does not downgrade a known background/foreground run to ``unknown``.
|
|
435
|
+
if candidate_mode != RUN_MODE_UNKNOWN or candidate_trigger != RUN_TRIGGER_UNKNOWN:
|
|
436
|
+
run_mode = candidate_mode
|
|
437
|
+
run_trigger = candidate_trigger
|
|
438
|
+
break
|
|
431
439
|
return invocation_id, status, run_mode, run_trigger
|
|
432
440
|
|
|
433
441
|
|