agentengine-sdk-python 0.6.9__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 (384) hide show
  1. {agentengine_sdk_python-0.6.9.dist-info → agentengine_sdk_python-0.8.0.dist-info}/METADATA +41 -23
  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 +252 -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 +533 -726
  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 +173 -90
  54. ksadk/cli/cmd_invoke.py +388 -159
  55. ksadk/cli/cmd_launch.py +64 -28
  56. ksadk/cli/cmd_mcp.py +103 -64
  57. ksadk/cli/cmd_model.py +14 -5
  58. ksadk/cli/cmd_openclaw.py +488 -228
  59. ksadk/cli/cmd_replay.py +71 -0
  60. ksadk/cli/cmd_run.py +44 -14
  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 +38 -16
  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 +501 -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 +656 -0
  97. ksadk/conversations/model_context.py +22 -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 -5187
  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 +52 -39
  120. ksadk/deployment/manager.py +63 -65
  121. ksadk/deployment/providers/serverless.py +326 -209
  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 +267 -0
  156. ksadk/memory/adk/short_term_memory.py +33 -27
  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 +1248 -164
  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 -530
  183. ksadk/runners/langgraph_runner.py +490 -95
  184. ksadk/runners/patch_langchain.py +16 -16
  185. ksadk/runners/remote_runner.py +264 -38
  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 -3743
  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-C0meuOdi.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-bj2rZnP5.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-2u1ltDIj.js → architectureDiagram-3BPJPVTR-Dej8jX8c.js} +1 -1
  229. ksadk/server/static/assets/{blockDiagram-GPEHLZMM-D6fvdK20.js → blockDiagram-GPEHLZMM-1F64jqvy.js} +1 -1
  230. ksadk/server/static/assets/{c4Diagram-AAUBKEIU-BK82L5n5.js → c4Diagram-AAUBKEIU-9q7AUAKb.js} +1 -1
  231. ksadk/server/static/assets/channel-iUGv2N24.js +1 -0
  232. ksadk/server/static/assets/{chunk-2J33WTMH-DLVdkeyQ.js → chunk-2J33WTMH-6qgwJm7Q.js} +1 -1
  233. ksadk/server/static/assets/{chunk-4BX2VUAB-BbwsYcbW.js → chunk-4BX2VUAB-CsWIQRhc.js} +1 -1
  234. ksadk/server/static/assets/{chunk-55IACEB6-DOairxzw.js → chunk-55IACEB6-BK8paA20.js} +1 -1
  235. ksadk/server/static/assets/{chunk-727SXJPM-hCO487gs.js → chunk-727SXJPM-B-JEhy7h.js} +1 -1
  236. ksadk/server/static/assets/{chunk-AQP2D5EJ-XU8vDOuG.js → chunk-AQP2D5EJ-DYBvMHAa.js} +1 -1
  237. ksadk/server/static/assets/{chunk-FMBD7UC4-PrapyfMu.js → chunk-FMBD7UC4-BGhvzDYt.js} +1 -1
  238. ksadk/server/static/assets/{chunk-ND2GUHAM-CboKhTZ3.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-_N8bJ-EU.js → cose-bilkent-S5V4N54A-CX3yotHq.js} +1 -1
  243. ksadk/server/static/assets/{dagre-BM42HDAG-FoDlo5J2.js → dagre-BM42HDAG-C7TguAWo.js} +1 -1
  244. ksadk/server/static/assets/{diagram-2AECGRRQ-BBp6ebBw.js → diagram-2AECGRRQ-Dd17_kws.js} +1 -1
  245. ksadk/server/static/assets/{diagram-5GNKFQAL-CqOvG1PR.js → diagram-5GNKFQAL-DVIClIil.js} +1 -1
  246. ksadk/server/static/assets/{diagram-KO2AKTUF-O9T3t6ba.js → diagram-KO2AKTUF-Df_3gYQa.js} +1 -1
  247. ksadk/server/static/assets/{diagram-LMA3HP47-CGG8ekBO.js → diagram-LMA3HP47-BhLk6ZtA.js} +1 -1
  248. ksadk/server/static/assets/{diagram-OG6HWLK6-4BmH1EEg.js → diagram-OG6HWLK6-D4GNGvuu.js} +1 -1
  249. ksadk/server/static/assets/{dist-CiZHB6ZW.js → dist-6CVKuTAe.js} +1 -1
  250. ksadk/server/static/assets/{dist-BMKM66B4.js → dist-BUHRxvDG.js} +1 -1
  251. ksadk/server/static/assets/{dist-CZ6C3x8B.js → dist-BZ9n9AjO.js} +1 -1
  252. ksadk/server/static/assets/{dist-DbaH3p5h.js → dist-BibcG1V9.js} +1 -1
  253. ksadk/server/static/assets/{dist-BVzcWa6D.js → dist-Bs-jQcRX.js} +1 -1
  254. ksadk/server/static/assets/{dist-D99wf6_X.js → dist-C2xjE7cO.js} +1 -1
  255. ksadk/server/static/assets/{dist-DLMjL01k.js → dist-C7-3jInC.js} +1 -1
  256. ksadk/server/static/assets/{dist-DI-oVAXw.js → dist-C99THtIA.js} +1 -1
  257. ksadk/server/static/assets/{dist-BkJjNih3.js → dist-CGcp2ex8.js} +1 -1
  258. ksadk/server/static/assets/{dist-D5JGcxBx.js → dist-CVQRZjPu.js} +1 -1
  259. ksadk/server/static/assets/{dist-CWiTDN_V.js → dist-Cf23NY4L.js} +1 -1
  260. ksadk/server/static/assets/{dist-DLeM1OCK.js → dist-CgF3fj15.js} +1 -1
  261. ksadk/server/static/assets/{dist-BmuTWcm7.js → dist-Cwt7koer.js} +1 -1
  262. ksadk/server/static/assets/{dist-C2DKRFVK.js → dist-D82mtD2s.js} +1 -1
  263. ksadk/server/static/assets/{dist-B67uF2uK.js → dist-DF06ORQo.js} +1 -1
  264. ksadk/server/static/assets/{dist-Cwhk4lwI.js → dist-DHn6nBzr.js} +1 -1
  265. ksadk/server/static/assets/{dist-S4klkK5W.js → dist-Djgl2wVZ.js} +1 -1
  266. ksadk/server/static/assets/{dist-DCpZrjaK.js → dist-DlzCRy0S.js} +1 -1
  267. ksadk/server/static/assets/{dist-Cp1_jKwf.js → dist-DqNnNFrw.js} +1 -1
  268. ksadk/server/static/assets/{dist-6kSZvCZh.js → dist-DyvYLMW9.js} +1 -1
  269. ksadk/server/static/assets/{dist-DM0rEQPk.js → dist-eoW6tZXA.js} +1 -1
  270. ksadk/server/static/assets/{dist-Bk1l05Ni.js → dist-ivOya1LD.js} +1 -1
  271. ksadk/server/static/assets/{erDiagram-TEJ5UH35-oJhaci7S.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-DtTmUan-.js → flowDiagram-I6XJVG4X-DGaJjGNJ.js} +1 -1
  274. ksadk/server/static/assets/{ganttDiagram-6RSMTGT7-BSsb_eij.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-BR5s6Pws.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-DYPc5cvh.js → infoDiagram-5YYISTIA-CYIIsb8y.js} +1 -1
  281. ksadk/server/static/assets/{ishikawaDiagram-YF4QCWOH-MoBdALDg.js → ishikawaDiagram-YF4QCWOH-DLOHGvWw.js} +1 -1
  282. ksadk/server/static/assets/{journeyDiagram-JHISSGLW-DgLiQT8l.js → journeyDiagram-JHISSGLW-BIzKeejT.js} +1 -1
  283. ksadk/server/static/assets/{kanban-definition-UN3LZRKU-CsFx112F.js → kanban-definition-UN3LZRKU-BWHoFSw2.js} +1 -1
  284. ksadk/server/static/assets/{katex-DRsiwpM2.js → katex-DATssjp1.js} +1 -1
  285. ksadk/server/static/assets/{linear-TNRQ5Orv.js → linear-CvMBw9cA.js} +1 -1
  286. ksadk/server/static/assets/{mermaid-parser.core-D2eMVOgo.js → mermaid-parser.core-mGAcEwcq.js} +2 -2
  287. ksadk/server/static/assets/{mindmap-definition-RKZ34NQL-BtByYFhL.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-DPnuCB8c.js → pieDiagram-4H26LBE5-By-ra07M.js} +1 -1
  291. ksadk/server/static/assets/{quadrantDiagram-W4KKPZXB-miFpCPv4.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-mjB_yYkW.js → requirementDiagram-4Y6WPE33-DpW90iu3.js} +1 -1
  294. ksadk/server/static/assets/{sankeyDiagram-5OEKKPKP-D7hSlZZZ.js → sankeyDiagram-5OEKKPKP-DpGa6EAV.js} +1 -1
  295. ksadk/server/static/assets/{sequenceDiagram-3UESZ5HK-D9Cx6hC3.js → sequenceDiagram-3UESZ5HK-NTKNGGe5.js} +1 -1
  296. ksadk/server/static/assets/{stateDiagram-AJRCARHV-D_zrg47o.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-CwSec0Wa.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-agCVobiF.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-TmrlhWNt.js → wardleyDiagram-YWT4CUSO-BR54GPmr.js} +1 -1
  304. ksadk/server/static/assets/{xychartDiagram-2RQKCTM6-DV71V-ah.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 +86 -40
  308. ksadk/sessions/base.py +31 -11
  309. ksadk/sessions/continuity.py +28 -5
  310. ksadk/sessions/in_memory.py +46 -2
  311. ksadk/sessions/local_service.py +148 -17
  312. ksadk/sessions/postgres_service.py +216 -35
  313. ksadk/sessions/resilience.py +52 -0
  314. ksadk/sessions/resilient.py +388 -0
  315. ksadk/skills/models.py +17 -5
  316. ksadk/skills/package_store.py +5 -2
  317. ksadk/skills/runtime/agent.py +20 -5
  318. ksadk/skills/runtime/artifacts.py +1 -5
  319. ksadk/skills/runtime/backends/e2b.py +10 -4
  320. ksadk/skills/runtime/backends/local.py +15 -3
  321. ksadk/skills/runtime/base.py +1 -2
  322. ksadk/skills/runtime/executor.py +10 -3
  323. ksadk/skills/runtime/factory.py +4 -2
  324. ksadk/skills/runtime/loader.py +1 -2
  325. ksadk/skills/runtime/registry.py +15 -10
  326. ksadk/skills/runtime/request.py +3 -1
  327. ksadk/skills/service_client.py +38 -17
  328. ksadk/skills/tool_defs.py +15 -10
  329. ksadk/terminal_exec_policy.py +3 -4
  330. ksadk/tools/gateway.py +92 -15
  331. ksadk/tools/result_budget.py +12 -4
  332. ksadk/toolsets/__init__.py +136 -36
  333. ksadk/toolsets/platform.py +21 -5
  334. ksadk/toolsets/sandbox.py +82 -16
  335. ksadk/toolsets/skills.py +200 -39
  336. ksadk/toolsets/web.py +123 -26
  337. ksadk/toolsets/workspace.py +264 -114
  338. ksadk/tracing/exporters/inmemory_exporter.py +62 -51
  339. ksadk/tracing/exporters/langfuse_exporter.py +91 -76
  340. ksadk/tracing/setup.py +132 -53
  341. ksadk/tracing/span_utils.py +5 -2
  342. ksadk/tui/__init__.py +22 -7
  343. ksadk/tui/loop.py +1925 -0
  344. ksadk/tui/stream_render.py +69 -0
  345. ksadk/ui_config.py +5 -3
  346. ksadk/version.py +1 -1
  347. ksadk_runtime_common/schemas/runtime_event_v1.json +95 -0
  348. agentengine_sdk_python-0.6.9.dist-info/RECORD +0 -487
  349. ksadk/server/static/assets/CodeBlock-BbI4HPtJ.js +0 -9
  350. ksadk/server/static/assets/MathMessageMarkdown-DMLQYoLp.js +0 -8
  351. ksadk/server/static/assets/MermaidBlock-DCR8WZ17.js +0 -303
  352. ksadk/server/static/assets/NativeTerminalPanel-CKUvWhUz.js +0 -1
  353. ksadk/server/static/assets/architecture-7EHR7CIX-Cr6Xz1_c.js +0 -1
  354. ksadk/server/static/assets/channel-BSSOwFIb.js +0 -1
  355. ksadk/server/static/assets/chunk-QZHKN3VN-XXpdiwUL.js +0 -1
  356. ksadk/server/static/assets/classDiagram-4FO5ZUOK-C5HvGiyK.js +0 -1
  357. ksadk/server/static/assets/classDiagram-v2-Q7XG4LA2-C5HvGiyK.js +0 -1
  358. ksadk/server/static/assets/eventmodeling-FCH6USID-CIgwHJLL.js +0 -1
  359. ksadk/server/static/assets/gitGraph-WXDBUCRP-BVAJ7uo0.js +0 -1
  360. ksadk/server/static/assets/index-BH7-pC0B.js +0 -165
  361. ksadk/server/static/assets/index-DAURbCsP.css +0 -1
  362. ksadk/server/static/assets/info-J43DQDTF-MT80V4ge.js +0 -1
  363. ksadk/server/static/assets/packet-YPE3B663-BLKhbXZB.js +0 -1
  364. ksadk/server/static/assets/pie-LRSECV5Y-DFOikjSY.js +0 -1
  365. ksadk/server/static/assets/radar-GUYGQ44K-095b1Ikw.js +0 -1
  366. ksadk/server/static/assets/stateDiagram-v2-BHNVJYJU-J9kCb0nC.js +0 -1
  367. ksadk/server/static/assets/treeView-BLDUP644-yinfJEY6.js +0 -1
  368. ksadk/server/static/assets/treemap-LRROVOQU-DosUqN1Q.js +0 -1
  369. ksadk/server/static/assets/wardley-L42UT6IY-Bvp7-5uH.js +0 -1
  370. ksadk/tui/app.py +0 -400
  371. ksadk/tui/clipboard.py +0 -100
  372. ksadk/tui/widgets/__init__.py +0 -22
  373. ksadk/tui/widgets/assistant.py +0 -89
  374. ksadk/tui/widgets/base.py +0 -54
  375. ksadk/tui/widgets/chat_input.py +0 -246
  376. ksadk/tui/widgets/history.py +0 -156
  377. ksadk/tui/widgets/system.py +0 -87
  378. ksadk/tui/widgets/thinking.py +0 -110
  379. ksadk/tui/widgets/tool_call.py +0 -161
  380. ksadk/tui/widgets/user.py +0 -37
  381. {agentengine_sdk_python-0.6.9.dist-info → agentengine_sdk_python-0.8.0.dist-info}/WHEEL +0 -0
  382. {agentengine_sdk_python-0.6.9.dist-info → agentengine_sdk_python-0.8.0.dist-info}/entry_points.txt +0 -0
  383. {agentengine_sdk_python-0.6.9.dist-info → agentengine_sdk_python-0.8.0.dist-info}/licenses/LICENSE +0 -0
  384. {agentengine_sdk_python-0.6.9.dist-info → agentengine_sdk_python-0.8.0.dist-info}/top_level.txt +0 -0
ksadk/cli/cmd_a2a.py CHANGED
@@ -1,59 +1,110 @@
1
+ # -*- coding: utf-8 -*-
2
+ """ksadk a2a 子命令 — A2A 协议服务与本地试调 (goal-16,a2a-center-productization-2026-07 清洁重做)。
3
+
4
+ 基于 goal-05 清洁重写的 A2A API(``A2AProtocolServer`` / ``build_agent_card`` /
5
+ ``add_a2a_protocol_routes`` / ``A2ASpaceClient``),不使用旧 0.3.x demo API
6
+ (``AgentCardBuilder`` / ``KsA2AServer``,已删)——那是 Windows ``No such command 'a2a'``
7
+ 的根因(import 失败被 ``except ImportError: pass`` 静默吞)。
8
+
9
+ 子命令:serve / card / register / discover / call / status / cancel。
10
+ """
11
+
1
12
  from __future__ import annotations
2
13
 
14
+ import asyncio
3
15
  import json
4
16
  from pathlib import Path
5
17
  from typing import Sequence
6
18
 
7
19
  import click
8
20
  import uvicorn
21
+ from a2a.types import TaskState
22
+ from google.protobuf.json_format import MessageToJson
9
23
 
10
24
  import ksadk.configs as configs
11
- from ksadk.a2a import AgentCardBuilder, KsA2AServer
25
+ from ksadk.a2a import (
26
+ A2AConfig,
27
+ A2APlatformTask,
28
+ A2ASpaceClient,
29
+ add_a2a_protocol_routes,
30
+ build_agent_card,
31
+ )
12
32
  from ksadk.cli.local_runtime import reexec_with_project_venv_if_needed
13
33
  from ksadk.cli.resource_common import CONTEXT_SETTINGS
14
34
  from ksadk.detection import FrameworkDetector
15
35
  from ksadk.runners.factory import create_runner
36
+ from ksadk.runtime.adapter import RuntimeAdapter
37
+ from ksadk.runtime.framework_adapters import ADKRuntimeAdapter, LangGraphRuntimeAdapter
38
+ from ksadk.runtime.runner_adapter import RunnerRuntimeAdapter
39
+
40
+ _HELP = dict(help_option_names=["-h", "--help"])
41
+ _DEFAULT_TASK_STORE_DSN = "sqlite+aiosqlite:///.agentengine/a2a_tasks.db"
16
42
 
17
43
 
18
- @click.group("a2a", context_settings=CONTEXT_SETTINGS, help="A2A 协议服务与 Agent Card")
44
+ def _resolve_task_store_dsn(task_store_dsn: str, agent_path: Path) -> str:
45
+ """相对路径的 sqlite DSN 锚定到 agent_path(而非 cwd),并确保父目录存在。
46
+
47
+ 绝对 DSN(postgresql:// 等)原样返回。
48
+ """
49
+ prefix = "sqlite+aiosqlite:///"
50
+ if not task_store_dsn.startswith(prefix):
51
+ return task_store_dsn
52
+ raw_path = task_store_dsn[len(prefix) :]
53
+ if raw_path.startswith("/") or not raw_path:
54
+ return task_store_dsn
55
+ resolved = (agent_path / raw_path).resolve()
56
+ resolved.parent.mkdir(parents=True, exist_ok=True)
57
+ return f"{prefix}{resolved}"
58
+
59
+
60
+ @click.group("a2a", context_settings=CONTEXT_SETTINGS, help="A2A 协议服务与本地试调")
19
61
  def a2a():
20
- """A2A protocol helpers."""
62
+ """A2A 协议命令组(serve / card / register / discover / call / status / cancel)。"""
63
+
21
64
 
65
+ # ---------------------------------------------------------------------------
66
+ # serve / card(本地 A2A server 与 AgentCard)
67
+ # ---------------------------------------------------------------------------
22
68
 
23
- @a2a.command("serve", context_settings=dict(help_option_names=["-h", "--help"]))
69
+
70
+ @a2a.command("serve", context_settings=_HELP)
24
71
  @click.argument(
25
- "agent_dir",
26
- default=".",
27
- type=click.Path(exists=True, file_okay=False, path_type=Path),
72
+ "agent_path", type=click.Path(exists=True, file_okay=False, path_type=Path), default="."
28
73
  )
29
- @click.option("--host", default="0.0.0.0", show_default=True, help="服务监听地址")
74
+ @click.option("--host", default="127.0.0.1", show_default=True, help="服务监听地址")
30
75
  @click.option("--port", default=8081, show_default=True, type=int, help="服务端口")
31
- @click.option("--url", default=None, help="Agent Card 对外宣告地址")
76
+ @click.option("--url", default=None, help="Agent Card 对外宣告地址(默认 http://host:port)")
32
77
  @click.option("--name", default=None, help="覆盖 Agent 名称")
33
78
  @click.option("--description", default="", help="覆盖 Agent 描述")
34
- @click.option("--skill", "skills", multiple=True, help="可重复传入,追加 Agent Card 技能")
79
+ @click.option("--skill", "skills", multiple=True, help="可重复传入,追加 Agent Card 技能")
80
+ @click.option(
81
+ "--task-store-dsn",
82
+ default=_DEFAULT_TASK_STORE_DSN,
83
+ show_default=True,
84
+ help="durable task store DSN(生产用 postgresql+asyncpg://)",
85
+ )
86
+ @click.option(
87
+ "--include-reasoning/--no-include-reasoning",
88
+ default=True,
89
+ show_default=True,
90
+ help="将可展示的 reasoning 作为 adk_thought artifact 流式输出",
91
+ )
35
92
  @click.option("--no-trace", is_flag=True, help="禁用 Tracing")
36
93
  def serve(
37
- agent_dir: Path,
94
+ agent_path: Path,
38
95
  host: str,
39
96
  port: int,
40
97
  url: str | None,
41
98
  name: str | None,
42
99
  description: str,
43
100
  skills: Sequence[str],
101
+ task_store_dsn: str,
102
+ include_reasoning: bool,
44
103
  no_trace: bool,
45
104
  ):
46
- """启动 A2A 协议服务。"""
47
- agent_path = agent_dir.resolve()
48
- command_args = [
49
- "a2a",
50
- "serve",
51
- str(agent_path),
52
- "--host",
53
- host,
54
- "--port",
55
- str(port),
56
- ]
105
+ """把本地 agent 暴露为 A2A 协议服务(JSONRPC + REST + AgentCard)。"""
106
+ agent_path = agent_path.resolve()
107
+ command_args = ["a2a", "serve", str(agent_path), "--host", host, "--port", str(port)]
57
108
  if url:
58
109
  command_args.extend(["--url", url])
59
110
  if name:
@@ -62,28 +113,44 @@ def serve(
62
113
  command_args.extend(["--description", description])
63
114
  for skill in skills:
64
115
  command_args.extend(["--skill", skill])
116
+ if task_store_dsn != _DEFAULT_TASK_STORE_DSN:
117
+ command_args.extend(["--task-store-dsn", task_store_dsn])
118
+ if not include_reasoning:
119
+ command_args.append("--no-include-reasoning")
65
120
  if no_trace:
66
121
  command_args.append("--no-trace")
67
122
  reexec_with_project_venv_if_needed(agent_path, command_args)
68
-
123
+ task_store_dsn = _resolve_task_store_dsn(task_store_dsn, agent_path)
69
124
  detection_result, runner = _load_runner(agent_path, no_trace=no_trace)
70
- app_name = name or detection_result.name
71
- public_url = url or f"http://127.0.0.1:{port}"
72
- server = KsA2AServer(
73
- runner=runner,
74
- app_name=app_name,
75
- url=public_url,
125
+ from fastapi import FastAPI
126
+
127
+ app = FastAPI(title=f"ksadk A2A: {detection_result.name}")
128
+ config = A2AConfig(
129
+ enabled=True,
130
+ base_url=url or f"http://{host}:{port}",
131
+ agent_name=name or detection_result.name,
76
132
  description=description,
77
- skills=skills,
133
+ skills=list(skills),
134
+ task_store_dsn=task_store_dsn,
135
+ include_reasoning=include_reasoning,
136
+ )
137
+ runtime_type = detection_result.type.value
138
+ runtime_adapter = _select_runtime_adapter(runtime_type, runner)
139
+ from ksadk.a2a.task_adapter import A2ARuntimeTaskAdapter
140
+
141
+ add_a2a_protocol_routes(
142
+ app,
143
+ runner,
144
+ config,
145
+ task_adapter=A2ARuntimeTaskAdapter(runtime_adapter, runtime_type=runtime_type),
78
146
  )
79
- uvicorn.run(server.build(), host=host, port=port)
147
+ click.echo(f"A2A agent card: {(url or f'http://{host}:{port}')}/.well-known/agent-card.json")
148
+ uvicorn.run(app, host=host, port=port)
80
149
 
81
150
 
82
- @a2a.command("card", context_settings=dict(help_option_names=["-h", "--help"]))
151
+ @a2a.command("card", context_settings=_HELP)
83
152
  @click.argument(
84
- "agent_dir",
85
- default=".",
86
- type=click.Path(exists=True, file_okay=False, path_type=Path),
153
+ "agent_path", type=click.Path(exists=True, file_okay=False, path_type=Path), default="."
87
154
  )
88
155
  @click.option(
89
156
  "--url",
@@ -93,28 +160,152 @@ def serve(
93
160
  )
94
161
  @click.option("--name", default=None, help="覆盖 Agent 名称")
95
162
  @click.option("--description", default="", help="覆盖 Agent 描述")
96
- @click.option("--skill", "skills", multiple=True, help="可重复传入,追加 Agent Card 技能")
97
- def card(
98
- agent_dir: Path,
99
- url: str,
100
- name: str | None,
101
- description: str,
102
- skills: Sequence[str],
103
- ):
104
- """输出 Agent Card JSON。"""
105
- agent_path = agent_dir.resolve()
106
- detection_result = _detect_project(agent_path)
107
- payload = _build_agent_card_payload(
108
- app_name=name or detection_result.name,
109
- url=url,
163
+ @click.option("--skill", "skills", multiple=True, help="可重复传入,追加 Agent Card 技能")
164
+ def card(agent_path: Path, url: str, name: str | None, description: str, skills: Sequence[str]):
165
+ """打印该 agent 的 wire 1.0 AgentCard(supportedInterfaces)。"""
166
+ # ``card`` is intentionally machine-readable: users commonly redirect it to
167
+ # ``agent-card.json``. Detection only needs the manifest, so avoid the
168
+ # environment bootstrap here; it may print helpful model-default banners.
169
+ detection_result = _detect_project(agent_path, configure_environment=False)
170
+ card_obj = build_agent_card(
171
+ name=name or detection_result.name,
172
+ base_url=url,
173
+ description=description,
174
+ skills=list(skills),
175
+ )
176
+ click.echo(MessageToJson(card_obj, indent=2))
177
+
178
+
179
+ @a2a.command("register", context_settings=_HELP)
180
+ @click.argument(
181
+ "agent_path", type=click.Path(exists=True, file_okay=False, path_type=Path), default="."
182
+ )
183
+ @click.option("--url", required=True, help="Agent Card 对外宣告地址")
184
+ @click.option("--name", default=None, help="覆盖 Agent 名称")
185
+ @click.option("--description", default="", help="覆盖 Agent 描述")
186
+ @click.option("--skill", "skills", multiple=True, help="可重复传入,追加 Agent Card 技能")
187
+ def register(agent_path: Path, url: str, name: str | None, description: str, skills: Sequence[str]):
188
+ """构造并打印用于 Space 注册的 AgentCard(本地试调;server 侧 KOP 注册见产品化文档)。"""
189
+ detection_result = _detect_project(agent_path, configure_environment=False)
190
+ card_obj = build_agent_card(
191
+ name=name or detection_result.name,
192
+ base_url=url,
110
193
  description=description,
111
- skills=skills,
194
+ skills=list(skills),
112
195
  )
113
- click.echo(json.dumps(payload, ensure_ascii=False))
196
+ click.echo(
197
+ "# 本地 AgentCard 预览;平台注册使用 GetA2AAgentCard + CreateA2AAgent,"
198
+ "hosted 注册不接收用户手写 Card:"
199
+ )
200
+ click.echo(MessageToJson(card_obj, indent=2))
201
+
202
+
203
+ # ---------------------------------------------------------------------------
204
+ # discover / call / status / cancel(Space 内动态发现与调用,经 A2ASpaceClient)
205
+ # ---------------------------------------------------------------------------
206
+
207
+
208
+ def _space_client(space_id: str | None = None) -> A2ASpaceClient:
209
+ """从环境构造 A2ASpaceClient;Space 未配置时显式报错(不静默)。"""
210
+ try:
211
+ return A2ASpaceClient.from_env(space_id=space_id)
212
+ except ValueError as exc:
213
+ raise click.ClickException(
214
+ f"A2A Space 未配置:{exc}。"
215
+ "请传 --space-id,或由 AgentEngine 部署注入 KSADK_A2A_SPACE_IDS;同时需要"
216
+ "KSADK_A2A_CONTROL_PLANE_URL 和 audience workload token。"
217
+ ) from exc
218
+
219
+
220
+ @a2a.command("discover", context_settings=_HELP)
221
+ @click.option("--space-id", default=None, help="本次发现使用的 A2A Space ID")
222
+ @click.option("--prompt", default=None, help="发现关键词(受控匹配)")
223
+ @click.option("--skill", default=None, help="按技能过滤")
224
+ def discover(space_id: str | None, prompt: str | None, skill: str | None):
225
+ """发现 Space 中 hosted/external Agent 的 latest AgentCard。"""
226
+
227
+ async def _run() -> None:
228
+ client = _space_client(space_id)
229
+ agents = await client.discover(prompt=prompt, skill=skill)
230
+ for agent in agents:
231
+ click.echo(
232
+ json.dumps(
233
+ {
234
+ "agent_id": agent.agent_id,
235
+ "version_id": agent.version_id,
236
+ "source": agent.source,
237
+ "name": getattr(agent.agent_card, "name", ""),
238
+ "route_kind": agent.route_kind,
239
+ "callable": agent.callable,
240
+ "blocked_reason": agent.blocked_reason,
241
+ },
242
+ ensure_ascii=False,
243
+ )
244
+ )
245
+
246
+ asyncio.run(_run())
247
+
248
+
249
+ @a2a.command("call", context_settings=_HELP)
250
+ @click.option("--space-id", default=None, help="本次调用使用的 A2A Space ID")
251
+ @click.argument("agent_id")
252
+ @click.argument("message")
253
+ def call(space_id: str | None, agent_id: str, message: str):
254
+ """向 Space 中某 Agent 发送消息,返回首个 Task。"""
255
+
256
+ async def _run() -> None:
257
+ client = _space_client(space_id)
258
+ task = await client.send_message(agent_id, message)
259
+ click.echo(json.dumps(_platform_task_summary(task), ensure_ascii=False))
260
+
261
+ asyncio.run(_run())
262
+
263
+
264
+ @a2a.command("status", context_settings=_HELP)
265
+ @click.option("--space-id", default=None, help="Task 创建时使用的 A2A Space ID")
266
+ @click.argument("task_id")
267
+ def status(space_id: str | None, task_id: str):
268
+ """查询某 A2A Task 的状态。"""
269
+
270
+ async def _run() -> None:
271
+ client = _space_client(space_id)
272
+ task = await client.get_task(task_id)
273
+ click.echo(json.dumps(_platform_task_summary(task), ensure_ascii=False))
114
274
 
275
+ asyncio.run(_run())
115
276
 
116
- def _detect_project(agent_path: Path):
117
- configs.setup_environment(agent_path)
277
+
278
+ @a2a.command("cancel", context_settings=_HELP)
279
+ @click.option("--space-id", default=None, help="Task 创建时使用的 A2A Space ID")
280
+ @click.argument("task_id")
281
+ def cancel(space_id: str | None, task_id: str):
282
+ """取消某 A2A Task。"""
283
+
284
+ async def _run() -> None:
285
+ client = _space_client(space_id)
286
+ task = await client.cancel(task_id)
287
+ click.echo(json.dumps(_platform_task_summary(task), ensure_ascii=False))
288
+
289
+ asyncio.run(_run())
290
+
291
+
292
+ # ---------------------------------------------------------------------------
293
+ # 辅助(与旧版一致,框架无关)
294
+ # ---------------------------------------------------------------------------
295
+
296
+
297
+ def _platform_task_summary(task: A2APlatformTask) -> dict[str, str | None]:
298
+ remote_task = task.remote_task
299
+ remote_status = getattr(remote_task, "status", None)
300
+ return {
301
+ "task_id": task.id,
302
+ "status": TaskState.Name(remote_status.state) if remote_status is not None else None,
303
+ }
304
+
305
+
306
+ def _detect_project(agent_path: Path, *, configure_environment: bool = True):
307
+ if configure_environment:
308
+ configs.setup_environment(agent_path)
118
309
  result = FrameworkDetector(str(agent_path)).detect()
119
310
  if result.type.value == "unknown":
120
311
  raise click.ClickException("未检测到支持的框架 (LangChain/LangGraph/DeepAgents/ADK)")
@@ -130,6 +321,16 @@ def _load_runner(agent_path: Path, *, no_trace: bool):
130
321
  return detection_result, runner
131
322
 
132
323
 
324
+ def _select_runtime_adapter(runtime_type: str, runner) -> RuntimeAdapter:
325
+ # langchain create_agent 产物是 LangGraph CompiledStateGraph,
326
+ # 与 langgraph 共用 time-travel resume。
327
+ if runtime_type in ("langgraph", "langchain"):
328
+ return LangGraphRuntimeAdapter(runner)
329
+ if runtime_type == "adk":
330
+ return ADKRuntimeAdapter(runner)
331
+ return RunnerRuntimeAdapter(runner, runtime_type=runtime_type)
332
+
333
+
133
334
  def _setup_tracing(framework_type: str) -> None:
134
335
  try:
135
336
  import os
@@ -144,24 +345,7 @@ def _setup_tracing(framework_type: str) -> None:
144
345
  )
145
346
  setup_tracing(
146
347
  enable_inmemory=True,
147
- enable_langfuse=None,
148
348
  use_callback_only=use_callback_only,
149
349
  )
150
350
  except Exception:
151
351
  return
152
-
153
-
154
- def _build_agent_card_payload(
155
- *,
156
- app_name: str,
157
- url: str,
158
- description: str,
159
- skills: Sequence[str],
160
- ) -> dict:
161
- card = AgentCardBuilder(
162
- name=app_name,
163
- url=url,
164
- description=description,
165
- skills=skills,
166
- ).build()
167
- return card.model_dump(mode="json")
ksadk/cli/cmd_agent.py CHANGED
@@ -2,9 +2,10 @@
2
2
 
3
3
  from __future__ import annotations
4
4
 
5
- import click
6
5
  from pathlib import Path
7
6
 
7
+ import click
8
+
8
9
  from ksadk.cli.cmd_destroy import run_delete_command
9
10
  from ksadk.cli.cmd_invoke import run_invoke_command
10
11
  from ksadk.cli.cmd_status import run_status_command
@@ -22,7 +23,9 @@ def agent():
22
23
  @agent.command("list", context_settings=CONTEXT_SETTINGS)
23
24
  @pagination_options(default_page=1, default_size=20)
24
25
  @click.option("--region", "-r", default="cn-beijing-6", envvar="KSYUN_REGION", help="区域")
25
- @click.option("--account-id", envvar="KSYUN_ACCOUNT_ID", help="金山云账号 ID(可选;未设置时从 AK/SK 反查)")
26
+ @click.option(
27
+ "--account-id", envvar="KSYUN_ACCOUNT_ID", help="金山云账号 ID(可选;未设置时从 AK/SK 反查)"
28
+ )
26
29
  @click.option("--framework", help="按框架过滤,支持逗号分隔多个值,如 langgraph,adk")
27
30
  @dry_run_option()
28
31
  @cli_output_option()
@@ -59,7 +62,9 @@ def list_agents(
59
62
  @click.option("--watch", "-w", is_flag=True, help="Watch 模式,持续刷新")
60
63
  @click.option("--interval", "-i", default=2, help="Watch 刷新间隔 (秒)")
61
64
  @click.option("--region", "-r", default="cn-beijing-6", envvar="KSYUN_REGION", help="区域")
62
- @click.option("--account-id", envvar="KSYUN_ACCOUNT_ID", help="金山云账号 ID(可选;未设置时从 AK/SK 反查)")
65
+ @click.option(
66
+ "--account-id", envvar="KSYUN_ACCOUNT_ID", help="金山云账号 ID(可选;未设置时从 AK/SK 反查)"
67
+ )
63
68
  @dry_run_option()
64
69
  @cli_output_option()
65
70
  def status_agent(
@@ -172,11 +177,20 @@ def invoke_agent(
172
177
 
173
178
  @agent.command("delete", context_settings=CONTEXT_SETTINGS)
174
179
  @click.argument("agent_refs", nargs=-1)
175
- @click.option("--agent", "--agent-id", "agent_options", "-a", multiple=True, help="Agent 名称或 ID,可重复传入")
180
+ @click.option(
181
+ "--agent",
182
+ "--agent-id",
183
+ "agent_options",
184
+ "-a",
185
+ multiple=True,
186
+ help="Agent 名称或 ID,可重复传入",
187
+ )
176
188
  @click.option("--yes", "-y", "assume_yes", is_flag=True, help="跳过确认")
177
189
  @click.option("--force", "-f", "assume_yes", is_flag=True, hidden=True, help="(兼容) 跳过确认")
178
190
  @click.option("--region", "-r", default="cn-beijing-6", envvar="KSYUN_REGION", help="区域")
179
- @click.option("--account-id", envvar="KSYUN_ACCOUNT_ID", help="金山云账号 ID(可选;未设置时从 AK/SK 反查)")
191
+ @click.option(
192
+ "--account-id", envvar="KSYUN_ACCOUNT_ID", help="金山云账号 ID(可选;未设置时从 AK/SK 反查)"
193
+ )
180
194
  @dry_run_option()
181
195
  @cli_output_option()
182
196
  def delete_agent(