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.
- package/README.md +1 -1
- package/dist/package.json +4 -3
- package/dist/src/assertions/validateAssertions.d.ts.map +1 -1
- package/dist/src/assertions/validateAssertions.js +11 -11
- package/dist/src/assertions/validateAssertions.js.map +1 -1
- package/dist/src/assertions.d.ts +6 -4
- package/dist/src/assertions.d.ts.map +1 -1
- package/dist/src/assertions.js +120 -118
- package/dist/src/assertions.js.map +1 -1
- package/dist/src/checkNodeVersion.d.ts +6 -0
- package/dist/src/checkNodeVersion.d.ts.map +1 -0
- package/dist/src/checkNodeVersion.js +67 -0
- package/dist/src/checkNodeVersion.js.map +1 -0
- package/dist/src/commands/delete.d.ts.map +1 -1
- package/dist/src/commands/delete.js +10 -10
- package/dist/src/commands/delete.js.map +1 -1
- package/dist/src/commands/show.d.ts.map +1 -1
- package/dist/src/commands/show.js +64 -64
- package/dist/src/commands/show.js.map +1 -1
- package/dist/src/constants.d.ts +1 -0
- package/dist/src/constants.d.ts.map +1 -1
- package/dist/src/constants.js +3 -1
- package/dist/src/constants.js.map +1 -1
- package/dist/src/csv.d.ts +1 -1
- package/dist/src/csv.d.ts.map +1 -1
- package/dist/src/csv.js +50 -50
- package/dist/src/csv.js.map +1 -1
- package/dist/src/database.d.ts +56 -56
- package/dist/src/database.d.ts.map +1 -1
- package/dist/src/database.js +29 -29
- package/dist/src/database.js.map +1 -1
- package/dist/src/feedback.d.ts +1 -1
- package/dist/src/feedback.d.ts.map +1 -1
- package/dist/src/feedback.js +19 -19
- package/dist/src/feedback.js.map +1 -1
- package/dist/src/googleSheets.d.ts +1 -1
- package/dist/src/googleSheets.d.ts.map +1 -1
- package/dist/src/googleSheets.js +10 -10
- package/dist/src/googleSheets.js.map +1 -1
- package/dist/src/index.d.ts +2 -0
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/main.js +2 -0
- package/dist/src/main.js.map +1 -1
- package/dist/src/prompts/index.d.ts.map +1 -1
- package/dist/src/prompts/index.js +12 -11
- package/dist/src/prompts/index.js.map +1 -1
- package/dist/src/prompts/utils.d.ts +0 -14
- package/dist/src/prompts/utils.d.ts.map +1 -1
- package/dist/src/prompts/utils.js +1 -64
- package/dist/src/prompts/utils.js.map +1 -1
- package/dist/src/providers/anthropic.d.ts +1 -1
- package/dist/src/providers/anthropic.d.ts.map +1 -1
- package/dist/src/providers/anthropic.js +67 -66
- package/dist/src/providers/anthropic.js.map +1 -1
- package/dist/src/providers/bedrock.d.ts +24 -1
- package/dist/src/providers/bedrock.d.ts.map +1 -1
- package/dist/src/providers/bedrock.js +128 -45
- package/dist/src/providers/bedrock.js.map +1 -1
- package/dist/src/providers/http.d.ts.map +1 -1
- package/dist/src/providers/http.js +10 -10
- package/dist/src/providers/http.js.map +1 -1
- package/dist/src/providers/mistral.d.ts.map +1 -1
- package/dist/src/providers/mistral.js +54 -53
- package/dist/src/providers/mistral.js.map +1 -1
- package/dist/src/providers/openai.d.ts.map +1 -1
- package/dist/src/providers/openai.js +122 -116
- package/dist/src/providers/openai.js.map +1 -1
- package/dist/src/providers/pythonCompletion.d.ts +3 -2
- package/dist/src/providers/pythonCompletion.d.ts.map +1 -1
- package/dist/src/providers/pythonCompletion.js +13 -10
- package/dist/src/providers/pythonCompletion.js.map +1 -1
- package/dist/src/providers/replicate.d.ts +17 -1
- package/dist/src/providers/replicate.d.ts.map +1 -1
- package/dist/src/providers/replicate.js +63 -1
- package/dist/src/providers/replicate.js.map +1 -1
- package/dist/src/providers/vertex.d.ts +31 -31
- package/dist/src/providers/vertex.d.ts.map +1 -1
- package/dist/src/providers.d.ts +4 -4
- package/dist/src/providers.d.ts.map +1 -1
- package/dist/src/providers.js +54 -47
- package/dist/src/providers.js.map +1 -1
- package/dist/src/redteam/index.d.ts +1 -1
- package/dist/src/redteam/index.d.ts.map +1 -1
- package/dist/src/redteam/index.js +34 -34
- package/dist/src/redteam/index.js.map +1 -1
- package/dist/src/redteam/iterative.d.ts.map +1 -1
- package/dist/src/redteam/iterative.js +14 -11
- package/dist/src/redteam/iterative.js.map +1 -1
- package/dist/src/redteam/iterativeImage.d.ts +12 -0
- package/dist/src/redteam/iterativeImage.d.ts.map +1 -0
- package/dist/src/redteam/iterativeImage.js +227 -0
- package/dist/src/redteam/iterativeImage.js.map +1 -0
- package/dist/src/table.d.ts.map +1 -1
- package/dist/src/table.js +3 -4
- package/dist/src/table.js.map +1 -1
- package/dist/src/testCases.d.ts +1 -1
- package/dist/src/testCases.d.ts.map +1 -1
- package/dist/src/testCases.js +19 -10
- package/dist/src/testCases.js.map +1 -1
- package/dist/src/types.d.ts +1 -1
- package/dist/src/types.d.ts.map +1 -1
- package/dist/src/types.js +5 -5
- package/dist/src/types.js.map +1 -1
- package/dist/src/updates.d.ts.map +1 -1
- package/dist/src/updates.js +2 -1
- package/dist/src/updates.js.map +1 -1
- package/dist/src/util.d.ts +31 -17
- package/dist/src/util.d.ts.map +1 -1
- package/dist/src/util.js +154 -113
- package/dist/src/util.js.map +1 -1
- package/dist/src/web/nextui/404/index.html +1 -1
- package/dist/src/web/nextui/404.html +1 -1
- package/dist/src/web/nextui/_next/static/chunks/166-157bfb431b68d949.js +1 -1
- package/dist/src/web/nextui/_next/static/chunks/2-c749131e7095aef3.js +1 -0
- package/dist/src/web/nextui/_next/static/chunks/897-1955b232a2148365.js +32 -0
- package/dist/src/web/nextui/_next/static/chunks/954-58788165fb1e9563.js +6 -0
- package/dist/src/web/nextui/_next/static/chunks/app/auth/login/{page-d932a73274f0f175.js → page-ee73165dd261f3ca.js} +1 -1
- package/dist/src/web/nextui/_next/static/chunks/app/auth/signup/{page-7a8f35189f8bc5b8.js → page-7375a6707eb8675e.js} +1 -1
- package/dist/src/web/nextui/_next/static/chunks/app/datasets/{page-9712a72be5b92b81.js → page-c11cfb1b2c58325f.js} +1 -1
- package/dist/src/web/nextui/_next/static/chunks/app/eval/[id]/not-found-50073ee4b153b82b.js +1 -0
- package/dist/src/web/nextui/_next/static/chunks/app/eval/[id]/{page-35bb69e87d17a291.js → page-c6f4e3651d190322.js} +1 -1
- package/dist/src/web/nextui/_next/static/chunks/app/eval/page-f9f3c8b30c6aef5b.js +1 -0
- package/dist/src/web/nextui/_next/static/chunks/app/{layout-c6a855ac7037db70.js → layout-aab36608271969ed.js} +1 -1
- package/dist/src/web/nextui/_next/static/chunks/app/{page-122e9cfa52eb218a.js → page-251d4ea0ac894cd9.js} +1 -1
- package/dist/src/web/nextui/_next/static/chunks/app/progress/page-f1bd840ce9168e13.js +1 -0
- package/dist/src/web/nextui/_next/static/chunks/app/prompts/{page-689202b79a6b6a92.js → page-f31dd67a60140868.js} +1 -1
- package/dist/src/web/nextui/_next/static/chunks/app/report/{page-4b1c00ce9ee1f5ab.js → page-49d3492c635a81f5.js} +1 -1
- package/dist/src/web/nextui/_next/static/chunks/app/setup/{page-544af5b41c35d73a.js → page-6cd68647af1a20aa.js} +1 -1
- package/dist/src/web/nextui/_next/static/chunks/{main-app-7a1376166cb8b72e.js → main-app-345c3eca7e5cf432.js} +1 -1
- package/dist/src/web/nextui/_next/static/chunks/{webpack-d1a82d85a184970b.js → webpack-ac7a3125017b92ed.js} +1 -1
- package/dist/src/web/nextui/_next/static/css/036bf4af64e53e86.css +1 -0
- package/dist/src/web/nextui/_next/static/css/e141e895af3747c6.css +1 -0
- package/dist/src/web/nextui/auth/login/index.html +1 -1
- package/dist/src/web/nextui/auth/login/index.txt +5 -5
- package/dist/src/web/nextui/auth/signup/index.html +1 -1
- package/dist/src/web/nextui/auth/signup/index.txt +5 -5
- package/dist/src/web/nextui/datasets/index.html +1 -1
- package/dist/src/web/nextui/datasets/index.txt +5 -5
- package/dist/src/web/nextui/eval/index.html +1 -1
- package/dist/src/web/nextui/eval/index.txt +7 -7
- package/dist/src/web/nextui/index.html +1 -1
- package/dist/src/web/nextui/index.txt +4 -4
- package/dist/src/web/nextui/progress/index.html +1 -1
- package/dist/src/web/nextui/progress/index.txt +5 -5
- package/dist/src/web/nextui/prompts/index.html +1 -1
- package/dist/src/web/nextui/prompts/index.txt +5 -5
- package/dist/src/web/nextui/report/index.html +1 -1
- package/dist/src/web/nextui/report/index.txt +5 -5
- package/dist/src/web/nextui/setup/index.html +2 -2
- package/dist/src/web/nextui/setup/index.txt +6 -6
- package/package.json +4 -3
- package/dist/src/web/nextui/_next/static/chunks/2-f562fcee36045aca.js +0 -1
- package/dist/src/web/nextui/_next/static/chunks/94-c07f30271fa4d8e4.js +0 -32
- package/dist/src/web/nextui/_next/static/chunks/954-c35d4864ecbacd62.js +0 -6
- package/dist/src/web/nextui/_next/static/chunks/app/eval/[id]/not-found-fe10d5df88bc44ef.js +0 -1
- package/dist/src/web/nextui/_next/static/chunks/app/eval/page-aef3aed32af8d4d7.js +0 -1
- package/dist/src/web/nextui/_next/static/chunks/app/progress/page-751105ef02d00993.js +0 -1
- package/dist/src/web/nextui/_next/static/css/451beaa5570cb9d3.css +0 -1
- package/dist/src/web/nextui/_next/static/css/e9f25719d0b14939.css +0 -1
- /package/dist/src/web/nextui/_next/static/{m-VSM7eKSuIZDyA_tnwFX → tUB-fEjoICDbTDdLhchKo}/_buildManifest.js +0 -0
- /package/dist/src/web/nextui/_next/static/{m-VSM7eKSuIZDyA_tnwFX → tUB-fEjoICDbTDdLhchKo}/_ssgManifest.js +0 -0
package/dist/src/util.d.ts
CHANGED
|
@@ -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
|
|
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
|
|
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
|
|
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
|
package/dist/src/util.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"util.d.ts","sourceRoot":"","sources":["../../src/util.ts"],"names":[],"mappings":"AASA,OAAO,QAAQ,MAAM,UAAU,CAAC;
|
|
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.
|
|
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
|
-
|
|
294
|
-
|
|
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.
|
|
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
|
-
|
|
842
|
-
return
|
|
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.
|
|
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(
|
|
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
|