agent-insight 0.5.2 → 0.5.4

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 (852) hide show
  1. package/.env.example +6 -0
  2. package/.next/standalone/.next/BUILD_ID +1 -1
  3. package/.next/standalone/.next/app-path-routes-manifest.json +9 -0
  4. package/.next/standalone/.next/build-manifest.json +2 -2
  5. package/.next/standalone/.next/prerender-manifest.json +51 -3
  6. package/.next/standalone/.next/routes-manifest.json +60 -0
  7. package/.next/standalone/.next/server/app/(main)/accessconfig/channels/page_client-reference-manifest.js +1 -1
  8. package/.next/standalone/.next/server/app/(main)/accessconfig/health/page_client-reference-manifest.js +1 -1
  9. package/.next/standalone/.next/server/app/(main)/accessconfig/install/page.js.nft.json +1 -1
  10. package/.next/standalone/.next/server/app/(main)/accessconfig/install/page_client-reference-manifest.js +1 -1
  11. package/.next/standalone/.next/server/app/(main)/accessconfig/page_client-reference-manifest.js +1 -1
  12. package/.next/standalone/.next/server/app/(main)/accessconfig/webhooks/page_client-reference-manifest.js +1 -1
  13. package/.next/standalone/.next/server/app/(main)/agents/page.js.nft.json +1 -1
  14. package/.next/standalone/.next/server/app/(main)/agents/page_client-reference-manifest.js +1 -1
  15. package/.next/standalone/.next/server/app/(main)/dashboard/page.js.nft.json +1 -1
  16. package/.next/standalone/.next/server/app/(main)/dashboard/page_client-reference-manifest.js +1 -1
  17. package/.next/standalone/.next/server/app/(main)/dataset/[id]/page_client-reference-manifest.js +1 -1
  18. package/.next/standalone/.next/server/app/(main)/dataset/page_client-reference-manifest.js +1 -1
  19. package/.next/standalone/.next/server/app/(main)/eval/page.js.nft.json +1 -1
  20. package/.next/standalone/.next/server/app/(main)/eval/page_client-reference-manifest.js +1 -1
  21. package/.next/standalone/.next/server/app/(main)/eval/run/[runId]/page_client-reference-manifest.js +1 -1
  22. package/.next/standalone/.next/server/app/(main)/eval/trajectory/[taskId]/page_client-reference-manifest.js +1 -1
  23. package/.next/standalone/.next/server/app/(main)/eval/trajectory/[taskId]/trace/page.js.nft.json +1 -1
  24. package/.next/standalone/.next/server/app/(main)/eval/trajectory/[taskId]/trace/page_client-reference-manifest.js +1 -1
  25. package/.next/standalone/.next/server/app/(main)/eval/trajectory/page_client-reference-manifest.js +1 -1
  26. package/.next/standalone/.next/server/app/(main)/evaluation/[id]/page_client-reference-manifest.js +1 -1
  27. package/.next/standalone/.next/server/app/(main)/fault/page.js.nft.json +1 -1
  28. package/.next/standalone/.next/server/app/(main)/fault/page_client-reference-manifest.js +1 -1
  29. package/.next/standalone/.next/server/app/(main)/infra/page_client-reference-manifest.js +1 -1
  30. package/.next/standalone/.next/server/app/(main)/infra/source/[id]/page_client-reference-manifest.js +1 -1
  31. package/.next/standalone/.next/server/app/(main)/infra/sources/page_client-reference-manifest.js +1 -1
  32. package/.next/standalone/.next/server/app/(main)/memory/page_client-reference-manifest.js +1 -1
  33. package/.next/standalone/.next/server/app/(main)/metrics/evaluators/[id]/page_client-reference-manifest.js +1 -1
  34. package/.next/standalone/.next/server/app/(main)/metrics/page.js.nft.json +1 -1
  35. package/.next/standalone/.next/server/app/(main)/metrics/page_client-reference-manifest.js +1 -1
  36. package/.next/standalone/.next/server/app/(main)/modelconfig/page_client-reference-manifest.js +1 -1
  37. package/.next/standalone/.next/server/app/(main)/modelconfig/registry/page.js.nft.json +1 -1
  38. package/.next/standalone/.next/server/app/(main)/modelconfig/registry/page_client-reference-manifest.js +1 -1
  39. package/.next/standalone/.next/server/app/(main)/modelconfig/web-search/page.js.nft.json +1 -1
  40. package/.next/standalone/.next/server/app/(main)/modelconfig/web-search/page_client-reference-manifest.js +1 -1
  41. package/.next/standalone/.next/server/app/(main)/optapi/page_client-reference-manifest.js +1 -1
  42. package/.next/standalone/.next/server/app/(main)/quality/page.js.nft.json +1 -1
  43. package/.next/standalone/.next/server/app/(main)/quality/page_client-reference-manifest.js +1 -1
  44. package/.next/standalone/.next/server/app/(main)/security/page_client-reference-manifest.js +1 -1
  45. package/.next/standalone/.next/server/app/(main)/skill-eval/grayscale/page.js.nft.json +1 -1
  46. package/.next/standalone/.next/server/app/(main)/skill-eval/grayscale/page_client-reference-manifest.js +1 -1
  47. package/.next/standalone/.next/server/app/(main)/skill-eval/page.js.nft.json +1 -1
  48. package/.next/standalone/.next/server/app/(main)/skill-eval/page_client-reference-manifest.js +1 -1
  49. package/.next/standalone/.next/server/app/(main)/skill-eval/trigger/[skillName]/page_client-reference-manifest.js +1 -1
  50. package/.next/standalone/.next/server/app/(main)/skill-generator/page_client-reference-manifest.js +1 -1
  51. package/.next/standalone/.next/server/app/(main)/skill-history/page.js.nft.json +1 -1
  52. package/.next/standalone/.next/server/app/(main)/skill-history/page_client-reference-manifest.js +1 -1
  53. package/.next/standalone/.next/server/app/(main)/skill-opt/[name]/[version]/page_client-reference-manifest.js +1 -1
  54. package/.next/standalone/.next/server/app/(main)/skill-opt/page_client-reference-manifest.js +1 -1
  55. package/.next/standalone/.next/server/app/(main)/skill-release/page_client-reference-manifest.js +1 -1
  56. package/.next/standalone/.next/server/app/(main)/skills/page.js.nft.json +1 -1
  57. package/.next/standalone/.next/server/app/(main)/skills/page_client-reference-manifest.js +1 -1
  58. package/.next/standalone/.next/server/app/(main)/trace/page.js.nft.json +1 -1
  59. package/.next/standalone/.next/server/app/(main)/trace/page_client-reference-manifest.js +1 -1
  60. package/.next/standalone/.next/server/app/(main)/version-analysis/page/app-paths-manifest.json +3 -0
  61. package/.next/standalone/.next/server/app/(main)/version-analysis/page/build-manifest.json +17 -0
  62. package/.next/standalone/.next/server/app/(main)/version-analysis/page/next-font-manifest.json +6 -0
  63. package/.next/standalone/.next/server/app/(main)/version-analysis/page/react-loadable-manifest.json +1 -0
  64. package/.next/standalone/.next/server/app/(main)/version-analysis/page/server-reference-manifest.json +4 -0
  65. package/.next/standalone/.next/server/app/(main)/version-analysis/page.js +17 -0
  66. package/.next/standalone/.next/server/app/(main)/version-analysis/page.js.map +5 -0
  67. package/.next/standalone/.next/server/app/(main)/version-analysis/page.js.nft.json +1 -0
  68. package/.next/standalone/.next/server/app/(main)/version-analysis/page_client-reference-manifest.js +2 -0
  69. package/.next/standalone/.next/server/app/(main)/version-management/page/app-paths-manifest.json +3 -0
  70. package/.next/standalone/.next/server/app/(main)/version-management/page/build-manifest.json +17 -0
  71. package/.next/standalone/.next/server/app/(main)/version-management/page/next-font-manifest.json +6 -0
  72. package/.next/standalone/.next/server/app/(main)/version-management/page/react-loadable-manifest.json +1 -0
  73. package/.next/standalone/.next/server/app/(main)/version-management/page/server-reference-manifest.json +4 -0
  74. package/.next/standalone/.next/server/app/(main)/version-management/page.js +17 -0
  75. package/.next/standalone/.next/server/app/(main)/version-management/page.js.map +5 -0
  76. package/.next/standalone/.next/server/app/(main)/version-management/page.js.nft.json +1 -0
  77. package/.next/standalone/.next/server/app/(main)/version-management/page_client-reference-manifest.js +2 -0
  78. package/.next/standalone/.next/server/app/_global-error.html +2 -2
  79. package/.next/standalone/.next/server/app/_global-error.rsc +1 -1
  80. package/.next/standalone/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
  81. package/.next/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  82. package/.next/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  83. package/.next/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  84. package/.next/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  85. package/.next/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  86. package/.next/standalone/.next/server/app/_not-found.html +1 -1
  87. package/.next/standalone/.next/server/app/_not-found.rsc +3 -3
  88. package/.next/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +3 -3
  89. package/.next/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  90. package/.next/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +3 -3
  91. package/.next/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  92. package/.next/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  93. package/.next/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +2 -2
  94. package/.next/standalone/.next/server/app/accessconfig/channels.html +1 -1
  95. package/.next/standalone/.next/server/app/accessconfig/channels.rsc +5 -5
  96. package/.next/standalone/.next/server/app/accessconfig/channels.segments/!KG1haW4p/accessconfig/channels/__PAGE__.segment.rsc +2 -2
  97. package/.next/standalone/.next/server/app/accessconfig/channels.segments/!KG1haW4p/accessconfig/channels.segment.rsc +1 -1
  98. package/.next/standalone/.next/server/app/accessconfig/channels.segments/!KG1haW4p/accessconfig.segment.rsc +1 -1
  99. package/.next/standalone/.next/server/app/accessconfig/channels.segments/!KG1haW4p.segment.rsc +2 -2
  100. package/.next/standalone/.next/server/app/accessconfig/channels.segments/_full.segment.rsc +5 -5
  101. package/.next/standalone/.next/server/app/accessconfig/channels.segments/_head.segment.rsc +1 -1
  102. package/.next/standalone/.next/server/app/accessconfig/channels.segments/_index.segment.rsc +3 -3
  103. package/.next/standalone/.next/server/app/accessconfig/channels.segments/_tree.segment.rsc +2 -2
  104. package/.next/standalone/.next/server/app/accessconfig/health.html +1 -1
  105. package/.next/standalone/.next/server/app/accessconfig/health.rsc +5 -5
  106. package/.next/standalone/.next/server/app/accessconfig/health.segments/!KG1haW4p/accessconfig/health/__PAGE__.segment.rsc +2 -2
  107. package/.next/standalone/.next/server/app/accessconfig/health.segments/!KG1haW4p/accessconfig/health.segment.rsc +1 -1
  108. package/.next/standalone/.next/server/app/accessconfig/health.segments/!KG1haW4p/accessconfig.segment.rsc +1 -1
  109. package/.next/standalone/.next/server/app/accessconfig/health.segments/!KG1haW4p.segment.rsc +2 -2
  110. package/.next/standalone/.next/server/app/accessconfig/health.segments/_full.segment.rsc +5 -5
  111. package/.next/standalone/.next/server/app/accessconfig/health.segments/_head.segment.rsc +1 -1
  112. package/.next/standalone/.next/server/app/accessconfig/health.segments/_index.segment.rsc +3 -3
  113. package/.next/standalone/.next/server/app/accessconfig/health.segments/_tree.segment.rsc +2 -2
  114. package/.next/standalone/.next/server/app/accessconfig/install.html +2 -2
  115. package/.next/standalone/.next/server/app/accessconfig/install.rsc +5 -5
  116. package/.next/standalone/.next/server/app/accessconfig/install.segments/!KG1haW4p/accessconfig/install/__PAGE__.segment.rsc +2 -2
  117. package/.next/standalone/.next/server/app/accessconfig/install.segments/!KG1haW4p/accessconfig/install.segment.rsc +1 -1
  118. package/.next/standalone/.next/server/app/accessconfig/install.segments/!KG1haW4p/accessconfig.segment.rsc +1 -1
  119. package/.next/standalone/.next/server/app/accessconfig/install.segments/!KG1haW4p.segment.rsc +2 -2
  120. package/.next/standalone/.next/server/app/accessconfig/install.segments/_full.segment.rsc +5 -5
  121. package/.next/standalone/.next/server/app/accessconfig/install.segments/_head.segment.rsc +1 -1
  122. package/.next/standalone/.next/server/app/accessconfig/install.segments/_index.segment.rsc +3 -3
  123. package/.next/standalone/.next/server/app/accessconfig/install.segments/_tree.segment.rsc +2 -2
  124. package/.next/standalone/.next/server/app/accessconfig/webhooks.html +1 -1
  125. package/.next/standalone/.next/server/app/accessconfig/webhooks.rsc +5 -5
  126. package/.next/standalone/.next/server/app/accessconfig/webhooks.segments/!KG1haW4p/accessconfig/webhooks/__PAGE__.segment.rsc +2 -2
  127. package/.next/standalone/.next/server/app/accessconfig/webhooks.segments/!KG1haW4p/accessconfig/webhooks.segment.rsc +1 -1
  128. package/.next/standalone/.next/server/app/accessconfig/webhooks.segments/!KG1haW4p/accessconfig.segment.rsc +1 -1
  129. package/.next/standalone/.next/server/app/accessconfig/webhooks.segments/!KG1haW4p.segment.rsc +2 -2
  130. package/.next/standalone/.next/server/app/accessconfig/webhooks.segments/_full.segment.rsc +5 -5
  131. package/.next/standalone/.next/server/app/accessconfig/webhooks.segments/_head.segment.rsc +1 -1
  132. package/.next/standalone/.next/server/app/accessconfig/webhooks.segments/_index.segment.rsc +3 -3
  133. package/.next/standalone/.next/server/app/accessconfig/webhooks.segments/_tree.segment.rsc +2 -2
  134. package/.next/standalone/.next/server/app/accessconfig.html +1 -1
  135. package/.next/standalone/.next/server/app/accessconfig.rsc +4 -4
  136. package/.next/standalone/.next/server/app/accessconfig.segments/!KG1haW4p/accessconfig/__PAGE__.segment.rsc +1 -1
  137. package/.next/standalone/.next/server/app/accessconfig.segments/!KG1haW4p/accessconfig.segment.rsc +1 -1
  138. package/.next/standalone/.next/server/app/accessconfig.segments/!KG1haW4p.segment.rsc +2 -2
  139. package/.next/standalone/.next/server/app/accessconfig.segments/_full.segment.rsc +4 -4
  140. package/.next/standalone/.next/server/app/accessconfig.segments/_head.segment.rsc +1 -1
  141. package/.next/standalone/.next/server/app/accessconfig.segments/_index.segment.rsc +3 -3
  142. package/.next/standalone/.next/server/app/accessconfig.segments/_tree.segment.rsc +2 -2
  143. package/.next/standalone/.next/server/app/agents.html +1 -1
  144. package/.next/standalone/.next/server/app/agents.rsc +5 -5
  145. package/.next/standalone/.next/server/app/agents.segments/!KG1haW4p/agents/__PAGE__.segment.rsc +2 -2
  146. package/.next/standalone/.next/server/app/agents.segments/!KG1haW4p/agents.segment.rsc +1 -1
  147. package/.next/standalone/.next/server/app/agents.segments/!KG1haW4p.segment.rsc +2 -2
  148. package/.next/standalone/.next/server/app/agents.segments/_full.segment.rsc +5 -5
  149. package/.next/standalone/.next/server/app/agents.segments/_head.segment.rsc +1 -1
  150. package/.next/standalone/.next/server/app/agents.segments/_index.segment.rsc +3 -3
  151. package/.next/standalone/.next/server/app/agents.segments/_tree.segment.rsc +2 -2
  152. package/.next/standalone/.next/server/app/api/agent/run/route.js.nft.json +1 -1
  153. package/.next/standalone/.next/server/app/api/agent/stream/route.js.nft.json +1 -1
  154. package/.next/standalone/.next/server/app/api/agent-datasets/[id]/route.js.nft.json +1 -1
  155. package/.next/standalone/.next/server/app/api/agent-datasets/route.js.nft.json +1 -1
  156. package/.next/standalone/.next/server/app/api/agents/[id]/route.js.nft.json +1 -1
  157. package/.next/standalone/.next/server/app/api/agents/route.js.nft.json +1 -1
  158. package/.next/standalone/.next/server/app/api/auth/apikey/route.js.nft.json +1 -1
  159. package/.next/standalone/.next/server/app/api/auth/organization/route.js.nft.json +1 -1
  160. package/.next/standalone/.next/server/app/api/dashboard/stats/route.js.nft.json +1 -1
  161. package/.next/standalone/.next/server/app/api/debug/batch-tasks/[taskId]/route.js.nft.json +1 -1
  162. package/.next/standalone/.next/server/app/api/debug/batch-tasks/route.js.nft.json +1 -1
  163. package/.next/standalone/.next/server/app/api/debug/execute/[jobId]/route.js.nft.json +1 -1
  164. package/.next/standalone/.next/server/app/api/debug/execute/route.js.nft.json +1 -1
  165. package/.next/standalone/.next/server/app/api/debug/grayscale-tasks/[taskId]/route.js +10 -10
  166. package/.next/standalone/.next/server/app/api/debug/grayscale-tasks/[taskId]/route.js.nft.json +1 -1
  167. package/.next/standalone/.next/server/app/api/debug/grayscale-tasks/route.js.nft.json +1 -1
  168. package/.next/standalone/.next/server/app/api/debug/history/[id]/route.js.nft.json +1 -1
  169. package/.next/standalone/.next/server/app/api/debug/history/route.js.nft.json +1 -1
  170. package/.next/standalone/.next/server/app/api/eval/config/backfill-routing/route.js +6 -6
  171. package/.next/standalone/.next/server/app/api/eval/config/backfill-routing/route.js.nft.json +1 -1
  172. package/.next/standalone/.next/server/app/api/eval/config/create/route.js.nft.json +1 -1
  173. package/.next/standalone/.next/server/app/api/eval/config/reparse/route.js.nft.json +1 -1
  174. package/.next/standalone/.next/server/app/api/eval/config/route.js +6 -6
  175. package/.next/standalone/.next/server/app/api/eval/config/route.js.nft.json +1 -1
  176. package/.next/standalone/.next/server/app/api/eval/config/status/route.js.nft.json +1 -1
  177. package/.next/standalone/.next/server/app/api/eval/evaluation/route.js.nft.json +1 -1
  178. package/.next/standalone/.next/server/app/api/eval/rejudge/route.js +6 -6
  179. package/.next/standalone/.next/server/app/api/eval/rejudge/route.js.nft.json +1 -1
  180. package/.next/standalone/.next/server/app/api/eval/settings/route.js.nft.json +1 -1
  181. package/.next/standalone/.next/server/app/api/eval/settings/test/route.js.nft.json +1 -1
  182. package/.next/standalone/.next/server/app/api/eval/terminate-all/route.js.nft.json +1 -1
  183. package/.next/standalone/.next/server/app/api/eval/trajectory/results/[id]/route.js.nft.json +1 -1
  184. package/.next/standalone/.next/server/app/api/eval/trajectory/results/route.js +5 -5
  185. package/.next/standalone/.next/server/app/api/eval/trajectory/results/route.js.nft.json +1 -1
  186. package/.next/standalone/.next/server/app/api/eval/trajectory/run/route.js +13 -13
  187. package/.next/standalone/.next/server/app/api/eval/trajectory/run/route.js.nft.json +1 -1
  188. package/.next/standalone/.next/server/app/api/eval/trajectory/runs/route.js.nft.json +1 -1
  189. package/.next/standalone/.next/server/app/api/evaluation/[id]/route.js.nft.json +1 -1
  190. package/.next/standalone/.next/server/app/api/evaluation/cancel/route.js.nft.json +1 -1
  191. package/.next/standalone/.next/server/app/api/fault/diagnosis/session/route.js.nft.json +1 -1
  192. package/.next/standalone/.next/server/app/api/fault/diagnosis/stream/route.js.nft.json +1 -1
  193. package/.next/standalone/.next/server/app/api/fleet/agent/route/app-paths-manifest.json +3 -0
  194. package/.next/standalone/.next/server/app/api/fleet/agent/route/build-manifest.json +11 -0
  195. package/.next/standalone/.next/server/app/api/fleet/agent/route/server-reference-manifest.json +4 -0
  196. package/.next/standalone/.next/server/app/api/fleet/agent/route.js +8 -0
  197. package/.next/standalone/.next/server/app/api/fleet/agent/route.js.map +5 -0
  198. package/.next/standalone/.next/server/app/api/fleet/agent/route.js.nft.json +1 -0
  199. package/.next/standalone/.next/server/app/api/fleet/agent/route_client-reference-manifest.js +2 -0
  200. package/.next/standalone/.next/server/app/api/fleet/breakdowns/route.js +1 -1
  201. package/.next/standalone/.next/server/app/api/fleet/breakdowns/route.js.nft.json +1 -1
  202. package/.next/standalone/.next/server/app/api/fleet/trends/route.js +2 -2
  203. package/.next/standalone/.next/server/app/api/fleet/trends/route.js.nft.json +1 -1
  204. package/.next/standalone/.next/server/app/api/guide/route.js.nft.json +1 -1
  205. package/.next/standalone/.next/server/app/api/ingest/opencode/session-complete/route.js +3 -3
  206. package/.next/standalone/.next/server/app/api/ingest/opencode/session-complete/route.js.nft.json +1 -1
  207. package/.next/standalone/.next/server/app/api/ingest/otel/v1/logs/route.js.nft.json +1 -1
  208. package/.next/standalone/.next/server/app/api/ingest/otel/v1/metrics/route.js.nft.json +1 -1
  209. package/.next/standalone/.next/server/app/api/ingest/otel/v1/traces/route.js +5 -5
  210. package/.next/standalone/.next/server/app/api/ingest/otel/v1/traces/route.js.nft.json +1 -1
  211. package/.next/standalone/.next/server/app/api/ingest/proxy/[taskId]/[...path]/route.js.nft.json +1 -1
  212. package/.next/standalone/.next/server/app/api/ingest/proxy/[taskId]/end/route.js +9 -9
  213. package/.next/standalone/.next/server/app/api/ingest/proxy/[taskId]/end/route.js.nft.json +1 -1
  214. package/.next/standalone/.next/server/app/api/ingest/proxy/[taskId]/start/route.js.nft.json +1 -1
  215. package/.next/standalone/.next/server/app/api/ingest/sync/manifest/route.js.nft.json +1 -1
  216. package/.next/standalone/.next/server/app/api/ingest/sync/opencode/route.js.nft.json +1 -1
  217. package/.next/standalone/.next/server/app/api/ingest/upload/route.js +8 -8
  218. package/.next/standalone/.next/server/app/api/ingest/upload/route.js.nft.json +1 -1
  219. package/.next/standalone/.next/server/app/api/modelconfig/pricing/route/app-paths-manifest.json +3 -0
  220. package/.next/standalone/.next/server/app/api/modelconfig/pricing/route/build-manifest.json +11 -0
  221. package/.next/standalone/.next/server/app/api/modelconfig/pricing/route/server-reference-manifest.json +4 -0
  222. package/.next/standalone/.next/server/app/api/modelconfig/pricing/route.js +8 -0
  223. package/.next/standalone/.next/server/app/api/modelconfig/pricing/route.js.map +5 -0
  224. package/.next/standalone/.next/server/app/api/modelconfig/pricing/route.js.nft.json +1 -0
  225. package/.next/standalone/.next/server/app/api/modelconfig/pricing/route_client-reference-manifest.js +2 -0
  226. package/.next/standalone/.next/server/app/api/observe/data/route.js +3 -3
  227. package/.next/standalone/.next/server/app/api/observe/data/route.js.nft.json +1 -1
  228. package/.next/standalone/.next/server/app/api/observe/executions/[executionId]/agent-debug/route.js.nft.json +1 -1
  229. package/.next/standalone/.next/server/app/api/observe/executions/[executionId]/agent-debug/skills-analysis/route.js +13 -13
  230. package/.next/standalone/.next/server/app/api/observe/executions/[executionId]/agent-debug/skills-analysis/route.js.nft.json +1 -1
  231. package/.next/standalone/.next/server/app/api/observe/executions/[executionId]/analyze-match/route.js.nft.json +1 -1
  232. package/.next/standalone/.next/server/app/api/observe/executions/[executionId]/infra/route.js.nft.json +1 -1
  233. package/.next/standalone/.next/server/app/api/observe/executions/[executionId]/tags/route/app-paths-manifest.json +3 -0
  234. package/.next/standalone/.next/server/app/api/observe/executions/[executionId]/tags/route/build-manifest.json +11 -0
  235. package/.next/standalone/.next/server/app/api/observe/executions/[executionId]/tags/route/server-reference-manifest.json +4 -0
  236. package/.next/standalone/.next/server/app/api/observe/executions/[executionId]/tags/route.js +8 -0
  237. package/.next/standalone/.next/server/app/api/observe/executions/[executionId]/tags/route.js.map +5 -0
  238. package/.next/standalone/.next/server/app/api/observe/executions/[executionId]/tags/route.js.nft.json +1 -0
  239. package/.next/standalone/.next/server/app/api/observe/executions/[executionId]/tags/route_client-reference-manifest.js +2 -0
  240. package/.next/standalone/.next/server/app/api/observe/infra/history/route.js.nft.json +1 -1
  241. package/.next/standalone/.next/server/app/api/observe/infra/poll/route.js.nft.json +1 -1
  242. package/.next/standalone/.next/server/app/api/observe/infra/sources/derive/route.js.nft.json +1 -1
  243. package/.next/standalone/.next/server/app/api/observe/infra/sources/overview/route.js.nft.json +1 -1
  244. package/.next/standalone/.next/server/app/api/observe/infra/sources/route.js.nft.json +1 -1
  245. package/.next/standalone/.next/server/app/api/observe/infra/sources/sessions/route.js.nft.json +1 -1
  246. package/.next/standalone/.next/server/app/api/observe/infra/sources/test/route.js.nft.json +1 -1
  247. package/.next/standalone/.next/server/app/api/observe/session/route.js.nft.json +1 -1
  248. package/.next/standalone/.next/server/app/api/observe/task-stats/route.js +3 -3
  249. package/.next/standalone/.next/server/app/api/observe/task-stats/route.js.nft.json +1 -1
  250. package/.next/standalone/.next/server/app/api/observe/version-analysis/compare/route/app-paths-manifest.json +3 -0
  251. package/.next/standalone/.next/server/app/api/observe/version-analysis/compare/route/build-manifest.json +11 -0
  252. package/.next/standalone/.next/server/app/api/observe/version-analysis/compare/route/server-reference-manifest.json +4 -0
  253. package/.next/standalone/.next/server/app/api/observe/version-analysis/compare/route.js +8 -0
  254. package/.next/standalone/.next/server/app/api/observe/version-analysis/compare/route.js.map +5 -0
  255. package/.next/standalone/.next/server/app/api/observe/version-analysis/compare/route.js.nft.json +1 -0
  256. package/.next/standalone/.next/server/app/api/observe/version-analysis/compare/route_client-reference-manifest.js +2 -0
  257. package/.next/standalone/.next/server/app/api/observe/version-analysis/tags/[tagId]/traces/route/app-paths-manifest.json +3 -0
  258. package/.next/standalone/.next/server/app/api/observe/version-analysis/tags/[tagId]/traces/route/build-manifest.json +11 -0
  259. package/.next/standalone/.next/server/app/api/observe/version-analysis/tags/[tagId]/traces/route/server-reference-manifest.json +4 -0
  260. package/.next/standalone/.next/server/app/api/observe/version-analysis/tags/[tagId]/traces/route.js +8 -0
  261. package/.next/standalone/.next/server/app/api/observe/version-analysis/tags/[tagId]/traces/route.js.map +5 -0
  262. package/.next/standalone/.next/server/app/api/observe/version-analysis/tags/[tagId]/traces/route.js.nft.json +1 -0
  263. package/.next/standalone/.next/server/app/api/observe/version-analysis/tags/[tagId]/traces/route_client-reference-manifest.js +2 -0
  264. package/.next/standalone/.next/server/app/api/public/otel/v1/traces/route.js +5 -5
  265. package/.next/standalone/.next/server/app/api/public/otel/v1/traces/route.js.nft.json +1 -1
  266. package/.next/standalone/.next/server/app/api/quality/agents/route.js +7 -7
  267. package/.next/standalone/.next/server/app/api/quality/agents/route.js.nft.json +1 -1
  268. package/.next/standalone/.next/server/app/api/quality/backfill/route.js.nft.json +1 -1
  269. package/.next/standalone/.next/server/app/api/quality/executions/route.js +7 -7
  270. package/.next/standalone/.next/server/app/api/quality/executions/route.js.nft.json +1 -1
  271. package/.next/standalone/.next/server/app/api/quality/report/route.js.nft.json +1 -1
  272. package/.next/standalone/.next/server/app/api/skill-eval/trigger/[skillName]/draft/route.js.nft.json +1 -1
  273. package/.next/standalone/.next/server/app/api/skill-eval/trigger/[skillName]/route.js.nft.json +1 -1
  274. package/.next/standalone/.next/server/app/api/skill-eval/trigger/[skillName]/run/[runId]/cancel/route.js.nft.json +1 -1
  275. package/.next/standalone/.next/server/app/api/skill-eval/trigger/[skillName]/run/route.js.nft.json +1 -1
  276. package/.next/standalone/.next/server/app/api/skill-eval/trigger/[skillName]/runs/route.js.nft.json +1 -1
  277. package/.next/standalone/.next/server/app/api/skill-eval/trigger/[skillName]/upload/route.js.nft.json +1 -1
  278. package/.next/standalone/.next/server/app/api/skill-generator/attachments/route.js.nft.json +1 -1
  279. package/.next/standalone/.next/server/app/api/skill-generator/chat/route.js.nft.json +1 -1
  280. package/.next/standalone/.next/server/app/api/skill-generator/download/[sessionId]/route.js.nft.json +1 -1
  281. package/.next/standalone/.next/server/app/api/skill-generator/files/content/route.js.nft.json +1 -1
  282. package/.next/standalone/.next/server/app/api/skill-generator/files/download/route.js.nft.json +1 -1
  283. package/.next/standalone/.next/server/app/api/skill-generator/files/info/route.js.nft.json +1 -1
  284. package/.next/standalone/.next/server/app/api/skill-generator/files/list/route.js.nft.json +1 -1
  285. package/.next/standalone/.next/server/app/api/skill-generator/sessions/[id]/route.js.nft.json +1 -1
  286. package/.next/standalone/.next/server/app/api/skill-generator/sessions/route.js.nft.json +1 -1
  287. package/.next/standalone/.next/server/app/api/skill-opt/chat/route.js.nft.json +1 -1
  288. package/.next/standalone/.next/server/app/api/skill-opt/plan/items/[id]/route.js.nft.json +1 -1
  289. package/.next/standalone/.next/server/app/api/skill-opt/plan/route.js.nft.json +1 -1
  290. package/.next/standalone/.next/server/app/api/skill-opt/sessions/[id]/iterations/[draftNumber]/apply/route.js.nft.json +1 -1
  291. package/.next/standalone/.next/server/app/api/skill-opt/sessions/[id]/iterations/route.js.nft.json +1 -1
  292. package/.next/standalone/.next/server/app/api/skill-opt/sessions/[id]/route.js.nft.json +1 -1
  293. package/.next/standalone/.next/server/app/api/skill-opt/sessions/route.js.nft.json +1 -1
  294. package/.next/standalone/.next/server/app/api/skills/[id]/activate/route.js.nft.json +1 -1
  295. package/.next/standalone/.next/server/app/api/skills/[id]/benchmark-generate/route.js +7 -7
  296. package/.next/standalone/.next/server/app/api/skills/[id]/benchmark-generate/route.js.nft.json +1 -1
  297. package/.next/standalone/.next/server/app/api/skills/[id]/runs/route.js +2 -2
  298. package/.next/standalone/.next/server/app/api/skills/[id]/runs/route.js.nft.json +1 -1
  299. package/.next/standalone/.next/server/app/api/skills/[id]/toggle/route.js.nft.json +1 -1
  300. package/.next/standalone/.next/server/app/api/skills/[id]/versions/[version]/download/route.js.nft.json +1 -1
  301. package/.next/standalone/.next/server/app/api/skills/[id]/versions/[version]/evaluate/route.js.nft.json +1 -1
  302. package/.next/standalone/.next/server/app/api/skills/[id]/versions/[version]/evaluation-summary/route.js.nft.json +1 -1
  303. package/.next/standalone/.next/server/app/api/skills/[id]/versions/[version]/files/[...path]/route.js.nft.json +1 -1
  304. package/.next/standalone/.next/server/app/api/skills/[id]/versions/[version]/parse-flow/route.js.nft.json +1 -1
  305. package/.next/standalone/.next/server/app/api/skills/[id]/versions/[version]/route.js.nft.json +1 -1
  306. package/.next/standalone/.next/server/app/api/skills/[id]/versions/route.js.nft.json +1 -1
  307. package/.next/standalone/.next/server/app/api/skills/automation/import/route.js.nft.json +1 -1
  308. package/.next/standalone/.next/server/app/api/skills/automation/push/route.js.nft.json +1 -1
  309. package/.next/standalone/.next/server/app/api/skills/by-name/[name]/analysis-diagnosis/route.js.nft.json +1 -1
  310. package/.next/standalone/.next/server/app/api/skills/by-name/[name]/optimization-points/resolve/route.js.nft.json +1 -1
  311. package/.next/standalone/.next/server/app/api/skills/by-name/[name]/optimization-points/route.js.nft.json +1 -1
  312. package/.next/standalone/.next/server/app/api/skills/by-name/route.js.nft.json +1 -1
  313. package/.next/standalone/.next/server/app/api/skills/logs/route.js +6 -6
  314. package/.next/standalone/.next/server/app/api/skills/logs/route.js.nft.json +1 -1
  315. package/.next/standalone/.next/server/app/api/skills/publish/route.js.nft.json +1 -1
  316. package/.next/standalone/.next/server/app/api/skills/route.js.nft.json +1 -1
  317. package/.next/standalone/.next/server/app/api/skills/sync-enterprise/route.js.nft.json +1 -1
  318. package/.next/standalone/.next/server/app/api/skills/upload/route.js.nft.json +1 -1
  319. package/.next/standalone/.next/server/app/api/tags/[id]/route/app-paths-manifest.json +3 -0
  320. package/.next/standalone/.next/server/app/api/tags/[id]/route/build-manifest.json +11 -0
  321. package/.next/standalone/.next/server/app/api/tags/[id]/route/server-reference-manifest.json +4 -0
  322. package/.next/standalone/.next/server/app/api/tags/[id]/route.js +8 -0
  323. package/.next/standalone/.next/server/app/api/tags/[id]/route.js.map +5 -0
  324. package/.next/standalone/.next/server/app/api/tags/[id]/route.js.nft.json +1 -0
  325. package/.next/standalone/.next/server/app/api/tags/[id]/route_client-reference-manifest.js +2 -0
  326. package/.next/standalone/.next/server/app/api/tags/route/app-paths-manifest.json +3 -0
  327. package/.next/standalone/.next/server/app/api/tags/route/build-manifest.json +11 -0
  328. package/.next/standalone/.next/server/app/api/tags/route/server-reference-manifest.json +4 -0
  329. package/.next/standalone/.next/server/app/api/tags/route.js +8 -0
  330. package/.next/standalone/.next/server/app/api/tags/route.js.map +5 -0
  331. package/.next/standalone/.next/server/app/api/tags/route.js.nft.json +1 -0
  332. package/.next/standalone/.next/server/app/api/tags/route_client-reference-manifest.js +2 -0
  333. package/.next/standalone/.next/server/app/api/user-evaluators/route.js.nft.json +1 -1
  334. package/.next/standalone/.next/server/app/dashboard.html +1 -1
  335. package/.next/standalone/.next/server/app/dashboard.rsc +5 -5
  336. package/.next/standalone/.next/server/app/dashboard.segments/!KG1haW4p/dashboard/__PAGE__.segment.rsc +2 -2
  337. package/.next/standalone/.next/server/app/dashboard.segments/!KG1haW4p/dashboard.segment.rsc +1 -1
  338. package/.next/standalone/.next/server/app/dashboard.segments/!KG1haW4p.segment.rsc +2 -2
  339. package/.next/standalone/.next/server/app/dashboard.segments/_full.segment.rsc +5 -5
  340. package/.next/standalone/.next/server/app/dashboard.segments/_head.segment.rsc +1 -1
  341. package/.next/standalone/.next/server/app/dashboard.segments/_index.segment.rsc +3 -3
  342. package/.next/standalone/.next/server/app/dashboard.segments/_tree.segment.rsc +2 -2
  343. package/.next/standalone/.next/server/app/dataset.html +1 -1
  344. package/.next/standalone/.next/server/app/dataset.rsc +5 -5
  345. package/.next/standalone/.next/server/app/dataset.segments/!KG1haW4p/dataset/__PAGE__.segment.rsc +2 -2
  346. package/.next/standalone/.next/server/app/dataset.segments/!KG1haW4p/dataset.segment.rsc +1 -1
  347. package/.next/standalone/.next/server/app/dataset.segments/!KG1haW4p.segment.rsc +2 -2
  348. package/.next/standalone/.next/server/app/dataset.segments/_full.segment.rsc +5 -5
  349. package/.next/standalone/.next/server/app/dataset.segments/_head.segment.rsc +1 -1
  350. package/.next/standalone/.next/server/app/dataset.segments/_index.segment.rsc +3 -3
  351. package/.next/standalone/.next/server/app/dataset.segments/_tree.segment.rsc +2 -2
  352. package/.next/standalone/.next/server/app/eval/trajectory.html +1 -1
  353. package/.next/standalone/.next/server/app/eval/trajectory.rsc +5 -5
  354. package/.next/standalone/.next/server/app/eval/trajectory.segments/!KG1haW4p/eval/trajectory/__PAGE__.segment.rsc +2 -2
  355. package/.next/standalone/.next/server/app/eval/trajectory.segments/!KG1haW4p/eval/trajectory.segment.rsc +1 -1
  356. package/.next/standalone/.next/server/app/eval/trajectory.segments/!KG1haW4p/eval.segment.rsc +1 -1
  357. package/.next/standalone/.next/server/app/eval/trajectory.segments/!KG1haW4p.segment.rsc +2 -2
  358. package/.next/standalone/.next/server/app/eval/trajectory.segments/_full.segment.rsc +5 -5
  359. package/.next/standalone/.next/server/app/eval/trajectory.segments/_head.segment.rsc +1 -1
  360. package/.next/standalone/.next/server/app/eval/trajectory.segments/_index.segment.rsc +3 -3
  361. package/.next/standalone/.next/server/app/eval/trajectory.segments/_tree.segment.rsc +2 -2
  362. package/.next/standalone/.next/server/app/eval.html +1 -1
  363. package/.next/standalone/.next/server/app/eval.rsc +5 -5
  364. package/.next/standalone/.next/server/app/eval.segments/!KG1haW4p/eval/__PAGE__.segment.rsc +2 -2
  365. package/.next/standalone/.next/server/app/eval.segments/!KG1haW4p/eval.segment.rsc +1 -1
  366. package/.next/standalone/.next/server/app/eval.segments/!KG1haW4p.segment.rsc +2 -2
  367. package/.next/standalone/.next/server/app/eval.segments/_full.segment.rsc +5 -5
  368. package/.next/standalone/.next/server/app/eval.segments/_head.segment.rsc +1 -1
  369. package/.next/standalone/.next/server/app/eval.segments/_index.segment.rsc +3 -3
  370. package/.next/standalone/.next/server/app/eval.segments/_tree.segment.rsc +2 -2
  371. package/.next/standalone/.next/server/app/fault.html +1 -1
  372. package/.next/standalone/.next/server/app/fault.rsc +5 -5
  373. package/.next/standalone/.next/server/app/fault.segments/!KG1haW4p/fault/__PAGE__.segment.rsc +2 -2
  374. package/.next/standalone/.next/server/app/fault.segments/!KG1haW4p/fault.segment.rsc +1 -1
  375. package/.next/standalone/.next/server/app/fault.segments/!KG1haW4p.segment.rsc +2 -2
  376. package/.next/standalone/.next/server/app/fault.segments/_full.segment.rsc +5 -5
  377. package/.next/standalone/.next/server/app/fault.segments/_head.segment.rsc +1 -1
  378. package/.next/standalone/.next/server/app/fault.segments/_index.segment.rsc +3 -3
  379. package/.next/standalone/.next/server/app/fault.segments/_tree.segment.rsc +2 -2
  380. package/.next/standalone/.next/server/app/index.html +1 -1
  381. package/.next/standalone/.next/server/app/index.rsc +3 -3
  382. package/.next/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +1 -1
  383. package/.next/standalone/.next/server/app/index.segments/_full.segment.rsc +3 -3
  384. package/.next/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
  385. package/.next/standalone/.next/server/app/index.segments/_index.segment.rsc +3 -3
  386. package/.next/standalone/.next/server/app/index.segments/_tree.segment.rsc +2 -2
  387. package/.next/standalone/.next/server/app/infra/sources.html +1 -1
  388. package/.next/standalone/.next/server/app/infra/sources.rsc +5 -5
  389. package/.next/standalone/.next/server/app/infra/sources.segments/!KG1haW4p/infra/sources/__PAGE__.segment.rsc +2 -2
  390. package/.next/standalone/.next/server/app/infra/sources.segments/!KG1haW4p/infra/sources.segment.rsc +1 -1
  391. package/.next/standalone/.next/server/app/infra/sources.segments/!KG1haW4p/infra.segment.rsc +1 -1
  392. package/.next/standalone/.next/server/app/infra/sources.segments/!KG1haW4p.segment.rsc +2 -2
  393. package/.next/standalone/.next/server/app/infra/sources.segments/_full.segment.rsc +5 -5
  394. package/.next/standalone/.next/server/app/infra/sources.segments/_head.segment.rsc +1 -1
  395. package/.next/standalone/.next/server/app/infra/sources.segments/_index.segment.rsc +3 -3
  396. package/.next/standalone/.next/server/app/infra/sources.segments/_tree.segment.rsc +2 -2
  397. package/.next/standalone/.next/server/app/infra.html +1 -1
  398. package/.next/standalone/.next/server/app/infra.rsc +5 -5
  399. package/.next/standalone/.next/server/app/infra.segments/!KG1haW4p/infra/__PAGE__.segment.rsc +2 -2
  400. package/.next/standalone/.next/server/app/infra.segments/!KG1haW4p/infra.segment.rsc +1 -1
  401. package/.next/standalone/.next/server/app/infra.segments/!KG1haW4p.segment.rsc +2 -2
  402. package/.next/standalone/.next/server/app/infra.segments/_full.segment.rsc +5 -5
  403. package/.next/standalone/.next/server/app/infra.segments/_head.segment.rsc +1 -1
  404. package/.next/standalone/.next/server/app/infra.segments/_index.segment.rsc +3 -3
  405. package/.next/standalone/.next/server/app/infra.segments/_tree.segment.rsc +2 -2
  406. package/.next/standalone/.next/server/app/login/page_client-reference-manifest.js +1 -1
  407. package/.next/standalone/.next/server/app/login.html +1 -1
  408. package/.next/standalone/.next/server/app/login.rsc +4 -4
  409. package/.next/standalone/.next/server/app/login.segments/_full.segment.rsc +4 -4
  410. package/.next/standalone/.next/server/app/login.segments/_head.segment.rsc +1 -1
  411. package/.next/standalone/.next/server/app/login.segments/_index.segment.rsc +3 -3
  412. package/.next/standalone/.next/server/app/login.segments/_tree.segment.rsc +2 -2
  413. package/.next/standalone/.next/server/app/login.segments/login/__PAGE__.segment.rsc +2 -2
  414. package/.next/standalone/.next/server/app/login.segments/login.segment.rsc +1 -1
  415. package/.next/standalone/.next/server/app/memory.html +1 -1
  416. package/.next/standalone/.next/server/app/memory.rsc +5 -5
  417. package/.next/standalone/.next/server/app/memory.segments/!KG1haW4p/memory/__PAGE__.segment.rsc +2 -2
  418. package/.next/standalone/.next/server/app/memory.segments/!KG1haW4p/memory.segment.rsc +1 -1
  419. package/.next/standalone/.next/server/app/memory.segments/!KG1haW4p.segment.rsc +2 -2
  420. package/.next/standalone/.next/server/app/memory.segments/_full.segment.rsc +5 -5
  421. package/.next/standalone/.next/server/app/memory.segments/_head.segment.rsc +1 -1
  422. package/.next/standalone/.next/server/app/memory.segments/_index.segment.rsc +3 -3
  423. package/.next/standalone/.next/server/app/memory.segments/_tree.segment.rsc +2 -2
  424. package/.next/standalone/.next/server/app/metrics.html +1 -1
  425. package/.next/standalone/.next/server/app/metrics.rsc +5 -5
  426. package/.next/standalone/.next/server/app/metrics.segments/!KG1haW4p/metrics/__PAGE__.segment.rsc +2 -2
  427. package/.next/standalone/.next/server/app/metrics.segments/!KG1haW4p/metrics.segment.rsc +1 -1
  428. package/.next/standalone/.next/server/app/metrics.segments/!KG1haW4p.segment.rsc +2 -2
  429. package/.next/standalone/.next/server/app/metrics.segments/_full.segment.rsc +5 -5
  430. package/.next/standalone/.next/server/app/metrics.segments/_head.segment.rsc +1 -1
  431. package/.next/standalone/.next/server/app/metrics.segments/_index.segment.rsc +3 -3
  432. package/.next/standalone/.next/server/app/metrics.segments/_tree.segment.rsc +2 -2
  433. package/.next/standalone/.next/server/app/modelconfig/registry.html +1 -1
  434. package/.next/standalone/.next/server/app/modelconfig/registry.rsc +5 -5
  435. package/.next/standalone/.next/server/app/modelconfig/registry.segments/!KG1haW4p/modelconfig/registry/__PAGE__.segment.rsc +2 -2
  436. package/.next/standalone/.next/server/app/modelconfig/registry.segments/!KG1haW4p/modelconfig/registry.segment.rsc +1 -1
  437. package/.next/standalone/.next/server/app/modelconfig/registry.segments/!KG1haW4p/modelconfig.segment.rsc +1 -1
  438. package/.next/standalone/.next/server/app/modelconfig/registry.segments/!KG1haW4p.segment.rsc +2 -2
  439. package/.next/standalone/.next/server/app/modelconfig/registry.segments/_full.segment.rsc +5 -5
  440. package/.next/standalone/.next/server/app/modelconfig/registry.segments/_head.segment.rsc +1 -1
  441. package/.next/standalone/.next/server/app/modelconfig/registry.segments/_index.segment.rsc +3 -3
  442. package/.next/standalone/.next/server/app/modelconfig/registry.segments/_tree.segment.rsc +2 -2
  443. package/.next/standalone/.next/server/app/modelconfig/web-search.html +1 -1
  444. package/.next/standalone/.next/server/app/modelconfig/web-search.rsc +5 -5
  445. package/.next/standalone/.next/server/app/modelconfig/web-search.segments/!KG1haW4p/modelconfig/web-search/__PAGE__.segment.rsc +2 -2
  446. package/.next/standalone/.next/server/app/modelconfig/web-search.segments/!KG1haW4p/modelconfig/web-search.segment.rsc +1 -1
  447. package/.next/standalone/.next/server/app/modelconfig/web-search.segments/!KG1haW4p/modelconfig.segment.rsc +1 -1
  448. package/.next/standalone/.next/server/app/modelconfig/web-search.segments/!KG1haW4p.segment.rsc +2 -2
  449. package/.next/standalone/.next/server/app/modelconfig/web-search.segments/_full.segment.rsc +5 -5
  450. package/.next/standalone/.next/server/app/modelconfig/web-search.segments/_head.segment.rsc +1 -1
  451. package/.next/standalone/.next/server/app/modelconfig/web-search.segments/_index.segment.rsc +3 -3
  452. package/.next/standalone/.next/server/app/modelconfig/web-search.segments/_tree.segment.rsc +2 -2
  453. package/.next/standalone/.next/server/app/modelconfig.html +1 -1
  454. package/.next/standalone/.next/server/app/modelconfig.rsc +4 -4
  455. package/.next/standalone/.next/server/app/modelconfig.segments/!KG1haW4p/modelconfig/__PAGE__.segment.rsc +1 -1
  456. package/.next/standalone/.next/server/app/modelconfig.segments/!KG1haW4p/modelconfig.segment.rsc +1 -1
  457. package/.next/standalone/.next/server/app/modelconfig.segments/!KG1haW4p.segment.rsc +2 -2
  458. package/.next/standalone/.next/server/app/modelconfig.segments/_full.segment.rsc +4 -4
  459. package/.next/standalone/.next/server/app/modelconfig.segments/_head.segment.rsc +1 -1
  460. package/.next/standalone/.next/server/app/modelconfig.segments/_index.segment.rsc +3 -3
  461. package/.next/standalone/.next/server/app/modelconfig.segments/_tree.segment.rsc +2 -2
  462. package/.next/standalone/.next/server/app/optapi.html +1 -1
  463. package/.next/standalone/.next/server/app/optapi.rsc +5 -5
  464. package/.next/standalone/.next/server/app/optapi.segments/!KG1haW4p/optapi/__PAGE__.segment.rsc +2 -2
  465. package/.next/standalone/.next/server/app/optapi.segments/!KG1haW4p/optapi.segment.rsc +1 -1
  466. package/.next/standalone/.next/server/app/optapi.segments/!KG1haW4p.segment.rsc +2 -2
  467. package/.next/standalone/.next/server/app/optapi.segments/_full.segment.rsc +5 -5
  468. package/.next/standalone/.next/server/app/optapi.segments/_head.segment.rsc +1 -1
  469. package/.next/standalone/.next/server/app/optapi.segments/_index.segment.rsc +3 -3
  470. package/.next/standalone/.next/server/app/optapi.segments/_tree.segment.rsc +2 -2
  471. package/.next/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
  472. package/.next/standalone/.next/server/app/quality.html +1 -1
  473. package/.next/standalone/.next/server/app/quality.rsc +5 -5
  474. package/.next/standalone/.next/server/app/quality.segments/!KG1haW4p/quality/__PAGE__.segment.rsc +2 -2
  475. package/.next/standalone/.next/server/app/quality.segments/!KG1haW4p/quality.segment.rsc +1 -1
  476. package/.next/standalone/.next/server/app/quality.segments/!KG1haW4p.segment.rsc +2 -2
  477. package/.next/standalone/.next/server/app/quality.segments/_full.segment.rsc +5 -5
  478. package/.next/standalone/.next/server/app/quality.segments/_head.segment.rsc +1 -1
  479. package/.next/standalone/.next/server/app/quality.segments/_index.segment.rsc +3 -3
  480. package/.next/standalone/.next/server/app/quality.segments/_tree.segment.rsc +2 -2
  481. package/.next/standalone/.next/server/app/security.html +1 -1
  482. package/.next/standalone/.next/server/app/security.rsc +5 -5
  483. package/.next/standalone/.next/server/app/security.segments/!KG1haW4p/security/__PAGE__.segment.rsc +2 -2
  484. package/.next/standalone/.next/server/app/security.segments/!KG1haW4p/security.segment.rsc +1 -1
  485. package/.next/standalone/.next/server/app/security.segments/!KG1haW4p.segment.rsc +2 -2
  486. package/.next/standalone/.next/server/app/security.segments/_full.segment.rsc +5 -5
  487. package/.next/standalone/.next/server/app/security.segments/_head.segment.rsc +1 -1
  488. package/.next/standalone/.next/server/app/security.segments/_index.segment.rsc +3 -3
  489. package/.next/standalone/.next/server/app/security.segments/_tree.segment.rsc +2 -2
  490. package/.next/standalone/.next/server/app/skill-detail/page_client-reference-manifest.js +1 -1
  491. package/.next/standalone/.next/server/app/skill-detail.html +1 -1
  492. package/.next/standalone/.next/server/app/skill-detail.rsc +4 -4
  493. package/.next/standalone/.next/server/app/skill-detail.segments/_full.segment.rsc +4 -4
  494. package/.next/standalone/.next/server/app/skill-detail.segments/_head.segment.rsc +1 -1
  495. package/.next/standalone/.next/server/app/skill-detail.segments/_index.segment.rsc +3 -3
  496. package/.next/standalone/.next/server/app/skill-detail.segments/_tree.segment.rsc +2 -2
  497. package/.next/standalone/.next/server/app/skill-detail.segments/skill-detail/__PAGE__.segment.rsc +2 -2
  498. package/.next/standalone/.next/server/app/skill-detail.segments/skill-detail.segment.rsc +1 -1
  499. package/.next/standalone/.next/server/app/skill-eval/grayscale.html +2 -2
  500. package/.next/standalone/.next/server/app/skill-eval/grayscale.rsc +6 -6
  501. package/.next/standalone/.next/server/app/skill-eval/grayscale.segments/!KG1haW4p/skill-eval/grayscale/__PAGE__.segment.rsc +2 -2
  502. package/.next/standalone/.next/server/app/skill-eval/grayscale.segments/!KG1haW4p/skill-eval/grayscale.segment.rsc +1 -1
  503. package/.next/standalone/.next/server/app/skill-eval/grayscale.segments/!KG1haW4p/skill-eval.segment.rsc +1 -1
  504. package/.next/standalone/.next/server/app/skill-eval/grayscale.segments/!KG1haW4p.segment.rsc +2 -2
  505. package/.next/standalone/.next/server/app/skill-eval/grayscale.segments/_full.segment.rsc +6 -6
  506. package/.next/standalone/.next/server/app/skill-eval/grayscale.segments/_head.segment.rsc +1 -1
  507. package/.next/standalone/.next/server/app/skill-eval/grayscale.segments/_index.segment.rsc +3 -3
  508. package/.next/standalone/.next/server/app/skill-eval/grayscale.segments/_tree.segment.rsc +2 -2
  509. package/.next/standalone/.next/server/app/skill-eval.html +1 -1
  510. package/.next/standalone/.next/server/app/skill-eval.rsc +6 -6
  511. package/.next/standalone/.next/server/app/skill-eval.segments/!KG1haW4p/skill-eval/__PAGE__.segment.rsc +2 -2
  512. package/.next/standalone/.next/server/app/skill-eval.segments/!KG1haW4p/skill-eval.segment.rsc +1 -1
  513. package/.next/standalone/.next/server/app/skill-eval.segments/!KG1haW4p.segment.rsc +2 -2
  514. package/.next/standalone/.next/server/app/skill-eval.segments/_full.segment.rsc +6 -6
  515. package/.next/standalone/.next/server/app/skill-eval.segments/_head.segment.rsc +1 -1
  516. package/.next/standalone/.next/server/app/skill-eval.segments/_index.segment.rsc +3 -3
  517. package/.next/standalone/.next/server/app/skill-eval.segments/_tree.segment.rsc +2 -2
  518. package/.next/standalone/.next/server/app/skill-generator.html +1 -1
  519. package/.next/standalone/.next/server/app/skill-generator.rsc +5 -5
  520. package/.next/standalone/.next/server/app/skill-generator.segments/!KG1haW4p/skill-generator/__PAGE__.segment.rsc +2 -2
  521. package/.next/standalone/.next/server/app/skill-generator.segments/!KG1haW4p/skill-generator.segment.rsc +1 -1
  522. package/.next/standalone/.next/server/app/skill-generator.segments/!KG1haW4p.segment.rsc +2 -2
  523. package/.next/standalone/.next/server/app/skill-generator.segments/_full.segment.rsc +5 -5
  524. package/.next/standalone/.next/server/app/skill-generator.segments/_head.segment.rsc +1 -1
  525. package/.next/standalone/.next/server/app/skill-generator.segments/_index.segment.rsc +3 -3
  526. package/.next/standalone/.next/server/app/skill-generator.segments/_tree.segment.rsc +2 -2
  527. package/.next/standalone/.next/server/app/skill-history.html +1 -1
  528. package/.next/standalone/.next/server/app/skill-history.rsc +6 -6
  529. package/.next/standalone/.next/server/app/skill-history.segments/!KG1haW4p/skill-history/__PAGE__.segment.rsc +2 -2
  530. package/.next/standalone/.next/server/app/skill-history.segments/!KG1haW4p/skill-history.segment.rsc +1 -1
  531. package/.next/standalone/.next/server/app/skill-history.segments/!KG1haW4p.segment.rsc +2 -2
  532. package/.next/standalone/.next/server/app/skill-history.segments/_full.segment.rsc +6 -6
  533. package/.next/standalone/.next/server/app/skill-history.segments/_head.segment.rsc +1 -1
  534. package/.next/standalone/.next/server/app/skill-history.segments/_index.segment.rsc +3 -3
  535. package/.next/standalone/.next/server/app/skill-history.segments/_tree.segment.rsc +2 -2
  536. package/.next/standalone/.next/server/app/skill-opt.html +1 -1
  537. package/.next/standalone/.next/server/app/skill-opt.rsc +5 -5
  538. package/.next/standalone/.next/server/app/skill-opt.segments/!KG1haW4p/skill-opt/__PAGE__.segment.rsc +2 -2
  539. package/.next/standalone/.next/server/app/skill-opt.segments/!KG1haW4p/skill-opt.segment.rsc +1 -1
  540. package/.next/standalone/.next/server/app/skill-opt.segments/!KG1haW4p.segment.rsc +2 -2
  541. package/.next/standalone/.next/server/app/skill-opt.segments/_full.segment.rsc +5 -5
  542. package/.next/standalone/.next/server/app/skill-opt.segments/_head.segment.rsc +1 -1
  543. package/.next/standalone/.next/server/app/skill-opt.segments/_index.segment.rsc +3 -3
  544. package/.next/standalone/.next/server/app/skill-opt.segments/_tree.segment.rsc +2 -2
  545. package/.next/standalone/.next/server/app/skill-release.html +1 -1
  546. package/.next/standalone/.next/server/app/skill-release.rsc +5 -5
  547. package/.next/standalone/.next/server/app/skill-release.segments/!KG1haW4p/skill-release/__PAGE__.segment.rsc +2 -2
  548. package/.next/standalone/.next/server/app/skill-release.segments/!KG1haW4p/skill-release.segment.rsc +1 -1
  549. package/.next/standalone/.next/server/app/skill-release.segments/!KG1haW4p.segment.rsc +2 -2
  550. package/.next/standalone/.next/server/app/skill-release.segments/_full.segment.rsc +5 -5
  551. package/.next/standalone/.next/server/app/skill-release.segments/_head.segment.rsc +1 -1
  552. package/.next/standalone/.next/server/app/skill-release.segments/_index.segment.rsc +3 -3
  553. package/.next/standalone/.next/server/app/skill-release.segments/_tree.segment.rsc +2 -2
  554. package/.next/standalone/.next/server/app/skills.html +1 -1
  555. package/.next/standalone/.next/server/app/skills.rsc +5 -5
  556. package/.next/standalone/.next/server/app/skills.segments/!KG1haW4p/skills/__PAGE__.segment.rsc +2 -2
  557. package/.next/standalone/.next/server/app/skills.segments/!KG1haW4p/skills.segment.rsc +1 -1
  558. package/.next/standalone/.next/server/app/skills.segments/!KG1haW4p.segment.rsc +2 -2
  559. package/.next/standalone/.next/server/app/skills.segments/_full.segment.rsc +5 -5
  560. package/.next/standalone/.next/server/app/skills.segments/_head.segment.rsc +1 -1
  561. package/.next/standalone/.next/server/app/skills.segments/_index.segment.rsc +3 -3
  562. package/.next/standalone/.next/server/app/skills.segments/_tree.segment.rsc +2 -2
  563. package/.next/standalone/.next/server/app/trace.html +1 -1
  564. package/.next/standalone/.next/server/app/trace.rsc +8 -8
  565. package/.next/standalone/.next/server/app/trace.segments/!KG1haW4p/trace/__PAGE__.segment.rsc +2 -2
  566. package/.next/standalone/.next/server/app/trace.segments/!KG1haW4p/trace.segment.rsc +1 -1
  567. package/.next/standalone/.next/server/app/trace.segments/!KG1haW4p.segment.rsc +2 -2
  568. package/.next/standalone/.next/server/app/trace.segments/_full.segment.rsc +8 -8
  569. package/.next/standalone/.next/server/app/trace.segments/_head.segment.rsc +1 -1
  570. package/.next/standalone/.next/server/app/trace.segments/_index.segment.rsc +3 -3
  571. package/.next/standalone/.next/server/app/trace.segments/_tree.segment.rsc +2 -2
  572. package/.next/standalone/.next/server/app/version-analysis.html +1 -0
  573. package/.next/standalone/.next/server/app/version-analysis.meta +16 -0
  574. package/.next/standalone/.next/server/app/version-analysis.rsc +23 -0
  575. package/.next/standalone/.next/server/app/version-analysis.segments/!KG1haW4p/version-analysis/__PAGE__.segment.rsc +9 -0
  576. package/.next/standalone/.next/server/app/version-analysis.segments/!KG1haW4p/version-analysis.segment.rsc +4 -0
  577. package/.next/standalone/.next/server/app/version-analysis.segments/!KG1haW4p.segment.rsc +7 -0
  578. package/.next/standalone/.next/server/app/version-analysis.segments/_full.segment.rsc +23 -0
  579. package/.next/standalone/.next/server/app/version-analysis.segments/_head.segment.rsc +6 -0
  580. package/.next/standalone/.next/server/app/version-analysis.segments/_index.segment.rsc +6 -0
  581. package/.next/standalone/.next/server/app/version-analysis.segments/_tree.segment.rsc +2 -0
  582. package/.next/standalone/.next/server/app/version-management.html +1 -0
  583. package/.next/standalone/.next/server/app/version-management.meta +16 -0
  584. package/.next/standalone/.next/server/app/version-management.rsc +22 -0
  585. package/.next/standalone/.next/server/app/version-management.segments/!KG1haW4p/version-management/__PAGE__.segment.rsc +9 -0
  586. package/.next/standalone/.next/server/app/version-management.segments/!KG1haW4p/version-management.segment.rsc +4 -0
  587. package/.next/standalone/.next/server/app/version-management.segments/!KG1haW4p.segment.rsc +7 -0
  588. package/.next/standalone/.next/server/app/version-management.segments/_full.segment.rsc +22 -0
  589. package/.next/standalone/.next/server/app/version-management.segments/_head.segment.rsc +6 -0
  590. package/.next/standalone/.next/server/app/version-management.segments/_index.segment.rsc +6 -0
  591. package/.next/standalone/.next/server/app/version-management.segments/_tree.segment.rsc +2 -0
  592. package/.next/standalone/.next/server/app-paths-manifest.json +9 -0
  593. package/.next/standalone/.next/server/chunks/[root-of-the-server]__096d00c3._.js +3 -0
  594. package/.next/standalone/.next/server/chunks/[root-of-the-server]__28078c4e._.js +1 -1
  595. package/.next/standalone/.next/server/chunks/[root-of-the-server]__4509f30c._.js +1 -1
  596. package/.next/standalone/.next/server/chunks/[root-of-the-server]__5386e9b4._.js +22 -0
  597. package/.next/standalone/.next/server/chunks/[root-of-the-server]__5cb21a03._.js +3 -0
  598. package/.next/standalone/.next/server/chunks/[root-of-the-server]__6fe0c73e._.js +1 -1
  599. package/.next/standalone/.next/server/chunks/[root-of-the-server]__88e070f0._.js +1 -1
  600. package/.next/standalone/.next/server/chunks/[root-of-the-server]__98ce63c7._.js +1 -1
  601. package/.next/standalone/.next/server/chunks/[root-of-the-server]__9f6a4627._.js +1 -1
  602. package/.next/standalone/.next/server/chunks/[root-of-the-server]__b0d1e6e5._.js +22 -0
  603. package/.next/standalone/.next/server/chunks/[root-of-the-server]__c60fa3da._.js +22 -0
  604. package/.next/standalone/.next/server/chunks/[root-of-the-server]__c875b500._.js +3 -0
  605. package/.next/standalone/.next/server/chunks/[root-of-the-server]__c8b9af98._.js +1 -1
  606. package/.next/standalone/.next/server/chunks/[root-of-the-server]__cfcf074d._.js +3 -0
  607. package/.next/standalone/.next/server/chunks/[root-of-the-server]__d754b2c2._.js +3 -0
  608. package/.next/standalone/.next/server/chunks/[root-of-the-server]__e60b9568._.js +22 -0
  609. package/.next/standalone/.next/server/chunks/[root-of-the-server]__e8b9c639._.js +22 -0
  610. package/.next/standalone/.next/server/chunks/[root-of-the-server]__f30eea21._.js +3 -0
  611. package/.next/standalone/.next/server/chunks/_05c80664._.js +1 -1
  612. package/.next/standalone/.next/server/chunks/_0ce5f29d._.js +1 -1
  613. package/.next/standalone/.next/server/chunks/_0e34c123._.js +3 -3
  614. package/.next/standalone/.next/server/chunks/_1c2f3589._.js +1 -1
  615. package/.next/standalone/.next/server/chunks/{_1a32fa23._.js → _5090183e._.js} +2 -2
  616. package/.next/standalone/.next/server/chunks/{_e84c3e5f._.js → _6a203624._.js} +1 -1
  617. package/.next/standalone/.next/server/chunks/{_a0074544._.js → _70b9b972._.js} +1 -1
  618. package/.next/standalone/.next/server/chunks/_78c6471e._.js +1 -1
  619. package/.next/standalone/.next/server/chunks/_adf9e9c5._.js +1 -1
  620. package/.next/standalone/.next/server/chunks/_b172b746._.js +3 -3
  621. package/.next/standalone/.next/server/chunks/_cfa898f4._.js +1 -1
  622. package/.next/standalone/.next/server/chunks/{_547fcde4._.js → _d02fac80._.js} +2 -2
  623. package/.next/standalone/.next/server/chunks/_d043f698._.js +1 -1
  624. package/.next/standalone/.next/server/chunks/_next-internal_server_app_api_fleet_agent_route_actions_b98e2c99.js +3 -0
  625. package/.next/standalone/.next/server/chunks/_next-internal_server_app_api_modelconfig_pricing_route_actions_bca6856d.js +3 -0
  626. package/.next/standalone/.next/server/chunks/_next-internal_server_app_api_tags_[id]_route_actions_a6f8b324.js +3 -0
  627. package/.next/standalone/.next/server/chunks/_next-internal_server_app_api_tags_route_actions_caf13f5f.js +3 -0
  628. package/.next/standalone/.next/server/chunks/bec2d_app_api_observe_version-analysis_tags_[tagId]_traces_route_actions_ff37f2d3.js +3 -0
  629. package/.next/standalone/.next/server/chunks/ce889_server_app_api_observe_executions_[executionId]_tags_route_actions_08aa41a4.js +3 -0
  630. package/.next/standalone/.next/server/chunks/ce889_server_app_api_observe_version-analysis_compare_route_actions_b48ab573.js +3 -0
  631. package/.next/standalone/.next/server/chunks/src_lib_266d6cf4._.js +51 -0
  632. package/.next/standalone/.next/server/chunks/src_lib_5d95b500._.js +3 -0
  633. package/.next/standalone/.next/server/chunks/src_lib_67530201._.js +51 -0
  634. package/.next/standalone/.next/server/chunks/src_lib_9513f84d._.js +48 -0
  635. package/.next/standalone/.next/server/chunks/src_lib_9d09752c._.js +1 -1
  636. package/.next/standalone/.next/server/chunks/src_lib_a03a423b._.js +48 -0
  637. package/.next/standalone/.next/server/chunks/src_lib_a2a34aa6._.js +1 -1
  638. package/.next/standalone/.next/server/chunks/{src_lib_4751db31._.js → src_lib_dc72b90b._.js} +1 -1
  639. package/.next/standalone/.next/server/chunks/src_lib_ea85a447._.js +1 -1
  640. package/.next/standalone/.next/server/chunks/src_lib_engine_general-agent_970b1dfe._.js +2 -2
  641. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0eb5d21d._.js +3 -0
  642. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__83687057._.js +3 -0
  643. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__85e7edfe._.js +3 -0
  644. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__b8d3d1c3._.js +8 -0
  645. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__c69baa4a._.js +3 -0
  646. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__f82e551e._.js +3 -0
  647. package/.next/standalone/.next/server/chunks/ssr/_051b1443._.js +3 -0
  648. package/.next/standalone/.next/server/chunks/ssr/_0ae78458._.js +3 -0
  649. package/.next/standalone/.next/server/chunks/ssr/{_400d0da3._.js → _1278164d._.js} +2 -2
  650. package/.next/standalone/.next/server/chunks/ssr/_15e714f2._.js +3 -0
  651. package/.next/standalone/.next/server/chunks/ssr/_2f20fbfc._.js +3 -0
  652. package/.next/standalone/.next/server/chunks/ssr/_4e720925._.js +3 -0
  653. package/.next/standalone/.next/server/chunks/ssr/_5aa55aa6._.js +3 -0
  654. package/.next/standalone/.next/server/chunks/ssr/_8b68f69f._.js +3 -0
  655. package/.next/standalone/.next/server/chunks/ssr/_8d4b753e._.js +3 -0
  656. package/.next/standalone/.next/server/chunks/ssr/_976dfbab._.js +4 -0
  657. package/.next/standalone/.next/server/chunks/ssr/_aab048d0._.js +1 -1
  658. package/.next/standalone/.next/server/chunks/ssr/_be1ffbbf._.js +12 -0
  659. package/.next/standalone/.next/server/chunks/ssr/_c815e0e7._.js +4 -0
  660. package/.next/standalone/.next/server/chunks/ssr/_e4c81263._.js +3 -0
  661. package/.next/standalone/.next/server/chunks/ssr/{_a3d5f9bc._.js → _e5ee8977._.js} +2 -2
  662. package/.next/standalone/.next/server/chunks/ssr/_f634ea15._.js +12 -0
  663. package/.next/standalone/.next/server/chunks/ssr/_next-internal_server_app_(main)_version-analysis_page_actions_479d49a7.js +3 -0
  664. package/.next/standalone/.next/server/chunks/ssr/_next-internal_server_app_(main)_version-management_page_actions_aea5ae93.js +3 -0
  665. package/.next/standalone/.next/server/chunks/ssr/node_modules_11388c48._.js +3 -0
  666. package/.next/standalone/.next/server/chunks/ssr/node_modules_32596a86._.js +3 -0
  667. package/.next/standalone/.next/server/chunks/ssr/{node_modules_a443e166._.js → node_modules_3b1fd8eb._.js} +2 -2
  668. package/.next/standalone/.next/server/chunks/ssr/node_modules_7680a21d._.js +3 -0
  669. package/.next/standalone/.next/server/chunks/ssr/node_modules_bfffaa78._.js +3 -0
  670. package/.next/standalone/.next/server/chunks/ssr/node_modules_lucide-react_dist_esm_icons_2e7afafc._.js +3 -0
  671. package/.next/standalone/.next/server/chunks/ssr/node_modules_lucide-react_dist_esm_icons_cd0b182b._.js +3 -0
  672. package/.next/standalone/.next/server/chunks/ssr/src_app_(main)_accessconfig_install_page_tsx_6f4ef3fc._.js +3 -3
  673. package/.next/standalone/.next/server/chunks/ssr/src_app_(main)_dashboard_page_tsx_7eac7774._.js +1 -1
  674. package/.next/standalone/.next/server/chunks/ssr/src_app_(main)_fault_page_tsx_96431a5d._.js +2 -2
  675. package/.next/standalone/.next/server/chunks/ssr/src_app_(main)_metrics_page_tsx_f1599761._.js +1 -1
  676. package/.next/standalone/.next/server/chunks/ssr/src_app_(main)_modelconfig_registry_page_tsx_1ead2fd4._.js +1 -1
  677. package/.next/standalone/.next/server/chunks/ssr/src_app_(main)_quality_page_tsx_26bb8e80._.js +1 -1
  678. package/.next/standalone/.next/server/chunks/ssr/src_app_(main)_trace_page_tsx_41e7865d._.js +1 -1
  679. package/.next/standalone/.next/server/chunks/ssr/src_app_(main)_version-analysis_page_tsx_63ae8791._.js +3 -0
  680. package/.next/standalone/.next/server/chunks/ssr/src_app_(main)_version-management_page_tsx_87fe0372._.js +3 -0
  681. package/.next/standalone/.next/server/chunks/ssr/src_components_ui_select_tsx_4c0f64d8._.js +1 -1
  682. package/.next/standalone/.next/server/chunks/ssr/{src_lib_evaluators_7597c2fd._.js → src_lib_070bb60a._.js} +2 -2
  683. package/.next/standalone/.next/server/chunks/ssr/src_lib_client_locale-context_tsx_7184d9aa._.js +1 -1
  684. package/.next/standalone/.next/server/pages/404.html +1 -1
  685. package/.next/standalone/.next/server/pages/500.html +2 -2
  686. package/.next/standalone/.next/server/server-reference-manifest.js +1 -1
  687. package/.next/standalone/.next/server/server-reference-manifest.json +1 -1
  688. package/.next/standalone/.next/static/chunks/0257c68e82e9f2b0.js +1 -0
  689. package/.next/standalone/.next/static/chunks/{8754e0cf40813330.js → 06ac4297aa02f40a.js} +1 -1
  690. package/.next/standalone/.next/static/chunks/151b95e65092aa16.js +1 -0
  691. package/.next/standalone/.next/static/chunks/1624a1adcb73d784.js +1 -0
  692. package/.next/standalone/.next/static/chunks/1f173de64ad85757.js +10 -0
  693. package/.next/standalone/.next/static/chunks/{4dcd21eef469e66b.js → 2064add303799ffc.js} +1 -1
  694. package/.next/standalone/.next/static/chunks/2fb55cc737806639.js +1 -0
  695. package/.next/standalone/.next/static/chunks/3184105f3d2b47a1.js +10 -0
  696. package/.next/standalone/.next/static/chunks/379315313d164a57.js +1 -0
  697. package/.next/standalone/.next/static/chunks/39157b51ed6489eb.js +1 -0
  698. package/.next/standalone/.next/static/chunks/{dc22f906bd43e9a3.js → 46308ae9f83ac112.js} +3 -3
  699. package/.next/standalone/.next/static/chunks/4d2c017f2f4c9160.css +1 -0
  700. package/.next/standalone/.next/static/chunks/54538e1a80e53392.js +1 -0
  701. package/.next/standalone/.next/static/chunks/599fdc4cf6eb9e95.js +1 -0
  702. package/.next/standalone/.next/static/chunks/5be4d965983c6b40.js +6 -0
  703. package/.next/standalone/.next/static/chunks/63220d0acc5073cc.js +1 -0
  704. package/.next/standalone/.next/static/chunks/6da1d3424f804755.js +1 -0
  705. package/.next/standalone/.next/static/chunks/{04bc84975996b76d.js → 7884153c8f8649dd.js} +1 -1
  706. package/.next/{static/chunks/6b2552d3da7451ee.js → standalone/.next/static/chunks/85ce12a5c9536a2d.js} +1 -1
  707. package/.next/standalone/.next/static/chunks/8668d6f4c34d1e67.js +3 -0
  708. package/.next/standalone/.next/static/chunks/913c61f4f0a12da4.js +1 -0
  709. package/.next/standalone/.next/static/chunks/97822ca2c186f93d.js +1 -0
  710. package/.next/{static/chunks/96c7e2e47438553a.js → standalone/.next/static/chunks/98588c35b1e00bea.js} +1 -1
  711. package/.next/standalone/.next/static/chunks/a99fb4f44f9a41f3.js +1 -0
  712. package/.next/standalone/.next/static/chunks/b11e37b43e38eb95.js +1 -0
  713. package/.next/standalone/.next/static/chunks/b223106f6c610a67.js +1 -0
  714. package/.next/standalone/.next/static/chunks/cc9a7b6a8edabe81.js +1 -0
  715. package/.next/standalone/.next/static/chunks/cf0b4e5d7b804bf5.js +1 -0
  716. package/.next/standalone/.next/static/chunks/cfb3924a60d22c64.js +1 -0
  717. package/.next/standalone/.next/static/chunks/d15d7f6146b85000.js +1 -0
  718. package/.next/standalone/.next/static/chunks/dee90c3e29cd39bb.js +1 -0
  719. package/.next/standalone/.next/static/chunks/df6f2eedbe05162e.js +1 -0
  720. package/.next/standalone/.next/static/chunks/e0af9e5baf811284.js +4 -0
  721. package/.next/standalone/.next/static/chunks/f61ffd647f90b66c.js +1 -0
  722. package/.next/standalone/.next/static/chunks/{bf909bd0ff1898e4.js → f6954ae67d81050e.js} +1 -1
  723. package/.next/standalone/.next/static/chunks/fc7f5db841a7032a.js +1 -0
  724. package/.next/standalone/docker-compose.amd64.yml +2 -1
  725. package/.next/standalone/docker-compose.arm64.yml +11 -0
  726. package/.next/standalone/node_modules/.prisma/client/edge.js +26 -3
  727. package/.next/standalone/node_modules/.prisma/client/index-browser.js +23 -0
  728. package/.next/standalone/node_modules/.prisma/client/index.js +26 -3
  729. package/.next/standalone/node_modules/.prisma/client/package.json +1 -1
  730. package/.next/standalone/node_modules/.prisma/client/schema.prisma +39 -0
  731. package/.next/standalone/node_modules/.prisma/client/wasm.js +23 -0
  732. package/.next/standalone/package.json +1 -1
  733. package/.next/standalone/prisma/schema.prisma +38 -0
  734. package/.next/static/chunks/0257c68e82e9f2b0.js +1 -0
  735. package/.next/static/chunks/{8754e0cf40813330.js → 06ac4297aa02f40a.js} +1 -1
  736. package/.next/static/chunks/151b95e65092aa16.js +1 -0
  737. package/.next/static/chunks/1624a1adcb73d784.js +1 -0
  738. package/.next/static/chunks/1f173de64ad85757.js +10 -0
  739. package/.next/static/chunks/{4dcd21eef469e66b.js → 2064add303799ffc.js} +1 -1
  740. package/.next/static/chunks/2fb55cc737806639.js +1 -0
  741. package/.next/static/chunks/3184105f3d2b47a1.js +10 -0
  742. package/.next/static/chunks/379315313d164a57.js +1 -0
  743. package/.next/static/chunks/39157b51ed6489eb.js +1 -0
  744. package/.next/static/chunks/{dc22f906bd43e9a3.js → 46308ae9f83ac112.js} +3 -3
  745. package/.next/static/chunks/4d2c017f2f4c9160.css +1 -0
  746. package/.next/static/chunks/54538e1a80e53392.js +1 -0
  747. package/.next/static/chunks/599fdc4cf6eb9e95.js +1 -0
  748. package/.next/static/chunks/5be4d965983c6b40.js +6 -0
  749. package/.next/static/chunks/63220d0acc5073cc.js +1 -0
  750. package/.next/static/chunks/6da1d3424f804755.js +1 -0
  751. package/.next/static/chunks/{04bc84975996b76d.js → 7884153c8f8649dd.js} +1 -1
  752. package/.next/{standalone/.next/static/chunks/6b2552d3da7451ee.js → static/chunks/85ce12a5c9536a2d.js} +1 -1
  753. package/.next/static/chunks/8668d6f4c34d1e67.js +3 -0
  754. package/.next/static/chunks/913c61f4f0a12da4.js +1 -0
  755. package/.next/static/chunks/97822ca2c186f93d.js +1 -0
  756. package/.next/{standalone/.next/static/chunks/96c7e2e47438553a.js → static/chunks/98588c35b1e00bea.js} +1 -1
  757. package/.next/static/chunks/a99fb4f44f9a41f3.js +1 -0
  758. package/.next/static/chunks/b11e37b43e38eb95.js +1 -0
  759. package/.next/static/chunks/b223106f6c610a67.js +1 -0
  760. package/.next/static/chunks/cc9a7b6a8edabe81.js +1 -0
  761. package/.next/static/chunks/cf0b4e5d7b804bf5.js +1 -0
  762. package/.next/static/chunks/cfb3924a60d22c64.js +1 -0
  763. package/.next/static/chunks/d15d7f6146b85000.js +1 -0
  764. package/.next/static/chunks/dee90c3e29cd39bb.js +1 -0
  765. package/.next/static/chunks/df6f2eedbe05162e.js +1 -0
  766. package/.next/static/chunks/e0af9e5baf811284.js +4 -0
  767. package/.next/static/chunks/f61ffd647f90b66c.js +1 -0
  768. package/.next/static/chunks/{bf909bd0ff1898e4.js → f6954ae67d81050e.js} +1 -1
  769. package/.next/static/chunks/fc7f5db841a7032a.js +1 -0
  770. package/package.json +1 -1
  771. package/prisma/schema.prisma +38 -0
  772. package/.next/standalone/.next/server/chunks/[root-of-the-server]__2574e6ed._.js +0 -3
  773. package/.next/standalone/.next/server/chunks/[root-of-the-server]__2710fb53._.js +0 -3
  774. package/.next/standalone/.next/server/chunks/[root-of-the-server]__8cc92af1._.js +0 -3
  775. package/.next/standalone/.next/server/chunks/[root-of-the-server]__9d2e5f60._.js +0 -3
  776. package/.next/standalone/.next/server/chunks/[root-of-the-server]__bd3dc3ab._.js +0 -3
  777. package/.next/standalone/.next/server/chunks/src_lib_6cb48964._.js +0 -32
  778. package/.next/standalone/.next/server/chunks/src_lib_a3155704._.js +0 -3
  779. package/.next/standalone/.next/server/chunks/src_lib_baaf83ef._.js +0 -29
  780. package/.next/standalone/.next/server/chunks/src_lib_bf0ee699._.js +0 -32
  781. package/.next/standalone/.next/server/chunks/src_lib_dbf3c792._.js +0 -29
  782. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__2ec2bb09._.js +0 -3
  783. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__3cb83dc3._.js +0 -3
  784. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__c9cf8076._.js +0 -8
  785. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__fc94ba06._.js +0 -3
  786. package/.next/standalone/.next/server/chunks/ssr/_0141e5c7._.js +0 -3
  787. package/.next/standalone/.next/server/chunks/ssr/_0acdaaae._.js +0 -3
  788. package/.next/standalone/.next/server/chunks/ssr/_231821bd._.js +0 -3
  789. package/.next/standalone/.next/server/chunks/ssr/_5d1f8671._.js +0 -12
  790. package/.next/standalone/.next/server/chunks/ssr/_8bba8b8d._.js +0 -3
  791. package/.next/standalone/.next/server/chunks/ssr/_96725836._.js +0 -12
  792. package/.next/standalone/.next/server/chunks/ssr/_b08dc931._.js +0 -3
  793. package/.next/standalone/.next/server/chunks/ssr/_c4db9cec._.js +0 -3
  794. package/.next/standalone/.next/server/chunks/ssr/node_modules_8bfa35b3._.js +0 -3
  795. package/.next/standalone/.next/server/chunks/ssr/node_modules_lucide-react_dist_esm_icons_30858f09._.js +0 -3
  796. package/.next/standalone/.next/server/chunks/ssr/node_modules_lucide-react_dist_esm_icons_f1e06ad8._.js +0 -3
  797. package/.next/standalone/.next/static/chunks/0b6bd84bf10579a4.js +0 -10
  798. package/.next/standalone/.next/static/chunks/0bca64d67dceae3f.js +0 -1
  799. package/.next/standalone/.next/static/chunks/16047b19dda5c90d.js +0 -10
  800. package/.next/standalone/.next/static/chunks/3a0f454536f3ebc8.js +0 -1
  801. package/.next/standalone/.next/static/chunks/3d19f62114122bd3.js +0 -1
  802. package/.next/standalone/.next/static/chunks/3d6127f72467176d.js +0 -1
  803. package/.next/standalone/.next/static/chunks/44545e70bb7a33b8.js +0 -1
  804. package/.next/standalone/.next/static/chunks/4e52a5c5e332595a.js +0 -1
  805. package/.next/standalone/.next/static/chunks/6238734a2f04b1f9.js +0 -1
  806. package/.next/standalone/.next/static/chunks/66b23011cd8544ad.js +0 -1
  807. package/.next/standalone/.next/static/chunks/7a758615e3d35d6d.js +0 -1
  808. package/.next/standalone/.next/static/chunks/7a7dc24eed0484dc.js +0 -1
  809. package/.next/standalone/.next/static/chunks/7d4fa817c5229801.js +0 -1
  810. package/.next/standalone/.next/static/chunks/8f18a711543d804a.js +0 -1
  811. package/.next/standalone/.next/static/chunks/9155a6c07dc0502d.js +0 -6
  812. package/.next/standalone/.next/static/chunks/94fdb955b1dc512a.js +0 -1
  813. package/.next/standalone/.next/static/chunks/97b8d7ea5d04e2a2.js +0 -1
  814. package/.next/standalone/.next/static/chunks/a31bf4e176b5e90c.js +0 -3
  815. package/.next/standalone/.next/static/chunks/b9597989b5b0abd3.js +0 -1
  816. package/.next/standalone/.next/static/chunks/d170174df1128338.js +0 -1
  817. package/.next/standalone/.next/static/chunks/d91c2c0bbe0b59ab.js +0 -1
  818. package/.next/standalone/.next/static/chunks/e159d293fc72e91b.css +0 -1
  819. package/.next/standalone/.next/static/chunks/e45a4e085c7ce03c.js +0 -1
  820. package/.next/standalone/.next/static/chunks/efe225251ea151f0.js +0 -4
  821. package/.next/standalone/.next/static/chunks/ffd21617593aaafd.js +0 -1
  822. package/.next/static/chunks/0b6bd84bf10579a4.js +0 -10
  823. package/.next/static/chunks/0bca64d67dceae3f.js +0 -1
  824. package/.next/static/chunks/16047b19dda5c90d.js +0 -10
  825. package/.next/static/chunks/3a0f454536f3ebc8.js +0 -1
  826. package/.next/static/chunks/3d19f62114122bd3.js +0 -1
  827. package/.next/static/chunks/3d6127f72467176d.js +0 -1
  828. package/.next/static/chunks/44545e70bb7a33b8.js +0 -1
  829. package/.next/static/chunks/4e52a5c5e332595a.js +0 -1
  830. package/.next/static/chunks/6238734a2f04b1f9.js +0 -1
  831. package/.next/static/chunks/66b23011cd8544ad.js +0 -1
  832. package/.next/static/chunks/7a758615e3d35d6d.js +0 -1
  833. package/.next/static/chunks/7a7dc24eed0484dc.js +0 -1
  834. package/.next/static/chunks/7d4fa817c5229801.js +0 -1
  835. package/.next/static/chunks/8f18a711543d804a.js +0 -1
  836. package/.next/static/chunks/9155a6c07dc0502d.js +0 -6
  837. package/.next/static/chunks/94fdb955b1dc512a.js +0 -1
  838. package/.next/static/chunks/97b8d7ea5d04e2a2.js +0 -1
  839. package/.next/static/chunks/a31bf4e176b5e90c.js +0 -3
  840. package/.next/static/chunks/b9597989b5b0abd3.js +0 -1
  841. package/.next/static/chunks/d170174df1128338.js +0 -1
  842. package/.next/static/chunks/d91c2c0bbe0b59ab.js +0 -1
  843. package/.next/static/chunks/e159d293fc72e91b.css +0 -1
  844. package/.next/static/chunks/e45a4e085c7ce03c.js +0 -1
  845. package/.next/static/chunks/efe225251ea151f0.js +0 -4
  846. package/.next/static/chunks/ffd21617593aaafd.js +0 -1
  847. /package/.next/standalone/.next/static/{iE8084jR9Kgb7Bhs3Xokh → pzAy0mrZCL0PmE4h3HDut}/_buildManifest.js +0 -0
  848. /package/.next/standalone/.next/static/{iE8084jR9Kgb7Bhs3Xokh → pzAy0mrZCL0PmE4h3HDut}/_clientMiddlewareManifest.json +0 -0
  849. /package/.next/standalone/.next/static/{iE8084jR9Kgb7Bhs3Xokh → pzAy0mrZCL0PmE4h3HDut}/_ssgManifest.js +0 -0
  850. /package/.next/static/{iE8084jR9Kgb7Bhs3Xokh → pzAy0mrZCL0PmE4h3HDut}/_buildManifest.js +0 -0
  851. /package/.next/static/{iE8084jR9Kgb7Bhs3Xokh → pzAy0mrZCL0PmE4h3HDut}/_clientMiddlewareManifest.json +0 -0
  852. /package/.next/static/{iE8084jR9Kgb7Bhs3Xokh → pzAy0mrZCL0PmE4h3HDut}/_ssgManifest.js +0 -0
@@ -4,6 +4,6 @@ module.exports=[503978,a=>{"use strict";var b=a.i(187924),c=a.i(50944),d=a.i(572
4
4
  {{reference_output}}:预期输出
5
5
  {{trajectory}}:trace 轨迹
6
6
 
7
- 这些字段都不是必填;目前仅支持以上四个变量。评估器最终需要输出 score 和 reason。`,q=()=>({name:"",description:"",systemPrompt:"",userPrompt:"",userPromptEnabled:!1});function r(){return{query:"",evaluatorTypes:[],targetTypes:[],objectives:[]}}function s(){return{nameQuery:"",creator:"all",typeFilter:""}}function t(a,b){return a.includes(b)?a.filter(a=>a!==b):[...a,b]}function u(){let{user:a}=(0,g.useAuth)(),e=(0,c.useRouter)(),[h,i]=(0,d.useState)([]),[p,u]=(0,d.useState)(!1),[B,F]=(0,d.useState)("custom"),[G,H]=(0,d.useState)(r),[I,J]=(0,d.useState)(s),[K,L]=(0,d.useState)(q),[M,N]=(0,d.useState)(null),[O,P]=(0,d.useState)("grid"),[Q,R]=(0,d.useState)(!0),[S,T]=(0,d.useState)(""),[U,V]=(0,d.useState)(null),[W,X]=(0,d.useState)(null);(0,d.useEffect)(()=>{a||(i([]),u(!1))},[a]),(0,d.useEffect)(()=>{if(!a)return;let b=!1;return(async()=>{try{let c=[],[d,e]=await Promise.allSettled([(0,f.apiFetch)(`/api/user-evaluators?user=${encodeURIComponent(a)}`),(0,f.apiFetch)(`/api/eval/settings?user=${encodeURIComponent(a)}`)]);if("fulfilled"===d.status&&d.value.ok)try{let a=await d.value.json();Array.isArray(a)&&(c=a)}catch{}if("fulfilled"===e.status&&e.value.ok)try{let a=await e.value.json(),c=a?.activeConfigId,d=Array.isArray(a?.configs)?a.configs:[],f=c?d.find(a=>a.id===c):null;b||X(f?{id:f.id,name:f.name||"(unnamed)",model:f.model||"(unknown)"}:null)}catch{}b||(i(c),u(!0))}catch(a){b||T(a instanceof Error?a.message:"评估器数据加载失败")}finally{b||R(!1)}})(),()=>{b=!0}},[a]),(0,d.useEffect)(()=>{if(!a||!p)return;let b=window.setTimeout(()=>{(0,f.apiFetch)("/api/user-evaluators",{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify({user:a,evaluators:h})}).catch(()=>{})},600);return()=>window.clearTimeout(b)},[a,p,h]);let Y=(0,d.useMemo)(()=>"preset"===B?k.presetEvaluators.filter(a=>{let b,c;return b=G.query.trim().toLowerCase(),c=`${a.name} ${a.description} ${a.mappedMetrics.join(" ")}`.toLowerCase(),(!b||!!c.includes(b))&&(!(G.evaluatorTypes.length>0)||!!G.evaluatorTypes.includes(a.evaluatorType))&&(!(G.targetTypes.length>0)||!!G.targetTypes.some(b=>a.targetTypes.includes(b)))&&(!(G.objectives.length>0)||!!G.objectives.some(b=>a.objectives.includes(b)))}):h.filter(b=>{let c,d;return c=I.nameQuery.trim().toLowerCase(),d=`${b.name} ${b.description} ${b.mappedMetrics.join(" ")}`.toLowerCase(),(!c||!!d.includes(c))&&(!I.typeFilter||b.evaluatorType===I.typeFilter)&&("mine"!==I.creator||!a||b.creator===a)}),[B,h,G,I,a]),Z=(0,d.useMemo)(()=>({presetCount:k.presetEvaluators.length,customCount:h.length,readyCount:h.filter(a=>"ready"===a.status).length}),[h]),$=()=>{L(q()),N("llm"),T("")},_=a=>{F(a),N(null),V(null)},aa=async b=>{if(!a||"custom"!==b.source||!globalThis.confirm(`确定删除评估器「${b.name}」?`))return;T("");let c=h.filter(a=>a.id!==b.id);i(c);try{let b=await (0,f.apiFetch)("/api/user-evaluators",{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify({user:a,evaluators:c})}),d=await b.json().catch(()=>({}));if(!b.ok||d?.success===!1)throw Error("删除失败")}catch(a){i(h),T(a instanceof Error?a.message:"删除失败")}};return Q?(0,b.jsx)("div",{className:"loading",children:"正在整理评估器视图..."}):(0,b.jsxs)("div",{style:{padding:"18px 22px 28px",maxWidth:1500,margin:"0 auto"},children:[S&&(0,b.jsx)("div",{className:"ai-card",style:{padding:12,color:"var(--error)",marginBottom:14},children:S}),(0,b.jsxs)("div",{style:{display:"flex",alignItems:"flex-start",justifyContent:"space-between",gap:16,marginBottom:10,flexWrap:"wrap"},children:[(0,b.jsxs)("div",{style:{minWidth:280,flex:1},children:[(0,b.jsxs)("div",{style:{display:"flex",alignItems:"center",gap:8,marginBottom:6},children:[(0,b.jsx)("span",{className:"ai-badge ai-badge-b",children:"Evaluators"}),"preset"===B&&(0,b.jsx)("span",{style:{color:"var(--foreground-muted)",fontSize:11},children:"预置模板库"}),"custom"===B&&null===M&&(0,b.jsx)("span",{style:{color:"var(--foreground-muted)",fontSize:11},children:"自建评估方案"})]}),(0,b.jsx)("h1",{style:{margin:0,fontSize:22,lineHeight:1.2,fontWeight:600,color:"var(--foreground)"},children:"评估器"}),null===M&&(0,b.jsx)("p",{style:{margin:"6px 0 0",color:"var(--foreground-secondary)",fontSize:12.5,maxWidth:820},children:"custom"===B?"管理自建 LLM 评估器,配置会保存到服务端。点击卡片可进入详情编辑。":"预置评估器模板库:按类型与场景筛选,点击可查看详情与执行入口。"})]}),"preset"===B&&(0,b.jsx)("div",{style:{display:"flex",gap:8,alignItems:"center"},children:(0,b.jsx)("button",{type:"button",className:"ai-btn-s",onClick:()=>window.location.reload(),children:"刷新"})})]}),"preset"===B&&(0,b.jsxs)("div",{style:{display:"grid",gridTemplateColumns:"repeat(3, minmax(160px, 1fr))",gap:10,marginBottom:14},children:[(0,b.jsx)(v,{label:"预置评估器",value:String(Z.presetCount),detail:"LLM 评估器模板"}),(0,b.jsx)(v,{label:"自建评估器",value:String(Z.customCount),detail:"已保存至账号"}),(0,b.jsx)(v,{label:"可用评估器",value:String(Z.readyCount),detail:"状态为已就绪"})]}),(0,b.jsxs)("div",{style:{borderBottom:"1px solid var(--border)",marginBottom:0,display:"flex",gap:2},children:[(0,b.jsx)(w,{active:"custom"===B,onClick:()=>_("custom"),children:"自建评估器"}),(0,b.jsx)(w,{active:"preset"===B,onClick:()=>_("preset"),children:"预置评估器"})]}),"custom"===B&&"llm"===M?(0,b.jsx)(C,{draft:K,onChange:L,onBack:()=>{N(null),L(q()),T("")},onSubmit:()=>{let b=K.name.trim();if(!b)return void T("请填写评估器名称");if(!(0,l.isValidCustomEvaluatorName)(b))return void T("名称会作为链路追踪中的 agent 名称:必须以英文字母开头,仅支持字母、数字、下划线、连字符");if(!K.systemPrompt.trim())return void T("请填写 System Prompt");let c=(0,l.findUnsupportedCustomEvaluatorVariables)(K.systemPrompt);if(c.length>0)return void T(`System Prompt 仅支持 {{input}}、{{output}}、{{reference_output}}、{{trajectory}},不支持:${c.map(a=>`{{${a}}}`).join("、")}`);let d={model:W?.model||"",systemPrompt:K.systemPrompt.trim(),userPrompt:K.userPrompt.trim()},e={id:`custom-${Date.now()}`,name:b,description:K.description.trim()||"自建 LLM 评估器。",evaluatorType:"LLM",source:"custom",targetTypes:["结果"],objectives:["任务完成","内容质量"],scenarios:["Agent通用评测"],runMode:"LLM Judge",scoreRange:"0-1",popularity:0,mappedMetrics:d.model?["LLM 评测",d.model]:["LLM 评测"],status:"draft",creator:a||void 0,llmConfig:d};i(a=>[e,...a]),N(null),L(q()),F("custom"),T("")}}):"custom"===B?(0,b.jsxs)("div",{style:{paddingTop:16},children:[(0,b.jsxs)("div",{style:{display:"flex",flexWrap:"wrap",alignItems:"center",gap:10,marginBottom:16,justifyContent:"space-between"},children:[(0,b.jsxs)("div",{style:{display:"flex",flexWrap:"wrap",gap:10,flex:1,minWidth:280},children:[(0,b.jsx)("input",{value:I.nameQuery,onChange:a=>J(b=>({...b,nameQuery:a.target.value})),placeholder:"搜索名称",style:{minWidth:160,flex:"1 1 160px",maxWidth:280,height:34,borderRadius:8,border:"1px solid var(--input-border)",background:"var(--input-bg)",color:"var(--foreground)",padding:"0 12px",fontSize:12.5}}),(0,b.jsxs)("select",{value:I.typeFilter,onChange:a=>J(b=>({...b,typeFilter:a.target.value})),style:{height:34,borderRadius:8,border:"1px solid var(--input-border)",background:"var(--input-bg)",color:"var(--foreground)",padding:"0 10px",fontSize:12.5,minWidth:140},children:[(0,b.jsx)("option",{value:"",children:"请选择类型"}),(0,b.jsx)("option",{value:"LLM",children:"LLM"})]})]}),(0,b.jsxs)("div",{style:{display:"flex",alignItems:"center",gap:8},children:[(0,b.jsx)("button",{type:"button",className:"ai-btn-s",title:"刷新",onClick:()=>window.location.reload(),children:"↻"}),(0,b.jsx)("button",{type:"button",className:"ai-btn-s",title:"grid"===O?"切换列表":"切换网格",onClick:()=>P(a=>"grid"===a?"list":"grid"),children:"grid"===O?"≡":"⊞"}),(0,b.jsx)("button",{type:"button",className:"ai-btn-p",onClick:$,children:"+ 新建评估器"})]})]}),0===Y.length?(0,b.jsx)(E,{onCreateLlm:$}):"grid"===O?(0,b.jsx)("div",{style:{display:"grid",gridTemplateColumns:"repeat(2, minmax(320px, 1fr))",gap:12},children:Y.map(a=>(0,b.jsx)(z,{card:a,activeTab:B,activeModel:W,onModelConfigClick:()=>e.push("/modelconfig/defaults"),onDeleteCustom:aa},a.id))}):(0,b.jsx)("div",{style:{display:"flex",flexDirection:"column",gap:8},children:Y.map(a=>(0,b.jsx)(A,{card:a,onOpen:()=>e.push(`/metrics/evaluators/${encodeURIComponent(a.id)}`),onDeleteCustom:aa},a.id))})]}):(0,b.jsxs)("div",{style:{display:"grid",gridTemplateColumns:"300px minmax(0, 1fr)",minHeight:620},children:[(0,b.jsxs)("aside",{style:{borderRight:"1px solid var(--border)",padding:"16px 18px 16px 0"},children:[(0,b.jsxs)("div",{style:{display:"flex",justifyContent:"space-between",alignItems:"center",marginBottom:14},children:[(0,b.jsx)("div",{className:"ai-section-title",children:"评估器筛选"}),(0,b.jsx)("button",{type:"button",className:"ai-btn-s",onClick:()=>H(r()),children:"清空"})]}),(0,b.jsx)(x,{title:"类型",options:m,values:G.evaluatorTypes,onToggle:a=>H(b=>({...b,evaluatorTypes:t(b.evaluatorTypes,a)}))}),(0,b.jsx)(x,{title:"场景",options:n,values:G.targetTypes,onToggle:a=>H(b=>({...b,targetTypes:t(b.targetTypes,a)}))}),(0,b.jsx)(x,{title:"评估目标",options:o,values:G.objectives,onToggle:a=>H(b=>({...b,objectives:t(b.objectives,a)}))})]}),(0,b.jsxs)("main",{style:{padding:16},children:[(0,b.jsx)("div",{style:{marginBottom:14},children:(0,b.jsx)("input",{value:G.query,onChange:a=>H(b=>({...b,query:a.target.value})),placeholder:"搜索评估器名称、说明或指标",style:{width:"100%",height:34,borderRadius:8,border:"1px solid var(--input-border)",background:"var(--input-bg)",color:"var(--foreground)",padding:"0 12px",fontSize:12.5}})}),0===Y.length?(0,b.jsx)(D,{}):(0,b.jsx)("div",{style:{display:"grid",gridTemplateColumns:"repeat(2, minmax(320px, 1fr))",gap:12},children:Y.map(a=>(0,b.jsx)(z,{card:a,activeTab:B,onInspectPreset:V,activeModel:W,onModelConfigClick:()=>e.push("/modelconfig/defaults"),onDeleteCustom:aa},a.id))})]})]}),U&&j[U.id]?(0,b.jsx)(y,{card:U,detail:j[U.id],onClose:()=>V(null)}):null]})}function v({label:a,value:c,detail:d}){return(0,b.jsxs)("div",{className:"ai-stat",style:{minHeight:74},children:[(0,b.jsx)("div",{className:"ai-stat-lbl",children:a}),(0,b.jsx)("div",{className:"ai-stat-val",children:c}),(0,b.jsx)("div",{className:"ai-stat-d",style:{color:"var(--foreground-muted)"},children:d})]})}function w({active:a,children:c,onClick:d}){return(0,b.jsx)("button",{type:"button",onClick:d,style:{height:36,padding:"0 16px",border:"1px solid var(--border)",borderBottom:a?"2px solid var(--primary)":"1px solid var(--border)",background:a?"var(--background)":"var(--background-secondary)",color:a?"var(--primary)":"var(--foreground)",fontWeight:a?600:400,cursor:"pointer",borderRadius:"7px 7px 0 0",marginBottom:-1},children:c})}function x({title:a,options:c,values:d,onToggle:e}){return(0,b.jsxs)("div",{style:{marginBottom:18},children:[(0,b.jsx)("div",{style:{color:"var(--foreground-secondary)",fontSize:12,marginBottom:9},children:a}),(0,b.jsx)("div",{style:{display:"flex",flexWrap:"wrap",gap:8},children:c.map(a=>{let c=d.includes(a);return(0,b.jsx)("button",{type:"button",onClick:()=>e(a),style:{minHeight:34,padding:"0 16px",borderRadius:8,border:`1px solid ${c?"var(--primary-subtle-border)":"var(--border)"}`,background:c?"var(--primary-subtle)":"var(--background)",color:c?"var(--primary)":"var(--foreground-secondary)",cursor:"pointer",fontSize:12.5},children:a},a)})})]})}function y({card:a,detail:c,onClose:e}){(0,d.useEffect)(()=>{let a=a=>{"Escape"===a.key&&e()};return window.addEventListener("keydown",a),()=>window.removeEventListener("keydown",a)},[e]);let f=c.systemPrompt??"";async function g(){try{f&&await navigator.clipboard.writeText(f)}catch{}}let h=[...c.mediaTags??[],a.evaluatorType,...a.objectives.slice(0,2),...a.scenarios.slice(0,1)];return(0,b.jsx)("div",{role:"dialog","aria-modal":"true","aria-labelledby":"preset-inspect-title",style:{position:"fixed",inset:0,zIndex:100,display:"flex",alignItems:"flex-start",justifyContent:"center",padding:"24px 16px",overflowY:"auto",background:"rgba(0,0,0,0.45)"},onClick:e,children:(0,b.jsxs)("div",{className:"ai-card",style:{width:"100%",maxWidth:720,marginTop:12,marginBottom:40,padding:22,position:"relative",maxHeight:"92vh",overflowY:"auto",boxShadow:"var(--shadow)"},onClick:a=>a.stopPropagation(),children:[(0,b.jsxs)("div",{style:{display:"flex",justifyContent:"space-between",alignItems:"flex-start",gap:12,marginBottom:16},children:[(0,b.jsx)("h2",{id:"preset-inspect-title",style:{margin:0,fontSize:18,fontWeight:650,color:"var(--foreground)"},children:a.name}),(0,b.jsx)("button",{type:"button",className:"ai-btn-s","aria-label":"关闭",onClick:e,children:"×"})]}),(0,b.jsx)("div",{style:{display:"flex",flexWrap:"wrap",gap:6,marginBottom:14},children:h.map((a,c)=>(0,b.jsx)("span",{style:{background:"var(--background-tertiary)",color:"var(--foreground-secondary)",borderRadius:6,padding:"4px 9px",fontSize:11},children:a},`${a}-${c}`))}),(0,b.jsxs)("section",{style:{marginBottom:18},children:[(0,b.jsx)("div",{style:{fontSize:12.5,fontWeight:600,marginBottom:8,color:"var(--foreground)"},children:"应用场景"}),(0,b.jsx)("p",{style:{margin:0,fontSize:13,lineHeight:1.65,color:"var(--foreground-secondary)"},children:c.applicationScenario})]}),"llm"===c.kind&&f?(0,b.jsxs)("section",{style:{marginBottom:18},children:[(0,b.jsxs)("div",{style:{display:"flex",justifyContent:"space-between",alignItems:"center",marginBottom:8},children:[(0,b.jsx)("span",{style:{fontSize:12.5,fontWeight:600,color:"var(--foreground)"},children:"Prompt"}),(0,b.jsx)("button",{type:"button",className:"ai-btn-s",onClick:()=>g(),children:"复制 System"})]}),(0,b.jsxs)("div",{style:{border:"1px solid var(--border)",borderRadius:8,background:"var(--background-secondary)",padding:"12px 14px"},children:[(0,b.jsx)("div",{style:{fontSize:11,color:"var(--foreground-muted)",marginBottom:8},children:"System"}),(0,b.jsx)("pre",{style:{margin:0,whiteSpace:"pre-wrap",wordBreak:"break-word",fontSize:12.5,lineHeight:1.55,color:"var(--foreground)",fontFamily:"ui-monospace, monospace"},children:f})]}),(c.variables?.length??0)>0?(0,b.jsxs)("div",{style:{marginTop:12},children:[(0,b.jsx)("div",{style:{fontSize:12,fontWeight:600,marginBottom:6,color:"var(--foreground)"},children:"Variables"}),(0,b.jsx)("div",{style:{display:"flex",flexWrap:"wrap",gap:8},children:c.variables.map(a=>(0,b.jsx)("code",{style:{fontSize:12,padding:"4px 8px",borderRadius:6,background:"var(--background-tertiary)",color:"var(--primary)"},children:`{{${a}}}`},a))})]}):null]}):null,("code"===c.kind||"rpc"===c.kind)&&(0,b.jsxs)("section",{style:{marginBottom:18},children:[(0,b.jsx)("div",{style:{fontSize:12.5,fontWeight:600,marginBottom:8,color:"var(--foreground)"},children:"code"===c.kind?"规则 / 脚本说明":"RPC 契约"}),c.implementationNote?(0,b.jsx)("p",{style:{margin:"0 0 12px",fontSize:13,lineHeight:1.65,color:"var(--foreground-secondary)"},children:c.implementationNote}):null,c.codeOrContractExample?(0,b.jsx)("pre",{style:{margin:0,padding:"12px 14px",borderRadius:8,border:"1px solid var(--border)",background:"var(--input-bg)",fontSize:12,lineHeight:1.45,overflowX:"auto",whiteSpace:"pre-wrap",wordBreak:"break-word",fontFamily:"ui-monospace, monospace"},children:c.codeOrContractExample}):null]}),(0,b.jsxs)("section",{style:{marginBottom:18,padding:14,borderRadius:8,background:"var(--background-secondary)",border:"1px solid var(--border)"},children:[(0,b.jsx)("div",{style:{display:"flex",alignItems:"center",gap:6,marginBottom:10},children:(0,b.jsx)("span",{style:{fontSize:12.5,fontWeight:600},children:"输出"})}),(0,b.jsxs)("p",{style:{margin:"0 0 10px",fontSize:12.5,lineHeight:1.65,color:"var(--foreground-secondary)"},children:[(0,b.jsx)("strong",{style:{color:"var(--foreground)"},children:"得分:"}),c.outputScoreText]}),(0,b.jsxs)("p",{style:{margin:0,fontSize:12.5,lineHeight:1.65,color:"var(--foreground-secondary)"},children:[(0,b.jsx)("strong",{style:{color:"var(--foreground)"},children:"原因:"}),c.outputReasonText]})]}),(0,b.jsx)("div",{style:{display:"flex",gap:8,justifyContent:"flex-end",flexWrap:"wrap"},children:(0,b.jsx)("button",{type:"button",className:"ai-btn-s",onClick:e,children:"关闭"})})]})})}function z({card:a,activeTab:d,onInspectPreset:e,activeModel:f,onModelConfigClick:g,onDeleteCustom:h}){let i=(0,c.useRouter)(),k="preset"===a.source&&!!j[a.id],l=()=>{"preset"===d&&k&&e?.(a)},m=()=>{"custom"===d&&i.push(`/metrics/evaluators/${encodeURIComponent(a.id)}`)},n="preset"===d&&k||"custom"===d;return(0,b.jsxs)("article",{className:"ai-card",role:n?"button":void 0,tabIndex:n?0:void 0,onClick:a=>{a.target.closest("button")||("preset"===d&&k?l():"custom"===d&&m())},onKeyDown:a=>{n&&("Enter"===a.key||" "===a.key)&&(a.preventDefault(),"preset"===d&&k?l():"custom"===d&&m())},style:{padding:16,minHeight:176,display:"flex",flexDirection:"column",gap:12,cursor:n?"pointer":void 0},children:[(0,b.jsxs)("div",{style:{display:"flex",justifyContent:"space-between",gap:10},children:[(0,b.jsxs)("div",{children:[(0,b.jsx)("h3",{style:{margin:0,color:"var(--foreground)",fontSize:15.5,fontWeight:600},children:a.name}),(0,b.jsx)("p",{style:{margin:"8px 0 0",color:"var(--foreground-secondary)",fontSize:12.5,lineHeight:1.6},children:a.description}),"preset"===d&&k?(0,b.jsx)("p",{style:{margin:"4px 0 0",fontSize:11,color:"var(--foreground-muted)"},children:"点击查看详情"}):null,"custom"===d?(0,b.jsx)("p",{style:{margin:"4px 0 0",fontSize:11,color:"var(--foreground-muted)"},children:"点击查看或编辑"}):null]}),(0,b.jsx)("span",{className:`ai-badge ${"Code"===a.evaluatorType?"ai-badge-b":"Custom RPC"===a.evaluatorType?"ai-badge-g":"ai-badge-gr"}`,style:{height:22,whiteSpace:"nowrap"},children:a.evaluatorType})]}),(0,b.jsx)("div",{style:{display:"flex",flexWrap:"wrap",gap:6},children:[a.runMode,...a.targetTypes,...a.objectives,...a.scenarios.slice(0,2)].map(a=>(0,b.jsx)("span",{style:{background:"var(--background-tertiary)",color:"var(--foreground-secondary)",borderRadius:4,padding:"3px 7px",fontSize:11},children:a},a))}),(0,b.jsx)("div",{style:{marginTop:"auto"},children:(0,b.jsx)(B,{label:"评分",value:a.scoreRange})}),a.runtimeHref?(0,b.jsxs)("div",{style:{display:"flex",alignItems:"center",gap:6,padding:"6px 8px",background:"var(--background-secondary)",border:"1px solid var(--border)",borderRadius:6,fontSize:11},onClick:a=>a.stopPropagation(),children:[(0,b.jsx)("span",{style:{color:"var(--foreground-muted)"},children:"运行模型:"}),f?(0,b.jsxs)(b.Fragment,{children:[(0,b.jsx)("span",{style:{fontWeight:600,color:"var(--foreground)"},children:f.name}),(0,b.jsxs)("span",{style:{color:"var(--foreground-muted)",fontFamily:"monospace"},children:["· ",f.model]}),(0,b.jsx)("span",{style:{color:"var(--foreground-muted)"},children:"(来自全局默认)"})]}):(0,b.jsx)("span",{style:{color:"var(--error)",fontWeight:500},children:"未配置"}),(0,b.jsx)("span",{style:{flex:1}}),g?(0,b.jsx)("button",{type:"button",className:"ai-btn-s",style:{fontSize:10.5,padding:"2px 8px"},onClick:a=>{a.stopPropagation(),g()},children:f?"修改":"去配置"}):null]}):null,(0,b.jsxs)("div",{style:{display:"flex",justifyContent:"space-between",gap:8,alignItems:"center"},children:[(0,b.jsx)("div",{style:{display:"flex",alignItems:"center",gap:6,flexWrap:"wrap"},children:(0,b.jsx)("span",{className:`ai-badge ${"ready"===a.status?"ai-badge-g":"draft"===a.status?"ai-badge-gr":"ai-badge-b"}`,children:"ready"===a.status?"已就绪":"draft"===a.status?"草稿":"预置"})}),(0,b.jsxs)("div",{style:{display:"flex",alignItems:"center",gap:6},children:["custom"===d&&h?(0,b.jsx)("button",{type:"button",className:"ai-btn-s",style:{color:"var(--error)"},onClick:b=>{b.stopPropagation(),h(a)},children:"删除"}):null,a.runtimeHref?(0,b.jsx)("button",{type:"button",className:"ai-btn-sp",onClick:b=>{b.stopPropagation();let c=new URL(a.runtimeHref,window.location.origin);c.searchParams.set("evaluatorId",a.id),i.push(c.pathname+c.search)},style:{whiteSpace:"nowrap"},children:"前往评测执行 →"}):null]})]})]})}function A({card:a,onOpen:c,onDeleteCustom:d}){return(0,b.jsxs)("div",{className:"ai-card",role:"button",tabIndex:0,onClick:c,onKeyDown:a=>{("Enter"===a.key||" "===a.key)&&(a.preventDefault(),c())},style:{display:"flex",alignItems:"center",justifyContent:"space-between",gap:12,padding:"12px 14px",flexWrap:"wrap",cursor:"pointer"},children:[(0,b.jsxs)("div",{style:{minWidth:200,flex:1},children:[(0,b.jsx)("div",{style:{fontWeight:600,color:"var(--foreground)"},children:a.name}),(0,b.jsx)("div",{style:{fontSize:12,color:"var(--foreground-muted)",marginTop:4},children:a.description})]}),(0,b.jsx)("span",{className:`ai-badge ${"Code"===a.evaluatorType?"ai-badge-b":"Custom RPC"===a.evaluatorType?"ai-badge-g":"ai-badge-gr"}`,children:a.evaluatorType}),(0,b.jsxs)("div",{style:{display:"flex",alignItems:"center",gap:8},children:[(0,b.jsx)("span",{className:`ai-badge ${"ready"===a.status?"ai-badge-g":"draft"===a.status?"ai-badge-gr":"ai-badge-b"}`,children:"ready"===a.status?"已就绪":"draft"===a.status?"草稿":"预置"}),"custom"===a.source&&d?(0,b.jsx)("button",{type:"button",className:"ai-btn-s",style:{color:"var(--error)"},onClick:b=>{b.stopPropagation(),d(a)},children:"删除"}):null]})]})}function B({label:a,value:c}){return(0,b.jsxs)("div",{style:{border:"1px solid var(--border)",background:"var(--background-secondary)",borderRadius:7,padding:8},children:[(0,b.jsx)("div",{style:{color:"var(--foreground-muted)",fontSize:11,marginBottom:3},children:a}),(0,b.jsx)("div",{style:{color:"var(--foreground)",fontSize:12.5,fontWeight:500},children:c})]})}function C({draft:a,onChange:c,onBack:d,onSubmit:f}){return(0,b.jsxs)("div",{style:{paddingTop:20,maxWidth:800},children:[(0,b.jsxs)("div",{style:{display:"flex",alignItems:"center",gap:12,marginBottom:24},children:[(0,b.jsx)("button",{type:"button",className:"ai-btn-s",onClick:d,"aria-label":"返回",style:{minWidth:36,padding:"6px 10px"},children:"←"}),(0,b.jsx)("h2",{style:{margin:0,fontSize:18,fontWeight:600,color:"var(--foreground)"},children:"新建评估器"})]}),(0,b.jsxs)("section",{style:{marginBottom:28},children:[(0,b.jsx)("div",{className:"ai-section-title",style:{marginBottom:14},children:"基础信息"}),(0,b.jsxs)("label",{style:{display:"flex",flexDirection:"column",gap:6,marginBottom:14},children:[(0,b.jsxs)("span",{style:{fontSize:12,fontWeight:600,color:"var(--foreground)"},children:[(0,b.jsx)("span",{style:{color:"var(--error)"},children:"* "}),"名称"]}),(0,b.jsx)("input",{value:a.name,maxLength:50,onChange:b=>c({...a,name:b.target.value}),placeholder:"例如 custom_eval_agent",style:{height:36,borderRadius:8,border:"1px solid var(--input-border)",background:"var(--input-bg)",color:"var(--foreground)",padding:"0 12px",fontSize:13}}),(0,b.jsx)("span",{style:{fontSize:11,color:"var(--foreground-muted)"},children:"名称会作为链路追踪中的 agent 名称,仅支持英文、数字、下划线、连字符,且必须以英文字母开头。"}),(0,b.jsxs)("span",{style:{fontSize:11,color:"var(--foreground-muted)",textAlign:"right"},children:[a.name.length,"/50"]})]}),(0,b.jsxs)("label",{style:{display:"flex",flexDirection:"column",gap:6},children:[(0,b.jsx)("span",{style:{fontSize:12,fontWeight:600,color:"var(--foreground)"},children:"描述"}),(0,b.jsx)("textarea",{value:a.description,maxLength:200,onChange:b=>c({...a,description:b.target.value}),placeholder:"请输入描述",rows:3,style:{borderRadius:8,border:"1px solid var(--input-border)",background:"var(--input-bg)",color:"var(--foreground)",padding:"10px 12px",fontSize:13,resize:"vertical"}}),(0,b.jsxs)("span",{style:{fontSize:11,color:"var(--foreground-muted)",textAlign:"right"},children:[a.description.length,"/200"]})]})]}),(0,b.jsxs)("section",{style:{marginBottom:28},children:[(0,b.jsx)("div",{className:"ai-section-title",style:{marginBottom:14},children:"配置信息"}),(0,b.jsxs)("label",{style:{display:"flex",flexDirection:"column",gap:6,marginBottom:16},children:[(0,b.jsxs)("span",{style:{fontSize:12,fontWeight:600,color:"var(--foreground)"},children:[(0,b.jsx)("span",{style:{color:"var(--error)"},children:"* "}),"Prompt · System"]}),(0,b.jsx)("textarea",{value:a.systemPrompt,onChange:b=>c({...a,systemPrompt:b.target.value}),placeholder:p,rows:12,style:{borderRadius:8,border:"1px solid var(--input-border)",background:"var(--input-bg)",color:"var(--foreground)",padding:"12px",fontSize:12.5,lineHeight:1.55,fontFamily:"var(--font-mono, ui-monospace, monospace)",resize:"vertical"}})]}),(0,b.jsxs)("div",{style:{display:"flex",flexDirection:"column",gap:6},children:[(0,b.jsx)("span",{style:{fontSize:12,fontWeight:600,color:"var(--foreground)"},children:"User Prompt"}),a.userPromptEnabled?(0,b.jsxs)("div",{style:{border:"1px solid var(--input-border)",borderRadius:10,overflow:"hidden",background:"var(--background)"},children:[(0,b.jsxs)("div",{style:{display:"flex",alignItems:"center",justifyContent:"space-between",gap:10,padding:"10px 14px",borderBottom:"1px solid var(--border)",background:"color-mix(in srgb, var(--foreground) 2%, var(--background))"},children:[(0,b.jsx)("span",{style:{fontSize:12,fontWeight:600,color:"var(--foreground-muted)",letterSpacing:"0.04em"},children:"User"}),(0,b.jsx)("button",{type:"button",className:"ai-btn-s",style:{border:"none",background:"transparent",padding:0,color:"var(--foreground-muted)"},onClick:()=>c({...a,userPrompt:"",userPromptEnabled:!1}),children:"清空"})]}),(0,b.jsx)("textarea",{value:a.userPrompt,onChange:b=>c({...a,userPrompt:b.target.value}),placeholder:"请输入可选的 user prompt",rows:4,style:{width:"100%",border:"none",outline:"none",background:"transparent",color:"var(--foreground)",padding:"12px 14px",fontSize:12.5,lineHeight:1.6,resize:"vertical",boxSizing:"border-box"}})]}):(0,b.jsx)("button",{type:"button",className:"ai-btn-s",style:{width:"100%",minHeight:44,border:"1px dashed var(--input-border)",borderRadius:10,background:"color-mix(in srgb, var(--foreground) 4%, var(--background))",color:"var(--foreground-secondary)",fontSize:13,fontWeight:600},onClick:()=>c({...a,userPromptEnabled:!0}),children:"+ 添加 User Prompt"})]})]}),(0,b.jsxs)("section",{style:{marginBottom:28,padding:14,borderRadius:8,background:"var(--background-secondary)",border:"1px solid var(--border)"},children:[(0,b.jsxs)("div",{style:{display:"flex",alignItems:"center",gap:8,marginBottom:10},children:[(0,b.jsx)("span",{className:"ai-section-title",style:{margin:0},children:"输出"}),(0,b.jsx)("span",{title:"评测模型须遵守的输出约定","aria-label":"评测模型须遵守的输出约定",style:{cursor:"help",color:"var(--foreground-muted)",display:"inline-flex",alignItems:"center"},children:(0,b.jsx)(e.Info,{style:{width:16,height:16},"aria-hidden":!0})})]}),(0,b.jsxs)("p",{style:{margin:"0 0 10px",fontSize:12.5,color:"var(--foreground-secondary)",lineHeight:1.65},children:[(0,b.jsx)("strong",{style:{color:"var(--foreground)"},children:"得分:"}),"最终须给出 0.0~1.0 的数值型分数:1.0 表示完全符合标准,0.0 表示完全不符合。"]}),(0,b.jsxs)("p",{style:{margin:0,fontSize:12.5,color:"var(--foreground-secondary)",lineHeight:1.65},children:[(0,b.jsx)("strong",{style:{color:"var(--foreground)"},children:"原因:"}),"须提供可读的中文说明,并以固定收束句式结尾:",(0,b.jsx)("code",{style:{fontSize:12},children:"因此,应该给出[分数]是合理的评分"}),"。"]})]}),(0,b.jsxs)("div",{style:{display:"flex",gap:10,justifyContent:"flex-end"},children:[(0,b.jsx)("button",{type:"button",className:"ai-btn-s",onClick:d,children:"取消"}),(0,b.jsx)("button",{type:"button",className:"ai-btn-p",onClick:f,children:"创建"})]})]})}function D(){return(0,b.jsxs)("div",{style:{border:"1px dashed var(--border-dark)",borderRadius:8,padding:28,textAlign:"center",background:"var(--background-secondary)"},children:[(0,b.jsx)("div",{style:{color:"var(--foreground)",fontWeight:500,marginBottom:6},children:"没有匹配的评估器"}),(0,b.jsx)("div",{style:{color:"var(--foreground-muted)",fontSize:12},children:"调整筛选条件,或在「自建评估器」中新建。"})]})}function E({onCreateLlm:a}){return(0,b.jsxs)("div",{style:{border:"1px dashed var(--border-dark)",borderRadius:8,padding:"48px 28px",textAlign:"center",background:"var(--background-secondary)"},children:[(0,b.jsx)("div",{style:{color:"var(--foreground)",fontWeight:500,marginBottom:8,fontSize:15},children:"暂无自建评估器"}),(0,b.jsx)("div",{style:{color:"var(--foreground-muted)",fontSize:12.5,marginBottom:18},children:"点击右上角「+ 新建评估器」开始配置 LLM 评估器。"}),(0,b.jsx)("div",{style:{display:"flex",gap:10,justifyContent:"center",flexWrap:"wrap"},children:(0,b.jsx)("button",{type:"button",className:"ai-btn-p",onClick:a,children:"新建 LLM 评估器"})})]})}var F=a.i(729936),G=a.i(238246),H=a.i(106927);let I=process.env.NEXT_PUBLIC_URL_PREFIX||"";function J({taskId:a}){var c;let{user:e}=(0,g.useAuth)(),{locale:h}=(0,H.useLocale)(),[i,j]=(0,d.useState)(null),[k,l]=(0,d.useState)("loading");(0,d.useEffect)(()=>{e&&a&&(l("loading"),(0,f.apiFetch)(`/api/observe/data?user=${encodeURIComponent(e)}&taskId=${encodeURIComponent(a)}`).then(a=>a.ok?a.json():Promise.reject("http")).then(a=>{Array.isArray(a)&&a.length>0?(j(a[0]),l("ready")):l("notfound")}).catch(()=>l("error")))},[e,a]);let m=(0,d.useMemo)(()=>i?.judgment_reason?function(a){let b=[];if(!a)return b;let c=a.split("\n"),d={rc:0,ka:0};for(let a of c){let c=a.match(/\*\*Root Cause\*\*\s*\[(.*?)\]\s*.*?:\s*(\d+)%\s*match\.\s*(.+?)\s*\(Weight:\s*([\d.]+)\)/);if(c){b.push({id:`RC-${d.rc++}`,type:"root_cause",content:c[1].replace(/\.{3}$/,""),match_score:parseInt(c[2])/100,explanation:c[3].trim(),weight:parseFloat(c[4])});continue}let e=a.match(/\*\*Key Action\*\*\s*\[(.*?)\]\s*.*?:\s*(\d+)%\s*match\.\s*(.+?)\s*\(Weight:\s*([\d.]+)\)/);if(e){b.push({id:`KA-${d.ka++}`,type:"key_action",content:e[1].replace(/\.{3}$/,""),match_score:parseInt(e[2])/100,explanation:e[3].trim(),weight:parseFloat(e[4])});continue}let f=a.match(/\*\*Key Action\*\*\s*\[(.*?)\]\s*.*?:\s*(\d+)%\s*match\.\s*(.+?)\s*\(该分支未触发,不计入总分\)/);f&&b.push({id:`KA-${d.ka++}`,type:"key_action",content:f[1].replace(/\.{3}$/,""),match_score:parseInt(f[2])/100,explanation:f[3].trim(),weight:0})}return b}(i.judgment_reason):[],[i?.judgment_reason]);if("loading"===k)return(0,b.jsx)(K,{msg:"zh"===h?"正在加载执行数据…":"Loading execution…"});if("error"===k)return(0,b.jsx)(K,{msg:"zh"===h?"加载失败":"Load failed",tone:"error"});if("notfound"===k||!i)return(0,b.jsx)(K,{msg:"zh"===h?`没有找到 taskId=${a} 的执行记录`:`No execution found for taskId=${a}`,tone:"warn"});let n=i.is_evaluating||"结果评估中..."===i.judgment_reason||"Evaluation in progress..."===i.judgment_reason,o=!n&&!0===i.is_answer_correct,p=!n&&!1===i.is_answer_correct,q="number"==typeof i.answer_score?Math.round(100*i.answer_score):null,r=(i.invoked_skills?.length??0)||(i.skills?.length??0)||+!!i.skill,s="number"==typeof i.skill_trigger_rate?Math.round(100*i.skill_trigger_rate):null;return(0,b.jsxs)("div",{style:{padding:"20px 22px",maxWidth:1180,margin:"0 auto"},children:[(0,b.jsxs)("div",{style:{background:"var(--card-bg)",border:"1px solid var(--card-border)",borderRadius:10,padding:"14px 18px",marginBottom:14,display:"flex",alignItems:"center",gap:14},children:[(0,b.jsxs)("div",{style:{flex:1,minWidth:0},children:[(0,b.jsxs)("div",{style:{fontSize:10.5,color:"var(--foreground-muted)",fontFamily:"var(--font-mono)",marginBottom:4},children:[a,i.timestamp&&(0,b.jsxs)("span",{children:[" · ",new Date(i.timestamp).toLocaleString()]})]}),(0,b.jsx)("div",{style:{fontSize:13.5,fontWeight:500,color:"var(--foreground)",overflow:"hidden",textOverflow:"ellipsis",whiteSpace:"nowrap"},children:i.query||("zh"===h?"(无问题)":"(no query)")})]}),(0,b.jsx)(G.default,{href:`${I}/skill-eval?taskId=${a}`,className:"ai-btn-s",style:{textDecoration:"none",fontSize:11,flexShrink:0},children:"zh"===h?"调测分析 ↗":"Skill diagnosis ↗"})]}),(0,b.jsxs)("div",{style:{display:"flex",flexWrap:"wrap",gap:12,marginBottom:12,fontSize:11.5,color:"var(--foreground-secondary)"},children:[(0,b.jsx)(M,{label:"zh"===h?"平台":"Platform",value:i.framework||"-"}),(0,b.jsx)(M,{label:"zh"===h?"模型":"Model",value:i.model||"-"}),(0,b.jsx)(M,{label:"zh"===h?"状态":"Status",value:n?"zh"===h?"运行中":"Running":o?"zh"===h?"成功":"Success":p?"zh"===h?"失败":"Failed":"zh"===h?"未评测":"Unjudged",valueColor:n?"var(--primary)":o?"var(--success)":p?"var(--error)":"var(--foreground-muted)"}),i.label&&(0,b.jsx)(M,{label:"zh"===h?"标签":"Tag",value:i.label})]}),(0,b.jsx)(L,{text:"zh"===h?"质量指标":"Quality metrics"}),(0,b.jsxs)("div",{style:Q,children:[(0,b.jsx)(N,{label:"zh"===h?"准确率":"Accuracy",value:null!==q?`${q}%`:"--",tone:null===q?"muted":q>=80?"green":q>=50?"amber":"red"}),(0,b.jsx)(N,{label:"zh"===h?"技能召回率":"Skill Recall",value:null!==s?`${s}%`:"--",tone:null===s?"muted":s>=80?"green":s>=50?"amber":"red"}),(0,b.jsx)(N,{label:"zh"===h?"调用 Skill 数":"Skills used",value:String(r)}),(0,b.jsx)(N,{label:"zh"===h?"Skill 是否命中":"Skill correct",value:!0===i.is_skill_correct?"✓":!1===i.is_skill_correct?"✗":"--",tone:!0===i.is_skill_correct?"green":!1===i.is_skill_correct?"red":"muted"})]}),(0,b.jsx)(L,{text:"zh"===h?"性能指标":"Performance metrics"}),(0,b.jsxs)("div",{style:Q,children:[(0,b.jsx)(N,{label:"zh"===h?"延迟":"Latency",value:(c=function(a,b){if(null==a)return;let c=(b||"").toLowerCase();return("opencode"===c||"openhands"===c||"claude"===c)&&a>0&&a<1e3?1e3*a:a}(i.latency,i.framework))&&Number.isFinite(c)?c<1e3?`${Math.round(c)}ms`:c<6e4?`${(c/1e3).toFixed(2)}s`:`${(c/6e4).toFixed(1)}m`:"-"}),(0,b.jsx)(N,{label:"zh"===h?"总 Token":"Total tokens",value:R(i.tokens)}),(0,b.jsx)(N,{label:"zh"===h?"成本":"Cost",value:"number"==typeof i.cost&&i.cost>0?`$${i.cost.toFixed(4)}`:"--"}),(0,b.jsx)(N,{label:"zh"===h?"LLM 调用":"LLM calls",value:R(i.llm_call_count)}),(0,b.jsx)(N,{label:"zh"===h?"工具调用":"Tool calls",value:R(i.tool_call_count)}),(0,b.jsx)(N,{label:"zh"===h?"工具错误":"Tool errors",value:R(i.tool_call_error_count),tone:(i.tool_call_error_count??0)>0?"red":"muted"})]}),(i.input_tokens||i.output_tokens)&&(0,b.jsxs)("div",{style:{display:"flex",gap:16,fontSize:11,color:"var(--foreground-muted)",marginTop:8},children:[null!=i.input_tokens&&(0,b.jsxs)("span",{children:["Input: ",R(i.input_tokens)]}),null!=i.output_tokens&&(0,b.jsxs)("span",{children:["Output: ",R(i.output_tokens)]})]}),(0,b.jsx)(L,{text:"zh"===h?"评分项分解":"Per-criterion breakdown",hint:m.length>0?`${m.length} ${"zh"===h?"项":"items"}`:void 0}),0===m.length?(0,b.jsx)("div",{style:{padding:"14px 16px",background:"var(--card-bg)",border:"1px dashed var(--border)",borderRadius:8,color:"var(--foreground-muted)",fontSize:12},children:i.judgment_reason?"zh"===h?"该执行没有结构化评分项(可能是自由文本评估)":"No structured criteria parsed (free-text judgment)":"zh"===h?"该执行尚未被评测":"Not yet evaluated"}):(0,b.jsx)("div",{style:{background:"var(--card-bg)",border:"1px solid var(--card-border)",borderRadius:8,overflow:"hidden"},children:(0,b.jsxs)("table",{style:{width:"100%",borderCollapse:"collapse",fontSize:11.5},children:[(0,b.jsx)("thead",{children:(0,b.jsxs)("tr",{style:{background:"var(--background-secondary)"},children:[(0,b.jsx)(O,{width:70,children:"ID"}),(0,b.jsx)(O,{children:"zh"===h?"评分标准":"Criterion"}),(0,b.jsx)(O,{width:70,align:"center",children:"zh"===h?"得分":"Score"}),(0,b.jsx)(O,{width:60,align:"center",children:"zh"===h?"权重":"Weight"}),(0,b.jsx)(O,{width:70,align:"center",children:"zh"===h?"扣分":"Deduction"}),(0,b.jsx)(O,{children:"zh"===h?"原因":"Reason"})]})}),(0,b.jsx)("tbody",{children:m.map((a,c)=>{let d=0===a.weight,e=d?0:(1-a.match_score)*a.weight;return(0,b.jsxs)("tr",{style:{borderBottom:"1px solid var(--table-row-border)",opacity:d?.65:1},children:[(0,b.jsx)(P,{children:(0,b.jsx)("span",{style:{background:"root_cause"===a.type?"var(--tag-amber-bg)":"var(--tag-blue-bg, var(--primary-subtle))",color:"root_cause"===a.type?"var(--tag-amber-fg)":"var(--primary)",padding:"1px 7px",borderRadius:5,fontSize:10,fontWeight:600},children:a.id})}),(0,b.jsx)(P,{children:(0,b.jsx)("span",{style:{wordBreak:"break-word"},children:a.content})}),(0,b.jsx)(P,{align:"center",children:(0,b.jsxs)("span",{style:{color:d?"var(--foreground-muted)":a.match_score>=1?"var(--success)":a.match_score>=.5?"var(--warning)":"var(--error)",fontWeight:600},children:[Math.round(100*a.match_score),"%"]})}),(0,b.jsx)(P,{align:"center",children:(0,b.jsx)("span",{style:{color:"var(--foreground-muted)"},children:d?"—":a.weight})}),(0,b.jsx)(P,{align:"center",children:(0,b.jsx)("span",{style:{color:e>0?"var(--error)":"var(--foreground-muted)"},children:d?"—":e.toFixed(2)})}),(0,b.jsx)(P,{children:(0,b.jsx)("span",{style:{color:"var(--foreground-secondary)",fontSize:11},children:a.explanation})})]},c)})})]})})]})}function K({msg:a,tone:c="muted"}){return(0,b.jsx)("div",{style:{padding:"40px 24px",textAlign:"center",color:"error"===c?"var(--error)":"warn"===c?"var(--warning)":"var(--foreground-muted)",fontSize:12},children:a})}function L({text:a,hint:c}){return(0,b.jsxs)("div",{style:{display:"flex",alignItems:"baseline",gap:8,margin:"18px 0 8px"},children:[(0,b.jsx)("span",{style:{fontSize:12,fontWeight:600,color:"var(--foreground-secondary)",textTransform:"uppercase",letterSpacing:"0.06em"},children:a}),c&&(0,b.jsx)("span",{style:{fontSize:10.5,color:"var(--foreground-muted)"},children:c})]})}function M({label:a,value:c,valueColor:d}){return(0,b.jsxs)("span",{style:{display:"inline-flex",gap:4,alignItems:"baseline"},children:[(0,b.jsxs)("span",{style:{color:"var(--foreground-muted)"},children:[a,":"]}),(0,b.jsx)("span",{style:{color:d||"var(--foreground)",fontWeight:500},children:c})]})}function N({label:a,value:c,tone:d="default"}){return(0,b.jsxs)("div",{style:{background:"var(--card-bg)",border:"1px solid var(--card-border)",borderRadius:8,padding:"10px 14px"},children:[(0,b.jsx)("div",{style:{fontSize:10.5,color:"var(--foreground-muted)",textTransform:"uppercase",letterSpacing:"0.06em",marginBottom:4},children:a}),(0,b.jsx)("div",{style:{fontSize:18,fontWeight:600,color:"green"===d?"var(--success)":"amber"===d?"var(--warning)":"red"===d?"var(--error)":"muted"===d?"var(--foreground-muted)":"var(--foreground)",fontFamily:"var(--font-mono)"},children:c})]})}function O({children:a,width:c,align:d}){return(0,b.jsx)("th",{style:{padding:"8px 12px",fontSize:10.5,fontWeight:500,color:"var(--foreground-muted)",borderBottom:"1px solid var(--border)",textAlign:d||"left",width:c,whiteSpace:"nowrap"},children:a})}function P({children:a,align:c}){return(0,b.jsx)("td",{style:{padding:"8px 12px",fontSize:11.5,textAlign:c||"left",color:"var(--foreground)"},children:a})}let Q={display:"grid",gridTemplateColumns:"repeat(auto-fill, minmax(160px, 1fr))",gap:8};function R(a){return"number"==typeof a?a.toLocaleString():"-"}var S=a.i(960798);function T(){return(0,b.jsx)(d.Suspense,{fallback:null,children:(0,b.jsx)(U,{})})}function U(){let{t:a,locale:d}=(0,H.useLocale)(),e=(0,c.useSearchParams)(),f=e?.get("taskId")||"";return f?(0,b.jsxs)(b.Fragment,{children:[(0,b.jsx)(F.AppTopBar,{title:(0,b.jsxs)(b.Fragment,{children:[(0,b.jsx)(S.Term,{id:"evaluator",label:a("nav.evalMetrics")}),` \xb7 ${"zh"===d?"单次执行":"Single execution"}`]})}),(0,b.jsx)("div",{style:{flex:1,overflowY:"auto"},children:(0,b.jsx)(J,{taskId:f})})]}):(0,b.jsxs)(b.Fragment,{children:[(0,b.jsx)(F.AppTopBar,{title:(0,b.jsx)(S.Term,{id:"evaluator",label:a("nav.evalMetrics")})}),(0,b.jsx)("div",{style:{flex:1,overflowY:"auto"},children:(0,b.jsx)(u,{})})]})}a.s(["default",()=>T],503978)}];
7
+ 这些字段都不是必填;目前仅支持以上四个变量。评估器最终需要输出 score 和 reason。`,q=()=>({name:"",description:"",systemPrompt:"",userPrompt:"",userPromptEnabled:!1});function r(){return{query:"",evaluatorTypes:[],targetTypes:[],objectives:[]}}function s(){return{nameQuery:"",creator:"all",typeFilter:""}}function t(a,b){return a.includes(b)?a.filter(a=>a!==b):[...a,b]}function u(){let{user:a}=(0,g.useAuth)(),e=(0,c.useRouter)(),[h,i]=(0,d.useState)([]),[p,u]=(0,d.useState)(!1),[B,F]=(0,d.useState)("custom"),[G,H]=(0,d.useState)(r),[I,J]=(0,d.useState)(s),[K,L]=(0,d.useState)(q),[M,N]=(0,d.useState)(null),[O,P]=(0,d.useState)("grid"),[Q,R]=(0,d.useState)(!0),[S,T]=(0,d.useState)(""),[U,V]=(0,d.useState)(null),[W,X]=(0,d.useState)(null);(0,d.useEffect)(()=>{a||(i([]),u(!1))},[a]),(0,d.useEffect)(()=>{if(!a)return;let b=!1;return(async()=>{try{let c=[],[d,e]=await Promise.allSettled([(0,f.apiFetch)(`/api/user-evaluators?user=${encodeURIComponent(a)}`),(0,f.apiFetch)(`/api/eval/settings?user=${encodeURIComponent(a)}`)]);if("fulfilled"===d.status&&d.value.ok)try{let a=await d.value.json();Array.isArray(a)&&(c=a)}catch{}if("fulfilled"===e.status&&e.value.ok)try{let a=await e.value.json(),c=a?.activeConfigId,d=Array.isArray(a?.configs)?a.configs:[],f=c?d.find(a=>a.id===c):null;b||X(f?{id:f.id,name:f.name||"(unnamed)",model:f.model||"(unknown)"}:null)}catch{}b||(i(c),u(!0))}catch(a){b||T(a instanceof Error?a.message:"评估器数据加载失败")}finally{b||R(!1)}})(),()=>{b=!0}},[a]),(0,d.useEffect)(()=>{if(!a||!p)return;let b=window.setTimeout(()=>{(0,f.apiFetch)("/api/user-evaluators",{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify({user:a,evaluators:h})}).catch(()=>{})},600);return()=>window.clearTimeout(b)},[a,p,h]);let Y=(0,d.useMemo)(()=>"preset"===B?k.presetEvaluators.filter(a=>{let b,c;return b=G.query.trim().toLowerCase(),c=`${a.name} ${a.description} ${a.mappedMetrics.join(" ")}`.toLowerCase(),(!b||!!c.includes(b))&&(!(G.evaluatorTypes.length>0)||!!G.evaluatorTypes.includes(a.evaluatorType))&&(!(G.targetTypes.length>0)||!!G.targetTypes.some(b=>a.targetTypes.includes(b)))&&(!(G.objectives.length>0)||!!G.objectives.some(b=>a.objectives.includes(b)))}):h.filter(b=>{let c,d;return c=I.nameQuery.trim().toLowerCase(),d=`${b.name} ${b.description} ${b.mappedMetrics.join(" ")}`.toLowerCase(),(!c||!!d.includes(c))&&(!I.typeFilter||b.evaluatorType===I.typeFilter)&&("mine"!==I.creator||!a||b.creator===a)}),[B,h,G,I,a]),Z=(0,d.useMemo)(()=>({presetCount:k.presetEvaluators.length,customCount:h.length,readyCount:h.filter(a=>"ready"===a.status).length}),[h]),$=()=>{L(q()),N("llm"),T("")},_=a=>{F(a),N(null),V(null)},aa=async b=>{if(!a||"custom"!==b.source||!globalThis.confirm(`确定删除评估器「${b.name}」?`))return;T("");let c=h.filter(a=>a.id!==b.id);i(c);try{let b=await (0,f.apiFetch)("/api/user-evaluators",{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify({user:a,evaluators:c})}),d=await b.json().catch(()=>({}));if(!b.ok||d?.success===!1)throw Error("删除失败")}catch(a){i(h),T(a instanceof Error?a.message:"删除失败")}};return Q?(0,b.jsx)("div",{className:"loading",children:"正在整理评估器视图..."}):(0,b.jsxs)("div",{style:{padding:"18px 22px 28px",maxWidth:1500,margin:"0 auto"},children:[S&&(0,b.jsx)("div",{className:"ai-card",style:{padding:12,color:"var(--error)",marginBottom:14},children:S}),(0,b.jsxs)("div",{style:{display:"flex",alignItems:"flex-start",justifyContent:"space-between",gap:16,marginBottom:10,flexWrap:"wrap"},children:[(0,b.jsxs)("div",{style:{minWidth:280,flex:1},children:[(0,b.jsxs)("div",{style:{display:"flex",alignItems:"center",gap:8,marginBottom:6},children:[(0,b.jsx)("span",{className:"ai-badge ai-badge-b",children:"Evaluators"}),"preset"===B&&(0,b.jsx)("span",{style:{color:"var(--foreground-muted)",fontSize:11},children:"预置模板库"}),"custom"===B&&null===M&&(0,b.jsx)("span",{style:{color:"var(--foreground-muted)",fontSize:11},children:"自建评估方案"})]}),(0,b.jsx)("h1",{style:{margin:0,fontSize:22,lineHeight:1.2,fontWeight:600,color:"var(--foreground)"},children:"评估器"}),null===M&&(0,b.jsx)("p",{style:{margin:"6px 0 0",color:"var(--foreground-secondary)",fontSize:12.5,maxWidth:820},children:"custom"===B?"管理自建 LLM 评估器,配置会保存到服务端。点击卡片可进入详情编辑。":"预置评估器模板库:按类型与场景筛选,点击可查看详情与执行入口。"})]}),"preset"===B&&(0,b.jsx)("div",{style:{display:"flex",gap:8,alignItems:"center"},children:(0,b.jsx)("button",{type:"button",className:"ai-btn-s",onClick:()=>window.location.reload(),children:"刷新"})})]}),"preset"===B&&(0,b.jsxs)("div",{style:{display:"grid",gridTemplateColumns:"repeat(3, minmax(160px, 1fr))",gap:10,marginBottom:14},children:[(0,b.jsx)(v,{label:"预置评估器",value:String(Z.presetCount),detail:"LLM 评估器模板"}),(0,b.jsx)(v,{label:"自建评估器",value:String(Z.customCount),detail:"已保存至账号"}),(0,b.jsx)(v,{label:"可用评估器",value:String(Z.readyCount),detail:"状态为已就绪"})]}),(0,b.jsxs)("div",{style:{borderBottom:"1px solid var(--border)",marginBottom:0,display:"flex",gap:2},children:[(0,b.jsx)(w,{active:"custom"===B,onClick:()=>_("custom"),children:"自建评估器"}),(0,b.jsx)(w,{active:"preset"===B,onClick:()=>_("preset"),children:"预置评估器"})]}),"custom"===B&&"llm"===M?(0,b.jsx)(C,{draft:K,onChange:L,onBack:()=>{N(null),L(q()),T("")},onSubmit:()=>{let b=K.name.trim();if(!b)return void T("请填写评估器名称");if(!(0,l.isValidCustomEvaluatorName)(b))return void T("名称会作为链路追踪中的 agent 名称:必须以英文字母开头,仅支持字母、数字、下划线、连字符");if(!K.systemPrompt.trim())return void T("请填写 System Prompt");let c=(0,l.findUnsupportedCustomEvaluatorVariables)(K.systemPrompt);if(c.length>0)return void T(`System Prompt 仅支持 {{input}}、{{output}}、{{reference_output}}、{{trajectory}},不支持:${c.map(a=>`{{${a}}}`).join("、")}`);let d={model:W?.model||"",systemPrompt:K.systemPrompt.trim(),userPrompt:K.userPrompt.trim()},e={id:`custom-${Date.now()}`,name:b,description:K.description.trim()||"自建 LLM 评估器。",evaluatorType:"LLM",source:"custom",targetTypes:["结果"],objectives:["任务完成","内容质量"],scenarios:["Agent通用评测"],runMode:"LLM Judge",scoreRange:"0-1",popularity:0,mappedMetrics:d.model?["LLM 评测",d.model]:["LLM 评测"],status:"draft",creator:a||void 0,llmConfig:d};i(a=>[e,...a]),N(null),L(q()),F("custom"),T("")}}):"custom"===B?(0,b.jsxs)("div",{style:{paddingTop:16},children:[(0,b.jsxs)("div",{style:{display:"flex",flexWrap:"wrap",alignItems:"center",gap:10,marginBottom:16,justifyContent:"space-between"},children:[(0,b.jsxs)("div",{style:{display:"flex",flexWrap:"wrap",gap:10,flex:1,minWidth:280},children:[(0,b.jsx)("input",{value:I.nameQuery,onChange:a=>J(b=>({...b,nameQuery:a.target.value})),placeholder:"搜索名称",style:{minWidth:160,flex:"1 1 160px",maxWidth:280,height:34,borderRadius:8,border:"1px solid var(--input-border)",background:"var(--input-bg)",color:"var(--foreground)",padding:"0 12px",fontSize:12.5}}),(0,b.jsxs)("select",{value:I.typeFilter,onChange:a=>J(b=>({...b,typeFilter:a.target.value})),style:{height:34,borderRadius:8,border:"1px solid var(--input-border)",background:"var(--input-bg)",color:"var(--foreground)",padding:"0 10px",fontSize:12.5,minWidth:140},children:[(0,b.jsx)("option",{value:"",children:"请选择类型"}),(0,b.jsx)("option",{value:"LLM",children:"LLM"})]})]}),(0,b.jsxs)("div",{style:{display:"flex",alignItems:"center",gap:8},children:[(0,b.jsx)("button",{type:"button",className:"ai-btn-s",title:"刷新",onClick:()=>window.location.reload(),children:"↻"}),(0,b.jsx)("button",{type:"button",className:"ai-btn-s",title:"grid"===O?"切换列表":"切换网格",onClick:()=>P(a=>"grid"===a?"list":"grid"),children:"grid"===O?"≡":"⊞"}),(0,b.jsx)("button",{type:"button",className:"ai-btn-p",onClick:$,children:"+ 新建评估器"})]})]}),0===Y.length?(0,b.jsx)(E,{onCreateLlm:$}):"grid"===O?(0,b.jsx)("div",{style:{display:"grid",gridTemplateColumns:"repeat(2, minmax(320px, 1fr))",gap:12},children:Y.map(a=>(0,b.jsx)(z,{card:a,activeTab:B,activeModel:W,onModelConfigClick:()=>e.push("/modelconfig/defaults"),onDeleteCustom:aa},a.id))}):(0,b.jsx)("div",{style:{display:"flex",flexDirection:"column",gap:8},children:Y.map(a=>(0,b.jsx)(A,{card:a,onOpen:()=>e.push(`/metrics/evaluators/${encodeURIComponent(a.id)}`),onDeleteCustom:aa},a.id))})]}):(0,b.jsxs)("div",{style:{display:"grid",gridTemplateColumns:"300px minmax(0, 1fr)",minHeight:620},children:[(0,b.jsxs)("aside",{style:{borderRight:"1px solid var(--border)",padding:"16px 18px 16px 0"},children:[(0,b.jsxs)("div",{style:{display:"flex",justifyContent:"space-between",alignItems:"center",marginBottom:14},children:[(0,b.jsx)("div",{className:"ai-section-title",children:"评估器筛选"}),(0,b.jsx)("button",{type:"button",className:"ai-btn-s",onClick:()=>H(r()),children:"清空"})]}),(0,b.jsx)(x,{title:"类型",options:m,values:G.evaluatorTypes,onToggle:a=>H(b=>({...b,evaluatorTypes:t(b.evaluatorTypes,a)}))}),(0,b.jsx)(x,{title:"场景",options:n,values:G.targetTypes,onToggle:a=>H(b=>({...b,targetTypes:t(b.targetTypes,a)}))}),(0,b.jsx)(x,{title:"评估目标",options:o,values:G.objectives,onToggle:a=>H(b=>({...b,objectives:t(b.objectives,a)}))})]}),(0,b.jsxs)("main",{style:{padding:16},children:[(0,b.jsx)("div",{style:{marginBottom:14},children:(0,b.jsx)("input",{value:G.query,onChange:a=>H(b=>({...b,query:a.target.value})),placeholder:"搜索评估器名称、说明或指标",style:{width:"100%",height:34,borderRadius:8,border:"1px solid var(--input-border)",background:"var(--input-bg)",color:"var(--foreground)",padding:"0 12px",fontSize:12.5}})}),0===Y.length?(0,b.jsx)(D,{}):(0,b.jsx)("div",{style:{display:"grid",gridTemplateColumns:"repeat(2, minmax(320px, 1fr))",gap:12},children:Y.map(a=>(0,b.jsx)(z,{card:a,activeTab:B,onInspectPreset:V,activeModel:W,onModelConfigClick:()=>e.push("/modelconfig/defaults"),onDeleteCustom:aa},a.id))})]})]}),U&&j[U.id]?(0,b.jsx)(y,{card:U,detail:j[U.id],onClose:()=>V(null)}):null]})}function v({label:a,value:c,detail:d}){return(0,b.jsxs)("div",{className:"ai-stat",style:{minHeight:74},children:[(0,b.jsx)("div",{className:"ai-stat-lbl",children:a}),(0,b.jsx)("div",{className:"ai-stat-val",children:c}),(0,b.jsx)("div",{className:"ai-stat-d",style:{color:"var(--foreground-muted)"},children:d})]})}function w({active:a,children:c,onClick:d}){return(0,b.jsx)("button",{type:"button",onClick:d,style:{height:36,padding:"0 16px",border:"1px solid var(--border)",borderBottom:a?"2px solid var(--primary)":"1px solid var(--border)",background:a?"var(--background)":"var(--background-secondary)",color:a?"var(--primary)":"var(--foreground)",fontWeight:a?600:400,cursor:"pointer",borderRadius:"7px 7px 0 0",marginBottom:-1},children:c})}function x({title:a,options:c,values:d,onToggle:e}){return(0,b.jsxs)("div",{style:{marginBottom:18},children:[(0,b.jsx)("div",{style:{color:"var(--foreground-secondary)",fontSize:12,marginBottom:9},children:a}),(0,b.jsx)("div",{style:{display:"flex",flexWrap:"wrap",gap:8},children:c.map(a=>{let c=d.includes(a);return(0,b.jsx)("button",{type:"button",onClick:()=>e(a),style:{minHeight:34,padding:"0 16px",borderRadius:8,border:`1px solid ${c?"var(--primary-subtle-border)":"var(--border)"}`,background:c?"var(--primary-subtle)":"var(--background)",color:c?"var(--primary)":"var(--foreground-secondary)",cursor:"pointer",fontSize:12.5},children:a},a)})})]})}function y({card:a,detail:c,onClose:e}){(0,d.useEffect)(()=>{let a=a=>{"Escape"===a.key&&e()};return window.addEventListener("keydown",a),()=>window.removeEventListener("keydown",a)},[e]);let f=c.systemPrompt??"";async function g(){try{f&&await navigator.clipboard.writeText(f)}catch{}}let h=[...c.mediaTags??[],a.evaluatorType,...a.objectives.slice(0,2),...a.scenarios.slice(0,1)];return(0,b.jsx)("div",{role:"dialog","aria-modal":"true","aria-labelledby":"preset-inspect-title",style:{position:"fixed",inset:0,zIndex:100,display:"flex",alignItems:"flex-start",justifyContent:"center",padding:"24px 16px",overflowY:"auto",background:"rgba(0,0,0,0.45)"},onClick:e,children:(0,b.jsxs)("div",{className:"ai-card",style:{width:"100%",maxWidth:720,marginTop:12,marginBottom:40,padding:22,position:"relative",maxHeight:"92vh",overflowY:"auto",boxShadow:"var(--shadow)"},onClick:a=>a.stopPropagation(),children:[(0,b.jsxs)("div",{style:{display:"flex",justifyContent:"space-between",alignItems:"flex-start",gap:12,marginBottom:16},children:[(0,b.jsx)("h2",{id:"preset-inspect-title",style:{margin:0,fontSize:18,fontWeight:650,color:"var(--foreground)"},children:a.name}),(0,b.jsx)("button",{type:"button",className:"ai-btn-s","aria-label":"关闭",onClick:e,children:"×"})]}),(0,b.jsx)("div",{style:{display:"flex",flexWrap:"wrap",gap:6,marginBottom:14},children:h.map((a,c)=>(0,b.jsx)("span",{style:{background:"var(--background-tertiary)",color:"var(--foreground-secondary)",borderRadius:6,padding:"4px 9px",fontSize:11},children:a},`${a}-${c}`))}),(0,b.jsxs)("section",{style:{marginBottom:18},children:[(0,b.jsx)("div",{style:{fontSize:12.5,fontWeight:600,marginBottom:8,color:"var(--foreground)"},children:"应用场景"}),(0,b.jsx)("p",{style:{margin:0,fontSize:13,lineHeight:1.65,color:"var(--foreground-secondary)"},children:c.applicationScenario})]}),"llm"===c.kind&&f?(0,b.jsxs)("section",{style:{marginBottom:18},children:[(0,b.jsxs)("div",{style:{display:"flex",justifyContent:"space-between",alignItems:"center",marginBottom:8},children:[(0,b.jsx)("span",{style:{fontSize:12.5,fontWeight:600,color:"var(--foreground)"},children:"Prompt"}),(0,b.jsx)("button",{type:"button",className:"ai-btn-s",onClick:()=>g(),children:"复制 System"})]}),(0,b.jsxs)("div",{style:{border:"1px solid var(--border)",borderRadius:8,background:"var(--background-secondary)",padding:"12px 14px"},children:[(0,b.jsx)("div",{style:{fontSize:11,color:"var(--foreground-muted)",marginBottom:8},children:"System"}),(0,b.jsx)("pre",{style:{margin:0,whiteSpace:"pre-wrap",wordBreak:"break-word",fontSize:12.5,lineHeight:1.55,color:"var(--foreground)",fontFamily:"ui-monospace, monospace"},children:f})]}),(c.variables?.length??0)>0?(0,b.jsxs)("div",{style:{marginTop:12},children:[(0,b.jsx)("div",{style:{fontSize:12,fontWeight:600,marginBottom:6,color:"var(--foreground)"},children:"Variables"}),(0,b.jsx)("div",{style:{display:"flex",flexWrap:"wrap",gap:8},children:c.variables.map(a=>(0,b.jsx)("code",{style:{fontSize:12,padding:"4px 8px",borderRadius:6,background:"var(--background-tertiary)",color:"var(--primary)"},children:`{{${a}}}`},a))})]}):null]}):null,("code"===c.kind||"rpc"===c.kind)&&(0,b.jsxs)("section",{style:{marginBottom:18},children:[(0,b.jsx)("div",{style:{fontSize:12.5,fontWeight:600,marginBottom:8,color:"var(--foreground)"},children:"code"===c.kind?"规则 / 脚本说明":"RPC 契约"}),c.implementationNote?(0,b.jsx)("p",{style:{margin:"0 0 12px",fontSize:13,lineHeight:1.65,color:"var(--foreground-secondary)"},children:c.implementationNote}):null,c.codeOrContractExample?(0,b.jsx)("pre",{style:{margin:0,padding:"12px 14px",borderRadius:8,border:"1px solid var(--border)",background:"var(--input-bg)",fontSize:12,lineHeight:1.45,overflowX:"auto",whiteSpace:"pre-wrap",wordBreak:"break-word",fontFamily:"ui-monospace, monospace"},children:c.codeOrContractExample}):null]}),(0,b.jsxs)("section",{style:{marginBottom:18,padding:14,borderRadius:8,background:"var(--background-secondary)",border:"1px solid var(--border)"},children:[(0,b.jsx)("div",{style:{display:"flex",alignItems:"center",gap:6,marginBottom:10},children:(0,b.jsx)("span",{style:{fontSize:12.5,fontWeight:600},children:"输出"})}),(0,b.jsxs)("p",{style:{margin:"0 0 10px",fontSize:12.5,lineHeight:1.65,color:"var(--foreground-secondary)"},children:[(0,b.jsx)("strong",{style:{color:"var(--foreground)"},children:"得分:"}),c.outputScoreText]}),(0,b.jsxs)("p",{style:{margin:0,fontSize:12.5,lineHeight:1.65,color:"var(--foreground-secondary)"},children:[(0,b.jsx)("strong",{style:{color:"var(--foreground)"},children:"原因:"}),c.outputReasonText]})]}),(0,b.jsx)("div",{style:{display:"flex",gap:8,justifyContent:"flex-end",flexWrap:"wrap"},children:(0,b.jsx)("button",{type:"button",className:"ai-btn-s",onClick:e,children:"关闭"})})]})})}function z({card:a,activeTab:d,onInspectPreset:e,activeModel:f,onModelConfigClick:g,onDeleteCustom:h}){let i=(0,c.useRouter)(),k="preset"===a.source&&!!j[a.id],l=()=>{"preset"===d&&k&&e?.(a)},m=()=>{"custom"===d&&i.push(`/metrics/evaluators/${encodeURIComponent(a.id)}`)},n="preset"===d&&k||"custom"===d;return(0,b.jsxs)("article",{className:"ai-card",role:n?"button":void 0,tabIndex:n?0:void 0,onClick:a=>{a.target.closest("button")||("preset"===d&&k?l():"custom"===d&&m())},onKeyDown:a=>{n&&("Enter"===a.key||" "===a.key)&&(a.preventDefault(),"preset"===d&&k?l():"custom"===d&&m())},style:{padding:16,minHeight:176,display:"flex",flexDirection:"column",gap:12,cursor:n?"pointer":void 0},children:[(0,b.jsxs)("div",{style:{display:"flex",justifyContent:"space-between",gap:10},children:[(0,b.jsxs)("div",{children:[(0,b.jsx)("h3",{style:{margin:0,color:"var(--foreground)",fontSize:15.5,fontWeight:600},children:a.name}),(0,b.jsx)("p",{style:{margin:"8px 0 0",color:"var(--foreground-secondary)",fontSize:12.5,lineHeight:1.6},children:a.description}),"preset"===d&&k?(0,b.jsx)("p",{style:{margin:"4px 0 0",fontSize:11,color:"var(--foreground-muted)"},children:"点击查看详情"}):null,"custom"===d?(0,b.jsx)("p",{style:{margin:"4px 0 0",fontSize:11,color:"var(--foreground-muted)"},children:"点击查看或编辑"}):null]}),(0,b.jsx)("span",{className:`ai-badge ${"Code"===a.evaluatorType?"ai-badge-b":"Custom RPC"===a.evaluatorType?"ai-badge-g":"ai-badge-gr"}`,style:{height:22,whiteSpace:"nowrap"},children:a.evaluatorType})]}),(0,b.jsx)("div",{style:{display:"flex",flexWrap:"wrap",gap:6},children:[a.runMode,...a.targetTypes,...a.objectives,...a.scenarios.slice(0,2)].map(a=>(0,b.jsx)("span",{style:{background:"var(--background-tertiary)",color:"var(--foreground-secondary)",borderRadius:4,padding:"3px 7px",fontSize:11},children:a},a))}),(0,b.jsx)("div",{style:{marginTop:"auto"},children:(0,b.jsx)(B,{label:"评分",value:a.scoreRange})}),a.runtimeHref?(0,b.jsxs)("div",{style:{display:"flex",alignItems:"center",gap:6,padding:"6px 8px",background:"var(--background-secondary)",border:"1px solid var(--border)",borderRadius:6,fontSize:11},onClick:a=>a.stopPropagation(),children:[(0,b.jsx)("span",{style:{color:"var(--foreground-muted)"},children:"运行模型:"}),f?(0,b.jsxs)(b.Fragment,{children:[(0,b.jsx)("span",{style:{fontWeight:600,color:"var(--foreground)"},children:f.name}),(0,b.jsxs)("span",{style:{color:"var(--foreground-muted)",fontFamily:"monospace"},children:["· ",f.model]}),(0,b.jsx)("span",{style:{color:"var(--foreground-muted)"},children:"(来自全局默认)"})]}):(0,b.jsx)("span",{style:{color:"var(--error)",fontWeight:500},children:"未配置"}),(0,b.jsx)("span",{style:{flex:1}}),g?(0,b.jsx)("button",{type:"button",className:"ai-btn-s",style:{fontSize:10.5,padding:"2px 8px"},onClick:a=>{a.stopPropagation(),g()},children:f?"修改":"去配置"}):null]}):null,(0,b.jsxs)("div",{style:{display:"flex",justifyContent:"space-between",gap:8,alignItems:"center"},children:[(0,b.jsx)("div",{style:{display:"flex",alignItems:"center",gap:6,flexWrap:"wrap"},children:(0,b.jsx)("span",{className:`ai-badge ${"ready"===a.status?"ai-badge-g":"draft"===a.status?"ai-badge-gr":"ai-badge-b"}`,children:"ready"===a.status?"已就绪":"draft"===a.status?"草稿":"预置"})}),(0,b.jsxs)("div",{style:{display:"flex",alignItems:"center",gap:6},children:["custom"===d&&h?(0,b.jsx)("button",{type:"button",className:"ai-btn-s",style:{color:"var(--error)"},onClick:b=>{b.stopPropagation(),h(a)},children:"删除"}):null,a.runtimeHref?(0,b.jsx)("button",{type:"button",className:"ai-btn-sp",onClick:b=>{b.stopPropagation();let c=new URL(a.runtimeHref,window.location.origin);c.searchParams.set("evaluatorId",a.id),i.push(c.pathname+c.search)},style:{whiteSpace:"nowrap"},children:"前往评测执行 →"}):null]})]})]})}function A({card:a,onOpen:c,onDeleteCustom:d}){return(0,b.jsxs)("div",{className:"ai-card",role:"button",tabIndex:0,onClick:c,onKeyDown:a=>{("Enter"===a.key||" "===a.key)&&(a.preventDefault(),c())},style:{display:"flex",alignItems:"center",justifyContent:"space-between",gap:12,padding:"12px 14px",flexWrap:"wrap",cursor:"pointer"},children:[(0,b.jsxs)("div",{style:{minWidth:200,flex:1},children:[(0,b.jsx)("div",{style:{fontWeight:600,color:"var(--foreground)"},children:a.name}),(0,b.jsx)("div",{style:{fontSize:12,color:"var(--foreground-muted)",marginTop:4},children:a.description})]}),(0,b.jsx)("span",{className:`ai-badge ${"Code"===a.evaluatorType?"ai-badge-b":"Custom RPC"===a.evaluatorType?"ai-badge-g":"ai-badge-gr"}`,children:a.evaluatorType}),(0,b.jsxs)("div",{style:{display:"flex",alignItems:"center",gap:8},children:[(0,b.jsx)("span",{className:`ai-badge ${"ready"===a.status?"ai-badge-g":"draft"===a.status?"ai-badge-gr":"ai-badge-b"}`,children:"ready"===a.status?"已就绪":"draft"===a.status?"草稿":"预置"}),"custom"===a.source&&d?(0,b.jsx)("button",{type:"button",className:"ai-btn-s",style:{color:"var(--error)"},onClick:b=>{b.stopPropagation(),d(a)},children:"删除"}):null]})]})}function B({label:a,value:c}){return(0,b.jsxs)("div",{style:{border:"1px solid var(--border)",background:"var(--background-secondary)",borderRadius:7,padding:8},children:[(0,b.jsx)("div",{style:{color:"var(--foreground-muted)",fontSize:11,marginBottom:3},children:a}),(0,b.jsx)("div",{style:{color:"var(--foreground)",fontSize:12.5,fontWeight:500},children:c})]})}function C({draft:a,onChange:c,onBack:d,onSubmit:f}){return(0,b.jsxs)("div",{style:{paddingTop:20,maxWidth:800},children:[(0,b.jsxs)("div",{style:{display:"flex",alignItems:"center",gap:12,marginBottom:24},children:[(0,b.jsx)("button",{type:"button",className:"ai-btn-s",onClick:d,"aria-label":"返回",style:{minWidth:36,padding:"6px 10px"},children:"←"}),(0,b.jsx)("h2",{style:{margin:0,fontSize:18,fontWeight:600,color:"var(--foreground)"},children:"新建评估器"})]}),(0,b.jsxs)("section",{style:{marginBottom:28},children:[(0,b.jsx)("div",{className:"ai-section-title",style:{marginBottom:14},children:"基础信息"}),(0,b.jsxs)("label",{style:{display:"flex",flexDirection:"column",gap:6,marginBottom:14},children:[(0,b.jsxs)("span",{style:{fontSize:12,fontWeight:600,color:"var(--foreground)"},children:[(0,b.jsx)("span",{style:{color:"var(--error)"},children:"* "}),"名称"]}),(0,b.jsx)("input",{value:a.name,maxLength:50,onChange:b=>c({...a,name:b.target.value}),placeholder:"例如 custom_eval_agent",style:{height:36,borderRadius:8,border:"1px solid var(--input-border)",background:"var(--input-bg)",color:"var(--foreground)",padding:"0 12px",fontSize:13}}),(0,b.jsx)("span",{style:{fontSize:11,color:"var(--foreground-muted)"},children:"名称会作为链路追踪中的 agent 名称,仅支持英文、数字、下划线、连字符,且必须以英文字母开头。"}),(0,b.jsxs)("span",{style:{fontSize:11,color:"var(--foreground-muted)",textAlign:"right"},children:[a.name.length,"/50"]})]}),(0,b.jsxs)("label",{style:{display:"flex",flexDirection:"column",gap:6},children:[(0,b.jsx)("span",{style:{fontSize:12,fontWeight:600,color:"var(--foreground)"},children:"描述"}),(0,b.jsx)("textarea",{value:a.description,maxLength:200,onChange:b=>c({...a,description:b.target.value}),placeholder:"请输入描述",rows:3,style:{borderRadius:8,border:"1px solid var(--input-border)",background:"var(--input-bg)",color:"var(--foreground)",padding:"10px 12px",fontSize:13,resize:"vertical"}}),(0,b.jsxs)("span",{style:{fontSize:11,color:"var(--foreground-muted)",textAlign:"right"},children:[a.description.length,"/200"]})]})]}),(0,b.jsxs)("section",{style:{marginBottom:28},children:[(0,b.jsx)("div",{className:"ai-section-title",style:{marginBottom:14},children:"配置信息"}),(0,b.jsxs)("label",{style:{display:"flex",flexDirection:"column",gap:6,marginBottom:16},children:[(0,b.jsxs)("span",{style:{fontSize:12,fontWeight:600,color:"var(--foreground)"},children:[(0,b.jsx)("span",{style:{color:"var(--error)"},children:"* "}),"Prompt · System"]}),(0,b.jsx)("textarea",{value:a.systemPrompt,onChange:b=>c({...a,systemPrompt:b.target.value}),placeholder:p,rows:12,style:{borderRadius:8,border:"1px solid var(--input-border)",background:"var(--input-bg)",color:"var(--foreground)",padding:"12px",fontSize:12.5,lineHeight:1.55,fontFamily:"var(--font-mono, ui-monospace, monospace)",resize:"vertical"}})]}),(0,b.jsxs)("div",{style:{display:"flex",flexDirection:"column",gap:6},children:[(0,b.jsx)("span",{style:{fontSize:12,fontWeight:600,color:"var(--foreground)"},children:"User Prompt"}),a.userPromptEnabled?(0,b.jsxs)("div",{style:{border:"1px solid var(--input-border)",borderRadius:10,overflow:"hidden",background:"var(--background)"},children:[(0,b.jsxs)("div",{style:{display:"flex",alignItems:"center",justifyContent:"space-between",gap:10,padding:"10px 14px",borderBottom:"1px solid var(--border)",background:"color-mix(in srgb, var(--foreground) 2%, var(--background))"},children:[(0,b.jsx)("span",{style:{fontSize:12,fontWeight:600,color:"var(--foreground-muted)",letterSpacing:"0.04em"},children:"User"}),(0,b.jsx)("button",{type:"button",className:"ai-btn-s",style:{border:"none",background:"transparent",padding:0,color:"var(--foreground-muted)"},onClick:()=>c({...a,userPrompt:"",userPromptEnabled:!1}),children:"清空"})]}),(0,b.jsx)("textarea",{value:a.userPrompt,onChange:b=>c({...a,userPrompt:b.target.value}),placeholder:"请输入可选的 user prompt",rows:4,style:{width:"100%",border:"none",outline:"none",background:"transparent",color:"var(--foreground)",padding:"12px 14px",fontSize:12.5,lineHeight:1.6,resize:"vertical",boxSizing:"border-box"}})]}):(0,b.jsx)("button",{type:"button",className:"ai-btn-s",style:{width:"100%",minHeight:44,border:"1px dashed var(--input-border)",borderRadius:10,background:"color-mix(in srgb, var(--foreground) 4%, var(--background))",color:"var(--foreground-secondary)",fontSize:13,fontWeight:600},onClick:()=>c({...a,userPromptEnabled:!0}),children:"+ 添加 User Prompt"})]})]}),(0,b.jsxs)("section",{style:{marginBottom:28,padding:14,borderRadius:8,background:"var(--background-secondary)",border:"1px solid var(--border)"},children:[(0,b.jsxs)("div",{style:{display:"flex",alignItems:"center",gap:8,marginBottom:10},children:[(0,b.jsx)("span",{className:"ai-section-title",style:{margin:0},children:"输出"}),(0,b.jsx)("span",{title:"评测模型须遵守的输出约定","aria-label":"评测模型须遵守的输出约定",style:{cursor:"help",color:"var(--foreground-muted)",display:"inline-flex",alignItems:"center"},children:(0,b.jsx)(e.Info,{style:{width:16,height:16},"aria-hidden":!0})})]}),(0,b.jsxs)("p",{style:{margin:"0 0 10px",fontSize:12.5,color:"var(--foreground-secondary)",lineHeight:1.65},children:[(0,b.jsx)("strong",{style:{color:"var(--foreground)"},children:"得分:"}),"最终须给出 0.0~1.0 的数值型分数:1.0 表示完全符合标准,0.0 表示完全不符合。"]}),(0,b.jsxs)("p",{style:{margin:0,fontSize:12.5,color:"var(--foreground-secondary)",lineHeight:1.65},children:[(0,b.jsx)("strong",{style:{color:"var(--foreground)"},children:"原因:"}),"须提供可读的中文说明,并以固定收束句式结尾:",(0,b.jsx)("code",{style:{fontSize:12},children:"因此,应该给出[分数]是合理的评分"}),"。"]})]}),(0,b.jsxs)("div",{style:{display:"flex",gap:10,justifyContent:"flex-end"},children:[(0,b.jsx)("button",{type:"button",className:"ai-btn-s",onClick:d,children:"取消"}),(0,b.jsx)("button",{type:"button",className:"ai-btn-p",onClick:f,children:"创建"})]})]})}function D(){return(0,b.jsxs)("div",{style:{border:"1px dashed var(--border-dark)",borderRadius:8,padding:28,textAlign:"center",background:"var(--background-secondary)"},children:[(0,b.jsx)("div",{style:{color:"var(--foreground)",fontWeight:500,marginBottom:6},children:"没有匹配的评估器"}),(0,b.jsx)("div",{style:{color:"var(--foreground-muted)",fontSize:12},children:"调整筛选条件,或在「自建评估器」中新建。"})]})}function E({onCreateLlm:a}){return(0,b.jsxs)("div",{style:{border:"1px dashed var(--border-dark)",borderRadius:8,padding:"48px 28px",textAlign:"center",background:"var(--background-secondary)"},children:[(0,b.jsx)("div",{style:{color:"var(--foreground)",fontWeight:500,marginBottom:8,fontSize:15},children:"暂无自建评估器"}),(0,b.jsx)("div",{style:{color:"var(--foreground-muted)",fontSize:12.5,marginBottom:18},children:"点击右上角「+ 新建评估器」开始配置 LLM 评估器。"}),(0,b.jsx)("div",{style:{display:"flex",gap:10,justifyContent:"center",flexWrap:"wrap"},children:(0,b.jsx)("button",{type:"button",className:"ai-btn-p",onClick:a,children:"新建 LLM 评估器"})})]})}var F=a.i(729936),G=a.i(238246),H=a.i(106927),I=a.i(187563);let J=process.env.NEXT_PUBLIC_URL_PREFIX||"";function K({taskId:a}){let{user:c}=(0,g.useAuth)(),{locale:e}=(0,H.useLocale)(),[h,i]=(0,d.useState)(null),[j,k]=(0,d.useState)("loading");(0,d.useEffect)(()=>{c&&a&&(k("loading"),(0,f.apiFetch)(`/api/observe/data?user=${encodeURIComponent(c)}&taskId=${encodeURIComponent(a)}`).then(a=>a.ok?a.json():Promise.reject("http")).then(a=>{Array.isArray(a)&&a.length>0?(i(a[0]),k("ready")):k("notfound")}).catch(()=>k("error")))},[c,a]);let l=(0,d.useMemo)(()=>h?.judgment_reason?function(a){let b=[];if(!a)return b;let c=a.split("\n"),d={rc:0,ka:0};for(let a of c){let c=a.match(/\*\*Root Cause\*\*\s*\[(.*?)\]\s*.*?:\s*(\d+)%\s*match\.\s*(.+?)\s*\(Weight:\s*([\d.]+)\)/);if(c){b.push({id:`RC-${d.rc++}`,type:"root_cause",content:c[1].replace(/\.{3}$/,""),match_score:parseInt(c[2])/100,explanation:c[3].trim(),weight:parseFloat(c[4])});continue}let e=a.match(/\*\*Key Action\*\*\s*\[(.*?)\]\s*.*?:\s*(\d+)%\s*match\.\s*(.+?)\s*\(Weight:\s*([\d.]+)\)/);if(e){b.push({id:`KA-${d.ka++}`,type:"key_action",content:e[1].replace(/\.{3}$/,""),match_score:parseInt(e[2])/100,explanation:e[3].trim(),weight:parseFloat(e[4])});continue}let f=a.match(/\*\*Key Action\*\*\s*\[(.*?)\]\s*.*?:\s*(\d+)%\s*match\.\s*(.+?)\s*\(该分支未触发,不计入总分\)/);f&&b.push({id:`KA-${d.ka++}`,type:"key_action",content:f[1].replace(/\.{3}$/,""),match_score:parseInt(f[2])/100,explanation:f[3].trim(),weight:0})}return b}(h.judgment_reason):[],[h?.judgment_reason]);if("loading"===j)return(0,b.jsx)(L,{msg:"zh"===e?"正在加载执行数据…":"Loading execution…"});if("error"===j)return(0,b.jsx)(L,{msg:"zh"===e?"加载失败":"Load failed",tone:"error"});if("notfound"===j||!h)return(0,b.jsx)(L,{msg:"zh"===e?`没有找到 taskId=${a} 的执行记录`:`No execution found for taskId=${a}`,tone:"warn"});let m=h.is_evaluating||"结果评估中..."===h.judgment_reason||"Evaluation in progress..."===h.judgment_reason,n=!m&&!0===h.is_answer_correct,o=!m&&!1===h.is_answer_correct,p="number"==typeof h.answer_score?Math.round(100*h.answer_score):null,q=(h.invoked_skills?.length??0)||(h.skills?.length??0)||+!!h.skill,r="number"==typeof h.skill_trigger_rate?Math.round(100*h.skill_trigger_rate):null;return(0,b.jsxs)("div",{style:{padding:"20px 22px",maxWidth:1180,margin:"0 auto"},children:[(0,b.jsxs)("div",{style:{background:"var(--card-bg)",border:"1px solid var(--card-border)",borderRadius:10,padding:"14px 18px",marginBottom:14,display:"flex",alignItems:"center",gap:14},children:[(0,b.jsxs)("div",{style:{flex:1,minWidth:0},children:[(0,b.jsxs)("div",{style:{fontSize:10.5,color:"var(--foreground-muted)",fontFamily:"var(--font-mono)",marginBottom:4},children:[a,h.timestamp&&(0,b.jsxs)("span",{children:[" · ",new Date(h.timestamp).toLocaleString()]})]}),(0,b.jsx)("div",{style:{fontSize:13.5,fontWeight:500,color:"var(--foreground)",overflow:"hidden",textOverflow:"ellipsis",whiteSpace:"nowrap"},children:h.query||("zh"===e?"(无问题)":"(no query)")})]}),(0,b.jsx)(G.default,{href:`${J}/skill-eval?taskId=${a}`,className:"ai-btn-s",style:{textDecoration:"none",fontSize:11,flexShrink:0},children:"zh"===e?"调测分析 ↗":"Skill diagnosis ↗"})]}),(0,b.jsxs)("div",{style:{display:"flex",flexWrap:"wrap",gap:12,marginBottom:12,fontSize:11.5,color:"var(--foreground-secondary)"},children:[(0,b.jsx)(N,{label:"zh"===e?"平台":"Platform",value:h.framework||"-"}),(0,b.jsx)(N,{label:"zh"===e?"模型":"Model",value:h.model||"-"}),(0,b.jsx)(N,{label:"zh"===e?"状态":"Status",value:m?"zh"===e?"运行中":"Running":n?"zh"===e?"成功":"Success":o?"zh"===e?"失败":"Failed":"zh"===e?"未评测":"Unjudged",valueColor:m?"var(--primary)":n?"var(--success)":o?"var(--error)":"var(--foreground-muted)"}),h.label&&(0,b.jsx)(N,{label:"zh"===e?"标签":"Tag",value:h.label})]}),(0,b.jsx)(M,{text:"zh"===e?"质量指标":"Quality metrics"}),(0,b.jsxs)("div",{style:R,children:[(0,b.jsx)(O,{label:"zh"===e?"准确率":"Accuracy",value:null!==p?`${p}%`:"--",tone:null===p?"muted":p>=80?"green":p>=50?"amber":"red"}),(0,b.jsx)(O,{label:"zh"===e?"技能召回率":"Skill Recall",value:null!==r?`${r}%`:"--",tone:null===r?"muted":r>=80?"green":r>=50?"amber":"red"}),(0,b.jsx)(O,{label:"zh"===e?"调用 Skill 数":"Skills used",value:String(q)}),(0,b.jsx)(O,{label:"zh"===e?"Skill 是否命中":"Skill correct",value:!0===h.is_skill_correct?"✓":!1===h.is_skill_correct?"✗":"--",tone:!0===h.is_skill_correct?"green":!1===h.is_skill_correct?"red":"muted"})]}),(0,b.jsx)(M,{text:"zh"===e?"性能指标":"Performance metrics"}),(0,b.jsxs)("div",{style:R,children:[(0,b.jsx)(O,{label:"zh"===e?"延迟":"Latency",value:(0,I.formatLatencySeconds)(h.latency)}),(0,b.jsx)(O,{label:"zh"===e?"总 Token":"Total tokens",value:S(h.tokens)}),(0,b.jsx)(O,{label:"zh"===e?"成本":"Cost",value:"number"==typeof h.cost&&h.cost>0?`$${h.cost.toFixed(4)}`:"--"}),(0,b.jsx)(O,{label:"zh"===e?"LLM 调用":"LLM calls",value:S(h.llm_call_count)}),(0,b.jsx)(O,{label:"zh"===e?"工具调用":"Tool calls",value:S(h.tool_call_count)}),(0,b.jsx)(O,{label:"zh"===e?"工具错误":"Tool errors",value:S(h.tool_call_error_count),tone:(h.tool_call_error_count??0)>0?"red":"muted"})]}),(h.input_tokens||h.output_tokens)&&(0,b.jsxs)("div",{style:{display:"flex",gap:16,fontSize:11,color:"var(--foreground-muted)",marginTop:8},children:[null!=h.input_tokens&&(0,b.jsxs)("span",{children:["Input: ",S(h.input_tokens)]}),null!=h.output_tokens&&(0,b.jsxs)("span",{children:["Output: ",S(h.output_tokens)]})]}),(0,b.jsx)(M,{text:"zh"===e?"评分项分解":"Per-criterion breakdown",hint:l.length>0?`${l.length} ${"zh"===e?"项":"items"}`:void 0}),0===l.length?(0,b.jsx)("div",{style:{padding:"14px 16px",background:"var(--card-bg)",border:"1px dashed var(--border)",borderRadius:8,color:"var(--foreground-muted)",fontSize:12},children:h.judgment_reason?"zh"===e?"该执行没有结构化评分项(可能是自由文本评估)":"No structured criteria parsed (free-text judgment)":"zh"===e?"该执行尚未被评测":"Not yet evaluated"}):(0,b.jsx)("div",{style:{background:"var(--card-bg)",border:"1px solid var(--card-border)",borderRadius:8,overflow:"hidden"},children:(0,b.jsxs)("table",{style:{width:"100%",borderCollapse:"collapse",fontSize:11.5},children:[(0,b.jsx)("thead",{children:(0,b.jsxs)("tr",{style:{background:"var(--background-secondary)"},children:[(0,b.jsx)(P,{width:70,children:"ID"}),(0,b.jsx)(P,{children:"zh"===e?"评分标准":"Criterion"}),(0,b.jsx)(P,{width:70,align:"center",children:"zh"===e?"得分":"Score"}),(0,b.jsx)(P,{width:60,align:"center",children:"zh"===e?"权重":"Weight"}),(0,b.jsx)(P,{width:70,align:"center",children:"zh"===e?"扣分":"Deduction"}),(0,b.jsx)(P,{children:"zh"===e?"原因":"Reason"})]})}),(0,b.jsx)("tbody",{children:l.map((a,c)=>{let d=0===a.weight,e=d?0:(1-a.match_score)*a.weight;return(0,b.jsxs)("tr",{style:{borderBottom:"1px solid var(--table-row-border)",opacity:d?.65:1},children:[(0,b.jsx)(Q,{children:(0,b.jsx)("span",{style:{background:"root_cause"===a.type?"var(--tag-amber-bg)":"var(--tag-blue-bg, var(--primary-subtle))",color:"root_cause"===a.type?"var(--tag-amber-fg)":"var(--primary)",padding:"1px 7px",borderRadius:5,fontSize:10,fontWeight:600},children:a.id})}),(0,b.jsx)(Q,{children:(0,b.jsx)("span",{style:{wordBreak:"break-word"},children:a.content})}),(0,b.jsx)(Q,{align:"center",children:(0,b.jsxs)("span",{style:{color:d?"var(--foreground-muted)":a.match_score>=1?"var(--success)":a.match_score>=.5?"var(--warning)":"var(--error)",fontWeight:600},children:[Math.round(100*a.match_score),"%"]})}),(0,b.jsx)(Q,{align:"center",children:(0,b.jsx)("span",{style:{color:"var(--foreground-muted)"},children:d?"—":a.weight})}),(0,b.jsx)(Q,{align:"center",children:(0,b.jsx)("span",{style:{color:e>0?"var(--error)":"var(--foreground-muted)"},children:d?"—":e.toFixed(2)})}),(0,b.jsx)(Q,{children:(0,b.jsx)("span",{style:{color:"var(--foreground-secondary)",fontSize:11},children:a.explanation})})]},c)})})]})})]})}function L({msg:a,tone:c="muted"}){return(0,b.jsx)("div",{style:{padding:"40px 24px",textAlign:"center",color:"error"===c?"var(--error)":"warn"===c?"var(--warning)":"var(--foreground-muted)",fontSize:12},children:a})}function M({text:a,hint:c}){return(0,b.jsxs)("div",{style:{display:"flex",alignItems:"baseline",gap:8,margin:"18px 0 8px"},children:[(0,b.jsx)("span",{style:{fontSize:12,fontWeight:600,color:"var(--foreground-secondary)",textTransform:"uppercase",letterSpacing:"0.06em"},children:a}),c&&(0,b.jsx)("span",{style:{fontSize:10.5,color:"var(--foreground-muted)"},children:c})]})}function N({label:a,value:c,valueColor:d}){return(0,b.jsxs)("span",{style:{display:"inline-flex",gap:4,alignItems:"baseline"},children:[(0,b.jsxs)("span",{style:{color:"var(--foreground-muted)"},children:[a,":"]}),(0,b.jsx)("span",{style:{color:d||"var(--foreground)",fontWeight:500},children:c})]})}function O({label:a,value:c,tone:d="default"}){return(0,b.jsxs)("div",{style:{background:"var(--card-bg)",border:"1px solid var(--card-border)",borderRadius:8,padding:"10px 14px"},children:[(0,b.jsx)("div",{style:{fontSize:10.5,color:"var(--foreground-muted)",textTransform:"uppercase",letterSpacing:"0.06em",marginBottom:4},children:a}),(0,b.jsx)("div",{style:{fontSize:18,fontWeight:600,color:"green"===d?"var(--success)":"amber"===d?"var(--warning)":"red"===d?"var(--error)":"muted"===d?"var(--foreground-muted)":"var(--foreground)",fontFamily:"var(--font-mono)"},children:c})]})}function P({children:a,width:c,align:d}){return(0,b.jsx)("th",{style:{padding:"8px 12px",fontSize:10.5,fontWeight:500,color:"var(--foreground-muted)",borderBottom:"1px solid var(--border)",textAlign:d||"left",width:c,whiteSpace:"nowrap"},children:a})}function Q({children:a,align:c}){return(0,b.jsx)("td",{style:{padding:"8px 12px",fontSize:11.5,textAlign:c||"left",color:"var(--foreground)"},children:a})}let R={display:"grid",gridTemplateColumns:"repeat(auto-fill, minmax(160px, 1fr))",gap:8};function S(a){return"number"==typeof a?a.toLocaleString():"-"}var T=a.i(960798);function U(){return(0,b.jsx)(d.Suspense,{fallback:null,children:(0,b.jsx)(V,{})})}function V(){let{t:a,locale:d}=(0,H.useLocale)(),e=(0,c.useSearchParams)(),f=e?.get("taskId")||"";return f?(0,b.jsxs)(b.Fragment,{children:[(0,b.jsx)(F.AppTopBar,{title:(0,b.jsxs)(b.Fragment,{children:[(0,b.jsx)(T.Term,{id:"evaluator",label:a("nav.evalMetrics")}),` \xb7 ${"zh"===d?"单次执行":"Single execution"}`]})}),(0,b.jsx)("div",{style:{flex:1,overflowY:"auto"},children:(0,b.jsx)(K,{taskId:f})})]}):(0,b.jsxs)(b.Fragment,{children:[(0,b.jsx)(F.AppTopBar,{title:(0,b.jsx)(T.Term,{id:"evaluator",label:a("nav.evalMetrics")})}),(0,b.jsx)("div",{style:{flex:1,overflowY:"auto"},children:(0,b.jsx)(u,{})})]})}a.s(["default",()=>U],503978)}];
8
8
 
9
9
  //# sourceMappingURL=src_app_%28main%29_metrics_page_tsx_f1599761._.js.map
@@ -1,3 +1,3 @@
1
- module.exports=[685260,a=>{"use strict";var b=a.i(187924),c=a.i(729936),d=a.i(572131),e=a.i(403512),f=a.i(233540),g=a.i(164831);let h=(0,g.default)("server",[["rect",{width:"20",height:"8",x:"2",y:"2",rx:"2",ry:"2",key:"ngkwjq"}],["rect",{width:"20",height:"8",x:"2",y:"14",rx:"2",ry:"2",key:"iecqi9"}],["line",{x1:"6",x2:"6.01",y1:"6",y2:"6",key:"16zg32"}],["line",{x1:"6",x2:"6.01",y1:"18",y2:"18",key:"nzw8ys"}]]);var i=a.i(118343),j=a.i(590629),k=a.i(980180),l=a.i(752562),m=a.i(752357),n=a.i(597024);let o=(0,g.default)("badge-check",[["path",{d:"M3.85 8.62a4 4 0 0 1 4.78-4.77 4 4 0 0 1 6.74 0 4 4 0 0 1 4.78 4.78 4 4 0 0 1 0 6.74 4 4 0 0 1-4.77 4.78 4 4 0 0 1-6.75 0 4 4 0 0 1-4.78-4.77 4 4 0 0 1 0-6.76Z",key:"3c2336"}],["path",{d:"m9 12 2 2 4-4",key:"dzmm74"}]]),p=(0,g.default)("star",[["path",{d:"M11.525 2.295a.53.53 0 0 1 .95 0l2.31 4.679a2.123 2.123 0 0 0 1.595 1.16l5.166.756a.53.53 0 0 1 .294.904l-3.736 3.638a2.123 2.123 0 0 0-.611 1.878l.882 5.14a.53.53 0 0 1-.771.56l-4.618-2.428a2.122 2.122 0 0 0-1.973 0L6.396 21.01a.53.53 0 0 1-.77-.56l.881-5.139a2.122 2.122 0 0 0-.611-1.879L2.16 9.795a.53.53 0 0 1 .294-.906l5.165-.755a2.122 2.122 0 0 0 1.597-1.16z",key:"r04s7s"}]]),q=(0,g.default)("heart-pulse",[["path",{d:"M2 9.5a5.5 5.5 0 0 1 9.591-3.676.56.56 0 0 0 .818 0A5.49 5.49 0 0 1 22 9.5c0 2.29-1.5 4-3 5.5l-5.492 5.313a2 2 0 0 1-3 .019L5 15c-1.5-1.5-3-3.2-3-5.5",key:"mvr1a0"}],["path",{d:"M3.22 13H9.5l.5-1 2 4.5 2-7 1.5 3.5h5.27",key:"auskq0"}]]);var r=a.i(118688),s=a.i(168370),t=a.i(519783),u=a.i(875160),v=a.i(211134),w=a.i(575110),x=a.i(943408),y=a.i(106927),z=a.i(757430);let A=[{id:"openai",label:"OpenAI",category:"frontier",baseUrl:"https://api.openai.com/v1",defaultModel:"gpt-4o-mini",suggestedModels:["gpt-5","gpt-5-mini","gpt-4o","gpt-4o-mini","gpt-4.1","o3","o3-mini","o4-mini"],docsUrl:"https://platform.openai.com/docs/models",oaiCompat:!0,initials:"OA",logoSlug:"openai"},{id:"anthropic",label:"Anthropic",category:"frontier",baseUrl:"https://api.anthropic.com/v1",defaultModel:"claude-sonnet-4-6",suggestedModels:["claude-opus-4-7","claude-sonnet-4-6","claude-haiku-4-5","claude-3-5-sonnet-latest"],docsUrl:"https://docs.anthropic.com/en/docs/models-overview",oaiCompat:!0,initials:"AN",logoSlug:"anthropic",note:"使用 Anthropic OpenAI 兼容端点(/v1/messages 自动转换)。"},{id:"gemini",label:"Google Gemini",category:"frontier",baseUrl:"https://generativelanguage.googleapis.com/v1beta/openai/",defaultModel:"gemini-2.5-flash",suggestedModels:["gemini-2.5-pro","gemini-2.5-flash","gemini-2.0-flash","gemini-1.5-pro"],docsUrl:"https://ai.google.dev/gemini-api/docs/openai",oaiCompat:!0,initials:"GM",logoSlug:"gemini",note:"走 Gemini OpenAI 兼容层(generativelanguage.googleapis.com)。"},{id:"azure-openai",label:"Azure OpenAI",category:"frontier",baseUrl:"https://YOUR-RESOURCE.openai.azure.com/openai",defaultModel:"gpt-4o",suggestedModels:["gpt-4o","gpt-4o-mini","gpt-4-turbo","o1-mini"],docsUrl:"https://learn.microsoft.com/azure/ai-services/openai/reference",oaiCompat:!0,initials:"AZ",logoSlug:"azure",note:"Base URL 形如 https://<resource>.openai.azure.com/openai/deployments/<deployment>"},{id:"xai",label:"xAI Grok",category:"frontier",baseUrl:"https://api.x.ai/v1",defaultModel:"grok-3",suggestedModels:["grok-4","grok-3","grok-3-mini","grok-2-1212","grok-2-vision-1212"],docsUrl:"https://docs.x.ai/api",oaiCompat:!0,initials:"GR",logoSlug:"grok"},{id:"mistral",label:"Mistral AI",category:"frontier",baseUrl:"https://api.mistral.ai/v1",defaultModel:"mistral-large-latest",suggestedModels:["mistral-large-latest","mistral-large-2411","mistral-small-latest","codestral-2501","open-mistral-nemo"],docsUrl:"https://docs.mistral.ai/getting-started/models/models_overview/",oaiCompat:!0,initials:"MI",logoSlug:"mistral"},{id:"cohere",label:"Cohere",category:"frontier",baseUrl:"https://api.cohere.ai/compatibility/v1",defaultModel:"command-r-plus",suggestedModels:["command-r-plus","command-r","command-r7b"],docsUrl:"https://docs.cohere.com/docs/compatibility-api",oaiCompat:!0,initials:"CO",logoSlug:"cohere"},{id:"openrouter",label:"OpenRouter",category:"aggregator",baseUrl:"https://openrouter.ai/api/v1",defaultModel:"openai/gpt-4o-mini",suggestedModels:["anthropic/claude-3.5-sonnet","openai/gpt-4o","meta-llama/llama-3.3-70b-instruct","google/gemini-2.0-flash-exp:free"],docsUrl:"https://openrouter.ai/docs",oaiCompat:!0,initials:"OR",logoSlug:"openrouter"},{id:"together",label:"Together AI",category:"aggregator",baseUrl:"https://api.together.xyz/v1",defaultModel:"meta-llama/Llama-3.3-70B-Instruct-Turbo",suggestedModels:["meta-llama/Llama-3.3-70B-Instruct-Turbo","deepseek-ai/DeepSeek-V3","Qwen/Qwen2.5-72B-Instruct-Turbo"],docsUrl:"https://docs.together.ai/docs/quickstart",oaiCompat:!0,initials:"TG",logoSlug:"together"},{id:"fireworks",label:"Fireworks AI",category:"aggregator",baseUrl:"https://api.fireworks.ai/inference/v1",defaultModel:"accounts/fireworks/models/llama-v3p3-70b-instruct",suggestedModels:["accounts/fireworks/models/llama-v3p3-70b-instruct","accounts/fireworks/models/deepseek-v3","accounts/fireworks/models/qwen2p5-72b-instruct"],docsUrl:"https://docs.fireworks.ai",oaiCompat:!0,initials:"FW",logoSlug:"fireworks"},{id:"groq",label:"Groq",category:"aggregator",baseUrl:"https://api.groq.com/openai/v1",defaultModel:"llama-3.3-70b-versatile",suggestedModels:["llama-3.3-70b-versatile","llama-3.1-8b-instant","mixtral-8x7b-32768"],docsUrl:"https://console.groq.com/docs/models",oaiCompat:!0,initials:"GQ",logoSlug:"groq"},{id:"deepinfra",label:"DeepInfra",category:"aggregator",baseUrl:"https://api.deepinfra.com/v1/openai",defaultModel:"meta-llama/Meta-Llama-3.1-70B-Instruct",suggestedModels:["meta-llama/Meta-Llama-3.1-70B-Instruct","deepseek-ai/DeepSeek-V3","Qwen/Qwen2.5-72B-Instruct"],docsUrl:"https://deepinfra.com/docs",oaiCompat:!0,initials:"DI",logoSlug:"deepinfra"},{id:"perplexity",label:"Perplexity",category:"aggregator",baseUrl:"https://api.perplexity.ai",defaultModel:"sonar",suggestedModels:["sonar","sonar-pro","sonar-reasoning","sonar-reasoning-pro"],docsUrl:"https://docs.perplexity.ai",oaiCompat:!0,initials:"PX",logoSlug:"perplexity"},{id:"nvidia",label:"NVIDIA NIM",category:"aggregator",baseUrl:"https://integrate.api.nvidia.com/v1",defaultModel:"meta/llama-3.3-70b-instruct",suggestedModels:["meta/llama-3.3-70b-instruct","deepseek-ai/deepseek-r1","nvidia/llama-3.1-nemotron-70b-instruct"],docsUrl:"https://docs.api.nvidia.com",oaiCompat:!0,initials:"NV",logoSlug:"nvidia"},{id:"databricks",label:"Databricks",category:"aggregator",baseUrl:"https://YOUR-WORKSPACE.cloud.databricks.com/serving-endpoints",defaultModel:"databricks-meta-llama-3-3-70b-instruct",suggestedModels:["databricks-meta-llama-3-3-70b-instruct","databricks-dbrx-instruct"],docsUrl:"https://docs.databricks.com/aws/en/machine-learning/foundation-models/api-reference",oaiCompat:!0,initials:"DB",logoSlug:"databricks",note:"Base URL 形如 https://<workspace>.cloud.databricks.com/serving-endpoints"},{id:"novita",label:"Novita AI",category:"aggregator",baseUrl:"https://api.novita.ai/v3/openai",defaultModel:"meta-llama/llama-3.3-70b-instruct",suggestedModels:["meta-llama/llama-3.3-70b-instruct","qwen/qwen-2.5-72b-instruct"],docsUrl:"https://novita.ai/docs/api-reference",oaiCompat:!0,initials:"NV",logoSlug:"novita"},{id:"hyperbolic",label:"Hyperbolic",category:"aggregator",baseUrl:"https://api.hyperbolic.xyz/v1",defaultModel:"meta-llama/Meta-Llama-3.1-70B-Instruct",suggestedModels:["meta-llama/Meta-Llama-3.1-70B-Instruct","Qwen/Qwen2.5-Coder-32B-Instruct"],docsUrl:"https://docs.hyperbolic.xyz",oaiCompat:!0,initials:"HY",logoSlug:"hyperbolic"},{id:"deepseek-official",label:"DeepSeek (Official)",category:"china",baseUrl:"https://api.deepseek.com",defaultModel:"deepseek-chat",suggestedModels:["deepseek-chat","deepseek-reasoner","deepseek-v3.1"],docsUrl:"https://api-docs.deepseek.com",oaiCompat:!0,initials:"DS",logoSlug:"deepseek"},{id:"siliconflow",label:"SiliconFlow / 硅基流动",category:"china",baseUrl:"https://api.siliconflow.cn/v1",defaultModel:"deepseek-ai/DeepSeek-V3",suggestedModels:["deepseek-ai/DeepSeek-V3","deepseek-ai/DeepSeek-R1","Qwen/Qwen2.5-72B-Instruct","meta-llama/Meta-Llama-3.1-70B-Instruct"],docsUrl:"https://docs.siliconflow.cn",oaiCompat:!0,initials:"SF",logoSlug:"siliconcloud"},{id:"moonshot",label:"Moonshot / Kimi",category:"china",baseUrl:"https://api.moonshot.cn/v1",defaultModel:"kimi-latest",suggestedModels:["kimi-k2","kimi-latest","moonshot-v1-128k","moonshot-v1-32k","moonshot-v1-8k"],docsUrl:"https://platform.moonshot.cn/docs",oaiCompat:!0,initials:"MK",logoSlug:"moonshot"},{id:"zhipu",label:"Zhipu GLM / 智谱",category:"china",baseUrl:"https://open.bigmodel.cn/api/paas/v4",defaultModel:"glm-4.5",suggestedModels:["glm-4.5","glm-4-plus","glm-4-air","glm-4-long","glm-4-flash"],docsUrl:"https://bigmodel.cn/dev/api",oaiCompat:!0,initials:"ZP",logoSlug:"zhipu"},{id:"doubao",label:"Doubao / 火山方舟",category:"china",baseUrl:"https://ark.cn-beijing.volces.com/api/v3",defaultModel:"doubao-1.5-pro-32k",suggestedModels:["doubao-1.5-pro-32k","doubao-1.5-pro-256k","doubao-pro-32k","doubao-lite-32k"],docsUrl:"https://www.volcengine.com/docs/82379",oaiCompat:!0,initials:"DB",logoSlug:"doubao",note:'模型名通常是火山方舟"接入点 ID",不是发布的模型名。'},{id:"qwen",label:"Tongyi Qwen / 通义千问",category:"china",baseUrl:"https://dashscope.aliyuncs.com/compatible-mode/v1",defaultModel:"qwen-plus",suggestedModels:["qwen3-max","qwen3-plus","qwen-max","qwen-plus","qwen-turbo","qwen2.5-72b-instruct"],docsUrl:"https://help.aliyun.com/zh/model-studio/developer-reference/use-qwen-by-calling-api",oaiCompat:!0,initials:"QW",logoSlug:"qwen"},{id:"hunyuan",label:"Tencent Hunyuan / 腾讯混元",category:"china",baseUrl:"https://api.hunyuan.cloud.tencent.com/v1",defaultModel:"hunyuan-pro",suggestedModels:["hunyuan-turbo","hunyuan-pro","hunyuan-standard","hunyuan-lite"],docsUrl:"https://cloud.tencent.com/document/product/1729/97732",oaiCompat:!0,initials:"HY",logoSlug:"hunyuan"},{id:"yi",label:"01.AI Yi / 零一万物",category:"china",baseUrl:"https://api.lingyiwanwu.com/v1",defaultModel:"yi-large",suggestedModels:["yi-large","yi-large-turbo","yi-medium","yi-vision"],docsUrl:"https://platform.lingyiwanwu.com/docs",oaiCompat:!0,initials:"YI",logoSlug:"yi"},{id:"modelscope",label:"ModelScope / 魔搭",category:"china",baseUrl:"https://api-inference.modelscope.cn/v1",defaultModel:"Qwen/Qwen2.5-72B-Instruct",suggestedModels:["Qwen/Qwen2.5-72B-Instruct","deepseek-ai/DeepSeek-V3","meta-llama/Llama-3.3-70B-Instruct"],docsUrl:"https://modelscope.cn/docs/model-service/API-Inference",oaiCompat:!0,initials:"MS",logoSlug:"modelscope"},{id:"ppio",label:"PPIO / 派欧云",category:"china",baseUrl:"https://api.ppinfra.com/v3/openai",defaultModel:"deepseek/deepseek-v3",suggestedModels:["deepseek/deepseek-v3","deepseek/deepseek-r1","qwen/qwen2.5-72b-instruct","meta-llama/llama-3.3-70b-instruct"],docsUrl:"https://ppinfra.com/docs",oaiCompat:!0,initials:"PP",logoSlug:"ppio"},{id:"baidu",label:"Baidu Qianfan / 文心一言",category:"china",baseUrl:"https://qianfan.baidubce.com/v2",defaultModel:"ernie-4.0-8k",suggestedModels:["ernie-4.0-8k","ernie-4.0-turbo-8k","ernie-3.5-8k"],docsUrl:"https://cloud.baidu.com/doc/qianfan-api/index.html",oaiCompat:!0,initials:"BD",logoSlug:"wenxin"},{id:"minimax",label:"MiniMax",category:"china",baseUrl:"https://api.minimax.chat/v1",defaultModel:"abab6.5s-chat",suggestedModels:["abab6.5s-chat","abab6.5-chat","minimax-text-01"],docsUrl:"https://platform.minimaxi.com/document/algorithm-concept",oaiCompat:!0,initials:"MM",logoSlug:"minimax"},{id:"stepfun",label:"Stepfun / 阶跃星辰",category:"china",baseUrl:"https://api.stepfun.com/v1",defaultModel:"step-1-8k",suggestedModels:["step-1-8k","step-1-32k","step-2-16k"],docsUrl:"https://platform.stepfun.com/docs",oaiCompat:!0,initials:"ST",logoSlug:"stepfun"},{id:"ollama",label:"Ollama",category:"selfhost",baseUrl:"http://localhost:11434/v1",defaultModel:"llama3.3",suggestedModels:["llama3.3","qwen2.5","deepseek-r1","mistral"],docsUrl:"https://ollama.com/library",oaiCompat:!0,initials:"OL",logoSlug:"ollama",note:"本地 Ollama 通常无需 API Key,留空即可。"},{id:"vllm",label:"vLLM",category:"selfhost",baseUrl:"http://localhost:8000/v1",defaultModel:"meta-llama/Meta-Llama-3-8B-Instruct",suggestedModels:["meta-llama/Meta-Llama-3-8B-Instruct","Qwen/Qwen2.5-7B-Instruct"],docsUrl:"https://docs.vllm.ai/en/stable/serving/openai_compatible_server.html",oaiCompat:!0,initials:"VL",logoSlug:"vllm",note:"vLLM 默认以 OpenAI 兼容模式启动,API Key 任意字符串即可。"},{id:"lmstudio",label:"LM Studio",category:"selfhost",baseUrl:"http://localhost:1234/v1",defaultModel:"local-model",suggestedModels:["local-model"],docsUrl:"https://lmstudio.ai/docs/local-server",oaiCompat:!0,initials:"LM",logoSlug:"lmstudio",note:'在 LM Studio 中开启 "Local Inference Server",端口默认 1234。'},{id:"tgi",label:"Text Generation Inference (TGI)",category:"selfhost",baseUrl:"http://localhost:8080/v1",defaultModel:"tgi",suggestedModels:["tgi"],docsUrl:"https://huggingface.co/docs/text-generation-inference/messages_api",oaiCompat:!0,initials:"TG",logoSlug:"huggingface"},{id:"xinference",label:"Xinference",category:"selfhost",baseUrl:"http://localhost:9997/v1",defaultModel:"qwen2.5-instruct",suggestedModels:["qwen2.5-instruct","llama-3.3-instruct","deepseek-r1-distill-qwen"],docsUrl:"https://inference.readthedocs.io/en/latest/models/builtin/llm.html",oaiCompat:!0,initials:"XI",logoSlug:"xinference",note:"通过模型 UID 接入 Xinference 本地实例。"},{id:"localai",label:"LocalAI",category:"selfhost",baseUrl:"http://localhost:8080/v1",defaultModel:"gpt-3.5-turbo",suggestedModels:["gpt-3.5-turbo"],docsUrl:"https://localai.io",oaiCompat:!0,initials:"LA",logoSlug:"localai",note:"OpenAI 兼容的本地推理网关,模型名按本地配置填写。"},{id:"custom",label:"Custom (OpenAI Compatible)",category:"selfhost",baseUrl:"",defaultModel:"",suggestedModels:[],oaiCompat:!0,initials:"CU",note:"任何兼容 OpenAI /v1/chat/completions 协议的端点。"}],B=A.reduce((a,b)=>(a[b.id]=b,a),{}),C=[{id:"frontier",labelZh:"主流闭源 SaaS",labelEn:"Frontier SaaS"},{id:"aggregator",labelZh:"推理聚合 / 路由",labelEn:"Inference Aggregators"},{id:"china",labelZh:"国内厂商",labelEn:"China Providers"},{id:"selfhost",labelZh:"本地 / 自部署",labelEn:"Self-hosted"}],D={"deepseek-official":{baseUrl:"https://api.deepseek.com",model:"deepseek-chat"},siliconflow:{baseUrl:"https://api.siliconflow.cn/v1",model:"deepseek-ai/DeepSeek-V3"},openai:{baseUrl:"https://api.openai.com/v1",model:"gpt-4o"},anthropic:{baseUrl:"https://api.anthropic.com/v1",model:"claude-3-5-sonnet-20240620"},custom:{baseUrl:"",model:""}},E={"deepseek-official":{label:"DeepSeek (Official)",monogram:"DS",category:"cn"},siliconflow:{label:"SiliconFlow",monogram:"SF",category:"cn"},openai:{label:"OpenAI",monogram:"OA",category:"saas"},anthropic:{label:"Anthropic",monogram:"AN",category:"saas"},custom:{label:"Custom (OpenAI Compatible)",monogram:"CX",category:"other"}},F=a=>!!a&&a.startsWith("default_"),G=a=>a.apiKey?"ok":"unconfigured";function H({}={}){let{user:a}=(0,x.useAuth)(),{t:c,locale:g}=(0,y.useLocale)(),[h,i]=(0,d.useState)([]),[j,k]=(0,d.useState)("default"),[l,n]=(0,d.useState)(null),[o,p]=(0,d.useState)({id:"new",name:"zh"===g?"新配置":"New Config",provider:"deepseek-official",model:"deepseek-chat"}),[q,r]=(0,d.useState)(!1),[s,t]=(0,d.useState)(null),[u,v]=(0,d.useState)(!1),[A,B]=(0,d.useState)(""),[C,D]=(0,d.useState)("all"),[O,P]=(0,d.useState)(null),[Q,U]=(0,d.useState)({}),[ad,ae]=(0,d.useState)(!1),[af,ag]=(0,d.useState)(!1),[ah,ai]=(0,d.useState)(null),aj=(0,d.useCallback)(async()=>{if(!a)return void v(!0);try{let b=await (0,w.apiFetch)(`/api/eval/settings?user=${encodeURIComponent(a)}`);if(b.ok){let a=await b.json();a.configs&&(i(a.configs),k(a.activeConfigId||a.configs[0]?.id||"default"))}}catch(a){console.error("Failed to fetch settings",a)}finally{v(!0)}},[a]);(0,d.useEffect)(()=>{aj()},[aj]),(0,d.useEffect)(()=>{U(a=>{let b={...a};for(let a of h)a.id in b||(b[a.id]=G(a));for(let a of Object.keys(b))h.find(b=>b.id===a)||delete b[a];return b})},[h]);let ak=(0,d.useCallback)(async()=>{if(ad||0===h.length)return;ae(!0),U(a=>{let b={...a};for(let a of h)b[a.id]=a.apiKey?"checking":"unconfigured";return b});let b=await Promise.all(h.map(async b=>{if(!b.apiKey)return[b.id,"unconfigured"];try{let c=await (0,w.apiFetch)("/api/eval/settings/test",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({provider:b.provider,apiKey:b.apiKey,baseUrl:b.baseUrl,model:b.model,user:a,configId:b.id})}),d=await c.json().catch(()=>({success:!1}));return[b.id,d.success?"ok":"failed"]}catch{return[b.id,"failed"]}}));U(a=>{let c={...a};for(let[a,d]of b)c[a]=d;return c}),ae(!1)},[h,ad]),al=(0,d.useCallback)(async(b,c)=>(0,w.apiFetch)("/api/eval/settings",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({settings:{activeConfigId:c,configs:b},user:a})}),[a]),am=async()=>{r(!0),t({type:"info",msg:"zh"===g?"正在测试连接…":"Testing connection…"});try{let b=[...h],c={...o};"new"===c.id?(c.id=`config_${Date.now()}`,b.push(c)):b=b.map(a=>a.id===c.id?c:a);let d=await (0,w.apiFetch)("/api/eval/settings/test",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({provider:c.provider,apiKey:c.apiKey,baseUrl:c.baseUrl,model:c.model,user:a,configId:c.id})}),e=await d.json();if(!e.success){t({type:"error",msg:("zh"===g?"连接测试失败:":"Connection test failed: ")+e.error}),r(!1);return}let f=j;(1===b.length||"default"===j)&&(f=c.id);let i=await al(b,f);if(i.ok)await aj(),n(null),ai(null),t({type:"success",msg:"zh"===g?"已保存":"Saved"}),setTimeout(()=>t(null),1500);else{let a=await i.json().catch(()=>({}));t({type:"error",msg:("zh"===g?"保存失败:":"Save failed: ")+(a.error||i.statusText)})}}catch(a){t({type:"error",msg:`Error: ${a.message}`})}finally{r(!1)}},ar=async a=>{(await al(h,a)).ok&&(k(a),t({type:"success",msg:"zh"===g?"默认模型已切换":"Active model updated"}),setTimeout(()=>t(null),1500))},as=async a=>{let b=h.filter(b=>b.id!==a),c=j;a===j&&(c=b[0]?.id||"default"),(await al(b,c)).ok&&(i(b),k(c),t({type:"success",msg:"zh"===g?"已删除":"Deleted"}),setTimeout(()=>t(null),1500))},at=()=>{ag(!0),ai(null),n(null),t(null)},au=(0,d.useMemo)(()=>{let a=A.trim().toLowerCase();return h.filter(b=>("all"===C||E[b.provider]?.category===C)&&(!a||b.name.toLowerCase().includes(a)||(b.model||"").toLowerCase().includes(a)||(b.baseUrl||"").toLowerCase().includes(a)||(E[b.provider]?.label||b.provider||"").toLowerCase().includes(a)))},[h,A,C]),av=(0,d.useMemo)(()=>{let a={saas:0,cn:0,local:0,other:0};for(let b of h){let c=E[b.provider]?.category;c&&(a[c]+=1)}return a},[h]),aw=h.find(a=>a.id===j),ax=new Set(h.map(a=>a.provider)).size;return u?(0,b.jsxs)("div",{style:V,children:[(0,b.jsxs)("div",{style:W,children:[s&&(0,b.jsx)(I,{status:s}),af?(0,b.jsx)(S,{onPick:a=>{var b;p({id:"new",name:a.label,provider:"openai"===(b=a.id)?"openai":"anthropic"===b?"anthropic":"deepseek-official"===b?"deepseek-official":"siliconflow"===b?"siliconflow":"custom",baseUrl:a.baseUrl,model:a.defaultModel,apiKey:""}),ai(a),ag(!1),n("new"),t(null)},onCancel:()=>ag(!1),locale:g}):l?(0,b.jsx)(T,{config:o,setConfig:p,onCancel:()=>{n(null),ai(null)},onReselect:"new"===l?()=>{n(null),ag(!0)}:void 0,onSave:am,isSaving:q,isDefault:F(l),pickedProvider:ah,locale:g}):(0,b.jsxs)(b.Fragment,{children:[(0,b.jsxs)("div",{style:X,children:[(0,b.jsx)("p",{style:Y,children:"zh"===g?(0,b.jsxs)(b.Fragment,{children:["注册并管理评测 / 优化使用的 ",(0,b.jsx)("b",{style:Z,children:"LLM"}),",可切换默认、编辑参数、管理 API Key。兼容 ",(0,b.jsx)("b",{style:Z,children:"OpenAI / Anthropic / DeepSeek"})," 等主流厂商,亦支持",(0,b.jsx)("b",{style:Z,children:"国内厂商"}),"与",(0,b.jsx)("b",{style:Z,children:"本地推理"}),"部署。"]}):(0,b.jsxs)(b.Fragment,{children:["Register and manage LLMs used for evaluation/optimization. Set the default, edit parameters, and manage API keys. Compatible with ",(0,b.jsx)("b",{style:Z,children:"OpenAI / Anthropic / DeepSeek"})," as well as ",(0,b.jsx)("b",{style:Z,children:"regional providers"})," and ",(0,b.jsx)("b",{style:Z,children:"self-hosted"})," inference."]})}),(0,b.jsxs)("button",{style:aL,onClick:at,children:[(0,b.jsx)(e.Plus,{size:14,strokeWidth:2.4}),"zh"===g?"新增模型":"New Model"]})]}),(0,b.jsxs)("div",{style:$,children:[(0,b.jsxs)("div",{style:_,children:[(0,b.jsxs)("div",{style:an,children:[(0,b.jsxs)("div",{style:ao,children:[(0,b.jsx)(f.Search,{size:14,strokeWidth:2,style:{position:"absolute",left:11,top:"50%",transform:"translateY(-50%)",color:"var(--foreground-muted)"}}),(0,b.jsx)("input",{type:"text",placeholder:"zh"===g?"搜索名称 / 模型 / Base URL":"Search name / model / Base URL",value:A,onChange:a=>B(a.target.value),style:ap})]}),(0,b.jsxs)("div",{style:aq,children:[(0,b.jsx)(J,{active:"all"===C,onClick:()=>D("all"),count:h.length,children:"zh"===g?"全部":"All"}),(0,b.jsx)(J,{active:"saas"===C,onClick:()=>D("saas"),count:av.saas,children:"zh"===g?"主流闭源":"SaaS"}),(0,b.jsx)(J,{active:"cn"===C,onClick:()=>D("cn"),count:av.cn,children:"zh"===g?"国内厂商":"Regional"}),(0,b.jsx)(J,{active:"other"===C,onClick:()=>D("other"),count:av.other,children:"zh"===g?"自定义":"Custom"})]})]}),(0,b.jsxs)("div",{style:ab,children:[(0,b.jsx)("span",{style:{fontSize:13.5,fontWeight:600,color:"var(--foreground)"},children:"zh"===g?"已注册模型":"Registered Models"}),(0,b.jsx)("span",{style:ac,children:au.length}),(0,b.jsx)("span",{style:{flex:1}}),(0,b.jsx)("span",{style:{fontSize:11.5,color:"var(--foreground-muted)"},children:"zh"===g?`容量 ${h.length} / 32`:`Capacity ${h.length} / 32`})]}),0===au.length?(0,b.jsx)(R,{locale:g,hasConfigs:h.length>0,onAdd:at,onReset:()=>{B(""),D("all")}}):(0,b.jsx)("div",{style:{display:"flex",flexDirection:"column",gap:10},children:au.map(a=>(0,b.jsx)(K,{config:a,isActive:a.id===j,isDefault:F(a.id),health:Q[a.id],onActivate:()=>ar(a.id),onEdit:()=>{p({...a}),ai(null),n(a.id),ag(!1),t(null)},onDelete:()=>P(a),locale:g},a.id))}),(0,b.jsxs)("div",{style:aS,children:[(0,b.jsx)("div",{style:aT,children:(0,b.jsx)(m.Info,{size:16})}),(0,b.jsxs)("div",{style:{flex:1,fontSize:12.5,color:"var(--foreground-secondary)",lineHeight:1.6},children:[(0,b.jsx)("b",{style:{color:"var(--foreground)",fontWeight:600},children:"zh"===g?"提示":"Tip"})," · ","zh"===g?"至少保留一个默认模型,用于评测与优化任务的兜底调用。删除默认模型前,请先指定其它模型为默认。":"Keep at least one default model for evaluation/optimization fallback. Switch the default before deleting it."]})]})]}),(0,b.jsxs)("aside",{style:aa,children:[(0,b.jsx)(L,{active:aw,providerKinds:ax,registeredCount:h.length,locale:g}),(0,b.jsx)(M,{configs:h,healthMap:Q,isRechecking:ad,onRecheck:ak,locale:g}),(0,b.jsx)(N,{locale:g})]})]})]})]}),(0,b.jsx)(z.ConfirmDialog,{open:!!O,onOpenChange:a=>!a&&P(null),tone:"danger",title:"zh"===g?"删除该模型?":"Delete this model?",description:O?"zh"===g?`将永久删除「${O.name}」配置,无法恢复。`:`"${O.name}" will be permanently removed.`:"",confirmText:"zh"===g?"删除":"Delete",cancelText:"zh"===g?"取消":"Cancel",onConfirm:async()=>{O&&await as(O.id)}})]}):(0,b.jsx)("div",{style:{padding:32,color:"var(--foreground-muted)",fontSize:12},children:c("common.loading")})}function I({status:a}){let c="success"===a.type?{bg:"var(--success-subtle)",fg:"var(--success)",border:"var(--success-subtle-border)"}:"error"===a.type?{bg:"var(--error-subtle)",fg:"var(--error)",border:"var(--error-subtle-border)"}:{bg:"var(--primary-subtle)",fg:"var(--primary)",border:"var(--primary-subtle-border)"};return(0,b.jsxs)("div",{style:{padding:"8px 12px",marginBottom:14,borderRadius:8,background:c.bg,color:c.fg,border:`1px solid ${c.border}`,fontSize:12,fontWeight:500,display:"flex",alignItems:"center",gap:6},children:["success"===a.type&&(0,b.jsx)(l.Check,{size:13,strokeWidth:2.5}),a.msg]})}function J({active:a,onClick:c,count:d,children:e}){return(0,b.jsxs)("button",{type:"button",onClick:c,"aria-pressed":a,className:"ai-filter-chip","data-active":a?"true":"false",style:ar,children:[e,"number"==typeof d&&d>0&&(0,b.jsx)("span",{className:"ai-filter-chip__count",children:d})]})}function K({config:a,isActive:c,isDefault:d,health:e,onActivate:f,onEdit:g,onDelete:h,locale:m}){let p=E[a.provider]??{label:a.provider||"Unknown",monogram:(a.provider?.slice(0,2)||"??").toUpperCase(),category:"other"},q=function(a,b){let c=B[a];if(c)return c;if(!b)return;let d=b.replace(/\/+$/,"").toLowerCase();return A.find(a=>{if(!a.baseUrl)return!1;let b=a.baseUrl.replace(/\/+$/,"").toLowerCase();return d===b||d.startsWith(b)})}(a.provider,a.baseUrl),r=e??G(a);return(0,b.jsxs)("article",{style:{...as,borderColor:c?"var(--primary-subtle-border)":"var(--card-border)",background:c?"linear-gradient(180deg, var(--primary-subtle) 0%, var(--card-bg) 56px)":"var(--card-bg)"},children:[c&&(0,b.jsx)("span",{style:at}),(0,b.jsx)(P,{slug:q?.logoSlug,initials:p.monogram,size:48,radius:12}),(0,b.jsxs)("div",{style:{minWidth:0},children:[(0,b.jsxs)("div",{style:{display:"flex",alignItems:"center",gap:8,flexWrap:"wrap",marginBottom:6},children:[(0,b.jsx)("span",{style:av,children:a.name}),c&&(0,b.jsxs)("span",{style:ax,children:[(0,b.jsx)(o,{size:11,strokeWidth:2.5}),"zh"===m?"当前默认":"Default"]}),"ok"===r&&(0,b.jsxs)("span",{style:ay,children:[(0,b.jsx)("span",{style:aD}),"zh"===m?"正常":"Healthy"]}),"checking"===r&&(0,b.jsxs)("span",{style:aA,children:[(0,b.jsx)(u.Loader2,{size:11,strokeWidth:2.4,style:{animation:"spin 1s linear infinite"}}),"zh"===m?"连接中":"Checking"]}),"failed"===r&&(0,b.jsxs)("span",{style:aB,children:[(0,b.jsx)(v.XCircle,{size:11,strokeWidth:2.4}),"zh"===m?"Key 已失效":"Key invalid"]}),"unconfigured"===r&&(0,b.jsx)("span",{style:az,children:"zh"===m?"未设置 Key":"No key"}),d&&(0,b.jsx)("span",{style:aC,children:"zh"===m?"系统默认":"System"})]}),(0,b.jsxs)("div",{style:aE,children:[(0,b.jsxs)("span",{style:aF,children:[(0,b.jsx)("span",{style:aG,children:"Provider"}),(0,b.jsx)("span",{style:{...aH,fontFamily:"var(--font-mono)",fontSize:12},children:p.label})]}),(0,b.jsx)("span",{style:aI}),(0,b.jsxs)("span",{style:aF,children:[(0,b.jsx)("span",{style:aG,children:"Model"}),(0,b.jsx)("span",{style:{...aH,fontFamily:"var(--font-mono)",fontSize:12},children:a.model||"—"})]}),a.baseUrl&&(0,b.jsxs)(b.Fragment,{children:[(0,b.jsx)("span",{style:aI}),(0,b.jsxs)("span",{style:aF,children:[(0,b.jsx)("span",{style:aG,children:"Base URL"}),(0,b.jsx)("span",{style:{...aH,fontFamily:"var(--font-mono)",fontSize:12},title:a.baseUrl,children:a.baseUrl})]})]})]}),(0,b.jsxs)("div",{style:aJ,children:[(0,b.jsx)(i.Key,{size:12,strokeWidth:2.2,style:{color:"var(--primary)"}}),a.apiKey?(0,b.jsx)("span",{style:{fontFamily:"var(--font-mono)",fontSize:12},children:a.apiKey}):(0,b.jsx)("span",{style:{color:"var(--foreground-muted)",fontFamily:"var(--font-mono)",fontSize:12},children:"zh"===m?"(未设置)":"(not set)"})]})]}),(0,b.jsxs)("div",{style:aK,children:[c?(0,b.jsxs)("button",{style:aO,disabled:!0,children:[(0,b.jsx)(n.CircleCheck,{size:13,strokeWidth:2.4}),"zh"===m?"当前使用":"In use"]}):(0,b.jsxs)("button",{style:aN,onClick:f,children:[(0,b.jsx)(l.Check,{size:13,strokeWidth:2.2}),"zh"===m?"设为默认":"Set default"]}),!d&&(0,b.jsxs)(b.Fragment,{children:[(0,b.jsxs)("button",{style:aN,onClick:g,children:[(0,b.jsx)(j.Pencil,{size:13,strokeWidth:2.2}),"zh"===m?"编辑":"Edit"]}),(0,b.jsxs)("button",{style:aP,onClick:h,children:[(0,b.jsx)(k.Trash2,{size:13,strokeWidth:2.2}),"zh"===m?"删除":"Delete"]})]})]})]})}function L({active:a,providerKinds:c,registeredCount:d,locale:e}){return(0,b.jsxs)("section",{style:ad,children:[(0,b.jsxs)("header",{style:ae,children:[(0,b.jsx)(p,{size:13,strokeWidth:2.2,style:{color:"var(--primary)"}}),(0,b.jsx)("span",{children:"zh"===e?"当前默认":"Current Default"})]}),a?(0,b.jsxs)("ul",{style:af,children:[(0,b.jsx)(O,{label:"zh"===e?"名称":"Name",value:a.name,bold:!0}),(0,b.jsx)(O,{label:"Provider",value:a.provider,mono:!0}),(0,b.jsx)(O,{label:"Model",value:a.model||"—",mono:!0}),a.baseUrl&&(0,b.jsx)(O,{label:"Base URL",value:a.baseUrl,mono:!0,ellipsis:!0}),(0,b.jsx)(O,{label:"zh"===e?"已注册":"Registered",value:`${d} / 32`}),(0,b.jsx)(O,{label:"zh"===e?"供应商种类":"Providers",value:String(c)})]}):(0,b.jsx)("div",{style:{padding:"4px 0",fontSize:12,color:"var(--foreground-muted)"},children:"zh"===e?"尚未选定默认模型。":"No default selected."})]})}function M({configs:a,healthMap:c,isRechecking:d,onRecheck:e,locale:f}){return(0,b.jsxs)("section",{style:ad,children:[(0,b.jsxs)("header",{style:ae,children:[(0,b.jsx)(q,{size:13,strokeWidth:2.2,style:{color:"var(--success)"}}),(0,b.jsx)("span",{children:"zh"===f?"健康检查":"Health Check"})]}),0===a.length?(0,b.jsx)("div",{style:{padding:"4px 0",fontSize:12,color:"var(--foreground-muted)"},children:"zh"===f?"暂无模型可检查。":"No models to check."}):(0,b.jsxs)(b.Fragment,{children:[(0,b.jsx)("ul",{style:{display:"flex",flexDirection:"column",gap:8,padding:0,margin:0,listStyle:"none"},children:a.map(a=>{let d=c[a.id]??G(a);return(0,b.jsxs)("li",{style:ag,children:[(0,b.jsx)("span",{style:{flex:1,minWidth:0,fontSize:12.5,color:"var(--foreground)",overflow:"hidden",textOverflow:"ellipsis",whiteSpace:"nowrap"},title:a.model||a.name,children:a.model||a.name}),(0,b.jsx)(Q,{state:d,locale:f})]},a.id)})}),(0,b.jsxs)("button",{style:ah,onClick:e,disabled:d,children:[(0,b.jsx)(t.RefreshCw,{size:12,strokeWidth:2.2,style:d?{animation:"spin 1s linear infinite"}:void 0}),d?"zh"===f?"检查中…":"Checking…":"zh"===f?"重新检查":"Re-check"]})]})]})}function N({locale:a}){return(0,b.jsxs)("section",{style:ad,children:[(0,b.jsxs)("header",{style:ae,children:[(0,b.jsx)(r.BookOpen,{size:13,strokeWidth:2.2,style:{color:"var(--foreground-secondary)"}}),(0,b.jsx)("span",{children:"zh"===a?"相关文档":"Related Docs"})]}),(0,b.jsx)("ul",{style:{display:"flex",flexDirection:"column",gap:2,padding:0,margin:0,listStyle:"none"},children:("zh"===a?[{label:"如何获取 API Key",href:"#"},{label:"密钥加密与轮转策略",href:"#"},{label:"模型注册最佳实践",href:"#"}]:[{label:"How to obtain an API Key",href:"#"},{label:"Key encryption & rotation",href:"#"},{label:"Model registry best practices",href:"#"}]).map(a=>(0,b.jsx)("li",{children:(0,b.jsxs)("a",{href:a.href,style:ai,children:[(0,b.jsx)("span",{style:{flex:1,minWidth:0,overflow:"hidden",textOverflow:"ellipsis",whiteSpace:"nowrap"},children:a.label}),(0,b.jsx)(s.ExternalLink,{size:12,strokeWidth:2,style:{color:"var(--foreground-muted)",flexShrink:0}})]})},a.label))})]})}function O({label:a,value:c,mono:d,bold:e,ellipsis:f}){return(0,b.jsxs)("li",{style:{display:"flex",alignItems:"center",gap:12,padding:"5px 0",borderBottom:"1px dashed var(--border)",minWidth:0},children:[(0,b.jsx)("span",{style:{fontSize:11.5,color:"var(--foreground-muted)",flexShrink:0},children:a}),(0,b.jsx)("span",{style:{flex:1,minWidth:0,textAlign:"right",fontSize:12,color:"var(--foreground)",fontWeight:e?600:500,fontFamily:d?"var(--font-mono)":"inherit",overflow:"hidden",textOverflow:"ellipsis",whiteSpace:"nowrap"},title:f?c:void 0,children:c})]})}function P({slug:a,initials:c,size:e=36,radius:f=10}){let[g,h]=(0,d.useState)("color");(0,d.useEffect)(()=>{h("color")},[a]);let i="failed"===g?void 0:function(a,b="color"){if(a)return`https://cdn.jsdelivr.net/npm/@lobehub/icons-static-svg@latest/icons/${a}${"color"===b?"-color":""}.svg`}(a,g),j=!!i;return(0,b.jsx)("div",{style:{...au,width:e,height:e,borderRadius:f,fontSize:Math.round(.32*e),background:j?"#ffffff":"var(--background-secondary)",padding:j?Math.round(.16*e):0,color:"var(--foreground)"},children:j?(0,b.jsx)("img",{src:i,alt:c,onError:()=>h("color"===g?"plain":"failed"),style:{width:"100%",height:"100%",objectFit:"contain"},loading:"lazy"}):c})}function Q({state:a,locale:c}){return"ok"===a?(0,b.jsxs)("span",{style:ay,children:[(0,b.jsx)(n.CircleCheck,{size:11,strokeWidth:2.4}),"zh"===c?"正常":"OK"]}):"checking"===a?(0,b.jsxs)("span",{style:aA,children:[(0,b.jsx)(u.Loader2,{size:11,strokeWidth:2.4,style:{animation:"spin 1s linear infinite"}}),"zh"===c?"检测中":"Checking"]}):"failed"===a?(0,b.jsxs)("span",{style:aB,children:[(0,b.jsx)(v.XCircle,{size:11,strokeWidth:2.4}),"zh"===c?"失效":"Failed"]}):(0,b.jsx)("span",{style:az,children:"zh"===c?"未配置":"No key"})}function R({locale:a,hasConfigs:c,onAdd:d,onReset:f}){return(0,b.jsxs)("div",{style:aU,children:[(0,b.jsx)("div",{style:aV,children:(0,b.jsx)(h,{size:20})}),(0,b.jsx)("div",{style:{fontSize:13.5,color:"var(--foreground)",fontWeight:500,marginBottom:4},children:c?"zh"===a?"没有匹配的模型":"No matching models":"zh"===a?"尚未注册任何模型":"No models registered yet"}),(0,b.jsx)("div",{style:{fontSize:12,color:"var(--foreground-muted)",marginBottom:14,textAlign:"center",maxWidth:360},children:c?"zh"===a?"试试调整搜索关键字或筛选条件。":"Try a different keyword or filter.":"zh"===a?"注册首个 LLM 后即可在评测、优化、对比中使用。":"Register your first LLM to use it for evaluation, optimization and comparison."}),c?(0,b.jsx)("button",{style:aN,onClick:f,children:"zh"===a?"清除筛选":"Reset filters"}):(0,b.jsxs)("button",{style:aL,onClick:d,children:[(0,b.jsx)(e.Plus,{size:14,strokeWidth:2.4}),"zh"===a?"注册首个模型":"Register your first model"]})]})}function S({onPick:a,onCancel:c,locale:e}){let[g,h]=(0,d.useState)(""),[i,j]=(0,d.useState)("all"),k=(0,d.useMemo)(()=>{let a=g.trim().toLowerCase();return A.filter(b=>("all"===i||b.category===i)&&(!a||b.label.toLowerCase().includes(a)||b.id.toLowerCase().includes(a)||b.defaultModel.toLowerCase().includes(a)||b.suggestedModels.some(b=>b.toLowerCase().includes(a))))},[g,i]),l=(0,d.useMemo)(()=>{let a={};for(let b of k)a[b.category]||(a[b.category]=[]),a[b.category].push(b);return a},[k]),m=(0,d.useMemo)(()=>{let a={all:A.length};for(let b of A)a[b.category]=(a[b.category]||0)+1;return a},[]);return(0,b.jsxs)("div",{style:aQ,children:[(0,b.jsxs)("div",{style:{display:"flex",alignItems:"flex-start",justifyContent:"space-between",marginBottom:16,gap:16},children:[(0,b.jsxs)("div",{children:[(0,b.jsx)("div",{style:{fontSize:15,fontWeight:600,color:"var(--foreground)",letterSpacing:"-0.01em"},children:"zh"===e?"选择模型供应商":"Choose a Model Provider"}),(0,b.jsx)("div",{style:{fontSize:12,color:"var(--foreground-muted)",marginTop:3},children:"zh"===e?"挑选预置供应商即可自动填写 Base URL 与默认模型,下一步只需录入 API Key。":"Pick a built-in provider — Base URL and default model auto-fill. You only need to paste an API key next."})]}),(0,b.jsx)("button",{style:aN,onClick:c,children:"zh"===e?"返回列表":"Back to list"})]}),(0,b.jsxs)("div",{style:{display:"flex",alignItems:"center",gap:12,marginBottom:14,flexWrap:"wrap"},children:[(0,b.jsxs)("div",{style:{...ao,width:280},children:[(0,b.jsx)(f.Search,{size:14,strokeWidth:2,style:{position:"absolute",left:11,top:"50%",transform:"translateY(-50%)",color:"var(--foreground-muted)"}}),(0,b.jsx)("input",{type:"text",placeholder:"zh"===e?"搜索供应商 / 模型":"Search provider / model",value:g,onChange:a=>h(a.target.value),style:ap})]}),(0,b.jsxs)("div",{style:aq,children:[(0,b.jsx)(J,{active:"all"===i,onClick:()=>j("all"),count:m.all,children:"zh"===e?"全部":"All"}),C.map(a=>(0,b.jsx)(J,{active:i===a.id,onClick:()=>j(a.id),count:m[a.id]||0,children:"zh"===e?a.labelZh:a.labelEn},a.id))]})]}),0===k.length?(0,b.jsx)("div",{style:{padding:"40px 0",textAlign:"center",fontSize:13,color:"var(--foreground-muted)"},children:"zh"===e?"没有匹配的供应商。":"No matching provider."}):(0,b.jsx)("div",{style:{display:"flex",flexDirection:"column",gap:22},children:C.map(c=>{let d=l[c.id];return d&&0!==d.length?(0,b.jsxs)("section",{children:[(0,b.jsxs)("div",{style:aj,children:[(0,b.jsx)("span",{children:"zh"===e?c.labelZh:c.labelEn}),(0,b.jsx)("span",{style:ac,children:d.length})]}),(0,b.jsx)("div",{style:ak,children:d.map(c=>(0,b.jsxs)("button",{type:"button",onClick:()=>a(c),style:al,className:"provider-pick-card",children:[(0,b.jsx)(P,{slug:c.logoSlug,initials:c.initials,size:36,radius:9}),(0,b.jsxs)("div",{style:{minWidth:0,flex:1},children:[(0,b.jsx)("div",{style:{fontSize:13.5,fontWeight:600,color:"var(--foreground)",overflow:"hidden",textOverflow:"ellipsis",whiteSpace:"nowrap"},children:c.label}),(0,b.jsx)("div",{style:{marginTop:3,fontSize:11.5,color:"var(--foreground-muted)",fontFamily:"var(--font-mono)",overflow:"hidden",textOverflow:"ellipsis",whiteSpace:"nowrap"},title:c.suggestedModels.join(" · ")||c.defaultModel,children:c.suggestedModels.slice(0,3).join(" · ")||c.defaultModel||("zh"===e?"自填模型":"Custom model")})]})]},c.id))})]},c.id):null})})]})}function T({config:a,setConfig:c,onCancel:d,onReselect:e,onSave:f,isSaving:g,isDefault:h,pickedProvider:i,locale:j}){return(0,b.jsxs)("div",{style:aQ,children:[(0,b.jsxs)("div",{style:{display:"flex",alignItems:"flex-start",justifyContent:"space-between",marginBottom:18,gap:16},children:[(0,b.jsxs)("div",{style:{display:"flex",alignItems:"center",gap:12,minWidth:0},children:[i&&(0,b.jsx)(P,{slug:i.logoSlug,initials:i.initials,size:40,radius:10}),(0,b.jsxs)("div",{style:{minWidth:0},children:[(0,b.jsx)("div",{style:{fontSize:15,fontWeight:600,color:"var(--foreground)",letterSpacing:"-0.01em"},children:"new"===a.id?i?i.label:"zh"===j?"新增模型":"New Model":"zh"===j?"编辑模型":"Edit Model"}),(0,b.jsx)("div",{style:{fontSize:12,color:"var(--foreground-muted)",marginTop:3},children:i?.note?i.note:"zh"===j?"保存前会自动测试连接,连通后才会写入。":"Connection is tested before saving."})]})]}),(0,b.jsxs)("div",{style:{display:"flex",gap:8,flexShrink:0},children:[e&&(0,b.jsx)("button",{style:aN,onClick:e,children:"zh"===j?"← 选择其它供应商":"← Choose other provider"}),(0,b.jsx)("button",{style:aN,onClick:d,children:"zh"===j?"返回列表":"Back to list"})]})]}),(0,b.jsxs)("div",{style:{display:"grid",gridTemplateColumns:"repeat(2, minmax(0, 1fr))",gap:"14px 18px"},children:[(0,b.jsx)(U,{label:"zh"===j?"配置名称":"Config Name",children:(0,b.jsx)("input",{style:aR,placeholder:"zh"===j?"例如:我的 DeepSeek":"e.g. My DeepSeek",value:a.name||"",disabled:h,onChange:b=>c({...a,name:b.target.value})})}),(0,b.jsx)(U,{label:"zh"===j?"供应商":"Provider",children:(0,b.jsxs)("select",{style:aR,value:a.provider,disabled:h,onChange:b=>{var d;let e;return e=D[d=b.target.value],void c({...a,provider:d,baseUrl:e.baseUrl||a.baseUrl,model:e.model||a.model})},children:[(0,b.jsx)("option",{value:"deepseek-official",children:"DeepSeek (Official)"}),(0,b.jsx)("option",{value:"siliconflow",children:"SiliconFlow"}),(0,b.jsx)("option",{value:"openai",children:"OpenAI"}),(0,b.jsx)("option",{value:"anthropic",children:"Anthropic"}),(0,b.jsx)("option",{value:"custom",children:"Custom (OpenAI Compatible)"})]})}),(0,b.jsx)(U,{label:"Base URL",children:(0,b.jsx)("input",{style:aR,placeholder:"https://api.deepseek.com",value:a.baseUrl||"",disabled:h,onChange:b=>c({...a,baseUrl:b.target.value.replace(/\/chat\/completions\/?$/,"")})})}),(0,b.jsxs)(U,{label:"zh"===j?"模型名":"Model Name",children:[(0,b.jsx)("input",{style:aR,placeholder:"deepseek-chat / gpt-4o / ...",value:a.model||"",disabled:h,onChange:b=>c({...a,model:b.target.value})}),i&&i.suggestedModels.length>0&&(0,b.jsx)("div",{style:{display:"flex",flexWrap:"wrap",gap:5,marginTop:7},children:i.suggestedModels.slice(0,6).map(d=>(0,b.jsx)("button",{type:"button",onClick:()=>c({...a,model:d}),style:{...am,background:a.model===d?"var(--primary-subtle)":"var(--background-secondary)",color:a.model===d?"var(--primary)":"var(--foreground-secondary)",borderColor:a.model===d?"var(--primary-subtle-border)":"var(--border)"},children:d},d))})]}),(0,b.jsx)("div",{style:{gridColumn:"1 / -1"},children:(0,b.jsxs)(U,{label:"zh"===j?"API 密钥":"API Key",children:[(0,b.jsx)("input",{style:{...aR,fontFamily:"var(--font-mono, ui-monospace, monospace)"},type:"text",placeholder:"sk-...",value:a.apiKey||"",disabled:h,onChange:b=>c({...a,apiKey:b.target.value})}),(a.apiKey||"").includes("•")&&(0,b.jsx)("div",{style:{marginTop:6,fontSize:11.5,color:"var(--foreground-muted)"},children:"zh"===j?"出于安全考虑仅显示掩码。保持不变则沿用原 Key;如需更换请清空后输入新 Key。":"Masked for security. Leave unchanged to keep the current key; clear and type a new key to replace it."}),i?.docsUrl&&(0,b.jsx)("div",{style:{marginTop:6,fontSize:11.5,color:"var(--foreground-muted)"},children:(0,b.jsxs)("a",{href:i.docsUrl,target:"_blank",rel:"noreferrer",style:{color:"var(--primary)",textDecoration:"none",display:"inline-flex",alignItems:"center",gap:4},children:["zh"===j?"如何获取 API Key":"How to obtain an API Key",(0,b.jsx)(s.ExternalLink,{size:11,strokeWidth:2})]})})]})})]}),(0,b.jsxs)("div",{style:{display:"flex",justifyContent:"flex-end",gap:8,marginTop:20},children:[(0,b.jsx)("button",{style:aN,onClick:d,children:"zh"===j?"取消":"Cancel"}),!h&&(0,b.jsx)("button",{style:g?aM:aL,disabled:g,onClick:f,children:g?"zh"===j?"测试并保存中…":"Testing & Saving…":"zh"===j?"测试连接并保存":"Test & Save"})]})]})}function U({label:a,children:c}){return(0,b.jsxs)("div",{children:[(0,b.jsx)("div",{style:{fontSize:11.5,fontWeight:500,color:"var(--foreground-secondary)",marginBottom:6,letterSpacing:"0.01em"},children:a}),c]})}let V={flex:1,minHeight:0,overflowY:"auto",padding:"24px 28px 40px",width:"100%"},W={maxWidth:1320,margin:"0 auto"},X={display:"flex",alignItems:"flex-start",justifyContent:"space-between",gap:24,marginBottom:22},Y={margin:0,fontSize:13,lineHeight:1.65,color:"var(--foreground-secondary)",maxWidth:720},Z={color:"var(--foreground)",fontWeight:600},$={display:"grid",gridTemplateColumns:"minmax(0, 1fr) 300px",gap:22,alignItems:"flex-start"},_={minWidth:0,display:"flex",flexDirection:"column",gap:14},aa={display:"flex",flexDirection:"column",gap:14,position:"sticky",top:0},ab={display:"flex",alignItems:"center",gap:8,padding:"2px 2px 6px",borderBottom:"1px solid var(--border)"},ac={display:"inline-flex",alignItems:"center",padding:"1px 8px",fontSize:11,fontWeight:600,fontFamily:"var(--font-mono)",color:"var(--foreground-secondary)",background:"var(--background-secondary)",border:"1px solid var(--border)",borderRadius:999,lineHeight:1.5},ad={background:"var(--card-bg)",border:"1px solid var(--card-border)",borderRadius:12,padding:"14px 16px 12px",display:"flex",flexDirection:"column",gap:10},ae={display:"flex",alignItems:"center",gap:7,fontSize:13,fontWeight:600,color:"var(--foreground)",letterSpacing:"-0.005em",paddingBottom:8,borderBottom:"1px solid var(--border)"},af={display:"flex",flexDirection:"column",padding:0,margin:0,listStyle:"none"},ag={display:"flex",alignItems:"center",gap:10,padding:"5px 0",minWidth:0},ah={width:"100%",display:"inline-flex",alignItems:"center",justifyContent:"center",gap:6,padding:"7px 10px",marginTop:4,background:"var(--card-bg)",color:"var(--foreground-secondary)",border:"1px solid var(--border)",borderRadius:7,fontSize:12,fontWeight:500,cursor:"pointer",transition:"all .12s ease"},ai={display:"flex",alignItems:"center",gap:8,padding:"7px 8px",fontSize:12.5,color:"var(--foreground-secondary)",textDecoration:"none",borderRadius:6,transition:"background .1s"},aj={display:"flex",alignItems:"center",gap:8,marginBottom:10,fontSize:12,fontWeight:600,color:"var(--foreground-secondary)",textTransform:"uppercase",letterSpacing:"0.08em"},ak={display:"grid",gridTemplateColumns:"repeat(auto-fill, minmax(220px, 1fr))",gap:10},al={display:"flex",alignItems:"center",gap:12,padding:"11px 12px",background:"var(--card-bg)",border:"1px solid var(--card-border)",borderRadius:10,cursor:"pointer",textAlign:"left",fontFamily:"inherit",transition:"all .12s ease",minWidth:0},am={padding:"3px 10px",fontSize:11,fontFamily:"var(--font-mono)",border:"1px solid var(--border)",borderRadius:999,cursor:"pointer",transition:"all .12s",lineHeight:1.5},an={display:"flex",alignItems:"center",gap:14,marginBottom:14,flexWrap:"wrap"},ao={position:"relative",width:280},ap={width:"100%",height:34,padding:"0 12px 0 32px",border:"1px solid var(--input-border)",borderRadius:8,background:"var(--input-bg)",fontSize:12.5,color:"var(--foreground)",outline:"none"},aq={display:"inline-flex",flexWrap:"wrap",gap:6},ar={padding:"6px 12px",fontSize:12,fontWeight:500,borderRadius:6,cursor:"pointer",fontFamily:"inherit",display:"inline-flex",alignItems:"center",gap:6,whiteSpace:"nowrap",lineHeight:1.4},as={background:"var(--card-bg)",border:"1px solid var(--card-border)",borderRadius:12,padding:"18px 22px",display:"grid",gridTemplateColumns:"auto 1fr auto",gap:22,alignItems:"center",transition:"all .15s ease",position:"relative",overflow:"hidden"},at={position:"absolute",left:0,top:0,bottom:0,width:3,background:"var(--primary)"},au={width:48,height:48,borderRadius:12,background:"var(--background-secondary)",border:"1px solid var(--card-border)",display:"grid",placeItems:"center",fontWeight:600,fontSize:14,color:"var(--foreground-secondary)",letterSpacing:"0.02em",flexShrink:0},av={fontSize:16,fontWeight:600,color:"var(--foreground)",letterSpacing:"-0.01em"},aw={display:"inline-flex",alignItems:"center",gap:4,padding:"2px 8px",fontSize:10.5,fontWeight:600,borderRadius:999,lineHeight:1.5,letterSpacing:"0.01em"},ax={...aw,background:"var(--primary)",color:"var(--primary-foreground)"},ay={...aw,background:"var(--success-subtle)",color:"var(--success)"},az={...aw,background:"var(--warning-subtle)",color:"var(--warning)"},aA={...aw,background:"var(--primary-subtle)",color:"var(--primary)"},aB={...aw,background:"var(--error-subtle)",color:"var(--error)"},aC={...aw,background:"var(--background-secondary)",color:"var(--foreground-secondary)",border:"1px solid var(--border)"},aD={width:5,height:5,background:"var(--success)",borderRadius:"50%"},aE={display:"flex",alignItems:"center",gap:12,flexWrap:"wrap",marginBottom:10,fontSize:12.5,color:"var(--foreground-secondary)"},aF={display:"inline-flex",alignItems:"center",gap:6,minWidth:0},aG={fontSize:10.5,fontWeight:500,color:"var(--foreground-muted)",textTransform:"uppercase",letterSpacing:"0.06em"},aH={color:"var(--foreground)",fontWeight:500,maxWidth:280,overflow:"hidden",textOverflow:"ellipsis",whiteSpace:"nowrap"},aI={width:1,height:11,background:"var(--border)"},aJ={display:"inline-flex",alignItems:"center",gap:8,padding:"5px 10px",background:"var(--background-secondary)",border:"1px solid var(--border)",borderRadius:7,color:"var(--foreground-secondary)",maxWidth:"fit-content"},aK={display:"flex",alignItems:"center",gap:6,paddingLeft:16,borderLeft:"1px dashed var(--border)"},aL={display:"inline-flex",alignItems:"center",gap:6,padding:"7px 14px",background:"var(--primary)",color:"var(--primary-foreground)",border:"none",borderRadius:8,fontSize:12.5,fontWeight:500,cursor:"pointer",transition:"background .12s ease",lineHeight:1.4},aM={...aL,opacity:.6,cursor:"not-allowed"},aN={display:"inline-flex",alignItems:"center",gap:5,padding:"6px 12px",background:"var(--card-bg)",color:"var(--foreground-secondary)",borderWidth:1,borderStyle:"solid",borderColor:"var(--border)",borderRadius:7,fontSize:12,fontWeight:500,cursor:"pointer",transition:"all .12s ease",lineHeight:1.4},aO={...aN,background:"var(--success-subtle)",color:"var(--success)",borderColor:"var(--success-subtle-border)",cursor:"default"},aP={...aN,color:"var(--foreground-secondary)"},aQ={background:"var(--card-bg)",border:"1px solid var(--card-border)",borderRadius:12,padding:"22px 26px"},aR={width:"100%",padding:"8px 10px",background:"var(--input-bg)",border:"1px solid var(--input-border)",borderRadius:7,color:"var(--foreground)",fontSize:12.5,outline:"none"},aS={marginTop:24,padding:"14px 18px",border:"1px dashed var(--border-dark)",borderRadius:10,background:"var(--background-secondary)",display:"flex",alignItems:"center",gap:12},aT={width:30,height:30,borderRadius:8,background:"var(--primary-subtle)",color:"var(--primary)",display:"grid",placeItems:"center",flexShrink:0},aU={padding:"40px 24px",background:"var(--card-bg)",border:"1px dashed var(--border-dark)",borderRadius:12,display:"flex",flexDirection:"column",alignItems:"center",justifyContent:"center"},aV={width:44,height:44,borderRadius:10,background:"var(--background-secondary)",color:"var(--foreground-muted)",display:"grid",placeItems:"center",marginBottom:12};var aW=a.i(960798);function aX(){let{t:a}=(0,y.useLocale)();return(0,b.jsxs)(b.Fragment,{children:[(0,b.jsx)(c.AppTopBar,{title:(0,b.jsx)(aW.Term,{id:"model-registry",label:a("nav.modelRegistry")})}),(0,b.jsx)(H,{})]})}a.s(["default",()=>aX],685260)}];
1
+ module.exports=[685260,a=>{"use strict";var b=a.i(187924),c=a.i(729936),d=a.i(572131),e=a.i(403512),f=a.i(233540),g=a.i(164831);let h=(0,g.default)("server",[["rect",{width:"20",height:"8",x:"2",y:"2",rx:"2",ry:"2",key:"ngkwjq"}],["rect",{width:"20",height:"8",x:"2",y:"14",rx:"2",ry:"2",key:"iecqi9"}],["line",{x1:"6",x2:"6.01",y1:"6",y2:"6",key:"16zg32"}],["line",{x1:"6",x2:"6.01",y1:"18",y2:"18",key:"nzw8ys"}]]);var i=a.i(118343),j=a.i(590629),k=a.i(980180),l=a.i(752562),m=a.i(752357),n=a.i(597024);let o=(0,g.default)("badge-check",[["path",{d:"M3.85 8.62a4 4 0 0 1 4.78-4.77 4 4 0 0 1 6.74 0 4 4 0 0 1 4.78 4.78 4 4 0 0 1 0 6.74 4 4 0 0 1-4.77 4.78 4 4 0 0 1-6.75 0 4 4 0 0 1-4.78-4.77 4 4 0 0 1 0-6.76Z",key:"3c2336"}],["path",{d:"m9 12 2 2 4-4",key:"dzmm74"}]]),p=(0,g.default)("star",[["path",{d:"M11.525 2.295a.53.53 0 0 1 .95 0l2.31 4.679a2.123 2.123 0 0 0 1.595 1.16l5.166.756a.53.53 0 0 1 .294.904l-3.736 3.638a2.123 2.123 0 0 0-.611 1.878l.882 5.14a.53.53 0 0 1-.771.56l-4.618-2.428a2.122 2.122 0 0 0-1.973 0L6.396 21.01a.53.53 0 0 1-.77-.56l.881-5.139a2.122 2.122 0 0 0-.611-1.879L2.16 9.795a.53.53 0 0 1 .294-.906l5.165-.755a2.122 2.122 0 0 0 1.597-1.16z",key:"r04s7s"}]]),q=(0,g.default)("heart-pulse",[["path",{d:"M2 9.5a5.5 5.5 0 0 1 9.591-3.676.56.56 0 0 0 .818 0A5.49 5.49 0 0 1 22 9.5c0 2.29-1.5 4-3 5.5l-5.492 5.313a2 2 0 0 1-3 .019L5 15c-1.5-1.5-3-3.2-3-5.5",key:"mvr1a0"}],["path",{d:"M3.22 13H9.5l.5-1 2 4.5 2-7 1.5 3.5h5.27",key:"auskq0"}]]);var r=a.i(118688),s=a.i(168370),t=a.i(519783),u=a.i(875160),v=a.i(211134),w=a.i(575110),x=a.i(943408),y=a.i(106927),z=a.i(757430);let A=[{id:"openai",label:"OpenAI",category:"frontier",baseUrl:"https://api.openai.com/v1",defaultModel:"gpt-4o-mini",suggestedModels:["gpt-5","gpt-5-mini","gpt-4o","gpt-4o-mini","gpt-4.1","o3","o3-mini","o4-mini"],docsUrl:"https://platform.openai.com/docs/models",oaiCompat:!0,initials:"OA",logoSlug:"openai"},{id:"anthropic",label:"Anthropic",category:"frontier",baseUrl:"https://api.anthropic.com/v1",defaultModel:"claude-sonnet-4-6",suggestedModels:["claude-opus-4-7","claude-sonnet-4-6","claude-haiku-4-5","claude-3-5-sonnet-latest"],docsUrl:"https://docs.anthropic.com/en/docs/models-overview",oaiCompat:!0,initials:"AN",logoSlug:"anthropic",note:"使用 Anthropic OpenAI 兼容端点(/v1/messages 自动转换)。"},{id:"gemini",label:"Google Gemini",category:"frontier",baseUrl:"https://generativelanguage.googleapis.com/v1beta/openai/",defaultModel:"gemini-2.5-flash",suggestedModels:["gemini-2.5-pro","gemini-2.5-flash","gemini-2.0-flash","gemini-1.5-pro"],docsUrl:"https://ai.google.dev/gemini-api/docs/openai",oaiCompat:!0,initials:"GM",logoSlug:"gemini",note:"走 Gemini OpenAI 兼容层(generativelanguage.googleapis.com)。"},{id:"azure-openai",label:"Azure OpenAI",category:"frontier",baseUrl:"https://YOUR-RESOURCE.openai.azure.com/openai",defaultModel:"gpt-4o",suggestedModels:["gpt-4o","gpt-4o-mini","gpt-4-turbo","o1-mini"],docsUrl:"https://learn.microsoft.com/azure/ai-services/openai/reference",oaiCompat:!0,initials:"AZ",logoSlug:"azure",note:"Base URL 形如 https://<resource>.openai.azure.com/openai/deployments/<deployment>"},{id:"xai",label:"xAI Grok",category:"frontier",baseUrl:"https://api.x.ai/v1",defaultModel:"grok-3",suggestedModels:["grok-4","grok-3","grok-3-mini","grok-2-1212","grok-2-vision-1212"],docsUrl:"https://docs.x.ai/api",oaiCompat:!0,initials:"GR",logoSlug:"grok"},{id:"mistral",label:"Mistral AI",category:"frontier",baseUrl:"https://api.mistral.ai/v1",defaultModel:"mistral-large-latest",suggestedModels:["mistral-large-latest","mistral-large-2411","mistral-small-latest","codestral-2501","open-mistral-nemo"],docsUrl:"https://docs.mistral.ai/getting-started/models/models_overview/",oaiCompat:!0,initials:"MI",logoSlug:"mistral"},{id:"cohere",label:"Cohere",category:"frontier",baseUrl:"https://api.cohere.ai/compatibility/v1",defaultModel:"command-r-plus",suggestedModels:["command-r-plus","command-r","command-r7b"],docsUrl:"https://docs.cohere.com/docs/compatibility-api",oaiCompat:!0,initials:"CO",logoSlug:"cohere"},{id:"openrouter",label:"OpenRouter",category:"aggregator",baseUrl:"https://openrouter.ai/api/v1",defaultModel:"openai/gpt-4o-mini",suggestedModels:["anthropic/claude-3.5-sonnet","openai/gpt-4o","meta-llama/llama-3.3-70b-instruct","google/gemini-2.0-flash-exp:free"],docsUrl:"https://openrouter.ai/docs",oaiCompat:!0,initials:"OR",logoSlug:"openrouter"},{id:"together",label:"Together AI",category:"aggregator",baseUrl:"https://api.together.xyz/v1",defaultModel:"meta-llama/Llama-3.3-70B-Instruct-Turbo",suggestedModels:["meta-llama/Llama-3.3-70B-Instruct-Turbo","deepseek-ai/DeepSeek-V3","Qwen/Qwen2.5-72B-Instruct-Turbo"],docsUrl:"https://docs.together.ai/docs/quickstart",oaiCompat:!0,initials:"TG",logoSlug:"together"},{id:"fireworks",label:"Fireworks AI",category:"aggregator",baseUrl:"https://api.fireworks.ai/inference/v1",defaultModel:"accounts/fireworks/models/llama-v3p3-70b-instruct",suggestedModels:["accounts/fireworks/models/llama-v3p3-70b-instruct","accounts/fireworks/models/deepseek-v3","accounts/fireworks/models/qwen2p5-72b-instruct"],docsUrl:"https://docs.fireworks.ai",oaiCompat:!0,initials:"FW",logoSlug:"fireworks"},{id:"groq",label:"Groq",category:"aggregator",baseUrl:"https://api.groq.com/openai/v1",defaultModel:"llama-3.3-70b-versatile",suggestedModels:["llama-3.3-70b-versatile","llama-3.1-8b-instant","mixtral-8x7b-32768"],docsUrl:"https://console.groq.com/docs/models",oaiCompat:!0,initials:"GQ",logoSlug:"groq"},{id:"deepinfra",label:"DeepInfra",category:"aggregator",baseUrl:"https://api.deepinfra.com/v1/openai",defaultModel:"meta-llama/Meta-Llama-3.1-70B-Instruct",suggestedModels:["meta-llama/Meta-Llama-3.1-70B-Instruct","deepseek-ai/DeepSeek-V3","Qwen/Qwen2.5-72B-Instruct"],docsUrl:"https://deepinfra.com/docs",oaiCompat:!0,initials:"DI",logoSlug:"deepinfra"},{id:"perplexity",label:"Perplexity",category:"aggregator",baseUrl:"https://api.perplexity.ai",defaultModel:"sonar",suggestedModels:["sonar","sonar-pro","sonar-reasoning","sonar-reasoning-pro"],docsUrl:"https://docs.perplexity.ai",oaiCompat:!0,initials:"PX",logoSlug:"perplexity"},{id:"nvidia",label:"NVIDIA NIM",category:"aggregator",baseUrl:"https://integrate.api.nvidia.com/v1",defaultModel:"meta/llama-3.3-70b-instruct",suggestedModels:["meta/llama-3.3-70b-instruct","deepseek-ai/deepseek-r1","nvidia/llama-3.1-nemotron-70b-instruct"],docsUrl:"https://docs.api.nvidia.com",oaiCompat:!0,initials:"NV",logoSlug:"nvidia"},{id:"databricks",label:"Databricks",category:"aggregator",baseUrl:"https://YOUR-WORKSPACE.cloud.databricks.com/serving-endpoints",defaultModel:"databricks-meta-llama-3-3-70b-instruct",suggestedModels:["databricks-meta-llama-3-3-70b-instruct","databricks-dbrx-instruct"],docsUrl:"https://docs.databricks.com/aws/en/machine-learning/foundation-models/api-reference",oaiCompat:!0,initials:"DB",logoSlug:"databricks",note:"Base URL 形如 https://<workspace>.cloud.databricks.com/serving-endpoints"},{id:"novita",label:"Novita AI",category:"aggregator",baseUrl:"https://api.novita.ai/v3/openai",defaultModel:"meta-llama/llama-3.3-70b-instruct",suggestedModels:["meta-llama/llama-3.3-70b-instruct","qwen/qwen-2.5-72b-instruct"],docsUrl:"https://novita.ai/docs/api-reference",oaiCompat:!0,initials:"NV",logoSlug:"novita"},{id:"hyperbolic",label:"Hyperbolic",category:"aggregator",baseUrl:"https://api.hyperbolic.xyz/v1",defaultModel:"meta-llama/Meta-Llama-3.1-70B-Instruct",suggestedModels:["meta-llama/Meta-Llama-3.1-70B-Instruct","Qwen/Qwen2.5-Coder-32B-Instruct"],docsUrl:"https://docs.hyperbolic.xyz",oaiCompat:!0,initials:"HY",logoSlug:"hyperbolic"},{id:"deepseek-official",label:"DeepSeek (Official)",category:"china",baseUrl:"https://api.deepseek.com",defaultModel:"deepseek-chat",suggestedModels:["deepseek-chat","deepseek-reasoner","deepseek-v3.1"],docsUrl:"https://api-docs.deepseek.com",oaiCompat:!0,initials:"DS",logoSlug:"deepseek"},{id:"siliconflow",label:"SiliconFlow / 硅基流动",category:"china",baseUrl:"https://api.siliconflow.cn/v1",defaultModel:"deepseek-ai/DeepSeek-V3",suggestedModels:["deepseek-ai/DeepSeek-V3","deepseek-ai/DeepSeek-R1","Qwen/Qwen2.5-72B-Instruct","meta-llama/Meta-Llama-3.1-70B-Instruct"],docsUrl:"https://docs.siliconflow.cn",oaiCompat:!0,initials:"SF",logoSlug:"siliconcloud"},{id:"moonshot",label:"Moonshot / Kimi",category:"china",baseUrl:"https://api.moonshot.cn/v1",defaultModel:"kimi-latest",suggestedModels:["kimi-k2","kimi-latest","moonshot-v1-128k","moonshot-v1-32k","moonshot-v1-8k"],docsUrl:"https://platform.moonshot.cn/docs",oaiCompat:!0,initials:"MK",logoSlug:"moonshot"},{id:"zhipu",label:"Zhipu GLM / 智谱",category:"china",baseUrl:"https://open.bigmodel.cn/api/paas/v4",defaultModel:"glm-4.5",suggestedModels:["glm-4.5","glm-4-plus","glm-4-air","glm-4-long","glm-4-flash"],docsUrl:"https://bigmodel.cn/dev/api",oaiCompat:!0,initials:"ZP",logoSlug:"zhipu"},{id:"doubao",label:"Doubao / 火山方舟",category:"china",baseUrl:"https://ark.cn-beijing.volces.com/api/v3",defaultModel:"doubao-1.5-pro-32k",suggestedModels:["doubao-1.5-pro-32k","doubao-1.5-pro-256k","doubao-pro-32k","doubao-lite-32k"],docsUrl:"https://www.volcengine.com/docs/82379",oaiCompat:!0,initials:"DB",logoSlug:"doubao",note:'模型名通常是火山方舟"接入点 ID",不是发布的模型名。'},{id:"qwen",label:"Tongyi Qwen / 通义千问",category:"china",baseUrl:"https://dashscope.aliyuncs.com/compatible-mode/v1",defaultModel:"qwen-plus",suggestedModels:["qwen3-max","qwen3-plus","qwen-max","qwen-plus","qwen-turbo","qwen2.5-72b-instruct"],docsUrl:"https://help.aliyun.com/zh/model-studio/developer-reference/use-qwen-by-calling-api",oaiCompat:!0,initials:"QW",logoSlug:"qwen"},{id:"hunyuan",label:"Tencent Hunyuan / 腾讯混元",category:"china",baseUrl:"https://api.hunyuan.cloud.tencent.com/v1",defaultModel:"hunyuan-pro",suggestedModels:["hunyuan-turbo","hunyuan-pro","hunyuan-standard","hunyuan-lite"],docsUrl:"https://cloud.tencent.com/document/product/1729/97732",oaiCompat:!0,initials:"HY",logoSlug:"hunyuan"},{id:"yi",label:"01.AI Yi / 零一万物",category:"china",baseUrl:"https://api.lingyiwanwu.com/v1",defaultModel:"yi-large",suggestedModels:["yi-large","yi-large-turbo","yi-medium","yi-vision"],docsUrl:"https://platform.lingyiwanwu.com/docs",oaiCompat:!0,initials:"YI",logoSlug:"yi"},{id:"modelscope",label:"ModelScope / 魔搭",category:"china",baseUrl:"https://api-inference.modelscope.cn/v1",defaultModel:"Qwen/Qwen2.5-72B-Instruct",suggestedModels:["Qwen/Qwen2.5-72B-Instruct","deepseek-ai/DeepSeek-V3","meta-llama/Llama-3.3-70B-Instruct"],docsUrl:"https://modelscope.cn/docs/model-service/API-Inference",oaiCompat:!0,initials:"MS",logoSlug:"modelscope"},{id:"ppio",label:"PPIO / 派欧云",category:"china",baseUrl:"https://api.ppinfra.com/v3/openai",defaultModel:"deepseek/deepseek-v3",suggestedModels:["deepseek/deepseek-v3","deepseek/deepseek-r1","qwen/qwen2.5-72b-instruct","meta-llama/llama-3.3-70b-instruct"],docsUrl:"https://ppinfra.com/docs",oaiCompat:!0,initials:"PP",logoSlug:"ppio"},{id:"baidu",label:"Baidu Qianfan / 文心一言",category:"china",baseUrl:"https://qianfan.baidubce.com/v2",defaultModel:"ernie-4.0-8k",suggestedModels:["ernie-4.0-8k","ernie-4.0-turbo-8k","ernie-3.5-8k"],docsUrl:"https://cloud.baidu.com/doc/qianfan-api/index.html",oaiCompat:!0,initials:"BD",logoSlug:"wenxin"},{id:"minimax",label:"MiniMax",category:"china",baseUrl:"https://api.minimax.chat/v1",defaultModel:"abab6.5s-chat",suggestedModels:["abab6.5s-chat","abab6.5-chat","minimax-text-01"],docsUrl:"https://platform.minimaxi.com/document/algorithm-concept",oaiCompat:!0,initials:"MM",logoSlug:"minimax"},{id:"stepfun",label:"Stepfun / 阶跃星辰",category:"china",baseUrl:"https://api.stepfun.com/v1",defaultModel:"step-1-8k",suggestedModels:["step-1-8k","step-1-32k","step-2-16k"],docsUrl:"https://platform.stepfun.com/docs",oaiCompat:!0,initials:"ST",logoSlug:"stepfun"},{id:"ollama",label:"Ollama",category:"selfhost",baseUrl:"http://localhost:11434/v1",defaultModel:"llama3.3",suggestedModels:["llama3.3","qwen2.5","deepseek-r1","mistral"],docsUrl:"https://ollama.com/library",oaiCompat:!0,initials:"OL",logoSlug:"ollama",note:"本地 Ollama 通常无需 API Key,留空即可。"},{id:"vllm",label:"vLLM",category:"selfhost",baseUrl:"http://localhost:8000/v1",defaultModel:"meta-llama/Meta-Llama-3-8B-Instruct",suggestedModels:["meta-llama/Meta-Llama-3-8B-Instruct","Qwen/Qwen2.5-7B-Instruct"],docsUrl:"https://docs.vllm.ai/en/stable/serving/openai_compatible_server.html",oaiCompat:!0,initials:"VL",logoSlug:"vllm",note:"vLLM 默认以 OpenAI 兼容模式启动,API Key 任意字符串即可。"},{id:"lmstudio",label:"LM Studio",category:"selfhost",baseUrl:"http://localhost:1234/v1",defaultModel:"local-model",suggestedModels:["local-model"],docsUrl:"https://lmstudio.ai/docs/local-server",oaiCompat:!0,initials:"LM",logoSlug:"lmstudio",note:'在 LM Studio 中开启 "Local Inference Server",端口默认 1234。'},{id:"tgi",label:"Text Generation Inference (TGI)",category:"selfhost",baseUrl:"http://localhost:8080/v1",defaultModel:"tgi",suggestedModels:["tgi"],docsUrl:"https://huggingface.co/docs/text-generation-inference/messages_api",oaiCompat:!0,initials:"TG",logoSlug:"huggingface"},{id:"xinference",label:"Xinference",category:"selfhost",baseUrl:"http://localhost:9997/v1",defaultModel:"qwen2.5-instruct",suggestedModels:["qwen2.5-instruct","llama-3.3-instruct","deepseek-r1-distill-qwen"],docsUrl:"https://inference.readthedocs.io/en/latest/models/builtin/llm.html",oaiCompat:!0,initials:"XI",logoSlug:"xinference",note:"通过模型 UID 接入 Xinference 本地实例。"},{id:"localai",label:"LocalAI",category:"selfhost",baseUrl:"http://localhost:8080/v1",defaultModel:"gpt-3.5-turbo",suggestedModels:["gpt-3.5-turbo"],docsUrl:"https://localai.io",oaiCompat:!0,initials:"LA",logoSlug:"localai",note:"OpenAI 兼容的本地推理网关,模型名按本地配置填写。"},{id:"custom",label:"Custom (OpenAI Compatible)",category:"selfhost",baseUrl:"",defaultModel:"",suggestedModels:[],oaiCompat:!0,initials:"CU",note:"任何兼容 OpenAI /v1/chat/completions 协议的端点。"}],B=A.reduce((a,b)=>(a[b.id]=b,a),{}),C=[{id:"frontier",labelZh:"主流闭源 SaaS",labelEn:"Frontier SaaS"},{id:"aggregator",labelZh:"推理聚合 / 路由",labelEn:"Inference Aggregators"},{id:"china",labelZh:"国内厂商",labelEn:"China Providers"},{id:"selfhost",labelZh:"本地 / 自部署",labelEn:"Self-hosted"}],D={"deepseek-official":{baseUrl:"https://api.deepseek.com",model:"deepseek-chat"},siliconflow:{baseUrl:"https://api.siliconflow.cn/v1",model:"deepseek-ai/DeepSeek-V3"},openai:{baseUrl:"https://api.openai.com/v1",model:"gpt-4o"},anthropic:{baseUrl:"https://api.anthropic.com/v1",model:"claude-3-5-sonnet-20240620"},custom:{baseUrl:"",model:""}},E={"deepseek-official":{label:"DeepSeek (Official)",monogram:"DS",category:"cn"},siliconflow:{label:"SiliconFlow",monogram:"SF",category:"cn"},openai:{label:"OpenAI",monogram:"OA",category:"saas"},anthropic:{label:"Anthropic",monogram:"AN",category:"saas"},custom:{label:"Custom (OpenAI Compatible)",monogram:"CX",category:"other"}},F=a=>!!a&&a.startsWith("default_"),G=a=>a.apiKey?"ok":"unconfigured";function H({}={}){let{user:a}=(0,x.useAuth)(),{t:c,locale:g}=(0,y.useLocale)(),[h,i]=(0,d.useState)([]),[j,k]=(0,d.useState)("default"),[l,n]=(0,d.useState)(null),[o,p]=(0,d.useState)({id:"new",name:"zh"===g?"新配置":"New Config",provider:"deepseek-official",model:"deepseek-chat"}),[q,r]=(0,d.useState)(!1),[s,t]=(0,d.useState)(null),[u,v]=(0,d.useState)(!1),[A,B]=(0,d.useState)(""),[C,D]=(0,d.useState)("all"),[O,P]=(0,d.useState)(null),[Q,U]=(0,d.useState)({}),[ad,ae]=(0,d.useState)(!1),[af,ag]=(0,d.useState)(!1),[ah,ai]=(0,d.useState)(null),aj=(0,d.useCallback)(async()=>{if(!a)return void v(!0);try{let b=await (0,w.apiFetch)(`/api/eval/settings?user=${encodeURIComponent(a)}`);if(b.ok){let a=await b.json();a.configs&&(i(a.configs),k(a.activeConfigId||a.configs[0]?.id||"default"))}}catch(a){console.error("Failed to fetch settings",a)}finally{v(!0)}},[a]);(0,d.useEffect)(()=>{aj()},[aj]),(0,d.useEffect)(()=>{U(a=>{let b={...a};for(let a of h)a.id in b||(b[a.id]=G(a));for(let a of Object.keys(b))h.find(b=>b.id===a)||delete b[a];return b})},[h]);let ak=(0,d.useCallback)(async()=>{if(ad||0===h.length)return;ae(!0),U(a=>{let b={...a};for(let a of h)b[a.id]=a.apiKey?"checking":"unconfigured";return b});let b=await Promise.all(h.map(async b=>{if(!b.apiKey)return[b.id,"unconfigured"];try{let c=await (0,w.apiFetch)("/api/eval/settings/test",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({provider:b.provider,apiKey:b.apiKey,baseUrl:b.baseUrl,model:b.model,user:a,configId:b.id})}),d=await c.json().catch(()=>({success:!1}));return[b.id,d.success?"ok":"failed"]}catch{return[b.id,"failed"]}}));U(a=>{let c={...a};for(let[a,d]of b)c[a]=d;return c}),ae(!1)},[h,ad]),al=(0,d.useCallback)(async(b,c)=>(0,w.apiFetch)("/api/eval/settings",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({settings:{activeConfigId:c,configs:b},user:a})}),[a]),am=async()=>{r(!0),t({type:"info",msg:"zh"===g?"正在测试连接…":"Testing connection…"});try{let b=[...h],c={...o};"new"===c.id?(c.id=`config_${Date.now()}`,b.push(c)):b=b.map(a=>a.id===c.id?c:a);let d=await (0,w.apiFetch)("/api/eval/settings/test",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({provider:c.provider,apiKey:c.apiKey,baseUrl:c.baseUrl,model:c.model,user:a,configId:c.id})}),e=await d.json();if(!e.success){t({type:"error",msg:("zh"===g?"连接测试失败:":"Connection test failed: ")+e.error}),r(!1);return}let f=j;(1===b.length||"default"===j)&&(f=c.id);let i=await al(b,f);if(i.ok)await aj(),n(null),ai(null),t({type:"success",msg:"zh"===g?"已保存":"Saved"}),setTimeout(()=>t(null),1500);else{let a=await i.json().catch(()=>({}));t({type:"error",msg:("zh"===g?"保存失败:":"Save failed: ")+(a.error||i.statusText)})}}catch(a){t({type:"error",msg:`Error: ${a.message}`})}finally{r(!1)}},ar=async a=>{(await al(h,a)).ok&&(k(a),t({type:"success",msg:"zh"===g?"默认模型已切换":"Active model updated"}),setTimeout(()=>t(null),1500))},as=async a=>{let b=h.filter(b=>b.id!==a),c=j;a===j&&(c=b[0]?.id||"default"),(await al(b,c)).ok&&(i(b),k(c),t({type:"success",msg:"zh"===g?"已删除":"Deleted"}),setTimeout(()=>t(null),1500))},at=()=>{ag(!0),ai(null),n(null),t(null)},au=(0,d.useMemo)(()=>{let a=A.trim().toLowerCase();return h.filter(b=>("all"===C||E[b.provider]?.category===C)&&(!a||b.name.toLowerCase().includes(a)||(b.model||"").toLowerCase().includes(a)||(b.baseUrl||"").toLowerCase().includes(a)||(E[b.provider]?.label||b.provider||"").toLowerCase().includes(a)))},[h,A,C]),av=(0,d.useMemo)(()=>{let a={saas:0,cn:0,local:0,other:0};for(let b of h){let c=E[b.provider]?.category;c&&(a[c]+=1)}return a},[h]),aw=h.find(a=>a.id===j),ax=new Set(h.map(a=>a.provider)).size;return u?(0,b.jsxs)("div",{style:V,children:[(0,b.jsxs)("div",{style:W,children:[s&&(0,b.jsx)(I,{status:s}),af?(0,b.jsx)(S,{onPick:a=>{var b;p({id:"new",name:a.label,provider:"openai"===(b=a.id)?"openai":"anthropic"===b?"anthropic":"deepseek-official"===b?"deepseek-official":"siliconflow"===b?"siliconflow":"custom",baseUrl:a.baseUrl,model:a.defaultModel,apiKey:""}),ai(a),ag(!1),n("new"),t(null)},onCancel:()=>ag(!1),locale:g}):l?(0,b.jsx)(T,{config:o,setConfig:p,onCancel:()=>{n(null),ai(null)},onReselect:"new"===l?()=>{n(null),ag(!0)}:void 0,onSave:am,isSaving:q,isDefault:F(l),pickedProvider:ah,locale:g}):(0,b.jsxs)(b.Fragment,{children:[(0,b.jsxs)("div",{style:X,children:[(0,b.jsx)("p",{style:Y,children:"zh"===g?(0,b.jsxs)(b.Fragment,{children:["注册并管理评测 / 优化使用的 ",(0,b.jsx)("b",{style:Z,children:"LLM"}),",可切换默认、编辑参数、管理 API Key。兼容 ",(0,b.jsx)("b",{style:Z,children:"OpenAI / Anthropic / DeepSeek"})," 等主流厂商,亦支持",(0,b.jsx)("b",{style:Z,children:"国内厂商"}),"与",(0,b.jsx)("b",{style:Z,children:"本地推理"}),"部署。"]}):(0,b.jsxs)(b.Fragment,{children:["Register and manage LLMs used for evaluation/optimization. Set the default, edit parameters, and manage API keys. Compatible with ",(0,b.jsx)("b",{style:Z,children:"OpenAI / Anthropic / DeepSeek"})," as well as ",(0,b.jsx)("b",{style:Z,children:"regional providers"})," and ",(0,b.jsx)("b",{style:Z,children:"self-hosted"})," inference."]})}),(0,b.jsxs)("button",{style:aL,onClick:at,children:[(0,b.jsx)(e.Plus,{size:14,strokeWidth:2.4}),"zh"===g?"新增模型":"New Model"]})]}),(0,b.jsxs)("div",{style:$,children:[(0,b.jsxs)("div",{style:_,children:[(0,b.jsxs)("div",{style:an,children:[(0,b.jsxs)("div",{style:ao,children:[(0,b.jsx)(f.Search,{size:14,strokeWidth:2,style:{position:"absolute",left:11,top:"50%",transform:"translateY(-50%)",color:"var(--foreground-muted)"}}),(0,b.jsx)("input",{type:"text",placeholder:"zh"===g?"搜索名称 / 模型 / Base URL":"Search name / model / Base URL",value:A,onChange:a=>B(a.target.value),style:ap})]}),(0,b.jsxs)("div",{style:aq,children:[(0,b.jsx)(J,{active:"all"===C,onClick:()=>D("all"),count:h.length,children:"zh"===g?"全部":"All"}),(0,b.jsx)(J,{active:"saas"===C,onClick:()=>D("saas"),count:av.saas,children:"zh"===g?"主流闭源":"SaaS"}),(0,b.jsx)(J,{active:"cn"===C,onClick:()=>D("cn"),count:av.cn,children:"zh"===g?"国内厂商":"Regional"}),(0,b.jsx)(J,{active:"other"===C,onClick:()=>D("other"),count:av.other,children:"zh"===g?"自定义":"Custom"})]})]}),(0,b.jsxs)("div",{style:ab,children:[(0,b.jsx)("span",{style:{fontSize:13.5,fontWeight:600,color:"var(--foreground)"},children:"zh"===g?"已注册模型":"Registered Models"}),(0,b.jsx)("span",{style:ac,children:au.length}),(0,b.jsx)("span",{style:{flex:1}}),(0,b.jsx)("span",{style:{fontSize:11.5,color:"var(--foreground-muted)"},children:"zh"===g?`容量 ${h.length} / 32`:`Capacity ${h.length} / 32`})]}),0===au.length?(0,b.jsx)(R,{locale:g,hasConfigs:h.length>0,onAdd:at,onReset:()=>{B(""),D("all")}}):(0,b.jsx)("div",{style:{display:"flex",flexDirection:"column",gap:10},children:au.map(a=>(0,b.jsx)(K,{config:a,isActive:a.id===j,isDefault:F(a.id),health:Q[a.id],onActivate:()=>ar(a.id),onEdit:()=>{p({...a}),ai(null),n(a.id),ag(!1),t(null)},onDelete:()=>P(a),locale:g},a.id))}),(0,b.jsxs)("div",{style:aS,children:[(0,b.jsx)("div",{style:aT,children:(0,b.jsx)(m.Info,{size:16})}),(0,b.jsxs)("div",{style:{flex:1,fontSize:12.5,color:"var(--foreground-secondary)",lineHeight:1.6},children:[(0,b.jsx)("b",{style:{color:"var(--foreground)",fontWeight:600},children:"zh"===g?"提示":"Tip"})," · ","zh"===g?"至少保留一个默认模型,用于评测与优化任务的兜底调用。删除默认模型前,请先指定其它模型为默认。":"Keep at least one default model for evaluation/optimization fallback. Switch the default before deleting it."]})]})]}),(0,b.jsxs)("aside",{style:aa,children:[(0,b.jsx)(L,{active:aw,providerKinds:ax,registeredCount:h.length,locale:g}),(0,b.jsx)(M,{configs:h,healthMap:Q,isRechecking:ad,onRecheck:ak,locale:g}),(0,b.jsx)(N,{locale:g})]})]})]})]}),(0,b.jsx)(z.ConfirmDialog,{open:!!O,onOpenChange:a=>!a&&P(null),tone:"danger",title:"zh"===g?"删除该模型?":"Delete this model?",description:O?"zh"===g?`将永久删除「${O.name}」配置,无法恢复。`:`"${O.name}" will be permanently removed.`:"",confirmText:"zh"===g?"删除":"Delete",cancelText:"zh"===g?"取消":"Cancel",onConfirm:async()=>{O&&await as(O.id)}})]}):(0,b.jsx)("div",{style:{padding:32,color:"var(--foreground-muted)",fontSize:12},children:c("common.loading")})}function I({status:a}){let c="success"===a.type?{bg:"var(--success-subtle)",fg:"var(--success)",border:"var(--success-subtle-border)"}:"error"===a.type?{bg:"var(--error-subtle)",fg:"var(--error)",border:"var(--error-subtle-border)"}:{bg:"var(--primary-subtle)",fg:"var(--primary)",border:"var(--primary-subtle-border)"};return(0,b.jsxs)("div",{style:{padding:"8px 12px",marginBottom:14,borderRadius:8,background:c.bg,color:c.fg,border:`1px solid ${c.border}`,fontSize:12,fontWeight:500,display:"flex",alignItems:"center",gap:6},children:["success"===a.type&&(0,b.jsx)(l.Check,{size:13,strokeWidth:2.5}),a.msg]})}function J({active:a,onClick:c,count:d,children:e}){return(0,b.jsxs)("button",{type:"button",onClick:c,"aria-pressed":a,className:"ai-filter-chip","data-active":a?"true":"false",style:ar,children:[e,"number"==typeof d&&d>0&&(0,b.jsx)("span",{className:"ai-filter-chip__count",children:d})]})}function K({config:a,isActive:c,isDefault:d,health:e,onActivate:f,onEdit:g,onDelete:h,locale:m}){let p=E[a.provider]??{label:a.provider||"Unknown",monogram:(a.provider?.slice(0,2)||"??").toUpperCase(),category:"other"},q=function(a,b){let c=B[a];if(c)return c;if(!b)return;let d=b.replace(/\/+$/,"").toLowerCase();return A.find(a=>{if(!a.baseUrl)return!1;let b=a.baseUrl.replace(/\/+$/,"").toLowerCase();return d===b||d.startsWith(b)})}(a.provider,a.baseUrl),r=e??G(a);return(0,b.jsxs)("article",{style:{...as,borderColor:c?"var(--primary-subtle-border)":"var(--card-border)",background:c?"linear-gradient(180deg, var(--primary-subtle) 0%, var(--card-bg) 56px)":"var(--card-bg)"},children:[c&&(0,b.jsx)("span",{style:at}),(0,b.jsx)(P,{slug:q?.logoSlug,initials:p.monogram,size:48,radius:12}),(0,b.jsxs)("div",{style:{minWidth:0},children:[(0,b.jsxs)("div",{style:{display:"flex",alignItems:"center",gap:8,flexWrap:"wrap",marginBottom:6},children:[(0,b.jsx)("span",{style:av,children:a.name}),c&&(0,b.jsxs)("span",{style:ax,children:[(0,b.jsx)(o,{size:11,strokeWidth:2.5}),"zh"===m?"当前默认":"Default"]}),"ok"===r&&(0,b.jsxs)("span",{style:ay,children:[(0,b.jsx)("span",{style:aD}),"zh"===m?"正常":"Healthy"]}),"checking"===r&&(0,b.jsxs)("span",{style:aA,children:[(0,b.jsx)(u.Loader2,{size:11,strokeWidth:2.4,style:{animation:"spin 1s linear infinite"}}),"zh"===m?"连接中":"Checking"]}),"failed"===r&&(0,b.jsxs)("span",{style:aB,children:[(0,b.jsx)(v.XCircle,{size:11,strokeWidth:2.4}),"zh"===m?"Key 已失效":"Key invalid"]}),"unconfigured"===r&&(0,b.jsx)("span",{style:az,children:"zh"===m?"未设置 Key":"No key"}),d&&(0,b.jsx)("span",{style:aC,children:"zh"===m?"系统默认":"System"})]}),(0,b.jsxs)("div",{style:aE,children:[(0,b.jsxs)("span",{style:aF,children:[(0,b.jsx)("span",{style:aG,children:"Provider"}),(0,b.jsx)("span",{style:{...aH,fontFamily:"var(--font-mono)",fontSize:12},children:p.label})]}),(0,b.jsx)("span",{style:aI}),(0,b.jsxs)("span",{style:aF,children:[(0,b.jsx)("span",{style:aG,children:"Model"}),(0,b.jsx)("span",{style:{...aH,fontFamily:"var(--font-mono)",fontSize:12},children:a.model||"—"})]}),a.baseUrl&&(0,b.jsxs)(b.Fragment,{children:[(0,b.jsx)("span",{style:aI}),(0,b.jsxs)("span",{style:aF,children:[(0,b.jsx)("span",{style:aG,children:"Base URL"}),(0,b.jsx)("span",{style:{...aH,fontFamily:"var(--font-mono)",fontSize:12},title:a.baseUrl,children:a.baseUrl})]})]})]}),(0,b.jsxs)("div",{style:aJ,children:[(0,b.jsx)(i.Key,{size:12,strokeWidth:2.2,style:{color:"var(--primary)"}}),a.apiKey?(0,b.jsx)("span",{style:{fontFamily:"var(--font-mono)",fontSize:12},children:a.apiKey}):(0,b.jsx)("span",{style:{color:"var(--foreground-muted)",fontFamily:"var(--font-mono)",fontSize:12},children:"zh"===m?"(未设置)":"(not set)"})]})]}),(0,b.jsxs)("div",{style:aK,children:[c?(0,b.jsxs)("button",{style:aO,disabled:!0,children:[(0,b.jsx)(n.CircleCheck,{size:13,strokeWidth:2.4}),"zh"===m?"当前使用":"In use"]}):(0,b.jsxs)("button",{style:aN,onClick:f,children:[(0,b.jsx)(l.Check,{size:13,strokeWidth:2.2}),"zh"===m?"设为默认":"Set default"]}),!d&&(0,b.jsxs)(b.Fragment,{children:[(0,b.jsxs)("button",{style:aN,onClick:g,children:[(0,b.jsx)(j.Pencil,{size:13,strokeWidth:2.2}),"zh"===m?"编辑":"Edit"]}),(0,b.jsxs)("button",{style:aP,onClick:h,children:[(0,b.jsx)(k.Trash2,{size:13,strokeWidth:2.2}),"zh"===m?"删除":"Delete"]})]})]})]})}function L({active:a,providerKinds:c,registeredCount:d,locale:e}){return(0,b.jsxs)("section",{style:ad,children:[(0,b.jsxs)("header",{style:ae,children:[(0,b.jsx)(p,{size:13,strokeWidth:2.2,style:{color:"var(--primary)"}}),(0,b.jsx)("span",{children:"zh"===e?"当前默认":"Current Default"})]}),a?(0,b.jsxs)("ul",{style:af,children:[(0,b.jsx)(O,{label:"zh"===e?"名称":"Name",value:a.name,bold:!0}),(0,b.jsx)(O,{label:"Provider",value:a.provider,mono:!0}),(0,b.jsx)(O,{label:"Model",value:a.model||"—",mono:!0}),a.baseUrl&&(0,b.jsx)(O,{label:"Base URL",value:a.baseUrl,mono:!0,ellipsis:!0}),(0,b.jsx)(O,{label:"zh"===e?"已注册":"Registered",value:`${d} / 32`}),(0,b.jsx)(O,{label:"zh"===e?"供应商种类":"Providers",value:String(c)})]}):(0,b.jsx)("div",{style:{padding:"4px 0",fontSize:12,color:"var(--foreground-muted)"},children:"zh"===e?"尚未选定默认模型。":"No default selected."})]})}function M({configs:a,healthMap:c,isRechecking:d,onRecheck:e,locale:f}){return(0,b.jsxs)("section",{style:ad,children:[(0,b.jsxs)("header",{style:ae,children:[(0,b.jsx)(q,{size:13,strokeWidth:2.2,style:{color:"var(--success)"}}),(0,b.jsx)("span",{children:"zh"===f?"健康检查":"Health Check"})]}),0===a.length?(0,b.jsx)("div",{style:{padding:"4px 0",fontSize:12,color:"var(--foreground-muted)"},children:"zh"===f?"暂无模型可检查。":"No models to check."}):(0,b.jsxs)(b.Fragment,{children:[(0,b.jsx)("ul",{style:{display:"flex",flexDirection:"column",gap:8,padding:0,margin:0,listStyle:"none"},children:a.map(a=>{let d=c[a.id]??G(a);return(0,b.jsxs)("li",{style:ag,children:[(0,b.jsx)("span",{style:{flex:1,minWidth:0,fontSize:12.5,color:"var(--foreground)",overflow:"hidden",textOverflow:"ellipsis",whiteSpace:"nowrap"},title:a.model||a.name,children:a.model||a.name}),(0,b.jsx)(Q,{state:d,locale:f})]},a.id)})}),(0,b.jsxs)("button",{style:ah,onClick:e,disabled:d,children:[(0,b.jsx)(t.RefreshCw,{size:12,strokeWidth:2.2,style:d?{animation:"spin 1s linear infinite"}:void 0}),d?"zh"===f?"检查中…":"Checking…":"zh"===f?"重新检查":"Re-check"]})]})]})}function N({locale:a}){return(0,b.jsxs)("section",{style:ad,children:[(0,b.jsxs)("header",{style:ae,children:[(0,b.jsx)(r.BookOpen,{size:13,strokeWidth:2.2,style:{color:"var(--foreground-secondary)"}}),(0,b.jsx)("span",{children:"zh"===a?"相关文档":"Related Docs"})]}),(0,b.jsx)("ul",{style:{display:"flex",flexDirection:"column",gap:2,padding:0,margin:0,listStyle:"none"},children:("zh"===a?[{label:"如何获取 API Key",href:"#"},{label:"密钥加密与轮转策略",href:"#"},{label:"模型注册最佳实践",href:"#"}]:[{label:"How to obtain an API Key",href:"#"},{label:"Key encryption & rotation",href:"#"},{label:"Model registry best practices",href:"#"}]).map(a=>(0,b.jsx)("li",{children:(0,b.jsxs)("a",{href:a.href,style:ai,children:[(0,b.jsx)("span",{style:{flex:1,minWidth:0,overflow:"hidden",textOverflow:"ellipsis",whiteSpace:"nowrap"},children:a.label}),(0,b.jsx)(s.ExternalLink,{size:12,strokeWidth:2,style:{color:"var(--foreground-muted)",flexShrink:0}})]})},a.label))})]})}function O({label:a,value:c,mono:d,bold:e,ellipsis:f}){return(0,b.jsxs)("li",{style:{display:"flex",alignItems:"center",gap:12,padding:"5px 0",borderBottom:"1px dashed var(--border)",minWidth:0},children:[(0,b.jsx)("span",{style:{fontSize:11.5,color:"var(--foreground-muted)",flexShrink:0},children:a}),(0,b.jsx)("span",{style:{flex:1,minWidth:0,textAlign:"right",fontSize:12,color:"var(--foreground)",fontWeight:e?600:500,fontFamily:d?"var(--font-mono)":"inherit",overflow:"hidden",textOverflow:"ellipsis",whiteSpace:"nowrap"},title:f?c:void 0,children:c})]})}function P({slug:a,initials:c,size:e=36,radius:f=10}){let[g,h]=(0,d.useState)("color");(0,d.useEffect)(()=>{h("color")},[a]);let i="failed"===g?void 0:function(a,b="color"){if(a)return`https://cdn.jsdelivr.net/npm/@lobehub/icons-static-svg@latest/icons/${a}${"color"===b?"-color":""}.svg`}(a,g),j=!!i;return(0,b.jsx)("div",{style:{...au,width:e,height:e,borderRadius:f,fontSize:Math.round(.32*e),background:j?"#ffffff":"var(--background-secondary)",padding:j?Math.round(.16*e):0,color:"var(--foreground)"},children:j?(0,b.jsx)("img",{src:i,alt:c,onError:()=>h("color"===g?"plain":"failed"),style:{width:"100%",height:"100%",objectFit:"contain"},loading:"lazy"}):c})}function Q({state:a,locale:c}){return"ok"===a?(0,b.jsxs)("span",{style:ay,children:[(0,b.jsx)(n.CircleCheck,{size:11,strokeWidth:2.4}),"zh"===c?"正常":"OK"]}):"checking"===a?(0,b.jsxs)("span",{style:aA,children:[(0,b.jsx)(u.Loader2,{size:11,strokeWidth:2.4,style:{animation:"spin 1s linear infinite"}}),"zh"===c?"检测中":"Checking"]}):"failed"===a?(0,b.jsxs)("span",{style:aB,children:[(0,b.jsx)(v.XCircle,{size:11,strokeWidth:2.4}),"zh"===c?"失效":"Failed"]}):(0,b.jsx)("span",{style:az,children:"zh"===c?"未配置":"No key"})}function R({locale:a,hasConfigs:c,onAdd:d,onReset:f}){return(0,b.jsxs)("div",{style:aU,children:[(0,b.jsx)("div",{style:aV,children:(0,b.jsx)(h,{size:20})}),(0,b.jsx)("div",{style:{fontSize:13.5,color:"var(--foreground)",fontWeight:500,marginBottom:4},children:c?"zh"===a?"没有匹配的模型":"No matching models":"zh"===a?"尚未注册任何模型":"No models registered yet"}),(0,b.jsx)("div",{style:{fontSize:12,color:"var(--foreground-muted)",marginBottom:14,textAlign:"center",maxWidth:360},children:c?"zh"===a?"试试调整搜索关键字或筛选条件。":"Try a different keyword or filter.":"zh"===a?"注册首个 LLM 后即可在评测、优化、对比中使用。":"Register your first LLM to use it for evaluation, optimization and comparison."}),c?(0,b.jsx)("button",{style:aN,onClick:f,children:"zh"===a?"清除筛选":"Reset filters"}):(0,b.jsxs)("button",{style:aL,onClick:d,children:[(0,b.jsx)(e.Plus,{size:14,strokeWidth:2.4}),"zh"===a?"注册首个模型":"Register your first model"]})]})}function S({onPick:a,onCancel:c,locale:e}){let[g,h]=(0,d.useState)(""),[i,j]=(0,d.useState)("all"),k=(0,d.useMemo)(()=>{let a=g.trim().toLowerCase();return A.filter(b=>("all"===i||b.category===i)&&(!a||b.label.toLowerCase().includes(a)||b.id.toLowerCase().includes(a)||b.defaultModel.toLowerCase().includes(a)||b.suggestedModels.some(b=>b.toLowerCase().includes(a))))},[g,i]),l=(0,d.useMemo)(()=>{let a={};for(let b of k)a[b.category]||(a[b.category]=[]),a[b.category].push(b);return a},[k]),m=(0,d.useMemo)(()=>{let a={all:A.length};for(let b of A)a[b.category]=(a[b.category]||0)+1;return a},[]);return(0,b.jsxs)("div",{style:aQ,children:[(0,b.jsxs)("div",{style:{display:"flex",alignItems:"flex-start",justifyContent:"space-between",marginBottom:16,gap:16},children:[(0,b.jsxs)("div",{children:[(0,b.jsx)("div",{style:{fontSize:15,fontWeight:600,color:"var(--foreground)",letterSpacing:"-0.01em"},children:"zh"===e?"选择模型供应商":"Choose a Model Provider"}),(0,b.jsx)("div",{style:{fontSize:12,color:"var(--foreground-muted)",marginTop:3},children:"zh"===e?"挑选预置供应商即可自动填写 Base URL 与默认模型,下一步只需录入 API Key。":"Pick a built-in provider — Base URL and default model auto-fill. You only need to paste an API key next."})]}),(0,b.jsx)("button",{style:aN,onClick:c,children:"zh"===e?"返回列表":"Back to list"})]}),(0,b.jsxs)("div",{style:{display:"flex",alignItems:"center",gap:12,marginBottom:14,flexWrap:"wrap"},children:[(0,b.jsxs)("div",{style:{...ao,width:280},children:[(0,b.jsx)(f.Search,{size:14,strokeWidth:2,style:{position:"absolute",left:11,top:"50%",transform:"translateY(-50%)",color:"var(--foreground-muted)"}}),(0,b.jsx)("input",{type:"text",placeholder:"zh"===e?"搜索供应商 / 模型":"Search provider / model",value:g,onChange:a=>h(a.target.value),style:ap})]}),(0,b.jsxs)("div",{style:aq,children:[(0,b.jsx)(J,{active:"all"===i,onClick:()=>j("all"),count:m.all,children:"zh"===e?"全部":"All"}),C.map(a=>(0,b.jsx)(J,{active:i===a.id,onClick:()=>j(a.id),count:m[a.id]||0,children:"zh"===e?a.labelZh:a.labelEn},a.id))]})]}),0===k.length?(0,b.jsx)("div",{style:{padding:"40px 0",textAlign:"center",fontSize:13,color:"var(--foreground-muted)"},children:"zh"===e?"没有匹配的供应商。":"No matching provider."}):(0,b.jsx)("div",{style:{display:"flex",flexDirection:"column",gap:22},children:C.map(c=>{let d=l[c.id];return d&&0!==d.length?(0,b.jsxs)("section",{children:[(0,b.jsxs)("div",{style:aj,children:[(0,b.jsx)("span",{children:"zh"===e?c.labelZh:c.labelEn}),(0,b.jsx)("span",{style:ac,children:d.length})]}),(0,b.jsx)("div",{style:ak,children:d.map(c=>(0,b.jsxs)("button",{type:"button",onClick:()=>a(c),style:al,className:"provider-pick-card",children:[(0,b.jsx)(P,{slug:c.logoSlug,initials:c.initials,size:36,radius:9}),(0,b.jsxs)("div",{style:{minWidth:0,flex:1},children:[(0,b.jsx)("div",{style:{fontSize:13.5,fontWeight:600,color:"var(--foreground)",overflow:"hidden",textOverflow:"ellipsis",whiteSpace:"nowrap"},children:c.label}),(0,b.jsx)("div",{style:{marginTop:3,fontSize:11.5,color:"var(--foreground-muted)",fontFamily:"var(--font-mono)",overflow:"hidden",textOverflow:"ellipsis",whiteSpace:"nowrap"},title:c.suggestedModels.join(" · ")||c.defaultModel,children:c.suggestedModels.slice(0,3).join(" · ")||c.defaultModel||("zh"===e?"自填模型":"Custom model")})]})]},c.id))})]},c.id):null})})]})}function T({config:a,setConfig:c,onCancel:d,onReselect:e,onSave:f,isSaving:g,isDefault:h,pickedProvider:i,locale:j}){return(0,b.jsxs)("div",{style:aQ,children:[(0,b.jsxs)("div",{style:{display:"flex",alignItems:"flex-start",justifyContent:"space-between",marginBottom:18,gap:16},children:[(0,b.jsxs)("div",{style:{display:"flex",alignItems:"center",gap:12,minWidth:0},children:[i&&(0,b.jsx)(P,{slug:i.logoSlug,initials:i.initials,size:40,radius:10}),(0,b.jsxs)("div",{style:{minWidth:0},children:[(0,b.jsx)("div",{style:{fontSize:15,fontWeight:600,color:"var(--foreground)",letterSpacing:"-0.01em"},children:"new"===a.id?i?i.label:"zh"===j?"新增模型":"New Model":"zh"===j?"编辑模型":"Edit Model"}),(0,b.jsx)("div",{style:{fontSize:12,color:"var(--foreground-muted)",marginTop:3},children:i?.note?i.note:"zh"===j?"保存前会自动测试连接,连通后才会写入。":"Connection is tested before saving."})]})]}),(0,b.jsxs)("div",{style:{display:"flex",gap:8,flexShrink:0},children:[e&&(0,b.jsx)("button",{style:aN,onClick:e,children:"zh"===j?"← 选择其它供应商":"← Choose other provider"}),(0,b.jsx)("button",{style:aN,onClick:d,children:"zh"===j?"返回列表":"Back to list"})]})]}),(0,b.jsxs)("div",{style:{display:"grid",gridTemplateColumns:"repeat(2, minmax(0, 1fr))",gap:"14px 18px"},children:[(0,b.jsx)(U,{label:"zh"===j?"配置名称":"Config Name",children:(0,b.jsx)("input",{style:aR,placeholder:"zh"===j?"例如:我的 DeepSeek":"e.g. My DeepSeek",value:a.name||"",disabled:h,onChange:b=>c({...a,name:b.target.value})})}),(0,b.jsx)(U,{label:"zh"===j?"供应商":"Provider",children:(0,b.jsxs)("select",{style:aR,value:a.provider,disabled:h,onChange:b=>{var d;let e;return e=D[d=b.target.value],void c({...a,provider:d,baseUrl:e.baseUrl||a.baseUrl,model:e.model||a.model})},children:[(0,b.jsx)("option",{value:"deepseek-official",children:"DeepSeek (Official)"}),(0,b.jsx)("option",{value:"siliconflow",children:"SiliconFlow"}),(0,b.jsx)("option",{value:"openai",children:"OpenAI"}),(0,b.jsx)("option",{value:"anthropic",children:"Anthropic"}),(0,b.jsx)("option",{value:"custom",children:"Custom (OpenAI Compatible)"})]})}),(0,b.jsx)(U,{label:"Base URL",children:(0,b.jsx)("input",{style:aR,placeholder:"https://api.deepseek.com",value:a.baseUrl||"",disabled:h,onChange:b=>c({...a,baseUrl:b.target.value.replace(/\/chat\/completions\/?$/,"")})})}),(0,b.jsxs)(U,{label:"zh"===j?"模型名":"Model Name",children:[(0,b.jsx)("input",{style:aR,placeholder:"deepseek-chat / gpt-4o / ...",value:a.model||"",disabled:h,onChange:b=>c({...a,model:b.target.value})}),i&&i.suggestedModels.length>0&&(0,b.jsx)("div",{style:{display:"flex",flexWrap:"wrap",gap:5,marginTop:7},children:i.suggestedModels.slice(0,6).map(d=>(0,b.jsx)("button",{type:"button",onClick:()=>c({...a,model:d}),style:{...am,background:a.model===d?"var(--primary-subtle)":"var(--background-secondary)",color:a.model===d?"var(--primary)":"var(--foreground-secondary)",borderColor:a.model===d?"var(--primary-subtle-border)":"var(--border)"},children:d},d))})]}),(0,b.jsx)("div",{style:{gridColumn:"1 / -1"},children:(0,b.jsxs)(U,{label:"zh"===j?"API 密钥":"API Key",children:[(0,b.jsx)("input",{style:{...aR,fontFamily:"var(--font-mono, ui-monospace, monospace)"},type:"text",placeholder:"sk-...",value:a.apiKey||"",disabled:h,onChange:b=>c({...a,apiKey:b.target.value})}),(a.apiKey||"").includes("•")&&(0,b.jsx)("div",{style:{marginTop:6,fontSize:11.5,color:"var(--foreground-muted)"},children:"zh"===j?"出于安全考虑仅显示掩码。保持不变则沿用原 Key;如需更换请清空后输入新 Key。":"Masked for security. Leave unchanged to keep the current key; clear and type a new key to replace it."}),i?.docsUrl&&(0,b.jsx)("div",{style:{marginTop:6,fontSize:11.5,color:"var(--foreground-muted)"},children:(0,b.jsxs)("a",{href:i.docsUrl,target:"_blank",rel:"noreferrer",style:{color:"var(--primary)",textDecoration:"none",display:"inline-flex",alignItems:"center",gap:4},children:["zh"===j?"如何获取 API Key":"How to obtain an API Key",(0,b.jsx)(s.ExternalLink,{size:11,strokeWidth:2})]})})]})})]}),(0,b.jsxs)("div",{style:{display:"flex",justifyContent:"flex-end",gap:8,marginTop:20},children:[(0,b.jsx)("button",{style:aN,onClick:d,children:"zh"===j?"取消":"Cancel"}),!h&&(0,b.jsx)("button",{style:g?aM:aL,disabled:g,onClick:f,children:g?"zh"===j?"测试并保存中…":"Testing & Saving…":"zh"===j?"测试连接并保存":"Test & Save"})]})]})}function U({label:a,children:c}){return(0,b.jsxs)("div",{children:[(0,b.jsx)("div",{style:{fontSize:11.5,fontWeight:500,color:"var(--foreground-secondary)",marginBottom:6,letterSpacing:"0.01em"},children:a}),c]})}let V={flex:1,minHeight:0,overflowY:"auto",padding:"24px 28px 40px",width:"100%"},W={maxWidth:1320,margin:"0 auto"},X={display:"flex",alignItems:"flex-start",justifyContent:"space-between",gap:24,marginBottom:22},Y={margin:0,fontSize:13,lineHeight:1.65,color:"var(--foreground-secondary)",maxWidth:720},Z={color:"var(--foreground)",fontWeight:600},$={display:"grid",gridTemplateColumns:"minmax(0, 1fr) 300px",gap:22,alignItems:"flex-start"},_={minWidth:0,display:"flex",flexDirection:"column",gap:14},aa={display:"flex",flexDirection:"column",gap:14,position:"sticky",top:0},ab={display:"flex",alignItems:"center",gap:8,padding:"2px 2px 6px",borderBottom:"1px solid var(--border)"},ac={display:"inline-flex",alignItems:"center",padding:"1px 8px",fontSize:11,fontWeight:600,fontFamily:"var(--font-mono)",color:"var(--foreground-secondary)",background:"var(--background-secondary)",border:"1px solid var(--border)",borderRadius:999,lineHeight:1.5},ad={background:"var(--card-bg)",border:"1px solid var(--card-border)",borderRadius:12,padding:"14px 16px 12px",display:"flex",flexDirection:"column",gap:10},ae={display:"flex",alignItems:"center",gap:7,fontSize:13,fontWeight:600,color:"var(--foreground)",letterSpacing:"-0.005em",paddingBottom:8,borderBottom:"1px solid var(--border)"},af={display:"flex",flexDirection:"column",padding:0,margin:0,listStyle:"none"},ag={display:"flex",alignItems:"center",gap:10,padding:"5px 0",minWidth:0},ah={width:"100%",display:"inline-flex",alignItems:"center",justifyContent:"center",gap:6,padding:"7px 10px",marginTop:4,background:"var(--card-bg)",color:"var(--foreground-secondary)",border:"1px solid var(--border)",borderRadius:7,fontSize:12,fontWeight:500,cursor:"pointer",transition:"all .12s ease"},ai={display:"flex",alignItems:"center",gap:8,padding:"7px 8px",fontSize:12.5,color:"var(--foreground-secondary)",textDecoration:"none",borderRadius:6,transition:"background .1s"},aj={display:"flex",alignItems:"center",gap:8,marginBottom:10,fontSize:12,fontWeight:600,color:"var(--foreground-secondary)",textTransform:"uppercase",letterSpacing:"0.08em"},ak={display:"grid",gridTemplateColumns:"repeat(auto-fill, minmax(220px, 1fr))",gap:10},al={display:"flex",alignItems:"center",gap:12,padding:"11px 12px",background:"var(--card-bg)",border:"1px solid var(--card-border)",borderRadius:10,cursor:"pointer",textAlign:"left",fontFamily:"inherit",transition:"all .12s ease",minWidth:0},am={padding:"3px 10px",fontSize:11,fontFamily:"var(--font-mono)",border:"1px solid var(--border)",borderRadius:999,cursor:"pointer",transition:"all .12s",lineHeight:1.5},an={display:"flex",alignItems:"center",gap:14,marginBottom:14,flexWrap:"wrap"},ao={position:"relative",width:280},ap={width:"100%",height:34,padding:"0 12px 0 32px",border:"1px solid var(--input-border)",borderRadius:8,background:"var(--input-bg)",fontSize:12.5,color:"var(--foreground)",outline:"none"},aq={display:"inline-flex",flexWrap:"wrap",gap:6},ar={padding:"6px 12px",fontSize:12,fontWeight:500,borderRadius:6,cursor:"pointer",fontFamily:"inherit",display:"inline-flex",alignItems:"center",gap:6,whiteSpace:"nowrap",lineHeight:1.4},as={background:"var(--card-bg)",border:"1px solid var(--card-border)",borderRadius:12,padding:"18px 22px",display:"grid",gridTemplateColumns:"auto 1fr auto",gap:22,alignItems:"center",transition:"all .15s ease",position:"relative",overflow:"hidden"},at={position:"absolute",left:0,top:0,bottom:0,width:3,background:"var(--primary)"},au={width:48,height:48,borderRadius:12,background:"var(--background-secondary)",border:"1px solid var(--card-border)",display:"grid",placeItems:"center",fontWeight:600,fontSize:14,color:"var(--foreground-secondary)",letterSpacing:"0.02em",flexShrink:0},av={fontSize:16,fontWeight:600,color:"var(--foreground)",letterSpacing:"-0.01em"},aw={display:"inline-flex",alignItems:"center",gap:4,padding:"2px 8px",fontSize:10.5,fontWeight:600,borderRadius:999,lineHeight:1.5,letterSpacing:"0.01em"},ax={...aw,background:"var(--primary)",color:"var(--primary-foreground)"},ay={...aw,background:"var(--success-subtle)",color:"var(--success)"},az={...aw,background:"var(--warning-subtle)",color:"var(--warning)"},aA={...aw,background:"var(--primary-subtle)",color:"var(--primary)"},aB={...aw,background:"var(--error-subtle)",color:"var(--error)"},aC={...aw,background:"var(--background-secondary)",color:"var(--foreground-secondary)",border:"1px solid var(--border)"},aD={width:5,height:5,background:"var(--success)",borderRadius:"50%"},aE={display:"flex",alignItems:"center",gap:12,flexWrap:"wrap",marginBottom:10,fontSize:12.5,color:"var(--foreground-secondary)"},aF={display:"inline-flex",alignItems:"center",gap:6,minWidth:0},aG={fontSize:10.5,fontWeight:500,color:"var(--foreground-muted)",textTransform:"uppercase",letterSpacing:"0.06em"},aH={color:"var(--foreground)",fontWeight:500,maxWidth:280,overflow:"hidden",textOverflow:"ellipsis",whiteSpace:"nowrap"},aI={width:1,height:11,background:"var(--border)"},aJ={display:"inline-flex",alignItems:"center",gap:8,padding:"5px 10px",background:"var(--background-secondary)",border:"1px solid var(--border)",borderRadius:7,color:"var(--foreground-secondary)",maxWidth:"fit-content"},aK={display:"flex",alignItems:"center",gap:6,paddingLeft:16,borderLeft:"1px dashed var(--border)"},aL={display:"inline-flex",alignItems:"center",gap:6,padding:"7px 14px",background:"var(--primary)",color:"var(--primary-foreground)",border:"none",borderRadius:8,fontSize:12.5,fontWeight:500,cursor:"pointer",transition:"background .12s ease",lineHeight:1.4},aM={...aL,opacity:.6,cursor:"not-allowed"},aN={display:"inline-flex",alignItems:"center",gap:5,padding:"6px 12px",background:"var(--card-bg)",color:"var(--foreground-secondary)",borderWidth:1,borderStyle:"solid",borderColor:"var(--border)",borderRadius:7,fontSize:12,fontWeight:500,cursor:"pointer",transition:"all .12s ease",lineHeight:1.4},aO={...aN,background:"var(--success-subtle)",color:"var(--success)",borderColor:"var(--success-subtle-border)",cursor:"default"},aP={...aN,color:"var(--foreground-secondary)"},aQ={background:"var(--card-bg)",border:"1px solid var(--card-border)",borderRadius:12,padding:"22px 26px"},aR={width:"100%",padding:"8px 10px",background:"var(--input-bg)",border:"1px solid var(--input-border)",borderRadius:7,color:"var(--foreground)",fontSize:12.5,outline:"none"},aS={marginTop:24,padding:"14px 18px",border:"1px dashed var(--border-dark)",borderRadius:10,background:"var(--background-secondary)",display:"flex",alignItems:"center",gap:12},aT={width:30,height:30,borderRadius:8,background:"var(--primary-subtle)",color:"var(--primary)",display:"grid",placeItems:"center",flexShrink:0},aU={padding:"40px 24px",background:"var(--card-bg)",border:"1px dashed var(--border-dark)",borderRadius:12,display:"flex",flexDirection:"column",alignItems:"center",justifyContent:"center"},aV={width:44,height:44,borderRadius:10,background:"var(--background-secondary)",color:"var(--foreground-muted)",display:"grid",placeItems:"center",marginBottom:12},aW=a=>null==a?"":String(a),aX=a=>({key:a.key,input:aW(a.inputTokenPrice),output:aW(a.outputTokenPrice),cacheRead:aW(a.cacheReadInputTokenPrice),cacheCreation:aW(a.cacheCreationInputTokenPrice),ctx:aW(a.contextWindow)});function aY(){let{user:a}=(0,x.useAuth)(),[c,e]=(0,d.useState)(null),[f,g]=(0,d.useState)([]),[h,i]=(0,d.useState)(!0),[j,k]=(0,d.useState)(!1),[l,m]=(0,d.useState)(null),[n,o]=(0,d.useState)(!1),p=(0,d.useCallback)(async()=>{if(a){i(!0),m(null);try{let b=await (0,w.apiFetch)(`/api/modelconfig/pricing?user=${encodeURIComponent(a)}`);if(!b.ok)throw Error(`HTTP ${b.status}`);let c=await b.json();e(c),g(c.custom.map(aX))}catch(a){m({type:"err",text:a instanceof Error?a.message:"加载失败"})}finally{i(!1)}}},[a]);(0,d.useEffect)(()=>{p()},[p]);let q=!!c?.isAdmin,r=(a,b)=>g(c=>c.map((c,d)=>d===a?{...c,...b}:c)),s=(a="")=>g(b=>b.some(b=>b.key.trim()===a&&a)?b:[...b,{key:a,input:"",output:"",cacheRead:"",cacheCreation:"",ctx:""}]),t=async()=>{if(!a)return;let b={};for(let a of f){let c=a.key.trim();c&&(b[c]={inputTokenPrice:a.input,outputTokenPrice:a.output,cacheReadInputTokenPrice:a.cacheRead,cacheCreationInputTokenPrice:a.cacheCreation,contextWindow:a.ctx})}k(!0),m(null);try{let c=await (0,w.apiFetch)(`/api/modelconfig/pricing?user=${encodeURIComponent(a)}`,{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify({custom:b})}),d=await c.json();if(!c.ok)throw Error(d.error||`HTTP ${c.status}`);m({type:"ok",text:`已保存 ${d.count} 个模型单价`}),await p()}catch(a){m({type:"err",text:a instanceof Error?a.message:"保存失败"})}finally{k(!1)}},u=(c?.observed||[]).filter(a=>!a.hasPricing);return(0,b.jsx)("div",{style:{padding:"0 28px 32px",width:"100%"},children:(0,b.jsx)("div",{style:{maxWidth:1320,margin:"0 auto"},children:(0,b.jsxs)("section",{style:{background:"var(--card-bg)",border:"1px solid var(--card-border)",borderRadius:12},children:[(0,b.jsxs)("div",{style:{padding:"13px 18px",borderBottom:"1px solid var(--border)",display:"flex",alignItems:"center",gap:10,flexWrap:"wrap"},children:[(0,b.jsx)("span",{style:{fontSize:14,fontWeight:800,color:"var(--foreground)"},children:"模型单价"}),(0,b.jsxs)("span",{style:{fontSize:11,color:"var(--foreground-muted)"},children:["按模型名(前缀)配置 · 单位 ",c?.currency??"USD"," / 百万 token · 用于成本计算"]}),(0,b.jsx)("span",{style:{flex:1}}),!h&&(q?(0,b.jsx)("span",{style:{fontSize:10.5,color:"var(--success)",border:"1px solid var(--success-subtle-border)",background:"var(--success-subtle)",borderRadius:6,padding:"2px 8px"},children:"管理员 · 可编辑"}):(0,b.jsx)("span",{style:{fontSize:10.5,color:"var(--foreground-muted)",border:"1px solid var(--border)",borderRadius:6,padding:"2px 8px"},children:"只读 · 仅管理员可改"}))]}),(0,b.jsxs)("div",{style:{padding:18,display:"flex",flexDirection:"column",gap:16},children:[h&&(0,b.jsx)("div",{style:{color:"var(--foreground-muted)",fontSize:13},children:"加载中…"}),l&&(0,b.jsx)("div",{style:{fontSize:12,color:"ok"===l.type?"var(--success)":"var(--error)"},children:l.text}),!h&&!q&&(0,b.jsxs)("div",{style:{fontSize:11.5,color:"var(--foreground-muted)",background:"var(--background-secondary)",border:"1px solid var(--border)",borderRadius:8,padding:"10px 12px",lineHeight:1.6},children:["模型单价为全局配置,只有管理员可修改。部署时在环境变量 ",(0,b.jsx)("code",{style:{color:"var(--foreground-secondary)"},children:"AGENT_INSIGHT_ADMIN_USERS"}),"(逗号分隔用户名)中加入你的账号即可获得编辑权限。"]}),!h&&u.length>0&&(0,b.jsxs)("div",{children:[(0,b.jsxs)("div",{style:{fontSize:12,fontWeight:700,color:"var(--warning)",marginBottom:8},children:["⚠ 链路中出现但缺单价的模型(",u.length,")——成本按 0 计"]}),(0,b.jsx)("div",{style:{display:"flex",flexWrap:"wrap",gap:8},children:u.map(a=>(0,b.jsxs)("span",{style:{display:"inline-flex",alignItems:"center",gap:6,fontSize:11.5,border:"1px solid var(--warning-subtle-border)",background:"var(--warning-subtle)",color:"var(--foreground-secondary)",borderRadius:7,padding:"3px 8px",fontFamily:"var(--font-mono, monospace)"},children:[a.model,q&&(0,b.jsx)("button",{onClick:()=>s(a.model),style:{border:"none",background:"var(--primary)",color:"#fff",borderRadius:5,fontSize:10.5,padding:"1px 7px",cursor:"pointer"},children:"补价"})]},a.model))})]}),!h&&(0,b.jsx)("div",{style:{overflowX:"auto"},children:(0,b.jsxs)("table",{style:{width:"100%",borderCollapse:"collapse",fontSize:12},children:[(0,b.jsx)("thead",{children:(0,b.jsx)("tr",{children:["模型名(前缀)","input","output","缓存读","缓存写","上下文窗",""].map((a,c)=>(0,b.jsx)("th",{style:{textAlign:0===c?"left":"right",padding:"7px 10px",color:"var(--foreground-muted)",fontWeight:600,borderBottom:"1px solid var(--border)",whiteSpace:"nowrap"},children:a},c))})}),(0,b.jsxs)("tbody",{children:[f.map((a,c)=>(0,b.jsxs)("tr",{children:[(0,b.jsx)(aZ,{children:(0,b.jsx)(a$,{v:a.key,on:a=>r(c,{key:a}),admin:q,w:200,mono:!0,placeholder:"如 GLM-5"})}),(0,b.jsx)(aZ,{right:!0,children:(0,b.jsx)(a$,{v:a.input,on:a=>r(c,{input:a}),admin:q,w:80,num:!0})}),(0,b.jsx)(aZ,{right:!0,children:(0,b.jsx)(a$,{v:a.output,on:a=>r(c,{output:a}),admin:q,w:80,num:!0})}),(0,b.jsx)(aZ,{right:!0,children:(0,b.jsx)(a$,{v:a.cacheRead,on:a=>r(c,{cacheRead:a}),admin:q,w:80,num:!0,placeholder:"—"})}),(0,b.jsx)(aZ,{right:!0,children:(0,b.jsx)(a$,{v:a.cacheCreation,on:a=>r(c,{cacheCreation:a}),admin:q,w:80,num:!0,placeholder:"—"})}),(0,b.jsx)(aZ,{right:!0,children:(0,b.jsx)(a$,{v:a.ctx,on:a=>r(c,{ctx:a}),admin:q,w:90,num:!0,placeholder:"—"})}),(0,b.jsx)(aZ,{right:!0,children:q&&(0,b.jsx)("button",{onClick:()=>g(a=>a.filter((a,b)=>b!==c)),style:{border:"none",background:"transparent",color:"var(--error)",cursor:"pointer",fontSize:12},children:"删除"})})]},c)),0===f.length&&(0,b.jsx)("tr",{children:(0,b.jsxs)("td",{colSpan:7,style:{padding:18,textAlign:"center",color:"var(--foreground-muted)"},children:["暂无自定义单价",q?",点下方「添加模型」或上面缺价模型的「补价」":""]})})]})]})}),q&&!h&&(0,b.jsxs)("div",{style:{display:"flex",gap:10},children:[(0,b.jsx)("button",{onClick:()=>s(),style:a1,children:"+ 添加模型"}),(0,b.jsx)("span",{style:{flex:1}}),(0,b.jsx)("button",{onClick:t,disabled:j,style:{...a0,opacity:j?.6:1},children:j?"保存中…":"保存"})]}),!h&&c&&(0,b.jsxs)("div",{children:[(0,b.jsxs)("button",{onClick:()=>o(a=>!a),style:{border:"none",background:"transparent",color:"var(--primary)",cursor:"pointer",fontSize:11.5,padding:0},children:[n?"▾":"▸"," 内置默认单价(",c.builtin.length,",只读兜底,自定义会覆盖同前缀)"]}),n&&(0,b.jsx)("div",{style:{overflowX:"auto",marginTop:8},children:(0,b.jsxs)("table",{style:{width:"100%",borderCollapse:"collapse",fontSize:11.5},children:[(0,b.jsx)("thead",{children:(0,b.jsx)("tr",{children:["模型名(前缀)","input","output","缓存读","缓存写","上下文窗"].map((a,c)=>(0,b.jsx)("th",{style:{textAlign:0===c?"left":"right",padding:"6px 10px",color:"var(--foreground-muted)",fontWeight:600,borderBottom:"1px solid var(--border)"},children:a},c))})}),(0,b.jsx)("tbody",{children:c.builtin.map(a=>(0,b.jsxs)("tr",{style:{color:"var(--foreground-secondary)"},children:[(0,b.jsx)("td",{style:{padding:"6px 10px",fontFamily:"var(--font-mono, monospace)"},children:a.key}),(0,b.jsx)("td",{style:a_,children:a.inputTokenPrice}),(0,b.jsx)("td",{style:a_,children:a.outputTokenPrice}),(0,b.jsx)("td",{style:a_,children:a.cacheReadInputTokenPrice??"—"}),(0,b.jsx)("td",{style:a_,children:a.cacheCreationInputTokenPrice??"—"}),(0,b.jsx)("td",{style:a_,children:a.contextWindow??"—"})]},a.key))})]})})]})]})]})})})}function aZ({children:a,right:c}){return(0,b.jsx)("td",{style:{padding:"5px 10px",borderBottom:"1px solid var(--border)",textAlign:c?"right":"left"},children:a})}function a$({v:a,on:c,admin:d,w:e,num:f,mono:g,placeholder:h}){return d?(0,b.jsx)("input",{value:a,onChange:a=>c(a.target.value),placeholder:h,inputMode:f?"decimal":"text",style:{width:e,maxWidth:"100%",padding:"4px 7px",fontSize:12,textAlign:f?"right":"left",borderRadius:6,border:"1px solid var(--border)",background:"var(--background)",color:"var(--foreground)",fontFamily:g||f?"var(--font-mono, monospace)":void 0}}):(0,b.jsx)("span",{style:{fontFamily:g||f?"var(--font-mono, monospace)":void 0,color:a?"var(--foreground)":"var(--foreground-muted)"},children:a||h||"—"})}let a_={padding:"6px 10px",textAlign:"right",fontFamily:"var(--font-mono, monospace)"},a0={border:"none",background:"var(--primary)",color:"var(--primary-foreground, #fff)",borderRadius:8,fontSize:12.5,fontWeight:600,padding:"7px 18px",cursor:"pointer"},a1={border:"1px solid var(--border)",background:"var(--card-bg)",color:"var(--foreground-secondary)",borderRadius:8,fontSize:12.5,padding:"7px 14px",cursor:"pointer"};var a2=a.i(960798);function a3(){let{t:a}=(0,y.useLocale)();return(0,b.jsxs)("div",{style:{height:"100%",overflowY:"auto"},children:[(0,b.jsx)(c.AppTopBar,{title:(0,b.jsx)(a2.Term,{id:"model-registry",label:a("nav.modelRegistry")})}),(0,b.jsx)(H,{}),(0,b.jsx)(aY,{})]})}a.s(["default",()=>a3],685260)}];
2
2
 
3
3
  //# sourceMappingURL=src_app_%28main%29_modelconfig_registry_page_tsx_1ead2fd4._.js.map