agentengine-sdk-python 0.8.1__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.1.dist-info → agentengine_sdk_python-0.8.2.dist-info}/METADATA +22 -2
- {agentengine_sdk_python-0.8.1.dist-info → agentengine_sdk_python-0.8.2.dist-info}/RECORD +356 -222
- ksadk/a2a/_space_client_events.py +381 -0
- ksadk/a2a/event_adapter.py +156 -64
- ksadk/a2a/executor.py +179 -63
- ksadk/a2a/space_client.py +6 -333
- ksadk/a2ui/core.py +222 -53
- ksadk/agui/_agent_helpers.py +243 -0
- ksadk/agui/a2ui_projection.py +12 -5
- ksadk/agui/agent.py +443 -259
- ksadk/api/client.py +525 -27
- ksadk/builders/code_builder.py +284 -8
- ksadk/builders/container_builder.py +8 -1
- ksadk/builders/managed_runtime_builder.py +39 -35
- ksadk/cli/__init__.py +17 -0
- ksadk/cli/cmd_dashboard.py +15 -1
- ksadk/cli/cmd_deploy.py +10 -2
- ksadk/cli/cmd_eval.py +66 -9
- ksadk/cli/cmd_evalset.py +284 -0
- ksadk/cli/cmd_files.py +5 -1
- ksadk/cli/cmd_hermes.py +1 -126
- ksadk/cli/cmd_invoke.py +28 -38
- ksadk/cli/cmd_managed_runtime.py +95 -0
- ksadk/cli/cmd_observe.py +85 -0
- ksadk/cli/cmd_openclaw.py +1 -435
- ksadk/cli/cmd_replay.py +28 -4
- ksadk/cli/cmd_studio.py +99 -8
- ksadk/cli/cmd_web.py +10 -2
- ksadk/cli/hermes_env.py +151 -0
- ksadk/cli/invoke_payload.py +49 -0
- ksadk/cli/openclaw_env.py +458 -0
- ksadk/codex/client.py +180 -30
- ksadk/codex/runtime.py +428 -326
- ksadk/configs/env_registry.py +66 -12
- ksadk/configs/env_registry_pcm.py +181 -0
- ksadk/configs/env_var_spec.py +18 -0
- ksadk/configs/global_config.py +5 -0
- 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/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 +184 -2
- ksadk/conversations/runtime_invocation.py +81 -3
- ksadk/conversations/runtime_observability.py +141 -0
- ksadk/conversations/runtime_payloads.py +42 -0
- ksadk/conversations/runtime_preparation.py +272 -2
- ksadk/conversations/runtime_resume.py +20 -1
- ksadk/conversations/runtime_stream_events.py +94 -9
- 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 +5 -0
- ksadk/deployment/providers/serverless.py +143 -69
- ksadk/evaluation/__init__.py +32 -0
- ksadk/evaluation/a2a_adapter.py +9 -1
- ksadk/evaluation/adapters.py +18 -5
- 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 +73 -4
- ksadk/evaluation/evaluators.py +183 -17
- ksadk/evaluation/evidence.py +258 -0
- ksadk/evaluation/executor.py +31 -6
- ksadk/evaluation/local_adapter.py +550 -0
- ksadk/evaluation/service_env.py +27 -0
- ksadk/evaluation/studio_build_adapter.py +253 -0
- ksadk/evaluation/target.py +15 -6
- 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 -265
- ksadk/events/session_event.py +324 -0
- ksadk/events/store.py +3 -316
- ksadk/events/v1_compat.py +41 -0
- ksadk/harness/runtime.py +160 -57
- 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 +7 -0
- ksadk/knowledge_base/service.py +32 -5
- 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 +384 -2
- ksadk/memory/adk/backends/sqlite_ltm_backend.py +95 -0
- 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 +188 -6
- ksadk/model_proxy/bootstrap.py +16 -9
- ksadk/model_proxy/detect.py +202 -9
- ksadk/model_proxy/namespace.py +39 -15
- ksadk/model_proxy/server.py +24 -5
- ksadk/model_proxy/transform.py +60 -2
- 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 +5 -5
- ksadk/runners/base_runner.py +16 -0
- ksadk/runners/factory.py +1 -2
- ksadk/runners/langgraph_runner.py +198 -437
- ksadk/runtime/_runner_adapter/__init__.py +1 -0
- ksadk/runtime/_runner_adapter/stream_mapping.py +788 -0
- ksadk/runtime/adapter.py +118 -2
- ksadk/runtime/conversation_execution.py +316 -182
- ksadk/runtime/executor.py +144 -3
- ksadk/runtime/factory.py +193 -7
- ksadk/runtime/hosted_finalizer.py +268 -0
- ksadk/runtime/launch.py +14 -1
- ksadk/runtime/preprocessing.py +25 -3
- ksadk/runtime/runner_adapter.py +288 -508
- ksadk/runtime/usage.py +33 -0
- ksadk/sandbox/backends/e2b.py +35 -2
- ksadk/server/composition.py +8 -0
- ksadk/server/factory.py +69 -6
- ksadk/server/routes/kernel_ingress.py +258 -0
- ksadk/server/routes/openai_compat.py +88 -8
- ksadk/server/routes/projection.py +35 -20
- ksadk/server/routes/run.py +94 -0
- ksadk/server/routes/sessions.py +2 -0
- ksadk/server/routes/streaming.py +5 -2
- ksadk/server/static/assets/{ArtifactsPanel-CakCqxEN.js → ArtifactsPanel-DSU1sWD_.js} +1 -1
- ksadk/server/static/assets/{CodeBlock-CynLknyO.js → CodeBlock-DOH6MVcn.js} +4 -4
- ksadk/server/static/assets/{MathMessageMarkdown-3sQdOysS.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-B_fH2YuH.js → chunk-5VM5RSS4-BVHAchFb.js} +1 -1
- ksadk/server/static/assets/{chunk-ND2GUHAM-D6rFLaVV.js → chunk-F27PBJKO-C-ipQzuS.js} +1 -1
- ksadk/server/static/assets/chunk-G27WJ6UU-C2EyJbIK.js +231 -0
- ksadk/server/static/assets/{chunk-4BX2VUAB-B9drTgOW.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-ChNs_Mdk.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-Dli7qW-B.js → dist-8hqcx0sU.js} +1 -1
- ksadk/server/static/assets/dist-B7seoj3d.js +1 -0
- ksadk/server/static/assets/{dist-C1sz5Eo3.js → dist-BE7bu-DL.js} +1 -1
- ksadk/server/static/assets/{dist-fhOuWds5.js → dist-BVDffZ0U.js} +1 -1
- ksadk/server/static/assets/{dist-BjOdlDjj.js → dist-BX8z72IC.js} +1 -1
- ksadk/server/static/assets/{dist-DsHPdk3W.js → dist-Bf2M8m3N.js} +1 -1
- ksadk/server/static/assets/{dist-o2OVmKvt.js → dist-BjU6y-A2.js} +1 -1
- ksadk/server/static/assets/{dist-DWKByxWV.js → dist-BytlxIDT.js} +1 -1
- ksadk/server/static/assets/{dist-DJN_6Y39.js → dist-CSh_DE14.js} +1 -1
- ksadk/server/static/assets/{dist-DQU9EWw-.js → dist-CXYYBw3_.js} +1 -1
- ksadk/server/static/assets/{dist-4N2NMVYg.js → dist-C_wsv-Qd.js} +1 -1
- ksadk/server/static/assets/{dist-gLnrGsoU.js → dist-ClxGviKw.js} +1 -1
- ksadk/server/static/assets/{dist-j6Dxmf_j.js → dist-CttYUqzS.js} +1 -1
- ksadk/server/static/assets/{dist-D6MpCZtz.js → dist-DNp6rLRA.js} +1 -1
- ksadk/server/static/assets/{dist-BB3-OwTQ.js → dist-DUX-id_F.js} +1 -1
- ksadk/server/static/assets/{dist-_pHPTyZ-.js → dist-DmldrHd_.js} +1 -1
- ksadk/server/static/assets/{dist-CWV4lDr1.js → dist-DnfXs8Vn.js} +2 -2
- ksadk/server/static/assets/{dist-B5oS1zcj.js → dist-Dq9gLD7L.js} +1 -1
- ksadk/server/static/assets/{dist-B-jNR6Vn.js → dist-W-TIVntx.js} +1 -1
- ksadk/server/static/assets/{dist-BIlKoW0k.js → dist-dDdADKFA.js} +1 -1
- ksadk/server/static/assets/{dist-X4TnqwOK.js → dist-dydu68Fl.js} +1 -1
- ksadk/server/static/assets/{dist-CmZHzlwZ.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-K0OOfVna.js → ishikawaDiagram-5VMMS53U-DWya9SG2.js} +6 -6
- ksadk/server/static/assets/{journeyDiagram-JHISSGLW-8LeOJaZp.js → journeyDiagram-EYS64GPL-DutxhSNI.js} +6 -6
- ksadk/server/static/assets/{kanban-definition-UN3LZRKU-C6uCgZrW.js → kanban-definition-3QL26DDD-DJdOF8Fm.js} +10 -10
- ksadk/server/static/assets/katex-vFWytM5c.js +257 -0
- ksadk/server/static/assets/{linear-hdBcYzM8.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-Bjy_2v4_.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-BmkRbwCg.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-l6iXmU65.js → sankeyDiagram-P5KCCOFB-CPH75rhw.js} +7 -7
- ksadk/server/static/assets/{sequenceDiagram-3UESZ5HK-Cq6UBeQB.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-DEz24vV0.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/studio/api.py +577 -25
- ksadk/studio/api_contracts.py +114 -5
- ksadk/studio/api_memory_routes.py +82 -0
- ksadk/studio/authoring.py +252 -27
- ksadk/studio/authoring_coordinator.py +799 -67
- ksadk/studio/builder.py +88 -11
- ksadk/studio/capabilities.py +17 -0
- ksadk/studio/cloud.py +1916 -95
- ksadk/studio/codex_agent_service.py +125 -14
- ksadk/studio/codex_authoring.py +469 -0
- ksadk/studio/codex_builder.py +138 -25
- ksadk/studio/codex_manifest.py +51 -22
- ksadk/studio/codex_run.py +46 -3
- ksadk/studio/compiler.py +1 -0
- ksadk/studio/contracts.py +114 -3
- ksadk/studio/event_store.py +25 -95
- ksadk/studio/framework_run.py +231 -3
- ksadk/studio/hosted_kernel.py +317 -0
- ksadk/studio/manifest_resolver.py +131 -0
- ksadk/studio/model_client.py +95 -9
- ksadk/studio/model_profile_service.py +1 -1
- ksadk/studio/operations.py +37 -5
- ksadk/studio/otel_trace.py +348 -42
- ksadk/studio/pcm_memory.py +85 -0
- ksadk/studio/repository.py +23 -2
- ksadk/studio/resource_catalog.py +43 -0
- ksadk/studio/run_service.py +563 -137
- ksadk/studio/runtime_source.py +42 -16
- ksadk/studio/service.py +1180 -72
- ksadk/studio/shared_web.py +32 -22
- ksadk/studio/static/assets/index-BLpcdrgW.css +1 -0
- ksadk/studio/static/assets/index-CYekR2Xv.js +260 -0
- ksadk/studio/static/index.html +2 -2
- ksadk/studio/templates.py +100 -8
- ksadk/studio/validator.py +19 -0
- ksadk/studio/workspace.py +30 -32
- ksadk/tracing/setup.py +304 -3
- ksadk/version.py +1 -1
- ksadk_runtime_common/schemas/runtime_event_v1.json +37 -0
- ksadk_runtime_common/schemas/runtime_event_v2.json +271 -0
- ksadk/events/parser.py +0 -191
- ksadk/server/static/assets/MathMessageMarkdown-DeYh8QPr.css +0 -1
- ksadk/server/static/assets/MermaidBlock-NERD_ef7.js +0 -303
- ksadk/server/static/assets/NativeTerminalPanel-CiHWf82q.js +0 -1
- ksadk/server/static/assets/arc-DrgjcKhl.js +0 -1
- ksadk/server/static/assets/architecture-7EHR7CIX-CpZLRCcY.js +0 -1
- ksadk/server/static/assets/architectureDiagram-3BPJPVTR-BXoVRbQ6.js +0 -36
- ksadk/server/static/assets/blockDiagram-GPEHLZMM-BnaB3Ywv.js +0 -132
- ksadk/server/static/assets/c4Diagram-AAUBKEIU-Dw4weZcp.js +0 -10
- ksadk/server/static/assets/channel-Dt3rQTFI.js +0 -1
- ksadk/server/static/assets/chunk-2J33WTMH-ChjpLK7j.js +0 -1
- ksadk/server/static/assets/chunk-55IACEB6-CK4ROATy.js +0 -1
- ksadk/server/static/assets/chunk-727SXJPM-B9KtTTgw.js +0 -206
- ksadk/server/static/assets/chunk-AQP2D5EJ-1O1mki3m.js +0 -231
- ksadk/server/static/assets/chunk-QZHKN3VN-iXEZtKQc.js +0 -1
- ksadk/server/static/assets/classDiagram-4FO5ZUOK-DIveV17Q.js +0 -1
- ksadk/server/static/assets/classDiagram-v2-Q7XG4LA2-DIveV17Q.js +0 -1
- ksadk/server/static/assets/cytoscape.esm-DelgaX4f.js +0 -321
- ksadk/server/static/assets/dagre-BM42HDAG-D0QXg_MQ.js +0 -4
- ksadk/server/static/assets/dagre-Bx709z4p.js +0 -1
- ksadk/server/static/assets/diagram-2AECGRRQ-DBDDKwBQ.js +0 -43
- ksadk/server/static/assets/diagram-5GNKFQAL-BkwDOxmO.js +0 -10
- ksadk/server/static/assets/diagram-KO2AKTUF-Bv8waYvY.js +0 -3
- ksadk/server/static/assets/diagram-LMA3HP47-e1VECDdu.js +0 -24
- ksadk/server/static/assets/diagram-OG6HWLK6-Ds9adfRl.js +0 -24
- ksadk/server/static/assets/dist-B5J2uhNk.js +0 -1
- ksadk/server/static/assets/erDiagram-TEJ5UH35-BPItFKH6.js +0 -85
- ksadk/server/static/assets/eventmodeling-FCH6USID-DYFSxbqr.js +0 -1
- ksadk/server/static/assets/flowDiagram-I6XJVG4X-BbYB9w5Y.js +0 -162
- ksadk/server/static/assets/ganttDiagram-6RSMTGT7-TQXa0KXv.js +0 -292
- ksadk/server/static/assets/gitGraph-WXDBUCRP-DyNYp6BN.js +0 -1
- ksadk/server/static/assets/gitGraphDiagram-PVQCEYII-bKblCnpa.js +0 -106
- ksadk/server/static/assets/graphlib-B8gBHxth.js +0 -1
- ksadk/server/static/assets/index-R52pJJvg.js +0 -177
- ksadk/server/static/assets/index-jJr3_955.css +0 -2
- ksadk/server/static/assets/info-J43DQDTF-WUx7qTde.js +0 -1
- ksadk/server/static/assets/infoDiagram-5YYISTIA-BGVT7J_i.js +0 -2
- ksadk/server/static/assets/katex-CYWseY5E.js +0 -265
- ksadk/server/static/assets/mermaid-parser.core-BWrDjSZM.js +0 -161
- ksadk/server/static/assets/packet-YPE3B663-BN13y_xl.js +0 -1
- ksadk/server/static/assets/pie-LRSECV5Y-ftSLXhhc.js +0 -1
- ksadk/server/static/assets/pieDiagram-4H26LBE5-GmmqNiVH.js +0 -30
- ksadk/server/static/assets/radar-GUYGQ44K-jaICkIeO.js +0 -1
- ksadk/server/static/assets/requirementDiagram-4Y6WPE33-DSWFqL7c.js +0 -84
- ksadk/server/static/assets/stateDiagram-AJRCARHV-qzTQpg3Y.js +0 -1
- ksadk/server/static/assets/stateDiagram-v2-BHNVJYJU-BYCoYGAN.js +0 -1
- ksadk/server/static/assets/treeView-BLDUP644-Cpib_vlz.js +0 -1
- ksadk/server/static/assets/treemap-LRROVOQU-DQxfmVHK.js +0 -1
- ksadk/server/static/assets/vennDiagram-CIIHVFJN-CMCixki2.js +0 -34
- ksadk/server/static/assets/wardley-L42UT6IY-BQYHnnkU.js +0 -1
- ksadk/server/static/assets/wardleyDiagram-YWT4CUSO-CVzB8F9K.js +0 -78
- ksadk/server/static/assets/xychartDiagram-2RQKCTM6-BFBqBLc1.js +0 -7
- ksadk/studio/evaluation.py +0 -192
- ksadk/studio/static/assets/index-CaEN0eTR.css +0 -1
- ksadk/studio/static/assets/index-DI2eY_NH.js +0 -252
- {agentengine_sdk_python-0.8.1.dist-info → agentengine_sdk_python-0.8.2.dist-info}/WHEEL +0 -0
- {agentengine_sdk_python-0.8.1.dist-info → agentengine_sdk_python-0.8.2.dist-info}/entry_points.txt +0 -0
- {agentengine_sdk_python-0.8.1.dist-info → agentengine_sdk_python-0.8.2.dist-info}/licenses/LICENSE +0 -0
- {agentengine_sdk_python-0.8.1.dist-info → agentengine_sdk_python-0.8.2.dist-info}/top_level.txt +0 -0
|
@@ -1,13 +1,19 @@
|
|
|
1
1
|
from __future__ import annotations
|
|
2
2
|
|
|
3
|
+
import logging
|
|
3
4
|
import os
|
|
4
5
|
from typing import Any, Callable, Dict, Mapping, Optional, Sequence
|
|
5
6
|
|
|
7
|
+
from ksadk.context_engine.shadow_plan import (
|
|
8
|
+
build_shadow_context_plan_dict,
|
|
9
|
+
minimal_shadow_context_plan_dict,
|
|
10
|
+
)
|
|
6
11
|
from ksadk.conversations.attachments import compact_attachment_result_for_session
|
|
7
12
|
from ksadk.conversations.context import (
|
|
8
13
|
build_history_from_events,
|
|
9
14
|
build_request_history,
|
|
10
15
|
build_responses_history_from_messages,
|
|
16
|
+
canonical_event_type,
|
|
11
17
|
project_responses_history,
|
|
12
18
|
)
|
|
13
19
|
from ksadk.conversations.model_options import normalize_model_options
|
|
@@ -66,7 +72,9 @@ from ksadk.conversations.runtime_resume import (
|
|
|
66
72
|
)
|
|
67
73
|
from ksadk.ids import new_run_id
|
|
68
74
|
from ksadk.model_policy import model_policy_options_for_model
|
|
69
|
-
from ksadk.sessions import resolve_session_service
|
|
75
|
+
from ksadk.sessions import SessionEvent, resolve_session_service
|
|
76
|
+
|
|
77
|
+
logger = logging.getLogger(__name__)
|
|
70
78
|
|
|
71
79
|
|
|
72
80
|
async def build_run_input(
|
|
@@ -87,6 +95,21 @@ async def build_run_input(
|
|
|
87
95
|
governance_state: RuntimeGovernanceState | None = None,
|
|
88
96
|
session_service_provider: Callable[[], Any] | None = None,
|
|
89
97
|
run_mode: str = RUN_MODE_FOREGROUND,
|
|
98
|
+
runner: Any | None = None,
|
|
99
|
+
runtime_type: str | None = None,
|
|
100
|
+
agent_system: str = "",
|
|
101
|
+
agent_task: str = "",
|
|
102
|
+
prompt_integration_mode: str = "",
|
|
103
|
+
context_engine_rollout: str | None = None,
|
|
104
|
+
memory_recall_enabled: bool | None = None,
|
|
105
|
+
memory_write_rollout: str | None = None,
|
|
106
|
+
memory_enabled: bool | None = None,
|
|
107
|
+
memory_write_mode: str = "candidate",
|
|
108
|
+
flush_before_compaction: bool = True,
|
|
109
|
+
provider_ref: str = "local-default",
|
|
110
|
+
deployment_mode: str = "local",
|
|
111
|
+
agent_max_input_tokens: int | None = None,
|
|
112
|
+
agent_reserve_output_tokens: int | None = None,
|
|
90
113
|
) -> PreparedConversationTurn:
|
|
91
114
|
"""构建一次 turn 的标准运行输入,并在进入模型前做上下文投影/压缩。
|
|
92
115
|
|
|
@@ -124,6 +147,26 @@ async def build_run_input(
|
|
|
124
147
|
}
|
|
125
148
|
normalized_instructions = str(instructions or "").strip()
|
|
126
149
|
|
|
150
|
+
# PR A:当 agent_system/agent_task 非空时,编译真实 CompiledPrompt(含 stable section)。
|
|
151
|
+
# 仅用于 hash/trace/future projection,不改 Runner 输入(payload["instructions"] 不变)。
|
|
152
|
+
# platform_policy_source 默认 EnvPlatformPolicySource(env 未设→不产 platform_safety)。
|
|
153
|
+
compiled_prompt: dict[str, Any] | None = None
|
|
154
|
+
if (agent_system or "").strip() or (agent_task or "").strip():
|
|
155
|
+
from ksadk.prompts.resolved import (
|
|
156
|
+
ResolvedPromptSources,
|
|
157
|
+
compile_resolved_prompt_dict,
|
|
158
|
+
get_default_platform_policy_source,
|
|
159
|
+
)
|
|
160
|
+
|
|
161
|
+
compiled_prompt = compile_resolved_prompt_dict(
|
|
162
|
+
ResolvedPromptSources(
|
|
163
|
+
agent_system=agent_system,
|
|
164
|
+
agent_task=agent_task,
|
|
165
|
+
request_instructions=normalized_instructions,
|
|
166
|
+
platform_policy_source=get_default_platform_policy_source(),
|
|
167
|
+
)
|
|
168
|
+
)
|
|
169
|
+
|
|
127
170
|
if resume_input is not None:
|
|
128
171
|
if not session_id:
|
|
129
172
|
raise ValueError("Responses resume input requires session_id")
|
|
@@ -184,6 +227,16 @@ async def build_run_input(
|
|
|
184
227
|
resume_input=normalized_resume_input,
|
|
185
228
|
run_mode=caller_run_mode,
|
|
186
229
|
run_trigger=RUN_TRIGGER_CHECKPOINT_RESUME,
|
|
230
|
+
shadow_context_plan=minimal_shadow_context_plan_dict(
|
|
231
|
+
runner=runner, runtime_type=runtime_type, deployment_mode=deployment_mode
|
|
232
|
+
),
|
|
233
|
+
compiled_prompt=None,
|
|
234
|
+
memory_write_rollout=memory_write_rollout,
|
|
235
|
+
memory_enabled=memory_enabled,
|
|
236
|
+
memory_recall_enabled=memory_recall_enabled,
|
|
237
|
+
memory_write_mode=memory_write_mode,
|
|
238
|
+
flush_before_compaction=flush_before_compaction,
|
|
239
|
+
provider_ref=provider_ref,
|
|
187
240
|
)
|
|
188
241
|
|
|
189
242
|
is_approval_resume = _is_approval_resume_input(normalized_resume_input)
|
|
@@ -287,6 +340,23 @@ async def build_run_input(
|
|
|
287
340
|
resume_input=effective_resume_input,
|
|
288
341
|
run_mode=caller_run_mode,
|
|
289
342
|
run_trigger=RUN_TRIGGER_APPROVAL_RESUME,
|
|
343
|
+
shadow_context_plan=build_shadow_context_plan_dict(
|
|
344
|
+
instructions=normalized_instructions,
|
|
345
|
+
history=history,
|
|
346
|
+
user_input=resume_text,
|
|
347
|
+
request_metadata=normalized_request_metadata,
|
|
348
|
+
runner=runner,
|
|
349
|
+
runtime_type=runtime_type,
|
|
350
|
+
model_metadata=resolved_model_metadata,
|
|
351
|
+
deployment_mode=deployment_mode,
|
|
352
|
+
),
|
|
353
|
+
compiled_prompt=None,
|
|
354
|
+
memory_write_rollout=memory_write_rollout,
|
|
355
|
+
memory_enabled=memory_enabled,
|
|
356
|
+
memory_recall_enabled=memory_recall_enabled,
|
|
357
|
+
memory_write_mode=memory_write_mode,
|
|
358
|
+
flush_before_compaction=flush_before_compaction,
|
|
359
|
+
provider_ref=provider_ref,
|
|
290
360
|
)
|
|
291
361
|
|
|
292
362
|
normalized_messages = _normalized_conversation_messages(messages)
|
|
@@ -349,6 +419,17 @@ async def build_run_input(
|
|
|
349
419
|
user_input=user_input or user_display_input,
|
|
350
420
|
)
|
|
351
421
|
|
|
422
|
+
# compaction_owner 硬门控(方案 §6.2):从 capability 取 owner,非 ksadk 时不走双阈值
|
|
423
|
+
from ksadk.context_engine.capabilities import (
|
|
424
|
+
capabilities_for_runner,
|
|
425
|
+
capabilities_for_runtime_type,
|
|
426
|
+
)
|
|
427
|
+
|
|
428
|
+
_caps = (
|
|
429
|
+
capabilities_for_runner(runner)
|
|
430
|
+
if runner is not None
|
|
431
|
+
else capabilities_for_runtime_type(runtime_type)
|
|
432
|
+
)
|
|
352
433
|
checkpoint = await _compact_conversation_history_with_governance(
|
|
353
434
|
governance_state,
|
|
354
435
|
session_id=resolved_session_id,
|
|
@@ -357,6 +438,9 @@ async def build_run_input(
|
|
|
357
438
|
model=model,
|
|
358
439
|
model_metadata=resolved_model_metadata,
|
|
359
440
|
session_service_provider=provider,
|
|
441
|
+
# PR D1:双阈值门控透传。ksadk_hosted → soft/hard proactive compact;否则旧单阈值。
|
|
442
|
+
prompt_integration_mode=prompt_integration_mode,
|
|
443
|
+
compaction_owner=_caps.compaction_owner,
|
|
360
444
|
)
|
|
361
445
|
event_history = await service.get_events(resolved_session_id)
|
|
362
446
|
history = build_history_from_events(event_history)
|
|
@@ -372,10 +456,32 @@ async def build_run_input(
|
|
|
372
456
|
request_responses_history,
|
|
373
457
|
responses_history,
|
|
374
458
|
)
|
|
459
|
+
# The current user event is persisted before context construction so an
|
|
460
|
+
# interrupted turn remains auditable. That event belongs to
|
|
461
|
+
# ``current_input`` though, not to prior history. Keep the legacy
|
|
462
|
+
# ``prepared.history`` contract unchanged for non-hosted paths, while the
|
|
463
|
+
# KsADK-owned planner receives only events from earlier invocations. Using
|
|
464
|
+
# invocation_id (instead of text equality) also handles users deliberately
|
|
465
|
+
# repeating the same message across turns.
|
|
466
|
+
hosted_history = _merge_request_history_with_session_history(
|
|
467
|
+
request_history,
|
|
468
|
+
build_history_from_events(
|
|
469
|
+
[event for event in event_history if event.invocation_id != resolved_invocation_id]
|
|
470
|
+
),
|
|
471
|
+
)
|
|
472
|
+
# PR D2:取最新 checkpoint 的 WorkingState(仅 ksadk_hosted 路径重注入)。
|
|
473
|
+
# 非 ksadk_hosted → working_state=None(零注入,Runner 输入与旧逻辑一致)。
|
|
474
|
+
# PTL retry 后 _refresh_history 也会重读 events,但此处 build_run_input 首次构建时取一次即可;
|
|
475
|
+
# PTL 路径若产生新 checkpoint,retry 用 prepared 已有 working_state(保守:不中途换)。
|
|
476
|
+
working_state: dict[str, Any] | None = None
|
|
477
|
+
if prompt_integration_mode == "ksadk_hosted":
|
|
478
|
+
working_state = _latest_checkpoint_working_state(event_history)
|
|
375
479
|
|
|
376
|
-
|
|
480
|
+
prepared = PreparedConversationTurn(
|
|
377
481
|
session_id=resolved_session_id,
|
|
378
482
|
invocation_id=resolved_invocation_id,
|
|
483
|
+
user_id=resolved_user_id,
|
|
484
|
+
agent_id=agent_id,
|
|
379
485
|
user_input=user_input,
|
|
380
486
|
user_display_input=user_display_input or user_input,
|
|
381
487
|
history=history,
|
|
@@ -405,7 +511,171 @@ async def build_run_input(
|
|
|
405
511
|
),
|
|
406
512
|
run_mode=caller_run_mode,
|
|
407
513
|
run_trigger=caller_run_trigger,
|
|
514
|
+
shadow_context_plan=build_shadow_context_plan_dict(
|
|
515
|
+
instructions=normalized_instructions,
|
|
516
|
+
history=hosted_history if prompt_integration_mode == "ksadk_hosted" else history,
|
|
517
|
+
user_input=user_input,
|
|
518
|
+
request_metadata=normalized_request_metadata,
|
|
519
|
+
runner=runner,
|
|
520
|
+
runtime_type=runtime_type,
|
|
521
|
+
model_metadata=resolved_model_metadata,
|
|
522
|
+
prompt_shadow=compiled_prompt,
|
|
523
|
+
prompt_integration_mode=prompt_integration_mode,
|
|
524
|
+
deployment_mode=deployment_mode,
|
|
525
|
+
),
|
|
526
|
+
compiled_prompt=compiled_prompt,
|
|
527
|
+
prompt_integration_mode=prompt_integration_mode,
|
|
528
|
+
working_state=working_state,
|
|
529
|
+
memory_write_rollout=memory_write_rollout,
|
|
530
|
+
memory_enabled=memory_enabled,
|
|
531
|
+
memory_recall_enabled=memory_recall_enabled,
|
|
532
|
+
memory_write_mode=memory_write_mode,
|
|
533
|
+
flush_before_compaction=flush_before_compaction,
|
|
534
|
+
provider_ref=provider_ref,
|
|
535
|
+
)
|
|
536
|
+
# PR E:ksadk_hosted + V2 开关时运行真实 hosted 链路,回填 context_plan/assembled_input。
|
|
537
|
+
# 失败回退空字段(prepared 字段语义完整),不阻断主链路。
|
|
538
|
+
await _maybe_fill_hosted_pipeline(
|
|
539
|
+
prepared,
|
|
540
|
+
compiled_prompt=compiled_prompt,
|
|
541
|
+
user_input=user_input,
|
|
542
|
+
history=hosted_history,
|
|
543
|
+
working_state=working_state,
|
|
544
|
+
model_metadata=resolved_model_metadata,
|
|
545
|
+
prompt_integration_mode=prompt_integration_mode,
|
|
546
|
+
context_engine_rollout=context_engine_rollout,
|
|
547
|
+
memory_recall_enabled=memory_recall_enabled,
|
|
548
|
+
runtime_type=runtime_type,
|
|
549
|
+
session_id=resolved_session_id,
|
|
550
|
+
invocation_id=resolved_invocation_id,
|
|
551
|
+
user_id=resolved_user_id,
|
|
552
|
+
agent_id=agent_id,
|
|
553
|
+
agent_max_input_tokens=agent_max_input_tokens,
|
|
554
|
+
agent_reserve_output_tokens=agent_reserve_output_tokens,
|
|
555
|
+
)
|
|
556
|
+
return prepared
|
|
557
|
+
|
|
558
|
+
|
|
559
|
+
async def _maybe_fill_hosted_pipeline(
|
|
560
|
+
prepared: PreparedConversationTurn,
|
|
561
|
+
*,
|
|
562
|
+
compiled_prompt: dict[str, Any] | None,
|
|
563
|
+
user_input: str,
|
|
564
|
+
history: list[dict[str, str]],
|
|
565
|
+
working_state: dict[str, Any] | None,
|
|
566
|
+
model_metadata: dict[str, Any],
|
|
567
|
+
prompt_integration_mode: str,
|
|
568
|
+
context_engine_rollout: str | None,
|
|
569
|
+
memory_recall_enabled: bool | None,
|
|
570
|
+
agent_max_input_tokens: int | None = None,
|
|
571
|
+
agent_reserve_output_tokens: int | None = None,
|
|
572
|
+
runtime_type: str | None,
|
|
573
|
+
session_id: str,
|
|
574
|
+
invocation_id: str,
|
|
575
|
+
user_id: str,
|
|
576
|
+
agent_id: str,
|
|
577
|
+
) -> None:
|
|
578
|
+
"""PR E:在 ksadk_hosted + V2 时运行 hosted 链路并回填 plan/assembly。
|
|
579
|
+
|
|
580
|
+
门控三重:``KSADK_CONTEXT_ENGINE_V2_ENABLED`` × ``prompt_integration_mode=="ksadk_hosted"``
|
|
581
|
+
× 已编译出含 prompt_content 的 CompiledPrompt(agent_system/agent_task 非空)。任一不满足
|
|
582
|
+
→ 不回填(走旧 PR B 分支,字节级一致)。
|
|
583
|
+
|
|
584
|
+
仅对 ``prompt_owner=ksadk`` 的 runtime(langgraph 系)启用;native_runtime(codex)不进入,
|
|
585
|
+
保证 Managed Codex 不被接管(方案 §6.2 / PCM-RUNNER-003)。
|
|
586
|
+
"""
|
|
587
|
+
from ksadk.context_engine.capabilities import (
|
|
588
|
+
assert_capability_not_circuit_open,
|
|
589
|
+
capabilities_for_runtime_type,
|
|
408
590
|
)
|
|
591
|
+
from ksadk.context_engine.hosted_pipeline import (
|
|
592
|
+
default_hosted_contributors,
|
|
593
|
+
hosted_pipeline_enabled,
|
|
594
|
+
run_hosted_pipeline,
|
|
595
|
+
)
|
|
596
|
+
|
|
597
|
+
if (
|
|
598
|
+
not hosted_pipeline_enabled(rollout=context_engine_rollout)
|
|
599
|
+
or prompt_integration_mode != "ksadk_hosted"
|
|
600
|
+
):
|
|
601
|
+
return
|
|
602
|
+
if (
|
|
603
|
+
not isinstance(compiled_prompt, dict)
|
|
604
|
+
or not str(compiled_prompt.get("prompt_content") or "").strip()
|
|
605
|
+
):
|
|
606
|
+
return
|
|
607
|
+
caps = capabilities_for_runtime_type(runtime_type)
|
|
608
|
+
if caps.prompt_owner != "ksadk":
|
|
609
|
+
return
|
|
610
|
+
# 门禁:该 Runner 若已因 capability mismatch 熔断,回退旧路径(方案 §6.1)。不抛给主链路。
|
|
611
|
+
try:
|
|
612
|
+
assert_capability_not_circuit_open(runtime_type=runtime_type, label="hosted_pipeline")
|
|
613
|
+
except Exception: # noqa: BLE001
|
|
614
|
+
logger.info("hosted pipeline skipped for session=%s: capability circuit open", session_id)
|
|
615
|
+
return
|
|
616
|
+
# PR E:注入默认 Contributors(MemoryRecall 等)进真实链路(方案 §8.7)。
|
|
617
|
+
contributors = default_hosted_contributors(
|
|
618
|
+
user_id=user_id,
|
|
619
|
+
agent_id=agent_id,
|
|
620
|
+
memory_recall_enabled=memory_recall_enabled,
|
|
621
|
+
)
|
|
622
|
+
try:
|
|
623
|
+
result = await run_hosted_pipeline(
|
|
624
|
+
compiled_prompt=compiled_prompt,
|
|
625
|
+
user_input=user_input,
|
|
626
|
+
history=history,
|
|
627
|
+
working_state=working_state,
|
|
628
|
+
model_metadata=model_metadata,
|
|
629
|
+
contributors=contributors,
|
|
630
|
+
# 与 shadow_plan 口径一致:ksadk_hosted + prompt_owner=ksadk + langgraph → ksadk_hosted
|
|
631
|
+
integration_mode=(
|
|
632
|
+
"ksadk_hosted"
|
|
633
|
+
if prompt_integration_mode == "ksadk_hosted"
|
|
634
|
+
and caps.prompt_owner == "ksadk"
|
|
635
|
+
and runtime_type == "langgraph"
|
|
636
|
+
else caps.integration_mode
|
|
637
|
+
),
|
|
638
|
+
accounting_accuracy=caps.token_accounting,
|
|
639
|
+
session_id=session_id,
|
|
640
|
+
invocation_id=invocation_id,
|
|
641
|
+
user_id=user_id,
|
|
642
|
+
agent_id=agent_id,
|
|
643
|
+
agent_max_input_tokens=agent_max_input_tokens,
|
|
644
|
+
agent_reserve_output_tokens=agent_reserve_output_tokens,
|
|
645
|
+
)
|
|
646
|
+
except Exception: # noqa: BLE001
|
|
647
|
+
logger.warning(
|
|
648
|
+
"hosted pipeline failed for session=%s; falling back to PR B path",
|
|
649
|
+
session_id,
|
|
650
|
+
)
|
|
651
|
+
return
|
|
652
|
+
if result is None:
|
|
653
|
+
return
|
|
654
|
+
prepared.context_plan = result.plan
|
|
655
|
+
prepared.assembled_input = {
|
|
656
|
+
"format": result.assembled.format,
|
|
657
|
+
"system": result.assembled.system,
|
|
658
|
+
"messages": list(result.assembled.messages),
|
|
659
|
+
"estimated_tokens": result.assembled.estimated_tokens,
|
|
660
|
+
"warnings": list(result.assembled.warnings),
|
|
661
|
+
}
|
|
662
|
+
|
|
663
|
+
|
|
664
|
+
def _latest_checkpoint_working_state(events: Sequence[SessionEvent]) -> dict[str, Any] | None:
|
|
665
|
+
"""取最新 context_checkpoint 事件的 working_state(PR D2)。
|
|
666
|
+
|
|
667
|
+
checkpoint metadata 由 compact_conversation_history 写入(仅 ksadk_hosted)。
|
|
668
|
+
无 checkpoint 或无 working_state 键时返回 None。
|
|
669
|
+
"""
|
|
670
|
+
for event in reversed(list(events)):
|
|
671
|
+
if canonical_event_type(event.event_type) != "context_checkpoint":
|
|
672
|
+
continue
|
|
673
|
+
meta = event.metadata or {}
|
|
674
|
+
ws = meta.get("working_state")
|
|
675
|
+
if isinstance(ws, dict):
|
|
676
|
+
return ws
|
|
677
|
+
return None
|
|
678
|
+
return None
|
|
409
679
|
|
|
410
680
|
|
|
411
681
|
async def _refresh_history(
|
|
@@ -15,7 +15,7 @@ from ksadk.conversations.run_kinds import (
|
|
|
15
15
|
validate_run_mode,
|
|
16
16
|
)
|
|
17
17
|
from ksadk.conversations.runtime_persistence import append_conversation_event
|
|
18
|
-
from ksadk.events.
|
|
18
|
+
from ksadk.events.v1_compat import EventTypeV1 as EventType
|
|
19
19
|
from ksadk.sessions import SessionEvent
|
|
20
20
|
from ksadk.tools.gateway import (
|
|
21
21
|
build_tool_receipt_idempotency_key,
|
|
@@ -81,6 +81,11 @@ def _approval_lifecycle_event_type(event: SessionEvent) -> str:
|
|
|
81
81
|
return "approval_request"
|
|
82
82
|
if event.event_type == EventType.APPROVAL_RESOLVED:
|
|
83
83
|
return "approval_response"
|
|
84
|
+
# canonical schema-v2:审批请求/应答是 interaction.* 事件。
|
|
85
|
+
if event.event_type == "interaction.requested":
|
|
86
|
+
return "approval_request"
|
|
87
|
+
if event.event_type in {"interaction.resolved", "approval.resolved"}:
|
|
88
|
+
return "approval_response"
|
|
84
89
|
return canonical_event_type(
|
|
85
90
|
event.event_type,
|
|
86
91
|
author=event.author,
|
|
@@ -102,6 +107,20 @@ def _approval_interrupt_info_from_event(event: SessionEvent) -> dict[str, Any]:
|
|
|
102
107
|
return dict(legacy_detail)
|
|
103
108
|
|
|
104
109
|
content = event.content or {}
|
|
110
|
+
# canonical schema-v2 envelope:content["runtime_event"]["request"]["detail"]
|
|
111
|
+
canonical_payload = content.get("runtime_event")
|
|
112
|
+
if isinstance(canonical_payload, Mapping):
|
|
113
|
+
request = canonical_payload.get("request")
|
|
114
|
+
if isinstance(request, Mapping):
|
|
115
|
+
raw_detail = request.get("detail")
|
|
116
|
+
detail = dict(raw_detail) if isinstance(raw_detail, Mapping) else {}
|
|
117
|
+
approval_id = request.get("call_id") or canonical_payload.get("interaction_id")
|
|
118
|
+
if approval_id:
|
|
119
|
+
detail.setdefault("approval_request_id", approval_id)
|
|
120
|
+
detail.setdefault("id", approval_id)
|
|
121
|
+
if request.get("call_id"):
|
|
122
|
+
detail.setdefault("run_id", request.get("call_id"))
|
|
123
|
+
return detail
|
|
105
124
|
payload = content.get("payload")
|
|
106
125
|
if not isinstance(payload, Mapping):
|
|
107
126
|
return {}
|
|
@@ -4,6 +4,7 @@ import asyncio
|
|
|
4
4
|
import time
|
|
5
5
|
from typing import Any, AsyncIterator, Callable, Dict, Mapping, Optional, Sequence
|
|
6
6
|
|
|
7
|
+
from ksadk.conversations.context import budget_tool_result_for_event
|
|
7
8
|
from ksadk.conversations.run_kinds import (
|
|
8
9
|
RUN_MODE_FOREGROUND,
|
|
9
10
|
trigger_from_resume_input,
|
|
@@ -38,10 +39,13 @@ from ksadk.conversations.runtime_observability import (
|
|
|
38
39
|
_extract_deferred_tool_names,
|
|
39
40
|
_get_conversation_tracer,
|
|
40
41
|
_normalize_usage_payload,
|
|
42
|
+
_set_context_plan_attributes,
|
|
41
43
|
_set_conversation_input_attributes,
|
|
42
44
|
_set_conversation_output_attributes,
|
|
43
45
|
_set_conversation_span_attributes,
|
|
44
46
|
_set_conversation_usage_attributes,
|
|
47
|
+
_set_prompt_cache_attributes,
|
|
48
|
+
_set_prompt_source_attributes,
|
|
45
49
|
_set_span_attribute,
|
|
46
50
|
_span_current_context,
|
|
47
51
|
_span_feedback_metadata,
|
|
@@ -79,6 +83,35 @@ from ksadk.tools.gateway import (
|
|
|
79
83
|
)
|
|
80
84
|
|
|
81
85
|
|
|
86
|
+
def _record_baseline_turn(
|
|
87
|
+
*,
|
|
88
|
+
prepared: Any,
|
|
89
|
+
model: str | None,
|
|
90
|
+
usage: Any,
|
|
91
|
+
ptl: bool,
|
|
92
|
+
attempts: int,
|
|
93
|
+
turn_start_monotonic: float | None,
|
|
94
|
+
) -> None:
|
|
95
|
+
"""env-gated 旁路采集:未启用时 no-op,启用时记录一条 turn 基线。不进决策路径。"""
|
|
96
|
+
from ksadk.context_engine.baseline import record_baseline_turn
|
|
97
|
+
|
|
98
|
+
latency_ms = None
|
|
99
|
+
if turn_start_monotonic is not None:
|
|
100
|
+
latency_ms = int((time.monotonic() - turn_start_monotonic) * 1000)
|
|
101
|
+
record_baseline_turn(
|
|
102
|
+
getattr(prepared, "shadow_context_plan", None),
|
|
103
|
+
session_id=getattr(prepared, "session_id", ""),
|
|
104
|
+
invocation_id=getattr(prepared, "invocation_id", ""),
|
|
105
|
+
model=str(model or ""),
|
|
106
|
+
usage=usage if isinstance(usage, Mapping) else None,
|
|
107
|
+
compaction_triggered=bool(getattr(prepared, "compaction_triggered", False)),
|
|
108
|
+
compaction_trigger=str(getattr(prepared, "compaction_trigger", "") or ""),
|
|
109
|
+
prompt_too_long=ptl,
|
|
110
|
+
retry_attempts=attempts,
|
|
111
|
+
turn_latency_ms=latency_ms,
|
|
112
|
+
)
|
|
113
|
+
|
|
114
|
+
|
|
82
115
|
async def _iter_conversation_turn_events(
|
|
83
116
|
*,
|
|
84
117
|
runner: Any,
|
|
@@ -100,6 +133,9 @@ async def _iter_conversation_turn_events(
|
|
|
100
133
|
invocation_id: Optional[str] = None,
|
|
101
134
|
session_service_provider: Callable[[], Any] | None = None,
|
|
102
135
|
run_mode: str = RUN_MODE_FOREGROUND,
|
|
136
|
+
agent_system: str = "",
|
|
137
|
+
agent_task: str = "",
|
|
138
|
+
prompt_integration_mode: str = "",
|
|
103
139
|
) -> AsyncIterator[dict[str, Any]]:
|
|
104
140
|
"""Internal semantic event stream shared by protocol serializers."""
|
|
105
141
|
provider = session_service_provider or resolve_session_service
|
|
@@ -117,6 +153,8 @@ async def _iter_conversation_turn_events(
|
|
|
117
153
|
model=model,
|
|
118
154
|
model_metadata=model_metadata,
|
|
119
155
|
session_service_provider=provider,
|
|
156
|
+
# PR D1:双阈值门控透传(仅 preview 用,不改会话)。
|
|
157
|
+
prompt_integration_mode=prompt_integration_mode,
|
|
120
158
|
)
|
|
121
159
|
else:
|
|
122
160
|
compaction_preview = CompactionPlan(
|
|
@@ -155,6 +193,11 @@ async def _iter_conversation_turn_events(
|
|
|
155
193
|
governance_state=governance,
|
|
156
194
|
session_service_provider=provider,
|
|
157
195
|
run_mode=entry_run_mode,
|
|
196
|
+
runner=runner,
|
|
197
|
+
runtime_type=_runner_type_name(runner),
|
|
198
|
+
agent_system=agent_system,
|
|
199
|
+
agent_task=agent_task,
|
|
200
|
+
prompt_integration_mode=prompt_integration_mode,
|
|
158
201
|
)
|
|
159
202
|
# prepared 之后的 run_status 写入复用 prepared 的 mode/trigger
|
|
160
203
|
run_mode = prepared.run_mode
|
|
@@ -180,6 +223,7 @@ async def _iter_conversation_turn_events(
|
|
|
180
223
|
user_id=user_id,
|
|
181
224
|
user_input=prepared.user_input,
|
|
182
225
|
)
|
|
226
|
+
prepared.memory_recall_events = ambient_contexts.get("memory_recall_events", [])
|
|
183
227
|
runtime_context = PlatformInvocationContext(
|
|
184
228
|
agent_id=agent_id,
|
|
185
229
|
user_id=user_id,
|
|
@@ -200,9 +244,7 @@ async def _iter_conversation_turn_events(
|
|
|
200
244
|
model_options=prepared.model_options,
|
|
201
245
|
kb_context=ambient_contexts.get("kb_context"),
|
|
202
246
|
memory_context=ambient_contexts.get("memory_context"),
|
|
203
|
-
tool_approval_mode=str(
|
|
204
|
-
prepared.request_metadata.get("tool_approval_mode") or ""
|
|
205
|
-
),
|
|
247
|
+
tool_approval_mode=str(prepared.request_metadata.get("tool_approval_mode") or ""),
|
|
206
248
|
)
|
|
207
249
|
if prepared.compaction_triggered:
|
|
208
250
|
yield {
|
|
@@ -254,7 +296,11 @@ async def _iter_conversation_turn_events(
|
|
|
254
296
|
response_id=response_id,
|
|
255
297
|
)
|
|
256
298
|
_set_conversation_input_attributes(span, prepared.user_input or prepared.user_display_input)
|
|
299
|
+
_set_context_plan_attributes(span, prepared.shadow_context_plan)
|
|
257
300
|
trace_metadata = _span_feedback_metadata(span)
|
|
301
|
+
_baseline_turn_start = time.monotonic()
|
|
302
|
+
_baseline_ptl = False
|
|
303
|
+
_baseline_attempts = 0
|
|
258
304
|
yield {
|
|
259
305
|
"type": "started",
|
|
260
306
|
"session_id": prepared.session_id,
|
|
@@ -558,12 +604,24 @@ async def _iter_conversation_turn_events(
|
|
|
558
604
|
tool_call_id = str(
|
|
559
605
|
chunk.get("call_id") or chunk.get("run_id") or tool_run_id
|
|
560
606
|
).strip()
|
|
607
|
+
# PR C:tool_result 单项预算(仅 ksadk_hosted 门控)。
|
|
608
|
+
# bound 进 content.parts[0].text(下一轮 history → 模型输入的那条), # noqa: E501
|
|
609
|
+
# metadata.tool_output 保留原值(UI/Responses 读取方不受影响)。
|
|
610
|
+
# enabled=False → (str(output), {}) 与旧逻辑字节级一致。
|
|
611
|
+
_tool_output_raw = chunk.get("tool_output", "")
|
|
612
|
+
_budget_enabled = prepared.prompt_integration_mode == "ksadk_hosted"
|
|
613
|
+
_budgeted_text, _budget_extras = budget_tool_result_for_event(
|
|
614
|
+
tool_name=tool_name,
|
|
615
|
+
tool_output=_tool_output_raw,
|
|
616
|
+
tool_call_id=tool_call_id,
|
|
617
|
+
enabled=_budget_enabled,
|
|
618
|
+
)
|
|
561
619
|
checkpoint_metadata = _latest_checkpoint_metadata_for_run(
|
|
562
620
|
await provider().get_events(prepared.session_id),
|
|
563
621
|
tool_run_id,
|
|
564
622
|
)
|
|
565
623
|
approval_interrupt_info = approval_interrupt_info_from_result(
|
|
566
|
-
|
|
624
|
+
_tool_output_raw,
|
|
567
625
|
fallback_tool_name=tool_name,
|
|
568
626
|
tool_args=tool_args,
|
|
569
627
|
run_id=tool_run_id,
|
|
@@ -602,17 +660,18 @@ async def _iter_conversation_turn_events(
|
|
|
602
660
|
session_id=prepared.session_id,
|
|
603
661
|
author=runner_name,
|
|
604
662
|
role="user",
|
|
605
|
-
text=
|
|
663
|
+
text=_budgeted_text,
|
|
606
664
|
invocation_id=prepared.invocation_id,
|
|
607
665
|
event_type="tool_result",
|
|
608
666
|
metadata={
|
|
609
667
|
"tool_name": tool_name,
|
|
610
|
-
"tool_output":
|
|
668
|
+
"tool_output": _tool_output_raw,
|
|
611
669
|
"run_id": tool_run_id,
|
|
612
670
|
"tool_call_id": tool_call_id,
|
|
613
671
|
"observability": _tool_observability_metadata(
|
|
614
|
-
tool_name,
|
|
672
|
+
tool_name, _tool_output_raw
|
|
615
673
|
),
|
|
674
|
+
**_budget_extras,
|
|
616
675
|
"tool_receipt": _tool_receipt_metadata(
|
|
617
676
|
session_id=prepared.session_id,
|
|
618
677
|
run_id=tool_run_id,
|
|
@@ -624,8 +683,8 @@ async def _iter_conversation_turn_events(
|
|
|
624
683
|
framework_ref=checkpoint_metadata.get("framework_ref"),
|
|
625
684
|
status=(
|
|
626
685
|
"failed"
|
|
627
|
-
if isinstance(
|
|
628
|
-
and
|
|
686
|
+
if isinstance(_tool_output_raw, Mapping)
|
|
687
|
+
and _tool_output_raw.get("ok") is False
|
|
629
688
|
else "completed"
|
|
630
689
|
),
|
|
631
690
|
),
|
|
@@ -723,6 +782,8 @@ async def _iter_conversation_turn_events(
|
|
|
723
782
|
return
|
|
724
783
|
except Exception as exc:
|
|
725
784
|
if attempt == 0 and not emitted_anything and _is_prompt_too_long_error(exc):
|
|
785
|
+
_baseline_ptl = True
|
|
786
|
+
_baseline_attempts = attempt + 1
|
|
726
787
|
yield {"type": "compaction", "phase": "start", "trigger": "prompt_too_long"}
|
|
727
788
|
try:
|
|
728
789
|
checkpoint = await _compact_conversation_history_with_governance(
|
|
@@ -736,6 +797,15 @@ async def _iter_conversation_turn_events(
|
|
|
736
797
|
trigger="prompt_too_long",
|
|
737
798
|
keep_tail_groups=PTL_RETRY_KEEP_TAIL_GROUPS,
|
|
738
799
|
session_service_provider=provider,
|
|
800
|
+
# PR D1:PTL 路径仍 force=True;透传 ownership 便于未来按门控调策略。
|
|
801
|
+
prompt_integration_mode=getattr(
|
|
802
|
+
prepared, "prompt_integration_mode", ""
|
|
803
|
+
),
|
|
804
|
+
compaction_owner=str(
|
|
805
|
+
(getattr(prepared, "shadow_context_plan", None) or {}).get(
|
|
806
|
+
"compaction_owner", ""
|
|
807
|
+
)
|
|
808
|
+
),
|
|
739
809
|
)
|
|
740
810
|
except RuntimeCircuitOpen as circuit_exc:
|
|
741
811
|
await append_run_status_event(
|
|
@@ -887,6 +957,21 @@ async def _iter_conversation_turn_events(
|
|
|
887
957
|
run_trigger=run_trigger,
|
|
888
958
|
)
|
|
889
959
|
_set_conversation_usage_attributes(span, assistant_metadata.get("usage"))
|
|
960
|
+
_set_prompt_cache_attributes(
|
|
961
|
+
span,
|
|
962
|
+
session_id=prepared.session_id,
|
|
963
|
+
plan=prepared.shadow_context_plan,
|
|
964
|
+
usage=assistant_metadata.get("usage"),
|
|
965
|
+
)
|
|
966
|
+
_set_prompt_source_attributes(span, getattr(prepared, "compiled_prompt", None))
|
|
967
|
+
_record_baseline_turn(
|
|
968
|
+
prepared=prepared,
|
|
969
|
+
model=model,
|
|
970
|
+
usage=assistant_metadata.get("usage"),
|
|
971
|
+
ptl=_baseline_ptl,
|
|
972
|
+
attempts=_baseline_attempts,
|
|
973
|
+
turn_start_monotonic=_baseline_turn_start,
|
|
974
|
+
)
|
|
890
975
|
_finish_span()
|
|
891
976
|
yield {
|
|
892
977
|
"type": "completed",
|