agentengine-sdk-python 0.8.0__py3-none-any.whl → 0.8.2__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 (494) hide show
  1. {agentengine_sdk_python-0.8.0.dist-info → agentengine_sdk_python-0.8.2.dist-info}/METADATA +43 -7
  2. agentengine_sdk_python-0.8.2.dist-info/RECORD +778 -0
  3. {agentengine_sdk_python-0.8.0.dist-info → agentengine_sdk_python-0.8.2.dist-info}/WHEEL +1 -1
  4. ksadk/a2a/__init__.py +2 -0
  5. ksadk/a2a/_space_client_events.py +381 -0
  6. ksadk/a2a/bootstrap.py +0 -2
  7. ksadk/a2a/card.py +6 -111
  8. ksadk/a2a/control_plane.py +239 -1
  9. ksadk/a2a/event_adapter.py +156 -64
  10. ksadk/a2a/executor.py +195 -172
  11. ksadk/a2a/routes.py +12 -5
  12. ksadk/a2a/server.py +1 -8
  13. ksadk/a2a/service_env.py +33 -0
  14. ksadk/a2a/space_client.py +43 -349
  15. ksadk/a2a_card.py +101 -0
  16. ksadk/a2ui/core.py +222 -53
  17. ksadk/agui/_agent_helpers.py +243 -0
  18. ksadk/agui/a2ui_projection.py +12 -5
  19. ksadk/agui/agent.py +474 -275
  20. ksadk/agui/config.py +11 -5
  21. ksadk/agui/routes.py +7 -15
  22. ksadk/api/client.py +530 -40
  23. ksadk/api/environment.py +27 -0
  24. ksadk/builders/code_builder.py +352 -53
  25. ksadk/builders/container_builder.py +71 -44
  26. ksadk/builders/framework_requirements.py +2 -1
  27. ksadk/builders/ks3_uploader.py +2 -2
  28. ksadk/builders/managed_runtime_builder.py +60 -28
  29. ksadk/cli/__init__.py +25 -0
  30. ksadk/cli/cmd_a2a.py +18 -31
  31. ksadk/cli/cmd_create.py +13 -26
  32. ksadk/cli/cmd_dashboard.py +15 -1
  33. ksadk/cli/cmd_deploy.py +28 -3
  34. ksadk/cli/cmd_eval.py +443 -0
  35. ksadk/cli/cmd_evalset.py +284 -0
  36. ksadk/cli/cmd_files.py +5 -1
  37. ksadk/cli/cmd_hermes.py +137 -163
  38. ksadk/cli/cmd_invoke.py +28 -38
  39. ksadk/cli/cmd_launch.py +12 -0
  40. ksadk/cli/cmd_managed_runtime.py +95 -0
  41. ksadk/cli/cmd_observe.py +85 -0
  42. ksadk/cli/cmd_openclaw.py +85 -479
  43. ksadk/cli/cmd_replay.py +28 -4
  44. ksadk/cli/cmd_run.py +29 -67
  45. ksadk/cli/cmd_studio.py +201 -0
  46. ksadk/cli/cmd_web.py +15 -6
  47. ksadk/cli/dry_run.py +2 -1
  48. ksadk/cli/env_options.py +83 -0
  49. ksadk/cli/global_options.py +3 -1
  50. ksadk/cli/hermes_env.py +151 -0
  51. ksadk/cli/invoke_payload.py +49 -0
  52. ksadk/cli/network_options.py +7 -5
  53. ksadk/cli/openclaw_env.py +458 -0
  54. ksadk/cli/runtime_bootstrap.py +51 -0
  55. ksadk/cli/ui.py +6 -0
  56. ksadk/cli/workflow_common.py +5 -5
  57. ksadk/codex/__init__.py +3 -3
  58. ksadk/codex/client.py +833 -49
  59. ksadk/codex/phase.py +1 -1
  60. ksadk/codex/runtime.py +720 -127
  61. ksadk/common/kop_client.py +232 -0
  62. ksadk/configs/__init__.py +1 -3
  63. ksadk/configs/env_registry.py +244 -45
  64. ksadk/configs/env_registry_pcm.py +181 -0
  65. ksadk/configs/env_var_spec.py +18 -0
  66. ksadk/configs/global_config.py +6 -1
  67. ksadk/configs/settings.py +5 -108
  68. ksadk/context_engine/__init__.py +98 -0
  69. ksadk/context_engine/assembler.py +176 -0
  70. ksadk/context_engine/baseline.py +419 -0
  71. ksadk/context_engine/cache_observability.py +228 -0
  72. ksadk/context_engine/capabilities.py +443 -0
  73. ksadk/context_engine/contributors.py +344 -0
  74. ksadk/context_engine/hosted_pipeline.py +417 -0
  75. ksadk/context_engine/models.py +117 -0
  76. ksadk/context_engine/planner.py +698 -0
  77. ksadk/context_engine/policies.py +319 -0
  78. ksadk/context_engine/projection.py +31 -0
  79. ksadk/context_engine/shadow_plan.py +266 -0
  80. ksadk/context_engine/tokenizer.py +164 -0
  81. ksadk/conversations/__init__.py +85 -94
  82. ksadk/conversations/context.py +126 -6
  83. ksadk/conversations/message_projection.py +292 -28
  84. ksadk/conversations/model_context.py +49 -3
  85. ksadk/conversations/runtime_compaction.py +207 -5
  86. ksadk/conversations/runtime_input.py +193 -3
  87. ksadk/conversations/runtime_invocation.py +81 -3
  88. ksadk/conversations/runtime_observability.py +157 -4
  89. ksadk/conversations/runtime_payloads.py +42 -0
  90. ksadk/conversations/runtime_preparation.py +280 -2
  91. ksadk/conversations/runtime_resume.py +71 -32
  92. ksadk/conversations/runtime_stream_events.py +94 -9
  93. ksadk/conversations/runtime_streaming.py +175 -22
  94. ksadk/conversations/semantic_summary.py +311 -1
  95. ksadk/conversations/session_lock.py +51 -0
  96. ksadk/deployment/env_forward.py +72 -0
  97. ksadk/deployment/managed_runtime.py +38 -0
  98. ksadk/deployment/manager.py +24 -8
  99. ksadk/deployment/providers/serverless.py +228 -92
  100. ksadk/evaluation/__init__.py +116 -0
  101. ksadk/evaluation/a2a_adapter.py +452 -0
  102. ksadk/evaluation/adapters.py +67 -0
  103. ksadk/evaluation/agent_eval_client.py +395 -0
  104. ksadk/evaluation/cloud_binding.py +80 -0
  105. ksadk/evaluation/cloud_converter.py +194 -0
  106. ksadk/evaluation/cloud_service.py +199 -0
  107. ksadk/evaluation/contracts.py +478 -0
  108. ksadk/evaluation/evalset.py +351 -0
  109. ksadk/evaluation/evaluators.py +627 -0
  110. ksadk/evaluation/evidence.py +258 -0
  111. ksadk/evaluation/executor.py +143 -0
  112. ksadk/evaluation/local_adapter.py +550 -0
  113. ksadk/evaluation/service_env.py +27 -0
  114. ksadk/evaluation/storage.py +68 -0
  115. ksadk/evaluation/studio_build_adapter.py +253 -0
  116. ksadk/evaluation/target.py +82 -0
  117. ksadk/events/__init__.py +13 -13
  118. ksadk/events/_v1_compat/__init__.py +1 -0
  119. ksadk/events/_v1_compat/models.py +299 -0
  120. ksadk/events/_v1_compat/parser.py +247 -0
  121. ksadk/events/_v1_compat/projection.py +753 -0
  122. ksadk/events/adapters/__init__.py +34 -0
  123. ksadk/events/adapters/_a2a_snapshot.py +622 -0
  124. ksadk/events/adapters/_a2a_support.py +275 -0
  125. ksadk/events/adapters/_codex_interactions.py +375 -0
  126. ksadk/events/adapters/_codex_items.py +801 -0
  127. ksadk/events/adapters/_codex_validators.py +311 -0
  128. ksadk/events/adapters/_langgraph_support.py +785 -0
  129. ksadk/events/adapters/a2a.py +841 -0
  130. ksadk/events/adapters/adk.py +503 -0
  131. ksadk/events/adapters/codex.py +717 -0
  132. ksadk/events/adapters/langgraph.py +745 -0
  133. ksadk/events/canonical.py +440 -0
  134. ksadk/events/canonical_replay.py +497 -0
  135. ksadk/events/canonical_store.py +468 -0
  136. ksadk/events/cold_recovery.py +257 -0
  137. ksadk/events/content.py +89 -0
  138. ksadk/events/identity.py +86 -0
  139. ksadk/events/pipeline.py +455 -0
  140. ksadk/events/projections.py +66 -0
  141. ksadk/events/reducer.py +661 -0
  142. ksadk/events/replay.py +3 -36
  143. ksadk/events/runtime_event.py +20 -256
  144. ksadk/events/session_event.py +324 -0
  145. ksadk/events/store.py +3 -316
  146. ksadk/events/v1_compat.py +41 -0
  147. ksadk/harness/__init__.py +3 -2
  148. ksadk/harness/app.py +114 -123
  149. ksadk/harness/config.py +1 -1
  150. ksadk/harness/runtime.py +467 -0
  151. ksadk/hermes_terminal.py +5 -0
  152. ksadk/identity/resolver.py +4 -3
  153. ksadk/interaction/__init__.py +28 -0
  154. ksadk/interaction/contracts.py +136 -0
  155. ksadk/interaction/ledger.py +189 -0
  156. ksadk/interaction/provider.py +122 -0
  157. ksadk/interaction/providers/__init__.py +52 -0
  158. ksadk/interaction/providers/adk.py +40 -0
  159. ksadk/interaction/providers/codex.py +94 -0
  160. ksadk/interaction/providers/langgraph.py +58 -0
  161. ksadk/kernel/__init__.py +117 -0
  162. ksadk/kernel/authorization.py +258 -0
  163. ksadk/kernel/bootstrap.py +1074 -0
  164. ksadk/kernel/contract_fingerprints.py +61 -0
  165. ksadk/kernel/contracts.py +362 -0
  166. ksadk/kernel/control.py +219 -0
  167. ksadk/kernel/errors.py +79 -0
  168. ksadk/kernel/ingress.py +1102 -0
  169. ksadk/kernel/mapping.py +111 -0
  170. ksadk/kernel/memory_store.py +1133 -0
  171. ksadk/kernel/postgres_store.py +1756 -0
  172. ksadk/kernel/recovery.py +452 -0
  173. ksadk/kernel/runtime_identity.py +103 -0
  174. ksadk/kernel/sql/001_agent_kernel.sql +120 -0
  175. ksadk/kernel/sqlite_store.py +1410 -0
  176. ksadk/kernel/state.py +145 -0
  177. ksadk/kernel/store.py +232 -0
  178. ksadk/kernel/worker.py +953 -0
  179. ksadk/knowledge_base/client.py +22 -4
  180. ksadk/knowledge_base/service.py +32 -5
  181. ksadk/managed_a2a_card.py +160 -0
  182. ksadk/managed_runtime.py +16 -9
  183. ksadk/memory/__init__.py +61 -0
  184. ksadk/memory/adk/backends/base_ltm_backend.py +96 -1
  185. ksadk/memory/adk/backends/http_ltm_backend.py +14 -5
  186. ksadk/memory/adk/backends/inmemory_ltm_backend.py +136 -3
  187. ksadk/memory/adk/backends/sdk_ltm_backend.py +394 -5
  188. ksadk/memory/adk/backends/sqlite_ltm_backend.py +95 -0
  189. ksadk/memory/adk/long_term_memory.py +3 -2
  190. ksadk/memory/coordinator.py +461 -0
  191. ksadk/memory/events.py +202 -0
  192. ksadk/memory/extraction.py +228 -0
  193. ksadk/memory/ltm_backend_factory.py +16 -3
  194. ksadk/memory/models.py +316 -0
  195. ksadk/memory/policy.py +215 -0
  196. ksadk/memory/provider.py +47 -0
  197. ksadk/memory/provider_adapter.py +159 -0
  198. ksadk/memory/provider_resolver.py +71 -0
  199. ksadk/memory/providers/__init__.py +5 -0
  200. ksadk/memory/providers/local_sqlite.py +490 -0
  201. ksadk/memory/resolved_policy.py +145 -0
  202. ksadk/memory/service.py +198 -8
  203. ksadk/memory/tool.py +4 -0
  204. ksadk/model_proxy/bootstrap.py +16 -9
  205. ksadk/model_proxy/config.py +22 -1
  206. ksadk/model_proxy/detect.py +202 -9
  207. ksadk/model_proxy/namespace.py +67 -15
  208. ksadk/model_proxy/server.py +168 -6
  209. ksadk/model_proxy/transform.py +105 -3
  210. ksadk/observability/__init__.py +25 -0
  211. ksadk/observability/session_log.py +420 -0
  212. ksadk/observability/trajectory.py +105 -0
  213. ksadk/prompts/__init__.py +71 -0
  214. ksadk/prompts/compiler.py +215 -0
  215. ksadk/prompts/models.py +82 -0
  216. ksadk/prompts/projection.py +89 -0
  217. ksadk/prompts/resolved.py +137 -0
  218. ksadk/prompts/sources.py +233 -0
  219. ksadk/runners/_langgraph_runner_streams.py +822 -0
  220. ksadk/runners/adk_runner.py +14 -31
  221. ksadk/runners/base_runner.py +44 -3
  222. ksadk/runners/factory.py +3 -3
  223. ksadk/runners/langgraph_runner.py +252 -433
  224. ksadk/runners/utils/__init__.py +0 -10
  225. ksadk/runners/utils/loader.py +16 -0
  226. ksadk/runtime/__init__.py +67 -41
  227. ksadk/runtime/_runner_adapter/__init__.py +1 -0
  228. ksadk/runtime/_runner_adapter/stream_mapping.py +788 -0
  229. ksadk/runtime/adapter.py +199 -16
  230. ksadk/runtime/conversation_execution.py +687 -0
  231. ksadk/runtime/executor.py +392 -0
  232. ksadk/runtime/factory.py +342 -0
  233. ksadk/runtime/framework_adapters.py +6 -12
  234. ksadk/runtime/hosted_finalizer.py +268 -0
  235. ksadk/runtime/launch.py +61 -0
  236. ksadk/runtime/preprocessing.py +49 -14
  237. ksadk/runtime/runner_adapter.py +330 -391
  238. ksadk/runtime/runner_loading.py +36 -0
  239. ksadk/runtime/usage.py +33 -0
  240. ksadk/sandbox/backends/e2b.py +36 -3
  241. ksadk/server/__init__.py +39 -4
  242. ksadk/server/app.py +18 -492
  243. ksadk/server/composition.py +36 -2
  244. ksadk/server/factory.py +210 -149
  245. ksadk/server/routes/common.py +15 -46
  246. ksadk/server/routes/control.py +13 -9
  247. ksadk/server/routes/kernel_ingress.py +258 -0
  248. ksadk/server/routes/misc.py +10 -33
  249. ksadk/server/routes/models.py +14 -6
  250. ksadk/server/routes/openai_compat.py +129 -27
  251. ksadk/server/routes/projection.py +84 -16
  252. ksadk/server/routes/run.py +347 -460
  253. ksadk/server/routes/sessions.py +37 -40
  254. ksadk/server/routes/streaming.py +52 -7
  255. ksadk/server/routes/workspace.py +54 -21
  256. ksadk/server/static/assets/{ArtifactsPanel-Cjnqt-8W.js → ArtifactsPanel-DSU1sWD_.js} +1 -1
  257. ksadk/server/static/assets/{CodeBlock-BqyqZfuB.js → CodeBlock-DOH6MVcn.js} +4 -4
  258. ksadk/server/static/assets/{MathMessageMarkdown-BpH7jiFM.js → MathMessageMarkdown-BL8my1R2.js} +4 -4
  259. ksadk/server/static/assets/MathMessageMarkdown-BorAY7qD.css +1 -0
  260. ksadk/server/static/assets/MermaidBlock-Dz4IP-Tx.js +312 -0
  261. ksadk/server/static/assets/NativeTerminalPanel-DUrK0JpZ.js +1 -0
  262. ksadk/server/static/assets/abnfDiagram-VCTEODGH-g20pFzNV.js +1 -0
  263. ksadk/server/static/assets/arc-C4FzinUA.js +1 -0
  264. ksadk/server/static/assets/architecture-7GRP2DOG-DjKratdf.js +1 -0
  265. ksadk/server/static/assets/architectureDiagram-5GKGNRK7-DpIqL5h4.js +36 -0
  266. ksadk/server/static/assets/blockDiagram-NRAW4CY4-BjkljTNz.js +129 -0
  267. ksadk/server/static/assets/c4Diagram-UCG6FXSJ-Dk_ieq2X.js +38 -0
  268. ksadk/server/static/assets/channel-4cQHKtx1.js +1 -0
  269. ksadk/server/static/assets/chunk-2Q5K7J3B-DmgWkESh.js +1 -0
  270. ksadk/server/static/assets/{chunk-FMBD7UC4-BGhvzDYt.js → chunk-5VM5RSS4-BVHAchFb.js} +1 -1
  271. ksadk/server/static/assets/{chunk-ND2GUHAM-D98vPd-E.js → chunk-F27PBJKO-C-ipQzuS.js} +1 -1
  272. ksadk/server/static/assets/chunk-G27WJ6UU-C2EyJbIK.js +231 -0
  273. ksadk/server/static/assets/{chunk-4BX2VUAB-CsWIQRhc.js → chunk-JWPE2WC7-vYvVJb_M.js} +1 -1
  274. ksadk/server/static/assets/chunk-LCL6LL3I-BcI6ysPT.js +206 -0
  275. ksadk/server/static/assets/chunk-POPQ4Y6H-C030x_Z1.js +1 -0
  276. ksadk/server/static/assets/chunk-RHFEMEQ7-yyGpsz4n.js +168 -0
  277. ksadk/server/static/assets/chunk-SVP7TREG-BLTlmMU7.js +88 -0
  278. ksadk/server/static/assets/chunk-XXDRQBXY-C_32ArgP.js +1 -0
  279. ksadk/server/static/assets/classDiagram-DTDB5LWJ-DLFd9Xi0.js +1 -0
  280. ksadk/server/static/assets/classDiagram-v2-JRS7N3AN-DLFd9Xi0.js +1 -0
  281. ksadk/server/static/assets/{cose-bilkent-S5V4N54A-CX3yotHq.js → cose-bilkent-JH36ORCC-9YQYwdl0.js} +1 -1
  282. ksadk/server/static/assets/cynefin-OW5HDTMX-DjEM48Qp.js +1 -0
  283. ksadk/server/static/assets/cynefinDiagram-5FMLGOSQ-ErLF5N13.js +62 -0
  284. ksadk/server/static/assets/cytoscape.esm-CyCl8rPi.js +321 -0
  285. ksadk/server/static/assets/dagre-3AP2YEHR-DFiQF-6f.js +4 -0
  286. ksadk/server/static/assets/dagre-BuhGnRI1.js +1 -0
  287. ksadk/server/static/assets/diagram-S7CK7UJ4-Bt1v8-GC.js +30 -0
  288. ksadk/server/static/assets/diagram-UQ7AKVKN-DSCxJdBK.js +41 -0
  289. ksadk/server/static/assets/diagram-VSXAHHWV-DHfYwp_9.js +3 -0
  290. ksadk/server/static/assets/diagram-VX7I27RA-DdzD-4Le.js +24 -0
  291. ksadk/server/static/assets/diagram-Z3DM3KII-Du-nAJ9F.js +24 -0
  292. ksadk/server/static/assets/{dist-D82mtD2s.js → dist-8hqcx0sU.js} +1 -1
  293. ksadk/server/static/assets/dist-B7seoj3d.js +1 -0
  294. ksadk/server/static/assets/{dist-DHn6nBzr.js → dist-BE7bu-DL.js} +1 -1
  295. ksadk/server/static/assets/{dist-eoW6tZXA.js → dist-BVDffZ0U.js} +1 -1
  296. ksadk/server/static/assets/{dist-C2xjE7cO.js → dist-BX8z72IC.js} +1 -1
  297. ksadk/server/static/assets/{dist-CgF3fj15.js → dist-Bf2M8m3N.js} +1 -1
  298. ksadk/server/static/assets/{dist-Bs-jQcRX.js → dist-BjU6y-A2.js} +1 -1
  299. ksadk/server/static/assets/{dist-Djgl2wVZ.js → dist-BytlxIDT.js} +1 -1
  300. ksadk/server/static/assets/{dist-CVQRZjPu.js → dist-CSh_DE14.js} +1 -1
  301. ksadk/server/static/assets/{dist-6CVKuTAe.js → dist-CXYYBw3_.js} +1 -1
  302. ksadk/server/static/assets/{dist-DlzCRy0S.js → dist-C_wsv-Qd.js} +1 -1
  303. ksadk/server/static/assets/{dist-DF06ORQo.js → dist-ClxGviKw.js} +1 -1
  304. ksadk/server/static/assets/{dist-Cf23NY4L.js → dist-CttYUqzS.js} +1 -1
  305. ksadk/server/static/assets/{dist-ivOya1LD.js → dist-DNp6rLRA.js} +1 -1
  306. ksadk/server/static/assets/{dist-BibcG1V9.js → dist-DUX-id_F.js} +1 -1
  307. ksadk/server/static/assets/{dist-BUHRxvDG.js → dist-DmldrHd_.js} +1 -1
  308. ksadk/server/static/assets/{dist-BZ9n9AjO.js → dist-DnfXs8Vn.js} +2 -2
  309. ksadk/server/static/assets/{dist-DqNnNFrw.js → dist-Dq9gLD7L.js} +1 -1
  310. ksadk/server/static/assets/{dist-CGcp2ex8.js → dist-W-TIVntx.js} +1 -1
  311. ksadk/server/static/assets/{dist-Cwt7koer.js → dist-dDdADKFA.js} +1 -1
  312. ksadk/server/static/assets/{dist-C7-3jInC.js → dist-dydu68Fl.js} +1 -1
  313. ksadk/server/static/assets/{dist-C99THtIA.js → dist-ngtN0DJB.js} +1 -1
  314. ksadk/server/static/assets/ebnfDiagram-PWID7BFC-Da9C9NO1.js +1 -0
  315. ksadk/server/static/assets/erDiagram-SSCWMZ5O-EAGqqR79.js +99 -0
  316. ksadk/server/static/assets/eventmodeling-NTZA5JFV-CMgMaJrC.js +1 -0
  317. ksadk/server/static/assets/flowDiagram-A5DVABFB-BBKL0x3P.js +1 -0
  318. ksadk/server/static/assets/ganttDiagram-EL5Y4UJY-DqJsKb59.js +292 -0
  319. ksadk/server/static/assets/gitGraph-4MIJSDKK-Dw63mrhw.js +1 -0
  320. ksadk/server/static/assets/gitGraphDiagram-WWUBYQGX-B6g4dtDi.js +106 -0
  321. ksadk/server/static/assets/index-8ipRcQ-M.js +240 -0
  322. ksadk/server/static/assets/index-ByFCqjlh.css +2 -0
  323. ksadk/server/static/assets/info-A6RAGUB7-B6iAblII.js +1 -0
  324. ksadk/server/static/assets/infoDiagram-RXCK75RN-Djm_nbd5.js +2 -0
  325. ksadk/server/static/assets/{ishikawaDiagram-YF4QCWOH-DLOHGvWw.js → ishikawaDiagram-5VMMS53U-DWya9SG2.js} +6 -6
  326. ksadk/server/static/assets/{journeyDiagram-JHISSGLW-BIzKeejT.js → journeyDiagram-EYS64GPL-DutxhSNI.js} +6 -6
  327. ksadk/server/static/assets/{kanban-definition-UN3LZRKU-BWHoFSw2.js → kanban-definition-3QL26DDD-DJdOF8Fm.js} +10 -10
  328. ksadk/server/static/assets/katex-vFWytM5c.js +257 -0
  329. ksadk/server/static/assets/{linear-CvMBw9cA.js → linear-BHjG8b-J.js} +1 -1
  330. ksadk/server/static/assets/mermaid-parser.core-KGSy4jWT.js +166 -0
  331. ksadk/server/static/assets/{mindmap-definition-RKZ34NQL-CSAQxEAe.js → mindmap-definition-FBJOCRG2-9-HC88D4.js} +29 -29
  332. ksadk/server/static/assets/packet-AYTQ26CC-BOYAipuq.js +1 -0
  333. ksadk/server/static/assets/pegDiagram-XKGWAZYB-DrEZd4fD.js +1 -0
  334. ksadk/server/static/assets/pie-WAS4IAKB-Ctq0Kbku.js +1 -0
  335. ksadk/server/static/assets/pieDiagram-E7YTZNPT-DpjqOFFp.js +39 -0
  336. ksadk/server/static/assets/{quadrantDiagram-W4KKPZXB-CxIR4JXI.js → quadrantDiagram-AXDQQJYC-BiNhgOXX.js} +6 -6
  337. ksadk/server/static/assets/radar-RG4KPBEZ-DN0-ul_0.js +1 -0
  338. ksadk/server/static/assets/railroad-74A4TZTK-C6cC_to0.js +1 -0
  339. ksadk/server/static/assets/railroad-abnf-HS5TGJTU-BimjIuRc.js +1 -0
  340. ksadk/server/static/assets/railroad-ebnf-LZEXJU2U-CvY65ABq.js +1 -0
  341. ksadk/server/static/assets/railroad-peg-WCYAUIDC-D72Iq_Tv.js +1 -0
  342. ksadk/server/static/assets/railroadDiagram-O6MQD6OU-_Y3Ojg6G.js +1 -0
  343. ksadk/server/static/assets/requirementDiagram-EFPCY7ZU-DeCFdg9K.js +84 -0
  344. ksadk/server/static/assets/{sankeyDiagram-5OEKKPKP-DpGa6EAV.js → sankeyDiagram-P5KCCOFB-CPH75rhw.js} +7 -7
  345. ksadk/server/static/assets/{sequenceDiagram-3UESZ5HK-NTKNGGe5.js → sequenceDiagram-WJ2MYXX4-OEpQQdr4.js} +10 -10
  346. ksadk/server/static/assets/sizeCapture-X5ZJPWSS-heUErzhI.js +1 -0
  347. ksadk/server/static/assets/stateDiagram-HBIQ2CUA-DvA3jSMB.js +1 -0
  348. ksadk/server/static/assets/stateDiagram-v2-4QOOHH4V-BgQY03nz.js +1 -0
  349. ksadk/server/static/assets/swimlanes-XN3QIQJK-CR-dfN_t.js +1 -0
  350. ksadk/server/static/assets/swimlanesDiagram-VK2B7HYN-DLVw3q5Q.js +8 -0
  351. ksadk/server/static/assets/{timeline-definition-PNZ67QCA-jqoYs3jQ.js → timeline-definition-24CTP7MA-DAVJf1TX.js} +7 -7
  352. ksadk/server/static/assets/treeView-Q6P3EWNA-BMpO0wsB.js +1 -0
  353. ksadk/server/static/assets/treemap-WGGIJYW6-Et0aqzU3.js +1 -0
  354. ksadk/server/static/assets/vennDiagram-4TSXK5OY-DwM8eDkh.js +34 -0
  355. ksadk/server/static/assets/wardley-WFR3VGLG-CbY0mhpl.js +1 -0
  356. ksadk/server/static/assets/wardleyDiagram-VM6X3IG4-DZL-Zz2t.js +78 -0
  357. ksadk/server/static/assets/xychartDiagram-S5SC5T6Z-Dy6Yh_hu.js +7 -0
  358. ksadk/server/static/index.html +2 -2
  359. ksadk/sessions/__init__.py +26 -9
  360. ksadk/sessions/_local_service_sync.py +688 -0
  361. ksadk/sessions/_local_tables.py +21 -0
  362. ksadk/sessions/_postgres_schema.py +305 -0
  363. ksadk/sessions/_postgres_tables.py +15 -0
  364. ksadk/sessions/base.py +80 -1
  365. ksadk/sessions/in_memory.py +53 -2
  366. ksadk/sessions/local_service.py +63 -604
  367. ksadk/sessions/postgres_service.py +58 -148
  368. ksadk/sessions/resilient.py +35 -1
  369. ksadk/skills/runtime/backends/e2b.py +1 -1
  370. ksadk/skills/service_client.py +13 -3
  371. ksadk/studio/__init__.py +5 -0
  372. ksadk/studio/agent_avatar_assets.py +120 -0
  373. ksadk/studio/agent_lifecycle.py +51 -0
  374. ksadk/studio/api.py +1598 -0
  375. ksadk/studio/api_catalog_routes.py +324 -0
  376. ksadk/studio/api_contracts.py +286 -0
  377. ksadk/studio/api_helpers.py +132 -0
  378. ksadk/studio/api_memory_routes.py +82 -0
  379. ksadk/studio/authoring.py +749 -0
  380. ksadk/studio/authoring_coordinator.py +1017 -0
  381. ksadk/studio/builder.py +397 -0
  382. ksadk/studio/capabilities.py +368 -0
  383. ksadk/studio/cloud.py +2099 -0
  384. ksadk/studio/codex_agent_service.py +694 -0
  385. ksadk/studio/codex_authoring.py +469 -0
  386. ksadk/studio/codex_builder.py +437 -0
  387. ksadk/studio/codex_manifest.py +307 -0
  388. ksadk/studio/codex_run.py +395 -0
  389. ksadk/studio/compiler.py +190 -0
  390. ksadk/studio/contracts.py +755 -0
  391. ksadk/studio/errors.py +47 -0
  392. ksadk/studio/event_store.py +214 -0
  393. ksadk/studio/framework_run.py +342 -0
  394. ksadk/studio/hosted_kernel.py +317 -0
  395. ksadk/studio/identifiers.py +33 -0
  396. ksadk/studio/manifest_resolver.py +131 -0
  397. ksadk/studio/mcp_runtime.py +229 -0
  398. ksadk/studio/model_client.py +629 -0
  399. ksadk/studio/model_profile_service.py +214 -0
  400. ksadk/studio/operations.py +275 -0
  401. ksadk/studio/otel_trace.py +1060 -0
  402. ksadk/studio/pagination.py +182 -0
  403. ksadk/studio/pcm_memory.py +85 -0
  404. ksadk/studio/python_tool_inspection.py +183 -0
  405. ksadk/studio/repository.py +327 -0
  406. ksadk/studio/resource_catalog.py +1260 -0
  407. ksadk/studio/run_service.py +1133 -0
  408. ksadk/studio/runtime_catalog.py +74 -0
  409. ksadk/studio/runtime_source.py +365 -0
  410. ksadk/studio/service.py +2249 -0
  411. ksadk/studio/shared_web.py +1004 -0
  412. ksadk/studio/skill_discovery.py +628 -0
  413. ksadk/studio/static/assets/PrismRenderer-IYN-ffww.js +3 -0
  414. ksadk/studio/static/assets/index-BLpcdrgW.css +1 -0
  415. ksadk/studio/static/assets/index-CYekR2Xv.js +260 -0
  416. ksadk/studio/static/assets/react-vendor-BNmTiJ-I.js +9 -0
  417. ksadk/studio/static/assets/rolldown-runtime-hePW80VL.js +1 -0
  418. ksadk/studio/static/index.html +15 -0
  419. ksadk/studio/templates.py +722 -0
  420. ksadk/studio/validator.py +265 -0
  421. ksadk/studio/workspace.py +135 -0
  422. ksadk/tools/gateway.py +9 -0
  423. ksadk/toolsets/__init__.py +27 -1
  424. ksadk/toolsets/a2a.py +426 -0
  425. ksadk/tracing/__init__.py +19 -21
  426. ksadk/tracing/setup.py +317 -403
  427. ksadk/tracing/span_utils.py +0 -44
  428. ksadk/version.py +1 -1
  429. ksadk_runtime_common/memory_backend/registry.py +56 -56
  430. ksadk_runtime_common/schemas/runtime_event_v1.json +37 -0
  431. ksadk_runtime_common/schemas/runtime_event_v2.json +271 -0
  432. ksadk_runtime_common/workspace_files/router.py +8 -2
  433. agentengine_sdk_python-0.8.0.dist-info/RECORD +0 -578
  434. ksadk/a2a/card_builder.py +0 -64
  435. ksadk/a2a/client.py +0 -309
  436. ksadk/events/parser.py +0 -191
  437. ksadk/harness/runner.py +0 -211
  438. ksadk/runners/codex_runner.py +0 -132
  439. ksadk/runners/utils/langfuse.py +0 -230
  440. ksadk/server/static/assets/MathMessageMarkdown-DeYh8QPr.css +0 -1
  441. ksadk/server/static/assets/MermaidBlock-DWuxETaJ.js +0 -303
  442. ksadk/server/static/assets/NativeTerminalPanel-MDTopWMO.js +0 -1
  443. ksadk/server/static/assets/arc-CFKwSk_B.js +0 -1
  444. ksadk/server/static/assets/architecture-7EHR7CIX-CynqOWjZ.js +0 -1
  445. ksadk/server/static/assets/architectureDiagram-3BPJPVTR-Dej8jX8c.js +0 -36
  446. ksadk/server/static/assets/blockDiagram-GPEHLZMM-1F64jqvy.js +0 -132
  447. ksadk/server/static/assets/c4Diagram-AAUBKEIU-9q7AUAKb.js +0 -10
  448. ksadk/server/static/assets/channel-iUGv2N24.js +0 -1
  449. ksadk/server/static/assets/chunk-2J33WTMH-6qgwJm7Q.js +0 -1
  450. ksadk/server/static/assets/chunk-55IACEB6-BK8paA20.js +0 -1
  451. ksadk/server/static/assets/chunk-727SXJPM-B-JEhy7h.js +0 -206
  452. ksadk/server/static/assets/chunk-AQP2D5EJ-DYBvMHAa.js +0 -231
  453. ksadk/server/static/assets/chunk-QZHKN3VN-YQIEXeF6.js +0 -1
  454. ksadk/server/static/assets/classDiagram-4FO5ZUOK-CDAUuoXK.js +0 -1
  455. ksadk/server/static/assets/classDiagram-v2-Q7XG4LA2-CDAUuoXK.js +0 -1
  456. ksadk/server/static/assets/cytoscape.esm-DelgaX4f.js +0 -321
  457. ksadk/server/static/assets/dagre-BM42HDAG-C7TguAWo.js +0 -4
  458. ksadk/server/static/assets/dagre-Bx709z4p.js +0 -1
  459. ksadk/server/static/assets/diagram-2AECGRRQ-Dd17_kws.js +0 -43
  460. ksadk/server/static/assets/diagram-5GNKFQAL-DVIClIil.js +0 -10
  461. ksadk/server/static/assets/diagram-KO2AKTUF-Df_3gYQa.js +0 -3
  462. ksadk/server/static/assets/diagram-LMA3HP47-BhLk6ZtA.js +0 -24
  463. ksadk/server/static/assets/diagram-OG6HWLK6-D4GNGvuu.js +0 -24
  464. ksadk/server/static/assets/dist-DyvYLMW9.js +0 -1
  465. ksadk/server/static/assets/erDiagram-TEJ5UH35-CnfRcY2M.js +0 -85
  466. ksadk/server/static/assets/eventmodeling-FCH6USID-ChYO-ijM.js +0 -1
  467. ksadk/server/static/assets/flowDiagram-I6XJVG4X-DGaJjGNJ.js +0 -162
  468. ksadk/server/static/assets/ganttDiagram-6RSMTGT7-DpCoB2g9.js +0 -292
  469. ksadk/server/static/assets/gitGraph-WXDBUCRP-BN_0Fk-j.js +0 -1
  470. ksadk/server/static/assets/gitGraphDiagram-PVQCEYII-9IKVFBVT.js +0 -106
  471. ksadk/server/static/assets/graphlib-B8gBHxth.js +0 -1
  472. ksadk/server/static/assets/index-QSwCHuB8.js +0 -177
  473. ksadk/server/static/assets/index-jOPmTOZH.css +0 -2
  474. ksadk/server/static/assets/info-J43DQDTF-Cp6o3vId.js +0 -1
  475. ksadk/server/static/assets/infoDiagram-5YYISTIA-CYIIsb8y.js +0 -2
  476. ksadk/server/static/assets/katex-DATssjp1.js +0 -265
  477. ksadk/server/static/assets/mermaid-parser.core-mGAcEwcq.js +0 -161
  478. ksadk/server/static/assets/packet-YPE3B663-wQzct3cT.js +0 -1
  479. ksadk/server/static/assets/pie-LRSECV5Y-BgTQiv-9.js +0 -1
  480. ksadk/server/static/assets/pieDiagram-4H26LBE5-By-ra07M.js +0 -30
  481. ksadk/server/static/assets/radar-GUYGQ44K-BIq5fXsn.js +0 -1
  482. ksadk/server/static/assets/requirementDiagram-4Y6WPE33-DpW90iu3.js +0 -84
  483. ksadk/server/static/assets/stateDiagram-AJRCARHV-DGpd9yFG.js +0 -1
  484. ksadk/server/static/assets/stateDiagram-v2-BHNVJYJU-B3o579IQ.js +0 -1
  485. ksadk/server/static/assets/treeView-BLDUP644-Dqi-E0EM.js +0 -1
  486. ksadk/server/static/assets/treemap-LRROVOQU-ClQP9CJ9.js +0 -1
  487. ksadk/server/static/assets/vennDiagram-CIIHVFJN-l3Z7-wbP.js +0 -34
  488. ksadk/server/static/assets/wardley-L42UT6IY-8XLvnNIs.js +0 -1
  489. ksadk/server/static/assets/wardleyDiagram-YWT4CUSO-BR54GPmr.js +0 -78
  490. ksadk/server/static/assets/xychartDiagram-2RQKCTM6-SkiH8GsK.js +0 -7
  491. ksadk/tracing/exporters/langfuse_exporter.py +0 -460
  492. {agentengine_sdk_python-0.8.0.dist-info → agentengine_sdk_python-0.8.2.dist-info}/entry_points.txt +0 -0
  493. {agentengine_sdk_python-0.8.0.dist-info → agentengine_sdk_python-0.8.2.dist-info}/licenses/LICENSE +0 -0
  494. {agentengine_sdk_python-0.8.0.dist-info → agentengine_sdk_python-0.8.2.dist-info}/top_level.txt +0 -0
ksadk/cli/cmd_deploy.py CHANGED
@@ -80,6 +80,14 @@ console = get_console()
80
80
  help="部署目标 (default: serverless)",
81
81
  )
82
82
  @click.option("--name", "-n", help="部署名称")
83
+ @click.option(
84
+ "--agent-id",
85
+ default=None,
86
+ help=(
87
+ "指定要更新的已有 Agent ID;当前凭证有权限时会自动回填 "
88
+ ".agentengine.state 并走热更新(用于本地状态丢失后重新关联)"
89
+ ),
90
+ )
83
91
  @click.option(
84
92
  "--region",
85
93
  "-r",
@@ -136,6 +144,7 @@ def deploy(
136
144
  agent_dir: str,
137
145
  target: str,
138
146
  name: str,
147
+ agent_id: str | None,
139
148
  region: str,
140
149
  account_id: str,
141
150
  artifact_type: str,
@@ -240,6 +249,7 @@ def deploy(
240
249
  env_file=env_file,
241
250
  repackage=repackage,
242
251
  dry_run_context=dry_run_context,
252
+ agent_id=agent_id,
243
253
  ),
244
254
  dry_run=dry_run,
245
255
  on_dry_run=render_deploy_dry_run,
@@ -315,9 +325,10 @@ async def _deploy_async(
315
325
  dry_run_context: dict[str, object] | None = None,
316
326
  *,
317
327
  repackage: bool = False,
328
+ agent_id: str | None = None,
318
329
  ):
319
330
  """异步部署流程"""
320
- from ksadk.deployment import DeploymentManager, DeployTarget
331
+ from ksadk.deployment import DeploymentManager, DeployStatus, DeployTarget
321
332
  from ksadk.detection import FrameworkDetector
322
333
 
323
334
  agent_path = Path(agent_dir).resolve()
@@ -431,6 +442,7 @@ async def _deploy_async(
431
442
  "env_vars": explicit_env_vars,
432
443
  "runtime_name": resolved_runtime.name if resolved_runtime else "",
433
444
  "runtime_version": resolved_runtime.version if resolved_runtime else "",
445
+ "agent_id": agent_id,
434
446
  },
435
447
  )
436
448
 
@@ -543,7 +555,12 @@ async def _deploy_async(
543
555
  print_info("Dry Run: 仅生成本地构建计划,不执行真实构建/上传")
544
556
 
545
557
  if resolved_artifact_plan.will_build:
546
- print_rule(f"Step 2/{total_steps} 构建与上传")
558
+ build_step = (
559
+ "构建运行时声明"
560
+ if effective_artifact_type == "ManagedRuntime"
561
+ else "构建与上传"
562
+ )
563
+ print_rule(f"Step 2/{total_steps} {build_step}")
547
564
  try:
548
565
  with capture_standard_output():
549
566
  package_info = await provider.build(package_info, deploy_target)
@@ -589,7 +606,15 @@ async def _deploy_async(
589
606
  result = await provider.deploy(package_info, deploy_target)
590
607
 
591
608
  if result.is_success():
592
- print_success("部署成功")
609
+ # ``DEPLOYING`` only acknowledges that the control plane accepted
610
+ # the request. Runtime creation and the asynchronous
611
+ # CreateAgent callback may still be pending, so presenting it as a
612
+ # completed deployment is misleading (and hides a broken
613
+ # callback/data-plane handoff).
614
+ if result.status == DeployStatus.RUNNING:
615
+ print_success("部署成功")
616
+ else:
617
+ print_info("部署请求已提交,等待实例就绪")
593
618
  print_rule()
594
619
  print_kv("名称", result.agent_name or deploy_name)
595
620
  if result.agent_id:
ksadk/cli/cmd_eval.py ADDED
@@ -0,0 +1,443 @@
1
+ """agentengine eval - stable CLI shell for local evaluation."""
2
+
3
+ from __future__ import annotations
4
+
5
+ import asyncio
6
+ from pathlib import Path
7
+
8
+ import click
9
+ from rich.markup import escape
10
+ from rich.padding import Padding
11
+ from rich.table import Table
12
+
13
+ from ksadk.cli.ui import (
14
+ configure_ui_runtime,
15
+ emit_json,
16
+ get_console,
17
+ is_json_output,
18
+ new_table,
19
+ print_info,
20
+ print_kv,
21
+ print_success,
22
+ print_title,
23
+ status_rich_style,
24
+ )
25
+ from ksadk.evaluation import (
26
+ EvaluationConfig,
27
+ EvaluationExecutionError,
28
+ EvaluationNotImplementedError,
29
+ EvaluationRequest,
30
+ TargetRef,
31
+ execute_evaluation,
32
+ load_evalset,
33
+ )
34
+ from ksadk.evaluation.agent_eval_client import (
35
+ AgentEvalCloudClientError,
36
+ AgentEvalCloudDatasetClient,
37
+ )
38
+ from ksadk.evaluation.cloud_service import CloudEvalSetPreviewError, CloudEvalSetService
39
+ from ksadk.evaluation.contracts import (
40
+ DataPolicy,
41
+ EvalRunReport,
42
+ EvalRunStatus,
43
+ EvalRunSummary,
44
+ MetricResult,
45
+ MetricStatus,
46
+ TargetKind,
47
+ TargetRunStatus,
48
+ )
49
+ from ksadk.evaluation.evalset import EvalSetParseError
50
+ from ksadk.evaluation.evaluators import SUPPORTED_EVALUATORS, resolve_evaluator_plan
51
+ from ksadk.evaluation.storage import EvaluationStorage
52
+
53
+ _DATA_POLICIES = tuple(policy.value for policy in DataPolicy)
54
+
55
+
56
+ class EvaluationCliError(click.ClickException):
57
+ exit_code = 2
58
+
59
+
60
+ @click.command(context_settings=dict(help_option_names=["-h", "--help"]))
61
+ @click.option(
62
+ "--evalset-file",
63
+ required=False,
64
+ type=click.Path(exists=True, dir_okay=False, path_type=Path),
65
+ help="本地 EvalSet YAML/JSON 文件",
66
+ )
67
+ @click.option("--dataset-id", type=str, help="云端 Dataset ID;必须配合固定版本使用")
68
+ @click.option("--dataset-version", type=click.IntRange(1), help="云端 Dataset immutable version")
69
+ @click.option("--dataset-project-id", type=str, help="云端 Dataset 所属项目 ID")
70
+ @click.option(
71
+ "--agent-dir",
72
+ type=click.Path(exists=True, file_okay=False, path_type=Path),
73
+ help="本地 Agent 项目目录",
74
+ )
75
+ @click.option("--a2a-url", type=str, help="远端 A2A Agent Card URL")
76
+ @click.option(
77
+ "--codex-worktree",
78
+ type=click.Path(exists=True, file_okay=False, path_type=Path),
79
+ help="Codex 评测使用的 Git worktree",
80
+ )
81
+ @click.option("--entrypoint", type=str, help="本地 Agent 入口;缺省时由 target adapter 检测")
82
+ @click.option("--credential-ref", type=str, help="A2A 鉴权引用;不会写入凭据值")
83
+ @click.option("--codex-profile", type=str, help="Codex 受信评测 profile 名称")
84
+ @click.option(
85
+ "--evaluator",
86
+ "evaluators",
87
+ multiple=True,
88
+ type=click.Choice(SUPPORTED_EVALUATORS),
89
+ help="启用评估器;可重复指定",
90
+ )
91
+ @click.option("--judge-model", type=str, help="LLM Judge 模型名")
92
+ @click.option("--judge-api-base", type=str, help="LLM Judge OpenAI 兼容 API 地址")
93
+ @click.option(
94
+ "--judge-api-key-env",
95
+ default="KSADK_EVAL_JUDGE_API_KEY",
96
+ show_default=True,
97
+ type=str,
98
+ help="保存 Judge API Key 的环境变量名",
99
+ )
100
+ @click.option(
101
+ "--timeout-seconds",
102
+ default=120,
103
+ show_default=True,
104
+ type=click.IntRange(1, 3600),
105
+ help="单个 Case 超时时间(秒)",
106
+ )
107
+ @click.option("--fail-fast", is_flag=True, help="首个失败 Case 后停止")
108
+ @click.option(
109
+ "--data-policy",
110
+ type=click.Choice(_DATA_POLICIES),
111
+ default="local_only",
112
+ show_default=True,
113
+ help="评测数据策略",
114
+ )
115
+ @click.option(
116
+ "--report-dir",
117
+ type=click.Path(file_okay=False, path_type=Path),
118
+ help="报告目录;缺省为项目 .agentkit/evaluations",
119
+ )
120
+ @click.option("--validate-only", is_flag=True, help="只识别并校验 EvalSet 和 CLI 参数")
121
+ @click.option(
122
+ "--format",
123
+ "output_format",
124
+ type=click.Choice(["pretty", "json"]),
125
+ help="终端输出格式",
126
+ )
127
+ def eval(
128
+ evalset_file: Path,
129
+ dataset_id: str | None,
130
+ dataset_version: int | None,
131
+ dataset_project_id: str | None,
132
+ agent_dir: Path | None,
133
+ a2a_url: str | None,
134
+ codex_worktree: Path | None,
135
+ entrypoint: str | None,
136
+ credential_ref: str | None,
137
+ codex_profile: str | None,
138
+ evaluators: tuple[str, ...],
139
+ judge_model: str | None,
140
+ judge_api_base: str | None,
141
+ judge_api_key_env: str,
142
+ timeout_seconds: int,
143
+ fail_fast: bool,
144
+ data_policy: str,
145
+ report_dir: Path | None,
146
+ validate_only: bool,
147
+ output_format: str | None,
148
+ ) -> None:
149
+ """校验 EvalSet,并通过统一入口发起 Agent 评测。"""
150
+
151
+ if output_format:
152
+ configure_ui_runtime(output_mode=output_format)
153
+ target = _target_ref(
154
+ agent_dir=agent_dir,
155
+ a2a_url=a2a_url,
156
+ codex_worktree=codex_worktree,
157
+ entrypoint=entrypoint,
158
+ credential_ref=credential_ref,
159
+ codex_profile=codex_profile,
160
+ )
161
+ request = _build_request(
162
+ evalset_file=evalset_file,
163
+ dataset_id=dataset_id,
164
+ dataset_version=dataset_version,
165
+ dataset_project_id=dataset_project_id,
166
+ target=target,
167
+ evaluators=evaluators,
168
+ judge_model=judge_model,
169
+ judge_api_base=judge_api_base,
170
+ judge_api_key_env=judge_api_key_env,
171
+ timeout_seconds=timeout_seconds,
172
+ fail_fast=fail_fast,
173
+ data_policy=data_policy,
174
+ report_dir=report_dir,
175
+ )
176
+ if validate_only:
177
+ _render_validation(request)
178
+ return
179
+
180
+ report = _execute_request(request)
181
+ exit_code = _report_exit_code(report)
182
+ _render_report(report, report_dir=request.report_dir)
183
+ if exit_code:
184
+ raise click.exceptions.Exit(exit_code)
185
+
186
+
187
+ def _build_request(
188
+ *,
189
+ evalset_file: Path | None,
190
+ dataset_id: str | None,
191
+ dataset_version: int | None,
192
+ dataset_project_id: str | None,
193
+ target: TargetRef,
194
+ evaluators: tuple[str, ...],
195
+ judge_model: str | None,
196
+ judge_api_base: str | None,
197
+ judge_api_key_env: str,
198
+ timeout_seconds: int,
199
+ fail_fast: bool,
200
+ data_policy: str,
201
+ report_dir: Path | None,
202
+ ) -> EvaluationRequest:
203
+ cloud_dataset = None
204
+ if dataset_id:
205
+ if evalset_file is not None:
206
+ raise click.UsageError("--evalset-file 与 --dataset-id 不能同时使用")
207
+ if dataset_version is None:
208
+ raise click.UsageError("--dataset-id 必须同时指定 --dataset-version")
209
+ try:
210
+ service = CloudEvalSetService(
211
+ Path.cwd(),
212
+ AgentEvalCloudDatasetClient(),
213
+ )
214
+ pulled = asyncio.run(
215
+ service.pull(
216
+ dataset_id=dataset_id,
217
+ version=dataset_version,
218
+ project_id=dataset_project_id,
219
+ )
220
+ )
221
+ except (AgentEvalCloudClientError, CloudEvalSetPreviewError, ValueError) as exc:
222
+ raise click.UsageError(str(exc)) from exc
223
+ evalset = pulled.evalset
224
+ cloud_dataset = pulled.cloud_dataset
225
+ else:
226
+ if evalset_file is None:
227
+ raise click.UsageError("必须指定 --evalset-file 或 --dataset-id")
228
+ if dataset_version is not None or dataset_project_id:
229
+ raise click.UsageError("云端 Dataset 参数必须与 --dataset-id 一起使用")
230
+ try:
231
+ evalset = load_evalset(evalset_file)
232
+ except EvalSetParseError as exc:
233
+ raise click.UsageError(f"{exc.code}: {exc}") from exc
234
+
235
+ return EvaluationRequest(
236
+ evalset=evalset,
237
+ target=target,
238
+ config=EvaluationConfig(
239
+ timeout_seconds=timeout_seconds,
240
+ fail_fast=fail_fast,
241
+ evaluators=list(evaluators),
242
+ data_policy=data_policy,
243
+ judge_model=judge_model,
244
+ judge_api_base=judge_api_base,
245
+ judge_api_key_env=judge_api_key_env,
246
+ ),
247
+ report_dir=str((report_dir or Path.cwd() / ".agentkit/evaluations").resolve()),
248
+ cloud_dataset=cloud_dataset,
249
+ )
250
+
251
+
252
+ def _execute_request(request: EvaluationRequest) -> EvalRunReport:
253
+ on_case_started = None
254
+ if not is_json_output():
255
+ _render_start(request)
256
+ on_case_started = _render_case_started
257
+ try:
258
+ return asyncio.run(execute_evaluation(request, on_case_started=on_case_started))
259
+ except (EvaluationNotImplementedError, EvaluationExecutionError) as exc:
260
+ raise EvaluationCliError(str(exc)) from exc
261
+
262
+
263
+ def _render_report(report: EvalRunReport, *, report_dir: str | None = None) -> None:
264
+ if is_json_output():
265
+ emit_json(report.model_dump(mode="json", by_alias=True, exclude_none=True))
266
+ else:
267
+ print_title("Agent 评测完成")
268
+ get_console().print("[title][i]评测摘要[/i][/]")
269
+ print_kv("运行状态", report.status.value)
270
+ print_kv("Run ID", report.spec.id)
271
+ if report_dir:
272
+ print_kv(
273
+ "报告文件",
274
+ str(EvaluationStorage(report_dir).report_path(report.spec.id)),
275
+ value_style="#58a6ff",
276
+ )
277
+ _render_report_preview(report)
278
+
279
+
280
+
281
+ def _render_start(request: EvaluationRequest) -> None:
282
+ print_info(
283
+ "开始评测:"
284
+ f"{request.evalset.name},{len(request.evalset.cases)} 个 Case,"
285
+ f"Target: {request.target.kind.value}"
286
+ )
287
+
288
+
289
+ def _render_case_started(case_id: str, index: int, total_cases: int) -> None:
290
+ print_info(f"[{index}/{total_cases}] 执行 Case: {case_id}")
291
+
292
+
293
+ def _render_report_preview(report: EvalRunReport) -> None:
294
+ _render_summary(report.summary)
295
+ _render_case_table(report)
296
+ remaining_cases = len(report.case_runs) - 5
297
+ if remaining_cases > 0:
298
+ print_info(f"其余 {remaining_cases} 个 Case 已省略")
299
+
300
+
301
+ def _render_summary(summary: EvalRunSummary) -> None:
302
+ items = (
303
+ ("总计", summary.total_cases, "white"),
304
+ ("通过", summary.passed_cases, "ok"),
305
+ ("失败", summary.failed_cases, "err"),
306
+ ("错误", summary.error_cases, "err"),
307
+ ("不可用", summary.unavailable_cases, "warn"),
308
+ ("取消", summary.cancelled_cases, "warn"),
309
+ )
310
+ table = Table.grid(padding=(0, 2))
311
+ for _label, _count, style in items:
312
+ table.add_column(justify="center", style=style, no_wrap=True)
313
+ table.add_row(*(label for label, _count, _style in items), style="muted")
314
+ table.add_row(*(f"[{style if count else 'muted'}]{count}[/]" for _label, count, style in items))
315
+ print_info(" 结果统计")
316
+ get_console().print(Padding(table, (0, 0, 0, 4)))
317
+
318
+
319
+ def _render_case_table(report: EvalRunReport) -> None:
320
+ table = new_table(" 评测集列表")
321
+ table.add_column("Case", style="#58a6ff", no_wrap=True)
322
+ table.add_column("目标状态", no_wrap=True)
323
+ table.add_column("耗时", justify="right", no_wrap=True)
324
+ table.add_column("指标")
325
+ for case_run in report.case_runs[:5]:
326
+ target_status = case_run.target_run.status.value
327
+ table.add_row(
328
+ escape(case_run.case_id),
329
+ f"[{status_rich_style(target_status)}]{target_status}[/]",
330
+ _format_duration(case_run.target_run.duration_ms),
331
+ _metric_summary(case_run.metrics),
332
+ )
333
+ get_console().print(table)
334
+
335
+
336
+ def _format_duration(duration_ms: int | None) -> str:
337
+ return f"{duration_ms} ms" if duration_ms is not None else "-"
338
+
339
+
340
+ def _metric_summary(metrics: list[MetricResult]) -> str:
341
+ if not metrics:
342
+ return "无指标"
343
+ counts = {status: sum(metric.status is status for metric in metrics) for status in MetricStatus}
344
+ return ",".join(f"{status.value} {count}" for status, count in counts.items() if count)
345
+
346
+
347
+ def _report_exit_code(report: EvalRunReport) -> int:
348
+ if report.status in {
349
+ EvalRunStatus.ERROR,
350
+ EvalRunStatus.CANCELLED,
351
+ EvalRunStatus.PENDING,
352
+ EvalRunStatus.RUNNING,
353
+ }:
354
+ return 2
355
+ if any(
356
+ case_run.target_run.status is TargetRunStatus.UNAVAILABLE
357
+ or any(
358
+ metric.required and metric.status is MetricStatus.UNAVAILABLE
359
+ for metric in case_run.metrics
360
+ )
361
+ for case_run in report.case_runs
362
+ ):
363
+ return 3
364
+ return 1 if report.status is EvalRunStatus.FAILED else 0
365
+
366
+
367
+ def _target_ref(
368
+ agent_dir: Path | None,
369
+ a2a_url: str | None,
370
+ codex_worktree: Path | None,
371
+ entrypoint: str | None,
372
+ credential_ref: str | None,
373
+ codex_profile: str | None,
374
+ ) -> TargetRef:
375
+ targets = [agent_dir is not None, bool(a2a_url), codex_worktree is not None]
376
+ if sum(targets) != 1:
377
+ raise click.UsageError("--agent-dir、--a2a-url、--codex-worktree 必须且只能指定一个")
378
+ if credential_ref and not a2a_url:
379
+ raise click.UsageError("--credential-ref 只能与 --a2a-url 一起使用")
380
+ if entrypoint and not agent_dir:
381
+ raise click.UsageError("--entrypoint 只能与 --agent-dir 一起使用")
382
+ if codex_profile and not codex_worktree:
383
+ raise click.UsageError("--codex-profile 只能与 --codex-worktree 一起使用")
384
+ if agent_dir:
385
+ return TargetRef(
386
+ kind=TargetKind.LOCAL_SOURCE,
387
+ locator=str(agent_dir.resolve()),
388
+ entrypoint=entrypoint,
389
+ )
390
+ if a2a_url:
391
+ return TargetRef(
392
+ kind=TargetKind.A2A,
393
+ locator=a2a_url,
394
+ credential_ref=credential_ref,
395
+ )
396
+ assert codex_worktree is not None
397
+ return TargetRef(
398
+ kind=TargetKind.CODEX_WORKTREE,
399
+ locator=str(codex_worktree.resolve()),
400
+ profile=codex_profile,
401
+ )
402
+
403
+
404
+ def _render_validation(request: EvaluationRequest) -> None:
405
+ try:
406
+ evaluation_plan = resolve_evaluator_plan(
407
+ request.evalset.cases,
408
+ request.config.evaluators,
409
+ request.config,
410
+ )
411
+ except ValueError as exc:
412
+ raise click.UsageError(str(exc)) from exc
413
+ payload = {
414
+ "valid": True,
415
+ "evalset": {
416
+ "name": request.evalset.name,
417
+ "sourceFormat": request.evalset.source_format,
418
+ "caseCount": len(request.evalset.cases),
419
+ "contentDigest": request.evalset.content_digest,
420
+ },
421
+ "target": request.target.model_dump(mode="json", by_alias=True, exclude_none=True),
422
+ "config": request.config.model_dump(mode="json", by_alias=True),
423
+ "evaluationPlan": evaluation_plan,
424
+ "reportDir": request.report_dir,
425
+ }
426
+ if request.cloud_dataset is not None:
427
+ payload["cloudDataset"] = request.cloud_dataset.model_dump(
428
+ mode="json", by_alias=True, exclude_none=True
429
+ )
430
+ if is_json_output():
431
+ emit_json(payload)
432
+ return
433
+ print_title("评测配置校验")
434
+ print_kv("EvalSet", request.evalset.name)
435
+ print_kv("格式", request.evalset.source_format)
436
+ print_kv("Case 数量", str(len(request.evalset.cases)))
437
+ print_kv("内容摘要", request.evalset.content_digest)
438
+ print_kv("Target", f"{request.target.kind.value}: {request.target.locator}")
439
+ print_success("EvalSet 与 CLI 参数有效")
440
+
441
+
442
+ # Eval reports use --report-dir exclusively; do not inject the generic child --output.
443
+ eval.disable_global_output_option = True