@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
@@ -1,6 +1,6 @@
1
1
  import type OpenAI from 'openai';
2
2
  import type { PartialDeep } from 'type-fest';
3
- import type { PromptResultUsage } from '../../execution/PromptResultUsage';
3
+ import type { Usage } from '../../execution/Usage';
4
4
  import type { Prompt } from '../../types/Prompt';
5
5
  /**
6
6
  * Computes the usage of the OpenAI API based on the response from OpenAI
@@ -12,7 +12,7 @@ import type { Prompt } from '../../types/Prompt';
12
12
  * @private internal utility of `OpenAiExecutionTools`
13
13
  */
14
14
  export declare function computeOpenAiUsage(promptContent: Prompt['content'], // <- Note: Intentionally using [] to access type properties to bring jsdoc from Prompt/PromptResult to consumer
15
- resultContent: string, rawResponse: PartialDeep<Pick<OpenAI.Chat.Completions.ChatCompletion | OpenAI.Completions.Completion | OpenAI.Embeddings.CreateEmbeddingResponse, 'model' | 'usage'>>): PromptResultUsage;
15
+ resultContent: string, rawResponse: PartialDeep<Pick<OpenAI.Chat.Completions.ChatCompletion | OpenAI.Completions.Completion | OpenAI.Embeddings.CreateEmbeddingResponse, 'model' | 'usage'>>): Usage;
16
16
  /**
17
17
  * TODO: [🤝] DRY Maybe some common abstraction between `computeOpenAiUsage` and `computeAnthropicClaudeUsage`
18
18
  */
@@ -1,4 +1,4 @@
1
- import type { PromptResultUsage } from '../../execution/PromptResultUsage';
1
+ import type { Usage } from '../../execution/Usage';
2
2
  import type { number_id } from '../../types/typeAliases';
3
3
  import type { string_promptbook_version } from '../../version';
4
4
  export type PreparationJson = {
@@ -13,7 +13,7 @@ export type PreparationJson = {
13
13
  /**
14
14
  * Usage of the prompt execution
15
15
  */
16
- readonly usage: PromptResultUsage;
16
+ readonly usage: Usage;
17
17
  };
18
18
  /**
19
19
  * TODO: [🍙] Make some standard order of json properties
@@ -1,3 +1,6 @@
1
+ /**
2
+ * TODO: !!!!!! Implement Promptbook remote server login and move to Promptbook.studio
3
+ */
1
4
  type BrjappOptions = {
2
5
  /**
3
6
  * Add user to these groups
@@ -242,6 +242,12 @@ export type string_promptbook_documentation_url = `https://github.com/webgptorg/
242
242
  * For example `"towns.cz"`
243
243
  */
244
244
  export type string_domain = string;
245
+ /**
246
+ * Semantic helper
247
+ *
248
+ * For example `"https://*.pavolhejny.com/*"`
249
+ */
250
+ export type string_origin = string;
245
251
  /**
246
252
  * Semantic helper
247
253
  *
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@promptbook/vercel",
3
- "version": "0.89.0-1",
3
+ "version": "0.89.0-3",
4
4
  "description": "It's time for a paradigm shift. The future of software in plain English, French or Latin",
5
5
  "private": false,
6
6
  "sideEffects": false,
@@ -47,7 +47,7 @@
47
47
  "module": "./esm/index.es.js",
48
48
  "typings": "./esm/typings/src/_packages/vercel.index.d.ts",
49
49
  "peerDependencies": {
50
- "@promptbook/core": "0.89.0-1"
50
+ "@promptbook/core": "0.89.0-3"
51
51
  },
52
52
  "dependencies": {
53
53
  "colors": "1.4.0",
package/umd/index.umd.js CHANGED
@@ -23,7 +23,7 @@
23
23
  * @generated
24
24
  * @see https://github.com/webgptorg/promptbook
25
25
  */
26
- const PROMPTBOOK_ENGINE_VERSION = '0.89.0-1';
26
+ const PROMPTBOOK_ENGINE_VERSION = '0.89.0-3';
27
27
  /**
28
28
  * TODO: string_promptbook_version should be constrained to the all versions of Promptbook engine
29
29
  * Note: [💞] Ignore a discrepancy between file name and entity name
@@ -63,6 +63,400 @@
63
63
  * TODO: !!!!!! Add id to all errors
64
64
  */
65
65
 
66
+ /**
67
+ * Counts number of characters in the text
68
+ *
69
+ * @public exported from `@promptbook/utils`
70
+ */
71
+ function countCharacters(text) {
72
+ // Remove null characters
73
+ text = text.replace(/\0/g, '');
74
+ // Replace emojis (and also ZWJ sequence) with hyphens
75
+ text = text.replace(/(\p{Extended_Pictographic})\p{Modifier_Symbol}/gu, '$1');
76
+ text = text.replace(/(\p{Extended_Pictographic})[\u{FE00}-\u{FE0F}]/gu, '$1');
77
+ text = text.replace(/\p{Extended_Pictographic}(\u{200D}\p{Extended_Pictographic})*/gu, '-');
78
+ return text.length;
79
+ }
80
+ /**
81
+ * TODO: [🥴] Implement counting in formats - like JSON, CSV, XML,...
82
+ */
83
+
84
+ /**
85
+ * Number of characters per standard line with 11pt Arial font size.
86
+ *
87
+ * @public exported from `@promptbook/utils`
88
+ */
89
+ const CHARACTERS_PER_STANDARD_LINE = 63;
90
+ /**
91
+ * Number of lines per standard A4 page with 11pt Arial font size and standard margins and spacing.
92
+ *
93
+ * @public exported from `@promptbook/utils`
94
+ */
95
+ const LINES_PER_STANDARD_PAGE = 44;
96
+ /**
97
+ * TODO: [🧠] Should be this `constants.ts` or `config.ts`?
98
+ * Note: [💞] Ignore a discrepancy between file name and entity name
99
+ */
100
+
101
+ /**
102
+ * Counts number of lines in the text
103
+ *
104
+ * Note: This does not check only for the presence of newlines, but also for the length of the standard line.
105
+ *
106
+ * @public exported from `@promptbook/utils`
107
+ */
108
+ function countLines(text) {
109
+ text = text.replace('\r\n', '\n');
110
+ text = text.replace('\r', '\n');
111
+ const lines = text.split('\n');
112
+ return lines.reduce((count, line) => count + Math.ceil(line.length / CHARACTERS_PER_STANDARD_LINE), 0);
113
+ }
114
+ /**
115
+ * TODO: [🥴] Implement counting in formats - like JSON, CSV, XML,...
116
+ */
117
+
118
+ /**
119
+ * Counts number of pages in the text
120
+ *
121
+ * 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.
122
+ *
123
+ * @public exported from `@promptbook/utils`
124
+ */
125
+ function countPages(text) {
126
+ return Math.ceil(countLines(text) / LINES_PER_STANDARD_PAGE);
127
+ }
128
+ /**
129
+ * TODO: [🥴] Implement counting in formats - like JSON, CSV, XML,...
130
+ */
131
+
132
+ /**
133
+ * Counts number of paragraphs in the text
134
+ *
135
+ * @public exported from `@promptbook/utils`
136
+ */
137
+ function countParagraphs(text) {
138
+ return text.split(/\n\s*\n/).filter((paragraph) => paragraph.trim() !== '').length;
139
+ }
140
+ /**
141
+ * TODO: [🥴] Implement counting in formats - like JSON, CSV, XML,...
142
+ */
143
+
144
+ /**
145
+ * Split text into sentences
146
+ *
147
+ * @public exported from `@promptbook/utils`
148
+ */
149
+ function splitIntoSentences(text) {
150
+ return text.split(/[.!?]+/).filter((sentence) => sentence.trim() !== '');
151
+ }
152
+ /**
153
+ * Counts number of sentences in the text
154
+ *
155
+ * @public exported from `@promptbook/utils`
156
+ */
157
+ function countSentences(text) {
158
+ return splitIntoSentences(text).length;
159
+ }
160
+ /**
161
+ * TODO: [🥴] Implement counting in formats - like JSON, CSV, XML,...
162
+ */
163
+
164
+ const defaultDiacriticsRemovalMap = [
165
+ {
166
+ base: 'A',
167
+ 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',
168
+ },
169
+ { base: 'AA', letters: '\uA732' },
170
+ { base: 'AE', letters: '\u00C6\u01FC\u01E2' },
171
+ { base: 'AO', letters: '\uA734' },
172
+ { base: 'AU', letters: '\uA736' },
173
+ { base: 'AV', letters: '\uA738\uA73A' },
174
+ { base: 'AY', letters: '\uA73C' },
175
+ {
176
+ base: 'B',
177
+ letters: '\u0042\u24B7\uFF22\u1E02\u1E04\u1E06\u0243\u0182\u0181',
178
+ },
179
+ {
180
+ base: 'C',
181
+ letters: '\u0043\u24B8\uFF23\u0106\u0108\u010A\u010C\u00C7\u1E08\u0187\u023B\uA73E',
182
+ },
183
+ {
184
+ base: 'D',
185
+ letters: '\u0044\u24B9\uFF24\u1E0A\u010E\u1E0C\u1E10\u1E12\u1E0E\u0110\u018B\u018A\u0189\uA779\u00D0',
186
+ },
187
+ { base: 'DZ', letters: '\u01F1\u01C4' },
188
+ { base: 'Dz', letters: '\u01F2\u01C5' },
189
+ {
190
+ base: 'E',
191
+ 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',
192
+ },
193
+ { base: 'F', letters: '\u0046\u24BB\uFF26\u1E1E\u0191\uA77B' },
194
+ {
195
+ base: 'G',
196
+ letters: '\u0047\u24BC\uFF27\u01F4\u011C\u1E20\u011E\u0120\u01E6\u0122\u01E4\u0193\uA7A0\uA77D\uA77E',
197
+ },
198
+ {
199
+ base: 'H',
200
+ letters: '\u0048\u24BD\uFF28\u0124\u1E22\u1E26\u021E\u1E24\u1E28\u1E2A\u0126\u2C67\u2C75\uA78D',
201
+ },
202
+ {
203
+ base: 'I',
204
+ letters: '\u0049\u24BE\uFF29\u00CC\u00CD\u00CE\u0128\u012A\u012C\u0130\u00CF\u1E2E\u1EC8\u01CF\u0208\u020A\u1ECA\u012E\u1E2C\u0197',
205
+ },
206
+ { base: 'J', letters: '\u004A\u24BF\uFF2A\u0134\u0248' },
207
+ {
208
+ base: 'K',
209
+ letters: '\u004B\u24C0\uFF2B\u1E30\u01E8\u1E32\u0136\u1E34\u0198\u2C69\uA740\uA742\uA744\uA7A2',
210
+ },
211
+ {
212
+ base: 'L',
213
+ letters: '\u004C\u24C1\uFF2C\u013F\u0139\u013D\u1E36\u1E38\u013B\u1E3C\u1E3A\u0141\u023D\u2C62\u2C60\uA748\uA746\uA780',
214
+ },
215
+ { base: 'LJ', letters: '\u01C7' },
216
+ { base: 'Lj', letters: '\u01C8' },
217
+ { base: 'M', letters: '\u004D\u24C2\uFF2D\u1E3E\u1E40\u1E42\u2C6E\u019C' },
218
+ {
219
+ base: 'N',
220
+ letters: '\u004E\u24C3\uFF2E\u01F8\u0143\u00D1\u1E44\u0147\u1E46\u0145\u1E4A\u1E48\u0220\u019D\uA790\uA7A4',
221
+ },
222
+ { base: 'NJ', letters: '\u01CA' },
223
+ { base: 'Nj', letters: '\u01CB' },
224
+ {
225
+ base: 'O',
226
+ 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',
227
+ },
228
+ { base: 'OI', letters: '\u01A2' },
229
+ { base: 'OO', letters: '\uA74E' },
230
+ { base: 'OU', letters: '\u0222' },
231
+ { base: 'OE', letters: '\u008C\u0152' },
232
+ { base: 'oe', letters: '\u009C\u0153' },
233
+ {
234
+ base: 'P',
235
+ letters: '\u0050\u24C5\uFF30\u1E54\u1E56\u01A4\u2C63\uA750\uA752\uA754',
236
+ },
237
+ { base: 'Q', letters: '\u0051\u24C6\uFF31\uA756\uA758\u024A' },
238
+ {
239
+ base: 'R',
240
+ letters: '\u0052\u24C7\uFF32\u0154\u1E58\u0158\u0210\u0212\u1E5A\u1E5C\u0156\u1E5E\u024C\u2C64\uA75A\uA7A6\uA782',
241
+ },
242
+ {
243
+ base: 'S',
244
+ letters: '\u0053\u24C8\uFF33\u1E9E\u015A\u1E64\u015C\u1E60\u0160\u1E66\u1E62\u1E68\u0218\u015E\u2C7E\uA7A8\uA784',
245
+ },
246
+ {
247
+ base: 'T',
248
+ letters: '\u0054\u24C9\uFF34\u1E6A\u0164\u1E6C\u021A\u0162\u1E70\u1E6E\u0166\u01AC\u01AE\u023E\uA786',
249
+ },
250
+ { base: 'TZ', letters: '\uA728' },
251
+ {
252
+ base: 'U',
253
+ 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',
254
+ },
255
+ { base: 'V', letters: '\u0056\u24CB\uFF36\u1E7C\u1E7E\u01B2\uA75E\u0245' },
256
+ { base: 'VY', letters: '\uA760' },
257
+ {
258
+ base: 'W',
259
+ letters: '\u0057\u24CC\uFF37\u1E80\u1E82\u0174\u1E86\u1E84\u1E88\u2C72',
260
+ },
261
+ { base: 'X', letters: '\u0058\u24CD\uFF38\u1E8A\u1E8C' },
262
+ {
263
+ base: 'Y',
264
+ letters: '\u0059\u24CE\uFF39\u1EF2\u00DD\u0176\u1EF8\u0232\u1E8E\u0178\u1EF6\u1EF4\u01B3\u024E\u1EFE',
265
+ },
266
+ {
267
+ base: 'Z',
268
+ letters: '\u005A\u24CF\uFF3A\u0179\u1E90\u017B\u017D\u1E92\u1E94\u01B5\u0224\u2C7F\u2C6B\uA762',
269
+ },
270
+ {
271
+ base: 'a',
272
+ 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',
273
+ },
274
+ { base: 'aa', letters: '\uA733' },
275
+ { base: 'ae', letters: '\u00E6\u01FD\u01E3' },
276
+ { base: 'ao', letters: '\uA735' },
277
+ { base: 'au', letters: '\uA737' },
278
+ { base: 'av', letters: '\uA739\uA73B' },
279
+ { base: 'ay', letters: '\uA73D' },
280
+ {
281
+ base: 'b',
282
+ letters: '\u0062\u24D1\uFF42\u1E03\u1E05\u1E07\u0180\u0183\u0253',
283
+ },
284
+ {
285
+ base: 'c',
286
+ letters: '\u0063\u24D2\uFF43\u0107\u0109\u010B\u010D\u00E7\u1E09\u0188\u023C\uA73F\u2184',
287
+ },
288
+ {
289
+ base: 'd',
290
+ letters: '\u0064\u24D3\uFF44\u1E0B\u010F\u1E0D\u1E11\u1E13\u1E0F\u0111\u018C\u0256\u0257\uA77A',
291
+ },
292
+ { base: 'dz', letters: '\u01F3\u01C6' },
293
+ {
294
+ base: 'e',
295
+ 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',
296
+ },
297
+ { base: 'f', letters: '\u0066\u24D5\uFF46\u1E1F\u0192\uA77C' },
298
+ {
299
+ base: 'g',
300
+ letters: '\u0067\u24D6\uFF47\u01F5\u011D\u1E21\u011F\u0121\u01E7\u0123\u01E5\u0260\uA7A1\u1D79\uA77F',
301
+ },
302
+ {
303
+ base: 'h',
304
+ letters: '\u0068\u24D7\uFF48\u0125\u1E23\u1E27\u021F\u1E25\u1E29\u1E2B\u1E96\u0127\u2C68\u2C76\u0265',
305
+ },
306
+ { base: 'hv', letters: '\u0195' },
307
+ {
308
+ base: 'i',
309
+ letters: '\u0069\u24D8\uFF49\u00EC\u00ED\u00EE\u0129\u012B\u012D\u00EF\u1E2F\u1EC9\u01D0\u0209\u020B\u1ECB\u012F\u1E2D\u0268\u0131',
310
+ },
311
+ { base: 'j', letters: '\u006A\u24D9\uFF4A\u0135\u01F0\u0249' },
312
+ {
313
+ base: 'k',
314
+ letters: '\u006B\u24DA\uFF4B\u1E31\u01E9\u1E33\u0137\u1E35\u0199\u2C6A\uA741\uA743\uA745\uA7A3',
315
+ },
316
+ {
317
+ base: 'l',
318
+ letters: '\u006C\u24DB\uFF4C\u0140\u013A\u013E\u1E37\u1E39\u013C\u1E3D\u1E3B\u017F\u0142\u019A\u026B\u2C61\uA749\uA781\uA747',
319
+ },
320
+ { base: 'lj', letters: '\u01C9' },
321
+ { base: 'm', letters: '\u006D\u24DC\uFF4D\u1E3F\u1E41\u1E43\u0271\u026F' },
322
+ {
323
+ base: 'n',
324
+ letters: '\u006E\u24DD\uFF4E\u01F9\u0144\u00F1\u1E45\u0148\u1E47\u0146\u1E4B\u1E49\u019E\u0272\u0149\uA791\uA7A5',
325
+ },
326
+ { base: 'nj', letters: '\u01CC' },
327
+ {
328
+ base: 'o',
329
+ 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',
330
+ },
331
+ { base: 'oi', letters: '\u01A3' },
332
+ { base: 'ou', letters: '\u0223' },
333
+ { base: 'oo', letters: '\uA74F' },
334
+ {
335
+ base: 'p',
336
+ letters: '\u0070\u24DF\uFF50\u1E55\u1E57\u01A5\u1D7D\uA751\uA753\uA755',
337
+ },
338
+ { base: 'q', letters: '\u0071\u24E0\uFF51\u024B\uA757\uA759' },
339
+ {
340
+ base: 'r',
341
+ letters: '\u0072\u24E1\uFF52\u0155\u1E59\u0159\u0211\u0213\u1E5B\u1E5D\u0157\u1E5F\u024D\u027D\uA75B\uA7A7\uA783',
342
+ },
343
+ {
344
+ base: 's',
345
+ letters: '\u0073\u24E2\uFF53\u00DF\u015B\u1E65\u015D\u1E61\u0161\u1E67\u1E63\u1E69\u0219\u015F\u023F\uA7A9\uA785\u1E9B',
346
+ },
347
+ {
348
+ base: 't',
349
+ letters: '\u0074\u24E3\uFF54\u1E6B\u1E97\u0165\u1E6D\u021B\u0163\u1E71\u1E6F\u0167\u01AD\u0288\u2C66\uA787',
350
+ },
351
+ { base: 'tz', letters: '\uA729' },
352
+ {
353
+ base: 'u',
354
+ 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',
355
+ },
356
+ { base: 'v', letters: '\u0076\u24E5\uFF56\u1E7D\u1E7F\u028B\uA75F\u028C' },
357
+ { base: 'vy', letters: '\uA761' },
358
+ {
359
+ base: 'w',
360
+ letters: '\u0077\u24E6\uFF57\u1E81\u1E83\u0175\u1E87\u1E85\u1E98\u1E89\u2C73',
361
+ },
362
+ { base: 'x', letters: '\u0078\u24E7\uFF58\u1E8B\u1E8D' },
363
+ {
364
+ base: 'y',
365
+ letters: '\u0079\u24E8\uFF59\u1EF3\u00FD\u0177\u1EF9\u0233\u1E8F\u00FF\u1EF7\u1E99\u1EF5\u01B4\u024F\u1EFF',
366
+ },
367
+ {
368
+ base: 'z',
369
+ letters: '\u007A\u24E9\uFF5A\u017A\u1E91\u017C\u017E\u1E93\u1E95\u01B6\u0225\u0240\u2C6C\uA763',
370
+ },
371
+ ];
372
+ /**
373
+ * Map of letters from diacritic variant to diacritless variant
374
+ * Contains lowercase and uppercase separatelly
375
+ *
376
+ * > "á" => "a"
377
+ * > "ě" => "e"
378
+ * > "Ă" => "A"
379
+ * > ...
380
+ *
381
+ * @public exported from `@promptbook/utils`
382
+ */
383
+ const DIACRITIC_VARIANTS_LETTERS = {};
384
+ // tslint:disable-next-line: prefer-for-of
385
+ for (let i = 0; i < defaultDiacriticsRemovalMap.length; i++) {
386
+ const letters = defaultDiacriticsRemovalMap[i].letters;
387
+ // tslint:disable-next-line: prefer-for-of
388
+ for (let j = 0; j < letters.length; j++) {
389
+ DIACRITIC_VARIANTS_LETTERS[letters[j]] = defaultDiacriticsRemovalMap[i].base;
390
+ }
391
+ }
392
+ // <- TODO: [🍓] Put to maker function to save execution time if not needed
393
+ /*
394
+ @see https://stackoverflow.com/questions/990904/remove-accents-diacritics-in-a-string-in-javascript
395
+ Licensed under the Apache License, Version 2.0 (the "License");
396
+ you may not use this file except in compliance with the License.
397
+ You may obtain a copy of the License at
398
+
399
+ http://www.apache.org/licenses/LICENSE-2.0
400
+
401
+ Unless required by applicable law or agreed to in writing, software
402
+ distributed under the License is distributed on an "AS IS" BASIS,
403
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
404
+ See the License for the specific language governing permissions and
405
+ limitations under the License.
406
+ */
407
+
408
+ /**
409
+ * @@@
410
+ *
411
+ * @param input @@@
412
+ * @returns @@@
413
+ * @public exported from `@promptbook/utils`
414
+ */
415
+ function removeDiacritics(input) {
416
+ /*eslint no-control-regex: "off"*/
417
+ return input.replace(/[^\u0000-\u007E]/g, (a) => {
418
+ return DIACRITIC_VARIANTS_LETTERS[a] || a;
419
+ });
420
+ }
421
+ /**
422
+ * TODO: [Ж] Variant for cyrillic (and in general non-latin) letters
423
+ */
424
+
425
+ /**
426
+ * Counts number of words in the text
427
+ *
428
+ * @public exported from `@promptbook/utils`
429
+ */
430
+ function countWords(text) {
431
+ text = text.replace(/[\p{Extended_Pictographic}]/gu, 'a');
432
+ text = removeDiacritics(text);
433
+ // Add spaces before uppercase letters preceded by lowercase letters (for camelCase)
434
+ text = text.replace(/([a-z])([A-Z])/g, '$1 $2');
435
+ return text.split(/[^a-zа-я0-9]+/i).filter((word) => word.length > 0).length;
436
+ }
437
+ /**
438
+ * TODO: [🥴] Implement counting in formats - like JSON, CSV, XML,...
439
+ */
440
+
441
+ /**
442
+ * Helper of usage compute
443
+ *
444
+ * @param content the content of prompt or response
445
+ * @returns part of UsageCounts
446
+ *
447
+ * @private internal utility of LlmExecutionTools
448
+ */
449
+ function computeUsageCounts(content) {
450
+ return {
451
+ charactersCount: { value: countCharacters(content) },
452
+ wordsCount: { value: countWords(content) },
453
+ sentencesCount: { value: countSentences(content) },
454
+ linesCount: { value: countLines(content) },
455
+ paragraphsCount: { value: countParagraphs(content) },
456
+ pagesCount: { value: countPages(content) },
457
+ };
458
+ }
459
+
66
460
  /**
67
461
  * Freezes the given object and all its nested objects recursively
68
462
  *
@@ -90,30 +484,42 @@
90
484
  * TODO: [🧠] Is there a way how to meaningfully test this utility
91
485
  */
92
486
 
487
+ /**
488
+ * Represents the uncertain value
489
+ *
490
+ * @public exported from `@promptbook/core`
491
+ */
492
+ const ZERO_VALUE = $deepFreeze({ value: 0 });
493
+ /**
494
+ * Represents the uncertain value
495
+ *
496
+ * @public exported from `@promptbook/core`
497
+ */
498
+ const UNCERTAIN_ZERO_VALUE = $deepFreeze({ value: 0, isUncertain: true });
93
499
  /**
94
500
  * Represents the usage with no resources consumed
95
501
  *
96
502
  * @public exported from `@promptbook/core`
97
503
  */
98
504
  $deepFreeze({
99
- price: { value: 0 },
505
+ price: ZERO_VALUE,
100
506
  input: {
101
- tokensCount: { value: 0 },
102
- charactersCount: { value: 0 },
103
- wordsCount: { value: 0 },
104
- sentencesCount: { value: 0 },
105
- linesCount: { value: 0 },
106
- paragraphsCount: { value: 0 },
107
- pagesCount: { value: 0 },
507
+ tokensCount: ZERO_VALUE,
508
+ charactersCount: ZERO_VALUE,
509
+ wordsCount: ZERO_VALUE,
510
+ sentencesCount: ZERO_VALUE,
511
+ linesCount: ZERO_VALUE,
512
+ paragraphsCount: ZERO_VALUE,
513
+ pagesCount: ZERO_VALUE,
108
514
  },
109
515
  output: {
110
- tokensCount: { value: 0 },
111
- charactersCount: { value: 0 },
112
- wordsCount: { value: 0 },
113
- sentencesCount: { value: 0 },
114
- linesCount: { value: 0 },
115
- paragraphsCount: { value: 0 },
116
- pagesCount: { value: 0 },
516
+ tokensCount: ZERO_VALUE,
517
+ charactersCount: ZERO_VALUE,
518
+ wordsCount: ZERO_VALUE,
519
+ sentencesCount: ZERO_VALUE,
520
+ linesCount: ZERO_VALUE,
521
+ paragraphsCount: ZERO_VALUE,
522
+ pagesCount: ZERO_VALUE,
117
523
  },
118
524
  });
119
525
  /**
@@ -121,31 +527,45 @@
121
527
  *
122
528
  * @public exported from `@promptbook/core`
123
529
  */
124
- const UNCERTAIN_USAGE = $deepFreeze({
125
- price: { value: 0, isUncertain: true },
530
+ $deepFreeze({
531
+ price: UNCERTAIN_ZERO_VALUE,
126
532
  input: {
127
- tokensCount: { value: 0, isUncertain: true },
128
- charactersCount: { value: 0, isUncertain: true },
129
- wordsCount: { value: 0, isUncertain: true },
130
- sentencesCount: { value: 0, isUncertain: true },
131
- linesCount: { value: 0, isUncertain: true },
132
- paragraphsCount: { value: 0, isUncertain: true },
133
- pagesCount: { value: 0, isUncertain: true },
533
+ tokensCount: UNCERTAIN_ZERO_VALUE,
534
+ charactersCount: UNCERTAIN_ZERO_VALUE,
535
+ wordsCount: UNCERTAIN_ZERO_VALUE,
536
+ sentencesCount: UNCERTAIN_ZERO_VALUE,
537
+ linesCount: UNCERTAIN_ZERO_VALUE,
538
+ paragraphsCount: UNCERTAIN_ZERO_VALUE,
539
+ pagesCount: UNCERTAIN_ZERO_VALUE,
134
540
  },
135
541
  output: {
136
- tokensCount: { value: 0, isUncertain: true },
137
- charactersCount: { value: 0, isUncertain: true },
138
- wordsCount: { value: 0, isUncertain: true },
139
- sentencesCount: { value: 0, isUncertain: true },
140
- linesCount: { value: 0, isUncertain: true },
141
- paragraphsCount: { value: 0, isUncertain: true },
142
- pagesCount: { value: 0, isUncertain: true },
542
+ tokensCount: UNCERTAIN_ZERO_VALUE,
543
+ charactersCount: UNCERTAIN_ZERO_VALUE,
544
+ wordsCount: UNCERTAIN_ZERO_VALUE,
545
+ sentencesCount: UNCERTAIN_ZERO_VALUE,
546
+ linesCount: UNCERTAIN_ZERO_VALUE,
547
+ paragraphsCount: UNCERTAIN_ZERO_VALUE,
548
+ pagesCount: UNCERTAIN_ZERO_VALUE,
143
549
  },
144
550
  });
145
551
  /**
146
552
  * Note: [💞] Ignore a discrepancy between file name and entity name
147
553
  */
148
554
 
555
+ /**
556
+ * Make UncertainNumber
557
+ *
558
+ * @param value
559
+ *
560
+ * @private utility for initializating UncertainNumber
561
+ */
562
+ function uncertainNumber(value) {
563
+ if (value === null || value === undefined || Number.isNaN(value)) {
564
+ return UNCERTAIN_ZERO_VALUE;
565
+ }
566
+ return { value };
567
+ }
568
+
149
569
  /**
150
570
  * Simple wrapper `new Date().toISOString()`
151
571
  *
@@ -835,11 +1255,17 @@
835
1255
  throw new PipelineExecutionError('No response message');
836
1256
  }
837
1257
  const complete = $getCurrentDate();
838
- /*
839
- TODO: [🕘] Usage count
840
- const usage = computeOpenAiUsage(content || '', resultContent || '', rawResponse);
841
- */
842
- const usage = UNCERTAIN_USAGE;
1258
+ const usage = {
1259
+ price: UNCERTAIN_ZERO_VALUE,
1260
+ input: {
1261
+ tokensCount: uncertainNumber(rawResponse.usage.promptTokens),
1262
+ ...computeUsageCounts(rawPromptContent),
1263
+ },
1264
+ output: {
1265
+ tokensCount: uncertainNumber(rawResponse.usage.completionTokens),
1266
+ ...computeUsageCounts(rawResponse.text),
1267
+ },
1268
+ };
843
1269
  return exportJson({
844
1270
  name: 'promptResult',
845
1271
  message: `Result of \`createExecutionToolsFromVercelProvider.callChatModel\``,