promptfoo 0.17.2 → 0.17.4

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 (49) hide show
  1. package/README.md +2 -2
  2. package/dist/package.json +2 -1
  3. package/dist/src/cache.js +5 -5
  4. package/dist/src/cache.js.map +1 -1
  5. package/dist/src/evaluator.js +2 -2
  6. package/dist/src/evaluator.js.map +1 -1
  7. package/dist/src/index.d.ts +1 -0
  8. package/dist/src/index.d.ts.map +1 -1
  9. package/dist/src/index.js +1 -0
  10. package/dist/src/index.js.map +1 -1
  11. package/dist/src/main.js +10 -5
  12. package/dist/src/main.js.map +1 -1
  13. package/dist/src/onboarding.d.ts +2 -2
  14. package/dist/src/onboarding.d.ts.map +1 -1
  15. package/dist/src/onboarding.js +8 -6
  16. package/dist/src/onboarding.js.map +1 -1
  17. package/dist/src/providers/anthropic.d.ts +20 -0
  18. package/dist/src/providers/anthropic.d.ts.map +1 -0
  19. package/dist/src/providers/anthropic.js +75 -0
  20. package/dist/src/providers/anthropic.js.map +1 -0
  21. package/dist/src/providers.d.ts +2 -0
  22. package/dist/src/providers.d.ts.map +1 -1
  23. package/dist/src/providers.js +19 -2
  24. package/dist/src/providers.js.map +1 -1
  25. package/dist/src/table.js +1 -1
  26. package/dist/src/table.js.map +1 -1
  27. package/dist/src/telemetry.d.ts +1 -0
  28. package/dist/src/telemetry.d.ts.map +1 -1
  29. package/dist/src/telemetry.js +7 -0
  30. package/dist/src/telemetry.js.map +1 -1
  31. package/dist/src/updates.d.ts.map +1 -1
  32. package/dist/src/updates.js +7 -1
  33. package/dist/src/updates.js.map +1 -1
  34. package/dist/src/util.d.ts +3 -0
  35. package/dist/src/util.d.ts.map +1 -1
  36. package/dist/src/util.js +42 -3
  37. package/dist/src/util.js.map +1 -1
  38. package/package.json +2 -1
  39. package/src/cache.ts +2 -2
  40. package/src/evaluator.ts +1 -1
  41. package/src/index.ts +1 -0
  42. package/src/main.ts +12 -5
  43. package/src/onboarding.ts +8 -6
  44. package/src/providers/anthropic.ts +88 -0
  45. package/src/providers.ts +22 -1
  46. package/src/table.ts +1 -1
  47. package/src/telemetry.ts +14 -1
  48. package/src/updates.ts +6 -1
  49. package/src/util.ts +42 -2
@@ -4,7 +4,9 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
6
  exports.Telemetry = void 0;
7
+ const chalk_1 = __importDefault(require("chalk"));
7
8
  const package_json_1 = __importDefault(require("../package.json"));
9
+ const logger_1 = __importDefault(require("./logger"));
8
10
  const util_1 = require("./util");
9
11
  const TELEMETRY_ENDPOINT = 'https://api.promptfoo.dev/telemetry';
10
12
  const TELEMETRY_TIMEOUT_MS = 1000;
@@ -24,6 +26,11 @@ class Telemetry {
24
26
  });
25
27
  }
26
28
  }
29
+ maybeShowNotice() {
30
+ if ((0, util_1.maybeRecordFirstRun)()) {
31
+ logger_1.default.info(chalk_1.default.gray('Anonymous telemetry is enabled. For more info, see https://www.promptfoo.dev/docs/configuration/telemetry'));
32
+ }
33
+ }
27
34
  async send() {
28
35
  if (!this.disabled && this.events.length > 0) {
29
36
  try {
@@ -1 +1 @@
1
- {"version":3,"file":"telemetry.js","sourceRoot":"","sources":["../../src/telemetry.ts"],"names":[],"mappings":";;;;;;AAAA,mEAA0C;AAC1C,iCAA0C;AAU1C,MAAM,kBAAkB,GAAG,qCAAqC,CAAC;AAEjE,MAAM,oBAAoB,GAAG,IAAI,CAAC;AAElC,MAAa,SAAS;IAAtB;QACU,WAAM,GAAqB,EAAE,CAAC;IAqCxC,CAAC;IAnCC,IAAI,QAAQ;QACV,OAAO,OAAO,CAAC,GAAG,CAAC,2BAA2B,KAAK,GAAG,CAAC;IACzD,CAAC;IAED,MAAM,CAAC,SAA8B,EAAE,UAA2C;QAChF,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE;YAClB,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC;gBACf,KAAK,EAAE,SAAS;gBAChB,cAAc,EAAE,sBAAW,CAAC,OAAO;gBACnC,UAAU;aACX,CAAC,CAAC;SACJ;IACH,CAAC;IAED,KAAK,CAAC,IAAI;QACR,IAAI,CAAC,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE;YAC5C,IAAI;gBACF,MAAM,QAAQ,GAAG,MAAM,IAAA,uBAAgB,EACrC,kBAAkB,EAClB;oBACE,MAAM,EAAE,MAAM;oBACd,OAAO,EAAE;wBACP,cAAc,EAAE,kBAAkB;qBACnC;oBACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC;iBAClC,EACD,oBAAoB,CACrB,CAAC;gBAEF,IAAI,QAAQ,CAAC,EAAE,EAAE;oBACf,IAAI,CAAC,MAAM,GAAG,EAAE,CAAC;iBAClB;aACF;YAAC,OAAO,GAAG,EAAE,GAAE;SACjB;IACH,CAAC;CACF;AAtCD,8BAsCC;AAED,MAAM,SAAS,GAAG,IAAI,SAAS,EAAE,CAAC;AAClC,kBAAe,SAAS,CAAC"}
1
+ {"version":3,"file":"telemetry.js","sourceRoot":"","sources":["../../src/telemetry.ts"],"names":[],"mappings":";;;;;;AAAA,kDAA0B;AAE1B,mEAA0C;AAC1C,sDAA8B;AAC9B,iCAA+D;AAU/D,MAAM,kBAAkB,GAAG,qCAAqC,CAAC;AAEjE,MAAM,oBAAoB,GAAG,IAAI,CAAC;AAElC,MAAa,SAAS;IAAtB;QACU,WAAM,GAAqB,EAAE,CAAC;IA+CxC,CAAC;IA7CC,IAAI,QAAQ;QACV,OAAO,OAAO,CAAC,GAAG,CAAC,2BAA2B,KAAK,GAAG,CAAC;IACzD,CAAC;IAED,MAAM,CAAC,SAA8B,EAAE,UAA2C;QAChF,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE;YAClB,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC;gBACf,KAAK,EAAE,SAAS;gBAChB,cAAc,EAAE,sBAAW,CAAC,OAAO;gBACnC,UAAU;aACX,CAAC,CAAC;SACJ;IACH,CAAC;IAED,eAAe;QACb,IAAI,IAAA,0BAAmB,GAAE,EAAE;YACzB,gBAAM,CAAC,IAAI,CACT,eAAK,CAAC,IAAI,CACR,2GAA2G,CAC5G,CACF,CAAC;SACH;IACH,CAAC;IAED,KAAK,CAAC,IAAI;QACR,IAAI,CAAC,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE;YAC5C,IAAI;gBACF,MAAM,QAAQ,GAAG,MAAM,IAAA,uBAAgB,EACrC,kBAAkB,EAClB;oBACE,MAAM,EAAE,MAAM;oBACd,OAAO,EAAE;wBACP,cAAc,EAAE,kBAAkB;qBACnC;oBACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC;iBAClC,EACD,oBAAoB,CACrB,CAAC;gBAEF,IAAI,QAAQ,CAAC,EAAE,EAAE;oBACf,IAAI,CAAC,MAAM,GAAG,EAAE,CAAC;iBAClB;aACF;YAAC,OAAO,GAAG,EAAE,GAAE;SACjB;IACH,CAAC;CACF;AAhDD,8BAgDC;AAED,MAAM,SAAS,GAAG,IAAI,SAAS,EAAE,CAAC;AAClC,kBAAe,SAAS,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"updates.d.ts","sourceRoot":"","sources":["../../src/updates.ts"],"names":[],"mappings":"AASA,wBAAsB,gBAAgB,CAAC,WAAW,EAAE,MAAM,gBAOzD;AAED,wBAAsB,eAAe,IAAI,OAAO,CAAC,OAAO,CAAC,CAkBxD"}
1
+ {"version":3,"file":"updates.d.ts","sourceRoot":"","sources":["../../src/updates.ts"],"names":[],"mappings":"AASA,wBAAsB,gBAAgB,CAAC,WAAW,EAAE,MAAM,gBAOzD;AAED,wBAAsB,eAAe,IAAI,OAAO,CAAC,OAAO,CAAC,CAuBxD"}
@@ -20,7 +20,13 @@ async function getLatestVersion(packageName) {
20
20
  }
21
21
  exports.getLatestVersion = getLatestVersion;
22
22
  async function checkForUpdates() {
23
- const latestVersion = await getLatestVersion('promptfoo');
23
+ let latestVersion;
24
+ try {
25
+ latestVersion = await getLatestVersion('promptfoo');
26
+ }
27
+ catch {
28
+ return false;
29
+ }
24
30
  if ((0, gt_1.default)(latestVersion, VERSION)) {
25
31
  const border = '='.repeat(process.stdout.columns - 10);
26
32
  logger_1.default.info(`\n${border}
@@ -1 +1 @@
1
- {"version":3,"file":"updates.js","sourceRoot":"","sources":["../../src/updates.ts"],"names":[],"mappings":";;;;;;AAAA,kDAA0B;AAC1B,6DAA2C;AAE3C,sDAA8B;AAC9B,iCAA0C;AAC1C,mEAA0C;AAE1C,MAAM,OAAO,GAAG,sBAAW,CAAC,OAAO,CAAC;AAE7B,KAAK,UAAU,gBAAgB,CAAC,WAAmB;IACxD,MAAM,QAAQ,GAAG,MAAM,IAAA,uBAAgB,EAAC,8BAA8B,WAAW,EAAE,EAAE,EAAE,EAAE,IAAI,CAAC,CAAC;IAC/F,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE;QAChB,MAAM,IAAI,KAAK,CAAC,2CAA2C,WAAW,EAAE,CAAC,CAAC;KAC3E;IACD,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;IACnC,OAAO,IAAI,CAAC,WAAW,CAAC,CAAC,MAAM,CAAC;AAClC,CAAC;AAPD,4CAOC;AAEM,KAAK,UAAU,eAAe;IACnC,MAAM,aAAa,GAAG,MAAM,gBAAgB,CAAC,WAAW,CAAC,CAAC;IAC1D,IAAI,IAAA,YAAQ,EAAC,aAAa,EAAE,OAAO,CAAC,EAAE;QACpC,MAAM,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,GAAG,EAAE,CAAC,CAAC;QACvD,gBAAM,CAAC,IAAI,CACT,KAAK,MAAM;EACf,eAAK,CAAC,MAAM,CAAC,IAAI,CAAC,qCAAqC,eAAK,CAAC,MAAM,CAC7D,OAAO,CACR,+CAA+C,eAAK,CAAC,KAAK,CAAC,aAAa,CAAC;;aAEnE,eAAK,CAAC,KAAK,CAAC,sBAAsB,CAAC,OAAO,eAAK,CAAC,KAAK,CAC1D,iCAAiC,CAClC;EACL,MAAM,IAAI,CACP,CAAC;QACF,OAAO,IAAI,CAAC;KACb;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAlBD,0CAkBC"}
1
+ {"version":3,"file":"updates.js","sourceRoot":"","sources":["../../src/updates.ts"],"names":[],"mappings":";;;;;;AAAA,kDAA0B;AAC1B,6DAA2C;AAE3C,sDAA8B;AAC9B,iCAA0C;AAC1C,mEAA0C;AAE1C,MAAM,OAAO,GAAG,sBAAW,CAAC,OAAO,CAAC;AAE7B,KAAK,UAAU,gBAAgB,CAAC,WAAmB;IACxD,MAAM,QAAQ,GAAG,MAAM,IAAA,uBAAgB,EAAC,8BAA8B,WAAW,EAAE,EAAE,EAAE,EAAE,IAAI,CAAC,CAAC;IAC/F,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE;QAChB,MAAM,IAAI,KAAK,CAAC,2CAA2C,WAAW,EAAE,CAAC,CAAC;KAC3E;IACD,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;IACnC,OAAO,IAAI,CAAC,WAAW,CAAC,CAAC,MAAM,CAAC;AAClC,CAAC;AAPD,4CAOC;AAEM,KAAK,UAAU,eAAe;IACnC,IAAI,aAAqB,CAAC;IAC1B,IAAI;QACF,aAAa,GAAG,MAAM,gBAAgB,CAAC,WAAW,CAAC,CAAC;KACrD;IAAC,MAAM;QACN,OAAO,KAAK,CAAC;KACd;IACD,IAAI,IAAA,YAAQ,EAAC,aAAa,EAAE,OAAO,CAAC,EAAE;QACpC,MAAM,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,GAAG,EAAE,CAAC,CAAC;QACvD,gBAAM,CAAC,IAAI,CACT,KAAK,MAAM;EACf,eAAK,CAAC,MAAM,CAAC,IAAI,CAAC,qCAAqC,eAAK,CAAC,MAAM,CAC7D,OAAO,CACR,+CAA+C,eAAK,CAAC,KAAK,CAAC,aAAa,CAAC;;aAEnE,eAAK,CAAC,KAAK,CAAC,sBAAsB,CAAC,OAAO,eAAK,CAAC,KAAK,CAC1D,iCAAiC,CAClC;EACL,MAAM,IAAI,CACP,CAAC;QACF,OAAO,IAAI,CAAC;KACb;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAvBD,0CAuBC"}
@@ -1,5 +1,8 @@
1
1
  import type { RequestInfo, RequestInit, Response } from 'node-fetch';
2
2
  import type { CsvRow, EvaluateSummary, UnifiedConfig, TestCase, Prompt } from './types';
3
+ export declare function resetGlobalConfig(): void;
4
+ export declare function readGlobalConfig(): any;
5
+ export declare function maybeRecordFirstRun(): boolean;
3
6
  export declare function maybeReadConfig(configPath: string): Promise<UnifiedConfig | undefined>;
4
7
  export declare function readConfig(configPath: string): Promise<UnifiedConfig>;
5
8
  export declare function readPrompts(promptPathOrGlobs: string | string[] | Record<string, string>, basePath?: string): Prompt[];
@@ -1 +1 @@
1
- {"version":3,"file":"util.d.ts","sourceRoot":"","sources":["../../src/util.ts"],"names":[],"mappings":"AAiBA,OAAO,KAAK,EAAE,WAAW,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAErE,OAAO,KAAK,EAEV,MAAM,EACN,eAAe,EAEf,aAAa,EACb,QAAQ,EACR,MAAM,EACP,MAAM,SAAS,CAAC;AAYjB,wBAAsB,eAAe,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,GAAG,SAAS,CAAC,CAK5F;AAED,wBAAsB,UAAU,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC,CAgB3E;AAQD,wBAAgB,WAAW,CACzB,iBAAiB,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAC7D,QAAQ,GAAE,MAAW,GACpB,MAAM,EAAE,CAyEV;AAED,wBAAsB,uBAAuB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAQ1E;AAED,wBAAsB,QAAQ,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,GAAE,MAAW,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAmBzF;AAED,wBAAsB,SAAS,CAC7B,KAAK,EAAE,MAAM,GAAG,QAAQ,EAAE,GAAG,SAAS,EACtC,QAAQ,GAAE,MAAW,GACpB,OAAO,CAAC,QAAQ,EAAE,CAAC,CA6BrB;AAED,wBAAgB,WAAW,CACzB,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE,eAAe,EACxB,MAAM,EAAE,OAAO,CAAC,aAAa,CAAC,EAC9B,YAAY,EAAE,MAAM,GAAG,IAAI,GAC1B,IAAI,CA8BN;AAED,wBAAsB,gBAAgB,CACpC,GAAG,EAAE,WAAW,EAChB,OAAO,yBAAkB,EACzB,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,QAAQ,CAAC,CAkBnB;AAED,wBAAsB,gBAAgB,CACpC,GAAG,EAAE,WAAW,EAChB,OAAO,yBAAkB,EACzB,OAAO,EAAE,MAAM,EACf,OAAO,GAAE,MAAU,GAClB,OAAO,CAAC,QAAQ,CAAC,CAYnB;AAED,wBAAgB,sBAAsB,IAAI,MAAM,CAE/C;AAED,wBAAgB,oBAAoB,IAAI,MAAM,CAE7C;AAED,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,eAAe,EAAE,MAAM,EAAE,OAAO,CAAC,aAAa,CAAC,QAmB1F;AAED,wBAAgB,iBAAiB,IAC7B;IAAE,OAAO,EAAE,eAAe,CAAC;IAAC,MAAM,EAAE,OAAO,CAAC,aAAa,CAAC,CAAA;CAAE,GAC5D,SAAS,CAQZ;AAED,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,UAQ9D;AAED,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,MAAM,GAAG,QAAQ,CAiBxD"}
1
+ {"version":3,"file":"util.d.ts","sourceRoot":"","sources":["../../src/util.ts"],"names":[],"mappings":"AAiBA,OAAO,KAAK,EAAE,WAAW,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAErE,OAAO,KAAK,EAEV,MAAM,EACN,eAAe,EAEf,aAAa,EACb,QAAQ,EACR,MAAM,EACP,MAAM,SAAS,CAAC;AAcjB,wBAAgB,iBAAiB,IAAI,IAAI,CAExC;AAED,wBAAgB,gBAAgB,IAAI,GAAG,CAiBtC;AAED,wBAAgB,mBAAmB,IAAI,OAAO,CAa7C;AAED,wBAAsB,eAAe,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,GAAG,SAAS,CAAC,CAK5F;AAED,wBAAsB,UAAU,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC,CAgB3E;AAQD,wBAAgB,WAAW,CACzB,iBAAiB,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAC7D,QAAQ,GAAE,MAAW,GACpB,MAAM,EAAE,CAyEV;AAED,wBAAsB,uBAAuB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAQ1E;AAED,wBAAsB,QAAQ,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,GAAE,MAAW,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAmBzF;AAED,wBAAsB,SAAS,CAC7B,KAAK,EAAE,MAAM,GAAG,QAAQ,EAAE,GAAG,SAAS,EACtC,QAAQ,GAAE,MAAW,GACpB,OAAO,CAAC,QAAQ,EAAE,CAAC,CA6BrB;AAED,wBAAgB,WAAW,CACzB,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE,eAAe,EACxB,MAAM,EAAE,OAAO,CAAC,aAAa,CAAC,EAC9B,YAAY,EAAE,MAAM,GAAG,IAAI,GAC1B,IAAI,CA8BN;AAED,wBAAsB,gBAAgB,CACpC,GAAG,EAAE,WAAW,EAChB,OAAO,yBAAkB,EACzB,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,QAAQ,CAAC,CAkBnB;AAED,wBAAsB,gBAAgB,CACpC,GAAG,EAAE,WAAW,EAChB,OAAO,yBAAkB,EACzB,OAAO,EAAE,MAAM,EACf,OAAO,GAAE,MAAU,GAClB,OAAO,CAAC,QAAQ,CAAC,CAYnB;AAED,wBAAgB,sBAAsB,IAAI,MAAM,CAE/C;AAED,wBAAgB,oBAAoB,IAAI,MAAM,CAE7C;AAED,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,eAAe,EAAE,MAAM,EAAE,OAAO,CAAC,aAAa,CAAC,QAmB1F;AAED,wBAAgB,iBAAiB,IAC7B;IAAE,OAAO,EAAE,eAAe,CAAC;IAAC,MAAM,EAAE,OAAO,CAAC,aAAa,CAAC,CAAA;CAAE,GAC5D,SAAS,CAQZ;AAED,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,UAQ9D;AAED,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,MAAM,GAAG,QAAQ,CAiBxD"}
package/dist/src/util.js CHANGED
@@ -26,10 +26,10 @@ 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.testCaseFromCsvRow = exports.cosineSimilarity = exports.readLatestResults = exports.writeLatestResults = exports.getLatestResultsPath = exports.getConfigDirectoryPath = exports.fetchWithRetries = exports.fetchWithTimeout = exports.writeOutput = exports.readTests = exports.readVars = exports.fetchCsvFromGoogleSheet = exports.readPrompts = exports.readConfig = exports.maybeReadConfig = void 0;
29
+ exports.testCaseFromCsvRow = exports.cosineSimilarity = exports.readLatestResults = exports.writeLatestResults = exports.getLatestResultsPath = exports.getConfigDirectoryPath = exports.fetchWithRetries = exports.fetchWithTimeout = exports.writeOutput = exports.readTests = exports.readVars = exports.fetchCsvFromGoogleSheet = exports.readPrompts = exports.readConfig = exports.maybeReadConfig = exports.maybeRecordFirstRun = exports.readGlobalConfig = exports.resetGlobalConfig = void 0;
30
30
  const fs = __importStar(require("fs"));
31
- const path = __importStar(require("node:path"));
32
- const os = __importStar(require("node:os"));
31
+ const path = __importStar(require("path"));
32
+ const os = __importStar(require("os"));
33
33
  const json_schema_ref_parser_1 = __importDefault(require("@apidevtools/json-schema-ref-parser"));
34
34
  const node_fetch_1 = __importDefault(require("node-fetch"));
35
35
  const js_yaml_1 = __importDefault(require("js-yaml"));
@@ -50,6 +50,45 @@ function parseJson(json) {
50
50
  return undefined;
51
51
  }
52
52
  }
53
+ let globalConfigCache = null;
54
+ function resetGlobalConfig() {
55
+ globalConfigCache = null;
56
+ }
57
+ exports.resetGlobalConfig = resetGlobalConfig;
58
+ function readGlobalConfig() {
59
+ if (!globalConfigCache) {
60
+ const configDir = getConfigDirectoryPath();
61
+ const configFilePath = path.join(configDir, 'promptfoo.yaml');
62
+ if (fs.existsSync(configFilePath)) {
63
+ globalConfigCache = js_yaml_1.default.load(fs.readFileSync(configFilePath, 'utf-8'));
64
+ }
65
+ else {
66
+ if (!fs.existsSync(configDir)) {
67
+ fs.mkdirSync(configDir, { recursive: true });
68
+ }
69
+ globalConfigCache = { hasRun: false };
70
+ fs.writeFileSync(configFilePath, js_yaml_1.default.dump(globalConfigCache));
71
+ }
72
+ }
73
+ return globalConfigCache;
74
+ }
75
+ exports.readGlobalConfig = readGlobalConfig;
76
+ function maybeRecordFirstRun() {
77
+ // Return true if first run
78
+ try {
79
+ const config = readGlobalConfig();
80
+ if (!config.hasRun) {
81
+ config.hasRun = true;
82
+ fs.writeFileSync(path.join(getConfigDirectoryPath(), 'promptfoo.yaml'), js_yaml_1.default.dump(config));
83
+ return true;
84
+ }
85
+ return false;
86
+ }
87
+ catch (err) {
88
+ return false;
89
+ }
90
+ }
91
+ exports.maybeRecordFirstRun = maybeRecordFirstRun;
53
92
  async function maybeReadConfig(configPath) {
54
93
  if (!fs.existsSync(configPath)) {
55
94
  return undefined;
@@ -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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"}
package/package.json CHANGED
@@ -2,7 +2,7 @@
2
2
  "name": "promptfoo",
3
3
  "description": "LLM eval & testing toolkit",
4
4
  "author": "Ian Webster",
5
- "version": "0.17.2",
5
+ "version": "0.17.4",
6
6
  "license": "MIT",
7
7
  "type": "commonjs",
8
8
  "main": "dist/src/index.js",
@@ -60,6 +60,7 @@
60
60
  "typescript": "^5.0.4"
61
61
  },
62
62
  "dependencies": {
63
+ "@anthropic-ai/sdk": "^0.5.2",
63
64
  "@apidevtools/json-schema-ref-parser": "^10.1.0",
64
65
  "async": "^3.2.4",
65
66
  "cache-manager": "^4.1.0",
package/src/cache.ts CHANGED
@@ -1,5 +1,5 @@
1
- import fs from 'node:fs';
2
- import path from 'node:path';
1
+ import fs from 'fs';
2
+ import path from 'path';
3
3
 
4
4
  import cacheManager from 'cache-manager';
5
5
  import fsStore from 'cache-manager-fs-hash';
package/src/evaluator.ts CHANGED
@@ -1,4 +1,4 @@
1
- import readline from 'node:readline';
1
+ import readline from 'readline';
2
2
 
3
3
  import async from 'async';
4
4
  import chalk from 'chalk';
package/src/index.ts CHANGED
@@ -26,6 +26,7 @@ async function evaluate(testSuite: EvaluateTestSuite, options: EvaluateOptions =
26
26
  display: promptContent,
27
27
  })),
28
28
  };
29
+ telemetry.maybeShowNotice();
29
30
  const ret = await doEvaluate(constructedTestSuite, options);
30
31
  await telemetry.send();
31
32
  return ret;
package/src/main.ts CHANGED
@@ -56,10 +56,10 @@ function createDummyFiles(directory: string | null) {
56
56
  writeFileSync(pathJoin(process.cwd(), directory, 'README.md'), DEFAULT_README);
57
57
 
58
58
  if (directory === '.') {
59
- logger.info('Wrote prompts.txt and promptfooconfig.js. Open README.md to get started!');
59
+ logger.info(chalk.green.bold('Wrote prompts.txt and promptfooconfig.yaml. Open README.md to get started!'));
60
60
  } else {
61
- logger.info(`Wrote prompts.txt and promptfooconfig.js to ./${directory}`);
62
- logger.info(`\`cd ${directory}\` and open README.md to get started!`);
61
+ logger.info(chalk.green.bold(`Wrote prompts.txt and promptfooconfig.yaml to ./${directory}`));
62
+ logger.info(chalk.green(`\`cd ${directory}\` and open README.md to get started!`));
63
63
  }
64
64
  }
65
65
 
@@ -102,6 +102,7 @@ async function main() {
102
102
  .command('init [directory]')
103
103
  .description('Initialize project with dummy files')
104
104
  .action(async (directory: string | null) => {
105
+ telemetry.maybeShowNotice();
105
106
  createDummyFiles(directory);
106
107
  telemetry.record('command_used', {
107
108
  name: 'init',
@@ -114,6 +115,7 @@ async function main() {
114
115
  .description('Start browser ui')
115
116
  .option('-p, --port <number>', 'Port number', '15500')
116
117
  .action(async (cmdObj: { port: number } & Command) => {
118
+ telemetry.maybeShowNotice();
117
119
  telemetry.record('command_used', {
118
120
  name: 'view',
119
121
  });
@@ -125,6 +127,7 @@ async function main() {
125
127
  .command('share')
126
128
  .description('Share your most recent result')
127
129
  .action(async (cmdObj: { port: number } & Command) => {
130
+ telemetry.maybeShowNotice();
128
131
  telemetry.record('command_used', {
129
132
  name: 'share',
130
133
  });
@@ -145,6 +148,7 @@ async function main() {
145
148
  .command('clear')
146
149
  .description('Clear cache')
147
150
  .action(async () => {
151
+ telemetry.maybeShowNotice();
148
152
  await clearCache();
149
153
  telemetry.record('command_used', {
150
154
  name: 'cache_clear',
@@ -317,7 +321,9 @@ async function main() {
317
321
  }
318
322
  }
319
323
 
320
- const border = '='.repeat(process.stdout.columns - 10);
324
+ telemetry.maybeShowNotice();
325
+
326
+ const border = '='.repeat((process.stdout.columns || 80) - 10);
321
327
  logger.info(border);
322
328
  if (!cmdObj.write) {
323
329
  logger.info(`${chalk.green('✔')} Evaluation complete`);
@@ -340,13 +346,14 @@ async function main() {
340
346
  logger.info(
341
347
  `Token usage: Total ${summary.stats.tokenUsage.total}, Prompt ${summary.stats.tokenUsage.prompt}, Completion ${summary.stats.tokenUsage.completion}, Cached ${summary.stats.tokenUsage.cached}`,
342
348
  );
343
- logger.info('Done.');
344
349
 
345
350
  telemetry.record('command_used', {
346
351
  name: 'eval',
347
352
  });
348
353
  await telemetry.send();
349
354
 
355
+ logger.info('Done.');
356
+
350
357
  if (cmdObj.view) {
351
358
  init(parseInt(cmdObj.view, 10) || 15500);
352
359
  }
package/src/onboarding.ts CHANGED
@@ -10,8 +10,8 @@ These prompts are nunjucks templates, so you can use logic like this:
10
10
  {% endif %}
11
11
  ---
12
12
  [
13
- {"role": "system", "content": "Use JSON too for more complex payloads"},
14
- {"role": "user", "content": "Such as multi-shot prompts"}
13
+ {"role": "system", "content": "This is another prompt. JSON is supported."},
14
+ {"role": "user", "content": "Using this format, you may construct multi-shot OpenAI prompts"}
15
15
  {"role": "user", "content": "Variable substitution still works: {{ var3 }}"}
16
16
  ]
17
17
  ---
@@ -21,7 +21,7 @@ If you prefer, you can break prompts into multiple files (make sure to edit prom
21
21
  export const DEFAULT_YAML_CONFIG = `# This configuration runs each prompt through a series of example inputs and checks if they meet requirements.
22
22
 
23
23
  prompts: [prompts.txt]
24
- providers: [openai:gpt-3.5-turbo]
24
+ providers: [openai:gpt-3.5-turbo-0613]
25
25
  tests:
26
26
  - description: First test case - automatic review
27
27
  vars:
@@ -29,10 +29,12 @@ tests:
29
29
  var2: another value
30
30
  var3: some other value
31
31
  assert:
32
- - type: equality
32
+ - type: equals
33
33
  value: expected LLM output goes here
34
- - type: function
35
- value: output.includes('some text')
34
+ - type: contains
35
+ value: some text
36
+ - type: javascript
37
+ value: 1 / (output.length + 1) # prefer shorter outputs
36
38
 
37
39
  - description: Second test case - manual review
38
40
  # Test cases don't need assertions if you prefer to manually review the output
@@ -0,0 +1,88 @@
1
+ import Anthropic from '@anthropic-ai/sdk';
2
+ import logger from '../logger';
3
+
4
+ import type { ApiProvider, ProviderResponse } from '../types.js';
5
+
6
+ interface AnthropicCompletionOptions {
7
+ temperature?: number;
8
+ top_p?: number;
9
+ top_k?: number;
10
+ }
11
+
12
+ export class AnthropicCompletionProvider implements ApiProvider {
13
+ static ANTHROPIC_COMPLETION_MODELS = [
14
+ 'claude-1',
15
+ 'claude-1-100k',
16
+ 'claude-instant-1',
17
+ 'claude-instant-1-100k',
18
+ ];
19
+
20
+ modelName: string;
21
+ apiKey?: string;
22
+ anthropic: Anthropic;
23
+ options: AnthropicCompletionOptions;
24
+
25
+ constructor(modelName: string, apiKey?: string, context?: AnthropicCompletionOptions) {
26
+ this.modelName = modelName;
27
+ this.apiKey = apiKey || process.env.ANTHROPIC_API_KEY;
28
+ this.anthropic = new Anthropic({apiKey: this.apiKey});
29
+ this.options = context || {};
30
+ }
31
+
32
+ id(): string {
33
+ return `anthropic:${this.modelName}`;
34
+ }
35
+
36
+ toString(): string {
37
+ return `[Anthropic Provider ${this.modelName}]`;
38
+ }
39
+
40
+ async callApi(prompt: string, options?: AnthropicCompletionOptions): Promise<ProviderResponse> {
41
+ if (!this.apiKey) {
42
+ throw new Error(
43
+ 'Anthropic API key is not set. Set ANTHROPIC_API_KEY environment variable or pass it as an argument to the constructor.',
44
+ );
45
+ }
46
+
47
+ let stop: string[];
48
+ try {
49
+ stop = process.env.ANTHROPIC_STOP
50
+ ? JSON.parse(process.env.ANTHROPIC_STOP)
51
+ : ['<|im_end|>', '<|endoftext|>'];
52
+ } catch (err) {
53
+ throw new Error(`ANTHROPIC_STOP is not a valid JSON string: ${err}`);
54
+ }
55
+
56
+ const params: Anthropic.CompletionCreateParams = {
57
+ model: this.modelName,
58
+ prompt: `${Anthropic.HUMAN_PROMPT} ${prompt} ${Anthropic.AI_PROMPT}`,
59
+ max_tokens_to_sample: parseInt(process.env.ANTHROPIC_MAX_TOKENS || '1024'),
60
+ temperature:
61
+ options?.temperature ??
62
+ this.options.temperature ??
63
+ parseFloat(process.env.ANTHROPIC_TEMPERATURE || '0'),
64
+ stop_sequences: stop,
65
+ };
66
+
67
+ logger.debug(`Calling Anthropic API: ${JSON.stringify(params)}`);
68
+ let response;
69
+ try {
70
+ response = await this.anthropic.completions.create(params);
71
+ } catch (err) {
72
+ return {
73
+ error: `API call error: ${String(err)}`,
74
+ };
75
+ }
76
+ logger.debug(`\tAnthropic API response: ${JSON.stringify(response)}`);
77
+ try {
78
+ return {
79
+ output: response.completion,
80
+ tokenUsage: {}, // TODO: add token usage once Anthropic API supports it
81
+ };
82
+ } catch (err) {
83
+ return {
84
+ error: `API response error: ${String(err)}: ${JSON.stringify(response)}`,
85
+ };
86
+ }
87
+ }
88
+ }
package/src/providers.ts CHANGED
@@ -1,8 +1,9 @@
1
- import path from 'node:path';
1
+ import path from 'path';
2
2
 
3
3
  import { ApiProvider, ProviderConfig, ProviderId, RawProviderConfig } from './types';
4
4
 
5
5
  import { OpenAiCompletionProvider, OpenAiChatCompletionProvider } from './providers/openai';
6
+ import { AnthropicCompletionProvider } from './providers/anthropic';
6
7
  import { LocalAiCompletionProvider, LocalAiChatProvider } from './providers/localai';
7
8
  import { ScriptCompletionProvider } from './providers/scriptCompletion';
8
9
 
@@ -67,6 +68,25 @@ export async function loadApiProvider(
67
68
  `Unknown OpenAI model type: ${modelType}. Use one of the following providers: openai:chat:<model name>, openai:completion:<model name>`,
68
69
  );
69
70
  }
71
+ } else if (providerPath?.startsWith('anthropic:')) {
72
+ // Load Anthropic module
73
+ const options = providerPath.split(':');
74
+ const modelType = options[1];
75
+ const modelName = options[2];
76
+
77
+ if (modelType === 'completion') {
78
+ return new AnthropicCompletionProvider(
79
+ modelName || 'claude-instant-1',
80
+ undefined,
81
+ context?.config,
82
+ );
83
+ } else if (AnthropicCompletionProvider.ANTHROPIC_COMPLETION_MODELS.includes(modelType)) {
84
+ return new AnthropicCompletionProvider(modelType, undefined, context?.config);
85
+ } else {
86
+ throw new Error(
87
+ `Unknown Anthropic model type: ${modelType}. Use one of the following providers: anthropic:completion:<model name>`,
88
+ );
89
+ }
70
90
  }
71
91
 
72
92
  if (providerPath?.startsWith('localai:')) {
@@ -91,6 +111,7 @@ export async function loadApiProvider(
91
111
  export default {
92
112
  OpenAiCompletionProvider,
93
113
  OpenAiChatCompletionProvider,
114
+ AnthropicCompletionProvider,
94
115
  LocalAiCompletionProvider,
95
116
  LocalAiChatProvider,
96
117
  loadApiProvider,
package/src/table.ts CHANGED
@@ -7,7 +7,7 @@ export function generateTable(summary: EvaluateSummary, tableCellMaxLength = 250
7
7
  const head = summary.table.head;
8
8
  const headLength = head.prompts.length + head.vars.length;
9
9
  const table = new Table({
10
- head: [...head.prompts.map((prompt) => prompt.display), ...head.vars],
10
+ head: [...head.vars, ...head.prompts.map((prompt) => prompt.display)],
11
11
  colWidths: Array(headLength).fill(Math.floor(maxWidth / headLength)),
12
12
  wordWrap: true,
13
13
  wrapOnWordBoundary: false,
package/src/telemetry.ts CHANGED
@@ -1,5 +1,8 @@
1
+ import chalk from 'chalk';
2
+
1
3
  import packageJson from '../package.json';
2
- import { fetchWithTimeout } from './util';
4
+ import logger from './logger';
5
+ import { fetchWithTimeout, maybeRecordFirstRun } from './util';
3
6
 
4
7
  type TelemetryEvent = {
5
8
  event: string;
@@ -30,6 +33,16 @@ export class Telemetry {
30
33
  }
31
34
  }
32
35
 
36
+ maybeShowNotice(): void {
37
+ if (maybeRecordFirstRun()) {
38
+ logger.info(
39
+ chalk.gray(
40
+ 'Anonymous telemetry is enabled. For more info, see https://www.promptfoo.dev/docs/configuration/telemetry',
41
+ ),
42
+ );
43
+ }
44
+ }
45
+
33
46
  async send(): Promise<void> {
34
47
  if (!this.disabled && this.events.length > 0) {
35
48
  try {
package/src/updates.ts CHANGED
@@ -17,7 +17,12 @@ export async function getLatestVersion(packageName: string) {
17
17
  }
18
18
 
19
19
  export async function checkForUpdates(): Promise<boolean> {
20
- const latestVersion = await getLatestVersion('promptfoo');
20
+ let latestVersion: string;
21
+ try {
22
+ latestVersion = await getLatestVersion('promptfoo');
23
+ } catch {
24
+ return false;
25
+ }
21
26
  if (semverGt(latestVersion, VERSION)) {
22
27
  const border = '='.repeat(process.stdout.columns - 10);
23
28
  logger.info(
package/src/util.ts CHANGED
@@ -1,6 +1,6 @@
1
1
  import * as fs from 'fs';
2
- import * as path from 'node:path';
3
- import * as os from 'node:os';
2
+ import * as path from 'path';
3
+ import * as os from 'os';
4
4
 
5
5
  import $RefParser from '@apidevtools/json-schema-ref-parser';
6
6
  import fetch from 'node-fetch';
@@ -37,6 +37,46 @@ function parseJson(json: string): any | undefined {
37
37
  }
38
38
  }
39
39
 
40
+ let globalConfigCache: any = null;
41
+
42
+ export function resetGlobalConfig(): void {
43
+ globalConfigCache = null;
44
+ }
45
+
46
+ export function readGlobalConfig(): any {
47
+ if (!globalConfigCache) {
48
+ const configDir = getConfigDirectoryPath();
49
+ const configFilePath = path.join(configDir, 'promptfoo.yaml');
50
+
51
+ if (fs.existsSync(configFilePath)) {
52
+ globalConfigCache = yaml.load(fs.readFileSync(configFilePath, 'utf-8'));
53
+ } else {
54
+ if (!fs.existsSync(configDir)) {
55
+ fs.mkdirSync(configDir, { recursive: true });
56
+ }
57
+ globalConfigCache = { hasRun: false };
58
+ fs.writeFileSync(configFilePath, yaml.dump(globalConfigCache));
59
+ }
60
+ }
61
+
62
+ return globalConfigCache;
63
+ }
64
+
65
+ export function maybeRecordFirstRun(): boolean {
66
+ // Return true if first run
67
+ try {
68
+ const config = readGlobalConfig();
69
+ if (!config.hasRun) {
70
+ config.hasRun = true;
71
+ fs.writeFileSync(path.join(getConfigDirectoryPath(), 'promptfoo.yaml'), yaml.dump(config));
72
+ return true;
73
+ }
74
+ return false;
75
+ } catch (err) {
76
+ return false;
77
+ }
78
+ }
79
+
40
80
  export async function maybeReadConfig(configPath: string): Promise<UnifiedConfig | undefined> {
41
81
  if (!fs.existsSync(configPath)) {
42
82
  return undefined;