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
@@ -1,95 +1,88 @@
1
+ """Side-effect-free public exports for conversation preparation and persistence."""
2
+
1
3
  from __future__ import annotations
2
4
 
3
- from ksadk.conversations.context import (
4
- CANONICAL_EVENT_TYPES,
5
- build_history_from_events,
6
- build_request_history,
7
- canonical_event_type,
8
- compacted_until_seq_id,
9
- extract_event_text,
10
- extract_text_from_event_parts,
11
- group_events_by_api_round,
12
- project_model_messages,
13
- summarize_event_groups,
14
- )
15
- from ksadk.conversations.normalize import (
16
- attachment_from_part,
17
- attachment_prompt_text,
18
- compact_attachment_for_session,
19
- decode_inline_data,
20
- display_content_from_parts,
21
- extract_user_input_from_parts,
22
- normalize_kop_message_content,
23
- normalize_kop_messages,
24
- normalize_parts_content,
25
- normalize_responses_input,
26
- resolve_attachment_storage_path,
27
- resolve_uploads_dir,
28
- )
29
- from ksadk.conversations.runtime import (
30
- CompactionPlan,
31
- PreparedConversationTurn,
32
- append_conversation_event,
33
- append_context_checkpoint_event,
34
- append_reasoning_event,
35
- append_run_checkpoint_event,
36
- append_run_resume_event,
37
- append_run_status_event,
38
- build_chat_completions_payload,
39
- build_compaction_sse_event,
40
- build_responses_payload,
41
- build_run_input,
42
- compact_conversation_history,
43
- ensure_conversation_session,
44
- extract_responses_resume_input,
45
- invoke_conversation_once,
46
- prime_session_metadata_for_user_turn,
47
- preview_auto_compaction,
48
- stream_conversation_turn,
49
- stream_responses_conversation_turn,
50
- )
5
+ from importlib import import_module
6
+ from typing import Any
7
+
8
+
9
+ def _exports(module: str, *names: str) -> dict[str, tuple[str, str]]:
10
+ return {name: (module, name) for name in names}
11
+
12
+
13
+ _EXPORTS = {
14
+ **_exports(
15
+ "ksadk.conversations.attachments",
16
+ "decode_inline_data",
17
+ "resolve_attachment_storage_path",
18
+ "resolve_uploads_dir",
19
+ ),
20
+ **_exports(
21
+ "ksadk.conversations.context",
22
+ "CANONICAL_EVENT_TYPES",
23
+ "build_history_from_events",
24
+ "build_request_history",
25
+ "canonical_event_type",
26
+ "compacted_until_seq_id",
27
+ "extract_event_text",
28
+ "extract_text_from_event_parts",
29
+ "group_events_by_api_round",
30
+ "project_model_messages",
31
+ "summarize_event_groups",
32
+ ),
33
+ **_exports(
34
+ "ksadk.conversations.normalize",
35
+ "attachment_from_part",
36
+ "attachment_prompt_text",
37
+ "compact_attachment_for_session",
38
+ "display_content_from_parts",
39
+ "extract_user_input_from_parts",
40
+ "normalize_kop_message_content",
41
+ "normalize_kop_messages",
42
+ "normalize_parts_content",
43
+ "normalize_responses_input",
44
+ ),
45
+ **_exports(
46
+ "ksadk.conversations.runtime",
47
+ "CompactionPlan",
48
+ "PreparedConversationTurn",
49
+ "append_context_checkpoint_event",
50
+ "append_conversation_event",
51
+ "append_reasoning_event",
52
+ "append_run_checkpoint_event",
53
+ "append_run_resume_event",
54
+ "append_run_status_event",
55
+ "build_chat_completions_payload",
56
+ "build_compaction_sse_event",
57
+ "build_responses_payload",
58
+ "build_run_input",
59
+ "compact_conversation_history",
60
+ "ensure_conversation_session",
61
+ "extract_responses_resume_input",
62
+ "invoke_conversation_once",
63
+ "preview_auto_compaction",
64
+ "prime_session_metadata_for_user_turn",
65
+ "stream_conversation_turn",
66
+ "stream_responses_conversation_turn",
67
+ ),
68
+ }
69
+
70
+ __all__ = list(_EXPORTS)
71
+
72
+
73
+ def __getattr__(name: str) -> Any:
74
+ if name == "runtime":
75
+ value = import_module("ksadk.conversations.runtime")
76
+ globals()[name] = value
77
+ return value
78
+ try:
79
+ module_name, attribute = _EXPORTS[name]
80
+ except KeyError:
81
+ raise AttributeError(f"module {__name__!r} has no attribute {name!r}") from None
82
+ value = getattr(import_module(module_name), attribute)
83
+ globals()[name] = value
84
+ return value
85
+
51
86
 
52
- __all__ = [
53
- "CANONICAL_EVENT_TYPES",
54
- "CompactionPlan",
55
- "PreparedConversationTurn",
56
- "append_conversation_event",
57
- "append_context_checkpoint_event",
58
- "append_reasoning_event",
59
- "append_run_checkpoint_event",
60
- "append_run_resume_event",
61
- "append_run_status_event",
62
- "attachment_from_part",
63
- "attachment_prompt_text",
64
- "build_chat_completions_payload",
65
- "build_compaction_sse_event",
66
- "build_history_from_events",
67
- "build_request_history",
68
- "build_responses_payload",
69
- "build_run_input",
70
- "canonical_event_type",
71
- "compact_conversation_history",
72
- "compact_attachment_for_session",
73
- "compacted_until_seq_id",
74
- "decode_inline_data",
75
- "display_content_from_parts",
76
- "ensure_conversation_session",
77
- "extract_event_text",
78
- "extract_text_from_event_parts",
79
- "extract_user_input_from_parts",
80
- "extract_responses_resume_input",
81
- "group_events_by_api_round",
82
- "invoke_conversation_once",
83
- "prime_session_metadata_for_user_turn",
84
- "normalize_kop_message_content",
85
- "normalize_kop_messages",
86
- "normalize_parts_content",
87
- "normalize_responses_input",
88
- "preview_auto_compaction",
89
- "project_model_messages",
90
- "resolve_attachment_storage_path",
91
- "resolve_uploads_dir",
92
- "stream_conversation_turn",
93
- "stream_responses_conversation_turn",
94
- "summarize_event_groups",
95
- ]
87
+ def __dir__() -> list[str]:
88
+ return sorted({*globals(), *__all__})
@@ -1,6 +1,7 @@
1
1
  from __future__ import annotations
2
2
 
3
3
  import asyncio
4
+ import importlib
4
5
  import json
5
6
  import logging
6
7
  import mimetypes
@@ -81,8 +82,7 @@ def _download_hosted_attachment(file_uri: str) -> AttachmentBytes | None:
81
82
  data=content.data,
82
83
  display_name=display_name,
83
84
  mime_type=(
84
- _content_type_without_params(content.content_type)
85
- or guess_mime_type(display_name)
85
+ _content_type_without_params(content.content_type) or guess_mime_type(display_name)
86
86
  ),
87
87
  )
88
88
 
@@ -222,7 +222,9 @@ class AttachmentStorageService:
222
222
  return AttachmentBytes(
223
223
  data=raw,
224
224
  display_name=str(metadata.get("display_name") or local_path.name),
225
- mime_type=str(metadata.get("mime_type") or guess_mime_type(local_path.name)),
225
+ mime_type=str(
226
+ metadata.get("mime_type") or guess_mime_type(local_path.name)
227
+ ),
226
228
  local_path=local_path,
227
229
  )
228
230
 
@@ -272,16 +274,17 @@ class AttachmentStorageService:
272
274
  async def _read_ks3_object(self, *, bucket: str, object_key: str) -> bytes:
273
275
  return await asyncio.to_thread(self._read_ks3_object_sync, bucket, object_key)
274
276
 
275
- def _put_ks3_object_sync(self, bucket: str, object_key: str, data: bytes, mime_type: str) -> None:
277
+ def _put_ks3_object_sync(
278
+ self, bucket: str, object_key: str, data: bytes, mime_type: str
279
+ ) -> None:
276
280
  if not bucket:
277
281
  raise ValueError("KS3 bucket is not available")
278
- from ks3.connection import Connection
279
-
280
282
  ak = os.getenv("KSYUN_ACCESS_KEY") or os.getenv("KS3_ACCESS_KEY")
281
283
  sk = os.getenv("KSYUN_SECRET_KEY") or os.getenv("KS3_SECRET_KEY")
282
284
  if not ak or not sk:
283
285
  raise ValueError("KS3 credentials are not configured")
284
- conn = Connection(ak, sk, host=self._endpoint())
286
+ connection_class = importlib.import_module("ks3.connection").Connection
287
+ conn = connection_class(ak, sk, host=self._endpoint())
285
288
  ks3_bucket = self._ensure_bucket(conn, bucket)
286
289
  key = ks3_bucket.new_key(object_key)
287
290
  key.set_contents_from_string(
@@ -292,17 +295,19 @@ class AttachmentStorageService:
292
295
  def _read_ks3_object_sync(self, bucket: str, object_key: str) -> bytes:
293
296
  if not bucket or not object_key:
294
297
  raise FileNotFoundError(object_key)
295
- from ks3.connection import Connection
296
-
297
298
  ak = os.getenv("KSYUN_ACCESS_KEY") or os.getenv("KS3_ACCESS_KEY")
298
299
  sk = os.getenv("KSYUN_SECRET_KEY") or os.getenv("KS3_SECRET_KEY")
299
300
  if not ak or not sk:
300
301
  raise ValueError("KS3 credentials are not configured")
301
- conn = Connection(ak, sk, host=self._endpoint())
302
+ connection_class = importlib.import_module("ks3.connection").Connection
303
+ conn = connection_class(ak, sk, host=self._endpoint())
302
304
  key = conn.get_bucket(bucket).get_key(object_key)
303
305
  if key is None:
304
306
  raise FileNotFoundError(object_key)
305
- return key.get_contents_as_string()
307
+ content = key.get_contents_as_string()
308
+ if not isinstance(content, bytes):
309
+ raise TypeError("KS3 object content must be bytes")
310
+ return content
306
311
 
307
312
  @staticmethod
308
313
  def _ensure_bucket(conn: Any, bucket_name: str):
@@ -1,8 +1,8 @@
1
1
  from __future__ import annotations
2
2
 
3
3
  import base64
4
+ import importlib
4
5
  import io
5
- import json
6
6
  import mimetypes
7
7
  import zipfile
8
8
  from pathlib import Path, PurePosixPath
@@ -168,7 +168,9 @@ def resolve_attachment_storage_path(file_uri: str) -> Optional[Path]:
168
168
  return None
169
169
 
170
170
 
171
- def read_attachment_bytes(storage_path: Optional[Path], *, size_limit: Optional[int] = None) -> Optional[bytes]:
171
+ def read_attachment_bytes(
172
+ storage_path: Optional[Path], *, size_limit: Optional[int] = None
173
+ ) -> Optional[bytes]:
172
174
  if storage_path is None or not storage_path.is_file():
173
175
  return None
174
176
 
@@ -272,12 +274,7 @@ def build_attachment_prompt_text(result: Mapping[str, Any]) -> str:
272
274
 
273
275
  size_bytes = result.get("size_bytes")
274
276
  if size_bytes is not None:
275
- return (
276
- "[上传文件: "
277
- f"{display_name}, "
278
- f"mime={mime_type}, "
279
- f"bytes={size_bytes}]"
280
- )
277
+ return "[上传文件: " f"{display_name}, " f"mime={mime_type}, " f"bytes={size_bytes}]"
281
278
 
282
279
  return f"[上传文件引用: {display_name}, mime={mime_type}]"
283
280
 
@@ -353,9 +350,11 @@ def _build_attachment_result_from_raw(
353
350
  if raw is None:
354
351
  result["status"] = "partial" if size_bytes else "failed"
355
352
  result["warnings"] = [
356
- "附件原始内容不可用,当前仅保留元数据摘要。"
357
- if size_bytes
358
- else "附件内容无法读取,请重新上传或检查文件句柄是否仍可访问。"
353
+ (
354
+ "附件原始内容不可用,当前仅保留元数据摘要。"
355
+ if size_bytes
356
+ else "附件内容无法读取,请重新上传或检查文件句柄是否仍可访问。"
357
+ )
359
358
  ]
360
359
  return result
361
360
 
@@ -420,7 +419,9 @@ def _extract_document_attachment(result: dict[str, Any], raw: bytes) -> dict[str
420
419
  if text:
421
420
  return _with_text(result, text=text, extraction_method=extractor[1])
422
421
  result["status"] = "failed"
423
- result["warnings"] = [f"{suffix.lstrip('.').upper()} 文档抽取失败,请检查文件是否损坏或重新导出后重试。"]
422
+ result["warnings"] = [
423
+ f"{suffix.lstrip('.').upper()} 文档抽取失败,请检查文件是否损坏或重新导出后重试。"
424
+ ]
424
425
  result["extraction_method"] = extractor[1]
425
426
  return result
426
427
 
@@ -435,7 +436,9 @@ def _extract_document_attachment(result: dict[str, Any], raw: bytes) -> dict[str
435
436
 
436
437
 
437
438
  def _extract_image_attachment(result: dict[str, Any], raw: bytes) -> dict[str, Any]:
438
- ocr = perform_ocr(raw, str(result.get("mime_type") or ""), str(result.get("display_name") or ""))
439
+ ocr = perform_ocr(
440
+ raw, str(result.get("mime_type") or ""), str(result.get("display_name") or "")
441
+ )
439
442
  result["image"] = {"ocr_engine": ocr.get("engine") or ""}
440
443
  if ocr.get("text"):
441
444
  return _with_text(result, text=ocr["text"], extraction_method="image_ocr")
@@ -524,9 +527,7 @@ def _extract_archive_attachment(result: dict[str, Any], raw: bytes) -> dict[str,
524
527
  }
525
528
  )
526
529
  if child_result.get("text"):
527
- extracted_chunks.append(
528
- f"[{normalized_path}]\n{child_result['text']}"
529
- )
530
+ extracted_chunks.append(f"[{normalized_path}]\n{child_result['text']}")
530
531
 
531
532
  result["archive"] = {
532
533
  "entries": entries,
@@ -578,9 +579,11 @@ def _load_attachment_bytes(attachment: Mapping[str, Any]) -> Optional[bytes]:
578
579
  return None
579
580
  return raw if len(raw) <= _MAX_PROCESS_BYTES else None
580
581
 
581
- raw = read_attachment_uri_bytes(attachment.get("file_uri"), size_limit=_MAX_PROCESS_BYTES)
582
- if raw is not None:
583
- return raw
582
+ stored_raw = read_attachment_uri_bytes(
583
+ attachment.get("file_uri"), size_limit=_MAX_PROCESS_BYTES
584
+ )
585
+ if stored_raw is not None:
586
+ return stored_raw
584
587
  return None
585
588
 
586
589
 
@@ -621,7 +624,11 @@ def _extract_xlsx_text(raw: bytes) -> str:
621
624
  shared_strings = []
622
625
 
623
626
  rows: list[str] = []
624
- for name in sorted(item for item in archive.namelist() if item.startswith("xl/worksheets/") and item.endswith(".xml")):
627
+ for name in sorted(
628
+ item
629
+ for item in archive.namelist()
630
+ if item.startswith("xl/worksheets/") and item.endswith(".xml")
631
+ ):
625
632
  try:
626
633
  root = ET.fromstring(archive.read(name))
627
634
  except Exception:
@@ -648,7 +655,9 @@ def _extract_xlsx_text(raw: bytes) -> str:
648
655
  if isinstance(child.tag, str) and child.tag.endswith("}t")
649
656
  )
650
657
  else:
651
- value_text = next((child.text or "" for child in cell if child.tag.endswith("}v")), "")
658
+ value_text = next(
659
+ (child.text or "" for child in cell if child.tag.endswith("}v")), ""
660
+ )
652
661
  if value_text.strip():
653
662
  values.append(value_text.strip())
654
663
  if values:
@@ -679,17 +688,19 @@ def _extract_xml_text_from_zip(raw: bytes, *, prefixes: tuple[str, ...]) -> str:
679
688
  texts: list[str] = []
680
689
  with archive:
681
690
  for name in sorted(
682
- item for item in archive.namelist() if item.endswith(".xml") and item.startswith(prefixes)
691
+ item
692
+ for item in archive.namelist()
693
+ if item.endswith(".xml") and item.startswith(prefixes)
683
694
  ):
684
695
  try:
685
696
  root = ET.fromstring(archive.read(name))
686
697
  except Exception:
687
698
  continue
688
- fragment = [
689
- node.text.strip()
690
- for node in root.iter()
691
- if isinstance(node.tag, str) and node.tag.endswith("}t") and (node.text or "").strip()
692
- ]
699
+ fragment = []
700
+ for node in root.iter():
701
+ text = node.text or ""
702
+ if isinstance(node.tag, str) and node.tag.endswith("}t") and text.strip():
703
+ fragment.append(text.strip())
693
704
  if fragment:
694
705
  texts.append("\n".join(fragment))
695
706
  return "\n\n".join(texts)
@@ -710,22 +721,18 @@ def _pdf_text_quality_is_poor(text: str) -> bool:
710
721
  normalized = "".join(ch for ch in text if not ch.isspace())
711
722
  if len(normalized) < 20:
712
723
  return True
713
- readable = sum(
714
- 1
715
- for ch in normalized
716
- if ch.isalnum() or ("\u4e00" <= ch <= "\u9fff")
717
- )
724
+ readable = sum(1 for ch in normalized if ch.isalnum() or ("\u4e00" <= ch <= "\u9fff"))
718
725
  return readable / max(len(normalized), 1) < 0.5
719
726
 
720
727
 
721
728
  def _perform_rapidocr(raw: bytes) -> str:
722
729
  try:
723
- from rapidocr_onnxruntime import RapidOCR
730
+ rapidocr_module = importlib.import_module("rapidocr_onnxruntime")
724
731
  except Exception:
725
732
  return ""
726
733
 
727
734
  try:
728
- engine = RapidOCR()
735
+ engine = rapidocr_module.RapidOCR()
729
736
  result, _ = engine(raw)
730
737
  except Exception:
731
738
  return ""
@@ -741,7 +748,8 @@ def _perform_rapidocr(raw: bytes) -> str:
741
748
  def _perform_tesseract_ocr(raw: bytes) -> str:
742
749
  try:
743
750
  from PIL import Image
744
- import pytesseract
751
+
752
+ pytesseract = importlib.import_module("pytesseract")
745
753
  except Exception:
746
754
  return ""
747
755
 
@@ -755,7 +763,7 @@ def _perform_tesseract_ocr(raw: bytes) -> str:
755
763
  text = pytesseract.image_to_string(image, lang=lang)
756
764
  except Exception:
757
765
  continue
758
- if text and text.strip():
766
+ if isinstance(text, str) and text.strip():
759
767
  return text.strip()
760
768
  return ""
761
769
 
@@ -87,9 +87,7 @@ def _bool_env(name: str, default: bool) -> bool:
87
87
  def candidate_tokens(groups: Sequence[Sequence[SessionEvent]]) -> int:
88
88
  """估算 candidate groups 的总 token(用于 pipeline 渐进停止判断)。"""
89
89
  return sum(
90
- estimate_text_tokens(extract_event_text(event))
91
- for group in groups
92
- for event in group
90
+ estimate_text_tokens(extract_event_text(event)) for group in groups for event in group
93
91
  )
94
92
 
95
93
 
@@ -108,12 +106,7 @@ def _tool_signature(event: SessionEvent) -> str | None:
108
106
  return None
109
107
  content = event.content or {}
110
108
  metadata = event.metadata or {}
111
- name = str(
112
- metadata.get("tool_name")
113
- or content.get("name")
114
- or content.get("tool_name")
115
- or ""
116
- )
109
+ name = str(metadata.get("tool_name") or content.get("name") or content.get("tool_name") or "")
117
110
  # 参数优先取 metadata.tool_args(真实 runtime),回退 content.arguments(合成/历史)。
118
111
  arguments = (
119
112
  metadata.get("tool_args")
@@ -264,8 +257,14 @@ def microcompact_cold_groups(
264
257
 
265
258
  # 尾部 N 组保留(它们可能还被模型需要),更早的组视为冷组。
266
259
  cold_rounds = _microcompact_cold_rounds()
267
- cold_groups = list(groups[:-cold_rounds]) if cold_rounds < len(groups) else []
268
- tail_groups = list(groups[-cold_rounds:]) if cold_rounds < len(groups) else list(groups)
260
+ cold_groups = (
261
+ [list(group) for group in groups[:-cold_rounds]] if cold_rounds < len(groups) else []
262
+ )
263
+ tail_groups = (
264
+ [list(group) for group in groups[-cold_rounds:]]
265
+ if cold_rounds < len(groups)
266
+ else [list(group) for group in groups]
267
+ )
269
268
 
270
269
  if not cold_groups:
271
270
  return MicrocompactResult(
@@ -323,7 +322,8 @@ def build_working_set_metadata(
323
322
  ) -> dict[str, Any]:
324
323
  """L5 working set 恢复(保守版):只记 metadata,不读文件内容。
325
324
 
326
- recent_files: 调用方从 workspace_state 取最近 N 个文件的 {path, mtime_ns, size_bytes, read_range}。
325
+ recent_files: 调用方从 workspace_state 取最近 N 个文件的
326
+ {path, mtime_ns, size_bytes, read_range}。
327
327
  active_tools: 调用方从 describe_agentengine_tools 取 enabled 工具名。
328
328
  下一轮 prompt 注入时只提示"这些文件最近读过",不注入内容(避免 token 膨胀)。
329
329
  """
@@ -92,10 +92,12 @@ def build_compaction_prompt_messages(
92
92
  不把 prompt 字符串散落到 runtime 编排里。
93
93
  """
94
94
 
95
- groups_text = "\n\n".join(
96
- _format_group(group, index=index + 1)
97
- for index, group in enumerate(groups_to_compact)
98
- ).strip() or "无可压缩内容"
95
+ groups_text = (
96
+ "\n\n".join(
97
+ _format_group(group, index=index + 1) for index, group in enumerate(groups_to_compact)
98
+ ).strip()
99
+ or "无可压缩内容"
100
+ )
99
101
  user_prompt = _SUMMARY_USER_PROMPT.format(
100
102
  model_metadata=json.dumps(dict(model_metadata or {}), ensure_ascii=False, indent=2),
101
103
  previous_summary=previous_summary.strip() or "无",
@@ -115,7 +117,9 @@ def extract_summary_text(response_text: str) -> str:
115
117
  if not raw:
116
118
  return ""
117
119
 
118
- summary_match = re.search(r"<summary>\s*(.*?)\s*</summary>", raw, flags=re.DOTALL | re.IGNORECASE)
120
+ summary_match = re.search(
121
+ r"<summary>\s*(.*?)\s*</summary>", raw, flags=re.DOTALL | re.IGNORECASE
122
+ )
119
123
  if summary_match:
120
124
  return summary_match.group(1).strip()
121
125