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/configs/settings.py
CHANGED
|
@@ -6,32 +6,34 @@ AgentEngine 统一配置管理
|
|
|
6
6
|
|
|
7
7
|
使用方式:
|
|
8
8
|
from ksadk.configs import settings
|
|
9
|
-
|
|
9
|
+
|
|
10
10
|
# 访问模型配置
|
|
11
11
|
print(settings.model.api_key)
|
|
12
12
|
print(settings.model.api_base)
|
|
13
|
-
|
|
14
|
-
#
|
|
15
|
-
print(settings.
|
|
16
|
-
|
|
13
|
+
|
|
14
|
+
# 访问标准 OpenTelemetry 配置
|
|
15
|
+
print(settings.otel.otlp_endpoint)
|
|
16
|
+
|
|
17
17
|
# 访问 Agent 运行时信息
|
|
18
18
|
print(settings.agent.agent_id)
|
|
19
19
|
"""
|
|
20
20
|
|
|
21
|
-
import
|
|
21
|
+
import importlib
|
|
22
22
|
import json
|
|
23
23
|
import logging
|
|
24
|
+
import os
|
|
24
25
|
import time
|
|
25
|
-
from typing import Optional, List, Dict, Any
|
|
26
26
|
from dataclasses import dataclass, field
|
|
27
|
+
from pathlib import Path
|
|
28
|
+
from typing import Any, Dict, List, Optional
|
|
27
29
|
from urllib.parse import urlsplit, urlunsplit
|
|
28
30
|
|
|
29
31
|
logger = logging.getLogger(__name__)
|
|
30
32
|
|
|
31
33
|
|
|
32
|
-
def _get_env(*keys: str, default: str = None) -> Optional[str]:
|
|
34
|
+
def _get_env(*keys: str, default: Optional[str] = None) -> Optional[str]:
|
|
33
35
|
"""从多个环境变量 key 中获取第一个存在的值
|
|
34
|
-
|
|
36
|
+
|
|
35
37
|
按优先级顺序匹配,支持别名兼容。
|
|
36
38
|
"""
|
|
37
39
|
for key in keys:
|
|
@@ -69,44 +71,45 @@ def _is_public_kspmas_url(url: Optional[str]) -> bool:
|
|
|
69
71
|
|
|
70
72
|
def check_endpoint_reachable(host: str, port: int = 80, timeout: float = 1.0) -> bool:
|
|
71
73
|
"""检测指定端点是否可达
|
|
72
|
-
|
|
74
|
+
|
|
73
75
|
通用函数,可用于检测任意服务的内网地址是否可达。
|
|
74
76
|
结果会被缓存,相同 host 只检测一次。
|
|
75
|
-
|
|
77
|
+
|
|
76
78
|
Args:
|
|
77
79
|
host: 主机名或 IP 地址
|
|
78
80
|
port: 端口号 (默认 80)
|
|
79
81
|
timeout: 超时时间 (默认 1.0 秒)
|
|
80
|
-
|
|
82
|
+
|
|
81
83
|
Returns:
|
|
82
84
|
True 如果可达, False 否则
|
|
83
|
-
|
|
85
|
+
|
|
84
86
|
Usage:
|
|
85
87
|
# KSPMAS 内网检测
|
|
86
88
|
if check_endpoint_reachable("kspmas-internal.sdns.ksyun.com"):
|
|
87
89
|
api_base = "http://kspmas-internal.sdns.ksyun.com/v1"
|
|
88
|
-
|
|
90
|
+
|
|
89
91
|
# KS3 内网检测
|
|
90
92
|
if check_endpoint_reachable("ks3-cn-beijing-internal.ksyuncs.com"):
|
|
91
93
|
ks3_endpoint = "http://ks3-cn-beijing-internal.ksyuncs.com"
|
|
92
94
|
"""
|
|
93
95
|
if host in _endpoint_cache:
|
|
94
96
|
return _endpoint_cache[host]
|
|
95
|
-
|
|
97
|
+
|
|
96
98
|
try:
|
|
97
99
|
import socket
|
|
100
|
+
|
|
98
101
|
# 尝试建立 TCP 连接 (比 ping 更可靠,且不依赖 ICMP)
|
|
99
102
|
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
|
|
100
103
|
s.settimeout(timeout)
|
|
101
104
|
s.connect((host, port))
|
|
102
105
|
s.close()
|
|
103
|
-
|
|
106
|
+
|
|
104
107
|
_endpoint_cache[host] = True
|
|
105
108
|
logger.debug(f"Endpoint reachable: {host}:{port}")
|
|
106
109
|
except (socket.timeout, socket.error, OSError):
|
|
107
110
|
_endpoint_cache[host] = False
|
|
108
111
|
logger.debug(f"Endpoint not reachable: {host}:{port}")
|
|
109
|
-
|
|
112
|
+
|
|
110
113
|
return _endpoint_cache[host]
|
|
111
114
|
|
|
112
115
|
|
|
@@ -125,13 +128,13 @@ DEFAULT_MODEL_NAME = "glm-5.2"
|
|
|
125
128
|
|
|
126
129
|
def optimize_kspmas_url(url: str) -> str:
|
|
127
130
|
"""优化 KSPMAS URL
|
|
128
|
-
|
|
131
|
+
|
|
129
132
|
如果是 KSPMAS 的公网地址,且检测到内网可达(或在 Serverless 环境),
|
|
130
133
|
将其替换为内网地址以提高速度和稳定性。
|
|
131
134
|
"""
|
|
132
135
|
if not url:
|
|
133
136
|
return url
|
|
134
|
-
|
|
137
|
+
|
|
135
138
|
parsed = urlsplit(url)
|
|
136
139
|
if parsed.hostname != "kspmas.ksyun.com":
|
|
137
140
|
return url
|
|
@@ -147,13 +150,13 @@ def optimize_kspmas_url(url: str) -> str:
|
|
|
147
150
|
if parsed.port:
|
|
148
151
|
netloc = f"{netloc}:{parsed.port}"
|
|
149
152
|
return urlunsplit(("http", netloc, parsed.path, parsed.query, parsed.fragment))
|
|
150
|
-
|
|
153
|
+
|
|
151
154
|
return url
|
|
152
155
|
|
|
153
156
|
|
|
154
157
|
def get_kspmas_api_base() -> str:
|
|
155
158
|
"""获取 KSPMAS 模型服务的 API Base URL
|
|
156
|
-
|
|
159
|
+
|
|
157
160
|
自动检测内网可达性,优先使用内网地址。
|
|
158
161
|
**特殊逻辑**: 如果在 Serverless 托管环境 (AGENT_RUNTIME_ID 存在),强制使用内网地址。
|
|
159
162
|
"""
|
|
@@ -164,7 +167,7 @@ def get_kspmas_api_base() -> str:
|
|
|
164
167
|
# 2. 自动检测内网可达性
|
|
165
168
|
if check_endpoint_reachable(KSPMAS_INTERNAL_HOST):
|
|
166
169
|
return KSPMAS_INTERNAL_URL
|
|
167
|
-
|
|
170
|
+
|
|
168
171
|
# 3. 默认使用公网
|
|
169
172
|
return KSPMAS_PUBLIC_URL
|
|
170
173
|
|
|
@@ -173,82 +176,83 @@ def get_kspmas_api_base() -> str:
|
|
|
173
176
|
# 模型配置 (LLM)
|
|
174
177
|
# =============================================================================
|
|
175
178
|
|
|
179
|
+
|
|
176
180
|
@dataclass
|
|
177
181
|
class ModelConfig:
|
|
178
182
|
"""模型配置
|
|
179
|
-
|
|
183
|
+
|
|
180
184
|
标准环境变量 (优先):
|
|
181
185
|
OPENAI_API_KEY - API Key (OpenAI 标准)
|
|
182
186
|
OPENAI_BASE_URL - API Base URL (OpenAI 标准)
|
|
183
187
|
OPENAI_MODEL_NAME - 模型名称
|
|
184
|
-
|
|
188
|
+
|
|
185
189
|
通用格式:
|
|
186
190
|
MODEL_NAME - 模型名称
|
|
187
|
-
|
|
191
|
+
|
|
188
192
|
Serverless 平台兼容:
|
|
189
193
|
LLM_API_KEY - 模型 API Key
|
|
190
194
|
LLM_API_BASE - 模型 API 地址
|
|
191
195
|
LLM_MODEL - 模型名称
|
|
192
|
-
|
|
196
|
+
|
|
193
197
|
别名 (兼容):
|
|
194
198
|
OPENAI_API_BASE - API Base URL 别名
|
|
195
|
-
|
|
199
|
+
|
|
196
200
|
默认值:
|
|
197
201
|
OPENAI_BASE_URL: 自动检测内网/外网,使用金山云模型服务
|
|
198
202
|
MODEL_NAME: glm-5.2
|
|
199
203
|
"""
|
|
200
|
-
|
|
204
|
+
|
|
201
205
|
@property
|
|
202
206
|
def api_key(self) -> Optional[str]:
|
|
203
207
|
"""获取模型 API Key"""
|
|
204
208
|
return _get_env(
|
|
205
|
-
"OPENAI_API_KEY",
|
|
206
|
-
"LLM_API_KEY",
|
|
207
|
-
"MODEL_API_KEY",
|
|
209
|
+
"OPENAI_API_KEY", # OpenAI 标准 (优先)
|
|
210
|
+
"LLM_API_KEY", # Serverless 平台兼容
|
|
211
|
+
"MODEL_API_KEY", # 通用
|
|
208
212
|
)
|
|
209
|
-
|
|
213
|
+
|
|
210
214
|
@property
|
|
211
215
|
def api_base(self) -> str:
|
|
212
216
|
"""获取模型 API Base URL
|
|
213
|
-
|
|
217
|
+
|
|
214
218
|
如果未配置,默认使用金山云模型服务地址(自动检测内网)。
|
|
215
219
|
如果已配置且为 KSPMAS 公网地址,也会尝试优化为内网地址。
|
|
216
220
|
"""
|
|
217
221
|
configured = _get_env(
|
|
218
|
-
"OPENAI_BASE_URL",
|
|
219
|
-
"OPENAI_API_BASE",
|
|
220
|
-
"LLM_API_BASE",
|
|
221
|
-
"MODEL_API_BASE",
|
|
222
|
+
"OPENAI_BASE_URL", # OpenAI 标准 (优先)
|
|
223
|
+
"OPENAI_API_BASE", # OpenAI 别名 (兼容)
|
|
224
|
+
"LLM_API_BASE", # Serverless 平台兼容
|
|
225
|
+
"MODEL_API_BASE", # 通用
|
|
222
226
|
)
|
|
223
|
-
|
|
227
|
+
|
|
224
228
|
if configured:
|
|
225
229
|
return optimize_kspmas_url(configured)
|
|
226
|
-
|
|
230
|
+
|
|
227
231
|
return get_kspmas_api_base()
|
|
228
|
-
|
|
232
|
+
|
|
229
233
|
@property
|
|
230
234
|
def model_name(self) -> str:
|
|
231
235
|
"""获取模型名称
|
|
232
|
-
|
|
236
|
+
|
|
233
237
|
如果未配置,默认使用 glm-5.2。
|
|
234
238
|
"""
|
|
235
239
|
configured = _get_env(
|
|
236
|
-
"OPENAI_MODEL_NAME",
|
|
237
|
-
"MODEL_NAME",
|
|
238
|
-
"LLM_MODEL",
|
|
240
|
+
"OPENAI_MODEL_NAME", # OpenAI 格式 (优先)
|
|
241
|
+
"MODEL_NAME", # 通用
|
|
242
|
+
"LLM_MODEL", # Serverless 平台兼容
|
|
239
243
|
)
|
|
240
244
|
return configured or DEFAULT_MODEL_NAME
|
|
241
|
-
|
|
245
|
+
|
|
242
246
|
@property
|
|
243
247
|
def is_configured(self) -> bool:
|
|
244
248
|
"""是否已配置 API Key"""
|
|
245
249
|
return bool(self.api_key)
|
|
246
|
-
|
|
250
|
+
|
|
247
251
|
@property
|
|
248
252
|
def is_using_internal_network(self) -> bool:
|
|
249
253
|
"""是否使用内网地址"""
|
|
250
254
|
return KSPMAS_INTERNAL_URL in self.api_base
|
|
251
|
-
|
|
255
|
+
|
|
252
256
|
def to_dict(self) -> dict:
|
|
253
257
|
"""转换为字典 (用于 LiteLLM 等)"""
|
|
254
258
|
result = {}
|
|
@@ -259,81 +263,19 @@ class ModelConfig:
|
|
|
259
263
|
return result
|
|
260
264
|
|
|
261
265
|
|
|
262
|
-
# =============================================================================
|
|
263
|
-
# Langfuse 配置
|
|
264
|
-
# =============================================================================
|
|
265
|
-
|
|
266
|
-
@dataclass
|
|
267
|
-
class LangfuseConfig:
|
|
268
|
-
"""Langfuse 可观测性配置
|
|
269
|
-
|
|
270
|
-
标准环境变量 (Langfuse 官方):
|
|
271
|
-
LANGFUSE_PUBLIC_KEY - API Public Key
|
|
272
|
-
LANGFUSE_SECRET_KEY - API Secret Key
|
|
273
|
-
LANGFUSE_HOST - Langfuse 服务地址
|
|
274
|
-
|
|
275
|
-
Serverless 平台扩展:
|
|
276
|
-
LANGFUSE_PROJECT_ID - 项目 ID (区分用户)
|
|
277
|
-
LANGCHAIN_TRACING_V2 - 启用 LangChain 追踪
|
|
278
|
-
"""
|
|
279
|
-
|
|
280
|
-
@property
|
|
281
|
-
def public_key(self) -> Optional[str]:
|
|
282
|
-
return os.getenv("LANGFUSE_PUBLIC_KEY")
|
|
283
|
-
|
|
284
|
-
@property
|
|
285
|
-
def secret_key(self) -> Optional[str]:
|
|
286
|
-
return os.getenv("LANGFUSE_SECRET_KEY")
|
|
287
|
-
|
|
288
|
-
@property
|
|
289
|
-
def host(self) -> str:
|
|
290
|
-
return _get_env(
|
|
291
|
-
"LANGFUSE_HOST",
|
|
292
|
-
"LANGFUSE_BASE_URL",
|
|
293
|
-
default="http://localhost:3000"
|
|
294
|
-
)
|
|
295
|
-
|
|
296
|
-
@property
|
|
297
|
-
def project_id(self) -> Optional[str]:
|
|
298
|
-
"""Langfuse 项目 ID (Serverless 平台扩展)"""
|
|
299
|
-
return os.getenv("LANGFUSE_PROJECT_ID")
|
|
300
|
-
|
|
301
|
-
@property
|
|
302
|
-
def tracing_enabled(self) -> bool:
|
|
303
|
-
"""是否启用 LangChain tracing"""
|
|
304
|
-
return os.getenv("LANGCHAIN_TRACING_V2", "").lower() == "true"
|
|
305
|
-
|
|
306
|
-
@property
|
|
307
|
-
def is_enabled(self) -> bool:
|
|
308
|
-
"""是否启用 Langfuse (有 public_key 就启用)"""
|
|
309
|
-
return bool(self.public_key)
|
|
310
|
-
|
|
311
|
-
@property
|
|
312
|
-
def is_configured(self) -> bool:
|
|
313
|
-
"""是否完整配置"""
|
|
314
|
-
return bool(self.public_key and self.secret_key)
|
|
315
|
-
|
|
316
|
-
def to_dict(self) -> dict:
|
|
317
|
-
"""转换为字典"""
|
|
318
|
-
return {
|
|
319
|
-
"public_key": self.public_key,
|
|
320
|
-
"secret_key": self.secret_key,
|
|
321
|
-
"host": self.host,
|
|
322
|
-
}
|
|
323
|
-
|
|
324
|
-
|
|
325
266
|
# =============================================================================
|
|
326
267
|
# Agent 配置
|
|
327
268
|
# =============================================================================
|
|
328
269
|
|
|
270
|
+
|
|
329
271
|
@dataclass
|
|
330
272
|
class AgentConfig:
|
|
331
273
|
"""Agent 配置
|
|
332
|
-
|
|
274
|
+
|
|
333
275
|
标准环境变量 (OpenTelemetry 兼容):
|
|
334
276
|
OTEL_SERVICE_NAME - 服务名称 (映射到 agent_name)
|
|
335
277
|
OTEL_RESOURCE_ATTRIBUTES - 资源属性 (key=value 格式)
|
|
336
|
-
|
|
278
|
+
|
|
337
279
|
通用环境变量:
|
|
338
280
|
AGENT_ID - Agent 唯一 ID
|
|
339
281
|
AGENT_NAME - Agent 名称
|
|
@@ -341,70 +283,70 @@ class AgentConfig:
|
|
|
341
283
|
USER_ID - 用户 ID
|
|
342
284
|
ENVIRONMENT - 运行环境 (dev/staging/prod)
|
|
343
285
|
VERSION - 版本号
|
|
344
|
-
|
|
286
|
+
|
|
345
287
|
Serverless 平台兼容:
|
|
346
288
|
AGENT_RUNTIME_ID - Agent 唯一 ID
|
|
347
289
|
AGENT_RUNTIME_NAME - Agent 名称
|
|
348
290
|
ACCOUNT_ID - 账户 ID (租户)
|
|
349
291
|
"""
|
|
350
|
-
|
|
292
|
+
|
|
351
293
|
@property
|
|
352
294
|
def agent_id(self) -> Optional[str]:
|
|
353
295
|
"""Agent 唯一 ID"""
|
|
354
296
|
return _get_env(
|
|
355
|
-
"AGENT_ID",
|
|
356
|
-
"AGENT_RUNTIME_ID",
|
|
297
|
+
"AGENT_ID", # 通用 (优先)
|
|
298
|
+
"AGENT_RUNTIME_ID", # Serverless 平台兼容
|
|
357
299
|
)
|
|
358
|
-
|
|
300
|
+
|
|
359
301
|
@property
|
|
360
302
|
def agent_name(self) -> Optional[str]:
|
|
361
303
|
"""Agent 名称"""
|
|
362
304
|
return _get_env(
|
|
363
|
-
"AGENT_NAME",
|
|
364
|
-
"AGENT_RUNTIME_NAME",
|
|
365
|
-
"OTEL_SERVICE_NAME",
|
|
305
|
+
"AGENT_NAME", # 通用 (优先)
|
|
306
|
+
"AGENT_RUNTIME_NAME", # Serverless 平台兼容
|
|
307
|
+
"OTEL_SERVICE_NAME", # OpenTelemetry 标准
|
|
366
308
|
)
|
|
367
|
-
|
|
309
|
+
|
|
368
310
|
@property
|
|
369
311
|
def tenant_id(self) -> Optional[str]:
|
|
370
312
|
"""租户 ID"""
|
|
371
313
|
return _get_env(
|
|
372
|
-
"TENANT_ID",
|
|
373
|
-
"ACCOUNT_ID",
|
|
314
|
+
"TENANT_ID", # 通用 (优先)
|
|
315
|
+
"ACCOUNT_ID", # Serverless 平台兼容
|
|
374
316
|
)
|
|
375
|
-
|
|
317
|
+
|
|
376
318
|
@property
|
|
377
319
|
def user_id(self) -> Optional[str]:
|
|
378
320
|
"""用户 ID"""
|
|
379
321
|
return os.getenv("USER_ID")
|
|
380
|
-
|
|
322
|
+
|
|
381
323
|
@property
|
|
382
324
|
def session_id(self) -> Optional[str]:
|
|
383
325
|
"""会话 ID (用于 Langfuse Sessions 功能)"""
|
|
384
326
|
return os.getenv("SESSION_ID")
|
|
385
|
-
|
|
327
|
+
|
|
386
328
|
@property
|
|
387
329
|
def environment(self) -> Optional[str]:
|
|
388
330
|
"""运行环境 (dev/staging/prod)"""
|
|
389
331
|
return os.getenv("ENVIRONMENT")
|
|
390
|
-
|
|
332
|
+
|
|
391
333
|
@property
|
|
392
334
|
def version(self) -> Optional[str]:
|
|
393
335
|
"""Agent 版本"""
|
|
394
336
|
return os.getenv("VERSION")
|
|
395
|
-
|
|
337
|
+
|
|
396
338
|
@property
|
|
397
339
|
def tags(self) -> Optional[List[str]]:
|
|
398
340
|
"""标签列表 (逗号分隔)"""
|
|
399
341
|
tags_str = os.getenv("TAGS", "")
|
|
400
342
|
tags = [t.strip() for t in tags_str.split(",") if t.strip()]
|
|
401
343
|
return tags if tags else None
|
|
402
|
-
|
|
344
|
+
|
|
403
345
|
@property
|
|
404
346
|
def extra_metadata(self) -> Optional[Dict[str, Any]]:
|
|
405
347
|
"""额外的元数据"""
|
|
406
348
|
extra = {}
|
|
407
|
-
|
|
349
|
+
|
|
408
350
|
# 1. 解析 JSON 格式的 metadata
|
|
409
351
|
extra_json = os.getenv("METADATA")
|
|
410
352
|
if extra_json:
|
|
@@ -412,7 +354,7 @@ class AgentConfig:
|
|
|
412
354
|
extra.update(json.loads(extra_json))
|
|
413
355
|
except json.JSONDecodeError:
|
|
414
356
|
logger.warning(f"Invalid METADATA JSON: {extra_json}")
|
|
415
|
-
|
|
357
|
+
|
|
416
358
|
# 2. 解析 OTEL_RESOURCE_ATTRIBUTES
|
|
417
359
|
otel_attrs = os.getenv("OTEL_RESOURCE_ATTRIBUTES", "")
|
|
418
360
|
if otel_attrs:
|
|
@@ -421,73 +363,41 @@ class AgentConfig:
|
|
|
421
363
|
key, value = pair.split("=", 1)
|
|
422
364
|
if key not in ("service.name", "service.version"):
|
|
423
365
|
extra[key] = value
|
|
424
|
-
|
|
366
|
+
|
|
425
367
|
return extra if extra else None
|
|
426
|
-
|
|
368
|
+
|
|
427
369
|
@property
|
|
428
370
|
def is_configured(self) -> bool:
|
|
429
371
|
"""是否有 Agent 信息"""
|
|
430
372
|
return bool(self.agent_id or self.agent_name)
|
|
431
|
-
|
|
432
|
-
# ------------------
|
|
433
|
-
# Langfuse 集成方法
|
|
434
|
-
# ------------------
|
|
435
|
-
|
|
436
|
-
def to_langfuse_params(self) -> dict:
|
|
437
|
-
"""转换为 Langfuse trace() 方法的原生参数"""
|
|
438
|
-
params = {}
|
|
439
|
-
if self.session_id:
|
|
440
|
-
params["session_id"] = self.session_id
|
|
441
|
-
if self.user_id:
|
|
442
|
-
params["user_id"] = self.user_id
|
|
443
|
-
if self.tags:
|
|
444
|
-
params["tags"] = self.tags
|
|
445
|
-
if self.version:
|
|
446
|
-
params["version"] = self.version
|
|
447
|
-
return params
|
|
448
|
-
|
|
449
|
-
def to_langfuse_metadata(self) -> dict:
|
|
450
|
-
"""转换为 Langfuse metadata 字段"""
|
|
451
|
-
metadata = {}
|
|
452
|
-
if self.agent_id:
|
|
453
|
-
metadata["agent_id"] = self.agent_id
|
|
454
|
-
if self.agent_name:
|
|
455
|
-
metadata["agent_name"] = self.agent_name
|
|
456
|
-
if self.tenant_id:
|
|
457
|
-
metadata["tenant_id"] = self.tenant_id
|
|
458
|
-
if self.environment:
|
|
459
|
-
metadata["environment"] = self.environment
|
|
460
|
-
if self.extra_metadata:
|
|
461
|
-
metadata.update(self.extra_metadata)
|
|
462
|
-
return metadata
|
|
463
|
-
|
|
464
373
|
|
|
465
374
|
# =============================================================================
|
|
466
375
|
# 金山云配置
|
|
467
376
|
# =============================================================================
|
|
468
377
|
|
|
378
|
+
|
|
469
379
|
@dataclass
|
|
470
380
|
class KingsoftCloudConfig:
|
|
471
381
|
"""金山云 SDK 配置
|
|
472
|
-
|
|
382
|
+
|
|
473
383
|
环境变量:
|
|
474
384
|
KS_ACCESS_KEY_ID - Access Key ID
|
|
475
385
|
KS_SECRET_ACCESS_KEY - Secret Access Key
|
|
476
386
|
KS_REGION - 区域 (默认 cn-beijing-6)
|
|
477
387
|
"""
|
|
478
|
-
|
|
388
|
+
|
|
479
389
|
@property
|
|
480
390
|
def access_key_id(self) -> Optional[str]:
|
|
481
391
|
return os.getenv("KS_ACCESS_KEY_ID")
|
|
482
|
-
|
|
392
|
+
|
|
483
393
|
@property
|
|
484
394
|
def secret_access_key(self) -> Optional[str]:
|
|
485
395
|
return os.getenv("KS_SECRET_ACCESS_KEY")
|
|
486
|
-
|
|
396
|
+
|
|
487
397
|
@property
|
|
488
398
|
def region(self) -> str:
|
|
489
399
|
return os.getenv("KS_REGION", "cn-beijing-6")
|
|
490
|
-
|
|
400
|
+
|
|
491
401
|
@property
|
|
492
402
|
def is_configured(self) -> bool:
|
|
493
403
|
"""是否已配置"""
|
|
@@ -498,23 +408,24 @@ class KingsoftCloudConfig:
|
|
|
498
408
|
# Code 模式配置
|
|
499
409
|
# =============================================================================
|
|
500
410
|
|
|
411
|
+
|
|
501
412
|
@dataclass
|
|
502
413
|
class CodeModeConfig:
|
|
503
414
|
"""Code 模式配置 (Serverless 平台)
|
|
504
|
-
|
|
415
|
+
|
|
505
416
|
环境变量:
|
|
506
417
|
PYTHONPATH - Python 模块路径
|
|
507
418
|
CODE_PATH - 代码目录
|
|
508
419
|
"""
|
|
509
|
-
|
|
420
|
+
|
|
510
421
|
@property
|
|
511
422
|
def python_path(self) -> Optional[str]:
|
|
512
423
|
return os.getenv("PYTHONPATH")
|
|
513
|
-
|
|
424
|
+
|
|
514
425
|
@property
|
|
515
426
|
def code_path(self) -> Optional[str]:
|
|
516
427
|
return os.getenv("CODE_PATH")
|
|
517
|
-
|
|
428
|
+
|
|
518
429
|
@property
|
|
519
430
|
def is_code_mode(self) -> bool:
|
|
520
431
|
"""是否为 Code 模式"""
|
|
@@ -525,41 +436,42 @@ class CodeModeConfig:
|
|
|
525
436
|
# OpenTelemetry 配置
|
|
526
437
|
# =============================================================================
|
|
527
438
|
|
|
439
|
+
|
|
528
440
|
@dataclass
|
|
529
441
|
class OTelConfig:
|
|
530
442
|
"""OpenTelemetry 配置 (标准环境变量)
|
|
531
|
-
|
|
443
|
+
|
|
532
444
|
环境变量:
|
|
533
445
|
OTEL_SERVICE_NAME - 服务名称
|
|
534
446
|
OTEL_RESOURCE_ATTRIBUTES - 资源属性 (key=value,key2=value2)
|
|
535
447
|
OTEL_EXPORTER_OTLP_ENDPOINT - OTLP 导出端点
|
|
536
448
|
"""
|
|
537
|
-
|
|
449
|
+
|
|
538
450
|
@property
|
|
539
451
|
def service_name(self) -> Optional[str]:
|
|
540
452
|
return os.getenv("OTEL_SERVICE_NAME")
|
|
541
|
-
|
|
453
|
+
|
|
542
454
|
@property
|
|
543
455
|
def resource_attributes(self) -> Optional[Dict[str, str]]:
|
|
544
456
|
"""解析 OTEL_RESOURCE_ATTRIBUTES"""
|
|
545
457
|
attrs_str = os.getenv("OTEL_RESOURCE_ATTRIBUTES", "")
|
|
546
458
|
if not attrs_str:
|
|
547
459
|
return None
|
|
548
|
-
|
|
460
|
+
|
|
549
461
|
attrs = {}
|
|
550
462
|
for pair in attrs_str.split(","):
|
|
551
463
|
if "=" in pair:
|
|
552
464
|
key, value = pair.split("=", 1)
|
|
553
465
|
attrs[key] = value
|
|
554
466
|
return attrs if attrs else None
|
|
555
|
-
|
|
467
|
+
|
|
556
468
|
@property
|
|
557
469
|
def otlp_endpoint(self) -> Optional[str]:
|
|
558
470
|
return _get_env(
|
|
559
471
|
"OTEL_EXPORTER_OTLP_ENDPOINT",
|
|
560
472
|
"OTEL_EXPORTER_OTLP_TRACES_ENDPOINT",
|
|
561
473
|
)
|
|
562
|
-
|
|
474
|
+
|
|
563
475
|
@property
|
|
564
476
|
def is_enabled(self) -> bool:
|
|
565
477
|
"""是否启用 OTLP 导出"""
|
|
@@ -570,45 +482,49 @@ class OTelConfig:
|
|
|
570
482
|
# 统一配置入口
|
|
571
483
|
# =============================================================================
|
|
572
484
|
|
|
485
|
+
|
|
573
486
|
@dataclass
|
|
574
487
|
class Settings:
|
|
575
488
|
"""统一配置入口
|
|
576
|
-
|
|
489
|
+
|
|
577
490
|
使用方式:
|
|
578
491
|
from ksadk.configs import settings
|
|
579
|
-
|
|
492
|
+
|
|
580
493
|
# 模型配置
|
|
581
494
|
if settings.model.is_configured:
|
|
582
495
|
llm = LiteLLM(api_key=settings.model.api_key)
|
|
583
|
-
|
|
584
|
-
#
|
|
585
|
-
if settings.
|
|
586
|
-
setup_tracing(
|
|
587
|
-
|
|
496
|
+
|
|
497
|
+
# 标准 OTLP 配置
|
|
498
|
+
if settings.otel.is_enabled:
|
|
499
|
+
setup_tracing()
|
|
500
|
+
|
|
588
501
|
# Agent 信息
|
|
589
502
|
print(settings.agent.agent_id)
|
|
590
503
|
"""
|
|
504
|
+
|
|
591
505
|
model: ModelConfig = field(default_factory=ModelConfig)
|
|
592
|
-
langfuse: LangfuseConfig = field(default_factory=LangfuseConfig)
|
|
593
506
|
agent: AgentConfig = field(default_factory=AgentConfig)
|
|
594
507
|
cloud: KingsoftCloudConfig = field(default_factory=KingsoftCloudConfig)
|
|
595
508
|
code: CodeModeConfig = field(default_factory=CodeModeConfig)
|
|
596
509
|
otel: OTelConfig = field(default_factory=OTelConfig)
|
|
597
|
-
|
|
510
|
+
|
|
598
511
|
def summary(self) -> str:
|
|
599
512
|
"""输出配置摘要"""
|
|
600
513
|
lines = ["AgentEngine Configuration:"]
|
|
601
|
-
lines.append(
|
|
602
|
-
|
|
603
|
-
|
|
514
|
+
lines.append(
|
|
515
|
+
f" Model: {'✅ Configured' if self.model.is_configured else '❌ Not configured'}"
|
|
516
|
+
)
|
|
604
517
|
agent_info = self.agent.agent_id or self.agent.agent_name
|
|
605
518
|
lines.append(f" Agent: {'✅ ' + agent_info if agent_info else '⚪ No info'}")
|
|
606
|
-
|
|
607
|
-
lines.append(
|
|
608
|
-
|
|
519
|
+
|
|
520
|
+
lines.append(
|
|
521
|
+
f" Cloud: {'✅ Configured' if self.cloud.is_configured else '⚪ Not configured'}"
|
|
522
|
+
)
|
|
523
|
+
code_path = self.code.code_path
|
|
524
|
+
lines.append(f" CodeMode: {'✅ ' + code_path if code_path else '⚪ Container mode'}")
|
|
609
525
|
lines.append(f" OTEL: {'✅ Enabled' if self.otel.is_enabled else '⚪ Disabled'}")
|
|
610
526
|
return "\n".join(lines)
|
|
611
|
-
|
|
527
|
+
|
|
612
528
|
def __repr__(self) -> str:
|
|
613
529
|
return self.summary()
|
|
614
530
|
|
|
@@ -624,32 +540,30 @@ settings = Settings()
|
|
|
624
540
|
DEFAULT_RUNTIME_TIMEZONE = "Asia/Shanghai"
|
|
625
541
|
|
|
626
542
|
|
|
627
|
-
def setup_environment(agent_path:
|
|
543
|
+
def setup_environment(agent_path: Path | str):
|
|
628
544
|
"""加载环境变量并注入智能默认配置
|
|
629
|
-
|
|
545
|
+
|
|
630
546
|
1. 加载项目根目录的 .env 文件 (override=True)
|
|
631
547
|
2. 注入 OPENAI_API_BASE (智能检测)
|
|
632
548
|
3. 注入 OPENAI_MODEL_NAME (默认值)
|
|
633
549
|
"""
|
|
634
550
|
import click
|
|
635
|
-
|
|
636
|
-
from pathlib import Path
|
|
551
|
+
|
|
637
552
|
try:
|
|
638
|
-
|
|
553
|
+
dotenv_module = importlib.import_module("dotenv")
|
|
639
554
|
except ImportError:
|
|
640
|
-
|
|
641
|
-
|
|
642
|
-
|
|
555
|
+
dotenv_module = None
|
|
556
|
+
|
|
643
557
|
# 1. 加载 .env
|
|
644
|
-
if
|
|
558
|
+
if dotenv_module is not None:
|
|
645
559
|
# Ensure agent_path is a Path object
|
|
646
560
|
if isinstance(agent_path, str):
|
|
647
561
|
agent_path = Path(agent_path)
|
|
648
|
-
|
|
562
|
+
|
|
649
563
|
env_file = agent_path / ".env"
|
|
650
564
|
if env_file.exists():
|
|
651
565
|
# override=False: 保留通过 API/Serverless 平台注入的环境变量 (优先级高)
|
|
652
|
-
load_dotenv(env_file, override=False)
|
|
566
|
+
dotenv_module.load_dotenv(env_file, override=False)
|
|
653
567
|
|
|
654
568
|
# 本地调试与托管运行时统一默认北京时间;用户通过 shell/.env/平台显式指定 TZ 时不覆盖。
|
|
655
569
|
os.environ.setdefault("TZ", DEFAULT_RUNTIME_TIMEZONE)
|
|
@@ -696,7 +610,7 @@ def setup_environment(agent_path: "Path"):
|
|
|
696
610
|
if not os.getenv("OPENAI_API_BASE"):
|
|
697
611
|
os.environ["OPENAI_API_BASE"] = api_base
|
|
698
612
|
click.echo(f"🔧 API Base: {click.style(api_base, fg='cyan')} (Auto-detected)")
|
|
699
|
-
|
|
613
|
+
|
|
700
614
|
# Model Name
|
|
701
615
|
if not os.getenv("OPENAI_MODEL_NAME"):
|
|
702
616
|
model_name = settings.model.model_name
|
|
@@ -704,3 +618,13 @@ def setup_environment(agent_path: "Path"):
|
|
|
704
618
|
click.echo(f"🧠 Model: {click.style(model_name, fg='cyan')} (Default)")
|
|
705
619
|
if not os.getenv("MODEL_NAME") and os.getenv("OPENAI_MODEL_NAME"):
|
|
706
620
|
os.environ["MODEL_NAME"] = os.getenv("OPENAI_MODEL_NAME", "")
|
|
621
|
+
|
|
622
|
+
# 4. 模型出口协议转换层(v2.2):gate 开启且模型在白名单时懒起进程内 ProxyServer,
|
|
623
|
+
# 把 OPENAI_BASE_URL 重定向到它。默认 gate 关,不重定向,历史路径零影响。
|
|
624
|
+
# codex 不走此路(它走 AsyncCodexClient 的 v2.1 provider 注入)。
|
|
625
|
+
try:
|
|
626
|
+
from ksadk.model_proxy.bootstrap import setup_proxy_redirect_if_enabled
|
|
627
|
+
|
|
628
|
+
setup_proxy_redirect_if_enabled()
|
|
629
|
+
except Exception: # noqa: BLE001 代理可选,失败不影响主流程(默认关时本就不触发)
|
|
630
|
+
pass
|