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/events/runtime_event.py
CHANGED
|
@@ -1,264 +1,28 @@
|
|
|
1
|
-
"""RuntimeEvent
|
|
1
|
+
"""Public canonical RuntimeEvent schema version 2.
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
本模块只负责**定义层**(类型 + 序列化/反序列化 + 事件族清单);不改 runtime.py 发事件
|
|
5
|
-
(那是后续阶段)。
|
|
6
|
-
|
|
7
|
-
设计约束(友商证伪,G0.2 冻结):
|
|
8
|
-
|
|
9
|
-
- **additive + ``SCHEMA_VERSION``**:只增字段/事件类型,不改既有字段语义。
|
|
10
|
-
- **相位字段** ``phase``:区分 ``commentary``(过程解说)vs ``final_answer``(最终答案),
|
|
11
|
-
仅 text/reasoning 类事件使用。
|
|
12
|
-
- **工具审批一等事件**(``approval.*``),不是普通 text;审批回包走独立命令/恢复通道,
|
|
13
|
-
事件流上的 ``approval.resolved`` 仅作回放/审计(非 duplex stream)。
|
|
3
|
+
The schema-v1 wire model intentionally lives only in :mod:`ksadk.events.v1_compat`.
|
|
14
4
|
"""
|
|
15
5
|
|
|
16
|
-
from
|
|
17
|
-
|
|
18
|
-
import
|
|
19
|
-
import uuid
|
|
20
|
-
from enum import Enum
|
|
21
|
-
from typing import Any, Literal, Optional
|
|
22
|
-
|
|
23
|
-
from pydantic import BaseModel, Field
|
|
24
|
-
|
|
25
|
-
#: additive 演进锚点。冻结为 1;只增不改。
|
|
26
|
-
SCHEMA_VERSION: Literal[1] = 1
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
class EventPhase(str, Enum):
|
|
30
|
-
"""相位:text/reasoning 类事件区分过程解说与最终答案。"""
|
|
31
|
-
|
|
32
|
-
COMMENTARY = "commentary"
|
|
33
|
-
FINAL_ANSWER = "final_answer"
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
# ---------------------------------------------------------------------------
|
|
37
|
-
# 事件族(event_type 常量,v1 冻结)。新增事件类型只能 additive 追加。
|
|
38
|
-
# ---------------------------------------------------------------------------
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
class EventType:
|
|
42
|
-
"""v1 事件族清单(冻结)。按族分组;每族注释标明 payload 关键字段。"""
|
|
43
|
-
|
|
44
|
-
# text(相位:commentary/final_answer)。payload: text, message_id
|
|
45
|
-
TEXT_DELTA = "text.delta"
|
|
46
|
-
TEXT_COMPLETED = "text.completed"
|
|
47
|
-
# reasoning(相位恒 commentary)。payload: text, summary
|
|
48
|
-
REASONING_DELTA = "reasoning.delta"
|
|
49
|
-
REASONING_COMPLETED = "reasoning.completed"
|
|
50
|
-
# tool。begin: call_id, name, args;end: call_id, name, result, error, duration_ms
|
|
51
|
-
TOOL_CALL_BEGIN = "tool.call.begin"
|
|
52
|
-
TOOL_CALL_END = "tool.call.end"
|
|
53
|
-
# artifact。payload: name, version, uri, mime
|
|
54
|
-
ARTIFACT_CREATED = "artifact.created"
|
|
55
|
-
ARTIFACT_UPDATED = "artifact.updated"
|
|
56
|
-
# approval(一等)。requested: approval_id, call_id, kind, detail;
|
|
57
|
-
# resolved: approval_id, call_id, decision(回放/审计)
|
|
58
|
-
APPROVAL_REQUESTED = "approval.requested"
|
|
59
|
-
APPROVAL_RESOLVED = "approval.resolved"
|
|
60
|
-
# run 生命周期。payload: status;progress?: progress;failed: error;canceled: cancel_result
|
|
61
|
-
RUN_STARTED = "run.started"
|
|
62
|
-
RUN_PROGRESS = "run.progress"
|
|
63
|
-
RUN_INTERRUPTED = "run.interrupted"
|
|
64
|
-
RUN_COMPLETED = "run.completed"
|
|
65
|
-
RUN_FAILED = "run.failed"
|
|
66
|
-
RUN_CANCELED = "run.canceled"
|
|
67
|
-
# checkpoint。payload: checkpoint_id, granularity(delta|snapshot), resume_target?
|
|
68
|
-
CHECKPOINT_CREATED = "checkpoint.created"
|
|
69
|
-
CHECKPOINT_RESUMED = "checkpoint.resumed"
|
|
70
|
-
# usage。payload: input_tokens, output_tokens, total_tokens, cached_tokens, reasoning_tokens
|
|
71
|
-
USAGE_REPORTED = "usage.reported"
|
|
72
|
-
# A2UI。payload: surface_id, block_id?, catalog?, data?
|
|
73
|
-
A2UI_SURFACE_BEGIN = "a2ui.surface.begin"
|
|
74
|
-
A2UI_SURFACE_UPDATE = "a2ui.surface.update"
|
|
75
|
-
A2UI_SURFACE_END = "a2ui.surface.end"
|
|
76
|
-
A2UI_INTERACTION = "a2ui.interaction"
|
|
77
|
-
A2UI_ACTION = "a2ui.action"
|
|
78
|
-
# remote A2A。payload: task_id, origin(remote agent url/space), status?, artifact?
|
|
79
|
-
A2A_TASK_CREATED = "a2a.task.created"
|
|
80
|
-
A2A_TASK_STATUS = "a2a.task.status"
|
|
81
|
-
A2A_TASK_ARTIFACT = "a2a.task.artifact"
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
#: 全部 v1 事件类型(供校验/枚举)。
|
|
85
|
-
ALL_EVENT_TYPES: frozenset[str] = frozenset(
|
|
86
|
-
{
|
|
87
|
-
EventType.TEXT_DELTA,
|
|
88
|
-
EventType.TEXT_COMPLETED,
|
|
89
|
-
EventType.REASONING_DELTA,
|
|
90
|
-
EventType.REASONING_COMPLETED,
|
|
91
|
-
EventType.TOOL_CALL_BEGIN,
|
|
92
|
-
EventType.TOOL_CALL_END,
|
|
93
|
-
EventType.ARTIFACT_CREATED,
|
|
94
|
-
EventType.ARTIFACT_UPDATED,
|
|
95
|
-
EventType.APPROVAL_REQUESTED,
|
|
96
|
-
EventType.APPROVAL_RESOLVED,
|
|
97
|
-
EventType.RUN_STARTED,
|
|
98
|
-
EventType.RUN_PROGRESS,
|
|
99
|
-
EventType.RUN_INTERRUPTED,
|
|
100
|
-
EventType.RUN_COMPLETED,
|
|
101
|
-
EventType.RUN_FAILED,
|
|
102
|
-
EventType.RUN_CANCELED,
|
|
103
|
-
EventType.CHECKPOINT_CREATED,
|
|
104
|
-
EventType.CHECKPOINT_RESUMED,
|
|
105
|
-
EventType.USAGE_REPORTED,
|
|
106
|
-
EventType.A2UI_SURFACE_BEGIN,
|
|
107
|
-
EventType.A2UI_SURFACE_UPDATE,
|
|
108
|
-
EventType.A2UI_SURFACE_END,
|
|
109
|
-
EventType.A2UI_INTERACTION,
|
|
110
|
-
EventType.A2UI_ACTION,
|
|
111
|
-
EventType.A2A_TASK_CREATED,
|
|
112
|
-
EventType.A2A_TASK_STATUS,
|
|
113
|
-
EventType.A2A_TASK_ARTIFACT,
|
|
114
|
-
}
|
|
115
|
-
)
|
|
116
|
-
|
|
117
|
-
#: 各 event_type 的 payload 必填键(conformance 用;additive —— 只允许增键)。
|
|
118
|
-
#: 信封字段是硬冻结;payload 必填键是 v1 最低契约,后续版本只能加可选键。
|
|
119
|
-
EVENT_PAYLOAD_REQUIRED_KEYS: dict[str, frozenset[str]] = {
|
|
120
|
-
EventType.TEXT_DELTA: frozenset({"text"}),
|
|
121
|
-
EventType.TEXT_COMPLETED: frozenset({"text"}),
|
|
122
|
-
EventType.REASONING_DELTA: frozenset({"text"}),
|
|
123
|
-
EventType.REASONING_COMPLETED: frozenset({"text"}),
|
|
124
|
-
EventType.TOOL_CALL_BEGIN: frozenset({"call_id", "name"}),
|
|
125
|
-
EventType.TOOL_CALL_END: frozenset({"call_id", "name"}),
|
|
126
|
-
EventType.ARTIFACT_CREATED: frozenset({"name", "version"}),
|
|
127
|
-
EventType.ARTIFACT_UPDATED: frozenset({"name", "version"}),
|
|
128
|
-
EventType.APPROVAL_REQUESTED: frozenset({"approval_id", "call_id", "kind"}),
|
|
129
|
-
EventType.APPROVAL_RESOLVED: frozenset({"approval_id", "call_id", "decision"}),
|
|
130
|
-
EventType.RUN_STARTED: frozenset({"status"}),
|
|
131
|
-
EventType.RUN_PROGRESS: frozenset({"status"}),
|
|
132
|
-
EventType.RUN_INTERRUPTED: frozenset({"status"}),
|
|
133
|
-
EventType.RUN_COMPLETED: frozenset({"status"}),
|
|
134
|
-
EventType.RUN_FAILED: frozenset({"status", "error"}),
|
|
135
|
-
EventType.RUN_CANCELED: frozenset({"status"}),
|
|
136
|
-
EventType.CHECKPOINT_CREATED: frozenset({"checkpoint_id", "granularity"}),
|
|
137
|
-
EventType.CHECKPOINT_RESUMED: frozenset({"checkpoint_id"}),
|
|
138
|
-
EventType.USAGE_REPORTED: frozenset({"input_tokens", "output_tokens", "total_tokens"}),
|
|
139
|
-
EventType.A2UI_SURFACE_BEGIN: frozenset({"surface_id"}),
|
|
140
|
-
EventType.A2UI_SURFACE_UPDATE: frozenset({"surface_id"}),
|
|
141
|
-
EventType.A2UI_SURFACE_END: frozenset({"surface_id"}),
|
|
142
|
-
EventType.A2UI_INTERACTION: frozenset({"surface_id"}),
|
|
143
|
-
EventType.A2UI_ACTION: frozenset({"surface_id"}),
|
|
144
|
-
EventType.A2A_TASK_CREATED: frozenset({"task_id", "origin"}),
|
|
145
|
-
EventType.A2A_TASK_STATUS: frozenset({"task_id", "origin", "status"}),
|
|
146
|
-
EventType.A2A_TASK_ARTIFACT: frozenset({"task_id", "origin"}),
|
|
147
|
-
}
|
|
148
|
-
|
|
149
|
-
#: 仅 text/reasoning 类事件使用相位字段。
|
|
150
|
-
_PHASE_AWARE_TYPES: frozenset[str] = frozenset(
|
|
151
|
-
{
|
|
152
|
-
EventType.TEXT_DELTA,
|
|
153
|
-
EventType.TEXT_COMPLETED,
|
|
154
|
-
EventType.REASONING_DELTA,
|
|
155
|
-
EventType.REASONING_COMPLETED,
|
|
156
|
-
}
|
|
157
|
-
)
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
class RuntimeEvent(BaseModel):
|
|
161
|
-
"""RuntimeEvent v1 信封。
|
|
162
|
-
|
|
163
|
-
字段全部硬冻结(additive 演进只允许新增可选字段)。``payload`` 按 event_type
|
|
164
|
-
承载,最低必填键见 :data:`EVENT_PAYLOAD_REQUIRED_KEYS`。
|
|
165
|
-
"""
|
|
166
|
-
|
|
167
|
-
schema_version: Literal[1] = SCHEMA_VERSION
|
|
168
|
-
event_id: str
|
|
169
|
-
event_type: str
|
|
170
|
-
timestamp: float
|
|
171
|
-
agent_id: str
|
|
172
|
-
user_id: str
|
|
173
|
-
session_id: str
|
|
174
|
-
invocation_id: str
|
|
175
|
-
seq_id: int
|
|
176
|
-
phase: Optional[Literal["commentary", "final_answer"]] = None
|
|
177
|
-
payload: dict[str, Any] = Field(default_factory=dict)
|
|
178
|
-
|
|
179
|
-
# ---- 构造 ----
|
|
180
|
-
|
|
181
|
-
@classmethod
|
|
182
|
-
def create(
|
|
183
|
-
cls,
|
|
184
|
-
event_type: str,
|
|
185
|
-
*,
|
|
186
|
-
agent_id: str,
|
|
187
|
-
user_id: str,
|
|
188
|
-
session_id: str,
|
|
189
|
-
invocation_id: str,
|
|
190
|
-
seq_id: int,
|
|
191
|
-
payload: Optional[dict[str, Any]] = None,
|
|
192
|
-
phase: Optional[str] = None,
|
|
193
|
-
event_id: Optional[str] = None,
|
|
194
|
-
timestamp: Optional[float] = None,
|
|
195
|
-
) -> "RuntimeEvent":
|
|
196
|
-
"""便捷构造:自动补 event_id / timestamp,并按 event_type 校验相位与 payload。"""
|
|
197
|
-
event = cls(
|
|
198
|
-
event_id=event_id or f"evt_{uuid.uuid4().hex}",
|
|
199
|
-
event_type=event_type,
|
|
200
|
-
timestamp=time.time() if timestamp is None else timestamp,
|
|
201
|
-
agent_id=agent_id,
|
|
202
|
-
user_id=user_id,
|
|
203
|
-
session_id=session_id,
|
|
204
|
-
invocation_id=invocation_id,
|
|
205
|
-
seq_id=seq_id,
|
|
206
|
-
phase=phase, # type: ignore[arg-type]
|
|
207
|
-
payload=payload or {},
|
|
208
|
-
)
|
|
209
|
-
event.validate_conformance()
|
|
210
|
-
return event
|
|
211
|
-
|
|
212
|
-
# ---- 序列化 ----
|
|
213
|
-
|
|
214
|
-
def to_dict(self) -> dict[str, Any]:
|
|
215
|
-
"""序列化为 dict(含全部信封字段 + payload)。"""
|
|
216
|
-
return self.model_dump(mode="json", exclude_none=True)
|
|
217
|
-
|
|
218
|
-
def to_json(self) -> str:
|
|
219
|
-
"""序列化为 JSON 字符串。"""
|
|
220
|
-
return self.model_dump_json(exclude_none=True)
|
|
221
|
-
|
|
222
|
-
@classmethod
|
|
223
|
-
def from_dict(cls, data: dict[str, Any]) -> "RuntimeEvent":
|
|
224
|
-
"""从 dict 反序列化。与 :meth:`create` 一致过 conformance:
|
|
225
|
-
未知 event_type / 相位滥用 / 缺必填键抛 ``ValueError``,不得混入系统。"""
|
|
226
|
-
event = cls.model_validate(data)
|
|
227
|
-
event.validate_conformance()
|
|
228
|
-
return event
|
|
229
|
-
|
|
230
|
-
@classmethod
|
|
231
|
-
def from_json(cls, raw: str) -> "RuntimeEvent":
|
|
232
|
-
"""从 JSON 字符串反序列化(同 :meth:`from_dict` 过 conformance)。"""
|
|
233
|
-
event = cls.model_validate_json(raw)
|
|
234
|
-
event.validate_conformance()
|
|
235
|
-
return event
|
|
6
|
+
from ksadk.events.canonical import * # noqa: F403
|
|
7
|
+
from ksadk.events.canonical import __all__
|
|
8
|
+
from ksadk.events.v1_compat import EventTypeV1
|
|
236
9
|
|
|
237
|
-
# ---- conformance ----
|
|
238
10
|
|
|
239
|
-
|
|
240
|
-
|
|
11
|
+
class _MergedEventType(EventTypeV1):
|
|
12
|
+
"""EventTypeV1 plus the v1 members added by the observability branch
|
|
13
|
+
(user.message / turn.* / step.* / model.call.*) so that merged callers
|
|
14
|
+
keep working on top of the canonical v2 event core."""
|
|
241
15
|
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
)
|
|
251
|
-
required = EVENT_PAYLOAD_REQUIRED_KEYS.get(self.event_type, frozenset())
|
|
252
|
-
missing = required - set(self.payload.keys())
|
|
253
|
-
if missing:
|
|
254
|
-
raise ValueError(f"event_type {self.event_type!r} payload 缺必填键: {sorted(missing)}")
|
|
16
|
+
USER_MESSAGE = "user.message"
|
|
17
|
+
TURN_STARTED = "turn.started"
|
|
18
|
+
TURN_COMPLETED = "turn.completed"
|
|
19
|
+
STEP_STARTED = "step.started"
|
|
20
|
+
STEP_COMPLETED = "step.completed"
|
|
21
|
+
MODEL_CALL_BEGIN = "model.call.begin"
|
|
22
|
+
MODEL_CALL_FIRST_TOKEN = "model.call.first_token"
|
|
23
|
+
MODEL_CALL_END = "model.call.end"
|
|
255
24
|
|
|
256
25
|
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
"EventPhase",
|
|
261
|
-
"EventType",
|
|
262
|
-
"RuntimeEvent",
|
|
263
|
-
"SCHEMA_VERSION",
|
|
264
|
-
]
|
|
26
|
+
# Alias kept for callers integrated before the canonical v2 refactor
|
|
27
|
+
# (studio observability/evaluation imports on merged branches).
|
|
28
|
+
EventType = _MergedEventType
|
|
@@ -0,0 +1,324 @@
|
|
|
1
|
+
"""Generic single-log SessionEvent store port(Phase 1 Task 2)。
|
|
2
|
+
|
|
3
|
+
把 control/runtime/workflow 等 family 的 ``SessionEventEnvelope/v1`` 收敛进
|
|
4
|
+
同一个 session event log,复用 Session backend 的原子 per-session seq。
|
|
5
|
+
写入权限是 typed guard(``AdmissionWriteGuard | ActivationWriteGuard``),
|
|
6
|
+
禁止无 guard append;发布(订阅可见性)只发生在 backend 事务 commit 之后,
|
|
7
|
+
订阅先 replay ``seq > after_seq`` 再切 live,用同一 cursor 去重。
|
|
8
|
+
|
|
9
|
+
物理 ``SessionEvent.id`` 是 ``(session_id, event_id)`` 的确定性编码,
|
|
10
|
+
与 ``ksadk.events.canonical_store.canonical_storage_id`` 算法一致,
|
|
11
|
+
让 durable 主键在分配 session cursor 之前先约束幂等域。
|
|
12
|
+
"""
|
|
13
|
+
|
|
14
|
+
from __future__ import annotations
|
|
15
|
+
|
|
16
|
+
import asyncio
|
|
17
|
+
import hashlib
|
|
18
|
+
import json
|
|
19
|
+
from collections.abc import AsyncIterator, Awaitable, Callable
|
|
20
|
+
from datetime import datetime, timezone
|
|
21
|
+
from typing import Any, Protocol
|
|
22
|
+
|
|
23
|
+
from ksadk.events.canonical import parse_runtime_event
|
|
24
|
+
from ksadk.kernel.contracts import (
|
|
25
|
+
ActivationWriteGuard,
|
|
26
|
+
AdmissionWriteGuard,
|
|
27
|
+
SessionEventEnvelope,
|
|
28
|
+
SessionEventWriteGuard,
|
|
29
|
+
)
|
|
30
|
+
from ksadk.sessions.base import BaseSessionService, SessionEvent
|
|
31
|
+
|
|
32
|
+
_ENVELOPE_MARKER = "ksadk_session_event_envelope"
|
|
33
|
+
_ENVELOPE_CONTENT_KEY = "session_event"
|
|
34
|
+
_RUNTIME_CONTENT_KEY = "runtime_event"
|
|
35
|
+
_RUNTIME_FAMILY = "runtime"
|
|
36
|
+
_RUNTIME_FAMILY_VERSION = 2
|
|
37
|
+
_ADMISSION_CONTROL_EVENT_TYPES = frozenset(
|
|
38
|
+
{"control.command_accepted", "control.command_rejected"}
|
|
39
|
+
)
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
def session_event_storage_id(session_id: str, event_id: str) -> str:
|
|
43
|
+
"""Deterministic physical id for one envelope fact (same digest as canonical)."""
|
|
44
|
+
|
|
45
|
+
if not session_id.strip() or not event_id.strip():
|
|
46
|
+
raise ValueError("session_id and event_id must be nonempty")
|
|
47
|
+
encoded = json.dumps([session_id, event_id], ensure_ascii=False, separators=(",", ":")).encode(
|
|
48
|
+
"utf-8"
|
|
49
|
+
)
|
|
50
|
+
return f"cev_{hashlib.sha256(encoded).hexdigest()[:40]}"
|
|
51
|
+
|
|
52
|
+
|
|
53
|
+
def _timestamp_to_float(value: str) -> float:
|
|
54
|
+
parsed = datetime.fromisoformat(value.replace("Z", "+00:00"))
|
|
55
|
+
if parsed.tzinfo is None:
|
|
56
|
+
parsed = parsed.replace(tzinfo=timezone.utc)
|
|
57
|
+
return parsed.timestamp()
|
|
58
|
+
|
|
59
|
+
|
|
60
|
+
class SessionEventStore(Protocol):
|
|
61
|
+
"""Generic envelope port. Append without a typed guard is forbidden."""
|
|
62
|
+
|
|
63
|
+
async def append(
|
|
64
|
+
self, envelope: SessionEventEnvelope, *, guard: SessionEventWriteGuard
|
|
65
|
+
) -> SessionEventEnvelope: ...
|
|
66
|
+
|
|
67
|
+
async def read(
|
|
68
|
+
self, session_id: str, after_seq: int, limit: int
|
|
69
|
+
) -> list[SessionEventEnvelope]: ...
|
|
70
|
+
|
|
71
|
+
def subscribe(
|
|
72
|
+
self, session_id: str, after_seq: int
|
|
73
|
+
) -> AsyncIterator[SessionEventEnvelope]: ...
|
|
74
|
+
|
|
75
|
+
|
|
76
|
+
def validate_write_guard(
|
|
77
|
+
envelope: SessionEventEnvelope, guard: SessionEventWriteGuard
|
|
78
|
+
) -> SessionEventWriteGuard:
|
|
79
|
+
"""Typed write permission: no bare booleans, no nullable fences.
|
|
80
|
+
|
|
81
|
+
AdmissionWriteGuard 只允许 admission 产生的 ``control.command_accepted`` /
|
|
82
|
+
``control.command_rejected``。ActivationWriteGuard 在 Phase 1 允许
|
|
83
|
+
worker/control/runtime facts;activation_id/fencing_token 与 lease 的
|
|
84
|
+
事务内比较由 Task 3 的 AgentKernelStore 承接。
|
|
85
|
+
"""
|
|
86
|
+
|
|
87
|
+
if isinstance(guard, bool) or not isinstance(guard, (AdmissionWriteGuard, ActivationWriteGuard)):
|
|
88
|
+
raise TypeError(
|
|
89
|
+
"append requires a typed SessionEventWriteGuard "
|
|
90
|
+
"(AdmissionWriteGuard | ActivationWriteGuard)"
|
|
91
|
+
)
|
|
92
|
+
if isinstance(guard, AdmissionWriteGuard):
|
|
93
|
+
if envelope.family != "control" or envelope.event_type not in _ADMISSION_CONTROL_EVENT_TYPES:
|
|
94
|
+
raise PermissionError(
|
|
95
|
+
"AdmissionWriteGuard may only append control.command_accepted or "
|
|
96
|
+
"control.command_rejected facts"
|
|
97
|
+
)
|
|
98
|
+
return guard
|
|
99
|
+
|
|
100
|
+
|
|
101
|
+
def envelope_to_session_event(envelope: SessionEventEnvelope) -> SessionEvent:
|
|
102
|
+
"""Pack one envelope into the existing SessionEvent carrier."""
|
|
103
|
+
|
|
104
|
+
content: dict[str, Any] = {_ENVELOPE_CONTENT_KEY: envelope.model_dump(mode="json")}
|
|
105
|
+
binding = "session_event.seq"
|
|
106
|
+
if envelope.family == _RUNTIME_FAMILY and envelope.family_version == _RUNTIME_FAMILY_VERSION:
|
|
107
|
+
binding = "runtime_event.seq"
|
|
108
|
+
content[_RUNTIME_CONTENT_KEY] = dict(envelope.payload)
|
|
109
|
+
metadata: dict[str, Any] = {
|
|
110
|
+
_ENVELOPE_MARKER: True,
|
|
111
|
+
"schema_version": 1,
|
|
112
|
+
"family": envelope.family,
|
|
113
|
+
"family_version": envelope.family_version,
|
|
114
|
+
"canonical_event_id": str(envelope.event_id),
|
|
115
|
+
}
|
|
116
|
+
if envelope.run_id is not None:
|
|
117
|
+
metadata["run_id"] = envelope.run_id
|
|
118
|
+
return SessionEvent(
|
|
119
|
+
id=session_event_storage_id(envelope.session_id, str(envelope.event_id)),
|
|
120
|
+
session_id=envelope.session_id,
|
|
121
|
+
author=envelope.actor_ref or envelope.family,
|
|
122
|
+
event_type=envelope.event_type,
|
|
123
|
+
content=content,
|
|
124
|
+
timestamp=_timestamp_to_float(envelope.timestamp),
|
|
125
|
+
invocation_id=envelope.run_id,
|
|
126
|
+
metadata=metadata,
|
|
127
|
+
seq_binding=binding, # type: ignore[arg-type]
|
|
128
|
+
)
|
|
129
|
+
|
|
130
|
+
|
|
131
|
+
def session_event_to_envelope(event: SessionEvent) -> SessionEventEnvelope | None:
|
|
132
|
+
"""Restore an envelope using the physical session cursor as ``seq``."""
|
|
133
|
+
|
|
134
|
+
metadata = event.metadata or {}
|
|
135
|
+
if not metadata.get(_ENVELOPE_MARKER):
|
|
136
|
+
return None
|
|
137
|
+
dump = dict((event.content or {}).get(_ENVELOPE_CONTENT_KEY) or {})
|
|
138
|
+
if not isinstance(dump, dict):
|
|
139
|
+
raise ValueError("canonical SessionEvent is missing session_event content")
|
|
140
|
+
if metadata.get("family") == _RUNTIME_FAMILY:
|
|
141
|
+
runtime_payload = (event.content or {}).get(_RUNTIME_CONTENT_KEY)
|
|
142
|
+
if not isinstance(runtime_payload, dict):
|
|
143
|
+
raise ValueError("runtime family SessionEvent is missing runtime_event content")
|
|
144
|
+
if runtime_payload.get("seq") != event.seq_id:
|
|
145
|
+
raise ValueError("runtime payload seq does not match physical seq")
|
|
146
|
+
dump["payload"] = dict(runtime_payload)
|
|
147
|
+
if str(dump.get("event_id")) != str(metadata.get("canonical_event_id")):
|
|
148
|
+
raise ValueError("canonical SessionEvent event id metadata does not match content")
|
|
149
|
+
dump["seq"] = event.seq_id
|
|
150
|
+
return SessionEventEnvelope.model_validate(dump)
|
|
151
|
+
|
|
152
|
+
|
|
153
|
+
class SessionServiceEventStore:
|
|
154
|
+
"""``SessionEventStore`` adapter over one ``BaseSessionService`` backend.
|
|
155
|
+
|
|
156
|
+
``fence_validator`` 是可选的 ActivationWriteGuard 事务内 CAS seam:
|
|
157
|
+
提供时(典型为 ``AgentKernelStore.validate_write_fence``),每个
|
|
158
|
+
activation 写都在持久化之前比较当前 lease 的 fencing token,被
|
|
159
|
+
takeover 的旧 owner 得到 :class:`~ksadk.kernel.errors.StaleFenceError`。
|
|
160
|
+
validator 只看 guard,不向 envelope/payload 写入任何 fence 字段。
|
|
161
|
+
"""
|
|
162
|
+
|
|
163
|
+
def __init__(
|
|
164
|
+
self,
|
|
165
|
+
session_service: BaseSessionService,
|
|
166
|
+
*,
|
|
167
|
+
fence_validator: Callable[
|
|
168
|
+
[SessionEventEnvelope, ActivationWriteGuard], Awaitable[None]
|
|
169
|
+
]
|
|
170
|
+
| None = None,
|
|
171
|
+
) -> None:
|
|
172
|
+
self._service = session_service
|
|
173
|
+
self._fence_validator = fence_validator
|
|
174
|
+
|
|
175
|
+
@property
|
|
176
|
+
def session_service(self) -> BaseSessionService:
|
|
177
|
+
return self._service
|
|
178
|
+
|
|
179
|
+
async def append(
|
|
180
|
+
self, envelope: SessionEventEnvelope, *, guard: SessionEventWriteGuard
|
|
181
|
+
) -> SessionEventEnvelope:
|
|
182
|
+
validate_write_guard(envelope, guard)
|
|
183
|
+
if (
|
|
184
|
+
isinstance(guard, ActivationWriteGuard)
|
|
185
|
+
and self._fence_validator is not None
|
|
186
|
+
):
|
|
187
|
+
await self._fence_validator(envelope, guard)
|
|
188
|
+
if not envelope.session_id.strip():
|
|
189
|
+
raise ValueError("session_id must be nonempty")
|
|
190
|
+
self._require_storage_capabilities(envelope)
|
|
191
|
+
existing = await self._find_envelope(envelope)
|
|
192
|
+
if existing is not None:
|
|
193
|
+
self._assert_same_fact(existing, envelope)
|
|
194
|
+
return existing
|
|
195
|
+
packed = envelope_to_session_event(envelope)
|
|
196
|
+
try:
|
|
197
|
+
stored = await self._service.append_event(envelope.session_id, packed)
|
|
198
|
+
except Exception:
|
|
199
|
+
# Deterministic physical id turns concurrent appends into an
|
|
200
|
+
# insert-winner/insert-loser race on durable backends.
|
|
201
|
+
existing = await self._find_envelope(envelope)
|
|
202
|
+
if existing is None:
|
|
203
|
+
raise
|
|
204
|
+
self._assert_same_fact(existing, envelope)
|
|
205
|
+
return existing
|
|
206
|
+
persisted = session_event_to_envelope(stored)
|
|
207
|
+
if persisted is None: # pragma: no cover - packed by this module
|
|
208
|
+
raise RuntimeError("SessionEventEnvelope lost its storage marker")
|
|
209
|
+
return persisted
|
|
210
|
+
|
|
211
|
+
async def read(
|
|
212
|
+
self, session_id: str, after_seq: int, limit: int
|
|
213
|
+
) -> list[SessionEventEnvelope]:
|
|
214
|
+
if limit < 1:
|
|
215
|
+
raise ValueError("limit must be positive")
|
|
216
|
+
raw = await self._service.get_events(
|
|
217
|
+
session_id,
|
|
218
|
+
after_seq_id=int(after_seq),
|
|
219
|
+
limit=limit,
|
|
220
|
+
)
|
|
221
|
+
rows = sorted(raw, key=lambda event: event.seq_id)
|
|
222
|
+
envelopes = []
|
|
223
|
+
for row in rows:
|
|
224
|
+
envelope = session_event_to_envelope(row)
|
|
225
|
+
if envelope is None:
|
|
226
|
+
continue
|
|
227
|
+
_validate_runtime_payload(envelope)
|
|
228
|
+
envelopes.append(envelope)
|
|
229
|
+
return envelopes[:limit]
|
|
230
|
+
|
|
231
|
+
async def subscribe(
|
|
232
|
+
self,
|
|
233
|
+
session_id: str,
|
|
234
|
+
after_seq: int,
|
|
235
|
+
*,
|
|
236
|
+
poll_interval: float = 0.25,
|
|
237
|
+
timeout: float = 5 * 60,
|
|
238
|
+
should_stop: Callable[[], Awaitable[bool]] | None = None,
|
|
239
|
+
) -> AsyncIterator[SessionEventEnvelope]:
|
|
240
|
+
"""Replay ``seq > after_seq`` first, then follow live with the same cursor.
|
|
241
|
+
|
|
242
|
+
只读取已 commit 的事实行(backend append 返回值),因此 publish 天然
|
|
243
|
+
发生在 transaction commit 之后;replay→live 切换窗口由同一 cursor 去重。
|
|
244
|
+
"""
|
|
245
|
+
|
|
246
|
+
cursor = int(after_seq or 0)
|
|
247
|
+
deadline = asyncio.get_running_loop().time() + timeout
|
|
248
|
+
while True:
|
|
249
|
+
rows = await self._service.get_events(session_id, after_seq_id=cursor)
|
|
250
|
+
rows.sort(key=lambda event: event.seq_id)
|
|
251
|
+
for row in rows:
|
|
252
|
+
cursor = row.seq_id
|
|
253
|
+
envelope = session_event_to_envelope(row)
|
|
254
|
+
if envelope is not None:
|
|
255
|
+
_validate_runtime_payload(envelope)
|
|
256
|
+
yield envelope
|
|
257
|
+
if asyncio.get_running_loop().time() >= deadline:
|
|
258
|
+
return
|
|
259
|
+
if should_stop is not None and await should_stop():
|
|
260
|
+
# 客户端断开:及时收口,而不是继续轮询到 timeout。
|
|
261
|
+
return
|
|
262
|
+
await asyncio.sleep(poll_interval)
|
|
263
|
+
|
|
264
|
+
async def _find_envelope(
|
|
265
|
+
self, envelope: SessionEventEnvelope
|
|
266
|
+
) -> SessionEventEnvelope | None:
|
|
267
|
+
storage_id = session_event_storage_id(envelope.session_id, str(envelope.event_id))
|
|
268
|
+
stored = await self._service.get_event_by_id(envelope.session_id, storage_id)
|
|
269
|
+
return session_event_to_envelope(stored) if stored is not None else None
|
|
270
|
+
|
|
271
|
+
@staticmethod
|
|
272
|
+
def _assert_same_fact(
|
|
273
|
+
existing: SessionEventEnvelope, candidate: SessionEventEnvelope
|
|
274
|
+
) -> None:
|
|
275
|
+
# ``seq`` is the store-assigned delivery cursor, not producer identity;
|
|
276
|
+
# the runtime payload's placeholder ``seq`` participates in the same rule.
|
|
277
|
+
def _comparable(envelope: SessionEventEnvelope) -> dict[str, Any]:
|
|
278
|
+
dump = envelope.model_dump(mode="json", exclude={"seq"})
|
|
279
|
+
payload = dict(dump.get("payload") or {})
|
|
280
|
+
payload.pop("seq", None)
|
|
281
|
+
dump["payload"] = payload
|
|
282
|
+
return dump
|
|
283
|
+
|
|
284
|
+
if _comparable(existing) != _comparable(candidate):
|
|
285
|
+
raise ValueError(f"SessionEvent id collision for {candidate.event_id!r}")
|
|
286
|
+
|
|
287
|
+
def _require_storage_capabilities(self, envelope: SessionEventEnvelope) -> None:
|
|
288
|
+
capabilities = self._service.storage_capabilities
|
|
289
|
+
required_binding = (
|
|
290
|
+
"runtime_event.seq"
|
|
291
|
+
if envelope.family == _RUNTIME_FAMILY
|
|
292
|
+
and envelope.family_version == _RUNTIME_FAMILY_VERSION
|
|
293
|
+
else "session_event.seq"
|
|
294
|
+
)
|
|
295
|
+
if required_binding not in capabilities.atomic_seq_bindings or (
|
|
296
|
+
not capabilities.indexed_event_lookup
|
|
297
|
+
):
|
|
298
|
+
raise RuntimeError(
|
|
299
|
+
"session backend must support atomic "
|
|
300
|
+
f"{required_binding} binding and indexed physical event lookup"
|
|
301
|
+
)
|
|
302
|
+
|
|
303
|
+
|
|
304
|
+
def _validate_runtime_payload(envelope: SessionEventEnvelope) -> None:
|
|
305
|
+
"""family=runtime/v2 时 payload 必须通过现有 RuntimeEvent/v2 校验。"""
|
|
306
|
+
|
|
307
|
+
if envelope.family != _RUNTIME_FAMILY or envelope.family_version != _RUNTIME_FAMILY_VERSION:
|
|
308
|
+
return
|
|
309
|
+
try:
|
|
310
|
+
parse_runtime_event(dict(envelope.payload))
|
|
311
|
+
except Exception as error: # noqa: BLE001 - surface as contract violation
|
|
312
|
+
raise ValueError(
|
|
313
|
+
f"runtime family payload failed RuntimeEvent/v2 validation: {error}"
|
|
314
|
+
) from error
|
|
315
|
+
|
|
316
|
+
|
|
317
|
+
__all__ = [
|
|
318
|
+
"SessionEventStore",
|
|
319
|
+
"SessionServiceEventStore",
|
|
320
|
+
"validate_write_guard",
|
|
321
|
+
"envelope_to_session_event",
|
|
322
|
+
"session_event_to_envelope",
|
|
323
|
+
"session_event_storage_id",
|
|
324
|
+
]
|