@promptbook/openai 0.54.0 → 0.55.0-0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (30) hide show
  1. package/README.md +1 -1
  2. package/esm/index.es.js +343 -7
  3. package/esm/index.es.js.map +1 -1
  4. package/esm/typings/_packages/core.index.d.ts +2 -1
  5. package/esm/typings/_packages/types.index.d.ts +2 -2
  6. package/esm/typings/execution/PromptResult.d.ts +43 -18
  7. package/esm/typings/execution/addPromptResultUsage.d.ts +7 -0
  8. package/esm/typings/execution/addPromptResultUsage.test.d.ts +1 -0
  9. package/esm/typings/execution/computeUsageCounts.d.ts +10 -0
  10. package/esm/typings/execution/plugins/llm-execution-tools/openai/computeOpenaiUsage.d.ts +5 -1
  11. package/esm/typings/types/PromptbookJson/PromptTemplateJson.d.ts +4 -3
  12. package/esm/typings/types/PromptbookJson/PromptTemplateParameterJson.d.ts +2 -1
  13. package/esm/typings/types/PromptbookJson/PromptbookJson.d.ts +3 -2
  14. package/esm/typings/types/execution-report/ExecutionReportJson.d.ts +2 -1
  15. package/esm/typings/types/typeAliases.d.ts +1 -3
  16. package/package.json +2 -2
  17. package/umd/index.umd.js +343 -7
  18. package/umd/index.umd.js.map +1 -1
  19. package/umd/typings/_packages/core.index.d.ts +2 -1
  20. package/umd/typings/_packages/types.index.d.ts +2 -2
  21. package/umd/typings/execution/PromptResult.d.ts +43 -18
  22. package/umd/typings/execution/addPromptResultUsage.d.ts +7 -0
  23. package/umd/typings/execution/addPromptResultUsage.test.d.ts +1 -0
  24. package/umd/typings/execution/computeUsageCounts.d.ts +10 -0
  25. package/umd/typings/execution/plugins/llm-execution-tools/openai/computeOpenaiUsage.d.ts +5 -1
  26. package/umd/typings/types/PromptbookJson/PromptTemplateJson.d.ts +4 -3
  27. package/umd/typings/types/PromptbookJson/PromptTemplateParameterJson.d.ts +2 -1
  28. package/umd/typings/types/PromptbookJson/PromptbookJson.d.ts +3 -2
  29. package/umd/typings/types/execution-report/ExecutionReportJson.d.ts +2 -1
  30. package/umd/typings/types/typeAliases.d.ts +1 -3
@@ -1,5 +1,6 @@
1
- import type { number_positive_or_zero } from '../types/typeAliases';
2
- import type { number_tokens } from '../types/typeAliases';
1
+ import type { KebabCase } from 'type-fest';
2
+ import type { ExpectationUnit } from '../types/PromptbookJson/PromptTemplateJson';
3
+ import type { number_positive } from '../types/typeAliases';
3
4
  import type { number_usd } from '../types/typeAliases';
4
5
  import type { string_date_iso8601 } from '../types/typeAliases';
5
6
  import type { string_model_name } from '../types/typeAliases';
@@ -48,27 +49,51 @@ export type PromptCommonResult = {
48
49
  /**
49
50
  * Usage of the prompt execution
50
51
  */
51
- readonly usage: {
52
- /**
53
- * Cost of the execution in USD
54
- *
55
- * If the cost is unknown, the value is `'UNKNOWN'`
56
- */
57
- price: (number_positive_or_zero & number_usd) | 'UNKNOWN';
58
- /**
59
- * Number of tokens used in the input aka. `prompt_tokens`
60
- */
61
- inputTokens: number_tokens | 'UNKNOWN';
62
- /**
63
- * Number of tokens used in the output aka. `completion_tokens`
64
- */
65
- outputTokens: number_tokens | 'UNKNOWN';
66
- };
52
+ readonly usage: PromptResultUsage;
67
53
  /**
68
54
  * Raw response from the model
69
55
  */
70
56
  readonly rawResponse: object;
71
57
  };
58
+ /**
59
+ * Usage statistics for one or many prompt results
60
+ */
61
+ export type PromptResultUsage = {
62
+ /**
63
+ * Cost of the execution in USD
64
+ *
65
+ * Note: If the cost is unknown, the value 0 and isUncertain is true
66
+ */
67
+ price: UncertainNumber;
68
+ /**
69
+ * Number of whatever used in the input aka. `prompt_tokens`
70
+ */
71
+ input: PromptResultUsageCounts;
72
+ /**
73
+ * Number of tokens used in the output aka. `completion_tokens`
74
+ */
75
+ output: PromptResultUsageCounts;
76
+ };
77
+ /**
78
+ * Record of all possible measurable units
79
+ */
80
+ export type PromptResultUsageCounts = Record<`${KebabCase<'TOKENS' | ExpectationUnit>}Count`, UncertainNumber>;
81
+ /**
82
+ * Number which can be uncertain
83
+ *
84
+ * Note: If the value is completelly unknown, the value 0 and isUncertain is true
85
+ * Note: Not using NaN or null because it looses the value which is better to be uncertain then not to be at all
86
+ */
87
+ export type UncertainNumber = {
88
+ /**
89
+ * The numeric value
90
+ */
91
+ value: number_usd & (number_positive | 0);
92
+ /**
93
+ * Is the value uncertain
94
+ */
95
+ isUncertain?: true;
96
+ };
72
97
  /**
73
98
  * TODO: [🧠] Maybe timing more accurate then seconds?
74
99
  * TODO: [🧠] Should here be link to the prompt?
@@ -0,0 +1,7 @@
1
+ import type { PromptResultUsage } from './PromptResult';
2
+ /**
3
+ * Function addPromptResultUsage will add multiple usages into one
4
+ *
5
+ * Note: If you provide 0 values, it returns void usage
6
+ */
7
+ export declare function addPromptResultUsage(...usageItems: Array<PromptResultUsage>): PromptResultUsage;
@@ -0,0 +1,10 @@
1
+ import type { PromptResultUsageCounts } from './PromptResult';
2
+ /**
3
+ * Helper of usage compute
4
+ *
5
+ * @param content the content of prompt or response
6
+ * @returns part of PromptResultUsageCounts
7
+ *
8
+ * @private internal util of LlmExecutionTools
9
+ */
10
+ export declare function computeUsageCounts(content: string): Omit<PromptResultUsageCounts, 'tokensCount'>;
@@ -1,8 +1,12 @@
1
1
  import type OpenAI from 'openai';
2
+ import type { Prompt } from '../../../../types/Prompt';
2
3
  import type { PromptResult } from '../../../PromptResult';
4
+ import type { PromptResultUsage } from '../../../PromptResult';
3
5
  /**
4
6
  * Computes the usage of the OpenAI API based on the response from OpenAI
5
7
  *
6
8
  * @throws {PromptbookExecutionError} If the usage is not defined in the response from OpenAI
9
+ * @private internal util of `OpenAiExecutionTools`
7
10
  */
8
- export declare function computeOpenaiUsage(rawResponse: Pick<OpenAI.Chat.Completions.ChatCompletion | OpenAI.Completions.Completion, 'model' | 'usage'>): PromptResult['usage'];
11
+ export declare function computeOpenaiUsage(promptContent: Prompt['content'], // <- Note: Intentionally using [] to access type properties to bring jsdoc from Prompt/PromptResult to consumer
12
+ resultContent: PromptResult['content'], rawResponse: Pick<OpenAI.Chat.Completions.ChatCompletion | OpenAI.Completions.Completion, 'model' | 'usage'>): PromptResultUsage;
@@ -3,10 +3,11 @@ import type { ExecutionType } from '../ExecutionTypes';
3
3
  import type { ModelRequirements } from '../ModelRequirements';
4
4
  import type { ScriptLanguage } from '../ScriptLanguage';
5
5
  import type { number_integer } from '../typeAliases';
6
- import type { number_positive_or_zero } from '../typeAliases';
6
+ import type { number_positive } from '../typeAliases';
7
7
  import type { string_javascript } from '../typeAliases';
8
8
  import type { string_javascript_name } from '../typeAliases';
9
9
  import type { string_markdown } from '../typeAliases';
10
+ import type { string_markdown_text } from '../typeAliases';
10
11
  import type { string_name } from '../typeAliases';
11
12
  import type { string_prompt } from '../typeAliases';
12
13
  import type { string_template } from '../typeAliases';
@@ -47,7 +48,7 @@ export type ExpectationUnit = typeof EXPECTATION_UNITS[number];
47
48
  /**
48
49
  * Amount of text measurement
49
50
  */
50
- export type ExpectationAmount = number_integer & number_positive_or_zero;
51
+ export type ExpectationAmount = number_integer & (number_positive | 0);
51
52
  /**
52
53
  * Template for simple concatenation of strings
53
54
  */
@@ -92,7 +93,7 @@ interface PromptTemplateJsonCommon {
92
93
  * Description of the prompt template
93
94
  * It can use multiple paragraphs of simple markdown formatting like **bold**, *italic*, [link](https://example.com), ... BUT not code blocks and structure
94
95
  */
95
- readonly description?: string;
96
+ readonly description?: string_markdown_text;
96
97
  /**
97
98
  * List of parameter names that are used in the prompt template and must be defined before the prompt template is executed
98
99
  *
@@ -1,3 +1,4 @@
1
+ import type { string_markdown_text } from '../typeAliases';
1
2
  import type { string_name } from '../typeAliases';
2
3
  /**
3
4
  * Describes one parameter of the promptbook
@@ -21,5 +22,5 @@ export type PromptTemplateParameterJson = {
21
22
  * Description of the parameter
22
23
  * - It can use simple markdown formatting like **bold**, *italic*, [link](https://example.com), ... BUT not code blocks and structure
23
24
  */
24
- readonly description?: string;
25
+ readonly description?: string_markdown_text;
25
26
  };
@@ -1,3 +1,4 @@
1
+ import type { string_markdown_text } from '../typeAliases';
1
2
  import type { string_promptbook_url } from '../typeAliases';
2
3
  import type { string_version } from '../typeAliases';
3
4
  import type { PromptTemplateJson } from './PromptTemplateJson';
@@ -23,7 +24,7 @@ export type PromptbookJson = {
23
24
  * Title of the promptbook
24
25
  * -It can use simple markdown formatting like **bold**, *italic*, [link](https://example.com), ... BUT not code blocks and structure
25
26
  */
26
- readonly title: string;
27
+ readonly title: string_markdown_text;
27
28
  /**
28
29
  * Version of the .ptbk.json file
29
30
  */
@@ -32,7 +33,7 @@ export type PromptbookJson = {
32
33
  * Description of the promptbook
33
34
  * It can use multiple paragraphs of simple markdown formatting like **bold**, *italic*, [link](https://example.com), ... BUT not code blocks and structure
34
35
  */
35
- readonly description?: string;
36
+ readonly description?: string_markdown_text;
36
37
  /**
37
38
  * Set of variables that are used across the pipeline
38
39
  */
@@ -1,5 +1,6 @@
1
1
  import type { PromptResult } from '../../execution/PromptResult';
2
2
  import type { Prompt } from '../Prompt';
3
+ import type { string_markdown_text } from '../typeAliases';
3
4
  import type { string_promptbook_url } from '../typeAliases';
4
5
  import type { string_version } from '../typeAliases';
5
6
  /**
@@ -32,7 +33,7 @@ export type ExecutionReportJson = {
32
33
  /**
33
34
  * Description of the promptbook which was executed
34
35
  */
35
- readonly description?: string;
36
+ readonly description?: string_markdown_text;
36
37
  /**
37
38
  * Sequence of prompt templates in order which were executed
38
39
  */
@@ -393,11 +393,9 @@ export type number_usd = number;
393
393
  /**
394
394
  * Semantic helper for number of tokens
395
395
  */
396
- export type number_tokens = number_integer & number_positive_or_zero;
396
+ export type number_tokens = number_integer & (number_positive | 0);
397
397
  export type number_positive = number;
398
398
  export type number_negative = number;
399
- export type number_positive_or_zero = number;
400
- export type number_negative_or_zero = number;
401
399
  export type number_integer = number;
402
400
  /**
403
401
  * Semantic helper;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@promptbook/openai",
3
- "version": "0.54.0",
3
+ "version": "0.55.0-0",
4
4
  "description": "Library to supercharge your use of large language models",
5
5
  "private": false,
6
6
  "sideEffects": false,
@@ -48,7 +48,7 @@
48
48
  }
49
49
  ],
50
50
  "peerDependencies": {
51
- "@promptbook/core": "0.54.0"
51
+ "@promptbook/core": "0.55.0-0"
52
52
  },
53
53
  "main": "./umd/index.umd.js",
54
54
  "module": "./esm/index.es.js",
package/umd/index.umd.js CHANGED
@@ -468,12 +468,347 @@
468
468
  return new Date().toISOString();
469
469
  }
470
470
 
471
+ /**
472
+ * Counts number of characters in the text
473
+ */
474
+ function countCharacters(text) {
475
+ // Remove null characters
476
+ text = text.replace(/\0/g, '');
477
+ // Replace emojis (and also ZWJ sequence) with hyphens
478
+ text = text.replace(/(\p{Extended_Pictographic})\p{Modifier_Symbol}/gu, '$1');
479
+ text = text.replace(/(\p{Extended_Pictographic})[\u{FE00}-\u{FE0F}]/gu, '$1');
480
+ text = text.replace(/\p{Extended_Pictographic}(\u{200D}\p{Extended_Pictographic})*/gu, '-');
481
+ return text.length;
482
+ }
483
+
484
+ /**
485
+ * Counts number of lines in the text
486
+ */
487
+ function countLines(text) {
488
+ if (text === '') {
489
+ return 0;
490
+ }
491
+ return text.split('\n').length;
492
+ }
493
+
494
+ /**
495
+ * Counts number of pages in the text
496
+ */
497
+ function countPages(text) {
498
+ var sentencesPerPage = 5; // Assuming each page has 5 sentences
499
+ var sentences = text.split(/[.!?]+/).filter(function (sentence) { return sentence.trim() !== ''; });
500
+ var pageCount = Math.ceil(sentences.length / sentencesPerPage);
501
+ return pageCount;
502
+ }
503
+
504
+ /**
505
+ * Counts number of paragraphs in the text
506
+ */
507
+ function countParagraphs(text) {
508
+ return text.split(/\n\s*\n/).filter(function (paragraph) { return paragraph.trim() !== ''; }).length;
509
+ }
510
+
511
+ /**
512
+ * Split text into sentences
513
+ */
514
+ function splitIntoSentences(text) {
515
+ return text.split(/[.!?]+/).filter(function (sentence) { return sentence.trim() !== ''; });
516
+ }
517
+ /**
518
+ * Counts number of sentences in the text
519
+ */
520
+ function countSentences(text) {
521
+ return splitIntoSentences(text).length;
522
+ }
523
+
524
+ var defaultDiacriticsRemovalMap = [
525
+ {
526
+ base: 'A',
527
+ 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',
528
+ },
529
+ { base: 'AA', letters: '\uA732' },
530
+ { base: 'AE', letters: '\u00C6\u01FC\u01E2' },
531
+ { base: 'AO', letters: '\uA734' },
532
+ { base: 'AU', letters: '\uA736' },
533
+ { base: 'AV', letters: '\uA738\uA73A' },
534
+ { base: 'AY', letters: '\uA73C' },
535
+ {
536
+ base: 'B',
537
+ letters: '\u0042\u24B7\uFF22\u1E02\u1E04\u1E06\u0243\u0182\u0181',
538
+ },
539
+ {
540
+ base: 'C',
541
+ letters: '\u0043\u24B8\uFF23\u0106\u0108\u010A\u010C\u00C7\u1E08\u0187\u023B\uA73E',
542
+ },
543
+ {
544
+ base: 'D',
545
+ letters: '\u0044\u24B9\uFF24\u1E0A\u010E\u1E0C\u1E10\u1E12\u1E0E\u0110\u018B\u018A\u0189\uA779\u00D0',
546
+ },
547
+ { base: 'DZ', letters: '\u01F1\u01C4' },
548
+ { base: 'Dz', letters: '\u01F2\u01C5' },
549
+ {
550
+ base: 'E',
551
+ 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',
552
+ },
553
+ { base: 'F', letters: '\u0046\u24BB\uFF26\u1E1E\u0191\uA77B' },
554
+ {
555
+ base: 'G',
556
+ letters: '\u0047\u24BC\uFF27\u01F4\u011C\u1E20\u011E\u0120\u01E6\u0122\u01E4\u0193\uA7A0\uA77D\uA77E',
557
+ },
558
+ {
559
+ base: 'H',
560
+ letters: '\u0048\u24BD\uFF28\u0124\u1E22\u1E26\u021E\u1E24\u1E28\u1E2A\u0126\u2C67\u2C75\uA78D',
561
+ },
562
+ {
563
+ base: 'I',
564
+ letters: '\u0049\u24BE\uFF29\u00CC\u00CD\u00CE\u0128\u012A\u012C\u0130\u00CF\u1E2E\u1EC8\u01CF\u0208\u020A\u1ECA\u012E\u1E2C\u0197',
565
+ },
566
+ { base: 'J', letters: '\u004A\u24BF\uFF2A\u0134\u0248' },
567
+ {
568
+ base: 'K',
569
+ letters: '\u004B\u24C0\uFF2B\u1E30\u01E8\u1E32\u0136\u1E34\u0198\u2C69\uA740\uA742\uA744\uA7A2',
570
+ },
571
+ {
572
+ base: 'L',
573
+ letters: '\u004C\u24C1\uFF2C\u013F\u0139\u013D\u1E36\u1E38\u013B\u1E3C\u1E3A\u0141\u023D\u2C62\u2C60\uA748\uA746\uA780',
574
+ },
575
+ { base: 'LJ', letters: '\u01C7' },
576
+ { base: 'Lj', letters: '\u01C8' },
577
+ { base: 'M', letters: '\u004D\u24C2\uFF2D\u1E3E\u1E40\u1E42\u2C6E\u019C' },
578
+ {
579
+ base: 'N',
580
+ letters: '\u004E\u24C3\uFF2E\u01F8\u0143\u00D1\u1E44\u0147\u1E46\u0145\u1E4A\u1E48\u0220\u019D\uA790\uA7A4',
581
+ },
582
+ { base: 'NJ', letters: '\u01CA' },
583
+ { base: 'Nj', letters: '\u01CB' },
584
+ {
585
+ base: 'O',
586
+ 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',
587
+ },
588
+ { base: 'OI', letters: '\u01A2' },
589
+ { base: 'OO', letters: '\uA74E' },
590
+ { base: 'OU', letters: '\u0222' },
591
+ { base: 'OE', letters: '\u008C\u0152' },
592
+ { base: 'oe', letters: '\u009C\u0153' },
593
+ {
594
+ base: 'P',
595
+ letters: '\u0050\u24C5\uFF30\u1E54\u1E56\u01A4\u2C63\uA750\uA752\uA754',
596
+ },
597
+ { base: 'Q', letters: '\u0051\u24C6\uFF31\uA756\uA758\u024A' },
598
+ {
599
+ base: 'R',
600
+ letters: '\u0052\u24C7\uFF32\u0154\u1E58\u0158\u0210\u0212\u1E5A\u1E5C\u0156\u1E5E\u024C\u2C64\uA75A\uA7A6\uA782',
601
+ },
602
+ {
603
+ base: 'S',
604
+ letters: '\u0053\u24C8\uFF33\u1E9E\u015A\u1E64\u015C\u1E60\u0160\u1E66\u1E62\u1E68\u0218\u015E\u2C7E\uA7A8\uA784',
605
+ },
606
+ {
607
+ base: 'T',
608
+ letters: '\u0054\u24C9\uFF34\u1E6A\u0164\u1E6C\u021A\u0162\u1E70\u1E6E\u0166\u01AC\u01AE\u023E\uA786',
609
+ },
610
+ { base: 'TZ', letters: '\uA728' },
611
+ {
612
+ base: 'U',
613
+ 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',
614
+ },
615
+ { base: 'V', letters: '\u0056\u24CB\uFF36\u1E7C\u1E7E\u01B2\uA75E\u0245' },
616
+ { base: 'VY', letters: '\uA760' },
617
+ {
618
+ base: 'W',
619
+ letters: '\u0057\u24CC\uFF37\u1E80\u1E82\u0174\u1E86\u1E84\u1E88\u2C72',
620
+ },
621
+ { base: 'X', letters: '\u0058\u24CD\uFF38\u1E8A\u1E8C' },
622
+ {
623
+ base: 'Y',
624
+ letters: '\u0059\u24CE\uFF39\u1EF2\u00DD\u0176\u1EF8\u0232\u1E8E\u0178\u1EF6\u1EF4\u01B3\u024E\u1EFE',
625
+ },
626
+ {
627
+ base: 'Z',
628
+ letters: '\u005A\u24CF\uFF3A\u0179\u1E90\u017B\u017D\u1E92\u1E94\u01B5\u0224\u2C7F\u2C6B\uA762',
629
+ },
630
+ {
631
+ base: 'a',
632
+ 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',
633
+ },
634
+ { base: 'aa', letters: '\uA733' },
635
+ { base: 'ae', letters: '\u00E6\u01FD\u01E3' },
636
+ { base: 'ao', letters: '\uA735' },
637
+ { base: 'au', letters: '\uA737' },
638
+ { base: 'av', letters: '\uA739\uA73B' },
639
+ { base: 'ay', letters: '\uA73D' },
640
+ {
641
+ base: 'b',
642
+ letters: '\u0062\u24D1\uFF42\u1E03\u1E05\u1E07\u0180\u0183\u0253',
643
+ },
644
+ {
645
+ base: 'c',
646
+ letters: '\u0063\u24D2\uFF43\u0107\u0109\u010B\u010D\u00E7\u1E09\u0188\u023C\uA73F\u2184',
647
+ },
648
+ {
649
+ base: 'd',
650
+ letters: '\u0064\u24D3\uFF44\u1E0B\u010F\u1E0D\u1E11\u1E13\u1E0F\u0111\u018C\u0256\u0257\uA77A',
651
+ },
652
+ { base: 'dz', letters: '\u01F3\u01C6' },
653
+ {
654
+ base: 'e',
655
+ 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',
656
+ },
657
+ { base: 'f', letters: '\u0066\u24D5\uFF46\u1E1F\u0192\uA77C' },
658
+ {
659
+ base: 'g',
660
+ letters: '\u0067\u24D6\uFF47\u01F5\u011D\u1E21\u011F\u0121\u01E7\u0123\u01E5\u0260\uA7A1\u1D79\uA77F',
661
+ },
662
+ {
663
+ base: 'h',
664
+ letters: '\u0068\u24D7\uFF48\u0125\u1E23\u1E27\u021F\u1E25\u1E29\u1E2B\u1E96\u0127\u2C68\u2C76\u0265',
665
+ },
666
+ { base: 'hv', letters: '\u0195' },
667
+ {
668
+ base: 'i',
669
+ letters: '\u0069\u24D8\uFF49\u00EC\u00ED\u00EE\u0129\u012B\u012D\u00EF\u1E2F\u1EC9\u01D0\u0209\u020B\u1ECB\u012F\u1E2D\u0268\u0131',
670
+ },
671
+ { base: 'j', letters: '\u006A\u24D9\uFF4A\u0135\u01F0\u0249' },
672
+ {
673
+ base: 'k',
674
+ letters: '\u006B\u24DA\uFF4B\u1E31\u01E9\u1E33\u0137\u1E35\u0199\u2C6A\uA741\uA743\uA745\uA7A3',
675
+ },
676
+ {
677
+ base: 'l',
678
+ letters: '\u006C\u24DB\uFF4C\u0140\u013A\u013E\u1E37\u1E39\u013C\u1E3D\u1E3B\u017F\u0142\u019A\u026B\u2C61\uA749\uA781\uA747',
679
+ },
680
+ { base: 'lj', letters: '\u01C9' },
681
+ { base: 'm', letters: '\u006D\u24DC\uFF4D\u1E3F\u1E41\u1E43\u0271\u026F' },
682
+ {
683
+ base: 'n',
684
+ letters: '\u006E\u24DD\uFF4E\u01F9\u0144\u00F1\u1E45\u0148\u1E47\u0146\u1E4B\u1E49\u019E\u0272\u0149\uA791\uA7A5',
685
+ },
686
+ { base: 'nj', letters: '\u01CC' },
687
+ {
688
+ base: 'o',
689
+ 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',
690
+ },
691
+ { base: 'oi', letters: '\u01A3' },
692
+ { base: 'ou', letters: '\u0223' },
693
+ { base: 'oo', letters: '\uA74F' },
694
+ {
695
+ base: 'p',
696
+ letters: '\u0070\u24DF\uFF50\u1E55\u1E57\u01A5\u1D7D\uA751\uA753\uA755',
697
+ },
698
+ { base: 'q', letters: '\u0071\u24E0\uFF51\u024B\uA757\uA759' },
699
+ {
700
+ base: 'r',
701
+ letters: '\u0072\u24E1\uFF52\u0155\u1E59\u0159\u0211\u0213\u1E5B\u1E5D\u0157\u1E5F\u024D\u027D\uA75B\uA7A7\uA783',
702
+ },
703
+ {
704
+ base: 's',
705
+ letters: '\u0073\u24E2\uFF53\u00DF\u015B\u1E65\u015D\u1E61\u0161\u1E67\u1E63\u1E69\u0219\u015F\u023F\uA7A9\uA785\u1E9B',
706
+ },
707
+ {
708
+ base: 't',
709
+ letters: '\u0074\u24E3\uFF54\u1E6B\u1E97\u0165\u1E6D\u021B\u0163\u1E71\u1E6F\u0167\u01AD\u0288\u2C66\uA787',
710
+ },
711
+ { base: 'tz', letters: '\uA729' },
712
+ {
713
+ base: 'u',
714
+ 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',
715
+ },
716
+ { base: 'v', letters: '\u0076\u24E5\uFF56\u1E7D\u1E7F\u028B\uA75F\u028C' },
717
+ { base: 'vy', letters: '\uA761' },
718
+ {
719
+ base: 'w',
720
+ letters: '\u0077\u24E6\uFF57\u1E81\u1E83\u0175\u1E87\u1E85\u1E98\u1E89\u2C73',
721
+ },
722
+ { base: 'x', letters: '\u0078\u24E7\uFF58\u1E8B\u1E8D' },
723
+ {
724
+ base: 'y',
725
+ letters: '\u0079\u24E8\uFF59\u1EF3\u00FD\u0177\u1EF9\u0233\u1E8F\u00FF\u1EF7\u1E99\u1EF5\u01B4\u024F\u1EFF',
726
+ },
727
+ {
728
+ base: 'z',
729
+ letters: '\u007A\u24E9\uFF5A\u017A\u1E91\u017C\u017E\u1E93\u1E95\u01B6\u0225\u0240\u2C6C\uA763',
730
+ },
731
+ ];
732
+ /**
733
+ * Map of letters from diacritic variant to diacritless variant
734
+ * Contains lowercase and uppercase separatelly
735
+ *
736
+ * > "á" => "a"
737
+ * > "ě" => "e"
738
+ * > "Ă" => "A"
739
+ * > ...
740
+ */
741
+ var DIACRITIC_VARIANTS_LETTERS = {};
742
+ // tslint:disable-next-line: prefer-for-of
743
+ for (var i = 0; i < defaultDiacriticsRemovalMap.length; i++) {
744
+ var letters = defaultDiacriticsRemovalMap[i].letters;
745
+ // tslint:disable-next-line: prefer-for-of
746
+ for (var j = 0; j < letters.length; j++) {
747
+ DIACRITIC_VARIANTS_LETTERS[letters[j]] = defaultDiacriticsRemovalMap[i].base;
748
+ }
749
+ }
750
+ // <- TODO: [🍓] Put to maker function to save execution time if not needed
751
+ /*
752
+ @see https://stackoverflow.com/questions/990904/remove-accents-diacritics-in-a-string-in-javascript
753
+ Licensed under the Apache License, Version 2.0 (the "License");
754
+ you may not use this file except in compliance with the License.
755
+ You may obtain a copy of the License at
756
+
757
+ http://www.apache.org/licenses/LICENSE-2.0
758
+
759
+ Unless required by applicable law or agreed to in writing, software
760
+ distributed under the License is distributed on an "AS IS" BASIS,
761
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
762
+ See the License for the specific language governing permissions and
763
+ limitations under the License.
764
+ */
765
+
766
+ /**
767
+ *
768
+ */
769
+ function removeDiacritics(input) {
770
+ /*eslint no-control-regex: "off"*/
771
+ return input.replace(/[^\u0000-\u007E]/g, function (a) {
772
+ return DIACRITIC_VARIANTS_LETTERS[a] || a;
773
+ });
774
+ }
775
+
776
+ /**
777
+ * Counts number of words in the text
778
+ */
779
+ function countWords(text) {
780
+ text = text.replace(/[\p{Extended_Pictographic}]/gu, 'a');
781
+ text = removeDiacritics(text);
782
+ return text.split(/[^a-zа-я0-9]+/i).filter(function (word) { return word.length > 0; }).length;
783
+ }
784
+
785
+ /**
786
+ * Helper of usage compute
787
+ *
788
+ * @param content the content of prompt or response
789
+ * @returns part of PromptResultUsageCounts
790
+ *
791
+ * @private internal util of LlmExecutionTools
792
+ */
793
+ function computeUsageCounts(content) {
794
+ return {
795
+ charactersCount: { value: countCharacters(content) },
796
+ wordsCount: { value: countWords(content) },
797
+ sentencesCount: { value: countSentences(content) },
798
+ linesCount: { value: countLines(content) },
799
+ paragraphsCount: { value: countParagraphs(content) },
800
+ pagesCount: { value: countPages(content) },
801
+ };
802
+ }
803
+
471
804
  /**
472
805
  * Computes the usage of the OpenAI API based on the response from OpenAI
473
806
  *
474
807
  * @throws {PromptbookExecutionError} If the usage is not defined in the response from OpenAI
808
+ * @private internal util of `OpenAiExecutionTools`
475
809
  */
476
- function computeOpenaiUsage(rawResponse) {
810
+ function computeOpenaiUsage(promptContent, // <- Note: Intentionally using [] to access type properties to bring jsdoc from Prompt/PromptResult to consumer
811
+ resultContent, rawResponse) {
477
812
  var _a, _b;
478
813
  if (rawResponse.usage === undefined) {
479
814
  throw new PromptbookExecutionError('The usage is not defined in the response from OpenAI');
@@ -488,16 +823,17 @@
488
823
  var outputTokens = rawResponse.usage.completion_tokens;
489
824
  var modelInfo = OPENAI_MODELS.find(function (model) { return model.modelName === rawResponse.model; });
490
825
  var price;
826
+ // uncertainNumber
491
827
  if (modelInfo === undefined || modelInfo.pricing === undefined) {
492
- price = 'UNKNOWN';
828
+ price = { value: 0, isUncertain: true };
493
829
  }
494
830
  else {
495
- price = inputTokens * modelInfo.pricing.prompt + outputTokens * modelInfo.pricing.output;
831
+ price = { value: inputTokens * modelInfo.pricing.prompt + outputTokens * modelInfo.pricing.output };
496
832
  }
497
833
  return {
498
834
  price: price,
499
- inputTokens: inputTokens,
500
- outputTokens: outputTokens,
835
+ input: __assign({ tokensCount: { value: rawResponse.usage.prompt_tokens || 0 /* uncertainNumber */ } }, computeUsageCounts(promptContent)),
836
+ output: __assign({ tokensCount: { value: rawResponse.usage.completion_tokens || 0 /* uncertainNumber */ } }, computeUsageCounts(resultContent)),
501
837
  };
502
838
  }
503
839
 
@@ -567,7 +903,7 @@
567
903
  resultContent = rawResponse.choices[0].message.content;
568
904
  // eslint-disable-next-line prefer-const
569
905
  complete = getCurrentIsoDate();
570
- usage = computeOpenaiUsage(rawResponse);
906
+ usage = computeOpenaiUsage(content, resultContent || '', rawResponse);
571
907
  if (!resultContent) {
572
908
  throw new PromptbookExecutionError('No response message from OpenAI');
573
909
  }
@@ -630,7 +966,7 @@
630
966
  resultContent = rawResponse.choices[0].text;
631
967
  // eslint-disable-next-line prefer-const
632
968
  complete = getCurrentIsoDate();
633
- usage = computeOpenaiUsage(rawResponse);
969
+ usage = computeOpenaiUsage(content, resultContent || '', rawResponse);
634
970
  if (!resultContent) {
635
971
  throw new PromptbookExecutionError('No response message from OpenAI');
636
972
  }