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
@@ -10,66 +10,69 @@ import os
10
10
  import shutil
11
11
  import subprocess
12
12
  from pathlib import Path
13
- from typing import List
13
+ from typing import List, Optional
14
14
 
15
15
  import click
16
16
 
17
- from ksadk.builders.code_builder import CodeBuilder
18
17
  from ksadk.builders.base import BuildResult
18
+ from ksadk.builders.code_builder import CodeBuilder
19
19
  from ksadk.builders.container_builder import ContainerBuilder, ensure_docker_running
20
20
  from ksadk.builders.requirements_utils import merge_requirement_lists, parse_requirements_text
21
- from ksadk.detection.mcp_detector import MCPDetector, MCPDetectionResult
21
+ from ksadk.detection.mcp_detector import MCPDetectionResult, MCPDetector
22
22
 
23
23
 
24
24
  class MCPCodeBuilder(CodeBuilder):
25
25
  """MCP 代码构建器"""
26
-
27
- def __init__(self, project_dir: Path, config: dict = None):
26
+
27
+ def __init__(self, project_dir: Path, config: Optional[dict] = None):
28
28
  super().__init__(project_dir, config)
29
29
  self.build_dir = self.project_dir / ".agentengine" / "mcp_build"
30
30
  self.deps_dir = self.build_dir / "linux_deps"
31
- self._mcp_detection: MCPDetectionResult = None
32
-
31
+ self._mcp_detection: Optional[MCPDetectionResult] = None
32
+
33
33
  def build(self) -> BuildResult:
34
34
  """执行 MCP 构建"""
35
35
  self._load_dotenv()
36
36
  config = self._load_config()
37
-
37
+
38
38
  # 检测 MCP 项目
39
39
  detector = MCPDetector(str(self.project_dir))
40
40
  detection_result = detector.detect()
41
41
  self._mcp_detection = detection_result
42
-
42
+
43
43
  if not detection_result.is_valid:
44
- return BuildResult(
45
- success=False,
46
- error_message="未检测到 FastMCP 项目"
47
- )
48
-
44
+ return BuildResult(success=False, error_message="未检测到 FastMCP 项目")
45
+
49
46
  click.echo(f"📦 MCP Server: {click.style(detection_result.name, fg='green')}")
50
47
  if detection_result.tools:
51
48
  click.echo(f" 工具: {', '.join(detection_result.tools[:5])}")
52
49
  if len(detection_result.tools) > 5:
53
50
  click.echo(f" ... 及其他 {len(detection_result.tools) - 5} 个")
54
-
55
- mcp_name = config.get('name', self.project_dir.name).replace('-', '_').replace('.', '_')
56
-
51
+
52
+ mcp_name = config.get("name", self.project_dir.name).replace("-", "_").replace(".", "_")
53
+
57
54
  # 创建构建目录
58
55
  self.build_dir.mkdir(parents=True, exist_ok=True)
59
56
  zip_path = self.build_dir / f"{mcp_name}.zip"
60
-
57
+
61
58
  # 检查是否需要重新构建
62
59
  no_cache = self.config.get("no_cache", False) if self.config else False
63
- if zip_path.exists() and not no_cache and not self._need_rebuild(zip_path, detection_result):
60
+ if (
61
+ zip_path.exists()
62
+ and not no_cache
63
+ and not self._need_rebuild(zip_path, detection_result)
64
+ ):
64
65
  incompatibles = self._scan_incompatible_binaries_in_zip(zip_path)
65
66
  if incompatibles:
66
- click.secho("\n⚠️ 检测到缓存 MCP 构建包含非 Linux 兼容关键二进制,自动重建...", fg='yellow')
67
+ click.secho(
68
+ "\n⚠️ 检测到缓存 MCP 构建包含非 Linux 兼容关键二进制,自动重建...", fg="yellow"
69
+ )
67
70
  for item in incompatibles[:5]:
68
71
  click.echo(f" - {item}")
69
72
  else:
70
73
  self._save_input_fingerprint(zip_path, detection_result)
71
74
  zip_size = zip_path.stat().st_size / (1024 * 1024)
72
- click.secho(f"\n✅ 使用已有构建: {zip_path.name} ({zip_size:.2f} MB)", fg='green')
75
+ click.secho(f"\n✅ 使用已有构建: {zip_path.name} ({zip_size:.2f} MB)", fg="green")
73
76
  return BuildResult(
74
77
  success=True,
75
78
  artifact_path=zip_path,
@@ -77,36 +80,34 @@ class MCPCodeBuilder(CodeBuilder):
77
80
  metadata={
78
81
  "mcp_name": mcp_name,
79
82
  "mcp_variable": detection_result.mcp_variable,
80
- "tools": detection_result.tools
81
- }
83
+ "tools": detection_result.tools,
84
+ },
82
85
  )
83
-
86
+
84
87
  # Step 1: 准备依赖
85
88
  click.echo("\n📋 Step 1/3: 准备依赖清单...")
86
89
  requirements_path = self._prepare_mcp_requirements(detection_result)
87
-
90
+
88
91
  # Step 2: 安装依赖(在 Mac 上安装后自动替换为 Linux 二进制,和 agent code 模式一致)
89
92
  click.echo("\n📦 Step 2/3: 安装依赖...")
90
93
  if self.deps_dir.exists():
91
94
  import shutil
95
+
92
96
  shutil.rmtree(self.deps_dir)
93
97
  self.deps_dir.mkdir(parents=True)
94
-
98
+
95
99
  if not self._install_dependencies(requirements_path):
96
- return BuildResult(
97
- success=False,
98
- error_message="依赖安装失败"
99
- )
100
-
100
+ return BuildResult(success=False, error_message="依赖安装失败")
101
+
101
102
  # Step 3: 打包
102
103
  click.echo("\n📦 Step 3/3: 打包 zip...")
103
104
  self._package_mcp_zip(zip_path, detection_result)
104
105
  self._save_input_fingerprint(zip_path, detection_result)
105
-
106
+
106
107
  zip_size = zip_path.stat().st_size
107
108
  click.echo(f" zip 文件: {zip_path}")
108
109
  click.echo(f" 大小: {zip_size / (1024 * 1024):.2f} MB")
109
-
110
+
110
111
  return BuildResult(
111
112
  success=True,
112
113
  artifact_path=zip_path,
@@ -115,33 +116,33 @@ class MCPCodeBuilder(CodeBuilder):
115
116
  "mcp_name": mcp_name,
116
117
  "mcp_variable": detection_result.mcp_variable,
117
118
  "tools": detection_result.tools,
118
- "deps_dir": str(self.deps_dir)
119
- }
119
+ "deps_dir": str(self.deps_dir),
120
+ },
120
121
  )
121
-
122
+
122
123
  def _prepare_mcp_requirements(self, detection_result: MCPDetectionResult) -> Path:
123
124
  """准备 MCP 依赖"""
124
125
  base_deps = self._get_mcp_base_requirements()
125
126
  final_deps = list(base_deps)
126
-
127
+
127
128
  # 合并用户依赖
128
129
  user_requirements = self.project_dir / "requirements.txt"
129
130
  if user_requirements.exists():
130
- click.echo(f" 发现 requirements.txt,正在合并...")
131
+ click.echo(" 发现 requirements.txt,正在合并...")
131
132
  user_content = user_requirements.read_text()
132
133
  user_deps = parse_requirements_text(user_content)
133
134
  final_deps = merge_requirement_lists(final_deps, user_deps)
134
135
  else:
135
- click.echo(f" 使用默认 MCP 依赖")
136
-
136
+ click.echo(" 使用默认 MCP 依赖")
137
+
137
138
  # 写入构建目录
138
139
  requirements_path = self.build_dir / "requirements.txt"
139
140
  requirements_path.write_text("\n".join(final_deps))
140
-
141
+
141
142
  click.echo(f" 共 {len(final_deps)} 个依赖包")
142
-
143
+
143
144
  return requirements_path
144
-
145
+
145
146
  def _get_mcp_base_requirements(self) -> List[str]:
146
147
  """MCP 基础依赖"""
147
148
  return [
@@ -154,40 +155,38 @@ class MCPCodeBuilder(CodeBuilder):
154
155
  "python-dotenv>=1.0.0",
155
156
  "pydantic>=2.0.0",
156
157
  ]
157
-
158
+
158
159
  def _package_mcp_zip(self, zip_path: Path, detection_result: MCPDetectionResult) -> None:
159
160
  """打包 MCP zip"""
160
161
  import zipfile
161
-
162
+
162
163
  file_count = 0
163
-
164
- with zipfile.ZipFile(zip_path, 'w', zipfile.ZIP_DEFLATED) as zf:
164
+
165
+ with zipfile.ZipFile(zip_path, "w", zipfile.ZIP_DEFLATED) as zf:
165
166
  # 添加项目文件
166
167
  for file_path in self._iter_project_files():
167
168
  arcname = file_path.relative_to(self.project_dir).as_posix()
168
169
  zf.write(file_path, arcname)
169
170
  file_count += 1
170
-
171
+
171
172
  # 添加依赖(已替换为 Linux 二进制)
172
173
  deps_count = 0
173
- for file_path in self.deps_dir.rglob('*'):
174
+ for file_path in self.deps_dir.rglob("*"):
174
175
  if file_path.is_file():
175
176
  arcname = str(file_path.relative_to(self.deps_dir))
176
177
  zf.write(file_path, arcname)
177
178
  deps_count += 1
178
-
179
+
179
180
  # 生成 MCP entrypoint
180
181
  entrypoint_content = self._generate_mcp_entrypoint(detection_result)
181
182
  zf.writestr("entrypoint.py", entrypoint_content)
182
-
183
+
183
184
  click.echo(f" ✓ 打包完成: {file_count} 个项目文件 + {deps_count} 个依赖文件")
184
-
185
+
185
186
  def _generate_mcp_entrypoint(self, detection_result: MCPDetectionResult) -> str:
186
187
  """生成 MCP 入口脚本"""
187
188
  # 确定包名
188
189
  entry_point = detection_result.entry_point
189
- package_path = Path(detection_result.package_path)
190
-
191
190
  # 计算模块路径
192
191
  if "/" in entry_point:
193
192
  # 如果入口在子目录,如 my_mcp/server.py
@@ -195,9 +194,9 @@ class MCPCodeBuilder(CodeBuilder):
195
194
  else:
196
195
  # 根目录
197
196
  module_path = entry_point.replace(".py", "")
198
-
197
+
199
198
  mcp_variable = detection_result.mcp_variable
200
-
199
+
201
200
  return f'''"""
202
201
  AgentEngine MCP 入口
203
202
 
@@ -244,15 +243,20 @@ except ImportError:
244
243
  from {module_path} import {mcp_variable}
245
244
 
246
245
  logger.info(f"MCP 实例: {mcp_variable}")
247
- logger.info(f"工具数量: {{len(getattr({mcp_variable}, '_tool_manager', {{}}).list_tools() if hasattr({mcp_variable}, '_tool_manager') else 'N/A')}}")
246
+ tool_count = (
247
+ len(getattr({mcp_variable}, "_tool_manager", {{}}).list_tools())
248
+ if hasattr({mcp_variable}, "_tool_manager")
249
+ else "N/A"
250
+ )
251
+ logger.info(f"工具数量: {{tool_count}}")
248
252
 
249
253
  if __name__ == "__main__":
250
254
  port = int(os.environ.get("PORT", 8080))
251
255
  host = os.environ.get("HOST", "0.0.0.0")
252
-
256
+
253
257
  logger.info(f"启动 HTTP Server: {{host}}:{{port}}")
254
258
  logger.info("MCP endpoint: /mcp")
255
-
259
+
256
260
  {mcp_variable}.run(
257
261
  transport="http",
258
262
  host=host,
@@ -264,8 +268,14 @@ if __name__ == "__main__":
264
268
  class MCPContainerBuilder(ContainerBuilder):
265
269
  """FastMCP Docker 镜像构建器。"""
266
270
 
267
- def __init__(self, project_dir: Path, config: dict = None,
268
- tag: str = None, registry: str = None, no_cache: bool = False):
271
+ def __init__(
272
+ self,
273
+ project_dir: Path,
274
+ config: Optional[dict] = None,
275
+ tag: Optional[str] = None,
276
+ registry: Optional[str] = None,
277
+ no_cache: bool = False,
278
+ ):
269
279
  super().__init__(project_dir, config=config, tag=tag, registry=registry, no_cache=no_cache)
270
280
 
271
281
  def build(self) -> BuildResult:
@@ -277,28 +287,25 @@ class MCPContainerBuilder(ContainerBuilder):
277
287
  result = detector.detect()
278
288
 
279
289
  if not result.is_valid:
280
- return BuildResult(
281
- success=False,
282
- error_message="未检测到 FastMCP 项目"
283
- )
290
+ return BuildResult(success=False, error_message="未检测到 FastMCP 项目")
284
291
 
285
292
  click.echo(f"📦 MCP Server: {click.style(result.name, fg='green')}")
286
293
 
287
- image_name = config.get('name', self.project_dir.name).replace('-', '_').replace('.', '_')
294
+ image_name = config.get("name", self.project_dir.name).replace("-", "_").replace(".", "_")
288
295
 
289
296
  image_tag = self.tag
290
297
  if not image_tag:
291
- image_tag = config.get('version', '')
298
+ image_tag = config.get("version", "")
292
299
  if not image_tag:
293
- image_tag = config.get('image', {}).get('tag', 'latest')
300
+ image_tag = config.get("image", {}).get("tag", "latest")
294
301
 
295
302
  image_registry = self.registry
296
303
  if not image_registry:
297
- image_registry = os.getenv('KCR_REGISTRY', '')
304
+ image_registry = os.getenv("KCR_REGISTRY", "")
298
305
  if not image_registry:
299
- image_registry = config.get('image', {}).get('registry', '')
306
+ image_registry = config.get("image", {}).get("registry", "")
300
307
  if not image_registry:
301
- image_registry = self._get_smart_kcr_endpoint(os.getenv('KSYUN_REGION', 'cn-beijing-6'))
308
+ image_registry = self._get_smart_kcr_endpoint(os.getenv("KSYUN_REGION", "cn-beijing-6"))
302
309
  else:
303
310
  image_registry = self._optimize_kcr_endpoint(image_registry)
304
311
 
@@ -310,22 +317,16 @@ class MCPContainerBuilder(ContainerBuilder):
310
317
  package_info = self._package_mcp_project(result)
311
318
  click.echo("✅ 打包完成")
312
319
  except Exception as e:
313
- return BuildResult(
314
- success=False,
315
- error_message=f"打包失败: {e}"
316
- )
320
+ return BuildResult(success=False, error_message=f"打包失败: {e}")
317
321
 
318
322
  if not ensure_docker_running():
319
- return BuildResult(
320
- success=False,
321
- error_message="Docker 未运行"
322
- )
323
+ return BuildResult(success=False, error_message="Docker 未运行")
323
324
 
324
325
  click.echo("\n🔨 构建 Docker 镜像 (目标平台: linux/amd64)...")
325
326
  try:
326
- cmd = ['docker', 'build', '--platform', 'linux/amd64', '-t', full_image]
327
+ cmd = ["docker", "build", "--platform", "linux/amd64", "-t", full_image]
327
328
  if self.no_cache:
328
- cmd.append('--no-cache')
329
+ cmd.append("--no-cache")
329
330
  cmd.append(package_info.build_dir)
330
331
 
331
332
  quiet_mode = os.getenv("AGENTENGINE_OUTPUT_MODE", "").strip().lower() == "json"
@@ -335,7 +336,7 @@ class MCPContainerBuilder(ContainerBuilder):
335
336
  capture_output=quiet_mode,
336
337
  text=quiet_mode,
337
338
  )
338
- click.secho(f"\n✅ 镜像构建成功: {full_image}", fg='green')
339
+ click.secho(f"\n✅ 镜像构建成功: {full_image}", fg="green")
339
340
 
340
341
  return BuildResult(
341
342
  success=True,
@@ -346,7 +347,7 @@ class MCPContainerBuilder(ContainerBuilder):
346
347
  "build_dir": package_info.build_dir,
347
348
  "mcp_variable": result.mcp_variable,
348
349
  "tools": result.tools,
349
- }
350
+ },
350
351
  )
351
352
  except subprocess.CalledProcessError as e:
352
353
  error_message = f"镜像构建失败: {e}"
@@ -356,10 +357,7 @@ class MCPContainerBuilder(ContainerBuilder):
356
357
  detail = stderr or stdout
357
358
  if detail:
358
359
  error_message = f"{error_message}: {detail}"
359
- return BuildResult(
360
- success=False,
361
- error_message=error_message
362
- )
360
+ return BuildResult(success=False, error_message=error_message)
363
361
 
364
362
  def _package_mcp_project(self, detection_result: MCPDetectionResult):
365
363
  """复制项目并生成 FastMCP 容器运行所需文件。"""
@@ -372,16 +370,17 @@ class MCPContainerBuilder(ContainerBuilder):
372
370
  for item in project_path.iterdir():
373
371
  if CodeBuilder._is_real_dotenv_file(item.name):
374
372
  continue
375
- if (
376
- (item.name.startswith('.') and item.name != '.env.example')
377
- or item.name in ('__pycache__', '.git', 'node_modules')
373
+ if (item.name.startswith(".") and item.name != ".env.example") or item.name in (
374
+ "__pycache__",
375
+ ".git",
376
+ "node_modules",
378
377
  ):
379
378
  continue
380
379
  dest = output_dir / item.name
381
380
  if item.is_dir():
382
381
  if dest.exists():
383
382
  shutil.rmtree(dest)
384
- shutil.copytree(item, dest, ignore=shutil.ignore_patterns('__pycache__', '*.pyc'))
383
+ shutil.copytree(item, dest, ignore=shutil.ignore_patterns("__pycache__", "*.pyc"))
385
384
  else:
386
385
  shutil.copy2(item, dest)
387
386
 
@@ -406,7 +405,7 @@ class MCPContainerBuilder(ContainerBuilder):
406
405
  "entrypoint": str(entrypoint_path),
407
406
  "mcp_variable": detection_result.mcp_variable,
408
407
  "tools": detection_result.tools,
409
- }
408
+ },
410
409
  )
411
410
 
412
411
  def _generate_mcp_requirements(self, project_path: Path) -> str:
@@ -5,7 +5,6 @@ from typing import Iterable, List
5
5
 
6
6
  from packaging.requirements import InvalidRequirement, Requirement
7
7
 
8
-
9
8
  _NORMALIZED_NAME_RE = re.compile(r"[-_.]+")
10
9
 
11
10
 
@@ -47,10 +46,7 @@ def exclude_requirement_names(
47
46
  *,
48
47
  excluded_names: Iterable[str],
49
48
  ) -> List[str]:
50
- excluded = {
51
- _NORMALIZED_NAME_RE.sub("-", name).lower()
52
- for name in excluded_names
53
- }
49
+ excluded = {_NORMALIZED_NAME_RE.sub("-", name).lower() for name in excluded_names}
54
50
  filtered: List[str] = []
55
51
 
56
52
  for raw_requirement in requirements: