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
ksadk/server/routes/sessions.py
CHANGED
|
@@ -7,7 +7,7 @@ from typing import Any
|
|
|
7
7
|
|
|
8
8
|
from fastapi import HTTPException
|
|
9
9
|
|
|
10
|
-
from ksadk.server.factory import
|
|
10
|
+
from ksadk.server.factory import get_runtime_execution, get_state
|
|
11
11
|
from ksadk.sessions import SessionEvent
|
|
12
12
|
from ksadk.tools.gateway import tool_approval_capability
|
|
13
13
|
from ksadk.toolsets import describe_agentengine_tools
|
|
@@ -23,6 +23,7 @@ from .common import (
|
|
|
23
23
|
_build_native_terminal_capability,
|
|
24
24
|
_ensure_session,
|
|
25
25
|
_hydrate_session,
|
|
26
|
+
_resolve_agent_ui_spec,
|
|
26
27
|
)
|
|
27
28
|
from .models import (
|
|
28
29
|
CreateSessionActionRequest,
|
|
@@ -58,45 +59,42 @@ from .streaming import _cancel_detached_streams_for_session
|
|
|
58
59
|
@ui_bootstrap_router.post("/agentengine/api/v1/GetAgentUiBootstrap")
|
|
59
60
|
async def get_agent_ui_bootstrap(request: UiBootstrapRequest):
|
|
60
61
|
state = get_state()
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
framework = ""
|
|
67
|
-
if runner:
|
|
68
|
-
detection_type = getattr(getattr(runner, "detection_result", None), "type", None)
|
|
69
|
-
framework = str(getattr(detection_type, "value", detection_type) or "").strip().lower()
|
|
62
|
+
executor, launch_context = get_runtime_execution()
|
|
63
|
+
detection = launch_context.detection
|
|
64
|
+
agent_id = request.AgentId or _runtime_agent_id(launch_context)
|
|
65
|
+
description = str(getattr(detection, "description", "") or "")
|
|
66
|
+
framework = launch_context.runtime_type.strip().lower()
|
|
70
67
|
workspace_enabled = workspace_files_enabled(default=True)
|
|
71
|
-
ui_spec =
|
|
72
|
-
runtime_capabilities = (
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
68
|
+
ui_spec = _resolve_agent_ui_spec()
|
|
69
|
+
runtime_capabilities = executor.native_capabilities(launch_context)
|
|
70
|
+
runtime_capability_matrix = executor.capability_matrix(launch_context)
|
|
71
|
+
resume_capability = (
|
|
72
|
+
runtime_capabilities.get("ResumeRun")
|
|
73
|
+
if isinstance(runtime_capabilities, Mapping)
|
|
74
|
+
else None
|
|
75
|
+
)
|
|
76
|
+
resume_capability = resume_capability if isinstance(resume_capability, Mapping) else {}
|
|
77
|
+
checkpoint_capability = (
|
|
78
|
+
runtime_capabilities.get("Checkpoint")
|
|
79
|
+
if isinstance(runtime_capabilities, Mapping)
|
|
80
|
+
else None
|
|
76
81
|
)
|
|
82
|
+
checkpoint_capability = (
|
|
83
|
+
checkpoint_capability if isinstance(checkpoint_capability, Mapping) else {}
|
|
84
|
+
)
|
|
85
|
+
cancel_capability = (
|
|
86
|
+
runtime_capabilities.get("CancelRun")
|
|
87
|
+
if isinstance(runtime_capabilities, Mapping)
|
|
88
|
+
else None
|
|
89
|
+
)
|
|
90
|
+
cancel_capability = cancel_capability if isinstance(cancel_capability, Mapping) else {}
|
|
77
91
|
checkpoint_resume_capability = {
|
|
78
|
-
"Supported": bool(
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
else False
|
|
82
|
-
),
|
|
83
|
-
"Checkpoint": (
|
|
84
|
-
(runtime_capabilities.get("Checkpoint") or {})
|
|
85
|
-
if isinstance(runtime_capabilities, Mapping)
|
|
86
|
-
else {}
|
|
87
|
-
),
|
|
88
|
-
"ResumeRun": (
|
|
89
|
-
(runtime_capabilities.get("ResumeRun") or {})
|
|
90
|
-
if isinstance(runtime_capabilities, Mapping)
|
|
91
|
-
else {}
|
|
92
|
-
),
|
|
92
|
+
"Supported": bool(resume_capability.get("Supported")),
|
|
93
|
+
"Checkpoint": checkpoint_capability,
|
|
94
|
+
"ResumeRun": resume_capability,
|
|
93
95
|
}
|
|
94
96
|
checkpoint_resume_supported = bool(checkpoint_resume_capability["Supported"])
|
|
95
|
-
cancel_run_supported = bool(
|
|
96
|
-
(runtime_capabilities.get("CancelRun") or {}).get("Supported")
|
|
97
|
-
if isinstance(runtime_capabilities, Mapping)
|
|
98
|
-
else False
|
|
99
|
-
)
|
|
97
|
+
cancel_run_supported = bool(cancel_capability.get("Supported"))
|
|
100
98
|
responses_transport = {
|
|
101
99
|
"Protocol": "responses",
|
|
102
100
|
"Runtime": "ksadk",
|
|
@@ -137,7 +135,7 @@ async def get_agent_ui_bootstrap(request: UiBootstrapRequest):
|
|
|
137
135
|
{
|
|
138
136
|
"Agent": {
|
|
139
137
|
"AgentId": agent_id,
|
|
140
|
-
"Name":
|
|
138
|
+
"Name": str(getattr(detection, "name", "") or agent_id),
|
|
141
139
|
"Description": description or "",
|
|
142
140
|
"Framework": framework,
|
|
143
141
|
},
|
|
@@ -151,6 +149,7 @@ async def get_agent_ui_bootstrap(request: UiBootstrapRequest):
|
|
|
151
149
|
"StopRun": cancel_run_supported,
|
|
152
150
|
"ResumeRun": checkpoint_resume_supported,
|
|
153
151
|
"RuntimeCapabilities": runtime_capabilities,
|
|
152
|
+
"RuntimeCapabilityMatrix": runtime_capability_matrix,
|
|
154
153
|
"CheckpointResumeCapability": checkpoint_resume_capability,
|
|
155
154
|
"RunLifecycle": {
|
|
156
155
|
"Enabled": True,
|
|
@@ -258,15 +257,13 @@ async def delete_session_action(request: SessionIdRequest):
|
|
|
258
257
|
|
|
259
258
|
@sessions_router.post("/agentengine/api/v1/ListSessionEvents")
|
|
260
259
|
async def list_session_events_action(request: ListSessionEventsActionRequest):
|
|
261
|
-
|
|
260
|
+
_executor, launch_context = get_runtime_execution()
|
|
262
261
|
service = deps.resolve_session_service()
|
|
263
262
|
session_id = str(request.SessionId or "").strip()
|
|
264
263
|
if not session_id:
|
|
265
264
|
# 未传 SessionId:返回该 agent 全部会话的事件(存储层跨会话查询,真分页无截断;
|
|
266
265
|
# seq 游标是会话内序号,跨会话模式下不适用,直接忽略)
|
|
267
|
-
agent_id = str(request.AgentId or "").strip() or (
|
|
268
|
-
_runtime_agent_id(runner) if runner else "default-agent"
|
|
269
|
-
)
|
|
266
|
+
agent_id = str(request.AgentId or "").strip() or _runtime_agent_id(launch_context)
|
|
270
267
|
events = await service.get_events_for_agent(
|
|
271
268
|
agent_id,
|
|
272
269
|
user_id=request.UserId,
|
ksadk/server/routes/streaming.py
CHANGED
|
@@ -4,18 +4,24 @@ from __future__ import annotations
|
|
|
4
4
|
|
|
5
5
|
import asyncio
|
|
6
6
|
import logging
|
|
7
|
+
import os
|
|
7
8
|
from collections.abc import AsyncIterator, Mapping
|
|
8
9
|
from typing import Any
|
|
9
10
|
|
|
10
11
|
from fastapi import HTTPException
|
|
12
|
+
from fastapi.responses import StreamingResponse
|
|
11
13
|
|
|
14
|
+
from ksadk.conversations.runtime_persistence import append_run_status_event
|
|
12
15
|
from ksadk.server.factory import get_state
|
|
13
16
|
|
|
14
|
-
from . import dependencies as deps
|
|
15
17
|
from .models import _RUN_TERMINAL_STATUSES
|
|
16
18
|
from .projection import _latest_invocation_status
|
|
17
19
|
|
|
18
20
|
logger = logging.getLogger(__name__)
|
|
21
|
+
SSE_HEARTBEAT_INTERVAL_SECONDS = max(
|
|
22
|
+
0.01,
|
|
23
|
+
float(os.getenv("AGENTENGINE_SSE_HEARTBEAT_SECONDS", "15")),
|
|
24
|
+
)
|
|
19
25
|
|
|
20
26
|
_RESERVED_UI_PATHS = {"/", "/chat", "/build", "/deploy"}
|
|
21
27
|
_CUSTOM_API_PROXY_ENV_KEYS = ("KSADK_USER_BACKEND_URL", "LUOLUO_USER_BACKEND_URL")
|
|
@@ -33,6 +39,13 @@ _HOP_BY_HOP_HEADERS = {
|
|
|
33
39
|
}
|
|
34
40
|
|
|
35
41
|
|
|
42
|
+
def _observe_detached_task_result(task: asyncio.Task[Any]) -> None:
|
|
43
|
+
"""Consume a detached task exception after ``_consume`` has logged it."""
|
|
44
|
+
if task.cancelled():
|
|
45
|
+
return
|
|
46
|
+
task.exception()
|
|
47
|
+
|
|
48
|
+
|
|
36
49
|
class _DetachedSSEStream:
|
|
37
50
|
_MAX_BACKLOG_CHUNKS = 256
|
|
38
51
|
|
|
@@ -58,6 +71,7 @@ class _DetachedSSEStream:
|
|
|
58
71
|
self._task = asyncio.create_task(self._consume())
|
|
59
72
|
self._registry.streams.add(self._task)
|
|
60
73
|
self._task.add_done_callback(self._registry.streams.discard)
|
|
74
|
+
self._task.add_done_callback(_observe_detached_task_result)
|
|
61
75
|
if self.invocation_id:
|
|
62
76
|
self._registry.streams_by_invocation[self.invocation_id] = self
|
|
63
77
|
self._task.add_done_callback(
|
|
@@ -70,7 +84,7 @@ class _DetachedSSEStream:
|
|
|
70
84
|
if not self.session_id or not self.invocation_id:
|
|
71
85
|
return False
|
|
72
86
|
status = await _latest_invocation_status(
|
|
73
|
-
|
|
87
|
+
get_state().resolve_session_service(),
|
|
74
88
|
self.session_id,
|
|
75
89
|
self.invocation_id,
|
|
76
90
|
)
|
|
@@ -78,6 +92,7 @@ class _DetachedSSEStream:
|
|
|
78
92
|
|
|
79
93
|
async def _consume(self) -> None:
|
|
80
94
|
terminal_fallback_status: str | None = None
|
|
95
|
+
terminal_fallback_detail: str | None = None
|
|
81
96
|
try:
|
|
82
97
|
async for chunk in self._source:
|
|
83
98
|
self._backlog.append(chunk)
|
|
@@ -93,8 +108,9 @@ class _DetachedSSEStream:
|
|
|
93
108
|
except asyncio.CancelledError:
|
|
94
109
|
terminal_fallback_status = "cancelled"
|
|
95
110
|
raise
|
|
96
|
-
except Exception:
|
|
111
|
+
except Exception as exc:
|
|
97
112
|
terminal_fallback_status = "failed"
|
|
113
|
+
terminal_fallback_detail = f"{type(exc).__name__}: {exc}"[:2048]
|
|
98
114
|
logger.exception("Detached SSE stream failed")
|
|
99
115
|
raise
|
|
100
116
|
finally:
|
|
@@ -108,15 +124,16 @@ class _DetachedSSEStream:
|
|
|
108
124
|
if terminal_fallback_status and self.session_id:
|
|
109
125
|
try:
|
|
110
126
|
if not await self._has_terminal_run_status():
|
|
111
|
-
await
|
|
127
|
+
await append_run_status_event(
|
|
112
128
|
session_id=self.session_id,
|
|
113
129
|
author="system",
|
|
114
130
|
status=terminal_fallback_status,
|
|
115
131
|
invocation_id=self.invocation_id or "",
|
|
116
132
|
detail=(
|
|
117
|
-
|
|
133
|
+
terminal_fallback_detail
|
|
134
|
+
or f"background_{terminal_fallback_status}:{self.invocation_id or ''}"
|
|
118
135
|
),
|
|
119
|
-
session_service_provider=
|
|
136
|
+
session_service_provider=get_state().resolve_session_service,
|
|
120
137
|
run_mode=self._run_mode,
|
|
121
138
|
run_trigger=self._run_trigger,
|
|
122
139
|
)
|
|
@@ -151,7 +168,7 @@ class _DetachedSSEStream:
|
|
|
151
168
|
try:
|
|
152
169
|
chunk = await asyncio.wait_for(
|
|
153
170
|
queue.get(),
|
|
154
|
-
timeout=
|
|
171
|
+
timeout=SSE_HEARTBEAT_INTERVAL_SECONDS,
|
|
155
172
|
)
|
|
156
173
|
except asyncio.TimeoutError:
|
|
157
174
|
yield ": ping\n\n"
|
|
@@ -221,3 +238,31 @@ def _reject_if_detached_resume_active(resume_key: tuple[str, str] | None) -> Non
|
|
|
221
238
|
"run_id": resume_key[1],
|
|
222
239
|
},
|
|
223
240
|
)
|
|
241
|
+
|
|
242
|
+
|
|
243
|
+
def detached_streaming_response(
|
|
244
|
+
source: AsyncIterator[str],
|
|
245
|
+
*,
|
|
246
|
+
invocation_id: str | None = None,
|
|
247
|
+
session_id: str | None = None,
|
|
248
|
+
resume_key: tuple[str, str] | None = None,
|
|
249
|
+
run_mode: str = "unknown",
|
|
250
|
+
run_trigger: str = "unknown",
|
|
251
|
+
) -> StreamingResponse:
|
|
252
|
+
"""Create an app-owned detached SSE response with reconnectable backlog."""
|
|
253
|
+
|
|
254
|
+
detached = _DetachedSSEStream(
|
|
255
|
+
source,
|
|
256
|
+
invocation_id=invocation_id,
|
|
257
|
+
session_id=session_id,
|
|
258
|
+
run_mode=run_mode,
|
|
259
|
+
run_trigger=run_trigger,
|
|
260
|
+
)
|
|
261
|
+
registry = detached._registry
|
|
262
|
+
if invocation_id and resume_key:
|
|
263
|
+
registry.resume_keys_by_invocation[invocation_id] = resume_key
|
|
264
|
+
registry.active_resume_invocation_by_key[resume_key] = invocation_id
|
|
265
|
+
detached._task.add_done_callback(
|
|
266
|
+
lambda _task: _clear_detached_resume_key(registry, invocation_id, resume_key)
|
|
267
|
+
)
|
|
268
|
+
return StreamingResponse(detached.iter_for_client(), media_type="text/event-stream")
|
ksadk/server/routes/workspace.py
CHANGED
|
@@ -4,6 +4,7 @@ from __future__ import annotations
|
|
|
4
4
|
|
|
5
5
|
import io
|
|
6
6
|
import logging
|
|
7
|
+
import time
|
|
7
8
|
import uuid
|
|
8
9
|
import zipfile
|
|
9
10
|
from pathlib import PurePosixPath
|
|
@@ -16,7 +17,8 @@ from pydantic import BaseModel
|
|
|
16
17
|
|
|
17
18
|
from ksadk.conversations.attachment_storage import AttachmentStorageService
|
|
18
19
|
from ksadk.conversations.model_context import normalize_model_metadata
|
|
19
|
-
from ksadk.
|
|
20
|
+
from ksadk.runtime.adapter import CancelResult
|
|
21
|
+
from ksadk.server.factory import get_runtime_execution, get_state
|
|
20
22
|
from ksadk_runtime_common.workspace_files.preview import (
|
|
21
23
|
build_workspace_file_base_href,
|
|
22
24
|
build_workspace_preview_csp,
|
|
@@ -26,7 +28,6 @@ from ksadk_runtime_common.workspace_files.preview import (
|
|
|
26
28
|
from . import dependencies as deps
|
|
27
29
|
from .common import (
|
|
28
30
|
_action_response,
|
|
29
|
-
_resolve_active_runner,
|
|
30
31
|
_resolve_current_model,
|
|
31
32
|
_workspace_root_dir,
|
|
32
33
|
_workspace_runtime_request,
|
|
@@ -134,6 +135,7 @@ async def delete_workspace_file_action(request: WorkspaceDeleteActionRequest):
|
|
|
134
135
|
|
|
135
136
|
@control_router.post("/agentengine/api/v1/CancelRun")
|
|
136
137
|
async def cancel_run_action(request: CancelRunActionRequest):
|
|
138
|
+
executor, launch_context = get_runtime_execution()
|
|
137
139
|
detached = get_state().stream_registry.streams_by_invocation.get(request.InvocationId)
|
|
138
140
|
service = deps.resolve_session_service()
|
|
139
141
|
scoped_session_id = str(request.SessionId or "").strip()
|
|
@@ -145,6 +147,15 @@ async def cancel_run_action(request: CancelRunActionRequest):
|
|
|
145
147
|
)
|
|
146
148
|
if not scoped_session_id and detached is not None:
|
|
147
149
|
scoped_session_id = detached_session_id
|
|
150
|
+
handle = (
|
|
151
|
+
executor.find_handle(
|
|
152
|
+
launch_context.runtime_type,
|
|
153
|
+
request.InvocationId,
|
|
154
|
+
scoped_session_id,
|
|
155
|
+
)
|
|
156
|
+
if scoped_session_id
|
|
157
|
+
else None
|
|
158
|
+
)
|
|
148
159
|
if scoped_session_id:
|
|
149
160
|
await _require_action_session(
|
|
150
161
|
service,
|
|
@@ -152,7 +163,7 @@ async def cancel_run_action(request: CancelRunActionRequest):
|
|
|
152
163
|
agent_id=request.AgentId,
|
|
153
164
|
user_id=request.UserId,
|
|
154
165
|
)
|
|
155
|
-
if detached is None and not await _session_contains_invocation(
|
|
166
|
+
if detached is None and handle is None and not await _session_contains_invocation(
|
|
156
167
|
service,
|
|
157
168
|
scoped_session_id,
|
|
158
169
|
request.InvocationId,
|
|
@@ -171,33 +182,31 @@ async def cancel_run_action(request: CancelRunActionRequest):
|
|
|
171
182
|
user_id=request.UserId,
|
|
172
183
|
):
|
|
173
184
|
raise HTTPException(status_code=404, detail="Invocation not found")
|
|
174
|
-
found = detached is not None
|
|
185
|
+
found = detached is not None or handle is not None
|
|
175
186
|
cancel_requested = False
|
|
176
187
|
if detached is not None:
|
|
177
188
|
cancel_requested = detached.cancel()
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
if active_runner is not None:
|
|
189
|
+
runtime_cancel_status = "detached_task_cancelled" if cancel_requested else "not_running"
|
|
190
|
+
if handle is not None and detached is None:
|
|
181
191
|
try:
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
runner_cancel_status = "accepted"
|
|
187
|
-
elif runner_result is False and not found:
|
|
188
|
-
runner_cancel_status = "not_found"
|
|
189
|
-
except Exception as exc:
|
|
190
|
-
runner_cancel_status = "error"
|
|
192
|
+
runtime_result = await executor.cancel(handle)
|
|
193
|
+
runtime_cancel_status = runtime_result.value
|
|
194
|
+
except Exception as exc: # noqa: BLE001
|
|
195
|
+
runtime_cancel_status = CancelResult.FAILED.value
|
|
191
196
|
logger.warning("CancelRun failed: %s", exc)
|
|
192
|
-
|
|
193
|
-
|
|
197
|
+
runtime_accepted = runtime_cancel_status in {
|
|
198
|
+
"detached_task_cancelled",
|
|
199
|
+
CancelResult.INTERRUPTED_ACTIVE_TURN.value,
|
|
200
|
+
CancelResult.PENDING_CANCEL_RECORDED.value,
|
|
201
|
+
}
|
|
202
|
+
status = "cancelling" if runtime_accepted else runtime_cancel_status
|
|
194
203
|
return _action_response(
|
|
195
204
|
"CancelRun",
|
|
196
205
|
{
|
|
197
|
-
"Cancelled": bool(cancel_requested or
|
|
206
|
+
"Cancelled": bool(cancel_requested or runtime_accepted),
|
|
198
207
|
"Found": found,
|
|
199
208
|
"Status": status,
|
|
200
|
-
"
|
|
209
|
+
"RuntimeCancelStatus": runtime_cancel_status,
|
|
201
210
|
},
|
|
202
211
|
)
|
|
203
212
|
|
|
@@ -324,6 +333,11 @@ def _normalize_model_catalog_items(raw_models: list[Any]) -> list[dict[str, Any]
|
|
|
324
333
|
return sorted(normalized_by_id.values(), key=lambda item: item["id"])
|
|
325
334
|
|
|
326
335
|
|
|
336
|
+
_MODELS_CATALOG_TTL_SECONDS = 60.0
|
|
337
|
+
# api_base -> (monotonic_ts, payload)。进程内短 TTL 缓存,见 _build_models_payload。
|
|
338
|
+
_MODELS_CATALOG_CACHE: dict[str, tuple[float, dict[str, Any]]] = {}
|
|
339
|
+
|
|
340
|
+
|
|
327
341
|
async def _build_models_payload() -> dict[str, Any]:
|
|
328
342
|
import os
|
|
329
343
|
|
|
@@ -344,6 +358,18 @@ async def _build_models_payload() -> dict[str, Any]:
|
|
|
344
358
|
if not api_base:
|
|
345
359
|
return _fallback_catalog()
|
|
346
360
|
|
|
361
|
+
# 上游 /v1/models 是一次真实外网往返(数百毫秒),会话页初始化会
|
|
362
|
+
# 调用本接口,不能每次都同步打上游。做短 TTL 进程内缓存:
|
|
363
|
+
# 命中直接返回;上游失败时优先回退到过期的缓存值,避免模型列表
|
|
364
|
+
# 因上游抖动整体不可用。
|
|
365
|
+
cache_key = api_base.rstrip("/")
|
|
366
|
+
cached = _MODELS_CATALOG_CACHE.get(cache_key)
|
|
367
|
+
now = time.monotonic()
|
|
368
|
+
if cached is not None and now - cached[0] < _MODELS_CATALOG_TTL_SECONDS:
|
|
369
|
+
payload = dict(cached[1])
|
|
370
|
+
payload["cached"] = True
|
|
371
|
+
return payload
|
|
372
|
+
|
|
347
373
|
try:
|
|
348
374
|
base_url = api_base.rstrip("/")
|
|
349
375
|
if base_url.endswith("/v1"):
|
|
@@ -368,9 +394,16 @@ async def _build_models_payload() -> dict[str, Any]:
|
|
|
368
394
|
str(item.get("id") or "").strip() != current_model for item in models
|
|
369
395
|
):
|
|
370
396
|
models = _normalize_model_catalog_items([*models, current_model])
|
|
371
|
-
|
|
397
|
+
payload = {"data": models, "current": current_model, "source": source}
|
|
398
|
+
_MODELS_CATALOG_CACHE[cache_key] = (now, payload)
|
|
399
|
+
return dict(payload)
|
|
372
400
|
except Exception as e:
|
|
373
401
|
logger.error(f"Failed to fetch models: {e}")
|
|
402
|
+
if cached is not None:
|
|
403
|
+
payload = dict(cached[1])
|
|
404
|
+
payload["stale"] = True
|
|
405
|
+
payload["error"] = str(e)
|
|
406
|
+
return payload
|
|
374
407
|
fallback = _fallback_catalog()
|
|
375
408
|
fallback["error"] = str(e)
|
|
376
409
|
return fallback
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{
|
|
1
|
+
import{St as e,Tt as t,bt as n,gt as r,lt as i,n as a,t as o,ut as s,xt as c}from"./index-8ipRcQ-M.js";var l=t(e(),1),u=n();function d(){let e=c(e=>e.visible),t=c(e=>e.content),n=c(e=>e.type),d=c(e=>e.hide),f=(0,l.useRef)(null);if(a(f),!e||!t)return null;let p=o(t);return(0,u.jsxs)(`aside`,{className:i(`flex h-full flex-shrink-0 flex-col border-l border-slate-200/30 bg-white dark:border-slate-800/40 dark:bg-slate-950`,`w-[min(42rem,50vw)]`),children:[(0,u.jsxs)(`div`,{className:`flex h-14 flex-shrink-0 items-center justify-between border-b border-slate-200/30 px-4 dark:border-slate-800/40`,children:[(0,u.jsxs)(`div`,{className:`flex min-w-0 items-center gap-2`,children:[(0,u.jsx)(`span`,{className:`text-sm font-semibold text-slate-900 dark:text-slate-100`,children:`Artifact`}),(0,u.jsx)(`span`,{className:`rounded-md bg-slate-100 px-1.5 py-0.5 font-mono text-[11px] text-slate-500 dark:bg-slate-900 dark:text-slate-400`,children:n})]}),(0,u.jsxs)(`div`,{className:`flex items-center gap-1.5`,children:[(0,u.jsxs)(`button`,{type:`button`,onClick:()=>{let e=new Blob([t],{type:`text/html;charset=utf-8`}),r=URL.createObjectURL(e),i=document.createElement(`a`);i.href=r,i.download=`artifact.${n===`svg`?`svg`:`html`}`,document.body.appendChild(i),i.click(),document.body.removeChild(i),URL.revokeObjectURL(r)},className:`inline-flex items-center gap-1.5 rounded-lg px-2.5 py-1.5 text-xs font-medium text-slate-600 transition hover:bg-slate-100 dark:text-slate-300 dark:hover:bg-slate-900`,title:`Download`,children:[(0,u.jsx)(r,{className:`h-3.5 w-3.5`}),`Download`]}),(0,u.jsx)(`button`,{type:`button`,onClick:d,className:`rounded-lg p-1.5 text-slate-500 transition hover:bg-slate-100 hover:text-slate-900 dark:text-slate-400 dark:hover:bg-slate-900 dark:hover:text-slate-100`,"aria-label":`Close Artifact`,title:`Close`,children:(0,u.jsx)(s,{className:`h-4 w-4`})})]})]}),(0,u.jsx)(`div`,{className:`min-h-0 flex-1`,children:(0,u.jsx)(`iframe`,{ref:f,srcDoc:p,sandbox:`allow-scripts allow-downloads`,title:`Artifact Preview`,className:`h-full w-full border-0 bg-white`})})]})}export{d as ArtifactsPanel};
|