agentengine-sdk-python 0.8.0__py3-none-any.whl → 0.8.2__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {agentengine_sdk_python-0.8.0.dist-info → agentengine_sdk_python-0.8.2.dist-info}/METADATA +43 -7
- agentengine_sdk_python-0.8.2.dist-info/RECORD +778 -0
- {agentengine_sdk_python-0.8.0.dist-info → agentengine_sdk_python-0.8.2.dist-info}/WHEEL +1 -1
- ksadk/a2a/__init__.py +2 -0
- ksadk/a2a/_space_client_events.py +381 -0
- ksadk/a2a/bootstrap.py +0 -2
- ksadk/a2a/card.py +6 -111
- ksadk/a2a/control_plane.py +239 -1
- ksadk/a2a/event_adapter.py +156 -64
- ksadk/a2a/executor.py +195 -172
- ksadk/a2a/routes.py +12 -5
- ksadk/a2a/server.py +1 -8
- ksadk/a2a/service_env.py +33 -0
- ksadk/a2a/space_client.py +43 -349
- ksadk/a2a_card.py +101 -0
- ksadk/a2ui/core.py +222 -53
- ksadk/agui/_agent_helpers.py +243 -0
- ksadk/agui/a2ui_projection.py +12 -5
- ksadk/agui/agent.py +474 -275
- ksadk/agui/config.py +11 -5
- ksadk/agui/routes.py +7 -15
- ksadk/api/client.py +530 -40
- ksadk/api/environment.py +27 -0
- ksadk/builders/code_builder.py +352 -53
- ksadk/builders/container_builder.py +71 -44
- ksadk/builders/framework_requirements.py +2 -1
- ksadk/builders/ks3_uploader.py +2 -2
- ksadk/builders/managed_runtime_builder.py +60 -28
- ksadk/cli/__init__.py +25 -0
- ksadk/cli/cmd_a2a.py +18 -31
- ksadk/cli/cmd_create.py +13 -26
- ksadk/cli/cmd_dashboard.py +15 -1
- ksadk/cli/cmd_deploy.py +28 -3
- ksadk/cli/cmd_eval.py +443 -0
- ksadk/cli/cmd_evalset.py +284 -0
- ksadk/cli/cmd_files.py +5 -1
- ksadk/cli/cmd_hermes.py +137 -163
- ksadk/cli/cmd_invoke.py +28 -38
- ksadk/cli/cmd_launch.py +12 -0
- ksadk/cli/cmd_managed_runtime.py +95 -0
- ksadk/cli/cmd_observe.py +85 -0
- ksadk/cli/cmd_openclaw.py +85 -479
- ksadk/cli/cmd_replay.py +28 -4
- ksadk/cli/cmd_run.py +29 -67
- ksadk/cli/cmd_studio.py +201 -0
- ksadk/cli/cmd_web.py +15 -6
- ksadk/cli/dry_run.py +2 -1
- ksadk/cli/env_options.py +83 -0
- ksadk/cli/global_options.py +3 -1
- ksadk/cli/hermes_env.py +151 -0
- ksadk/cli/invoke_payload.py +49 -0
- ksadk/cli/network_options.py +7 -5
- ksadk/cli/openclaw_env.py +458 -0
- ksadk/cli/runtime_bootstrap.py +51 -0
- ksadk/cli/ui.py +6 -0
- ksadk/cli/workflow_common.py +5 -5
- ksadk/codex/__init__.py +3 -3
- ksadk/codex/client.py +833 -49
- ksadk/codex/phase.py +1 -1
- ksadk/codex/runtime.py +720 -127
- ksadk/common/kop_client.py +232 -0
- ksadk/configs/__init__.py +1 -3
- ksadk/configs/env_registry.py +244 -45
- ksadk/configs/env_registry_pcm.py +181 -0
- ksadk/configs/env_var_spec.py +18 -0
- ksadk/configs/global_config.py +6 -1
- ksadk/configs/settings.py +5 -108
- ksadk/context_engine/__init__.py +98 -0
- ksadk/context_engine/assembler.py +176 -0
- ksadk/context_engine/baseline.py +419 -0
- ksadk/context_engine/cache_observability.py +228 -0
- ksadk/context_engine/capabilities.py +443 -0
- ksadk/context_engine/contributors.py +344 -0
- ksadk/context_engine/hosted_pipeline.py +417 -0
- ksadk/context_engine/models.py +117 -0
- ksadk/context_engine/planner.py +698 -0
- ksadk/context_engine/policies.py +319 -0
- ksadk/context_engine/projection.py +31 -0
- ksadk/context_engine/shadow_plan.py +266 -0
- ksadk/context_engine/tokenizer.py +164 -0
- ksadk/conversations/__init__.py +85 -94
- ksadk/conversations/context.py +126 -6
- ksadk/conversations/message_projection.py +292 -28
- ksadk/conversations/model_context.py +49 -3
- ksadk/conversations/runtime_compaction.py +207 -5
- ksadk/conversations/runtime_input.py +193 -3
- ksadk/conversations/runtime_invocation.py +81 -3
- ksadk/conversations/runtime_observability.py +157 -4
- ksadk/conversations/runtime_payloads.py +42 -0
- ksadk/conversations/runtime_preparation.py +280 -2
- ksadk/conversations/runtime_resume.py +71 -32
- ksadk/conversations/runtime_stream_events.py +94 -9
- ksadk/conversations/runtime_streaming.py +175 -22
- ksadk/conversations/semantic_summary.py +311 -1
- ksadk/conversations/session_lock.py +51 -0
- ksadk/deployment/env_forward.py +72 -0
- ksadk/deployment/managed_runtime.py +38 -0
- ksadk/deployment/manager.py +24 -8
- ksadk/deployment/providers/serverless.py +228 -92
- ksadk/evaluation/__init__.py +116 -0
- ksadk/evaluation/a2a_adapter.py +452 -0
- ksadk/evaluation/adapters.py +67 -0
- ksadk/evaluation/agent_eval_client.py +395 -0
- ksadk/evaluation/cloud_binding.py +80 -0
- ksadk/evaluation/cloud_converter.py +194 -0
- ksadk/evaluation/cloud_service.py +199 -0
- ksadk/evaluation/contracts.py +478 -0
- ksadk/evaluation/evalset.py +351 -0
- ksadk/evaluation/evaluators.py +627 -0
- ksadk/evaluation/evidence.py +258 -0
- ksadk/evaluation/executor.py +143 -0
- ksadk/evaluation/local_adapter.py +550 -0
- ksadk/evaluation/service_env.py +27 -0
- ksadk/evaluation/storage.py +68 -0
- ksadk/evaluation/studio_build_adapter.py +253 -0
- ksadk/evaluation/target.py +82 -0
- ksadk/events/__init__.py +13 -13
- ksadk/events/_v1_compat/__init__.py +1 -0
- ksadk/events/_v1_compat/models.py +299 -0
- ksadk/events/_v1_compat/parser.py +247 -0
- ksadk/events/_v1_compat/projection.py +753 -0
- ksadk/events/adapters/__init__.py +34 -0
- ksadk/events/adapters/_a2a_snapshot.py +622 -0
- ksadk/events/adapters/_a2a_support.py +275 -0
- ksadk/events/adapters/_codex_interactions.py +375 -0
- ksadk/events/adapters/_codex_items.py +801 -0
- ksadk/events/adapters/_codex_validators.py +311 -0
- ksadk/events/adapters/_langgraph_support.py +785 -0
- ksadk/events/adapters/a2a.py +841 -0
- ksadk/events/adapters/adk.py +503 -0
- ksadk/events/adapters/codex.py +717 -0
- ksadk/events/adapters/langgraph.py +745 -0
- ksadk/events/canonical.py +440 -0
- ksadk/events/canonical_replay.py +497 -0
- ksadk/events/canonical_store.py +468 -0
- ksadk/events/cold_recovery.py +257 -0
- ksadk/events/content.py +89 -0
- ksadk/events/identity.py +86 -0
- ksadk/events/pipeline.py +455 -0
- ksadk/events/projections.py +66 -0
- ksadk/events/reducer.py +661 -0
- ksadk/events/replay.py +3 -36
- ksadk/events/runtime_event.py +20 -256
- ksadk/events/session_event.py +324 -0
- ksadk/events/store.py +3 -316
- ksadk/events/v1_compat.py +41 -0
- ksadk/harness/__init__.py +3 -2
- ksadk/harness/app.py +114 -123
- ksadk/harness/config.py +1 -1
- ksadk/harness/runtime.py +467 -0
- ksadk/hermes_terminal.py +5 -0
- ksadk/identity/resolver.py +4 -3
- ksadk/interaction/__init__.py +28 -0
- ksadk/interaction/contracts.py +136 -0
- ksadk/interaction/ledger.py +189 -0
- ksadk/interaction/provider.py +122 -0
- ksadk/interaction/providers/__init__.py +52 -0
- ksadk/interaction/providers/adk.py +40 -0
- ksadk/interaction/providers/codex.py +94 -0
- ksadk/interaction/providers/langgraph.py +58 -0
- ksadk/kernel/__init__.py +117 -0
- ksadk/kernel/authorization.py +258 -0
- ksadk/kernel/bootstrap.py +1074 -0
- ksadk/kernel/contract_fingerprints.py +61 -0
- ksadk/kernel/contracts.py +362 -0
- ksadk/kernel/control.py +219 -0
- ksadk/kernel/errors.py +79 -0
- ksadk/kernel/ingress.py +1102 -0
- ksadk/kernel/mapping.py +111 -0
- ksadk/kernel/memory_store.py +1133 -0
- ksadk/kernel/postgres_store.py +1756 -0
- ksadk/kernel/recovery.py +452 -0
- ksadk/kernel/runtime_identity.py +103 -0
- ksadk/kernel/sql/001_agent_kernel.sql +120 -0
- ksadk/kernel/sqlite_store.py +1410 -0
- ksadk/kernel/state.py +145 -0
- ksadk/kernel/store.py +232 -0
- ksadk/kernel/worker.py +953 -0
- ksadk/knowledge_base/client.py +22 -4
- ksadk/knowledge_base/service.py +32 -5
- ksadk/managed_a2a_card.py +160 -0
- ksadk/managed_runtime.py +16 -9
- ksadk/memory/__init__.py +61 -0
- ksadk/memory/adk/backends/base_ltm_backend.py +96 -1
- ksadk/memory/adk/backends/http_ltm_backend.py +14 -5
- ksadk/memory/adk/backends/inmemory_ltm_backend.py +136 -3
- ksadk/memory/adk/backends/sdk_ltm_backend.py +394 -5
- ksadk/memory/adk/backends/sqlite_ltm_backend.py +95 -0
- ksadk/memory/adk/long_term_memory.py +3 -2
- ksadk/memory/coordinator.py +461 -0
- ksadk/memory/events.py +202 -0
- ksadk/memory/extraction.py +228 -0
- ksadk/memory/ltm_backend_factory.py +16 -3
- ksadk/memory/models.py +316 -0
- ksadk/memory/policy.py +215 -0
- ksadk/memory/provider.py +47 -0
- ksadk/memory/provider_adapter.py +159 -0
- ksadk/memory/provider_resolver.py +71 -0
- ksadk/memory/providers/__init__.py +5 -0
- ksadk/memory/providers/local_sqlite.py +490 -0
- ksadk/memory/resolved_policy.py +145 -0
- ksadk/memory/service.py +198 -8
- ksadk/memory/tool.py +4 -0
- ksadk/model_proxy/bootstrap.py +16 -9
- ksadk/model_proxy/config.py +22 -1
- ksadk/model_proxy/detect.py +202 -9
- ksadk/model_proxy/namespace.py +67 -15
- ksadk/model_proxy/server.py +168 -6
- ksadk/model_proxy/transform.py +105 -3
- ksadk/observability/__init__.py +25 -0
- ksadk/observability/session_log.py +420 -0
- ksadk/observability/trajectory.py +105 -0
- ksadk/prompts/__init__.py +71 -0
- ksadk/prompts/compiler.py +215 -0
- ksadk/prompts/models.py +82 -0
- ksadk/prompts/projection.py +89 -0
- ksadk/prompts/resolved.py +137 -0
- ksadk/prompts/sources.py +233 -0
- ksadk/runners/_langgraph_runner_streams.py +822 -0
- ksadk/runners/adk_runner.py +14 -31
- ksadk/runners/base_runner.py +44 -3
- ksadk/runners/factory.py +3 -3
- ksadk/runners/langgraph_runner.py +252 -433
- ksadk/runners/utils/__init__.py +0 -10
- ksadk/runners/utils/loader.py +16 -0
- ksadk/runtime/__init__.py +67 -41
- ksadk/runtime/_runner_adapter/__init__.py +1 -0
- ksadk/runtime/_runner_adapter/stream_mapping.py +788 -0
- ksadk/runtime/adapter.py +199 -16
- ksadk/runtime/conversation_execution.py +687 -0
- ksadk/runtime/executor.py +392 -0
- ksadk/runtime/factory.py +342 -0
- ksadk/runtime/framework_adapters.py +6 -12
- ksadk/runtime/hosted_finalizer.py +268 -0
- ksadk/runtime/launch.py +61 -0
- ksadk/runtime/preprocessing.py +49 -14
- ksadk/runtime/runner_adapter.py +330 -391
- ksadk/runtime/runner_loading.py +36 -0
- ksadk/runtime/usage.py +33 -0
- ksadk/sandbox/backends/e2b.py +36 -3
- ksadk/server/__init__.py +39 -4
- ksadk/server/app.py +18 -492
- ksadk/server/composition.py +36 -2
- ksadk/server/factory.py +210 -149
- ksadk/server/routes/common.py +15 -46
- ksadk/server/routes/control.py +13 -9
- ksadk/server/routes/kernel_ingress.py +258 -0
- ksadk/server/routes/misc.py +10 -33
- ksadk/server/routes/models.py +14 -6
- ksadk/server/routes/openai_compat.py +129 -27
- ksadk/server/routes/projection.py +84 -16
- ksadk/server/routes/run.py +347 -460
- ksadk/server/routes/sessions.py +37 -40
- ksadk/server/routes/streaming.py +52 -7
- ksadk/server/routes/workspace.py +54 -21
- ksadk/server/static/assets/{ArtifactsPanel-Cjnqt-8W.js → ArtifactsPanel-DSU1sWD_.js} +1 -1
- ksadk/server/static/assets/{CodeBlock-BqyqZfuB.js → CodeBlock-DOH6MVcn.js} +4 -4
- ksadk/server/static/assets/{MathMessageMarkdown-BpH7jiFM.js → MathMessageMarkdown-BL8my1R2.js} +4 -4
- ksadk/server/static/assets/MathMessageMarkdown-BorAY7qD.css +1 -0
- ksadk/server/static/assets/MermaidBlock-Dz4IP-Tx.js +312 -0
- ksadk/server/static/assets/NativeTerminalPanel-DUrK0JpZ.js +1 -0
- ksadk/server/static/assets/abnfDiagram-VCTEODGH-g20pFzNV.js +1 -0
- ksadk/server/static/assets/arc-C4FzinUA.js +1 -0
- ksadk/server/static/assets/architecture-7GRP2DOG-DjKratdf.js +1 -0
- ksadk/server/static/assets/architectureDiagram-5GKGNRK7-DpIqL5h4.js +36 -0
- ksadk/server/static/assets/blockDiagram-NRAW4CY4-BjkljTNz.js +129 -0
- ksadk/server/static/assets/c4Diagram-UCG6FXSJ-Dk_ieq2X.js +38 -0
- ksadk/server/static/assets/channel-4cQHKtx1.js +1 -0
- ksadk/server/static/assets/chunk-2Q5K7J3B-DmgWkESh.js +1 -0
- ksadk/server/static/assets/{chunk-FMBD7UC4-BGhvzDYt.js → chunk-5VM5RSS4-BVHAchFb.js} +1 -1
- ksadk/server/static/assets/{chunk-ND2GUHAM-D98vPd-E.js → chunk-F27PBJKO-C-ipQzuS.js} +1 -1
- ksadk/server/static/assets/chunk-G27WJ6UU-C2EyJbIK.js +231 -0
- ksadk/server/static/assets/{chunk-4BX2VUAB-CsWIQRhc.js → chunk-JWPE2WC7-vYvVJb_M.js} +1 -1
- ksadk/server/static/assets/chunk-LCL6LL3I-BcI6ysPT.js +206 -0
- ksadk/server/static/assets/chunk-POPQ4Y6H-C030x_Z1.js +1 -0
- ksadk/server/static/assets/chunk-RHFEMEQ7-yyGpsz4n.js +168 -0
- ksadk/server/static/assets/chunk-SVP7TREG-BLTlmMU7.js +88 -0
- ksadk/server/static/assets/chunk-XXDRQBXY-C_32ArgP.js +1 -0
- ksadk/server/static/assets/classDiagram-DTDB5LWJ-DLFd9Xi0.js +1 -0
- ksadk/server/static/assets/classDiagram-v2-JRS7N3AN-DLFd9Xi0.js +1 -0
- ksadk/server/static/assets/{cose-bilkent-S5V4N54A-CX3yotHq.js → cose-bilkent-JH36ORCC-9YQYwdl0.js} +1 -1
- ksadk/server/static/assets/cynefin-OW5HDTMX-DjEM48Qp.js +1 -0
- ksadk/server/static/assets/cynefinDiagram-5FMLGOSQ-ErLF5N13.js +62 -0
- ksadk/server/static/assets/cytoscape.esm-CyCl8rPi.js +321 -0
- ksadk/server/static/assets/dagre-3AP2YEHR-DFiQF-6f.js +4 -0
- ksadk/server/static/assets/dagre-BuhGnRI1.js +1 -0
- ksadk/server/static/assets/diagram-S7CK7UJ4-Bt1v8-GC.js +30 -0
- ksadk/server/static/assets/diagram-UQ7AKVKN-DSCxJdBK.js +41 -0
- ksadk/server/static/assets/diagram-VSXAHHWV-DHfYwp_9.js +3 -0
- ksadk/server/static/assets/diagram-VX7I27RA-DdzD-4Le.js +24 -0
- ksadk/server/static/assets/diagram-Z3DM3KII-Du-nAJ9F.js +24 -0
- ksadk/server/static/assets/{dist-D82mtD2s.js → dist-8hqcx0sU.js} +1 -1
- ksadk/server/static/assets/dist-B7seoj3d.js +1 -0
- ksadk/server/static/assets/{dist-DHn6nBzr.js → dist-BE7bu-DL.js} +1 -1
- ksadk/server/static/assets/{dist-eoW6tZXA.js → dist-BVDffZ0U.js} +1 -1
- ksadk/server/static/assets/{dist-C2xjE7cO.js → dist-BX8z72IC.js} +1 -1
- ksadk/server/static/assets/{dist-CgF3fj15.js → dist-Bf2M8m3N.js} +1 -1
- ksadk/server/static/assets/{dist-Bs-jQcRX.js → dist-BjU6y-A2.js} +1 -1
- ksadk/server/static/assets/{dist-Djgl2wVZ.js → dist-BytlxIDT.js} +1 -1
- ksadk/server/static/assets/{dist-CVQRZjPu.js → dist-CSh_DE14.js} +1 -1
- ksadk/server/static/assets/{dist-6CVKuTAe.js → dist-CXYYBw3_.js} +1 -1
- ksadk/server/static/assets/{dist-DlzCRy0S.js → dist-C_wsv-Qd.js} +1 -1
- ksadk/server/static/assets/{dist-DF06ORQo.js → dist-ClxGviKw.js} +1 -1
- ksadk/server/static/assets/{dist-Cf23NY4L.js → dist-CttYUqzS.js} +1 -1
- ksadk/server/static/assets/{dist-ivOya1LD.js → dist-DNp6rLRA.js} +1 -1
- ksadk/server/static/assets/{dist-BibcG1V9.js → dist-DUX-id_F.js} +1 -1
- ksadk/server/static/assets/{dist-BUHRxvDG.js → dist-DmldrHd_.js} +1 -1
- ksadk/server/static/assets/{dist-BZ9n9AjO.js → dist-DnfXs8Vn.js} +2 -2
- ksadk/server/static/assets/{dist-DqNnNFrw.js → dist-Dq9gLD7L.js} +1 -1
- ksadk/server/static/assets/{dist-CGcp2ex8.js → dist-W-TIVntx.js} +1 -1
- ksadk/server/static/assets/{dist-Cwt7koer.js → dist-dDdADKFA.js} +1 -1
- ksadk/server/static/assets/{dist-C7-3jInC.js → dist-dydu68Fl.js} +1 -1
- ksadk/server/static/assets/{dist-C99THtIA.js → dist-ngtN0DJB.js} +1 -1
- ksadk/server/static/assets/ebnfDiagram-PWID7BFC-Da9C9NO1.js +1 -0
- ksadk/server/static/assets/erDiagram-SSCWMZ5O-EAGqqR79.js +99 -0
- ksadk/server/static/assets/eventmodeling-NTZA5JFV-CMgMaJrC.js +1 -0
- ksadk/server/static/assets/flowDiagram-A5DVABFB-BBKL0x3P.js +1 -0
- ksadk/server/static/assets/ganttDiagram-EL5Y4UJY-DqJsKb59.js +292 -0
- ksadk/server/static/assets/gitGraph-4MIJSDKK-Dw63mrhw.js +1 -0
- ksadk/server/static/assets/gitGraphDiagram-WWUBYQGX-B6g4dtDi.js +106 -0
- ksadk/server/static/assets/index-8ipRcQ-M.js +240 -0
- ksadk/server/static/assets/index-ByFCqjlh.css +2 -0
- ksadk/server/static/assets/info-A6RAGUB7-B6iAblII.js +1 -0
- ksadk/server/static/assets/infoDiagram-RXCK75RN-Djm_nbd5.js +2 -0
- ksadk/server/static/assets/{ishikawaDiagram-YF4QCWOH-DLOHGvWw.js → ishikawaDiagram-5VMMS53U-DWya9SG2.js} +6 -6
- ksadk/server/static/assets/{journeyDiagram-JHISSGLW-BIzKeejT.js → journeyDiagram-EYS64GPL-DutxhSNI.js} +6 -6
- ksadk/server/static/assets/{kanban-definition-UN3LZRKU-BWHoFSw2.js → kanban-definition-3QL26DDD-DJdOF8Fm.js} +10 -10
- ksadk/server/static/assets/katex-vFWytM5c.js +257 -0
- ksadk/server/static/assets/{linear-CvMBw9cA.js → linear-BHjG8b-J.js} +1 -1
- ksadk/server/static/assets/mermaid-parser.core-KGSy4jWT.js +166 -0
- ksadk/server/static/assets/{mindmap-definition-RKZ34NQL-CSAQxEAe.js → mindmap-definition-FBJOCRG2-9-HC88D4.js} +29 -29
- ksadk/server/static/assets/packet-AYTQ26CC-BOYAipuq.js +1 -0
- ksadk/server/static/assets/pegDiagram-XKGWAZYB-DrEZd4fD.js +1 -0
- ksadk/server/static/assets/pie-WAS4IAKB-Ctq0Kbku.js +1 -0
- ksadk/server/static/assets/pieDiagram-E7YTZNPT-DpjqOFFp.js +39 -0
- ksadk/server/static/assets/{quadrantDiagram-W4KKPZXB-CxIR4JXI.js → quadrantDiagram-AXDQQJYC-BiNhgOXX.js} +6 -6
- ksadk/server/static/assets/radar-RG4KPBEZ-DN0-ul_0.js +1 -0
- ksadk/server/static/assets/railroad-74A4TZTK-C6cC_to0.js +1 -0
- ksadk/server/static/assets/railroad-abnf-HS5TGJTU-BimjIuRc.js +1 -0
- ksadk/server/static/assets/railroad-ebnf-LZEXJU2U-CvY65ABq.js +1 -0
- ksadk/server/static/assets/railroad-peg-WCYAUIDC-D72Iq_Tv.js +1 -0
- ksadk/server/static/assets/railroadDiagram-O6MQD6OU-_Y3Ojg6G.js +1 -0
- ksadk/server/static/assets/requirementDiagram-EFPCY7ZU-DeCFdg9K.js +84 -0
- ksadk/server/static/assets/{sankeyDiagram-5OEKKPKP-DpGa6EAV.js → sankeyDiagram-P5KCCOFB-CPH75rhw.js} +7 -7
- ksadk/server/static/assets/{sequenceDiagram-3UESZ5HK-NTKNGGe5.js → sequenceDiagram-WJ2MYXX4-OEpQQdr4.js} +10 -10
- ksadk/server/static/assets/sizeCapture-X5ZJPWSS-heUErzhI.js +1 -0
- ksadk/server/static/assets/stateDiagram-HBIQ2CUA-DvA3jSMB.js +1 -0
- ksadk/server/static/assets/stateDiagram-v2-4QOOHH4V-BgQY03nz.js +1 -0
- ksadk/server/static/assets/swimlanes-XN3QIQJK-CR-dfN_t.js +1 -0
- ksadk/server/static/assets/swimlanesDiagram-VK2B7HYN-DLVw3q5Q.js +8 -0
- ksadk/server/static/assets/{timeline-definition-PNZ67QCA-jqoYs3jQ.js → timeline-definition-24CTP7MA-DAVJf1TX.js} +7 -7
- ksadk/server/static/assets/treeView-Q6P3EWNA-BMpO0wsB.js +1 -0
- ksadk/server/static/assets/treemap-WGGIJYW6-Et0aqzU3.js +1 -0
- ksadk/server/static/assets/vennDiagram-4TSXK5OY-DwM8eDkh.js +34 -0
- ksadk/server/static/assets/wardley-WFR3VGLG-CbY0mhpl.js +1 -0
- ksadk/server/static/assets/wardleyDiagram-VM6X3IG4-DZL-Zz2t.js +78 -0
- ksadk/server/static/assets/xychartDiagram-S5SC5T6Z-Dy6Yh_hu.js +7 -0
- ksadk/server/static/index.html +2 -2
- ksadk/sessions/__init__.py +26 -9
- ksadk/sessions/_local_service_sync.py +688 -0
- ksadk/sessions/_local_tables.py +21 -0
- ksadk/sessions/_postgres_schema.py +305 -0
- ksadk/sessions/_postgres_tables.py +15 -0
- ksadk/sessions/base.py +80 -1
- ksadk/sessions/in_memory.py +53 -2
- ksadk/sessions/local_service.py +63 -604
- ksadk/sessions/postgres_service.py +58 -148
- ksadk/sessions/resilient.py +35 -1
- ksadk/skills/runtime/backends/e2b.py +1 -1
- ksadk/skills/service_client.py +13 -3
- ksadk/studio/__init__.py +5 -0
- ksadk/studio/agent_avatar_assets.py +120 -0
- ksadk/studio/agent_lifecycle.py +51 -0
- ksadk/studio/api.py +1598 -0
- ksadk/studio/api_catalog_routes.py +324 -0
- ksadk/studio/api_contracts.py +286 -0
- ksadk/studio/api_helpers.py +132 -0
- ksadk/studio/api_memory_routes.py +82 -0
- ksadk/studio/authoring.py +749 -0
- ksadk/studio/authoring_coordinator.py +1017 -0
- ksadk/studio/builder.py +397 -0
- ksadk/studio/capabilities.py +368 -0
- ksadk/studio/cloud.py +2099 -0
- ksadk/studio/codex_agent_service.py +694 -0
- ksadk/studio/codex_authoring.py +469 -0
- ksadk/studio/codex_builder.py +437 -0
- ksadk/studio/codex_manifest.py +307 -0
- ksadk/studio/codex_run.py +395 -0
- ksadk/studio/compiler.py +190 -0
- ksadk/studio/contracts.py +755 -0
- ksadk/studio/errors.py +47 -0
- ksadk/studio/event_store.py +214 -0
- ksadk/studio/framework_run.py +342 -0
- ksadk/studio/hosted_kernel.py +317 -0
- ksadk/studio/identifiers.py +33 -0
- ksadk/studio/manifest_resolver.py +131 -0
- ksadk/studio/mcp_runtime.py +229 -0
- ksadk/studio/model_client.py +629 -0
- ksadk/studio/model_profile_service.py +214 -0
- ksadk/studio/operations.py +275 -0
- ksadk/studio/otel_trace.py +1060 -0
- ksadk/studio/pagination.py +182 -0
- ksadk/studio/pcm_memory.py +85 -0
- ksadk/studio/python_tool_inspection.py +183 -0
- ksadk/studio/repository.py +327 -0
- ksadk/studio/resource_catalog.py +1260 -0
- ksadk/studio/run_service.py +1133 -0
- ksadk/studio/runtime_catalog.py +74 -0
- ksadk/studio/runtime_source.py +365 -0
- ksadk/studio/service.py +2249 -0
- ksadk/studio/shared_web.py +1004 -0
- ksadk/studio/skill_discovery.py +628 -0
- ksadk/studio/static/assets/PrismRenderer-IYN-ffww.js +3 -0
- ksadk/studio/static/assets/index-BLpcdrgW.css +1 -0
- ksadk/studio/static/assets/index-CYekR2Xv.js +260 -0
- ksadk/studio/static/assets/react-vendor-BNmTiJ-I.js +9 -0
- ksadk/studio/static/assets/rolldown-runtime-hePW80VL.js +1 -0
- ksadk/studio/static/index.html +15 -0
- ksadk/studio/templates.py +722 -0
- ksadk/studio/validator.py +265 -0
- ksadk/studio/workspace.py +135 -0
- ksadk/tools/gateway.py +9 -0
- ksadk/toolsets/__init__.py +27 -1
- ksadk/toolsets/a2a.py +426 -0
- ksadk/tracing/__init__.py +19 -21
- ksadk/tracing/setup.py +317 -403
- ksadk/tracing/span_utils.py +0 -44
- ksadk/version.py +1 -1
- ksadk_runtime_common/memory_backend/registry.py +56 -56
- ksadk_runtime_common/schemas/runtime_event_v1.json +37 -0
- ksadk_runtime_common/schemas/runtime_event_v2.json +271 -0
- ksadk_runtime_common/workspace_files/router.py +8 -2
- agentengine_sdk_python-0.8.0.dist-info/RECORD +0 -578
- ksadk/a2a/card_builder.py +0 -64
- ksadk/a2a/client.py +0 -309
- ksadk/events/parser.py +0 -191
- ksadk/harness/runner.py +0 -211
- ksadk/runners/codex_runner.py +0 -132
- ksadk/runners/utils/langfuse.py +0 -230
- ksadk/server/static/assets/MathMessageMarkdown-DeYh8QPr.css +0 -1
- ksadk/server/static/assets/MermaidBlock-DWuxETaJ.js +0 -303
- ksadk/server/static/assets/NativeTerminalPanel-MDTopWMO.js +0 -1
- ksadk/server/static/assets/arc-CFKwSk_B.js +0 -1
- ksadk/server/static/assets/architecture-7EHR7CIX-CynqOWjZ.js +0 -1
- ksadk/server/static/assets/architectureDiagram-3BPJPVTR-Dej8jX8c.js +0 -36
- ksadk/server/static/assets/blockDiagram-GPEHLZMM-1F64jqvy.js +0 -132
- ksadk/server/static/assets/c4Diagram-AAUBKEIU-9q7AUAKb.js +0 -10
- ksadk/server/static/assets/channel-iUGv2N24.js +0 -1
- ksadk/server/static/assets/chunk-2J33WTMH-6qgwJm7Q.js +0 -1
- ksadk/server/static/assets/chunk-55IACEB6-BK8paA20.js +0 -1
- ksadk/server/static/assets/chunk-727SXJPM-B-JEhy7h.js +0 -206
- ksadk/server/static/assets/chunk-AQP2D5EJ-DYBvMHAa.js +0 -231
- ksadk/server/static/assets/chunk-QZHKN3VN-YQIEXeF6.js +0 -1
- ksadk/server/static/assets/classDiagram-4FO5ZUOK-CDAUuoXK.js +0 -1
- ksadk/server/static/assets/classDiagram-v2-Q7XG4LA2-CDAUuoXK.js +0 -1
- ksadk/server/static/assets/cytoscape.esm-DelgaX4f.js +0 -321
- ksadk/server/static/assets/dagre-BM42HDAG-C7TguAWo.js +0 -4
- ksadk/server/static/assets/dagre-Bx709z4p.js +0 -1
- ksadk/server/static/assets/diagram-2AECGRRQ-Dd17_kws.js +0 -43
- ksadk/server/static/assets/diagram-5GNKFQAL-DVIClIil.js +0 -10
- ksadk/server/static/assets/diagram-KO2AKTUF-Df_3gYQa.js +0 -3
- ksadk/server/static/assets/diagram-LMA3HP47-BhLk6ZtA.js +0 -24
- ksadk/server/static/assets/diagram-OG6HWLK6-D4GNGvuu.js +0 -24
- ksadk/server/static/assets/dist-DyvYLMW9.js +0 -1
- ksadk/server/static/assets/erDiagram-TEJ5UH35-CnfRcY2M.js +0 -85
- ksadk/server/static/assets/eventmodeling-FCH6USID-ChYO-ijM.js +0 -1
- ksadk/server/static/assets/flowDiagram-I6XJVG4X-DGaJjGNJ.js +0 -162
- ksadk/server/static/assets/ganttDiagram-6RSMTGT7-DpCoB2g9.js +0 -292
- ksadk/server/static/assets/gitGraph-WXDBUCRP-BN_0Fk-j.js +0 -1
- ksadk/server/static/assets/gitGraphDiagram-PVQCEYII-9IKVFBVT.js +0 -106
- ksadk/server/static/assets/graphlib-B8gBHxth.js +0 -1
- ksadk/server/static/assets/index-QSwCHuB8.js +0 -177
- ksadk/server/static/assets/index-jOPmTOZH.css +0 -2
- ksadk/server/static/assets/info-J43DQDTF-Cp6o3vId.js +0 -1
- ksadk/server/static/assets/infoDiagram-5YYISTIA-CYIIsb8y.js +0 -2
- ksadk/server/static/assets/katex-DATssjp1.js +0 -265
- ksadk/server/static/assets/mermaid-parser.core-mGAcEwcq.js +0 -161
- ksadk/server/static/assets/packet-YPE3B663-wQzct3cT.js +0 -1
- ksadk/server/static/assets/pie-LRSECV5Y-BgTQiv-9.js +0 -1
- ksadk/server/static/assets/pieDiagram-4H26LBE5-By-ra07M.js +0 -30
- ksadk/server/static/assets/radar-GUYGQ44K-BIq5fXsn.js +0 -1
- ksadk/server/static/assets/requirementDiagram-4Y6WPE33-DpW90iu3.js +0 -84
- ksadk/server/static/assets/stateDiagram-AJRCARHV-DGpd9yFG.js +0 -1
- ksadk/server/static/assets/stateDiagram-v2-BHNVJYJU-B3o579IQ.js +0 -1
- ksadk/server/static/assets/treeView-BLDUP644-Dqi-E0EM.js +0 -1
- ksadk/server/static/assets/treemap-LRROVOQU-ClQP9CJ9.js +0 -1
- ksadk/server/static/assets/vennDiagram-CIIHVFJN-l3Z7-wbP.js +0 -34
- ksadk/server/static/assets/wardley-L42UT6IY-8XLvnNIs.js +0 -1
- ksadk/server/static/assets/wardleyDiagram-YWT4CUSO-BR54GPmr.js +0 -78
- ksadk/server/static/assets/xychartDiagram-2RQKCTM6-SkiH8GsK.js +0 -7
- ksadk/tracing/exporters/langfuse_exporter.py +0 -460
- {agentengine_sdk_python-0.8.0.dist-info → agentengine_sdk_python-0.8.2.dist-info}/entry_points.txt +0 -0
- {agentengine_sdk_python-0.8.0.dist-info → agentengine_sdk_python-0.8.2.dist-info}/licenses/LICENSE +0 -0
- {agentengine_sdk_python-0.8.0.dist-info → agentengine_sdk_python-0.8.2.dist-info}/top_level.txt +0 -0
|
@@ -0,0 +1,324 @@
|
|
|
1
|
+
"""Catalog, credential and capability routes for Studio."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
from typing import Awaitable, Callable, Literal
|
|
6
|
+
|
|
7
|
+
from fastapi import FastAPI, File, Query, UploadFile
|
|
8
|
+
from jsonschema import Draft202012Validator # type: ignore[import-untyped]
|
|
9
|
+
from jsonschema.exceptions import SchemaError # type: ignore[import-untyped]
|
|
10
|
+
|
|
11
|
+
from ksadk.studio.api_contracts import (
|
|
12
|
+
CredentialPutRequest,
|
|
13
|
+
MCPResourceCreateRequest,
|
|
14
|
+
ModelEndpointProbeRequest,
|
|
15
|
+
ModelProfileCreateRequest,
|
|
16
|
+
PythonToolCommitRequest,
|
|
17
|
+
SecretReferenceCheckRequest,
|
|
18
|
+
SkillDiscoveryCommitRequest,
|
|
19
|
+
SkillDiscoveryRequest,
|
|
20
|
+
ToolPolicyPreviewRequest,
|
|
21
|
+
ToolResourceCreateRequest,
|
|
22
|
+
ToolSchemaValidationRequest,
|
|
23
|
+
)
|
|
24
|
+
from ksadk.studio.contracts import MCPServerRef
|
|
25
|
+
from ksadk.studio.errors import StudioError
|
|
26
|
+
from ksadk.studio.model_profile_service import probe_model_endpoint
|
|
27
|
+
from ksadk.studio.service import StudioService
|
|
28
|
+
|
|
29
|
+
ModelCatalogLoader = Callable[[], Awaitable[tuple[list, str]]]
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
def register_catalog_routes(
|
|
33
|
+
app: FastAPI,
|
|
34
|
+
studio: StudioService,
|
|
35
|
+
*,
|
|
36
|
+
runtime_model_catalog: ModelCatalogLoader,
|
|
37
|
+
) -> None:
|
|
38
|
+
"""Register resource routes without expanding the main HTTP composition."""
|
|
39
|
+
|
|
40
|
+
@app.get("/api/v1/capabilities")
|
|
41
|
+
async def capabilities(kind: str | None = None, query: str = ""):
|
|
42
|
+
return {"items": studio.list_capabilities(kind=kind, query=query)}
|
|
43
|
+
|
|
44
|
+
@app.get("/api/v1/catalog/resources")
|
|
45
|
+
async def catalog_resources(
|
|
46
|
+
kind: Literal["model", "tool", "mcp", "skill"] | None = None,
|
|
47
|
+
query: str = "",
|
|
48
|
+
source: Literal["builtin", "provider", "local", "market"] | None = None,
|
|
49
|
+
status: str | None = None,
|
|
50
|
+
installed: bool | None = None,
|
|
51
|
+
limit: int = Query(default=50, ge=1, le=200),
|
|
52
|
+
cursor: str | None = None,
|
|
53
|
+
sort: Literal["default", "displayName:asc", "displayName:desc"] = "default",
|
|
54
|
+
):
|
|
55
|
+
if kind == "model":
|
|
56
|
+
await runtime_model_catalog()
|
|
57
|
+
|
|
58
|
+
def effective_status(resource) -> str:
|
|
59
|
+
if resource.kind != "model":
|
|
60
|
+
return resource.status
|
|
61
|
+
references = list(resource.required_secret_refs or [])
|
|
62
|
+
reference = references[0] if references else resource.contract.get("credentialRef")
|
|
63
|
+
if not reference:
|
|
64
|
+
return resource.status
|
|
65
|
+
return (
|
|
66
|
+
"ready"
|
|
67
|
+
if studio.credentials.status(str(reference))["configured"]
|
|
68
|
+
else "missing-secret"
|
|
69
|
+
)
|
|
70
|
+
|
|
71
|
+
return studio.catalog.list_page(
|
|
72
|
+
kind=kind,
|
|
73
|
+
query=query,
|
|
74
|
+
source=source,
|
|
75
|
+
status=status,
|
|
76
|
+
installed=installed,
|
|
77
|
+
limit=limit,
|
|
78
|
+
cursor=cursor,
|
|
79
|
+
sort=sort,
|
|
80
|
+
status_resolver=effective_status,
|
|
81
|
+
)
|
|
82
|
+
|
|
83
|
+
@app.get("/api/v1/catalog/models")
|
|
84
|
+
async def catalog_models():
|
|
85
|
+
items, source = await runtime_model_catalog()
|
|
86
|
+
return {"items": items, "source": source, "nextCursor": None}
|
|
87
|
+
|
|
88
|
+
@app.get("/api/v1/catalog/runtimes")
|
|
89
|
+
async def catalog_runtimes():
|
|
90
|
+
return {"items": studio.runtime_catalog(), "nextCursor": None}
|
|
91
|
+
|
|
92
|
+
@app.get("/api/v1/catalog/resources/{resource_id}")
|
|
93
|
+
async def get_catalog_resource(resource_id: str):
|
|
94
|
+
return studio.catalog.get(resource_id)
|
|
95
|
+
|
|
96
|
+
@app.post("/api/v1/catalog/model-profiles", status_code=201)
|
|
97
|
+
async def create_model_profile(payload: ModelProfileCreateRequest):
|
|
98
|
+
return studio.catalog.create_model_profile(
|
|
99
|
+
name=payload.name,
|
|
100
|
+
display_name=payload.display_name,
|
|
101
|
+
version=payload.version,
|
|
102
|
+
description=payload.description,
|
|
103
|
+
spec=payload.spec,
|
|
104
|
+
)
|
|
105
|
+
|
|
106
|
+
@app.post("/api/v1/catalog/mcp-servers", status_code=201)
|
|
107
|
+
async def create_mcp_resource(payload: MCPResourceCreateRequest):
|
|
108
|
+
return studio.catalog.create_mcp_server(
|
|
109
|
+
display_name=payload.display_name,
|
|
110
|
+
description=payload.description,
|
|
111
|
+
server=payload.server,
|
|
112
|
+
)
|
|
113
|
+
|
|
114
|
+
@app.post("/api/v1/catalog/mcp-servers/{resource_id}:probe")
|
|
115
|
+
async def probe_mcp_resource(
|
|
116
|
+
resource_id: str,
|
|
117
|
+
timeout_seconds: int = Query(default=10, alias="timeoutSeconds", ge=1, le=60),
|
|
118
|
+
):
|
|
119
|
+
descriptor = studio.catalog.get(resource_id)
|
|
120
|
+
if descriptor.kind != "mcp":
|
|
121
|
+
raise StudioError(
|
|
122
|
+
"RESOURCE_KIND_INVALID",
|
|
123
|
+
"该 Resource 不是 MCP Server",
|
|
124
|
+
status_code=422,
|
|
125
|
+
details={"resourceId": resource_id},
|
|
126
|
+
)
|
|
127
|
+
server_payload = {
|
|
128
|
+
key: value for key, value in descriptor.contract.items() if key != "discoveredTools"
|
|
129
|
+
}
|
|
130
|
+
server = MCPServerRef.model_validate(server_payload)
|
|
131
|
+
try:
|
|
132
|
+
result = await studio.mcp_runtime.probe(server, timeout_seconds=timeout_seconds)
|
|
133
|
+
except StudioError as exc:
|
|
134
|
+
detail = str((exc.details or {}).get("detail") or exc.message)
|
|
135
|
+
studio.catalog.mark_probe_failed(resource_id, code=exc.code, detail=detail)
|
|
136
|
+
raise
|
|
137
|
+
return studio.catalog.save_probe(resource_id, result=result)
|
|
138
|
+
|
|
139
|
+
@app.delete("/api/v1/catalog/resources/{resource_id}", status_code=204)
|
|
140
|
+
async def delete_catalog_resource(resource_id: str):
|
|
141
|
+
descriptor = studio.catalog.get(resource_id)
|
|
142
|
+
if descriptor.kind not in {"mcp", "tool", "model", "skill"}:
|
|
143
|
+
raise StudioError(
|
|
144
|
+
"RESOURCE_KIND_INVALID",
|
|
145
|
+
"只支持删除 MCP / Tool / Model / Skill 资源",
|
|
146
|
+
status_code=422,
|
|
147
|
+
details={"kind": descriptor.kind},
|
|
148
|
+
)
|
|
149
|
+
if descriptor.kind == "model" and descriptor.source != "local":
|
|
150
|
+
raise StudioError(
|
|
151
|
+
"RESOURCE_KIND_INVALID",
|
|
152
|
+
"内置或上游发现的模型不可删除;仅支持删除手动添加的模型",
|
|
153
|
+
status_code=422,
|
|
154
|
+
details={"kind": descriptor.kind, "source": descriptor.source},
|
|
155
|
+
)
|
|
156
|
+
studio.catalog.delete_resource(resource_id)
|
|
157
|
+
return None
|
|
158
|
+
|
|
159
|
+
@app.post("/api/v1/catalog/tools", status_code=201)
|
|
160
|
+
async def create_tool_resource(payload: ToolResourceCreateRequest):
|
|
161
|
+
return studio.catalog.create_tool(
|
|
162
|
+
display_name=payload.display_name,
|
|
163
|
+
category=payload.category,
|
|
164
|
+
contract=payload.contract,
|
|
165
|
+
)
|
|
166
|
+
|
|
167
|
+
@app.post("/api/v1/catalog/python-tools:inspect")
|
|
168
|
+
async def inspect_python_tool(file: UploadFile = File(...)):
|
|
169
|
+
content = await file.read(1024 * 1024 + 1)
|
|
170
|
+
return studio.catalog.inspect_python_tool(
|
|
171
|
+
content,
|
|
172
|
+
filename=file.filename or "tool.py",
|
|
173
|
+
)
|
|
174
|
+
|
|
175
|
+
@app.post(
|
|
176
|
+
"/api/v1/catalog/python-tools/{inspection_token}:commit",
|
|
177
|
+
status_code=201,
|
|
178
|
+
)
|
|
179
|
+
async def commit_python_tool(
|
|
180
|
+
inspection_token: str,
|
|
181
|
+
payload: PythonToolCommitRequest,
|
|
182
|
+
):
|
|
183
|
+
return studio.catalog.commit_python_tool(
|
|
184
|
+
inspection_token,
|
|
185
|
+
display_name=payload.display_name,
|
|
186
|
+
name=payload.name,
|
|
187
|
+
callable_name=payload.callable_name,
|
|
188
|
+
description=payload.description,
|
|
189
|
+
)
|
|
190
|
+
|
|
191
|
+
@app.post("/api/v1/catalog/skills:import", status_code=201)
|
|
192
|
+
async def import_skill(file: UploadFile = File(...)):
|
|
193
|
+
content = await file.read(50 * 1024 * 1024 + 1)
|
|
194
|
+
return studio.catalog.import_skill_zip(content, filename=file.filename or "skill.zip")
|
|
195
|
+
|
|
196
|
+
@app.post("/api/v1/catalog/skills:discover")
|
|
197
|
+
async def discover_skills(payload: SkillDiscoveryRequest):
|
|
198
|
+
return studio.catalog.discover_skills(scan_paths=payload.scan_paths or None)
|
|
199
|
+
|
|
200
|
+
@app.get(
|
|
201
|
+
"/api/v1/catalog/skills/discoveries/{inspection_token}/candidates/{candidate_id}/files"
|
|
202
|
+
)
|
|
203
|
+
async def preview_discovered_skill(
|
|
204
|
+
inspection_token: str,
|
|
205
|
+
candidate_id: str,
|
|
206
|
+
path: str | None = Query(default=None, max_length=1024),
|
|
207
|
+
):
|
|
208
|
+
return studio.catalog.preview_discovered_skill(
|
|
209
|
+
inspection_token,
|
|
210
|
+
candidate_id,
|
|
211
|
+
path=path,
|
|
212
|
+
)
|
|
213
|
+
|
|
214
|
+
@app.get("/api/v1/catalog/skills/{resource_id}/files")
|
|
215
|
+
async def preview_installed_skill(
|
|
216
|
+
resource_id: str,
|
|
217
|
+
path: str | None = Query(default=None, max_length=1024),
|
|
218
|
+
):
|
|
219
|
+
return studio.catalog.preview_installed_skill(resource_id, path=path)
|
|
220
|
+
|
|
221
|
+
@app.post(
|
|
222
|
+
"/api/v1/catalog/skills/discoveries/{inspection_token}:commit",
|
|
223
|
+
status_code=201,
|
|
224
|
+
)
|
|
225
|
+
async def commit_discovered_skill(
|
|
226
|
+
inspection_token: str,
|
|
227
|
+
payload: SkillDiscoveryCommitRequest,
|
|
228
|
+
):
|
|
229
|
+
return studio.catalog.commit_discovered_skill(
|
|
230
|
+
inspection_token,
|
|
231
|
+
payload.candidate_id,
|
|
232
|
+
overwrite=payload.overwrite,
|
|
233
|
+
)
|
|
234
|
+
|
|
235
|
+
@app.post("/api/v1/tool-schemas:validate")
|
|
236
|
+
async def validate_tool_schema(payload: ToolSchemaValidationRequest):
|
|
237
|
+
try:
|
|
238
|
+
Draft202012Validator.check_schema(payload.schema_definition)
|
|
239
|
+
except SchemaError as exc:
|
|
240
|
+
return {
|
|
241
|
+
"valid": False,
|
|
242
|
+
"diagnostics": [
|
|
243
|
+
{
|
|
244
|
+
"code": "TOOL_SCHEMA_INVALID",
|
|
245
|
+
"message": exc.message,
|
|
246
|
+
"path": list(exc.path),
|
|
247
|
+
}
|
|
248
|
+
],
|
|
249
|
+
}
|
|
250
|
+
errors = sorted(
|
|
251
|
+
Draft202012Validator(payload.schema_definition).iter_errors(payload.sample),
|
|
252
|
+
key=lambda error: list(error.absolute_path),
|
|
253
|
+
)
|
|
254
|
+
return {
|
|
255
|
+
"valid": not errors,
|
|
256
|
+
"diagnostics": [
|
|
257
|
+
{
|
|
258
|
+
"code": "TOOL_SAMPLE_INVALID",
|
|
259
|
+
"message": error.message,
|
|
260
|
+
"path": list(error.absolute_path),
|
|
261
|
+
}
|
|
262
|
+
for error in errors
|
|
263
|
+
],
|
|
264
|
+
}
|
|
265
|
+
|
|
266
|
+
@app.post("/api/v1/tool-policies:preview")
|
|
267
|
+
async def preview_tool_policy(payload: ToolPolicyPreviewRequest):
|
|
268
|
+
tools, permissions = studio.catalog.policy_preview(payload.bindings)
|
|
269
|
+
return {"tools": tools, "allowedPermissions": permissions}
|
|
270
|
+
|
|
271
|
+
@app.post("/api/v1/mcp-servers:probe")
|
|
272
|
+
async def probe_mcp_server(
|
|
273
|
+
payload: MCPServerRef,
|
|
274
|
+
timeout_seconds: int = Query(default=10, alias="timeoutSeconds", ge=1, le=60),
|
|
275
|
+
):
|
|
276
|
+
return await studio.mcp_runtime.probe(payload, timeout_seconds=timeout_seconds)
|
|
277
|
+
|
|
278
|
+
@app.post("/api/v1/secret-references:check")
|
|
279
|
+
async def check_secret_reference(payload: SecretReferenceCheckRequest):
|
|
280
|
+
status = studio.credentials.status(payload.ref)
|
|
281
|
+
return {
|
|
282
|
+
"exists": status["configured"],
|
|
283
|
+
"scheme": payload.ref.partition("://")[0],
|
|
284
|
+
"source": status["source"],
|
|
285
|
+
}
|
|
286
|
+
|
|
287
|
+
@app.get("/api/v1/credentials/{credential_name}")
|
|
288
|
+
async def get_credential_status(credential_name: str):
|
|
289
|
+
return studio.credentials.status(f"env://{credential_name}")
|
|
290
|
+
|
|
291
|
+
@app.put("/api/v1/credentials/{credential_name}")
|
|
292
|
+
async def put_credential(credential_name: str, payload: CredentialPutRequest):
|
|
293
|
+
return studio.credentials.put_session(
|
|
294
|
+
credential_name,
|
|
295
|
+
payload.value.get_secret_value(),
|
|
296
|
+
)
|
|
297
|
+
|
|
298
|
+
@app.delete("/api/v1/credentials/{credential_name}")
|
|
299
|
+
async def delete_credential(credential_name: str):
|
|
300
|
+
return studio.credentials.delete_session(credential_name)
|
|
301
|
+
|
|
302
|
+
@app.post("/api/v1/model-profiles/{resource_id}:test")
|
|
303
|
+
async def test_model_profile(resource_id: str):
|
|
304
|
+
return await studio.test_model_profile(resource_id)
|
|
305
|
+
|
|
306
|
+
@app.post("/api/v1/model-endpoints:probe")
|
|
307
|
+
async def probe_model_endpoint_route(payload: ModelEndpointProbeRequest):
|
|
308
|
+
credential: str | None = None
|
|
309
|
+
if payload.api_key is not None:
|
|
310
|
+
credential = payload.api_key.get_secret_value()
|
|
311
|
+
elif payload.credential_ref:
|
|
312
|
+
try:
|
|
313
|
+
credential = studio.credentials.resolve(payload.credential_ref)
|
|
314
|
+
except Exception:
|
|
315
|
+
credential = None # 未配置凭证时降级为匿名探测
|
|
316
|
+
guard = getattr(studio.model_client, "network_guard", None)
|
|
317
|
+
return await probe_model_endpoint(
|
|
318
|
+
url=payload.url,
|
|
319
|
+
credential=credential,
|
|
320
|
+
network_guard=guard,
|
|
321
|
+
)
|
|
322
|
+
|
|
323
|
+
|
|
324
|
+
__all__ = ["register_catalog_routes"]
|
|
@@ -0,0 +1,286 @@
|
|
|
1
|
+
"""HTTP request contracts used by the AgentKit Studio control plane."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
from typing import Any, Literal
|
|
6
|
+
|
|
7
|
+
from pydantic import Field, SecretStr, field_validator
|
|
8
|
+
|
|
9
|
+
from ksadk.evaluation import EvaluationConfig as PublicEvaluationConfig
|
|
10
|
+
from ksadk.evaluation import TargetRef
|
|
11
|
+
from ksadk.studio.contracts import (
|
|
12
|
+
AgentBindings,
|
|
13
|
+
AgentSpec,
|
|
14
|
+
ContractModel,
|
|
15
|
+
MCPServerRef,
|
|
16
|
+
ModelSpec,
|
|
17
|
+
RuntimeRef,
|
|
18
|
+
ToolContract,
|
|
19
|
+
)
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
class SessionExchangeRequest(ContractModel):
|
|
23
|
+
token: str = Field(min_length=16, max_length=512)
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
class WorkspaceOpenRequest(ContractModel):
|
|
27
|
+
path: str
|
|
28
|
+
create: bool = False
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
class CreateAgentRequest(ContractModel):
|
|
32
|
+
id: str = Field(pattern=r"^[a-z][a-z0-9-]{2,62}$")
|
|
33
|
+
name: str = Field(min_length=1, max_length=128)
|
|
34
|
+
description: str = Field(default="", max_length=1024)
|
|
35
|
+
template: str = "blank"
|
|
36
|
+
runtime: RuntimeRef | None = None
|
|
37
|
+
spec: AgentSpec | None = None
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
class ValidationRequest(ContractModel):
|
|
41
|
+
revision: int = Field(ge=1)
|
|
42
|
+
level: Literal["schema", "build", "release"] = "build"
|
|
43
|
+
|
|
44
|
+
|
|
45
|
+
class BuildRequest(ContractModel):
|
|
46
|
+
revision: int = Field(ge=1)
|
|
47
|
+
run_evaluation: bool = False
|
|
48
|
+
evaluation_suite_refs: list[str] = Field(default_factory=list)
|
|
49
|
+
|
|
50
|
+
|
|
51
|
+
class ImportRootRequest(ContractModel):
|
|
52
|
+
"""一键导入根 Framework 项目(方案 §6.1)。"""
|
|
53
|
+
name: str | None = None
|
|
54
|
+
slug: str | None = None
|
|
55
|
+
|
|
56
|
+
|
|
57
|
+
class PromptCompileRequest(ContractModel):
|
|
58
|
+
"""PR-S2:Prompt 编译预览请求(方案 §6.2)。只读,不写 Session/Trace。"""
|
|
59
|
+
revision: int = Field(default=1, ge=1)
|
|
60
|
+
request_instructions: str = Field(default="", max_length=32768)
|
|
61
|
+
include_content: bool = False # local debug 显式请求正文
|
|
62
|
+
|
|
63
|
+
|
|
64
|
+
class ContextPreviewRequest(ContractModel):
|
|
65
|
+
"""PR-S2:Context 预览请求(方案 §6.2)。复用真实 Planner,不调模型。"""
|
|
66
|
+
revision: int = Field(default=1, ge=1)
|
|
67
|
+
user_input: str = Field(default="", max_length=1_000_000)
|
|
68
|
+
request_instructions: str = Field(default="", max_length=32768)
|
|
69
|
+
simulated_history: list[MessageInput] = Field(default_factory=list)
|
|
70
|
+
include_content: bool = False
|
|
71
|
+
|
|
72
|
+
|
|
73
|
+
class MessageInput(ContractModel):
|
|
74
|
+
role: str = "user"
|
|
75
|
+
content: str = Field(min_length=1, max_length=1_000_000)
|
|
76
|
+
|
|
77
|
+
|
|
78
|
+
class QuickAuthoringRequest(ContractModel):
|
|
79
|
+
name: str = Field(min_length=1, max_length=128)
|
|
80
|
+
slug: str | None = Field(default=None, min_length=1, max_length=63)
|
|
81
|
+
runtime_type: Literal["codex", "adk", "langgraph"]
|
|
82
|
+
template: Literal["blank", "research"] = "blank"
|
|
83
|
+
description: str = Field(default="", max_length=1024)
|
|
84
|
+
spec: AgentSpec | None = None
|
|
85
|
+
|
|
86
|
+
|
|
87
|
+
class AuthoringConversationMessage(ContractModel):
|
|
88
|
+
role: Literal["user", "assistant"]
|
|
89
|
+
content: str = Field(min_length=1, max_length=32768)
|
|
90
|
+
|
|
91
|
+
|
|
92
|
+
class ConversationAuthoringRequest(ContractModel):
|
|
93
|
+
messages: list[AuthoringConversationMessage] = Field(min_length=1, max_length=100)
|
|
94
|
+
# This is the single profile used to generate the Draft Patch. It is not
|
|
95
|
+
# implicitly the deployed Agent's only model: callers may bind a separate
|
|
96
|
+
# allow-list and default below.
|
|
97
|
+
model_profile_id: str = Field(min_length=3, max_length=256)
|
|
98
|
+
# Runtime is a Studio-owned deployment choice. The authoring model only
|
|
99
|
+
# supplies semantic intent and must not choose an incompatible framework
|
|
100
|
+
# source contract on its own.
|
|
101
|
+
runtime_type: Literal["codex", "adk", "langgraph"] = "codex"
|
|
102
|
+
agent_model_profile_ids: list[str] = Field(default_factory=list, max_length=100)
|
|
103
|
+
agent_default_model_profile_id: str | None = Field(
|
|
104
|
+
default=None,
|
|
105
|
+
min_length=3,
|
|
106
|
+
max_length=256,
|
|
107
|
+
)
|
|
108
|
+
# Resource identities are selected by the Studio user, never generated by
|
|
109
|
+
# the authoring model. The API resolves and validates their contracts
|
|
110
|
+
# before adding them to the returned Draft Patch.
|
|
111
|
+
tool_resource_ids: list[str] = Field(default_factory=list, max_length=100)
|
|
112
|
+
mcp_resource_ids: list[str] = Field(default_factory=list, max_length=100)
|
|
113
|
+
skill_resource_ids: list[str] = Field(default_factory=list, max_length=100)
|
|
114
|
+
# 可选的进度关联标识:前端生成后随请求带上,可通过
|
|
115
|
+
# GET /api/v1/authoring/conversations:status/{request_id} 轮询构建阶段。
|
|
116
|
+
request_id: str | None = Field(default=None, min_length=1, max_length=128)
|
|
117
|
+
|
|
118
|
+
|
|
119
|
+
class AuthoringCommitRequest(ContractModel):
|
|
120
|
+
name: str | None = Field(default=None, min_length=1, max_length=128)
|
|
121
|
+
slug: str | None = Field(default=None, min_length=1, max_length=63)
|
|
122
|
+
model_profile_id: str | None = Field(default=None, min_length=3, max_length=256)
|
|
123
|
+
|
|
124
|
+
|
|
125
|
+
class ProjectInspectRequest(ContractModel):
|
|
126
|
+
path: str = Field(min_length=1, max_length=4096)
|
|
127
|
+
|
|
128
|
+
|
|
129
|
+
class RunRequest(ContractModel):
|
|
130
|
+
session_id: str | None = None
|
|
131
|
+
model: str | None = Field(default=None, min_length=1, max_length=256)
|
|
132
|
+
input: MessageInput
|
|
133
|
+
environment: str = "local"
|
|
134
|
+
stream: bool = True
|
|
135
|
+
sandbox: str | None = None
|
|
136
|
+
|
|
137
|
+
|
|
138
|
+
class InteractionSubmitRequest(ContractModel):
|
|
139
|
+
name: str = Field(min_length=1, max_length=64)
|
|
140
|
+
data: dict[str, Any] = Field(default_factory=dict)
|
|
141
|
+
|
|
142
|
+
|
|
143
|
+
class CloudChatMessageRequest(ContractModel):
|
|
144
|
+
"""One cloud turn submitted through Studio's loopback control plane.
|
|
145
|
+
|
|
146
|
+
The loopback process, never the browser, owns the AK/SK used to admit the
|
|
147
|
+
message through the cloud control plane. ``content`` uses the same
|
|
148
|
+
OpenAI-compatible text/image/file part shape as RunAgent; execution-policy
|
|
149
|
+
fields remain bounded enums and are revalidated by Server/Runtime.
|
|
150
|
+
"""
|
|
151
|
+
|
|
152
|
+
content: str | list[dict[str, Any]]
|
|
153
|
+
model: str | None = Field(default=None, min_length=1, max_length=256)
|
|
154
|
+
model_options: dict[str, Any] = Field(default_factory=dict)
|
|
155
|
+
tool_approval_mode: Literal["ask", "risk", "full"] = "risk"
|
|
156
|
+
collaboration_mode: Literal["default", "plan"] | None = None
|
|
157
|
+
goal_objective: str | None = Field(default=None, min_length=1, max_length=4096)
|
|
158
|
+
|
|
159
|
+
@field_validator("content")
|
|
160
|
+
@classmethod
|
|
161
|
+
def validate_content(cls, value):
|
|
162
|
+
if isinstance(value, str):
|
|
163
|
+
if not value.strip():
|
|
164
|
+
raise ValueError("content must not be empty")
|
|
165
|
+
if len(value) > 1_000_000:
|
|
166
|
+
raise ValueError("text content is too large")
|
|
167
|
+
return value
|
|
168
|
+
if not 1 <= len(value) <= 9:
|
|
169
|
+
raise ValueError("content must contain between 1 and 9 parts")
|
|
170
|
+
attachment_count = 0
|
|
171
|
+
for part in value:
|
|
172
|
+
kind = str(part.get("type") or "")
|
|
173
|
+
if kind == "input_text":
|
|
174
|
+
text = part.get("text")
|
|
175
|
+
if not isinstance(text, str) or not text.strip() or len(text) > 1_000_000:
|
|
176
|
+
raise ValueError("input_text must contain bounded non-empty text")
|
|
177
|
+
continue
|
|
178
|
+
if kind == "input_image":
|
|
179
|
+
attachment_count += 1
|
|
180
|
+
url = part.get("image_url")
|
|
181
|
+
if not isinstance(url, str) or not url or len(url) > 14_000_000:
|
|
182
|
+
raise ValueError("input_image must contain a bounded image_url")
|
|
183
|
+
continue
|
|
184
|
+
if kind == "input_file":
|
|
185
|
+
attachment_count += 1
|
|
186
|
+
filename = part.get("filename")
|
|
187
|
+
data = part.get("file_data") or part.get("file_url")
|
|
188
|
+
if not isinstance(filename, str) or not filename.strip():
|
|
189
|
+
raise ValueError("input_file must contain a filename")
|
|
190
|
+
if not isinstance(data, str) or not data or len(data) > 14_000_000:
|
|
191
|
+
raise ValueError("input_file must contain bounded file data")
|
|
192
|
+
continue
|
|
193
|
+
raise ValueError(f"unsupported content part: {kind or '<missing>'}")
|
|
194
|
+
if attachment_count > 8:
|
|
195
|
+
raise ValueError("a turn supports at most 8 attachments")
|
|
196
|
+
return value
|
|
197
|
+
|
|
198
|
+
|
|
199
|
+
class CloudChatInteractionSubmitRequest(ContractModel):
|
|
200
|
+
"""Public Interaction/v1 fields accepted by the local cloud-chat proxy."""
|
|
201
|
+
|
|
202
|
+
run_id: str = Field(min_length=1, max_length=256)
|
|
203
|
+
interaction_id: str = Field(min_length=1, max_length=256)
|
|
204
|
+
expected_revision: int = Field(ge=1)
|
|
205
|
+
action: Literal["approve", "reject", "submit", "cancel"]
|
|
206
|
+
response: dict[str, Any] = Field(default_factory=dict)
|
|
207
|
+
idempotency_key: str = Field(min_length=1, max_length=256)
|
|
208
|
+
|
|
209
|
+
|
|
210
|
+
class StudioEvaluationCreate(ContractModel):
|
|
211
|
+
"""Request for the shared CLI/Studio evaluation executor."""
|
|
212
|
+
|
|
213
|
+
evalset_file: str = Field(min_length=1, max_length=4096)
|
|
214
|
+
target: TargetRef
|
|
215
|
+
config: PublicEvaluationConfig = Field(default_factory=PublicEvaluationConfig)
|
|
216
|
+
|
|
217
|
+
|
|
218
|
+
class SecretReferenceCheckRequest(ContractModel):
|
|
219
|
+
ref: str
|
|
220
|
+
|
|
221
|
+
|
|
222
|
+
class CredentialPutRequest(ContractModel):
|
|
223
|
+
value: SecretStr = Field(min_length=1, max_length=16_384)
|
|
224
|
+
persistence: Literal["session"] = "session"
|
|
225
|
+
|
|
226
|
+
|
|
227
|
+
class RollbackRequest(ContractModel):
|
|
228
|
+
target_build_id: str
|
|
229
|
+
|
|
230
|
+
|
|
231
|
+
class CloudAgentVersionRollbackRequest(ContractModel):
|
|
232
|
+
version_id: str = Field(min_length=1, max_length=256)
|
|
233
|
+
|
|
234
|
+
|
|
235
|
+
class ModelProfileCreateRequest(ContractModel):
|
|
236
|
+
name: str = Field(pattern=r"^[a-z][a-z0-9._-]{1,127}$")
|
|
237
|
+
display_name: str = Field(min_length=1, max_length=128)
|
|
238
|
+
version: str = Field(default="1.0.0", min_length=1, max_length=64)
|
|
239
|
+
description: str = Field(default="", max_length=4096)
|
|
240
|
+
spec: ModelSpec
|
|
241
|
+
|
|
242
|
+
|
|
243
|
+
class ModelEndpointProbeRequest(ContractModel):
|
|
244
|
+
url: str = Field(min_length=8, max_length=1024)
|
|
245
|
+
credential_ref: str | None = Field(default=None, max_length=512)
|
|
246
|
+
api_key: SecretStr | None = None
|
|
247
|
+
|
|
248
|
+
|
|
249
|
+
class MCPResourceCreateRequest(ContractModel):
|
|
250
|
+
display_name: str = Field(min_length=1, max_length=128)
|
|
251
|
+
description: str = Field(default="", max_length=4096)
|
|
252
|
+
server: MCPServerRef
|
|
253
|
+
|
|
254
|
+
|
|
255
|
+
class ToolResourceCreateRequest(ContractModel):
|
|
256
|
+
display_name: str = Field(min_length=1, max_length=128)
|
|
257
|
+
category: str = Field(default="custom", max_length=64)
|
|
258
|
+
contract: ToolContract
|
|
259
|
+
|
|
260
|
+
|
|
261
|
+
class PythonToolCommitRequest(ContractModel):
|
|
262
|
+
display_name: str = Field(min_length=1, max_length=128)
|
|
263
|
+
name: str = Field(pattern=r"^[A-Za-z_][A-Za-z0-9_]{0,127}$")
|
|
264
|
+
callable_name: str = Field(pattern=r"^[A-Za-z_][A-Za-z0-9_]{0,127}$")
|
|
265
|
+
description: str = Field(default="", max_length=1024)
|
|
266
|
+
|
|
267
|
+
|
|
268
|
+
class ToolSchemaValidationRequest(ContractModel):
|
|
269
|
+
schema_definition: dict[str, Any] = Field(alias="schema")
|
|
270
|
+
sample: Any = None
|
|
271
|
+
|
|
272
|
+
|
|
273
|
+
class ToolPolicyPreviewRequest(ContractModel):
|
|
274
|
+
bindings: AgentBindings
|
|
275
|
+
|
|
276
|
+
|
|
277
|
+
class SkillDiscoveryRequest(ContractModel):
|
|
278
|
+
scan_paths: list[str] = Field(default_factory=list, max_length=20)
|
|
279
|
+
|
|
280
|
+
|
|
281
|
+
class SkillDiscoveryCommitRequest(ContractModel):
|
|
282
|
+
candidate_id: str = Field(min_length=1, max_length=128)
|
|
283
|
+
overwrite: bool = False
|
|
284
|
+
|
|
285
|
+
|
|
286
|
+
__all__ = [name for name in globals() if name.endswith("Request")]
|