llm-testrunner-components 1.0.6 → 1.0.9

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 (266) hide show
  1. package/README.md +101 -100
  2. package/dist/cjs/app-chips_5.cjs.entry.js +158 -0
  3. package/dist/cjs/app-chips_5.cjs.entry.js.map +1 -0
  4. package/dist/cjs/app-globals-Chb-oJtg.js +34 -0
  5. package/dist/cjs/app-globals-Chb-oJtg.js.map +1 -0
  6. package/dist/cjs/index-By1scwl6.js +25542 -0
  7. package/dist/cjs/index-By1scwl6.js.map +1 -0
  8. package/dist/cjs/index-CgmLNwZO.js +21460 -0
  9. package/dist/cjs/index-CgmLNwZO.js.map +1 -0
  10. package/dist/cjs/index.cjs.js +5 -483
  11. package/dist/cjs/index.cjs.js.map +1 -1
  12. package/dist/cjs/llm-testrunner.cjs.js +6 -4
  13. package/dist/cjs/llm-testrunner.cjs.js.map +1 -1
  14. package/dist/cjs/loader.cjs.js +5 -3
  15. package/dist/collection/collection-manifest.json +8 -3
  16. package/dist/collection/components/error-message/error-message.css +34 -0
  17. package/dist/collection/components/error-message/error-message.js +2 -2
  18. package/dist/collection/components/error-message/error-message.js.map +1 -1
  19. package/dist/collection/components/llm-test-runner/header/llm-test-runner-header.css +60 -0
  20. package/dist/collection/components/llm-test-runner/header/llm-test-runner-header.js +18 -0
  21. package/dist/collection/components/llm-test-runner/header/llm-test-runner-header.js.map +1 -0
  22. package/dist/collection/components/llm-test-runner/llm-test-runner.css +17 -657
  23. package/dist/collection/components/llm-test-runner/llm-test-runner.import-export.test.js +253 -0
  24. package/dist/collection/components/llm-test-runner/llm-test-runner.import-export.test.js.map +1 -0
  25. package/dist/collection/components/llm-test-runner/llm-test-runner.js +191 -200
  26. package/dist/collection/components/llm-test-runner/llm-test-runner.js.map +1 -1
  27. package/dist/collection/components/llm-test-runner/test-cases/actions/row-actions.css +28 -0
  28. package/dist/collection/components/llm-test-runner/test-cases/actions/row-actions.js +6 -0
  29. package/dist/collection/components/llm-test-runner/test-cases/actions/row-actions.js.map +1 -0
  30. package/dist/collection/components/llm-test-runner/test-cases/evaluation/evaluation-summary.css +67 -0
  31. package/dist/collection/components/llm-test-runner/test-cases/evaluation/evaluation-summary.js +5 -0
  32. package/dist/collection/components/llm-test-runner/test-cases/evaluation/evaluation-summary.js.map +1 -0
  33. package/dist/collection/components/llm-test-runner/test-cases/llm-test-case-row.css +42 -0
  34. package/dist/collection/components/llm-test-runner/test-cases/llm-test-case-row.js +39 -0
  35. package/dist/collection/components/llm-test-runner/test-cases/llm-test-case-row.js.map +1 -0
  36. package/dist/collection/components/llm-test-runner/test-cases/llm-test-cases.css +39 -0
  37. package/dist/collection/components/llm-test-runner/test-cases/llm-test-cases.js +7 -0
  38. package/dist/collection/components/llm-test-runner/test-cases/llm-test-cases.js.map +1 -0
  39. package/dist/collection/components/llm-test-runner/test-cases/output/response-output.css +51 -0
  40. package/dist/collection/components/llm-test-runner/test-cases/output/response-output.js +5 -0
  41. package/dist/collection/components/llm-test-runner/test-cases/output/response-output.js.map +1 -0
  42. package/dist/collection/global/env.js +3 -1
  43. package/dist/collection/global/env.js.map +1 -1
  44. package/dist/collection/index.js.map +1 -1
  45. package/dist/collection/lib/evaluation/constants.js +14 -0
  46. package/dist/collection/lib/evaluation/constants.js.map +1 -0
  47. package/dist/collection/lib/evaluation/evaluation-engine.js +45 -45
  48. package/dist/collection/lib/evaluation/evaluation-engine.js.map +1 -1
  49. package/dist/collection/lib/evaluation/evaluation-service.js +33 -0
  50. package/dist/collection/lib/evaluation/evaluation-service.js.map +1 -0
  51. package/dist/collection/lib/evaluation/evaluators/bleu/bleu-evaluator.js +116 -0
  52. package/dist/collection/lib/evaluation/evaluators/bleu/bleu-evaluator.js.map +1 -0
  53. package/dist/collection/lib/evaluation/evaluators/bleu/tests/bleu.test.js +352 -0
  54. package/dist/collection/lib/evaluation/evaluators/bleu/tests/bleu.test.js.map +1 -0
  55. package/dist/collection/lib/evaluation/evaluators/exact/exact.js +44 -0
  56. package/dist/collection/lib/evaluation/evaluators/exact/exact.js.map +1 -0
  57. package/dist/collection/lib/evaluation/evaluators/rouge1-evaluator.js +88 -0
  58. package/dist/collection/lib/evaluation/evaluators/rouge1-evaluator.js.map +1 -0
  59. package/dist/collection/lib/evaluation/evaluators/rougeL-evaluator.js +82 -0
  60. package/dist/collection/lib/evaluation/evaluators/rougeL-evaluator.js.map +1 -0
  61. package/dist/collection/lib/evaluation/evaluators/rougeL-evaluator.test.js +326 -0
  62. package/dist/collection/lib/evaluation/evaluators/rougeL-evaluator.test.js.map +1 -0
  63. package/dist/collection/lib/evaluation/evaluators/semantic/SemanticEvaluator.js +69 -0
  64. package/dist/collection/lib/evaluation/evaluators/semantic/SemanticEvaluator.js.map +1 -0
  65. package/dist/collection/lib/evaluation/evaluators/semantic/evaluate-keywords.js +56 -0
  66. package/dist/collection/lib/evaluation/evaluators/semantic/evaluate-keywords.js.map +1 -0
  67. package/dist/collection/lib/evaluation/evaluators/semantic/index.js +7 -0
  68. package/dist/collection/lib/evaluation/evaluators/semantic/index.js.map +1 -0
  69. package/dist/collection/lib/evaluation/evaluators/semantic/model-loader.js +19 -0
  70. package/dist/collection/lib/evaluation/evaluators/semantic/model-loader.js.map +1 -0
  71. package/dist/collection/lib/evaluation/evaluators/semantic/similarity-utils.js +16 -0
  72. package/dist/collection/lib/evaluation/evaluators/semantic/similarity-utils.js.map +1 -0
  73. package/dist/collection/lib/evaluation/evaluators/semantic/tests/evaluate-keywords.test.js +65 -0
  74. package/dist/collection/lib/evaluation/evaluators/semantic/tests/evaluate-keywords.test.js.map +1 -0
  75. package/dist/collection/lib/evaluation/evaluators/semantic/text-utils.js +5 -0
  76. package/dist/collection/lib/evaluation/evaluators/semantic/text-utils.js.map +1 -0
  77. package/dist/collection/lib/evaluation/index.js.map +1 -1
  78. package/dist/collection/lib/evaluation/rouge1-evaluator.test.js +117 -0
  79. package/dist/collection/lib/evaluation/rouge1-evaluator.test.js.map +1 -0
  80. package/dist/collection/lib/evaluation/types.js.map +1 -1
  81. package/dist/collection/lib/file/file-download.js +18 -0
  82. package/dist/collection/lib/file/file-download.js.map +1 -0
  83. package/dist/collection/lib/file/file-reader.js +14 -0
  84. package/dist/collection/lib/file/file-reader.js.map +1 -0
  85. package/dist/collection/lib/form/components/app-chips.css +97 -0
  86. package/dist/collection/lib/form/components/app-chips.js +155 -0
  87. package/dist/collection/lib/form/components/app-chips.js.map +1 -0
  88. package/dist/collection/lib/form/components/app-select.css +28 -0
  89. package/dist/collection/lib/form/components/app-select.js +101 -0
  90. package/dist/collection/lib/form/components/app-select.js.map +1 -0
  91. package/dist/collection/lib/form/components/app-textarea.css +38 -0
  92. package/dist/collection/lib/form/components/app-textarea.js +126 -0
  93. package/dist/collection/lib/form/components/app-textarea.js.map +1 -0
  94. package/dist/collection/lib/form/form-builder.js +171 -0
  95. package/dist/collection/lib/form/form-builder.js.map +1 -0
  96. package/dist/collection/lib/form/schema/base-input-field-config.js +2 -0
  97. package/dist/collection/lib/form/schema/base-input-field-config.js.map +1 -0
  98. package/dist/collection/lib/form/schema/form-control-config.js +2 -0
  99. package/dist/collection/lib/form/schema/form-control-config.js.map +1 -0
  100. package/dist/collection/lib/form/schema/index.js +8 -0
  101. package/dist/collection/lib/form/schema/index.js.map +1 -0
  102. package/dist/collection/lib/import-export/test-results-csv.js +65 -0
  103. package/dist/collection/lib/import-export/test-results-csv.js.map +1 -0
  104. package/dist/collection/lib/import-export/test-suite-exporter.js +15 -0
  105. package/dist/collection/lib/import-export/test-suite-exporter.js.map +1 -0
  106. package/dist/collection/lib/import-export/test-suite-importer.js +44 -0
  107. package/dist/collection/lib/import-export/test-suite-importer.js.map +1 -0
  108. package/dist/collection/lib/rate-limited-fetcher/rate-limited-fetcher.js +6 -6
  109. package/dist/collection/lib/rate-limited-fetcher/rate-limited-fetcher.js.map +1 -1
  110. package/dist/collection/lib/test-cases/test-case-factory.js +56 -0
  111. package/dist/collection/lib/test-cases/test-case-factory.js.map +1 -0
  112. package/dist/collection/lib/test-cases/test-case-mutations.js +16 -0
  113. package/dist/collection/lib/test-cases/test-case-mutations.js.map +1 -0
  114. package/dist/collection/lib/ui/button/button.css +113 -0
  115. package/dist/collection/lib/ui/button/button.js +21 -0
  116. package/dist/collection/lib/ui/button/button.js.map +1 -0
  117. package/dist/collection/lib/ui/button/index.js +2 -0
  118. package/dist/collection/lib/ui/button/index.js.map +1 -0
  119. package/dist/collection/lib/ui/icon-button/icon-button.css +77 -0
  120. package/dist/collection/lib/ui/icon-button/icon-button.js +19 -0
  121. package/dist/collection/lib/ui/icon-button/icon-button.js.map +1 -0
  122. package/dist/collection/lib/ui/icon-button/index.js +2 -0
  123. package/dist/collection/lib/ui/icon-button/index.js.map +1 -0
  124. package/dist/collection/services/adapters.js +2 -0
  125. package/dist/collection/services/adapters.js.map +1 -0
  126. package/dist/collection/services/models/gemini.js +17 -0
  127. package/dist/collection/services/models/gemini.js.map +1 -0
  128. package/dist/collection/styles/tokens.css +180 -0
  129. package/dist/collection/types/evaluation.js +2 -0
  130. package/dist/collection/types/evaluation.js.map +1 -0
  131. package/dist/collection/types/llm-test-runner.js +2 -0
  132. package/dist/collection/types/llm-test-runner.js.map +1 -0
  133. package/dist/components/app-chips.d.ts +11 -0
  134. package/dist/components/app-chips.js +2 -0
  135. package/dist/components/app-chips.js.map +1 -0
  136. package/dist/components/app-select.d.ts +11 -0
  137. package/dist/components/app-select.js +2 -0
  138. package/dist/components/app-select.js.map +1 -0
  139. package/dist/components/app-textarea.d.ts +11 -0
  140. package/dist/components/app-textarea.js +2 -0
  141. package/dist/components/app-textarea.js.map +1 -0
  142. package/dist/components/form-builder.d.ts +11 -0
  143. package/dist/components/form-builder.js +2 -0
  144. package/dist/components/form-builder.js.map +1 -0
  145. package/dist/components/index.d.ts +2 -0
  146. package/dist/components/index.js +1 -13
  147. package/dist/components/index.js.map +1 -1
  148. package/dist/components/llm-test-runner.js +1 -8
  149. package/dist/components/llm-test-runner.js.map +1 -1
  150. package/dist/components/p--2rdv_J9.js +2 -0
  151. package/dist/components/p--2rdv_J9.js.map +1 -0
  152. package/dist/components/p-B7J48VNq.js +2 -0
  153. package/dist/components/p-B7J48VNq.js.map +1 -0
  154. package/dist/components/p-BCB1rjPS.js +7 -0
  155. package/dist/components/p-BCB1rjPS.js.map +1 -0
  156. package/dist/components/p-BQhb2H_a.js +2 -0
  157. package/dist/components/p-BQhb2H_a.js.map +1 -0
  158. package/dist/components/p-D9BrlHdP.js +297 -0
  159. package/dist/components/p-D9BrlHdP.js.map +1 -0
  160. package/dist/components/p-DtCkZ1g2.js +2 -0
  161. package/dist/components/p-DtCkZ1g2.js.map +1 -0
  162. package/dist/esm/app-chips_5.entry.js +153 -0
  163. package/dist/esm/app-chips_5.entry.js.map +1 -0
  164. package/dist/esm/app-globals-DbR5vV7d.js +32 -0
  165. package/dist/esm/app-globals-DbR5vV7d.js.map +1 -0
  166. package/dist/esm/index-Bvg6mh1M.js +25539 -0
  167. package/dist/esm/index-Bvg6mh1M.js.map +1 -0
  168. package/dist/esm/index-DxzhGhec.js +21450 -0
  169. package/dist/esm/index-DxzhGhec.js.map +1 -0
  170. package/dist/esm/index.js +4 -486
  171. package/dist/esm/index.js.map +1 -1
  172. package/dist/esm/llm-testrunner.js +7 -5
  173. package/dist/esm/llm-testrunner.js.map +1 -1
  174. package/dist/esm/loader.js +6 -4
  175. package/dist/llm-testrunner/index.esm.js +1 -1
  176. package/dist/llm-testrunner/index.esm.js.map +1 -1
  177. package/dist/llm-testrunner/llm-testrunner.esm.js +1 -1
  178. package/dist/llm-testrunner/llm-testrunner.esm.js.map +1 -1
  179. package/dist/llm-testrunner/p-3f04b0fb.entry.js +2 -0
  180. package/dist/llm-testrunner/p-3f04b0fb.entry.js.map +1 -0
  181. package/dist/llm-testrunner/p-DFds8y01.js +7 -0
  182. package/dist/llm-testrunner/p-DFds8y01.js.map +1 -0
  183. package/dist/llm-testrunner/p-DxzhGhec.js +298 -0
  184. package/dist/llm-testrunner/p-DxzhGhec.js.map +1 -0
  185. package/dist/llm-testrunner/p-GQwFOmwJ.js +2 -0
  186. package/dist/llm-testrunner/p-GQwFOmwJ.js.map +1 -0
  187. package/dist/react/components.d.ts +32 -2
  188. package/dist/react/components.d.ts.map +1 -1
  189. package/dist/react/components.js +44 -2
  190. package/dist/types/components/llm-test-runner/header/llm-test-runner-header.d.ts +14 -0
  191. package/dist/types/components/llm-test-runner/llm-test-runner.d.ts +13 -29
  192. package/dist/types/components/llm-test-runner/llm-test-runner.import-export.test.d.ts +1 -0
  193. package/dist/types/components/llm-test-runner/test-cases/actions/row-actions.d.ts +8 -0
  194. package/dist/types/components/llm-test-runner/test-cases/evaluation/evaluation-summary.d.ts +7 -0
  195. package/dist/types/components/llm-test-runner/test-cases/llm-test-case-row.d.ts +25 -0
  196. package/dist/types/components/llm-test-runner/test-cases/llm-test-cases.d.ts +26 -0
  197. package/dist/types/components/llm-test-runner/test-cases/output/response-output.d.ts +6 -0
  198. package/dist/types/components.d.ts +199 -4
  199. package/dist/types/global/env.d.ts +2 -0
  200. package/dist/types/index.d.ts +1 -1
  201. package/dist/types/lib/evaluation/constants.d.ts +11 -0
  202. package/dist/types/lib/evaluation/evaluation-engine.d.ts +0 -4
  203. package/dist/types/lib/evaluation/evaluation-service.d.ts +15 -0
  204. package/dist/types/lib/evaluation/evaluators/bleu/bleu-evaluator.d.ts +18 -0
  205. package/dist/types/lib/evaluation/evaluators/bleu/tests/bleu.test.d.ts +1 -0
  206. package/dist/types/lib/evaluation/evaluators/exact/exact.d.ts +2 -0
  207. package/dist/types/lib/evaluation/evaluators/rouge1-evaluator.d.ts +17 -0
  208. package/dist/types/lib/evaluation/evaluators/rougeL-evaluator.d.ts +2 -0
  209. package/dist/types/lib/evaluation/evaluators/rougeL-evaluator.test.d.ts +1 -0
  210. package/dist/types/lib/evaluation/evaluators/semantic/SemanticEvaluator.d.ts +6 -0
  211. package/dist/types/lib/evaluation/evaluators/semantic/evaluate-keywords.d.ts +7 -0
  212. package/dist/types/lib/evaluation/evaluators/semantic/index.d.ts +2 -0
  213. package/dist/types/lib/evaluation/evaluators/semantic/model-loader.d.ts +1 -0
  214. package/dist/types/lib/evaluation/evaluators/semantic/similarity-utils.d.ts +1 -0
  215. package/dist/types/lib/evaluation/evaluators/semantic/tests/evaluate-keywords.test.d.ts +1 -0
  216. package/dist/types/lib/evaluation/evaluators/semantic/text-utils.d.ts +1 -0
  217. package/dist/types/lib/evaluation/index.d.ts +2 -2
  218. package/dist/types/lib/evaluation/rouge1-evaluator.test.d.ts +1 -0
  219. package/dist/types/lib/evaluation/types.d.ts +19 -7
  220. package/dist/types/lib/file/file-download.d.ts +7 -0
  221. package/dist/types/lib/file/file-reader.d.ts +6 -0
  222. package/dist/types/lib/form/components/app-chips.d.ts +20 -0
  223. package/dist/types/lib/form/components/app-select.d.ts +7 -0
  224. package/dist/types/lib/form/components/app-textarea.d.ts +14 -0
  225. package/dist/types/lib/form/form-builder.d.ts +24 -0
  226. package/dist/types/lib/form/schema/base-input-field-config.d.ts +37 -0
  227. package/dist/types/lib/form/schema/form-control-config.d.ts +13 -0
  228. package/dist/types/lib/form/schema/index.d.ts +9 -0
  229. package/dist/types/lib/import-export/test-results-csv.d.ts +13 -0
  230. package/dist/types/lib/import-export/test-suite-exporter.d.ts +16 -0
  231. package/dist/types/lib/import-export/test-suite-importer.d.ts +12 -0
  232. package/dist/types/lib/rate-limited-fetcher/rate-limited-fetcher.d.ts +1 -1
  233. package/dist/types/lib/test-cases/test-case-factory.d.ts +12 -0
  234. package/dist/types/lib/test-cases/test-case-mutations.d.ts +9 -0
  235. package/dist/types/lib/ui/button/button.d.ts +13 -0
  236. package/dist/types/lib/ui/button/index.d.ts +2 -0
  237. package/dist/types/lib/ui/icon-button/icon-button.d.ts +11 -0
  238. package/dist/types/lib/ui/icon-button/index.d.ts +2 -0
  239. package/dist/types/services/adapters.d.ts +3 -0
  240. package/dist/types/services/models/gemini.d.ts +11 -0
  241. package/dist/types/stencil-public-runtime.d.ts +110 -6
  242. package/dist/types/types/evaluation.d.ts +9 -0
  243. package/dist/types/types/llm-test-runner.d.ts +22 -0
  244. package/package.json +30 -6
  245. package/dist/cjs/app-globals-CbbEbofA.js +0 -14
  246. package/dist/cjs/app-globals-CbbEbofA.js.map +0 -1
  247. package/dist/cjs/index-D-FySkoV.js +0 -1470
  248. package/dist/cjs/index-D-FySkoV.js.map +0 -1
  249. package/dist/cjs/llm-test-runner.cjs.entry.js +0 -9
  250. package/dist/cjs/llm-test-runner.entry.cjs.js.map +0 -1
  251. package/dist/components/p-CYUbsbxt.js +0 -1770
  252. package/dist/components/p-CYUbsbxt.js.map +0 -1
  253. package/dist/esm/app-globals-BOQOUavG.js +0 -12
  254. package/dist/esm/app-globals-BOQOUavG.js.map +0 -1
  255. package/dist/esm/index-cncubhtM.js +0 -1463
  256. package/dist/esm/index-cncubhtM.js.map +0 -1
  257. package/dist/esm/llm-test-runner.entry.js +0 -3
  258. package/dist/esm/llm-test-runner.entry.js.map +0 -1
  259. package/dist/llm-testrunner/llm-test-runner.entry.esm.js.map +0 -1
  260. package/dist/llm-testrunner/loader.esm.js.map +0 -1
  261. package/dist/llm-testrunner/p-BOQOUavG.js +0 -2
  262. package/dist/llm-testrunner/p-BOQOUavG.js.map +0 -1
  263. package/dist/llm-testrunner/p-cncubhtM.js +0 -3
  264. package/dist/llm-testrunner/p-cncubhtM.js.map +0 -1
  265. package/dist/llm-testrunner/p-f68fd660.entry.js +0 -2
  266. package/dist/llm-testrunner/p-f68fd660.entry.js.map +0 -1
@@ -1,135 +1,129 @@
1
- import { h } from "@stencil/core";
2
- import { LLMEvaluationEngine } from "../../lib/evaluation/evaluation-engine";
3
- import { v4 as uuidv4 } from "uuid";
1
+ import { h, } from "@stencil/core";
4
2
  import { ErrorMessage } from "../error-message/error-message";
5
3
  import { RateLimitedFetcher } from "../../lib/rate-limited-fetcher/rate-limited-fetcher";
4
+ import { EvaluationApproach } from "../../lib/evaluation/constants";
5
+ import { readFileAsync } from "../../lib/file/file-reader";
6
+ import { downloadFile } from "../../lib/file/file-download";
7
+ import { formatTestSuiteAsJson } from "../../lib/import-export/test-suite-exporter";
8
+ import { exportTestResultsToCsv } from "../../lib/import-export/test-results-csv";
9
+ import { importTestSuite } from "../../lib/import-export/test-suite-importer";
10
+ import { createTestCase } from "../../lib/test-cases/test-case-factory";
11
+ import * as TestCaseMutations from "../../lib/test-cases/test-case-mutations";
12
+ import { EvaluationService } from "../../lib/evaluation/evaluation-service";
13
+ import { LLMTestRunnerHeader } from "./header/llm-test-runner-header";
14
+ import { LLMTestCases } from "./test-cases/llm-test-cases";
6
15
  export class LLMTestRunner {
7
16
  llmRequest;
17
+ save;
8
18
  delayMs = 500;
19
+ useSave = false;
20
+ initialTestCases;
9
21
  testCases = [
10
22
  {
11
23
  id: '1',
12
24
  question: '',
13
- expectedKeywords: [],
14
- expectedSourceLinks: [],
15
- isRunning: false
16
- }
25
+ expectedOutcome: '',
26
+ evaluationParameters: {
27
+ approach: EvaluationApproach.EXACT,
28
+ },
29
+ isRunning: false,
30
+ },
17
31
  ];
18
32
  isRunningAll = false;
19
33
  error = '';
20
- fileInput;
21
34
  isExportingTestSuite = false;
22
35
  isExportingTestResults = false;
23
- evaluationEngine;
36
+ isSaving = false;
37
+ evaluationService;
24
38
  componentWillLoad() {
25
- this.evaluationEngine = new LLMEvaluationEngine();
26
- }
27
- componentDidLoad() {
39
+ this.evaluationService = new EvaluationService();
40
+ // Initialize testCases from prop if provided
41
+ if (this.initialTestCases !== undefined) {
42
+ this.testCases = this.initialTestCases;
43
+ }
28
44
  }
29
- disconnectedCallback() {
45
+ componentDidLoad() { }
46
+ disconnectedCallback() { }
47
+ async resetSavingState() {
48
+ this.isSaving = false;
30
49
  }
50
+ handleTestCaseChange = (event) => {
51
+ const { testCaseId, key, value } = event.detail;
52
+ this.testCases = this.testCases.map(tc => tc.id === testCaseId ? { ...tc, [key]: value } : tc);
53
+ };
31
54
  addNewTestCase() {
32
- const newTestCase = {
33
- id: this.generateId(),
34
- question: '',
35
- expectedKeywords: [],
36
- expectedSourceLinks: [],
37
- isRunning: false
38
- };
55
+ const newTestCase = createTestCase();
39
56
  this.testCases = [...this.testCases, newTestCase];
40
57
  }
41
58
  updateTestCase(id, updates) {
42
59
  this.testCases = this.testCases.map(tc => tc.id === id ? { ...tc, ...updates } : tc);
43
60
  }
44
61
  async runSingleTest(testCase) {
45
- console.log('🚀 Starting test for question:', testCase.question);
46
62
  const startTime = Date.now();
47
63
  this.updateTestCase(testCase.id, { isRunning: true });
48
64
  return new Promise((resolve, reject) => {
49
65
  this.llmRequest.emit({
50
66
  prompt: testCase.question,
51
67
  resolve: async (aiResponse) => {
52
- console.log('✅ AI call completed for test case:', testCase.id);
53
68
  const endTime = Date.now();
54
69
  const responseTime = endTime - startTime;
55
70
  this.updateTestCase(testCase.id, {
56
71
  isRunning: false,
57
72
  output: aiResponse,
58
73
  error: null,
59
- responseTime: responseTime
74
+ responseTime: responseTime,
60
75
  });
61
76
  await this.evaluateResponse({
62
77
  ...testCase,
63
78
  output: aiResponse,
64
- responseTime: responseTime
79
+ responseTime: responseTime,
65
80
  });
66
81
  resolve();
67
82
  },
68
83
  reject: (error) => {
69
- console.error('❌ Error in runSingleTest:', error);
70
84
  this.updateTestCase(testCase.id, {
71
85
  isRunning: false,
72
86
  output: null,
73
- error: error instanceof Error ? error.message : 'Unknown error'
87
+ error: error instanceof Error ? error.message : 'Unknown error',
74
88
  });
75
89
  reject(error);
76
- }
90
+ },
77
91
  });
78
92
  });
79
93
  }
80
94
  deleteTestCase(id) {
81
95
  this.testCases = this.testCases.filter(tc => tc.id !== id);
82
96
  }
83
- addKeyword(testCaseId, keyword) {
84
- if (keyword.trim()) {
85
- const testCase = this.testCases.find(tc => tc.id === testCaseId);
86
- if (testCase) {
87
- this.updateTestCase(testCaseId, {
88
- expectedKeywords: [...testCase.expectedKeywords, keyword.trim()]
89
- });
90
- }
97
+ updateApproach(testCase, approach) {
98
+ if (testCase) {
99
+ const updated = TestCaseMutations.updateApproach(testCase, approach);
100
+ this.updateTestCase(testCase.id, {
101
+ evaluationParameters: updated.evaluationParameters,
102
+ });
91
103
  }
92
104
  }
93
- removeKeyword(testCaseId, index) {
105
+ addChip = (event) => {
106
+ const { testCaseId, key, value: chipValue } = event.detail;
94
107
  const testCase = this.testCases.find(tc => tc.id === testCaseId);
95
108
  if (testCase) {
96
- const newKeywords = testCase.expectedKeywords.filter((_, i) => i !== index);
97
- this.updateTestCase(testCaseId, { expectedKeywords: newKeywords });
109
+ const existing = Array.isArray(testCase[key]) ? testCase[key] : [];
110
+ const updatedField = [...existing, chipValue];
111
+ this.testCases = this.testCases.map(tc => tc.id === testCaseId ? { ...tc, [key]: updatedField } : tc);
98
112
  }
99
- }
100
- addSourceLink(testCaseId, link) {
101
- if (link.trim()) {
102
- const testCase = this.testCases.find(tc => tc.id === testCaseId);
103
- if (testCase) {
104
- this.updateTestCase(testCaseId, {
105
- expectedSourceLinks: [...testCase.expectedSourceLinks, link.trim()]
106
- });
107
- }
108
- }
109
- }
110
- removeSourceLink(testCaseId, index) {
113
+ };
114
+ removeChip = (event) => {
115
+ const { testCaseId, key, index } = event.detail;
111
116
  const testCase = this.testCases.find(tc => tc.id === testCaseId);
112
117
  if (testCase) {
113
- const newLinks = testCase.expectedSourceLinks.filter((_, i) => i !== index);
114
- this.updateTestCase(testCaseId, { expectedSourceLinks: newLinks });
118
+ const existing = Array.isArray(testCase[key]) ? testCase[key] : [];
119
+ const updatedField = existing.filter((_, i) => i !== index);
120
+ this.testCases = this.testCases.map(tc => tc.id === testCaseId ? { ...tc, [key]: updatedField } : tc);
115
121
  }
116
- }
122
+ };
117
123
  async evaluateResponse(testCase) {
118
- if (!testCase.output) {
119
- console.warn('⚠️ No output to evaluate for test case:', testCase.id);
120
- return;
121
- }
122
- const evaluationRequest = {
123
- testCaseId: testCase.id,
124
- question: testCase.question,
125
- expectedKeywords: testCase.expectedKeywords,
126
- expectedSourceLinks: testCase.expectedSourceLinks,
127
- actualResponse: testCase.output
128
- };
129
- await this.evaluationEngine.evaluateResponse(evaluationRequest, (result) => {
130
- console.log('📊 Evaluation result received:', result);
124
+ await this.evaluationService.evaluateTestCase(testCase, (result) => {
131
125
  this.updateTestCase(testCase.id, {
132
- evaluationResult: result
126
+ evaluationResult: result,
133
127
  });
134
128
  });
135
129
  }
@@ -152,21 +146,7 @@ export class LLMTestRunner {
152
146
  }
153
147
  this.isRunningAll = false;
154
148
  }
155
- generateId() {
156
- return uuidv4();
157
- }
158
- handleFileSelect() {
159
- this.fileInput.click();
160
- }
161
- async handleFileChange(event) {
162
- const target = event.target;
163
- const file = target.files?.[0];
164
- // Immediately clear the input value to allow for a new upload.
165
- target.value = '';
166
- if (!file) {
167
- this.error = 'No file selected.';
168
- return;
169
- }
149
+ async handleImport(file) {
170
150
  const isJsonType = file.type === 'application/json';
171
151
  const isJsonExtension = file.name.toLowerCase().endsWith('.json');
172
152
  if (!isJsonType && !isJsonExtension) {
@@ -175,58 +155,29 @@ export class LLMTestRunner {
175
155
  }
176
156
  this.error = '';
177
157
  try {
178
- const content = await this.readFileAsync(file);
179
- const fileContent = JSON.parse(content);
180
- if (!Array.isArray(fileContent)) {
181
- throw new Error("Invalid JSON structure. Expected a JSON array.");
158
+ const content = await readFileAsync(file);
159
+ const result = importTestSuite(content);
160
+ if (!result.success) {
161
+ this.error = result.error || 'Unknown error occurred during import.';
162
+ return;
182
163
  }
183
- const importedTestCases = fileContent.map((item) => ({
184
- id: this.generateId(),
185
- question: item.question || '',
186
- expectedKeywords: Array.isArray(item.expectedKeywords) ? item.expectedKeywords : [],
187
- expectedSourceLinks: Array.isArray(item.expectedSourceLinks) ? item.expectedSourceLinks : [],
188
- isRunning: false
189
- }));
190
- this.testCases = importedTestCases;
164
+ this.testCases = result.testCases || [];
191
165
  }
192
166
  catch (err) {
193
- this.error = err?.message || 'Error processing file. Please ensure it is a valid JSON array.';
167
+ this.error =
168
+ err instanceof Error
169
+ ? err.message
170
+ : 'Error processing file. Please ensure it is a valid JSON array.';
194
171
  console.error('File Processing Error:', err);
195
172
  }
196
173
  }
197
- readFileAsync(file) {
198
- return new Promise((resolve, reject) => {
199
- const reader = new FileReader();
200
- reader.onload = () => resolve(reader.result);
201
- reader.onerror = () => reject(reader.error);
202
- reader.readAsText(file);
203
- });
204
- }
205
- downloadFile(content, filename, mimeType) {
206
- const blob = new Blob([content], { type: mimeType });
207
- const url = URL.createObjectURL(blob);
208
- const link = document.createElement('a');
209
- link.href = url;
210
- link.download = filename;
211
- document.body.appendChild(link);
212
- link.click();
213
- document.body.removeChild(link);
214
- URL.revokeObjectURL(url);
215
- }
216
174
  async handleExportTestSuite() {
217
175
  this.isExportingTestSuite = true;
218
176
  try {
219
- // Exporting only input data (question, expected keywords, expected source links)
220
- const exportData = this.testCases.map(testCase => ({
221
- id: testCase.id,
222
- question: testCase.question,
223
- expectedKeywords: testCase.expectedKeywords,
224
- expectedSourceLinks: testCase.expectedSourceLinks
225
- }));
226
- const jsonContent = JSON.stringify(exportData, null, 2);
177
+ const jsonContent = formatTestSuiteAsJson(this.testCases);
227
178
  // Added a small delay to show the loading state
228
179
  await new Promise(resolve => setTimeout(resolve, 500));
229
- this.downloadFile(jsonContent, 'test-suite.json', 'application/json');
180
+ downloadFile(jsonContent, 'test-suite.json', 'application/json');
230
181
  }
231
182
  finally {
232
183
  this.isExportingTestSuite = false;
@@ -235,98 +186,49 @@ export class LLMTestRunner {
235
186
  async handleExportTestResults() {
236
187
  this.isExportingTestResults = true;
237
188
  try {
238
- // Create CSV content with the required fields
239
- const csvRows = [];
240
- // Add header row
241
- const headers = [
242
- 'Question',
243
- 'Expected Keywords',
244
- 'Generated Keywords',
245
- 'Keywords Match',
246
- 'Expected Source Links',
247
- 'Generated Source Links',
248
- 'Source Links Match',
249
- 'Response Time (s)'
250
- ];
251
- csvRows.push(headers.join(','));
252
- // Add data rows
253
- this.testCases.forEach(testCase => {
254
- const expectedKeywords = testCase.expectedKeywords.join('; ');
255
- const expectedSourceLinks = testCase.expectedSourceLinks.join('; ');
256
- let generatedKeywords = '';
257
- let generatedSourceLinks = '';
258
- let keywordsMatch = '';
259
- let sourceLinksMatch = '';
260
- if (testCase.evaluationResult) {
261
- const foundKeywords = testCase.evaluationResult.keywordMatches
262
- .filter(match => match.found)
263
- .map(match => match.keyword);
264
- const foundSourceLinks = testCase.evaluationResult.sourceLinkMatches
265
- .filter(match => match.found)
266
- .map(match => match.link);
267
- generatedKeywords = foundKeywords.join('; ');
268
- generatedSourceLinks = foundSourceLinks.join('; ');
269
- // Calculate match percentages
270
- const keywordMatchCount = testCase.evaluationResult.keywordMatches.filter(m => m.found).length;
271
- const totalKeywords = testCase.evaluationResult.keywordMatches.length;
272
- const sourceLinkMatchCount = testCase.evaluationResult.sourceLinkMatches.filter(m => m.found).length;
273
- const totalSourceLinks = testCase.evaluationResult.sourceLinkMatches.length;
274
- keywordsMatch = totalKeywords > 0 ? `${keywordMatchCount}/${totalKeywords}` : 'N/A';
275
- sourceLinksMatch = totalSourceLinks > 0 ? `${sourceLinkMatchCount}/${totalSourceLinks}` : 'N/A';
276
- }
277
- const responseTime = testCase.responseTime ? (testCase.responseTime / 1000).toFixed(3) : 'N/A';
278
- const row = [
279
- this.escapeCsvField(testCase.question),
280
- this.escapeCsvField(expectedKeywords),
281
- this.escapeCsvField(generatedKeywords),
282
- keywordsMatch,
283
- this.escapeCsvField(expectedSourceLinks),
284
- this.escapeCsvField(generatedSourceLinks),
285
- sourceLinksMatch,
286
- responseTime
287
- ];
288
- csvRows.push(row.join(','));
289
- });
290
- const csvContent = csvRows.join('\n');
189
+ const csvContent = exportTestResultsToCsv(this.testCases);
291
190
  // Added a small delay to show the loading state
292
191
  await new Promise(resolve => setTimeout(resolve, 500));
293
- this.downloadFile(csvContent, 'test-results.csv', 'text/csv');
192
+ downloadFile(csvContent, 'test-results.csv', 'text/csv');
294
193
  }
295
194
  finally {
296
195
  this.isExportingTestResults = false;
297
196
  }
298
197
  }
299
- escapeCsvField(field) {
300
- if (field.includes(',') || field.includes('"') || field.includes('\n')) {
301
- return `"${field.replace(/"/g, '""')}"`;
198
+ async handleSave() {
199
+ this.isSaving = true;
200
+ try {
201
+ const testRun = {
202
+ timestamp: new Date().toISOString(),
203
+ testCases: this.testCases,
204
+ };
205
+ this.save.emit(testRun);
206
+ // Failsafe: Auto-reset saving state after 10 seconds to prevent stuck UI
207
+ setTimeout(() => {
208
+ if (this.isSaving) {
209
+ console.warn('Save operation timed out, resetting state');
210
+ this.isSaving = false;
211
+ }
212
+ }, 10000);
213
+ }
214
+ finally {
215
+ // Parent will call resetSavingState() when actual save completes
216
+ // If not called within 10 seconds, failsafe above will reset state
302
217
  }
303
- return field;
304
218
  }
305
219
  render() {
306
- return (h("div", { key: 'beb2ab78108fede00c5d759d1ac5c98ae7f037d0', class: "test-runner-container" }, h("header", { key: 'd09b424069227500ffffcab8724b48d91705baab', class: "test-runner-header" }, h("div", { key: '368ef117a1c2cc0be0446e2d373e38e0af1c2040', class: "header-left" }, h("input", { key: '74346a634b36e9d04f75817495834983d970306c', class: "hidden", type: "file", ref: (el) => (this.fileInput = el), onChange: (e) => this.handleFileChange(e), accept: ".json,application/json" }), h("button", { key: 'e095ff9de105cb281e60f70de02fb0de8a0f6478', class: "btn btn-secondary", onClick: () => this.handleFileSelect() }, h("span", { key: '6f828f297867ae54baf1f89c9dbce611eba2056a', class: "icon" }, "\u2191"), "Import Test Suite"), h("button", { key: '5682dc8f70edac9fdf33b394677a6859555c039b', class: "btn btn-secondary", onClick: () => this.handleExportTestSuite(), disabled: this.isExportingTestSuite }, h("span", { key: 'a1e8d3170ce39e499160e578e3e02d39cd0da9d7', class: "icon" }, this.isExportingTestSuite ? '⏳' : '↓'), this.isExportingTestSuite ? 'Exporting...' : 'Export Test Suite')), h("div", { key: 'af96ea230b04f4f6ce8e3488a1f8f7f2a01e74c0', class: "header-right" }, h("button", { key: 'a90bfb3421f5e2e5112b3642ddf81cf19372e0ad', class: "btn btn-secondary" }, h("span", { key: '79611828e5dc1ad53998a74fca10a1a05c5d2a4e', class: "icon" }, "\u2699\uFE0F"), "Prompt Editor"), h("button", { key: '451367ce26183a58add0902e1de2d29b4933add4', class: "btn btn-secondary", onClick: () => this.handleExportTestResults(), disabled: this.isExportingTestResults }, h("span", { key: '11f791f2071b58e0800d14ac7e6bebba67421449', class: "icon" }, this.isExportingTestResults ? '⏳' : '↓'), this.isExportingTestResults ? 'Exporting...' : 'Export Test Results'), h("button", { key: '3cbf7626ccc5f171cdc6fd7ce3750ea3786218aa', class: "btn btn-primary", onClick: () => this.runAllTests(), disabled: this.isRunningAll }, this.isRunningAll ? 'Running...' : 'Run All'))), h(ErrorMessage, { key: 'ffdd72a1db1f45c5db158d2df0be64dc978fa930', message: this.error, onClear: () => (this.error = '') }), h("div", { key: '64edd5c84c4b566f90d1860f6d6bf5aeafb7ae0f', class: "test-runner-content" }, h("div", { key: '4be27d07a13d88611b5fc54b05e826c790fd2145', class: "column-headers" }, h("div", { key: 'eeb9ace5e63b80359d2decb1b42461f77cfe98cf', class: "column-header" }, "Input"), h("div", { key: 'c70cc5af0aaca2636eee298dfaa4da81799df6cf', class: "column-header" }, "Output"), h("div", { key: '9ca69fddafe7267bf5b8b12601e2cf64d65a58e1', class: "column-header" }, "Evaluation"), h("div", { key: 'b800841828c22a6aad0345e58b47f71469594792', class: "column-header" }, "Actions")), h("div", { key: 'da186e25c2111474f65b89a017158bffdbc83e03', class: "test-cases" }, this.testCases.map((testCase) => (h("div", { class: "test-case-row", key: testCase.id }, h("div", { class: "input-column" }, h("div", { class: "input-group" }, h("label", null, "Question"), h("textarea", { value: testCase.question, onInput: (e) => this.updateTestCase(testCase.id, {
307
- question: e.target.value
308
- }), placeholder: "Enter your question here...", rows: 3 })), h("div", { class: "keywords-group" }, h("label", null, "Expected keywords"), h("div", { class: "tags-container" }, testCase.expectedKeywords.map((keyword, index) => (h("span", { class: "tag", key: index }, keyword, h("button", { class: "tag-remove", onClick: () => this.removeKeyword(testCase.id, index) }, "\u00D7")))), h("input", { type: "text", placeholder: "New item...", onKeyDown: (e) => {
309
- if (e.key === 'Enter') {
310
- this.addKeyword(testCase.id, e.target.value);
311
- e.target.value = '';
312
- }
313
- } }))), h("div", { class: "links-group" }, h("label", null, "Expected source links"), h("div", { class: "links-container" }, testCase.expectedSourceLinks.map((link, index) => (h("div", { class: "link-item", key: index }, h("a", { href: link, target: "_blank", rel: "noopener noreferrer" }, link), h("button", { class: "link-remove", onClick: () => this.removeSourceLink(testCase.id, index) }, "\u00D7")))), h("input", { type: "url", placeholder: "New item...", onKeyDown: (e) => {
314
- if (e.key === 'Enter') {
315
- this.addSourceLink(testCase.id, e.target.value);
316
- e.target.value = '';
317
- }
318
- } })))), h("div", { class: "output-column" }, testCase.output ? (h("div", { class: "output-content" }, testCase.output)) : (h("div", { class: "output-placeholder" }, testCase.isRunning ? 'Running...' : ''))), h("div", { class: "evaluation-column" }, testCase.evaluationResult ? (h("div", { class: "evaluation-result" }, h("div", { class: `evaluation-status ${testCase.evaluationResult.passed ? 'passed' : 'failed'}` }, testCase.evaluationResult.passed ? '✅ PASSED' : '❌ FAILED'), h("div", { class: "evaluation-details" }, "Keywords: ", testCase.evaluationResult.keywordMatches.filter(m => m.found).length, "/", testCase.evaluationResult.keywordMatches.length, " found"))) : (h("div", { class: "evaluation-placeholder" }, testCase.isRunning ? 'Evaluating...' : ''))), h("div", { class: "actions-column" }, h("button", { class: "btn btn-icon btn-run", onClick: () => this.runSingleTest(testCase), disabled: testCase.isRunning || !testCase.question.trim(), title: !testCase.question.trim() ? "Enter a question first" : "Run this test" }, testCase.isRunning ? '⏳' : '▶️'), h("button", { class: "btn btn-icon btn-delete", onClick: () => this.deleteTestCase(testCase.id), title: "Delete this test" }, "\uD83D\uDDD1\uFE0F")))))), h("div", { key: '2d4446b15a31adfbaf88b3d46fcbb3cf314f8861', class: "add-test-case" }, h("button", { key: '737e9d856db0f9090923bef718bb9bfde974b950', class: "btn btn-outline", onClick: () => this.addNewTestCase() }, "+ Add Question")))));
220
+ return (h("div", { key: '607c60d826390182c050295edff87a867a44a980', class: "test-runner-container" }, h(LLMTestRunnerHeader, { key: '63b1c57bd8be6dbf7f850173bcd37d6d5204b1fc', isExportingTestSuite: this.isExportingTestSuite, isExportingTestResults: this.isExportingTestResults, isRunningAll: this.isRunningAll, useSave: this.useSave, isSaving: this.isSaving, onImport: file => this.handleImport(file), onExportSuite: () => this.handleExportTestSuite(), onExportResults: () => this.handleExportTestResults(), onRunAll: () => this.runAllTests(), onSave: () => this.handleSave() }), h(ErrorMessage, { key: '7396b609da23e449aafe399b31ca0cc8f736b884', message: this.error, onClear: () => (this.error = '') }), h("div", { key: 'b5ad61d76881fe858c8c0241df1ffb7ba6c3d9e7', class: "test-runner-container__content" }, h(LLMTestCases, { key: '43e8dcf75db0d232f9c1ce88d8a5619c59eda47a', testCases: this.testCases, onRun: testCase => this.runSingleTest(testCase).catch(() => { }), onDelete: id => this.deleteTestCase(id), onUpdateApproach: (testCase, approach) => this.updateApproach(testCase, approach), onAddTestCase: () => this.addNewTestCase(), handleTestCaseChange: this.handleTestCaseChange, addChip: this.addChip, removeChip: this.removeChip }))));
319
221
  }
320
222
  static get is() { return "llm-test-runner"; }
321
223
  static get encapsulation() { return "shadow"; }
322
224
  static get originalStyleUrls() {
323
225
  return {
324
- "$": ["llm-test-runner.css"]
226
+ "$": ["../../styles/tokens.css", "llm-test-runner.css", "header/llm-test-runner-header.css", "test-cases/llm-test-cases.css", "test-cases/llm-test-case-row.css", "test-cases/actions/row-actions.css", "test-cases/evaluation/evaluation-summary.css", "test-cases/output/response-output.css", "../error-message/error-message.css", "../../lib/ui/button/button.css", "../../lib/ui/icon-button/icon-button.css"]
325
227
  };
326
228
  }
327
229
  static get styleUrls() {
328
230
  return {
329
- "$": ["llm-test-runner.css"]
231
+ "$": ["../../styles/tokens.css", "llm-test-runner.css", "header/llm-test-runner-header.css", "test-cases/llm-test-cases.css", "test-cases/llm-test-case-row.css", "test-cases/actions/row-actions.css", "test-cases/evaluation/evaluation-summary.css", "test-cases/output/response-output.css", "../error-message/error-message.css", "../../lib/ui/button/button.css", "../../lib/ui/icon-button/icon-button.css"]
330
232
  };
331
233
  }
332
234
  static get properties() {
@@ -350,6 +252,50 @@ export class LLMTestRunner {
350
252
  "reflect": false,
351
253
  "attribute": "delay-ms",
352
254
  "defaultValue": "500"
255
+ },
256
+ "useSave": {
257
+ "type": "boolean",
258
+ "mutable": false,
259
+ "complexType": {
260
+ "original": "boolean",
261
+ "resolved": "boolean",
262
+ "references": {}
263
+ },
264
+ "required": false,
265
+ "optional": true,
266
+ "docs": {
267
+ "tags": [],
268
+ "text": ""
269
+ },
270
+ "getter": false,
271
+ "setter": false,
272
+ "reflect": false,
273
+ "attribute": "use-save",
274
+ "defaultValue": "false"
275
+ },
276
+ "initialTestCases": {
277
+ "type": "unknown",
278
+ "mutable": false,
279
+ "complexType": {
280
+ "original": "TestCase[]",
281
+ "resolved": "TestCase[]",
282
+ "references": {
283
+ "TestCase": {
284
+ "location": "import",
285
+ "path": "../../types/llm-test-runner",
286
+ "id": "src/types/llm-test-runner.ts::TestCase",
287
+ "referenceLocation": "TestCase"
288
+ }
289
+ }
290
+ },
291
+ "required": false,
292
+ "optional": true,
293
+ "docs": {
294
+ "tags": [],
295
+ "text": ""
296
+ },
297
+ "getter": false,
298
+ "setter": false
353
299
  }
354
300
  };
355
301
  }
@@ -359,7 +305,8 @@ export class LLMTestRunner {
359
305
  "isRunningAll": {},
360
306
  "error": {},
361
307
  "isExportingTestSuite": {},
362
- "isExportingTestResults": {}
308
+ "isExportingTestResults": {},
309
+ "isSaving": {}
363
310
  };
364
311
  }
365
312
  static get events() {
@@ -378,13 +325,57 @@ export class LLMTestRunner {
378
325
  "resolved": "LLMRequestPayload",
379
326
  "references": {
380
327
  "LLMRequestPayload": {
381
- "location": "local",
382
- "path": "/Users/akhilan/Documents/work/llm-testrunner/packages/stencil-library/src/components/llm-test-runner/llm-test-runner.tsx",
383
- "id": "src/components/llm-test-runner/llm-test-runner.tsx::LLMRequestPayload"
328
+ "location": "import",
329
+ "path": "../../types/llm-test-runner",
330
+ "id": "src/types/llm-test-runner.ts::LLMRequestPayload",
331
+ "referenceLocation": "LLMRequestPayload"
332
+ }
333
+ }
334
+ }
335
+ }, {
336
+ "method": "save",
337
+ "name": "save",
338
+ "bubbles": true,
339
+ "cancelable": true,
340
+ "composed": true,
341
+ "docs": {
342
+ "tags": [],
343
+ "text": ""
344
+ },
345
+ "complexType": {
346
+ "original": "SavePayload",
347
+ "resolved": "SavePayload",
348
+ "references": {
349
+ "SavePayload": {
350
+ "location": "import",
351
+ "path": "../../types/llm-test-runner",
352
+ "id": "src/types/llm-test-runner.ts::SavePayload",
353
+ "referenceLocation": "SavePayload"
384
354
  }
385
355
  }
386
356
  }
387
357
  }];
388
358
  }
359
+ static get methods() {
360
+ return {
361
+ "resetSavingState": {
362
+ "complexType": {
363
+ "signature": "() => Promise<void>",
364
+ "parameters": [],
365
+ "references": {
366
+ "Promise": {
367
+ "location": "global",
368
+ "id": "global::Promise"
369
+ }
370
+ },
371
+ "return": "Promise<void>"
372
+ },
373
+ "docs": {
374
+ "text": "",
375
+ "tags": []
376
+ }
377
+ }
378
+ };
379
+ }
389
380
  }
390
381
  //# sourceMappingURL=llm-test-runner.js.map