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,71 @@
1
+ # -*- coding: utf-8 -*-
2
+ """ksadk replay — 基于 RuntimeEvent store + session 级订阅的历史回放 (goal-16)。
3
+
4
+ CLI 是消费 RuntimeAdapter/RuntimeEvent 的薄壳(不含 runtime 逻辑):replay 复用 goal-10
5
+ ``RuntimeEventStore`` 与 goal-12 共享 parser/replay,把某 session 的 RuntimeEvent 历史
6
+ 回放为确定性 transcript(text/reasoning/tool/artifact/run + a2ui/a2a extras)。
7
+
8
+ 注:回放的是经 RuntimeEvent 持久化的新事件模型(带 runtime marker);legacy SessionEvent
9
+ (旧 assistant_message 等)不在本模型内,不回放。
10
+ """
11
+
12
+ from __future__ import annotations
13
+
14
+ import asyncio
15
+ import json
16
+
17
+ import click
18
+
19
+ from ksadk.cli.resource_common import CONTEXT_SETTINGS
20
+ from ksadk.events.replay import replay_transcript
21
+ from ksadk.events.store import RuntimeEventStore
22
+
23
+ _HELP = dict(help_option_names=["-h", "--help"])
24
+
25
+
26
+ @click.command(
27
+ "replay", context_settings=CONTEXT_SETTINGS, help="回放某 session 的 RuntimeEvent 历史"
28
+ )
29
+ @click.argument("session_id")
30
+ @click.option(
31
+ "--after-seq-id", default=0, show_default=True, type=int, help="从该 seq cursor 之后回放"
32
+ )
33
+ @click.option("--before-seq-id", default=None, type=int, help="回放上界(不含该 seq)")
34
+ @click.option(
35
+ "--format", "fmt", type=click.Choice(["json", "text"]), default="text", show_default=True
36
+ )
37
+ def replay(session_id: str, after_seq_id: int, before_seq_id: int | None, fmt: str):
38
+ """回放 session 的 RuntimeEvent 历史(text/reasoning/tool/artifact/run)。"""
39
+ asyncio.run(_run(session_id, after_seq_id=after_seq_id, before_seq_id=before_seq_id, fmt=fmt))
40
+
41
+
42
+ async def _run(session_id: str, *, after_seq_id: int, before_seq_id: int | None, fmt: str) -> None:
43
+ from ksadk.sessions import resolve_session_service
44
+
45
+ store = RuntimeEventStore(resolve_session_service())
46
+ parser = await replay_transcript(
47
+ store, session_id, after_seq_id=after_seq_id, before_seq_id=before_seq_id
48
+ )
49
+ transcript = parser.transcript()
50
+ if fmt == "json":
51
+ click.echo(json.dumps(transcript, ensure_ascii=False, sort_keys=True))
52
+ return
53
+
54
+ items = transcript["items"]
55
+ if not items and not transcript["extras"]:
56
+ click.echo(f"session {session_id} 无 RuntimeEvent 历史(或该 session 未经新事件模型持久化)")
57
+ return
58
+ for item in items:
59
+ kind = item.get("kind")
60
+ if kind in ("text", "reasoning"):
61
+ marker = "▍final" if item.get("final") else "▍delta"
62
+ click.echo(f"[{kind}/{item.get('phase')}] {marker} {item.get('text')}")
63
+ elif kind == "tool_call":
64
+ done = "✓" if item.get("done") else "…"
65
+ click.echo(f"[tool] {done} {item.get('name')} ({item.get('call_id')})")
66
+ elif kind == "artifact":
67
+ click.echo(f"[artifact] {item.get('name')} v{item.get('version')}")
68
+ for inv, status in transcript["run_status"].items():
69
+ click.echo(f"[run] {inv}: {status}")
70
+ for extra in transcript["extras"]:
71
+ click.echo(f"[{extra['event_type']}] {json.dumps(extra['payload'], ensure_ascii=False)}")
ksadk/cli/cmd_run.py CHANGED
@@ -5,12 +5,13 @@ ksadk run - 本地运行 Agent
5
5
  对于 LangChain/LangGraph/DeepAgents 项目,使用自己的实现
6
6
  """
7
7
 
8
- import click
9
- import asyncio
8
+ import os
10
9
  import subprocess
11
10
  import sys
12
- import os
13
11
  from pathlib import Path
12
+
13
+ import click
14
+
14
15
  from ksadk.cli.error_utils import ensure_json_output_supported, print_exception
15
16
  from ksadk.cli.local_runtime import reexec_with_project_venv_if_needed
16
17
  from ksadk.cli.ui import (
@@ -38,16 +39,28 @@ from ksadk.cli.ui import (
38
39
  is_flag=True,
39
40
  help="兼容参数;TUI 已默认使用 inline viewport 并保留终端 scrollback",
40
41
  )
41
- def run(agent_dir: str, port: int, interactive: bool, no_trace: bool, model: str, show_thinking: bool, no_stream: bool, no_alt_screen: bool):
42
+ def run(
43
+ agent_dir: str,
44
+ port: int,
45
+ interactive: bool,
46
+ no_trace: bool,
47
+ model: str,
48
+ show_thinking: bool,
49
+ no_stream: bool,
50
+ no_alt_screen: bool,
51
+ ):
42
52
  """运行 Agent (支持 LangChain / LangGraph / DeepAgents / ADK)
43
53
 
44
54
  AGENT_DIR: Agent 项目目录 (默认: 当前目录)
45
55
  """
46
56
  ensure_json_output_supported(
47
57
  "agentengine run",
48
- suggestion="请改用 `agentengine agent status --output json` 或 `agentengine build --output json` 获取结构化信息。",
58
+ suggestion=(
59
+ "请改用 `agentengine agent status --output json` 或 "
60
+ "`agentengine build --output json` 获取结构化信息。"
61
+ ),
49
62
  )
50
- from ksadk.detection import FrameworkDetector, FrameworkType
63
+ from ksadk.detection import FrameworkDetector
51
64
 
52
65
  agent_path = Path(agent_dir).resolve()
53
66
  command_args = ["run", str(agent_path), "--port", str(port)]
@@ -91,7 +104,7 @@ def run(agent_dir: str, port: int, interactive: bool, no_trace: bool, model: str
91
104
  "langchain": "LangChain",
92
105
  "langgraph": "LangGraph",
93
106
  "deepagents": "DeepAgents",
94
- "unknown": "Unknown"
107
+ "unknown": "Unknown",
95
108
  }
96
109
  framework_name = framework_map.get(result.type.value, result.type.value)
97
110
 
@@ -99,10 +112,16 @@ def run(agent_dir: str, port: int, interactive: bool, no_trace: bool, model: str
99
112
  print_kv("Agent 名称", str(result.name))
100
113
  print_kv("入口点", str(result.entry_point))
101
114
 
115
+ from ksadk.cli.cmd_web import configure_local_runtime_persistence
116
+
117
+ configure_local_runtime_persistence(agent_path, result.type.value)
118
+
102
119
  # 2. 根据框架类型选择处理方式
103
120
  # 所有框架统一使用 _run_custom() 以支持 Langfuse 自动插桩
104
121
  # (Langfuse instrumentation 需要在同一进程内生效)
105
- _run_custom(result, agent_path, port, interactive, no_trace, show_thinking, no_stream, no_alt_screen)
122
+ _run_custom(
123
+ result, agent_path, port, interactive, no_trace, show_thinking, no_stream, no_alt_screen
124
+ )
106
125
 
107
126
 
108
127
  def _run_adk_cli(agent_path: Path, port: int = 8080, command: str = "run"):
@@ -178,9 +197,10 @@ def _run_custom(
178
197
  # 初始化 Tracing
179
198
  if not no_trace:
180
199
  try:
181
- from ksadk.tracing import setup_tracing
182
200
  import os
183
201
 
202
+ from ksadk.tracing import setup_tracing
203
+
184
204
  has_langfuse = bool(os.getenv("LANGFUSE_PUBLIC_KEY"))
185
205
  has_otlp = bool(
186
206
  os.getenv("OTEL_EXPORTER_OTLP_ENDPOINT")
@@ -203,7 +223,9 @@ def _run_custom(
203
223
  if has_otlp:
204
224
  print_info("Tracing: Enabled (InMemory + OTLP HTTP)")
205
225
  elif has_langfuse:
206
- print_info(f"Tracing: Enabled (InMemory + Langfuse, CallbackOnly={use_callback_only})")
226
+ print_info(
227
+ f"Tracing: Enabled (InMemory + Langfuse, CallbackOnly={use_callback_only})"
228
+ )
207
229
  else:
208
230
  print_info("Tracing: Enabled")
209
231
  except Exception as e:
@@ -225,6 +247,7 @@ def _run_custom(
225
247
  if interactive:
226
248
  # TUI 交互模式
227
249
  from ksadk.tui.loop import run_tui
250
+
228
251
  run_tui(
229
252
  runner,
230
253
  show_thinking=show_thinking,
ksadk/cli/cmd_status.py CHANGED
@@ -4,15 +4,17 @@ agentengine status - 查看 Agent 运行状态和 Endpoint
4
4
  支持 watch 模式实时刷新
5
5
  """
6
6
 
7
- import click
8
7
  import asyncio
9
8
  import time
10
- from pathlib import Path
11
9
  from datetime import datetime
10
+ from pathlib import Path
12
11
  from typing import Sequence
12
+
13
+ import click
14
+
13
15
  from ksadk.api.client import DryRunExit
14
16
  from ksadk.cli.agent_ref import merge_agent_inputs, resolve_agent_ref
15
- from ksadk.cli.dry_run import dry_run_option, run_async_with_dry_run, effective_dry_run
17
+ from ksadk.cli.dry_run import dry_run_option, effective_dry_run, run_async_with_dry_run
16
18
  from ksadk.cli.error_utils import print_exception, resolution_error, usage_error
17
19
  from ksadk.cli.resource_common import (
18
20
  CONTEXT_SETTINGS,
@@ -24,14 +26,10 @@ from ksadk.cli.resource_common import (
24
26
  from ksadk.cli.ui import (
25
27
  get_console,
26
28
  is_json_output,
27
- print_error,
28
29
  print_info,
29
- print_kv,
30
- print_title,
31
- print_warn,
30
+ replica_rich_style,
32
31
  status_click_color,
33
32
  status_rich_style,
34
- replica_rich_style,
35
33
  summary_panel,
36
34
  )
37
35
 
@@ -55,7 +53,9 @@ AGENT_LIST_HIDDEN_FRAMEWORK_LABELS = {
55
53
  @click.option("--watch", "-w", is_flag=True, help="Watch 模式,持续刷新")
56
54
  @click.option("--interval", "-i", default=2, help="Watch 刷新间隔 (秒)")
57
55
  @click.option("--region", "-r", default="cn-beijing-6", envvar="KSYUN_REGION", help="区域")
58
- @click.option("--account-id", envvar="KSYUN_ACCOUNT_ID", help="金山云账号 ID(可选;未设置时从 AK/SK 反查)")
56
+ @click.option(
57
+ "--account-id", envvar="KSYUN_ACCOUNT_ID", help="金山云账号 ID(可选;未设置时从 AK/SK 反查)"
58
+ )
59
59
  @dry_run_option()
60
60
  def status(
61
61
  agent_ref: str,
@@ -125,9 +125,12 @@ def run_status_command(
125
125
  if not resolved:
126
126
  raise resolution_error(
127
127
  "请指定 Agent(--agent 或位置参数),或在当前目录提供可解析的本地配置",
128
- hints=["自动解析顺序: .agentengine.state -> agentengine.yaml/ksadk.yaml", "请先执行 `agentengine agent list`。"],
128
+ hints=[
129
+ "自动解析顺序: .agentengine.state -> agentengine.yaml/ksadk.yaml",
130
+ "请先执行 `agentengine agent list`。",
131
+ ],
129
132
  )
130
- agent = resolved.value
133
+ agent = str(resolved.value)
131
134
  if resolved.source != "cli":
132
135
  print_info(f"未显式指定 Agent,使用 {resolved.source_text}: {agent}")
133
136
 
@@ -136,23 +139,34 @@ def run_status_command(
136
139
  if watch and dry_run:
137
140
  raise usage_error("Watch 模式不支持 dry-run,请去掉 --watch 或取消 dry-run。")
138
141
  if watch and is_json_output():
139
- raise usage_error("Watch 模式不支持 `--output json`。", hints=["请去掉 `--watch` 或改用 `agentengine agent status --output json`。"])
142
+ raise usage_error(
143
+ "Watch 模式不支持 `--output json`。",
144
+ hints=["请去掉 `--watch` 或改用 `agentengine agent status --output json`。"],
145
+ )
140
146
 
141
147
  # Dry Run 模式由 AgentEngineClient 处理
142
148
  # 只要传入 dry_run=True,底层 client 会抛出 DryRunExit 异常
143
149
 
150
+ resolved_account_id = account_id or ""
144
151
  if show_all:
145
152
  run_async_with_dry_run(
146
- _list_all_agents(region, account_id, dry_run, page=page, size=size, framework=framework),
153
+ _list_all_agents(
154
+ region,
155
+ resolved_account_id,
156
+ dry_run,
157
+ page=page,
158
+ size=size,
159
+ framework=framework,
160
+ ),
147
161
  dry_run=dry_run,
148
162
  dry_run_resource="agent",
149
163
  dry_run_action="list",
150
164
  )
151
165
  elif watch:
152
- _watch_status(agent, region, account_id, interval)
166
+ _watch_status(str(agent), region, resolved_account_id, interval)
153
167
  else:
154
168
  run_async_with_dry_run(
155
- _show_agent_status(agent, region, account_id, dry_run),
169
+ _show_agent_status(str(agent), region, resolved_account_id, dry_run),
156
170
  dry_run=dry_run,
157
171
  dry_run_resource="agent",
158
172
  dry_run_action="status",
@@ -170,7 +184,7 @@ def _watch_status(agent: str, region: str, account_id: str, interval: int):
170
184
  click.clear()
171
185
 
172
186
  # 显示标题
173
- click.secho(f"Agent Status Monitor", fg="blue", bold=True)
187
+ click.secho("Agent Status Monitor", fg="blue", bold=True)
174
188
  click.echo(f" Agent: {agent}")
175
189
  click.echo(f" Region: {region}")
176
190
  click.echo(f" 更新时间: {datetime.now().strftime('%H:%M:%S')}")
@@ -205,7 +219,9 @@ async def _show_agent_status(
205
219
  # 先按 ID 查询,失败后再按名称查询,避免依赖字符串前缀判断。
206
220
  result = await _get_agent_runtime(agent, region, account_id, dry_run, is_name=False)
207
221
  if result.get("status") == "Error":
208
- result_by_name = await _get_agent_runtime(agent, region, account_id, dry_run, is_name=True)
222
+ result_by_name = await _get_agent_runtime(
223
+ agent, region, account_id, dry_run, is_name=True
224
+ )
209
225
  if result_by_name.get("status") != "Error":
210
226
  result = result_by_name
211
227
 
@@ -219,14 +235,14 @@ async def _show_agent_status(
219
235
  langfuse_url = result.get("langfuseTraceUrl")
220
236
  from dateutil import parser
221
237
 
222
- created_at = result.get('createdAt')
238
+ created_at = result.get("createdAt")
223
239
  if created_at:
224
240
  dt = parser.parse(created_at)
225
241
  created_at = dt.astimezone().isoformat()
226
242
  else:
227
243
  created_at = "-"
228
244
 
229
- updated_at = result.get('updatedAt')
245
+ updated_at = result.get("updatedAt")
230
246
  if updated_at:
231
247
  dt = parser.parse(updated_at)
232
248
  updated_at = dt.astimezone().isoformat()
@@ -378,8 +394,8 @@ async def _list_all_agents(
378
394
  rows = []
379
395
  items = []
380
396
  for r in results:
381
- agent_id = (r.get("agentRuntimeId") or "N/A")
382
- name = (r.get("agentRuntimeName") or "N/A")
397
+ agent_id = r.get("agentRuntimeId") or "N/A"
398
+ name = r.get("agentRuntimeName") or "N/A"
383
399
  status_val = r.get("status", "Unknown")
384
400
  ready = int(r.get("readyReplicas", 0) or 0)
385
401
  replicas = int(r.get("replicas", 0) or 0)
@@ -419,8 +435,20 @@ async def _list_all_agents(
419
435
  columns=(
420
436
  {"header": "ID", "key": "id", "style": "#58a6ff", "no_wrap": True, "min_width": 24},
421
437
  {"header": "名称", "key": "name", "style": "#c9d1d9", "min_width": 20},
422
- {"header": "状态", "key": "status", "no_wrap": True, "justify": "center", "min_width": 10},
423
- {"header": "副本", "key": "replicas_display", "no_wrap": True, "justify": "center", "min_width": 8},
438
+ {
439
+ "header": "状态",
440
+ "key": "status",
441
+ "no_wrap": True,
442
+ "justify": "center",
443
+ "min_width": 10,
444
+ },
445
+ {
446
+ "header": "副本",
447
+ "key": "replicas_display",
448
+ "no_wrap": True,
449
+ "justify": "center",
450
+ "min_width": 8,
451
+ },
424
452
  {"header": "Endpoint", "key": "endpoint", "style": "#8b949e", "overflow": "ellipsis"},
425
453
  ),
426
454
  rows=rows,
@@ -446,7 +474,9 @@ async def _list_all_agents(
446
474
  ],
447
475
  )
448
476
  if not is_json_output():
449
- console.print(summary_panel(total=len(results), healthy=running, attention=unhealthy, noun="Agent"))
477
+ console.print(
478
+ summary_panel(total=len(results), healthy=running, attention=unhealthy, noun="Agent")
479
+ )
450
480
 
451
481
 
452
482
  def _get_status_color(status: str) -> str:
@@ -454,19 +484,24 @@ def _get_status_color(status: str) -> str:
454
484
  return status_click_color(status)
455
485
 
456
486
 
457
- async def _get_agent_runtime(agent: str, region: str, account_id: str, dry_run: bool = False, is_name: bool = False) -> dict:
487
+ async def _get_agent_runtime(
488
+ agent: str, region: str, account_id: str, dry_run: bool = False, is_name: bool = False
489
+ ) -> dict:
458
490
  """获取 Agent 运行时状态
459
491
 
460
492
  调用 AgentEngine Server API
461
493
  """
462
494
  from ksadk.api import AgentEngineClient
495
+
463
496
  try:
464
497
  extra_headers = {}
465
498
  # 传递 Account ID
466
499
  if account_id:
467
500
  extra_headers["X-Ksc-Account-Id"] = account_id
468
501
 
469
- async with AgentEngineClient(region=region, dry_run=dry_run, extra_headers=extra_headers) as client:
502
+ async with AgentEngineClient(
503
+ region=region, dry_run=dry_run, extra_headers=extra_headers
504
+ ) as client:
470
505
  if is_name:
471
506
  response = await client.get_agent(name=agent)
472
507
  else:
@@ -484,10 +519,21 @@ async def _get_agent_runtime(agent: str, region: str, account_id: str, dry_run:
484
519
  "description": basic.get("description", "") or response.get("description", ""),
485
520
  "status": basic.get("status", "") or response.get("status", "Unknown"),
486
521
  "phase": basic.get("phase", "") or response.get("phase", ""),
487
- "replicas": basic.get("replicas") if basic.get("replicas") is not None else response.get("replicas", deploy.get("scaling", {}).get("min_replicas", 1)),
488
- "readyReplicas": basic.get("ready_replicas") if basic.get("ready_replicas") is not None else response.get("ready_replicas", 0),
489
- "endpoint": quick.get("public_endpoint") or quick.get("private_endpoint") or response.get("endpoint", ""),
490
- "langfuseTraceUrl": adv.get("observability_url", "") or response.get("langfuse_trace_url", ""),
522
+ "replicas": (
523
+ basic.get("replicas")
524
+ if basic.get("replicas") is not None
525
+ else response.get("replicas", deploy.get("scaling", {}).get("min_replicas", 1))
526
+ ),
527
+ "readyReplicas": (
528
+ basic.get("ready_replicas")
529
+ if basic.get("ready_replicas") is not None
530
+ else response.get("ready_replicas", 0)
531
+ ),
532
+ "endpoint": quick.get("public_endpoint")
533
+ or quick.get("private_endpoint")
534
+ or response.get("endpoint", ""),
535
+ "langfuseTraceUrl": adv.get("observability_url", "")
536
+ or response.get("langfuse_trace_url", ""),
491
537
  "createdAt": basic.get("created_at", "") or response.get("created_at", ""),
492
538
  "updatedAt": basic.get("updated_at", "") or response.get("updated_at", ""),
493
539
  "message": basic.get("message", "") or response.get("message", ""),
@@ -517,13 +563,16 @@ async def _list_agent_runtimes(
517
563
  调用 AgentEngine Server API
518
564
  """
519
565
  from ksadk.api import AgentEngineClient
566
+
520
567
  try:
521
568
  extra_headers = {}
522
569
  # 传递 Account ID
523
570
  if account_id:
524
571
  extra_headers["X-Ksc-Account-Id"] = account_id
525
572
 
526
- async with AgentEngineClient(region=region, dry_run=dry_run, extra_headers=extra_headers) as client:
573
+ async with AgentEngineClient(
574
+ region=region, dry_run=dry_run, extra_headers=extra_headers
575
+ ) as client:
527
576
  response = await client.list_agents(
528
577
  region=region,
529
578
  framework=framework,
ksadk/cli/cmd_version.py CHANGED
@@ -1,14 +1,15 @@
1
1
  """agentengine version - Agent 版本资源管理。"""
2
2
 
3
3
  import os
4
- import click
4
+ from datetime import datetime, timedelta, timezone
5
5
  from pathlib import Path
6
6
  from typing import Optional
7
- from datetime import datetime, timedelta, timezone
7
+
8
+ import click
8
9
 
9
10
  from ksadk.api.client import DryRunExit
10
11
  from ksadk.cli.agent_ref import merge_agent_inputs, resolve_agent_ref
11
- from ksadk.cli.dry_run import dry_run_option, run_async_with_dry_run, effective_dry_run
12
+ from ksadk.cli.dry_run import dry_run_option, effective_dry_run, run_async_with_dry_run
12
13
  from ksadk.cli.error_utils import abort_with_cli_error, resolution_error
13
14
  from ksadk.cli.resource_common import (
14
15
  CONTEXT_SETTINGS,
@@ -23,7 +24,8 @@ from ksadk.cli.resource_common import (
23
24
  render_descriptor_list,
24
25
  render_descriptor_status,
25
26
  )
26
- from ksadk.cli.ui import get_console, output_option as cli_output_option, status_rich_style
27
+ from ksadk.cli.ui import get_console, status_rich_style
28
+ from ksadk.cli.ui import output_option as cli_output_option
27
29
 
28
30
  console = get_console()
29
31
 
@@ -94,8 +96,9 @@ def _extract_agent_id(agent: dict) -> Optional[str]:
94
96
  if isinstance(basic, dict):
95
97
  agent_id = basic.get("agent_id")
96
98
  if agent_id:
97
- return agent_id
98
- return agent.get("agent_id") or agent.get("id")
99
+ return str(agent_id)
100
+ fallback = agent.get("agent_id") or agent.get("id")
101
+ return str(fallback) if fallback else None
99
102
 
100
103
 
101
104
  async def _resolve_agent_id(agent_ref: str, client) -> Optional[str]:
@@ -147,9 +150,7 @@ async def _resolve_target_agent_id(
147
150
  include_project_config=True,
148
151
  )
149
152
  if not resolved:
150
- raise ValueError(
151
- "请指定 Agent(--agent 或位置参数),或在当前目录提供可解析的本地配置"
152
- )
153
+ raise ValueError("请指定 Agent(--agent 或位置参数),或在当前目录提供可解析的本地配置")
153
154
 
154
155
  if resolved.source != "cli":
155
156
  console.print(
@@ -162,7 +163,9 @@ async def _resolve_target_agent_id(
162
163
  return agent_id
163
164
 
164
165
 
165
- @click.group("version", context_settings=CONTEXT_SETTINGS, help=build_resource_group_help(VERSION_RESOURCE))
166
+ @click.group(
167
+ "version", context_settings=CONTEXT_SETTINGS, help=build_resource_group_help(VERSION_RESOURCE)
168
+ )
166
169
  def version():
167
170
  pass
168
171
 
@@ -345,7 +348,9 @@ def release_version(
345
348
  dry_run = effective_dry_run(dry_run)
346
349
  try:
347
350
  run_async_with_dry_run(
348
- _release_version_async(agent_ref, agent_option, name, region, tag, description, dry_run),
351
+ _release_version_async(
352
+ agent_ref, agent_option, name, region, tag, description, dry_run
353
+ ),
349
354
  dry_run=dry_run,
350
355
  dry_run_resource="version",
351
356
  dry_run_action="release",
@@ -437,7 +442,9 @@ def rollback_version(
437
442
  dry_run = effective_dry_run(dry_run)
438
443
  try:
439
444
  run_async_with_dry_run(
440
- _rollback_version_async(agent_ref, agent_option, name, region, target, assume_yes, dry_run),
445
+ _rollback_version_async(
446
+ agent_ref, agent_option, name, region, target, assume_yes, dry_run
447
+ ),
441
448
  dry_run=dry_run,
442
449
  dry_run_resource="version",
443
450
  dry_run_action="rollback",
@@ -496,7 +503,7 @@ async def _rollback_version_async(
496
503
  ks3_secret_key=secret_key,
497
504
  )
498
505
 
499
- fields = [
506
+ fields: list[tuple[str, str, str | None]] = [
500
507
  ("当前版本", str(result.get("current_tag") or "-"), "#58a6ff"),
501
508
  ]
502
509
  if result.get("message"):