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.
Files changed (371) hide show
  1. {agentengine_sdk_python-0.7.0.dist-info → agentengine_sdk_python-0.8.0.dist-info}/METADATA +36 -20
  2. agentengine_sdk_python-0.8.0.dist-info/RECORD +578 -0
  3. ksadk/a2a/__init__.py +178 -11
  4. ksadk/a2a/bootstrap.py +334 -0
  5. ksadk/a2a/card.py +120 -0
  6. ksadk/a2a/context_store.py +203 -0
  7. ksadk/a2a/control_plane.py +818 -0
  8. ksadk/a2a/credential.py +99 -0
  9. ksadk/a2a/event_adapter.py +149 -0
  10. ksadk/a2a/executor.py +406 -89
  11. ksadk/a2a/external_transport.py +516 -0
  12. ksadk/a2a/identity.py +304 -0
  13. ksadk/a2a/ids.py +22 -0
  14. ksadk/a2a/langgraph.py +285 -0
  15. ksadk/a2a/resume_store.py +201 -0
  16. ksadk/a2a/routes.py +105 -0
  17. ksadk/a2a/server.py +107 -60
  18. ksadk/a2a/space_client.py +1101 -0
  19. ksadk/a2a/task_adapter.py +423 -0
  20. ksadk/a2a/task_event_dispatcher.py +167 -0
  21. ksadk/a2a/task_event_outbox.py +326 -0
  22. ksadk/a2a/task_store.py +206 -0
  23. ksadk/a2ui/__init__.py +27 -0
  24. ksadk/a2ui/core.py +186 -0
  25. ksadk/a2ui/models.py +166 -0
  26. ksadk/a2ui/renderer.py +198 -0
  27. ksadk/agui/__init__.py +9 -0
  28. ksadk/agui/a2ui_projection.py +92 -0
  29. ksadk/agui/agent.py +857 -0
  30. ksadk/agui/config.py +86 -0
  31. ksadk/agui/routes.py +55 -0
  32. ksadk/api/client.py +233 -191
  33. ksadk/builders/__init__.py +2 -0
  34. ksadk/builders/base.py +16 -14
  35. ksadk/builders/code_builder.py +318 -236
  36. ksadk/builders/container_builder.py +187 -167
  37. ksadk/builders/framework_requirements.py +29 -11
  38. ksadk/builders/ks3_uploader.py +58 -27
  39. ksadk/builders/managed_runtime_builder.py +145 -0
  40. ksadk/builders/mcp_builder.py +91 -92
  41. ksadk/builders/requirements_utils.py +1 -5
  42. ksadk/cli/__init__.py +89 -171
  43. ksadk/cli/cmd_a2a.py +254 -70
  44. ksadk/cli/cmd_agent.py +19 -5
  45. ksadk/cli/cmd_build.py +158 -29
  46. ksadk/cli/cmd_completion.py +47 -35
  47. ksadk/cli/cmd_config.py +267 -198
  48. ksadk/cli/cmd_create.py +500 -720
  49. ksadk/cli/cmd_dashboard.py +120 -45
  50. ksadk/cli/cmd_deploy.py +117 -58
  51. ksadk/cli/cmd_destroy.py +44 -14
  52. ksadk/cli/cmd_files.py +63 -24
  53. ksadk/cli/cmd_hermes.py +168 -89
  54. ksadk/cli/cmd_invoke.py +184 -122
  55. ksadk/cli/cmd_launch.py +64 -28
  56. ksadk/cli/cmd_mcp.py +98 -64
  57. ksadk/cli/cmd_model.py +14 -5
  58. ksadk/cli/cmd_openclaw.py +483 -227
  59. ksadk/cli/cmd_replay.py +71 -0
  60. ksadk/cli/cmd_run.py +33 -10
  61. ksadk/cli/cmd_status.py +80 -31
  62. ksadk/cli/cmd_version.py +20 -13
  63. ksadk/cli/cmd_web.py +89 -13
  64. ksadk/cli/deploy_utils.py +20 -20
  65. ksadk/cli/dry_run.py +5 -3
  66. ksadk/cli/error_utils.py +37 -12
  67. ksadk/cli/global_options.py +1 -2
  68. ksadk/cli/local_runtime.py +1 -2
  69. ksadk/cli/model_catalog.py +6 -2
  70. ksadk/cli/network_options.py +34 -14
  71. ksadk/cli/resource_common.py +6 -2
  72. ksadk/cli/storage.py +0 -1
  73. ksadk/cli/ui.py +5 -3
  74. ksadk/cli/workflow_common.py +51 -17
  75. ksadk/codex/__init__.py +12 -0
  76. ksadk/codex/client.py +408 -0
  77. ksadk/codex/phase.py +143 -0
  78. ksadk/codex/runtime.py +449 -0
  79. ksadk/common/aicp_env.py +0 -1
  80. ksadk/common/auth.py +2 -2
  81. ksadk/common/constants.py +1 -3
  82. ksadk/common/llm_utils.py +17 -13
  83. ksadk/compat/__init__.py +5 -0
  84. ksadk/compat/adk_compat.py +200 -0
  85. ksadk/compat/copilotkit_a2ui.py +330 -0
  86. ksadk/configs/__init__.py +12 -12
  87. ksadk/configs/env_registry.py +500 -100
  88. ksadk/configs/global_config.py +2 -1
  89. ksadk/configs/settings.py +151 -124
  90. ksadk/conversations/__init__.py +7 -5
  91. ksadk/conversations/attachment_storage.py +16 -11
  92. ksadk/conversations/attachments.py +44 -36
  93. ksadk/conversations/compaction_pipeline.py +12 -12
  94. ksadk/conversations/compaction_prompt.py +9 -5
  95. ksadk/conversations/context.py +221 -6
  96. ksadk/conversations/message_projection.py +438 -51
  97. ksadk/conversations/model_context.py +12 -6
  98. ksadk/conversations/model_options.py +0 -1
  99. ksadk/conversations/normalize.py +20 -16
  100. ksadk/conversations/reasoning_markup.py +1 -1
  101. ksadk/conversations/runtime.py +339 -5255
  102. ksadk/conversations/runtime_compaction.py +333 -0
  103. ksadk/conversations/runtime_constants.py +27 -0
  104. ksadk/conversations/runtime_governance.py +185 -0
  105. ksadk/conversations/runtime_input.py +652 -0
  106. ksadk/conversations/runtime_invocation.py +395 -0
  107. ksadk/conversations/runtime_metadata.py +475 -0
  108. ksadk/conversations/runtime_observability.py +355 -0
  109. ksadk/conversations/runtime_payloads.py +272 -0
  110. ksadk/conversations/runtime_persistence.py +440 -0
  111. ksadk/conversations/runtime_preparation.py +418 -0
  112. ksadk/conversations/runtime_resume.py +816 -0
  113. ksadk/conversations/runtime_stream_events.py +902 -0
  114. ksadk/conversations/runtime_streaming.py +547 -0
  115. ksadk/conversations/semantic_summary.py +17 -5
  116. ksadk/conversations/session_title.py +6 -3
  117. ksadk/deployment/__init__.py +15 -16
  118. ksadk/deployment/agent_access.py +12 -23
  119. ksadk/deployment/base.py +51 -38
  120. ksadk/deployment/manager.py +63 -65
  121. ksadk/deployment/providers/serverless.py +309 -202
  122. ksadk/deployment/registry.py +38 -32
  123. ksadk/deployment/state.py +11 -11
  124. ksadk/deployment/ui_config.py +1 -1
  125. ksadk/detection/__init__.py +1 -1
  126. ksadk/detection/detector.py +146 -83
  127. ksadk/detection/mcp_detector.py +9 -6
  128. ksadk/events/__init__.py +25 -0
  129. ksadk/events/parser.py +191 -0
  130. ksadk/events/replay.py +37 -0
  131. ksadk/events/runtime_event.py +264 -0
  132. ksadk/events/store.py +317 -0
  133. ksadk/harness/__init__.py +34 -0
  134. ksadk/harness/app.py +278 -0
  135. ksadk/harness/config.py +181 -0
  136. ksadk/harness/reasoner.py +105 -0
  137. ksadk/harness/runner.py +211 -0
  138. ksadk/harness/sandbox.py +141 -0
  139. ksadk/harness/tools.py +222 -0
  140. ksadk/hermes_terminal.py +23 -12
  141. ksadk/identity/resolver.py +15 -9
  142. ksadk/ids.py +32 -0
  143. ksadk/knowledge_base/adk_tool.py +1 -1
  144. ksadk/knowledge_base/client.py +23 -29
  145. ksadk/managed_runtime.py +188 -0
  146. ksadk/markdown.py +5 -2
  147. ksadk/mcp_runtime/__init__.py +9 -6
  148. ksadk/memory/__init__.py +1 -1
  149. ksadk/memory/adk/__init__.py +2 -0
  150. ksadk/memory/adk/backends/base_ltm_backend.py +2 -6
  151. ksadk/memory/adk/backends/http_ltm_backend.py +13 -21
  152. ksadk/memory/adk/backends/inmemory_ltm_backend.py +7 -13
  153. ksadk/memory/adk/backends/sdk_ltm_backend.py +26 -33
  154. ksadk/memory/adk/long_term_memory.py +31 -35
  155. ksadk/memory/adk/resilient_session_service.py +4 -5
  156. ksadk/memory/adk/short_term_memory.py +12 -21
  157. ksadk/memory/adk_tool.py +3 -2
  158. ksadk/memory/backends/base.py +19 -19
  159. ksadk/memory/backends/memory.py +24 -25
  160. ksadk/memory/backends/redis.py +31 -30
  161. ksadk/memory/langchain_tool.py +2 -1
  162. ksadk/memory/manager.py +52 -47
  163. ksadk/memory/service.py +10 -8
  164. ksadk/model_policy.py +15 -7
  165. ksadk/model_proxy/__init__.py +51 -0
  166. ksadk/model_proxy/bootstrap.py +80 -0
  167. ksadk/model_proxy/cache.py +165 -0
  168. ksadk/model_proxy/config.py +45 -0
  169. ksadk/model_proxy/demo_webui.py +115 -0
  170. ksadk/model_proxy/detect.py +145 -0
  171. ksadk/model_proxy/gate.py +68 -0
  172. ksadk/model_proxy/namespace.py +173 -0
  173. ksadk/model_proxy/protocol_proxy.py +22 -0
  174. ksadk/model_proxy/server.py +300 -0
  175. ksadk/model_proxy/transform.py +691 -0
  176. ksadk/openclaw_gateway.py +29 -14
  177. ksadk/runners/adk_runner.py +345 -120
  178. ksadk/runners/base_runner.py +46 -29
  179. ksadk/runners/codex_runner.py +132 -0
  180. ksadk/runners/deepagents_runner.py +0 -1
  181. ksadk/runners/factory.py +17 -5
  182. ksadk/runners/langchain_runner.py +29 -742
  183. ksadk/runners/langgraph_runner.py +352 -90
  184. ksadk/runners/patch_langchain.py +16 -16
  185. ksadk/runners/remote_runner.py +134 -33
  186. ksadk/runners/usage_accumulator.py +1 -0
  187. ksadk/runners/utils/langfuse.py +3 -3
  188. ksadk/runners/utils/loader.py +7 -7
  189. ksadk/runtime/__init__.py +41 -0
  190. ksadk/runtime/adapter.py +345 -0
  191. ksadk/runtime/framework_adapters.py +124 -0
  192. ksadk/runtime/preprocessing.py +118 -0
  193. ksadk/runtime/runner_adapter.py +873 -0
  194. ksadk/runtime_context.py +18 -3
  195. ksadk/runtime_state.py +0 -1
  196. ksadk/sandbox/__init__.py +4 -1
  197. ksadk/sandbox/backends/__init__.py +4 -1
  198. ksadk/sandbox/backends/e2b.py +13 -5
  199. ksadk/sandbox/backends/local_process.py +11 -3
  200. ksadk/sandbox/base.py +10 -15
  201. ksadk/sandbox/factory.py +14 -4
  202. ksadk/sandbox/registry.py +57 -6
  203. ksadk/server/api_models.py +15 -5
  204. ksadk/server/app.py +455 -3885
  205. ksadk/server/composition.py +21 -0
  206. ksadk/server/factory.py +624 -0
  207. ksadk/server/routes/__init__.py +1 -0
  208. ksadk/server/routes/checkpoint_resolution.py +116 -0
  209. ksadk/server/routes/common.py +713 -0
  210. ksadk/server/routes/control.py +327 -0
  211. ksadk/server/routes/dependencies.py +98 -0
  212. ksadk/server/routes/misc.py +448 -0
  213. ksadk/server/routes/models.py +443 -0
  214. ksadk/server/routes/openai_compat.py +207 -0
  215. ksadk/server/routes/projection.py +795 -0
  216. ksadk/server/routes/routers.py +52 -0
  217. ksadk/server/routes/run.py +726 -0
  218. ksadk/server/routes/sessions.py +649 -0
  219. ksadk/server/routes/streaming.py +223 -0
  220. ksadk/server/routes/workspace.py +381 -0
  221. ksadk/server/static/assets/{ArtifactsPanel-D-SSn2ee.js → ArtifactsPanel-Cjnqt-8W.js} +1 -1
  222. ksadk/server/static/assets/CodeBlock-BqyqZfuB.js +9 -0
  223. ksadk/server/static/assets/MathMessageMarkdown-BpH7jiFM.js +8 -0
  224. ksadk/server/static/assets/MermaidBlock-DWuxETaJ.js +303 -0
  225. ksadk/server/static/assets/NativeTerminalPanel-MDTopWMO.js +1 -0
  226. ksadk/server/static/assets/{arc-BA13sHc9.js → arc-CFKwSk_B.js} +1 -1
  227. ksadk/server/static/assets/architecture-7EHR7CIX-CynqOWjZ.js +1 -0
  228. ksadk/server/static/assets/{architectureDiagram-3BPJPVTR-DzJzgVoL.js → architectureDiagram-3BPJPVTR-Dej8jX8c.js} +1 -1
  229. ksadk/server/static/assets/{blockDiagram-GPEHLZMM-UTdVcZhn.js → blockDiagram-GPEHLZMM-1F64jqvy.js} +1 -1
  230. ksadk/server/static/assets/{c4Diagram-AAUBKEIU-Dix0GD4m.js → c4Diagram-AAUBKEIU-9q7AUAKb.js} +1 -1
  231. ksadk/server/static/assets/channel-iUGv2N24.js +1 -0
  232. ksadk/server/static/assets/{chunk-2J33WTMH-C2JxuZ42.js → chunk-2J33WTMH-6qgwJm7Q.js} +1 -1
  233. ksadk/server/static/assets/{chunk-4BX2VUAB-Be57QPgD.js → chunk-4BX2VUAB-CsWIQRhc.js} +1 -1
  234. ksadk/server/static/assets/{chunk-55IACEB6-WjSuy4nv.js → chunk-55IACEB6-BK8paA20.js} +1 -1
  235. ksadk/server/static/assets/{chunk-727SXJPM-BOovP-b5.js → chunk-727SXJPM-B-JEhy7h.js} +1 -1
  236. ksadk/server/static/assets/{chunk-AQP2D5EJ-DOmZNmWj.js → chunk-AQP2D5EJ-DYBvMHAa.js} +1 -1
  237. ksadk/server/static/assets/{chunk-FMBD7UC4-DzwlodkU.js → chunk-FMBD7UC4-BGhvzDYt.js} +1 -1
  238. ksadk/server/static/assets/{chunk-ND2GUHAM-DMqAikEU.js → chunk-ND2GUHAM-D98vPd-E.js} +1 -1
  239. ksadk/server/static/assets/chunk-QZHKN3VN-YQIEXeF6.js +1 -0
  240. ksadk/server/static/assets/classDiagram-4FO5ZUOK-CDAUuoXK.js +1 -0
  241. ksadk/server/static/assets/classDiagram-v2-Q7XG4LA2-CDAUuoXK.js +1 -0
  242. ksadk/server/static/assets/{cose-bilkent-S5V4N54A-Zhy2GBnP.js → cose-bilkent-S5V4N54A-CX3yotHq.js} +1 -1
  243. ksadk/server/static/assets/{dagre-BM42HDAG-CbKrtIUz.js → dagre-BM42HDAG-C7TguAWo.js} +1 -1
  244. ksadk/server/static/assets/{diagram-2AECGRRQ-BRApgQRK.js → diagram-2AECGRRQ-Dd17_kws.js} +1 -1
  245. ksadk/server/static/assets/{diagram-5GNKFQAL-D0xbnDiK.js → diagram-5GNKFQAL-DVIClIil.js} +1 -1
  246. ksadk/server/static/assets/{diagram-KO2AKTUF-CVugVI9L.js → diagram-KO2AKTUF-Df_3gYQa.js} +1 -1
  247. ksadk/server/static/assets/{diagram-LMA3HP47-DozUGgee.js → diagram-LMA3HP47-BhLk6ZtA.js} +1 -1
  248. ksadk/server/static/assets/{diagram-OG6HWLK6-ZOYsKlru.js → diagram-OG6HWLK6-D4GNGvuu.js} +1 -1
  249. ksadk/server/static/assets/{dist-DmFaq_Iy.js → dist-6CVKuTAe.js} +1 -1
  250. ksadk/server/static/assets/{dist-8EEyGgDx.js → dist-BUHRxvDG.js} +1 -1
  251. ksadk/server/static/assets/{dist-B0NP_Z0z.js → dist-BZ9n9AjO.js} +1 -1
  252. ksadk/server/static/assets/{dist-DMezvBGJ.js → dist-BibcG1V9.js} +1 -1
  253. ksadk/server/static/assets/{dist-C3HIIaN5.js → dist-Bs-jQcRX.js} +1 -1
  254. ksadk/server/static/assets/{dist-BrCcQ47T.js → dist-C2xjE7cO.js} +1 -1
  255. ksadk/server/static/assets/{dist-Dp0k7bWI.js → dist-C7-3jInC.js} +1 -1
  256. ksadk/server/static/assets/{dist-D-xOD048.js → dist-C99THtIA.js} +1 -1
  257. ksadk/server/static/assets/{dist-CkEKJFtk.js → dist-CGcp2ex8.js} +1 -1
  258. ksadk/server/static/assets/{dist-DyOkZmze.js → dist-CVQRZjPu.js} +1 -1
  259. ksadk/server/static/assets/{dist-BssVmjIo.js → dist-Cf23NY4L.js} +1 -1
  260. ksadk/server/static/assets/{dist-BIJVDMuB.js → dist-CgF3fj15.js} +1 -1
  261. ksadk/server/static/assets/{dist-2hInLS_J.js → dist-Cwt7koer.js} +1 -1
  262. ksadk/server/static/assets/{dist-DyWsb78Q.js → dist-D82mtD2s.js} +1 -1
  263. ksadk/server/static/assets/{dist-D-JMdWPQ.js → dist-DF06ORQo.js} +1 -1
  264. ksadk/server/static/assets/{dist-BmlMPsCc.js → dist-DHn6nBzr.js} +1 -1
  265. ksadk/server/static/assets/{dist-gX6GOLKq.js → dist-Djgl2wVZ.js} +1 -1
  266. ksadk/server/static/assets/{dist-DpKtt4Bo.js → dist-DlzCRy0S.js} +1 -1
  267. ksadk/server/static/assets/{dist-8_SfK1IP.js → dist-DqNnNFrw.js} +1 -1
  268. ksadk/server/static/assets/{dist-D57wnGWd.js → dist-DyvYLMW9.js} +1 -1
  269. ksadk/server/static/assets/{dist-CPBtqRTW.js → dist-eoW6tZXA.js} +1 -1
  270. ksadk/server/static/assets/{dist-DL_NKc_z.js → dist-ivOya1LD.js} +1 -1
  271. ksadk/server/static/assets/{erDiagram-TEJ5UH35-Bk-9bgE5.js → erDiagram-TEJ5UH35-CnfRcY2M.js} +1 -1
  272. ksadk/server/static/assets/eventmodeling-FCH6USID-ChYO-ijM.js +1 -0
  273. ksadk/server/static/assets/{flowDiagram-I6XJVG4X-Dn9kZVuZ.js → flowDiagram-I6XJVG4X-DGaJjGNJ.js} +1 -1
  274. ksadk/server/static/assets/{ganttDiagram-6RSMTGT7-BGxXlJqm.js → ganttDiagram-6RSMTGT7-DpCoB2g9.js} +1 -1
  275. ksadk/server/static/assets/gitGraph-WXDBUCRP-BN_0Fk-j.js +1 -0
  276. ksadk/server/static/assets/{gitGraphDiagram-PVQCEYII-C7Q0X-wi.js → gitGraphDiagram-PVQCEYII-9IKVFBVT.js} +1 -1
  277. ksadk/server/static/assets/index-QSwCHuB8.js +177 -0
  278. ksadk/server/static/assets/index-jOPmTOZH.css +2 -0
  279. ksadk/server/static/assets/info-J43DQDTF-Cp6o3vId.js +1 -0
  280. ksadk/server/static/assets/{infoDiagram-5YYISTIA-BO_CSqq5.js → infoDiagram-5YYISTIA-CYIIsb8y.js} +1 -1
  281. ksadk/server/static/assets/{ishikawaDiagram-YF4QCWOH-eYLPLd46.js → ishikawaDiagram-YF4QCWOH-DLOHGvWw.js} +1 -1
  282. ksadk/server/static/assets/{journeyDiagram-JHISSGLW-De9geSb0.js → journeyDiagram-JHISSGLW-BIzKeejT.js} +1 -1
  283. ksadk/server/static/assets/{kanban-definition-UN3LZRKU-Cs80kQto.js → kanban-definition-UN3LZRKU-BWHoFSw2.js} +1 -1
  284. ksadk/server/static/assets/{katex-DSrCFD8n.js → katex-DATssjp1.js} +1 -1
  285. ksadk/server/static/assets/{linear-CN9sbKTF.js → linear-CvMBw9cA.js} +1 -1
  286. ksadk/server/static/assets/{mermaid-parser.core-DlgSBU8l.js → mermaid-parser.core-mGAcEwcq.js} +2 -2
  287. ksadk/server/static/assets/{mindmap-definition-RKZ34NQL-9afz7Oug.js → mindmap-definition-RKZ34NQL-CSAQxEAe.js} +1 -1
  288. ksadk/server/static/assets/packet-YPE3B663-wQzct3cT.js +1 -0
  289. ksadk/server/static/assets/pie-LRSECV5Y-BgTQiv-9.js +1 -0
  290. ksadk/server/static/assets/{pieDiagram-4H26LBE5-DPv_VstN.js → pieDiagram-4H26LBE5-By-ra07M.js} +1 -1
  291. ksadk/server/static/assets/{quadrantDiagram-W4KKPZXB-o77wZ1XK.js → quadrantDiagram-W4KKPZXB-CxIR4JXI.js} +1 -1
  292. ksadk/server/static/assets/radar-GUYGQ44K-BIq5fXsn.js +1 -0
  293. ksadk/server/static/assets/{requirementDiagram-4Y6WPE33-BYVw81VC.js → requirementDiagram-4Y6WPE33-DpW90iu3.js} +1 -1
  294. ksadk/server/static/assets/{sankeyDiagram-5OEKKPKP-B7nZFMKT.js → sankeyDiagram-5OEKKPKP-DpGa6EAV.js} +1 -1
  295. ksadk/server/static/assets/{sequenceDiagram-3UESZ5HK-BGRRrFw5.js → sequenceDiagram-3UESZ5HK-NTKNGGe5.js} +1 -1
  296. ksadk/server/static/assets/{stateDiagram-AJRCARHV-BUfHCoPs.js → stateDiagram-AJRCARHV-DGpd9yFG.js} +1 -1
  297. ksadk/server/static/assets/stateDiagram-v2-BHNVJYJU-B3o579IQ.js +1 -0
  298. ksadk/server/static/assets/{timeline-definition-PNZ67QCA-FbCTGrf9.js → timeline-definition-PNZ67QCA-jqoYs3jQ.js} +1 -1
  299. ksadk/server/static/assets/treeView-BLDUP644-Dqi-E0EM.js +1 -0
  300. ksadk/server/static/assets/treemap-LRROVOQU-ClQP9CJ9.js +1 -0
  301. ksadk/server/static/assets/{vennDiagram-CIIHVFJN-DWgwtPsJ.js → vennDiagram-CIIHVFJN-l3Z7-wbP.js} +1 -1
  302. ksadk/server/static/assets/wardley-L42UT6IY-8XLvnNIs.js +1 -0
  303. ksadk/server/static/assets/{wardleyDiagram-YWT4CUSO-2x8G-tTM.js → wardleyDiagram-YWT4CUSO-BR54GPmr.js} +1 -1
  304. ksadk/server/static/assets/{xychartDiagram-2RQKCTM6-Drma3AYl.js → xychartDiagram-2RQKCTM6-SkiH8GsK.js} +1 -1
  305. ksadk/server/static/index.html +2 -2
  306. ksadk/server/terminal_sessions.py +111 -58
  307. ksadk/sessions/__init__.py +69 -19
  308. ksadk/sessions/base.py +31 -11
  309. ksadk/sessions/continuity.py +2 -3
  310. ksadk/sessions/in_memory.py +46 -2
  311. ksadk/sessions/local_service.py +148 -17
  312. ksadk/sessions/postgres_service.py +143 -25
  313. ksadk/sessions/resilient.py +36 -8
  314. ksadk/skills/models.py +17 -5
  315. ksadk/skills/package_store.py +5 -2
  316. ksadk/skills/runtime/agent.py +20 -5
  317. ksadk/skills/runtime/artifacts.py +1 -5
  318. ksadk/skills/runtime/backends/e2b.py +10 -4
  319. ksadk/skills/runtime/backends/local.py +15 -3
  320. ksadk/skills/runtime/base.py +1 -2
  321. ksadk/skills/runtime/executor.py +10 -3
  322. ksadk/skills/runtime/factory.py +4 -2
  323. ksadk/skills/runtime/loader.py +1 -2
  324. ksadk/skills/runtime/registry.py +15 -10
  325. ksadk/skills/runtime/request.py +3 -1
  326. ksadk/skills/service_client.py +38 -17
  327. ksadk/skills/tool_defs.py +15 -10
  328. ksadk/terminal_exec_policy.py +3 -4
  329. ksadk/tools/gateway.py +92 -15
  330. ksadk/tools/result_budget.py +12 -4
  331. ksadk/toolsets/__init__.py +134 -36
  332. ksadk/toolsets/platform.py +21 -5
  333. ksadk/toolsets/sandbox.py +82 -16
  334. ksadk/toolsets/skills.py +200 -39
  335. ksadk/toolsets/web.py +123 -26
  336. ksadk/toolsets/workspace.py +212 -101
  337. ksadk/tracing/exporters/inmemory_exporter.py +62 -51
  338. ksadk/tracing/exporters/langfuse_exporter.py +91 -76
  339. ksadk/tracing/setup.py +69 -53
  340. ksadk/tracing/span_utils.py +5 -2
  341. ksadk/tui/loop.py +78 -30
  342. ksadk/tui/stream_render.py +1 -0
  343. ksadk/ui_config.py +5 -3
  344. ksadk/version.py +1 -1
  345. ksadk_runtime_common/schemas/runtime_event_v1.json +95 -0
  346. agentengine_sdk_python-0.7.0.dist-info/RECORD +0 -482
  347. ksadk/server/static/assets/CodeBlock-P16VOLYi.js +0 -9
  348. ksadk/server/static/assets/MathMessageMarkdown-CdGiQWHR.js +0 -8
  349. ksadk/server/static/assets/MermaidBlock-IOcal8cm.js +0 -303
  350. ksadk/server/static/assets/NativeTerminalPanel-DGSDWsei.js +0 -1
  351. ksadk/server/static/assets/architecture-7EHR7CIX-BvUlsA6l.js +0 -1
  352. ksadk/server/static/assets/channel-CTuydARX.js +0 -1
  353. ksadk/server/static/assets/chunk-QZHKN3VN-BnCydivS.js +0 -1
  354. ksadk/server/static/assets/classDiagram-4FO5ZUOK-BNHg45Be.js +0 -1
  355. ksadk/server/static/assets/classDiagram-v2-Q7XG4LA2-BNHg45Be.js +0 -1
  356. ksadk/server/static/assets/eventmodeling-FCH6USID-DsAgWnlf.js +0 -1
  357. ksadk/server/static/assets/gitGraph-WXDBUCRP-BIao9Yjg.js +0 -1
  358. ksadk/server/static/assets/index-C00Lwg3L.js +0 -165
  359. ksadk/server/static/assets/index-DAURbCsP.css +0 -1
  360. ksadk/server/static/assets/info-J43DQDTF-CyipqGxU.js +0 -1
  361. ksadk/server/static/assets/packet-YPE3B663-CGkyRxlg.js +0 -1
  362. ksadk/server/static/assets/pie-LRSECV5Y-M0uWAf4n.js +0 -1
  363. ksadk/server/static/assets/radar-GUYGQ44K-Bdbm24-x.js +0 -1
  364. ksadk/server/static/assets/stateDiagram-v2-BHNVJYJU-8xBN_gLM.js +0 -1
  365. ksadk/server/static/assets/treeView-BLDUP644-npMo0ak1.js +0 -1
  366. ksadk/server/static/assets/treemap-LRROVOQU-CHdzrrdo.js +0 -1
  367. ksadk/server/static/assets/wardley-L42UT6IY-BEQz7wyy.js +0 -1
  368. {agentengine_sdk_python-0.7.0.dist-info → agentengine_sdk_python-0.8.0.dist-info}/WHEEL +0 -0
  369. {agentengine_sdk_python-0.7.0.dist-info → agentengine_sdk_python-0.8.0.dist-info}/entry_points.txt +0 -0
  370. {agentengine_sdk_python-0.7.0.dist-info → agentengine_sdk_python-0.8.0.dist-info}/licenses/LICENSE +0 -0
  371. {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 []