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
|
@@ -4,30 +4,47 @@ from __future__ import annotations
|
|
|
4
4
|
|
|
5
5
|
from typing import Iterable
|
|
6
6
|
|
|
7
|
-
|
|
8
|
-
|
|
7
|
+
FASTAPI_REQUIREMENT = "fastapi>=0.136.0,<0.137.0"
|
|
8
|
+
STARLETTE_REQUIREMENT = "starlette>=1.0,<1.4"
|
|
9
9
|
|
|
10
10
|
ADK_REQUIREMENTS = (
|
|
11
|
-
|
|
11
|
+
# goal-00: 与 ksadk 自身 adk extra 对齐,允许 1.34.x 与 2.x
|
|
12
|
+
"google-adk>=1.34.0,<3.0.0",
|
|
12
13
|
"litellm>=1.0.0",
|
|
13
14
|
)
|
|
14
15
|
|
|
15
16
|
LANGCHAIN_ECOSYSTEM_REQUIREMENTS = (
|
|
16
|
-
"langchain>=1.3.
|
|
17
|
-
"langchain-openai>=1.
|
|
18
|
-
"langchain-core>=1.
|
|
17
|
+
"langchain>=1.3.14,<2.0.0",
|
|
18
|
+
"langchain-openai>=1.4.0,<2.0.0",
|
|
19
|
+
"langchain-core>=1.5.0,<2.0.0",
|
|
19
20
|
"langgraph>=1.2.0,<1.3.0",
|
|
20
21
|
)
|
|
21
22
|
|
|
22
|
-
DEEPAGENTS_REQUIREMENTS = (
|
|
23
|
-
|
|
24
|
-
)
|
|
23
|
+
DEEPAGENTS_REQUIREMENTS = ("deepagents>=0.6.2,<1.0.0",)
|
|
24
|
+
|
|
25
|
+
# codex runtime:openai-codex SDK(自带 codex CLI 二进制,见 PyPI cli-bin wheel)
|
|
26
|
+
CODEX_REQUIREMENTS = ("openai-codex==0.144.4",)
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
def code_requirements_for_framework(framework: str) -> list[str]:
|
|
30
|
+
"""Dependencies safe to install into a portable Code artifact.
|
|
31
|
+
|
|
32
|
+
Codex carries a platform-selected executable package. ManagedRuntime code
|
|
33
|
+
bundles must remain system independent, so Codex is deliberately excluded
|
|
34
|
+
from this dependency policy.
|
|
35
|
+
"""
|
|
36
|
+
normalized = (framework or "").strip().lower()
|
|
37
|
+
if normalized == "codex":
|
|
38
|
+
return []
|
|
39
|
+
return requirements_for_framework(normalized)
|
|
25
40
|
|
|
26
41
|
|
|
27
42
|
def requirements_for_framework(framework: str) -> list[str]:
|
|
28
43
|
normalized = (framework or "").strip().lower()
|
|
29
44
|
if normalized == "adk":
|
|
30
45
|
return list(ADK_REQUIREMENTS)
|
|
46
|
+
if normalized == "codex":
|
|
47
|
+
return list(CODEX_REQUIREMENTS)
|
|
31
48
|
if normalized in {"langchain", "langgraph", "deepagents"}:
|
|
32
49
|
requirements = list(LANGCHAIN_ECOSYSTEM_REQUIREMENTS)
|
|
33
50
|
if normalized == "deepagents":
|
|
@@ -41,11 +58,13 @@ def minimal_requirements_for_framework(framework: str) -> list[str]:
|
|
|
41
58
|
normalized = (framework or "").strip().lower()
|
|
42
59
|
if normalized == "adk":
|
|
43
60
|
return list(ADK_REQUIREMENTS)
|
|
61
|
+
if normalized == "codex":
|
|
62
|
+
return list(CODEX_REQUIREMENTS)
|
|
44
63
|
if normalized in {"langchain", "langgraph", "deepagents"}:
|
|
45
64
|
requirements = [
|
|
46
|
-
"langchain>=1.3.
|
|
47
|
-
"langchain-openai>=1.
|
|
48
|
-
"langchain-core>=1.
|
|
65
|
+
"langchain>=1.3.14,<2.0.0",
|
|
66
|
+
"langchain-openai>=1.4.0,<2.0.0",
|
|
67
|
+
"langchain-core>=1.5.0,<2.0.0",
|
|
49
68
|
]
|
|
50
69
|
if normalized in {"langgraph", "deepagents"}:
|
|
51
70
|
requirements.append("langgraph>=1.2.0,<1.3.0")
|
ksadk/builders/ks3_uploader.py
CHANGED
|
@@ -5,13 +5,12 @@ KS3 上传模块 - 金山云对象存储上传
|
|
|
5
5
|
import os
|
|
6
6
|
import socket
|
|
7
7
|
import time
|
|
8
|
-
from pathlib import Path
|
|
9
8
|
from concurrent.futures import ThreadPoolExecutor, as_completed
|
|
9
|
+
from pathlib import Path
|
|
10
10
|
from typing import Optional
|
|
11
|
-
import click
|
|
12
|
-
|
|
13
|
-
from ks3.upload import UploadTask
|
|
14
11
|
|
|
12
|
+
import click
|
|
13
|
+
from ks3.upload import UploadTask # type: ignore[import-untyped]
|
|
15
14
|
|
|
16
15
|
from ksadk.common.constants import get_ks3_endpoints
|
|
17
16
|
|
|
@@ -28,9 +27,9 @@ class KS3Uploader:
|
|
|
28
27
|
UPLOAD_TIMEOUT_PER_MB_SECONDS = 4.0
|
|
29
28
|
UPLOAD_TIMEOUT_MAX_SECONDS = 3600
|
|
30
29
|
|
|
31
|
-
def __init__(self, region: str = "cn-beijing-6", bucket: str = None):
|
|
30
|
+
def __init__(self, region: str = "cn-beijing-6", bucket: Optional[str] = None):
|
|
32
31
|
"""初始化 KS3 上传器
|
|
33
|
-
|
|
32
|
+
|
|
34
33
|
Args:
|
|
35
34
|
region: KS3 区域 (默认 cn-beijing-6)
|
|
36
35
|
bucket: bucket 名称 (可选)
|
|
@@ -39,12 +38,12 @@ class KS3Uploader:
|
|
|
39
38
|
- 如果环境变量也未设置,默认使用 agentengine-{region}
|
|
40
39
|
"""
|
|
41
40
|
self.region = region
|
|
42
|
-
|
|
41
|
+
|
|
43
42
|
# 确定 bucket 名称 (优先级: 参数 > 环境变量 > 默认值)
|
|
44
43
|
if bucket:
|
|
45
44
|
self.bucket_name = bucket
|
|
46
|
-
elif os.getenv("KS3_BUCKET"):
|
|
47
|
-
self.bucket_name =
|
|
45
|
+
elif env_bucket := os.getenv("KS3_BUCKET"):
|
|
46
|
+
self.bucket_name = env_bucket
|
|
48
47
|
else:
|
|
49
48
|
# Bucket 名称格式: agentengine-{account_id}-{region}
|
|
50
49
|
account_id = os.getenv("KSYUN_ACCOUNT_ID")
|
|
@@ -68,7 +67,7 @@ class KS3Uploader:
|
|
|
68
67
|
" 或设置 KS3_BUCKET 显式指定 bucket 名称"
|
|
69
68
|
)
|
|
70
69
|
self.bucket_name = f"agentengine-{account_id}-{region}"
|
|
71
|
-
|
|
70
|
+
|
|
72
71
|
self.custom_domain = None # 可选的自定义域名
|
|
73
72
|
|
|
74
73
|
def get_endpoint(self) -> str:
|
|
@@ -100,8 +99,12 @@ class KS3Uploader:
|
|
|
100
99
|
pass
|
|
101
100
|
|
|
102
101
|
size_mb = file_path.stat().st_size / (1024 * 1024)
|
|
103
|
-
calculated = self.UPLOAD_TIMEOUT_BASE_SECONDS + int(
|
|
104
|
-
|
|
102
|
+
calculated = self.UPLOAD_TIMEOUT_BASE_SECONDS + int(
|
|
103
|
+
size_mb * self.UPLOAD_TIMEOUT_PER_MB_SECONDS
|
|
104
|
+
)
|
|
105
|
+
return min(
|
|
106
|
+
self.UPLOAD_TIMEOUT_MAX_SECONDS, max(self.UPLOAD_CONNECT_TIMEOUT_SECONDS, calculated)
|
|
107
|
+
)
|
|
105
108
|
|
|
106
109
|
def _probe_endpoint_latency(self, host: str) -> Optional[float]:
|
|
107
110
|
started_at = time.monotonic()
|
|
@@ -137,12 +140,16 @@ class KS3Uploader:
|
|
|
137
140
|
if mode == "internal":
|
|
138
141
|
add_candidate(internal_endpoint, "内网")
|
|
139
142
|
add_candidate(public_endpoint, "公网")
|
|
140
|
-
return candidates,
|
|
143
|
+
return candidates, (
|
|
144
|
+
f"强制优先内网 {candidates[0]['host']}" if candidates else "未找到可用 KS3 endpoint"
|
|
145
|
+
)
|
|
141
146
|
|
|
142
147
|
if mode == "public":
|
|
143
148
|
add_candidate(public_endpoint, "公网")
|
|
144
149
|
add_candidate(internal_endpoint, "内网")
|
|
145
|
-
return candidates,
|
|
150
|
+
return candidates, (
|
|
151
|
+
f"强制优先公网 {candidates[0]['host']}" if candidates else "未找到可用 KS3 endpoint"
|
|
152
|
+
)
|
|
146
153
|
|
|
147
154
|
add_candidate(internal_endpoint, "内网")
|
|
148
155
|
add_candidate(public_endpoint, "公网")
|
|
@@ -192,12 +199,24 @@ class KS3Uploader:
|
|
|
192
199
|
bucket_exists = False
|
|
193
200
|
else:
|
|
194
201
|
if "AccessDenied" in error_str or "403" in error_str:
|
|
195
|
-
click.secho(
|
|
196
|
-
|
|
202
|
+
click.secho(
|
|
203
|
+
f" ⚠️ 提示: Bucket '{self.bucket_name}' 名称冲突或无权限访问 (403)。",
|
|
204
|
+
fg="yellow",
|
|
205
|
+
)
|
|
206
|
+
click.secho(
|
|
207
|
+
" 注意: KS3 Bucket 名称在全网范围内是全局唯一的!", fg="yellow"
|
|
208
|
+
)
|
|
197
209
|
click.secho(" 该名称已被其他用户占用,您无法使用。", fg="yellow")
|
|
198
210
|
click.secho(" 👉 解决方案:", fg="cyan")
|
|
199
|
-
click.secho(
|
|
200
|
-
|
|
211
|
+
click.secho(
|
|
212
|
+
" 1. (推荐) 在 .env 中设置 KSYUN_ACCOUNT_ID 为您的账户 ID "
|
|
213
|
+
"(自动生成唯一名称)。",
|
|
214
|
+
fg="cyan",
|
|
215
|
+
)
|
|
216
|
+
click.secho(
|
|
217
|
+
" 2. 或者,在 .env 中设置 KS3_BUCKET 为一个没人用过的唯一名称。",
|
|
218
|
+
fg="cyan",
|
|
219
|
+
)
|
|
201
220
|
raise
|
|
202
221
|
|
|
203
222
|
if not bucket_exists:
|
|
@@ -206,10 +225,20 @@ class KS3Uploader:
|
|
|
206
225
|
click.secho(f" ✓ Bucket 创建成功: {self.bucket_name}", fg="green")
|
|
207
226
|
except Exception as create_err:
|
|
208
227
|
create_err_str = str(create_err)
|
|
209
|
-
if
|
|
210
|
-
|
|
228
|
+
if (
|
|
229
|
+
"Conflict" in create_err_str
|
|
230
|
+
or "409" in create_err_str
|
|
231
|
+
or "BucketAlreadyExists" in create_err_str
|
|
232
|
+
):
|
|
233
|
+
click.secho(
|
|
234
|
+
f" ⚠️ 提示: Bucket '{self.bucket_name}' 名称已被其他用户占用。",
|
|
235
|
+
fg="yellow",
|
|
236
|
+
)
|
|
211
237
|
click.secho(" 注意: KS3 Bucket 名称是全局唯一的。", fg="yellow")
|
|
212
|
-
click.secho(
|
|
238
|
+
click.secho(
|
|
239
|
+
" 👉 解决方法: 修改 .env 中的 KS3_BUCKET,换一个更复杂的名字再试。",
|
|
240
|
+
fg="cyan",
|
|
241
|
+
)
|
|
213
242
|
raise
|
|
214
243
|
|
|
215
244
|
return bucket
|
|
@@ -229,7 +258,7 @@ class KS3Uploader:
|
|
|
229
258
|
return record_dir / f"{safe_key}.ks3resume"
|
|
230
259
|
|
|
231
260
|
def _upload_via_host(self, file_path: Path, object_key: str, host: str) -> bool:
|
|
232
|
-
from ks3.connection import Connection
|
|
261
|
+
from ks3.connection import Connection # type: ignore[import-untyped]
|
|
233
262
|
|
|
234
263
|
ak = os.environ.get("KSYUN_ACCESS_KEY") or os.environ.get("KS3_ACCESS_KEY")
|
|
235
264
|
sk = os.environ.get("KSYUN_SECRET_KEY") or os.environ.get("KS3_SECRET_KEY")
|
|
@@ -299,7 +328,9 @@ class KS3Uploader:
|
|
|
299
328
|
return None
|
|
300
329
|
|
|
301
330
|
click.echo(f" KS3 Endpoint 策略: {selection_summary}")
|
|
302
|
-
click.echo(
|
|
331
|
+
click.echo(
|
|
332
|
+
f" 上传文件: {file_path.name} ({file_path.stat().st_size / (1024 * 1024):.2f} MB)"
|
|
333
|
+
)
|
|
303
334
|
click.echo(f" 上传超时: {self._upload_timeout_seconds(file_path)} 秒")
|
|
304
335
|
|
|
305
336
|
# 临时禁用系统代理 (ClashX 等会导致 KS3 上传走代理而失败)
|
|
@@ -369,17 +400,17 @@ class KS3Uploader:
|
|
|
369
400
|
async def upload_with_url(self, file_path: Path, presigned_url: str) -> bool:
|
|
370
401
|
"""使用预签名 URL 上传文件 (不依赖本地 AK/SK)"""
|
|
371
402
|
import httpx
|
|
372
|
-
|
|
373
|
-
click.echo(
|
|
374
|
-
|
|
403
|
+
|
|
404
|
+
click.echo(" 上传中 (使用预签名 URL)...")
|
|
405
|
+
|
|
375
406
|
try:
|
|
376
407
|
async with httpx.AsyncClient() as client:
|
|
377
|
-
with open(file_path,
|
|
408
|
+
with open(file_path, "rb") as f:
|
|
378
409
|
response = await client.put(
|
|
379
|
-
presigned_url,
|
|
410
|
+
presigned_url,
|
|
380
411
|
content=f.read(),
|
|
381
412
|
headers={"Content-Type": "application/octet-stream"},
|
|
382
|
-
timeout=300.0
|
|
413
|
+
timeout=300.0,
|
|
383
414
|
)
|
|
384
415
|
response.raise_for_status()
|
|
385
416
|
click.secho(" ✓ 上传成功", fg="green")
|
|
@@ -0,0 +1,173 @@
|
|
|
1
|
+
"""System-independent manifest bundles for platform-managed runtimes."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
import hashlib
|
|
6
|
+
import json
|
|
7
|
+
import zipfile
|
|
8
|
+
from pathlib import Path
|
|
9
|
+
from typing import Any
|
|
10
|
+
|
|
11
|
+
import yaml
|
|
12
|
+
|
|
13
|
+
from ksadk.builders.base import BaseBuilder, BuildResult
|
|
14
|
+
|
|
15
|
+
RUNTIME_MANIFEST_SCHEMA = "runtime-manifest/v1"
|
|
16
|
+
_MANIFEST_KEYS = (
|
|
17
|
+
"name",
|
|
18
|
+
"version",
|
|
19
|
+
"framework",
|
|
20
|
+
"artifact_type",
|
|
21
|
+
"runtime",
|
|
22
|
+
"model",
|
|
23
|
+
"models",
|
|
24
|
+
"prompt",
|
|
25
|
+
"skills",
|
|
26
|
+
"mcp_servers",
|
|
27
|
+
"sandbox",
|
|
28
|
+
"approval_mode",
|
|
29
|
+
)
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
class _RuntimeManifestDumper(yaml.SafeDumper):
|
|
33
|
+
"""Keep multi-line prompts readable while preserving deterministic bytes."""
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
def _represent_manifest_string(dumper: yaml.SafeDumper, value: str):
|
|
37
|
+
style = "|" if "\n" in value else None
|
|
38
|
+
return dumper.represent_scalar("tag:yaml.org,2002:str", value, style=style)
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
_RuntimeManifestDumper.add_representer(str, _represent_manifest_string)
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
def serialize_managed_runtime_manifest(manifest: dict[str, Any]) -> bytes:
|
|
45
|
+
"""Serialize the canonical ManagedRuntime manifest used by every client."""
|
|
46
|
+
|
|
47
|
+
return yaml.dump(
|
|
48
|
+
manifest,
|
|
49
|
+
Dumper=_RuntimeManifestDumper,
|
|
50
|
+
allow_unicode=True,
|
|
51
|
+
sort_keys=False,
|
|
52
|
+
default_flow_style=False,
|
|
53
|
+
).encode("utf-8")
|
|
54
|
+
|
|
55
|
+
|
|
56
|
+
class ManagedRuntimeBuilder(BaseBuilder):
|
|
57
|
+
"""Build a deterministic YAML-only deployment artifact.
|
|
58
|
+
|
|
59
|
+
Runtime dependencies and local credentials intentionally never enter this
|
|
60
|
+
artifact. The managed runtime image supplies executable dependencies while
|
|
61
|
+
AgentEngine injects deployment-time credentials.
|
|
62
|
+
"""
|
|
63
|
+
|
|
64
|
+
def __init__(
|
|
65
|
+
self,
|
|
66
|
+
project_dir: Path,
|
|
67
|
+
config: dict[str, Any] | None = None,
|
|
68
|
+
*,
|
|
69
|
+
runtime_version: str | None = None,
|
|
70
|
+
) -> None:
|
|
71
|
+
super().__init__(project_dir, config)
|
|
72
|
+
self.runtime_version = str(runtime_version or "").strip()
|
|
73
|
+
self.build_dir = self.project_dir / ".agentengine" / "managed_runtime"
|
|
74
|
+
|
|
75
|
+
def build(self) -> BuildResult:
|
|
76
|
+
# An explicitly supplied snapshot is authoritative. Studio can keep
|
|
77
|
+
# more than one Agent manifest in a workspace, so falling back to the
|
|
78
|
+
# root agentengine.yaml here would silently build the wrong Agent.
|
|
79
|
+
config = dict(self.config) if self.config else self._load_config()
|
|
80
|
+
error = self._validate_config(config)
|
|
81
|
+
if error:
|
|
82
|
+
return BuildResult(success=False, error_message=error)
|
|
83
|
+
|
|
84
|
+
runtime = dict(config.get("runtime") or {})
|
|
85
|
+
version = self.runtime_version or str(runtime.get("version") or "").strip()
|
|
86
|
+
if not version:
|
|
87
|
+
return BuildResult(
|
|
88
|
+
success=False,
|
|
89
|
+
error_message=(
|
|
90
|
+
"ManagedRuntime 构建需要已解析的 runtime.version;"
|
|
91
|
+
"请显式配置版本或连接 AgentEngine 获取服务端默认版本"
|
|
92
|
+
),
|
|
93
|
+
)
|
|
94
|
+
|
|
95
|
+
runtime_name = str(runtime.get("name") or config.get("framework") or "").strip().lower()
|
|
96
|
+
runtime = {"name": runtime_name, "version": version}
|
|
97
|
+
manifest = self._normalized_manifest(config, runtime)
|
|
98
|
+
manifest_bytes = serialize_managed_runtime_manifest(manifest)
|
|
99
|
+
manifest_sha256 = hashlib.sha256(manifest_bytes).hexdigest()
|
|
100
|
+
lock = {
|
|
101
|
+
"schema_version": RUNTIME_MANIFEST_SCHEMA,
|
|
102
|
+
"runtime": runtime,
|
|
103
|
+
"manifest_sha256": manifest_sha256,
|
|
104
|
+
}
|
|
105
|
+
lock_bytes = (
|
|
106
|
+
json.dumps(lock, ensure_ascii=False, indent=2, sort_keys=True) + "\n"
|
|
107
|
+
).encode("utf-8")
|
|
108
|
+
|
|
109
|
+
self.build_dir.mkdir(parents=True, exist_ok=True)
|
|
110
|
+
name = str(config.get("name") or self.project_dir.name).strip() or self.project_dir.name
|
|
111
|
+
project_version = str(config.get("version") or "1.0.0").strip() or "1.0.0"
|
|
112
|
+
artifact_path = self.build_dir / f"{name}-{project_version}-runtime.zip"
|
|
113
|
+
self._write_bundle(
|
|
114
|
+
artifact_path,
|
|
115
|
+
{
|
|
116
|
+
"agentengine.yaml": manifest_bytes,
|
|
117
|
+
"runtime-lock.json": lock_bytes,
|
|
118
|
+
},
|
|
119
|
+
)
|
|
120
|
+
return BuildResult(
|
|
121
|
+
success=True,
|
|
122
|
+
artifact_path=artifact_path,
|
|
123
|
+
artifact_size=artifact_path.stat().st_size,
|
|
124
|
+
metadata={
|
|
125
|
+
"agent_name": name,
|
|
126
|
+
"framework": str(config.get("framework") or ""),
|
|
127
|
+
"artifact_type": "ManagedRuntime",
|
|
128
|
+
"runtime_name": runtime_name,
|
|
129
|
+
"runtime_version": version,
|
|
130
|
+
"manifest_sha256": manifest_sha256,
|
|
131
|
+
},
|
|
132
|
+
)
|
|
133
|
+
|
|
134
|
+
@staticmethod
|
|
135
|
+
def _validate_config(config: dict[str, Any]) -> str | None:
|
|
136
|
+
framework = str(config.get("framework") or "").strip().lower()
|
|
137
|
+
artifact_type = str(config.get("artifact_type") or "").strip().lower()
|
|
138
|
+
runtime = config.get("runtime")
|
|
139
|
+
if framework != "codex":
|
|
140
|
+
return "当前 ManagedRuntime v1 仅支持 framework: codex"
|
|
141
|
+
if artifact_type != "managedruntime":
|
|
142
|
+
return "ManagedRuntime 项目必须配置 artifact_type: ManagedRuntime"
|
|
143
|
+
if not isinstance(runtime, dict):
|
|
144
|
+
return "ManagedRuntime 项目必须配置 runtime.name"
|
|
145
|
+
runtime_name = str(runtime.get("name") or "").strip().lower()
|
|
146
|
+
if runtime_name != "codex":
|
|
147
|
+
return "当前 ManagedRuntime v1 仅支持 runtime.name: codex"
|
|
148
|
+
return None
|
|
149
|
+
|
|
150
|
+
@staticmethod
|
|
151
|
+
def _normalized_manifest(
|
|
152
|
+
config: dict[str, Any],
|
|
153
|
+
runtime: dict[str, str],
|
|
154
|
+
) -> dict[str, Any]:
|
|
155
|
+
normalized: dict[str, Any] = {}
|
|
156
|
+
for key in _MANIFEST_KEYS:
|
|
157
|
+
if key == "runtime":
|
|
158
|
+
normalized[key] = runtime
|
|
159
|
+
elif key == "artifact_type":
|
|
160
|
+
normalized[key] = "ManagedRuntime"
|
|
161
|
+
elif key in config:
|
|
162
|
+
normalized[key] = config[key]
|
|
163
|
+
return normalized
|
|
164
|
+
|
|
165
|
+
@staticmethod
|
|
166
|
+
def _write_bundle(path: Path, files: dict[str, bytes]) -> None:
|
|
167
|
+
with zipfile.ZipFile(path, "w", compression=zipfile.ZIP_DEFLATED) as archive:
|
|
168
|
+
for name in sorted(files):
|
|
169
|
+
info = zipfile.ZipInfo(name)
|
|
170
|
+
info.date_time = (1980, 1, 1, 0, 0, 0)
|
|
171
|
+
info.compress_type = zipfile.ZIP_DEFLATED
|
|
172
|
+
info.external_attr = 0o100644 << 16
|
|
173
|
+
archive.writestr(info, files[name])
|