agentengine-sdk-python 0.7.0__py3-none-any.whl → 0.8.1__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 (450) hide show
  1. {agentengine_sdk_python-0.7.0.dist-info → agentengine_sdk_python-0.8.1.dist-info}/METADATA +52 -20
  2. agentengine_sdk_python-0.8.1.dist-info/RECORD +644 -0
  3. {agentengine_sdk_python-0.7.0.dist-info → agentengine_sdk_python-0.8.1.dist-info}/WHEEL +1 -1
  4. ksadk/a2a/__init__.py +180 -11
  5. ksadk/a2a/bootstrap.py +332 -0
  6. ksadk/a2a/card.py +15 -0
  7. ksadk/a2a/context_store.py +203 -0
  8. ksadk/a2a/control_plane.py +1056 -0
  9. ksadk/a2a/credential.py +99 -0
  10. ksadk/a2a/event_adapter.py +149 -0
  11. ksadk/a2a/executor.py +361 -137
  12. ksadk/a2a/external_transport.py +516 -0
  13. ksadk/a2a/identity.py +304 -0
  14. ksadk/a2a/ids.py +22 -0
  15. ksadk/a2a/langgraph.py +285 -0
  16. ksadk/a2a/resume_store.py +201 -0
  17. ksadk/a2a/routes.py +112 -0
  18. ksadk/a2a/server.py +102 -62
  19. ksadk/a2a/service_env.py +33 -0
  20. ksadk/a2a/space_client.py +1122 -0
  21. ksadk/a2a/task_adapter.py +423 -0
  22. ksadk/a2a/task_event_dispatcher.py +167 -0
  23. ksadk/a2a/task_event_outbox.py +326 -0
  24. ksadk/a2a/task_store.py +206 -0
  25. ksadk/a2a_card.py +101 -0
  26. ksadk/a2ui/__init__.py +27 -0
  27. ksadk/a2ui/core.py +186 -0
  28. ksadk/a2ui/models.py +166 -0
  29. ksadk/a2ui/renderer.py +198 -0
  30. ksadk/agui/__init__.py +9 -0
  31. ksadk/agui/a2ui_projection.py +92 -0
  32. ksadk/agui/agent.py +872 -0
  33. ksadk/agui/config.py +92 -0
  34. ksadk/agui/routes.py +47 -0
  35. ksadk/api/client.py +238 -204
  36. ksadk/api/environment.py +27 -0
  37. ksadk/builders/__init__.py +2 -0
  38. ksadk/builders/base.py +16 -14
  39. ksadk/builders/code_builder.py +375 -270
  40. ksadk/builders/container_builder.py +240 -200
  41. ksadk/builders/framework_requirements.py +31 -12
  42. ksadk/builders/ks3_uploader.py +60 -29
  43. ksadk/builders/managed_runtime_builder.py +173 -0
  44. ksadk/builders/mcp_builder.py +91 -92
  45. ksadk/builders/requirements_utils.py +1 -5
  46. ksadk/cli/__init__.py +97 -171
  47. ksadk/cli/cmd_a2a.py +255 -84
  48. ksadk/cli/cmd_agent.py +19 -5
  49. ksadk/cli/cmd_build.py +158 -29
  50. ksadk/cli/cmd_completion.py +47 -35
  51. ksadk/cli/cmd_config.py +267 -198
  52. ksadk/cli/cmd_create.py +507 -740
  53. ksadk/cli/cmd_dashboard.py +120 -45
  54. ksadk/cli/cmd_deploy.py +135 -59
  55. ksadk/cli/cmd_destroy.py +44 -14
  56. ksadk/cli/cmd_eval.py +386 -0
  57. ksadk/cli/cmd_files.py +63 -24
  58. ksadk/cli/cmd_hermes.py +313 -135
  59. ksadk/cli/cmd_invoke.py +184 -122
  60. ksadk/cli/cmd_launch.py +76 -28
  61. ksadk/cli/cmd_mcp.py +98 -64
  62. ksadk/cli/cmd_model.py +14 -5
  63. ksadk/cli/cmd_openclaw.py +564 -268
  64. ksadk/cli/cmd_replay.py +71 -0
  65. ksadk/cli/cmd_run.py +58 -73
  66. ksadk/cli/cmd_status.py +80 -31
  67. ksadk/cli/cmd_studio.py +110 -0
  68. ksadk/cli/cmd_version.py +20 -13
  69. ksadk/cli/cmd_web.py +95 -18
  70. ksadk/cli/deploy_utils.py +20 -20
  71. ksadk/cli/dry_run.py +7 -4
  72. ksadk/cli/env_options.py +83 -0
  73. ksadk/cli/error_utils.py +37 -12
  74. ksadk/cli/global_options.py +4 -3
  75. ksadk/cli/local_runtime.py +1 -2
  76. ksadk/cli/model_catalog.py +6 -2
  77. ksadk/cli/network_options.py +41 -19
  78. ksadk/cli/resource_common.py +6 -2
  79. ksadk/cli/runtime_bootstrap.py +51 -0
  80. ksadk/cli/storage.py +0 -1
  81. ksadk/cli/ui.py +11 -3
  82. ksadk/cli/workflow_common.py +52 -18
  83. ksadk/codex/__init__.py +12 -0
  84. ksadk/codex/client.py +1042 -0
  85. ksadk/codex/phase.py +143 -0
  86. ksadk/codex/runtime.py +940 -0
  87. ksadk/common/aicp_env.py +0 -1
  88. ksadk/common/auth.py +2 -2
  89. ksadk/common/constants.py +1 -3
  90. ksadk/common/kop_client.py +232 -0
  91. ksadk/common/llm_utils.py +17 -13
  92. ksadk/compat/__init__.py +5 -0
  93. ksadk/compat/adk_compat.py +200 -0
  94. ksadk/compat/copilotkit_a2ui.py +330 -0
  95. ksadk/configs/__init__.py +12 -14
  96. ksadk/configs/env_registry.py +661 -116
  97. ksadk/configs/global_config.py +3 -2
  98. ksadk/configs/settings.py +133 -209
  99. ksadk/conversations/__init__.py +85 -92
  100. ksadk/conversations/attachment_storage.py +16 -11
  101. ksadk/conversations/attachments.py +44 -36
  102. ksadk/conversations/compaction_pipeline.py +12 -12
  103. ksadk/conversations/compaction_prompt.py +9 -5
  104. ksadk/conversations/context.py +221 -6
  105. ksadk/conversations/message_projection.py +438 -51
  106. ksadk/conversations/model_context.py +12 -6
  107. ksadk/conversations/model_options.py +0 -1
  108. ksadk/conversations/normalize.py +20 -16
  109. ksadk/conversations/reasoning_markup.py +1 -1
  110. ksadk/conversations/runtime.py +339 -5255
  111. ksadk/conversations/runtime_compaction.py +333 -0
  112. ksadk/conversations/runtime_constants.py +27 -0
  113. ksadk/conversations/runtime_governance.py +185 -0
  114. ksadk/conversations/runtime_input.py +660 -0
  115. ksadk/conversations/runtime_invocation.py +395 -0
  116. ksadk/conversations/runtime_metadata.py +475 -0
  117. ksadk/conversations/runtime_observability.py +367 -0
  118. ksadk/conversations/runtime_payloads.py +272 -0
  119. ksadk/conversations/runtime_persistence.py +440 -0
  120. ksadk/conversations/runtime_preparation.py +426 -0
  121. ksadk/conversations/runtime_resume.py +836 -0
  122. ksadk/conversations/runtime_stream_events.py +902 -0
  123. ksadk/conversations/runtime_streaming.py +700 -0
  124. ksadk/conversations/semantic_summary.py +17 -5
  125. ksadk/conversations/session_title.py +6 -3
  126. ksadk/deployment/__init__.py +15 -16
  127. ksadk/deployment/agent_access.py +12 -23
  128. ksadk/deployment/base.py +51 -38
  129. ksadk/deployment/managed_runtime.py +33 -0
  130. ksadk/deployment/manager.py +85 -71
  131. ksadk/deployment/providers/serverless.py +379 -210
  132. ksadk/deployment/registry.py +38 -32
  133. ksadk/deployment/state.py +11 -11
  134. ksadk/deployment/ui_config.py +1 -1
  135. ksadk/detection/__init__.py +1 -1
  136. ksadk/detection/detector.py +146 -83
  137. ksadk/detection/mcp_detector.py +9 -6
  138. ksadk/evaluation/__init__.py +84 -0
  139. ksadk/evaluation/a2a_adapter.py +444 -0
  140. ksadk/evaluation/adapters.py +54 -0
  141. ksadk/evaluation/contracts.py +409 -0
  142. ksadk/evaluation/evalset.py +351 -0
  143. ksadk/evaluation/evaluators.py +461 -0
  144. ksadk/evaluation/executor.py +118 -0
  145. ksadk/evaluation/storage.py +68 -0
  146. ksadk/evaluation/target.py +73 -0
  147. ksadk/events/__init__.py +25 -0
  148. ksadk/events/parser.py +191 -0
  149. ksadk/events/replay.py +37 -0
  150. ksadk/events/runtime_event.py +273 -0
  151. ksadk/events/store.py +317 -0
  152. ksadk/harness/__init__.py +35 -0
  153. ksadk/harness/app.py +269 -0
  154. ksadk/harness/config.py +181 -0
  155. ksadk/harness/reasoner.py +105 -0
  156. ksadk/harness/runtime.py +364 -0
  157. ksadk/harness/sandbox.py +141 -0
  158. ksadk/harness/tools.py +222 -0
  159. ksadk/hermes_terminal.py +28 -12
  160. ksadk/identity/resolver.py +15 -9
  161. ksadk/ids.py +32 -0
  162. ksadk/knowledge_base/adk_tool.py +1 -1
  163. ksadk/knowledge_base/client.py +38 -33
  164. ksadk/managed_a2a_card.py +160 -0
  165. ksadk/managed_runtime.py +195 -0
  166. ksadk/markdown.py +5 -2
  167. ksadk/mcp_runtime/__init__.py +9 -6
  168. ksadk/memory/__init__.py +1 -1
  169. ksadk/memory/adk/__init__.py +2 -0
  170. ksadk/memory/adk/backends/base_ltm_backend.py +2 -6
  171. ksadk/memory/adk/backends/http_ltm_backend.py +13 -21
  172. ksadk/memory/adk/backends/inmemory_ltm_backend.py +7 -13
  173. ksadk/memory/adk/backends/sdk_ltm_backend.py +36 -36
  174. ksadk/memory/adk/long_term_memory.py +34 -37
  175. ksadk/memory/adk/resilient_session_service.py +4 -5
  176. ksadk/memory/adk/short_term_memory.py +12 -21
  177. ksadk/memory/adk_tool.py +3 -2
  178. ksadk/memory/backends/base.py +19 -19
  179. ksadk/memory/backends/memory.py +24 -25
  180. ksadk/memory/backends/redis.py +31 -30
  181. ksadk/memory/langchain_tool.py +2 -1
  182. ksadk/memory/manager.py +52 -47
  183. ksadk/memory/service.py +16 -6
  184. ksadk/memory/tool.py +4 -0
  185. ksadk/model_policy.py +15 -7
  186. ksadk/model_proxy/__init__.py +51 -0
  187. ksadk/model_proxy/bootstrap.py +80 -0
  188. ksadk/model_proxy/cache.py +165 -0
  189. ksadk/model_proxy/config.py +66 -0
  190. ksadk/model_proxy/demo_webui.py +115 -0
  191. ksadk/model_proxy/detect.py +145 -0
  192. ksadk/model_proxy/gate.py +68 -0
  193. ksadk/model_proxy/namespace.py +201 -0
  194. ksadk/model_proxy/protocol_proxy.py +22 -0
  195. ksadk/model_proxy/server.py +443 -0
  196. ksadk/model_proxy/transform.py +735 -0
  197. ksadk/openclaw_gateway.py +29 -14
  198. ksadk/runners/adk_runner.py +354 -146
  199. ksadk/runners/base_runner.py +71 -29
  200. ksadk/runners/deepagents_runner.py +0 -1
  201. ksadk/runners/factory.py +18 -5
  202. ksadk/runners/langchain_runner.py +29 -742
  203. ksadk/runners/langgraph_runner.py +417 -97
  204. ksadk/runners/patch_langchain.py +16 -16
  205. ksadk/runners/remote_runner.py +134 -33
  206. ksadk/runners/usage_accumulator.py +1 -0
  207. ksadk/runners/utils/__init__.py +0 -10
  208. ksadk/runners/utils/loader.py +23 -7
  209. ksadk/runtime/__init__.py +67 -0
  210. ksadk/runtime/adapter.py +412 -0
  211. ksadk/runtime/conversation_execution.py +553 -0
  212. ksadk/runtime/executor.py +251 -0
  213. ksadk/runtime/factory.py +156 -0
  214. ksadk/runtime/framework_adapters.py +118 -0
  215. ksadk/runtime/launch.py +48 -0
  216. ksadk/runtime/preprocessing.py +131 -0
  217. ksadk/runtime/runner_adapter.py +1032 -0
  218. ksadk/runtime/runner_loading.py +36 -0
  219. ksadk/runtime_context.py +18 -3
  220. ksadk/runtime_state.py +0 -1
  221. ksadk/sandbox/__init__.py +4 -1
  222. ksadk/sandbox/backends/__init__.py +4 -1
  223. ksadk/sandbox/backends/e2b.py +13 -5
  224. ksadk/sandbox/backends/local_process.py +11 -3
  225. ksadk/sandbox/base.py +10 -15
  226. ksadk/sandbox/factory.py +14 -4
  227. ksadk/sandbox/registry.py +57 -6
  228. ksadk/server/__init__.py +39 -4
  229. ksadk/server/api_models.py +15 -5
  230. ksadk/server/app.py +24 -3928
  231. ksadk/server/composition.py +47 -0
  232. ksadk/server/factory.py +622 -0
  233. ksadk/server/routes/__init__.py +1 -0
  234. ksadk/server/routes/checkpoint_resolution.py +116 -0
  235. ksadk/server/routes/common.py +682 -0
  236. ksadk/server/routes/control.py +331 -0
  237. ksadk/server/routes/dependencies.py +98 -0
  238. ksadk/server/routes/misc.py +425 -0
  239. ksadk/server/routes/models.py +451 -0
  240. ksadk/server/routes/openai_compat.py +229 -0
  241. ksadk/server/routes/projection.py +848 -0
  242. ksadk/server/routes/routers.py +52 -0
  243. ksadk/server/routes/run.py +519 -0
  244. ksadk/server/routes/sessions.py +644 -0
  245. ksadk/server/routes/streaming.py +265 -0
  246. ksadk/server/routes/workspace.py +414 -0
  247. ksadk/server/static/assets/{ArtifactsPanel-D-SSn2ee.js → ArtifactsPanel-CakCqxEN.js} +1 -1
  248. ksadk/server/static/assets/CodeBlock-CynLknyO.js +9 -0
  249. ksadk/server/static/assets/MathMessageMarkdown-3sQdOysS.js +8 -0
  250. ksadk/server/static/assets/MermaidBlock-NERD_ef7.js +303 -0
  251. ksadk/server/static/assets/NativeTerminalPanel-CiHWf82q.js +1 -0
  252. ksadk/server/static/assets/{arc-BA13sHc9.js → arc-DrgjcKhl.js} +1 -1
  253. ksadk/server/static/assets/architecture-7EHR7CIX-CpZLRCcY.js +1 -0
  254. ksadk/server/static/assets/{architectureDiagram-3BPJPVTR-DzJzgVoL.js → architectureDiagram-3BPJPVTR-BXoVRbQ6.js} +1 -1
  255. ksadk/server/static/assets/{blockDiagram-GPEHLZMM-UTdVcZhn.js → blockDiagram-GPEHLZMM-BnaB3Ywv.js} +1 -1
  256. ksadk/server/static/assets/{c4Diagram-AAUBKEIU-Dix0GD4m.js → c4Diagram-AAUBKEIU-Dw4weZcp.js} +1 -1
  257. ksadk/server/static/assets/channel-Dt3rQTFI.js +1 -0
  258. ksadk/server/static/assets/{chunk-2J33WTMH-C2JxuZ42.js → chunk-2J33WTMH-ChjpLK7j.js} +1 -1
  259. ksadk/server/static/assets/{chunk-4BX2VUAB-Be57QPgD.js → chunk-4BX2VUAB-B9drTgOW.js} +1 -1
  260. ksadk/server/static/assets/{chunk-55IACEB6-WjSuy4nv.js → chunk-55IACEB6-CK4ROATy.js} +1 -1
  261. ksadk/server/static/assets/{chunk-727SXJPM-BOovP-b5.js → chunk-727SXJPM-B9KtTTgw.js} +1 -1
  262. ksadk/server/static/assets/{chunk-AQP2D5EJ-DOmZNmWj.js → chunk-AQP2D5EJ-1O1mki3m.js} +1 -1
  263. ksadk/server/static/assets/{chunk-FMBD7UC4-DzwlodkU.js → chunk-FMBD7UC4-B_fH2YuH.js} +1 -1
  264. ksadk/server/static/assets/{chunk-ND2GUHAM-DMqAikEU.js → chunk-ND2GUHAM-D6rFLaVV.js} +1 -1
  265. ksadk/server/static/assets/chunk-QZHKN3VN-iXEZtKQc.js +1 -0
  266. ksadk/server/static/assets/classDiagram-4FO5ZUOK-DIveV17Q.js +1 -0
  267. ksadk/server/static/assets/classDiagram-v2-Q7XG4LA2-DIveV17Q.js +1 -0
  268. ksadk/server/static/assets/{cose-bilkent-S5V4N54A-Zhy2GBnP.js → cose-bilkent-S5V4N54A-ChNs_Mdk.js} +1 -1
  269. ksadk/server/static/assets/{dagre-BM42HDAG-CbKrtIUz.js → dagre-BM42HDAG-D0QXg_MQ.js} +1 -1
  270. ksadk/server/static/assets/{diagram-2AECGRRQ-BRApgQRK.js → diagram-2AECGRRQ-DBDDKwBQ.js} +1 -1
  271. ksadk/server/static/assets/{diagram-5GNKFQAL-D0xbnDiK.js → diagram-5GNKFQAL-BkwDOxmO.js} +1 -1
  272. ksadk/server/static/assets/{diagram-KO2AKTUF-CVugVI9L.js → diagram-KO2AKTUF-Bv8waYvY.js} +1 -1
  273. ksadk/server/static/assets/{diagram-LMA3HP47-DozUGgee.js → diagram-LMA3HP47-e1VECDdu.js} +1 -1
  274. ksadk/server/static/assets/{diagram-OG6HWLK6-ZOYsKlru.js → diagram-OG6HWLK6-Ds9adfRl.js} +1 -1
  275. ksadk/server/static/assets/{dist-DpKtt4Bo.js → dist-4N2NMVYg.js} +1 -1
  276. ksadk/server/static/assets/{dist-CkEKJFtk.js → dist-B-jNR6Vn.js} +1 -1
  277. ksadk/server/static/assets/{dist-D57wnGWd.js → dist-B5J2uhNk.js} +1 -1
  278. ksadk/server/static/assets/{dist-8_SfK1IP.js → dist-B5oS1zcj.js} +1 -1
  279. ksadk/server/static/assets/{dist-DMezvBGJ.js → dist-BB3-OwTQ.js} +1 -1
  280. ksadk/server/static/assets/{dist-2hInLS_J.js → dist-BIlKoW0k.js} +1 -1
  281. ksadk/server/static/assets/{dist-BrCcQ47T.js → dist-BjOdlDjj.js} +1 -1
  282. ksadk/server/static/assets/{dist-BmlMPsCc.js → dist-C1sz5Eo3.js} +1 -1
  283. ksadk/server/static/assets/{dist-B0NP_Z0z.js → dist-CWV4lDr1.js} +1 -1
  284. ksadk/server/static/assets/{dist-D-xOD048.js → dist-CmZHzlwZ.js} +1 -1
  285. ksadk/server/static/assets/{dist-DL_NKc_z.js → dist-D6MpCZtz.js} +1 -1
  286. ksadk/server/static/assets/{dist-DyOkZmze.js → dist-DJN_6Y39.js} +1 -1
  287. ksadk/server/static/assets/{dist-DmFaq_Iy.js → dist-DQU9EWw-.js} +1 -1
  288. ksadk/server/static/assets/{dist-gX6GOLKq.js → dist-DWKByxWV.js} +1 -1
  289. ksadk/server/static/assets/{dist-DyWsb78Q.js → dist-Dli7qW-B.js} +1 -1
  290. ksadk/server/static/assets/{dist-BIJVDMuB.js → dist-DsHPdk3W.js} +1 -1
  291. ksadk/server/static/assets/{dist-Dp0k7bWI.js → dist-X4TnqwOK.js} +1 -1
  292. ksadk/server/static/assets/{dist-8EEyGgDx.js → dist-_pHPTyZ-.js} +1 -1
  293. ksadk/server/static/assets/{dist-CPBtqRTW.js → dist-fhOuWds5.js} +1 -1
  294. ksadk/server/static/assets/{dist-D-JMdWPQ.js → dist-gLnrGsoU.js} +1 -1
  295. ksadk/server/static/assets/{dist-BssVmjIo.js → dist-j6Dxmf_j.js} +1 -1
  296. ksadk/server/static/assets/{dist-C3HIIaN5.js → dist-o2OVmKvt.js} +1 -1
  297. ksadk/server/static/assets/{erDiagram-TEJ5UH35-Bk-9bgE5.js → erDiagram-TEJ5UH35-BPItFKH6.js} +1 -1
  298. ksadk/server/static/assets/eventmodeling-FCH6USID-DYFSxbqr.js +1 -0
  299. ksadk/server/static/assets/{flowDiagram-I6XJVG4X-Dn9kZVuZ.js → flowDiagram-I6XJVG4X-BbYB9w5Y.js} +1 -1
  300. ksadk/server/static/assets/{ganttDiagram-6RSMTGT7-BGxXlJqm.js → ganttDiagram-6RSMTGT7-TQXa0KXv.js} +1 -1
  301. ksadk/server/static/assets/gitGraph-WXDBUCRP-DyNYp6BN.js +1 -0
  302. ksadk/server/static/assets/{gitGraphDiagram-PVQCEYII-C7Q0X-wi.js → gitGraphDiagram-PVQCEYII-bKblCnpa.js} +1 -1
  303. ksadk/server/static/assets/index-R52pJJvg.js +177 -0
  304. ksadk/server/static/assets/index-jJr3_955.css +2 -0
  305. ksadk/server/static/assets/info-J43DQDTF-WUx7qTde.js +1 -0
  306. ksadk/server/static/assets/{infoDiagram-5YYISTIA-BO_CSqq5.js → infoDiagram-5YYISTIA-BGVT7J_i.js} +1 -1
  307. ksadk/server/static/assets/{ishikawaDiagram-YF4QCWOH-eYLPLd46.js → ishikawaDiagram-YF4QCWOH-K0OOfVna.js} +1 -1
  308. ksadk/server/static/assets/{journeyDiagram-JHISSGLW-De9geSb0.js → journeyDiagram-JHISSGLW-8LeOJaZp.js} +1 -1
  309. ksadk/server/static/assets/{kanban-definition-UN3LZRKU-Cs80kQto.js → kanban-definition-UN3LZRKU-C6uCgZrW.js} +1 -1
  310. ksadk/server/static/assets/{katex-DSrCFD8n.js → katex-CYWseY5E.js} +1 -1
  311. ksadk/server/static/assets/{linear-CN9sbKTF.js → linear-hdBcYzM8.js} +1 -1
  312. ksadk/server/static/assets/{mermaid-parser.core-DlgSBU8l.js → mermaid-parser.core-BWrDjSZM.js} +2 -2
  313. ksadk/server/static/assets/{mindmap-definition-RKZ34NQL-9afz7Oug.js → mindmap-definition-RKZ34NQL-Bjy_2v4_.js} +1 -1
  314. ksadk/server/static/assets/packet-YPE3B663-BN13y_xl.js +1 -0
  315. ksadk/server/static/assets/pie-LRSECV5Y-ftSLXhhc.js +1 -0
  316. ksadk/server/static/assets/{pieDiagram-4H26LBE5-DPv_VstN.js → pieDiagram-4H26LBE5-GmmqNiVH.js} +1 -1
  317. ksadk/server/static/assets/{quadrantDiagram-W4KKPZXB-o77wZ1XK.js → quadrantDiagram-W4KKPZXB-BmkRbwCg.js} +1 -1
  318. ksadk/server/static/assets/radar-GUYGQ44K-jaICkIeO.js +1 -0
  319. ksadk/server/static/assets/{requirementDiagram-4Y6WPE33-BYVw81VC.js → requirementDiagram-4Y6WPE33-DSWFqL7c.js} +1 -1
  320. ksadk/server/static/assets/{sankeyDiagram-5OEKKPKP-B7nZFMKT.js → sankeyDiagram-5OEKKPKP-l6iXmU65.js} +1 -1
  321. ksadk/server/static/assets/{sequenceDiagram-3UESZ5HK-BGRRrFw5.js → sequenceDiagram-3UESZ5HK-Cq6UBeQB.js} +1 -1
  322. ksadk/server/static/assets/{stateDiagram-AJRCARHV-BUfHCoPs.js → stateDiagram-AJRCARHV-qzTQpg3Y.js} +1 -1
  323. ksadk/server/static/assets/stateDiagram-v2-BHNVJYJU-BYCoYGAN.js +1 -0
  324. ksadk/server/static/assets/{timeline-definition-PNZ67QCA-FbCTGrf9.js → timeline-definition-PNZ67QCA-DEz24vV0.js} +1 -1
  325. ksadk/server/static/assets/treeView-BLDUP644-Cpib_vlz.js +1 -0
  326. ksadk/server/static/assets/treemap-LRROVOQU-DQxfmVHK.js +1 -0
  327. ksadk/server/static/assets/{vennDiagram-CIIHVFJN-DWgwtPsJ.js → vennDiagram-CIIHVFJN-CMCixki2.js} +1 -1
  328. ksadk/server/static/assets/wardley-L42UT6IY-BQYHnnkU.js +1 -0
  329. ksadk/server/static/assets/{wardleyDiagram-YWT4CUSO-2x8G-tTM.js → wardleyDiagram-YWT4CUSO-CVzB8F9K.js} +1 -1
  330. ksadk/server/static/assets/{xychartDiagram-2RQKCTM6-Drma3AYl.js → xychartDiagram-2RQKCTM6-BFBqBLc1.js} +1 -1
  331. ksadk/server/static/index.html +2 -2
  332. ksadk/server/terminal_sessions.py +111 -58
  333. ksadk/sessions/__init__.py +69 -19
  334. ksadk/sessions/base.py +31 -11
  335. ksadk/sessions/continuity.py +2 -3
  336. ksadk/sessions/in_memory.py +46 -2
  337. ksadk/sessions/local_service.py +148 -17
  338. ksadk/sessions/postgres_service.py +143 -25
  339. ksadk/sessions/resilient.py +36 -8
  340. ksadk/skills/models.py +17 -5
  341. ksadk/skills/package_store.py +5 -2
  342. ksadk/skills/runtime/agent.py +20 -5
  343. ksadk/skills/runtime/artifacts.py +1 -5
  344. ksadk/skills/runtime/backends/e2b.py +10 -4
  345. ksadk/skills/runtime/backends/local.py +15 -3
  346. ksadk/skills/runtime/base.py +1 -2
  347. ksadk/skills/runtime/executor.py +10 -3
  348. ksadk/skills/runtime/factory.py +4 -2
  349. ksadk/skills/runtime/loader.py +1 -2
  350. ksadk/skills/runtime/registry.py +15 -10
  351. ksadk/skills/runtime/request.py +3 -1
  352. ksadk/skills/service_client.py +47 -16
  353. ksadk/skills/tool_defs.py +15 -10
  354. ksadk/studio/__init__.py +5 -0
  355. ksadk/studio/agent_avatar_assets.py +120 -0
  356. ksadk/studio/agent_lifecycle.py +51 -0
  357. ksadk/studio/api.py +1046 -0
  358. ksadk/studio/api_catalog_routes.py +324 -0
  359. ksadk/studio/api_contracts.py +177 -0
  360. ksadk/studio/api_helpers.py +132 -0
  361. ksadk/studio/authoring.py +524 -0
  362. ksadk/studio/authoring_coordinator.py +285 -0
  363. ksadk/studio/builder.py +320 -0
  364. ksadk/studio/capabilities.py +351 -0
  365. ksadk/studio/cloud.py +278 -0
  366. ksadk/studio/codex_agent_service.py +583 -0
  367. ksadk/studio/codex_builder.py +324 -0
  368. ksadk/studio/codex_manifest.py +278 -0
  369. ksadk/studio/codex_run.py +352 -0
  370. ksadk/studio/compiler.py +189 -0
  371. ksadk/studio/contracts.py +644 -0
  372. ksadk/studio/errors.py +47 -0
  373. ksadk/studio/evaluation.py +192 -0
  374. ksadk/studio/event_store.py +284 -0
  375. ksadk/studio/framework_run.py +114 -0
  376. ksadk/studio/identifiers.py +33 -0
  377. ksadk/studio/mcp_runtime.py +229 -0
  378. ksadk/studio/model_client.py +543 -0
  379. ksadk/studio/model_profile_service.py +214 -0
  380. ksadk/studio/operations.py +243 -0
  381. ksadk/studio/otel_trace.py +754 -0
  382. ksadk/studio/pagination.py +182 -0
  383. ksadk/studio/python_tool_inspection.py +183 -0
  384. ksadk/studio/repository.py +306 -0
  385. ksadk/studio/resource_catalog.py +1217 -0
  386. ksadk/studio/run_service.py +707 -0
  387. ksadk/studio/runtime_catalog.py +74 -0
  388. ksadk/studio/runtime_source.py +339 -0
  389. ksadk/studio/service.py +1141 -0
  390. ksadk/studio/shared_web.py +994 -0
  391. ksadk/studio/skill_discovery.py +628 -0
  392. ksadk/studio/static/assets/PrismRenderer-IYN-ffww.js +3 -0
  393. ksadk/studio/static/assets/index-CaEN0eTR.css +1 -0
  394. ksadk/studio/static/assets/index-DI2eY_NH.js +252 -0
  395. ksadk/studio/static/assets/react-vendor-BNmTiJ-I.js +9 -0
  396. ksadk/studio/static/assets/rolldown-runtime-hePW80VL.js +1 -0
  397. ksadk/studio/static/index.html +15 -0
  398. ksadk/studio/templates.py +630 -0
  399. ksadk/studio/validator.py +246 -0
  400. ksadk/studio/workspace.py +137 -0
  401. ksadk/terminal_exec_policy.py +3 -4
  402. ksadk/tools/gateway.py +101 -15
  403. ksadk/tools/result_budget.py +12 -4
  404. ksadk/toolsets/__init__.py +161 -37
  405. ksadk/toolsets/a2a.py +426 -0
  406. ksadk/toolsets/platform.py +21 -5
  407. ksadk/toolsets/sandbox.py +82 -16
  408. ksadk/toolsets/skills.py +200 -39
  409. ksadk/toolsets/web.py +123 -26
  410. ksadk/toolsets/workspace.py +212 -101
  411. ksadk/tracing/__init__.py +19 -21
  412. ksadk/tracing/exporters/inmemory_exporter.py +62 -51
  413. ksadk/tracing/setup.py +135 -506
  414. ksadk/tracing/span_utils.py +0 -41
  415. ksadk/tui/loop.py +78 -30
  416. ksadk/tui/stream_render.py +1 -0
  417. ksadk/ui_config.py +5 -3
  418. ksadk/version.py +1 -1
  419. ksadk_runtime_common/memory_backend/registry.py +56 -56
  420. ksadk_runtime_common/schemas/runtime_event_v1.json +95 -0
  421. ksadk_runtime_common/workspace_files/router.py +8 -2
  422. agentengine_sdk_python-0.7.0.dist-info/RECORD +0 -482
  423. ksadk/a2a/card_builder.py +0 -64
  424. ksadk/a2a/client.py +0 -309
  425. ksadk/runners/utils/langfuse.py +0 -230
  426. ksadk/server/static/assets/CodeBlock-P16VOLYi.js +0 -9
  427. ksadk/server/static/assets/MathMessageMarkdown-CdGiQWHR.js +0 -8
  428. ksadk/server/static/assets/MermaidBlock-IOcal8cm.js +0 -303
  429. ksadk/server/static/assets/NativeTerminalPanel-DGSDWsei.js +0 -1
  430. ksadk/server/static/assets/architecture-7EHR7CIX-BvUlsA6l.js +0 -1
  431. ksadk/server/static/assets/channel-CTuydARX.js +0 -1
  432. ksadk/server/static/assets/chunk-QZHKN3VN-BnCydivS.js +0 -1
  433. ksadk/server/static/assets/classDiagram-4FO5ZUOK-BNHg45Be.js +0 -1
  434. ksadk/server/static/assets/classDiagram-v2-Q7XG4LA2-BNHg45Be.js +0 -1
  435. ksadk/server/static/assets/eventmodeling-FCH6USID-DsAgWnlf.js +0 -1
  436. ksadk/server/static/assets/gitGraph-WXDBUCRP-BIao9Yjg.js +0 -1
  437. ksadk/server/static/assets/index-C00Lwg3L.js +0 -165
  438. ksadk/server/static/assets/index-DAURbCsP.css +0 -1
  439. ksadk/server/static/assets/info-J43DQDTF-CyipqGxU.js +0 -1
  440. ksadk/server/static/assets/packet-YPE3B663-CGkyRxlg.js +0 -1
  441. ksadk/server/static/assets/pie-LRSECV5Y-M0uWAf4n.js +0 -1
  442. ksadk/server/static/assets/radar-GUYGQ44K-Bdbm24-x.js +0 -1
  443. ksadk/server/static/assets/stateDiagram-v2-BHNVJYJU-8xBN_gLM.js +0 -1
  444. ksadk/server/static/assets/treeView-BLDUP644-npMo0ak1.js +0 -1
  445. ksadk/server/static/assets/treemap-LRROVOQU-CHdzrrdo.js +0 -1
  446. ksadk/server/static/assets/wardley-L42UT6IY-BEQz7wyy.js +0 -1
  447. ksadk/tracing/exporters/langfuse_exporter.py +0 -445
  448. {agentengine_sdk_python-0.7.0.dist-info → agentengine_sdk_python-0.8.1.dist-info}/entry_points.txt +0 -0
  449. {agentengine_sdk_python-0.7.0.dist-info → agentengine_sdk_python-0.8.1.dist-info}/licenses/LICENSE +0 -0
  450. {agentengine_sdk_python-0.7.0.dist-info → agentengine_sdk_python-0.8.1.dist-info}/top_level.txt +0 -0
ksadk/cli/cmd_a2a.py CHANGED
@@ -1,59 +1,108 @@
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
- from ksadk.runners.factory import create_runner
35
+ from ksadk.runtime.factory import create_runtime_adapter
36
+ from ksadk.runtime.launch import RuntimeLaunchContext
37
+
38
+ _HELP = dict(help_option_names=["-h", "--help"])
39
+ _DEFAULT_TASK_STORE_DSN = "sqlite+aiosqlite:///.agentengine/a2a_tasks.db"
16
40
 
17
41
 
18
- @click.group("a2a", context_settings=CONTEXT_SETTINGS, help="A2A 协议服务与 Agent Card")
42
+ def _resolve_task_store_dsn(task_store_dsn: str, agent_path: Path) -> str:
43
+ """相对路径的 sqlite DSN 锚定到 agent_path(而非 cwd),并确保父目录存在。
44
+
45
+ 绝对 DSN(postgresql:// 等)原样返回。
46
+ """
47
+ prefix = "sqlite+aiosqlite:///"
48
+ if not task_store_dsn.startswith(prefix):
49
+ return task_store_dsn
50
+ raw_path = task_store_dsn[len(prefix) :]
51
+ if raw_path.startswith("/") or not raw_path:
52
+ return task_store_dsn
53
+ resolved = (agent_path / raw_path).resolve()
54
+ resolved.parent.mkdir(parents=True, exist_ok=True)
55
+ return f"{prefix}{resolved}"
56
+
57
+
58
+ @click.group("a2a", context_settings=CONTEXT_SETTINGS, help="A2A 协议服务与本地试调")
19
59
  def a2a():
20
- """A2A protocol helpers."""
60
+ """A2A 协议命令组(serve / card / register / discover / call / status / cancel)。"""
61
+
21
62
 
63
+ # ---------------------------------------------------------------------------
64
+ # serve / card(本地 A2A server 与 AgentCard)
65
+ # ---------------------------------------------------------------------------
22
66
 
23
- @a2a.command("serve", context_settings=dict(help_option_names=["-h", "--help"]))
67
+
68
+ @a2a.command("serve", context_settings=_HELP)
24
69
  @click.argument(
25
- "agent_dir",
26
- default=".",
27
- type=click.Path(exists=True, file_okay=False, path_type=Path),
70
+ "agent_path", type=click.Path(exists=True, file_okay=False, path_type=Path), default="."
28
71
  )
29
- @click.option("--host", default="0.0.0.0", show_default=True, help="服务监听地址")
72
+ @click.option("--host", default="127.0.0.1", show_default=True, help="服务监听地址")
30
73
  @click.option("--port", default=8081, show_default=True, type=int, help="服务端口")
31
- @click.option("--url", default=None, help="Agent Card 对外宣告地址")
74
+ @click.option("--url", default=None, help="Agent Card 对外宣告地址(默认 http://host:port)")
32
75
  @click.option("--name", default=None, help="覆盖 Agent 名称")
33
76
  @click.option("--description", default="", help="覆盖 Agent 描述")
34
- @click.option("--skill", "skills", multiple=True, help="可重复传入,追加 Agent Card 技能")
77
+ @click.option("--skill", "skills", multiple=True, help="可重复传入,追加 Agent Card 技能")
78
+ @click.option(
79
+ "--task-store-dsn",
80
+ default=_DEFAULT_TASK_STORE_DSN,
81
+ show_default=True,
82
+ help="durable task store DSN(生产用 postgresql+asyncpg://)",
83
+ )
84
+ @click.option(
85
+ "--include-reasoning/--no-include-reasoning",
86
+ default=True,
87
+ show_default=True,
88
+ help="将可展示的 reasoning 作为 adk_thought artifact 流式输出",
89
+ )
35
90
  @click.option("--no-trace", is_flag=True, help="禁用 Tracing")
36
91
  def serve(
37
- agent_dir: Path,
92
+ agent_path: Path,
38
93
  host: str,
39
94
  port: int,
40
95
  url: str | None,
41
96
  name: str | None,
42
97
  description: str,
43
98
  skills: Sequence[str],
99
+ task_store_dsn: str,
100
+ include_reasoning: bool,
44
101
  no_trace: bool,
45
102
  ):
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
- ]
103
+ """把本地 agent 暴露为 A2A 协议服务(JSONRPC + REST + AgentCard)。"""
104
+ agent_path = agent_path.resolve()
105
+ command_args = ["a2a", "serve", str(agent_path), "--host", host, "--port", str(port)]
57
106
  if url:
58
107
  command_args.extend(["--url", url])
59
108
  if name:
@@ -62,28 +111,45 @@ def serve(
62
111
  command_args.extend(["--description", description])
63
112
  for skill in skills:
64
113
  command_args.extend(["--skill", skill])
114
+ if task_store_dsn != _DEFAULT_TASK_STORE_DSN:
115
+ command_args.extend(["--task-store-dsn", task_store_dsn])
116
+ if not include_reasoning:
117
+ command_args.append("--no-include-reasoning")
65
118
  if no_trace:
66
119
  command_args.append("--no-trace")
67
120
  reexec_with_project_venv_if_needed(agent_path, command_args)
121
+ task_store_dsn = _resolve_task_store_dsn(task_store_dsn, agent_path)
122
+ detection_result, runtime_adapter = _load_runtime_adapter(
123
+ agent_path,
124
+ no_trace=no_trace,
125
+ )
126
+ from fastapi import FastAPI
68
127
 
69
- 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,
128
+ app = FastAPI(title=f"ksadk A2A: {detection_result.name}")
129
+ config = A2AConfig(
130
+ enabled=True,
131
+ base_url=url or f"http://{host}:{port}",
132
+ agent_name=name or detection_result.name,
76
133
  description=description,
77
- skills=skills,
134
+ skills=list(skills),
135
+ task_store_dsn=task_store_dsn,
136
+ include_reasoning=include_reasoning,
78
137
  )
79
- uvicorn.run(server.build(), host=host, port=port)
138
+ runtime_type = detection_result.type.value
139
+ from ksadk.a2a.task_adapter import A2ARuntimeTaskAdapter
140
+
141
+ add_a2a_protocol_routes(
142
+ app,
143
+ config,
144
+ task_adapter=A2ARuntimeTaskAdapter(runtime_adapter, runtime_type=runtime_type),
145
+ )
146
+ click.echo(f"A2A agent card: {(url or f'http://{host}:{port}')}/.well-known/agent-card.json")
147
+ uvicorn.run(app, host=host, port=port)
80
148
 
81
149
 
82
- @a2a.command("card", context_settings=dict(help_option_names=["-h", "--help"]))
150
+ @a2a.command("card", context_settings=_HELP)
83
151
  @click.argument(
84
- "agent_dir",
85
- default=".",
86
- type=click.Path(exists=True, file_okay=False, path_type=Path),
152
+ "agent_path", type=click.Path(exists=True, file_okay=False, path_type=Path), default="."
87
153
  )
88
154
  @click.option(
89
155
  "--url",
@@ -93,75 +159,180 @@ def serve(
93
159
  )
94
160
  @click.option("--name", default=None, help="覆盖 Agent 名称")
95
161
  @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,
162
+ @click.option("--skill", "skills", multiple=True, help="可重复传入,追加 Agent Card 技能")
163
+ def card(agent_path: Path, url: str, name: str | None, description: str, skills: Sequence[str]):
164
+ """打印该 agent 的 wire 1.0 AgentCard(supportedInterfaces)。"""
165
+ # ``card`` is intentionally machine-readable: users commonly redirect it to
166
+ # ``agent-card.json``. Detection only needs the manifest, so avoid the
167
+ # environment bootstrap here; it may print helpful model-default banners.
168
+ detection_result = _detect_project(agent_path, configure_environment=False)
169
+ card_obj = build_agent_card(
170
+ name=name or detection_result.name,
171
+ base_url=url,
172
+ description=description,
173
+ skills=list(skills),
174
+ )
175
+ click.echo(MessageToJson(card_obj, indent=2))
176
+
177
+
178
+ @a2a.command("register", context_settings=_HELP)
179
+ @click.argument(
180
+ "agent_path", type=click.Path(exists=True, file_okay=False, path_type=Path), default="."
181
+ )
182
+ @click.option("--url", required=True, help="Agent Card 对外宣告地址")
183
+ @click.option("--name", default=None, help="覆盖 Agent 名称")
184
+ @click.option("--description", default="", help="覆盖 Agent 描述")
185
+ @click.option("--skill", "skills", multiple=True, help="可重复传入,追加 Agent Card 技能")
186
+ def register(agent_path: Path, url: str, name: str | None, description: str, skills: Sequence[str]):
187
+ """构造并打印用于 Space 注册的 AgentCard(本地试调;server 侧 KOP 注册见产品化文档)。"""
188
+ detection_result = _detect_project(agent_path, configure_environment=False)
189
+ card_obj = build_agent_card(
190
+ name=name or detection_result.name,
191
+ base_url=url,
110
192
  description=description,
111
- skills=skills,
193
+ skills=list(skills),
194
+ )
195
+ click.echo(
196
+ "# 本地 AgentCard 预览;平台注册使用 GetA2AAgentCard + CreateA2AAgent,"
197
+ "hosted 注册不接收用户手写 Card:"
112
198
  )
113
- click.echo(json.dumps(payload, ensure_ascii=False))
199
+ click.echo(MessageToJson(card_obj, indent=2))
114
200
 
115
201
 
116
- def _detect_project(agent_path: Path):
117
- configs.setup_environment(agent_path)
202
+ # ---------------------------------------------------------------------------
203
+ # discover / call / status / cancel(Space 内动态发现与调用,经 A2ASpaceClient)
204
+ # ---------------------------------------------------------------------------
205
+
206
+
207
+ def _space_client(space_id: str | None = None) -> A2ASpaceClient:
208
+ """从环境构造 A2ASpaceClient;Space 未配置时显式报错(不静默)。"""
209
+ try:
210
+ return A2ASpaceClient.from_env(space_id=space_id)
211
+ except ValueError as exc:
212
+ raise click.ClickException(
213
+ f"A2A Space 未配置:{exc}。"
214
+ "请传 --space-id,或由 AgentEngine 部署注入 KSADK_A2A_SPACE_ID"
215
+ "(兼容 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))
274
+
275
+ asyncio.run(_run())
276
+
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)")
121
312
  return result
122
313
 
123
314
 
124
- def _load_runner(agent_path: Path, *, no_trace: bool):
315
+ def _load_runtime_adapter(agent_path: Path, *, no_trace: bool):
125
316
  detection_result = _detect_project(agent_path)
317
+ runtime_type = detection_result.type.value
126
318
  if not no_trace:
127
- _setup_tracing(detection_result.type.value)
128
- runner = create_runner(detection_result, str(agent_path))
129
- runner.load_agent()
130
- return detection_result, runner
319
+ _setup_tracing(runtime_type)
320
+ context = RuntimeLaunchContext(
321
+ runtime_type=runtime_type,
322
+ project_dir=agent_path,
323
+ detection=detection_result,
324
+ config=dict(getattr(detection_result, "raw_config", None) or {}),
325
+ )
326
+ return detection_result, create_runtime_adapter(context)
131
327
 
132
328
 
133
329
  def _setup_tracing(framework_type: str) -> None:
134
330
  try:
135
- import os
136
331
 
137
332
  from ksadk.tracing import setup_tracing
138
333
 
139
- use_callback_only = os.getenv("LANGFUSE_USE_CALLBACK", "").strip().lower() in (
140
- "1",
141
- "true",
142
- "yes",
143
- "on",
144
- )
145
334
  setup_tracing(
146
335
  enable_inmemory=True,
147
- enable_langfuse=None,
148
- use_callback_only=use_callback_only,
149
336
  )
150
337
  except Exception:
151
338
  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(