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/common/aicp_env.py
CHANGED
ksadk/common/auth.py
CHANGED
|
@@ -22,11 +22,11 @@ AWS Signature V4 签名认证
|
|
|
22
22
|
response = requests.post(url, auth=auth.get_auth(), headers=headers)
|
|
23
23
|
"""
|
|
24
24
|
|
|
25
|
-
import os
|
|
26
25
|
import logging
|
|
26
|
+
import os
|
|
27
27
|
from typing import Dict, Optional
|
|
28
28
|
|
|
29
|
-
from requests_aws4auth import AWS4Auth
|
|
29
|
+
from requests_aws4auth import AWS4Auth # type: ignore[import-untyped]
|
|
30
30
|
|
|
31
31
|
logger = logging.getLogger(__name__)
|
|
32
32
|
|
ksadk/common/constants.py
CHANGED
|
@@ -3,9 +3,7 @@
|
|
|
3
3
|
"""
|
|
4
4
|
|
|
5
5
|
# Serverless Endpoint (默认内网预发环境)
|
|
6
|
-
DEFAULT_SERVERLESS_ENDPOINT =
|
|
7
|
-
"http://kmr.pre-online.inner.api.ksyun.com"
|
|
8
|
-
)
|
|
6
|
+
DEFAULT_SERVERLESS_ENDPOINT = "http://kmr.pre-online.inner.api.ksyun.com"
|
|
9
7
|
|
|
10
8
|
# KS3 Region 映射表
|
|
11
9
|
# 用户输入的 region (如 cn-beijing-6) -> (外网endpoint, 内网endpoint, region_code)
|
|
@@ -0,0 +1,232 @@
|
|
|
1
|
+
"""KOP (Kingsoft Open Protocol) client — 公共 AICP 控制面调用层。
|
|
2
|
+
|
|
3
|
+
skill / a2a / mcp 等运行时模块通过本层访问 agentengine-server 对外 Action
|
|
4
|
+
(KOP 协议:`{base}/?Action=xxx&Version=xxx` + AWS V4 签名),避免每个模块
|
|
5
|
+
各自实现一遍鉴权 + URL 构造 + header 装配。
|
|
6
|
+
|
|
7
|
+
本层是同步(基于 requests + requests-aws4auth);async 调用方用
|
|
8
|
+
``asyncio.to_thread`` 包裹。AICP 控制面是低频调用,同步足够。
|
|
9
|
+
"""
|
|
10
|
+
|
|
11
|
+
from __future__ import annotations
|
|
12
|
+
|
|
13
|
+
import json
|
|
14
|
+
import logging
|
|
15
|
+
import os
|
|
16
|
+
from typing import Any, Mapping, Optional
|
|
17
|
+
from urllib.parse import urlsplit
|
|
18
|
+
|
|
19
|
+
import requests
|
|
20
|
+
|
|
21
|
+
from ksadk.common.auth import AWSV4Auth
|
|
22
|
+
|
|
23
|
+
logger = logging.getLogger(__name__)
|
|
24
|
+
|
|
25
|
+
DEFAULT_API_VERSION = "2024-06-12"
|
|
26
|
+
DEFAULT_REGION = "cn-beijing-6"
|
|
27
|
+
DEFAULT_SERVICE = "aicp"
|
|
28
|
+
|
|
29
|
+
# 精确匹配 AICP 控制面域名(公网 + 内网 + internal),不接受用户自定义 URL 走签名。
|
|
30
|
+
_AICP_HOSTS = {
|
|
31
|
+
"aicp.api.ksyun.com",
|
|
32
|
+
"aicp.inner.api.ksyun.com",
|
|
33
|
+
"aicp.internal.api.ksyun.com",
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
def is_kop_endpoint(base_url: str) -> bool:
|
|
38
|
+
"""Return True only for exact AICP control-plane hosts.
|
|
39
|
+
|
|
40
|
+
User-controlled URLs must never receive KOP signing headers.
|
|
41
|
+
"""
|
|
42
|
+
host = (urlsplit(base_url or "").hostname or "").lower()
|
|
43
|
+
return host in _AICP_HOSTS
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
class KOPError(RuntimeError):
|
|
47
|
+
"""KOP action 失败(非 2xx 或 Code != 0/200)。"""
|
|
48
|
+
|
|
49
|
+
def __init__(self, *, code: int, message: str, request_id: str = "", action: str = "") -> None:
|
|
50
|
+
super().__init__(f"KOP {action} failed: code={code} message={message}")
|
|
51
|
+
self.code = code
|
|
52
|
+
self.message = message
|
|
53
|
+
self.request_id = request_id
|
|
54
|
+
self.action = action
|
|
55
|
+
|
|
56
|
+
|
|
57
|
+
class KOPClient:
|
|
58
|
+
"""AICP KOP 控制面调用客户端。
|
|
59
|
+
|
|
60
|
+
凭证优先级:构造参数 > KSADK_*_ACCESS_KEY/SECRET_KEY > KSYUN_ACCESS_KEY/SECRET_KEY。
|
|
61
|
+
base_url 为空时按 region 探测默认 AICP(inner 优先,回落 public)。
|
|
62
|
+
非 AICP base_url(如本地 server 直连)走普通 POST,不签名。
|
|
63
|
+
"""
|
|
64
|
+
|
|
65
|
+
def __init__(
|
|
66
|
+
self,
|
|
67
|
+
*,
|
|
68
|
+
base_url: Optional[str] = None,
|
|
69
|
+
access_key: Optional[str] = None,
|
|
70
|
+
secret_key: Optional[str] = None,
|
|
71
|
+
region: Optional[str] = None,
|
|
72
|
+
service: Optional[str] = None,
|
|
73
|
+
api_version: Optional[str] = None,
|
|
74
|
+
account_id: Optional[str] = None,
|
|
75
|
+
service_token: Optional[str] = None,
|
|
76
|
+
timeout: float = 15.0,
|
|
77
|
+
) -> None:
|
|
78
|
+
self.base_url = (base_url or os.getenv("KSADK_A2A_SERVICE_URL") or "").strip().rstrip("/")
|
|
79
|
+
if not self.base_url:
|
|
80
|
+
inner = os.getenv("KSADK_A2A_SERVICE_ENDPOINT", "").strip()
|
|
81
|
+
if inner:
|
|
82
|
+
scheme = os.getenv("KSADK_A2A_SERVICE_SCHEME", "https").strip() or "https"
|
|
83
|
+
self.base_url = f"{scheme}://{inner}".rstrip("/")
|
|
84
|
+
if not self.base_url:
|
|
85
|
+
# 默认探测:内网 inner 优先(runtime 在集群内),回落公网 public。
|
|
86
|
+
self.base_url = self._detect_default_base_url()
|
|
87
|
+
self.region = (
|
|
88
|
+
region
|
|
89
|
+
or os.getenv("KSADK_A2A_SERVICE_REGION")
|
|
90
|
+
or os.getenv("KSYUN_REGION")
|
|
91
|
+
or DEFAULT_REGION
|
|
92
|
+
).strip()
|
|
93
|
+
self.service = (service or DEFAULT_SERVICE).strip()
|
|
94
|
+
self.api_version = (api_version or DEFAULT_API_VERSION).strip()
|
|
95
|
+
self.account_id = (
|
|
96
|
+
account_id
|
|
97
|
+
or os.getenv("KSADK_A2A_ACCOUNT_ID")
|
|
98
|
+
or os.getenv("KSYUN_ACCOUNT_ID")
|
|
99
|
+
or ""
|
|
100
|
+
).strip()
|
|
101
|
+
self.service_token = (
|
|
102
|
+
service_token or os.getenv("KSADK_A2A_SERVICE_TOKEN") or ""
|
|
103
|
+
).strip()
|
|
104
|
+
self.timeout = timeout
|
|
105
|
+
self._kop_mode = is_kop_endpoint(self.base_url)
|
|
106
|
+
ak = (
|
|
107
|
+
access_key
|
|
108
|
+
or os.getenv("KSADK_A2A_ACCESS_KEY")
|
|
109
|
+
or os.getenv("KSYUN_ACCESS_KEY")
|
|
110
|
+
or ""
|
|
111
|
+
).strip()
|
|
112
|
+
sk = (
|
|
113
|
+
secret_key
|
|
114
|
+
or os.getenv("KSADK_A2A_SECRET_KEY")
|
|
115
|
+
or os.getenv("KSYUN_SECRET_KEY")
|
|
116
|
+
or ""
|
|
117
|
+
).strip()
|
|
118
|
+
self._auth = AWSV4Auth(
|
|
119
|
+
access_key_id=ak,
|
|
120
|
+
secret_access_key=sk,
|
|
121
|
+
region=self.region,
|
|
122
|
+
service=self.service,
|
|
123
|
+
)
|
|
124
|
+
self._session: Optional[requests.Session] = None
|
|
125
|
+
|
|
126
|
+
@property
|
|
127
|
+
def is_kop_mode(self) -> bool:
|
|
128
|
+
return self._kop_mode
|
|
129
|
+
|
|
130
|
+
def _session_obj(self) -> requests.Session:
|
|
131
|
+
if self._session is None:
|
|
132
|
+
self._session = requests.Session()
|
|
133
|
+
return self._session
|
|
134
|
+
|
|
135
|
+
def _headers(self, action: str) -> dict[str, str]:
|
|
136
|
+
import uuid
|
|
137
|
+
|
|
138
|
+
headers = {"Accept": "application/json", "Content-Type": "application/json"}
|
|
139
|
+
if self.account_id:
|
|
140
|
+
headers["X-Ksc-Account-Id"] = self.account_id
|
|
141
|
+
if self.service_token:
|
|
142
|
+
headers["Authorization"] = f"Bearer {self.service_token}"
|
|
143
|
+
if self._kop_mode:
|
|
144
|
+
headers["Host"] = urlsplit(self.base_url).netloc
|
|
145
|
+
headers["X-Ksc-Request-Id"] = str(uuid.uuid4())
|
|
146
|
+
headers["X-Ksc-Region"] = self.region
|
|
147
|
+
headers["X-Ksc-Source"] = "ksadk-runtime"
|
|
148
|
+
# 预发环境路由:AICP 据此把请求转发到预发 server(线上 KOP 默认路由到线上 server)。
|
|
149
|
+
logical_region = (os.getenv("KSYUN_REGION") or "").strip().lower()
|
|
150
|
+
if logical_region == "pre-online":
|
|
151
|
+
headers["X-KSC-CUSTOM-SOURCE"] = os.getenv("AGENTENGINE_PRE_CUSTOM_SOURCE", "pre")
|
|
152
|
+
if action:
|
|
153
|
+
headers["X-Action"] = action
|
|
154
|
+
headers["X-Version"] = self.api_version
|
|
155
|
+
return headers
|
|
156
|
+
|
|
157
|
+
def _build_url(self, action: str) -> str:
|
|
158
|
+
if self._kop_mode:
|
|
159
|
+
return f"{self.base_url}/?Action={action}&Version={self.api_version}"
|
|
160
|
+
return f"{self.base_url}/agentengine/api/v1/{action}"
|
|
161
|
+
|
|
162
|
+
def post_action(
|
|
163
|
+
self, action: str, payload: Optional[Mapping[str, Any]] = None
|
|
164
|
+
) -> dict[str, Any]:
|
|
165
|
+
"""POST 一个 KOP Action,返回 Data 字段(已解包信封)。
|
|
166
|
+
|
|
167
|
+
非KOP 模式走 ``/agentengine/api/v1/{action}``;KOP 模式走 ``?Action=&Version=`` + 签名。
|
|
168
|
+
"""
|
|
169
|
+
url = self._build_url(action)
|
|
170
|
+
headers = self._headers(action)
|
|
171
|
+
body = json.dumps(dict(payload or {}), ensure_ascii=False)
|
|
172
|
+
auth = (
|
|
173
|
+
self._auth.get_auth()
|
|
174
|
+
if self._kop_mode and self._auth.is_enabled and not self.service_token
|
|
175
|
+
else None
|
|
176
|
+
)
|
|
177
|
+
try:
|
|
178
|
+
response = self._session_obj().post(
|
|
179
|
+
url,
|
|
180
|
+
data=body.encode("utf-8"),
|
|
181
|
+
headers=headers,
|
|
182
|
+
auth=auth,
|
|
183
|
+
timeout=self.timeout,
|
|
184
|
+
)
|
|
185
|
+
except requests.RequestException as exc:
|
|
186
|
+
raise KOPError(
|
|
187
|
+
code=503,
|
|
188
|
+
message=f"KOP control plane unavailable: {exc}",
|
|
189
|
+
action=action,
|
|
190
|
+
) from exc
|
|
191
|
+
if not 200 <= response.status_code < 300:
|
|
192
|
+
raise KOPError(
|
|
193
|
+
code=response.status_code,
|
|
194
|
+
message=f"KOP HTTP error: {response.text[:200]}",
|
|
195
|
+
action=action,
|
|
196
|
+
)
|
|
197
|
+
try:
|
|
198
|
+
envelope = response.json()
|
|
199
|
+
except ValueError as exc:
|
|
200
|
+
raise KOPError(
|
|
201
|
+
code=response.status_code or 502,
|
|
202
|
+
message="non-JSON response",
|
|
203
|
+
action=action,
|
|
204
|
+
) from exc
|
|
205
|
+
if not isinstance(envelope, dict):
|
|
206
|
+
raise KOPError(
|
|
207
|
+
code=response.status_code or 502,
|
|
208
|
+
message="response not an object",
|
|
209
|
+
action=action,
|
|
210
|
+
)
|
|
211
|
+
code = int(envelope.get("Code") or 0)
|
|
212
|
+
if code and code != 200:
|
|
213
|
+
raise KOPError(
|
|
214
|
+
code=code,
|
|
215
|
+
message=str(envelope.get("Message") or "KOP error"),
|
|
216
|
+
request_id=str(envelope.get("RequestId") or ""),
|
|
217
|
+
action=action,
|
|
218
|
+
)
|
|
219
|
+
data = envelope.get("Data")
|
|
220
|
+
return data if isinstance(data, dict) else {}
|
|
221
|
+
|
|
222
|
+
def _detect_default_base_url(self) -> str:
|
|
223
|
+
"""默认 AICP 地址探测:内网 inner 优先,失败回落公网 public。"""
|
|
224
|
+
inner = "http://aicp.inner.api.ksyun.com"
|
|
225
|
+
public = "https://aicp.api.ksyun.com"
|
|
226
|
+
try:
|
|
227
|
+
import socket
|
|
228
|
+
host = urlsplit(inner).hostname or ""
|
|
229
|
+
socket.create_connection((host, 80), timeout=1).close()
|
|
230
|
+
return inner
|
|
231
|
+
except OSError:
|
|
232
|
+
return public
|
ksadk/common/llm_utils.py
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
"""LLM Utilities"""
|
|
2
2
|
|
|
3
|
-
import os
|
|
4
3
|
import logging
|
|
4
|
+
import os
|
|
5
5
|
|
|
6
6
|
logger = logging.getLogger(__name__)
|
|
7
7
|
|
|
@@ -10,28 +10,32 @@ PUBLIC_ENDPOINT = "https://kspmas.ksyun.com/v1/"
|
|
|
10
10
|
|
|
11
11
|
# Internal Endpoint (Auto-injected by Platform)
|
|
12
12
|
# Note: In most cases, we don't need to hardcode this because the platform injects it.
|
|
13
|
-
# But for
|
|
13
|
+
# But for "smart switching based on public URL", we might need to know
|
|
14
|
+
# what to switch TO,
|
|
14
15
|
# or simply rely on leaving it empty so the platform default takes over?
|
|
15
|
-
#
|
|
16
|
+
#
|
|
16
17
|
# According to user: "OPENAI_BASE_URL 不填会自动选择的" (If empty, it auto-selects).
|
|
17
|
-
#
|
|
18
|
+
# Strategy: If Public URL + Internal Env -> Unset OPENAI_BASE_URL,
|
|
19
|
+
# letting it fall back to the platform default.
|
|
20
|
+
|
|
18
21
|
|
|
19
22
|
def get_smart_openai_env() -> None:
|
|
20
23
|
"""Smartly configure OpenAI Environment Variables.
|
|
21
|
-
|
|
24
|
+
|
|
22
25
|
If it detects that the code is running in a Ksyun Internal Environment (Serverless/KCE)
|
|
23
26
|
AND the OPENAI_BASE_URL is set to the Public Endpoint, it will unset OPENAI_BASE_URL
|
|
24
27
|
to allow the platform's automatic internal endpoint injection to take effect.
|
|
25
|
-
|
|
26
|
-
This prevents network hangs caused by accessing public endpoints from
|
|
28
|
+
|
|
29
|
+
This prevents network hangs caused by accessing public endpoints from
|
|
30
|
+
internal-only environments.
|
|
27
31
|
"""
|
|
28
32
|
base_url = os.environ.get("OPENAI_BASE_URL", "").strip()
|
|
29
|
-
|
|
33
|
+
|
|
30
34
|
# logic 1: Check if it is the Public Endpoint
|
|
31
35
|
# Normalize by removing trailing slash for comparison
|
|
32
36
|
normalized_url = base_url.rstrip("/")
|
|
33
37
|
normalized_public = PUBLIC_ENDPOINT.rstrip("/")
|
|
34
|
-
|
|
38
|
+
|
|
35
39
|
if normalized_url != normalized_public:
|
|
36
40
|
return
|
|
37
41
|
|
|
@@ -41,11 +45,11 @@ def get_smart_openai_env() -> None:
|
|
|
41
45
|
# - K_SERVICE (Injected by Knative/Serverless)
|
|
42
46
|
# - KUBERNETES_SERVICE_HOST (Injected by K8s)
|
|
43
47
|
is_internal = (
|
|
44
|
-
"KSYUN_REGION" in os.environ
|
|
48
|
+
"KSYUN_REGION" in os.environ
|
|
45
49
|
or "K_SERVICE" in os.environ
|
|
46
50
|
or "KUBERNETES_SERVICE_HOST" in os.environ
|
|
47
51
|
)
|
|
48
|
-
|
|
52
|
+
|
|
49
53
|
if is_internal:
|
|
50
54
|
logger.warning(
|
|
51
55
|
f"Detected Public OPENAI_BASE_URL ({base_url}) in Internal Environment. "
|
|
@@ -55,7 +59,7 @@ def get_smart_openai_env() -> None:
|
|
|
55
59
|
# Or explicitly set it to internal generic address if known?
|
|
56
60
|
# User said: "OPENAI_BASE_URL 不填会自动选择". So we unset it.
|
|
57
61
|
del os.environ["OPENAI_BASE_URL"]
|
|
58
|
-
|
|
62
|
+
|
|
59
63
|
# Verify if successful removal
|
|
60
64
|
if "OPENAI_BASE_URL" not in os.environ:
|
|
61
|
-
|
|
65
|
+
logger.info("Successfully switched to Internal Endpoint mode.")
|
ksadk/compat/__init__.py
ADDED
|
@@ -0,0 +1,200 @@
|
|
|
1
|
+
"""Google ADK 多版本兼容层 (goal-00)。
|
|
2
|
+
|
|
3
|
+
ksadk 业务代码**不直接** ``import google.adk``;统一从本模块取符号。
|
|
4
|
+
``google-adk`` 的版本差异只在兼容层内消化,业务代码对版本无感知。
|
|
5
|
+
|
|
6
|
+
版本窗口
|
|
7
|
+
--------
|
|
8
|
+
依赖约束 ``google-adk>=1.34.0,<3.0.0``:
|
|
9
|
+
|
|
10
|
+
- **1.34.x** 是最低支持锚点(不承诺 1.x 全系;1.0 缺 ``google.adk.apps`` 等,代价过大)。
|
|
11
|
+
- **2.x**(当前 2.5.x)是上界内最新主线。
|
|
12
|
+
|
|
13
|
+
实测(2026-07-21, goal-00 探测,解包对比 1.34.3 vs 2.5.0):ksadk 用到的
|
|
14
|
+
全部符号在两个版本**都存在**,差异仅为 2.x 的**向后兼容可选新增**:
|
|
15
|
+
|
|
16
|
+
- ``Runner.run_async`` 2.x 新增可选 ``yield_user_message``(默认 False)。
|
|
17
|
+
- ``RunConfig`` 2.x 新增若干可选字段(``http_options`` / ``telemetry`` /
|
|
18
|
+
``model_input_context`` 等),均为可选,不传不影响。
|
|
19
|
+
- ``App.root_agent`` 2.x 变为可选(1.34 必填);ksadk 始终显式传,两版皆可。
|
|
20
|
+
- ``DatabaseSessionService`` 2.x 新增可选 ``db_engine``(``db_url`` 变可选);
|
|
21
|
+
ksadk 始终传 ``db_url``,两版皆可。
|
|
22
|
+
- ``McpToolset.header_provider`` 2.x 支持 awaitable;ksadk 未用该参数。
|
|
23
|
+
|
|
24
|
+
ksadk 现有调用**不依赖任何 2.x-only 参数**,因此 1.34 与 2.x 对 ksadk 能力对等,
|
|
25
|
+
无需降级 shim。能力降级矩阵的完整文字版见
|
|
26
|
+
``docs/adk-multi-version-compat.md``。
|
|
27
|
+
|
|
28
|
+
使用 2.x-only 新能力的纪律
|
|
29
|
+
--------------------------
|
|
30
|
+
若未来要用某个 2.x 才有的可选参数/符号,**必须**在本层用
|
|
31
|
+
:func:`adk_version_at_least` 判断后再下发,并对 1.34 做显式降级;不允许业务
|
|
32
|
+
代码自行 ``import google.adk`` 探测。
|
|
33
|
+
|
|
34
|
+
加载语义
|
|
35
|
+
--------
|
|
36
|
+
本模块 import 自身**不触发** ``google.adk`` 导入(惰性,PEP 562
|
|
37
|
+
``__getattr__``)。只有真正访问某个符号时才导入对应 ``google.adk`` 子模块;
|
|
38
|
+
未安装 ``google-adk`` 时抛出带安装提示的 :class:`ImportError`,便于
|
|
39
|
+
``memory/adk_tool`` 等调用方捕获并降级为原函数。
|
|
40
|
+
"""
|
|
41
|
+
|
|
42
|
+
from __future__ import annotations
|
|
43
|
+
|
|
44
|
+
from importlib import import_module
|
|
45
|
+
from importlib.metadata import PackageNotFoundError
|
|
46
|
+
from importlib.metadata import version as _dist_version
|
|
47
|
+
from typing import TYPE_CHECKING, Any
|
|
48
|
+
|
|
49
|
+
if TYPE_CHECKING: # pragma: no cover - 仅供 mypy 静态检查,运行时不执行
|
|
50
|
+
pass
|
|
51
|
+
|
|
52
|
+
#: 导出符号名 -> 提供该符号的 google.adk 子模块路径。
|
|
53
|
+
#: 这是 ksadk 全部 google.adk 依赖的唯一登记表;新增依赖先在这里登记。
|
|
54
|
+
_LAZY_SYMBOLS: dict[str, str] = {
|
|
55
|
+
# agents
|
|
56
|
+
"Agent": "google.adk.agents",
|
|
57
|
+
"RunConfig": "google.adk.agents.run_config",
|
|
58
|
+
"StreamingMode": "google.adk.agents.run_config",
|
|
59
|
+
# apps
|
|
60
|
+
"App": "google.adk.apps",
|
|
61
|
+
"ResumabilityConfig": "google.adk.apps",
|
|
62
|
+
# events
|
|
63
|
+
"Event": "google.adk.events.event",
|
|
64
|
+
# memory
|
|
65
|
+
"BaseMemoryService": "google.adk.memory.base_memory_service",
|
|
66
|
+
"SearchMemoryResponse": "google.adk.memory.base_memory_service",
|
|
67
|
+
"MemoryEntry": "google.adk.memory.memory_entry",
|
|
68
|
+
# models
|
|
69
|
+
"LlmResponse": "google.adk.models",
|
|
70
|
+
"LiteLlm": "google.adk.models.lite_llm",
|
|
71
|
+
# runners
|
|
72
|
+
"Runner": "google.adk.runners",
|
|
73
|
+
# sessions
|
|
74
|
+
"BaseSessionService": "google.adk.sessions",
|
|
75
|
+
"InMemorySessionService": "google.adk.sessions",
|
|
76
|
+
"Session": "google.adk.sessions",
|
|
77
|
+
"DatabaseSessionService": "google.adk.sessions",
|
|
78
|
+
"InvocationContext": "google.adk.agents",
|
|
79
|
+
"ToolContext": "google.adk.tools",
|
|
80
|
+
"GetSessionConfig": "google.adk.sessions.base_session_service",
|
|
81
|
+
"ListSessionsResponse": "google.adk.sessions.base_session_service",
|
|
82
|
+
# tools
|
|
83
|
+
"FunctionTool": "google.adk.tools",
|
|
84
|
+
"load_memory": "google.adk.tools",
|
|
85
|
+
"McpTool": "google.adk.tools.mcp_tool.mcp_tool",
|
|
86
|
+
"McpToolset": "google.adk.tools.mcp_tool.mcp_toolset",
|
|
87
|
+
"CheckableMcpHttpClientFactory": "google.adk.tools.mcp_tool.mcp_session_manager",
|
|
88
|
+
"StreamableHTTPConnectionParams": "google.adk.tools.mcp_tool.mcp_session_manager",
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
#: 以模块形式导出的名字 -> 模块路径(如 genai types、需要 monkeypatch 的 lite_llm)。
|
|
92
|
+
_LAZY_MODULES: dict[str, str] = {
|
|
93
|
+
"genai_types": "google.genai.types",
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
_INSTALL_HINT = (
|
|
97
|
+
"google-adk 未安装或版本不在支持窗口 (>=1.34.0,<3.0.0)。" "安装: pip install 'ksadk[adk]'"
|
|
98
|
+
)
|
|
99
|
+
|
|
100
|
+
_ADK_NOT_FOUND = "google-adk 未安装"
|
|
101
|
+
|
|
102
|
+
|
|
103
|
+
def _raise_missing(name: str, exc: BaseException) -> None:
|
|
104
|
+
raise ImportError(f"无法导入 google.adk 符号 {name!r}。{_INSTALL_HINT}") from exc
|
|
105
|
+
|
|
106
|
+
|
|
107
|
+
def __getattr__(name: str) -> Any:
|
|
108
|
+
"""PEP 562 惰性解析:首次访问符号时才导入对应 google.adk 子模块。"""
|
|
109
|
+
if name in _LAZY_SYMBOLS:
|
|
110
|
+
module_path = _LAZY_SYMBOLS[name]
|
|
111
|
+
try:
|
|
112
|
+
module = import_module(module_path)
|
|
113
|
+
except ImportError as exc:
|
|
114
|
+
_raise_missing(name, exc)
|
|
115
|
+
try:
|
|
116
|
+
value = getattr(module, name)
|
|
117
|
+
except AttributeError as exc:
|
|
118
|
+
raise ImportError(
|
|
119
|
+
f"google.adk 已安装但 {module_path} 缺少 {name!r};"
|
|
120
|
+
f"当前版本 {adk_version() or '未知'} 可能不在支持窗口 (>=1.34.0,<3.0.0)。"
|
|
121
|
+
) from exc
|
|
122
|
+
# 注意: 刻意不缓存到 globals()。测试常 monkeypatch ``google.adk.*``
|
|
123
|
+
# 子模块符号(如把 Runner 换成 FakeRunner);若在此缓存,会把某次 patch
|
|
124
|
+
# 后的值泄漏给后续解析,造成跨测试污染。每次经 getattr 重新解析,
|
|
125
|
+
# 让既有 ``google.adk.*`` patch 点继续生效。开销可忽略(import_module
|
|
126
|
+
# 命中 sys.modules 缓存)。
|
|
127
|
+
return value
|
|
128
|
+
if name in _LAZY_MODULES:
|
|
129
|
+
module_path = _LAZY_MODULES[name]
|
|
130
|
+
try:
|
|
131
|
+
value = import_module(module_path)
|
|
132
|
+
except ImportError as exc:
|
|
133
|
+
_raise_missing(name, exc)
|
|
134
|
+
return value
|
|
135
|
+
raise AttributeError(f"module {__name__!r} has no attribute {name!r}")
|
|
136
|
+
|
|
137
|
+
|
|
138
|
+
def __dir__() -> list[str]:
|
|
139
|
+
return sorted(set(globals()) | set(_LAZY_SYMBOLS) | set(_LAZY_MODULES))
|
|
140
|
+
|
|
141
|
+
|
|
142
|
+
def is_adk_available() -> bool:
|
|
143
|
+
"""google-adk 是否可导入(不关心版本)。"""
|
|
144
|
+
try:
|
|
145
|
+
import_module("google.adk")
|
|
146
|
+
except ImportError:
|
|
147
|
+
return False
|
|
148
|
+
return True
|
|
149
|
+
|
|
150
|
+
|
|
151
|
+
def adk_version() -> str | None:
|
|
152
|
+
"""返回已安装的 google-adk 版本;未安装返回 None。"""
|
|
153
|
+
try:
|
|
154
|
+
return _dist_version("google-adk")
|
|
155
|
+
except PackageNotFoundError:
|
|
156
|
+
return None
|
|
157
|
+
|
|
158
|
+
|
|
159
|
+
def adk_version_at_least(min_version: str) -> bool:
|
|
160
|
+
"""已安装 google-adk 版本是否 >= ``min_version``;未安装或无法解析返回 False。
|
|
161
|
+
|
|
162
|
+
用于下发 2.x-only 能力前的版本门禁,例如::
|
|
163
|
+
|
|
164
|
+
if adk_version_at_least("2.0.0"):
|
|
165
|
+
kwargs["yield_user_message"] = True
|
|
166
|
+
"""
|
|
167
|
+
ver = adk_version()
|
|
168
|
+
if ver is None:
|
|
169
|
+
return False
|
|
170
|
+
try:
|
|
171
|
+
from packaging.version import Version
|
|
172
|
+
|
|
173
|
+
return bool(Version(ver) >= Version(min_version))
|
|
174
|
+
except Exception:
|
|
175
|
+
return False
|
|
176
|
+
|
|
177
|
+
|
|
178
|
+
def lite_llm_module() -> Any:
|
|
179
|
+
"""返回 ``google.adk.models.lite_llm`` 模块对象。
|
|
180
|
+
|
|
181
|
+
adk_runner 的 JSON 容错 patch 需要 MonkeyPatch 该模块内的
|
|
182
|
+
``_message_to_generate_content_response``(私有函数),因此需要模块本身
|
|
183
|
+
而非单个符号。未安装 litellm/google-adk 时抛 :class:`ImportError`。
|
|
184
|
+
"""
|
|
185
|
+
try:
|
|
186
|
+
return import_module("google.adk.models.lite_llm")
|
|
187
|
+
except ImportError as exc:
|
|
188
|
+
_raise_missing("google.adk.models.lite_llm", exc)
|
|
189
|
+
|
|
190
|
+
|
|
191
|
+
__all__ = [
|
|
192
|
+
# 版本/能力探测
|
|
193
|
+
"is_adk_available",
|
|
194
|
+
"adk_version",
|
|
195
|
+
"adk_version_at_least",
|
|
196
|
+
"lite_llm_module",
|
|
197
|
+
# 惰性符号
|
|
198
|
+
*_LAZY_SYMBOLS.keys(),
|
|
199
|
+
*_LAZY_MODULES.keys(),
|
|
200
|
+
]
|