agentengine-sdk-python 0.7.0__py3-none-any.whl → 0.8.1__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.7.0.dist-info → agentengine_sdk_python-0.8.1.dist-info}/METADATA +52 -20
- agentengine_sdk_python-0.8.1.dist-info/RECORD +644 -0
- {agentengine_sdk_python-0.7.0.dist-info → agentengine_sdk_python-0.8.1.dist-info}/WHEEL +1 -1
- ksadk/a2a/__init__.py +180 -11
- ksadk/a2a/bootstrap.py +332 -0
- ksadk/a2a/card.py +15 -0
- ksadk/a2a/context_store.py +203 -0
- ksadk/a2a/control_plane.py +1056 -0
- ksadk/a2a/credential.py +99 -0
- ksadk/a2a/event_adapter.py +149 -0
- ksadk/a2a/executor.py +361 -137
- ksadk/a2a/external_transport.py +516 -0
- ksadk/a2a/identity.py +304 -0
- ksadk/a2a/ids.py +22 -0
- ksadk/a2a/langgraph.py +285 -0
- ksadk/a2a/resume_store.py +201 -0
- ksadk/a2a/routes.py +112 -0
- ksadk/a2a/server.py +102 -62
- ksadk/a2a/service_env.py +33 -0
- ksadk/a2a/space_client.py +1122 -0
- ksadk/a2a/task_adapter.py +423 -0
- ksadk/a2a/task_event_dispatcher.py +167 -0
- ksadk/a2a/task_event_outbox.py +326 -0
- ksadk/a2a/task_store.py +206 -0
- ksadk/a2a_card.py +101 -0
- ksadk/a2ui/__init__.py +27 -0
- ksadk/a2ui/core.py +186 -0
- ksadk/a2ui/models.py +166 -0
- ksadk/a2ui/renderer.py +198 -0
- ksadk/agui/__init__.py +9 -0
- ksadk/agui/a2ui_projection.py +92 -0
- ksadk/agui/agent.py +872 -0
- ksadk/agui/config.py +92 -0
- ksadk/agui/routes.py +47 -0
- ksadk/api/client.py +238 -204
- ksadk/api/environment.py +27 -0
- ksadk/builders/__init__.py +2 -0
- ksadk/builders/base.py +16 -14
- ksadk/builders/code_builder.py +375 -270
- ksadk/builders/container_builder.py +240 -200
- ksadk/builders/framework_requirements.py +31 -12
- ksadk/builders/ks3_uploader.py +60 -29
- ksadk/builders/managed_runtime_builder.py +173 -0
- ksadk/builders/mcp_builder.py +91 -92
- ksadk/builders/requirements_utils.py +1 -5
- ksadk/cli/__init__.py +97 -171
- ksadk/cli/cmd_a2a.py +255 -84
- ksadk/cli/cmd_agent.py +19 -5
- ksadk/cli/cmd_build.py +158 -29
- ksadk/cli/cmd_completion.py +47 -35
- ksadk/cli/cmd_config.py +267 -198
- ksadk/cli/cmd_create.py +507 -740
- ksadk/cli/cmd_dashboard.py +120 -45
- ksadk/cli/cmd_deploy.py +135 -59
- ksadk/cli/cmd_destroy.py +44 -14
- ksadk/cli/cmd_eval.py +386 -0
- ksadk/cli/cmd_files.py +63 -24
- ksadk/cli/cmd_hermes.py +313 -135
- ksadk/cli/cmd_invoke.py +184 -122
- ksadk/cli/cmd_launch.py +76 -28
- ksadk/cli/cmd_mcp.py +98 -64
- ksadk/cli/cmd_model.py +14 -5
- ksadk/cli/cmd_openclaw.py +564 -268
- ksadk/cli/cmd_replay.py +71 -0
- ksadk/cli/cmd_run.py +58 -73
- ksadk/cli/cmd_status.py +80 -31
- ksadk/cli/cmd_studio.py +110 -0
- ksadk/cli/cmd_version.py +20 -13
- ksadk/cli/cmd_web.py +95 -18
- ksadk/cli/deploy_utils.py +20 -20
- ksadk/cli/dry_run.py +7 -4
- ksadk/cli/env_options.py +83 -0
- ksadk/cli/error_utils.py +37 -12
- ksadk/cli/global_options.py +4 -3
- ksadk/cli/local_runtime.py +1 -2
- ksadk/cli/model_catalog.py +6 -2
- ksadk/cli/network_options.py +41 -19
- ksadk/cli/resource_common.py +6 -2
- ksadk/cli/runtime_bootstrap.py +51 -0
- ksadk/cli/storage.py +0 -1
- ksadk/cli/ui.py +11 -3
- ksadk/cli/workflow_common.py +52 -18
- ksadk/codex/__init__.py +12 -0
- ksadk/codex/client.py +1042 -0
- ksadk/codex/phase.py +143 -0
- ksadk/codex/runtime.py +940 -0
- ksadk/common/aicp_env.py +0 -1
- ksadk/common/auth.py +2 -2
- ksadk/common/constants.py +1 -3
- ksadk/common/kop_client.py +232 -0
- ksadk/common/llm_utils.py +17 -13
- ksadk/compat/__init__.py +5 -0
- ksadk/compat/adk_compat.py +200 -0
- ksadk/compat/copilotkit_a2ui.py +330 -0
- ksadk/configs/__init__.py +12 -14
- ksadk/configs/env_registry.py +661 -116
- ksadk/configs/global_config.py +3 -2
- ksadk/configs/settings.py +133 -209
- ksadk/conversations/__init__.py +85 -92
- ksadk/conversations/attachment_storage.py +16 -11
- ksadk/conversations/attachments.py +44 -36
- ksadk/conversations/compaction_pipeline.py +12 -12
- ksadk/conversations/compaction_prompt.py +9 -5
- ksadk/conversations/context.py +221 -6
- ksadk/conversations/message_projection.py +438 -51
- ksadk/conversations/model_context.py +12 -6
- ksadk/conversations/model_options.py +0 -1
- ksadk/conversations/normalize.py +20 -16
- ksadk/conversations/reasoning_markup.py +1 -1
- ksadk/conversations/runtime.py +339 -5255
- ksadk/conversations/runtime_compaction.py +333 -0
- ksadk/conversations/runtime_constants.py +27 -0
- ksadk/conversations/runtime_governance.py +185 -0
- ksadk/conversations/runtime_input.py +660 -0
- ksadk/conversations/runtime_invocation.py +395 -0
- ksadk/conversations/runtime_metadata.py +475 -0
- ksadk/conversations/runtime_observability.py +367 -0
- ksadk/conversations/runtime_payloads.py +272 -0
- ksadk/conversations/runtime_persistence.py +440 -0
- ksadk/conversations/runtime_preparation.py +426 -0
- ksadk/conversations/runtime_resume.py +836 -0
- ksadk/conversations/runtime_stream_events.py +902 -0
- ksadk/conversations/runtime_streaming.py +700 -0
- ksadk/conversations/semantic_summary.py +17 -5
- ksadk/conversations/session_title.py +6 -3
- ksadk/deployment/__init__.py +15 -16
- ksadk/deployment/agent_access.py +12 -23
- ksadk/deployment/base.py +51 -38
- ksadk/deployment/managed_runtime.py +33 -0
- ksadk/deployment/manager.py +85 -71
- ksadk/deployment/providers/serverless.py +379 -210
- ksadk/deployment/registry.py +38 -32
- ksadk/deployment/state.py +11 -11
- ksadk/deployment/ui_config.py +1 -1
- ksadk/detection/__init__.py +1 -1
- ksadk/detection/detector.py +146 -83
- ksadk/detection/mcp_detector.py +9 -6
- ksadk/evaluation/__init__.py +84 -0
- ksadk/evaluation/a2a_adapter.py +444 -0
- ksadk/evaluation/adapters.py +54 -0
- ksadk/evaluation/contracts.py +409 -0
- ksadk/evaluation/evalset.py +351 -0
- ksadk/evaluation/evaluators.py +461 -0
- ksadk/evaluation/executor.py +118 -0
- ksadk/evaluation/storage.py +68 -0
- ksadk/evaluation/target.py +73 -0
- ksadk/events/__init__.py +25 -0
- ksadk/events/parser.py +191 -0
- ksadk/events/replay.py +37 -0
- ksadk/events/runtime_event.py +273 -0
- ksadk/events/store.py +317 -0
- ksadk/harness/__init__.py +35 -0
- ksadk/harness/app.py +269 -0
- ksadk/harness/config.py +181 -0
- ksadk/harness/reasoner.py +105 -0
- ksadk/harness/runtime.py +364 -0
- ksadk/harness/sandbox.py +141 -0
- ksadk/harness/tools.py +222 -0
- ksadk/hermes_terminal.py +28 -12
- ksadk/identity/resolver.py +15 -9
- ksadk/ids.py +32 -0
- ksadk/knowledge_base/adk_tool.py +1 -1
- ksadk/knowledge_base/client.py +38 -33
- ksadk/managed_a2a_card.py +160 -0
- ksadk/managed_runtime.py +195 -0
- ksadk/markdown.py +5 -2
- ksadk/mcp_runtime/__init__.py +9 -6
- ksadk/memory/__init__.py +1 -1
- ksadk/memory/adk/__init__.py +2 -0
- ksadk/memory/adk/backends/base_ltm_backend.py +2 -6
- ksadk/memory/adk/backends/http_ltm_backend.py +13 -21
- ksadk/memory/adk/backends/inmemory_ltm_backend.py +7 -13
- ksadk/memory/adk/backends/sdk_ltm_backend.py +36 -36
- ksadk/memory/adk/long_term_memory.py +34 -37
- ksadk/memory/adk/resilient_session_service.py +4 -5
- ksadk/memory/adk/short_term_memory.py +12 -21
- ksadk/memory/adk_tool.py +3 -2
- ksadk/memory/backends/base.py +19 -19
- ksadk/memory/backends/memory.py +24 -25
- ksadk/memory/backends/redis.py +31 -30
- ksadk/memory/langchain_tool.py +2 -1
- ksadk/memory/manager.py +52 -47
- ksadk/memory/service.py +16 -6
- ksadk/memory/tool.py +4 -0
- ksadk/model_policy.py +15 -7
- ksadk/model_proxy/__init__.py +51 -0
- ksadk/model_proxy/bootstrap.py +80 -0
- ksadk/model_proxy/cache.py +165 -0
- ksadk/model_proxy/config.py +66 -0
- ksadk/model_proxy/demo_webui.py +115 -0
- ksadk/model_proxy/detect.py +145 -0
- ksadk/model_proxy/gate.py +68 -0
- ksadk/model_proxy/namespace.py +201 -0
- ksadk/model_proxy/protocol_proxy.py +22 -0
- ksadk/model_proxy/server.py +443 -0
- ksadk/model_proxy/transform.py +735 -0
- ksadk/openclaw_gateway.py +29 -14
- ksadk/runners/adk_runner.py +354 -146
- ksadk/runners/base_runner.py +71 -29
- ksadk/runners/deepagents_runner.py +0 -1
- ksadk/runners/factory.py +18 -5
- ksadk/runners/langchain_runner.py +29 -742
- ksadk/runners/langgraph_runner.py +417 -97
- ksadk/runners/patch_langchain.py +16 -16
- ksadk/runners/remote_runner.py +134 -33
- ksadk/runners/usage_accumulator.py +1 -0
- ksadk/runners/utils/__init__.py +0 -10
- ksadk/runners/utils/loader.py +23 -7
- ksadk/runtime/__init__.py +67 -0
- ksadk/runtime/adapter.py +412 -0
- ksadk/runtime/conversation_execution.py +553 -0
- ksadk/runtime/executor.py +251 -0
- ksadk/runtime/factory.py +156 -0
- ksadk/runtime/framework_adapters.py +118 -0
- ksadk/runtime/launch.py +48 -0
- ksadk/runtime/preprocessing.py +131 -0
- ksadk/runtime/runner_adapter.py +1032 -0
- ksadk/runtime/runner_loading.py +36 -0
- ksadk/runtime_context.py +18 -3
- ksadk/runtime_state.py +0 -1
- ksadk/sandbox/__init__.py +4 -1
- ksadk/sandbox/backends/__init__.py +4 -1
- ksadk/sandbox/backends/e2b.py +13 -5
- ksadk/sandbox/backends/local_process.py +11 -3
- ksadk/sandbox/base.py +10 -15
- ksadk/sandbox/factory.py +14 -4
- ksadk/sandbox/registry.py +57 -6
- ksadk/server/__init__.py +39 -4
- ksadk/server/api_models.py +15 -5
- ksadk/server/app.py +24 -3928
- ksadk/server/composition.py +47 -0
- ksadk/server/factory.py +622 -0
- ksadk/server/routes/__init__.py +1 -0
- ksadk/server/routes/checkpoint_resolution.py +116 -0
- ksadk/server/routes/common.py +682 -0
- ksadk/server/routes/control.py +331 -0
- ksadk/server/routes/dependencies.py +98 -0
- ksadk/server/routes/misc.py +425 -0
- ksadk/server/routes/models.py +451 -0
- ksadk/server/routes/openai_compat.py +229 -0
- ksadk/server/routes/projection.py +848 -0
- ksadk/server/routes/routers.py +52 -0
- ksadk/server/routes/run.py +519 -0
- ksadk/server/routes/sessions.py +644 -0
- ksadk/server/routes/streaming.py +265 -0
- ksadk/server/routes/workspace.py +414 -0
- ksadk/server/static/assets/{ArtifactsPanel-D-SSn2ee.js → ArtifactsPanel-CakCqxEN.js} +1 -1
- ksadk/server/static/assets/CodeBlock-CynLknyO.js +9 -0
- ksadk/server/static/assets/MathMessageMarkdown-3sQdOysS.js +8 -0
- ksadk/server/static/assets/MermaidBlock-NERD_ef7.js +303 -0
- ksadk/server/static/assets/NativeTerminalPanel-CiHWf82q.js +1 -0
- ksadk/server/static/assets/{arc-BA13sHc9.js → arc-DrgjcKhl.js} +1 -1
- ksadk/server/static/assets/architecture-7EHR7CIX-CpZLRCcY.js +1 -0
- ksadk/server/static/assets/{architectureDiagram-3BPJPVTR-DzJzgVoL.js → architectureDiagram-3BPJPVTR-BXoVRbQ6.js} +1 -1
- ksadk/server/static/assets/{blockDiagram-GPEHLZMM-UTdVcZhn.js → blockDiagram-GPEHLZMM-BnaB3Ywv.js} +1 -1
- ksadk/server/static/assets/{c4Diagram-AAUBKEIU-Dix0GD4m.js → c4Diagram-AAUBKEIU-Dw4weZcp.js} +1 -1
- ksadk/server/static/assets/channel-Dt3rQTFI.js +1 -0
- ksadk/server/static/assets/{chunk-2J33WTMH-C2JxuZ42.js → chunk-2J33WTMH-ChjpLK7j.js} +1 -1
- ksadk/server/static/assets/{chunk-4BX2VUAB-Be57QPgD.js → chunk-4BX2VUAB-B9drTgOW.js} +1 -1
- ksadk/server/static/assets/{chunk-55IACEB6-WjSuy4nv.js → chunk-55IACEB6-CK4ROATy.js} +1 -1
- ksadk/server/static/assets/{chunk-727SXJPM-BOovP-b5.js → chunk-727SXJPM-B9KtTTgw.js} +1 -1
- ksadk/server/static/assets/{chunk-AQP2D5EJ-DOmZNmWj.js → chunk-AQP2D5EJ-1O1mki3m.js} +1 -1
- ksadk/server/static/assets/{chunk-FMBD7UC4-DzwlodkU.js → chunk-FMBD7UC4-B_fH2YuH.js} +1 -1
- ksadk/server/static/assets/{chunk-ND2GUHAM-DMqAikEU.js → chunk-ND2GUHAM-D6rFLaVV.js} +1 -1
- ksadk/server/static/assets/chunk-QZHKN3VN-iXEZtKQc.js +1 -0
- ksadk/server/static/assets/classDiagram-4FO5ZUOK-DIveV17Q.js +1 -0
- ksadk/server/static/assets/classDiagram-v2-Q7XG4LA2-DIveV17Q.js +1 -0
- ksadk/server/static/assets/{cose-bilkent-S5V4N54A-Zhy2GBnP.js → cose-bilkent-S5V4N54A-ChNs_Mdk.js} +1 -1
- ksadk/server/static/assets/{dagre-BM42HDAG-CbKrtIUz.js → dagre-BM42HDAG-D0QXg_MQ.js} +1 -1
- ksadk/server/static/assets/{diagram-2AECGRRQ-BRApgQRK.js → diagram-2AECGRRQ-DBDDKwBQ.js} +1 -1
- ksadk/server/static/assets/{diagram-5GNKFQAL-D0xbnDiK.js → diagram-5GNKFQAL-BkwDOxmO.js} +1 -1
- ksadk/server/static/assets/{diagram-KO2AKTUF-CVugVI9L.js → diagram-KO2AKTUF-Bv8waYvY.js} +1 -1
- ksadk/server/static/assets/{diagram-LMA3HP47-DozUGgee.js → diagram-LMA3HP47-e1VECDdu.js} +1 -1
- ksadk/server/static/assets/{diagram-OG6HWLK6-ZOYsKlru.js → diagram-OG6HWLK6-Ds9adfRl.js} +1 -1
- ksadk/server/static/assets/{dist-DpKtt4Bo.js → dist-4N2NMVYg.js} +1 -1
- ksadk/server/static/assets/{dist-CkEKJFtk.js → dist-B-jNR6Vn.js} +1 -1
- ksadk/server/static/assets/{dist-D57wnGWd.js → dist-B5J2uhNk.js} +1 -1
- ksadk/server/static/assets/{dist-8_SfK1IP.js → dist-B5oS1zcj.js} +1 -1
- ksadk/server/static/assets/{dist-DMezvBGJ.js → dist-BB3-OwTQ.js} +1 -1
- ksadk/server/static/assets/{dist-2hInLS_J.js → dist-BIlKoW0k.js} +1 -1
- ksadk/server/static/assets/{dist-BrCcQ47T.js → dist-BjOdlDjj.js} +1 -1
- ksadk/server/static/assets/{dist-BmlMPsCc.js → dist-C1sz5Eo3.js} +1 -1
- ksadk/server/static/assets/{dist-B0NP_Z0z.js → dist-CWV4lDr1.js} +1 -1
- ksadk/server/static/assets/{dist-D-xOD048.js → dist-CmZHzlwZ.js} +1 -1
- ksadk/server/static/assets/{dist-DL_NKc_z.js → dist-D6MpCZtz.js} +1 -1
- ksadk/server/static/assets/{dist-DyOkZmze.js → dist-DJN_6Y39.js} +1 -1
- ksadk/server/static/assets/{dist-DmFaq_Iy.js → dist-DQU9EWw-.js} +1 -1
- ksadk/server/static/assets/{dist-gX6GOLKq.js → dist-DWKByxWV.js} +1 -1
- ksadk/server/static/assets/{dist-DyWsb78Q.js → dist-Dli7qW-B.js} +1 -1
- ksadk/server/static/assets/{dist-BIJVDMuB.js → dist-DsHPdk3W.js} +1 -1
- ksadk/server/static/assets/{dist-Dp0k7bWI.js → dist-X4TnqwOK.js} +1 -1
- ksadk/server/static/assets/{dist-8EEyGgDx.js → dist-_pHPTyZ-.js} +1 -1
- ksadk/server/static/assets/{dist-CPBtqRTW.js → dist-fhOuWds5.js} +1 -1
- ksadk/server/static/assets/{dist-D-JMdWPQ.js → dist-gLnrGsoU.js} +1 -1
- ksadk/server/static/assets/{dist-BssVmjIo.js → dist-j6Dxmf_j.js} +1 -1
- ksadk/server/static/assets/{dist-C3HIIaN5.js → dist-o2OVmKvt.js} +1 -1
- ksadk/server/static/assets/{erDiagram-TEJ5UH35-Bk-9bgE5.js → erDiagram-TEJ5UH35-BPItFKH6.js} +1 -1
- ksadk/server/static/assets/eventmodeling-FCH6USID-DYFSxbqr.js +1 -0
- ksadk/server/static/assets/{flowDiagram-I6XJVG4X-Dn9kZVuZ.js → flowDiagram-I6XJVG4X-BbYB9w5Y.js} +1 -1
- ksadk/server/static/assets/{ganttDiagram-6RSMTGT7-BGxXlJqm.js → ganttDiagram-6RSMTGT7-TQXa0KXv.js} +1 -1
- ksadk/server/static/assets/gitGraph-WXDBUCRP-DyNYp6BN.js +1 -0
- ksadk/server/static/assets/{gitGraphDiagram-PVQCEYII-C7Q0X-wi.js → gitGraphDiagram-PVQCEYII-bKblCnpa.js} +1 -1
- ksadk/server/static/assets/index-R52pJJvg.js +177 -0
- ksadk/server/static/assets/index-jJr3_955.css +2 -0
- ksadk/server/static/assets/info-J43DQDTF-WUx7qTde.js +1 -0
- ksadk/server/static/assets/{infoDiagram-5YYISTIA-BO_CSqq5.js → infoDiagram-5YYISTIA-BGVT7J_i.js} +1 -1
- ksadk/server/static/assets/{ishikawaDiagram-YF4QCWOH-eYLPLd46.js → ishikawaDiagram-YF4QCWOH-K0OOfVna.js} +1 -1
- ksadk/server/static/assets/{journeyDiagram-JHISSGLW-De9geSb0.js → journeyDiagram-JHISSGLW-8LeOJaZp.js} +1 -1
- ksadk/server/static/assets/{kanban-definition-UN3LZRKU-Cs80kQto.js → kanban-definition-UN3LZRKU-C6uCgZrW.js} +1 -1
- ksadk/server/static/assets/{katex-DSrCFD8n.js → katex-CYWseY5E.js} +1 -1
- ksadk/server/static/assets/{linear-CN9sbKTF.js → linear-hdBcYzM8.js} +1 -1
- ksadk/server/static/assets/{mermaid-parser.core-DlgSBU8l.js → mermaid-parser.core-BWrDjSZM.js} +2 -2
- ksadk/server/static/assets/{mindmap-definition-RKZ34NQL-9afz7Oug.js → mindmap-definition-RKZ34NQL-Bjy_2v4_.js} +1 -1
- ksadk/server/static/assets/packet-YPE3B663-BN13y_xl.js +1 -0
- ksadk/server/static/assets/pie-LRSECV5Y-ftSLXhhc.js +1 -0
- ksadk/server/static/assets/{pieDiagram-4H26LBE5-DPv_VstN.js → pieDiagram-4H26LBE5-GmmqNiVH.js} +1 -1
- ksadk/server/static/assets/{quadrantDiagram-W4KKPZXB-o77wZ1XK.js → quadrantDiagram-W4KKPZXB-BmkRbwCg.js} +1 -1
- ksadk/server/static/assets/radar-GUYGQ44K-jaICkIeO.js +1 -0
- ksadk/server/static/assets/{requirementDiagram-4Y6WPE33-BYVw81VC.js → requirementDiagram-4Y6WPE33-DSWFqL7c.js} +1 -1
- ksadk/server/static/assets/{sankeyDiagram-5OEKKPKP-B7nZFMKT.js → sankeyDiagram-5OEKKPKP-l6iXmU65.js} +1 -1
- ksadk/server/static/assets/{sequenceDiagram-3UESZ5HK-BGRRrFw5.js → sequenceDiagram-3UESZ5HK-Cq6UBeQB.js} +1 -1
- ksadk/server/static/assets/{stateDiagram-AJRCARHV-BUfHCoPs.js → stateDiagram-AJRCARHV-qzTQpg3Y.js} +1 -1
- ksadk/server/static/assets/stateDiagram-v2-BHNVJYJU-BYCoYGAN.js +1 -0
- ksadk/server/static/assets/{timeline-definition-PNZ67QCA-FbCTGrf9.js → timeline-definition-PNZ67QCA-DEz24vV0.js} +1 -1
- ksadk/server/static/assets/treeView-BLDUP644-Cpib_vlz.js +1 -0
- ksadk/server/static/assets/treemap-LRROVOQU-DQxfmVHK.js +1 -0
- ksadk/server/static/assets/{vennDiagram-CIIHVFJN-DWgwtPsJ.js → vennDiagram-CIIHVFJN-CMCixki2.js} +1 -1
- ksadk/server/static/assets/wardley-L42UT6IY-BQYHnnkU.js +1 -0
- ksadk/server/static/assets/{wardleyDiagram-YWT4CUSO-2x8G-tTM.js → wardleyDiagram-YWT4CUSO-CVzB8F9K.js} +1 -1
- ksadk/server/static/assets/{xychartDiagram-2RQKCTM6-Drma3AYl.js → xychartDiagram-2RQKCTM6-BFBqBLc1.js} +1 -1
- ksadk/server/static/index.html +2 -2
- ksadk/server/terminal_sessions.py +111 -58
- ksadk/sessions/__init__.py +69 -19
- ksadk/sessions/base.py +31 -11
- ksadk/sessions/continuity.py +2 -3
- ksadk/sessions/in_memory.py +46 -2
- ksadk/sessions/local_service.py +148 -17
- ksadk/sessions/postgres_service.py +143 -25
- ksadk/sessions/resilient.py +36 -8
- ksadk/skills/models.py +17 -5
- ksadk/skills/package_store.py +5 -2
- ksadk/skills/runtime/agent.py +20 -5
- ksadk/skills/runtime/artifacts.py +1 -5
- ksadk/skills/runtime/backends/e2b.py +10 -4
- ksadk/skills/runtime/backends/local.py +15 -3
- ksadk/skills/runtime/base.py +1 -2
- ksadk/skills/runtime/executor.py +10 -3
- ksadk/skills/runtime/factory.py +4 -2
- ksadk/skills/runtime/loader.py +1 -2
- ksadk/skills/runtime/registry.py +15 -10
- ksadk/skills/runtime/request.py +3 -1
- ksadk/skills/service_client.py +47 -16
- ksadk/skills/tool_defs.py +15 -10
- 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 +1046 -0
- ksadk/studio/api_catalog_routes.py +324 -0
- ksadk/studio/api_contracts.py +177 -0
- ksadk/studio/api_helpers.py +132 -0
- ksadk/studio/authoring.py +524 -0
- ksadk/studio/authoring_coordinator.py +285 -0
- ksadk/studio/builder.py +320 -0
- ksadk/studio/capabilities.py +351 -0
- ksadk/studio/cloud.py +278 -0
- ksadk/studio/codex_agent_service.py +583 -0
- ksadk/studio/codex_builder.py +324 -0
- ksadk/studio/codex_manifest.py +278 -0
- ksadk/studio/codex_run.py +352 -0
- ksadk/studio/compiler.py +189 -0
- ksadk/studio/contracts.py +644 -0
- ksadk/studio/errors.py +47 -0
- ksadk/studio/evaluation.py +192 -0
- ksadk/studio/event_store.py +284 -0
- ksadk/studio/framework_run.py +114 -0
- ksadk/studio/identifiers.py +33 -0
- ksadk/studio/mcp_runtime.py +229 -0
- ksadk/studio/model_client.py +543 -0
- ksadk/studio/model_profile_service.py +214 -0
- ksadk/studio/operations.py +243 -0
- ksadk/studio/otel_trace.py +754 -0
- ksadk/studio/pagination.py +182 -0
- ksadk/studio/python_tool_inspection.py +183 -0
- ksadk/studio/repository.py +306 -0
- ksadk/studio/resource_catalog.py +1217 -0
- ksadk/studio/run_service.py +707 -0
- ksadk/studio/runtime_catalog.py +74 -0
- ksadk/studio/runtime_source.py +339 -0
- ksadk/studio/service.py +1141 -0
- ksadk/studio/shared_web.py +994 -0
- ksadk/studio/skill_discovery.py +628 -0
- ksadk/studio/static/assets/PrismRenderer-IYN-ffww.js +3 -0
- ksadk/studio/static/assets/index-CaEN0eTR.css +1 -0
- ksadk/studio/static/assets/index-DI2eY_NH.js +252 -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 +630 -0
- ksadk/studio/validator.py +246 -0
- ksadk/studio/workspace.py +137 -0
- ksadk/terminal_exec_policy.py +3 -4
- ksadk/tools/gateway.py +101 -15
- ksadk/tools/result_budget.py +12 -4
- ksadk/toolsets/__init__.py +161 -37
- ksadk/toolsets/a2a.py +426 -0
- ksadk/toolsets/platform.py +21 -5
- ksadk/toolsets/sandbox.py +82 -16
- ksadk/toolsets/skills.py +200 -39
- ksadk/toolsets/web.py +123 -26
- ksadk/toolsets/workspace.py +212 -101
- ksadk/tracing/__init__.py +19 -21
- ksadk/tracing/exporters/inmemory_exporter.py +62 -51
- ksadk/tracing/setup.py +135 -506
- ksadk/tracing/span_utils.py +0 -41
- ksadk/tui/loop.py +78 -30
- ksadk/tui/stream_render.py +1 -0
- ksadk/ui_config.py +5 -3
- ksadk/version.py +1 -1
- ksadk_runtime_common/memory_backend/registry.py +56 -56
- ksadk_runtime_common/schemas/runtime_event_v1.json +95 -0
- ksadk_runtime_common/workspace_files/router.py +8 -2
- agentengine_sdk_python-0.7.0.dist-info/RECORD +0 -482
- ksadk/a2a/card_builder.py +0 -64
- ksadk/a2a/client.py +0 -309
- ksadk/runners/utils/langfuse.py +0 -230
- ksadk/server/static/assets/CodeBlock-P16VOLYi.js +0 -9
- ksadk/server/static/assets/MathMessageMarkdown-CdGiQWHR.js +0 -8
- ksadk/server/static/assets/MermaidBlock-IOcal8cm.js +0 -303
- ksadk/server/static/assets/NativeTerminalPanel-DGSDWsei.js +0 -1
- ksadk/server/static/assets/architecture-7EHR7CIX-BvUlsA6l.js +0 -1
- ksadk/server/static/assets/channel-CTuydARX.js +0 -1
- ksadk/server/static/assets/chunk-QZHKN3VN-BnCydivS.js +0 -1
- ksadk/server/static/assets/classDiagram-4FO5ZUOK-BNHg45Be.js +0 -1
- ksadk/server/static/assets/classDiagram-v2-Q7XG4LA2-BNHg45Be.js +0 -1
- ksadk/server/static/assets/eventmodeling-FCH6USID-DsAgWnlf.js +0 -1
- ksadk/server/static/assets/gitGraph-WXDBUCRP-BIao9Yjg.js +0 -1
- ksadk/server/static/assets/index-C00Lwg3L.js +0 -165
- ksadk/server/static/assets/index-DAURbCsP.css +0 -1
- ksadk/server/static/assets/info-J43DQDTF-CyipqGxU.js +0 -1
- ksadk/server/static/assets/packet-YPE3B663-CGkyRxlg.js +0 -1
- ksadk/server/static/assets/pie-LRSECV5Y-M0uWAf4n.js +0 -1
- ksadk/server/static/assets/radar-GUYGQ44K-Bdbm24-x.js +0 -1
- ksadk/server/static/assets/stateDiagram-v2-BHNVJYJU-8xBN_gLM.js +0 -1
- ksadk/server/static/assets/treeView-BLDUP644-npMo0ak1.js +0 -1
- ksadk/server/static/assets/treemap-LRROVOQU-CHdzrrdo.js +0 -1
- ksadk/server/static/assets/wardley-L42UT6IY-BEQz7wyy.js +0 -1
- ksadk/tracing/exporters/langfuse_exporter.py +0 -445
- {agentengine_sdk_python-0.7.0.dist-info → agentengine_sdk_python-0.8.1.dist-info}/entry_points.txt +0 -0
- {agentengine_sdk_python-0.7.0.dist-info → agentengine_sdk_python-0.8.1.dist-info}/licenses/LICENSE +0 -0
- {agentengine_sdk_python-0.7.0.dist-info → agentengine_sdk_python-0.8.1.dist-info}/top_level.txt +0 -0
ksadk/runtime/adapter.py
ADDED
|
@@ -0,0 +1,412 @@
|
|
|
1
|
+
"""RuntimeAdapter 平台接口 (goal-03 / G0.3 冻结稿)。
|
|
2
|
+
|
|
3
|
+
**只做签名与语义冻结,不实现具体 adapter**(具体 adapter 是后续 A4/A6,如 ADK/LangGraph
|
|
4
|
+
adapter)。本模块定义三层结构与六动词签名,供 Runtime 产生端、server 持久化、A2A
|
|
5
|
+
真实 cancel 等共同消费。
|
|
6
|
+
|
|
7
|
+
结构(H2 §4.2):
|
|
8
|
+
|
|
9
|
+
- :class:`BaseRuntime`:表达 Runtime **原生能力**(现有 ``BaseRunner`` 的演进目标,不推倒)。
|
|
10
|
+
- :class:`RuntimeAdapter`:把原生能力映射为**平台接口**(六动词)。
|
|
11
|
+
- :class:`RuntimeRegistry`:按 ``runtime_type`` 注册 adapter(替代 ``runners/factory.py``
|
|
12
|
+
的 if/elif 分发)。
|
|
13
|
+
|
|
14
|
+
六动词语义契约(2026-07-21 友商代码核验,见 docstring 各处):
|
|
15
|
+
|
|
16
|
+
1. ``stream`` 返回 :class:`~ksadk.events.runtime_event.RuntimeEvent` 事件流(对接 G0.2),
|
|
17
|
+
模型 = **事件流 + 独立命令/恢复通道**:审批回包走 ``resume``/``submit``,不在事件流
|
|
18
|
+
回写(非 duplex stream)——codex/ADK/LangGraph 都是这个模型。
|
|
19
|
+
2. ``cancel`` 是状态机,返回 :class:`CancelResult` 枚举(不是 bool——Wegent 实测 bool
|
|
20
|
+
区分不了"记 pending"和"真 interrupt")。
|
|
21
|
+
3. ``resume`` 拆 :class:`ResumeTarget`(恢复目标)与 :class:`ResumePayload`(回包)两个
|
|
22
|
+
参数,不混成 union(ADK 区分 invocation_id 目标 vs function response 回包;Codex 区分
|
|
23
|
+
resume_thread_id vs Op 回包)。
|
|
24
|
+
4. ``checkpoint`` 粒度用 :class:`CheckpointCapability` 声明(不承诺所有 runtime 同等能力,
|
|
25
|
+
诚实暴露 capability matrix)。
|
|
26
|
+
5. ``start`` 带 session/tenant 维度(:class:`StartRequest` 的 ``user_id`` + ``session_id``),
|
|
27
|
+
不只是 prompt。
|
|
28
|
+
"""
|
|
29
|
+
|
|
30
|
+
from __future__ import annotations
|
|
31
|
+
|
|
32
|
+
from abc import ABC, abstractmethod
|
|
33
|
+
from collections.abc import Callable
|
|
34
|
+
from enum import Enum
|
|
35
|
+
from typing import Any, AsyncIterator, Literal, Optional
|
|
36
|
+
|
|
37
|
+
from pydantic import BaseModel, ConfigDict, Field
|
|
38
|
+
|
|
39
|
+
from ksadk.events.runtime_event import RuntimeEvent
|
|
40
|
+
from ksadk.runtime.launch import RuntimeLaunchContext, RuntimeServices
|
|
41
|
+
|
|
42
|
+
# ---------------------------------------------------------------------------
|
|
43
|
+
# cancel 状态机
|
|
44
|
+
# ---------------------------------------------------------------------------
|
|
45
|
+
|
|
46
|
+
|
|
47
|
+
class CancelResult(str, Enum):
|
|
48
|
+
"""cancel 的结果状态机。
|
|
49
|
+
|
|
50
|
+
Wegent ``cancel()`` 实测:无活跃 turn 记 pending 也返回 true、成功 interrupt 也返回
|
|
51
|
+
true,**bool 区分不了两种结果**——因此必须用枚举显式区分。
|
|
52
|
+
"""
|
|
53
|
+
|
|
54
|
+
INTERRUPTED_ACTIVE_TURN = "interrupted_active_turn"
|
|
55
|
+
"""有活跃 turn,已真实 interrupt。"""
|
|
56
|
+
|
|
57
|
+
PENDING_CANCEL_RECORDED = "pending_cancel_recorded"
|
|
58
|
+
"""无活跃 turn,已记录 pending cancel,下一个 turn 开始时被消费。"""
|
|
59
|
+
|
|
60
|
+
NOT_RUNNING = "not_running"
|
|
61
|
+
"""目标不在运行(无可取消的活跃/pending run)。"""
|
|
62
|
+
|
|
63
|
+
FAILED = "failed"
|
|
64
|
+
"""取消动作本身失败(如底层 runtime 报错)。"""
|
|
65
|
+
|
|
66
|
+
|
|
67
|
+
class PauseResult(str, Enum):
|
|
68
|
+
"""Non-terminal pause capability result.
|
|
69
|
+
|
|
70
|
+
Pause is deliberately separate from :class:`CancelResult`: an adapter must
|
|
71
|
+
never claim a run is resumable after applying destructive cancel semantics.
|
|
72
|
+
"""
|
|
73
|
+
|
|
74
|
+
PAUSED_ACTIVE_TURN = "paused_active_turn"
|
|
75
|
+
NOT_SUPPORTED = "not_supported"
|
|
76
|
+
NOT_RUNNING = "not_running"
|
|
77
|
+
FAILED = "failed"
|
|
78
|
+
|
|
79
|
+
|
|
80
|
+
# ---------------------------------------------------------------------------
|
|
81
|
+
# resume 目标与回包(两件拆开的的事)
|
|
82
|
+
# ---------------------------------------------------------------------------
|
|
83
|
+
|
|
84
|
+
|
|
85
|
+
class ResumeTarget(BaseModel):
|
|
86
|
+
"""恢复目标:回到哪里。
|
|
87
|
+
|
|
88
|
+
- ``invocation_id``:精确到某次调用(ADK forward-only resume)。
|
|
89
|
+
- ``thread_id``:某条会话线程(Codex resume_thread_id)。
|
|
90
|
+
- ``checkpoint_id``:某个 checkpoint(LangGraph time-travel)。
|
|
91
|
+
"""
|
|
92
|
+
|
|
93
|
+
kind: Literal["invocation_id", "thread_id", "checkpoint_id"]
|
|
94
|
+
id: str
|
|
95
|
+
|
|
96
|
+
|
|
97
|
+
class ResumePayload(BaseModel):
|
|
98
|
+
"""恢复回包:带着什么输入恢复(可为空——纯粹续跑)。
|
|
99
|
+
|
|
100
|
+
- ``tool_result``:工具执行结果(function response)。
|
|
101
|
+
- ``approval_decision``:审批决定(对应 ``approval.requested`` 的回包,走命令通道)。
|
|
102
|
+
- ``hitl_answer``:human-in-the-loop 回答。
|
|
103
|
+
- ``free_text``:自由文本输入。
|
|
104
|
+
"""
|
|
105
|
+
|
|
106
|
+
kind: Literal["tool_result", "approval_decision", "hitl_answer", "free_text"]
|
|
107
|
+
call_id: Optional[str] = None
|
|
108
|
+
"""对应的 ``approval.requested`` / ``tool.call`` 的 id(如有)。"""
|
|
109
|
+
data: Any = None
|
|
110
|
+
|
|
111
|
+
|
|
112
|
+
# ---------------------------------------------------------------------------
|
|
113
|
+
# checkpoint 能力声明
|
|
114
|
+
# ---------------------------------------------------------------------------
|
|
115
|
+
|
|
116
|
+
|
|
117
|
+
class CheckpointCapability(BaseModel):
|
|
118
|
+
"""checkpoint 粒度声明。诚实暴露,不承诺所有 runtime 同等能力。
|
|
119
|
+
|
|
120
|
+
与现有 ``BaseRunner.describe_checkpoint_capability`` 对齐演进。
|
|
121
|
+
"""
|
|
122
|
+
|
|
123
|
+
supported: bool
|
|
124
|
+
granularity: Literal["delta", "snapshot", "none"]
|
|
125
|
+
"""delta(增量)vs snapshot(快照)vs none。"""
|
|
126
|
+
rollback_scope: Literal["turn", "invocation", "none"]
|
|
127
|
+
"""可按 turn 还是 invocation 回滚。"""
|
|
128
|
+
fork_supported: bool
|
|
129
|
+
"""是否支持从某 checkpoint fork 出新分支。"""
|
|
130
|
+
durable: bool
|
|
131
|
+
"""是否持久化(跨进程/重启保留)。"""
|
|
132
|
+
shared_across_pods: bool
|
|
133
|
+
"""是否跨 pod 共享(K8s 多副本可读同一 checkpoint)。"""
|
|
134
|
+
reason: str = ""
|
|
135
|
+
|
|
136
|
+
|
|
137
|
+
class CheckpointDescriptor(BaseModel):
|
|
138
|
+
"""一次 checkpoint 的描述(checkpoint 动词的返回值)。"""
|
|
139
|
+
|
|
140
|
+
checkpoint_id: str
|
|
141
|
+
invocation_id: str
|
|
142
|
+
capability: CheckpointCapability
|
|
143
|
+
ref: dict[str, Any] = Field(default_factory=dict)
|
|
144
|
+
"""runtime 私有引用(如 LangGraph checkpoint 的 (thread_id, checkpoint_id) 元组)。"""
|
|
145
|
+
|
|
146
|
+
|
|
147
|
+
# ---------------------------------------------------------------------------
|
|
148
|
+
# start 请求与 run 句柄
|
|
149
|
+
# ---------------------------------------------------------------------------
|
|
150
|
+
|
|
151
|
+
|
|
152
|
+
CONVERSATION_PREPROCESSING_METADATA_KEY = "conversation_request"
|
|
153
|
+
"""StartRequest metadata key for the shared conversation preprocessing contract."""
|
|
154
|
+
|
|
155
|
+
RESUME_START_REQUEST_NATIVE_KEY = "_conversation_start_request"
|
|
156
|
+
"""Ephemeral adapter-private key carrying current request context across attach/resume."""
|
|
157
|
+
|
|
158
|
+
|
|
159
|
+
class ConversationPreprocessingRequest(BaseModel):
|
|
160
|
+
"""Transport-neutral input for the existing conversation preprocessing path.
|
|
161
|
+
|
|
162
|
+
Protocol adapters keep their wire-specific fields out of the runner payload and
|
|
163
|
+
place the canonical conversation inputs here. ``RunnerRuntimeAdapter`` then
|
|
164
|
+
reuses the same history, attachment, model-policy, platform-context, ambient
|
|
165
|
+
KB/memory and tracing preparation as the normal RunAgent/Responses entrypoints.
|
|
166
|
+
|
|
167
|
+
The model is additive and allows unknown fields so a newer protocol adapter can
|
|
168
|
+
talk to an older runtime without losing forward-compatible metadata.
|
|
169
|
+
"""
|
|
170
|
+
|
|
171
|
+
model_config = ConfigDict(extra="allow")
|
|
172
|
+
|
|
173
|
+
messages: list[dict[str, Any]] = Field(default_factory=list)
|
|
174
|
+
model_metadata: dict[str, Any] = Field(default_factory=dict)
|
|
175
|
+
model_options: dict[str, Any] = Field(default_factory=dict)
|
|
176
|
+
state_delta: dict[str, Any] = Field(default_factory=dict)
|
|
177
|
+
instructions: Optional[str] = None
|
|
178
|
+
request_metadata: dict[str, Any] = Field(default_factory=dict)
|
|
179
|
+
custom_metadata: dict[str, Any] = Field(default_factory=dict)
|
|
180
|
+
account_id: Optional[str] = None
|
|
181
|
+
response_id: Optional[str] = None
|
|
182
|
+
|
|
183
|
+
|
|
184
|
+
class StartRequest(BaseModel):
|
|
185
|
+
"""start 的输入:带 session/tenant 维度,不只是 prompt。"""
|
|
186
|
+
|
|
187
|
+
input: Any
|
|
188
|
+
"""用户消息或结构化输入。"""
|
|
189
|
+
user_id: str
|
|
190
|
+
session_id: str
|
|
191
|
+
agent_id: Optional[str] = None
|
|
192
|
+
model: Optional[str] = None
|
|
193
|
+
config: dict[str, Any] = Field(default_factory=dict)
|
|
194
|
+
metadata: dict[str, Any] = Field(default_factory=dict)
|
|
195
|
+
|
|
196
|
+
def conversation_preprocessing(self) -> Optional[ConversationPreprocessingRequest]:
|
|
197
|
+
"""Return the opt-in shared preprocessing request, if one was supplied."""
|
|
198
|
+
|
|
199
|
+
raw = self.metadata.get(CONVERSATION_PREPROCESSING_METADATA_KEY)
|
|
200
|
+
if raw is None:
|
|
201
|
+
return None
|
|
202
|
+
return ConversationPreprocessingRequest.model_validate(raw)
|
|
203
|
+
|
|
204
|
+
|
|
205
|
+
class RunHandle(BaseModel):
|
|
206
|
+
"""一次 run 的不透明句柄(start 返回,后续 stream/cancel/resume/checkpoint/close 用)。"""
|
|
207
|
+
|
|
208
|
+
run_id: str
|
|
209
|
+
"""= invocation_id。"""
|
|
210
|
+
session_id: str
|
|
211
|
+
runtime_type: str
|
|
212
|
+
native_ref: dict[str, Any] = Field(default_factory=dict)
|
|
213
|
+
"""adapter 私有引用(如 ADK 的 (app_name, user_id, session_id)、Codex 的 thread_ref)。"""
|
|
214
|
+
|
|
215
|
+
|
|
216
|
+
# ---------------------------------------------------------------------------
|
|
217
|
+
# BaseRuntime:Runtime 原生能力
|
|
218
|
+
# ---------------------------------------------------------------------------
|
|
219
|
+
|
|
220
|
+
|
|
221
|
+
class BaseRuntime(ABC):
|
|
222
|
+
"""Runtime 原生能力面(现有 ``BaseRunner`` 的演进目标,不推倒)。
|
|
223
|
+
|
|
224
|
+
``BaseRunner`` 的 ``request_cancel`` / ``describe_checkpoint_capability`` /
|
|
225
|
+
``invoke`` / ``stream`` 是原生能力的现状;``BaseRuntime`` 是其平台化抽象。
|
|
226
|
+
具体 runner(ADK/LangGraph/...)以 ``BaseRuntime`` 表达原生能力,再由
|
|
227
|
+
:class:`RuntimeAdapter` 映射为平台六动词。
|
|
228
|
+
"""
|
|
229
|
+
|
|
230
|
+
runtime_type: str = "unknown"
|
|
231
|
+
|
|
232
|
+
@abstractmethod
|
|
233
|
+
def native_capabilities(self) -> dict[str, Any]:
|
|
234
|
+
"""原生能力声明(cancel / checkpoint / resume / session continuity 等)。"""
|
|
235
|
+
raise NotImplementedError
|
|
236
|
+
|
|
237
|
+
|
|
238
|
+
# ---------------------------------------------------------------------------
|
|
239
|
+
# RuntimeAdapter:平台六动词
|
|
240
|
+
# ---------------------------------------------------------------------------
|
|
241
|
+
|
|
242
|
+
|
|
243
|
+
class RuntimeAdapter(ABC):
|
|
244
|
+
"""把 :class:`BaseRuntime` 的原生能力映射为平台接口(六动词)。
|
|
245
|
+
|
|
246
|
+
签名冻结:以下六个方法的名字、参数、返回类型在 v1 冻结,只允许 additive 演进
|
|
247
|
+
(新增方法/可选参数),不允许改既有签名。
|
|
248
|
+
"""
|
|
249
|
+
|
|
250
|
+
def __init__(self, runtime: BaseRuntime) -> None:
|
|
251
|
+
self._runtime = runtime
|
|
252
|
+
|
|
253
|
+
@property
|
|
254
|
+
def runtime(self) -> BaseRuntime:
|
|
255
|
+
return self._runtime
|
|
256
|
+
|
|
257
|
+
async def preflight(self) -> None:
|
|
258
|
+
"""Validate that this adapter can accept a new run without creating one.
|
|
259
|
+
|
|
260
|
+
This is deliberately an additive lifecycle hook rather than a seventh
|
|
261
|
+
platform verb. HTTP streaming routes use it before committing a 200
|
|
262
|
+
response, so a lazy runner import or configuration failure is returned
|
|
263
|
+
as a normal request error instead of a detached, half-open SSE stream.
|
|
264
|
+
Implementations must not allocate a run handle or start model work.
|
|
265
|
+
"""
|
|
266
|
+
|
|
267
|
+
return None
|
|
268
|
+
|
|
269
|
+
@abstractmethod
|
|
270
|
+
async def start(self, request: StartRequest) -> RunHandle:
|
|
271
|
+
"""启动一次 run,返回句柄。"""
|
|
272
|
+
raise NotImplementedError
|
|
273
|
+
|
|
274
|
+
@abstractmethod
|
|
275
|
+
def stream(self, handle: RunHandle) -> AsyncIterator[RuntimeEvent]:
|
|
276
|
+
"""订阅 run 的结构化事件流(对接 G0.2 RuntimeEvent)。
|
|
277
|
+
|
|
278
|
+
注意:这是**事件流 + 独立命令/恢复通道**模型——审批回包/工具结果走
|
|
279
|
+
:meth:`resume`,不在本事件流上回写(非 duplex stream)。
|
|
280
|
+
"""
|
|
281
|
+
raise NotImplementedError
|
|
282
|
+
|
|
283
|
+
@abstractmethod
|
|
284
|
+
async def cancel(self, handle: RunHandle) -> CancelResult:
|
|
285
|
+
"""请求取消。返回状态机结果;成功 cancel 级联丢弃该 turn 的 pending 审批。"""
|
|
286
|
+
raise NotImplementedError
|
|
287
|
+
|
|
288
|
+
async def pause(self, handle: RunHandle) -> PauseResult:
|
|
289
|
+
"""Pause an active turn without invalidating its resumable state.
|
|
290
|
+
|
|
291
|
+
This additive hook defaults to an honest unsupported result. It must
|
|
292
|
+
not fall back to ``cancel`` because cancellation is terminal for some
|
|
293
|
+
runtimes (notably Codex).
|
|
294
|
+
"""
|
|
295
|
+
|
|
296
|
+
return PauseResult.NOT_SUPPORTED
|
|
297
|
+
|
|
298
|
+
async def submit(self, handle: RunHandle, payload: ResumePayload) -> None:
|
|
299
|
+
"""Submit input to a live interaction without restarting the stream.
|
|
300
|
+
|
|
301
|
+
Runtimes whose HITL model ends the current stream should continue to
|
|
302
|
+
use :meth:`resume`; live JSON-RPC approval requests use this command
|
|
303
|
+
channel instead.
|
|
304
|
+
"""
|
|
305
|
+
|
|
306
|
+
raise RuntimeError(f"{type(self).__name__} does not support live interaction input")
|
|
307
|
+
|
|
308
|
+
@abstractmethod
|
|
309
|
+
async def resume(
|
|
310
|
+
self,
|
|
311
|
+
handle: RunHandle,
|
|
312
|
+
target: ResumeTarget,
|
|
313
|
+
payload: Optional[ResumePayload],
|
|
314
|
+
) -> RunHandle:
|
|
315
|
+
"""恢复 run。``target`` 是恢复目标,``payload`` 是回包(可为空)。"""
|
|
316
|
+
raise NotImplementedError
|
|
317
|
+
|
|
318
|
+
async def attach(self, handle: RunHandle) -> RunHandle:
|
|
319
|
+
"""Attach a persisted handle in this process before ``resume``/``stream``.
|
|
320
|
+
|
|
321
|
+
A handle restored from durable task metadata is not evidence that the
|
|
322
|
+
underlying runner exists in this process. Adapters which support
|
|
323
|
+
cross-process recovery must implement this seam using their framework's
|
|
324
|
+
durable checkpoint/session API. The default deliberately fails closed.
|
|
325
|
+
"""
|
|
326
|
+
raise RuntimeError(
|
|
327
|
+
f"{type(self).__name__} does not support attaching persisted run "
|
|
328
|
+
f"{handle.run_id!r}; durable runtime restore is unavailable"
|
|
329
|
+
)
|
|
330
|
+
|
|
331
|
+
def is_handle_attached(self, handle: RunHandle) -> bool:
|
|
332
|
+
"""Return whether ``handle`` is already attached to this adapter process."""
|
|
333
|
+
return False
|
|
334
|
+
|
|
335
|
+
@abstractmethod
|
|
336
|
+
async def checkpoint(self, handle: RunHandle) -> CheckpointDescriptor:
|
|
337
|
+
"""在当前位置创建 checkpoint,返回描述(粒度见 capability)。"""
|
|
338
|
+
raise NotImplementedError
|
|
339
|
+
|
|
340
|
+
@abstractmethod
|
|
341
|
+
async def close(self, handle: RunHandle) -> None:
|
|
342
|
+
"""释放 run 持有的运行期资源。"""
|
|
343
|
+
raise NotImplementedError
|
|
344
|
+
|
|
345
|
+
|
|
346
|
+
# ---------------------------------------------------------------------------
|
|
347
|
+
# RuntimeRegistry
|
|
348
|
+
# ---------------------------------------------------------------------------
|
|
349
|
+
|
|
350
|
+
|
|
351
|
+
RuntimeAdapterFactory = Callable[[RuntimeLaunchContext], RuntimeAdapter]
|
|
352
|
+
|
|
353
|
+
|
|
354
|
+
class RuntimeRegistry:
|
|
355
|
+
"""按 ``runtime_type`` 注册/创建 :class:`RuntimeAdapter`。
|
|
356
|
+
|
|
357
|
+
替代 ``runners/factory.py`` 的 if/elif 分发:新 runtime 通过 ``register``
|
|
358
|
+
注册,不再改 factory 分支。
|
|
359
|
+
"""
|
|
360
|
+
|
|
361
|
+
def __init__(self) -> None:
|
|
362
|
+
self._factories: dict[str, RuntimeAdapterFactory] = {}
|
|
363
|
+
|
|
364
|
+
def register(self, runtime_type: str, factory: RuntimeAdapterFactory) -> None:
|
|
365
|
+
if not isinstance(runtime_type, str) or not runtime_type.strip():
|
|
366
|
+
raise ValueError("runtime type must be a non-empty string")
|
|
367
|
+
key = runtime_type.strip().lower()
|
|
368
|
+
if key in self._factories:
|
|
369
|
+
raise ValueError(f"duplicate runtime type: {runtime_type!r}")
|
|
370
|
+
if not callable(factory):
|
|
371
|
+
raise TypeError(f"runtime factory must be callable: {factory!r}")
|
|
372
|
+
self._factories[key] = factory
|
|
373
|
+
|
|
374
|
+
def get(self, runtime_type: str) -> RuntimeAdapterFactory:
|
|
375
|
+
key = runtime_type.strip().lower()
|
|
376
|
+
try:
|
|
377
|
+
return self._factories[key]
|
|
378
|
+
except KeyError:
|
|
379
|
+
raise KeyError(
|
|
380
|
+
f"missing runtime type: {runtime_type!r}; registered: {sorted(self._factories)}"
|
|
381
|
+
) from None
|
|
382
|
+
|
|
383
|
+
def create(self, context: RuntimeLaunchContext) -> RuntimeAdapter:
|
|
384
|
+
"""使用不可变启动上下文创建一个新的 Adapter 实例。"""
|
|
385
|
+
|
|
386
|
+
adapter = self.get(context.runtime_type)(context)
|
|
387
|
+
if not isinstance(adapter, RuntimeAdapter):
|
|
388
|
+
raise TypeError(
|
|
389
|
+
f"runtime factory must return RuntimeAdapter, got {type(adapter).__name__}"
|
|
390
|
+
)
|
|
391
|
+
return adapter
|
|
392
|
+
|
|
393
|
+
def registered_types(self) -> list[str]:
|
|
394
|
+
return sorted(self._factories)
|
|
395
|
+
|
|
396
|
+
|
|
397
|
+
__all__ = [
|
|
398
|
+
"BaseRuntime",
|
|
399
|
+
"CancelResult",
|
|
400
|
+
"PauseResult",
|
|
401
|
+
"CheckpointCapability",
|
|
402
|
+
"CheckpointDescriptor",
|
|
403
|
+
"ResumePayload",
|
|
404
|
+
"ResumeTarget",
|
|
405
|
+
"RunHandle",
|
|
406
|
+
"RuntimeAdapter",
|
|
407
|
+
"RuntimeAdapterFactory",
|
|
408
|
+
"RuntimeLaunchContext",
|
|
409
|
+
"RuntimeRegistry",
|
|
410
|
+
"RuntimeServices",
|
|
411
|
+
"StartRequest",
|
|
412
|
+
]
|