agentengine-sdk-python 0.7.0__py3-none-any.whl → 0.8.0__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.0.dist-info}/METADATA +36 -20
- agentengine_sdk_python-0.8.0.dist-info/RECORD +578 -0
- ksadk/a2a/__init__.py +178 -11
- ksadk/a2a/bootstrap.py +334 -0
- ksadk/a2a/card.py +120 -0
- ksadk/a2a/context_store.py +203 -0
- ksadk/a2a/control_plane.py +818 -0
- ksadk/a2a/credential.py +99 -0
- ksadk/a2a/event_adapter.py +149 -0
- ksadk/a2a/executor.py +406 -89
- 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 +105 -0
- ksadk/a2a/server.py +107 -60
- ksadk/a2a/space_client.py +1101 -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/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 +857 -0
- ksadk/agui/config.py +86 -0
- ksadk/agui/routes.py +55 -0
- ksadk/api/client.py +233 -191
- ksadk/builders/__init__.py +2 -0
- ksadk/builders/base.py +16 -14
- ksadk/builders/code_builder.py +318 -236
- ksadk/builders/container_builder.py +187 -167
- ksadk/builders/framework_requirements.py +29 -11
- ksadk/builders/ks3_uploader.py +58 -27
- ksadk/builders/managed_runtime_builder.py +145 -0
- ksadk/builders/mcp_builder.py +91 -92
- ksadk/builders/requirements_utils.py +1 -5
- ksadk/cli/__init__.py +89 -171
- ksadk/cli/cmd_a2a.py +254 -70
- 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 +500 -720
- ksadk/cli/cmd_dashboard.py +120 -45
- ksadk/cli/cmd_deploy.py +117 -58
- ksadk/cli/cmd_destroy.py +44 -14
- ksadk/cli/cmd_files.py +63 -24
- ksadk/cli/cmd_hermes.py +168 -89
- ksadk/cli/cmd_invoke.py +184 -122
- ksadk/cli/cmd_launch.py +64 -28
- ksadk/cli/cmd_mcp.py +98 -64
- ksadk/cli/cmd_model.py +14 -5
- ksadk/cli/cmd_openclaw.py +483 -227
- ksadk/cli/cmd_replay.py +71 -0
- ksadk/cli/cmd_run.py +33 -10
- ksadk/cli/cmd_status.py +80 -31
- ksadk/cli/cmd_version.py +20 -13
- ksadk/cli/cmd_web.py +89 -13
- ksadk/cli/deploy_utils.py +20 -20
- ksadk/cli/dry_run.py +5 -3
- ksadk/cli/error_utils.py +37 -12
- ksadk/cli/global_options.py +1 -2
- ksadk/cli/local_runtime.py +1 -2
- ksadk/cli/model_catalog.py +6 -2
- ksadk/cli/network_options.py +34 -14
- ksadk/cli/resource_common.py +6 -2
- ksadk/cli/storage.py +0 -1
- ksadk/cli/ui.py +5 -3
- ksadk/cli/workflow_common.py +51 -17
- ksadk/codex/__init__.py +12 -0
- ksadk/codex/client.py +408 -0
- ksadk/codex/phase.py +143 -0
- ksadk/codex/runtime.py +449 -0
- ksadk/common/aicp_env.py +0 -1
- ksadk/common/auth.py +2 -2
- ksadk/common/constants.py +1 -3
- 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 -12
- ksadk/configs/env_registry.py +500 -100
- ksadk/configs/global_config.py +2 -1
- ksadk/configs/settings.py +151 -124
- ksadk/conversations/__init__.py +7 -5
- 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 +652 -0
- ksadk/conversations/runtime_invocation.py +395 -0
- ksadk/conversations/runtime_metadata.py +475 -0
- ksadk/conversations/runtime_observability.py +355 -0
- ksadk/conversations/runtime_payloads.py +272 -0
- ksadk/conversations/runtime_persistence.py +440 -0
- ksadk/conversations/runtime_preparation.py +418 -0
- ksadk/conversations/runtime_resume.py +816 -0
- ksadk/conversations/runtime_stream_events.py +902 -0
- ksadk/conversations/runtime_streaming.py +547 -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/manager.py +63 -65
- ksadk/deployment/providers/serverless.py +309 -202
- 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/events/__init__.py +25 -0
- ksadk/events/parser.py +191 -0
- ksadk/events/replay.py +37 -0
- ksadk/events/runtime_event.py +264 -0
- ksadk/events/store.py +317 -0
- ksadk/harness/__init__.py +34 -0
- ksadk/harness/app.py +278 -0
- ksadk/harness/config.py +181 -0
- ksadk/harness/reasoner.py +105 -0
- ksadk/harness/runner.py +211 -0
- ksadk/harness/sandbox.py +141 -0
- ksadk/harness/tools.py +222 -0
- ksadk/hermes_terminal.py +23 -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 +23 -29
- ksadk/managed_runtime.py +188 -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 +26 -33
- ksadk/memory/adk/long_term_memory.py +31 -35
- 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 +10 -8
- 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 +45 -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 +173 -0
- ksadk/model_proxy/protocol_proxy.py +22 -0
- ksadk/model_proxy/server.py +300 -0
- ksadk/model_proxy/transform.py +691 -0
- ksadk/openclaw_gateway.py +29 -14
- ksadk/runners/adk_runner.py +345 -120
- ksadk/runners/base_runner.py +46 -29
- ksadk/runners/codex_runner.py +132 -0
- ksadk/runners/deepagents_runner.py +0 -1
- ksadk/runners/factory.py +17 -5
- ksadk/runners/langchain_runner.py +29 -742
- ksadk/runners/langgraph_runner.py +352 -90
- ksadk/runners/patch_langchain.py +16 -16
- ksadk/runners/remote_runner.py +134 -33
- ksadk/runners/usage_accumulator.py +1 -0
- ksadk/runners/utils/langfuse.py +3 -3
- ksadk/runners/utils/loader.py +7 -7
- ksadk/runtime/__init__.py +41 -0
- ksadk/runtime/adapter.py +345 -0
- ksadk/runtime/framework_adapters.py +124 -0
- ksadk/runtime/preprocessing.py +118 -0
- ksadk/runtime/runner_adapter.py +873 -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/api_models.py +15 -5
- ksadk/server/app.py +455 -3885
- ksadk/server/composition.py +21 -0
- ksadk/server/factory.py +624 -0
- ksadk/server/routes/__init__.py +1 -0
- ksadk/server/routes/checkpoint_resolution.py +116 -0
- ksadk/server/routes/common.py +713 -0
- ksadk/server/routes/control.py +327 -0
- ksadk/server/routes/dependencies.py +98 -0
- ksadk/server/routes/misc.py +448 -0
- ksadk/server/routes/models.py +443 -0
- ksadk/server/routes/openai_compat.py +207 -0
- ksadk/server/routes/projection.py +795 -0
- ksadk/server/routes/routers.py +52 -0
- ksadk/server/routes/run.py +726 -0
- ksadk/server/routes/sessions.py +649 -0
- ksadk/server/routes/streaming.py +223 -0
- ksadk/server/routes/workspace.py +381 -0
- ksadk/server/static/assets/{ArtifactsPanel-D-SSn2ee.js → ArtifactsPanel-Cjnqt-8W.js} +1 -1
- ksadk/server/static/assets/CodeBlock-BqyqZfuB.js +9 -0
- ksadk/server/static/assets/MathMessageMarkdown-BpH7jiFM.js +8 -0
- ksadk/server/static/assets/MermaidBlock-DWuxETaJ.js +303 -0
- ksadk/server/static/assets/NativeTerminalPanel-MDTopWMO.js +1 -0
- ksadk/server/static/assets/{arc-BA13sHc9.js → arc-CFKwSk_B.js} +1 -1
- ksadk/server/static/assets/architecture-7EHR7CIX-CynqOWjZ.js +1 -0
- ksadk/server/static/assets/{architectureDiagram-3BPJPVTR-DzJzgVoL.js → architectureDiagram-3BPJPVTR-Dej8jX8c.js} +1 -1
- ksadk/server/static/assets/{blockDiagram-GPEHLZMM-UTdVcZhn.js → blockDiagram-GPEHLZMM-1F64jqvy.js} +1 -1
- ksadk/server/static/assets/{c4Diagram-AAUBKEIU-Dix0GD4m.js → c4Diagram-AAUBKEIU-9q7AUAKb.js} +1 -1
- ksadk/server/static/assets/channel-iUGv2N24.js +1 -0
- ksadk/server/static/assets/{chunk-2J33WTMH-C2JxuZ42.js → chunk-2J33WTMH-6qgwJm7Q.js} +1 -1
- ksadk/server/static/assets/{chunk-4BX2VUAB-Be57QPgD.js → chunk-4BX2VUAB-CsWIQRhc.js} +1 -1
- ksadk/server/static/assets/{chunk-55IACEB6-WjSuy4nv.js → chunk-55IACEB6-BK8paA20.js} +1 -1
- ksadk/server/static/assets/{chunk-727SXJPM-BOovP-b5.js → chunk-727SXJPM-B-JEhy7h.js} +1 -1
- ksadk/server/static/assets/{chunk-AQP2D5EJ-DOmZNmWj.js → chunk-AQP2D5EJ-DYBvMHAa.js} +1 -1
- ksadk/server/static/assets/{chunk-FMBD7UC4-DzwlodkU.js → chunk-FMBD7UC4-BGhvzDYt.js} +1 -1
- ksadk/server/static/assets/{chunk-ND2GUHAM-DMqAikEU.js → chunk-ND2GUHAM-D98vPd-E.js} +1 -1
- ksadk/server/static/assets/chunk-QZHKN3VN-YQIEXeF6.js +1 -0
- ksadk/server/static/assets/classDiagram-4FO5ZUOK-CDAUuoXK.js +1 -0
- ksadk/server/static/assets/classDiagram-v2-Q7XG4LA2-CDAUuoXK.js +1 -0
- ksadk/server/static/assets/{cose-bilkent-S5V4N54A-Zhy2GBnP.js → cose-bilkent-S5V4N54A-CX3yotHq.js} +1 -1
- ksadk/server/static/assets/{dagre-BM42HDAG-CbKrtIUz.js → dagre-BM42HDAG-C7TguAWo.js} +1 -1
- ksadk/server/static/assets/{diagram-2AECGRRQ-BRApgQRK.js → diagram-2AECGRRQ-Dd17_kws.js} +1 -1
- ksadk/server/static/assets/{diagram-5GNKFQAL-D0xbnDiK.js → diagram-5GNKFQAL-DVIClIil.js} +1 -1
- ksadk/server/static/assets/{diagram-KO2AKTUF-CVugVI9L.js → diagram-KO2AKTUF-Df_3gYQa.js} +1 -1
- ksadk/server/static/assets/{diagram-LMA3HP47-DozUGgee.js → diagram-LMA3HP47-BhLk6ZtA.js} +1 -1
- ksadk/server/static/assets/{diagram-OG6HWLK6-ZOYsKlru.js → diagram-OG6HWLK6-D4GNGvuu.js} +1 -1
- ksadk/server/static/assets/{dist-DmFaq_Iy.js → dist-6CVKuTAe.js} +1 -1
- ksadk/server/static/assets/{dist-8EEyGgDx.js → dist-BUHRxvDG.js} +1 -1
- ksadk/server/static/assets/{dist-B0NP_Z0z.js → dist-BZ9n9AjO.js} +1 -1
- ksadk/server/static/assets/{dist-DMezvBGJ.js → dist-BibcG1V9.js} +1 -1
- ksadk/server/static/assets/{dist-C3HIIaN5.js → dist-Bs-jQcRX.js} +1 -1
- ksadk/server/static/assets/{dist-BrCcQ47T.js → dist-C2xjE7cO.js} +1 -1
- ksadk/server/static/assets/{dist-Dp0k7bWI.js → dist-C7-3jInC.js} +1 -1
- ksadk/server/static/assets/{dist-D-xOD048.js → dist-C99THtIA.js} +1 -1
- ksadk/server/static/assets/{dist-CkEKJFtk.js → dist-CGcp2ex8.js} +1 -1
- ksadk/server/static/assets/{dist-DyOkZmze.js → dist-CVQRZjPu.js} +1 -1
- ksadk/server/static/assets/{dist-BssVmjIo.js → dist-Cf23NY4L.js} +1 -1
- ksadk/server/static/assets/{dist-BIJVDMuB.js → dist-CgF3fj15.js} +1 -1
- ksadk/server/static/assets/{dist-2hInLS_J.js → dist-Cwt7koer.js} +1 -1
- ksadk/server/static/assets/{dist-DyWsb78Q.js → dist-D82mtD2s.js} +1 -1
- ksadk/server/static/assets/{dist-D-JMdWPQ.js → dist-DF06ORQo.js} +1 -1
- ksadk/server/static/assets/{dist-BmlMPsCc.js → dist-DHn6nBzr.js} +1 -1
- ksadk/server/static/assets/{dist-gX6GOLKq.js → dist-Djgl2wVZ.js} +1 -1
- ksadk/server/static/assets/{dist-DpKtt4Bo.js → dist-DlzCRy0S.js} +1 -1
- ksadk/server/static/assets/{dist-8_SfK1IP.js → dist-DqNnNFrw.js} +1 -1
- ksadk/server/static/assets/{dist-D57wnGWd.js → dist-DyvYLMW9.js} +1 -1
- ksadk/server/static/assets/{dist-CPBtqRTW.js → dist-eoW6tZXA.js} +1 -1
- ksadk/server/static/assets/{dist-DL_NKc_z.js → dist-ivOya1LD.js} +1 -1
- ksadk/server/static/assets/{erDiagram-TEJ5UH35-Bk-9bgE5.js → erDiagram-TEJ5UH35-CnfRcY2M.js} +1 -1
- ksadk/server/static/assets/eventmodeling-FCH6USID-ChYO-ijM.js +1 -0
- ksadk/server/static/assets/{flowDiagram-I6XJVG4X-Dn9kZVuZ.js → flowDiagram-I6XJVG4X-DGaJjGNJ.js} +1 -1
- ksadk/server/static/assets/{ganttDiagram-6RSMTGT7-BGxXlJqm.js → ganttDiagram-6RSMTGT7-DpCoB2g9.js} +1 -1
- ksadk/server/static/assets/gitGraph-WXDBUCRP-BN_0Fk-j.js +1 -0
- ksadk/server/static/assets/{gitGraphDiagram-PVQCEYII-C7Q0X-wi.js → gitGraphDiagram-PVQCEYII-9IKVFBVT.js} +1 -1
- ksadk/server/static/assets/index-QSwCHuB8.js +177 -0
- ksadk/server/static/assets/index-jOPmTOZH.css +2 -0
- ksadk/server/static/assets/info-J43DQDTF-Cp6o3vId.js +1 -0
- ksadk/server/static/assets/{infoDiagram-5YYISTIA-BO_CSqq5.js → infoDiagram-5YYISTIA-CYIIsb8y.js} +1 -1
- ksadk/server/static/assets/{ishikawaDiagram-YF4QCWOH-eYLPLd46.js → ishikawaDiagram-YF4QCWOH-DLOHGvWw.js} +1 -1
- ksadk/server/static/assets/{journeyDiagram-JHISSGLW-De9geSb0.js → journeyDiagram-JHISSGLW-BIzKeejT.js} +1 -1
- ksadk/server/static/assets/{kanban-definition-UN3LZRKU-Cs80kQto.js → kanban-definition-UN3LZRKU-BWHoFSw2.js} +1 -1
- ksadk/server/static/assets/{katex-DSrCFD8n.js → katex-DATssjp1.js} +1 -1
- ksadk/server/static/assets/{linear-CN9sbKTF.js → linear-CvMBw9cA.js} +1 -1
- ksadk/server/static/assets/{mermaid-parser.core-DlgSBU8l.js → mermaid-parser.core-mGAcEwcq.js} +2 -2
- ksadk/server/static/assets/{mindmap-definition-RKZ34NQL-9afz7Oug.js → mindmap-definition-RKZ34NQL-CSAQxEAe.js} +1 -1
- ksadk/server/static/assets/packet-YPE3B663-wQzct3cT.js +1 -0
- ksadk/server/static/assets/pie-LRSECV5Y-BgTQiv-9.js +1 -0
- ksadk/server/static/assets/{pieDiagram-4H26LBE5-DPv_VstN.js → pieDiagram-4H26LBE5-By-ra07M.js} +1 -1
- ksadk/server/static/assets/{quadrantDiagram-W4KKPZXB-o77wZ1XK.js → quadrantDiagram-W4KKPZXB-CxIR4JXI.js} +1 -1
- ksadk/server/static/assets/radar-GUYGQ44K-BIq5fXsn.js +1 -0
- ksadk/server/static/assets/{requirementDiagram-4Y6WPE33-BYVw81VC.js → requirementDiagram-4Y6WPE33-DpW90iu3.js} +1 -1
- ksadk/server/static/assets/{sankeyDiagram-5OEKKPKP-B7nZFMKT.js → sankeyDiagram-5OEKKPKP-DpGa6EAV.js} +1 -1
- ksadk/server/static/assets/{sequenceDiagram-3UESZ5HK-BGRRrFw5.js → sequenceDiagram-3UESZ5HK-NTKNGGe5.js} +1 -1
- ksadk/server/static/assets/{stateDiagram-AJRCARHV-BUfHCoPs.js → stateDiagram-AJRCARHV-DGpd9yFG.js} +1 -1
- ksadk/server/static/assets/stateDiagram-v2-BHNVJYJU-B3o579IQ.js +1 -0
- ksadk/server/static/assets/{timeline-definition-PNZ67QCA-FbCTGrf9.js → timeline-definition-PNZ67QCA-jqoYs3jQ.js} +1 -1
- ksadk/server/static/assets/treeView-BLDUP644-Dqi-E0EM.js +1 -0
- ksadk/server/static/assets/treemap-LRROVOQU-ClQP9CJ9.js +1 -0
- ksadk/server/static/assets/{vennDiagram-CIIHVFJN-DWgwtPsJ.js → vennDiagram-CIIHVFJN-l3Z7-wbP.js} +1 -1
- ksadk/server/static/assets/wardley-L42UT6IY-8XLvnNIs.js +1 -0
- ksadk/server/static/assets/{wardleyDiagram-YWT4CUSO-2x8G-tTM.js → wardleyDiagram-YWT4CUSO-BR54GPmr.js} +1 -1
- ksadk/server/static/assets/{xychartDiagram-2RQKCTM6-Drma3AYl.js → xychartDiagram-2RQKCTM6-SkiH8GsK.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 +38 -17
- ksadk/skills/tool_defs.py +15 -10
- ksadk/terminal_exec_policy.py +3 -4
- ksadk/tools/gateway.py +92 -15
- ksadk/tools/result_budget.py +12 -4
- ksadk/toolsets/__init__.py +134 -36
- 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/exporters/inmemory_exporter.py +62 -51
- ksadk/tracing/exporters/langfuse_exporter.py +91 -76
- ksadk/tracing/setup.py +69 -53
- ksadk/tracing/span_utils.py +5 -2
- 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/schemas/runtime_event_v1.json +95 -0
- agentengine_sdk_python-0.7.0.dist-info/RECORD +0 -482
- 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
- {agentengine_sdk_python-0.7.0.dist-info → agentengine_sdk_python-0.8.0.dist-info}/WHEEL +0 -0
- {agentengine_sdk_python-0.7.0.dist-info → agentengine_sdk_python-0.8.0.dist-info}/entry_points.txt +0 -0
- {agentengine_sdk_python-0.7.0.dist-info → agentengine_sdk_python-0.8.0.dist-info}/licenses/LICENSE +0 -0
- {agentengine_sdk_python-0.7.0.dist-info → agentengine_sdk_python-0.8.0.dist-info}/top_level.txt +0 -0
|
@@ -0,0 +1,448 @@
|
|
|
1
|
+
"""Static UI, builder, trace, feedback, and ADK compatibility routes."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
import json
|
|
6
|
+
import time
|
|
7
|
+
import uuid
|
|
8
|
+
from collections.abc import Mapping
|
|
9
|
+
from typing import Any, Dict, List, Optional, cast
|
|
10
|
+
|
|
11
|
+
from fastapi import HTTPException, Request
|
|
12
|
+
|
|
13
|
+
from ksadk.sessions import SessionEvent
|
|
14
|
+
from ksadk.tracing import get_memory_exporter
|
|
15
|
+
|
|
16
|
+
from . import dependencies as deps
|
|
17
|
+
from .common import (
|
|
18
|
+
_action_response,
|
|
19
|
+
_ensure_runner_loaded,
|
|
20
|
+
_ensure_session,
|
|
21
|
+
_hydrate_session,
|
|
22
|
+
_resolve_ui_static_response,
|
|
23
|
+
)
|
|
24
|
+
from .models import ResponseFeedbackRefActionRequest, UpsertResponseFeedbackActionRequest
|
|
25
|
+
from .routers import (
|
|
26
|
+
builder_router,
|
|
27
|
+
debug_router,
|
|
28
|
+
feedback_router,
|
|
29
|
+
health_meta_router,
|
|
30
|
+
models_router,
|
|
31
|
+
sessions_adk_compat_router,
|
|
32
|
+
)
|
|
33
|
+
from .workspace import ListAgentModelsRequest, _build_models_payload
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
@health_meta_router.get("/{requested_path:path}", include_in_schema=False)
|
|
37
|
+
async def serve_agent_ui_static(requested_path: str):
|
|
38
|
+
response = _resolve_ui_static_response(requested_path)
|
|
39
|
+
if response is not None:
|
|
40
|
+
return response
|
|
41
|
+
raise HTTPException(status_code=404, detail="Not Found")
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
# ============================================================
|
|
45
|
+
# goal-01: create_runtime_app factory 装配(普通 runtime app 与 HarnessApp 共用入口)
|
|
46
|
+
# ============================================================
|
|
47
|
+
|
|
48
|
+
# ---- builder 域(ADK-Web stub)----
|
|
49
|
+
|
|
50
|
+
|
|
51
|
+
@builder_router.get("/builder/app/{app_name}")
|
|
52
|
+
async def get_agent_builder(
|
|
53
|
+
app_name: str, ts: int = 0, tmp: bool = False, file_path: Optional[str] = None
|
|
54
|
+
):
|
|
55
|
+
"""Get agent builder config - stub for ADK-Web"""
|
|
56
|
+
# Return minimal YAML config for non-ADK projects
|
|
57
|
+
return f"""name: {app_name}
|
|
58
|
+
model: glm-5.1
|
|
59
|
+
description: {app_name} agent
|
|
60
|
+
instruction: You are a helpful assistant.
|
|
61
|
+
"""
|
|
62
|
+
|
|
63
|
+
|
|
64
|
+
@builder_router.post("/builder/save")
|
|
65
|
+
async def save_agent_builder(request: Request, tmp: bool = False):
|
|
66
|
+
"""Save agent builder config - stub for ADK-Web"""
|
|
67
|
+
return True
|
|
68
|
+
|
|
69
|
+
|
|
70
|
+
# ---- models 域 ----
|
|
71
|
+
|
|
72
|
+
|
|
73
|
+
@models_router.post("/agentengine/api/v1/ListAgentModels")
|
|
74
|
+
async def list_agent_models_action(_request: ListAgentModelsRequest):
|
|
75
|
+
payload = await _build_models_payload()
|
|
76
|
+
return _action_response(
|
|
77
|
+
"ListAgentModels",
|
|
78
|
+
{
|
|
79
|
+
"Models": payload.get("data", []),
|
|
80
|
+
"Current": payload.get("current"),
|
|
81
|
+
"Source": payload.get("source", ""),
|
|
82
|
+
},
|
|
83
|
+
)
|
|
84
|
+
|
|
85
|
+
|
|
86
|
+
# ---- debug 域(OpenTelemetry trace 查询)----
|
|
87
|
+
|
|
88
|
+
|
|
89
|
+
@debug_router.get("/debug/trace/session/{session_id}")
|
|
90
|
+
async def get_session_trace(session_id: str):
|
|
91
|
+
"""Get traces for a session - returns array of Span objects"""
|
|
92
|
+
exporter = get_memory_exporter()
|
|
93
|
+
if not exporter:
|
|
94
|
+
return [] # Return empty array, not object
|
|
95
|
+
|
|
96
|
+
# Get all spans and transform to ADK-Web expected format
|
|
97
|
+
raw_spans = exporter.get_finished_spans()
|
|
98
|
+
|
|
99
|
+
# Get session events for invocation mapping
|
|
100
|
+
service = deps.resolve_session_service()
|
|
101
|
+
events = await service.get_events(session_id)
|
|
102
|
+
|
|
103
|
+
# Build invocation ID mapping from session events
|
|
104
|
+
invocation_ids = {}
|
|
105
|
+
for event in events:
|
|
106
|
+
if event.id and event.invocation_id:
|
|
107
|
+
invocation_ids[event.id] = event.invocation_id
|
|
108
|
+
|
|
109
|
+
# Transform spans to ADK-Web format
|
|
110
|
+
spans = []
|
|
111
|
+
for span in raw_spans:
|
|
112
|
+
# Use session_id as trace_id for grouping
|
|
113
|
+
trace_id = span.get("trace_id", session_id)
|
|
114
|
+
|
|
115
|
+
# Get or create invocation_id
|
|
116
|
+
invocation_id = span.get("attributes", {}).get("gcp.vertex.agent.invocation_id")
|
|
117
|
+
if not invocation_id:
|
|
118
|
+
# Try to derive from event association
|
|
119
|
+
invocation_id = trace_id[:36] if len(trace_id) >= 36 else trace_id
|
|
120
|
+
|
|
121
|
+
# Build attributes with required ADK fields
|
|
122
|
+
attrs = span.get("attributes", {}).copy()
|
|
123
|
+
attrs["gcp.vertex.agent.invocation_id"] = invocation_id
|
|
124
|
+
|
|
125
|
+
# If this is a LLM span, add request/response
|
|
126
|
+
if "llm" in span.get("name", "").lower() or "invoke" in span.get("name", "").lower():
|
|
127
|
+
if "user.input" in attrs:
|
|
128
|
+
attrs["gcp.vertex.agent.llm_request"] = json.dumps(
|
|
129
|
+
{
|
|
130
|
+
"contents": [
|
|
131
|
+
{"role": "user", "parts": [{"text": attrs.get("user.input", "")}]}
|
|
132
|
+
]
|
|
133
|
+
}
|
|
134
|
+
)
|
|
135
|
+
if "agent.output" in attrs:
|
|
136
|
+
attrs["gcp.vertex.agent.llm_response"] = json.dumps(
|
|
137
|
+
{
|
|
138
|
+
"candidates": [
|
|
139
|
+
{
|
|
140
|
+
"content": {
|
|
141
|
+
"role": "model",
|
|
142
|
+
"parts": [{"text": attrs.get("agent.output", "")}],
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
]
|
|
146
|
+
}
|
|
147
|
+
)
|
|
148
|
+
|
|
149
|
+
formatted_span = {
|
|
150
|
+
"trace_id": trace_id,
|
|
151
|
+
"span_id": span.get("span_id", str(uuid.uuid4())[:16]),
|
|
152
|
+
"parent_span_id": span.get("parent_span_id"),
|
|
153
|
+
"name": span.get("name", "unknown"),
|
|
154
|
+
"start_time": span.get("start_time", 0),
|
|
155
|
+
"end_time": span.get("end_time", 0),
|
|
156
|
+
"attributes": attrs,
|
|
157
|
+
"status": span.get("status", {}),
|
|
158
|
+
}
|
|
159
|
+
spans.append(formatted_span)
|
|
160
|
+
|
|
161
|
+
return spans # Return array directly
|
|
162
|
+
|
|
163
|
+
|
|
164
|
+
@debug_router.get("/debug/trace/{event_id}")
|
|
165
|
+
async def get_event_trace(event_id: str):
|
|
166
|
+
"""Get trace for a specific event - returns array of Span objects"""
|
|
167
|
+
exporter = get_memory_exporter()
|
|
168
|
+
if not exporter:
|
|
169
|
+
return []
|
|
170
|
+
|
|
171
|
+
spans = exporter.get_finished_spans()
|
|
172
|
+
# Filter by event_id or return recent spans
|
|
173
|
+
filtered = [s for s in spans if s.get("attributes", {}).get("event_id") == event_id]
|
|
174
|
+
return filtered if filtered else spans[-10:]
|
|
175
|
+
|
|
176
|
+
|
|
177
|
+
@debug_router.get("/traces")
|
|
178
|
+
async def get_traces(limit: int = 50):
|
|
179
|
+
"""Get recent traces (OpenTelemetry)"""
|
|
180
|
+
exporter = get_memory_exporter()
|
|
181
|
+
if not exporter:
|
|
182
|
+
return {"traces": []}
|
|
183
|
+
|
|
184
|
+
spans = exporter.get_finished_spans()
|
|
185
|
+
traces = []
|
|
186
|
+
for span in spans[-limit:]:
|
|
187
|
+
traces.append(
|
|
188
|
+
{
|
|
189
|
+
"name": span.get("name", "unknown"),
|
|
190
|
+
"status": span.get("status", {}).get("code", "UNSET"),
|
|
191
|
+
"start_time": span.get("start_time"),
|
|
192
|
+
"end_time": span.get("end_time"),
|
|
193
|
+
"attributes": span.get("attributes", {}),
|
|
194
|
+
}
|
|
195
|
+
)
|
|
196
|
+
return {"traces": traces}
|
|
197
|
+
|
|
198
|
+
|
|
199
|
+
# ---- feedback 域 ----
|
|
200
|
+
|
|
201
|
+
|
|
202
|
+
def _feedback_state_key(response_id: str) -> str:
|
|
203
|
+
return str(response_id or "").strip()
|
|
204
|
+
|
|
205
|
+
|
|
206
|
+
def _feedback_payload_from_state(item: Mapping[str, Any] | None) -> dict[str, Any] | None:
|
|
207
|
+
if not isinstance(item, Mapping):
|
|
208
|
+
return None
|
|
209
|
+
rating = str(item.get("Rating") or item.get("rating") or "").strip().lower()
|
|
210
|
+
if rating not in {"up", "down"}:
|
|
211
|
+
return None
|
|
212
|
+
return {
|
|
213
|
+
"AgentId": str(item.get("AgentId") or item.get("agent_id") or ""),
|
|
214
|
+
"SessionId": str(item.get("SessionId") or item.get("session_id") or ""),
|
|
215
|
+
"ResponseId": str(item.get("ResponseId") or item.get("response_id") or ""),
|
|
216
|
+
"EventId": str(item.get("EventId") or item.get("event_id") or ""),
|
|
217
|
+
"Rating": rating,
|
|
218
|
+
"Comment": str(item.get("Comment") or item.get("comment") or ""),
|
|
219
|
+
"TraceId": str(item.get("TraceId") or item.get("trace_id") or ""),
|
|
220
|
+
"RootSpanId": str(item.get("RootSpanId") or item.get("root_span_id") or ""),
|
|
221
|
+
"CreatedAt": str(item.get("CreatedAt") or item.get("created_at") or ""),
|
|
222
|
+
"UpdatedAt": str(item.get("UpdatedAt") or item.get("updated_at") or ""),
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
|
|
226
|
+
async def _find_feedback_assistant_event(
|
|
227
|
+
*,
|
|
228
|
+
session_id: str,
|
|
229
|
+
response_id: str,
|
|
230
|
+
event_id: str | None = None,
|
|
231
|
+
) -> SessionEvent | None:
|
|
232
|
+
events = await deps.resolve_session_service().get_events(session_id)
|
|
233
|
+
normalized_event_id = str(event_id or "").strip()
|
|
234
|
+
normalized_response_id = str(response_id or "").strip()
|
|
235
|
+
for event in reversed(events):
|
|
236
|
+
if normalized_event_id and event.id != normalized_event_id:
|
|
237
|
+
continue
|
|
238
|
+
metadata = event.metadata or {}
|
|
239
|
+
if (
|
|
240
|
+
normalized_response_id
|
|
241
|
+
and str(metadata.get("response_id") or "") != normalized_response_id
|
|
242
|
+
):
|
|
243
|
+
continue
|
|
244
|
+
event_type = deps.conversation().canonical_event_type(
|
|
245
|
+
event.event_type,
|
|
246
|
+
author=event.author,
|
|
247
|
+
role=str((event.content or {}).get("role") or ""),
|
|
248
|
+
)
|
|
249
|
+
if event_type == "assistant_message":
|
|
250
|
+
return cast(SessionEvent, event)
|
|
251
|
+
return None
|
|
252
|
+
|
|
253
|
+
|
|
254
|
+
@feedback_router.post("/agentengine/api/v1/GetResponseFeedback")
|
|
255
|
+
async def get_response_feedback_action(request: ResponseFeedbackRefActionRequest):
|
|
256
|
+
session = await deps.resolve_session_service().get_session(request.SessionId)
|
|
257
|
+
if not session or session.agent_id != request.AgentId:
|
|
258
|
+
return _action_response("GetResponseFeedback", {"Feedback": None})
|
|
259
|
+
feedbacks = session.state.get("__ksadk_response_feedback__")
|
|
260
|
+
feedback = None
|
|
261
|
+
if isinstance(feedbacks, Mapping):
|
|
262
|
+
feedback = _feedback_payload_from_state(
|
|
263
|
+
feedbacks.get(_feedback_state_key(request.ResponseId))
|
|
264
|
+
)
|
|
265
|
+
return _action_response("GetResponseFeedback", {"Feedback": feedback})
|
|
266
|
+
|
|
267
|
+
|
|
268
|
+
@feedback_router.post("/agentengine/api/v1/UpsertResponseFeedback")
|
|
269
|
+
async def upsert_response_feedback_action(request: UpsertResponseFeedbackActionRequest):
|
|
270
|
+
rating = str(request.Rating or "").strip().lower()
|
|
271
|
+
if rating not in {"up", "down"}:
|
|
272
|
+
raise HTTPException(status_code=400, detail="Feedback rating must be up or down")
|
|
273
|
+
|
|
274
|
+
service = deps.resolve_session_service()
|
|
275
|
+
session = await service.get_session(request.SessionId)
|
|
276
|
+
if not session or session.agent_id != request.AgentId:
|
|
277
|
+
raise HTTPException(status_code=404, detail="Session not found")
|
|
278
|
+
|
|
279
|
+
assistant_event = await _find_feedback_assistant_event(
|
|
280
|
+
session_id=request.SessionId,
|
|
281
|
+
response_id=request.ResponseId,
|
|
282
|
+
event_id=request.EventId,
|
|
283
|
+
)
|
|
284
|
+
if assistant_event is None:
|
|
285
|
+
raise HTTPException(status_code=404, detail="Assistant response not found")
|
|
286
|
+
|
|
287
|
+
now = str(time.time())
|
|
288
|
+
existing_feedbacks = session.state.get("__ksadk_response_feedback__")
|
|
289
|
+
feedbacks = dict(existing_feedbacks) if isinstance(existing_feedbacks, Mapping) else {}
|
|
290
|
+
existing = (
|
|
291
|
+
_feedback_payload_from_state(feedbacks.get(_feedback_state_key(request.ResponseId))) or {}
|
|
292
|
+
)
|
|
293
|
+
metadata = assistant_event.metadata or {}
|
|
294
|
+
feedback = {
|
|
295
|
+
"AgentId": request.AgentId,
|
|
296
|
+
"SessionId": request.SessionId,
|
|
297
|
+
"ResponseId": request.ResponseId,
|
|
298
|
+
"EventId": request.EventId or assistant_event.id,
|
|
299
|
+
"Rating": rating,
|
|
300
|
+
"Comment": request.Comment or "",
|
|
301
|
+
"TraceId": request.TraceId or str(metadata.get("trace_id") or ""),
|
|
302
|
+
"RootSpanId": request.RootSpanId or str(metadata.get("root_span_id") or ""),
|
|
303
|
+
"CreatedAt": existing.get("CreatedAt") or now,
|
|
304
|
+
"UpdatedAt": now,
|
|
305
|
+
}
|
|
306
|
+
feedbacks[_feedback_state_key(request.ResponseId)] = feedback
|
|
307
|
+
await service.update_state(
|
|
308
|
+
agent_id=session.agent_id,
|
|
309
|
+
user_id=session.user_id,
|
|
310
|
+
session_id=session.id,
|
|
311
|
+
scope="session",
|
|
312
|
+
state_delta={"__ksadk_response_feedback__": feedbacks},
|
|
313
|
+
)
|
|
314
|
+
return _action_response("UpsertResponseFeedback", {"Feedback": feedback})
|
|
315
|
+
|
|
316
|
+
|
|
317
|
+
@feedback_router.post("/agentengine/api/v1/DeleteResponseFeedback")
|
|
318
|
+
async def delete_response_feedback_action(request: ResponseFeedbackRefActionRequest):
|
|
319
|
+
service = deps.resolve_session_service()
|
|
320
|
+
session = await service.get_session(request.SessionId)
|
|
321
|
+
if not session or session.agent_id != request.AgentId:
|
|
322
|
+
return _action_response("DeleteResponseFeedback", {"Deleted": False})
|
|
323
|
+
existing_feedbacks = session.state.get("__ksadk_response_feedback__")
|
|
324
|
+
feedbacks = dict(existing_feedbacks) if isinstance(existing_feedbacks, Mapping) else {}
|
|
325
|
+
deleted = feedbacks.pop(_feedback_state_key(request.ResponseId), None) is not None
|
|
326
|
+
if deleted:
|
|
327
|
+
await service.update_state(
|
|
328
|
+
agent_id=session.agent_id,
|
|
329
|
+
user_id=session.user_id,
|
|
330
|
+
session_id=session.id,
|
|
331
|
+
scope="session",
|
|
332
|
+
state_delta={"__ksadk_response_feedback__": feedbacks},
|
|
333
|
+
)
|
|
334
|
+
return _action_response("DeleteResponseFeedback", {"Deleted": deleted})
|
|
335
|
+
|
|
336
|
+
|
|
337
|
+
# ---- sessions_adk_compat 域(ADK-Web 兼容)----
|
|
338
|
+
|
|
339
|
+
|
|
340
|
+
@sessions_adk_compat_router.post("/apps/{app_name}/users/{user_id}/sessions")
|
|
341
|
+
async def create_session(app_name: str, user_id: str, request: Request):
|
|
342
|
+
"""Create a new session"""
|
|
343
|
+
# Check if importing existing events
|
|
344
|
+
body = {}
|
|
345
|
+
try:
|
|
346
|
+
body = await request.json()
|
|
347
|
+
except Exception:
|
|
348
|
+
pass
|
|
349
|
+
|
|
350
|
+
service = deps.resolve_session_service()
|
|
351
|
+
session = await _ensure_session(app_name, user_id, body.get("sessionId") or body.get("id"))
|
|
352
|
+
|
|
353
|
+
for raw_event in body.get("events", []):
|
|
354
|
+
session_event = SessionEvent.from_dict(raw_event, session_id=session.id)
|
|
355
|
+
await service.append_event(session.id, session_event)
|
|
356
|
+
|
|
357
|
+
hydrated = await _hydrate_session(await service.get_session(session.id))
|
|
358
|
+
return hydrated.to_legacy_dict() if hydrated else session.to_legacy_dict()
|
|
359
|
+
|
|
360
|
+
|
|
361
|
+
@sessions_adk_compat_router.get("/apps/{app_name}/users/{user_id}/sessions")
|
|
362
|
+
async def list_sessions(app_name: str, user_id: str):
|
|
363
|
+
"""List all sessions for a user"""
|
|
364
|
+
service = deps.resolve_session_service()
|
|
365
|
+
sessions = await service.list_sessions(app_name, user_id)
|
|
366
|
+
hydrated: List[Dict[str, Any]] = []
|
|
367
|
+
for session in sessions:
|
|
368
|
+
session.events = await service.get_events(session.id)
|
|
369
|
+
hydrated.append(session.to_legacy_dict())
|
|
370
|
+
return hydrated
|
|
371
|
+
|
|
372
|
+
|
|
373
|
+
@sessions_adk_compat_router.get("/apps/{app_name}/users/{user_id}/sessions/{session_id}")
|
|
374
|
+
async def get_session(app_name: str, user_id: str, session_id: str):
|
|
375
|
+
"""Get a specific session with its events"""
|
|
376
|
+
service = deps.resolve_session_service()
|
|
377
|
+
session = await _hydrate_session(await service.get_session(session_id))
|
|
378
|
+
if not session:
|
|
379
|
+
raise HTTPException(status_code=404, detail="Session not found")
|
|
380
|
+
return session.to_legacy_dict()
|
|
381
|
+
|
|
382
|
+
|
|
383
|
+
@sessions_adk_compat_router.delete("/apps/{app_name}/users/{user_id}/sessions/{session_id}")
|
|
384
|
+
async def delete_session(app_name: str, user_id: str, session_id: str):
|
|
385
|
+
"""Delete a session"""
|
|
386
|
+
service = deps.resolve_session_service()
|
|
387
|
+
if await service.delete_session(session_id):
|
|
388
|
+
return {"status": "deleted"}
|
|
389
|
+
raise HTTPException(status_code=404, detail="Session not found")
|
|
390
|
+
|
|
391
|
+
|
|
392
|
+
@sessions_adk_compat_router.post(
|
|
393
|
+
"/apps/{app_name}/users/{user_id}/sessions/{session_id}/save_memory"
|
|
394
|
+
)
|
|
395
|
+
async def save_session_to_memory(app_name: str, user_id: str, session_id: str):
|
|
396
|
+
"""将指定 session 保存到长期记忆
|
|
397
|
+
|
|
398
|
+
当配置了 KSADK_LTM_BACKEND 时,将 session 中的用户消息
|
|
399
|
+
持久化到长期记忆后端,供后续 session 通过 load_memory 工具检索。
|
|
400
|
+
"""
|
|
401
|
+
active_runner = _ensure_runner_loaded()
|
|
402
|
+
|
|
403
|
+
# 检查 runner 是否支持长期记忆
|
|
404
|
+
from ksadk.runners.adk_runner import ADKRunner as _ADKRunner
|
|
405
|
+
|
|
406
|
+
if not isinstance(active_runner, _ADKRunner):
|
|
407
|
+
raise HTTPException(
|
|
408
|
+
status_code=400, detail="Long-term memory is only supported with ADK runner"
|
|
409
|
+
)
|
|
410
|
+
|
|
411
|
+
if not active_runner._long_term_memory:
|
|
412
|
+
raise HTTPException(
|
|
413
|
+
status_code=400,
|
|
414
|
+
detail="Long-term memory not configured. Set KSADK_LTM_BACKEND environment variable.",
|
|
415
|
+
)
|
|
416
|
+
|
|
417
|
+
# 查找 ADK 内部 session ID
|
|
418
|
+
internal_session_id = active_runner._session_map.get(session_id, session_id)
|
|
419
|
+
|
|
420
|
+
success = await active_runner.save_session_to_long_term_memory(
|
|
421
|
+
session_id=internal_session_id,
|
|
422
|
+
user_id=user_id,
|
|
423
|
+
)
|
|
424
|
+
|
|
425
|
+
if success:
|
|
426
|
+
return {"status": "saved", "session_id": session_id}
|
|
427
|
+
else:
|
|
428
|
+
raise HTTPException(status_code=500, detail="Failed to save session to long-term memory")
|
|
429
|
+
|
|
430
|
+
|
|
431
|
+
@sessions_adk_compat_router.get(
|
|
432
|
+
"/apps/{app_name}/users/{user_id}/sessions/{session_id}/events/{event_id}/graph"
|
|
433
|
+
)
|
|
434
|
+
async def get_event_graph(app_name: str, user_id: str, session_id: str, event_id: str):
|
|
435
|
+
"""Get event graph (DOT format) - placeholder"""
|
|
436
|
+
return {"dotSrc": None}
|
|
437
|
+
|
|
438
|
+
|
|
439
|
+
@sessions_adk_compat_router.get("/apps/{app_name}/eval_sets")
|
|
440
|
+
async def list_eval_sets(app_name: str):
|
|
441
|
+
"""List evaluation sets - stub for ADK-Web"""
|
|
442
|
+
return []
|
|
443
|
+
|
|
444
|
+
|
|
445
|
+
@sessions_adk_compat_router.get("/apps/{app_name}/eval_results")
|
|
446
|
+
async def list_eval_results(app_name: str):
|
|
447
|
+
"""List evaluation results - stub for ADK-Web"""
|
|
448
|
+
return []
|