promptfoo 0.18.4 → 0.19.0

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 (156) hide show
  1. package/dist/package.json +10 -5
  2. package/dist/src/evaluator.d.ts.map +1 -1
  3. package/dist/src/evaluator.js +17 -9
  4. package/dist/src/evaluator.js.map +1 -1
  5. package/dist/src/index.d.ts +1 -0
  6. package/dist/src/index.d.ts.map +1 -1
  7. package/dist/src/index.js +3 -0
  8. package/dist/src/index.js.map +1 -1
  9. package/dist/src/main.js +2 -2
  10. package/dist/src/main.js.map +1 -1
  11. package/dist/src/providers.d.ts +1 -1
  12. package/dist/src/providers.d.ts.map +1 -1
  13. package/dist/src/providers.js +5 -0
  14. package/dist/src/providers.js.map +1 -1
  15. package/dist/src/share.d.ts.map +1 -1
  16. package/dist/src/share.js +8 -7
  17. package/dist/src/share.js.map +1 -1
  18. package/dist/src/types.d.ts +9 -1
  19. package/dist/src/types.d.ts.map +1 -1
  20. package/dist/src/web/nextui/404/index.html +1 -0
  21. package/dist/src/web/nextui/404.html +1 -0
  22. package/dist/src/web/nextui/_next/static/P9zzdx-rDJKPcGFq_qOXC/_buildManifest.js +1 -0
  23. package/dist/src/web/nextui/_next/static/P9zzdx-rDJKPcGFq_qOXC/_ssgManifest.js +1 -0
  24. package/dist/src/web/nextui/_next/static/chunks/121-54cee610700b4756.js +27 -0
  25. package/dist/src/web/nextui/_next/static/chunks/339-501c32916b785ef1.js +1 -0
  26. package/dist/src/web/nextui/_next/static/chunks/373-6a411db0b05027d3.js +1 -0
  27. package/dist/src/web/nextui/_next/static/chunks/583-507e6d8883bb85ff.js +1 -0
  28. package/dist/src/web/nextui/_next/static/chunks/596-9c29c47b8dee7a50.js +25 -0
  29. package/dist/src/web/nextui/_next/static/chunks/658-f8f9d18540505edc.js +15 -0
  30. package/dist/src/web/nextui/_next/static/chunks/858-7255df6dbc44dff9.js +125 -0
  31. package/dist/src/web/nextui/_next/static/chunks/97-64e11ce2b0607459.js +1 -0
  32. package/dist/src/web/nextui/_next/static/chunks/app/eval/[id]/not-found-366629541fd598e9.js +1 -0
  33. package/dist/src/web/nextui/_next/static/chunks/app/eval/[id]/page-655bc42ac68b25cc.js +1 -0
  34. package/dist/src/web/nextui/_next/static/chunks/app/eval/page-d5e8697859d6294e.js +1 -0
  35. package/dist/src/web/nextui/_next/static/chunks/app/layout-4c714b1a5a3a768d.js +1 -0
  36. package/dist/src/web/nextui/_next/static/chunks/app/page-4fe8a6342d24ca23.js +1 -0
  37. package/dist/src/web/nextui/_next/static/chunks/app/setup/page-cd35686fe6c12be8.js +1 -0
  38. package/dist/src/web/nextui/_next/static/chunks/fd9d1056-d8847af536b5787b.js +9 -0
  39. package/dist/src/web/nextui/_next/static/chunks/framework-8883d1e9be70c3da.js +25 -0
  40. package/dist/src/web/nextui/_next/static/chunks/main-0670de04b1c026b4.js +1 -0
  41. package/dist/src/web/nextui/_next/static/chunks/main-app-581ccf0003955b21.js +1 -0
  42. package/dist/src/web/nextui/_next/static/chunks/pages/_app-52924524f99094ab.js +1 -0
  43. package/dist/src/web/nextui/_next/static/chunks/pages/_error-c92d5c4bb2b49926.js +1 -0
  44. package/dist/src/web/nextui/_next/static/chunks/polyfills-78c92fac7aa8fdd8.js +1 -0
  45. package/dist/src/web/nextui/_next/static/chunks/webpack-a886dd767c2e76b7.js +1 -0
  46. package/dist/src/web/nextui/_next/static/css/48d388184a2f4ce3.css +1 -0
  47. package/dist/src/web/nextui/_next/static/css/7265c36d84346934.css +1 -0
  48. package/dist/src/web/nextui/_next/static/css/8119d8bd13a8adab.css +1 -0
  49. package/dist/src/web/nextui/_next/static/css/a35c840ac696f161.css +1 -0
  50. package/dist/src/web/nextui/_next/static/css/e388dd377baf25ec.css +1 -0
  51. package/dist/src/web/nextui/_next/static/css/fc460b8a7cadb952.css +1 -0
  52. package/dist/src/web/nextui/_next/static/media/0e4fe491bf84089c-s.p.woff2 +0 -0
  53. package/dist/src/web/nextui/_next/static/media/1c57ca6f5208a29b-s.woff2 +0 -0
  54. package/dist/src/web/nextui/_next/static/media/3dbd163d3bb09d47-s.woff2 +0 -0
  55. package/dist/src/web/nextui/_next/static/media/42d52f46a26971a3-s.woff2 +0 -0
  56. package/dist/src/web/nextui/_next/static/media/5647e4c23315a2d2-s.woff2 +0 -0
  57. package/dist/src/web/nextui/_next/static/media/627622453ef56b0d-s.p.woff2 +0 -0
  58. package/dist/src/web/nextui/_next/static/media/7be645d133f3ee22-s.woff2 +0 -0
  59. package/dist/src/web/nextui/_next/static/media/7c53f7419436e04b-s.woff2 +0 -0
  60. package/dist/src/web/nextui/_next/static/media/8fb72f69fba4e3d2-s.woff2 +0 -0
  61. package/dist/src/web/nextui/_next/static/media/912a9cfe43c928d9-s.woff2 +0 -0
  62. package/dist/src/web/nextui/_next/static/media/934c4b7cb736f2a3-s.p.woff2 +0 -0
  63. package/dist/src/web/nextui/_next/static/media/a5b77b63ef20339c-s.woff2 +0 -0
  64. package/dist/src/web/nextui/_next/static/media/a6d330d7873e7320-s.woff2 +0 -0
  65. package/dist/src/web/nextui/_next/static/media/baf12dd90520ae41-s.woff2 +0 -0
  66. package/dist/src/web/nextui/_next/static/media/bbdb6f0234009aba-s.woff2 +0 -0
  67. package/dist/src/web/nextui/_next/static/media/cff529cd86cc0276-s.woff2 +0 -0
  68. package/dist/src/web/nextui/_next/static/media/d117eea74e01de14-s.woff2 +0 -0
  69. package/dist/src/web/nextui/_next/static/media/dfa8b99978df7bbc-s.woff2 +0 -0
  70. package/dist/src/web/nextui/_next/static/media/e25729ca87cc7df9-s.woff2 +0 -0
  71. package/dist/src/web/nextui/_next/static/media/eb52b768f62eeeb4-s.woff2 +0 -0
  72. package/dist/src/web/nextui/_next/static/media/f06116e890b3dadb-s.woff2 +0 -0
  73. package/dist/src/web/nextui/api +1 -0
  74. package/dist/src/web/nextui/eval/index.html +1 -0
  75. package/dist/src/web/nextui/eval/index.txt +13 -0
  76. package/dist/src/web/nextui/index.html +1 -0
  77. package/dist/src/web/nextui/index.txt +13 -0
  78. package/dist/src/web/nextui/setup/index.html +1 -0
  79. package/dist/src/web/nextui/setup/index.txt +14 -0
  80. package/dist/src/web/server.d.ts +1 -1
  81. package/dist/src/web/server.d.ts.map +1 -1
  82. package/dist/src/web/server.js +47 -4
  83. package/dist/src/web/server.js.map +1 -1
  84. package/package.json +10 -5
  85. package/src/evaluator.ts +17 -9
  86. package/src/index.ts +7 -1
  87. package/src/main.ts +3 -3
  88. package/src/providers.ts +11 -2
  89. package/src/share.ts +10 -8
  90. package/src/types.ts +10 -1
  91. package/src/web/nextui/.eslintrc.json +3 -0
  92. package/src/web/nextui/next.config.js +14 -0
  93. package/src/web/nextui/package-lock.json +4615 -0
  94. package/src/web/nextui/package.json +45 -0
  95. package/src/web/nextui/src/app/Home.css +3 -0
  96. package/src/web/nextui/src/app/api/route.ts +6 -0
  97. package/src/web/{client/src/NavBar.css → nextui/src/app/components/DarkMode.css} +1 -0
  98. package/src/web/{client/src/NavBar.tsx → nextui/src/app/components/DarkMode.tsx} +4 -9
  99. package/src/web/nextui/src/app/components/Logo.css +32 -0
  100. package/src/web/nextui/src/app/components/PageShell.css +33 -0
  101. package/src/web/nextui/src/app/components/PageShell.tsx +87 -0
  102. package/src/web/{client/src → nextui/src/app/eval}/ConfigModal.tsx +8 -5
  103. package/src/web/nextui/src/app/eval/Eval.css +13 -0
  104. package/src/web/nextui/src/app/eval/Eval.tsx +79 -0
  105. package/src/web/{client/src → nextui/src/app/eval}/EvalOutputPromptDialog.tsx +2 -2
  106. package/src/web/{client/src → nextui/src/app/eval}/ResultsTable.css +10 -12
  107. package/src/web/{client/src → nextui/src/app/eval}/ResultsTable.tsx +57 -14
  108. package/src/web/{client/src → nextui/src/app/eval}/ResultsView.tsx +4 -4
  109. package/src/web/nextui/src/app/eval/[id]/not-found.tsx +5 -0
  110. package/src/web/nextui/src/app/eval/[id]/page.css +9 -0
  111. package/src/web/nextui/src/app/eval/[id]/page.tsx +20 -0
  112. package/src/web/nextui/src/app/eval/index.css +0 -0
  113. package/src/web/nextui/src/app/eval/page.tsx +8 -0
  114. package/src/web/{client/src → nextui/src/app/eval}/store.ts +2 -2
  115. package/src/web/nextui/src/app/eval/types.ts +20 -0
  116. package/src/web/{client/src/index.css → nextui/src/app/globals.css} +21 -3
  117. package/src/web/nextui/src/app/layout.tsx +25 -0
  118. package/src/web/nextui/src/app/page.tsx +7 -0
  119. package/src/web/nextui/src/app/setup/AssertsForm.tsx +118 -0
  120. package/src/web/nextui/src/app/setup/PromptDialog.tsx +77 -0
  121. package/src/web/nextui/src/app/setup/PromptsSection.tsx +190 -0
  122. package/src/web/nextui/src/app/setup/ProviderConfigDialog.tsx +99 -0
  123. package/src/web/nextui/src/app/setup/ProviderSelector.tsx +149 -0
  124. package/src/web/nextui/src/app/setup/RunTestSuiteButton.tsx +88 -0
  125. package/src/web/nextui/src/app/setup/TestCaseDialog.tsx +108 -0
  126. package/src/web/nextui/src/app/setup/TestCasesSection.tsx +154 -0
  127. package/src/web/nextui/src/app/setup/VarsForm.tsx +57 -0
  128. package/src/web/nextui/src/app/setup/page.css +3 -0
  129. package/src/web/nextui/src/app/setup/page.tsx +160 -0
  130. package/src/web/nextui/src/util/api.ts +1 -0
  131. package/src/web/nextui/src/util/store.ts +53 -0
  132. package/src/web/nextui/tsconfig.json +28 -0
  133. package/src/web/server.ts +56 -2
  134. package/dist/src/web/client/assets/index-6d2a3573.js +0 -200
  135. package/dist/src/web/client/assets/index-d2b6a160.css +0 -1
  136. package/dist/src/web/client/assets/js-yaml-8bbf9398.js +0 -32
  137. package/dist/src/web/client/index.html +0 -15
  138. package/src/web/client/.eslintrc.cjs +0 -14
  139. package/src/web/client/index.html +0 -13
  140. package/src/web/client/package-lock.json +0 -5726
  141. package/src/web/client/package.json +0 -39
  142. package/src/web/client/src/App.css +0 -4
  143. package/src/web/client/src/App.tsx +0 -120
  144. package/src/web/client/src/Logo.css +0 -18
  145. package/src/web/client/src/main.tsx +0 -10
  146. package/src/web/client/src/types.ts +0 -36
  147. package/src/web/client/src/vite-env.d.ts +0 -1
  148. package/src/web/client/tsconfig.json +0 -24
  149. package/src/web/client/tsconfig.node.json +0 -10
  150. package/src/web/client/vite.config.ts +0 -7
  151. /package/dist/src/web/{client → nextui}/favicon.ico +0 -0
  152. /package/dist/src/web/{client → nextui}/logo.svg +0 -0
  153. /package/src/web/{client → nextui}/public/favicon.ico +0 -0
  154. /package/src/web/{client → nextui}/public/logo.svg +0 -0
  155. /package/src/web/{client/src → nextui/src/app/components}/Logo.tsx +0 -0
  156. /package/src/web/{client/src → nextui/src/app/eval}/ShareModal.tsx +0 -0
@@ -0,0 +1 @@
1
+ {"data":{"message":"Hello World!"}}
@@ -0,0 +1 @@
1
+ <!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><link rel="preload" as="font" href="/_next/static/media/0e4fe491bf84089c-s.p.woff2" crossorigin="" type="font/woff2"/><link rel="preload" as="font" href="/_next/static/media/627622453ef56b0d-s.p.woff2" crossorigin="" type="font/woff2"/><link rel="preload" as="font" href="/_next/static/media/934c4b7cb736f2a3-s.p.woff2" crossorigin="" type="font/woff2"/><link rel="stylesheet" href="/_next/static/css/e388dd377baf25ec.css" data-precedence="next"/><link rel="stylesheet" href="/_next/static/css/fc460b8a7cadb952.css" data-precedence="next"/><link rel="preload" href="/_next/static/chunks/webpack-a886dd767c2e76b7.js" as="script"/><link rel="preload" href="/_next/static/chunks/fd9d1056-d8847af536b5787b.js" as="script"/><link rel="preload" href="/_next/static/chunks/596-9c29c47b8dee7a50.js" as="script"/><link rel="preload" href="/_next/static/chunks/main-app-581ccf0003955b21.js" as="script"/><title>promptfoo</title><meta name="description" content="LLM testing and evaluation"/><meta name="viewport" content="width=device-width, initial-scale=1"/><meta name="next-size-adjust"/><script src="/_next/static/chunks/polyfills-78c92fac7aa8fdd8.js" noModule=""></script></head><body class="__className_979022"><div><style data-emotion="css jj2ztu">.css-jj2ztu{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;}.css-jj2ztu>:not(style):not(style){margin:0;}.css-jj2ztu>:not(style)~:not(style){margin-left:16px;}</style><div class="MuiStack-root nav css-jj2ztu"><div class="logo MuiBox-root css-0"><img src="/logo.svg" alt="Promptfoo logo"/> <span>promptfoo</span></div><a href="/setup/">New Eval</a><a href="/eval/">View Evals</a><div class="dark-mode-toggle"><style data-emotion="css vubbuv">.css-vubbuv{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;width:1em;height:1em;display:inline-block;fill:currentColor;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;-webkit-transition:fill 200ms cubic-bezier(0.4, 0, 0.2, 1) 0ms;transition:fill 200ms cubic-bezier(0.4, 0, 0.2, 1) 0ms;font-size:1.5rem;}</style><svg class="MuiSvgIcon-root MuiSvgIcon-fontSizeMedium css-vubbuv" focusable="false" aria-hidden="true" viewBox="0 0 24 24" data-testid="LightModeIcon"><path d="M12 7c-2.76 0-5 2.24-5 5s2.24 5 5 5 5-2.24 5-5-2.24-5-5-5zM2 13h2c.55 0 1-.45 1-1s-.45-1-1-1H2c-.55 0-1 .45-1 1s.45 1 1 1zm18 0h2c.55 0 1-.45 1-1s-.45-1-1-1h-2c-.55 0-1 .45-1 1s.45 1 1 1zM11 2v2c0 .55.45 1 1 1s1-.45 1-1V2c0-.55-.45-1-1-1s-1 .45-1 1zm0 18v2c0 .55.45 1 1 1s1-.45 1-1v-2c0-.55-.45-1-1-1s-1 .45-1 1zM5.99 4.58c-.39-.39-1.03-.39-1.41 0-.39.39-.39 1.03 0 1.41l1.06 1.06c.39.39 1.03.39 1.41 0s.39-1.03 0-1.41L5.99 4.58zm12.37 12.37c-.39-.39-1.03-.39-1.41 0-.39.39-.39 1.03 0 1.41l1.06 1.06c.39.39 1.03.39 1.41 0 .39-.39.39-1.03 0-1.41l-1.06-1.06zm1.06-10.96c.39-.39.39-1.03 0-1.41-.39-.39-1.03-.39-1.41 0l-1.06 1.06c-.39.39-.39 1.03 0 1.41s1.03.39 1.41 0l1.06-1.06zM7.05 18.36c.39-.39.39-1.03 0-1.41-.39-.39-1.03-.39-1.41 0l-1.06 1.06c-.39.39-.39 1.03 0 1.41s1.03.39 1.41 0l1.06-1.06z"></path></svg></div></div><div><div class="loading"><div><style data-emotion="css z01bqi animation-61bdi0">.css-z01bqi{display:inline-block;color:#1976d2;-webkit-animation:animation-61bdi0 1.4s linear infinite;animation:animation-61bdi0 1.4s linear infinite;}@-webkit-keyframes animation-61bdi0{0%{-webkit-transform:rotate(0deg);-moz-transform:rotate(0deg);-ms-transform:rotate(0deg);transform:rotate(0deg);}100%{-webkit-transform:rotate(360deg);-moz-transform:rotate(360deg);-ms-transform:rotate(360deg);transform:rotate(360deg);}}@keyframes animation-61bdi0{0%{-webkit-transform:rotate(0deg);-moz-transform:rotate(0deg);-ms-transform:rotate(0deg);transform:rotate(0deg);}100%{-webkit-transform:rotate(360deg);-moz-transform:rotate(360deg);-ms-transform:rotate(360deg);transform:rotate(360deg);}}</style><span class="MuiCircularProgress-root MuiCircularProgress-indeterminate MuiCircularProgress-colorPrimary css-z01bqi" style="width:22px;height:22px" role="progressbar"><style data-emotion="css 13o7eu2">.css-13o7eu2{display:block;}</style><svg class="MuiCircularProgress-svg css-13o7eu2" viewBox="22 22 44 44"><style data-emotion="css 14891ef animation-1p2h4ri">.css-14891ef{stroke:currentColor;stroke-dasharray:80px,200px;stroke-dashoffset:0;-webkit-animation:animation-1p2h4ri 1.4s ease-in-out infinite;animation:animation-1p2h4ri 1.4s ease-in-out infinite;}@-webkit-keyframes animation-1p2h4ri{0%{stroke-dasharray:1px,200px;stroke-dashoffset:0;}50%{stroke-dasharray:100px,200px;stroke-dashoffset:-15px;}100%{stroke-dasharray:100px,200px;stroke-dashoffset:-125px;}}@keyframes animation-1p2h4ri{0%{stroke-dasharray:1px,200px;stroke-dashoffset:0;}50%{stroke-dasharray:100px,200px;stroke-dashoffset:-15px;}100%{stroke-dasharray:100px,200px;stroke-dashoffset:-125px;}}</style><circle class="MuiCircularProgress-circle MuiCircularProgress-circleIndeterminate css-14891ef" cx="44" cy="44" r="20.2" fill="none" stroke-width="3.6"></circle></svg></span></div><div>Loading eval data</div></div></div></div><script src="/_next/static/chunks/webpack-a886dd767c2e76b7.js" async=""></script><script src="/_next/static/chunks/fd9d1056-d8847af536b5787b.js" async=""></script><script src="/_next/static/chunks/596-9c29c47b8dee7a50.js" async=""></script><script src="/_next/static/chunks/main-app-581ccf0003955b21.js" async=""></script><script>(self.__next_f=self.__next_f||[]).push([0])</script><script>self.__next_f.push([1,"1:HL[\"/_next/static/media/0e4fe491bf84089c-s.p.woff2\",{\"as\":\"font\",\"type\":\"font/woff2\"}]\n2:HL[\"/_next/static/media/627622453ef56b0d-s.p.woff2\",{\"as\":\"font\",\"type\":\"font/woff2\"}]\n3:HL[\"/_next/static/media/934c4b7cb736f2a3-s.p.woff2\",{\"as\":\"font\",\"type\":\"font/woff2\"}]\n4:HL[\"/_next/static/css/e388dd377baf25ec.css\",{\"as\":\"style\"}]\n0:\"$L5\"\n"])</script><script>self.__next_f.push([1,"6:HL[\"/_next/static/css/fc460b8a7cadb952.css\",{\"as\":\"style\"}]\n"])</script><script>self.__next_f.push([1,"7:I{\"id\":7948,\"chunks\":[\"272:static/chunks/webpack-a886dd767c2e76b7.js\",\"971:static/chunks/fd9d1056-d8847af536b5787b.js\",\"596:static/chunks/596-9c29c47b8dee7a50.js\"],\"name\":\"default\",\"async\":false}\n9:I{\"id\":6628,\"chunks\":[\"272:static/chunks/webpack-a886dd767c2e76b7.js\",\"971:static/chunks/fd9d1056-d8847af536b5787b.js\",\"596:static/chunks/596-9c29c47b8dee7a50.js\"],\"name\":\"\",\"async\":false}\na:I{\"id\":2152,\"chunks\":[\"658:static/chunks/658-f8f9d18540505edc.js\",\"583:static/chunks/583-507e6d8883bb85ff.js\",\"185:static"])</script><script>self.__next_f.push([1,"/chunks/app/layout-4c714b1a5a3a768d.js\"],\"name\":\"PageShell\",\"async\":false}\nb:I{\"id\":7767,\"chunks\":[\"272:static/chunks/webpack-a886dd767c2e76b7.js\",\"971:static/chunks/fd9d1056-d8847af536b5787b.js\",\"596:static/chunks/596-9c29c47b8dee7a50.js\"],\"name\":\"default\",\"async\":false}\nc:I{\"id\":7920,\"chunks\":[\"272:static/chunks/webpack-a886dd767c2e76b7.js\",\"971:static/chunks/fd9d1056-d8847af536b5787b.js\",\"596:static/chunks/596-9c29c47b8dee7a50.js\"],\"name\":\"default\",\"async\":false}\ne:I{\"id\":6097,\"chunks\":[\"658:static/chunk"])</script><script>self.__next_f.push([1,"s/658-f8f9d18540505edc.js\",\"858:static/chunks/858-7255df6dbc44dff9.js\",\"121:static/chunks/121-54cee610700b4756.js\",\"97:static/chunks/97-64e11ce2b0607459.js\",\"11:static/chunks/app/eval/page-d5e8697859d6294e.js\"],\"name\":\"\",\"async\":false}\n"])</script><script>self.__next_f.push([1,"5:[[[\"$\",\"link\",\"0\",{\"rel\":\"stylesheet\",\"href\":\"/_next/static/css/e388dd377baf25ec.css\",\"precedence\":\"next\"}]],[\"$\",\"$L7\",null,{\"buildId\":\"P9zzdx-rDJKPcGFq_qOXC\",\"assetPrefix\":\"\",\"initialCanonicalUrl\":\"/eval/\",\"initialTree\":[\"\",{\"children\":[\"eval\",{\"children\":[\"__PAGE__\",{}]}]},\"$undefined\",\"$undefined\",true],\"initialHead\":\"$L8\",\"globalErrorComponent\":\"$9\",\"children\":[null,[\"$\",\"html\",null,{\"lang\":\"en\",\"children\":[\"$\",\"body\",null,{\"className\":\"__className_979022\",\"children\":[\"$\",\"$La\",null,{\"children\":[\"$\",\"$Lb\",null,{\"parallelRouterKey\":\"children\",\"segmentPath\":[\"children\"],\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"loading\":\"$undefined\",\"loadingStyles\":\"$undefined\",\"hasLoading\":false,\"template\":[\"$\",\"$Lc\",null,{}],\"templateStyles\":\"$undefined\",\"notFound\":[[\"$\",\"title\",null,{\"children\":\"404: This page could not be found.\"}],[\"$\",\"div\",null,{\"style\":{\"fontFamily\":\"system-ui,\\\"Segoe UI\\\",Roboto,Helvetica,Arial,sans-serif,\\\"Apple Color Emoji\\\",\\\"Segoe UI Emoji\\\"\",\"height\":\"100vh\",\"textAlign\":\"center\",\"display\":\"flex\",\"flexDirection\":\"column\",\"alignItems\":\"center\",\"justifyContent\":\"center\"},\"children\":[\"$\",\"div\",null,{\"children\":[[\"$\",\"style\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}\"}}],[\"$\",\"h1\",null,{\"className\":\"next-error-h1\",\"style\":{\"display\":\"inline-block\",\"margin\":\"0 20px 0 0\",\"padding\":\"0 23px 0 0\",\"fontSize\":24,\"fontWeight\":500,\"verticalAlign\":\"top\",\"lineHeight\":\"49px\"},\"children\":\"404\"}],[\"$\",\"div\",null,{\"style\":{\"display\":\"inline-block\"},\"children\":[\"$\",\"h2\",null,{\"style\":{\"fontSize\":14,\"fontWeight\":400,\"lineHeight\":\"49px\",\"margin\":0},\"children\":\"This page could not be found.\"}]}]]}]}]],\"notFoundStyles\":\"$undefined\",\"childProp\":{\"current\":[\"$\",\"$Lb\",null,{\"parallelRouterKey\":\"children\",\"segmentPath\":[\"children\",\"eval\",\"children\"],\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"loading\":\"$undefined\",\"loadingStyles\":\"$undefined\",\"hasLoading\":false,\"template\":[\"$\",\"$Lc\",null,{}],\"templateStyles\":\"$undefined\",\"notFound\":\"$undefined\",\"notFoundStyles\":\"$undefined\",\"childProp\":{\"current\":[\"$Ld\",[\"$\",\"$Le\",null,{}],null],\"segment\":\"__PAGE__\"},\"styles\":[[\"$\",\"link\",\"0\",{\"rel\":\"stylesheet\",\"href\":\"/_next/static/css/fc460b8a7cadb952.css\",\"precedence\":\"next\"}]]}],\"segment\":\"eval\"},\"styles\":[]}]}]}]}],null]}]]\n"])</script><script>self.__next_f.push([1,"8:[[\"$\",\"meta\",\"0\",{\"charSet\":\"utf-8\"}],[\"$\",\"title\",\"1\",{\"children\":\"promptfoo\"}],[\"$\",\"meta\",\"2\",{\"name\":\"description\",\"content\":\"LLM testing and evaluation\"}],[\"$\",\"meta\",\"3\",{\"name\":\"viewport\",\"content\":\"width=device-width, initial-scale=1\"}],[\"$\",\"meta\",\"4\",{\"name\":\"next-size-adjust\"}]]\nd:null\n"])</script></body></html>
@@ -0,0 +1,13 @@
1
+ 1:HL["/_next/static/media/0e4fe491bf84089c-s.p.woff2",{"as":"font","type":"font/woff2"}]
2
+ 2:HL["/_next/static/media/627622453ef56b0d-s.p.woff2",{"as":"font","type":"font/woff2"}]
3
+ 3:HL["/_next/static/media/934c4b7cb736f2a3-s.p.woff2",{"as":"font","type":"font/woff2"}]
4
+ 4:HL["/_next/static/css/e388dd377baf25ec.css",{"as":"style"}]
5
+ 0:["P9zzdx-rDJKPcGFq_qOXC",[[["",{"children":["eval",{"children":["__PAGE__",{}]}]},"$undefined","$undefined",true],"$L5",[[["$","link","0",{"rel":"stylesheet","href":"/_next/static/css/e388dd377baf25ec.css","precedence":"next"}]],"$L6"]]]]
6
+ 7:HL["/_next/static/css/fc460b8a7cadb952.css",{"as":"style"}]
7
+ 8:I{"id":2152,"chunks":["658:static/chunks/658-f8f9d18540505edc.js","583:static/chunks/583-507e6d8883bb85ff.js","185:static/chunks/app/layout-4c714b1a5a3a768d.js"],"name":"PageShell","async":false}
8
+ 9:I{"id":7767,"chunks":["272:static/chunks/webpack-a886dd767c2e76b7.js","971:static/chunks/fd9d1056-d8847af536b5787b.js","596:static/chunks/596-9c29c47b8dee7a50.js"],"name":"default","async":false}
9
+ a:I{"id":7920,"chunks":["272:static/chunks/webpack-a886dd767c2e76b7.js","971:static/chunks/fd9d1056-d8847af536b5787b.js","596:static/chunks/596-9c29c47b8dee7a50.js"],"name":"default","async":false}
10
+ c:I{"id":6097,"chunks":["658:static/chunks/658-f8f9d18540505edc.js","858:static/chunks/858-7255df6dbc44dff9.js","121:static/chunks/121-54cee610700b4756.js","97:static/chunks/97-64e11ce2b0607459.js","11:static/chunks/app/eval/page-d5e8697859d6294e.js"],"name":"","async":false}
11
+ 5:[null,["$","html",null,{"lang":"en","children":["$","body",null,{"className":"__className_979022","children":["$","$L8",null,{"children":["$","$L9",null,{"parallelRouterKey":"children","segmentPath":["children"],"error":"$undefined","errorStyles":"$undefined","loading":"$undefined","loadingStyles":"$undefined","hasLoading":false,"template":["$","$La",null,{}],"templateStyles":"$undefined","notFound":[["$","title",null,{"children":"404: This page could not be found."}],["$","div",null,{"style":{"fontFamily":"system-ui,\"Segoe UI\",Roboto,Helvetica,Arial,sans-serif,\"Apple Color Emoji\",\"Segoe UI Emoji\"","height":"100vh","textAlign":"center","display":"flex","flexDirection":"column","alignItems":"center","justifyContent":"center"},"children":["$","div",null,{"children":[["$","style",null,{"dangerouslySetInnerHTML":{"__html":"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}"}}],["$","h1",null,{"className":"next-error-h1","style":{"display":"inline-block","margin":"0 20px 0 0","padding":"0 23px 0 0","fontSize":24,"fontWeight":500,"verticalAlign":"top","lineHeight":"49px"},"children":"404"}],["$","div",null,{"style":{"display":"inline-block"},"children":["$","h2",null,{"style":{"fontSize":14,"fontWeight":400,"lineHeight":"49px","margin":0},"children":"This page could not be found."}]}]]}]}]],"notFoundStyles":"$undefined","childProp":{"current":["$","$L9",null,{"parallelRouterKey":"children","segmentPath":["children","eval","children"],"error":"$undefined","errorStyles":"$undefined","loading":"$undefined","loadingStyles":"$undefined","hasLoading":false,"template":["$","$La",null,{}],"templateStyles":"$undefined","notFound":"$undefined","notFoundStyles":"$undefined","childProp":{"current":["$Lb",["$","$Lc",null,{}],null],"segment":"__PAGE__"},"styles":[["$","link","0",{"rel":"stylesheet","href":"/_next/static/css/fc460b8a7cadb952.css","precedence":"next"}]]}],"segment":"eval"},"styles":[]}]}]}]}],null]
12
+ 6:[["$","meta","0",{"charSet":"utf-8"}],["$","title","1",{"children":"promptfoo"}],["$","meta","2",{"name":"description","content":"LLM testing and evaluation"}],["$","meta","3",{"name":"viewport","content":"width=device-width, initial-scale=1"}],["$","meta","4",{"name":"next-size-adjust"}]]
13
+ b:null
@@ -0,0 +1 @@
1
+ <!DOCTYPE html><html id="__next_error__"><head><meta charSet="utf-8"/><link rel="preload" as="font" href="/_next/static/media/0e4fe491bf84089c-s.p.woff2" crossorigin="" type="font/woff2"/><link rel="preload" as="font" href="/_next/static/media/627622453ef56b0d-s.p.woff2" crossorigin="" type="font/woff2"/><link rel="preload" as="font" href="/_next/static/media/934c4b7cb736f2a3-s.p.woff2" crossorigin="" type="font/woff2"/><link rel="preload" as="style" href="/_next/static/css/e388dd377baf25ec.css"/><link rel="preload" href="/_next/static/chunks/webpack-a886dd767c2e76b7.js" as="script"/><link rel="preload" href="/_next/static/chunks/fd9d1056-d8847af536b5787b.js" as="script"/><link rel="preload" href="/_next/static/chunks/596-9c29c47b8dee7a50.js" as="script"/><link rel="preload" href="/_next/static/chunks/main-app-581ccf0003955b21.js" as="script"/><meta name="viewport" content="width=device-width, initial-scale=1"/><meta name="next-size-adjust"/><script src="/_next/static/chunks/polyfills-78c92fac7aa8fdd8.js" noModule=""></script></head><body><script src="/_next/static/chunks/webpack-a886dd767c2e76b7.js" async=""></script><script src="/_next/static/chunks/fd9d1056-d8847af536b5787b.js" async=""></script><script src="/_next/static/chunks/596-9c29c47b8dee7a50.js" async=""></script><script src="/_next/static/chunks/main-app-581ccf0003955b21.js" async=""></script><script>(self.__next_f=self.__next_f||[]).push([0])</script><script>self.__next_f.push([1,"1:HL[\"/_next/static/media/0e4fe491bf84089c-s.p.woff2\",{\"as\":\"font\",\"type\":\"font/woff2\"}]\n2:HL[\"/_next/static/media/627622453ef56b0d-s.p.woff2\",{\"as\":\"font\",\"type\":\"font/woff2\"}]\n3:HL[\"/_next/static/media/934c4b7cb736f2a3-s.p.woff2\",{\"as\":\"font\",\"type\":\"font/woff2\"}]\n4:HL[\"/_next/static/css/e388dd377baf25ec.css\",{\"as\":\"style\"}]\n0:\"$L5\"\n"])</script><script>self.__next_f.push([1,"6:HL[\"/_next/static/css/8119d8bd13a8adab.css\",{\"as\":\"style\"}]\n"])</script><script>self.__next_f.push([1,"7:I{\"id\":7948,\"chunks\":[\"272:static/chunks/webpack-a886dd767c2e76b7.js\",\"971:static/chunks/fd9d1056-d8847af536b5787b.js\",\"596:static/chunks/596-9c29c47b8dee7a50.js\"],\"name\":\"default\",\"async\":false}\n9:I{\"id\":6628,\"chunks\":[\"272:static/chunks/webpack-a886dd767c2e76b7.js\",\"971:static/chunks/fd9d1056-d8847af536b5787b.js\",\"596:static/chunks/596-9c29c47b8dee7a50.js\"],\"name\":\"\",\"async\":false}\na:I{\"id\":2152,\"chunks\":[\"658:static/chunks/658-f8f9d18540505edc.js\",\"583:static/chunks/583-507e6d8883bb85ff.js\",\"185:static"])</script><script>self.__next_f.push([1,"/chunks/app/layout-4c714b1a5a3a768d.js\"],\"name\":\"PageShell\",\"async\":false}\nb:I{\"id\":7767,\"chunks\":[\"272:static/chunks/webpack-a886dd767c2e76b7.js\",\"971:static/chunks/fd9d1056-d8847af536b5787b.js\",\"596:static/chunks/596-9c29c47b8dee7a50.js\"],\"name\":\"default\",\"async\":false}\nc:I{\"id\":7920,\"chunks\":[\"272:static/chunks/webpack-a886dd767c2e76b7.js\",\"971:static/chunks/fd9d1056-d8847af536b5787b.js\",\"596:static/chunks/596-9c29c47b8dee7a50.js\"],\"name\":\"default\",\"async\":false}\n"])</script><script>self.__next_f.push([1,"5:[[[\"$\",\"link\",\"0\",{\"rel\":\"stylesheet\",\"href\":\"/_next/static/css/e388dd377baf25ec.css\",\"precedence\":\"next\"}]],[\"$\",\"$L7\",null,{\"buildId\":\"P9zzdx-rDJKPcGFq_qOXC\",\"assetPrefix\":\"\",\"initialCanonicalUrl\":\"/\",\"initialTree\":[\"\",{\"children\":[\"__PAGE__\",{}]},\"$undefined\",\"$undefined\",true],\"initialHead\":\"$L8\",\"globalErrorComponent\":\"$9\",\"children\":[null,[\"$\",\"html\",null,{\"lang\":\"en\",\"children\":[\"$\",\"body\",null,{\"className\":\"__className_979022\",\"children\":[\"$\",\"$La\",null,{\"children\":[\"$\",\"$Lb\",null,{\"parallelRouterKey\":\"children\",\"segmentPath\":[\"children\"],\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"loading\":\"$undefined\",\"loadingStyles\":\"$undefined\",\"hasLoading\":false,\"template\":[\"$\",\"$Lc\",null,{}],\"templateStyles\":\"$undefined\",\"notFound\":[[\"$\",\"title\",null,{\"children\":\"404: This page could not be found.\"}],[\"$\",\"div\",null,{\"style\":{\"fontFamily\":\"system-ui,\\\"Segoe UI\\\",Roboto,Helvetica,Arial,sans-serif,\\\"Apple Color Emoji\\\",\\\"Segoe UI Emoji\\\"\",\"height\":\"100vh\",\"textAlign\":\"center\",\"display\":\"flex\",\"flexDirection\":\"column\",\"alignItems\":\"center\",\"justifyContent\":\"center\"},\"children\":[\"$\",\"div\",null,{\"children\":[[\"$\",\"style\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}\"}}],[\"$\",\"h1\",null,{\"className\":\"next-error-h1\",\"style\":{\"display\":\"inline-block\",\"margin\":\"0 20px 0 0\",\"padding\":\"0 23px 0 0\",\"fontSize\":24,\"fontWeight\":500,\"verticalAlign\":\"top\",\"lineHeight\":\"49px\"},\"children\":\"404\"}],[\"$\",\"div\",null,{\"style\":{\"display\":\"inline-block\"},\"children\":[\"$\",\"h2\",null,{\"style\":{\"fontSize\":14,\"fontWeight\":400,\"lineHeight\":\"49px\",\"margin\":0},\"children\":\"This page could not be found.\"}]}]]}]}]],\"notFoundStyles\":\"$undefined\",\"childProp\":{\"current\":[\"$Ld\",\"$Le\",null],\"segment\":\"__PAGE__\"},\"styles\":[[\"$\",\"link\",\"0\",{\"rel\":\"stylesheet\",\"href\":\"/_next/static/css/8119d8bd13a8adab.css\",\"precedence\":\"next\"}]]}]}]}]}],null]}]]\n"])</script><script>self.__next_f.push([1,"e:E{\"digest\":\"NEXT_REDIRECT;replace;/eval\"}\n"])</script><script>self.__next_f.push([1,"8:[[\"$\",\"meta\",\"0\",{\"charSet\":\"utf-8\"}],[\"$\",\"title\",\"1\",{\"children\":\"promptfoo\"}],[\"$\",\"meta\",\"2\",{\"name\":\"description\",\"content\":\"LLM testing and evaluation\"}],[\"$\",\"meta\",\"3\",{\"name\":\"viewport\",\"content\":\"width=device-width, initial-scale=1\"}],[\"$\",\"meta\",\"4\",{\"name\":\"next-size-adjust\"}]]\nd:null\n"])</script></body></html>
@@ -0,0 +1,13 @@
1
+ 1:HL["/_next/static/media/0e4fe491bf84089c-s.p.woff2",{"as":"font","type":"font/woff2"}]
2
+ 2:HL["/_next/static/media/627622453ef56b0d-s.p.woff2",{"as":"font","type":"font/woff2"}]
3
+ 3:HL["/_next/static/media/934c4b7cb736f2a3-s.p.woff2",{"as":"font","type":"font/woff2"}]
4
+ 4:HL["/_next/static/css/e388dd377baf25ec.css",{"as":"style"}]
5
+ 0:["P9zzdx-rDJKPcGFq_qOXC",[[["",{"children":["__PAGE__",{}]},"$undefined","$undefined",true],"$L5",[[["$","link","0",{"rel":"stylesheet","href":"/_next/static/css/e388dd377baf25ec.css","precedence":"next"}]],"$L6"]]]]
6
+ 7:HL["/_next/static/css/8119d8bd13a8adab.css",{"as":"style"}]
7
+ 8:I{"id":2152,"chunks":["658:static/chunks/658-f8f9d18540505edc.js","583:static/chunks/583-507e6d8883bb85ff.js","185:static/chunks/app/layout-4c714b1a5a3a768d.js"],"name":"PageShell","async":false}
8
+ 9:I{"id":7767,"chunks":["272:static/chunks/webpack-a886dd767c2e76b7.js","971:static/chunks/fd9d1056-d8847af536b5787b.js","596:static/chunks/596-9c29c47b8dee7a50.js"],"name":"default","async":false}
9
+ a:I{"id":7920,"chunks":["272:static/chunks/webpack-a886dd767c2e76b7.js","971:static/chunks/fd9d1056-d8847af536b5787b.js","596:static/chunks/596-9c29c47b8dee7a50.js"],"name":"default","async":false}
10
+ 5:[null,["$","html",null,{"lang":"en","children":["$","body",null,{"className":"__className_979022","children":["$","$L8",null,{"children":["$","$L9",null,{"parallelRouterKey":"children","segmentPath":["children"],"error":"$undefined","errorStyles":"$undefined","loading":"$undefined","loadingStyles":"$undefined","hasLoading":false,"template":["$","$La",null,{}],"templateStyles":"$undefined","notFound":[["$","title",null,{"children":"404: This page could not be found."}],["$","div",null,{"style":{"fontFamily":"system-ui,\"Segoe UI\",Roboto,Helvetica,Arial,sans-serif,\"Apple Color Emoji\",\"Segoe UI Emoji\"","height":"100vh","textAlign":"center","display":"flex","flexDirection":"column","alignItems":"center","justifyContent":"center"},"children":["$","div",null,{"children":[["$","style",null,{"dangerouslySetInnerHTML":{"__html":"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}"}}],["$","h1",null,{"className":"next-error-h1","style":{"display":"inline-block","margin":"0 20px 0 0","padding":"0 23px 0 0","fontSize":24,"fontWeight":500,"verticalAlign":"top","lineHeight":"49px"},"children":"404"}],["$","div",null,{"style":{"display":"inline-block"},"children":["$","h2",null,{"style":{"fontSize":14,"fontWeight":400,"lineHeight":"49px","margin":0},"children":"This page could not be found."}]}]]}]}]],"notFoundStyles":"$undefined","childProp":{"current":["$Lb","$Lc",null],"segment":"__PAGE__"},"styles":[["$","link","0",{"rel":"stylesheet","href":"/_next/static/css/8119d8bd13a8adab.css","precedence":"next"}]]}]}]}]}],null]
11
+ 6:[["$","meta","0",{"charSet":"utf-8"}],["$","title","1",{"children":"promptfoo"}],["$","meta","2",{"name":"description","content":"LLM testing and evaluation"}],["$","meta","3",{"name":"viewport","content":"width=device-width, initial-scale=1"}],["$","meta","4",{"name":"next-size-adjust"}]]
12
+ c:E{"digest":"NEXT_REDIRECT;replace;/eval"}
13
+ b:null
@@ -0,0 +1 @@
1
+ <!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><link rel="preload" as="font" href="/_next/static/media/0e4fe491bf84089c-s.p.woff2" crossorigin="" type="font/woff2"/><link rel="preload" as="font" href="/_next/static/media/627622453ef56b0d-s.p.woff2" crossorigin="" type="font/woff2"/><link rel="preload" as="font" href="/_next/static/media/934c4b7cb736f2a3-s.p.woff2" crossorigin="" type="font/woff2"/><link rel="stylesheet" href="/_next/static/css/e388dd377baf25ec.css" data-precedence="next"/><link rel="stylesheet" href="/_next/static/css/a35c840ac696f161.css" data-precedence="next"/><link rel="preload" href="/_next/static/chunks/webpack-a886dd767c2e76b7.js" as="script"/><link rel="preload" href="/_next/static/chunks/fd9d1056-d8847af536b5787b.js" as="script"/><link rel="preload" href="/_next/static/chunks/596-9c29c47b8dee7a50.js" as="script"/><link rel="preload" href="/_next/static/chunks/main-app-581ccf0003955b21.js" as="script"/><title>promptfoo</title><meta name="description" content="LLM testing and evaluation"/><meta name="viewport" content="width=device-width, initial-scale=1"/><meta name="next-size-adjust"/><script src="/_next/static/chunks/polyfills-78c92fac7aa8fdd8.js" noModule=""></script></head><body class="__className_979022"><div><style data-emotion="css jj2ztu">.css-jj2ztu{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;}.css-jj2ztu>:not(style):not(style){margin:0;}.css-jj2ztu>:not(style)~:not(style){margin-left:16px;}</style><div class="MuiStack-root nav css-jj2ztu"><div class="logo MuiBox-root css-0"><img src="/logo.svg" alt="Promptfoo logo"/> <span>promptfoo</span></div><a href="/setup/">New Eval</a><a href="/eval/">View Evals</a><div class="dark-mode-toggle"><style data-emotion="css vubbuv">.css-vubbuv{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;width:1em;height:1em;display:inline-block;fill:currentColor;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;-webkit-transition:fill 200ms cubic-bezier(0.4, 0, 0.2, 1) 0ms;transition:fill 200ms cubic-bezier(0.4, 0, 0.2, 1) 0ms;font-size:1.5rem;}</style><svg class="MuiSvgIcon-root MuiSvgIcon-fontSizeMedium css-vubbuv" focusable="false" aria-hidden="true" viewBox="0 0 24 24" data-testid="LightModeIcon"><path d="M12 7c-2.76 0-5 2.24-5 5s2.24 5 5 5 5-2.24 5-5-2.24-5-5-5zM2 13h2c.55 0 1-.45 1-1s-.45-1-1-1H2c-.55 0-1 .45-1 1s.45 1 1 1zm18 0h2c.55 0 1-.45 1-1s-.45-1-1-1h-2c-.55 0-1 .45-1 1s.45 1 1 1zM11 2v2c0 .55.45 1 1 1s1-.45 1-1V2c0-.55-.45-1-1-1s-1 .45-1 1zm0 18v2c0 .55.45 1 1 1s1-.45 1-1v-2c0-.55-.45-1-1-1s-1 .45-1 1zM5.99 4.58c-.39-.39-1.03-.39-1.41 0-.39.39-.39 1.03 0 1.41l1.06 1.06c.39.39 1.03.39 1.41 0s.39-1.03 0-1.41L5.99 4.58zm12.37 12.37c-.39-.39-1.03-.39-1.41 0-.39.39-.39 1.03 0 1.41l1.06 1.06c.39.39 1.03.39 1.41 0 .39-.39.39-1.03 0-1.41l-1.06-1.06zm1.06-10.96c.39-.39.39-1.03 0-1.41-.39-.39-1.03-.39-1.41 0l-1.06 1.06c-.39.39-.39 1.03 0 1.41s1.03.39 1.41 0l1.06-1.06zM7.05 18.36c.39-.39.39-1.03 0-1.41-.39-.39-1.03-.39-1.41 0l-1.06 1.06c-.39.39-.39 1.03 0 1.41s1.03.39 1.41 0l1.06-1.06z"></path></svg></div></div><div><style data-emotion="css 19t2hy6">.css-19t2hy6{width:100%;margin-left:auto;box-sizing:border-box;margin-right:auto;display:block;padding-left:16px;padding-right:16px;margin-top:2rem;}@media (min-width:600px){.css-19t2hy6{padding-left:24px;padding-right:24px;}}@media (min-width:1200px){.css-19t2hy6{max-width:1200px;}}</style><div class="MuiContainer-root MuiContainer-maxWidthLg css-19t2hy6"><style data-emotion="css 1w57jtv">.css-1w57jtv{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;-webkit-box-pack:justify;-webkit-justify-content:space-between;justify-content:space-between;}.css-1w57jtv>:not(style):not(style){margin:0;}.css-1w57jtv>:not(style)~:not(style){margin-left:16px;}</style><div class="MuiStack-root css-1w57jtv"><style data-emotion="css jqhduh">.css-jqhduh{margin:0;font-family:inherit;font-weight:400;font-size:2.125rem;line-height:1.235;}</style><h4 class="MuiTypography-root MuiTypography-h4 css-jqhduh">Set up an evaluation</h4><style data-emotion="css jj2ztu">.css-jj2ztu{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;}.css-jj2ztu>:not(style):not(style){margin:0;}.css-jj2ztu>:not(style)~:not(style){margin-left:16px;}</style><div class="MuiStack-root css-jj2ztu"><style data-emotion="css 11kchfx">.css-11kchfx{font-family:inherit;font-weight:500;font-size:0.875rem;line-height:1.75;text-transform:uppercase;min-width:64px;padding:6px 16px;border-radius:4px;-webkit-transition:background-color 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms,box-shadow 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms,border-color 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms,color 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms;transition:background-color 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms,box-shadow 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms,border-color 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms,color 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms;color:#fff;background-color:#1976d2;box-shadow:0px 3px 1px -2px rgba(0,0,0,0.2),0px 2px 2px 0px rgba(0,0,0,0.14),0px 1px 5px 0px rgba(0,0,0,0.12);}.css-11kchfx:hover{-webkit-text-decoration:none;text-decoration:none;background-color:#1565c0;box-shadow:0px 2px 4px -1px rgba(0,0,0,0.2),0px 4px 5px 0px rgba(0,0,0,0.14),0px 1px 10px 0px rgba(0,0,0,0.12);}@media (hover: none){.css-11kchfx:hover{background-color:#1976d2;}}.css-11kchfx:active{box-shadow:0px 5px 5px -3px rgba(0,0,0,0.2),0px 8px 10px 1px rgba(0,0,0,0.14),0px 3px 14px 2px rgba(0,0,0,0.12);}.css-11kchfx.Mui-focusVisible{box-shadow:0px 3px 5px -1px rgba(0,0,0,0.2),0px 6px 10px 0px rgba(0,0,0,0.14),0px 1px 18px 0px rgba(0,0,0,0.12);}.css-11kchfx.Mui-disabled{color:rgba(0, 0, 0, 0.26);box-shadow:none;background-color:rgba(0, 0, 0, 0.12);}</style><style data-emotion="css 1r4sjx4">.css-1r4sjx4{display:-webkit-inline-box;display:-webkit-inline-flex;display:-ms-inline-flexbox;display:inline-flex;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;-webkit-justify-content:center;justify-content:center;position:relative;box-sizing:border-box;-webkit-tap-highlight-color:transparent;background-color:transparent;outline:0;border:0;margin:0;border-radius:0;padding:0;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;vertical-align:middle;-moz-appearance:none;-webkit-appearance:none;-webkit-text-decoration:none;text-decoration:none;color:inherit;font-family:inherit;font-weight:500;font-size:0.875rem;line-height:1.75;text-transform:uppercase;min-width:64px;padding:6px 16px;border-radius:4px;-webkit-transition:background-color 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms,box-shadow 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms,border-color 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms,color 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms;transition:background-color 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms,box-shadow 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms,border-color 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms,color 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms;color:#fff;background-color:#1976d2;box-shadow:0px 3px 1px -2px rgba(0,0,0,0.2),0px 2px 2px 0px rgba(0,0,0,0.14),0px 1px 5px 0px rgba(0,0,0,0.12);}.css-1r4sjx4::-moz-focus-inner{border-style:none;}.css-1r4sjx4.Mui-disabled{pointer-events:none;cursor:default;}@media print{.css-1r4sjx4{-webkit-print-color-adjust:exact;color-adjust:exact;}}.css-1r4sjx4:hover{-webkit-text-decoration:none;text-decoration:none;background-color:#1565c0;box-shadow:0px 2px 4px -1px rgba(0,0,0,0.2),0px 4px 5px 0px rgba(0,0,0,0.14),0px 1px 10px 0px rgba(0,0,0,0.12);}@media (hover: none){.css-1r4sjx4:hover{background-color:#1976d2;}}.css-1r4sjx4:active{box-shadow:0px 5px 5px -3px rgba(0,0,0,0.2),0px 8px 10px 1px rgba(0,0,0,0.14),0px 3px 14px 2px rgba(0,0,0,0.12);}.css-1r4sjx4.Mui-focusVisible{box-shadow:0px 3px 5px -1px rgba(0,0,0,0.2),0px 6px 10px 0px rgba(0,0,0,0.14),0px 1px 18px 0px rgba(0,0,0,0.12);}.css-1r4sjx4.Mui-disabled{color:rgba(0, 0, 0, 0.26);box-shadow:none;background-color:rgba(0, 0, 0, 0.12);}</style><button class="MuiButtonBase-root MuiButton-root MuiButton-contained MuiButton-containedPrimary MuiButton-sizeMedium MuiButton-containedSizeMedium MuiButton-root MuiButton-contained MuiButton-containedPrimary MuiButton-sizeMedium MuiButton-containedSizeMedium css-1r4sjx4" tabindex="0" type="button">Run Evaluation</button><style data-emotion="css 1l5hj2g">.css-1l5hj2g{font-family:inherit;font-weight:500;font-size:0.875rem;line-height:1.75;text-transform:uppercase;min-width:64px;padding:5px 15px;border-radius:4px;-webkit-transition:background-color 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms,box-shadow 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms,border-color 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms,color 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms;transition:background-color 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms,box-shadow 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms,border-color 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms,color 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms;border:1px solid rgba(25, 118, 210, 0.5);color:#1976d2;}.css-1l5hj2g:hover{-webkit-text-decoration:none;text-decoration:none;background-color:rgba(25, 118, 210, 0.04);border:1px solid #1976d2;}@media (hover: none){.css-1l5hj2g:hover{background-color:transparent;}}.css-1l5hj2g.Mui-disabled{color:rgba(0, 0, 0, 0.26);border:1px solid rgba(0, 0, 0, 0.12);}</style><style data-emotion="css 1avs8v6">.css-1avs8v6{display:-webkit-inline-box;display:-webkit-inline-flex;display:-ms-inline-flexbox;display:inline-flex;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;-webkit-justify-content:center;justify-content:center;position:relative;box-sizing:border-box;-webkit-tap-highlight-color:transparent;background-color:transparent;outline:0;border:0;margin:0;border-radius:0;padding:0;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;vertical-align:middle;-moz-appearance:none;-webkit-appearance:none;-webkit-text-decoration:none;text-decoration:none;color:inherit;font-family:inherit;font-weight:500;font-size:0.875rem;line-height:1.75;text-transform:uppercase;min-width:64px;padding:5px 15px;border-radius:4px;-webkit-transition:background-color 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms,box-shadow 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms,border-color 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms,color 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms;transition:background-color 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms,box-shadow 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms,border-color 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms,color 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms;border:1px solid rgba(25, 118, 210, 0.5);color:#1976d2;}.css-1avs8v6::-moz-focus-inner{border-style:none;}.css-1avs8v6.Mui-disabled{pointer-events:none;cursor:default;}@media print{.css-1avs8v6{-webkit-print-color-adjust:exact;color-adjust:exact;}}.css-1avs8v6:hover{-webkit-text-decoration:none;text-decoration:none;background-color:rgba(25, 118, 210, 0.04);border:1px solid #1976d2;}@media (hover: none){.css-1avs8v6:hover{background-color:transparent;}}.css-1avs8v6.Mui-disabled{color:rgba(0, 0, 0, 0.26);border:1px solid rgba(0, 0, 0, 0.12);}</style><button class="MuiButtonBase-root MuiButton-root MuiButton-outlined MuiButton-outlinedPrimary MuiButton-sizeMedium MuiButton-outlinedSizeMedium MuiButton-root MuiButton-outlined MuiButton-outlinedPrimary MuiButton-sizeMedium MuiButton-outlinedSizeMedium css-1avs8v6" tabindex="0" type="button">Reset</button></div></div><style data-emotion="css h5fkc8">.css-h5fkc8{margin-top:32px;}</style><div class="MuiBox-root css-h5fkc8"></div><style data-emotion="css 1yuhvjn">.css-1yuhvjn{margin-top:16px;}</style><div class="MuiBox-root css-1yuhvjn"><style data-emotion="css 1nguorl">.css-1nguorl{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-box-pack:justify;-webkit-justify-content:space-between;justify-content:space-between;}.css-1nguorl>:not(style):not(style){margin:0;}.css-1nguorl>:not(style)~:not(style){margin-top:16px;}</style><div class="MuiStack-root css-1nguorl"><style data-emotion="css 1d79rw6">.css-1d79rw6{margin:0;font-family:inherit;font-weight:400;font-size:1.5rem;line-height:1.334;}</style><h5 class="MuiTypography-root MuiTypography-h5 css-1d79rw6">Providers</h5><div class="MuiBox-root css-1yuhvjn"><style data-emotion="css 18nc3u2">.css-18nc3u2.Mui-focused .MuiAutocomplete-clearIndicator{visibility:visible;}@media (pointer: fine){.css-18nc3u2:hover .MuiAutocomplete-clearIndicator{visibility:visible;}}.css-18nc3u2 .MuiAutocomplete-tag{margin:3px;max-width:calc(100% - 6px);}.css-18nc3u2 .MuiAutocomplete-inputRoot{-webkit-box-flex-wrap:wrap;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;}.MuiAutocomplete-hasPopupIcon.css-18nc3u2 .MuiAutocomplete-inputRoot,.MuiAutocomplete-hasClearIcon.css-18nc3u2 .MuiAutocomplete-inputRoot{padding-right:30px;}.MuiAutocomplete-hasPopupIcon.MuiAutocomplete-hasClearIcon.css-18nc3u2 .MuiAutocomplete-inputRoot{padding-right:56px;}.css-18nc3u2 .MuiAutocomplete-inputRoot .MuiAutocomplete-input{width:0;min-width:30px;}.css-18nc3u2 .MuiInput-root{padding-bottom:1px;}.css-18nc3u2 .MuiInput-root .MuiInput-input{padding:4px 4px 4px 0px;}.css-18nc3u2 .MuiInput-root.MuiInputBase-sizeSmall .MuiInput-input{padding:2px 4px 3px 0;}.css-18nc3u2 .MuiOutlinedInput-root{padding:9px;}.MuiAutocomplete-hasPopupIcon.css-18nc3u2 .MuiOutlinedInput-root,.MuiAutocomplete-hasClearIcon.css-18nc3u2 .MuiOutlinedInput-root{padding-right:39px;}.MuiAutocomplete-hasPopupIcon.MuiAutocomplete-hasClearIcon.css-18nc3u2 .MuiOutlinedInput-root{padding-right:65px;}.css-18nc3u2 .MuiOutlinedInput-root .MuiAutocomplete-input{padding:7.5px 4px 7.5px 5px;}.css-18nc3u2 .MuiOutlinedInput-root .MuiAutocomplete-endAdornment{right:9px;}.css-18nc3u2 .MuiOutlinedInput-root.MuiInputBase-sizeSmall{padding-top:6px;padding-bottom:6px;padding-left:6px;}.css-18nc3u2 .MuiOutlinedInput-root.MuiInputBase-sizeSmall .MuiAutocomplete-input{padding:2.5px 4px 2.5px 8px;}.css-18nc3u2 .MuiFilledInput-root{padding-top:19px;padding-left:8px;}.MuiAutocomplete-hasPopupIcon.css-18nc3u2 .MuiFilledInput-root,.MuiAutocomplete-hasClearIcon.css-18nc3u2 .MuiFilledInput-root{padding-right:39px;}.MuiAutocomplete-hasPopupIcon.MuiAutocomplete-hasClearIcon.css-18nc3u2 .MuiFilledInput-root{padding-right:65px;}.css-18nc3u2 .MuiFilledInput-root .MuiFilledInput-input{padding:7px 4px;}.css-18nc3u2 .MuiFilledInput-root .MuiAutocomplete-endAdornment{right:9px;}.css-18nc3u2 .MuiFilledInput-root.MuiInputBase-sizeSmall{padding-bottom:1px;}.css-18nc3u2 .MuiFilledInput-root.MuiInputBase-sizeSmall .MuiFilledInput-input{padding:2.5px 4px;}.css-18nc3u2 .MuiInputBase-hiddenLabel{padding-top:8px;}.css-18nc3u2 .MuiFilledInput-root.MuiInputBase-hiddenLabel{padding-top:0;padding-bottom:0;}.css-18nc3u2 .MuiFilledInput-root.MuiInputBase-hiddenLabel .MuiAutocomplete-input{padding-top:16px;padding-bottom:17px;}.css-18nc3u2 .MuiFilledInput-root.MuiInputBase-hiddenLabel.MuiInputBase-sizeSmall .MuiAutocomplete-input{padding-top:8px;padding-bottom:9px;}.css-18nc3u2 .MuiAutocomplete-input{-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;text-overflow:ellipsis;opacity:1;}</style><div class="MuiAutocomplete-root css-18nc3u2"><style data-emotion="css feqhe6">.css-feqhe6{display:-webkit-inline-box;display:-webkit-inline-flex;display:-ms-inline-flexbox;display:inline-flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;position:relative;min-width:0;padding:0;margin:0;border:0;vertical-align:top;width:100%;}</style><div class="MuiFormControl-root MuiFormControl-fullWidth MuiTextField-root css-feqhe6"><style data-emotion="css-global 1prfaxn">@-webkit-keyframes mui-auto-fill{from{display:block;}}@keyframes mui-auto-fill{from{display:block;}}@-webkit-keyframes mui-auto-fill-cancel{from{display:block;}}@keyframes mui-auto-fill-cancel{from{display:block;}}</style><style data-emotion="css 18bxsfn">.css-18bxsfn{font-family:inherit;font-weight:400;font-size:1rem;line-height:1.4375em;color:rgba(0, 0, 0, 0.87);box-sizing:border-box;position:relative;cursor:text;display:-webkit-inline-box;display:-webkit-inline-flex;display:-ms-inline-flexbox;display:inline-flex;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;width:100%;position:relative;border-radius:4px;}.css-18bxsfn.Mui-disabled{color:rgba(0, 0, 0, 0.38);cursor:default;}.css-18bxsfn:hover .MuiOutlinedInput-notchedOutline{border-color:rgba(0, 0, 0, 0.87);}@media (hover: none){.css-18bxsfn:hover .MuiOutlinedInput-notchedOutline{border-color:rgba(0, 0, 0, 0.23);}}.css-18bxsfn.Mui-focused .MuiOutlinedInput-notchedOutline{border-color:#1976d2;border-width:2px;}.css-18bxsfn.Mui-error .MuiOutlinedInput-notchedOutline{border-color:#d32f2f;}.css-18bxsfn.Mui-disabled .MuiOutlinedInput-notchedOutline{border-color:rgba(0, 0, 0, 0.26);}</style><div class="MuiInputBase-root MuiOutlinedInput-root MuiInputBase-colorPrimary MuiInputBase-fullWidth MuiInputBase-formControl MuiAutocomplete-inputRoot css-18bxsfn"><style data-emotion="css 1x5jdmq">.css-1x5jdmq{font:inherit;letter-spacing:inherit;color:currentColor;padding:4px 0 5px;border:0;box-sizing:content-box;background:none;height:1.4375em;margin:0;-webkit-tap-highlight-color:transparent;display:block;min-width:0;width:100%;-webkit-animation-name:mui-auto-fill-cancel;animation-name:mui-auto-fill-cancel;-webkit-animation-duration:10ms;animation-duration:10ms;padding:16.5px 14px;}.css-1x5jdmq::-webkit-input-placeholder{color:currentColor;opacity:0.42;-webkit-transition:opacity 200ms cubic-bezier(0.4, 0, 0.2, 1) 0ms;transition:opacity 200ms cubic-bezier(0.4, 0, 0.2, 1) 0ms;}.css-1x5jdmq::-moz-placeholder{color:currentColor;opacity:0.42;-webkit-transition:opacity 200ms cubic-bezier(0.4, 0, 0.2, 1) 0ms;transition:opacity 200ms cubic-bezier(0.4, 0, 0.2, 1) 0ms;}.css-1x5jdmq:-ms-input-placeholder{color:currentColor;opacity:0.42;-webkit-transition:opacity 200ms cubic-bezier(0.4, 0, 0.2, 1) 0ms;transition:opacity 200ms cubic-bezier(0.4, 0, 0.2, 1) 0ms;}.css-1x5jdmq::-ms-input-placeholder{color:currentColor;opacity:0.42;-webkit-transition:opacity 200ms cubic-bezier(0.4, 0, 0.2, 1) 0ms;transition:opacity 200ms cubic-bezier(0.4, 0, 0.2, 1) 0ms;}.css-1x5jdmq:focus{outline:0;}.css-1x5jdmq:invalid{box-shadow:none;}.css-1x5jdmq::-webkit-search-decoration{-webkit-appearance:none;}label[data-shrink=false]+.MuiInputBase-formControl .css-1x5jdmq::-webkit-input-placeholder{opacity:0!important;}label[data-shrink=false]+.MuiInputBase-formControl .css-1x5jdmq::-moz-placeholder{opacity:0!important;}label[data-shrink=false]+.MuiInputBase-formControl .css-1x5jdmq:-ms-input-placeholder{opacity:0!important;}label[data-shrink=false]+.MuiInputBase-formControl .css-1x5jdmq::-ms-input-placeholder{opacity:0!important;}label[data-shrink=false]+.MuiInputBase-formControl .css-1x5jdmq:focus::-webkit-input-placeholder{opacity:0.42;}label[data-shrink=false]+.MuiInputBase-formControl .css-1x5jdmq:focus::-moz-placeholder{opacity:0.42;}label[data-shrink=false]+.MuiInputBase-formControl .css-1x5jdmq:focus:-ms-input-placeholder{opacity:0.42;}label[data-shrink=false]+.MuiInputBase-formControl .css-1x5jdmq:focus::-ms-input-placeholder{opacity:0.42;}.css-1x5jdmq.Mui-disabled{opacity:1;-webkit-text-fill-color:rgba(0, 0, 0, 0.38);}.css-1x5jdmq:-webkit-autofill{-webkit-animation-duration:5000s;animation-duration:5000s;-webkit-animation-name:mui-auto-fill;animation-name:mui-auto-fill;}.css-1x5jdmq:-webkit-autofill{border-radius:inherit;}</style><input aria-invalid="false" autoComplete="off" id=":R3ahqmmla:" placeholder="Select LLM providers" type="text" class="MuiInputBase-input MuiOutlinedInput-input MuiAutocomplete-input MuiAutocomplete-inputFocused css-1x5jdmq" aria-autocomplete="list" aria-expanded="false" autoCapitalize="none" spellCheck="false" role="combobox" value=""/><style data-emotion="css 19w1uun">.css-19w1uun{border-color:rgba(0, 0, 0, 0.23);}</style><style data-emotion="css igs3ac">.css-igs3ac{text-align:left;position:absolute;bottom:0;right:0;top:-5px;left:0;margin:0;padding:0 8px;pointer-events:none;border-radius:inherit;border-style:solid;border-width:1px;overflow:hidden;min-width:0%;border-color:rgba(0, 0, 0, 0.23);}</style><fieldset aria-hidden="true" class="MuiOutlinedInput-notchedOutline css-igs3ac"><style data-emotion="css ihdtdm">.css-ihdtdm{float:unset;width:auto;overflow:hidden;padding:0;line-height:11px;-webkit-transition:width 150ms cubic-bezier(0.0, 0, 0.2, 1) 0ms;transition:width 150ms cubic-bezier(0.0, 0, 0.2, 1) 0ms;}</style><legend class="css-ihdtdm"><span class="notranslate">​</span></legend></fieldset></div></div></div></div></div></div><div class="MuiBox-root css-h5fkc8"></div><div><div class="MuiStack-root css-1w57jtv"><h5 class="MuiTypography-root MuiTypography-h5 css-1d79rw6">Prompts</h5><div><label for="file-input-add-prompt"><span aria-label="Upload prompt from file" class=""><style data-emotion="css 1wf493t">.css-1wf493t{text-align:center;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;font-size:1.5rem;padding:8px;border-radius:50%;overflow:visible;color:rgba(0, 0, 0, 0.54);-webkit-transition:background-color 150ms cubic-bezier(0.4, 0, 0.2, 1) 0ms;transition:background-color 150ms cubic-bezier(0.4, 0, 0.2, 1) 0ms;}.css-1wf493t:hover{background-color:rgba(0, 0, 0, 0.04);}@media (hover: none){.css-1wf493t:hover{background-color:transparent;}}.css-1wf493t.Mui-disabled{background-color:transparent;color:rgba(0, 0, 0, 0.26);}</style><style data-emotion="css 1yxmbwk">.css-1yxmbwk{display:-webkit-inline-box;display:-webkit-inline-flex;display:-ms-inline-flexbox;display:inline-flex;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;-webkit-justify-content:center;justify-content:center;position:relative;box-sizing:border-box;-webkit-tap-highlight-color:transparent;background-color:transparent;outline:0;border:0;margin:0;border-radius:0;padding:0;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;vertical-align:middle;-moz-appearance:none;-webkit-appearance:none;-webkit-text-decoration:none;text-decoration:none;color:inherit;text-align:center;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;font-size:1.5rem;padding:8px;border-radius:50%;overflow:visible;color:rgba(0, 0, 0, 0.54);-webkit-transition:background-color 150ms cubic-bezier(0.4, 0, 0.2, 1) 0ms;transition:background-color 150ms cubic-bezier(0.4, 0, 0.2, 1) 0ms;}.css-1yxmbwk::-moz-focus-inner{border-style:none;}.css-1yxmbwk.Mui-disabled{pointer-events:none;cursor:default;}@media print{.css-1yxmbwk{-webkit-print-color-adjust:exact;color-adjust:exact;}}.css-1yxmbwk:hover{background-color:rgba(0, 0, 0, 0.04);}@media (hover: none){.css-1yxmbwk:hover{background-color:transparent;}}.css-1yxmbwk.Mui-disabled{background-color:transparent;color:rgba(0, 0, 0, 0.26);}</style><span class="MuiButtonBase-root MuiIconButton-root MuiIconButton-sizeMedium css-1yxmbwk" tabindex="0" role="button"><style data-emotion="css vubbuv">.css-vubbuv{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;width:1em;height:1em;display:inline-block;fill:currentColor;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;-webkit-transition:fill 200ms cubic-bezier(0.4, 0, 0.2, 1) 0ms;transition:fill 200ms cubic-bezier(0.4, 0, 0.2, 1) 0ms;font-size:1.5rem;}</style><svg class="MuiSvgIcon-root MuiSvgIcon-fontSizeMedium css-vubbuv" focusable="false" aria-hidden="true" viewBox="0 0 24 24" data-testid="PublishIcon"><path d="M5 4v2h14V4H5zm0 10h4v6h6v-6h4l-7-7-7 7z"></path></svg></span><input id="file-input-add-prompt" type="file" accept=".txt,.md" style="display:none"/></span><style data-emotion="css 1e2dcm1">.css-1e2dcm1{z-index:1500;pointer-events:none;}</style><style data-emotion="css okvapm">.css-okvapm{z-index:1500;pointer-events:none;}</style></label><button class="MuiButtonBase-root MuiButton-root MuiButton-contained MuiButton-containedPrimary MuiButton-sizeMedium MuiButton-containedSizeMedium MuiButton-root MuiButton-contained MuiButton-containedPrimary MuiButton-sizeMedium MuiButton-containedSizeMedium css-1r4sjx4" tabindex="0" type="button">Add Prompt</button></div></div><style data-emotion="css kge0eu">.css-kge0eu{width:100%;overflow-x:auto;}</style><div class="MuiTableContainer-root css-kge0eu"><style data-emotion="css 1od17fy">.css-1od17fy{display:table;width:100%;border-collapse:collapse;border-spacing:0;}.css-1od17fy caption{font-family:inherit;font-weight:400;font-size:0.875rem;line-height:1.43;padding:16px;color:rgba(0, 0, 0, 0.6);text-align:left;caption-side:bottom;}</style><table class="MuiTable-root css-1od17fy"><style data-emotion="css 1xnox0e">.css-1xnox0e{display:table-row-group;}</style><tbody class="MuiTableBody-root css-1xnox0e"><style data-emotion="css 1gqug66">.css-1gqug66{color:inherit;display:table-row;vertical-align:middle;outline:0;}.css-1gqug66.MuiTableRow-hover:hover{background-color:rgba(0, 0, 0, 0.04);}.css-1gqug66.Mui-selected{background-color:rgba(25, 118, 210, 0.08);}.css-1gqug66.Mui-selected:hover{background-color:rgba(25, 118, 210, 0.12);}</style><tr class="MuiTableRow-root css-1gqug66"><style data-emotion="css qzozz">.css-qzozz{font-family:inherit;font-weight:400;font-size:0.875rem;line-height:1.43;display:table-cell;vertical-align:inherit;border-bottom:1px solid rgba(224, 224, 224, 1);text-align:center;padding:16px;color:rgba(0, 0, 0, 0.87);}</style><td class="MuiTableCell-root MuiTableCell-body MuiTableCell-alignCenter MuiTableCell-sizeMedium css-qzozz" colSpan="2">No prompts added yet.</td></tr></tbody></table></div><style data-emotion="css 1k371a6">@media print{.css-1k371a6{position:absolute!important;}}</style></div><style data-emotion="css 1hnm6b6">.css-1hnm6b6{margin-top:48px;}</style><div class="MuiBox-root css-1hnm6b6"></div><div class="MuiStack-root css-1w57jtv"><h5 class="MuiTypography-root MuiTypography-h5 css-1d79rw6">Test Cases</h5><button class="MuiButtonBase-root MuiButton-root MuiButton-contained MuiButton-containedPrimary MuiButton-sizeMedium MuiButton-containedSizeMedium MuiButton-root MuiButton-contained MuiButton-containedPrimary MuiButton-sizeMedium MuiButton-containedSizeMedium css-1r4sjx4" tabindex="0" type="button">Add Test Case</button></div><div class="MuiTableContainer-root css-kge0eu"><table class="MuiTable-root css-1od17fy"><style data-emotion="css 1wbz3t9">.css-1wbz3t9{display:table-header-group;}</style><thead class="MuiTableHead-root css-1wbz3t9"><tr class="MuiTableRow-root MuiTableRow-head css-1gqug66"><style data-emotion="css 75le9z">.css-75le9z{font-family:inherit;font-weight:500;font-size:0.875rem;line-height:1.5rem;display:table-cell;vertical-align:inherit;border-bottom:1px solid rgba(224, 224, 224, 1);text-align:left;padding:16px;color:rgba(0, 0, 0, 0.87);}</style><th class="MuiTableCell-root MuiTableCell-head MuiTableCell-sizeMedium css-75le9z" scope="col">Description</th><th class="MuiTableCell-root MuiTableCell-head MuiTableCell-sizeMedium css-75le9z" scope="col">Assertions</th><th class="MuiTableCell-root MuiTableCell-head MuiTableCell-sizeMedium css-75le9z" scope="col">Variables</th><style data-emotion="css qnurhq">.css-qnurhq{font-family:inherit;font-weight:500;font-size:0.875rem;line-height:1.5rem;display:table-cell;vertical-align:inherit;border-bottom:1px solid rgba(224, 224, 224, 1);text-align:right;padding:16px;color:rgba(0, 0, 0, 0.87);-webkit-flex-direction:row-reverse;-ms-flex-direction:row-reverse;flex-direction:row-reverse;}</style><th class="MuiTableCell-root MuiTableCell-head MuiTableCell-alignRight MuiTableCell-sizeMedium css-qnurhq" scope="col"></th></tr></thead><tbody class="MuiTableBody-root css-1xnox0e"><tr class="MuiTableRow-root css-1gqug66"><td class="MuiTableCell-root MuiTableCell-body MuiTableCell-alignCenter MuiTableCell-sizeMedium css-qzozz" colSpan="4">No test cases added yet.</td></tr></tbody></table></div><style data-emotion="css h8m1q6">.css-h8m1q6{margin-top:64px;}</style><div class="MuiBox-root css-h8m1q6"></div></div></div></div><script src="/_next/static/chunks/webpack-a886dd767c2e76b7.js" async=""></script><script src="/_next/static/chunks/fd9d1056-d8847af536b5787b.js" async=""></script><script src="/_next/static/chunks/596-9c29c47b8dee7a50.js" async=""></script><script src="/_next/static/chunks/main-app-581ccf0003955b21.js" async=""></script><script>(self.__next_f=self.__next_f||[]).push([0])</script><script>self.__next_f.push([1,"1:HL[\"/_next/static/media/0e4fe491bf84089c-s.p.woff2\",{\"as\":\"font\",\"type\":\"font/woff2\"}]\n2:HL[\"/_next/static/media/627622453ef56b0d-s.p.woff2\",{\"as\":\"font\",\"type\":\"font/woff2\"}]\n3:HL[\"/_next/static/media/934c4b7cb736f2a3-s.p.woff2\",{\"as\":\"font\",\"type\":\"font/woff2\"}]\n4:HL[\"/_next/static/css/e388dd377baf25ec.css\",{\"as\":\"style\"}]\n0:\"$L5\"\n"])</script><script>self.__next_f.push([1,"6:HL[\"/_next/static/css/a35c840ac696f161.css\",{\"as\":\"style\"}]\n"])</script><script>self.__next_f.push([1,"7:I{\"id\":7948,\"chunks\":[\"272:static/chunks/webpack-a886dd767c2e76b7.js\",\"971:static/chunks/fd9d1056-d8847af536b5787b.js\",\"596:static/chunks/596-9c29c47b8dee7a50.js\"],\"name\":\"default\",\"async\":false}\n9:I{\"id\":6628,\"chunks\":[\"272:static/chunks/webpack-a886dd767c2e76b7.js\",\"971:static/chunks/fd9d1056-d8847af536b5787b.js\",\"596:static/chunks/596-9c29c47b8dee7a50.js\"],\"name\":\"\",\"async\":false}\na:I{\"id\":2152,\"chunks\":[\"658:static/chunks/658-f8f9d18540505edc.js\",\"583:static/chunks/583-507e6d8883bb85ff.js\",\"185:static"])</script><script>self.__next_f.push([1,"/chunks/app/layout-4c714b1a5a3a768d.js\"],\"name\":\"PageShell\",\"async\":false}\nb:I{\"id\":7767,\"chunks\":[\"272:static/chunks/webpack-a886dd767c2e76b7.js\",\"971:static/chunks/fd9d1056-d8847af536b5787b.js\",\"596:static/chunks/596-9c29c47b8dee7a50.js\"],\"name\":\"default\",\"async\":false}\nc:I{\"id\":7920,\"chunks\":[\"272:static/chunks/webpack-a886dd767c2e76b7.js\",\"971:static/chunks/fd9d1056-d8847af536b5787b.js\",\"596:static/chunks/596-9c29c47b8dee7a50.js\"],\"name\":\"default\",\"async\":false}\ne:I{\"id\":4839,\"chunks\":[\"272:static/chunk"])</script><script>self.__next_f.push([1,"s/webpack-a886dd767c2e76b7.js\",\"971:static/chunks/fd9d1056-d8847af536b5787b.js\",\"596:static/chunks/596-9c29c47b8dee7a50.js\"],\"name\":\"default\",\"async\":false}\nf:I{\"id\":5302,\"chunks\":[\"658:static/chunks/658-f8f9d18540505edc.js\",\"858:static/chunks/858-7255df6dbc44dff9.js\",\"339:static/chunks/339-501c32916b785ef1.js\",\"583:static/chunks/583-507e6d8883bb85ff.js\",\"373:static/chunks/373-6a411db0b05027d3.js\",\"413:static/chunks/app/setup/page-cd35686fe6c12be8.js\"],\"name\":\"\",\"async\":false}\n"])</script><script>self.__next_f.push([1,"5:[[[\"$\",\"link\",\"0\",{\"rel\":\"stylesheet\",\"href\":\"/_next/static/css/e388dd377baf25ec.css\",\"precedence\":\"next\"}]],[\"$\",\"$L7\",null,{\"buildId\":\"P9zzdx-rDJKPcGFq_qOXC\",\"assetPrefix\":\"\",\"initialCanonicalUrl\":\"/setup/\",\"initialTree\":[\"\",{\"children\":[\"setup\",{\"children\":[\"__PAGE__\",{}]}]},\"$undefined\",\"$undefined\",true],\"initialHead\":\"$L8\",\"globalErrorComponent\":\"$9\",\"children\":[null,[\"$\",\"html\",null,{\"lang\":\"en\",\"children\":[\"$\",\"body\",null,{\"className\":\"__className_979022\",\"children\":[\"$\",\"$La\",null,{\"children\":[\"$\",\"$Lb\",null,{\"parallelRouterKey\":\"children\",\"segmentPath\":[\"children\"],\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"loading\":\"$undefined\",\"loadingStyles\":\"$undefined\",\"hasLoading\":false,\"template\":[\"$\",\"$Lc\",null,{}],\"templateStyles\":\"$undefined\",\"notFound\":[[\"$\",\"title\",null,{\"children\":\"404: This page could not be found.\"}],[\"$\",\"div\",null,{\"style\":{\"fontFamily\":\"system-ui,\\\"Segoe UI\\\",Roboto,Helvetica,Arial,sans-serif,\\\"Apple Color Emoji\\\",\\\"Segoe UI Emoji\\\"\",\"height\":\"100vh\",\"textAlign\":\"center\",\"display\":\"flex\",\"flexDirection\":\"column\",\"alignItems\":\"center\",\"justifyContent\":\"center\"},\"children\":[\"$\",\"div\",null,{\"children\":[[\"$\",\"style\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}\"}}],[\"$\",\"h1\",null,{\"className\":\"next-error-h1\",\"style\":{\"display\":\"inline-block\",\"margin\":\"0 20px 0 0\",\"padding\":\"0 23px 0 0\",\"fontSize\":24,\"fontWeight\":500,\"verticalAlign\":\"top\",\"lineHeight\":\"49px\"},\"children\":\"404\"}],[\"$\",\"div\",null,{\"style\":{\"display\":\"inline-block\"},\"children\":[\"$\",\"h2\",null,{\"style\":{\"fontSize\":14,\"fontWeight\":400,\"lineHeight\":\"49px\",\"margin\":0},\"children\":\"This page could not be found.\"}]}]]}]}]],\"notFoundStyles\":\"$undefined\",\"childProp\":{\"current\":[\"$\",\"$Lb\",null,{\"parallelRouterKey\":\"children\",\"segmentPath\":[\"children\",\"setup\",\"children\"],\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"loading\":\"$undefined\",\"loadingStyles\":\"$undefined\",\"hasLoading\":false,\"template\":[\"$\",\"$Lc\",null,{}],\"templateStyles\":\"$undefined\",\"notFound\":\"$undefined\",\"notFoundStyles\":\"$undefined\",\"childProp\":{\"current\":[\"$Ld\",[\"$\",\"$Le\",null,{\"propsForComponent\":{\"params\":{}},\"Component\":\"$f\"}],null],\"segment\":\"__PAGE__\"},\"styles\":[[\"$\",\"link\",\"0\",{\"rel\":\"stylesheet\",\"href\":\"/_next/static/css/a35c840ac696f161.css\",\"precedence\":\"next\"}]]}],\"segment\":\"setup\"},\"styles\":[]}]}]}]}],null]}]]\n"])</script><script>self.__next_f.push([1,"8:[[\"$\",\"meta\",\"0\",{\"charSet\":\"utf-8\"}],[\"$\",\"title\",\"1\",{\"children\":\"promptfoo\"}],[\"$\",\"meta\",\"2\",{\"name\":\"description\",\"content\":\"LLM testing and evaluation\"}],[\"$\",\"meta\",\"3\",{\"name\":\"viewport\",\"content\":\"width=device-width, initial-scale=1\"}],[\"$\",\"meta\",\"4\",{\"name\":\"next-size-adjust\"}]]\nd:null\n"])</script></body></html>
@@ -0,0 +1,14 @@
1
+ 1:HL["/_next/static/media/0e4fe491bf84089c-s.p.woff2",{"as":"font","type":"font/woff2"}]
2
+ 2:HL["/_next/static/media/627622453ef56b0d-s.p.woff2",{"as":"font","type":"font/woff2"}]
3
+ 3:HL["/_next/static/media/934c4b7cb736f2a3-s.p.woff2",{"as":"font","type":"font/woff2"}]
4
+ 4:HL["/_next/static/css/e388dd377baf25ec.css",{"as":"style"}]
5
+ 0:["P9zzdx-rDJKPcGFq_qOXC",[[["",{"children":["setup",{"children":["__PAGE__",{}]}]},"$undefined","$undefined",true],"$L5",[[["$","link","0",{"rel":"stylesheet","href":"/_next/static/css/e388dd377baf25ec.css","precedence":"next"}]],"$L6"]]]]
6
+ 7:HL["/_next/static/css/a35c840ac696f161.css",{"as":"style"}]
7
+ 8:I{"id":2152,"chunks":["658:static/chunks/658-f8f9d18540505edc.js","583:static/chunks/583-507e6d8883bb85ff.js","185:static/chunks/app/layout-4c714b1a5a3a768d.js"],"name":"PageShell","async":false}
8
+ 9:I{"id":7767,"chunks":["272:static/chunks/webpack-a886dd767c2e76b7.js","971:static/chunks/fd9d1056-d8847af536b5787b.js","596:static/chunks/596-9c29c47b8dee7a50.js"],"name":"default","async":false}
9
+ a:I{"id":7920,"chunks":["272:static/chunks/webpack-a886dd767c2e76b7.js","971:static/chunks/fd9d1056-d8847af536b5787b.js","596:static/chunks/596-9c29c47b8dee7a50.js"],"name":"default","async":false}
10
+ c:I{"id":4839,"chunks":["272:static/chunks/webpack-a886dd767c2e76b7.js","971:static/chunks/fd9d1056-d8847af536b5787b.js","596:static/chunks/596-9c29c47b8dee7a50.js"],"name":"default","async":false}
11
+ d:I{"id":5302,"chunks":["658:static/chunks/658-f8f9d18540505edc.js","858:static/chunks/858-7255df6dbc44dff9.js","339:static/chunks/339-501c32916b785ef1.js","583:static/chunks/583-507e6d8883bb85ff.js","373:static/chunks/373-6a411db0b05027d3.js","413:static/chunks/app/setup/page-cd35686fe6c12be8.js"],"name":"","async":false}
12
+ 5:[null,["$","html",null,{"lang":"en","children":["$","body",null,{"className":"__className_979022","children":["$","$L8",null,{"children":["$","$L9",null,{"parallelRouterKey":"children","segmentPath":["children"],"error":"$undefined","errorStyles":"$undefined","loading":"$undefined","loadingStyles":"$undefined","hasLoading":false,"template":["$","$La",null,{}],"templateStyles":"$undefined","notFound":[["$","title",null,{"children":"404: This page could not be found."}],["$","div",null,{"style":{"fontFamily":"system-ui,\"Segoe UI\",Roboto,Helvetica,Arial,sans-serif,\"Apple Color Emoji\",\"Segoe UI Emoji\"","height":"100vh","textAlign":"center","display":"flex","flexDirection":"column","alignItems":"center","justifyContent":"center"},"children":["$","div",null,{"children":[["$","style",null,{"dangerouslySetInnerHTML":{"__html":"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}"}}],["$","h1",null,{"className":"next-error-h1","style":{"display":"inline-block","margin":"0 20px 0 0","padding":"0 23px 0 0","fontSize":24,"fontWeight":500,"verticalAlign":"top","lineHeight":"49px"},"children":"404"}],["$","div",null,{"style":{"display":"inline-block"},"children":["$","h2",null,{"style":{"fontSize":14,"fontWeight":400,"lineHeight":"49px","margin":0},"children":"This page could not be found."}]}]]}]}]],"notFoundStyles":"$undefined","childProp":{"current":["$","$L9",null,{"parallelRouterKey":"children","segmentPath":["children","setup","children"],"error":"$undefined","errorStyles":"$undefined","loading":"$undefined","loadingStyles":"$undefined","hasLoading":false,"template":["$","$La",null,{}],"templateStyles":"$undefined","notFound":"$undefined","notFoundStyles":"$undefined","childProp":{"current":["$Lb",["$","$Lc",null,{"propsForComponent":{"params":{}},"Component":"$d"}],null],"segment":"__PAGE__"},"styles":[["$","link","0",{"rel":"stylesheet","href":"/_next/static/css/a35c840ac696f161.css","precedence":"next"}]]}],"segment":"setup"},"styles":[]}]}]}]}],null]
13
+ 6:[["$","meta","0",{"charSet":"utf-8"}],["$","title","1",{"children":"promptfoo"}],["$","meta","2",{"name":"description","content":"LLM testing and evaluation"}],["$","meta","3",{"name":"viewport","content":"width=device-width, initial-scale=1"}],["$","meta","4",{"name":"next-size-adjust"}]]
14
+ b:null
@@ -1,2 +1,2 @@
1
- export declare function init(port?: number): void;
1
+ export declare function startServer(port?: number): void;
2
2
  //# sourceMappingURL=server.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../../src/web/server.ts"],"names":[],"mappings":"AAeA,wBAAgB,IAAI,CAAC,IAAI,SAAQ,QAiFhC"}
1
+ {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../../src/web/server.ts"],"names":[],"mappings":"AA4BA,wBAAgB,WAAW,CAAC,IAAI,SAAQ,QA0HvC"}
@@ -3,23 +3,29 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
3
3
  return (mod && mod.__esModule) ? mod : { "default": mod };
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.init = void 0;
6
+ exports.startServer = void 0;
7
7
  const fs_1 = __importDefault(require("fs"));
8
8
  const node_path_1 = __importDefault(require("node:path"));
9
9
  const node_readline_1 = __importDefault(require("node:readline"));
10
10
  const node_http_1 = __importDefault(require("node:http"));
11
+ const tiny_invariant_1 = __importDefault(require("tiny-invariant"));
12
+ const uuid_1 = require("uuid");
11
13
  const debounce_1 = __importDefault(require("debounce"));
12
14
  const express_1 = __importDefault(require("express"));
13
15
  const cors_1 = __importDefault(require("cors"));
16
+ const compression_1 = __importDefault(require("compression"));
14
17
  const opener_1 = __importDefault(require("opener"));
15
18
  const socket_io_1 = require("socket.io");
19
+ const index_1 = __importDefault(require("../index"));
16
20
  const logger_1 = __importDefault(require("../logger"));
17
21
  const esm_1 = require("../esm");
18
22
  const util_1 = require("../util");
19
- function init(port = 15500) {
23
+ const evalJobs = new Map();
24
+ function startServer(port = 15500) {
20
25
  const app = (0, express_1.default)();
21
- const staticDir = node_path_1.default.join((0, esm_1.getDirectory)(), 'web', 'client');
26
+ const staticDir = node_path_1.default.join((0, esm_1.getDirectory)(), 'web', 'nextui');
22
27
  app.use((0, cors_1.default)());
28
+ app.use((0, compression_1.default)());
23
29
  app.use(express_1.default.json());
24
30
  app.use(express_1.default.static(staticDir));
25
31
  const httpServer = node_http_1.default.createServer(app);
@@ -50,8 +56,45 @@ function init(port = 15500) {
50
56
  });
51
57
  app.get('/results', (req, res) => {
52
58
  const previousResults = (0, util_1.listPreviousResults)();
59
+ previousResults.reverse();
53
60
  res.json({ data: previousResults });
54
61
  });
62
+ app.post('/api/eval', (req, res) => {
63
+ const testSuite = req.body;
64
+ const id = (0, uuid_1.v4)();
65
+ evalJobs.set(id, { status: 'in-progress', progress: 0, total: 0, result: null });
66
+ index_1.default
67
+ .evaluate(Object.assign({}, testSuite, { writeLatestResults: true }), {
68
+ progressCallback: (progress, total) => {
69
+ const job = evalJobs.get(id);
70
+ (0, tiny_invariant_1.default)(job, 'Job not found');
71
+ job.progress = progress;
72
+ job.total = total;
73
+ console.log(`Progress: ${progress}/${total}`);
74
+ },
75
+ })
76
+ .then((result) => {
77
+ const job = evalJobs.get(id);
78
+ (0, tiny_invariant_1.default)(job, 'Job not found');
79
+ job.status = 'completed';
80
+ job.result = result;
81
+ });
82
+ res.json({ id });
83
+ });
84
+ app.get('/api/eval/:id', (req, res) => {
85
+ const id = req.params.id;
86
+ const job = evalJobs.get(id);
87
+ if (!job) {
88
+ res.status(404).json({ error: 'Job not found' });
89
+ return;
90
+ }
91
+ if (job.status === 'completed') {
92
+ res.json({ status: 'completed', result: job.result });
93
+ }
94
+ else {
95
+ res.json({ status: 'in-progress', progress: job.progress, total: job.total });
96
+ }
97
+ });
55
98
  app.get('/results/:filename', (req, res) => {
56
99
  const filename = req.params.filename;
57
100
  const safeFilename = node_path_1.default.basename(filename);
@@ -88,5 +131,5 @@ function init(port = 15500) {
88
131
  });
89
132
  });
90
133
  }
91
- exports.init = init;
134
+ exports.startServer = startServer;
92
135
  //# sourceMappingURL=server.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"server.js","sourceRoot":"","sources":["../../../src/web/server.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../../../src/web/server.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -2,7 +2,7 @@
2
2
  "name": "promptfoo",
3
3
  "description": "LLM eval & testing toolkit",
4
4
  "author": "Ian Webster",
5
- "version": "0.18.4",
5
+ "version": "0.19.0",
6
6
  "license": "MIT",
7
7
  "type": "commonjs",
8
8
  "main": "dist/src/index.js",
@@ -25,13 +25,14 @@
25
25
  "promptfoo": "dist/src/main.js"
26
26
  },
27
27
  "scripts": {
28
+ "tsc": "tsc",
28
29
  "local": "ts-node --esm --files src/main.ts",
29
- "install:client": "cd src/web/client && npm install",
30
+ "install:nextui": "cd src/web/nextui && npm install",
30
31
  "build:clean": "rm -rf dist",
31
- "build:client": "cd src/web/client && npm run build && cp -r dist/ ../../../dist/src/web/client",
32
+ "build:nextui": "cd src/web/nextui && npm run build && cp -r out/ ../../../dist/src/web/nextui",
32
33
  "build:watch": "tsc --watch",
33
- "build": "tsc && cp src/*.html dist/src && npm run build:client && chmod +x dist/src/main.js",
34
- "prepare": "npm run install:client && npm run build:clean && npm run build",
34
+ "build": "tsc && cp src/*.html dist/src && npm run build:nextui && chmod +x dist/src/main.js",
35
+ "prepare": "npm run install:nextui && npm run build:clean && npm run build",
35
36
  "test": "jest",
36
37
  "test:watch": "jest --watch",
37
38
  "format": "prettier -w ."
@@ -41,6 +42,7 @@
41
42
  "@types/cache-manager": "^4.0.2",
42
43
  "@types/cache-manager-fs-hash": "^0.0.1",
43
44
  "@types/cli-progress": "^3.11.0",
45
+ "@types/compression": "^1.7.2",
44
46
  "@types/cors": "^2.8.13",
45
47
  "@types/debounce": "^1.2.1",
46
48
  "@types/express": "^4.17.17",
@@ -51,6 +53,7 @@
51
53
  "@types/nunjucks": "^3.2.2",
52
54
  "@types/opener": "^1.4.0",
53
55
  "@types/semver": "^7.5.0",
56
+ "@types/uuid": "^9.0.2",
54
57
  "babel-jest": "^29.5.0",
55
58
  "jest": "^29.5.0",
56
59
  "jest-watch-typeahead": "^2.2.2",
@@ -69,6 +72,7 @@
69
72
  "cli-progress": "^3.12.0",
70
73
  "cli-table3": "^0.6.3",
71
74
  "commander": "^10.0.1",
75
+ "compression": "^1.7.4",
72
76
  "cors": "^2.8.5",
73
77
  "csv-parse": "^5.3.8",
74
78
  "csv-stringify": "^6.3.2",
@@ -84,6 +88,7 @@
84
88
  "semver": "^7.5.3",
85
89
  "socket.io": "^4.6.1",
86
90
  "tiny-invariant": "^1.3.1",
91
+ "uuid": "^9.0.0",
87
92
  "winston": "^3.8.2"
88
93
  }
89
94
  }
package/src/evaluator.ts CHANGED
@@ -385,7 +385,6 @@ class Evaluator {
385
385
  // Set up progress bar...
386
386
  let progressbar: SingleBar | undefined;
387
387
  if (options.showProgressBar) {
388
- const totalNumRuns = runEvalOptions.length;
389
388
  const cliProgress = await import('cli-progress');
390
389
  progressbar = new cliProgress.SingleBar(
391
390
  {
@@ -394,34 +393,40 @@ class Evaluator {
394
393
  },
395
394
  cliProgress.Presets.shades_classic,
396
395
  );
397
- progressbar.start(totalNumRuns, 0, {
396
+ progressbar.start(runEvalOptions.length, 0, {
398
397
  provider: '',
399
398
  prompt: '',
400
399
  vars: '',
401
400
  });
402
401
  }
402
+ if (options.progressCallback) {
403
+ options.progressCallback(0, runEvalOptions.length);
404
+ }
403
405
 
404
406
  // Actually run the eval
405
407
  const results: EvaluateResult[] = [];
406
408
  await async.forEachOfLimit(
407
409
  runEvalOptions,
408
410
  options.maxConcurrency || DEFAULT_MAX_CONCURRENCY,
409
- async (options: RunEvalOptions, index: number | string) => {
410
- const row = await this.runEval(options);
411
+ async (evalStep: RunEvalOptions, index: number | string) => {
412
+ const row = await this.runEval(evalStep);
411
413
 
412
414
  results.push(row);
413
415
 
414
416
  if (progressbar) {
415
417
  progressbar.increment({
416
- provider: options.provider.id(),
417
- prompt: options.prompt.raw.slice(0, 10).replace(/\n/g, ' '),
418
- vars: Object.entries(options.test.vars || {})
418
+ provider: evalStep.provider.id(),
419
+ prompt: evalStep.prompt.raw.slice(0, 10).replace(/\n/g, ' '),
420
+ vars: Object.entries(evalStep.test.vars || {})
419
421
  .map(([k, v]) => `${k}=${v}`)
420
422
  .join(' ')
421
423
  .slice(0, 10)
422
424
  .replace(/\n/g, ' '),
423
425
  });
424
426
  }
427
+ if (options.progressCallback) {
428
+ options.progressCallback(results.length, runEvalOptions.length);
429
+ }
425
430
 
426
431
  // Bookkeeping for table
427
432
  if (typeof index !== 'number') {
@@ -441,13 +446,13 @@ class Evaluator {
441
446
  resultText = row.response?.output || row.error || '';
442
447
  }
443
448
 
444
- const { rowIndex, colIndex } = options;
449
+ const { rowIndex, colIndex } = evalStep;
445
450
  if (!table.body[rowIndex]) {
446
451
  table.body[rowIndex] = {
447
452
  outputs: [],
448
453
  vars: table.head.vars
449
454
  .map((varName) => {
450
- const varValue = options.test.vars?.[varName] || '';
455
+ const varValue = evalStep.test.vars?.[varName] || '';
451
456
  if (typeof varValue === 'string') {
452
457
  return varValue;
453
458
  }
@@ -475,6 +480,9 @@ class Evaluator {
475
480
  if (progressbar) {
476
481
  progressbar.stop();
477
482
  }
483
+ if (options.progressCallback) {
484
+ options.progressCallback(runEvalOptions.length, runEvalOptions.length);
485
+ }
478
486
 
479
487
  telemetry.record('eval_ran', {});
480
488
 
package/src/index.ts CHANGED
@@ -3,7 +3,7 @@ import providers from './providers';
3
3
  import telemetry from './telemetry';
4
4
  import { evaluate as doEvaluate } from './evaluator';
5
5
  import { loadApiProviders } from './providers';
6
- import { readTests, writeOutput } from './util';
6
+ import { readTests, writeLatestResults, writeOutput } from './util';
7
7
  import type { EvaluateOptions, TestSuite, TestSuiteConfig } from './types';
8
8
 
9
9
  export * from './types';
@@ -12,6 +12,7 @@ export { generateTable } from './table';
12
12
 
13
13
  interface EvaluateTestSuite extends TestSuiteConfig {
14
14
  prompts: string[];
15
+ writeLatestResults?: boolean;
15
16
  }
16
17
 
17
18
  async function evaluate(testSuite: EvaluateTestSuite, options: EvaluateOptions = {}) {
@@ -27,12 +28,17 @@ async function evaluate(testSuite: EvaluateTestSuite, options: EvaluateOptions =
27
28
  })),
28
29
  };
29
30
  telemetry.maybeShowNotice();
31
+
30
32
  const ret = await doEvaluate(constructedTestSuite, options);
31
33
 
32
34
  if (testSuite.outputPath) {
33
35
  writeOutput(testSuite.outputPath, ret, testSuite, null);
34
36
  }
35
37
 
38
+ if (testSuite.writeLatestResults) {
39
+ writeLatestResults(ret, {});
40
+ }
41
+
36
42
  await telemetry.send();
37
43
  return ret;
38
44
  }
package/src/main.ts CHANGED
@@ -24,7 +24,7 @@ import {
24
24
  import { DEFAULT_README, DEFAULT_YAML_CONFIG, DEFAULT_PROMPTS } from './onboarding';
25
25
  import { disableCache, clearCache } from './cache';
26
26
  import { getDirectory } from './esm';
27
- import { init } from './web/server';
27
+ import { startServer } from './web/server';
28
28
  import { checkForUpdates } from './updates';
29
29
 
30
30
  import type {
@@ -127,7 +127,7 @@ async function main() {
127
127
  name: 'view',
128
128
  });
129
129
  await telemetry.send();
130
- init(cmdObj.port);
130
+ startServer(cmdObj.port);
131
131
  });
132
132
 
133
133
  program
@@ -424,7 +424,7 @@ async function main() {
424
424
  logger.info('Done.');
425
425
 
426
426
  if (cmdObj.view) {
427
- init(parseInt(cmdObj.view, 10) || 15500);
427
+ startServer(parseInt(cmdObj.view, 10) || 15500);
428
428
  }
429
429
  });
430
430