promptfoo 0.67.0 → 0.68.1

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 (161) hide show
  1. package/README.md +1 -1
  2. package/dist/package.json +4 -3
  3. package/dist/src/assertions/validateAssertions.d.ts.map +1 -1
  4. package/dist/src/assertions/validateAssertions.js +11 -11
  5. package/dist/src/assertions/validateAssertions.js.map +1 -1
  6. package/dist/src/assertions.d.ts +6 -4
  7. package/dist/src/assertions.d.ts.map +1 -1
  8. package/dist/src/assertions.js +120 -118
  9. package/dist/src/assertions.js.map +1 -1
  10. package/dist/src/checkNodeVersion.d.ts +6 -0
  11. package/dist/src/checkNodeVersion.d.ts.map +1 -0
  12. package/dist/src/checkNodeVersion.js +67 -0
  13. package/dist/src/checkNodeVersion.js.map +1 -0
  14. package/dist/src/commands/delete.d.ts.map +1 -1
  15. package/dist/src/commands/delete.js +10 -10
  16. package/dist/src/commands/delete.js.map +1 -1
  17. package/dist/src/commands/show.d.ts.map +1 -1
  18. package/dist/src/commands/show.js +64 -64
  19. package/dist/src/commands/show.js.map +1 -1
  20. package/dist/src/constants.d.ts +1 -0
  21. package/dist/src/constants.d.ts.map +1 -1
  22. package/dist/src/constants.js +3 -1
  23. package/dist/src/constants.js.map +1 -1
  24. package/dist/src/csv.d.ts +1 -1
  25. package/dist/src/csv.d.ts.map +1 -1
  26. package/dist/src/csv.js +50 -50
  27. package/dist/src/csv.js.map +1 -1
  28. package/dist/src/database.d.ts +56 -56
  29. package/dist/src/database.d.ts.map +1 -1
  30. package/dist/src/database.js +29 -29
  31. package/dist/src/database.js.map +1 -1
  32. package/dist/src/feedback.d.ts +1 -1
  33. package/dist/src/feedback.d.ts.map +1 -1
  34. package/dist/src/feedback.js +19 -19
  35. package/dist/src/feedback.js.map +1 -1
  36. package/dist/src/googleSheets.d.ts +1 -1
  37. package/dist/src/googleSheets.d.ts.map +1 -1
  38. package/dist/src/googleSheets.js +10 -10
  39. package/dist/src/googleSheets.js.map +1 -1
  40. package/dist/src/index.d.ts +2 -0
  41. package/dist/src/index.d.ts.map +1 -1
  42. package/dist/src/main.js +2 -0
  43. package/dist/src/main.js.map +1 -1
  44. package/dist/src/prompts/index.d.ts.map +1 -1
  45. package/dist/src/prompts/index.js +12 -11
  46. package/dist/src/prompts/index.js.map +1 -1
  47. package/dist/src/prompts/utils.d.ts +0 -14
  48. package/dist/src/prompts/utils.d.ts.map +1 -1
  49. package/dist/src/prompts/utils.js +1 -64
  50. package/dist/src/prompts/utils.js.map +1 -1
  51. package/dist/src/providers/anthropic.d.ts +1 -1
  52. package/dist/src/providers/anthropic.d.ts.map +1 -1
  53. package/dist/src/providers/anthropic.js +67 -66
  54. package/dist/src/providers/anthropic.js.map +1 -1
  55. package/dist/src/providers/bedrock.d.ts +24 -1
  56. package/dist/src/providers/bedrock.d.ts.map +1 -1
  57. package/dist/src/providers/bedrock.js +128 -45
  58. package/dist/src/providers/bedrock.js.map +1 -1
  59. package/dist/src/providers/http.d.ts.map +1 -1
  60. package/dist/src/providers/http.js +10 -10
  61. package/dist/src/providers/http.js.map +1 -1
  62. package/dist/src/providers/mistral.d.ts.map +1 -1
  63. package/dist/src/providers/mistral.js +54 -53
  64. package/dist/src/providers/mistral.js.map +1 -1
  65. package/dist/src/providers/openai.d.ts.map +1 -1
  66. package/dist/src/providers/openai.js +122 -116
  67. package/dist/src/providers/openai.js.map +1 -1
  68. package/dist/src/providers/pythonCompletion.d.ts +3 -2
  69. package/dist/src/providers/pythonCompletion.d.ts.map +1 -1
  70. package/dist/src/providers/pythonCompletion.js +13 -10
  71. package/dist/src/providers/pythonCompletion.js.map +1 -1
  72. package/dist/src/providers/replicate.d.ts +17 -1
  73. package/dist/src/providers/replicate.d.ts.map +1 -1
  74. package/dist/src/providers/replicate.js +63 -1
  75. package/dist/src/providers/replicate.js.map +1 -1
  76. package/dist/src/providers/vertex.d.ts +31 -31
  77. package/dist/src/providers/vertex.d.ts.map +1 -1
  78. package/dist/src/providers.d.ts +4 -4
  79. package/dist/src/providers.d.ts.map +1 -1
  80. package/dist/src/providers.js +54 -47
  81. package/dist/src/providers.js.map +1 -1
  82. package/dist/src/redteam/index.d.ts +1 -1
  83. package/dist/src/redteam/index.d.ts.map +1 -1
  84. package/dist/src/redteam/index.js +34 -34
  85. package/dist/src/redteam/index.js.map +1 -1
  86. package/dist/src/redteam/iterative.d.ts.map +1 -1
  87. package/dist/src/redteam/iterative.js +14 -11
  88. package/dist/src/redteam/iterative.js.map +1 -1
  89. package/dist/src/redteam/iterativeImage.d.ts +12 -0
  90. package/dist/src/redteam/iterativeImage.d.ts.map +1 -0
  91. package/dist/src/redteam/iterativeImage.js +227 -0
  92. package/dist/src/redteam/iterativeImage.js.map +1 -0
  93. package/dist/src/table.d.ts.map +1 -1
  94. package/dist/src/table.js +3 -4
  95. package/dist/src/table.js.map +1 -1
  96. package/dist/src/testCases.d.ts +1 -1
  97. package/dist/src/testCases.d.ts.map +1 -1
  98. package/dist/src/testCases.js +19 -10
  99. package/dist/src/testCases.js.map +1 -1
  100. package/dist/src/types.d.ts +1 -1
  101. package/dist/src/types.d.ts.map +1 -1
  102. package/dist/src/types.js +5 -5
  103. package/dist/src/types.js.map +1 -1
  104. package/dist/src/updates.d.ts.map +1 -1
  105. package/dist/src/updates.js +2 -1
  106. package/dist/src/updates.js.map +1 -1
  107. package/dist/src/util.d.ts +31 -17
  108. package/dist/src/util.d.ts.map +1 -1
  109. package/dist/src/util.js +154 -113
  110. package/dist/src/util.js.map +1 -1
  111. package/dist/src/web/nextui/404/index.html +1 -1
  112. package/dist/src/web/nextui/404.html +1 -1
  113. package/dist/src/web/nextui/_next/static/chunks/166-157bfb431b68d949.js +1 -1
  114. package/dist/src/web/nextui/_next/static/chunks/2-c749131e7095aef3.js +1 -0
  115. package/dist/src/web/nextui/_next/static/chunks/897-1955b232a2148365.js +32 -0
  116. package/dist/src/web/nextui/_next/static/chunks/954-58788165fb1e9563.js +6 -0
  117. package/dist/src/web/nextui/_next/static/chunks/app/auth/login/{page-d932a73274f0f175.js → page-ee73165dd261f3ca.js} +1 -1
  118. package/dist/src/web/nextui/_next/static/chunks/app/auth/signup/{page-7a8f35189f8bc5b8.js → page-7375a6707eb8675e.js} +1 -1
  119. package/dist/src/web/nextui/_next/static/chunks/app/datasets/{page-9712a72be5b92b81.js → page-c11cfb1b2c58325f.js} +1 -1
  120. package/dist/src/web/nextui/_next/static/chunks/app/eval/[id]/not-found-50073ee4b153b82b.js +1 -0
  121. package/dist/src/web/nextui/_next/static/chunks/app/eval/[id]/{page-35bb69e87d17a291.js → page-c6f4e3651d190322.js} +1 -1
  122. package/dist/src/web/nextui/_next/static/chunks/app/eval/page-f9f3c8b30c6aef5b.js +1 -0
  123. package/dist/src/web/nextui/_next/static/chunks/app/{layout-c6a855ac7037db70.js → layout-aab36608271969ed.js} +1 -1
  124. package/dist/src/web/nextui/_next/static/chunks/app/{page-122e9cfa52eb218a.js → page-251d4ea0ac894cd9.js} +1 -1
  125. package/dist/src/web/nextui/_next/static/chunks/app/progress/page-f1bd840ce9168e13.js +1 -0
  126. package/dist/src/web/nextui/_next/static/chunks/app/prompts/{page-689202b79a6b6a92.js → page-f31dd67a60140868.js} +1 -1
  127. package/dist/src/web/nextui/_next/static/chunks/app/report/{page-4b1c00ce9ee1f5ab.js → page-49d3492c635a81f5.js} +1 -1
  128. package/dist/src/web/nextui/_next/static/chunks/app/setup/{page-544af5b41c35d73a.js → page-6cd68647af1a20aa.js} +1 -1
  129. package/dist/src/web/nextui/_next/static/chunks/{main-app-7a1376166cb8b72e.js → main-app-345c3eca7e5cf432.js} +1 -1
  130. package/dist/src/web/nextui/_next/static/chunks/{webpack-d1a82d85a184970b.js → webpack-ac7a3125017b92ed.js} +1 -1
  131. package/dist/src/web/nextui/_next/static/css/036bf4af64e53e86.css +1 -0
  132. package/dist/src/web/nextui/_next/static/css/e141e895af3747c6.css +1 -0
  133. package/dist/src/web/nextui/auth/login/index.html +1 -1
  134. package/dist/src/web/nextui/auth/login/index.txt +5 -5
  135. package/dist/src/web/nextui/auth/signup/index.html +1 -1
  136. package/dist/src/web/nextui/auth/signup/index.txt +5 -5
  137. package/dist/src/web/nextui/datasets/index.html +1 -1
  138. package/dist/src/web/nextui/datasets/index.txt +5 -5
  139. package/dist/src/web/nextui/eval/index.html +1 -1
  140. package/dist/src/web/nextui/eval/index.txt +7 -7
  141. package/dist/src/web/nextui/index.html +1 -1
  142. package/dist/src/web/nextui/index.txt +4 -4
  143. package/dist/src/web/nextui/progress/index.html +1 -1
  144. package/dist/src/web/nextui/progress/index.txt +5 -5
  145. package/dist/src/web/nextui/prompts/index.html +1 -1
  146. package/dist/src/web/nextui/prompts/index.txt +5 -5
  147. package/dist/src/web/nextui/report/index.html +1 -1
  148. package/dist/src/web/nextui/report/index.txt +5 -5
  149. package/dist/src/web/nextui/setup/index.html +2 -2
  150. package/dist/src/web/nextui/setup/index.txt +6 -6
  151. package/package.json +4 -3
  152. package/dist/src/web/nextui/_next/static/chunks/2-f562fcee36045aca.js +0 -1
  153. package/dist/src/web/nextui/_next/static/chunks/94-c07f30271fa4d8e4.js +0 -32
  154. package/dist/src/web/nextui/_next/static/chunks/954-c35d4864ecbacd62.js +0 -6
  155. package/dist/src/web/nextui/_next/static/chunks/app/eval/[id]/not-found-fe10d5df88bc44ef.js +0 -1
  156. package/dist/src/web/nextui/_next/static/chunks/app/eval/page-aef3aed32af8d4d7.js +0 -1
  157. package/dist/src/web/nextui/_next/static/chunks/app/progress/page-751105ef02d00993.js +0 -1
  158. package/dist/src/web/nextui/_next/static/css/451beaa5570cb9d3.css +0 -1
  159. package/dist/src/web/nextui/_next/static/css/e9f25719d0b14939.css +0 -1
  160. /package/dist/src/web/nextui/_next/static/{m-VSM7eKSuIZDyA_tnwFX → tUB-fEjoICDbTDdLhchKo}/_buildManifest.js +0 -0
  161. /package/dist/src/web/nextui/_next/static/{m-VSM7eKSuIZDyA_tnwFX → tUB-fEjoICDbTDdLhchKo}/_ssgManifest.js +0 -0
@@ -1,8 +1,8 @@
1
1
  import nunjucks from 'nunjucks';
2
2
  import { type EvalWithMetadata, type EvaluateResult, type EvaluateSummary, type EvaluateTable, type NunjucksFilterMap, type PromptWithMetadata, type ResultsFile, type TestCase, type TestCasesWithMetadata, type UnifiedConfig, type OutputFile, type Prompt, type CompletedPrompt } from './types';
3
- export declare function maybeReadConfig(configPath: string): Promise<UnifiedConfig | undefined>;
4
3
  export declare function dereferenceConfig(rawConfig: UnifiedConfig): Promise<UnifiedConfig>;
5
4
  export declare function readConfig(configPath: string): Promise<UnifiedConfig>;
5
+ export declare function maybeReadConfig(configPath: string): Promise<UnifiedConfig | undefined>;
6
6
  /**
7
7
  * Reads multiple configuration files and combines them into a single UnifiedConfig.
8
8
  *
@@ -10,8 +10,12 @@ export declare function readConfig(configPath: string): Promise<UnifiedConfig>;
10
10
  * @returns {Promise<UnifiedConfig>} A promise that resolves to a unified configuration object.
11
11
  */
12
12
  export declare function readConfigs(configPaths: string[]): Promise<UnifiedConfig>;
13
- export declare function writeMultipleOutputs(outputPaths: string[], evalId: string | null, results: EvaluateSummary, config: Partial<UnifiedConfig>, shareableUrl: string | null): Promise<void>;
13
+ export declare function getNunjucksEngine(filters?: NunjucksFilterMap): nunjucks.Environment | {
14
+ renderString: (template: string) => string;
15
+ };
14
16
  export declare function writeOutput(outputPath: string, evalId: string | null, results: EvaluateSummary, config: Partial<UnifiedConfig>, shareableUrl: string | null): Promise<void>;
17
+ export declare function writeMultipleOutputs(outputPaths: string[], evalId: string | null, results: EvaluateSummary, config: Partial<UnifiedConfig>, shareableUrl: string | null): Promise<void>;
18
+ export declare function sha256(str: string): string;
15
19
  export declare function readOutput(outputPath: string): Promise<OutputFile>;
16
20
  export declare function getConfigDirectoryPath(createIfNotExists?: boolean): string;
17
21
  export declare function setConfigDirectoryPath(newPath: string): void;
@@ -40,15 +44,8 @@ export declare function listPreviousResults_fileSystem(): {
40
44
  fileName: string;
41
45
  description?: string;
42
46
  }[];
43
- export declare function migrateResultsFromFileSystemToDatabase(): Promise<void>;
44
- export declare function cleanupOldFileResults(remaining?: number): void;
45
47
  export declare function filenameToDate(filename: string): Date;
46
48
  export declare function dateToFilename(date: Date): string;
47
- export declare function readResult(id: string): Promise<{
48
- id: string;
49
- result: ResultsFile;
50
- createdAt: Date;
51
- } | undefined>;
52
49
  /**
53
50
  * @deprecated Used only for migration to sqlite
54
51
  */
@@ -57,25 +54,28 @@ export declare function readResult_fileSystem(name: string): {
57
54
  result: ResultsFile;
58
55
  createdAt: Date;
59
56
  } | undefined;
57
+ export declare function migrateResultsFromFileSystemToDatabase(): Promise<void>;
58
+ export declare function cleanupOldFileResults(remaining?: number): void;
59
+ export declare function readResult(id: string): Promise<{
60
+ id: string;
61
+ result: ResultsFile;
62
+ createdAt: Date;
63
+ } | undefined>;
60
64
  export declare function updateResult(id: string, newConfig?: Partial<UnifiedConfig>, newTable?: EvaluateTable): Promise<void>;
61
65
  export declare function readLatestResults(filterDescription?: string): Promise<ResultsFile | undefined>;
62
- export declare function getPromptsForTestCases(testCases: TestCase[]): Promise<PromptWithMetadata[]>;
66
+ export declare function getPromptsWithPredicate(predicate: (result: ResultsFile) => boolean, limit: number): Promise<PromptWithMetadata[]>;
63
67
  export declare function getPromptsForTestCasesHash(testCasesSha256: string, limit?: number): Promise<PromptWithMetadata[]>;
64
- export declare function sha256(str: string): string;
68
+ export declare function getPromptsForTestCases(testCases: TestCase[]): Promise<PromptWithMetadata[]>;
69
+ export declare function getTestCasesWithPredicate(predicate: (result: ResultsFile) => boolean, limit: number): Promise<TestCasesWithMetadata[]>;
65
70
  export declare function getPrompts(limit?: number): Promise<PromptWithMetadata[]>;
66
- export declare function getPromptsWithPredicate(predicate: (result: ResultsFile) => boolean, limit: number): Promise<PromptWithMetadata[]>;
67
71
  export declare function getTestCases(limit?: number): Promise<TestCasesWithMetadata[]>;
68
- export declare function getTestCasesWithPredicate(predicate: (result: ResultsFile) => boolean, limit: number): Promise<TestCasesWithMetadata[]>;
69
72
  export declare function getPromptFromHash(hash: string): Promise<PromptWithMetadata | undefined>;
70
73
  export declare function getDatasetFromHash(hash: string): Promise<TestCasesWithMetadata | undefined>;
74
+ export declare function getEvalsWithPredicate(predicate: (result: ResultsFile) => boolean, limit: number): Promise<EvalWithMetadata[]>;
71
75
  export declare function getEvals(limit?: number): Promise<EvalWithMetadata[]>;
72
76
  export declare function getEvalFromId(hash: string): Promise<EvalWithMetadata | undefined>;
73
- export declare function getEvalsWithPredicate(predicate: (result: ResultsFile) => boolean, limit: number): Promise<EvalWithMetadata[]>;
74
77
  export declare function deleteEval(evalId: string): Promise<void>;
75
78
  export declare function readFilters(filters: Record<string, string>): Promise<NunjucksFilterMap>;
76
- export declare function getNunjucksEngine(filters?: NunjucksFilterMap): nunjucks.Environment | {
77
- renderString: (template: string) => string;
78
- };
79
79
  export declare function printBorder(): void;
80
80
  export declare function transformOutput(codeOrFilepath: string, output: string | object | undefined, context: {
81
81
  vars?: Record<string, string | object | undefined>;
@@ -94,4 +94,18 @@ export declare function resultIsForTestCase(result: EvaluateResult, testCase: Te
94
94
  export declare function safeJsonStringify(value: any, prettyPrint?: boolean): string;
95
95
  export declare function renderVarsInObject<T>(obj: T, vars?: Record<string, string | object>): T;
96
96
  export declare function extractJsonObjects(str: string): object[];
97
+ /**
98
+ * Parses a file path or glob pattern to extract function names and file extensions.
99
+ * Function names can be specified in the filename like this:
100
+ * prompt.py:myFunction or prompts.js:myFunction.
101
+ * @param basePath - The base path for file resolution.
102
+ * @param promptPath - The path or glob pattern.
103
+ * @returns Parsed details including function name, file extension, and directory status.
104
+ */
105
+ export declare function parsePathOrGlob(basePath: string, promptPath: string): {
106
+ extension?: string;
107
+ functionName?: string;
108
+ isPathPattern: boolean;
109
+ filePath: string;
110
+ };
97
111
  //# sourceMappingURL=util.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"util.d.ts","sourceRoot":"","sources":["../../src/util.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"util.d.ts","sourceRoot":"","sources":["../../src/util.ts"],"names":[],"mappings":"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"}
package/dist/src/util.js CHANGED
@@ -26,7 +26,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
26
26
  return (mod && mod.__esModule) ? mod : { "default": mod };
27
27
  };
28
28
  Object.defineProperty(exports, "__esModule", { value: true });
29
- exports.extractJsonObjects = exports.renderVarsInObject = exports.safeJsonStringify = exports.resultIsForTestCase = exports.varsMatch = exports.providerToIdentifier = exports.getStandaloneEvals = exports.setupEnv = exports.transformOutput = exports.printBorder = exports.getNunjucksEngine = exports.readFilters = exports.deleteEval = exports.getEvalsWithPredicate = exports.getEvalFromId = exports.getEvals = exports.getDatasetFromHash = exports.getPromptFromHash = exports.getTestCasesWithPredicate = exports.getTestCases = exports.getPromptsWithPredicate = exports.getPrompts = exports.sha256 = exports.getPromptsForTestCasesHash = exports.getPromptsForTestCases = exports.readLatestResults = exports.updateResult = exports.readResult_fileSystem = exports.readResult = exports.dateToFilename = exports.filenameToDate = exports.cleanupOldFileResults = exports.migrateResultsFromFileSystemToDatabase = exports.listPreviousResults_fileSystem = exports.listPreviousResultFilenames_fileSystem = exports.listPreviousResults = exports.writeResultsToDatabase = exports.getLatestResultsPath = exports.setConfigDirectoryPath = exports.getConfigDirectoryPath = exports.readOutput = exports.writeOutput = exports.writeMultipleOutputs = exports.readConfigs = exports.readConfig = exports.dereferenceConfig = exports.maybeReadConfig = void 0;
29
+ exports.parsePathOrGlob = exports.extractJsonObjects = exports.renderVarsInObject = exports.safeJsonStringify = exports.resultIsForTestCase = exports.varsMatch = exports.providerToIdentifier = exports.getStandaloneEvals = exports.setupEnv = exports.transformOutput = exports.printBorder = exports.readFilters = exports.deleteEval = exports.getEvalFromId = exports.getEvals = exports.getEvalsWithPredicate = exports.getDatasetFromHash = exports.getPromptFromHash = exports.getTestCases = exports.getPrompts = exports.getTestCasesWithPredicate = exports.getPromptsForTestCases = exports.getPromptsForTestCasesHash = exports.getPromptsWithPredicate = exports.readLatestResults = exports.updateResult = exports.readResult = exports.cleanupOldFileResults = exports.migrateResultsFromFileSystemToDatabase = exports.readResult_fileSystem = exports.dateToFilename = exports.filenameToDate = exports.listPreviousResults_fileSystem = exports.listPreviousResultFilenames_fileSystem = exports.listPreviousResults = exports.writeResultsToDatabase = exports.getLatestResultsPath = exports.setConfigDirectoryPath = exports.getConfigDirectoryPath = exports.readOutput = exports.sha256 = exports.writeMultipleOutputs = exports.writeOutput = exports.getNunjucksEngine = exports.readConfigs = exports.maybeReadConfig = exports.readConfig = exports.dereferenceConfig = void 0;
30
30
  const json_schema_ref_parser_1 = __importDefault(require("@apidevtools/json-schema-ref-parser"));
31
31
  const crypto_1 = require("crypto");
32
32
  const sync_1 = require("csv-stringify/sync");
@@ -41,6 +41,7 @@ const os = __importStar(require("os"));
41
41
  const path = __importStar(require("path"));
42
42
  const tiny_invariant_1 = __importDefault(require("tiny-invariant"));
43
43
  const cliState_1 = __importDefault(require("./cliState"));
44
+ const constants_1 = require("./constants");
44
45
  const database_1 = require("./database");
45
46
  const esm_1 = require("./esm");
46
47
  const googleSheets_1 = require("./googleSheets");
@@ -50,13 +51,6 @@ const wrapper_1 = require("./python/wrapper");
50
51
  const testCases_1 = require("./testCases");
51
52
  const types_1 = require("./types");
52
53
  const DEFAULT_QUERY_LIMIT = 100;
53
- async function maybeReadConfig(configPath) {
54
- if (!fs.existsSync(configPath)) {
55
- return undefined;
56
- }
57
- return readConfig(configPath);
58
- }
59
- exports.maybeReadConfig = maybeReadConfig;
60
54
  async function dereferenceConfig(rawConfig) {
61
55
  if (process.env.PROMPTFOO_DISABLE_REF_PARSER) {
62
56
  return rawConfig;
@@ -159,6 +153,13 @@ async function readConfig(configPath) {
159
153
  }
160
154
  }
161
155
  exports.readConfig = readConfig;
156
+ async function maybeReadConfig(configPath) {
157
+ if (!fs.existsSync(configPath)) {
158
+ return undefined;
159
+ }
160
+ return readConfig(configPath);
161
+ }
162
+ exports.maybeReadConfig = maybeReadConfig;
162
163
  /**
163
164
  * Reads multiple configuration files and combines them into a single UnifiedConfig.
164
165
  *
@@ -290,10 +291,23 @@ async function readConfigs(configPaths) {
290
291
  return combinedConfig;
291
292
  }
292
293
  exports.readConfigs = readConfigs;
293
- async function writeMultipleOutputs(outputPaths, evalId, results, config, shareableUrl) {
294
- await Promise.all(outputPaths.map((outputPath) => writeOutput(outputPath, evalId, results, config, shareableUrl)));
294
+ function getNunjucksEngine(filters) {
295
+ if (process.env.PROMPTFOO_DISABLE_TEMPLATING) {
296
+ return {
297
+ renderString: (template) => template,
298
+ };
299
+ }
300
+ const env = nunjucks_1.default.configure({
301
+ autoescape: false,
302
+ });
303
+ if (filters) {
304
+ for (const [name, filter] of Object.entries(filters)) {
305
+ env.addFilter(name, filter);
306
+ }
307
+ }
308
+ return env;
295
309
  }
296
- exports.writeMultipleOutputs = writeMultipleOutputs;
310
+ exports.getNunjucksEngine = getNunjucksEngine;
297
311
  async function writeOutput(outputPath, evalId, results, config, shareableUrl) {
298
312
  const outputExtension = outputPath.split('.').pop()?.toLowerCase();
299
313
  const outputToSimpleString = (output) => {
@@ -372,6 +386,14 @@ ${gradingResultText}`.trim();
372
386
  }
373
387
  }
374
388
  exports.writeOutput = writeOutput;
389
+ async function writeMultipleOutputs(outputPaths, evalId, results, config, shareableUrl) {
390
+ await Promise.all(outputPaths.map((outputPath) => writeOutput(outputPath, evalId, results, config, shareableUrl)));
391
+ }
392
+ exports.writeMultipleOutputs = writeMultipleOutputs;
393
+ function sha256(str) {
394
+ return (0, crypto_1.createHash)('sha256').update(str).digest('hex');
395
+ }
396
+ exports.sha256 = sha256;
375
397
  async function readOutput(outputPath) {
376
398
  const ext = path.parse(outputPath).ext.slice(1);
377
399
  switch (ext) {
@@ -545,6 +567,51 @@ function listPreviousResults_fileSystem() {
545
567
  });
546
568
  }
547
569
  exports.listPreviousResults_fileSystem = listPreviousResults_fileSystem;
570
+ function filenameToDate(filename) {
571
+ const dateString = filename.slice('eval-'.length, filename.length - '.json'.length);
572
+ // Replace hyphens with colons where necessary (Windows compatibility).
573
+ const dateParts = dateString.split('T');
574
+ const timePart = dateParts[1].replace(/-/g, ':');
575
+ const formattedDateString = `${dateParts[0]}T${timePart}`;
576
+ const date = new Date(formattedDateString);
577
+ return date;
578
+ /*
579
+ return date.toLocaleDateString('en-US', {
580
+ year: 'numeric',
581
+ month: 'long',
582
+ day: 'numeric',
583
+ hour: '2-digit',
584
+ minute: '2-digit',
585
+ second: '2-digit',
586
+ timeZoneName: 'short',
587
+ });
588
+ */
589
+ }
590
+ exports.filenameToDate = filenameToDate;
591
+ function dateToFilename(date) {
592
+ return `eval-${date.toISOString().replace(/:/g, '-')}.json`;
593
+ }
594
+ exports.dateToFilename = dateToFilename;
595
+ /**
596
+ * @deprecated Used only for migration to sqlite
597
+ */
598
+ function readResult_fileSystem(name) {
599
+ const resultsDirectory = path.join(getConfigDirectoryPath(), 'output');
600
+ const resultsPath = path.join(resultsDirectory, name);
601
+ try {
602
+ const result = JSON.parse(fs.readFileSync(fs.realpathSync(resultsPath), 'utf-8'));
603
+ const createdAt = filenameToDate(name);
604
+ return {
605
+ id: sha256(JSON.stringify(result.config)),
606
+ result,
607
+ createdAt,
608
+ };
609
+ }
610
+ catch (err) {
611
+ logger_1.default.error(`Failed to read results from ${resultsPath}:\n${err}`);
612
+ }
613
+ }
614
+ exports.readResult_fileSystem = readResult_fileSystem;
548
615
  let attemptedMigration = false;
549
616
  async function migrateResultsFromFileSystemToDatabase() {
550
617
  if (attemptedMigration) {
@@ -609,31 +676,6 @@ function cleanupOldFileResults(remaining = RESULT_HISTORY_LENGTH) {
609
676
  }
610
677
  }
611
678
  exports.cleanupOldFileResults = cleanupOldFileResults;
612
- function filenameToDate(filename) {
613
- const dateString = filename.slice('eval-'.length, filename.length - '.json'.length);
614
- // Replace hyphens with colons where necessary (Windows compatibility).
615
- const dateParts = dateString.split('T');
616
- const timePart = dateParts[1].replace(/-/g, ':');
617
- const formattedDateString = `${dateParts[0]}T${timePart}`;
618
- const date = new Date(formattedDateString);
619
- return date;
620
- /*
621
- return date.toLocaleDateString('en-US', {
622
- year: 'numeric',
623
- month: 'long',
624
- day: 'numeric',
625
- hour: '2-digit',
626
- minute: '2-digit',
627
- second: '2-digit',
628
- timeZoneName: 'short',
629
- });
630
- */
631
- }
632
- exports.filenameToDate = filenameToDate;
633
- function dateToFilename(date) {
634
- return `eval-${date.toISOString().replace(/:/g, '-')}.json`;
635
- }
636
- exports.dateToFilename = dateToFilename;
637
679
  async function readResult(id) {
638
680
  const db = (0, database_1.getDb)();
639
681
  try {
@@ -668,26 +710,6 @@ async function readResult(id) {
668
710
  }
669
711
  }
670
712
  exports.readResult = readResult;
671
- /**
672
- * @deprecated Used only for migration to sqlite
673
- */
674
- function readResult_fileSystem(name) {
675
- const resultsDirectory = path.join(getConfigDirectoryPath(), 'output');
676
- const resultsPath = path.join(resultsDirectory, name);
677
- try {
678
- const result = JSON.parse(fs.readFileSync(fs.realpathSync(resultsPath), 'utf-8'));
679
- const createdAt = filenameToDate(name);
680
- return {
681
- id: sha256(JSON.stringify(result.config)),
682
- result,
683
- createdAt,
684
- };
685
- }
686
- catch (err) {
687
- logger_1.default.error(`Failed to read results from ${resultsPath}:\n${err}`);
688
- }
689
- }
690
- exports.readResult_fileSystem = readResult_fileSystem;
691
713
  async function updateResult(id, newConfig, newTable) {
692
714
  const db = (0, database_1.getDb)();
693
715
  try {
@@ -757,28 +779,6 @@ async function readLatestResults(filterDescription) {
757
779
  };
758
780
  }
759
781
  exports.readLatestResults = readLatestResults;
760
- function getPromptsForTestCases(testCases) {
761
- const testCasesJson = JSON.stringify(testCases);
762
- const testCasesSha256 = sha256(testCasesJson);
763
- return getPromptsForTestCasesHash(testCasesSha256);
764
- }
765
- exports.getPromptsForTestCases = getPromptsForTestCases;
766
- function getPromptsForTestCasesHash(testCasesSha256, limit = DEFAULT_QUERY_LIMIT) {
767
- return getPromptsWithPredicate((result) => {
768
- const testsJson = JSON.stringify(result.config.tests);
769
- const hash = sha256(testsJson);
770
- return hash === testCasesSha256;
771
- }, limit);
772
- }
773
- exports.getPromptsForTestCasesHash = getPromptsForTestCasesHash;
774
- function sha256(str) {
775
- return (0, crypto_1.createHash)('sha256').update(str).digest('hex');
776
- }
777
- exports.sha256 = sha256;
778
- function getPrompts(limit = DEFAULT_QUERY_LIMIT) {
779
- return getPromptsWithPredicate(() => true, limit);
780
- }
781
- exports.getPrompts = getPrompts;
782
782
  async function getPromptsWithPredicate(predicate, limit) {
783
783
  // TODO(ian): Make this use a proper database query
784
784
  const db = (0, database_1.getDb)();
@@ -838,10 +838,20 @@ async function getPromptsWithPredicate(predicate, limit) {
838
838
  return Object.values(groupedPrompts);
839
839
  }
840
840
  exports.getPromptsWithPredicate = getPromptsWithPredicate;
841
- async function getTestCases(limit = DEFAULT_QUERY_LIMIT) {
842
- return getTestCasesWithPredicate(() => true, limit);
841
+ function getPromptsForTestCasesHash(testCasesSha256, limit = DEFAULT_QUERY_LIMIT) {
842
+ return getPromptsWithPredicate((result) => {
843
+ const testsJson = JSON.stringify(result.config.tests);
844
+ const hash = sha256(testsJson);
845
+ return hash === testCasesSha256;
846
+ }, limit);
843
847
  }
844
- exports.getTestCases = getTestCases;
848
+ exports.getPromptsForTestCasesHash = getPromptsForTestCasesHash;
849
+ function getPromptsForTestCases(testCases) {
850
+ const testCasesJson = JSON.stringify(testCases);
851
+ const testCasesSha256 = sha256(testCasesJson);
852
+ return getPromptsForTestCasesHash(testCasesSha256);
853
+ }
854
+ exports.getPromptsForTestCases = getPromptsForTestCases;
845
855
  async function getTestCasesWithPredicate(predicate, limit) {
846
856
  const db = (0, database_1.getDb)();
847
857
  const evals_ = await db
@@ -909,6 +919,14 @@ async function getTestCasesWithPredicate(predicate, limit) {
909
919
  return Object.values(groupedTestCases);
910
920
  }
911
921
  exports.getTestCasesWithPredicate = getTestCasesWithPredicate;
922
+ function getPrompts(limit = DEFAULT_QUERY_LIMIT) {
923
+ return getPromptsWithPredicate(() => true, limit);
924
+ }
925
+ exports.getPrompts = getPrompts;
926
+ async function getTestCases(limit = DEFAULT_QUERY_LIMIT) {
927
+ return getTestCasesWithPredicate(() => true, limit);
928
+ }
929
+ exports.getTestCases = getTestCases;
912
930
  async function getPromptFromHash(hash) {
913
931
  const prompts = await getPrompts();
914
932
  for (const prompt of prompts) {
@@ -929,20 +947,6 @@ async function getDatasetFromHash(hash) {
929
947
  return undefined;
930
948
  }
931
949
  exports.getDatasetFromHash = getDatasetFromHash;
932
- async function getEvals(limit = DEFAULT_QUERY_LIMIT) {
933
- return getEvalsWithPredicate(() => true, limit);
934
- }
935
- exports.getEvals = getEvals;
936
- async function getEvalFromId(hash) {
937
- const evals_ = await getEvals();
938
- for (const eval_ of evals_) {
939
- if (eval_.id.startsWith(hash)) {
940
- return eval_;
941
- }
942
- }
943
- return undefined;
944
- }
945
- exports.getEvalFromId = getEvalFromId;
946
950
  async function getEvalsWithPredicate(predicate, limit) {
947
951
  const db = (0, database_1.getDb)();
948
952
  const evals_ = await db
@@ -980,6 +984,20 @@ async function getEvalsWithPredicate(predicate, limit) {
980
984
  return ret;
981
985
  }
982
986
  exports.getEvalsWithPredicate = getEvalsWithPredicate;
987
+ async function getEvals(limit = DEFAULT_QUERY_LIMIT) {
988
+ return getEvalsWithPredicate(() => true, limit);
989
+ }
990
+ exports.getEvals = getEvals;
991
+ async function getEvalFromId(hash) {
992
+ const evals_ = await getEvals();
993
+ for (const eval_ of evals_) {
994
+ if (eval_.id.startsWith(hash)) {
995
+ return eval_;
996
+ }
997
+ }
998
+ return undefined;
999
+ }
1000
+ exports.getEvalFromId = getEvalFromId;
983
1001
  async function deleteEval(evalId) {
984
1002
  const db = (0, database_1.getDb)();
985
1003
  await db.transaction(async () => {
@@ -1010,25 +1028,8 @@ async function readFilters(filters) {
1010
1028
  return ret;
1011
1029
  }
1012
1030
  exports.readFilters = readFilters;
1013
- function getNunjucksEngine(filters) {
1014
- if (process.env.PROMPTFOO_DISABLE_TEMPLATING) {
1015
- return {
1016
- renderString: (template) => template,
1017
- };
1018
- }
1019
- const env = nunjucks_1.default.configure({
1020
- autoescape: false,
1021
- });
1022
- if (filters) {
1023
- for (const [name, filter] of Object.entries(filters)) {
1024
- env.addFilter(name, filter);
1025
- }
1026
- }
1027
- return env;
1028
- }
1029
- exports.getNunjucksEngine = getNunjucksEngine;
1030
1031
  function printBorder() {
1031
- const border = '='.repeat((process.stdout.columns || 80) - 10);
1032
+ const border = '='.repeat(constants_1.TERMINAL_MAX_WIDTH);
1032
1033
  logger_1.default.info(border);
1033
1034
  }
1034
1035
  exports.printBorder = printBorder;
@@ -1201,4 +1202,44 @@ function extractJsonObjects(str) {
1201
1202
  return jsonObjects;
1202
1203
  }
1203
1204
  exports.extractJsonObjects = extractJsonObjects;
1205
+ /**
1206
+ * Parses a file path or glob pattern to extract function names and file extensions.
1207
+ * Function names can be specified in the filename like this:
1208
+ * prompt.py:myFunction or prompts.js:myFunction.
1209
+ * @param basePath - The base path for file resolution.
1210
+ * @param promptPath - The path or glob pattern.
1211
+ * @returns Parsed details including function name, file extension, and directory status.
1212
+ */
1213
+ function parsePathOrGlob(basePath, promptPath) {
1214
+ let filePath = path.join(basePath, promptPath);
1215
+ if (filePath.includes('file:')) {
1216
+ filePath = filePath.split('file:')[1];
1217
+ }
1218
+ let stats;
1219
+ try {
1220
+ stats = fs.statSync(filePath);
1221
+ }
1222
+ catch (err) {
1223
+ if (process.env.PROMPTFOO_STRICT_FILES) {
1224
+ throw err;
1225
+ }
1226
+ }
1227
+ let filename = path.relative(basePath, filePath);
1228
+ let functionName;
1229
+ if (filename.includes(':')) {
1230
+ const splits = filename.split(':');
1231
+ if (splits[0] && ['.js', '.cjs', '.mjs', '.py'].some((ext) => splits[0].endsWith(ext))) {
1232
+ [filename, functionName] = splits;
1233
+ }
1234
+ }
1235
+ const isPathPattern = stats?.isDirectory() || /[*?{}\[\]]/.test(filePath); // glob pattern
1236
+ const safeFilename = path.relative(basePath, path.isAbsolute(filename) ? filename : path.resolve(basePath, filename));
1237
+ return {
1238
+ extension: isPathPattern ? undefined : path.parse(safeFilename).ext,
1239
+ filePath: safeFilename.startsWith(basePath) ? safeFilename : path.join(basePath, safeFilename),
1240
+ functionName,
1241
+ isPathPattern,
1242
+ };
1243
+ }
1244
+ exports.parsePathOrGlob = parsePathOrGlob;
1204
1245
  //# sourceMappingURL=util.js.map