promptfoo 0.5.0 → 0.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (77) hide show
  1. package/README.md +20 -248
  2. package/dist/__mocks__/esm.js +5 -1
  3. package/dist/__mocks__/esm.js.map +1 -1
  4. package/dist/assertions.d.ts +18 -0
  5. package/dist/assertions.d.ts.map +1 -0
  6. package/dist/assertions.js +128 -0
  7. package/dist/assertions.js.map +1 -0
  8. package/dist/esm.d.ts.map +1 -1
  9. package/dist/esm.js +10 -3
  10. package/dist/esm.js.map +1 -1
  11. package/dist/evaluator.d.ts.map +1 -1
  12. package/dist/evaluator.js +88 -117
  13. package/dist/evaluator.js.map +1 -1
  14. package/dist/index.d.ts +13 -0
  15. package/dist/index.d.ts.map +1 -1
  16. package/dist/index.js +34 -5
  17. package/dist/index.js.map +1 -1
  18. package/dist/logger.js +18 -11
  19. package/dist/logger.js.map +1 -1
  20. package/dist/main.js +95 -53
  21. package/dist/main.js.map +1 -1
  22. package/dist/prompts.d.ts +4 -0
  23. package/dist/prompts.d.ts.map +1 -1
  24. package/dist/prompts.js +12 -1
  25. package/dist/prompts.js.map +1 -1
  26. package/dist/providers/localai.js +21 -13
  27. package/dist/providers/localai.js.map +1 -1
  28. package/dist/providers/openai.d.ts +10 -5
  29. package/dist/providers/openai.d.ts.map +1 -1
  30. package/dist/providers/openai.js +44 -32
  31. package/dist/providers/openai.js.map +1 -1
  32. package/dist/providers/shared.d.ts.map +1 -1
  33. package/dist/providers/shared.js +5 -2
  34. package/dist/providers/shared.js.map +1 -1
  35. package/dist/providers.d.ts +10 -0
  36. package/dist/providers.d.ts.map +1 -1
  37. package/dist/providers.js +51 -14
  38. package/dist/providers.js.map +1 -1
  39. package/dist/suggestions.d.ts +9 -0
  40. package/dist/suggestions.d.ts.map +1 -0
  41. package/dist/suggestions.js +54 -0
  42. package/dist/suggestions.js.map +1 -0
  43. package/dist/types.d.ts +11 -2
  44. package/dist/types.d.ts.map +1 -1
  45. package/dist/types.js +2 -1
  46. package/dist/util.d.ts +1 -1
  47. package/dist/util.d.ts.map +1 -1
  48. package/dist/util.js +86 -31
  49. package/dist/util.js.map +1 -1
  50. package/dist/web/client/assets/index-207192fc.css +1 -0
  51. package/dist/web/client/assets/index-8751749f.js +172 -0
  52. package/dist/web/client/index.html +2 -2
  53. package/dist/web/server.js +38 -31
  54. package/dist/web/server.js.map +1 -1
  55. package/package.json +14 -4
  56. package/src/assertions.ts +154 -0
  57. package/src/esm.ts +5 -2
  58. package/src/evaluator.ts +61 -139
  59. package/src/index.ts +12 -0
  60. package/src/main.ts +28 -3
  61. package/src/prompts.ts +9 -0
  62. package/src/providers/openai.ts +28 -15
  63. package/src/providers/shared.ts +1 -1
  64. package/src/providers.ts +8 -0
  65. package/src/suggestions.ts +63 -0
  66. package/src/types.ts +14 -2
  67. package/src/util.ts +24 -3
  68. package/src/web/client/package.json +1 -0
  69. package/src/web/client/src/App.css +4 -0
  70. package/src/web/client/src/App.tsx +29 -5
  71. package/src/web/client/src/Logo.css +5 -0
  72. package/src/web/client/src/NavBar.css +18 -0
  73. package/src/web/client/src/NavBar.tsx +12 -1
  74. package/src/web/client/src/index.css +10 -0
  75. package/src/web/server.ts +2 -2
  76. package/dist/web/client/assets/index-710f1308.css +0 -1
  77. package/dist/web/client/assets/index-900b20c0.js +0 -172
package/dist/util.js CHANGED
@@ -1,14 +1,44 @@
1
- import * as fs from 'fs';
2
- import * as path from 'node:path';
3
- import * as os from 'node:os';
4
- import fetch from 'node-fetch';
5
- import yaml from 'js-yaml';
6
- import nunjucks from 'nunjucks';
7
- import { parse as parsePath } from 'path';
8
- import { parse as parseCsv } from 'csv-parse/sync';
9
- import { stringify } from 'csv-stringify/sync';
10
- import logger from './logger.js';
11
- import { getDirectory } from './esm.js';
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || function (mod) {
19
+ if (mod && mod.__esModule) return mod;
20
+ var result = {};
21
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22
+ __setModuleDefault(result, mod);
23
+ return result;
24
+ };
25
+ var __importDefault = (this && this.__importDefault) || function (mod) {
26
+ return (mod && mod.__esModule) ? mod : { "default": mod };
27
+ };
28
+ Object.defineProperty(exports, "__esModule", { value: true });
29
+ exports.cosineSimilarity = exports.writeLatestResults = exports.getLatestResultsPath = exports.getConfigDirectoryPath = exports.fetchWithTimeout = exports.writeOutput = exports.readVars = exports.readPrompts = void 0;
30
+ const fs = __importStar(require("fs"));
31
+ const path = __importStar(require("node:path"));
32
+ const os = __importStar(require("node:os"));
33
+ const node_fetch_1 = __importDefault(require("node-fetch"));
34
+ const js_yaml_1 = __importDefault(require("js-yaml"));
35
+ const nunjucks_1 = __importDefault(require("nunjucks"));
36
+ const glob_1 = require("glob");
37
+ const path_1 = require("path");
38
+ const sync_1 = require("csv-parse/sync");
39
+ const sync_2 = require("csv-stringify/sync");
40
+ const logger_js_1 = __importDefault(require("./logger.js"));
41
+ const esm_js_1 = require("./esm.js");
12
42
  const PROMPT_DELIMITER = '---';
13
43
  function parseJson(json) {
14
44
  try {
@@ -18,31 +48,46 @@ function parseJson(json) {
18
48
  return undefined;
19
49
  }
20
50
  }
21
- export function readPrompts(promptPaths) {
22
- let promptContents = promptPaths.map((path) => fs.readFileSync(path, 'utf-8'));
51
+ function readPrompts(promptPathsOrGlobs) {
52
+ const promptPaths = promptPathsOrGlobs.flatMap((pathOrGlob) => (0, glob_1.globSync)(pathOrGlob));
53
+ let promptContents = [];
54
+ for (const promptPath of promptPaths) {
55
+ const stat = fs.statSync(promptPath);
56
+ if (stat.isDirectory()) {
57
+ const filesInDirectory = fs.readdirSync(promptPath);
58
+ const fileContents = filesInDirectory.map((fileName) => fs.readFileSync(path.join(promptPath, fileName), 'utf-8'));
59
+ promptContents.push(...fileContents);
60
+ }
61
+ else {
62
+ const fileContent = fs.readFileSync(promptPath, 'utf-8');
63
+ promptContents.push(fileContent);
64
+ }
65
+ }
23
66
  if (promptContents.length === 1) {
24
67
  promptContents = promptContents[0].split(PROMPT_DELIMITER).map((p) => p.trim());
25
68
  }
26
69
  return promptContents;
27
70
  }
28
- export function readVars(varsPath) {
29
- const fileExtension = parsePath(varsPath).ext.slice(1);
71
+ exports.readPrompts = readPrompts;
72
+ function readVars(varsPath) {
73
+ const fileExtension = (0, path_1.parse)(varsPath).ext.slice(1);
30
74
  let rows = [];
31
75
  if (fileExtension === 'csv') {
32
- rows = parseCsv(fs.readFileSync(varsPath, 'utf-8'), { columns: true });
76
+ rows = (0, sync_1.parse)(fs.readFileSync(varsPath, 'utf-8'), { columns: true });
33
77
  }
34
78
  else if (fileExtension === 'json') {
35
79
  rows = parseJson(fs.readFileSync(varsPath, 'utf-8'));
36
80
  }
37
81
  else if (fileExtension === 'yaml' || fileExtension === 'yml') {
38
- rows = yaml.load(fs.readFileSync(varsPath, 'utf-8'));
82
+ rows = js_yaml_1.default.load(fs.readFileSync(varsPath, 'utf-8'));
39
83
  }
40
84
  return rows;
41
85
  }
42
- export function writeOutput(outputPath, summary) {
86
+ exports.readVars = readVars;
87
+ function writeOutput(outputPath, summary) {
43
88
  const outputExtension = outputPath.split('.').pop()?.toLowerCase();
44
89
  if (outputExtension === 'csv' || outputExtension === 'txt') {
45
- const csvOutput = stringify([
90
+ const csvOutput = (0, sync_2.stringify)([
46
91
  [...summary.table.head.prompts, ...summary.table.head.vars],
47
92
  ...summary.table.body.map((row) => [...row.outputs, ...row.vars]),
48
93
  ]);
@@ -52,12 +97,16 @@ export function writeOutput(outputPath, summary) {
52
97
  fs.writeFileSync(outputPath, JSON.stringify(summary, null, 2));
53
98
  }
54
99
  else if (outputExtension === 'yaml' || outputExtension === 'yml') {
55
- fs.writeFileSync(outputPath, yaml.dump(summary));
100
+ fs.writeFileSync(outputPath, js_yaml_1.default.dump(summary));
56
101
  }
57
102
  else if (outputExtension === 'html') {
58
- const template = fs.readFileSync(`${getDirectory()}/tableOutput.html`, 'utf-8');
59
- const htmlOutput = nunjucks.renderString(template, {
60
- table: summary.table,
103
+ const template = fs.readFileSync(`${(0, esm_js_1.getDirectory)()}/tableOutput.html`, 'utf-8');
104
+ const table = [
105
+ [...summary.table.head.prompts, ...summary.table.head.vars],
106
+ ...summary.table.body.map((row) => [...row.outputs, ...row.vars]),
107
+ ];
108
+ const htmlOutput = nunjucks_1.default.renderString(template, {
109
+ table,
61
110
  results: summary.results,
62
111
  });
63
112
  fs.writeFileSync(outputPath, htmlOutput);
@@ -66,7 +115,8 @@ export function writeOutput(outputPath, summary) {
66
115
  throw new Error('Unsupported output file format. Use CSV, JSON, or YAML.');
67
116
  }
68
117
  }
69
- export function fetchWithTimeout(url, options = {}, timeout) {
118
+ exports.writeOutput = writeOutput;
119
+ function fetchWithTimeout(url, options = {}, timeout) {
70
120
  return new Promise(async (resolve, reject) => {
71
121
  const controller = new AbortController();
72
122
  const { signal } = controller;
@@ -76,7 +126,7 @@ export function fetchWithTimeout(url, options = {}, timeout) {
76
126
  reject(new Error(`Request timed out after ${timeout} ms`));
77
127
  }, timeout);
78
128
  try {
79
- const response = await fetch(url, options);
129
+ const response = await (0, node_fetch_1.default)(url, options);
80
130
  clearTimeout(timeoutId);
81
131
  resolve(response);
82
132
  }
@@ -91,24 +141,28 @@ export function fetchWithTimeout(url, options = {}, timeout) {
91
141
  }
92
142
  });
93
143
  }
94
- export function getConfigDirectoryPath() {
144
+ exports.fetchWithTimeout = fetchWithTimeout;
145
+ function getConfigDirectoryPath() {
95
146
  return path.join(os.homedir(), '.promptfoo');
96
147
  }
97
- export function getLatestResultsPath() {
148
+ exports.getConfigDirectoryPath = getConfigDirectoryPath;
149
+ function getLatestResultsPath() {
98
150
  return path.join(getConfigDirectoryPath(), 'output', 'latest.json');
99
151
  }
100
- export function writeLatestResults(results) {
152
+ exports.getLatestResultsPath = getLatestResultsPath;
153
+ function writeLatestResults(results) {
101
154
  const latestResultsPath = getLatestResultsPath();
102
155
  try {
103
156
  fs.mkdirSync(path.dirname(latestResultsPath), { recursive: true });
104
157
  fs.writeFileSync(latestResultsPath, JSON.stringify(results, null, 2));
105
- logger.info(`Wrote latest results to ${latestResultsPath}.`);
158
+ logger_js_1.default.info(`Wrote latest results to ${latestResultsPath}.`);
106
159
  }
107
160
  catch (err) {
108
- logger.error(`Failed to write latest results to ${latestResultsPath}:\n${err}`);
161
+ logger_js_1.default.error(`Failed to write latest results to ${latestResultsPath}:\n${err}`);
109
162
  }
110
163
  }
111
- export function cosineSimilarity(vecA, vecB) {
164
+ exports.writeLatestResults = writeLatestResults;
165
+ function cosineSimilarity(vecA, vecB) {
112
166
  if (vecA.length !== vecB.length) {
113
167
  throw new Error('Vectors must be of equal length');
114
168
  }
@@ -117,4 +171,5 @@ export function cosineSimilarity(vecA, vecB) {
117
171
  const vecBMagnitude = Math.sqrt(vecB.reduce((acc, val) => acc + val * val, 0));
118
172
  return dotProduct / (vecAMagnitude * vecBMagnitude);
119
173
  }
174
+ exports.cosineSimilarity = cosineSimilarity;
120
175
  //# sourceMappingURL=util.js.map
package/dist/util.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"util.js","sourceRoot":"","sources":["../src/util.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"util.js","sourceRoot":"","sources":["../src/util.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ :root{font-family:system-ui,Avenir,Helvetica,Arial,sans-serif;font-synthesis:none;text-rendering:optimizeLegibility;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;-webkit-text-size-adjust:100%;--background-color: #ffffff;--text-color: #404040;--border-color: lightgray;--table-border-color: lightgray;--pass-color: green;--fail-color: #ad0000;--smalltext-color: gray}@media (prefers-color-scheme: dark){:root{--background-color: #1a1a1a;--text-color: #f0f0f0;--border-color: #444444;--table-border-color: #444444;--pass-color: #4caf50;--fail-color: #f44336;--smalltext-color: #888888}}[data-theme=dark]{--background-color: #1a1a1a;--text-color: #f0f0f0;--border-color: #444444;--table-border-color: #444444;--pass-color: #4caf50;--fail-color: #f44336;--smalltext-color: #888888}html{font-size:calc(14px + (18 - 14) * ((100vw - 300px) / (1600 - 300)))}*{box-sizing:border-box}html{font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji",Segoe UI Symbol;font-size:16px;background-color:var(--background-color);color:var(--text-color)}table,.divTable{border:1px solid var(--table-border-color);border-collapse:collapse;width:100%;margin:1rem 0;box-shadow:0 2px 4px #0000001a}.tr{display:flex}tr,.tr{width:fit-content}tr:hover,.tr:hover{background-color:#0000000d}th,.th,td,.td{position:relative;box-shadow:inset 0 0 0 1px var(--border-color);word-break:break-all;vertical-align:top;padding:1.5rem}th,.th{padding:1rem;position:relative;text-align:center;font-weight:semi-bold}tr .cell-rating{visibility:hidden;position:absolute;bottom:1.25rem;right:-1rem;line-height:0;font-size:1.75rem}tr:hover .cell-rating{visibility:visible}tr .cell-rating .rating{cursor:pointer;margin-right:1rem}th .smalltext{visibility:hidden;font-weight:400;font-size:.75rem;color:var(--smalltext-color)}th:hover .smalltext{visibility:visible}td .status{margin-bottom:.5rem;font-weight:700}td .pass{color:var(--pass-color)}td .fail{color:var(--fail-color)}.resizer{position:absolute;right:0;top:0;height:100%;width:5px;cursor:col-resize;user-select:none;touch-action:none;background:var(--text-color);opacity:.5}.resizer.isResizing{background:var(--text-color);opacity:1}@media (hover: hover){.resizer{opacity:0}*:hover>.resizer{opacity:1}}.logo{display:flex;align-items:center;gap:4px}.logo img{width:30px}.logo span{margin-bottom:6px;color:var(--text-color)}[data-theme=dark] .logo img{filter:invert(1)}nav{display:flex;justify-content:space-between;align-items:center;margin-bottom:1rem;color:var(--text-color)}.dark-mode-toggle{background-color:transparent;border:none;color:var(--text-color);cursor:pointer;font-size:16px;padding:8px;transition:color .3s}.dark-mode-toggle:hover{color:var(--pass-color)}body{background-color:var(--background-color);color:var(--text-color)}