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/knowledge_base/client.py
CHANGED
|
@@ -5,8 +5,9 @@
|
|
|
5
5
|
|
|
6
6
|
环境变量:
|
|
7
7
|
KSADK_KB_DATASET_ID: 知识库 ID (必填,存在即启用)
|
|
8
|
-
KSADK_KB_ACCESS_KEY: AK (可选,默认取 KSYUN_ACCESS_KEY)
|
|
9
|
-
KSADK_KB_SECRET_KEY: SK (可选,默认取 KSYUN_SECRET_KEY)
|
|
8
|
+
KSADK_KB_ACCESS_KEY: AK (可选,默认取 KSYUN_ACCESS_KEY / KSYUN_ACCESS_KEY_ID)
|
|
9
|
+
KSADK_KB_SECRET_KEY: SK (可选,默认取 KSYUN_SECRET_KEY / KSYUN_SECRET_ACCESS_KEY)
|
|
10
|
+
KSADK_KB_SESSION_TOKEN: STS 临时会话 token (可选,默认取 KSYUN_SESSION_TOKEN)
|
|
10
11
|
KSADK_KB_REGION: 区域 (默认 cn-beijing-6)
|
|
11
12
|
KSADK_KB_ENDPOINT: API 端点 (默认 aicp.api.ksyun.com)
|
|
12
13
|
KSADK_KB_TOP_K: 返回结果数 (默认 5)
|
|
@@ -59,6 +60,7 @@ class KnowledgeBaseClient(BaseModel):
|
|
|
59
60
|
dataset_id: 知识库 ID (DatasetId)
|
|
60
61
|
access_key: 访问密钥 ID (AK)
|
|
61
62
|
secret_key: 访问密钥 (SK)
|
|
63
|
+
session_token: STS 临时会话 token
|
|
62
64
|
region: API 区域
|
|
63
65
|
endpoint: API 端点
|
|
64
66
|
top_k: 返回结果数
|
|
@@ -71,6 +73,7 @@ class KnowledgeBaseClient(BaseModel):
|
|
|
71
73
|
dataset_id: str
|
|
72
74
|
access_key: str = ""
|
|
73
75
|
secret_key: str = ""
|
|
76
|
+
session_token: str = ""
|
|
74
77
|
region: str = "cn-beijing-6"
|
|
75
78
|
endpoint: str = "aicp.api.ksyun.com"
|
|
76
79
|
scheme: str = "https"
|
|
@@ -101,9 +104,13 @@ class KnowledgeBaseClient(BaseModel):
|
|
|
101
104
|
return self._aicp_client
|
|
102
105
|
|
|
103
106
|
try:
|
|
104
|
-
from ksyun.common import credential
|
|
105
|
-
from ksyun.common.profile.client_profile import
|
|
106
|
-
|
|
107
|
+
from ksyun.common import credential # type: ignore[import-untyped]
|
|
108
|
+
from ksyun.common.profile.client_profile import ( # type: ignore[import-untyped]
|
|
109
|
+
ClientProfile,
|
|
110
|
+
)
|
|
111
|
+
from ksyun.common.profile.http_profile import ( # type: ignore[import-untyped]
|
|
112
|
+
HttpProfile,
|
|
113
|
+
)
|
|
107
114
|
except ImportError:
|
|
108
115
|
raise ImportError(
|
|
109
116
|
"kingsoftcloud-sdk-python is required for knowledge base. "
|
|
@@ -129,7 +136,9 @@ class KnowledgeBaseClient(BaseModel):
|
|
|
129
136
|
"Ensure kingsoftcloud-sdk-python is installed and up to date."
|
|
130
137
|
)
|
|
131
138
|
|
|
132
|
-
cred = credential.Credential(
|
|
139
|
+
cred = credential.Credential(
|
|
140
|
+
self.access_key, self.secret_key, self.session_token or None
|
|
141
|
+
)
|
|
133
142
|
|
|
134
143
|
http_profile = HttpProfile()
|
|
135
144
|
http_profile.endpoint = self.endpoint
|
|
@@ -140,9 +149,7 @@ class KnowledgeBaseClient(BaseModel):
|
|
|
140
149
|
client_profile = ClientProfile()
|
|
141
150
|
client_profile.httpProfile = http_profile
|
|
142
151
|
|
|
143
|
-
self._aicp_client = aicp_module.AicpClient(
|
|
144
|
-
cred, self.region, profile=client_profile
|
|
145
|
-
)
|
|
152
|
+
self._aicp_client = aicp_module.AicpClient(cred, self.region, profile=client_profile)
|
|
146
153
|
|
|
147
154
|
# 强制覆写 API 版本为 RetrieveKnowledge 所需的 2025-11-14
|
|
148
155
|
# SDK 的 _apiVersion 由导入的模块版本决定,可能不匹配
|
|
@@ -159,19 +166,20 @@ class KnowledgeBaseClient(BaseModel):
|
|
|
159
166
|
"""构建 RetrieveKnowledge 请求参数 (JSON 嵌套格式)"""
|
|
160
167
|
effective_top_k = top_k if top_k is not None else self.top_k
|
|
161
168
|
|
|
162
|
-
|
|
169
|
+
retrieval_model: dict[str, Any] = {
|
|
170
|
+
"SearchMethod": self.search_method,
|
|
171
|
+
"TopK": effective_top_k,
|
|
172
|
+
"RerankingEnable": self.reranking_enable,
|
|
173
|
+
}
|
|
174
|
+
params: dict[str, Any] = {
|
|
163
175
|
"DatasetId": self.dataset_id,
|
|
164
176
|
"Query": query,
|
|
165
|
-
"RetrievalModel":
|
|
166
|
-
"SearchMethod": self.search_method,
|
|
167
|
-
"TopK": effective_top_k,
|
|
168
|
-
"RerankingEnable": self.reranking_enable,
|
|
169
|
-
},
|
|
177
|
+
"RetrievalModel": retrieval_model,
|
|
170
178
|
}
|
|
171
179
|
|
|
172
180
|
if self.score_threshold_enabled:
|
|
173
|
-
|
|
174
|
-
|
|
181
|
+
retrieval_model["ScoreThresholdEnabled"] = True
|
|
182
|
+
retrieval_model["ScoreThreshold"] = self.score_threshold
|
|
175
183
|
|
|
176
184
|
return params
|
|
177
185
|
|
|
@@ -205,9 +213,7 @@ class KnowledgeBaseClient(BaseModel):
|
|
|
205
213
|
|
|
206
214
|
return results
|
|
207
215
|
|
|
208
|
-
def search(
|
|
209
|
-
self, query: str, top_k: Optional[int] = None
|
|
210
|
-
) -> List[KnowledgeBaseResult]:
|
|
216
|
+
def search(self, query: str, top_k: Optional[int] = None) -> List[KnowledgeBaseResult]:
|
|
211
217
|
"""检索知识库
|
|
212
218
|
|
|
213
219
|
Args:
|
|
@@ -221,18 +227,14 @@ class KnowledgeBaseClient(BaseModel):
|
|
|
221
227
|
params = self._build_params(query, top_k)
|
|
222
228
|
|
|
223
229
|
logger.info(
|
|
224
|
-
f"Searching knowledge base: dataset_id={self.dataset_id}, "
|
|
225
|
-
f"query='{query[:50]}'"
|
|
230
|
+
f"Searching knowledge base: dataset_id={self.dataset_id}, " f"query='{query[:50]}'"
|
|
226
231
|
)
|
|
227
232
|
|
|
228
233
|
try:
|
|
229
|
-
response = client.call(
|
|
230
|
-
"RetrieveKnowledge", params, options={"IsPostJson": True}
|
|
231
|
-
)
|
|
234
|
+
response = client.call("RetrieveKnowledge", params, options={"IsPostJson": True})
|
|
232
235
|
results = self._parse_response(response)
|
|
233
236
|
logger.info(
|
|
234
|
-
f"Knowledge base returned {len(results)} results "
|
|
235
|
-
f"for query='{query[:50]}'"
|
|
237
|
+
f"Knowledge base returned {len(results)} results " f"for query='{query[:50]}'"
|
|
236
238
|
)
|
|
237
239
|
return results
|
|
238
240
|
except Exception as e:
|
|
@@ -252,19 +254,23 @@ class KnowledgeBaseClient(BaseModel):
|
|
|
252
254
|
dataset_id = os.environ.get("KSADK_KB_DATASET_ID", "")
|
|
253
255
|
if not dataset_id:
|
|
254
256
|
raise ValueError(
|
|
255
|
-
"KSADK_KB_DATASET_ID environment variable is required "
|
|
256
|
-
"to enable knowledge base."
|
|
257
|
+
"KSADK_KB_DATASET_ID environment variable is required " "to enable knowledge base."
|
|
257
258
|
)
|
|
258
259
|
|
|
259
260
|
access_key = (
|
|
260
261
|
os.environ.get("KSADK_KB_ACCESS_KEY")
|
|
261
262
|
or os.environ.get("KSYUN_ACCESS_KEY")
|
|
263
|
+
or os.environ.get("KSYUN_ACCESS_KEY_ID")
|
|
262
264
|
or os.environ.get("KSYUN_SECRET_ID", "")
|
|
263
265
|
)
|
|
264
266
|
secret_key = (
|
|
265
267
|
os.environ.get("KSADK_KB_SECRET_KEY")
|
|
266
268
|
or os.environ.get("KSYUN_SECRET_KEY")
|
|
267
|
-
or os.environ.get("
|
|
269
|
+
or os.environ.get("KSYUN_SECRET_ACCESS_KEY", "")
|
|
270
|
+
)
|
|
271
|
+
session_token = (
|
|
272
|
+
os.environ.get("KSADK_KB_SESSION_TOKEN")
|
|
273
|
+
or os.environ.get("KSYUN_SESSION_TOKEN", "")
|
|
268
274
|
)
|
|
269
275
|
|
|
270
276
|
score_threshold_str = os.environ.get("KSADK_KB_SCORE_THRESHOLD", "")
|
|
@@ -279,13 +285,12 @@ class KnowledgeBaseClient(BaseModel):
|
|
|
279
285
|
dataset_id=dataset_id,
|
|
280
286
|
access_key=access_key,
|
|
281
287
|
secret_key=secret_key,
|
|
288
|
+
session_token=session_token,
|
|
282
289
|
region=connection["region"],
|
|
283
290
|
endpoint=connection["endpoint"],
|
|
284
291
|
scheme=connection["scheme"],
|
|
285
292
|
top_k=int(os.environ.get("KSADK_KB_TOP_K", "5")),
|
|
286
|
-
search_method=os.environ.get(
|
|
287
|
-
"KSADK_KB_SEARCH_METHOD", "intelligence_search"
|
|
288
|
-
),
|
|
293
|
+
search_method=os.environ.get("KSADK_KB_SEARCH_METHOD", "intelligence_search"),
|
|
289
294
|
score_threshold=score_threshold,
|
|
290
295
|
score_threshold_enabled=score_threshold_enabled,
|
|
291
296
|
reranking_enable=reranking_enable,
|
|
@@ -0,0 +1,160 @@
|
|
|
1
|
+
"""Platform-layer discovery-only AgentCard mount for managed A2A Runtime.
|
|
2
|
+
|
|
3
|
+
v1 scope (this module):
|
|
4
|
+
Mount ``GET /.well-known/agent-card.json`` only. No JSON-RPC, no identity
|
|
5
|
+
middleware, no TaskStore/ContextStore/ResumeStore. The card is available as
|
|
6
|
+
soon as the runtime starts, *before* any A2A Agent is registered, so the
|
|
7
|
+
server-side ``GetAToAAgentCard(hosted)`` probe can fetch it and break the
|
|
8
|
+
registration chicken-and-egg cycle.
|
|
9
|
+
|
|
10
|
+
The card mounts whenever ``KSADK_A2A_RUNTIME_ID`` (ar-*, available at deploy
|
|
11
|
+
time) is non-empty. It does **not** depend on ``KSADK_A2A_AGENT_ID``
|
|
12
|
+
(only known after the A2A Agent is registered). skills default to empty;
|
|
13
|
+
:func:`ksadk.a2a_card.build_agent_card` fills a ``general`` skill when none
|
|
14
|
+
are provided.
|
|
15
|
+
|
|
16
|
+
v2 scope (future, not this module):
|
|
17
|
+
:class:`ksadk.a2a.bootstrap.AgentEngineA2ABootstrap` adds JSON-RPC on top
|
|
18
|
+
of the same card and the same identity env. The bootstrap replaces this
|
|
19
|
+
mount in ``RuntimeAppConfig.a2a`` once shared durable storage and a real
|
|
20
|
+
gateway-forward identity verifier are in place.
|
|
21
|
+
|
|
22
|
+
Wire 1.0 conformance:
|
|
23
|
+
The card is built with :func:`build_agent_card` (same factory used by the
|
|
24
|
+
full A2A server), so ``supportedInterfaces`` / ``protocolVersion`` /
|
|
25
|
+
``defaultInputModes`` / ``defaultOutputModes`` match wire 1.0 exactly.
|
|
26
|
+
"""
|
|
27
|
+
|
|
28
|
+
from __future__ import annotations
|
|
29
|
+
|
|
30
|
+
import os
|
|
31
|
+
from dataclasses import dataclass
|
|
32
|
+
from typing import Optional, Sequence
|
|
33
|
+
|
|
34
|
+
from a2a.types import AgentSkill
|
|
35
|
+
from fastapi import FastAPI
|
|
36
|
+
|
|
37
|
+
from ksadk.a2a_card import build_agent_card
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
def _env(name: str) -> str:
|
|
41
|
+
return os.getenv(name, "").strip()
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
@dataclass(frozen=True)
|
|
45
|
+
class ManagedA2ACardConfig:
|
|
46
|
+
"""Database-free configuration for the managed discovery-only route."""
|
|
47
|
+
|
|
48
|
+
enabled: bool = True
|
|
49
|
+
base_url: str = "http://127.0.0.1:8000"
|
|
50
|
+
agent_name: str = "agent"
|
|
51
|
+
description: str = ""
|
|
52
|
+
version: str = "0.1.0"
|
|
53
|
+
skills: Sequence[str | AgentSkill] = ()
|
|
54
|
+
streaming: bool = False
|
|
55
|
+
prefer_stream: bool = False
|
|
56
|
+
|
|
57
|
+
|
|
58
|
+
@dataclass(frozen=True)
|
|
59
|
+
class ManagedA2ACardMount:
|
|
60
|
+
"""Discovery-only card endpoint; mounted by ``RuntimeAppConfig.a2a``.
|
|
61
|
+
|
|
62
|
+
Held as a plain dataclass so ``factory._wire_a2a_if_enabled`` can isinstance
|
|
63
|
+
it without importing the (optional) ``AgentEngineA2ABootstrap`` class.
|
|
64
|
+
"""
|
|
65
|
+
|
|
66
|
+
config: ManagedA2ACardConfig
|
|
67
|
+
|
|
68
|
+
def mount(self, app: FastAPI) -> None:
|
|
69
|
+
"""Mount ``GET /.well-known/agent-card.json`` into ``app``.
|
|
70
|
+
|
|
71
|
+
Directly registers a FastAPI route returning the card JSON, avoiding
|
|
72
|
+
``a2a.server.routes`` (which pulls in the full A2A server stack and its
|
|
73
|
+
``culsans`` dependency). The response body is the same AgentCard JSON
|
|
74
|
+
that ``create_agent_card_routes`` would produce.
|
|
75
|
+
"""
|
|
76
|
+
card = build_agent_card(
|
|
77
|
+
name=self.config.agent_name,
|
|
78
|
+
base_url=self.config.base_url,
|
|
79
|
+
description=self.config.description,
|
|
80
|
+
version=self.config.version,
|
|
81
|
+
skills=self.config.skills or (),
|
|
82
|
+
streaming=self.config.streaming,
|
|
83
|
+
)
|
|
84
|
+
|
|
85
|
+
def _card_to_dict() -> dict:
|
|
86
|
+
# a2a.types.AgentCard is a protobuf message; serialize to the same
|
|
87
|
+
# camelCase JSON wire format the a2a-sdk route produces.
|
|
88
|
+
from google.protobuf.json_format import MessageToDict
|
|
89
|
+
|
|
90
|
+
return MessageToDict(
|
|
91
|
+
card,
|
|
92
|
+
preserving_proto_field_name=False,
|
|
93
|
+
use_integers_for_enums=False,
|
|
94
|
+
always_print_fields_with_no_presence=True,
|
|
95
|
+
)
|
|
96
|
+
|
|
97
|
+
|
|
98
|
+
from fastapi import Response
|
|
99
|
+
from fastapi.responses import JSONResponse
|
|
100
|
+
|
|
101
|
+
card_payload = _card_to_dict()
|
|
102
|
+
|
|
103
|
+
async def _get_agent_card() -> Response:
|
|
104
|
+
return JSONResponse(content=card_payload)
|
|
105
|
+
|
|
106
|
+
app.add_api_route(
|
|
107
|
+
"/.well-known/agent-card.json",
|
|
108
|
+
_get_agent_card,
|
|
109
|
+
methods=["GET"],
|
|
110
|
+
name="a2a_agent_card",
|
|
111
|
+
include_in_schema=False,
|
|
112
|
+
)
|
|
113
|
+
|
|
114
|
+
async def start(self) -> None:
|
|
115
|
+
"""No stores/middleware to initialize in v1."""
|
|
116
|
+
|
|
117
|
+
return None
|
|
118
|
+
|
|
119
|
+
async def stop(self) -> None:
|
|
120
|
+
return None
|
|
121
|
+
|
|
122
|
+
|
|
123
|
+
def build_managed_a2a_card_if_configured() -> Optional[ManagedA2ACardMount]:
|
|
124
|
+
"""Read the A2A identity env vars and build a discovery-only card mount.
|
|
125
|
+
|
|
126
|
+
Returns ``None`` when the runtime is not A2A-capable
|
|
127
|
+
(``KSADK_A2A_RUNTIME_ID`` empty), so ``run_server`` skips mounting entirely.
|
|
128
|
+
Returns a mount even when ``KSADK_A2A_AGENT_ID`` is absent: the discovery
|
|
129
|
+
card is intentionally available *before* the A2A Agent is registered.
|
|
130
|
+
|
|
131
|
+
Name/version fallback chain:
|
|
132
|
+
``KSADK_A2A_AGENT_NAME`` → ``AGENTENGINE_MANAGED_RUNTIME_NAME`` →
|
|
133
|
+
``KSADK_A2A_RUNTIME_ID``.
|
|
134
|
+
"""
|
|
135
|
+
runtime_id = _env("KSADK_A2A_RUNTIME_ID")
|
|
136
|
+
if not runtime_id:
|
|
137
|
+
return None
|
|
138
|
+
|
|
139
|
+
base_url = _env("KSADK_A2A_INTERNAL_BASE_URL") or "http://localhost:8080"
|
|
140
|
+
name = _env("KSADK_A2A_AGENT_NAME") or _env("AGENTENGINE_MANAGED_RUNTIME_NAME") or runtime_id
|
|
141
|
+
version = _env("KSADK_A2A_AGENT_VERSION") or "0.1.0"
|
|
142
|
+
|
|
143
|
+
config = ManagedA2ACardConfig(
|
|
144
|
+
enabled=True,
|
|
145
|
+
base_url=base_url,
|
|
146
|
+
agent_name=name,
|
|
147
|
+
description="",
|
|
148
|
+
version=version,
|
|
149
|
+
skills=(),
|
|
150
|
+
streaming=False,
|
|
151
|
+
prefer_stream=False,
|
|
152
|
+
)
|
|
153
|
+
return ManagedA2ACardMount(config)
|
|
154
|
+
|
|
155
|
+
|
|
156
|
+
__all__ = [
|
|
157
|
+
"ManagedA2ACardConfig",
|
|
158
|
+
"ManagedA2ACardMount",
|
|
159
|
+
"build_managed_a2a_card_if_configured",
|
|
160
|
+
]
|
ksadk/managed_runtime.py
ADDED
|
@@ -0,0 +1,195 @@
|
|
|
1
|
+
"""Managed runtime configuration and version resolution."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
import subprocess
|
|
6
|
+
from dataclasses import dataclass
|
|
7
|
+
from importlib.metadata import PackageNotFoundError
|
|
8
|
+
from importlib.metadata import version as package_version
|
|
9
|
+
from typing import Any
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
class ManagedRuntimeError(ValueError):
|
|
13
|
+
"""Raised when a managed runtime contract cannot be resolved safely."""
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
@dataclass(frozen=True)
|
|
17
|
+
class ResolvedRuntime:
|
|
18
|
+
name: str
|
|
19
|
+
version: str
|
|
20
|
+
source: str
|
|
21
|
+
package_requirement: str = ""
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
def runtime_config(config: dict[str, Any]) -> tuple[str, str]:
|
|
25
|
+
value = config.get("runtime")
|
|
26
|
+
if not isinstance(value, dict):
|
|
27
|
+
raise ManagedRuntimeError("ManagedRuntime 项目缺少 runtime 配置")
|
|
28
|
+
name = str(value.get("name") or "").strip().lower()
|
|
29
|
+
requested_version = str(value.get("version") or "").strip()
|
|
30
|
+
if not name:
|
|
31
|
+
raise ManagedRuntimeError("ManagedRuntime 项目缺少 runtime.name")
|
|
32
|
+
return name, requested_version
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
def extract_bootstrap_runtime(
|
|
36
|
+
bootstrap: dict[str, Any] | None,
|
|
37
|
+
runtime_name: str,
|
|
38
|
+
) -> ResolvedRuntime | None:
|
|
39
|
+
if not isinstance(bootstrap, dict):
|
|
40
|
+
return None
|
|
41
|
+
configs = bootstrap.get("configs") or bootstrap.get("Configs")
|
|
42
|
+
if not isinstance(configs, dict):
|
|
43
|
+
return None
|
|
44
|
+
version = str(
|
|
45
|
+
configs.get("runtime.default_version")
|
|
46
|
+
or configs.get(f"runtime.{runtime_name}.default_version")
|
|
47
|
+
or ""
|
|
48
|
+
).strip()
|
|
49
|
+
if not version:
|
|
50
|
+
return None
|
|
51
|
+
package = str(
|
|
52
|
+
configs.get("runtime.package")
|
|
53
|
+
or configs.get(f"runtime.{runtime_name}.package")
|
|
54
|
+
or ""
|
|
55
|
+
).strip()
|
|
56
|
+
return ResolvedRuntime(
|
|
57
|
+
name=runtime_name,
|
|
58
|
+
version=version,
|
|
59
|
+
source="server",
|
|
60
|
+
package_requirement=package,
|
|
61
|
+
)
|
|
62
|
+
|
|
63
|
+
|
|
64
|
+
async def resolve_managed_runtime(
|
|
65
|
+
config: dict[str, Any],
|
|
66
|
+
*,
|
|
67
|
+
region: str,
|
|
68
|
+
bootstrap: dict[str, Any] | None = None,
|
|
69
|
+
) -> ResolvedRuntime:
|
|
70
|
+
name, requested_version = runtime_config(config)
|
|
71
|
+
if requested_version:
|
|
72
|
+
return ResolvedRuntime(name=name, version=requested_version, source="manifest")
|
|
73
|
+
|
|
74
|
+
resolved = extract_bootstrap_runtime(bootstrap, name)
|
|
75
|
+
if resolved is not None:
|
|
76
|
+
return resolved
|
|
77
|
+
|
|
78
|
+
if bootstrap is None:
|
|
79
|
+
from ksadk.api.client import AgentEngineClient
|
|
80
|
+
from ksadk.version import VERSION as CLI_VERSION
|
|
81
|
+
|
|
82
|
+
try:
|
|
83
|
+
async with AgentEngineClient(region=region) as client:
|
|
84
|
+
payload = await client.get_client_bootstrap_config(
|
|
85
|
+
product="agentengine",
|
|
86
|
+
framework=name,
|
|
87
|
+
region=region,
|
|
88
|
+
client_type="cli",
|
|
89
|
+
client_version=CLI_VERSION,
|
|
90
|
+
ignore_dry_run=True,
|
|
91
|
+
)
|
|
92
|
+
except Exception as exc:
|
|
93
|
+
raise ManagedRuntimeError(
|
|
94
|
+
"无法从 AgentEngine 获取 ManagedRuntime 默认版本;"
|
|
95
|
+
"请连接服务端或在 agentengine.yaml 中显式配置 runtime.version"
|
|
96
|
+
) from exc
|
|
97
|
+
resolved = extract_bootstrap_runtime(payload, name)
|
|
98
|
+
if resolved is not None:
|
|
99
|
+
return resolved
|
|
100
|
+
|
|
101
|
+
raise ManagedRuntimeError(
|
|
102
|
+
f"AgentEngine 未下发 {name} 的默认 Runtime 版本;"
|
|
103
|
+
"请配置服务端 Runtime catalog 或显式设置 runtime.version"
|
|
104
|
+
)
|
|
105
|
+
|
|
106
|
+
|
|
107
|
+
def installed_runtime_version(runtime_name: str) -> str:
|
|
108
|
+
package_name = {"codex": "openai-codex"}.get(runtime_name, runtime_name)
|
|
109
|
+
try:
|
|
110
|
+
return package_version(package_name)
|
|
111
|
+
except PackageNotFoundError:
|
|
112
|
+
return ""
|
|
113
|
+
|
|
114
|
+
|
|
115
|
+
def validate_installed_runtime(resolved: ResolvedRuntime) -> str:
|
|
116
|
+
installed = installed_runtime_version(resolved.name)
|
|
117
|
+
if not installed:
|
|
118
|
+
raise ManagedRuntimeError(
|
|
119
|
+
f"本地缺少 {resolved.name} runtime;请安装 `pip install 'ksadk[{resolved.name}]'`"
|
|
120
|
+
)
|
|
121
|
+
if resolved.version and installed != resolved.version:
|
|
122
|
+
raise ManagedRuntimeError(
|
|
123
|
+
f"本地 {resolved.name} runtime 版本为 {installed},"
|
|
124
|
+
f"配置要求 {resolved.version};请安装匹配版本后重试"
|
|
125
|
+
)
|
|
126
|
+
validate_runtime_binary(resolved)
|
|
127
|
+
return installed
|
|
128
|
+
|
|
129
|
+
|
|
130
|
+
def validate_runtime_binary(resolved: ResolvedRuntime) -> str:
|
|
131
|
+
if resolved.name != "codex":
|
|
132
|
+
return ""
|
|
133
|
+
try:
|
|
134
|
+
from codex_cli_bin import ( # type: ignore[import-not-found, import-untyped]
|
|
135
|
+
bundled_codex_path,
|
|
136
|
+
)
|
|
137
|
+
|
|
138
|
+
codex_bin = bundled_codex_path()
|
|
139
|
+
completed = subprocess.run(
|
|
140
|
+
[str(codex_bin), "--version"],
|
|
141
|
+
check=True,
|
|
142
|
+
capture_output=True,
|
|
143
|
+
text=True,
|
|
144
|
+
timeout=15,
|
|
145
|
+
)
|
|
146
|
+
except (ImportError, OSError, subprocess.SubprocessError) as exc:
|
|
147
|
+
raise ManagedRuntimeError(
|
|
148
|
+
"本地 Codex 平台二进制不可用;请重新安装 `pip install --force-reinstall "
|
|
149
|
+
"'ksadk[codex]'`"
|
|
150
|
+
) from exc
|
|
151
|
+
output = f"{completed.stdout}\n{completed.stderr}".strip()
|
|
152
|
+
if resolved.version and resolved.version not in output:
|
|
153
|
+
raise ManagedRuntimeError(
|
|
154
|
+
f"Codex CLI 版本输出为 {output or '(empty)'},配置要求 {resolved.version}"
|
|
155
|
+
)
|
|
156
|
+
return output
|
|
157
|
+
|
|
158
|
+
|
|
159
|
+
async def resolve_local_managed_runtime(
|
|
160
|
+
config: dict[str, Any],
|
|
161
|
+
*,
|
|
162
|
+
region: str,
|
|
163
|
+
) -> ResolvedRuntime:
|
|
164
|
+
"""Resolve and verify the native runtime used by ``ksadk web``."""
|
|
165
|
+
name, requested_version = runtime_config(config)
|
|
166
|
+
if requested_version:
|
|
167
|
+
explicit_runtime = ResolvedRuntime(
|
|
168
|
+
name=name,
|
|
169
|
+
version=requested_version,
|
|
170
|
+
source="manifest",
|
|
171
|
+
)
|
|
172
|
+
validate_installed_runtime(explicit_runtime)
|
|
173
|
+
return explicit_runtime
|
|
174
|
+
|
|
175
|
+
catalog_runtime: ResolvedRuntime | None = None
|
|
176
|
+
try:
|
|
177
|
+
catalog_runtime = await resolve_managed_runtime(config, region=region)
|
|
178
|
+
except ManagedRuntimeError:
|
|
179
|
+
pass
|
|
180
|
+
if catalog_runtime is not None:
|
|
181
|
+
validate_installed_runtime(catalog_runtime)
|
|
182
|
+
return catalog_runtime
|
|
183
|
+
|
|
184
|
+
installed = installed_runtime_version(name)
|
|
185
|
+
if not installed:
|
|
186
|
+
raise ManagedRuntimeError(
|
|
187
|
+
f"本地缺少 {name} runtime;请安装 `pip install 'ksadk[{name}]'`"
|
|
188
|
+
)
|
|
189
|
+
resolved = ResolvedRuntime(
|
|
190
|
+
name=name,
|
|
191
|
+
version=installed,
|
|
192
|
+
source="installed-unlocked",
|
|
193
|
+
)
|
|
194
|
+
validate_runtime_binary(resolved)
|
|
195
|
+
return resolved
|
ksadk/markdown.py
CHANGED
|
@@ -2,7 +2,6 @@ from __future__ import annotations
|
|
|
2
2
|
|
|
3
3
|
from typing import Any
|
|
4
4
|
|
|
5
|
-
|
|
6
5
|
_FENCE_MARKER_CHARS = ("`", "~")
|
|
7
6
|
_LIST_PREFIXES = ("- ", "* ", "+ ")
|
|
8
7
|
|
|
@@ -157,7 +156,11 @@ def _is_closing_fence(candidate: str, open_marker: str) -> bool:
|
|
|
157
156
|
|
|
158
157
|
|
|
159
158
|
def _is_table_line(stripped_line: str) -> bool:
|
|
160
|
-
return
|
|
159
|
+
return (
|
|
160
|
+
stripped_line.startswith("|")
|
|
161
|
+
and stripped_line.endswith("|")
|
|
162
|
+
and stripped_line.count("|") >= 2
|
|
163
|
+
)
|
|
161
164
|
|
|
162
165
|
|
|
163
166
|
def _is_list_line(stripped_line: str) -> bool:
|
ksadk/mcp_runtime/__init__.py
CHANGED
|
@@ -1,18 +1,19 @@
|
|
|
1
1
|
from __future__ import annotations
|
|
2
2
|
|
|
3
|
+
import inspect
|
|
3
4
|
import json
|
|
4
5
|
import os
|
|
5
|
-
import inspect
|
|
6
6
|
from dataclasses import dataclass
|
|
7
|
-
from typing import Any, Sequence
|
|
7
|
+
from typing import Any, Coroutine, Sequence, cast
|
|
8
8
|
from urllib.parse import urlparse
|
|
9
9
|
|
|
10
10
|
import httpx
|
|
11
|
-
|
|
11
|
+
|
|
12
|
+
from ksadk.compat.adk_compat import (
|
|
12
13
|
CheckableMcpHttpClientFactory,
|
|
14
|
+
McpToolset,
|
|
13
15
|
StreamableHTTPConnectionParams,
|
|
14
16
|
)
|
|
15
|
-
from google.adk.tools.mcp_tool.mcp_toolset import McpToolset
|
|
16
17
|
|
|
17
18
|
MCP_TOOLSET_KEY_ATTR = "_ksadk_mcp_toolset_key"
|
|
18
19
|
|
|
@@ -64,7 +65,9 @@ def build_connection_params(
|
|
|
64
65
|
httpx_client_factory: CheckableMcpHttpClientFactory | None = None,
|
|
65
66
|
) -> StreamableHTTPConnectionParams:
|
|
66
67
|
kwargs: dict[str, Any] = {"url": config.url, "headers": config.headers}
|
|
67
|
-
kwargs["httpx_client_factory"] = httpx_client_factory or _default_httpx_client_factory(
|
|
68
|
+
kwargs["httpx_client_factory"] = httpx_client_factory or _default_httpx_client_factory(
|
|
69
|
+
config.url
|
|
70
|
+
)
|
|
68
71
|
return StreamableHTTPConnectionParams(**kwargs)
|
|
69
72
|
|
|
70
73
|
|
|
@@ -146,7 +149,7 @@ def _mcp_toolset_tools_sync(toolset: Any) -> list[Any]:
|
|
|
146
149
|
try:
|
|
147
150
|
asyncio.get_running_loop()
|
|
148
151
|
except RuntimeError:
|
|
149
|
-
result = asyncio.run(result)
|
|
152
|
+
result = asyncio.run(cast(Coroutine[Any, Any, Any], result))
|
|
150
153
|
else:
|
|
151
154
|
close = getattr(result, "close", None)
|
|
152
155
|
if callable(close):
|
ksadk/memory/__init__.py
CHANGED
|
@@ -13,9 +13,9 @@
|
|
|
13
13
|
|
|
14
14
|
from typing import TYPE_CHECKING
|
|
15
15
|
|
|
16
|
-
from ksadk.memory.manager import MemoryManager, get_memory_manager
|
|
17
16
|
from ksadk.memory.backends.base import BaseMemoryBackend
|
|
18
17
|
from ksadk.memory.backends.memory import InMemoryBackend
|
|
18
|
+
from ksadk.memory.manager import MemoryManager, get_memory_manager
|
|
19
19
|
|
|
20
20
|
if TYPE_CHECKING:
|
|
21
21
|
from ksadk.memory.service import LongTermMemoryService
|
ksadk/memory/adk/__init__.py
CHANGED
|
@@ -39,10 +39,12 @@ if TYPE_CHECKING:
|
|
|
39
39
|
def __getattr__(name):
|
|
40
40
|
if name == "ShortTermMemory":
|
|
41
41
|
from ksadk.memory.adk.short_term_memory import ShortTermMemory
|
|
42
|
+
|
|
42
43
|
return ShortTermMemory
|
|
43
44
|
|
|
44
45
|
if name == "LongTermMemory":
|
|
45
46
|
from ksadk.memory.adk.long_term_memory import LongTermMemory
|
|
47
|
+
|
|
46
48
|
return LongTermMemory
|
|
47
49
|
|
|
48
50
|
raise AttributeError(f"module 'ksadk.memory.adk' has no attribute '{name}'")
|
|
@@ -21,9 +21,7 @@ class BaseLongTermMemoryBackend(ABC, BaseModel):
|
|
|
21
21
|
index: str = ""
|
|
22
22
|
|
|
23
23
|
@abstractmethod
|
|
24
|
-
def save_memory(
|
|
25
|
-
self, user_id: str, event_strings: List[str], **kwargs
|
|
26
|
-
) -> bool:
|
|
24
|
+
def save_memory(self, user_id: str, event_strings: List[str], **kwargs) -> bool:
|
|
27
25
|
"""保存记忆
|
|
28
26
|
|
|
29
27
|
Args:
|
|
@@ -36,9 +34,7 @@ class BaseLongTermMemoryBackend(ABC, BaseModel):
|
|
|
36
34
|
pass
|
|
37
35
|
|
|
38
36
|
@abstractmethod
|
|
39
|
-
def search_memory(
|
|
40
|
-
self, user_id: str, query: str, top_k: int = 5, **kwargs
|
|
41
|
-
) -> List[str]:
|
|
37
|
+
def search_memory(self, user_id: str, query: str, top_k: int = 5, **kwargs) -> List[str]:
|
|
42
38
|
"""检索记忆
|
|
43
39
|
|
|
44
40
|
Args:
|