@promptbook/vercel 0.89.0-1 → 0.89.0-3

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 (25) hide show
  1. package/README.md +3 -1
  2. package/esm/index.es.js +463 -37
  3. package/esm/index.es.js.map +1 -1
  4. package/esm/typings/src/_packages/core.index.d.ts +4 -0
  5. package/esm/typings/src/_packages/types.index.d.ts +6 -4
  6. package/esm/typings/src/cli/cli-commands/login.d.ts +15 -0
  7. package/esm/typings/src/execution/PipelineExecutorResult.d.ts +2 -2
  8. package/esm/typings/src/execution/PromptResult.d.ts +2 -2
  9. package/esm/typings/src/execution/{PromptResultUsage.d.ts → Usage.d.ts} +5 -5
  10. package/esm/typings/src/execution/utils/addUsage.d.ts +2 -2
  11. package/esm/typings/src/execution/utils/computeUsageCounts.d.ts +3 -3
  12. package/esm/typings/src/execution/utils/usage-constants.d.ts +77 -60
  13. package/esm/typings/src/execution/utils/usageToHuman.d.ts +5 -5
  14. package/esm/typings/src/execution/utils/usageToWorktime.d.ts +5 -5
  15. package/esm/typings/src/llm-providers/_common/utils/count-total-usage/LlmExecutionToolsWithTotalUsage.d.ts +3 -3
  16. package/esm/typings/src/llm-providers/_common/utils/count-total-usage/limitTotalUsage.d.ts +2 -2
  17. package/esm/typings/src/llm-providers/anthropic-claude/computeAnthropicClaudeUsage.d.ts +2 -2
  18. package/esm/typings/src/llm-providers/openai/OpenAiExecutionTools.d.ts +0 -9
  19. package/esm/typings/src/llm-providers/openai/computeOpenAiUsage.d.ts +2 -2
  20. package/esm/typings/src/pipeline/PipelineJson/PreparationJson.d.ts +2 -2
  21. package/esm/typings/src/playground/BrjappConnector.d.ts +3 -0
  22. package/esm/typings/src/types/typeAliases.d.ts +6 -0
  23. package/package.json +2 -2
  24. package/umd/index.umd.js +463 -37
  25. package/umd/index.umd.js.map +1 -1
package/README.md CHANGED
@@ -260,7 +260,7 @@ Each part of the book defines one of 3 circles:
260
260
 
261
261
  ### **What:** Workflows, Tasks and Parameters
262
262
 
263
- What work needs to be done. Each book defines a workflow, which is one or more tasks. Each workflow has a fixed input and output. For example, you have a book that generates an article from a topic. Once it generates an article about AI, once about marketing, once about cooking. The workflow (= your AI program) is the same, only the input and output change.
263
+ What work needs to be done. Each book defines a [workflow *(scenario or pipeline)*](https://github.com/webgptorg/promptbook/discussions/88), which is one or more tasks. Each workflow has a fixed input and output. For example, you have a book that generates an article from a topic. Once it generates an article about AI, once about marketing, once about cooking. The workflow (= your AI program) is the same, only the input and output change.
264
264
 
265
265
  **Related commands:**
266
266
 
@@ -370,6 +370,8 @@ The following glossary is used to clarify certain concepts:
370
370
 
371
371
 
372
372
 
373
+
374
+
373
375
  _Note: This section is not complete dictionary, more list of general AI / LLM terms that has connection with Promptbook_
374
376
 
375
377
 
package/esm/index.es.js CHANGED
@@ -16,7 +16,7 @@ const BOOK_LANGUAGE_VERSION = '1.0.0';
16
16
  * @generated
17
17
  * @see https://github.com/webgptorg/promptbook
18
18
  */
19
- const PROMPTBOOK_ENGINE_VERSION = '0.89.0-1';
19
+ const PROMPTBOOK_ENGINE_VERSION = '0.89.0-3';
20
20
  /**
21
21
  * TODO: string_promptbook_version should be constrained to the all versions of Promptbook engine
22
22
  * Note: [💞] Ignore a discrepancy between file name and entity name
@@ -56,6 +56,400 @@ class PipelineExecutionError extends Error {
56
56
  * TODO: !!!!!! Add id to all errors
57
57
  */
58
58
 
59
+ /**
60
+ * Counts number of characters in the text
61
+ *
62
+ * @public exported from `@promptbook/utils`
63
+ */
64
+ function countCharacters(text) {
65
+ // Remove null characters
66
+ text = text.replace(/\0/g, '');
67
+ // Replace emojis (and also ZWJ sequence) with hyphens
68
+ text = text.replace(/(\p{Extended_Pictographic})\p{Modifier_Symbol}/gu, '$1');
69
+ text = text.replace(/(\p{Extended_Pictographic})[\u{FE00}-\u{FE0F}]/gu, '$1');
70
+ text = text.replace(/\p{Extended_Pictographic}(\u{200D}\p{Extended_Pictographic})*/gu, '-');
71
+ return text.length;
72
+ }
73
+ /**
74
+ * TODO: [🥴] Implement counting in formats - like JSON, CSV, XML,...
75
+ */
76
+
77
+ /**
78
+ * Number of characters per standard line with 11pt Arial font size.
79
+ *
80
+ * @public exported from `@promptbook/utils`
81
+ */
82
+ const CHARACTERS_PER_STANDARD_LINE = 63;
83
+ /**
84
+ * Number of lines per standard A4 page with 11pt Arial font size and standard margins and spacing.
85
+ *
86
+ * @public exported from `@promptbook/utils`
87
+ */
88
+ const LINES_PER_STANDARD_PAGE = 44;
89
+ /**
90
+ * TODO: [🧠] Should be this `constants.ts` or `config.ts`?
91
+ * Note: [💞] Ignore a discrepancy between file name and entity name
92
+ */
93
+
94
+ /**
95
+ * Counts number of lines in the text
96
+ *
97
+ * Note: This does not check only for the presence of newlines, but also for the length of the standard line.
98
+ *
99
+ * @public exported from `@promptbook/utils`
100
+ */
101
+ function countLines(text) {
102
+ text = text.replace('\r\n', '\n');
103
+ text = text.replace('\r', '\n');
104
+ const lines = text.split('\n');
105
+ return lines.reduce((count, line) => count + Math.ceil(line.length / CHARACTERS_PER_STANDARD_LINE), 0);
106
+ }
107
+ /**
108
+ * TODO: [🥴] Implement counting in formats - like JSON, CSV, XML,...
109
+ */
110
+
111
+ /**
112
+ * Counts number of pages in the text
113
+ *
114
+ * Note: This does not check only for the count of newlines, but also for the length of the standard line and length of the standard page.
115
+ *
116
+ * @public exported from `@promptbook/utils`
117
+ */
118
+ function countPages(text) {
119
+ return Math.ceil(countLines(text) / LINES_PER_STANDARD_PAGE);
120
+ }
121
+ /**
122
+ * TODO: [🥴] Implement counting in formats - like JSON, CSV, XML,...
123
+ */
124
+
125
+ /**
126
+ * Counts number of paragraphs in the text
127
+ *
128
+ * @public exported from `@promptbook/utils`
129
+ */
130
+ function countParagraphs(text) {
131
+ return text.split(/\n\s*\n/).filter((paragraph) => paragraph.trim() !== '').length;
132
+ }
133
+ /**
134
+ * TODO: [🥴] Implement counting in formats - like JSON, CSV, XML,...
135
+ */
136
+
137
+ /**
138
+ * Split text into sentences
139
+ *
140
+ * @public exported from `@promptbook/utils`
141
+ */
142
+ function splitIntoSentences(text) {
143
+ return text.split(/[.!?]+/).filter((sentence) => sentence.trim() !== '');
144
+ }
145
+ /**
146
+ * Counts number of sentences in the text
147
+ *
148
+ * @public exported from `@promptbook/utils`
149
+ */
150
+ function countSentences(text) {
151
+ return splitIntoSentences(text).length;
152
+ }
153
+ /**
154
+ * TODO: [🥴] Implement counting in formats - like JSON, CSV, XML,...
155
+ */
156
+
157
+ const defaultDiacriticsRemovalMap = [
158
+ {
159
+ base: 'A',
160
+ letters: '\u0041\u24B6\uFF21\u00C0\u00C1\u00C2\u1EA6\u1EA4\u1EAA\u1EA8\u00C3\u0100\u0102\u1EB0\u1EAE\u1EB4\u1EB2\u0226\u01E0\u00C4\u01DE\u1EA2\u00C5\u01FA\u01CD\u0200\u0202\u1EA0\u1EAC\u1EB6\u1E00\u0104\u023A\u2C6F',
161
+ },
162
+ { base: 'AA', letters: '\uA732' },
163
+ { base: 'AE', letters: '\u00C6\u01FC\u01E2' },
164
+ { base: 'AO', letters: '\uA734' },
165
+ { base: 'AU', letters: '\uA736' },
166
+ { base: 'AV', letters: '\uA738\uA73A' },
167
+ { base: 'AY', letters: '\uA73C' },
168
+ {
169
+ base: 'B',
170
+ letters: '\u0042\u24B7\uFF22\u1E02\u1E04\u1E06\u0243\u0182\u0181',
171
+ },
172
+ {
173
+ base: 'C',
174
+ letters: '\u0043\u24B8\uFF23\u0106\u0108\u010A\u010C\u00C7\u1E08\u0187\u023B\uA73E',
175
+ },
176
+ {
177
+ base: 'D',
178
+ letters: '\u0044\u24B9\uFF24\u1E0A\u010E\u1E0C\u1E10\u1E12\u1E0E\u0110\u018B\u018A\u0189\uA779\u00D0',
179
+ },
180
+ { base: 'DZ', letters: '\u01F1\u01C4' },
181
+ { base: 'Dz', letters: '\u01F2\u01C5' },
182
+ {
183
+ base: 'E',
184
+ letters: '\u0045\u24BA\uFF25\u00C8\u00C9\u00CA\u1EC0\u1EBE\u1EC4\u1EC2\u1EBC\u0112\u1E14\u1E16\u0114\u0116\u00CB\u1EBA\u011A\u0204\u0206\u1EB8\u1EC6\u0228\u1E1C\u0118\u1E18\u1E1A\u0190\u018E',
185
+ },
186
+ { base: 'F', letters: '\u0046\u24BB\uFF26\u1E1E\u0191\uA77B' },
187
+ {
188
+ base: 'G',
189
+ letters: '\u0047\u24BC\uFF27\u01F4\u011C\u1E20\u011E\u0120\u01E6\u0122\u01E4\u0193\uA7A0\uA77D\uA77E',
190
+ },
191
+ {
192
+ base: 'H',
193
+ letters: '\u0048\u24BD\uFF28\u0124\u1E22\u1E26\u021E\u1E24\u1E28\u1E2A\u0126\u2C67\u2C75\uA78D',
194
+ },
195
+ {
196
+ base: 'I',
197
+ letters: '\u0049\u24BE\uFF29\u00CC\u00CD\u00CE\u0128\u012A\u012C\u0130\u00CF\u1E2E\u1EC8\u01CF\u0208\u020A\u1ECA\u012E\u1E2C\u0197',
198
+ },
199
+ { base: 'J', letters: '\u004A\u24BF\uFF2A\u0134\u0248' },
200
+ {
201
+ base: 'K',
202
+ letters: '\u004B\u24C0\uFF2B\u1E30\u01E8\u1E32\u0136\u1E34\u0198\u2C69\uA740\uA742\uA744\uA7A2',
203
+ },
204
+ {
205
+ base: 'L',
206
+ letters: '\u004C\u24C1\uFF2C\u013F\u0139\u013D\u1E36\u1E38\u013B\u1E3C\u1E3A\u0141\u023D\u2C62\u2C60\uA748\uA746\uA780',
207
+ },
208
+ { base: 'LJ', letters: '\u01C7' },
209
+ { base: 'Lj', letters: '\u01C8' },
210
+ { base: 'M', letters: '\u004D\u24C2\uFF2D\u1E3E\u1E40\u1E42\u2C6E\u019C' },
211
+ {
212
+ base: 'N',
213
+ letters: '\u004E\u24C3\uFF2E\u01F8\u0143\u00D1\u1E44\u0147\u1E46\u0145\u1E4A\u1E48\u0220\u019D\uA790\uA7A4',
214
+ },
215
+ { base: 'NJ', letters: '\u01CA' },
216
+ { base: 'Nj', letters: '\u01CB' },
217
+ {
218
+ base: 'O',
219
+ letters: '\u004F\u24C4\uFF2F\u00D2\u00D3\u00D4\u1ED2\u1ED0\u1ED6\u1ED4\u00D5\u1E4C\u022C\u1E4E\u014C\u1E50\u1E52\u014E\u022E\u0230\u00D6\u022A\u1ECE\u0150\u01D1\u020C\u020E\u01A0\u1EDC\u1EDA\u1EE0\u1EDE\u1EE2\u1ECC\u1ED8\u01EA\u01EC\u00D8\u01FE\u0186\u019F\uA74A\uA74C',
220
+ },
221
+ { base: 'OI', letters: '\u01A2' },
222
+ { base: 'OO', letters: '\uA74E' },
223
+ { base: 'OU', letters: '\u0222' },
224
+ { base: 'OE', letters: '\u008C\u0152' },
225
+ { base: 'oe', letters: '\u009C\u0153' },
226
+ {
227
+ base: 'P',
228
+ letters: '\u0050\u24C5\uFF30\u1E54\u1E56\u01A4\u2C63\uA750\uA752\uA754',
229
+ },
230
+ { base: 'Q', letters: '\u0051\u24C6\uFF31\uA756\uA758\u024A' },
231
+ {
232
+ base: 'R',
233
+ letters: '\u0052\u24C7\uFF32\u0154\u1E58\u0158\u0210\u0212\u1E5A\u1E5C\u0156\u1E5E\u024C\u2C64\uA75A\uA7A6\uA782',
234
+ },
235
+ {
236
+ base: 'S',
237
+ letters: '\u0053\u24C8\uFF33\u1E9E\u015A\u1E64\u015C\u1E60\u0160\u1E66\u1E62\u1E68\u0218\u015E\u2C7E\uA7A8\uA784',
238
+ },
239
+ {
240
+ base: 'T',
241
+ letters: '\u0054\u24C9\uFF34\u1E6A\u0164\u1E6C\u021A\u0162\u1E70\u1E6E\u0166\u01AC\u01AE\u023E\uA786',
242
+ },
243
+ { base: 'TZ', letters: '\uA728' },
244
+ {
245
+ base: 'U',
246
+ letters: '\u0055\u24CA\uFF35\u00D9\u00DA\u00DB\u0168\u1E78\u016A\u1E7A\u016C\u00DC\u01DB\u01D7\u01D5\u01D9\u1EE6\u016E\u0170\u01D3\u0214\u0216\u01AF\u1EEA\u1EE8\u1EEE\u1EEC\u1EF0\u1EE4\u1E72\u0172\u1E76\u1E74\u0244',
247
+ },
248
+ { base: 'V', letters: '\u0056\u24CB\uFF36\u1E7C\u1E7E\u01B2\uA75E\u0245' },
249
+ { base: 'VY', letters: '\uA760' },
250
+ {
251
+ base: 'W',
252
+ letters: '\u0057\u24CC\uFF37\u1E80\u1E82\u0174\u1E86\u1E84\u1E88\u2C72',
253
+ },
254
+ { base: 'X', letters: '\u0058\u24CD\uFF38\u1E8A\u1E8C' },
255
+ {
256
+ base: 'Y',
257
+ letters: '\u0059\u24CE\uFF39\u1EF2\u00DD\u0176\u1EF8\u0232\u1E8E\u0178\u1EF6\u1EF4\u01B3\u024E\u1EFE',
258
+ },
259
+ {
260
+ base: 'Z',
261
+ letters: '\u005A\u24CF\uFF3A\u0179\u1E90\u017B\u017D\u1E92\u1E94\u01B5\u0224\u2C7F\u2C6B\uA762',
262
+ },
263
+ {
264
+ base: 'a',
265
+ letters: '\u0061\u24D0\uFF41\u1E9A\u00E0\u00E1\u00E2\u1EA7\u1EA5\u1EAB\u1EA9\u00E3\u0101\u0103\u1EB1\u1EAF\u1EB5\u1EB3\u0227\u01E1\u00E4\u01DF\u1EA3\u00E5\u01FB\u01CE\u0201\u0203\u1EA1\u1EAD\u1EB7\u1E01\u0105\u2C65\u0250',
266
+ },
267
+ { base: 'aa', letters: '\uA733' },
268
+ { base: 'ae', letters: '\u00E6\u01FD\u01E3' },
269
+ { base: 'ao', letters: '\uA735' },
270
+ { base: 'au', letters: '\uA737' },
271
+ { base: 'av', letters: '\uA739\uA73B' },
272
+ { base: 'ay', letters: '\uA73D' },
273
+ {
274
+ base: 'b',
275
+ letters: '\u0062\u24D1\uFF42\u1E03\u1E05\u1E07\u0180\u0183\u0253',
276
+ },
277
+ {
278
+ base: 'c',
279
+ letters: '\u0063\u24D2\uFF43\u0107\u0109\u010B\u010D\u00E7\u1E09\u0188\u023C\uA73F\u2184',
280
+ },
281
+ {
282
+ base: 'd',
283
+ letters: '\u0064\u24D3\uFF44\u1E0B\u010F\u1E0D\u1E11\u1E13\u1E0F\u0111\u018C\u0256\u0257\uA77A',
284
+ },
285
+ { base: 'dz', letters: '\u01F3\u01C6' },
286
+ {
287
+ base: 'e',
288
+ letters: '\u0065\u24D4\uFF45\u00E8\u00E9\u00EA\u1EC1\u1EBF\u1EC5\u1EC3\u1EBD\u0113\u1E15\u1E17\u0115\u0117\u00EB\u1EBB\u011B\u0205\u0207\u1EB9\u1EC7\u0229\u1E1D\u0119\u1E19\u1E1B\u0247\u025B\u01DD',
289
+ },
290
+ { base: 'f', letters: '\u0066\u24D5\uFF46\u1E1F\u0192\uA77C' },
291
+ {
292
+ base: 'g',
293
+ letters: '\u0067\u24D6\uFF47\u01F5\u011D\u1E21\u011F\u0121\u01E7\u0123\u01E5\u0260\uA7A1\u1D79\uA77F',
294
+ },
295
+ {
296
+ base: 'h',
297
+ letters: '\u0068\u24D7\uFF48\u0125\u1E23\u1E27\u021F\u1E25\u1E29\u1E2B\u1E96\u0127\u2C68\u2C76\u0265',
298
+ },
299
+ { base: 'hv', letters: '\u0195' },
300
+ {
301
+ base: 'i',
302
+ letters: '\u0069\u24D8\uFF49\u00EC\u00ED\u00EE\u0129\u012B\u012D\u00EF\u1E2F\u1EC9\u01D0\u0209\u020B\u1ECB\u012F\u1E2D\u0268\u0131',
303
+ },
304
+ { base: 'j', letters: '\u006A\u24D9\uFF4A\u0135\u01F0\u0249' },
305
+ {
306
+ base: 'k',
307
+ letters: '\u006B\u24DA\uFF4B\u1E31\u01E9\u1E33\u0137\u1E35\u0199\u2C6A\uA741\uA743\uA745\uA7A3',
308
+ },
309
+ {
310
+ base: 'l',
311
+ letters: '\u006C\u24DB\uFF4C\u0140\u013A\u013E\u1E37\u1E39\u013C\u1E3D\u1E3B\u017F\u0142\u019A\u026B\u2C61\uA749\uA781\uA747',
312
+ },
313
+ { base: 'lj', letters: '\u01C9' },
314
+ { base: 'm', letters: '\u006D\u24DC\uFF4D\u1E3F\u1E41\u1E43\u0271\u026F' },
315
+ {
316
+ base: 'n',
317
+ letters: '\u006E\u24DD\uFF4E\u01F9\u0144\u00F1\u1E45\u0148\u1E47\u0146\u1E4B\u1E49\u019E\u0272\u0149\uA791\uA7A5',
318
+ },
319
+ { base: 'nj', letters: '\u01CC' },
320
+ {
321
+ base: 'o',
322
+ letters: '\u006F\u24DE\uFF4F\u00F2\u00F3\u00F4\u1ED3\u1ED1\u1ED7\u1ED5\u00F5\u1E4D\u022D\u1E4F\u014D\u1E51\u1E53\u014F\u022F\u0231\u00F6\u022B\u1ECF\u0151\u01D2\u020D\u020F\u01A1\u1EDD\u1EDB\u1EE1\u1EDF\u1EE3\u1ECD\u1ED9\u01EB\u01ED\u00F8\u01FF\u0254\uA74B\uA74D\u0275',
323
+ },
324
+ { base: 'oi', letters: '\u01A3' },
325
+ { base: 'ou', letters: '\u0223' },
326
+ { base: 'oo', letters: '\uA74F' },
327
+ {
328
+ base: 'p',
329
+ letters: '\u0070\u24DF\uFF50\u1E55\u1E57\u01A5\u1D7D\uA751\uA753\uA755',
330
+ },
331
+ { base: 'q', letters: '\u0071\u24E0\uFF51\u024B\uA757\uA759' },
332
+ {
333
+ base: 'r',
334
+ letters: '\u0072\u24E1\uFF52\u0155\u1E59\u0159\u0211\u0213\u1E5B\u1E5D\u0157\u1E5F\u024D\u027D\uA75B\uA7A7\uA783',
335
+ },
336
+ {
337
+ base: 's',
338
+ letters: '\u0073\u24E2\uFF53\u00DF\u015B\u1E65\u015D\u1E61\u0161\u1E67\u1E63\u1E69\u0219\u015F\u023F\uA7A9\uA785\u1E9B',
339
+ },
340
+ {
341
+ base: 't',
342
+ letters: '\u0074\u24E3\uFF54\u1E6B\u1E97\u0165\u1E6D\u021B\u0163\u1E71\u1E6F\u0167\u01AD\u0288\u2C66\uA787',
343
+ },
344
+ { base: 'tz', letters: '\uA729' },
345
+ {
346
+ base: 'u',
347
+ letters: '\u0075\u24E4\uFF55\u00F9\u00FA\u00FB\u0169\u1E79\u016B\u1E7B\u016D\u00FC\u01DC\u01D8\u01D6\u01DA\u1EE7\u016F\u0171\u01D4\u0215\u0217\u01B0\u1EEB\u1EE9\u1EEF\u1EED\u1EF1\u1EE5\u1E73\u0173\u1E77\u1E75\u0289',
348
+ },
349
+ { base: 'v', letters: '\u0076\u24E5\uFF56\u1E7D\u1E7F\u028B\uA75F\u028C' },
350
+ { base: 'vy', letters: '\uA761' },
351
+ {
352
+ base: 'w',
353
+ letters: '\u0077\u24E6\uFF57\u1E81\u1E83\u0175\u1E87\u1E85\u1E98\u1E89\u2C73',
354
+ },
355
+ { base: 'x', letters: '\u0078\u24E7\uFF58\u1E8B\u1E8D' },
356
+ {
357
+ base: 'y',
358
+ letters: '\u0079\u24E8\uFF59\u1EF3\u00FD\u0177\u1EF9\u0233\u1E8F\u00FF\u1EF7\u1E99\u1EF5\u01B4\u024F\u1EFF',
359
+ },
360
+ {
361
+ base: 'z',
362
+ letters: '\u007A\u24E9\uFF5A\u017A\u1E91\u017C\u017E\u1E93\u1E95\u01B6\u0225\u0240\u2C6C\uA763',
363
+ },
364
+ ];
365
+ /**
366
+ * Map of letters from diacritic variant to diacritless variant
367
+ * Contains lowercase and uppercase separatelly
368
+ *
369
+ * > "á" => "a"
370
+ * > "ě" => "e"
371
+ * > "Ă" => "A"
372
+ * > ...
373
+ *
374
+ * @public exported from `@promptbook/utils`
375
+ */
376
+ const DIACRITIC_VARIANTS_LETTERS = {};
377
+ // tslint:disable-next-line: prefer-for-of
378
+ for (let i = 0; i < defaultDiacriticsRemovalMap.length; i++) {
379
+ const letters = defaultDiacriticsRemovalMap[i].letters;
380
+ // tslint:disable-next-line: prefer-for-of
381
+ for (let j = 0; j < letters.length; j++) {
382
+ DIACRITIC_VARIANTS_LETTERS[letters[j]] = defaultDiacriticsRemovalMap[i].base;
383
+ }
384
+ }
385
+ // <- TODO: [🍓] Put to maker function to save execution time if not needed
386
+ /*
387
+ @see https://stackoverflow.com/questions/990904/remove-accents-diacritics-in-a-string-in-javascript
388
+ Licensed under the Apache License, Version 2.0 (the "License");
389
+ you may not use this file except in compliance with the License.
390
+ You may obtain a copy of the License at
391
+
392
+ http://www.apache.org/licenses/LICENSE-2.0
393
+
394
+ Unless required by applicable law or agreed to in writing, software
395
+ distributed under the License is distributed on an "AS IS" BASIS,
396
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
397
+ See the License for the specific language governing permissions and
398
+ limitations under the License.
399
+ */
400
+
401
+ /**
402
+ * @@@
403
+ *
404
+ * @param input @@@
405
+ * @returns @@@
406
+ * @public exported from `@promptbook/utils`
407
+ */
408
+ function removeDiacritics(input) {
409
+ /*eslint no-control-regex: "off"*/
410
+ return input.replace(/[^\u0000-\u007E]/g, (a) => {
411
+ return DIACRITIC_VARIANTS_LETTERS[a] || a;
412
+ });
413
+ }
414
+ /**
415
+ * TODO: [Ж] Variant for cyrillic (and in general non-latin) letters
416
+ */
417
+
418
+ /**
419
+ * Counts number of words in the text
420
+ *
421
+ * @public exported from `@promptbook/utils`
422
+ */
423
+ function countWords(text) {
424
+ text = text.replace(/[\p{Extended_Pictographic}]/gu, 'a');
425
+ text = removeDiacritics(text);
426
+ // Add spaces before uppercase letters preceded by lowercase letters (for camelCase)
427
+ text = text.replace(/([a-z])([A-Z])/g, '$1 $2');
428
+ return text.split(/[^a-zа-я0-9]+/i).filter((word) => word.length > 0).length;
429
+ }
430
+ /**
431
+ * TODO: [🥴] Implement counting in formats - like JSON, CSV, XML,...
432
+ */
433
+
434
+ /**
435
+ * Helper of usage compute
436
+ *
437
+ * @param content the content of prompt or response
438
+ * @returns part of UsageCounts
439
+ *
440
+ * @private internal utility of LlmExecutionTools
441
+ */
442
+ function computeUsageCounts(content) {
443
+ return {
444
+ charactersCount: { value: countCharacters(content) },
445
+ wordsCount: { value: countWords(content) },
446
+ sentencesCount: { value: countSentences(content) },
447
+ linesCount: { value: countLines(content) },
448
+ paragraphsCount: { value: countParagraphs(content) },
449
+ pagesCount: { value: countPages(content) },
450
+ };
451
+ }
452
+
59
453
  /**
60
454
  * Freezes the given object and all its nested objects recursively
61
455
  *
@@ -83,30 +477,42 @@ function $deepFreeze(objectValue) {
83
477
  * TODO: [🧠] Is there a way how to meaningfully test this utility
84
478
  */
85
479
 
480
+ /**
481
+ * Represents the uncertain value
482
+ *
483
+ * @public exported from `@promptbook/core`
484
+ */
485
+ const ZERO_VALUE = $deepFreeze({ value: 0 });
486
+ /**
487
+ * Represents the uncertain value
488
+ *
489
+ * @public exported from `@promptbook/core`
490
+ */
491
+ const UNCERTAIN_ZERO_VALUE = $deepFreeze({ value: 0, isUncertain: true });
86
492
  /**
87
493
  * Represents the usage with no resources consumed
88
494
  *
89
495
  * @public exported from `@promptbook/core`
90
496
  */
91
497
  $deepFreeze({
92
- price: { value: 0 },
498
+ price: ZERO_VALUE,
93
499
  input: {
94
- tokensCount: { value: 0 },
95
- charactersCount: { value: 0 },
96
- wordsCount: { value: 0 },
97
- sentencesCount: { value: 0 },
98
- linesCount: { value: 0 },
99
- paragraphsCount: { value: 0 },
100
- pagesCount: { value: 0 },
500
+ tokensCount: ZERO_VALUE,
501
+ charactersCount: ZERO_VALUE,
502
+ wordsCount: ZERO_VALUE,
503
+ sentencesCount: ZERO_VALUE,
504
+ linesCount: ZERO_VALUE,
505
+ paragraphsCount: ZERO_VALUE,
506
+ pagesCount: ZERO_VALUE,
101
507
  },
102
508
  output: {
103
- tokensCount: { value: 0 },
104
- charactersCount: { value: 0 },
105
- wordsCount: { value: 0 },
106
- sentencesCount: { value: 0 },
107
- linesCount: { value: 0 },
108
- paragraphsCount: { value: 0 },
109
- pagesCount: { value: 0 },
509
+ tokensCount: ZERO_VALUE,
510
+ charactersCount: ZERO_VALUE,
511
+ wordsCount: ZERO_VALUE,
512
+ sentencesCount: ZERO_VALUE,
513
+ linesCount: ZERO_VALUE,
514
+ paragraphsCount: ZERO_VALUE,
515
+ pagesCount: ZERO_VALUE,
110
516
  },
111
517
  });
112
518
  /**
@@ -114,31 +520,45 @@ $deepFreeze({
114
520
  *
115
521
  * @public exported from `@promptbook/core`
116
522
  */
117
- const UNCERTAIN_USAGE = $deepFreeze({
118
- price: { value: 0, isUncertain: true },
523
+ $deepFreeze({
524
+ price: UNCERTAIN_ZERO_VALUE,
119
525
  input: {
120
- tokensCount: { value: 0, isUncertain: true },
121
- charactersCount: { value: 0, isUncertain: true },
122
- wordsCount: { value: 0, isUncertain: true },
123
- sentencesCount: { value: 0, isUncertain: true },
124
- linesCount: { value: 0, isUncertain: true },
125
- paragraphsCount: { value: 0, isUncertain: true },
126
- pagesCount: { value: 0, isUncertain: true },
526
+ tokensCount: UNCERTAIN_ZERO_VALUE,
527
+ charactersCount: UNCERTAIN_ZERO_VALUE,
528
+ wordsCount: UNCERTAIN_ZERO_VALUE,
529
+ sentencesCount: UNCERTAIN_ZERO_VALUE,
530
+ linesCount: UNCERTAIN_ZERO_VALUE,
531
+ paragraphsCount: UNCERTAIN_ZERO_VALUE,
532
+ pagesCount: UNCERTAIN_ZERO_VALUE,
127
533
  },
128
534
  output: {
129
- tokensCount: { value: 0, isUncertain: true },
130
- charactersCount: { value: 0, isUncertain: true },
131
- wordsCount: { value: 0, isUncertain: true },
132
- sentencesCount: { value: 0, isUncertain: true },
133
- linesCount: { value: 0, isUncertain: true },
134
- paragraphsCount: { value: 0, isUncertain: true },
135
- pagesCount: { value: 0, isUncertain: true },
535
+ tokensCount: UNCERTAIN_ZERO_VALUE,
536
+ charactersCount: UNCERTAIN_ZERO_VALUE,
537
+ wordsCount: UNCERTAIN_ZERO_VALUE,
538
+ sentencesCount: UNCERTAIN_ZERO_VALUE,
539
+ linesCount: UNCERTAIN_ZERO_VALUE,
540
+ paragraphsCount: UNCERTAIN_ZERO_VALUE,
541
+ pagesCount: UNCERTAIN_ZERO_VALUE,
136
542
  },
137
543
  });
138
544
  /**
139
545
  * Note: [💞] Ignore a discrepancy between file name and entity name
140
546
  */
141
547
 
548
+ /**
549
+ * Make UncertainNumber
550
+ *
551
+ * @param value
552
+ *
553
+ * @private utility for initializating UncertainNumber
554
+ */
555
+ function uncertainNumber(value) {
556
+ if (value === null || value === undefined || Number.isNaN(value)) {
557
+ return UNCERTAIN_ZERO_VALUE;
558
+ }
559
+ return { value };
560
+ }
561
+
142
562
  /**
143
563
  * Simple wrapper `new Date().toISOString()`
144
564
  *
@@ -828,11 +1248,17 @@ function createExecutionToolsFromVercelProvider(options) {
828
1248
  throw new PipelineExecutionError('No response message');
829
1249
  }
830
1250
  const complete = $getCurrentDate();
831
- /*
832
- TODO: [🕘] Usage count
833
- const usage = computeOpenAiUsage(content || '', resultContent || '', rawResponse);
834
- */
835
- const usage = UNCERTAIN_USAGE;
1251
+ const usage = {
1252
+ price: UNCERTAIN_ZERO_VALUE,
1253
+ input: {
1254
+ tokensCount: uncertainNumber(rawResponse.usage.promptTokens),
1255
+ ...computeUsageCounts(rawPromptContent),
1256
+ },
1257
+ output: {
1258
+ tokensCount: uncertainNumber(rawResponse.usage.completionTokens),
1259
+ ...computeUsageCounts(rawResponse.text),
1260
+ },
1261
+ };
836
1262
  return exportJson({
837
1263
  name: 'promptResult',
838
1264
  message: `Result of \`createExecutionToolsFromVercelProvider.callChatModel\``,