agentengine-sdk-python 0.8.2__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.2.dist-info → agentengine_sdk_python-0.8.3.dist-info}/METADATA +18 -25
- {agentengine_sdk_python-0.8.2.dist-info → agentengine_sdk_python-0.8.3.dist-info}/RECORD +224 -169
- ksadk/_build_provenance.json +1 -0
- ksadk/agui/_agent_helpers.py +4 -0
- ksadk/api/client.py +3 -0
- ksadk/builders/managed_runtime_builder.py +3 -0
- ksadk/cli/__init__.py +6 -0
- ksadk/cli/cmd_plugin.py +657 -0
- ksadk/codex/runtime.py +50 -8
- ksadk/configs/env_registry.py +31 -3
- ksadk/configs/settings.py +9 -0
- ksadk/context_engine/contributors.py +73 -8
- ksadk/conversations/__init__.py +19 -0
- ksadk/conversations/context.py +104 -24
- ksadk/conversations/contracts.py +266 -0
- ksadk/conversations/message_projection.py +19 -1
- ksadk/conversations/projector.py +616 -0
- ksadk/conversations/reducer.py +98 -0
- ksadk/events/_v1_compat/projection.py +2 -0
- ksadk/events/adapters/codex.py +190 -0
- ksadk/harness/__init__.py +45 -35
- ksadk/harness/runtime.py +60 -1
- ksadk/kernel/contract_fingerprints.py +5 -4
- ksadk/kernel/contracts.py +8 -0
- ksadk/kernel/control.py +1 -0
- ksadk/kernel/ingress.py +21 -0
- ksadk/kernel/memory_store.py +1 -0
- ksadk/kernel/postgres_store.py +1 -0
- ksadk/kernel/sqlite_store.py +1 -0
- ksadk/kernel/worker.py +11 -0
- ksadk/memory/providers/local_sqlite.py +7 -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/runtime/_runner_adapter/stream_mapping.py +51 -42
- ksadk/runtime/adapter.py +1 -0
- ksadk/runtime/factory.py +76 -2
- ksadk/runtime/framework_adapters.py +18 -0
- ksadk/runtime/runner_adapter.py +5 -0
- ksadk/sandbox/__init__.py +2 -1
- 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/static/assets/{ArtifactsPanel-DSU1sWD_.js → ArtifactsPanel-10GPXIJ6.js} +1 -1
- ksadk/server/static/assets/{CodeBlock-DOH6MVcn.js → CodeBlock-BXk1l-G1.js} +1 -1
- ksadk/server/static/assets/{MathMessageMarkdown-BL8my1R2.js → MathMessageMarkdown-D9uB55Oh.js} +1 -1
- ksadk/server/static/assets/{MermaidBlock-Dz4IP-Tx.js → MermaidBlock--OEYoXIJ.js} +6 -6
- ksadk/server/static/assets/{NativeTerminalPanel-DUrK0JpZ.js → NativeTerminalPanel-DrEe1syq.js} +1 -1
- ksadk/server/static/assets/{abnfDiagram-VCTEODGH-g20pFzNV.js → abnfDiagram-VCTEODGH-eeTFJLvo.js} +1 -1
- ksadk/server/static/assets/{arc-C4FzinUA.js → arc-S3ZNbIAd.js} +1 -1
- ksadk/server/static/assets/architecture-7GRP2DOG-Dk9nRQ6-.js +1 -0
- ksadk/server/static/assets/{architectureDiagram-5GKGNRK7-DpIqL5h4.js → architectureDiagram-5GKGNRK7-CRjgEJDX.js} +1 -1
- ksadk/server/static/assets/{blockDiagram-NRAW4CY4-BjkljTNz.js → blockDiagram-NRAW4CY4-C7bsBoNH.js} +1 -1
- ksadk/server/static/assets/{c4Diagram-UCG6FXSJ-Dk_ieq2X.js → c4Diagram-UCG6FXSJ-BX3c33Ob.js} +1 -1
- ksadk/server/static/assets/channel-s354Yo6o.js +1 -0
- ksadk/server/static/assets/chunk-2Q5K7J3B-CDpPpKR5.js +1 -0
- ksadk/server/static/assets/{chunk-5VM5RSS4-BVHAchFb.js → chunk-5VM5RSS4-bZ7ws-8m.js} +1 -1
- ksadk/server/static/assets/{chunk-F27PBJKO-C-ipQzuS.js → chunk-F27PBJKO-D2r0pvhY.js} +1 -1
- ksadk/server/static/assets/{chunk-G27WJ6UU-C2EyJbIK.js → chunk-G27WJ6UU-CZwF3oUP.js} +1 -1
- ksadk/server/static/assets/{chunk-JWPE2WC7-vYvVJb_M.js → chunk-JWPE2WC7-DigFYCML.js} +1 -1
- ksadk/server/static/assets/{chunk-LCL6LL3I-BcI6ysPT.js → chunk-LCL6LL3I-CnorGV5q.js} +1 -1
- ksadk/server/static/assets/{chunk-POPQ4Y6H-C030x_Z1.js → chunk-POPQ4Y6H-CexntQA-.js} +1 -1
- ksadk/server/static/assets/{chunk-RHFEMEQ7-yyGpsz4n.js → chunk-RHFEMEQ7-CHTC7UxA.js} +1 -1
- ksadk/server/static/assets/{chunk-SVP7TREG-BLTlmMU7.js → chunk-SVP7TREG-BC1EWt_-.js} +1 -1
- ksadk/server/static/assets/{chunk-XXDRQBXY-C_32ArgP.js → chunk-XXDRQBXY-BTG24xN0.js} +1 -1
- 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-JH36ORCC-9YQYwdl0.js → cose-bilkent-JH36ORCC-CkonRdAS.js} +1 -1
- ksadk/server/static/assets/cynefin-OW5HDTMX-BBlT4uMf.js +1 -0
- ksadk/server/static/assets/{cynefinDiagram-5FMLGOSQ-ErLF5N13.js → cynefinDiagram-5FMLGOSQ-DEOCBe15.js} +1 -1
- ksadk/server/static/assets/{dagre-3AP2YEHR-DFiQF-6f.js → dagre-3AP2YEHR-DBThPuLa.js} +1 -1
- ksadk/server/static/assets/{dagre-BuhGnRI1.js → dagre-ClTPrTht.js} +1 -1
- ksadk/server/static/assets/{diagram-S7CK7UJ4-Bt1v8-GC.js → diagram-S7CK7UJ4-DsZHrnpJ.js} +1 -1
- ksadk/server/static/assets/{diagram-UQ7AKVKN-DSCxJdBK.js → diagram-UQ7AKVKN-BJR4nhVr.js} +1 -1
- ksadk/server/static/assets/{diagram-VSXAHHWV-DHfYwp_9.js → diagram-VSXAHHWV-xzcERX0a.js} +1 -1
- ksadk/server/static/assets/{diagram-VX7I27RA-DdzD-4Le.js → diagram-VX7I27RA-tn2xM1xu.js} +1 -1
- ksadk/server/static/assets/{diagram-Z3DM3KII-Du-nAJ9F.js → diagram-Z3DM3KII-BZPGBkw5.js} +1 -1
- ksadk/server/static/assets/{dist-ClxGviKw.js → dist-4zN1_tq5.js} +1 -1
- ksadk/server/static/assets/{dist-BE7bu-DL.js → dist-8VWI-2bZ.js} +1 -1
- ksadk/server/static/assets/{dist-BX8z72IC.js → dist-B-46q3Hk.js} +1 -1
- ksadk/server/static/assets/{dist-BjU6y-A2.js → dist-B0gdk4rl.js} +1 -1
- ksadk/server/static/assets/{dist-C_wsv-Qd.js → dist-B1oWRmrH.js} +1 -1
- ksadk/server/static/assets/{dist-ngtN0DJB.js → dist-BI1qQH4n.js} +1 -1
- ksadk/server/static/assets/{dist-dydu68Fl.js → dist-BJLUwH6W.js} +1 -1
- ksadk/server/static/assets/{dist-Dq9gLD7L.js → dist-Bbwqa8TG.js} +1 -1
- ksadk/server/static/assets/{dist-CttYUqzS.js → dist-Btyo4vX4.js} +1 -1
- ksadk/server/static/assets/{dist-CXYYBw3_.js → dist-C71CsujO.js} +1 -1
- ksadk/server/static/assets/{dist-dDdADKFA.js → dist-CXpH_Rdd.js} +1 -1
- ksadk/server/static/assets/{dist-CSh_DE14.js → dist-Cq4OL6nO.js} +1 -1
- ksadk/server/static/assets/{dist-8hqcx0sU.js → dist-D1V3f1B4.js} +1 -1
- ksadk/server/static/assets/{dist-BVDffZ0U.js → dist-DJmCPRVB.js} +1 -1
- ksadk/server/static/assets/{dist-DnfXs8Vn.js → dist-DQAB0qn_.js} +1 -1
- ksadk/server/static/assets/{dist-DNp6rLRA.js → dist-DUwKa_l6.js} +1 -1
- ksadk/server/static/assets/{dist-B7seoj3d.js → dist-DdRBIceA.js} +1 -1
- ksadk/server/static/assets/{dist-BytlxIDT.js → dist-DfGFrb0v.js} +1 -1
- ksadk/server/static/assets/{dist-Bf2M8m3N.js → dist-DjhwGUgZ.js} +1 -1
- ksadk/server/static/assets/{dist-W-TIVntx.js → dist-DyqV4fL4.js} +1 -1
- ksadk/server/static/assets/{dist-DUX-id_F.js → dist-M67Hwu0n.js} +1 -1
- ksadk/server/static/assets/{dist-DmldrHd_.js → dist-u8tVH5Ak.js} +1 -1
- ksadk/server/static/assets/{ebnfDiagram-PWID7BFC-Da9C9NO1.js → ebnfDiagram-PWID7BFC-DVfMsLge.js} +1 -1
- ksadk/server/static/assets/{erDiagram-SSCWMZ5O-EAGqqR79.js → erDiagram-SSCWMZ5O-CWEZSYaw.js} +1 -1
- 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-DqJsKb59.js → ganttDiagram-EL5Y4UJY-TWIxoyYL.js} +1 -1
- ksadk/server/static/assets/gitGraph-4MIJSDKK-CKiKY9Cf.js +1 -0
- ksadk/server/static/assets/{gitGraphDiagram-WWUBYQGX-B6g4dtDi.js → gitGraphDiagram-WWUBYQGX-DDh2hd2S.js} +1 -1
- 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-Djm_nbd5.js → infoDiagram-RXCK75RN-CgoyWiDR.js} +1 -1
- ksadk/server/static/assets/{ishikawaDiagram-5VMMS53U-DWya9SG2.js → ishikawaDiagram-5VMMS53U-CyRIu_om.js} +1 -1
- ksadk/server/static/assets/{journeyDiagram-EYS64GPL-DutxhSNI.js → journeyDiagram-EYS64GPL-DN5JXHzN.js} +1 -1
- ksadk/server/static/assets/{kanban-definition-3QL26DDD-DJdOF8Fm.js → kanban-definition-3QL26DDD-CNP3ui66.js} +1 -1
- ksadk/server/static/assets/{katex-vFWytM5c.js → katex-DWEzQy1d.js} +1 -1
- ksadk/server/static/assets/{linear-BHjG8b-J.js → linear-C-qHp7d2.js} +1 -1
- ksadk/server/static/assets/{mermaid-parser.core-KGSy4jWT.js → mermaid-parser.core-Cl-K943T.js} +2 -2
- ksadk/server/static/assets/{mindmap-definition-FBJOCRG2-9-HC88D4.js → mindmap-definition-FBJOCRG2-D5DB5mYm.js} +1 -1
- ksadk/server/static/assets/packet-AYTQ26CC-C7R3NUlK.js +1 -0
- ksadk/server/static/assets/{pegDiagram-XKGWAZYB-DrEZd4fD.js → pegDiagram-XKGWAZYB-BQVc9ia_.js} +1 -1
- ksadk/server/static/assets/pie-WAS4IAKB-BIT6qjr3.js +1 -0
- ksadk/server/static/assets/{pieDiagram-E7YTZNPT-DpjqOFFp.js → pieDiagram-E7YTZNPT-B6UCAvtY.js} +1 -1
- ksadk/server/static/assets/{quadrantDiagram-AXDQQJYC-BiNhgOXX.js → quadrantDiagram-AXDQQJYC-mIr2d3eb.js} +1 -1
- 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-_Y3Ojg6G.js → railroadDiagram-O6MQD6OU-Dt3FFDmK.js} +1 -1
- ksadk/server/static/assets/{requirementDiagram-EFPCY7ZU-DeCFdg9K.js → requirementDiagram-EFPCY7ZU-Cz_vQtgF.js} +1 -1
- ksadk/server/static/assets/{sankeyDiagram-P5KCCOFB-CPH75rhw.js → sankeyDiagram-P5KCCOFB-wlO1TsH5.js} +1 -1
- ksadk/server/static/assets/{sequenceDiagram-WJ2MYXX4-OEpQQdr4.js → sequenceDiagram-WJ2MYXX4-CHRbElYq.js} +1 -1
- ksadk/server/static/assets/{sizeCapture-X5ZJPWSS-heUErzhI.js → sizeCapture-X5ZJPWSS-DXX54iyO.js} +1 -1
- ksadk/server/static/assets/{stateDiagram-HBIQ2CUA-DvA3jSMB.js → stateDiagram-HBIQ2CUA-Dp_lw9II.js} +1 -1
- ksadk/server/static/assets/stateDiagram-v2-4QOOHH4V-5b-8o2iS.js +1 -0
- ksadk/server/static/assets/{swimlanes-XN3QIQJK-CR-dfN_t.js → swimlanes-XN3QIQJK-D8O5UlLG.js} +1 -1
- ksadk/server/static/assets/swimlanesDiagram-VK2B7HYN-uf6WPRA4.js +8 -0
- ksadk/server/static/assets/{timeline-definition-24CTP7MA-DAVJf1TX.js → timeline-definition-24CTP7MA-8mfKcxvG.js} +1 -1
- 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-DwM8eDkh.js → vennDiagram-4TSXK5OY-EnNl0DE7.js} +1 -1
- ksadk/server/static/assets/wardley-WFR3VGLG-YW3Q0ml_.js +1 -0
- ksadk/server/static/assets/{wardleyDiagram-VM6X3IG4-DZL-Zz2t.js → wardleyDiagram-VM6X3IG4-DBu5fbYr.js} +1 -1
- ksadk/server/static/assets/{xychartDiagram-S5SC5T6Z-Dy6Yh_hu.js → xychartDiagram-S5SC5T6Z-BSVXs4IY.js} +1 -1
- ksadk/server/static/index.html +2 -2
- ksadk/skills/service_client.py +48 -0
- ksadk/studio/agent_lifecycle.py +26 -20
- ksadk/studio/api.py +513 -71
- ksadk/studio/api_catalog_routes.py +5 -0
- ksadk/studio/api_contracts.py +34 -1
- ksadk/studio/api_plugin_routes.py +480 -0
- ksadk/studio/attachment_store.py +187 -0
- ksadk/studio/authoring.py +10 -4
- ksadk/studio/authoring_coordinator.py +12 -2
- ksadk/studio/builder.py +123 -43
- ksadk/studio/cloud.py +4 -0
- ksadk/studio/codex_agent_service.py +12 -1
- ksadk/studio/codex_builder.py +54 -15
- ksadk/studio/codex_manifest.py +21 -1
- ksadk/studio/codex_run.py +16 -4
- ksadk/studio/compatibility_report.py +445 -0
- ksadk/studio/compiler.py +6 -1
- ksadk/studio/contracts.py +123 -4
- ksadk/studio/dsh_provider_registration.py +768 -0
- ksadk/studio/event_store.py +54 -6
- ksadk/studio/framework_run.py +37 -4
- ksadk/studio/hosted_kernel.py +1 -1
- ksadk/studio/operations.py +12 -2
- ksadk/studio/plugin_composition.py +301 -0
- ksadk/studio/plugin_kernel_adapter.py +128 -0
- ksadk/studio/plugin_runtime.py +652 -0
- ksadk/studio/resource_catalog.py +6 -1
- ksadk/studio/run_service.py +713 -75
- ksadk/studio/runtime_source.py +9 -1
- ksadk/studio/scheduler_runtime.py +374 -0
- ksadk/studio/scheduler_service.py +211 -0
- ksadk/studio/service.py +672 -82
- ksadk/studio/shared_web.py +167 -28
- 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/validator.py +1 -1
- ksadk/studio/workspace.py +1 -0
- ksadk/version.py +1 -1
- ksadk_runtime_common/workspace_files/path_utils.py +41 -0
- ksadk/server/static/assets/architecture-7GRP2DOG-DjKratdf.js +0 -1
- ksadk/server/static/assets/channel-4cQHKtx1.js +0 -1
- ksadk/server/static/assets/chunk-2Q5K7J3B-DmgWkESh.js +0 -1
- ksadk/server/static/assets/classDiagram-DTDB5LWJ-DLFd9Xi0.js +0 -1
- ksadk/server/static/assets/classDiagram-v2-JRS7N3AN-DLFd9Xi0.js +0 -1
- ksadk/server/static/assets/cynefin-OW5HDTMX-DjEM48Qp.js +0 -1
- ksadk/server/static/assets/eventmodeling-NTZA5JFV-CMgMaJrC.js +0 -1
- ksadk/server/static/assets/flowDiagram-A5DVABFB-BBKL0x3P.js +0 -1
- ksadk/server/static/assets/gitGraph-4MIJSDKK-Dw63mrhw.js +0 -1
- ksadk/server/static/assets/index-8ipRcQ-M.js +0 -240
- ksadk/server/static/assets/index-ByFCqjlh.css +0 -2
- ksadk/server/static/assets/info-A6RAGUB7-B6iAblII.js +0 -1
- ksadk/server/static/assets/packet-AYTQ26CC-BOYAipuq.js +0 -1
- ksadk/server/static/assets/pie-WAS4IAKB-Ctq0Kbku.js +0 -1
- ksadk/server/static/assets/radar-RG4KPBEZ-DN0-ul_0.js +0 -1
- ksadk/server/static/assets/railroad-74A4TZTK-C6cC_to0.js +0 -1
- ksadk/server/static/assets/railroad-abnf-HS5TGJTU-BimjIuRc.js +0 -1
- ksadk/server/static/assets/railroad-ebnf-LZEXJU2U-CvY65ABq.js +0 -1
- ksadk/server/static/assets/railroad-peg-WCYAUIDC-D72Iq_Tv.js +0 -1
- ksadk/server/static/assets/stateDiagram-v2-4QOOHH4V-BgQY03nz.js +0 -1
- ksadk/server/static/assets/swimlanesDiagram-VK2B7HYN-DLVw3q5Q.js +0 -8
- ksadk/server/static/assets/treeView-Q6P3EWNA-BMpO0wsB.js +0 -1
- ksadk/server/static/assets/treemap-WGGIJYW6-Et0aqzU3.js +0 -1
- ksadk/server/static/assets/wardley-WFR3VGLG-CbY0mhpl.js +0 -1
- ksadk/studio/static/assets/index-BLpcdrgW.css +0 -1
- ksadk/studio/static/assets/index-CYekR2Xv.js +0 -260
- {agentengine_sdk_python-0.8.2.dist-info → agentengine_sdk_python-0.8.3.dist-info}/WHEEL +0 -0
- {agentengine_sdk_python-0.8.2.dist-info → agentengine_sdk_python-0.8.3.dist-info}/entry_points.txt +0 -0
- {agentengine_sdk_python-0.8.2.dist-info → agentengine_sdk_python-0.8.3.dist-info}/licenses/LICENSE +0 -0
- {agentengine_sdk_python-0.8.2.dist-info → agentengine_sdk_python-0.8.3.dist-info}/top_level.txt +0 -0
ksadk/studio/shared_web.py
CHANGED
|
@@ -9,7 +9,16 @@ from datetime import datetime, timezone
|
|
|
9
9
|
from typing import Any
|
|
10
10
|
from uuid import uuid4
|
|
11
11
|
|
|
12
|
-
from ksadk.
|
|
12
|
+
from ksadk.conversations.contracts import (
|
|
13
|
+
APPROVAL_MODE_EXTENSION,
|
|
14
|
+
COLLABORATION_MODE_EXTENSION,
|
|
15
|
+
GOAL_OBJECTIVE_EXTENSION,
|
|
16
|
+
ConversationAttachmentPart,
|
|
17
|
+
ConversationInput,
|
|
18
|
+
ConversationTextPart,
|
|
19
|
+
validate_conversation_input,
|
|
20
|
+
)
|
|
21
|
+
from ksadk.studio.contracts import OperationStatus, RunRecord, RunStatus
|
|
13
22
|
from ksadk.studio.errors import StudioError, not_found
|
|
14
23
|
from ksadk.studio.service import StudioService
|
|
15
24
|
from ksadk.tools.gateway import tool_approval_capability
|
|
@@ -247,12 +256,38 @@ class StudioSharedWebBridge:
|
|
|
247
256
|
prompt = self._input_text(payload)
|
|
248
257
|
runtime_input = self._runtime_input(payload)
|
|
249
258
|
model = self._select_model(agent_id, str(payload.get("Model") or ""))
|
|
259
|
+
model_explicit = bool(payload.get("ModelExplicit", str(payload.get("Model") or "")))
|
|
250
260
|
approval_mode = str(payload.get("ApprovalMode") or "")
|
|
251
261
|
collaboration_mode = str(payload.get("CollaborationMode") or "")
|
|
252
262
|
goal_objective = str(payload.get("GoalObjective") or "")
|
|
253
263
|
reasoning_effort = str(payload.get("ReasoningEffort") or "")
|
|
264
|
+
try:
|
|
265
|
+
build = await self._ensure_build(agent_id)
|
|
266
|
+
self._validate_conversation_turn(
|
|
267
|
+
build_id=build.id,
|
|
268
|
+
session_id=session_id,
|
|
269
|
+
invocation_id=invocation_id,
|
|
270
|
+
prompt=prompt,
|
|
271
|
+
runtime_input=runtime_input,
|
|
272
|
+
model=model if model_explicit else "",
|
|
273
|
+
approval_mode=approval_mode,
|
|
274
|
+
collaboration_mode=collaboration_mode,
|
|
275
|
+
goal_objective=goal_objective,
|
|
276
|
+
reasoning_effort=reasoning_effort,
|
|
277
|
+
)
|
|
278
|
+
except StudioError as exc:
|
|
279
|
+
# StreamingResponse starts the HTTP response before advancing this
|
|
280
|
+
# generator. Preflight failures therefore belong in the stream;
|
|
281
|
+
# raising here would turn an actionable Studio error into Starlette's
|
|
282
|
+
# "response already started" RuntimeError.
|
|
283
|
+
yield self._failed_sse(invocation_id, exc.message)
|
|
284
|
+
return
|
|
285
|
+
except Exception:
|
|
286
|
+
yield self._failed_sse(invocation_id, "本地 Agent 运行失败")
|
|
287
|
+
return
|
|
254
288
|
execution = asyncio.create_task(
|
|
255
289
|
self._execute_run(
|
|
290
|
+
build=build,
|
|
256
291
|
agent_id=agent_id,
|
|
257
292
|
session_id=session_id,
|
|
258
293
|
invocation_id=invocation_id,
|
|
@@ -355,17 +390,34 @@ class StudioSharedWebBridge:
|
|
|
355
390
|
session_id = str(payload.get("SessionId") or f"ses_{uuid4().hex}")
|
|
356
391
|
invocation_id = str(payload.get("InvocationId") or f"resp_{uuid4().hex}")
|
|
357
392
|
model = self._select_model(agent_id, str(payload.get("Model") or ""))
|
|
393
|
+
model_explicit = bool(payload.get("ModelExplicit", str(payload.get("Model") or "")))
|
|
358
394
|
approval_mode = str(payload.get("ApprovalMode") or "")
|
|
359
395
|
collaboration_mode = str(payload.get("CollaborationMode") or "")
|
|
360
396
|
goal_objective = str(payload.get("GoalObjective") or "")
|
|
361
397
|
reasoning_effort = str(payload.get("ReasoningEffort") or "")
|
|
398
|
+
build = await self._ensure_build(agent_id)
|
|
399
|
+
prompt = self._input_text(payload)
|
|
400
|
+
runtime_input = self._runtime_input(payload)
|
|
401
|
+
self._validate_conversation_turn(
|
|
402
|
+
build_id=build.id,
|
|
403
|
+
session_id=session_id,
|
|
404
|
+
invocation_id=invocation_id,
|
|
405
|
+
prompt=prompt,
|
|
406
|
+
runtime_input=runtime_input,
|
|
407
|
+
model=model if model_explicit else "",
|
|
408
|
+
approval_mode=approval_mode,
|
|
409
|
+
collaboration_mode=collaboration_mode,
|
|
410
|
+
goal_objective=goal_objective,
|
|
411
|
+
reasoning_effort=reasoning_effort,
|
|
412
|
+
)
|
|
362
413
|
try:
|
|
363
414
|
run = await self._execute_run(
|
|
415
|
+
build=build,
|
|
364
416
|
agent_id=agent_id,
|
|
365
417
|
session_id=session_id,
|
|
366
418
|
invocation_id=invocation_id,
|
|
367
|
-
prompt=
|
|
368
|
-
runtime_input=
|
|
419
|
+
prompt=prompt,
|
|
420
|
+
runtime_input=runtime_input,
|
|
369
421
|
model=model,
|
|
370
422
|
approval_mode=approval_mode,
|
|
371
423
|
collaboration_mode=collaboration_mode,
|
|
@@ -383,6 +435,7 @@ class StudioSharedWebBridge:
|
|
|
383
435
|
async def _execute_run(
|
|
384
436
|
self,
|
|
385
437
|
*,
|
|
438
|
+
build: Any = None,
|
|
386
439
|
agent_id: str,
|
|
387
440
|
session_id: str,
|
|
388
441
|
invocation_id: str,
|
|
@@ -394,7 +447,17 @@ class StudioSharedWebBridge:
|
|
|
394
447
|
goal_objective: str = "",
|
|
395
448
|
reasoning_effort: str = "",
|
|
396
449
|
) -> RunRecord:
|
|
397
|
-
build
|
|
450
|
+
if build is None:
|
|
451
|
+
build = await self._ensure_build(agent_id)
|
|
452
|
+
bound_agent = str(
|
|
453
|
+
getattr(build, "agent_name", None) or getattr(build, "agent_id", "")
|
|
454
|
+
)
|
|
455
|
+
if bound_agent != agent_id:
|
|
456
|
+
raise StudioError(
|
|
457
|
+
"CONVERSATION_BUILD_MISMATCH",
|
|
458
|
+
"会话 Build 不属于当前 Agent",
|
|
459
|
+
status_code=409,
|
|
460
|
+
)
|
|
398
461
|
|
|
399
462
|
def observe(event: Any) -> None:
|
|
400
463
|
if event.type == "run.created":
|
|
@@ -659,29 +722,94 @@ class StudioSharedWebBridge:
|
|
|
659
722
|
}
|
|
660
723
|
|
|
661
724
|
async def _ensure_build(self, agent_id: str):
|
|
662
|
-
|
|
663
|
-
|
|
664
|
-
|
|
665
|
-
|
|
666
|
-
|
|
667
|
-
|
|
668
|
-
|
|
669
|
-
|
|
670
|
-
|
|
671
|
-
|
|
672
|
-
|
|
673
|
-
|
|
674
|
-
|
|
675
|
-
|
|
676
|
-
|
|
725
|
+
return await self.studio.ensure_current_build(agent_id)
|
|
726
|
+
|
|
727
|
+
def _validate_conversation_turn(
|
|
728
|
+
self,
|
|
729
|
+
*,
|
|
730
|
+
build_id: str,
|
|
731
|
+
session_id: str,
|
|
732
|
+
invocation_id: str,
|
|
733
|
+
prompt: str,
|
|
734
|
+
runtime_input: Any,
|
|
735
|
+
model: str,
|
|
736
|
+
approval_mode: str,
|
|
737
|
+
collaboration_mode: str,
|
|
738
|
+
goal_objective: str,
|
|
739
|
+
reasoning_effort: str,
|
|
740
|
+
) -> None:
|
|
741
|
+
"""Revalidate compatibility requests against the active Surface.
|
|
742
|
+
|
|
743
|
+
`/v1/responses` and the legacy RunAgent action remain supported wire
|
|
744
|
+
shapes, but neither may smuggle provider-only input past the shared
|
|
745
|
+
ConversationInput contract.
|
|
746
|
+
"""
|
|
747
|
+
|
|
748
|
+
surface = self.studio.conversation_surface(build_id, session_id=session_id)
|
|
749
|
+
parts: list[ConversationTextPart | ConversationAttachmentPart] = [
|
|
750
|
+
ConversationTextPart(text=prompt)
|
|
751
|
+
]
|
|
752
|
+
for index, item in enumerate(runtime_input if isinstance(runtime_input, list) else []):
|
|
753
|
+
if not isinstance(item, dict):
|
|
754
|
+
continue
|
|
755
|
+
kind = str(item.get("type") or "")
|
|
756
|
+
if kind in {"image", "input_image"}:
|
|
757
|
+
media_type = self._data_url_media_type(
|
|
758
|
+
str(item.get("url") or item.get("image_url") or ""),
|
|
759
|
+
fallback="image/*",
|
|
760
|
+
)
|
|
761
|
+
parts.append(
|
|
762
|
+
ConversationAttachmentPart(
|
|
763
|
+
attachment_ref=f"attachment://inline/{invocation_id}/{index}",
|
|
764
|
+
media_type=media_type,
|
|
765
|
+
name=str(item.get("filename") or "image"),
|
|
766
|
+
)
|
|
767
|
+
)
|
|
768
|
+
elif kind == "input_file":
|
|
769
|
+
parts.append(
|
|
770
|
+
ConversationAttachmentPart(
|
|
771
|
+
attachment_ref=f"attachment://inline/{invocation_id}/{index}",
|
|
772
|
+
media_type=self._data_url_media_type(
|
|
773
|
+
str(item.get("file_data") or item.get("file_url") or ""),
|
|
774
|
+
fallback="application/octet-stream",
|
|
775
|
+
),
|
|
776
|
+
name=str(item.get("filename") or "attachment"),
|
|
777
|
+
)
|
|
778
|
+
)
|
|
779
|
+
conversation_input = ConversationInput(
|
|
780
|
+
input_id=invocation_id,
|
|
781
|
+
session_id=session_id,
|
|
782
|
+
idempotency_key=f"responses:{invocation_id}",
|
|
783
|
+
parts=tuple(parts),
|
|
784
|
+
model_ref=model or None,
|
|
785
|
+
reasoning=reasoning_effort or None,
|
|
786
|
+
extensions={
|
|
787
|
+
key: value
|
|
788
|
+
for key, value in (
|
|
789
|
+
(APPROVAL_MODE_EXTENSION, approval_mode or None),
|
|
790
|
+
(COLLABORATION_MODE_EXTENSION, collaboration_mode or None),
|
|
791
|
+
(GOAL_OBJECTIVE_EXTENSION, goal_objective or None),
|
|
792
|
+
)
|
|
793
|
+
if value is not None
|
|
794
|
+
},
|
|
795
|
+
)
|
|
796
|
+
try:
|
|
797
|
+
validate_conversation_input(surface, conversation_input)
|
|
798
|
+
except ValueError as exc:
|
|
677
799
|
raise StudioError(
|
|
678
|
-
"
|
|
679
|
-
"当前 Agent
|
|
680
|
-
"API Key 只提供访问凭证,不会自动绑定模型。",
|
|
800
|
+
"CONVERSATION_INPUT_UNSUPPORTED",
|
|
801
|
+
"当前 Agent 不支持此会话输入",
|
|
681
802
|
status_code=422,
|
|
682
|
-
|
|
683
|
-
)
|
|
684
|
-
|
|
803
|
+
details={"reason": str(exc), "surfaceId": surface.surface_id},
|
|
804
|
+
) from exc
|
|
805
|
+
|
|
806
|
+
@staticmethod
|
|
807
|
+
def _data_url_media_type(value: str, *, fallback: str) -> str:
|
|
808
|
+
if value.startswith("data:"):
|
|
809
|
+
media_type = value[5:].split(";", 1)[0].strip().lower()
|
|
810
|
+
if media_type:
|
|
811
|
+
return media_type
|
|
812
|
+
return fallback
|
|
685
813
|
|
|
686
814
|
def _sessions(self, agent_id: str) -> list[dict[str, Any]]:
|
|
687
815
|
grouped: dict[str, list[RunRecord]] = {}
|
|
@@ -939,7 +1067,7 @@ class StudioSharedWebBridge:
|
|
|
939
1067
|
if not isinstance(content, list):
|
|
940
1068
|
continue
|
|
941
1069
|
items: list[dict[str, str]] = []
|
|
942
|
-
|
|
1070
|
+
has_attachment = False
|
|
943
1071
|
for part in content:
|
|
944
1072
|
if not isinstance(part, dict):
|
|
945
1073
|
continue
|
|
@@ -954,8 +1082,19 @@ class StudioSharedWebBridge:
|
|
|
954
1082
|
)
|
|
955
1083
|
if url:
|
|
956
1084
|
items.append({"type": "image", "url": url})
|
|
957
|
-
|
|
958
|
-
|
|
1085
|
+
has_attachment = True
|
|
1086
|
+
elif kind == "input_file":
|
|
1087
|
+
data = str(part.get("file_data") or part.get("file_url") or "")
|
|
1088
|
+
if data:
|
|
1089
|
+
items.append(
|
|
1090
|
+
{
|
|
1091
|
+
"type": "input_file",
|
|
1092
|
+
"file_data": data,
|
|
1093
|
+
"filename": str(part.get("filename") or "attachment"),
|
|
1094
|
+
}
|
|
1095
|
+
)
|
|
1096
|
+
has_attachment = True
|
|
1097
|
+
if items and has_attachment:
|
|
959
1098
|
return items
|
|
960
1099
|
return []
|
|
961
1100
|
|
ksadk/studio/soul.py
ADDED
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
"""Deterministic SoulDocument rendering and prompt compilation helpers."""
|
|
2
|
+
from __future__ import annotations
|
|
3
|
+
|
|
4
|
+
import hashlib
|
|
5
|
+
import json
|
|
6
|
+
|
|
7
|
+
from ksadk.studio.contracts import Instructions, SoulDocument
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
def render_soul_markdown(soul: SoulDocument) -> str:
|
|
11
|
+
"""Render a portable ``soul.md`` snapshot without executable directives."""
|
|
12
|
+
|
|
13
|
+
lines = ["# Soul", "", "## Identity", soul.identity.strip()]
|
|
14
|
+
if soul.principles:
|
|
15
|
+
lines.extend(["", "## Principles", *[f"- {item.strip()}" for item in soul.principles]])
|
|
16
|
+
if soul.boundaries:
|
|
17
|
+
lines.extend(["", "## Boundaries", *[f"- {item.strip()}" for item in soul.boundaries]])
|
|
18
|
+
if soul.tone:
|
|
19
|
+
lines.extend(["", "## Tone", soul.tone.strip()])
|
|
20
|
+
return "\n".join(lines).rstrip() + "\n"
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
def soul_digest(soul: SoulDocument) -> str:
|
|
24
|
+
"""Content-address the reviewed structured source, not rendered whitespace."""
|
|
25
|
+
|
|
26
|
+
payload = soul.model_dump(by_alias=True, exclude_none=True, mode="json")
|
|
27
|
+
canonical = json.dumps(
|
|
28
|
+
payload, ensure_ascii=False, sort_keys=True, separators=(",", ":")
|
|
29
|
+
).encode("utf-8")
|
|
30
|
+
return f"sha256:{hashlib.sha256(canonical).hexdigest()}"
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
def compose_system_instruction(
|
|
34
|
+
instructions: Instructions, soul: SoulDocument | None
|
|
35
|
+
) -> Instructions:
|
|
36
|
+
"""Put the reviewed identity before mutable task-specific system guidance."""
|
|
37
|
+
|
|
38
|
+
if soul is None:
|
|
39
|
+
return instructions
|
|
40
|
+
soul_section = render_soul_markdown(soul).rstrip()
|
|
41
|
+
system = "\n\n".join(
|
|
42
|
+
part
|
|
43
|
+
for part in (
|
|
44
|
+
soul_section,
|
|
45
|
+
instructions.system.strip(),
|
|
46
|
+
)
|
|
47
|
+
if part
|
|
48
|
+
)
|
|
49
|
+
return instructions.model_copy(update={"system": system})
|
|
50
|
+
|
|
51
|
+
|
|
52
|
+
__all__ = ["compose_system_instruction", "render_soul_markdown", "soul_digest"]
|