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
ksadk/cli/cmd_hermes.py CHANGED
@@ -5,7 +5,7 @@ from __future__ import annotations
5
5
  import asyncio
6
6
  import os
7
7
  from pathlib import Path
8
- from typing import Any, Callable, Optional
8
+ from typing import Any, Callable, Optional, cast
9
9
 
10
10
  import click
11
11
  from click.core import ParameterSource
@@ -15,8 +15,8 @@ from ksadk.cli.agent_ref import merge_agent_inputs, resolve_agent_ref
15
15
  from ksadk.cli.cmd_dashboard import _open_dashboard
16
16
  from ksadk.cli.dry_run import dry_run_option, effective_dry_run, run_async_with_dry_run
17
17
  from ksadk.cli.error_utils import remote_error, resolution_error
18
+ from ksadk.cli.model_catalog import fetch_provider_model_metadata
18
19
  from ksadk.cli.network_options import build_network_payload, network_cli_kwargs, network_options
19
- from ksadk.cli.storage import build_storage_config
20
20
  from ksadk.cli.resource_common import (
21
21
  CONTEXT_SETTINGS,
22
22
  ResourceActionSet,
@@ -32,37 +32,35 @@ from ksadk.cli.resource_common import (
32
32
  render_descriptor_list,
33
33
  render_descriptor_status,
34
34
  )
35
+ from ksadk.cli.storage import build_storage_config
35
36
  from ksadk.cli.ui import (
36
37
  emit_json,
37
38
  is_json_output,
38
- output_option as cli_output_option,
39
39
  print_info,
40
40
  print_kv,
41
- print_rule,
42
41
  print_success,
43
42
  print_title,
44
43
  print_warn,
45
44
  status_rich_style,
46
45
  )
46
+ from ksadk.cli.ui import (
47
+ output_option as cli_output_option,
48
+ )
47
49
  from ksadk.deployment.agent_access import (
48
50
  get_latest_agent_access,
49
51
  is_agent_not_found_error,
50
52
  normalize_deployment_status,
51
53
  )
52
54
  from ksadk.deployment.state import clear_state, load_state, save_state
53
- from ksadk.cli.model_catalog import fetch_provider_model_metadata
54
- from ksadk.model_policy import build_runtime_model_policy_env
55
55
  from ksadk.hermes_terminal import (
56
56
  run_hermes_terminal_session,
57
57
  validate_hermes_exec_argv,
58
58
  validate_hermes_pairing_argv,
59
59
  )
60
+ from ksadk.model_policy import build_runtime_model_policy_env
60
61
 
61
-
62
- DEFAULT_HERMES_IMAGE = "ghcr.io/kingsoftcloud/hermes-agent:2026.5.29.2-ksadk-v1"
63
- DEFAULT_HERMES_CONTEXT_LENGTHS = (
64
- ("glm-5.1", "200000"),
65
- )
62
+ DEFAULT_HERMES_IMAGE = "ghcr.io/kingsoftcloud/hermes-agent:v2026.7.7.2-ksadk-v070"
63
+ DEFAULT_HERMES_CONTEXT_LENGTHS = (("glm-5.1", "200000"),)
66
64
  DEFAULT_HERMES_MODEL_NAME = "glm-5.2"
67
65
  DEFAULT_HERMES_PUBLIC_BASE_URL = "https://kspmas.ksyun.com/v1/"
68
66
  DEFAULT_HERMES_RUNTIME_BASE_URL = DEFAULT_HERMES_PUBLIC_BASE_URL
@@ -232,14 +230,17 @@ async def _fetch_hermes_bootstrap_config(region: str) -> dict[str, Any] | None:
232
230
 
233
231
  try:
234
232
  async with AgentEngineClient(region=region) as client:
235
- return await client.get_client_bootstrap_config(
236
- product="hermes",
237
- framework="hermes",
238
- region=region,
239
- client_type="cli",
240
- client_version=CLI_VERSION,
241
- locale=_env_value("LANG", "LC_ALL"),
242
- ignore_dry_run=True,
233
+ return cast(
234
+ dict[str, Any],
235
+ await client.get_client_bootstrap_config(
236
+ product="hermes",
237
+ framework="hermes",
238
+ region=region,
239
+ client_type="cli",
240
+ client_version=CLI_VERSION,
241
+ locale=_env_value("LANG", "LC_ALL"),
242
+ ignore_dry_run=True,
243
+ ),
243
244
  )
244
245
  except Exception as e:
245
246
  print_warn(f"拉取 Hermes 服务端默认配置失败,回退本地默认镜像: {e}")
@@ -279,7 +280,9 @@ def _build_hermes_env_vars(
279
280
  if raw_model_base_url
280
281
  else DEFAULT_HERMES_RUNTIME_BASE_URL
281
282
  )
282
- resolved_default_model = default_model or _env_value("OPENAI_MODEL_NAME") or DEFAULT_HERMES_MODEL_NAME
283
+ resolved_default_model = (
284
+ default_model or _env_value("OPENAI_MODEL_NAME") or DEFAULT_HERMES_MODEL_NAME
285
+ )
283
286
  metadata_context_length = ""
284
287
  if isinstance(model_metadata, dict):
285
288
  metadata_context_length = str(model_metadata.get("context_window_tokens") or "").strip()
@@ -307,7 +310,9 @@ def _build_hermes_env_vars(
307
310
  if fallback_model:
308
311
  raw["HERMES_FALLBACK_PROVIDER"] = _env_value("HERMES_FALLBACK_PROVIDER") or "custom"
309
312
  raw["HERMES_FALLBACK_MODEL"] = fallback_model
310
- raw["HERMES_FALLBACK_BASE_URL"] = _env_value("HERMES_FALLBACK_BASE_URL") or resolved_model_base_url
313
+ raw["HERMES_FALLBACK_BASE_URL"] = (
314
+ _env_value("HERMES_FALLBACK_BASE_URL") or resolved_model_base_url
315
+ )
311
316
  api_server_key = _env_value("API_SERVER_KEY", "HERMES_API_SERVER_KEY")
312
317
  if api_server_key:
313
318
  raw["API_SERVER_KEY"] = api_server_key
@@ -316,7 +321,9 @@ def _build_hermes_env_vars(
316
321
  if langfuse_public_key and langfuse_secret_key:
317
322
  raw["HERMES_LANGFUSE_PUBLIC_KEY"] = langfuse_public_key
318
323
  raw["HERMES_LANGFUSE_SECRET_KEY"] = langfuse_secret_key
319
- langfuse_base_url = _env_value("HERMES_LANGFUSE_BASE_URL", "LANGFUSE_BASE_URL", "LANGFUSE_HOST")
324
+ langfuse_base_url = _env_value(
325
+ "HERMES_LANGFUSE_BASE_URL", "LANGFUSE_BASE_URL", "LANGFUSE_HOST"
326
+ )
320
327
  if langfuse_base_url:
321
328
  raw["HERMES_LANGFUSE_BASE_URL"] = langfuse_base_url
322
329
  for target_key, source_keys in {
@@ -344,10 +351,19 @@ def _build_hermes_env_vars(
344
351
  raw[key] = value
345
352
  raw = build_runtime_model_policy_env(raw, runtime="hermes")
346
353
  if raw.get("HERMES_FALLBACK_MODEL"):
347
- raw.setdefault("HERMES_FALLBACK_PROVIDER", _env_value("HERMES_FALLBACK_PROVIDER") or "custom")
348
- raw.setdefault("HERMES_FALLBACK_BASE_URL", _env_value("HERMES_FALLBACK_BASE_URL") or resolved_model_base_url)
354
+ raw.setdefault(
355
+ "HERMES_FALLBACK_PROVIDER", _env_value("HERMES_FALLBACK_PROVIDER") or "custom"
356
+ )
357
+ raw.setdefault(
358
+ "HERMES_FALLBACK_BASE_URL",
359
+ _env_value("HERMES_FALLBACK_BASE_URL") or resolved_model_base_url,
360
+ )
349
361
  return [
350
- {"Key": key, "Value": str(value), "IsSensitive": any(token in key for token in ("KEY", "TOKEN", "SECRET"))}
362
+ {
363
+ "Key": key,
364
+ "Value": str(value),
365
+ "IsSensitive": any(token in key for token in ("KEY", "TOKEN", "SECRET")),
366
+ }
351
367
  for key, value in raw.items()
352
368
  if value is not None and str(value).strip() != ""
353
369
  ]
@@ -384,9 +400,12 @@ def _diagnostic_field_style(status_value: str) -> str:
384
400
 
385
401
 
386
402
  def _flatten_agent_detail(agent: dict[str, Any]) -> dict[str, Any]:
387
- basic = agent.get("basic") if isinstance(agent.get("basic"), dict) else {}
388
- deployment = agent.get("deployment") if isinstance(agent.get("deployment"), dict) else {}
389
- quick = agent.get("quick_access") if isinstance(agent.get("quick_access"), dict) else {}
403
+ basic_value = agent.get("basic")
404
+ deployment_value = agent.get("deployment")
405
+ quick_value = agent.get("quick_access")
406
+ basic = basic_value if isinstance(basic_value, dict) else {}
407
+ deployment = deployment_value if isinstance(deployment_value, dict) else {}
408
+ quick = quick_value if isinstance(quick_value, dict) else {}
390
409
  return {
391
410
  "agent_id": basic.get("agent_id") or agent.get("agent_id"),
392
411
  "name": basic.get("name") or agent.get("name"),
@@ -395,17 +414,25 @@ def _flatten_agent_detail(agent: dict[str, Any]) -> dict[str, Any]:
395
414
  "message": basic.get("message") or "",
396
415
  "replicas": basic.get("replicas"),
397
416
  "ready_replicas": basic.get("ready_replicas"),
398
- "framework": deployment.get("framework") or basic.get("framework") or agent.get("framework"),
417
+ "framework": deployment.get("framework")
418
+ or basic.get("framework")
419
+ or agent.get("framework"),
399
420
  "region": basic.get("region") or agent.get("region"),
400
- "endpoint": quick.get("public_endpoint") or quick.get("private_endpoint") or agent.get("endpoint"),
421
+ "endpoint": quick.get("public_endpoint")
422
+ or quick.get("private_endpoint")
423
+ or agent.get("endpoint"),
401
424
  "api_key": quick.get("api_key") or agent.get("api_key"),
402
425
  "artifact_path": deployment.get("artifact_path") or agent.get("artifact_path"),
403
- "langfuse_url": (agent.get("advanced") or {}).get("observability_url") or agent.get("langfuse_trace_url") or "",
426
+ "langfuse_url": (agent.get("advanced") or {}).get("observability_url")
427
+ or agent.get("langfuse_trace_url")
428
+ or "",
404
429
  }
405
430
 
406
431
 
407
432
  def _resolve_hermes_ref(agent_ref: str | None) -> str:
408
- resolved = resolve_agent_ref(agent_ref, cwd=Path(".").resolve(), include_state=True, include_project_config=True)
433
+ resolved = resolve_agent_ref(
434
+ agent_ref, cwd=Path(".").resolve(), include_state=True, include_project_config=True
435
+ )
409
436
  if not resolved:
410
437
  raise resolution_error(
411
438
  HERMES_RESOURCE.missing_ref_message or "请指定 Hermes Agent。",
@@ -429,13 +456,19 @@ async def _get_hermes_detail_with_client(
429
456
  detail = _flatten_agent_detail(agent)
430
457
  framework = str(detail.get("framework") or "").strip().lower()
431
458
  if framework and framework != "hermes":
432
- raise resolution_error(f"目标 Agent 不是 Hermes: {agent_ref}", hints=["agentengine hermes list"])
459
+ raise resolution_error(
460
+ f"目标 Agent 不是 Hermes: {agent_ref}", hints=["agentengine hermes list"]
461
+ )
433
462
  return detail
434
463
 
435
464
 
436
- async def _get_hermes_detail(region: str, agent_ref: str, *, include_api_key: bool = False) -> dict[str, Any]:
465
+ async def _get_hermes_detail(
466
+ region: str, agent_ref: str, *, include_api_key: bool = False
467
+ ) -> dict[str, Any]:
437
468
  async with AgentEngineClient(region=region) as client:
438
- return await _get_hermes_detail_with_client(client, agent_ref, include_api_key=include_api_key)
469
+ return await _get_hermes_detail_with_client(
470
+ client, agent_ref, include_api_key=include_api_key
471
+ )
439
472
 
440
473
 
441
474
  def _resolve_hermes_access(
@@ -451,7 +484,9 @@ def _resolve_hermes_access(
451
484
  detail = asyncio.run(_get_hermes_detail(region, resolved, include_api_key=True))
452
485
  endpoint_value = str(detail.get("endpoint") or "").strip()
453
486
  if not endpoint_value:
454
- raise resolution_error("目标 Hermes Agent 未返回 Endpoint", hints=["agentengine hermes status <agent>"])
487
+ raise resolution_error(
488
+ "目标 Hermes Agent 未返回 Endpoint", hints=["agentengine hermes status <agent>"]
489
+ )
455
490
  return {
456
491
  "endpoint": endpoint_value,
457
492
  "api_key": api_key or detail.get("api_key"),
@@ -477,7 +512,9 @@ def _split_terminal_agent_ref_and_argv(
477
512
  raise direct_error
478
513
 
479
514
 
480
- def _render_hermes_dry_run(action: str, request: dict[str, Any], hints: tuple[str, ...] = ()) -> None:
515
+ def _render_hermes_dry_run(
516
+ action: str, request: dict[str, Any], hints: tuple[str, ...] = ()
517
+ ) -> None:
481
518
  if is_json_output():
482
519
  emit_json(
483
520
  build_dry_run_envelope(
@@ -626,7 +663,9 @@ async def _deploy_hermes(
626
663
  model_api_key=model_api_key,
627
664
  default_model=default_model,
628
665
  )
629
- resolved_default_model = default_model or _env_value("OPENAI_MODEL_NAME") or DEFAULT_HERMES_MODEL_NAME
666
+ resolved_default_model = (
667
+ default_model or _env_value("OPENAI_MODEL_NAME") or DEFAULT_HERMES_MODEL_NAME
668
+ )
630
669
  model_metadata = await fetch_provider_model_metadata(
631
670
  api_base=model_base_url or _env_value("OPENAI_BASE_URL"),
632
671
  api_key=model_api_key or _env_value("OPENAI_API_KEY"),
@@ -659,7 +698,9 @@ async def _deploy_hermes(
659
698
  if storage_config:
660
699
  payload["storage"] = storage_config
661
700
  if existing_agent_id and include_storage_on_update and no_storage:
662
- print_warn("更新已有 Hermes 时 `--no-storage` 不会删除服务端既有挂盘配置;默认保留已有配置。")
701
+ print_warn(
702
+ "更新已有 Hermes 时 `--no-storage` 不会删除服务端既有挂盘配置;默认保留已有配置。"
703
+ )
663
704
  network_payload = build_network_payload(
664
705
  enable_public_access=enable_public_access,
665
706
  enable_vpc_access=enable_vpc_access,
@@ -670,7 +711,7 @@ async def _deploy_hermes(
670
711
  region=region,
671
712
  dry_run=dry_run,
672
713
  )
673
- # create 默认开公网(network_payload 未显式 enable_public_access 时补 True);update 分支用原始 network_payload(None=保留现有配置)
714
+ # create 默认开公网;update 使用原始 payload,None 表示保留现有配置。
674
715
  create_network_payload = dict(network_payload) if network_payload is not None else {}
675
716
  if "enable_public_access" not in create_network_payload:
676
717
  create_network_payload["enable_public_access"] = True
@@ -697,9 +738,7 @@ async def _deploy_hermes(
697
738
  raise
698
739
  # 本地 state 缓存的 agent_id 在服务端已不存在(已删除),
699
740
  # 清掉失效 state 后回退为新建,避免 404 卡住用户。
700
- print_warn(
701
- f"本地状态失效 ({existing_agent_id}),将自动回退为新建: {update_err}"
702
- )
741
+ print_warn(f"本地状态失效 ({existing_agent_id}),将自动回退为新建: {update_err}")
703
742
  cleared = clear_state(project_dir, key=existing_agent_id)
704
743
  if cleared:
705
744
  print_info("已清理失效的 .agentengine.state")
@@ -723,10 +762,12 @@ async def _deploy_hermes(
723
762
  attempts=12,
724
763
  interval_seconds=5,
725
764
  include_api_key=True,
726
- detail_fetcher=lambda agent_ref, include_api_key: _get_hermes_detail_with_client(
727
- client,
728
- agent_ref,
729
- include_api_key=include_api_key,
765
+ detail_fetcher=lambda agent_ref, include_api_key: (
766
+ _get_hermes_detail_with_client(
767
+ client,
768
+ agent_ref,
769
+ include_api_key=include_api_key,
770
+ )
730
771
  ),
731
772
  suppress_transient_not_found_log=True,
732
773
  )
@@ -753,10 +794,12 @@ async def _deploy_hermes(
753
794
  initial_delay_seconds=2,
754
795
  require_complete_access=True,
755
796
  include_api_key=True,
756
- detail_fetcher=lambda agent_ref, include_api_key: _get_hermes_detail_with_client(
757
- client,
758
- agent_ref,
759
- include_api_key=include_api_key,
797
+ detail_fetcher=lambda agent_ref, include_api_key: (
798
+ _get_hermes_detail_with_client(
799
+ client,
800
+ agent_ref,
801
+ include_api_key=include_api_key,
802
+ )
760
803
  ),
761
804
  suppress_transient_not_found_log=True,
762
805
  )
@@ -792,6 +835,7 @@ async def _deploy_hermes(
792
835
  },
793
836
  )
794
837
  if is_json_output():
838
+ status_schema = HERMES_RESOURCE.status_schema
795
839
  emit_json(
796
840
  build_result_envelope(
797
841
  resource="hermes",
@@ -808,7 +852,7 @@ async def _deploy_hermes(
808
852
  "ui_profile": "hermes",
809
853
  "ui_path": "/",
810
854
  },
811
- hints=list(HERMES_RESOURCE.status_schema.next_steps),
855
+ hints=list(status_schema.next_steps) if status_schema is not None else [],
812
856
  )
813
857
  )
814
858
  return
@@ -837,7 +881,9 @@ def list_hermes(region: str, page: int, size: int, dry_run: bool, output_mode: s
837
881
 
838
882
  async def _list():
839
883
  async with AgentEngineClient(region=region, dry_run=dry_run) as client:
840
- resp = await client.list_agents(region=region, framework="hermes", page=page, page_size=size)
884
+ resp = await client.list_agents(
885
+ region=region, framework="hermes", page=page, page_size=size
886
+ )
841
887
  agents = resp.get("agents", []) or []
842
888
  rows = []
843
889
  items = []
@@ -870,7 +916,9 @@ def list_hermes(region: str, page: int, size: int, dry_run: bool, output_mode: s
870
916
  items=items,
871
917
  )
872
918
 
873
- run_async_with_dry_run(_list(), dry_run=dry_run, dry_run_resource="hermes", dry_run_action="list")
919
+ run_async_with_dry_run(
920
+ _list(), dry_run=dry_run, dry_run_resource="hermes", dry_run_action="list"
921
+ )
874
922
 
875
923
 
876
924
  @hermes.command("status", context_settings=CONTEXT_SETTINGS)
@@ -897,40 +945,50 @@ def status(agent_ref: Optional[str], region: str, dry_run: bool, output_mode: st
897
945
  replicas = detail.get("replicas")
898
946
  ready = detail.get("ready_replicas")
899
947
  if replicas is not None or ready is not None:
900
- replicas_text = f"{ready if ready is not None else '-'}/{replicas if replicas is not None else '-'}"
948
+ ready_text = ready if ready is not None else "-"
949
+ replicas_total_text = replicas if replicas is not None else "-"
950
+ replicas_text = f"{ready_text}/{replicas_total_text}"
901
951
  replica_style = _diagnostic_field_style(status_value)
902
952
  fields.append(("副本", replicas_text, replica_style))
903
953
  if message:
904
954
  message_style = _diagnostic_field_style(status_value)
905
955
  fields.append(("消息", message, message_style))
906
- fields.extend([
907
- ("框架", str(detail.get("framework") or "-"), None),
908
- ("区域", str(detail.get("region") or region), None),
909
- ("Endpoint", str(detail.get("endpoint") or "-"), "#58a6ff"),
910
- ("Langfuse", str(detail.get("langfuse_url") or "-"), "#58a6ff" if detail.get("langfuse_url") else None),
911
- ("镜像", str(detail.get("artifact_path") or "-"), None),
912
- ])
956
+ fields.extend(
957
+ [
958
+ ("框架", str(detail.get("framework") or "-"), None),
959
+ ("区域", str(detail.get("region") or region), None),
960
+ ("Endpoint", str(detail.get("endpoint") or "-"), "#58a6ff"),
961
+ (
962
+ "Langfuse",
963
+ str(detail.get("langfuse_url") or "-"),
964
+ "#58a6ff" if detail.get("langfuse_url") else None,
965
+ ),
966
+ ("镜像", str(detail.get("artifact_path") or "-"), None),
967
+ ]
968
+ )
913
969
  render_descriptor_status(
914
970
  HERMES_RESOURCE,
915
971
  subtitle=str(detail.get("name") or resolved),
916
- fields=fields,
917
- item={
918
- "id": str(detail.get("agent_id") or "-"),
919
- "name": str(detail.get("name") or resolved),
972
+ fields=fields,
973
+ item={
974
+ "id": str(detail.get("agent_id") or "-"),
975
+ "name": str(detail.get("name") or resolved),
920
976
  "status": status_value,
921
977
  "framework": str(detail.get("framework") or "-"),
922
- "region": str(detail.get("region") or region),
923
- "endpoint": str(detail.get("endpoint") or "-"),
924
- "langfuse_url": str(detail.get("langfuse_url") or ""),
925
- "image": str(detail.get("artifact_path") or "-"),
926
- "message": message,
927
- "phase": str(detail.get("phase") or ""),
928
- "replicas": detail.get("replicas"),
929
- "ready_replicas": detail.get("ready_replicas"),
930
- },
931
- )
978
+ "region": str(detail.get("region") or region),
979
+ "endpoint": str(detail.get("endpoint") or "-"),
980
+ "langfuse_url": str(detail.get("langfuse_url") or ""),
981
+ "image": str(detail.get("artifact_path") or "-"),
982
+ "message": message,
983
+ "phase": str(detail.get("phase") or ""),
984
+ "replicas": detail.get("replicas"),
985
+ "ready_replicas": detail.get("ready_replicas"),
986
+ },
987
+ )
932
988
 
933
- run_async_with_dry_run(_status(), dry_run=dry_run, dry_run_resource="hermes", dry_run_action="status")
989
+ run_async_with_dry_run(
990
+ _status(), dry_run=dry_run, dry_run_resource="hermes", dry_run_action="status"
991
+ )
934
992
 
935
993
 
936
994
  @hermes.command("open", context_settings=CONTEXT_SETTINGS)
@@ -965,11 +1023,8 @@ def open_hermes(
965
1023
  """打开 Hermes 管理 UI,或使用 --chat 打开统一聊天页。"""
966
1024
  _ = output_mode
967
1025
  ctx = click.get_current_context(silent=True)
968
- region_source = (
969
- ctx.get_parameter_source("region").name.lower()
970
- if ctx is not None and ctx.get_parameter_source("region") is not None
971
- else ""
972
- )
1026
+ parameter_source = ctx.get_parameter_source("region") if ctx is not None else None
1027
+ region_source = parameter_source.name.lower() if parameter_source is not None else ""
973
1028
  if manage and chat:
974
1029
  raise click.ClickException("--manage 与 --chat 不能同时使用")
975
1030
  try:
@@ -978,7 +1033,11 @@ def open_hermes(
978
1033
  raise click.ClickException(str(e)) from e
979
1034
  dry_run = effective_dry_run(dry_run)
980
1035
  target_path = ui_path or ("/chat" if chat else "/")
981
- parsed_expires = int(expires_seconds) if expires_seconds is not None and expires_seconds not in {"never", "forever"} else 0 if expires_seconds else None
1036
+ parsed_expires = (
1037
+ int(expires_seconds)
1038
+ if expires_seconds is not None and expires_seconds not in {"never", "forever"}
1039
+ else 0 if expires_seconds else None
1040
+ )
982
1041
  if dry_run:
983
1042
  _render_hermes_dry_run(
984
1043
  "open",
@@ -1052,7 +1111,9 @@ def exec_hermes(
1052
1111
  hints=("dry-run 未解析远端 Agent,也未建立 websocket。",),
1053
1112
  )
1054
1113
  return
1055
- access = _resolve_hermes_access(agent_ref=agent_ref, region=region, endpoint=endpoint, api_key=api_key)
1114
+ access = _resolve_hermes_access(
1115
+ agent_ref=agent_ref, region=region, endpoint=endpoint, api_key=api_key
1116
+ )
1056
1117
  exit_code = asyncio.run(
1057
1118
  run_hermes_terminal_session(
1058
1119
  endpoint=str(access["endpoint"]),
@@ -1116,7 +1177,9 @@ def pairing_hermes(
1116
1177
  hints=("dry-run 未解析远端 Agent,也未建立 websocket。",),
1117
1178
  )
1118
1179
  return
1119
- access = _resolve_hermes_access(agent_ref=agent_ref, region=region, endpoint=endpoint, api_key=api_key)
1180
+ access = _resolve_hermes_access(
1181
+ agent_ref=agent_ref, region=region, endpoint=endpoint, api_key=api_key
1182
+ )
1120
1183
  exit_code = asyncio.run(
1121
1184
  run_hermes_terminal_session(
1122
1185
  endpoint=str(access["endpoint"]),
@@ -1172,7 +1235,9 @@ def connect_hermes(
1172
1235
  return
1173
1236
 
1174
1237
  try:
1175
- access = _resolve_hermes_access(agent_ref=agent_ref, region=region, endpoint=endpoint, api_key=api_key)
1238
+ access = _resolve_hermes_access(
1239
+ agent_ref=agent_ref, region=region, endpoint=endpoint, api_key=api_key
1240
+ )
1176
1241
  exit_code = asyncio.run(
1177
1242
  run_hermes_terminal_session(
1178
1243
  endpoint=str(access["endpoint"]),
@@ -1217,7 +1282,9 @@ def _delete_impl(agent_refs: tuple[str, ...], region: str, assume_yes: bool, dry
1217
1282
  raise remote_error(f"以下 Hermes 删除失败: {', '.join(failed)}")
1218
1283
  return {"targets": list(agent_refs), "deleted": deleted, "failed": failed}
1219
1284
 
1220
- result = run_async_with_dry_run(_delete(), dry_run=dry_run, dry_run_resource="hermes", dry_run_action="delete")
1285
+ result = run_async_with_dry_run(
1286
+ _delete(), dry_run=dry_run, dry_run_resource="hermes", dry_run_action="delete"
1287
+ )
1221
1288
  if result is not None:
1222
1289
  deleted_text = ", ".join(result["deleted"]) or "-"
1223
1290
  failed_text = ", ".join(result["failed"]) or "-"
@@ -1245,7 +1312,13 @@ def _delete_impl(agent_refs: tuple[str, ...], region: str, assume_yes: bool, dry
1245
1312
  @confirm_options()
1246
1313
  @dry_run_option()
1247
1314
  @cli_output_option()
1248
- def delete(agent_refs: tuple[str, ...], region: str, assume_yes: bool, dry_run: bool, output_mode: str | None):
1315
+ def delete(
1316
+ agent_refs: tuple[str, ...],
1317
+ region: str,
1318
+ assume_yes: bool,
1319
+ dry_run: bool,
1320
+ output_mode: str | None,
1321
+ ):
1249
1322
  """删除 Hermes Agent。"""
1250
1323
  _ = output_mode
1251
1324
  _delete_impl(agent_refs=agent_refs, region=region, assume_yes=assume_yes, dry_run=dry_run)
@@ -1257,7 +1330,13 @@ def delete(agent_refs: tuple[str, ...], region: str, assume_yes: bool, dry_run:
1257
1330
  @confirm_options()
1258
1331
  @dry_run_option()
1259
1332
  @cli_output_option()
1260
- def destroy(agent_refs: tuple[str, ...], region: str, assume_yes: bool, dry_run: bool, output_mode: str | None):
1333
+ def destroy(
1334
+ agent_refs: tuple[str, ...],
1335
+ region: str,
1336
+ assume_yes: bool,
1337
+ dry_run: bool,
1338
+ output_mode: str | None,
1339
+ ):
1261
1340
  """删除 Hermes Agent。"""
1262
1341
  _ = output_mode
1263
1342
  _delete_impl(agent_refs=agent_refs, region=region, assume_yes=assume_yes, dry_run=dry_run)