promptfoo 0.91.3 → 0.92.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 (181) hide show
  1. package/dist/drizzle/0006_harsh_caretaker.sql +42 -0
  2. package/dist/drizzle/0007_cloudy_wong.sql +1 -0
  3. package/dist/drizzle/meta/0006_snapshot.json +721 -0
  4. package/dist/drizzle/meta/0007_snapshot.json +723 -0
  5. package/dist/drizzle/meta/_journal.json +14 -0
  6. package/dist/package.json +10 -8
  7. package/dist/src/app/assets/{index-C6z1nbLN.js → index-BpjzEMiv.js} +243 -241
  8. package/dist/src/app/assets/{index.es-oqbvfIxR.js → index.es-ihzvEu35.js} +1 -1
  9. package/dist/src/app/assets/{sync-D2s75VlC.js → sync-BosjlpGJ.js} +1 -1
  10. package/dist/src/app/index.html +3 -3
  11. package/dist/src/assertions.js +2 -2
  12. package/dist/src/assertions.js.map +1 -1
  13. package/dist/src/commands/cache.d.ts.map +1 -1
  14. package/dist/src/commands/cache.js +0 -2
  15. package/dist/src/commands/cache.js.map +1 -1
  16. package/dist/src/commands/eval.d.ts.map +1 -1
  17. package/dist/src/commands/eval.js +19 -16
  18. package/dist/src/commands/eval.js.map +1 -1
  19. package/dist/src/commands/export.d.ts.map +1 -1
  20. package/dist/src/commands/export.js +8 -31
  21. package/dist/src/commands/export.js.map +1 -1
  22. package/dist/src/commands/import.d.ts.map +1 -1
  23. package/dist/src/commands/import.js +52 -13
  24. package/dist/src/commands/import.js.map +1 -1
  25. package/dist/src/commands/list.d.ts.map +1 -1
  26. package/dist/src/commands/list.js +35 -7
  27. package/dist/src/commands/list.js.map +1 -1
  28. package/dist/src/commands/share.d.ts +2 -2
  29. package/dist/src/commands/share.d.ts.map +1 -1
  30. package/dist/src/commands/share.js +12 -13
  31. package/dist/src/commands/share.js.map +1 -1
  32. package/dist/src/commands/show.d.ts.map +1 -1
  33. package/dist/src/commands/show.js +10 -6
  34. package/dist/src/commands/show.js.map +1 -1
  35. package/dist/src/constants.d.ts +1 -0
  36. package/dist/src/constants.d.ts.map +1 -1
  37. package/dist/src/constants.js +2 -1
  38. package/dist/src/constants.js.map +1 -1
  39. package/dist/src/database/index.js +1 -1
  40. package/dist/src/database/index.js.map +1 -1
  41. package/dist/src/database/tables.d.ts +609 -11
  42. package/dist/src/database/tables.d.ts.map +1 -1
  43. package/dist/src/database/tables.js +111 -52
  44. package/dist/src/database/tables.js.map +1 -1
  45. package/dist/src/database/types.d.ts +3 -3
  46. package/dist/src/database/types.d.ts.map +1 -1
  47. package/dist/src/evaluator.d.ts +3 -2
  48. package/dist/src/evaluator.d.ts.map +1 -1
  49. package/dist/src/evaluator.js +75 -104
  50. package/dist/src/evaluator.js.map +1 -1
  51. package/dist/src/evaluatorHelpers.d.ts.map +1 -1
  52. package/dist/src/evaluatorHelpers.js +2 -1
  53. package/dist/src/evaluatorHelpers.js.map +1 -1
  54. package/dist/src/index.d.ts +2 -1
  55. package/dist/src/index.d.ts.map +1 -1
  56. package/dist/src/index.js +18 -10
  57. package/dist/src/index.js.map +1 -1
  58. package/dist/src/models/eval.d.ts +95 -0
  59. package/dist/src/models/eval.d.ts.map +1 -0
  60. package/dist/src/models/eval.js +390 -0
  61. package/dist/src/models/eval.js.map +1 -0
  62. package/dist/src/models/evalResult.d.ts +50 -0
  63. package/dist/src/models/evalResult.d.ts.map +1 -0
  64. package/dist/src/models/evalResult.js +122 -0
  65. package/dist/src/models/evalResult.js.map +1 -0
  66. package/dist/src/models/provider.d.ts +9 -0
  67. package/dist/src/models/provider.d.ts.map +1 -0
  68. package/dist/src/models/provider.js +47 -0
  69. package/dist/src/models/provider.js.map +1 -0
  70. package/dist/src/prompts/index.d.ts.map +1 -1
  71. package/dist/src/prompts/index.js +2 -1
  72. package/dist/src/prompts/index.js.map +1 -1
  73. package/dist/src/prompts/utils.d.ts +1 -0
  74. package/dist/src/prompts/utils.d.ts.map +1 -1
  75. package/dist/src/prompts/utils.js +7 -0
  76. package/dist/src/prompts/utils.js.map +1 -1
  77. package/dist/src/providers/fal.d.ts +2 -2
  78. package/dist/src/providers/fal.d.ts.map +1 -1
  79. package/dist/src/providers/fal.js +2 -1
  80. package/dist/src/providers/fal.js.map +1 -1
  81. package/dist/src/providers/http.js +2 -2
  82. package/dist/src/providers/http.js.map +1 -1
  83. package/dist/src/providers/palm.d.ts +4 -3
  84. package/dist/src/providers/palm.d.ts.map +1 -1
  85. package/dist/src/providers/palm.js +13 -3
  86. package/dist/src/providers/palm.js.map +1 -1
  87. package/dist/src/providers.js +5 -5
  88. package/dist/src/providers.js.map +1 -1
  89. package/dist/src/redteam/eval/excessive-agency/llm_rubric-20240617.json +10 -0
  90. package/dist/src/redteam/eval/excessive-agency/llm_rubric-20240618.json +10 -0
  91. package/dist/src/redteam/eval/harmful/llm_rubric-20240723.json +10 -0
  92. package/dist/src/redteam/eval/harmful/llm_rubric-20240724.json +10 -0
  93. package/dist/src/server/server.d.ts +1 -0
  94. package/dist/src/server/server.d.ts.map +1 -1
  95. package/dist/src/server/server.js +70 -31
  96. package/dist/src/server/server.js.map +1 -1
  97. package/dist/src/share.d.ts +2 -2
  98. package/dist/src/share.d.ts.map +1 -1
  99. package/dist/src/share.js +93 -34
  100. package/dist/src/share.js.map +1 -1
  101. package/dist/src/table.d.ts +2 -2
  102. package/dist/src/table.d.ts.map +1 -1
  103. package/dist/src/table.js +3 -3
  104. package/dist/src/table.js.map +1 -1
  105. package/dist/src/types/index.d.ts +163 -11
  106. package/dist/src/types/index.d.ts.map +1 -1
  107. package/dist/src/types/index.js +21 -1
  108. package/dist/src/types/index.js.map +1 -1
  109. package/dist/src/util/config/load.d.ts.map +1 -1
  110. package/dist/src/util/config/load.js +2 -1
  111. package/dist/src/util/config/load.js.map +1 -1
  112. package/dist/src/util/config/manage.d.ts.map +1 -1
  113. package/dist/src/util/config/manage.js.map +1 -1
  114. package/dist/src/util/convertEvalResultsToTable.d.ts +16 -0
  115. package/dist/src/util/convertEvalResultsToTable.d.ts.map +1 -0
  116. package/dist/src/util/convertEvalResultsToTable.js +136 -0
  117. package/dist/src/util/convertEvalResultsToTable.js.map +1 -0
  118. package/dist/src/util/createHash.d.ts +1 -0
  119. package/dist/src/util/createHash.d.ts.map +1 -1
  120. package/dist/src/util/createHash.js +9 -0
  121. package/dist/src/util/createHash.js.map +1 -1
  122. package/dist/src/util/file.d.ts +8 -0
  123. package/dist/src/util/file.d.ts.map +1 -0
  124. package/dist/src/util/file.js +13 -0
  125. package/dist/src/util/file.js.map +1 -0
  126. package/dist/src/util/index.d.ts +9 -14
  127. package/dist/src/util/index.d.ts.map +1 -1
  128. package/dist/src/util/index.js +132 -268
  129. package/dist/src/util/index.js.map +1 -1
  130. package/dist/src/util/time.d.ts +2 -0
  131. package/dist/src/util/time.d.ts.map +1 -0
  132. package/dist/src/util/time.js +7 -0
  133. package/dist/src/util/time.js.map +1 -0
  134. package/dist/src/util/transform.js +2 -2
  135. package/dist/src/util/transform.js.map +1 -1
  136. package/dist/src/validators/providers.d.ts +6 -0
  137. package/dist/src/validators/providers.d.ts.map +1 -1
  138. package/dist/src/validators/providers.js +1 -0
  139. package/dist/src/validators/providers.js.map +1 -1
  140. package/dist/src/validators/redteam.d.ts +6 -0
  141. package/dist/src/validators/redteam.d.ts.map +1 -1
  142. package/dist/test/commands/eval/filterFailingTests.test.js +24 -2
  143. package/dist/test/commands/eval/filterFailingTests.test.js.map +1 -1
  144. package/dist/test/evaluator.test.js +152 -74
  145. package/dist/test/evaluator.test.js.map +1 -1
  146. package/dist/test/factories/data/eval/database_records.d.ts +142 -0
  147. package/dist/test/factories/data/eval/database_records.d.ts.map +1 -0
  148. package/dist/test/factories/data/eval/database_records.js +251 -0
  149. package/dist/test/factories/data/eval/database_records.js.map +1 -0
  150. package/dist/test/factories/evalFactory.d.ts +768 -0
  151. package/dist/test/factories/evalFactory.d.ts.map +1 -0
  152. package/dist/test/factories/evalFactory.js +121 -0
  153. package/dist/test/factories/evalFactory.js.map +1 -0
  154. package/dist/test/index.test.js +20 -35
  155. package/dist/test/index.test.js.map +1 -1
  156. package/dist/test/models/eval.test.d.ts +2 -0
  157. package/dist/test/models/eval.test.d.ts.map +1 -0
  158. package/dist/test/models/eval.test.js +34 -0
  159. package/dist/test/models/eval.test.js.map +1 -0
  160. package/dist/test/providers.test.js +3 -3
  161. package/dist/test/providers.test.js.map +1 -1
  162. package/dist/test/server/share.test.d.ts +2 -0
  163. package/dist/test/server/share.test.d.ts.map +1 -0
  164. package/dist/test/server/share.test.js +36 -0
  165. package/dist/test/server/share.test.js.map +1 -0
  166. package/dist/test/server/v3evalToShare.json +507 -0
  167. package/dist/test/server/v4evalToShare.json +421 -0
  168. package/dist/test/types.test.js +56 -3
  169. package/dist/test/types.test.js.map +1 -1
  170. package/dist/test/util.file.test.d.ts +2 -0
  171. package/dist/test/util.file.test.d.ts.map +1 -0
  172. package/dist/test/util.file.test.js +32 -0
  173. package/dist/test/util.file.test.js.map +1 -0
  174. package/dist/test/util.listPrevious.test.d.ts +2 -0
  175. package/dist/test/util.listPrevious.test.d.ts.map +1 -0
  176. package/dist/test/util.listPrevious.test.js +37 -0
  177. package/dist/test/util.listPrevious.test.js.map +1 -0
  178. package/dist/test/util.test.js +38 -311
  179. package/dist/test/util.test.js.map +1 -1
  180. package/dist/tsconfig.tsbuildinfo +1 -0
  181. package/package.json +10 -8
@@ -0,0 +1,36 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const supertest_1 = __importDefault(require("supertest"));
7
+ const migrate_1 = require("../../src/migrate");
8
+ const eval_1 = __importDefault(require("../../src/models/eval"));
9
+ const server_1 = require("../../src/server/server");
10
+ const v3evalToShare_json_1 = __importDefault(require("./v3evalToShare.json"));
11
+ const v4evalToShare_json_1 = __importDefault(require("./v4evalToShare.json"));
12
+ describe('share', () => {
13
+ const app = (0, server_1.createApp)();
14
+ beforeAll(async () => {
15
+ await (0, migrate_1.runDbMigrations)();
16
+ });
17
+ it('should accept a version 3 results file', async () => {
18
+ const res = await (0, supertest_1.default)(app).post('/api/eval').send(v3evalToShare_json_1.default);
19
+ expect(res.status).toBe(200);
20
+ const eval_ = await eval_1.default.findById(res.body.id);
21
+ expect(eval_).not.toBeNull();
22
+ expect(eval_?.version()).toBe(3);
23
+ const results = await eval_?.getResults();
24
+ expect(results).toHaveLength(8);
25
+ });
26
+ it('should accept a new eval', async () => {
27
+ const res = await (0, supertest_1.default)(app).post('/api/eval').send(v4evalToShare_json_1.default);
28
+ expect(res.status).toBe(200);
29
+ const eval_ = await eval_1.default.findById(res.body.id);
30
+ expect(eval_).not.toBeNull();
31
+ expect(eval_?.version()).toBe(4);
32
+ const results = await eval_?.getResults();
33
+ expect(results).toHaveLength(8);
34
+ });
35
+ });
36
+ //# sourceMappingURL=share.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"share.test.js","sourceRoot":"","sources":["../../../test/server/share.test.ts"],"names":[],"mappings":";;;;;AAAA,0DAAgC;AAChC,+CAAoD;AACpD,iEAAyC;AACzC,oDAAoD;AACpD,8EAA8C;AAC9C,8EAA8C;AAE9C,QAAQ,CAAC,OAAO,EAAE,GAAG,EAAE;IACrB,MAAM,GAAG,GAAG,IAAA,kBAAS,GAAE,CAAC;IACxB,SAAS,CAAC,KAAK,IAAI,EAAE;QACnB,MAAM,IAAA,yBAAe,GAAE,CAAC;IAC1B,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,wCAAwC,EAAE,KAAK,IAAI,EAAE;QACtD,MAAM,GAAG,GAAG,MAAM,IAAA,mBAAO,EAAC,GAAG,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,4BAAU,CAAC,CAAC;QAClE,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAC7B,MAAM,KAAK,GAAG,MAAM,cAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,EAAY,CAAC,CAAC;QACzD,MAAM,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC;QAC7B,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACjC,MAAM,OAAO,GAAG,MAAM,KAAK,EAAE,UAAU,EAAE,CAAC;QAC1C,MAAM,CAAC,OAAO,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;IAClC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,0BAA0B,EAAE,KAAK,IAAI,EAAE;QACxC,MAAM,GAAG,GAAG,MAAM,IAAA,mBAAO,EAAC,GAAG,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,4BAAU,CAAC,CAAC;QAClE,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAC7B,MAAM,KAAK,GAAG,MAAM,cAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,EAAY,CAAC,CAAC;QACzD,MAAM,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC;QAC7B,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACjC,MAAM,OAAO,GAAG,MAAM,KAAK,EAAE,UAAU,EAAE,CAAC;QAC1C,MAAM,CAAC,OAAO,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;IAClC,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,507 @@
1
+ {
2
+ "data": {
3
+ "version": 3,
4
+ "createdAt": "2024-10-02T16:30:21.627Z",
5
+ "author": "steve@promptfoo.dev",
6
+ "results": {
7
+ "version": 2,
8
+ "timestamp": "2024-10-02T16:29:47.070Z",
9
+ "results": [
10
+ {
11
+ "provider": { "id": "openai:gpt-4o-mini", "label": "" },
12
+ "prompt": {
13
+ "raw": "Translate this to conversational French: I'm hungry",
14
+ "label": "examples/simple-csv/prompts.txt: Translate this to conversational {{language}}: {{body}}"
15
+ },
16
+ "vars": { "language": "French", "body": "I'm hungry" },
17
+ "response": {
18
+ "output": "J'ai faim.",
19
+ "tokenUsage": { "cached": 19, "total": 19 },
20
+ "cached": true,
21
+ "cost": 0.0000046499999999999995
22
+ },
23
+ "success": true,
24
+ "score": 1,
25
+ "namedScores": {},
26
+ "latencyMs": 2,
27
+ "cost": 0.0000046499999999999995,
28
+ "gradingResult": {
29
+ "pass": true,
30
+ "score": 1,
31
+ "reason": "No assertions",
32
+ "tokensUsed": { "total": 0, "prompt": 0, "completion": 0, "cached": 0 },
33
+ "assertion": null
34
+ }
35
+ },
36
+ {
37
+ "provider": { "id": "openai:gpt-4o-mini", "label": "" },
38
+ "prompt": {
39
+ "raw": "Rephrase this in French: I'm hungry",
40
+ "label": "examples/simple-csv/prompts.txt: Rephrase this in {{language}}: {{body}}"
41
+ },
42
+ "vars": { "language": "French", "body": "I'm hungry" },
43
+ "response": {
44
+ "output": "J'ai faim.",
45
+ "tokenUsage": { "cached": 19, "total": 19 },
46
+ "cached": true,
47
+ "cost": 0.0000046499999999999995
48
+ },
49
+ "success": true,
50
+ "score": 1,
51
+ "namedScores": {},
52
+ "latencyMs": 4,
53
+ "cost": 0.0000046499999999999995,
54
+ "gradingResult": {
55
+ "pass": true,
56
+ "score": 1,
57
+ "reason": "No assertions",
58
+ "tokensUsed": { "total": 0, "prompt": 0, "completion": 0, "cached": 0 },
59
+ "assertion": null
60
+ }
61
+ },
62
+ {
63
+ "provider": { "id": "openai:gpt-4o-mini", "label": "" },
64
+ "prompt": {
65
+ "raw": "Rephrase this in French: Hello world",
66
+ "label": "examples/simple-csv/prompts.txt: Rephrase this in {{language}}: {{body}}"
67
+ },
68
+ "vars": { "language": "French", "body": "Hello world" },
69
+ "response": {
70
+ "output": "Bonjour le monde.",
71
+ "tokenUsage": { "cached": 19, "total": 19 },
72
+ "cached": true,
73
+ "cost": 0.0000046499999999999995
74
+ },
75
+ "success": true,
76
+ "score": 1,
77
+ "namedScores": {},
78
+ "latencyMs": 6,
79
+ "cost": 0.0000046499999999999995,
80
+ "gradingResult": {
81
+ "pass": true,
82
+ "score": 1,
83
+ "reason": "No assertions",
84
+ "tokensUsed": { "total": 0, "prompt": 0, "completion": 0, "cached": 0 },
85
+ "assertion": null
86
+ }
87
+ },
88
+ {
89
+ "provider": { "id": "openai:gpt-4o-mini", "label": "" },
90
+ "prompt": {
91
+ "raw": "Translate this to conversational French: Hello world",
92
+ "label": "examples/simple-csv/prompts.txt: Translate this to conversational {{language}}: {{body}}"
93
+ },
94
+ "vars": { "language": "French", "body": "Hello world" },
95
+ "response": {
96
+ "output": "Salut tout le monde !",
97
+ "tokenUsage": { "cached": 20, "total": 20 },
98
+ "cached": true,
99
+ "cost": 0.0000052500000000000006
100
+ },
101
+ "success": true,
102
+ "score": 1,
103
+ "namedScores": {},
104
+ "latencyMs": 6,
105
+ "cost": 0.0000052500000000000006,
106
+ "gradingResult": {
107
+ "pass": true,
108
+ "score": 1,
109
+ "reason": "No assertions",
110
+ "tokensUsed": { "total": 0, "prompt": 0, "completion": 0, "cached": 0 },
111
+ "assertion": null
112
+ }
113
+ },
114
+ {
115
+ "provider": { "id": "openai:gpt-4o-mini", "label": "" },
116
+ "prompt": {
117
+ "raw": "Rephrase this in Pirate: Hello world",
118
+ "label": "examples/simple-csv/prompts.txt: Rephrase this in {{language}}: {{body}}"
119
+ },
120
+ "vars": { "language": "Pirate", "body": "Hello world" },
121
+ "response": {
122
+ "output": "Ahoy, me hearties!",
123
+ "tokenUsage": { "cached": 22, "total": 22 },
124
+ "cached": true,
125
+ "cost": 0.000006449999999999999
126
+ },
127
+ "success": true,
128
+ "score": 1,
129
+ "namedScores": {},
130
+ "latencyMs": 3,
131
+ "cost": 0.000006449999999999999,
132
+ "gradingResult": {
133
+ "pass": true,
134
+ "score": 1,
135
+ "reason": "No assertions",
136
+ "tokensUsed": { "total": 0, "prompt": 0, "completion": 0, "cached": 0 },
137
+ "assertion": null
138
+ }
139
+ },
140
+ {
141
+ "provider": { "id": "openai:gpt-4o-mini", "label": "" },
142
+ "prompt": {
143
+ "raw": "Translate this to conversational Pirate: Hello world",
144
+ "label": "examples/simple-csv/prompts.txt: Translate this to conversational {{language}}: {{body}}"
145
+ },
146
+ "vars": { "language": "Pirate", "body": "Hello world" },
147
+ "response": {
148
+ "output": "Ahoy, me hearty! Greetings to ye, world!",
149
+ "tokenUsage": { "cached": 27, "total": 27 },
150
+ "cached": true,
151
+ "cost": 0.00000945
152
+ },
153
+ "success": true,
154
+ "score": 1,
155
+ "namedScores": {},
156
+ "latencyMs": 3,
157
+ "cost": 0.00000945,
158
+ "gradingResult": {
159
+ "pass": true,
160
+ "score": 1,
161
+ "reason": "No assertions",
162
+ "tokensUsed": { "total": 0, "prompt": 0, "completion": 0, "cached": 0 },
163
+ "assertion": null
164
+ }
165
+ },
166
+ {
167
+ "provider": { "id": "openai:gpt-4o-mini", "label": "" },
168
+ "prompt": {
169
+ "raw": "Rephrase this in Pirate: I'm hungry",
170
+ "label": "examples/simple-csv/prompts.txt: Rephrase this in {{language}}: {{body}}"
171
+ },
172
+ "vars": { "language": "Pirate", "body": "I'm hungry" },
173
+ "response": {
174
+ "output": "Arrr, me belly be grumblin'!",
175
+ "tokenUsage": { "cached": 27, "total": 27 },
176
+ "cached": true,
177
+ "cost": 0.00000945
178
+ },
179
+ "success": true,
180
+ "score": 1,
181
+ "namedScores": {},
182
+ "latencyMs": 2,
183
+ "cost": 0.00000945,
184
+ "gradingResult": {
185
+ "pass": true,
186
+ "score": 1,
187
+ "reason": "No assertions",
188
+ "tokensUsed": { "total": 0, "prompt": 0, "completion": 0, "cached": 0 },
189
+ "assertion": null
190
+ }
191
+ },
192
+ {
193
+ "provider": { "id": "openai:gpt-4o-mini", "label": "" },
194
+ "prompt": {
195
+ "raw": "Translate this to conversational Pirate: I'm hungry",
196
+ "label": "examples/simple-csv/prompts.txt: Translate this to conversational {{language}}: {{body}}"
197
+ },
198
+ "vars": { "language": "Pirate", "body": "I'm hungry" },
199
+ "response": {
200
+ "output": "Arrr, me belly be rumblin'! I be feelin' mighty hungry, matey!",
201
+ "tokenUsage": { "cached": 37, "total": 37 },
202
+ "cached": true,
203
+ "cost": 0.00001545
204
+ },
205
+ "success": true,
206
+ "score": 1,
207
+ "namedScores": {},
208
+ "latencyMs": 1,
209
+ "cost": 0.00001545,
210
+ "gradingResult": {
211
+ "pass": true,
212
+ "score": 1,
213
+ "reason": "No assertions",
214
+ "tokensUsed": { "total": 0, "prompt": 0, "completion": 0, "cached": 0 },
215
+ "assertion": null
216
+ }
217
+ }
218
+ ],
219
+ "stats": {
220
+ "successes": 8,
221
+ "failures": 0,
222
+ "tokenUsage": { "total": 190, "prompt": 0, "completion": 0, "cached": 190 }
223
+ },
224
+ "table": {
225
+ "head": {
226
+ "prompts": [
227
+ {
228
+ "raw": "Rephrase this in {{language}}: {{body}}",
229
+ "label": "examples/simple-csv/prompts.txt: Rephrase this in {{language}}: {{body}}",
230
+ "id": "ad447337160016cbd0a5c7f2626d0c1fe2ade0d4d653e20bed9250632bc56e03",
231
+ "provider": "openai:gpt-4o-mini",
232
+ "metrics": {
233
+ "score": 4,
234
+ "testPassCount": 4,
235
+ "testFailCount": 0,
236
+ "assertPassCount": 0,
237
+ "assertFailCount": 0,
238
+ "totalLatencyMs": 15,
239
+ "tokenUsage": { "total": 87, "prompt": 0, "completion": 0, "cached": 87 },
240
+ "namedScores": {},
241
+ "namedScoresCount": {},
242
+ "cost": 0.000025199999999999996
243
+ }
244
+ },
245
+ {
246
+ "raw": "Translate this to conversational {{language}}: {{body}}",
247
+ "label": "examples/simple-csv/prompts.txt: Translate this to conversational {{language}}: {{body}}",
248
+ "id": "0ceccef5d40adcbf45bda7be485d2ee420e4d5943975932e7a38c5468d97c6ee",
249
+ "provider": "openai:gpt-4o-mini",
250
+ "metrics": {
251
+ "score": 4,
252
+ "testPassCount": 4,
253
+ "testFailCount": 0,
254
+ "assertPassCount": 0,
255
+ "assertFailCount": 0,
256
+ "totalLatencyMs": 12,
257
+ "tokenUsage": { "total": 103, "prompt": 0, "completion": 0, "cached": 103 },
258
+ "namedScores": {},
259
+ "namedScoresCount": {},
260
+ "cost": 0.0000348
261
+ }
262
+ }
263
+ ],
264
+ "vars": ["body", "language"]
265
+ },
266
+ "body": [
267
+ {
268
+ "description": "Row #1",
269
+ "outputs": [
270
+ {
271
+ "pass": true,
272
+ "score": 1,
273
+ "namedScores": {},
274
+ "text": "Bonjour le monde.",
275
+ "prompt": "Rephrase this in French: Hello world",
276
+ "provider": "openai:gpt-4o-mini",
277
+ "latencyMs": 6,
278
+ "tokenUsage": { "cached": 19, "total": 19 },
279
+ "gradingResult": {
280
+ "pass": true,
281
+ "score": 1,
282
+ "reason": "No assertions",
283
+ "tokensUsed": { "total": 0, "prompt": 0, "completion": 0, "cached": 0 },
284
+ "assertion": null
285
+ },
286
+ "cost": 0.0000046499999999999995
287
+ },
288
+ {
289
+ "pass": true,
290
+ "score": 1,
291
+ "namedScores": {},
292
+ "text": "Salut tout le monde !",
293
+ "prompt": "Translate this to conversational French: Hello world",
294
+ "provider": "openai:gpt-4o-mini",
295
+ "latencyMs": 6,
296
+ "tokenUsage": { "cached": 20, "total": 20 },
297
+ "gradingResult": {
298
+ "pass": true,
299
+ "score": 1,
300
+ "reason": "No assertions",
301
+ "tokensUsed": { "total": 0, "prompt": 0, "completion": 0, "cached": 0 },
302
+ "assertion": null
303
+ },
304
+ "cost": 0.0000052500000000000006
305
+ }
306
+ ],
307
+ "test": {
308
+ "vars": { "language": "French", "body": "Hello world" },
309
+ "assert": [],
310
+ "options": {},
311
+ "description": "Row #1",
312
+ "metadata": {}
313
+ },
314
+ "vars": ["Hello world", "French"]
315
+ },
316
+ {
317
+ "description": "Row #2",
318
+ "outputs": [
319
+ {
320
+ "pass": true,
321
+ "score": 1,
322
+ "namedScores": {},
323
+ "text": "J'ai faim.",
324
+ "prompt": "Rephrase this in French: I'm hungry",
325
+ "provider": "openai:gpt-4o-mini",
326
+ "latencyMs": 4,
327
+ "tokenUsage": { "cached": 19, "total": 19 },
328
+ "gradingResult": {
329
+ "pass": true,
330
+ "score": 1,
331
+ "reason": "No assertions",
332
+ "tokensUsed": { "total": 0, "prompt": 0, "completion": 0, "cached": 0 },
333
+ "assertion": null
334
+ },
335
+ "cost": 0.0000046499999999999995
336
+ },
337
+ {
338
+ "pass": true,
339
+ "score": 1,
340
+ "namedScores": {},
341
+ "text": "J'ai faim.",
342
+ "prompt": "Translate this to conversational French: I'm hungry",
343
+ "provider": "openai:gpt-4o-mini",
344
+ "latencyMs": 2,
345
+ "tokenUsage": { "cached": 19, "total": 19 },
346
+ "gradingResult": {
347
+ "pass": true,
348
+ "score": 1,
349
+ "reason": "No assertions",
350
+ "tokensUsed": { "total": 0, "prompt": 0, "completion": 0, "cached": 0 },
351
+ "assertion": null
352
+ },
353
+ "cost": 0.0000046499999999999995
354
+ }
355
+ ],
356
+ "test": {
357
+ "vars": { "language": "French", "body": "I'm hungry" },
358
+ "assert": [],
359
+ "options": {},
360
+ "description": "Row #2",
361
+ "metadata": {}
362
+ },
363
+ "vars": ["I'm hungry", "French"]
364
+ },
365
+ {
366
+ "description": "Row #3",
367
+ "outputs": [
368
+ {
369
+ "pass": true,
370
+ "score": 1,
371
+ "namedScores": {},
372
+ "text": "Ahoy, me hearties!",
373
+ "prompt": "Rephrase this in Pirate: Hello world",
374
+ "provider": "openai:gpt-4o-mini",
375
+ "latencyMs": 3,
376
+ "tokenUsage": { "cached": 22, "total": 22 },
377
+ "gradingResult": {
378
+ "pass": true,
379
+ "score": 1,
380
+ "reason": "No assertions",
381
+ "tokensUsed": { "total": 0, "prompt": 0, "completion": 0, "cached": 0 },
382
+ "assertion": null
383
+ },
384
+ "cost": 0.000006449999999999999
385
+ },
386
+ {
387
+ "pass": true,
388
+ "score": 1,
389
+ "namedScores": {},
390
+ "text": "Ahoy, me hearty! Greetings to ye, world!",
391
+ "prompt": "Translate this to conversational Pirate: Hello world",
392
+ "provider": "openai:gpt-4o-mini",
393
+ "latencyMs": 3,
394
+ "tokenUsage": { "cached": 27, "total": 27 },
395
+ "gradingResult": {
396
+ "pass": true,
397
+ "score": 1,
398
+ "reason": "No assertions",
399
+ "tokensUsed": { "total": 0, "prompt": 0, "completion": 0, "cached": 0 },
400
+ "assertion": null
401
+ },
402
+ "cost": 0.00000945
403
+ }
404
+ ],
405
+ "test": {
406
+ "vars": { "language": "Pirate", "body": "Hello world" },
407
+ "assert": [],
408
+ "options": {},
409
+ "description": "Row #3",
410
+ "metadata": {}
411
+ },
412
+ "vars": ["Hello world", "Pirate"]
413
+ },
414
+ {
415
+ "description": "Row #4",
416
+ "outputs": [
417
+ {
418
+ "pass": true,
419
+ "score": 1,
420
+ "namedScores": {},
421
+ "text": "Arrr, me belly be grumblin'!",
422
+ "prompt": "Rephrase this in Pirate: I'm hungry",
423
+ "provider": "openai:gpt-4o-mini",
424
+ "latencyMs": 2,
425
+ "tokenUsage": { "cached": 27, "total": 27 },
426
+ "gradingResult": {
427
+ "pass": true,
428
+ "score": 1,
429
+ "reason": "No assertions",
430
+ "tokensUsed": { "total": 0, "prompt": 0, "completion": 0, "cached": 0 },
431
+ "assertion": null
432
+ },
433
+ "cost": 0.00000945
434
+ },
435
+ {
436
+ "pass": true,
437
+ "score": 1,
438
+ "namedScores": {},
439
+ "text": "Arrr, me belly be rumblin'! I be feelin' mighty hungry, matey!",
440
+ "prompt": "Translate this to conversational Pirate: I'm hungry",
441
+ "provider": "openai:gpt-4o-mini",
442
+ "latencyMs": 1,
443
+ "tokenUsage": { "cached": 37, "total": 37 },
444
+ "gradingResult": {
445
+ "pass": true,
446
+ "score": 1,
447
+ "reason": "No assertions",
448
+ "tokensUsed": { "total": 0, "prompt": 0, "completion": 0, "cached": 0 },
449
+ "assertion": null
450
+ },
451
+ "cost": 0.00001545
452
+ }
453
+ ],
454
+ "test": {
455
+ "vars": { "language": "Pirate", "body": "I'm hungry" },
456
+ "assert": [],
457
+ "options": {},
458
+ "description": "Row #4",
459
+ "metadata": {}
460
+ },
461
+ "vars": ["I'm hungry", "Pirate"]
462
+ }
463
+ ]
464
+ }
465
+ },
466
+ "config": {
467
+ "tags": {},
468
+ "description": "A translator built with LLM",
469
+ "prompts": ["file:///Users/steve/src/promptfoo/examples/simple-csv/prompts.txt"],
470
+ "providers": ["openai:gpt-4o-mini"],
471
+ "tests": [
472
+ {
473
+ "vars": { "language": "French", "body": "Hello world" },
474
+ "assert": [],
475
+ "options": {},
476
+ "description": "Row #1"
477
+ },
478
+ {
479
+ "vars": { "language": "French", "body": "I'm hungry" },
480
+ "assert": [],
481
+ "options": {},
482
+ "description": "Row #2"
483
+ },
484
+ {
485
+ "vars": { "language": "Pirate", "body": "Hello world" },
486
+ "assert": [],
487
+ "options": {},
488
+ "description": "Row #3"
489
+ },
490
+ {
491
+ "vars": { "language": "Pirate", "body": "I'm hungry" },
492
+ "assert": [],
493
+ "options": {},
494
+ "description": "Row #4"
495
+ }
496
+ ],
497
+ "scenarios": [],
498
+ "env": {},
499
+ "sharing": true,
500
+ "defaultTest": { "vars": {}, "assert": [], "options": {}, "metadata": {} },
501
+ "outputPath": [],
502
+ "extensions": [],
503
+ "metadata": {},
504
+ "redteam": { "plugins": [], "strategies": [] }
505
+ }
506
+ }
507
+ }