agentengine-sdk-python 0.8.1__py3-none-any.whl → 0.8.3__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.3.dist-info}/METADATA +25 -12
- {agentengine_sdk_python-0.8.1.dist-info → agentengine_sdk_python-0.8.3.dist-info}/RECORD +421 -232
- ksadk/_build_provenance.json +1 -0
- 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 +247 -0
- ksadk/agui/a2ui_projection.py +12 -5
- ksadk/agui/agent.py +443 -259
- ksadk/api/client.py +528 -27
- ksadk/builders/code_builder.py +284 -8
- ksadk/builders/container_builder.py +8 -1
- ksadk/builders/managed_runtime_builder.py +42 -35
- ksadk/cli/__init__.py +23 -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_plugin.py +657 -0
- 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 +475 -331
- ksadk/configs/env_registry.py +94 -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/configs/settings.py +9 -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 +409 -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 +19 -0
- ksadk/conversations/context.py +230 -30
- ksadk/conversations/contracts.py +266 -0
- ksadk/conversations/message_projection.py +308 -26
- ksadk/conversations/model_context.py +49 -3
- ksadk/conversations/projector.py +616 -0
- ksadk/conversations/reducer.py +98 -0
- 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 +755 -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 +907 -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/__init__.py +45 -35
- ksadk/harness/runtime.py +220 -58
- 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 +62 -0
- ksadk/kernel/contracts.py +370 -0
- ksadk/kernel/control.py +220 -0
- ksadk/kernel/errors.py +79 -0
- ksadk/kernel/ingress.py +1123 -0
- ksadk/kernel/mapping.py +111 -0
- ksadk/kernel/memory_store.py +1134 -0
- ksadk/kernel/postgres_store.py +1757 -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 +1411 -0
- ksadk/kernel/state.py +145 -0
- ksadk/kernel/store.py +232 -0
- ksadk/kernel/worker.py +964 -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 +497 -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/plugins/__init__.py +167 -0
- ksadk/plugins/bridges/__init__.py +45 -0
- ksadk/plugins/bridges/codex.py +552 -0
- ksadk/plugins/bridges/dsh.py +1116 -0
- ksadk/plugins/builtins.py +747 -0
- ksadk/plugins/bundle.py +246 -0
- ksadk/plugins/bundle_security.py +167 -0
- ksadk/plugins/composition.py +529 -0
- ksadk/plugins/context_contributor.py +437 -0
- ksadk/plugins/contracts.py +451 -0
- ksadk/plugins/dsh_toolchain.py +935 -0
- ksadk/plugins/ecosystem_bridge.py +1105 -0
- ksadk/plugins/ecosystem_probe.py +191 -0
- ksadk/plugins/host.py +724 -0
- ksadk/plugins/providers/__init__.py +85 -0
- ksadk/plugins/providers/bundles/ksadk-codex/cordis.patch.yml +3 -0
- ksadk/plugins/providers/bundles/ksadk-codex/index.mjs +18 -0
- ksadk/plugins/providers/bundles/ksadk-codex/package.json +19 -0
- ksadk/plugins/providers/bundles/ksadk-harness/cordis.patch.yml +3 -0
- ksadk/plugins/providers/bundles/ksadk-harness/index.mjs +19 -0
- ksadk/plugins/providers/bundles/ksadk-harness/package.json +19 -0
- ksadk/plugins/providers/codex.py +722 -0
- ksadk/plugins/providers/codex_dsh.py +83 -0
- ksadk/plugins/providers/dsh.py +951 -0
- ksadk/plugins/providers/dsh_descriptor_host.py +226 -0
- ksadk/plugins/providers/harness.py +627 -0
- ksadk/plugins/providers/harness_dsh.py +91 -0
- ksadk/plugins/providers/legacy.py +215 -0
- ksadk/plugins/providers/legacy_catalog.py +100 -0
- ksadk/plugins/providers/shipped_dsh.py +370 -0
- ksadk/plugins/resolver.py +331 -0
- ksadk/plugins/subagent_providers/__init__.py +12 -0
- ksadk/plugins/subagent_providers/codex.py +443 -0
- ksadk/plugins/subagents.py +333 -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 +797 -0
- ksadk/runtime/adapter.py +119 -2
- ksadk/runtime/conversation_execution.py +316 -182
- ksadk/runtime/executor.py +144 -3
- ksadk/runtime/factory.py +268 -8
- ksadk/runtime/framework_adapters.py +18 -0
- ksadk/runtime/hosted_finalizer.py +268 -0
- ksadk/runtime/launch.py +14 -1
- ksadk/runtime/preprocessing.py +25 -3
- ksadk/runtime/runner_adapter.py +293 -508
- ksadk/runtime/usage.py +33 -0
- ksadk/sandbox/__init__.py +2 -1
- ksadk/sandbox/backends/e2b.py +35 -2
- ksadk/sandbox/factory.py +72 -0
- ksadk/scheduler/__init__.py +18 -0
- ksadk/scheduler/calendar.py +102 -0
- ksadk/scheduler/contracts.py +254 -0
- ksadk/scheduler/dispatcher.py +129 -0
- ksadk/scheduler/engine.py +416 -0
- ksadk/scheduler/sqlite_store.py +563 -0
- 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-10GPXIJ6.js} +1 -1
- ksadk/server/static/assets/{CodeBlock-CynLknyO.js → CodeBlock-BXk1l-G1.js} +4 -4
- ksadk/server/static/assets/MathMessageMarkdown-BorAY7qD.css +1 -0
- ksadk/server/static/assets/{MathMessageMarkdown-3sQdOysS.js → MathMessageMarkdown-D9uB55Oh.js} +4 -4
- ksadk/server/static/assets/MermaidBlock--OEYoXIJ.js +312 -0
- ksadk/server/static/assets/NativeTerminalPanel-DrEe1syq.js +1 -0
- ksadk/server/static/assets/abnfDiagram-VCTEODGH-eeTFJLvo.js +1 -0
- ksadk/server/static/assets/arc-S3ZNbIAd.js +1 -0
- ksadk/server/static/assets/architecture-7GRP2DOG-Dk9nRQ6-.js +1 -0
- ksadk/server/static/assets/architectureDiagram-5GKGNRK7-CRjgEJDX.js +36 -0
- ksadk/server/static/assets/blockDiagram-NRAW4CY4-C7bsBoNH.js +129 -0
- ksadk/server/static/assets/c4Diagram-UCG6FXSJ-BX3c33Ob.js +38 -0
- ksadk/server/static/assets/channel-s354Yo6o.js +1 -0
- ksadk/server/static/assets/chunk-2Q5K7J3B-CDpPpKR5.js +1 -0
- ksadk/server/static/assets/{chunk-FMBD7UC4-B_fH2YuH.js → chunk-5VM5RSS4-bZ7ws-8m.js} +1 -1
- ksadk/server/static/assets/{chunk-ND2GUHAM-D6rFLaVV.js → chunk-F27PBJKO-D2r0pvhY.js} +1 -1
- ksadk/server/static/assets/chunk-G27WJ6UU-CZwF3oUP.js +231 -0
- ksadk/server/static/assets/{chunk-4BX2VUAB-B9drTgOW.js → chunk-JWPE2WC7-DigFYCML.js} +1 -1
- ksadk/server/static/assets/chunk-LCL6LL3I-CnorGV5q.js +206 -0
- ksadk/server/static/assets/chunk-POPQ4Y6H-CexntQA-.js +1 -0
- ksadk/server/static/assets/chunk-RHFEMEQ7-CHTC7UxA.js +168 -0
- ksadk/server/static/assets/chunk-SVP7TREG-BC1EWt_-.js +88 -0
- ksadk/server/static/assets/chunk-XXDRQBXY-BTG24xN0.js +1 -0
- ksadk/server/static/assets/classDiagram-DTDB5LWJ-Dd0nucl9.js +1 -0
- ksadk/server/static/assets/classDiagram-v2-JRS7N3AN-Dd0nucl9.js +1 -0
- ksadk/server/static/assets/{cose-bilkent-S5V4N54A-ChNs_Mdk.js → cose-bilkent-JH36ORCC-CkonRdAS.js} +1 -1
- ksadk/server/static/assets/cynefin-OW5HDTMX-BBlT4uMf.js +1 -0
- ksadk/server/static/assets/cynefinDiagram-5FMLGOSQ-DEOCBe15.js +62 -0
- ksadk/server/static/assets/cytoscape.esm-CyCl8rPi.js +321 -0
- ksadk/server/static/assets/dagre-3AP2YEHR-DBThPuLa.js +4 -0
- ksadk/server/static/assets/dagre-ClTPrTht.js +1 -0
- ksadk/server/static/assets/diagram-S7CK7UJ4-DsZHrnpJ.js +30 -0
- ksadk/server/static/assets/diagram-UQ7AKVKN-BJR4nhVr.js +41 -0
- ksadk/server/static/assets/diagram-VSXAHHWV-xzcERX0a.js +3 -0
- ksadk/server/static/assets/diagram-VX7I27RA-tn2xM1xu.js +24 -0
- ksadk/server/static/assets/diagram-Z3DM3KII-BZPGBkw5.js +24 -0
- ksadk/server/static/assets/{dist-gLnrGsoU.js → dist-4zN1_tq5.js} +1 -1
- ksadk/server/static/assets/{dist-C1sz5Eo3.js → dist-8VWI-2bZ.js} +1 -1
- ksadk/server/static/assets/{dist-BjOdlDjj.js → dist-B-46q3Hk.js} +1 -1
- ksadk/server/static/assets/{dist-o2OVmKvt.js → dist-B0gdk4rl.js} +1 -1
- ksadk/server/static/assets/{dist-4N2NMVYg.js → dist-B1oWRmrH.js} +1 -1
- ksadk/server/static/assets/{dist-CmZHzlwZ.js → dist-BI1qQH4n.js} +1 -1
- ksadk/server/static/assets/{dist-X4TnqwOK.js → dist-BJLUwH6W.js} +1 -1
- ksadk/server/static/assets/{dist-B5oS1zcj.js → dist-Bbwqa8TG.js} +1 -1
- ksadk/server/static/assets/{dist-j6Dxmf_j.js → dist-Btyo4vX4.js} +1 -1
- ksadk/server/static/assets/{dist-DQU9EWw-.js → dist-C71CsujO.js} +1 -1
- ksadk/server/static/assets/{dist-BIlKoW0k.js → dist-CXpH_Rdd.js} +1 -1
- ksadk/server/static/assets/{dist-DJN_6Y39.js → dist-Cq4OL6nO.js} +1 -1
- ksadk/server/static/assets/{dist-Dli7qW-B.js → dist-D1V3f1B4.js} +1 -1
- ksadk/server/static/assets/{dist-fhOuWds5.js → dist-DJmCPRVB.js} +1 -1
- ksadk/server/static/assets/{dist-CWV4lDr1.js → dist-DQAB0qn_.js} +2 -2
- ksadk/server/static/assets/{dist-D6MpCZtz.js → dist-DUwKa_l6.js} +1 -1
- ksadk/server/static/assets/dist-DdRBIceA.js +1 -0
- ksadk/server/static/assets/{dist-DWKByxWV.js → dist-DfGFrb0v.js} +1 -1
- ksadk/server/static/assets/{dist-DsHPdk3W.js → dist-DjhwGUgZ.js} +1 -1
- ksadk/server/static/assets/{dist-B-jNR6Vn.js → dist-DyqV4fL4.js} +1 -1
- ksadk/server/static/assets/{dist-BB3-OwTQ.js → dist-M67Hwu0n.js} +1 -1
- ksadk/server/static/assets/{dist-_pHPTyZ-.js → dist-u8tVH5Ak.js} +1 -1
- ksadk/server/static/assets/ebnfDiagram-PWID7BFC-DVfMsLge.js +1 -0
- ksadk/server/static/assets/erDiagram-SSCWMZ5O-CWEZSYaw.js +99 -0
- ksadk/server/static/assets/eventmodeling-NTZA5JFV-Dr5okd8V.js +1 -0
- ksadk/server/static/assets/flowDiagram-A5DVABFB-VEO-cVcO.js +1 -0
- ksadk/server/static/assets/ganttDiagram-EL5Y4UJY-TWIxoyYL.js +292 -0
- ksadk/server/static/assets/gitGraph-4MIJSDKK-CKiKY9Cf.js +1 -0
- ksadk/server/static/assets/gitGraphDiagram-WWUBYQGX-DDh2hd2S.js +106 -0
- ksadk/server/static/assets/index-B2k_urY8.js +241 -0
- ksadk/server/static/assets/index-ILPt6IWF.css +2 -0
- ksadk/server/static/assets/info-A6RAGUB7-ubA4Nm_p.js +1 -0
- ksadk/server/static/assets/infoDiagram-RXCK75RN-CgoyWiDR.js +2 -0
- ksadk/server/static/assets/{ishikawaDiagram-YF4QCWOH-K0OOfVna.js → ishikawaDiagram-5VMMS53U-CyRIu_om.js} +6 -6
- ksadk/server/static/assets/{journeyDiagram-JHISSGLW-8LeOJaZp.js → journeyDiagram-EYS64GPL-DN5JXHzN.js} +6 -6
- ksadk/server/static/assets/{kanban-definition-UN3LZRKU-C6uCgZrW.js → kanban-definition-3QL26DDD-CNP3ui66.js} +10 -10
- ksadk/server/static/assets/katex-DWEzQy1d.js +257 -0
- ksadk/server/static/assets/{linear-hdBcYzM8.js → linear-C-qHp7d2.js} +1 -1
- ksadk/server/static/assets/mermaid-parser.core-Cl-K943T.js +166 -0
- ksadk/server/static/assets/{mindmap-definition-RKZ34NQL-Bjy_2v4_.js → mindmap-definition-FBJOCRG2-D5DB5mYm.js} +29 -29
- ksadk/server/static/assets/packet-AYTQ26CC-C7R3NUlK.js +1 -0
- ksadk/server/static/assets/pegDiagram-XKGWAZYB-BQVc9ia_.js +1 -0
- ksadk/server/static/assets/pie-WAS4IAKB-BIT6qjr3.js +1 -0
- ksadk/server/static/assets/pieDiagram-E7YTZNPT-B6UCAvtY.js +39 -0
- ksadk/server/static/assets/{quadrantDiagram-W4KKPZXB-BmkRbwCg.js → quadrantDiagram-AXDQQJYC-mIr2d3eb.js} +6 -6
- ksadk/server/static/assets/radar-RG4KPBEZ-l5noef9X.js +1 -0
- ksadk/server/static/assets/railroad-74A4TZTK-Baea6ZvM.js +1 -0
- ksadk/server/static/assets/railroad-abnf-HS5TGJTU-OKn8zZnU.js +1 -0
- ksadk/server/static/assets/railroad-ebnf-LZEXJU2U-DdKAKC4l.js +1 -0
- ksadk/server/static/assets/railroad-peg-WCYAUIDC-Bds8udlG.js +1 -0
- ksadk/server/static/assets/railroadDiagram-O6MQD6OU-Dt3FFDmK.js +1 -0
- ksadk/server/static/assets/requirementDiagram-EFPCY7ZU-Cz_vQtgF.js +84 -0
- ksadk/server/static/assets/{sankeyDiagram-5OEKKPKP-l6iXmU65.js → sankeyDiagram-P5KCCOFB-wlO1TsH5.js} +7 -7
- ksadk/server/static/assets/{sequenceDiagram-3UESZ5HK-Cq6UBeQB.js → sequenceDiagram-WJ2MYXX4-CHRbElYq.js} +10 -10
- ksadk/server/static/assets/sizeCapture-X5ZJPWSS-DXX54iyO.js +1 -0
- ksadk/server/static/assets/stateDiagram-HBIQ2CUA-Dp_lw9II.js +1 -0
- ksadk/server/static/assets/stateDiagram-v2-4QOOHH4V-5b-8o2iS.js +1 -0
- ksadk/server/static/assets/swimlanes-XN3QIQJK-D8O5UlLG.js +1 -0
- ksadk/server/static/assets/swimlanesDiagram-VK2B7HYN-uf6WPRA4.js +8 -0
- ksadk/server/static/assets/{timeline-definition-PNZ67QCA-DEz24vV0.js → timeline-definition-24CTP7MA-8mfKcxvG.js} +7 -7
- ksadk/server/static/assets/treeView-Q6P3EWNA-CK5CSrSO.js +1 -0
- ksadk/server/static/assets/treemap-WGGIJYW6-Ch2BKgAM.js +1 -0
- ksadk/server/static/assets/vennDiagram-4TSXK5OY-EnNl0DE7.js +34 -0
- ksadk/server/static/assets/wardley-WFR3VGLG-YW3Q0ml_.js +1 -0
- ksadk/server/static/assets/wardleyDiagram-VM6X3IG4-DBu5fbYr.js +78 -0
- ksadk/server/static/assets/xychartDiagram-S5SC5T6Z-BSVXs4IY.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/service_client.py +48 -0
- ksadk/studio/agent_lifecycle.py +26 -20
- ksadk/studio/api.py +1063 -69
- ksadk/studio/api_catalog_routes.py +5 -0
- ksadk/studio/api_contracts.py +148 -6
- ksadk/studio/api_memory_routes.py +82 -0
- ksadk/studio/api_plugin_routes.py +480 -0
- ksadk/studio/attachment_store.py +187 -0
- ksadk/studio/authoring.py +259 -28
- ksadk/studio/authoring_coordinator.py +809 -67
- ksadk/studio/builder.py +197 -40
- ksadk/studio/capabilities.py +17 -0
- ksadk/studio/cloud.py +1920 -95
- ksadk/studio/codex_agent_service.py +137 -15
- ksadk/studio/codex_authoring.py +469 -0
- ksadk/studio/codex_builder.py +177 -25
- ksadk/studio/codex_manifest.py +71 -22
- ksadk/studio/codex_run.py +59 -4
- ksadk/studio/compatibility_report.py +445 -0
- ksadk/studio/compiler.py +7 -1
- ksadk/studio/contracts.py +234 -4
- ksadk/studio/dsh_provider_registration.py +768 -0
- ksadk/studio/event_store.py +79 -101
- ksadk/studio/framework_run.py +264 -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 +47 -5
- ksadk/studio/otel_trace.py +348 -42
- ksadk/studio/pcm_memory.py +85 -0
- ksadk/studio/plugin_composition.py +301 -0
- ksadk/studio/plugin_kernel_adapter.py +128 -0
- ksadk/studio/plugin_runtime.py +652 -0
- ksadk/studio/repository.py +23 -2
- ksadk/studio/resource_catalog.py +49 -1
- ksadk/studio/run_service.py +1266 -202
- ksadk/studio/runtime_source.py +51 -17
- ksadk/studio/scheduler_runtime.py +374 -0
- ksadk/studio/scheduler_service.py +211 -0
- ksadk/studio/service.py +1815 -117
- ksadk/studio/shared_web.py +199 -50
- ksadk/studio/soul.py +52 -0
- ksadk/studio/static/assets/index-DXs1Eq4M.css +1 -0
- ksadk/studio/static/assets/index-DeDqwTsD.js +283 -0
- ksadk/studio/static/index.html +2 -2
- ksadk/studio/templates.py +100 -8
- ksadk/studio/validator.py +20 -1
- ksadk/studio/workspace.py +31 -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_runtime_common/workspace_files/path_utils.py +41 -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.3.dist-info}/WHEEL +0 -0
- {agentengine_sdk_python-0.8.1.dist-info → agentengine_sdk_python-0.8.3.dist-info}/entry_points.txt +0 -0
- {agentengine_sdk_python-0.8.1.dist-info → agentengine_sdk_python-0.8.3.dist-info}/licenses/LICENSE +0 -0
- {agentengine_sdk_python-0.8.1.dist-info → agentengine_sdk_python-0.8.3.dist-info}/top_level.txt +0 -0
ksadk/studio/runtime_source.py
CHANGED
|
@@ -20,6 +20,8 @@ _GENERATED_MARKER = ".agentkit-generated"
|
|
|
20
20
|
def materialize_generated_runtime_source(
|
|
21
21
|
workspace: Workspace,
|
|
22
22
|
draft: AgentDraft,
|
|
23
|
+
*,
|
|
24
|
+
catalog: LocalResourceCatalog | None = None,
|
|
23
25
|
) -> None:
|
|
24
26
|
"""Create or refresh the source owned by a generated ADK/LangGraph draft.
|
|
25
27
|
|
|
@@ -28,7 +30,15 @@ def materialize_generated_runtime_source(
|
|
|
28
30
|
"""
|
|
29
31
|
|
|
30
32
|
runtime = draft.spec.runtime
|
|
31
|
-
|
|
33
|
+
# Only the two legacy Python-framework runtimes own generated source.
|
|
34
|
+
# Harness and externally installed AgentProviders are bundle compositions;
|
|
35
|
+
# treating either as the ``else`` branch here would silently generate a
|
|
36
|
+
# LangGraph project and change the selected provider's execution model.
|
|
37
|
+
if (
|
|
38
|
+
runtime is None
|
|
39
|
+
or runtime.type not in {"adk", "langgraph"}
|
|
40
|
+
or not runtime.project_path
|
|
41
|
+
):
|
|
32
42
|
return
|
|
33
43
|
root = workspace.resolve(runtime.project_path)
|
|
34
44
|
marker = root / _GENERATED_MARKER
|
|
@@ -37,9 +47,14 @@ def materialize_generated_runtime_source(
|
|
|
37
47
|
root.mkdir(parents=True, exist_ok=True)
|
|
38
48
|
entry = workspace.resolve(Path(runtime.project_path) / (runtime.entry_point or "agent.py"))
|
|
39
49
|
entry.parent.mkdir(parents=True, exist_ok=True)
|
|
40
|
-
|
|
50
|
+
resolved_catalog = catalog or LocalResourceCatalog(workspace)
|
|
51
|
+
prompt, tool_names, python_tools = _runtime_inputs(
|
|
52
|
+
workspace,
|
|
53
|
+
draft,
|
|
54
|
+
catalog=resolved_catalog,
|
|
55
|
+
)
|
|
41
56
|
_snapshot_python_tools(workspace, root, python_tools)
|
|
42
|
-
model = _configured_model(draft)
|
|
57
|
+
model = _configured_model(resolved_catalog, draft)
|
|
43
58
|
if runtime.type == "adk":
|
|
44
59
|
source = _adk_source(
|
|
45
60
|
draft.metadata.id,
|
|
@@ -73,7 +88,10 @@ def materialize_generated_runtime_source(
|
|
|
73
88
|
)
|
|
74
89
|
|
|
75
90
|
|
|
76
|
-
def _configured_model(draft: AgentDraft) -> str:
|
|
91
|
+
def _configured_model(catalog: LocalResourceCatalog, draft: AgentDraft) -> str:
|
|
92
|
+
resolved = catalog.resolve_model(draft.spec.bindings)
|
|
93
|
+
if resolved is not None:
|
|
94
|
+
return resolved.model
|
|
77
95
|
if draft.spec.model is not None:
|
|
78
96
|
return draft.spec.model.model
|
|
79
97
|
return str(draft.metadata.labels.get("agentkit.ksyun.com/model") or "glm-5.1")
|
|
@@ -82,8 +100,9 @@ def _configured_model(draft: AgentDraft) -> str:
|
|
|
82
100
|
def _runtime_inputs(
|
|
83
101
|
workspace: Workspace,
|
|
84
102
|
draft: AgentDraft,
|
|
103
|
+
*,
|
|
104
|
+
catalog: LocalResourceCatalog,
|
|
85
105
|
) -> tuple[str, list[str], list[dict[str, str]]]:
|
|
86
|
-
catalog = LocalResourceCatalog(workspace)
|
|
87
106
|
tools, _permissions = catalog.policy_preview(draft.spec.bindings)
|
|
88
107
|
builtin_names = [tool.name for tool in tools if tool.enabled and tool.executor == "builtin"]
|
|
89
108
|
python_tools = [
|
|
@@ -316,23 +335,38 @@ def _call_model(state: AgentState):
|
|
|
316
335
|
client = ChatOpenAI(
|
|
317
336
|
model=selected,
|
|
318
337
|
api_key=os.environ["OPENAI_API_KEY"],
|
|
319
|
-
base_url=os.getenv("
|
|
338
|
+
base_url=os.getenv("OPENAI_BASE_URL") or os.getenv("OPENAI_API_BASE"),
|
|
339
|
+
stream_usage=True,
|
|
320
340
|
)
|
|
321
341
|
runnable = client.bind_tools(_tools) if _tools else client
|
|
322
|
-
messages =
|
|
342
|
+
messages = list(state["messages"])
|
|
343
|
+
# KsADK Runtime 已投影 CompiledPrompt/ContextPlan 时,state 中存在 SystemMessage,
|
|
344
|
+
# 不再重复注入模板 Prompt;直接调用 graph 时仍保留独立运行能力。
|
|
345
|
+
if not any(isinstance(message, SystemMessage) for message in messages):
|
|
346
|
+
messages.insert(0, SystemMessage(content={json.dumps(prompt)}))
|
|
323
347
|
return {{"messages": [runnable.invoke(messages)]}}
|
|
324
348
|
|
|
325
349
|
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
350
|
+
def ksadk_graph_factory(*, checkpointer):
|
|
351
|
+
"""Compile the graph with a caller-owned checkpoint backend.
|
|
352
|
+
|
|
353
|
+
Studio uses ``MemorySaver`` for local authoring. The hosted KsADK runner
|
|
354
|
+
rebuilds this graph through the same factory with its admitted PostgreSQL
|
|
355
|
+
saver before the first turn, so an interrupt can resume after a Pod move.
|
|
356
|
+
"""
|
|
357
|
+
builder = StateGraph(AgentState)
|
|
358
|
+
builder.add_node("model", _call_model)
|
|
359
|
+
builder.add_edge(START, "model")
|
|
360
|
+
if _tools:
|
|
361
|
+
builder.add_node("tools", ToolNode(_tools))
|
|
362
|
+
builder.add_conditional_edges("model", tools_condition)
|
|
363
|
+
builder.add_edge("tools", "model")
|
|
364
|
+
else:
|
|
365
|
+
builder.add_edge("model", END)
|
|
366
|
+
return builder.compile(checkpointer=checkpointer)
|
|
367
|
+
|
|
368
|
+
|
|
369
|
+
{variable} = ksadk_graph_factory(checkpointer=MemorySaver())
|
|
336
370
|
'''
|
|
337
371
|
|
|
338
372
|
|
|
@@ -0,0 +1,374 @@
|
|
|
1
|
+
"""Build-pinned AgentKernel runtimes owned by the local Studio scheduler.
|
|
2
|
+
|
|
3
|
+
The ordinary Studio conversation path may keep using its historical direct
|
|
4
|
+
RuntimeExecutor or an independently enabled HTTP Kernel. Scheduler Lite owns
|
|
5
|
+
neither of those lifecycles. Instead it lazily starts one in-process Kernel
|
|
6
|
+
runtime for each immutable Build referenced by a local scheduled task.
|
|
7
|
+
|
|
8
|
+
This is intentionally a registry rather than another process-global Kernel:
|
|
9
|
+
one AgentKernelWorker has one concrete RuntimeAdapter factory, so reusing a
|
|
10
|
+
single global worker for multiple Studio Builds can execute the wrong Agent.
|
|
11
|
+
The registry keeps ``Build -> instance -> Runtime`` exact and dispatches every
|
|
12
|
+
occurrence through that runtime's AgentControl Inbox and canonical
|
|
13
|
+
SessionEvent log.
|
|
14
|
+
"""
|
|
15
|
+
|
|
16
|
+
from __future__ import annotations
|
|
17
|
+
|
|
18
|
+
import asyncio
|
|
19
|
+
import hashlib
|
|
20
|
+
from collections.abc import Callable
|
|
21
|
+
from dataclasses import dataclass
|
|
22
|
+
from uuid import uuid4
|
|
23
|
+
|
|
24
|
+
from ksadk.kernel.bootstrap import (
|
|
25
|
+
AgentKernelRuntime,
|
|
26
|
+
AgentKernelRuntimeConfig,
|
|
27
|
+
build_agent_kernel_runtime,
|
|
28
|
+
)
|
|
29
|
+
from ksadk.kernel.contracts import (
|
|
30
|
+
AgentControlCommand,
|
|
31
|
+
AgentControlPermit,
|
|
32
|
+
AgentControlReceipt,
|
|
33
|
+
SessionEventSubscription,
|
|
34
|
+
)
|
|
35
|
+
from ksadk.kernel.ingress import trusted_context
|
|
36
|
+
from ksadk.runtime import RuntimeAdapter
|
|
37
|
+
from ksadk.scheduler.contracts import ScheduledTaskTarget, ScheduleOccurrence
|
|
38
|
+
from ksadk.sessions.base import BaseSessionService
|
|
39
|
+
from ksadk.studio.run_service import StudioRunSpec
|
|
40
|
+
|
|
41
|
+
ResolveBuild = Callable[[str], StudioRunSpec]
|
|
42
|
+
ResolveAdapterProvider = Callable[
|
|
43
|
+
[StudioRunSpec], Callable[[], RuntimeAdapter]
|
|
44
|
+
]
|
|
45
|
+
|
|
46
|
+
|
|
47
|
+
class StudioSchedulerRuntimeError(RuntimeError):
|
|
48
|
+
"""Stable local scheduling failure safe to persist on an occurrence."""
|
|
49
|
+
|
|
50
|
+
def __init__(self, code: str, message: str) -> None:
|
|
51
|
+
super().__init__(message)
|
|
52
|
+
self.code = code
|
|
53
|
+
|
|
54
|
+
|
|
55
|
+
@dataclass(frozen=True)
|
|
56
|
+
class StudioScheduledRuntimeTarget:
|
|
57
|
+
"""Server-owned immutable routing facts persisted on ScheduledTask/v1."""
|
|
58
|
+
|
|
59
|
+
build_id: str
|
|
60
|
+
agent_id: str
|
|
61
|
+
tenant_id: str
|
|
62
|
+
agent_instance_id: str
|
|
63
|
+
|
|
64
|
+
|
|
65
|
+
@dataclass
|
|
66
|
+
class _RuntimeEntry:
|
|
67
|
+
target: StudioScheduledRuntimeTarget
|
|
68
|
+
spec: StudioRunSpec
|
|
69
|
+
runtime: AgentKernelRuntime
|
|
70
|
+
|
|
71
|
+
|
|
72
|
+
class StudioScheduledKernelRegistry:
|
|
73
|
+
"""Own exact per-Build Kernel runtimes for one Studio process.
|
|
74
|
+
|
|
75
|
+
The registry does not register anything in ``ksadk.kernel.ingress`` and
|
|
76
|
+
therefore cannot redirect normal conversations or hosted HTTP traffic.
|
|
77
|
+
Scheduler dispatch uses :meth:`submit` and :meth:`read_events` directly,
|
|
78
|
+
while still crossing the frozen AgentControl permit/admission boundary.
|
|
79
|
+
"""
|
|
80
|
+
|
|
81
|
+
def __init__(
|
|
82
|
+
self,
|
|
83
|
+
*,
|
|
84
|
+
resolve_build: ResolveBuild,
|
|
85
|
+
resolve_adapter_provider: ResolveAdapterProvider,
|
|
86
|
+
session_service: BaseSessionService,
|
|
87
|
+
runtime_executor: object | None = None,
|
|
88
|
+
tenant_id: str = "local-studio",
|
|
89
|
+
workspace_id: str = "studio-scheduler",
|
|
90
|
+
poll_interval: float = 0.05,
|
|
91
|
+
lease_ttl_seconds: float = 30.0,
|
|
92
|
+
) -> None:
|
|
93
|
+
self._resolve_build = resolve_build
|
|
94
|
+
self._resolve_adapter_provider = resolve_adapter_provider
|
|
95
|
+
self._session_service = session_service
|
|
96
|
+
self._runtime_executor = runtime_executor
|
|
97
|
+
self._tenant_id = tenant_id
|
|
98
|
+
self._workspace_id = workspace_id
|
|
99
|
+
self._poll_interval = poll_interval
|
|
100
|
+
self._lease_ttl_seconds = lease_ttl_seconds
|
|
101
|
+
self._owner_id = uuid4().hex
|
|
102
|
+
self._entries_by_build: dict[str, _RuntimeEntry] = {}
|
|
103
|
+
self._build_by_instance: dict[str, str] = {}
|
|
104
|
+
self._lock = asyncio.Lock()
|
|
105
|
+
self._started = False
|
|
106
|
+
|
|
107
|
+
@property
|
|
108
|
+
def started(self) -> bool:
|
|
109
|
+
return self._started
|
|
110
|
+
|
|
111
|
+
@property
|
|
112
|
+
def active_runtime_count(self) -> int:
|
|
113
|
+
return len(self._entries_by_build)
|
|
114
|
+
|
|
115
|
+
async def start(self) -> None:
|
|
116
|
+
self._started = True
|
|
117
|
+
|
|
118
|
+
async def ensure_build(
|
|
119
|
+
self,
|
|
120
|
+
build_id: str,
|
|
121
|
+
*,
|
|
122
|
+
expected_agent_id: str | None = None,
|
|
123
|
+
) -> StudioScheduledRuntimeTarget:
|
|
124
|
+
"""Start or return the exact Runtime owned by one immutable Build."""
|
|
125
|
+
|
|
126
|
+
normalized = str(build_id).strip()
|
|
127
|
+
if not normalized:
|
|
128
|
+
raise StudioSchedulerRuntimeError(
|
|
129
|
+
"SCHEDULER_BUILD_REQUIRED",
|
|
130
|
+
"定时任务缺少不可变 Build 标识",
|
|
131
|
+
)
|
|
132
|
+
if not self._started:
|
|
133
|
+
raise StudioSchedulerRuntimeError(
|
|
134
|
+
"SCHEDULER_RUNTIME_NOT_STARTED",
|
|
135
|
+
"Studio Scheduler Runtime 尚未启动",
|
|
136
|
+
)
|
|
137
|
+
existing = self._entries_by_build.get(normalized)
|
|
138
|
+
if existing is not None:
|
|
139
|
+
self._require_agent(existing.spec, expected_agent_id)
|
|
140
|
+
return existing.target
|
|
141
|
+
|
|
142
|
+
async with self._lock:
|
|
143
|
+
existing = self._entries_by_build.get(normalized)
|
|
144
|
+
if existing is not None:
|
|
145
|
+
self._require_agent(existing.spec, expected_agent_id)
|
|
146
|
+
return existing.target
|
|
147
|
+
try:
|
|
148
|
+
spec = self._resolve_build(normalized)
|
|
149
|
+
except Exception as error:
|
|
150
|
+
raise StudioSchedulerRuntimeError(
|
|
151
|
+
"SCHEDULER_BUILD_UNAVAILABLE",
|
|
152
|
+
f"定时任务绑定的 Build {normalized!r} 不可用",
|
|
153
|
+
) from error
|
|
154
|
+
if spec.build_id != normalized:
|
|
155
|
+
raise StudioSchedulerRuntimeError(
|
|
156
|
+
"SCHEDULER_BUILD_MISMATCH",
|
|
157
|
+
"Build 解析结果与定时任务绑定不一致",
|
|
158
|
+
)
|
|
159
|
+
self._require_agent(spec, expected_agent_id)
|
|
160
|
+
try:
|
|
161
|
+
adapter_provider = self._resolve_adapter_provider(spec)
|
|
162
|
+
except Exception as error:
|
|
163
|
+
raise StudioSchedulerRuntimeError(
|
|
164
|
+
"SCHEDULER_PROVIDER_UNAVAILABLE",
|
|
165
|
+
f"Build {normalized!r} 的 AgentProvider 不可用",
|
|
166
|
+
) from error
|
|
167
|
+
|
|
168
|
+
# ``build_agent_kernel_runtime`` asks the provider once to snapshot
|
|
169
|
+
# capabilities. Retain that exact adapter for the first worker or
|
|
170
|
+
# recovery acquisition instead of constructing and discarding a
|
|
171
|
+
# resource-owning Codex/Harness adapter during registration.
|
|
172
|
+
retained_first_adapter: RuntimeAdapter | None = None
|
|
173
|
+
first_adapter_borrowed = False
|
|
174
|
+
|
|
175
|
+
def checked_adapter_provider() -> RuntimeAdapter:
|
|
176
|
+
nonlocal retained_first_adapter, first_adapter_borrowed
|
|
177
|
+
if retained_first_adapter is not None and not first_adapter_borrowed:
|
|
178
|
+
first_adapter_borrowed = True
|
|
179
|
+
adapter = retained_first_adapter
|
|
180
|
+
retained_first_adapter = None
|
|
181
|
+
return adapter
|
|
182
|
+
adapter = adapter_provider()
|
|
183
|
+
if not isinstance(adapter, RuntimeAdapter):
|
|
184
|
+
raise StudioSchedulerRuntimeError(
|
|
185
|
+
"SCHEDULER_PROVIDER_INVALID",
|
|
186
|
+
"AgentProvider 没有返回 RuntimeAdapter",
|
|
187
|
+
)
|
|
188
|
+
if retained_first_adapter is None and not first_adapter_borrowed:
|
|
189
|
+
retained_first_adapter = adapter
|
|
190
|
+
return adapter
|
|
191
|
+
|
|
192
|
+
instance_id = self._instance_id(normalized)
|
|
193
|
+
config = AgentKernelRuntimeConfig(
|
|
194
|
+
agent_instance_id=instance_id,
|
|
195
|
+
authority_mode="local",
|
|
196
|
+
driver="memory",
|
|
197
|
+
durability_tier="ephemeral",
|
|
198
|
+
adapter_provider=checked_adapter_provider,
|
|
199
|
+
session_service=self._session_service,
|
|
200
|
+
runtime_executor=self._runtime_executor,
|
|
201
|
+
launch_context=spec.launch_context,
|
|
202
|
+
start_request_defaults=self._start_defaults(spec),
|
|
203
|
+
tenant_id=self._tenant_id,
|
|
204
|
+
workspace_id=self._workspace_id,
|
|
205
|
+
poll_interval=self._poll_interval,
|
|
206
|
+
lease_ttl_seconds=self._lease_ttl_seconds,
|
|
207
|
+
activation_id=f"studio-scheduler:{self._owner_id}:{instance_id}",
|
|
208
|
+
runtime_type=spec.launch_context.runtime_type,
|
|
209
|
+
bundle_digest=spec.manifest_sha256 or normalized,
|
|
210
|
+
)
|
|
211
|
+
runtime = build_agent_kernel_runtime(config)
|
|
212
|
+
try:
|
|
213
|
+
await runtime.start()
|
|
214
|
+
except Exception:
|
|
215
|
+
await runtime.close()
|
|
216
|
+
raise
|
|
217
|
+
target = StudioScheduledRuntimeTarget(
|
|
218
|
+
build_id=normalized,
|
|
219
|
+
agent_id=spec.agent_id,
|
|
220
|
+
tenant_id=self._tenant_id,
|
|
221
|
+
agent_instance_id=instance_id,
|
|
222
|
+
)
|
|
223
|
+
self._entries_by_build[normalized] = _RuntimeEntry(
|
|
224
|
+
target=target,
|
|
225
|
+
spec=spec,
|
|
226
|
+
runtime=runtime,
|
|
227
|
+
)
|
|
228
|
+
self._build_by_instance[instance_id] = normalized
|
|
229
|
+
return target
|
|
230
|
+
|
|
231
|
+
async def ensure_target(
|
|
232
|
+
self, target: ScheduledTaskTarget
|
|
233
|
+
) -> StudioScheduledRuntimeTarget:
|
|
234
|
+
build_id = str(target.agent_version_ref or "").strip()
|
|
235
|
+
exact = await self.ensure_build(
|
|
236
|
+
build_id,
|
|
237
|
+
expected_agent_id=target.agent_id,
|
|
238
|
+
)
|
|
239
|
+
if (
|
|
240
|
+
target.tenant_id != exact.tenant_id
|
|
241
|
+
or target.agent_instance_id != exact.agent_instance_id
|
|
242
|
+
):
|
|
243
|
+
raise StudioSchedulerRuntimeError(
|
|
244
|
+
"SCHEDULER_TARGET_MISMATCH",
|
|
245
|
+
"定时任务目标与不可变 Build 的 Kernel 身份不一致",
|
|
246
|
+
)
|
|
247
|
+
return exact
|
|
248
|
+
|
|
249
|
+
def runtime_for_build(self, build_id: str) -> AgentKernelRuntime:
|
|
250
|
+
entry = self._entries_by_build.get(str(build_id))
|
|
251
|
+
if entry is None:
|
|
252
|
+
raise StudioSchedulerRuntimeError(
|
|
253
|
+
"SCHEDULER_TARGET_UNAVAILABLE",
|
|
254
|
+
"定时任务目标 Kernel 未注册",
|
|
255
|
+
)
|
|
256
|
+
return entry.runtime
|
|
257
|
+
|
|
258
|
+
async def submit(
|
|
259
|
+
self,
|
|
260
|
+
command: AgentControlCommand,
|
|
261
|
+
permit: AgentControlPermit,
|
|
262
|
+
) -> AgentControlReceipt:
|
|
263
|
+
entry = self._entry_for_instance(command.agent_instance_id)
|
|
264
|
+
if command.tenant_id != entry.target.tenant_id:
|
|
265
|
+
raise StudioSchedulerRuntimeError(
|
|
266
|
+
"SCHEDULER_TARGET_MISMATCH",
|
|
267
|
+
"AgentControl tenant 与 Build Kernel 不一致",
|
|
268
|
+
)
|
|
269
|
+
if await self._session_service.get_session(command.session_id) is None:
|
|
270
|
+
await self._session_service.create_session(
|
|
271
|
+
agent_id=entry.target.agent_id,
|
|
272
|
+
user_id=command.tenant_id,
|
|
273
|
+
session_id=command.session_id,
|
|
274
|
+
)
|
|
275
|
+
return await entry.runtime.kernel.submit(command, permit=permit)
|
|
276
|
+
|
|
277
|
+
async def read_events(
|
|
278
|
+
self, occurrence: ScheduleOccurrence
|
|
279
|
+
) -> tuple[tuple[int, object], ...]:
|
|
280
|
+
target = occurrence.target
|
|
281
|
+
if target is None:
|
|
282
|
+
return ()
|
|
283
|
+
await self.ensure_target(target)
|
|
284
|
+
entry = self._entry_for_instance(target.agent_instance_id)
|
|
285
|
+
trusted = trusted_context(
|
|
286
|
+
source_kind="scheduler",
|
|
287
|
+
source_ref=occurrence.occurrence_id,
|
|
288
|
+
tenant_id=target.tenant_id,
|
|
289
|
+
agent_instance_id=target.agent_instance_id,
|
|
290
|
+
session_id=occurrence.session_id,
|
|
291
|
+
operations=("subscribe_events",),
|
|
292
|
+
)
|
|
293
|
+
cursor = occurrence.last_event_seq
|
|
294
|
+
if cursor is None:
|
|
295
|
+
cursor = occurrence.accepted_seq or 0
|
|
296
|
+
subscription = SessionEventSubscription(
|
|
297
|
+
tenant_id=trusted.tenant_id,
|
|
298
|
+
agent_instance_id=trusted.agent_instance_id,
|
|
299
|
+
session_id=occurrence.session_id,
|
|
300
|
+
authorization_ref=trusted.permit.permit_id,
|
|
301
|
+
after_seq=cursor,
|
|
302
|
+
)
|
|
303
|
+
result: list[tuple[int, object]] = []
|
|
304
|
+
stream = entry.runtime.kernel.subscribe(
|
|
305
|
+
subscription,
|
|
306
|
+
permit=trusted.permit,
|
|
307
|
+
timeout=0.05,
|
|
308
|
+
)
|
|
309
|
+
try:
|
|
310
|
+
async for envelope in stream:
|
|
311
|
+
result.append((int(envelope.seq), envelope))
|
|
312
|
+
if len(result) >= 100:
|
|
313
|
+
break
|
|
314
|
+
finally:
|
|
315
|
+
await stream.aclose()
|
|
316
|
+
return tuple(result)
|
|
317
|
+
|
|
318
|
+
async def close(self) -> None:
|
|
319
|
+
async with self._lock:
|
|
320
|
+
entries = list(self._entries_by_build.values())
|
|
321
|
+
self._entries_by_build.clear()
|
|
322
|
+
self._build_by_instance.clear()
|
|
323
|
+
self._started = False
|
|
324
|
+
first_error: BaseException | None = None
|
|
325
|
+
for entry in reversed(entries):
|
|
326
|
+
try:
|
|
327
|
+
await entry.runtime.close()
|
|
328
|
+
except BaseException as error: # cleanup must continue for other Builds
|
|
329
|
+
if first_error is None:
|
|
330
|
+
first_error = error
|
|
331
|
+
if first_error is not None:
|
|
332
|
+
raise first_error
|
|
333
|
+
|
|
334
|
+
def _entry_for_instance(self, instance_id: str) -> _RuntimeEntry:
|
|
335
|
+
build_id = self._build_by_instance.get(str(instance_id))
|
|
336
|
+
entry = self._entries_by_build.get(build_id or "")
|
|
337
|
+
if entry is None:
|
|
338
|
+
raise StudioSchedulerRuntimeError(
|
|
339
|
+
"SCHEDULER_TARGET_UNAVAILABLE",
|
|
340
|
+
"定时任务目标 Kernel 未注册",
|
|
341
|
+
)
|
|
342
|
+
return entry
|
|
343
|
+
|
|
344
|
+
def _instance_id(self, build_id: str) -> str:
|
|
345
|
+
digest = hashlib.sha256(build_id.encode("utf-8")).hexdigest()[:24]
|
|
346
|
+
return f"studio-schedule-{digest}"
|
|
347
|
+
|
|
348
|
+
@staticmethod
|
|
349
|
+
def _require_agent(spec: StudioRunSpec, expected_agent_id: str | None) -> None:
|
|
350
|
+
if expected_agent_id and spec.agent_id != expected_agent_id:
|
|
351
|
+
raise StudioSchedulerRuntimeError(
|
|
352
|
+
"SCHEDULER_AGENT_MISMATCH",
|
|
353
|
+
"定时任务 Agent 与不可变 Build 不一致",
|
|
354
|
+
)
|
|
355
|
+
|
|
356
|
+
@staticmethod
|
|
357
|
+
def _start_defaults(spec: StudioRunSpec) -> dict[str, object]:
|
|
358
|
+
defaults: dict[str, object] = {
|
|
359
|
+
"agent_id": spec.agent_id,
|
|
360
|
+
"config": dict(spec.request_config),
|
|
361
|
+
}
|
|
362
|
+
if spec.model:
|
|
363
|
+
defaults["model"] = spec.model
|
|
364
|
+
defaults["allowed_models"] = [spec.model]
|
|
365
|
+
return defaults
|
|
366
|
+
|
|
367
|
+
|
|
368
|
+
__all__ = [
|
|
369
|
+
"ResolveAdapterProvider",
|
|
370
|
+
"ResolveBuild",
|
|
371
|
+
"StudioScheduledKernelRegistry",
|
|
372
|
+
"StudioScheduledRuntimeTarget",
|
|
373
|
+
"StudioSchedulerRuntimeError",
|
|
374
|
+
]
|