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
|
@@ -10,7 +10,14 @@ from typing import Any, Optional
|
|
|
10
10
|
from urllib.parse import urlsplit, urlunsplit
|
|
11
11
|
|
|
12
12
|
from ksadk.ids import new_session_id
|
|
13
|
+
from ksadk.sessions._postgres_schema import _PostgresSchemaMixin
|
|
14
|
+
from ksadk.sessions._postgres_tables import (
|
|
15
|
+
KSADK_PG_EVENTS_TABLE,
|
|
16
|
+
KSADK_PG_SESSIONS_TABLE,
|
|
17
|
+
KSADK_PG_STATES_TABLE,
|
|
18
|
+
)
|
|
13
19
|
from ksadk.sessions.base import (
|
|
20
|
+
CANONICAL_EVENT_STORAGE_CAPABILITIES,
|
|
14
21
|
BaseSessionService,
|
|
15
22
|
Session,
|
|
16
23
|
SessionEvent,
|
|
@@ -19,15 +26,12 @@ from ksadk.sessions.base import (
|
|
|
19
26
|
)
|
|
20
27
|
from ksadk.sessions.errors import SessionBackendUnavailable
|
|
21
28
|
|
|
22
|
-
KSADK_PG_SESSIONS_TABLE = "ksadk_sessions"
|
|
23
|
-
KSADK_PG_EVENTS_TABLE = "ksadk_events"
|
|
24
|
-
KSADK_PG_STATES_TABLE = "ksadk_states"
|
|
25
|
-
PG_READABLE_EVENTS_VIEW = "ksadk_session_events_readable"
|
|
26
|
-
|
|
27
29
|
logger = logging.getLogger(__name__)
|
|
28
30
|
|
|
29
31
|
|
|
30
|
-
class PostgresSessionService(BaseSessionService):
|
|
32
|
+
class PostgresSessionService(_PostgresSchemaMixin, BaseSessionService):
|
|
33
|
+
storage_capabilities = CANONICAL_EVENT_STORAGE_CAPABILITIES
|
|
34
|
+
|
|
31
35
|
def __init__(
|
|
32
36
|
self,
|
|
33
37
|
*,
|
|
@@ -304,7 +308,9 @@ class PostgresSessionService(BaseSessionService):
|
|
|
304
308
|
seq_id=int(next_seq or 1),
|
|
305
309
|
invocation_id=event.invocation_id,
|
|
306
310
|
metadata=dict(event.metadata),
|
|
311
|
+
seq_binding=event.seq_binding,
|
|
307
312
|
)
|
|
313
|
+
stored.bind_seq_id(int(next_seq or 1))
|
|
308
314
|
await connection.execute(
|
|
309
315
|
f"""
|
|
310
316
|
INSERT INTO {KSADK_PG_EVENTS_TABLE} (
|
|
@@ -349,6 +355,52 @@ class PostgresSessionService(BaseSessionService):
|
|
|
349
355
|
)
|
|
350
356
|
return stored
|
|
351
357
|
|
|
358
|
+
async def get_event_by_id(self, session_id: str, event_id: str) -> Optional[SessionEvent]:
|
|
359
|
+
await self._ensure_schema()
|
|
360
|
+
async with self._pool.acquire() as connection:
|
|
361
|
+
row = await connection.fetchrow(
|
|
362
|
+
f"""
|
|
363
|
+
SELECT id, session_id, author, event_type, content_json, timestamp,
|
|
364
|
+
state_delta_json, seq_id, invocation_id, metadata_json
|
|
365
|
+
FROM {KSADK_PG_EVENTS_TABLE}
|
|
366
|
+
WHERE namespace = $1 AND session_id = $2 AND id = $3
|
|
367
|
+
""",
|
|
368
|
+
self.namespace,
|
|
369
|
+
session_id,
|
|
370
|
+
event_id,
|
|
371
|
+
)
|
|
372
|
+
return self._event_from_row(row) if row is not None else None
|
|
373
|
+
|
|
374
|
+
async def get_events_by_invocation_id(
|
|
375
|
+
self,
|
|
376
|
+
session_id: str,
|
|
377
|
+
invocation_id: str,
|
|
378
|
+
*,
|
|
379
|
+
after_seq_id: Optional[int] = None,
|
|
380
|
+
before_seq_id: Optional[int] = None,
|
|
381
|
+
) -> list[SessionEvent]:
|
|
382
|
+
await self._ensure_schema()
|
|
383
|
+
conditions = ["namespace = $1", "session_id = $2", "invocation_id = $3"]
|
|
384
|
+
params: list[Any] = [self.namespace, session_id, invocation_id]
|
|
385
|
+
if after_seq_id is not None:
|
|
386
|
+
params.append(after_seq_id)
|
|
387
|
+
conditions.append(f"seq_id > ${len(params)}")
|
|
388
|
+
if before_seq_id is not None:
|
|
389
|
+
params.append(before_seq_id)
|
|
390
|
+
conditions.append(f"seq_id < ${len(params)}")
|
|
391
|
+
async with self._pool.acquire() as connection:
|
|
392
|
+
rows = await connection.fetch(
|
|
393
|
+
f"""
|
|
394
|
+
SELECT id, session_id, author, event_type, content_json, timestamp,
|
|
395
|
+
state_delta_json, seq_id, invocation_id, metadata_json
|
|
396
|
+
FROM {KSADK_PG_EVENTS_TABLE}
|
|
397
|
+
WHERE {" AND ".join(conditions)}
|
|
398
|
+
ORDER BY seq_id ASC
|
|
399
|
+
""",
|
|
400
|
+
*params,
|
|
401
|
+
)
|
|
402
|
+
return [self._event_from_row(row) for row in rows]
|
|
403
|
+
|
|
352
404
|
async def get_events(
|
|
353
405
|
self,
|
|
354
406
|
session_id: str,
|
|
@@ -687,148 +739,6 @@ class PostgresSessionService(BaseSessionService):
|
|
|
687
739
|
f"could not connect to {mask_postgres_session_dsn(self.dsn)}"
|
|
688
740
|
) from exc
|
|
689
741
|
|
|
690
|
-
async def _ensure_schema(self) -> None:
|
|
691
|
-
if self._schema_ready:
|
|
692
|
-
return
|
|
693
|
-
async with self._schema_lock:
|
|
694
|
-
if self._schema_ready:
|
|
695
|
-
return
|
|
696
|
-
await self._ensure_pool()
|
|
697
|
-
async with self._pool.acquire() as connection:
|
|
698
|
-
await connection.execute(f"""
|
|
699
|
-
CREATE TABLE IF NOT EXISTS {KSADK_PG_SESSIONS_TABLE} (
|
|
700
|
-
namespace TEXT NOT NULL,
|
|
701
|
-
tenant_id TEXT NOT NULL DEFAULT 'default',
|
|
702
|
-
workspace_id TEXT NOT NULL DEFAULT 'default',
|
|
703
|
-
id TEXT NOT NULL,
|
|
704
|
-
agent_id TEXT NOT NULL,
|
|
705
|
-
user_id TEXT NOT NULL,
|
|
706
|
-
title TEXT NOT NULL DEFAULT '',
|
|
707
|
-
title_source TEXT NOT NULL DEFAULT '',
|
|
708
|
-
summary TEXT NOT NULL DEFAULT '',
|
|
709
|
-
first_prompt TEXT NOT NULL DEFAULT '',
|
|
710
|
-
last_prompt TEXT NOT NULL DEFAULT '',
|
|
711
|
-
state_json JSONB NOT NULL DEFAULT '{{}}'::jsonb,
|
|
712
|
-
created_at DOUBLE PRECISION NOT NULL,
|
|
713
|
-
updated_at DOUBLE PRECISION NOT NULL,
|
|
714
|
-
version INTEGER NOT NULL DEFAULT 0,
|
|
715
|
-
PRIMARY KEY (namespace, id)
|
|
716
|
-
);
|
|
717
|
-
|
|
718
|
-
CREATE TABLE IF NOT EXISTS {KSADK_PG_EVENTS_TABLE} (
|
|
719
|
-
namespace TEXT NOT NULL,
|
|
720
|
-
tenant_id TEXT NOT NULL DEFAULT 'default',
|
|
721
|
-
workspace_id TEXT NOT NULL DEFAULT 'default',
|
|
722
|
-
id TEXT NOT NULL,
|
|
723
|
-
session_id TEXT NOT NULL,
|
|
724
|
-
author TEXT NOT NULL,
|
|
725
|
-
event_type TEXT NOT NULL,
|
|
726
|
-
content_json JSONB NOT NULL DEFAULT '{{}}'::jsonb,
|
|
727
|
-
timestamp DOUBLE PRECISION NOT NULL,
|
|
728
|
-
state_delta_json JSONB NOT NULL DEFAULT '{{}}'::jsonb,
|
|
729
|
-
seq_id INTEGER NOT NULL,
|
|
730
|
-
invocation_id TEXT,
|
|
731
|
-
metadata_json JSONB NOT NULL DEFAULT '{{}}'::jsonb,
|
|
732
|
-
PRIMARY KEY (namespace, id),
|
|
733
|
-
UNIQUE (namespace, session_id, seq_id),
|
|
734
|
-
FOREIGN KEY (namespace, session_id)
|
|
735
|
-
REFERENCES {KSADK_PG_SESSIONS_TABLE}(namespace, id)
|
|
736
|
-
ON DELETE CASCADE
|
|
737
|
-
);
|
|
738
|
-
|
|
739
|
-
CREATE INDEX IF NOT EXISTS idx_ksadk_pg_events_session_seq
|
|
740
|
-
ON {KSADK_PG_EVENTS_TABLE} (namespace, session_id, seq_id);
|
|
741
|
-
|
|
742
|
-
-- 跨会话事件查询(get_events_for_agent)需 JOIN sessions 按
|
|
743
|
-
-- s.agent_id 过滤并按 e.timestamp 排序;events 表无 agent_id 列,
|
|
744
|
-
-- 覆盖索引 (namespace, session_id, timestamp, id) 服务 JOIN 键
|
|
745
|
-
-- s.id=e.session_id + ORDER BY e.timestamp DESC。
|
|
746
|
-
CREATE INDEX IF NOT EXISTS idx_ksadk_pg_events_session_ts
|
|
747
|
-
ON {KSADK_PG_EVENTS_TABLE} (namespace, session_id, timestamp, id);
|
|
748
|
-
|
|
749
|
-
-- ListSessions 归并按 agent_id 过滤 + updated_at DESC 排序;
|
|
750
|
-
-- sessions 表 PK 是 (namespace, id),缺 agent_id 前缀索引。
|
|
751
|
-
CREATE INDEX IF NOT EXISTS idx_ksadk_pg_sessions_agent_updated
|
|
752
|
-
ON {KSADK_PG_SESSIONS_TABLE} (namespace, agent_id, updated_at DESC, id);
|
|
753
|
-
|
|
754
|
-
CREATE TABLE IF NOT EXISTS {KSADK_PG_STATES_TABLE} (
|
|
755
|
-
namespace TEXT NOT NULL,
|
|
756
|
-
tenant_id TEXT NOT NULL DEFAULT 'default',
|
|
757
|
-
workspace_id TEXT NOT NULL DEFAULT 'default',
|
|
758
|
-
scope TEXT NOT NULL,
|
|
759
|
-
agent_id TEXT NOT NULL,
|
|
760
|
-
user_id TEXT NOT NULL DEFAULT '',
|
|
761
|
-
session_id TEXT NOT NULL DEFAULT '',
|
|
762
|
-
state_json JSONB NOT NULL DEFAULT '{{}}'::jsonb,
|
|
763
|
-
version INTEGER NOT NULL DEFAULT 0,
|
|
764
|
-
updated_at DOUBLE PRECISION NOT NULL,
|
|
765
|
-
PRIMARY KEY (namespace, scope, agent_id, user_id, session_id)
|
|
766
|
-
);
|
|
767
|
-
|
|
768
|
-
ALTER TABLE {KSADK_PG_SESSIONS_TABLE}
|
|
769
|
-
ADD COLUMN IF NOT EXISTS tenant_id TEXT NOT NULL DEFAULT 'default';
|
|
770
|
-
ALTER TABLE {KSADK_PG_SESSIONS_TABLE}
|
|
771
|
-
ADD COLUMN IF NOT EXISTS workspace_id TEXT NOT NULL DEFAULT 'default';
|
|
772
|
-
ALTER TABLE {KSADK_PG_EVENTS_TABLE}
|
|
773
|
-
ADD COLUMN IF NOT EXISTS tenant_id TEXT NOT NULL DEFAULT 'default';
|
|
774
|
-
ALTER TABLE {KSADK_PG_EVENTS_TABLE}
|
|
775
|
-
ADD COLUMN IF NOT EXISTS workspace_id TEXT NOT NULL DEFAULT 'default';
|
|
776
|
-
ALTER TABLE {KSADK_PG_STATES_TABLE}
|
|
777
|
-
ADD COLUMN IF NOT EXISTS tenant_id TEXT NOT NULL DEFAULT 'default';
|
|
778
|
-
ALTER TABLE {KSADK_PG_STATES_TABLE}
|
|
779
|
-
ADD COLUMN IF NOT EXISTS workspace_id TEXT NOT NULL DEFAULT 'default';
|
|
780
|
-
""")
|
|
781
|
-
try:
|
|
782
|
-
await connection.execute(f"""
|
|
783
|
-
CREATE OR REPLACE VIEW {PG_READABLE_EVENTS_VIEW} AS
|
|
784
|
-
SELECT
|
|
785
|
-
event_row.namespace,
|
|
786
|
-
event_row.tenant_id,
|
|
787
|
-
event_row.workspace_id,
|
|
788
|
-
session_row.agent_id,
|
|
789
|
-
session_row.user_id,
|
|
790
|
-
session_row.title AS session_title,
|
|
791
|
-
event_row.session_id,
|
|
792
|
-
event_row.seq_id,
|
|
793
|
-
event_row.id AS event_id,
|
|
794
|
-
event_row.invocation_id,
|
|
795
|
-
event_row.author,
|
|
796
|
-
event_row.event_type,
|
|
797
|
-
CASE
|
|
798
|
-
WHEN event_row.event_type = 'user_message' THEN 'user'
|
|
799
|
-
WHEN event_row.event_type IN (
|
|
800
|
-
'assistant_message', 'reasoning', 'tool_call'
|
|
801
|
-
) THEN 'assistant'
|
|
802
|
-
WHEN event_row.event_type = 'tool_result' THEN 'tool'
|
|
803
|
-
ELSE NULL
|
|
804
|
-
END AS message_role,
|
|
805
|
-
COALESCE(
|
|
806
|
-
NULLIF(event_row.content_json #>> '{{parts,0,text}}', ''),
|
|
807
|
-
NULLIF(event_row.content_json ->> 'text', ''),
|
|
808
|
-
NULLIF(event_row.metadata_json ->> 'reasoning', ''),
|
|
809
|
-
NULLIF(event_row.metadata_json ->> 'tool_output', '')
|
|
810
|
-
) AS message_text,
|
|
811
|
-
event_row.metadata_json ->> 'tool_name' AS tool_name,
|
|
812
|
-
CASE
|
|
813
|
-
WHEN event_row.event_type = 'run_status' THEN COALESCE(
|
|
814
|
-
event_row.content_json ->> 'status',
|
|
815
|
-
event_row.metadata_json ->> 'status'
|
|
816
|
-
)
|
|
817
|
-
ELSE NULL
|
|
818
|
-
END AS lifecycle_status,
|
|
819
|
-
to_timestamp(event_row.timestamp) AS created_at,
|
|
820
|
-
event_row.content_json,
|
|
821
|
-
event_row.state_delta_json,
|
|
822
|
-
event_row.metadata_json
|
|
823
|
-
FROM {KSADK_PG_EVENTS_TABLE} AS event_row
|
|
824
|
-
JOIN {KSADK_PG_SESSIONS_TABLE} AS session_row
|
|
825
|
-
ON session_row.namespace = event_row.namespace
|
|
826
|
-
AND session_row.id = event_row.session_id;
|
|
827
|
-
""")
|
|
828
|
-
except Exception as exc:
|
|
829
|
-
logger.warning("Postgres readable session view unavailable: %s", exc)
|
|
830
|
-
self._schema_ready = True
|
|
831
|
-
|
|
832
742
|
async def _get_session_with_connection(
|
|
833
743
|
self,
|
|
834
744
|
connection: Any,
|
ksadk/sessions/resilient.py
CHANGED
|
@@ -4,7 +4,12 @@ import asyncio
|
|
|
4
4
|
import logging
|
|
5
5
|
from typing import Any, Optional, cast
|
|
6
6
|
|
|
7
|
-
from ksadk.sessions.base import
|
|
7
|
+
from ksadk.sessions.base import (
|
|
8
|
+
BaseSessionService,
|
|
9
|
+
Session,
|
|
10
|
+
SessionEvent,
|
|
11
|
+
SessionState,
|
|
12
|
+
)
|
|
8
13
|
from ksadk.sessions.in_memory import InMemorySessionService
|
|
9
14
|
from ksadk.sessions.resilience import is_session_backend_failure
|
|
10
15
|
|
|
@@ -40,6 +45,12 @@ class ResilientSessionService(BaseSessionService):
|
|
|
40
45
|
def degraded(self) -> bool:
|
|
41
46
|
return not self._primary_enabled
|
|
42
47
|
|
|
48
|
+
# This service is intentionally live-first and writes two independently
|
|
49
|
+
# sequenced stores. Even when both children can atomically bind a local
|
|
50
|
+
# seq, the wrapper cannot guarantee one shared physical seq/fact across
|
|
51
|
+
# both writes, so it inherits BaseSessionService's empty canonical storage
|
|
52
|
+
# capabilities and RuntimeEventStore fails closed before either write.
|
|
53
|
+
|
|
43
54
|
async def _call_primary(self, method_name: str, *args: Any, **kwargs: Any) -> tuple[bool, Any]:
|
|
44
55
|
if not self._primary_enabled:
|
|
45
56
|
return False, None
|
|
@@ -260,6 +271,29 @@ class ResilientSessionService(BaseSessionService):
|
|
|
260
271
|
await self._call_primary("append_event", session_id, event)
|
|
261
272
|
return live
|
|
262
273
|
|
|
274
|
+
async def get_event_by_id(self, session_id: str, event_id: str) -> Optional[SessionEvent]:
|
|
275
|
+
if await self.fallback.get_session_metadata(session_id) is None:
|
|
276
|
+
await self.get_session(session_id)
|
|
277
|
+
return await self.fallback.get_event_by_id(session_id, event_id)
|
|
278
|
+
|
|
279
|
+
async def get_events_by_invocation_id(
|
|
280
|
+
self,
|
|
281
|
+
session_id: str,
|
|
282
|
+
invocation_id: str,
|
|
283
|
+
*,
|
|
284
|
+
after_seq_id: Optional[int] = None,
|
|
285
|
+
before_seq_id: Optional[int] = None,
|
|
286
|
+
) -> list[SessionEvent]:
|
|
287
|
+
# ResilientSessionService is explicitly live-first: hydrate any durable
|
|
288
|
+
# prefix, then read the indexed in-memory authority used by get_events.
|
|
289
|
+
await self.get_session(session_id)
|
|
290
|
+
return await self.fallback.get_events_by_invocation_id(
|
|
291
|
+
session_id,
|
|
292
|
+
invocation_id,
|
|
293
|
+
after_seq_id=after_seq_id,
|
|
294
|
+
before_seq_id=before_seq_id,
|
|
295
|
+
)
|
|
296
|
+
|
|
263
297
|
async def get_events(
|
|
264
298
|
self,
|
|
265
299
|
session_id: str,
|
|
@@ -77,7 +77,7 @@ class E2BSkillRuntimeBackend:
|
|
|
77
77
|
@classmethod
|
|
78
78
|
def from_env(cls) -> "E2BSkillRuntimeBackend":
|
|
79
79
|
try:
|
|
80
|
-
from e2b import Sandbox # type: ignore[import-untyped]
|
|
80
|
+
from e2b import Sandbox # type: ignore[import-not-found, import-untyped]
|
|
81
81
|
except ImportError as exc:
|
|
82
82
|
raise SkillRuntimeError(
|
|
83
83
|
"e2b>=2.15.3,<2.25.0 is required for KSADK_SKILL_RUNTIME_BACKEND=e2b"
|
ksadk/skills/service_client.py
CHANGED
|
@@ -18,6 +18,12 @@ _KOP_HOSTS = frozenset(
|
|
|
18
18
|
"aicp.api.ksyun.com",
|
|
19
19
|
}
|
|
20
20
|
)
|
|
21
|
+
_PRIVATE_KOP_HOSTS = frozenset(
|
|
22
|
+
{
|
|
23
|
+
"aicp.inner.api.ksyun.com",
|
|
24
|
+
"aicp.internal.api.ksyun.com",
|
|
25
|
+
}
|
|
26
|
+
)
|
|
21
27
|
|
|
22
28
|
|
|
23
29
|
class SkillServiceClient:
|
|
@@ -215,14 +221,18 @@ class SkillServiceClient:
|
|
|
215
221
|
return self._requests_session
|
|
216
222
|
|
|
217
223
|
def _is_kop_mode(self) -> bool:
|
|
218
|
-
"""Match only exact
|
|
224
|
+
"""Match only exact AICP control-plane endpoints.
|
|
219
225
|
|
|
220
226
|
A user-controlled URL such as ``aicp.api.ksyun.com.attacker.example``
|
|
221
|
-
must never receive KOP signing headers.
|
|
227
|
+
must never receive KOP signing headers. Public AICP requires TLS; the
|
|
228
|
+
private ``inner`` and ``internal`` endpoints also support their existing
|
|
229
|
+
in-cluster HTTP transport.
|
|
222
230
|
"""
|
|
223
231
|
parsed = urlsplit(self.base_url)
|
|
224
232
|
host = (parsed.hostname or "").lower()
|
|
225
|
-
return
|
|
233
|
+
return host in _KOP_HOSTS and (
|
|
234
|
+
parsed.scheme == "https" or (parsed.scheme == "http" and host in _PRIVATE_KOP_HOSTS)
|
|
235
|
+
)
|
|
226
236
|
|
|
227
237
|
def _kop_base_url(self) -> str:
|
|
228
238
|
parsed = urlsplit(self.base_url)
|
ksadk/studio/__init__.py
ADDED
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
"""Validated, content-addressed assets for Studio Agent avatars."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
import hashlib
|
|
6
|
+
import io
|
|
7
|
+
import re
|
|
8
|
+
import warnings
|
|
9
|
+
from pathlib import Path
|
|
10
|
+
|
|
11
|
+
from PIL import Image, UnidentifiedImageError
|
|
12
|
+
|
|
13
|
+
from ksadk.studio.errors import StudioError, not_found
|
|
14
|
+
from ksadk.studio.workspace import Workspace
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
class AgentAvatarAssetStore:
|
|
18
|
+
MAX_BYTES = 2 * 1024 * 1024
|
|
19
|
+
MIN_EDGE = 32
|
|
20
|
+
MAX_EDGE = 2048
|
|
21
|
+
_ASSET_NAME = re.compile(r"^(?P<digest>[0-9a-f]{64})\.(?P<extension>png|webp)$")
|
|
22
|
+
_MIME_BY_FORMAT = {"PNG": "image/png", "WEBP": "image/webp"}
|
|
23
|
+
_EXTENSION_BY_FORMAT = {"PNG": "png", "WEBP": "webp"}
|
|
24
|
+
|
|
25
|
+
def __init__(self, workspace: Workspace) -> None:
|
|
26
|
+
self.workspace = workspace
|
|
27
|
+
|
|
28
|
+
def store(self, content: bytes, *, content_type: str) -> dict:
|
|
29
|
+
if not content:
|
|
30
|
+
raise StudioError(
|
|
31
|
+
"AGENT_AVATAR_EMPTY",
|
|
32
|
+
"头像文件不能为空",
|
|
33
|
+
status_code=422,
|
|
34
|
+
field="file",
|
|
35
|
+
)
|
|
36
|
+
if len(content) > self.MAX_BYTES:
|
|
37
|
+
raise StudioError(
|
|
38
|
+
"AGENT_AVATAR_TOO_LARGE",
|
|
39
|
+
"头像文件不能超过 2 MiB",
|
|
40
|
+
status_code=413,
|
|
41
|
+
field="file",
|
|
42
|
+
details={"maxBytes": self.MAX_BYTES},
|
|
43
|
+
)
|
|
44
|
+
normalized_type = content_type.split(";", 1)[0].strip().lower()
|
|
45
|
+
if normalized_type not in self._MIME_BY_FORMAT.values():
|
|
46
|
+
raise StudioError(
|
|
47
|
+
"AGENT_AVATAR_TYPE_UNSUPPORTED",
|
|
48
|
+
"头像仅支持 PNG 或 WebP",
|
|
49
|
+
status_code=415,
|
|
50
|
+
field="file",
|
|
51
|
+
)
|
|
52
|
+
try:
|
|
53
|
+
with warnings.catch_warnings():
|
|
54
|
+
warnings.simplefilter("error", Image.DecompressionBombWarning)
|
|
55
|
+
with Image.open(io.BytesIO(content)) as image:
|
|
56
|
+
image.load()
|
|
57
|
+
image_format = str(image.format or "").upper()
|
|
58
|
+
width, height = image.size
|
|
59
|
+
except (
|
|
60
|
+
UnidentifiedImageError,
|
|
61
|
+
OSError,
|
|
62
|
+
Image.DecompressionBombError,
|
|
63
|
+
Image.DecompressionBombWarning,
|
|
64
|
+
) as exc:
|
|
65
|
+
raise StudioError(
|
|
66
|
+
"AGENT_AVATAR_INVALID",
|
|
67
|
+
"头像文件不是有效图片",
|
|
68
|
+
status_code=422,
|
|
69
|
+
field="file",
|
|
70
|
+
) from exc
|
|
71
|
+
|
|
72
|
+
expected_type = self._MIME_BY_FORMAT.get(image_format)
|
|
73
|
+
if expected_type is None or expected_type != normalized_type:
|
|
74
|
+
raise StudioError(
|
|
75
|
+
"AGENT_AVATAR_TYPE_MISMATCH",
|
|
76
|
+
"头像内容与文件类型不一致",
|
|
77
|
+
status_code=422,
|
|
78
|
+
field="file",
|
|
79
|
+
)
|
|
80
|
+
if width != height:
|
|
81
|
+
raise StudioError(
|
|
82
|
+
"AGENT_AVATAR_NOT_SQUARE",
|
|
83
|
+
"头像必须裁剪为 1:1 正方形",
|
|
84
|
+
status_code=422,
|
|
85
|
+
field="file",
|
|
86
|
+
details={"width": width, "height": height},
|
|
87
|
+
)
|
|
88
|
+
if width < self.MIN_EDGE or width > self.MAX_EDGE:
|
|
89
|
+
raise StudioError(
|
|
90
|
+
"AGENT_AVATAR_DIMENSIONS_INVALID",
|
|
91
|
+
"头像边长必须在 32 到 2048 像素之间",
|
|
92
|
+
status_code=422,
|
|
93
|
+
field="file",
|
|
94
|
+
details={"width": width, "height": height},
|
|
95
|
+
)
|
|
96
|
+
|
|
97
|
+
digest = hashlib.sha256(content).hexdigest()
|
|
98
|
+
extension = self._EXTENSION_BY_FORMAT[image_format]
|
|
99
|
+
asset_name = f"{digest}.{extension}"
|
|
100
|
+
path = self.workspace.resolve(Path(".agentkit/assets/agent-avatars") / asset_name)
|
|
101
|
+
if not path.is_file():
|
|
102
|
+
self.workspace.atomic_write_bytes(path, content)
|
|
103
|
+
return {
|
|
104
|
+
"digest": digest,
|
|
105
|
+
"url": f"/api/v1/assets/agent-avatars/{asset_name}",
|
|
106
|
+
"mimeType": expected_type,
|
|
107
|
+
"size": len(content),
|
|
108
|
+
"width": width,
|
|
109
|
+
"height": height,
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
def get(self, asset_name: str) -> tuple[Path, str]:
|
|
113
|
+
match = self._ASSET_NAME.fullmatch(asset_name)
|
|
114
|
+
if match is None:
|
|
115
|
+
raise not_found("agent-avatar", asset_name)
|
|
116
|
+
extension = match.group("extension")
|
|
117
|
+
path = self.workspace.resolve(Path(".agentkit/assets/agent-avatars") / asset_name)
|
|
118
|
+
if not path.is_file():
|
|
119
|
+
raise not_found("agent-avatar", asset_name)
|
|
120
|
+
return path, "image/png" if extension == "png" else "image/webp"
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
"""Recoverable deletion for generic Studio Agents."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
from datetime import datetime, timezone
|
|
6
|
+
from pathlib import Path
|
|
7
|
+
from typing import Any
|
|
8
|
+
|
|
9
|
+
from ksadk.studio.contracts import RunStatus
|
|
10
|
+
from ksadk.studio.errors import StudioError
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
def delete_framework_agent(studio: Any, agent_id: str, *, purge: bool) -> None:
|
|
14
|
+
studio.drafts.get(agent_id)
|
|
15
|
+
running = [
|
|
16
|
+
run.id
|
|
17
|
+
for run in studio.event_store.list_runs(agent_id=agent_id)
|
|
18
|
+
if run.status in {RunStatus.CREATED, RunStatus.RUNNING}
|
|
19
|
+
]
|
|
20
|
+
if running:
|
|
21
|
+
raise StudioError(
|
|
22
|
+
"AGENT_RUN_ACTIVE",
|
|
23
|
+
"Agent 仍有运行中的任务,请等待运行结束后再删除",
|
|
24
|
+
status_code=409,
|
|
25
|
+
details={"agentId": agent_id, "runIds": running},
|
|
26
|
+
)
|
|
27
|
+
trash_directory = None
|
|
28
|
+
if not purge:
|
|
29
|
+
timestamp = datetime.now(timezone.utc).strftime("%Y%m%dT%H%M%S%fZ")
|
|
30
|
+
trash_directory = studio.workspace.resolve(
|
|
31
|
+
Path(".agentkit/trash/agents") / f"{agent_id}-{timestamp}"
|
|
32
|
+
)
|
|
33
|
+
trash_directory.mkdir(parents=True, exist_ok=False)
|
|
34
|
+
studio.event_store.delete_agent(
|
|
35
|
+
agent_id,
|
|
36
|
+
purge=purge,
|
|
37
|
+
trash_directory=trash_directory,
|
|
38
|
+
)
|
|
39
|
+
studio.builds.delete_for_agent(
|
|
40
|
+
agent_id,
|
|
41
|
+
purge=purge,
|
|
42
|
+
trash_directory=trash_directory,
|
|
43
|
+
)
|
|
44
|
+
studio.drafts.delete(
|
|
45
|
+
agent_id,
|
|
46
|
+
purge=purge,
|
|
47
|
+
trash_directory=trash_directory,
|
|
48
|
+
)
|
|
49
|
+
|
|
50
|
+
|
|
51
|
+
__all__ = ["delete_framework_agent"]
|