@promptbook/components 0.103.0-36 → 0.103.0-37

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/esm/index.es.js +2000 -241
  2. package/esm/index.es.js.map +1 -1
  3. package/esm/typings/src/_packages/core.index.d.ts +4 -0
  4. package/esm/typings/src/_packages/types.index.d.ts +5 -1
  5. package/esm/typings/src/book-2.0/agent-source/AgentBasicInformation.d.ts +1 -0
  6. package/esm/typings/src/book-components/Chat/save/html/htmlSaveFormatDefinition.d.ts +1 -0
  7. package/esm/typings/src/book-components/Chat/save/pdf/pdfSaveFormatDefinition.d.ts +4 -0
  8. package/esm/typings/src/errors/0-index.d.ts +3 -0
  9. package/esm/typings/src/errors/NotAllowed.d.ts +9 -0
  10. package/esm/typings/src/execution/AvailableModel.d.ts +1 -0
  11. package/esm/typings/src/execution/Executables.d.ts +3 -0
  12. package/esm/typings/src/execution/ExecutionTools.d.ts +5 -0
  13. package/esm/typings/src/execution/LlmExecutionTools.d.ts +1 -1
  14. package/esm/typings/src/llm-providers/agent/Agent.d.ts +44 -0
  15. package/esm/typings/src/llm-providers/agent/AgentOptions.d.ts +17 -0
  16. package/esm/typings/src/llm-providers/agent/CreateAgentLlmExecutionToolsOptions.d.ts +16 -0
  17. package/esm/typings/src/llm-providers/agent/createAgentLlmExecutionTools.d.ts +1 -15
  18. package/esm/typings/src/llm-providers/openai/OpenAiAssistantExecutionTools.d.ts +12 -0
  19. package/esm/typings/src/llm-providers/openai/OpenAiAssistantExecutionToolsOptions.d.ts +7 -1
  20. package/esm/typings/src/remote-server/startRemoteServer.d.ts +2 -0
  21. package/esm/typings/src/types/Updatable.d.ts +19 -0
  22. package/esm/typings/src/version.d.ts +1 -1
  23. package/package.json +4 -1
  24. package/umd/index.umd.js +2004 -244
  25. package/umd/index.umd.js.map +1 -1
package/umd/index.umd.js CHANGED
@@ -1,8 +1,8 @@
1
1
  (function (global, factory) {
2
- typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('react/jsx-runtime'), require('react'), require('spacetrim'), require('react-dom'), require('path'), require('crypto'), require('@monaco-editor/react'), require('rxjs'), require('waitasecond'), require('crypto-js/enc-hex'), require('crypto-js/sha256'), require('crypto-js'), require('mime-types'), require('papaparse'), require('moment'), require('colors'), require('highlight.js'), require('katex'), require('showdown'), require('qrcode')) :
3
- typeof define === 'function' && define.amd ? define(['exports', 'react/jsx-runtime', 'react', 'spacetrim', 'react-dom', 'path', 'crypto', '@monaco-editor/react', 'rxjs', 'waitasecond', 'crypto-js/enc-hex', 'crypto-js/sha256', 'crypto-js', 'mime-types', 'papaparse', 'moment', 'colors', 'highlight.js', 'katex', 'showdown', 'qrcode'], factory) :
4
- (global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory(global["promptbook-components"] = {}, global.jsxRuntime, global.react, global.spaceTrim, global.reactDom, global.path, global.crypto, global.Editor, global.rxjs, global.waitasecond, global.hexEncoder, global.sha256, global.cryptoJs, global.mimeTypes, global.papaparse, null, null, global.hljs, global.katex, global.showdown, global.QRCode));
5
- })(this, (function (exports, jsxRuntime, react, spaceTrim, reactDom, path, crypto, Editor, rxjs, waitasecond, hexEncoder, sha256, cryptoJs, mimeTypes, papaparse, moment, colors, hljs, katex, showdown, QRCode) { 'use strict';
2
+ typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('react/jsx-runtime'), require('react'), require('spacetrim'), require('react-dom'), require('path'), require('crypto'), require('@monaco-editor/react'), require('rxjs'), require('waitasecond'), require('crypto-js/enc-hex'), require('crypto-js/sha256'), require('crypto-js'), require('mime-types'), require('papaparse'), require('moment'), require('colors'), require('bottleneck'), require('openai'), require('highlight.js'), require('katex'), require('showdown'), require('qrcode')) :
3
+ typeof define === 'function' && define.amd ? define(['exports', 'react/jsx-runtime', 'react', 'spacetrim', 'react-dom', 'path', 'crypto', '@monaco-editor/react', 'rxjs', 'waitasecond', 'crypto-js/enc-hex', 'crypto-js/sha256', 'crypto-js', 'mime-types', 'papaparse', 'moment', 'colors', 'bottleneck', 'openai', 'highlight.js', 'katex', 'showdown', 'qrcode'], factory) :
4
+ (global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory(global["promptbook-components"] = {}, global.jsxRuntime, global.react, global.spaceTrim, global.reactDom, global.path, global.crypto, global.Editor, global.rxjs, global.waitasecond, global.hexEncoder, global.sha256, global.cryptoJs, global.mimeTypes, global.papaparse, null, global.colors, global.Bottleneck, global.OpenAI, global.hljs, global.katex, global.showdown, global.QRCode));
5
+ })(this, (function (exports, jsxRuntime, react, spaceTrim, reactDom, path, crypto, Editor, rxjs, waitasecond, hexEncoder, sha256, cryptoJs, mimeTypes, papaparse, moment, colors, Bottleneck, OpenAI, hljs, katex, showdown, QRCode) { 'use strict';
6
6
 
7
7
  function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }
8
8
 
@@ -10,6 +10,9 @@
10
10
  var Editor__default = /*#__PURE__*/_interopDefaultLegacy(Editor);
11
11
  var hexEncoder__default = /*#__PURE__*/_interopDefaultLegacy(hexEncoder);
12
12
  var sha256__default = /*#__PURE__*/_interopDefaultLegacy(sha256);
13
+ var colors__default = /*#__PURE__*/_interopDefaultLegacy(colors);
14
+ var Bottleneck__default = /*#__PURE__*/_interopDefaultLegacy(Bottleneck);
15
+ var OpenAI__default = /*#__PURE__*/_interopDefaultLegacy(OpenAI);
13
16
  var hljs__default = /*#__PURE__*/_interopDefaultLegacy(hljs);
14
17
  var katex__default = /*#__PURE__*/_interopDefaultLegacy(katex);
15
18
  var QRCode__default = /*#__PURE__*/_interopDefaultLegacy(QRCode);
@@ -28,7 +31,7 @@
28
31
  * @generated
29
32
  * @see https://github.com/webgptorg/promptbook
30
33
  */
31
- const PROMPTBOOK_ENGINE_VERSION = '0.103.0-36';
34
+ const PROMPTBOOK_ENGINE_VERSION = '0.103.0-37';
32
35
  /**
33
36
  * TODO: string_promptbook_version should be constrained to the all versions of Promptbook engine
34
37
  * Note: [💞] Ignore a discrepancy between file name and entity name
@@ -3392,6 +3395,13 @@
3392
3395
  * @public exported from `@promptbook/utils`
3393
3396
  */
3394
3397
  const SMALL_NUMBER = 0.001;
3398
+ // <- TODO: [⏳] Standardize timeouts, Make DEFAULT_TIMEOUT_MS as global constant
3399
+ /**
3400
+ * How many times to retry the connections
3401
+ *
3402
+ * @private within the repository - too low-level in comparison with other `MAX_...`
3403
+ */
3404
+ const CONNECTION_RETRIES_LIMIT = 5;
3395
3405
  /**
3396
3406
  * Short time interval to prevent race conditions in milliseconds
3397
3407
  *
@@ -3491,7 +3501,7 @@
3491
3501
  *
3492
3502
  * @public exported from `@promptbook/core`
3493
3503
  */
3494
- parseInt(process.env.API_REQUEST_TIMEOUT || '90000');
3504
+ const API_REQUEST_TIMEOUT = parseInt(process.env.API_REQUEST_TIMEOUT || '90000');
3495
3505
  /**
3496
3506
  * Indicates whether pipeline logic validation is enabled. When true, the pipeline logic is checked for consistency.
3497
3507
  *
@@ -3883,6 +3893,12 @@
3883
3893
  * @private within the repository
3884
3894
  */
3885
3895
  const REPLACING_NONCE = 'ptbkauk42kV2dzao34faw7FudQUHYPtW';
3896
+ /**
3897
+ * Nonce which is used as string which is not occurring in normal text
3898
+ *
3899
+ * @private within the repository
3900
+ */
3901
+ const SALT_NONCE = 'ptbkghhewbvruets21t54et5';
3886
3902
  /**
3887
3903
  * Placeholder value indicating a parameter is missing its value.
3888
3904
  *
@@ -4490,6 +4506,19 @@
4490
4506
  }
4491
4507
  }
4492
4508
 
4509
+ /**
4510
+ * This error indicates that promptbook operation is not allowed
4511
+ *
4512
+ * @public exported from `@promptbook/core`
4513
+ */
4514
+ class NotAllowed extends Error {
4515
+ constructor(message) {
4516
+ super(message);
4517
+ this.name = 'NotAllowed';
4518
+ Object.setPrototypeOf(this, NotAllowed.prototype);
4519
+ }
4520
+ }
4521
+
4493
4522
  /**
4494
4523
  * This error indicates that promptbook not found in the collection
4495
4524
  *
@@ -4639,6 +4668,7 @@
4639
4668
  PromptbookFetchError,
4640
4669
  UnexpectedError,
4641
4670
  WrappedError,
4671
+ NotAllowed,
4642
4672
  // TODO: [🪑]> VersionMismatchError,
4643
4673
  };
4644
4674
  /**
@@ -5235,6 +5265,18 @@
5235
5265
  * Note: [💞] Ignore a discrepancy between file name and entity name
5236
5266
  */
5237
5267
 
5268
+ /**
5269
+ * Simple wrapper `new Date().toISOString()`
5270
+ *
5271
+ * Note: `$` is used to indicate that this function is not a pure function - it is not deterministic because it depends on the current time
5272
+ *
5273
+ * @returns string_date branded type
5274
+ * @public exported from `@promptbook/utils`
5275
+ */
5276
+ function $getCurrentDate() {
5277
+ return new Date().toISOString();
5278
+ }
5279
+
5238
5280
  /**
5239
5281
  * Function parseNumber will parse number from string
5240
5282
  *
@@ -5705,12 +5747,15 @@
5705
5747
  PERSONA A friendly AI assistant that helps you with your tasks
5706
5748
  `)));
5707
5749
  // <- Note: Not using book`...` notation to avoid strange error in jest unit tests `TypeError: (0 , book_notation_1.book) is not a function`
5750
+ // <- TODO: !!! GENESIS_BOOK
5751
+ // <- !!! Buttons into genesis book
5752
+ // <- TODO: !!! createBookBoilerplate and deprecate `DEFAULT_BOOK`
5708
5753
 
5709
5754
  var css_248z$5 = ".BookEditor-module_BookEditor__s-0PU{width:100%}.BookEditor-module_bookEditorContainer__wLMwM{box-sizing:border-box;height:100%;padding:10px 25px 0;position:relative;width:100%}.BookEditor-module_bookEditorContainer__wLMwM.BookEditor-module_isVerbose__VQ6iL{background-color:rgba(0,0,0,.05);outline:1px dotted rgba(0,0,0,.5)}.BookEditor-module_isVerbose__VQ6iL{outline:2px dotted #ff7526}.BookEditor-module_bookEditorWrapper__twppD{background-color:#fff;border:1px solid rgba(209,213,219,.8);border-radius:1rem;box-shadow:0 1px 2px 0 rgba(0,0,0,.05);overflow:hidden;padding-top:10px;transition:box-shadow .2s ease-in-out}.BookEditor-module_isVerbose__VQ6iL .BookEditor-module_bookEditorWrapper__twppD{overflow:visible}.BookEditor-module_bookEditorWrapper__twppD:hover{box-shadow:0 4px 6px -1px rgba(0,0,0,.1),0 2px 4px -1px rgba(0,0,0,.06)}.BookEditor-module_bookEditorWrapper__twppD.BookEditor-module_isBorderRadiusDisabled__h1I3v{border-radius:0}.BookEditor-module_dropOverlay__xWWoX{align-items:center;background-color:rgba(0,0,0,.5);bottom:0;color:#fff;display:flex;font-size:1.5rem;justify-content:center;left:0;pointer-events:none;position:absolute;right:0;top:0;z-index:100}.BookEditor-module_bookEditorContainer__wLMwM .view-line{border-bottom:1px solid #eee}.BookEditor-module_bookEditorActionbar__KW6dc{position:absolute;right:55px;top:10px;z-index:100}.BookEditor-module_fullscreen__rktsl{border:none;border-radius:0;bottom:0;box-shadow:none;height:100%;left:0;padding-top:50px;position:fixed;right:0;top:0;width:100%;z-index:9999}.BookEditor-module_button__hS390{align-items:center;background-color:#fff;border:1px solid #d1d5db;border-radius:.375rem;box-shadow:0 1px 2px 0 rgba(0,0,0,.05);color:#374151;cursor:pointer;display:inline-flex;gap:.5rem;padding:.5rem 1rem;transition:all .2s ease-in-out}.BookEditor-module_button__hS390:hover{background-color:#f9fafb;border-color:#b7bcce;box-shadow:0 1px 3px 0 rgba(0,0,0,.1),0 1px 2px 0 rgba(0,0,0,.06)}\n/*# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIkJvb2tFZGl0b3IubW9kdWxlLmNzcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxxQ0FFSSxVQUNKLENBRUEsOENBS0kscUJBQXNCLENBSHRCLFdBQVksQ0FFWixtQkFBb0IsQ0FEcEIsaUJBQWtCLENBRmxCLFVBS0osQ0FFQSxpRkFFSSxnQ0FBcUMsQ0FDckMsaUNBRUosQ0FFQSxvQ0FDSSwwQkFDSixDQUVBLDRDQUtJLHFCQUF1QixDQUR2QixxQ0FBMEMsQ0FGMUMsa0JBQW1CLENBSW5CLHNDQUEyQyxDQUwzQyxlQUFnQixDQUVoQixnQkFBaUIsQ0FJakIscUNBQ0osQ0FDQSxnRkFFSSxnQkFFSixDQUVBLGtEQUNJLHVFQUNKLENBVUEsNEZBQ0ksZUFDSixDQUVBLHNDQVNJLGtCQUFtQixDQUhuQiwrQkFBb0MsQ0FEcEMsUUFBUyxDQUVULFVBQVksQ0FDWixZQUFhLENBR2IsZ0JBQWlCLENBRGpCLHNCQUF1QixDQVB2QixNQUFPLENBVVAsbUJBQW9CLENBWnBCLGlCQUFrQixDQUdsQixPQUFRLENBRlIsS0FBTSxDQVVOLFdBRUosQ0FFQSx5REFDSSw0QkFDSixDQUVBLDhDQUNJLGlCQUFrQixDQUVsQixVQUFXLENBRFgsUUFBUyxDQUVULFdBQ0osQ0FFQSxxQ0FXSSxXQUFZLENBRlosZUFBZ0IsQ0FKaEIsUUFBUyxDQU9ULGVBQWdCLENBTGhCLFdBQVksQ0FKWixNQUFPLENBT1AsZ0JBQWlCLENBVGpCLGNBQWUsQ0FHZixPQUFRLENBRlIsS0FBTSxDQUlOLFVBQVcsQ0FFWCxZQUtKLENBRUEsaUNBT0ksa0JBQW1CLENBTm5CLHFCQUFzQixDQUN0Qix3QkFBeUIsQ0FDekIscUJBQXVCLENBT3ZCLHNDQUEyQyxDQUQzQyxhQUFjLENBSmQsY0FBZSxDQUNmLG1CQUFvQixDQUVwQixTQUFXLENBSlgsa0JBQW9CLENBT3BCLDhCQUNKLENBRUEsdUNBQ0ksd0JBQXlCLENBQ3pCLG9CQUFxQixDQUNyQixpRUFDSiIsImZpbGUiOiJCb29rRWRpdG9yLm1vZHVsZS5jc3MiLCJzb3VyY2VzQ29udGVudCI6WyIuQm9va0VkaXRvciB7XG4gICAgLyogaGVpZ2h0OiA0NTBweDsgKi9cbiAgICB3aWR0aDogMTAwJTtcbn1cblxuLmJvb2tFZGl0b3JDb250YWluZXIge1xuICAgIHdpZHRoOiAxMDAlO1xuICAgIGhlaWdodDogMTAwJTtcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gICAgcGFkZGluZzogMTBweCAyNXB4IDA7XG4gICAgYm94LXNpemluZzogYm9yZGVyLWJveDtcbn1cblxuLmJvb2tFZGl0b3JDb250YWluZXIuaXNWZXJib3NlIHtcbiAgICAvKiovXG4gICAgYmFja2dyb3VuZC1jb2xvcjogcmdiYSgwLCAwLCAwLCAwLjA1KTtcbiAgICBvdXRsaW5lOiAxcHggZG90dGVkIHJnYmEoMCwgMCwgMCwgMC41KTtcbiAgICAvKiovXG59XG5cbi5pc1ZlcmJvc2Uge1xuICAgIG91dGxpbmU6IDJweCBkb3R0ZWQgcmdiKDI1NSAxMTcgMzgpO1xufVxuXG4uYm9va0VkaXRvcldyYXBwZXIge1xuICAgIG92ZXJmbG93OiBoaWRkZW47XG4gICAgYm9yZGVyLXJhZGl1czogMXJlbTtcbiAgICBwYWRkaW5nLXRvcDogMTBweDtcbiAgICBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDIwOSwgMjEzLCAyMTksIDAuOCk7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogd2hpdGU7XG4gICAgYm94LXNoYWRvdzogMCAxcHggMnB4IDAgcmdiYSgwLCAwLCAwLCAwLjA1KTtcbiAgICB0cmFuc2l0aW9uOiBib3gtc2hhZG93IDAuMnMgZWFzZS1pbi1vdXQ7XG59XG4uaXNWZXJib3NlIC5ib29rRWRpdG9yV3JhcHBlciB7XG4gICAgLyoqL1xuICAgIG92ZXJmbG93OiB2aXNpYmxlO1xuICAgIC8qKi9cbn1cblxuLmJvb2tFZGl0b3JXcmFwcGVyOmhvdmVyIHtcbiAgICBib3gtc2hhZG93OiAwIDRweCA2cHggLTFweCByZ2JhKDAsIDAsIDAsIDAuMSksIDAgMnB4IDRweCAtMXB4IHJnYmEoMCwgMCwgMCwgMC4wNik7XG59XG5cbi5ib29rRWRpdG9yV3JhcHBlcjpmb2N1cy13aXRoaW4ge1xuICAgIC8qXG4gICAgb3V0bGluZTogMnB4IHNvbGlkIHRyYW5zcGFyZW50O1xuICAgIG91dGxpbmUtb2Zmc2V0OiAycHg7XG4gICAgYm94LXNoYWRvdzogMCAwIDAgM3B4IHJnYmEoOTksIDEwMiwgMjQxLCAwLjQpO1xuICAgICovXG59XG5cbi5ib29rRWRpdG9yV3JhcHBlci5pc0JvcmRlclJhZGl1c0Rpc2FibGVkIHtcbiAgICBib3JkZXItcmFkaXVzOiAwO1xufVxuXG4uZHJvcE92ZXJsYXkge1xuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICB0b3A6IDA7XG4gICAgbGVmdDogMDtcbiAgICByaWdodDogMDtcbiAgICBib3R0b206IDA7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogcmdiYSgwLCAwLCAwLCAwLjUpO1xuICAgIGNvbG9yOiB3aGl0ZTtcbiAgICBkaXNwbGF5OiBmbGV4O1xuICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG4gICAgZm9udC1zaXplOiAxLjVyZW07XG4gICAgei1pbmRleDogMTAwO1xuICAgIHBvaW50ZXItZXZlbnRzOiBub25lO1xufVxuXG4uYm9va0VkaXRvckNvbnRhaW5lciA6Z2xvYmFsKC52aWV3LWxpbmUpIHtcbiAgICBib3JkZXItYm90dG9tOiAxcHggc29saWQgI2VlZTtcbn1cblxuLmJvb2tFZGl0b3JBY3Rpb25iYXIge1xuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICB0b3A6IDEwcHg7XG4gICAgcmlnaHQ6IDU1cHg7XG4gICAgei1pbmRleDogMTAwO1xufVxuXG4uZnVsbHNjcmVlbiB7XG4gICAgcG9zaXRpb246IGZpeGVkO1xuICAgIHRvcDogMDtcbiAgICBsZWZ0OiAwO1xuICAgIHJpZ2h0OiAwO1xuICAgIGJvdHRvbTogMDtcbiAgICB3aWR0aDogMTAwJTtcbiAgICBoZWlnaHQ6IDEwMCU7XG4gICAgei1pbmRleDogOTk5OTtcbiAgICBib3JkZXItcmFkaXVzOiAwO1xuICAgIHBhZGRpbmctdG9wOiA1MHB4O1xuICAgIGJvcmRlcjogbm9uZTtcbiAgICBib3gtc2hhZG93OiBub25lO1xufVxuXG4uYnV0dG9uIHtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmO1xuICAgIGJvcmRlcjogMXB4IHNvbGlkICNkMWQ1ZGI7XG4gICAgYm9yZGVyLXJhZGl1czogMC4zNzVyZW07XG4gICAgcGFkZGluZzogMC41cmVtIDFyZW07XG4gICAgY3Vyc29yOiBwb2ludGVyO1xuICAgIGRpc3BsYXk6IGlubGluZS1mbGV4O1xuICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAgZ2FwOiAwLjVyZW07XG4gICAgY29sb3I6ICMzNzQxNTE7XG4gICAgYm94LXNoYWRvdzogMCAxcHggMnB4IDAgcmdiYSgwLCAwLCAwLCAwLjA1KTtcbiAgICB0cmFuc2l0aW9uOiBhbGwgMC4ycyBlYXNlLWluLW91dDtcbn1cblxuLmJ1dHRvbjpob3ZlciB7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogI2Y5ZmFmYjtcbiAgICBib3JkZXItY29sb3I6ICNiN2JjY2U7XG4gICAgYm94LXNoYWRvdzogMCAxcHggM3B4IDAgcmdiYSgwLCAwLCAwLCAwLjEpLCAwIDFweCAycHggMCByZ2JhKDAsIDAsIDAsIDAuMDYpO1xufVxuIl19 */";
5710
5755
  var styles$4 = {"BookEditor":"BookEditor-module_BookEditor__s-0PU","bookEditorContainer":"BookEditor-module_bookEditorContainer__wLMwM","isVerbose":"BookEditor-module_isVerbose__VQ6iL","bookEditorWrapper":"BookEditor-module_bookEditorWrapper__twppD","isBorderRadiusDisabled":"BookEditor-module_isBorderRadiusDisabled__h1I3v","dropOverlay":"BookEditor-module_dropOverlay__xWWoX","bookEditorActionbar":"BookEditor-module_bookEditorActionbar__KW6dc","fullscreen":"BookEditor-module_fullscreen__rktsl","button":"BookEditor-module_button__hS390"};
5711
5756
  styleInject(css_248z$5);
5712
5757
 
5713
- var PipelineCollection = [{title:"Prepare Knowledge from Markdown",pipelineUrl:"https://promptbook.studio/promptbook/prepare-knowledge-from-markdown.book",formfactorName:"GENERIC",parameters:[{name:"knowledgeContent",description:"Markdown document content",isInput:true,isOutput:false},{name:"knowledgePieces",description:"The knowledge JSON object",isInput:false,isOutput:true}],tasks:[{taskType:"PROMPT_TASK",name:"knowledge",title:"Knowledge",content:"You are experienced data researcher, extract the important knowledge from the document.\n\n# Rules\n\n- Make pieces of information concise, clear, and easy to understand\n- One piece of information should be approximately 1 paragraph\n- Divide the paragraphs by markdown horizontal lines ---\n- Omit irrelevant information\n- Group redundant information\n- Write just extracted information, nothing else\n\n# The document\n\nTake information from this document:\n\n> {knowledgeContent}",resultingParameterName:"knowledgePieces",dependentParameterNames:["knowledgeContent"]}],personas:[],preparations:[],knowledgeSources:[],knowledgePieces:[],sources:[{type:"BOOK",path:null,content:"# Prepare Knowledge from Markdown\n\n- PIPELINE URL `https://promptbook.studio/promptbook/prepare-knowledge-from-markdown.book`\n- INPUT PARAMETER `{knowledgeContent}` Markdown document content\n- OUTPUT PARAMETER `{knowledgePieces}` The knowledge JSON object\n\n## Knowledge\n\n<!-- TODO: [🍆] -FORMAT JSON -->\n\n```markdown\nYou are experienced data researcher, extract the important knowledge from the document.\n\n# Rules\n\n- Make pieces of information concise, clear, and easy to understand\n- One piece of information should be approximately 1 paragraph\n- Divide the paragraphs by markdown horizontal lines ---\n- Omit irrelevant information\n- Group redundant information\n- Write just extracted information, nothing else\n\n# The document\n\nTake information from this document:\n\n> {knowledgeContent}\n```\n\n`-> {knowledgePieces}`\n"}],sourceFile:"./books/prepare-knowledge-from-markdown.book"},{title:"Prepare Keywords",pipelineUrl:"https://promptbook.studio/promptbook/prepare-knowledge-keywords.book",formfactorName:"GENERIC",parameters:[{name:"knowledgePieceContent",description:"The content",isInput:true,isOutput:false},{name:"keywords",description:"Keywords separated by comma",isInput:false,isOutput:true}],tasks:[{taskType:"PROMPT_TASK",name:"knowledge",title:"Knowledge",content:"You are experienced data researcher, detect the important keywords in the document.\n\n# Rules\n\n- Write just keywords separated by comma\n\n# The document\n\nTake information from this document:\n\n> {knowledgePieceContent}",resultingParameterName:"keywords",dependentParameterNames:["knowledgePieceContent"]}],personas:[],preparations:[],knowledgeSources:[],knowledgePieces:[],sources:[{type:"BOOK",path:null,content:"# Prepare Keywords\n\n- PIPELINE URL `https://promptbook.studio/promptbook/prepare-knowledge-keywords.book`\n- INPUT PARAMETER `{knowledgePieceContent}` The content\n- OUTPUT PARAMETER `{keywords}` Keywords separated by comma\n\n## Knowledge\n\n<!-- TODO: [🍆] -FORMAT JSON -->\n\n```markdown\nYou are experienced data researcher, detect the important keywords in the document.\n\n# Rules\n\n- Write just keywords separated by comma\n\n# The document\n\nTake information from this document:\n\n> {knowledgePieceContent}\n```\n\n`-> {keywords}`\n"}],sourceFile:"./books/prepare-knowledge-keywords.book"},{title:"Prepare Knowledge-piece Title",pipelineUrl:"https://promptbook.studio/promptbook/prepare-knowledge-title.book",formfactorName:"GENERIC",parameters:[{name:"knowledgePieceContent",description:"The content",isInput:true,isOutput:false},{name:"title",description:"The title of the document",isInput:false,isOutput:true}],tasks:[{taskType:"PROMPT_TASK",name:"knowledge",title:"Knowledge",content:"You are experienced content creator, write best title for the document.\n\n# Rules\n\n- Write just title, nothing else\n- Write maximum 5 words for the title\n\n# The document\n\n> {knowledgePieceContent}",resultingParameterName:"title",expectations:{words:{min:1,max:8}},dependentParameterNames:["knowledgePieceContent"]}],personas:[],preparations:[],knowledgeSources:[],knowledgePieces:[],sources:[{type:"BOOK",path:null,content:"# Prepare Knowledge-piece Title\n\n- PIPELINE URL `https://promptbook.studio/promptbook/prepare-knowledge-title.book`\n- INPUT PARAMETER `{knowledgePieceContent}` The content\n- OUTPUT PARAMETER `{title}` The title of the document\n\n## Knowledge\n\n- EXPECT MIN 1 WORD\n- EXPECT MAX 8 WORDS\n\n```markdown\nYou are experienced content creator, write best title for the document.\n\n# Rules\n\n- Write just title, nothing else\n- Write maximum 5 words for the title\n\n# The document\n\n> {knowledgePieceContent}\n```\n\n`-> {title}`\n"}],sourceFile:"./books/prepare-knowledge-title.book"},{title:"Prepare Persona",pipelineUrl:"https://promptbook.studio/promptbook/prepare-persona.book",formfactorName:"GENERIC",parameters:[{name:"availableModels",description:"List of available model names together with their descriptions as JSON",isInput:true,isOutput:false},{name:"personaDescription",description:"Description of the persona",isInput:true,isOutput:false},{name:"modelsRequirements",description:"Specific requirements for the model",isInput:false,isOutput:true}],tasks:[{taskType:"PROMPT_TASK",name:"make-model-requirements",title:"Make modelRequirements",content:"You are an experienced AI engineer, you need to find the best models for virtual assistants:\n\n## Example\n\n```json\n[\n {\n \"modelName\": \"gpt-4o\",\n \"systemMessage\": \"You are experienced AI engineer and helpful assistant.\",\n \"temperature\": 0.7\n },\n {\n \"modelName\": \"claude-3-5-sonnet\",\n \"systemMessage\": \"You are a friendly and knowledgeable chatbot.\",\n \"temperature\": 0.5\n }\n]\n```\n\n## Instructions\n\n- Your output format is JSON array\n- Sort best-fitting models first\n- Omit any models that are not suitable\n- Write just the JSON, no other text should be present\n- Array contain items with following keys:\n - `modelName`: The name of the model to use\n - `systemMessage`: The system message to provide context to the model\n - `temperature`: The sampling temperature to use\n\n### Key `modelName`\n\nHere are the available models:\n\n```json\n{availableModels}\n```\n\n### Key `systemMessage`\n\nThe system message is used to communicate instructions or provide context to the model at the beginning of a conversation. It is displayed in a different format compared to user messages, helping the model understand its role in the conversation. The system message typically guides the model's behavior, sets the tone, or specifies desired output from the model. By utilizing the system message effectively, users can steer the model towards generating more accurate and relevant responses.\n\nFor example:\n\n> You are an experienced AI engineer and helpful assistant.\n\n> You are a friendly and knowledgeable chatbot.\n\n### Key `temperature`\n\nThe sampling temperature, between 0 and 1. Higher values like 0.8 will make the output more random, while lower values like 0.2 will make it more focused and deterministic. If set to 0, the model will use log probability to automatically increase the temperature until certain thresholds are hit.\n\nYou can pick a value between 0 and 2. For example:\n\n- `0.1`: Low temperature, extremely conservative and deterministic\n- `0.5`: Medium temperature, balanced between conservative and creative\n- `1.0`: High temperature, creative and bit random\n- `1.5`: Very high temperature, extremely creative and often chaotic and unpredictable\n- `2.0`: Maximum temperature, completely random and unpredictable, for some extreme creative use cases\n\n# The assistant\n\nTake this description of the persona:\n\n> {personaDescription}",resultingParameterName:"modelsRequirements",format:"JSON",dependentParameterNames:["availableModels","personaDescription"]}],personas:[],preparations:[],knowledgeSources:[],knowledgePieces:[],sources:[{type:"BOOK",path:null,content:"# Prepare Persona\n\n- PIPELINE URL `https://promptbook.studio/promptbook/prepare-persona.book`\n- INPUT PARAMETER `{availableModels}` List of available model names together with their descriptions as JSON\n- INPUT PARAMETER `{personaDescription}` Description of the persona\n- OUTPUT PARAMETER `{modelsRequirements}` Specific requirements for the model\n\n## Make modelRequirements\n\n- FORMAT JSON\n\n```markdown\nYou are an experienced AI engineer, you need to find the best models for virtual assistants:\n\n## Example\n\n\\`\\`\\`json\n[\n {\n \"modelName\": \"gpt-4o\",\n \"systemMessage\": \"You are experienced AI engineer and helpful assistant.\",\n \"temperature\": 0.7\n },\n {\n \"modelName\": \"claude-3-5-sonnet\",\n \"systemMessage\": \"You are a friendly and knowledgeable chatbot.\",\n \"temperature\": 0.5\n }\n]\n\\`\\`\\`\n\n## Instructions\n\n- Your output format is JSON array\n- Sort best-fitting models first\n- Omit any models that are not suitable\n- Write just the JSON, no other text should be present\n- Array contain items with following keys:\n - `modelName`: The name of the model to use\n - `systemMessage`: The system message to provide context to the model\n - `temperature`: The sampling temperature to use\n\n### Key `modelName`\n\nHere are the available models:\n\n\\`\\`\\`json\n{availableModels}\n\\`\\`\\`\n\n### Key `systemMessage`\n\nThe system message is used to communicate instructions or provide context to the model at the beginning of a conversation. It is displayed in a different format compared to user messages, helping the model understand its role in the conversation. The system message typically guides the model's behavior, sets the tone, or specifies desired output from the model. By utilizing the system message effectively, users can steer the model towards generating more accurate and relevant responses.\n\nFor example:\n\n> You are an experienced AI engineer and helpful assistant.\n\n> You are a friendly and knowledgeable chatbot.\n\n### Key `temperature`\n\nThe sampling temperature, between 0 and 1. Higher values like 0.8 will make the output more random, while lower values like 0.2 will make it more focused and deterministic. If set to 0, the model will use log probability to automatically increase the temperature until certain thresholds are hit.\n\nYou can pick a value between 0 and 2. For example:\n\n- `0.1`: Low temperature, extremely conservative and deterministic\n- `0.5`: Medium temperature, balanced between conservative and creative\n- `1.0`: High temperature, creative and bit random\n- `1.5`: Very high temperature, extremely creative and often chaotic and unpredictable\n- `2.0`: Maximum temperature, completely random and unpredictable, for some extreme creative use cases\n\n# The assistant\n\nTake this description of the persona:\n\n> {personaDescription}\n```\n\n`-> {modelsRequirements}`\n"}],sourceFile:"./books/prepare-persona.book"},{title:"Prepare Title",pipelineUrl:"https://promptbook.studio/promptbook/prepare-title.book",formfactorName:"GENERIC",parameters:[{name:"book",description:"The book to prepare the title for",isInput:true,isOutput:false},{name:"title",description:"Best title for the book",isInput:false,isOutput:true}],tasks:[{taskType:"PROMPT_TASK",name:"make-title",title:"Make title",content:"Make best title for given text which describes the workflow:\n\n## Rules\n\n- Write just title, nothing else\n- Title should be concise and clear - Write maximum ideally 2 words, maximum 5 words\n- Title starts with emoticon\n- Title should not mention the input and output of the workflow but the main purpose of the workflow\n _For example, not \"✍ Convert Knowledge-piece to title\" but \"✍ Title\"_\n\n## The workflow\n\n> {book}",resultingParameterName:"title",expectations:{words:{min:1,max:8},lines:{min:1,max:1}},dependentParameterNames:["book"]}],personas:[],preparations:[],knowledgeSources:[],knowledgePieces:[],sources:[{type:"BOOK",path:null,content:"# Prepare Title\n\n- PIPELINE URL `https://promptbook.studio/promptbook/prepare-title.book`\n- INPUT PARAMETER `{book}` The book to prepare the title for\n- OUTPUT PARAMETER `{title}` Best title for the book\n\n## Make title\n\n- EXPECT MIN 1 Word\n- EXPECT MAX 8 Words\n- EXPECT EXACTLY 1 Line\n\n```markdown\nMake best title for given text which describes the workflow:\n\n## Rules\n\n- Write just title, nothing else\n- Title should be concise and clear - Write maximum ideally 2 words, maximum 5 words\n- Title starts with emoticon\n- Title should not mention the input and output of the workflow but the main purpose of the workflow\n _For example, not \"✍ Convert Knowledge-piece to title\" but \"✍ Title\"_\n\n## The workflow\n\n> {book}\n```\n\n`-> {title}`\n"}],sourceFile:"./books/prepare-title.book"},{title:"📊 Curriculum Audit",pipelineUrl:"https://promptbook.studio/promptbook//examples/lsvp-asistent.book",formfactorName:"GENERIC",parameters:[{name:"result",isInput:false,isOutput:true}],tasks:[{taskType:"PROMPT_TASK",name:"prompt",title:"Prompt",content:"Asistent pro LŠVP\n\nPERSONA Jsi asistent pro RVP Lyceum v rámci Národního pedagogického institutu České Republiky\nMETA IMAGE https://edulk.cz/getFile/id:475818/type:large/02%20zna%C4%8Dka%20npi.jpg\nRULE Pokud jsi nejsi jistý, napiš nevím\nKNOWLEDGE ./241129_Lyceum_final.pdf\nCONTEXT Obecně dokážeš řešit libovolné ŠVP, aktuálně řešíš {Školní vzdělávací program LYCEUM}\nRULE Z {Porovnání RVP a ŠVP - postup} je nejdůležitější fáze 3\nKNOWLEDGE {Školní vzdělávací program LYCEUM} ./ŠVP Lyceum - Finance v digitální době.pdf\nKNOWLEDGE @Slovník\n\n**Interní slovník - RVP/ŠVP**\n\n**RVP**\n\nRámcový vzdělávací program pro obor vzdělání Lyceum je dokument na národní úrovni, který formuluje požadavky na školní vzdělávací programy ve formě především očekávaných výsledků učení, kterých mají žáci absolvováním tohoto programu na dané škole dosáhnout.\n\n**ŠVP**\n\nŠkolní vzdělávací program pro obor vzdělání Lyceum je dokument každé jednotlivé školy, který popisuje v jakých vyučovacích předmětech/ vzdělávacích modulech a v jakých ročnících budou požadované očekávané výsledky učení naplněny. Zároveň formuluje další očekávané výsledky učení, které naplňují disponibilní část vyučovacího času určeného RVP pro tento obor vzdělání.\n\n**Očekávaný výsledek učení (OVU)**\n\nVyjadřuje jednotlivý požadavek na to, co mají žáci umět na konci vzdělávacího programu, tzn. jejich požadované kompetence. Je vyjádřen formulací, která je uvozena činnostním slovesem a dále obsahuje předmět této činnosti. Formulace je konkretizována resp. doplněna zpravidla formou odrážek vymezením dílčích znalostí, dovedností, postojů, jejichž splnění je předpokladem dosažení OVU jako celku.\n\n_Příklad:_\n\n<div class=\"joplin-table-wrapper\"><table><tbody><tr><th><p><strong>Žák/žákyně řídí realizaci jednoduchého projektu</strong></p></th></tr><tr><td><ul><li>naplánuje aktivity projektu</li></ul></td></tr><tr><td><ul><li>navrhne rozpočet projektu vzhledem k navrženým aktivitám</li></ul></td></tr><tr><td><ul><li>stanoví základní ukazatele a sleduje jejich naplňování</li></ul></td></tr><tr><td><ul><li>vede projektový tým</li></ul></td></tr><tr><td><ul><li>uvede, jak by řešil krizové situace v projektu</li></ul></td></tr><tr><td><ul><li>vyhodnotí úspěšnost projektu</li></ul></td></tr></tbody></table></div>\n\n**Vzdělávací oblasti**\n\nOčekávané výsledky učení jsou v **_RVP členěny do 4 vzdělávacích oblastí_**, které tvoří společný všeobecně vzdělávací základ:\n\n- Osobnostní rozvoj, vzdělávání ke zdraví, bezpečí a produktivnímu pracovnímu životu (kariéře)\n- Komunikační a jazykové vzdělávání\n- Aplikované vzdělávání STEM (Science, Technology, Engeneering, Math), tj. přírodní vědy, informatika, technika, matematika\n- Prakticky orientované vzdělávání společenskovědní a humanitní\n\nKaždá vzdělávací oblast se dále člení na okruhy, v jejichž rámci jsou OVU samostatně číslované.\n\n<div class=\"joplin-table-wrapper\"><table><tbody><tr><th rowspan=\"21\"><ul><li>Prakticky orientované vzdělávání společenskovědní a humanitní</li></ul></th><th rowspan=\"21\"><p><strong>Člověk, ekonomie a podnikání</strong></p></th><th rowspan=\"7\"><p><strong>1</strong></p></th><th><p><strong>zpracuje podklady související s podnikáním</strong></p></th></tr><tr><td><p>připraví podnikatelský záměr</p></td></tr><tr><td><p>sestaví zakladatelský rozpočet</p></td></tr><tr><td><p>zkalkuluje cenu zboží nebo služby</p></td></tr><tr><td><p>vysvětlí na příkladu základní povinnosti podnikatele vůči státu a zaměstnancům</p></td></tr><tr><td><p>vede daňovou evidenci</p></td></tr><tr><td><p>vysvětlí na příkladech etiku v podnikání</p></td></tr><tr><td rowspan=\"7\"><p><strong>2</strong></p></td><td><p><strong>řídí realizaci jednoduchého projektu</strong></p></td></tr><tr><td><p>naplánuje aktivity projektu</p></td></tr><tr><td><p>navrhne rozpočet projektu vzhledem k navrženým aktivitám</p></td></tr><tr><td><p>stanoví základní ukazatele a sleduje jejich naplňování</p></td></tr><tr><td><p>vede projektový tým</p></td></tr><tr><td><p>uvede, jak by řešil krizové situace v projektu</p></td></tr><tr><td><p>vyhodnotí úspěšnost projektu</p></td></tr><tr><td rowspan=\"7\"><p><strong>3</strong></p></td><td><p><strong>aplikuje ekonomické teorie v osobním a profesním životě</strong></p></td></tr><tr><td><p>vysvětlí základní ekonomické otázky</p></td></tr><tr><td><p>vysvětí stanovení rovnovážné ceny na dokonalém i nedokonalém trhu</p></td></tr><tr><td><p>charakterizuje výrobní faktory a vysvětlí hranici produkčních možností a náklady obětované příležitosti</p></td></tr><tr><td><p>uvede nejdůležitější makroekonomické pojmy a vliv jejich výše na kvalitu života a podnikání v daném státě</p></td></tr><tr><td><p>vysvětlí podstatu inflace a její důsledky na finanční situaci obyvatel a na příkladu ukáže jak se bránit jejím nepříznivým důsledkům</p></td></tr><tr><td><p>uvede hlavní výhody a nevýhody mezinárodního obchodu a vliv ochranářských opatření na ekonomickou situaci dané země</p></td></tr><tr><td></td><td></td><td><p><strong>4</strong></p></td><td><p>Atd.</p></td></tr></tbody></table></div>\n\n**Vyučovací předmět / vzdělávací modul**\n\nOčekávané výsledky učení jsou v **ŠVP** členěny do vyučovacích předmětů nebo vzdělávacích modulů, které jsou dále zařazeny do jednoho nebo více ročníků 4letého studia. Vyučovací předmět / vzdělávací modul tvoří vyučovací jednotku, kde jsou očekávané výsledky učení dále rozpracovány pro potřeby výuky podle následující šablony\n\n| **A. VSTUPNÍ ČÁST** |\n| --- |\n| **1\\. Název** |\n| **2\\. Kód** (kódy by měly být navázány na obory vzdělání a výsledky učení) |\n| **2a) Kategorie vzdělání** - v případě, že nebude součástí kódu |\n| **3\\. Typ vyučovací jednotky** (modul, předmět, stáž apod.) |\n| **4\\. Délka** (počet hodin - dělitelný čtyřmi (optimální modul 16, 32 hodin = týden výuky) |\n| **5\\. Platnost** (datum, od kterého platí) |\n| **6\\. Vstupní předpoklady** (vymezení požadované úrovně vstupních vědomostí a dovedností, které jsou předpokladem úspěšného studia) |\n| |\n| **B. JÁDRO VYUČOVACÍ JEDNOTKY** |\n| **1\\. Charakteristika** (stručná anotace popisující obecné cíle a pojetí) |\n| **2\\. Očekávané výsledky učení a jejich indikátory (převzaté z RVP nebo dále konkretizované)** |\n| **3\\. Podpora rozvoje klíčových kompetencí a základních gramotností** (které klíčové kompetence jsou v rozvíjeny) |\n| **4\\. Obsah vzdělávání** (rozpis učiva) |\n| **5\\. Vzdělávací strategie** (strategie výuky, resp. učební činnosti žáků, které jsou doporučené pro dosažení výsledků) |\n| |\n| **C. VÝSTUPNÍ ČÁST** |\n| **1\\. Způsob ověřování dosažených výsledků** (ve vazbě na jednotlivé výsledky učení) |\n| **2\\. Kritéria hodnocení** (co znamená splnění výsledků učení, kdy je splněna celá vyučovací jednotka, kritéria pro známky, příp. procentuální, slovní hodnocení) |\n| **3\\. Doporučená studijní literatura, odkazy na ilustrační zdroje** |\n| **4\\. Poznámky** |\n\n**Soulad OVU RVP a ŠVP**\n\nTento soulad je předmětem zjišťování. Soulad nastává, jestliže jsou očekávané výsledky učení z jednotlivých vzdělávacích oblastí RVP **obsaženy** ve vyučovacích předmětech/ vzdělávacích modulech ŠVP jednotlivých škol, tzn. že v ŠVP se objevuje jejich formulace buď v doslovném nebo podobném znění v jednom nebo více vyučovacích předmětech/ vzdělávacích modulech.\n\n_Příklad souladu:_\n\nRVP ŠVP - komunikace a marketing (SŠ obchodní Č.\n\n| **2** | **řídí realizaci jednoduchého projektu** |\n| --- | --- |\n| naplánuje aktivity projektu |\n| navrhne rozpočet projektu vzhledem k navrženým aktivitám |\n| stanoví základní ukazatele a sleduje jejich naplňování |\n| vede projektový tým |\n| uvede, jak by řešil krizové situace v projektu |\n| vyhodnotí úspěšnost projektu |\n\nKNOWLEDGE {Porovnání RVP a ŠVP - postup}\n\n\n# AUDITNÍ PROTOKOL ŠVP-RVP\n\n# (POPIS KONTROLNÍHO ALGORITMU)\n\nMetodika je určena pro **Kvantifikaci Shody** školního vzdělávacího programu (ŠVP) s Rámcovým vzdělávacím programem (RVP).\n\n## FÁZE 1: VALIDACE DOKUMENTACE\n\n**Cíl:** Ověřit platnost, aktuálnost a strukturu zdrojových dokumentů.\n\n- **RVP Verifikace:** Otevřít aktuální verzi RVP (např. RVP ZV/G/SOŠ).\n- **Typová shoda:** Ověřit, že RVP se vztahuje k danému typu školy.\n- **ŠVP Dimenze:** Identifikovat a izolovat relevantní části ŠVP: Profil absolventa, Klíčové kompetence (KK), Vzdělávací oblasti (VO), případně Učební plán (UP).\n- **Verzování:** Potvrdit, že obě verze (RVP a ŠVP) jsou nejnovější a platné (včetně dodatků RVP).\n\n## FÁZE 2: DATABÁZOVÉ MAPOVÁNÍ VÝSTUPŮ (MASTER MATICE)\n\n**Cíl:** Vytvořit systémovou databázi pro křížové porovnání všech povinných komponent RVP se ŠVP.\n\n- **Dekompozice RVP:** Rozložit RVP na základní povinné komponenty: Klíčové kompetence, Vzdělávací oblasti a obory, Očekávané výstupy (OVU), Průřezová témata (PT).\n- **Přiřazovací mapa:** Vytvořit hlavní kontrolní matici (Master Matice) pro záznam vazeb.\n\n| Oblast RVP | Výstup RVP (OVU) | Odpovídající Část ŠVP (Předmět/Ročník) | Konkrétní Tématický Celek v ŠVP | Stav Shody (Protokol) |\n| --- | --- | --- | --- | --- |\n| ... | ... | ... | ... | ... |\n| --- | --- | --- | --- | --- |\n\n## FÁZE 3: ALGORITMICKÁ KONTROLA POKRYTÍ A HLOUBKY\n\n**Cíl:** Posoudit, zda každý povinný výstup RVP je adekvátně reflektován v obsahu ŠVP, a přidělit bodovou hodnotu pro kvantifikaci.\n\n- **Audit OVU:** Projít každý jednotlivý Očekávaný výstup (OVU) z RVP.\n- **Kódování stavu a bodování:** U každého OVU v matici označit stav pokrytí dle následujícího schématu:\n\n| Kód (Protokol) | Popis (Kvalitativní zjištění) | Bodová hodnota (Kvantifikace) |\n| --- | --- | --- |\n| ✅ | Plná shoda (Výstup pokryt v plném rozsahu, odpovídající úrovni RVP) | 1,0 |\n| --- | --- | --- |\n| ⚠️ | Částečná shoda (Formální pokrytí, omezený rozsah, chybná návaznost) | 0,5 |\n| --- | --- | --- |\n| ❌ | Absence (Výstup zcela chybí v obsahu ŠVP) | 0,0 |\n| --- | --- | --- |\n\n- **Defektologie ŠVP:** Identifikovat a zaznamenat deficity ŠVP: Chybějící výstupy (❌), Sémantické překryvy, Přetížení obsahu.\n- **Kvalitativní posun:** Ověřit, zda je formulace výstupů v ŠVP **aktivní, měřitelná a v souladu** s úrovní RVP.\n\n## FÁZE 4: STRUKTURÁLNÍ VERIFIKACE NÁVAZNOSTI (VERTIKÁLA/HORIZONTÁLA)\n\n**Cíl:** Zkontrolovat logickou posloupnost a provázanost učiva v rámci ŠVP.\n\n- **Vertikální Kontrola:** Ověřit posloupnost OVU a učiva uvnitř jednoho předmětu/oblasti (postup od jednodušších ke složitějším konceptům napříč ročníky).\n- **Horizontální Kontrola:** Zkontrolovat logické provázání napříč vzdělávacími oblastmi a předměty (např. fyzika ↔ matematika).\n- **PT Integrace:** Audit reálné integrace Průřezových témat (PT) do konkrétních částí obsahu, metod a projektů.\n\n## FÁZE 5: ANALÝZA ŠKOLNÍ PROFILACE A ROZŠÍŘENÍ RVP\n\n**Cíl:** Validovat, že profilace školy je **v souladu** s RVP a nejedná se o **rozpor**.\n\n- **Nekonfliktnost:** Porovnat definovaný Profil absolventa školy s Klíčovými kompetencemi RVP. Profil ŠVP musí RVP rozvíjet, nikoli mu odporovat.\n- **Modularita:** Zkontrolovat, zda volitelné předměty a rozšiřující moduly logicky navazují na vzdělávací oblasti RVP.\n- **Implementace specializace:** Popisně uvést, jak je školní profilace (např. STEM zaměření, projektová výuka) integrována do OVU a kompetencí definovaných RVP.\n\n## FÁZE 6: GENERÁTOR ZÁVĚREČNÉ ZPRÁVY A KVANTIFIKACE\n\n**Cíl:** Syntetizovat výsledky, kvantifikovat soulad a generovat závazné návrhy na korekce.\n\n### 6.1 Kvantifikace Souladu\n\nVypočítat Index shody (IS) na základě bodového hodnocení (Fáze 3):\n\n### 6.2 Interpretace Indexu Shody (IS)\n\nKlasifikace souladu pro standardizované vyhodnocení:\n\n| Interval IS | Klasifikace souladu | Popis |\n| --- | --- | --- |\n| 95-100 % | Výborný soulad | ŠVP plně odpovídá RVP, pouze stylistické nebo formální rozdíly. |\n| --- | --- | --- |\n| 85-94 % | Dobrá shoda | ŠVP pokrývá všechny klíčové výstupy, menší korekce nutné. |\n| --- | --- | --- |\n| 70-84 % | Částečná shoda | Významné nedostatky v některých oblastech, nutná revize obsahu. |\n| --- | --- | --- |\n| < 70 % | Kritická neshoda | ŠVP neplní rámcové požadavky, ohrožuje legislativní soulad. |\n| --- | --- | --- |\n\n### 6.3 Doplňkové Indexy\n\nVypočítat následující doplňkové indexy pro detailní kvalitativní analýzu:\n\n- **Index kompetenčního souladu (IKS):** Poměr pokrytí klíčových kompetencí RVP v ŠVP.\n- **Index průřezové integrace (IPI):** Míra reálné integrace průřezových témat do výuky.\n- **Index hloubky pokrytí (IHP):** Procento výstupů, které jsou v ŠVP rozvedeny na konkrétní výukové cíle (měřitelné, aktivní formulace).\n- **Index profilové rozšiřitelnosti (IPR):** Kolik rozšiřujících nebo profilových výstupů přesahuje rámec RVP, aniž by narušily jeho strukturu.\n\n### 6.4 Vizuální výstupy\n\nZajistit generování následujících vizualizací pro Závěrečnou zprávu:\n\n- Graf pokrytí po vzdělávacích oblastech (Sloupcový graf IS pro VO).\n- Pavoukový diagram Klíčových kompetencí (RVP vs. ŠVP).\n- Mapa defektů (Vizualizace ❌ a ⚠️ výstupů).\n\n### 6.5 Struktura Závěrečné Zprávy\n\nZpráva musí být strukturována dle standardizovaného formátu:\n\n| Oddíl | Obsah |\n| --- | --- |\n| A. Identifikace | Název školy, IZO, typ školy, datum revize, zpracovatel, verze ŠVP a RVP. |\n| --- | --- |\n| B. Shrnutí výsledků | Celkový Index Shody (IS), hlavní závěry a doporučení. |\n| --- | --- |\n| C. Kvantitativní analýza | Přehled IS v % dle kategorií OVU / VO / kompetencí. |\n| --- | --- |\n| D. Kvalitativní analýza | Slovní zhodnocení kvality souladu (formulace, obtížnost, integrace PT). |\n| --- | --- |\n| E. Rizikové oblasti | Přehled nalezených defektů (chybějící OVU, přetížení, formální shoda). |\n| --- | --- |\n| F. Návrhy opatření (Korekční plán) | Přesné návrhy změn - **Co, Kde, Kdo** má upravit, včetně termínu. |\n| --- | --- |\n| G. Přílohy | Master Matice (Fáze 2-3), revizní tabulka, výstupní grafy a metriky. |\n| --- | --- |\n\n\n\n\n.",resultingParameterName:"result",dependentParameterNames:[]}],personas:[],preparations:[{id:1,promptbookVersion:"0.103.0-35",usage:{price:{value:0},input:{tokensCount:{value:0},charactersCount:{value:0},wordsCount:{value:0},sentencesCount:{value:0},linesCount:{value:0},paragraphsCount:{value:0},pagesCount:{value:0}},output:{tokensCount:{value:0},charactersCount:{value:0},wordsCount:{value:0},sentencesCount:{value:0},linesCount:{value:0},paragraphsCount:{value:0},pagesCount:{value:0}}}}],knowledgeSources:[],knowledgePieces:[],sources:[{type:"BOOK",path:null,content:"Asistent pro LŠVP\n\nPERSONA Jsi asistent pro RVP Lyceum v rámci Národního pedagogického institutu České Republiky\nMETA IMAGE https://edulk.cz/getFile/id:475818/type:large/02%20zna%C4%8Dka%20npi.jpg\nRULE Pokud jsi nejsi jistý, napiš nevím\nKNOWLEDGE ./241129_Lyceum_final.pdf\nCONTEXT Obecně dokážeš řešit libovolné ŠVP, aktuálně řešíš {Školní vzdělávací program LYCEUM}\nRULE Z {Porovnání RVP a ŠVP - postup} je nejdůležitější fáze 3\nKNOWLEDGE {Školní vzdělávací program LYCEUM} ./ŠVP Lyceum - Finance v digitální době.pdf\nKNOWLEDGE @Slovník\n\n**Interní slovník - RVP/ŠVP**\n\n**RVP**\n\nRámcový vzdělávací program pro obor vzdělání Lyceum je dokument na národní úrovni, který formuluje požadavky na školní vzdělávací programy ve formě především očekávaných výsledků učení, kterých mají žáci absolvováním tohoto programu na dané škole dosáhnout.\n\n**ŠVP**\n\nŠkolní vzdělávací program pro obor vzdělání Lyceum je dokument každé jednotlivé školy, který popisuje v jakých vyučovacích předmětech/ vzdělávacích modulech a v jakých ročnících budou požadované očekávané výsledky učení naplněny. Zároveň formuluje další očekávané výsledky učení, které naplňují disponibilní část vyučovacího času určeného RVP pro tento obor vzdělání.\n\n**Očekávaný výsledek učení (OVU)**\n\nVyjadřuje jednotlivý požadavek na to, co mají žáci umět na konci vzdělávacího programu, tzn. jejich požadované kompetence. Je vyjádřen formulací, která je uvozena činnostním slovesem a dále obsahuje předmět této činnosti. Formulace je konkretizována resp. doplněna zpravidla formou odrážek vymezením dílčích znalostí, dovedností, postojů, jejichž splnění je předpokladem dosažení OVU jako celku.\n\n_Příklad:_\n\n<div class=\"joplin-table-wrapper\"><table><tbody><tr><th><p><strong>Žák/žákyně řídí realizaci jednoduchého projektu</strong></p></th></tr><tr><td><ul><li>naplánuje aktivity projektu</li></ul></td></tr><tr><td><ul><li>navrhne rozpočet projektu vzhledem k navrženým aktivitám</li></ul></td></tr><tr><td><ul><li>stanoví základní ukazatele a sleduje jejich naplňování</li></ul></td></tr><tr><td><ul><li>vede projektový tým</li></ul></td></tr><tr><td><ul><li>uvede, jak by řešil krizové situace v projektu</li></ul></td></tr><tr><td><ul><li>vyhodnotí úspěšnost projektu</li></ul></td></tr></tbody></table></div>\n\n**Vzdělávací oblasti**\n\nOčekávané výsledky učení jsou v **_RVP členěny do 4 vzdělávacích oblastí_**, které tvoří společný všeobecně vzdělávací základ:\n\n- Osobnostní rozvoj, vzdělávání ke zdraví, bezpečí a produktivnímu pracovnímu životu (kariéře)\n- Komunikační a jazykové vzdělávání\n- Aplikované vzdělávání STEM (Science, Technology, Engeneering, Math), tj. přírodní vědy, informatika, technika, matematika\n- Prakticky orientované vzdělávání společenskovědní a humanitní\n\nKaždá vzdělávací oblast se dále člení na okruhy, v jejichž rámci jsou OVU samostatně číslované.\n\n<div class=\"joplin-table-wrapper\"><table><tbody><tr><th rowspan=\"21\"><ul><li>Prakticky orientované vzdělávání společenskovědní a humanitní</li></ul></th><th rowspan=\"21\"><p><strong>Člověk, ekonomie a podnikání</strong></p></th><th rowspan=\"7\"><p><strong>1</strong></p></th><th><p><strong>zpracuje podklady související s podnikáním</strong></p></th></tr><tr><td><p>připraví podnikatelský záměr</p></td></tr><tr><td><p>sestaví zakladatelský rozpočet</p></td></tr><tr><td><p>zkalkuluje cenu zboží nebo služby</p></td></tr><tr><td><p>vysvětlí na příkladu základní povinnosti podnikatele vůči státu a zaměstnancům</p></td></tr><tr><td><p>vede daňovou evidenci</p></td></tr><tr><td><p>vysvětlí na příkladech etiku v podnikání</p></td></tr><tr><td rowspan=\"7\"><p><strong>2</strong></p></td><td><p><strong>řídí realizaci jednoduchého projektu</strong></p></td></tr><tr><td><p>naplánuje aktivity projektu</p></td></tr><tr><td><p>navrhne rozpočet projektu vzhledem k navrženým aktivitám</p></td></tr><tr><td><p>stanoví základní ukazatele a sleduje jejich naplňování</p></td></tr><tr><td><p>vede projektový tým</p></td></tr><tr><td><p>uvede, jak by řešil krizové situace v projektu</p></td></tr><tr><td><p>vyhodnotí úspěšnost projektu</p></td></tr><tr><td rowspan=\"7\"><p><strong>3</strong></p></td><td><p><strong>aplikuje ekonomické teorie v osobním a profesním životě</strong></p></td></tr><tr><td><p>vysvětlí základní ekonomické otázky</p></td></tr><tr><td><p>vysvětí stanovení rovnovážné ceny na dokonalém i nedokonalém trhu</p></td></tr><tr><td><p>charakterizuje výrobní faktory a vysvětlí hranici produkčních možností a náklady obětované příležitosti</p></td></tr><tr><td><p>uvede nejdůležitější makroekonomické pojmy a vliv jejich výše na kvalitu života a podnikání v daném státě</p></td></tr><tr><td><p>vysvětlí podstatu inflace a její důsledky na finanční situaci obyvatel a na příkladu ukáže jak se bránit jejím nepříznivým důsledkům</p></td></tr><tr><td><p>uvede hlavní výhody a nevýhody mezinárodního obchodu a vliv ochranářských opatření na ekonomickou situaci dané země</p></td></tr><tr><td></td><td></td><td><p><strong>4</strong></p></td><td><p>Atd.</p></td></tr></tbody></table></div>\n\n**Vyučovací předmět / vzdělávací modul**\n\nOčekávané výsledky učení jsou v **ŠVP** členěny do vyučovacích předmětů nebo vzdělávacích modulů, které jsou dále zařazeny do jednoho nebo více ročníků 4letého studia. Vyučovací předmět / vzdělávací modul tvoří vyučovací jednotku, kde jsou očekávané výsledky učení dále rozpracovány pro potřeby výuky podle následující šablony\n\n| **A. VSTUPNÍ ČÁST** |\n| --- |\n| **1\\. Název** |\n| **2\\. Kód** (kódy by měly být navázány na obory vzdělání a výsledky učení) |\n| **2a) Kategorie vzdělání** - v případě, že nebude součástí kódu |\n| **3\\. Typ vyučovací jednotky** (modul, předmět, stáž apod.) |\n| **4\\. Délka** (počet hodin - dělitelný čtyřmi (optimální modul 16, 32 hodin = týden výuky) |\n| **5\\. Platnost** (datum, od kterého platí) |\n| **6\\. Vstupní předpoklady** (vymezení požadované úrovně vstupních vědomostí a dovedností, které jsou předpokladem úspěšného studia) |\n| |\n| **B. JÁDRO VYUČOVACÍ JEDNOTKY** |\n| **1\\. Charakteristika** (stručná anotace popisující obecné cíle a pojetí) |\n| **2\\. Očekávané výsledky učení a jejich indikátory (převzaté z RVP nebo dále konkretizované)** |\n| **3\\. Podpora rozvoje klíčových kompetencí a základních gramotností** (které klíčové kompetence jsou v rozvíjeny) |\n| **4\\. Obsah vzdělávání** (rozpis učiva) |\n| **5\\. Vzdělávací strategie** (strategie výuky, resp. učební činnosti žáků, které jsou doporučené pro dosažení výsledků) |\n| |\n| **C. VÝSTUPNÍ ČÁST** |\n| **1\\. Způsob ověřování dosažených výsledků** (ve vazbě na jednotlivé výsledky učení) |\n| **2\\. Kritéria hodnocení** (co znamená splnění výsledků učení, kdy je splněna celá vyučovací jednotka, kritéria pro známky, příp. procentuální, slovní hodnocení) |\n| **3\\. Doporučená studijní literatura, odkazy na ilustrační zdroje** |\n| **4\\. Poznámky** |\n\n**Soulad OVU RVP a ŠVP**\n\nTento soulad je předmětem zjišťování. Soulad nastává, jestliže jsou očekávané výsledky učení z jednotlivých vzdělávacích oblastí RVP **obsaženy** ve vyučovacích předmětech/ vzdělávacích modulech ŠVP jednotlivých škol, tzn. že v ŠVP se objevuje jejich formulace buď v doslovném nebo podobném znění v jednom nebo více vyučovacích předmětech/ vzdělávacích modulech.\n\n_Příklad souladu:_\n\nRVP ŠVP - komunikace a marketing (SŠ obchodní Č.\n\n| **2** | **řídí realizaci jednoduchého projektu** |\n| --- | --- |\n| naplánuje aktivity projektu |\n| navrhne rozpočet projektu vzhledem k navrženým aktivitám |\n| stanoví základní ukazatele a sleduje jejich naplňování |\n| vede projektový tým |\n| uvede, jak by řešil krizové situace v projektu |\n| vyhodnotí úspěšnost projektu |\n\nKNOWLEDGE {Porovnání RVP a ŠVP - postup}\n\n\n# AUDITNÍ PROTOKOL ŠVP-RVP\n\n# (POPIS KONTROLNÍHO ALGORITMU)\n\nMetodika je určena pro **Kvantifikaci Shody** školního vzdělávacího programu (ŠVP) s Rámcovým vzdělávacím programem (RVP).\n\n## FÁZE 1: VALIDACE DOKUMENTACE\n\n**Cíl:** Ověřit platnost, aktuálnost a strukturu zdrojových dokumentů.\n\n- **RVP Verifikace:** Otevřít aktuální verzi RVP (např. RVP ZV/G/SOŠ).\n- **Typová shoda:** Ověřit, že RVP se vztahuje k danému typu školy.\n- **ŠVP Dimenze:** Identifikovat a izolovat relevantní části ŠVP: Profil absolventa, Klíčové kompetence (KK), Vzdělávací oblasti (VO), případně Učební plán (UP).\n- **Verzování:** Potvrdit, že obě verze (RVP a ŠVP) jsou nejnovější a platné (včetně dodatků RVP).\n\n## FÁZE 2: DATABÁZOVÉ MAPOVÁNÍ VÝSTUPŮ (MASTER MATICE)\n\n**Cíl:** Vytvořit systémovou databázi pro křížové porovnání všech povinných komponent RVP se ŠVP.\n\n- **Dekompozice RVP:** Rozložit RVP na základní povinné komponenty: Klíčové kompetence, Vzdělávací oblasti a obory, Očekávané výstupy (OVU), Průřezová témata (PT).\n- **Přiřazovací mapa:** Vytvořit hlavní kontrolní matici (Master Matice) pro záznam vazeb.\n\n| Oblast RVP | Výstup RVP (OVU) | Odpovídající Část ŠVP (Předmět/Ročník) | Konkrétní Tématický Celek v ŠVP | Stav Shody (Protokol) |\n| --- | --- | --- | --- | --- |\n| ... | ... | ... | ... | ... |\n| --- | --- | --- | --- | --- |\n\n## FÁZE 3: ALGORITMICKÁ KONTROLA POKRYTÍ A HLOUBKY\n\n**Cíl:** Posoudit, zda každý povinný výstup RVP je adekvátně reflektován v obsahu ŠVP, a přidělit bodovou hodnotu pro kvantifikaci.\n\n- **Audit OVU:** Projít každý jednotlivý Očekávaný výstup (OVU) z RVP.\n- **Kódování stavu a bodování:** U každého OVU v matici označit stav pokrytí dle následujícího schématu:\n\n| Kód (Protokol) | Popis (Kvalitativní zjištění) | Bodová hodnota (Kvantifikace) |\n| --- | --- | --- |\n| ✅ | Plná shoda (Výstup pokryt v plném rozsahu, odpovídající úrovni RVP) | 1,0 |\n| --- | --- | --- |\n| ⚠️ | Částečná shoda (Formální pokrytí, omezený rozsah, chybná návaznost) | 0,5 |\n| --- | --- | --- |\n| ❌ | Absence (Výstup zcela chybí v obsahu ŠVP) | 0,0 |\n| --- | --- | --- |\n\n- **Defektologie ŠVP:** Identifikovat a zaznamenat deficity ŠVP: Chybějící výstupy (❌), Sémantické překryvy, Přetížení obsahu.\n- **Kvalitativní posun:** Ověřit, zda je formulace výstupů v ŠVP **aktivní, měřitelná a v souladu** s úrovní RVP.\n\n## FÁZE 4: STRUKTURÁLNÍ VERIFIKACE NÁVAZNOSTI (VERTIKÁLA/HORIZONTÁLA)\n\n**Cíl:** Zkontrolovat logickou posloupnost a provázanost učiva v rámci ŠVP.\n\n- **Vertikální Kontrola:** Ověřit posloupnost OVU a učiva uvnitř jednoho předmětu/oblasti (postup od jednodušších ke složitějším konceptům napříč ročníky).\n- **Horizontální Kontrola:** Zkontrolovat logické provázání napříč vzdělávacími oblastmi a předměty (např. fyzika ↔ matematika).\n- **PT Integrace:** Audit reálné integrace Průřezových témat (PT) do konkrétních částí obsahu, metod a projektů.\n\n## FÁZE 5: ANALÝZA ŠKOLNÍ PROFILACE A ROZŠÍŘENÍ RVP\n\n**Cíl:** Validovat, že profilace školy je **v souladu** s RVP a nejedná se o **rozpor**.\n\n- **Nekonfliktnost:** Porovnat definovaný Profil absolventa školy s Klíčovými kompetencemi RVP. Profil ŠVP musí RVP rozvíjet, nikoli mu odporovat.\n- **Modularita:** Zkontrolovat, zda volitelné předměty a rozšiřující moduly logicky navazují na vzdělávací oblasti RVP.\n- **Implementace specializace:** Popisně uvést, jak je školní profilace (např. STEM zaměření, projektová výuka) integrována do OVU a kompetencí definovaných RVP.\n\n## FÁZE 6: GENERÁTOR ZÁVĚREČNÉ ZPRÁVY A KVANTIFIKACE\n\n**Cíl:** Syntetizovat výsledky, kvantifikovat soulad a generovat závazné návrhy na korekce.\n\n### 6.1 Kvantifikace Souladu\n\nVypočítat Index shody (IS) na základě bodového hodnocení (Fáze 3):\n\n### 6.2 Interpretace Indexu Shody (IS)\n\nKlasifikace souladu pro standardizované vyhodnocení:\n\n| Interval IS | Klasifikace souladu | Popis |\n| --- | --- | --- |\n| 95-100 % | Výborný soulad | ŠVP plně odpovídá RVP, pouze stylistické nebo formální rozdíly. |\n| --- | --- | --- |\n| 85-94 % | Dobrá shoda | ŠVP pokrývá všechny klíčové výstupy, menší korekce nutné. |\n| --- | --- | --- |\n| 70-84 % | Částečná shoda | Významné nedostatky v některých oblastech, nutná revize obsahu. |\n| --- | --- | --- |\n| < 70 % | Kritická neshoda | ŠVP neplní rámcové požadavky, ohrožuje legislativní soulad. |\n| --- | --- | --- |\n\n### 6.3 Doplňkové Indexy\n\nVypočítat následující doplňkové indexy pro detailní kvalitativní analýzu:\n\n- **Index kompetenčního souladu (IKS):** Poměr pokrytí klíčových kompetencí RVP v ŠVP.\n- **Index průřezové integrace (IPI):** Míra reálné integrace průřezových témat do výuky.\n- **Index hloubky pokrytí (IHP):** Procento výstupů, které jsou v ŠVP rozvedeny na konkrétní výukové cíle (měřitelné, aktivní formulace).\n- **Index profilové rozšiřitelnosti (IPR):** Kolik rozšiřujících nebo profilových výstupů přesahuje rámec RVP, aniž by narušily jeho strukturu.\n\n### 6.4 Vizuální výstupy\n\nZajistit generování následujících vizualizací pro Závěrečnou zprávu:\n\n- Graf pokrytí po vzdělávacích oblastech (Sloupcový graf IS pro VO).\n- Pavoukový diagram Klíčových kompetencí (RVP vs. ŠVP).\n- Mapa defektů (Vizualizace ❌ a ⚠️ výstupů).\n\n### 6.5 Struktura Závěrečné Zprávy\n\nZpráva musí být strukturována dle standardizovaného formátu:\n\n| Oddíl | Obsah |\n| --- | --- |\n| A. Identifikace | Název školy, IZO, typ školy, datum revize, zpracovatel, verze ŠVP a RVP. |\n| --- | --- |\n| B. Shrnutí výsledků | Celkový Index Shody (IS), hlavní závěry a doporučení. |\n| --- | --- |\n| C. Kvantitativní analýza | Přehled IS v % dle kategorií OVU / VO / kompetencí. |\n| --- | --- |\n| D. Kvalitativní analýza | Slovní zhodnocení kvality souladu (formulace, obtížnost, integrace PT). |\n| --- | --- |\n| E. Rizikové oblasti | Přehled nalezených defektů (chybějící OVU, přetížení, formální shoda). |\n| --- | --- |\n| F. Návrhy opatření (Korekční plán) | Přesné návrhy změn - **Co, Kde, Kdo** má upravit, včetně termínu. |\n| --- | --- |\n| G. Přílohy | Master Matice (Fáze 2-3), revizní tabulka, výstupní grafy a metriky. |\n| --- | --- |\n\n\n\n\n.\n"}],sourceFile:"./books/examples/lsvp-asistent.book"}];
5758
+ var PipelineCollection = [{title:"Prepare Knowledge from Markdown",pipelineUrl:"https://promptbook.studio/promptbook/prepare-knowledge-from-markdown.book",formfactorName:"GENERIC",parameters:[{name:"knowledgeContent",description:"Markdown document content",isInput:true,isOutput:false},{name:"knowledgePieces",description:"The knowledge JSON object",isInput:false,isOutput:true}],tasks:[{taskType:"PROMPT_TASK",name:"knowledge",title:"Knowledge",content:"You are experienced data researcher, extract the important knowledge from the document.\n\n# Rules\n\n- Make pieces of information concise, clear, and easy to understand\n- One piece of information should be approximately 1 paragraph\n- Divide the paragraphs by markdown horizontal lines ---\n- Omit irrelevant information\n- Group redundant information\n- Write just extracted information, nothing else\n\n# The document\n\nTake information from this document:\n\n> {knowledgeContent}",resultingParameterName:"knowledgePieces",dependentParameterNames:["knowledgeContent"]}],personas:[],preparations:[],knowledgeSources:[],knowledgePieces:[],sources:[{type:"BOOK",path:null,content:"# Prepare Knowledge from Markdown\n\n- PIPELINE URL `https://promptbook.studio/promptbook/prepare-knowledge-from-markdown.book`\n- INPUT PARAMETER `{knowledgeContent}` Markdown document content\n- OUTPUT PARAMETER `{knowledgePieces}` The knowledge JSON object\n\n## Knowledge\n\n<!-- TODO: [🍆] -FORMAT JSON -->\n\n```markdown\nYou are experienced data researcher, extract the important knowledge from the document.\n\n# Rules\n\n- Make pieces of information concise, clear, and easy to understand\n- One piece of information should be approximately 1 paragraph\n- Divide the paragraphs by markdown horizontal lines ---\n- Omit irrelevant information\n- Group redundant information\n- Write just extracted information, nothing else\n\n# The document\n\nTake information from this document:\n\n> {knowledgeContent}\n```\n\n`-> {knowledgePieces}`\n"}],sourceFile:"./books/prepare-knowledge-from-markdown.book"},{title:"Prepare Keywords",pipelineUrl:"https://promptbook.studio/promptbook/prepare-knowledge-keywords.book",formfactorName:"GENERIC",parameters:[{name:"knowledgePieceContent",description:"The content",isInput:true,isOutput:false},{name:"keywords",description:"Keywords separated by comma",isInput:false,isOutput:true}],tasks:[{taskType:"PROMPT_TASK",name:"knowledge",title:"Knowledge",content:"You are experienced data researcher, detect the important keywords in the document.\n\n# Rules\n\n- Write just keywords separated by comma\n\n# The document\n\nTake information from this document:\n\n> {knowledgePieceContent}",resultingParameterName:"keywords",dependentParameterNames:["knowledgePieceContent"]}],personas:[],preparations:[],knowledgeSources:[],knowledgePieces:[],sources:[{type:"BOOK",path:null,content:"# Prepare Keywords\n\n- PIPELINE URL `https://promptbook.studio/promptbook/prepare-knowledge-keywords.book`\n- INPUT PARAMETER `{knowledgePieceContent}` The content\n- OUTPUT PARAMETER `{keywords}` Keywords separated by comma\n\n## Knowledge\n\n<!-- TODO: [🍆] -FORMAT JSON -->\n\n```markdown\nYou are experienced data researcher, detect the important keywords in the document.\n\n# Rules\n\n- Write just keywords separated by comma\n\n# The document\n\nTake information from this document:\n\n> {knowledgePieceContent}\n```\n\n`-> {keywords}`\n"}],sourceFile:"./books/prepare-knowledge-keywords.book"},{title:"Prepare Knowledge-piece Title",pipelineUrl:"https://promptbook.studio/promptbook/prepare-knowledge-title.book",formfactorName:"GENERIC",parameters:[{name:"knowledgePieceContent",description:"The content",isInput:true,isOutput:false},{name:"title",description:"The title of the document",isInput:false,isOutput:true}],tasks:[{taskType:"PROMPT_TASK",name:"knowledge",title:"Knowledge",content:"You are experienced content creator, write best title for the document.\n\n# Rules\n\n- Write just title, nothing else\n- Write maximum 5 words for the title\n\n# The document\n\n> {knowledgePieceContent}",resultingParameterName:"title",expectations:{words:{min:1,max:8}},dependentParameterNames:["knowledgePieceContent"]}],personas:[],preparations:[],knowledgeSources:[],knowledgePieces:[],sources:[{type:"BOOK",path:null,content:"# Prepare Knowledge-piece Title\n\n- PIPELINE URL `https://promptbook.studio/promptbook/prepare-knowledge-title.book`\n- INPUT PARAMETER `{knowledgePieceContent}` The content\n- OUTPUT PARAMETER `{title}` The title of the document\n\n## Knowledge\n\n- EXPECT MIN 1 WORD\n- EXPECT MAX 8 WORDS\n\n```markdown\nYou are experienced content creator, write best title for the document.\n\n# Rules\n\n- Write just title, nothing else\n- Write maximum 5 words for the title\n\n# The document\n\n> {knowledgePieceContent}\n```\n\n`-> {title}`\n"}],sourceFile:"./books/prepare-knowledge-title.book"},{title:"Prepare Persona",pipelineUrl:"https://promptbook.studio/promptbook/prepare-persona.book",formfactorName:"GENERIC",parameters:[{name:"availableModels",description:"List of available model names together with their descriptions as JSON",isInput:true,isOutput:false},{name:"personaDescription",description:"Description of the persona",isInput:true,isOutput:false},{name:"modelsRequirements",description:"Specific requirements for the model",isInput:false,isOutput:true}],tasks:[{taskType:"PROMPT_TASK",name:"make-model-requirements",title:"Make modelRequirements",content:"You are an experienced AI engineer, you need to find the best models for virtual assistants:\n\n## Example\n\n```json\n[\n {\n \"modelName\": \"gpt-4o\",\n \"systemMessage\": \"You are experienced AI engineer and helpful assistant.\",\n \"temperature\": 0.7\n },\n {\n \"modelName\": \"claude-3-5-sonnet\",\n \"systemMessage\": \"You are a friendly and knowledgeable chatbot.\",\n \"temperature\": 0.5\n }\n]\n```\n\n## Instructions\n\n- Your output format is JSON array\n- Sort best-fitting models first\n- Omit any models that are not suitable\n- Write just the JSON, no other text should be present\n- Array contain items with following keys:\n - `modelName`: The name of the model to use\n - `systemMessage`: The system message to provide context to the model\n - `temperature`: The sampling temperature to use\n\n### Key `modelName`\n\nHere are the available models:\n\n```json\n{availableModels}\n```\n\n### Key `systemMessage`\n\nThe system message is used to communicate instructions or provide context to the model at the beginning of a conversation. It is displayed in a different format compared to user messages, helping the model understand its role in the conversation. The system message typically guides the model's behavior, sets the tone, or specifies desired output from the model. By utilizing the system message effectively, users can steer the model towards generating more accurate and relevant responses.\n\nFor example:\n\n> You are an experienced AI engineer and helpful assistant.\n\n> You are a friendly and knowledgeable chatbot.\n\n### Key `temperature`\n\nThe sampling temperature, between 0 and 1. Higher values like 0.8 will make the output more random, while lower values like 0.2 will make it more focused and deterministic. If set to 0, the model will use log probability to automatically increase the temperature until certain thresholds are hit.\n\nYou can pick a value between 0 and 2. For example:\n\n- `0.1`: Low temperature, extremely conservative and deterministic\n- `0.5`: Medium temperature, balanced between conservative and creative\n- `1.0`: High temperature, creative and bit random\n- `1.5`: Very high temperature, extremely creative and often chaotic and unpredictable\n- `2.0`: Maximum temperature, completely random and unpredictable, for some extreme creative use cases\n\n# The assistant\n\nTake this description of the persona:\n\n> {personaDescription}",resultingParameterName:"modelsRequirements",format:"JSON",dependentParameterNames:["availableModels","personaDescription"]}],personas:[],preparations:[],knowledgeSources:[],knowledgePieces:[],sources:[{type:"BOOK",path:null,content:"# Prepare Persona\n\n- PIPELINE URL `https://promptbook.studio/promptbook/prepare-persona.book`\n- INPUT PARAMETER `{availableModels}` List of available model names together with their descriptions as JSON\n- INPUT PARAMETER `{personaDescription}` Description of the persona\n- OUTPUT PARAMETER `{modelsRequirements}` Specific requirements for the model\n\n## Make modelRequirements\n\n- FORMAT JSON\n\n```markdown\nYou are an experienced AI engineer, you need to find the best models for virtual assistants:\n\n## Example\n\n\\`\\`\\`json\n[\n {\n \"modelName\": \"gpt-4o\",\n \"systemMessage\": \"You are experienced AI engineer and helpful assistant.\",\n \"temperature\": 0.7\n },\n {\n \"modelName\": \"claude-3-5-sonnet\",\n \"systemMessage\": \"You are a friendly and knowledgeable chatbot.\",\n \"temperature\": 0.5\n }\n]\n\\`\\`\\`\n\n## Instructions\n\n- Your output format is JSON array\n- Sort best-fitting models first\n- Omit any models that are not suitable\n- Write just the JSON, no other text should be present\n- Array contain items with following keys:\n - `modelName`: The name of the model to use\n - `systemMessage`: The system message to provide context to the model\n - `temperature`: The sampling temperature to use\n\n### Key `modelName`\n\nHere are the available models:\n\n\\`\\`\\`json\n{availableModels}\n\\`\\`\\`\n\n### Key `systemMessage`\n\nThe system message is used to communicate instructions or provide context to the model at the beginning of a conversation. It is displayed in a different format compared to user messages, helping the model understand its role in the conversation. The system message typically guides the model's behavior, sets the tone, or specifies desired output from the model. By utilizing the system message effectively, users can steer the model towards generating more accurate and relevant responses.\n\nFor example:\n\n> You are an experienced AI engineer and helpful assistant.\n\n> You are a friendly and knowledgeable chatbot.\n\n### Key `temperature`\n\nThe sampling temperature, between 0 and 1. Higher values like 0.8 will make the output more random, while lower values like 0.2 will make it more focused and deterministic. If set to 0, the model will use log probability to automatically increase the temperature until certain thresholds are hit.\n\nYou can pick a value between 0 and 2. For example:\n\n- `0.1`: Low temperature, extremely conservative and deterministic\n- `0.5`: Medium temperature, balanced between conservative and creative\n- `1.0`: High temperature, creative and bit random\n- `1.5`: Very high temperature, extremely creative and often chaotic and unpredictable\n- `2.0`: Maximum temperature, completely random and unpredictable, for some extreme creative use cases\n\n# The assistant\n\nTake this description of the persona:\n\n> {personaDescription}\n```\n\n`-> {modelsRequirements}`\n"}],sourceFile:"./books/prepare-persona.book"},{title:"Prepare Title",pipelineUrl:"https://promptbook.studio/promptbook/prepare-title.book",formfactorName:"GENERIC",parameters:[{name:"book",description:"The book to prepare the title for",isInput:true,isOutput:false},{name:"title",description:"Best title for the book",isInput:false,isOutput:true}],tasks:[{taskType:"PROMPT_TASK",name:"make-title",title:"Make title",content:"Make best title for given text which describes the workflow:\n\n## Rules\n\n- Write just title, nothing else\n- Title should be concise and clear - Write maximum ideally 2 words, maximum 5 words\n- Title starts with emoticon\n- Title should not mention the input and output of the workflow but the main purpose of the workflow\n _For example, not \"✍ Convert Knowledge-piece to title\" but \"✍ Title\"_\n\n## The workflow\n\n> {book}",resultingParameterName:"title",expectations:{words:{min:1,max:8},lines:{min:1,max:1}},dependentParameterNames:["book"]}],personas:[],preparations:[],knowledgeSources:[],knowledgePieces:[],sources:[{type:"BOOK",path:null,content:"# Prepare Title\n\n- PIPELINE URL `https://promptbook.studio/promptbook/prepare-title.book`\n- INPUT PARAMETER `{book}` The book to prepare the title for\n- OUTPUT PARAMETER `{title}` Best title for the book\n\n## Make title\n\n- EXPECT MIN 1 Word\n- EXPECT MAX 8 Words\n- EXPECT EXACTLY 1 Line\n\n```markdown\nMake best title for given text which describes the workflow:\n\n## Rules\n\n- Write just title, nothing else\n- Title should be concise and clear - Write maximum ideally 2 words, maximum 5 words\n- Title starts with emoticon\n- Title should not mention the input and output of the workflow but the main purpose of the workflow\n _For example, not \"✍ Convert Knowledge-piece to title\" but \"✍ Title\"_\n\n## The workflow\n\n> {book}\n```\n\n`-> {title}`\n"}],sourceFile:"./books/prepare-title.book"},{title:"📊 Curriculum Audit",pipelineUrl:"https://promptbook.studio/promptbook//examples/lsvp-asistent.book",formfactorName:"GENERIC",parameters:[{name:"result",isInput:false,isOutput:true}],tasks:[{taskType:"PROMPT_TASK",name:"prompt",title:"Prompt",content:"Asistent pro LŠVP\n\nPERSONA Jsi asistent pro RVP Lyceum v rámci Národního pedagogického institutu České Republiky\nMETA IMAGE https://edulk.cz/getFile/id:475818/type:large/02%20zna%C4%8Dka%20npi.jpg\nRULE Pokud jsi nejsi jistý, napiš nevím\nKNOWLEDGE ./241129_Lyceum_final.pdf\nCONTEXT Obecně dokážeš řešit libovolné ŠVP, aktuálně řešíš {Školní vzdělávací program LYCEUM}\nRULE Z {Porovnání RVP a ŠVP - postup} je nejdůležitější fáze 3\nKNOWLEDGE {Školní vzdělávací program LYCEUM} ./ŠVP Lyceum - Finance v digitální době.pdf\nKNOWLEDGE @Slovník\n\n**Interní slovník - RVP/ŠVP**\n\n**RVP**\n\nRámcový vzdělávací program pro obor vzdělání Lyceum je dokument na národní úrovni, který formuluje požadavky na školní vzdělávací programy ve formě především očekávaných výsledků učení, kterých mají žáci absolvováním tohoto programu na dané škole dosáhnout.\n\n**ŠVP**\n\nŠkolní vzdělávací program pro obor vzdělání Lyceum je dokument každé jednotlivé školy, který popisuje v jakých vyučovacích předmětech/ vzdělávacích modulech a v jakých ročnících budou požadované očekávané výsledky učení naplněny. Zároveň formuluje další očekávané výsledky učení, které naplňují disponibilní část vyučovacího času určeného RVP pro tento obor vzdělání.\n\n**Očekávaný výsledek učení (OVU)**\n\nVyjadřuje jednotlivý požadavek na to, co mají žáci umět na konci vzdělávacího programu, tzn. jejich požadované kompetence. Je vyjádřen formulací, která je uvozena činnostním slovesem a dále obsahuje předmět této činnosti. Formulace je konkretizována resp. doplněna zpravidla formou odrážek vymezením dílčích znalostí, dovedností, postojů, jejichž splnění je předpokladem dosažení OVU jako celku.\n\n_Příklad:_\n\n<div class=\"joplin-table-wrapper\"><table><tbody><tr><th><p><strong>Žák/žákyně řídí realizaci jednoduchého projektu</strong></p></th></tr><tr><td><ul><li>naplánuje aktivity projektu</li></ul></td></tr><tr><td><ul><li>navrhne rozpočet projektu vzhledem k navrženým aktivitám</li></ul></td></tr><tr><td><ul><li>stanoví základní ukazatele a sleduje jejich naplňování</li></ul></td></tr><tr><td><ul><li>vede projektový tým</li></ul></td></tr><tr><td><ul><li>uvede, jak by řešil krizové situace v projektu</li></ul></td></tr><tr><td><ul><li>vyhodnotí úspěšnost projektu</li></ul></td></tr></tbody></table></div>\n\n**Vzdělávací oblasti**\n\nOčekávané výsledky učení jsou v **_RVP členěny do 4 vzdělávacích oblastí_**, které tvoří společný všeobecně vzdělávací základ:\n\n- Osobnostní rozvoj, vzdělávání ke zdraví, bezpečí a produktivnímu pracovnímu životu (kariéře)\n- Komunikační a jazykové vzdělávání\n- Aplikované vzdělávání STEM (Science, Technology, Engeneering, Math), tj. přírodní vědy, informatika, technika, matematika\n- Prakticky orientované vzdělávání společenskovědní a humanitní\n\nKaždá vzdělávací oblast se dále člení na okruhy, v jejichž rámci jsou OVU samostatně číslované.\n\n<div class=\"joplin-table-wrapper\"><table><tbody><tr><th rowspan=\"21\"><ul><li>Prakticky orientované vzdělávání společenskovědní a humanitní</li></ul></th><th rowspan=\"21\"><p><strong>Člověk, ekonomie a podnikání</strong></p></th><th rowspan=\"7\"><p><strong>1</strong></p></th><th><p><strong>zpracuje podklady související s podnikáním</strong></p></th></tr><tr><td><p>připraví podnikatelský záměr</p></td></tr><tr><td><p>sestaví zakladatelský rozpočet</p></td></tr><tr><td><p>zkalkuluje cenu zboží nebo služby</p></td></tr><tr><td><p>vysvětlí na příkladu základní povinnosti podnikatele vůči státu a zaměstnancům</p></td></tr><tr><td><p>vede daňovou evidenci</p></td></tr><tr><td><p>vysvětlí na příkladech etiku v podnikání</p></td></tr><tr><td rowspan=\"7\"><p><strong>2</strong></p></td><td><p><strong>řídí realizaci jednoduchého projektu</strong></p></td></tr><tr><td><p>naplánuje aktivity projektu</p></td></tr><tr><td><p>navrhne rozpočet projektu vzhledem k navrženým aktivitám</p></td></tr><tr><td><p>stanoví základní ukazatele a sleduje jejich naplňování</p></td></tr><tr><td><p>vede projektový tým</p></td></tr><tr><td><p>uvede, jak by řešil krizové situace v projektu</p></td></tr><tr><td><p>vyhodnotí úspěšnost projektu</p></td></tr><tr><td rowspan=\"7\"><p><strong>3</strong></p></td><td><p><strong>aplikuje ekonomické teorie v osobním a profesním životě</strong></p></td></tr><tr><td><p>vysvětlí základní ekonomické otázky</p></td></tr><tr><td><p>vysvětí stanovení rovnovážné ceny na dokonalém i nedokonalém trhu</p></td></tr><tr><td><p>charakterizuje výrobní faktory a vysvětlí hranici produkčních možností a náklady obětované příležitosti</p></td></tr><tr><td><p>uvede nejdůležitější makroekonomické pojmy a vliv jejich výše na kvalitu života a podnikání v daném státě</p></td></tr><tr><td><p>vysvětlí podstatu inflace a její důsledky na finanční situaci obyvatel a na příkladu ukáže jak se bránit jejím nepříznivým důsledkům</p></td></tr><tr><td><p>uvede hlavní výhody a nevýhody mezinárodního obchodu a vliv ochranářských opatření na ekonomickou situaci dané země</p></td></tr><tr><td></td><td></td><td><p><strong>4</strong></p></td><td><p>Atd.</p></td></tr></tbody></table></div>\n\n**Vyučovací předmět / vzdělávací modul**\n\nOčekávané výsledky učení jsou v **ŠVP** členěny do vyučovacích předmětů nebo vzdělávacích modulů, které jsou dále zařazeny do jednoho nebo více ročníků 4letého studia. Vyučovací předmět / vzdělávací modul tvoří vyučovací jednotku, kde jsou očekávané výsledky učení dále rozpracovány pro potřeby výuky podle následující šablony\n\n| **A. VSTUPNÍ ČÁST** |\n| --- |\n| **1\\. Název** |\n| **2\\. Kód** (kódy by měly být navázány na obory vzdělání a výsledky učení) |\n| **2a) Kategorie vzdělání** - v případě, že nebude součástí kódu |\n| **3\\. Typ vyučovací jednotky** (modul, předmět, stáž apod.) |\n| **4\\. Délka** (počet hodin - dělitelný čtyřmi (optimální modul 16, 32 hodin = týden výuky) |\n| **5\\. Platnost** (datum, od kterého platí) |\n| **6\\. Vstupní předpoklady** (vymezení požadované úrovně vstupních vědomostí a dovedností, které jsou předpokladem úspěšného studia) |\n| |\n| **B. JÁDRO VYUČOVACÍ JEDNOTKY** |\n| **1\\. Charakteristika** (stručná anotace popisující obecné cíle a pojetí) |\n| **2\\. Očekávané výsledky učení a jejich indikátory (převzaté z RVP nebo dále konkretizované)** |\n| **3\\. Podpora rozvoje klíčových kompetencí a základních gramotností** (které klíčové kompetence jsou v rozvíjeny) |\n| **4\\. Obsah vzdělávání** (rozpis učiva) |\n| **5\\. Vzdělávací strategie** (strategie výuky, resp. učební činnosti žáků, které jsou doporučené pro dosažení výsledků) |\n| |\n| **C. VÝSTUPNÍ ČÁST** |\n| **1\\. Způsob ověřování dosažených výsledků** (ve vazbě na jednotlivé výsledky učení) |\n| **2\\. Kritéria hodnocení** (co znamená splnění výsledků učení, kdy je splněna celá vyučovací jednotka, kritéria pro známky, příp. procentuální, slovní hodnocení) |\n| **3\\. Doporučená studijní literatura, odkazy na ilustrační zdroje** |\n| **4\\. Poznámky** |\n\n**Soulad OVU RVP a ŠVP**\n\nTento soulad je předmětem zjišťování. Soulad nastává, jestliže jsou očekávané výsledky učení z jednotlivých vzdělávacích oblastí RVP **obsaženy** ve vyučovacích předmětech/ vzdělávacích modulech ŠVP jednotlivých škol, tzn. že v ŠVP se objevuje jejich formulace buď v doslovném nebo podobném znění v jednom nebo více vyučovacích předmětech/ vzdělávacích modulech.\n\n_Příklad souladu:_\n\nRVP ŠVP - komunikace a marketing (SŠ obchodní Č.\n\n| **2** | **řídí realizaci jednoduchého projektu** |\n| --- | --- |\n| naplánuje aktivity projektu |\n| navrhne rozpočet projektu vzhledem k navrženým aktivitám |\n| stanoví základní ukazatele a sleduje jejich naplňování |\n| vede projektový tým |\n| uvede, jak by řešil krizové situace v projektu |\n| vyhodnotí úspěšnost projektu |\n\nKNOWLEDGE {Porovnání RVP a ŠVP - postup}\n\n\n# AUDITNÍ PROTOKOL ŠVP-RVP\n\n# (POPIS KONTROLNÍHO ALGORITMU)\n\nMetodika je určena pro **Kvantifikaci Shody** školního vzdělávacího programu (ŠVP) s Rámcovým vzdělávacím programem (RVP).\n\n## FÁZE 1: VALIDACE DOKUMENTACE\n\n**Cíl:** Ověřit platnost, aktuálnost a strukturu zdrojových dokumentů.\n\n- **RVP Verifikace:** Otevřít aktuální verzi RVP (např. RVP ZV/G/SOŠ).\n- **Typová shoda:** Ověřit, že RVP se vztahuje k danému typu školy.\n- **ŠVP Dimenze:** Identifikovat a izolovat relevantní části ŠVP: Profil absolventa, Klíčové kompetence (KK), Vzdělávací oblasti (VO), případně Učební plán (UP).\n- **Verzování:** Potvrdit, že obě verze (RVP a ŠVP) jsou nejnovější a platné (včetně dodatků RVP).\n\n## FÁZE 2: DATABÁZOVÉ MAPOVÁNÍ VÝSTUPŮ (MASTER MATICE)\n\n**Cíl:** Vytvořit systémovou databázi pro křížové porovnání všech povinných komponent RVP se ŠVP.\n\n- **Dekompozice RVP:** Rozložit RVP na základní povinné komponenty: Klíčové kompetence, Vzdělávací oblasti a obory, Očekávané výstupy (OVU), Průřezová témata (PT).\n- **Přiřazovací mapa:** Vytvořit hlavní kontrolní matici (Master Matice) pro záznam vazeb.\n\n| Oblast RVP | Výstup RVP (OVU) | Odpovídající Část ŠVP (Předmět/Ročník) | Konkrétní Tématický Celek v ŠVP | Stav Shody (Protokol) |\n| --- | --- | --- | --- | --- |\n| ... | ... | ... | ... | ... |\n| --- | --- | --- | --- | --- |\n\n## FÁZE 3: ALGORITMICKÁ KONTROLA POKRYTÍ A HLOUBKY\n\n**Cíl:** Posoudit, zda každý povinný výstup RVP je adekvátně reflektován v obsahu ŠVP, a přidělit bodovou hodnotu pro kvantifikaci.\n\n- **Audit OVU:** Projít každý jednotlivý Očekávaný výstup (OVU) z RVP.\n- **Kódování stavu a bodování:** U každého OVU v matici označit stav pokrytí dle následujícího schématu:\n\n| Kód (Protokol) | Popis (Kvalitativní zjištění) | Bodová hodnota (Kvantifikace) |\n| --- | --- | --- |\n| ✅ | Plná shoda (Výstup pokryt v plném rozsahu, odpovídající úrovni RVP) | 1,0 |\n| --- | --- | --- |\n| ⚠️ | Částečná shoda (Formální pokrytí, omezený rozsah, chybná návaznost) | 0,5 |\n| --- | --- | --- |\n| ❌ | Absence (Výstup zcela chybí v obsahu ŠVP) | 0,0 |\n| --- | --- | --- |\n\n- **Defektologie ŠVP:** Identifikovat a zaznamenat deficity ŠVP: Chybějící výstupy (❌), Sémantické překryvy, Přetížení obsahu.\n- **Kvalitativní posun:** Ověřit, zda je formulace výstupů v ŠVP **aktivní, měřitelná a v souladu** s úrovní RVP.\n\n## FÁZE 4: STRUKTURÁLNÍ VERIFIKACE NÁVAZNOSTI (VERTIKÁLA/HORIZONTÁLA)\n\n**Cíl:** Zkontrolovat logickou posloupnost a provázanost učiva v rámci ŠVP.\n\n- **Vertikální Kontrola:** Ověřit posloupnost OVU a učiva uvnitř jednoho předmětu/oblasti (postup od jednodušších ke složitějším konceptům napříč ročníky).\n- **Horizontální Kontrola:** Zkontrolovat logické provázání napříč vzdělávacími oblastmi a předměty (např. fyzika ↔ matematika).\n- **PT Integrace:** Audit reálné integrace Průřezových témat (PT) do konkrétních částí obsahu, metod a projektů.\n\n## FÁZE 5: ANALÝZA ŠKOLNÍ PROFILACE A ROZŠÍŘENÍ RVP\n\n**Cíl:** Validovat, že profilace školy je **v souladu** s RVP a nejedná se o **rozpor**.\n\n- **Nekonfliktnost:** Porovnat definovaný Profil absolventa školy s Klíčovými kompetencemi RVP. Profil ŠVP musí RVP rozvíjet, nikoli mu odporovat.\n- **Modularita:** Zkontrolovat, zda volitelné předměty a rozšiřující moduly logicky navazují na vzdělávací oblasti RVP.\n- **Implementace specializace:** Popisně uvést, jak je školní profilace (např. STEM zaměření, projektová výuka) integrována do OVU a kompetencí definovaných RVP.\n\n## FÁZE 6: GENERÁTOR ZÁVĚREČNÉ ZPRÁVY A KVANTIFIKACE\n\n**Cíl:** Syntetizovat výsledky, kvantifikovat soulad a generovat závazné návrhy na korekce.\n\n### 6.1 Kvantifikace Souladu\n\nVypočítat Index shody (IS) na základě bodového hodnocení (Fáze 3):\n\n### 6.2 Interpretace Indexu Shody (IS)\n\nKlasifikace souladu pro standardizované vyhodnocení:\n\n| Interval IS | Klasifikace souladu | Popis |\n| --- | --- | --- |\n| 95-100 % | Výborný soulad | ŠVP plně odpovídá RVP, pouze stylistické nebo formální rozdíly. |\n| --- | --- | --- |\n| 85-94 % | Dobrá shoda | ŠVP pokrývá všechny klíčové výstupy, menší korekce nutné. |\n| --- | --- | --- |\n| 70-84 % | Částečná shoda | Významné nedostatky v některých oblastech, nutná revize obsahu. |\n| --- | --- | --- |\n| < 70 % | Kritická neshoda | ŠVP neplní rámcové požadavky, ohrožuje legislativní soulad. |\n| --- | --- | --- |\n\n### 6.3 Doplňkové Indexy\n\nVypočítat následující doplňkové indexy pro detailní kvalitativní analýzu:\n\n- **Index kompetenčního souladu (IKS):** Poměr pokrytí klíčových kompetencí RVP v ŠVP.\n- **Index průřezové integrace (IPI):** Míra reálné integrace průřezových témat do výuky.\n- **Index hloubky pokrytí (IHP):** Procento výstupů, které jsou v ŠVP rozvedeny na konkrétní výukové cíle (měřitelné, aktivní formulace).\n- **Index profilové rozšiřitelnosti (IPR):** Kolik rozšiřujících nebo profilových výstupů přesahuje rámec RVP, aniž by narušily jeho strukturu.\n\n### 6.4 Vizuální výstupy\n\nZajistit generování následujících vizualizací pro Závěrečnou zprávu:\n\n- Graf pokrytí po vzdělávacích oblastech (Sloupcový graf IS pro VO).\n- Pavoukový diagram Klíčových kompetencí (RVP vs. ŠVP).\n- Mapa defektů (Vizualizace ❌ a ⚠️ výstupů).\n\n### 6.5 Struktura Závěrečné Zprávy\n\nZpráva musí být strukturována dle standardizovaného formátu:\n\n| Oddíl | Obsah |\n| --- | --- |\n| A. Identifikace | Název školy, IZO, typ školy, datum revize, zpracovatel, verze ŠVP a RVP. |\n| --- | --- |\n| B. Shrnutí výsledků | Celkový Index Shody (IS), hlavní závěry a doporučení. |\n| --- | --- |\n| C. Kvantitativní analýza | Přehled IS v % dle kategorií OVU / VO / kompetencí. |\n| --- | --- |\n| D. Kvalitativní analýza | Slovní zhodnocení kvality souladu (formulace, obtížnost, integrace PT). |\n| --- | --- |\n| E. Rizikové oblasti | Přehled nalezených defektů (chybějící OVU, přetížení, formální shoda). |\n| --- | --- |\n| F. Návrhy opatření (Korekční plán) | Přesné návrhy změn - **Co, Kde, Kdo** má upravit, včetně termínu. |\n| --- | --- |\n| G. Přílohy | Master Matice (Fáze 2-3), revizní tabulka, výstupní grafy a metriky. |\n| --- | --- |\n\n\n\n\n.",resultingParameterName:"result",dependentParameterNames:[]}],personas:[],preparations:[{id:1,promptbookVersion:"0.103.0-36",usage:{price:{value:0},input:{tokensCount:{value:0},charactersCount:{value:0},wordsCount:{value:0},sentencesCount:{value:0},linesCount:{value:0},paragraphsCount:{value:0},pagesCount:{value:0}},output:{tokensCount:{value:0},charactersCount:{value:0},wordsCount:{value:0},sentencesCount:{value:0},linesCount:{value:0},paragraphsCount:{value:0},pagesCount:{value:0}}}}],knowledgeSources:[],knowledgePieces:[],sources:[{type:"BOOK",path:null,content:"Asistent pro LŠVP\n\nPERSONA Jsi asistent pro RVP Lyceum v rámci Národního pedagogického institutu České Republiky\nMETA IMAGE https://edulk.cz/getFile/id:475818/type:large/02%20zna%C4%8Dka%20npi.jpg\nRULE Pokud jsi nejsi jistý, napiš nevím\nKNOWLEDGE ./241129_Lyceum_final.pdf\nCONTEXT Obecně dokážeš řešit libovolné ŠVP, aktuálně řešíš {Školní vzdělávací program LYCEUM}\nRULE Z {Porovnání RVP a ŠVP - postup} je nejdůležitější fáze 3\nKNOWLEDGE {Školní vzdělávací program LYCEUM} ./ŠVP Lyceum - Finance v digitální době.pdf\nKNOWLEDGE @Slovník\n\n**Interní slovník - RVP/ŠVP**\n\n**RVP**\n\nRámcový vzdělávací program pro obor vzdělání Lyceum je dokument na národní úrovni, který formuluje požadavky na školní vzdělávací programy ve formě především očekávaných výsledků učení, kterých mají žáci absolvováním tohoto programu na dané škole dosáhnout.\n\n**ŠVP**\n\nŠkolní vzdělávací program pro obor vzdělání Lyceum je dokument každé jednotlivé školy, který popisuje v jakých vyučovacích předmětech/ vzdělávacích modulech a v jakých ročnících budou požadované očekávané výsledky učení naplněny. Zároveň formuluje další očekávané výsledky učení, které naplňují disponibilní část vyučovacího času určeného RVP pro tento obor vzdělání.\n\n**Očekávaný výsledek učení (OVU)**\n\nVyjadřuje jednotlivý požadavek na to, co mají žáci umět na konci vzdělávacího programu, tzn. jejich požadované kompetence. Je vyjádřen formulací, která je uvozena činnostním slovesem a dále obsahuje předmět této činnosti. Formulace je konkretizována resp. doplněna zpravidla formou odrážek vymezením dílčích znalostí, dovedností, postojů, jejichž splnění je předpokladem dosažení OVU jako celku.\n\n_Příklad:_\n\n<div class=\"joplin-table-wrapper\"><table><tbody><tr><th><p><strong>Žák/žákyně řídí realizaci jednoduchého projektu</strong></p></th></tr><tr><td><ul><li>naplánuje aktivity projektu</li></ul></td></tr><tr><td><ul><li>navrhne rozpočet projektu vzhledem k navrženým aktivitám</li></ul></td></tr><tr><td><ul><li>stanoví základní ukazatele a sleduje jejich naplňování</li></ul></td></tr><tr><td><ul><li>vede projektový tým</li></ul></td></tr><tr><td><ul><li>uvede, jak by řešil krizové situace v projektu</li></ul></td></tr><tr><td><ul><li>vyhodnotí úspěšnost projektu</li></ul></td></tr></tbody></table></div>\n\n**Vzdělávací oblasti**\n\nOčekávané výsledky učení jsou v **_RVP členěny do 4 vzdělávacích oblastí_**, které tvoří společný všeobecně vzdělávací základ:\n\n- Osobnostní rozvoj, vzdělávání ke zdraví, bezpečí a produktivnímu pracovnímu životu (kariéře)\n- Komunikační a jazykové vzdělávání\n- Aplikované vzdělávání STEM (Science, Technology, Engeneering, Math), tj. přírodní vědy, informatika, technika, matematika\n- Prakticky orientované vzdělávání společenskovědní a humanitní\n\nKaždá vzdělávací oblast se dále člení na okruhy, v jejichž rámci jsou OVU samostatně číslované.\n\n<div class=\"joplin-table-wrapper\"><table><tbody><tr><th rowspan=\"21\"><ul><li>Prakticky orientované vzdělávání společenskovědní a humanitní</li></ul></th><th rowspan=\"21\"><p><strong>Člověk, ekonomie a podnikání</strong></p></th><th rowspan=\"7\"><p><strong>1</strong></p></th><th><p><strong>zpracuje podklady související s podnikáním</strong></p></th></tr><tr><td><p>připraví podnikatelský záměr</p></td></tr><tr><td><p>sestaví zakladatelský rozpočet</p></td></tr><tr><td><p>zkalkuluje cenu zboží nebo služby</p></td></tr><tr><td><p>vysvětlí na příkladu základní povinnosti podnikatele vůči státu a zaměstnancům</p></td></tr><tr><td><p>vede daňovou evidenci</p></td></tr><tr><td><p>vysvětlí na příkladech etiku v podnikání</p></td></tr><tr><td rowspan=\"7\"><p><strong>2</strong></p></td><td><p><strong>řídí realizaci jednoduchého projektu</strong></p></td></tr><tr><td><p>naplánuje aktivity projektu</p></td></tr><tr><td><p>navrhne rozpočet projektu vzhledem k navrženým aktivitám</p></td></tr><tr><td><p>stanoví základní ukazatele a sleduje jejich naplňování</p></td></tr><tr><td><p>vede projektový tým</p></td></tr><tr><td><p>uvede, jak by řešil krizové situace v projektu</p></td></tr><tr><td><p>vyhodnotí úspěšnost projektu</p></td></tr><tr><td rowspan=\"7\"><p><strong>3</strong></p></td><td><p><strong>aplikuje ekonomické teorie v osobním a profesním životě</strong></p></td></tr><tr><td><p>vysvětlí základní ekonomické otázky</p></td></tr><tr><td><p>vysvětí stanovení rovnovážné ceny na dokonalém i nedokonalém trhu</p></td></tr><tr><td><p>charakterizuje výrobní faktory a vysvětlí hranici produkčních možností a náklady obětované příležitosti</p></td></tr><tr><td><p>uvede nejdůležitější makroekonomické pojmy a vliv jejich výše na kvalitu života a podnikání v daném státě</p></td></tr><tr><td><p>vysvětlí podstatu inflace a její důsledky na finanční situaci obyvatel a na příkladu ukáže jak se bránit jejím nepříznivým důsledkům</p></td></tr><tr><td><p>uvede hlavní výhody a nevýhody mezinárodního obchodu a vliv ochranářských opatření na ekonomickou situaci dané země</p></td></tr><tr><td></td><td></td><td><p><strong>4</strong></p></td><td><p>Atd.</p></td></tr></tbody></table></div>\n\n**Vyučovací předmět / vzdělávací modul**\n\nOčekávané výsledky učení jsou v **ŠVP** členěny do vyučovacích předmětů nebo vzdělávacích modulů, které jsou dále zařazeny do jednoho nebo více ročníků 4letého studia. Vyučovací předmět / vzdělávací modul tvoří vyučovací jednotku, kde jsou očekávané výsledky učení dále rozpracovány pro potřeby výuky podle následující šablony\n\n| **A. VSTUPNÍ ČÁST** |\n| --- |\n| **1\\. Název** |\n| **2\\. Kód** (kódy by měly být navázány na obory vzdělání a výsledky učení) |\n| **2a) Kategorie vzdělání** - v případě, že nebude součástí kódu |\n| **3\\. Typ vyučovací jednotky** (modul, předmět, stáž apod.) |\n| **4\\. Délka** (počet hodin - dělitelný čtyřmi (optimální modul 16, 32 hodin = týden výuky) |\n| **5\\. Platnost** (datum, od kterého platí) |\n| **6\\. Vstupní předpoklady** (vymezení požadované úrovně vstupních vědomostí a dovedností, které jsou předpokladem úspěšného studia) |\n| |\n| **B. JÁDRO VYUČOVACÍ JEDNOTKY** |\n| **1\\. Charakteristika** (stručná anotace popisující obecné cíle a pojetí) |\n| **2\\. Očekávané výsledky učení a jejich indikátory (převzaté z RVP nebo dále konkretizované)** |\n| **3\\. Podpora rozvoje klíčových kompetencí a základních gramotností** (které klíčové kompetence jsou v rozvíjeny) |\n| **4\\. Obsah vzdělávání** (rozpis učiva) |\n| **5\\. Vzdělávací strategie** (strategie výuky, resp. učební činnosti žáků, které jsou doporučené pro dosažení výsledků) |\n| |\n| **C. VÝSTUPNÍ ČÁST** |\n| **1\\. Způsob ověřování dosažených výsledků** (ve vazbě na jednotlivé výsledky učení) |\n| **2\\. Kritéria hodnocení** (co znamená splnění výsledků učení, kdy je splněna celá vyučovací jednotka, kritéria pro známky, příp. procentuální, slovní hodnocení) |\n| **3\\. Doporučená studijní literatura, odkazy na ilustrační zdroje** |\n| **4\\. Poznámky** |\n\n**Soulad OVU RVP a ŠVP**\n\nTento soulad je předmětem zjišťování. Soulad nastává, jestliže jsou očekávané výsledky učení z jednotlivých vzdělávacích oblastí RVP **obsaženy** ve vyučovacích předmětech/ vzdělávacích modulech ŠVP jednotlivých škol, tzn. že v ŠVP se objevuje jejich formulace buď v doslovném nebo podobném znění v jednom nebo více vyučovacích předmětech/ vzdělávacích modulech.\n\n_Příklad souladu:_\n\nRVP ŠVP - komunikace a marketing (SŠ obchodní Č.\n\n| **2** | **řídí realizaci jednoduchého projektu** |\n| --- | --- |\n| naplánuje aktivity projektu |\n| navrhne rozpočet projektu vzhledem k navrženým aktivitám |\n| stanoví základní ukazatele a sleduje jejich naplňování |\n| vede projektový tým |\n| uvede, jak by řešil krizové situace v projektu |\n| vyhodnotí úspěšnost projektu |\n\nKNOWLEDGE {Porovnání RVP a ŠVP - postup}\n\n\n# AUDITNÍ PROTOKOL ŠVP-RVP\n\n# (POPIS KONTROLNÍHO ALGORITMU)\n\nMetodika je určena pro **Kvantifikaci Shody** školního vzdělávacího programu (ŠVP) s Rámcovým vzdělávacím programem (RVP).\n\n## FÁZE 1: VALIDACE DOKUMENTACE\n\n**Cíl:** Ověřit platnost, aktuálnost a strukturu zdrojových dokumentů.\n\n- **RVP Verifikace:** Otevřít aktuální verzi RVP (např. RVP ZV/G/SOŠ).\n- **Typová shoda:** Ověřit, že RVP se vztahuje k danému typu školy.\n- **ŠVP Dimenze:** Identifikovat a izolovat relevantní části ŠVP: Profil absolventa, Klíčové kompetence (KK), Vzdělávací oblasti (VO), případně Učební plán (UP).\n- **Verzování:** Potvrdit, že obě verze (RVP a ŠVP) jsou nejnovější a platné (včetně dodatků RVP).\n\n## FÁZE 2: DATABÁZOVÉ MAPOVÁNÍ VÝSTUPŮ (MASTER MATICE)\n\n**Cíl:** Vytvořit systémovou databázi pro křížové porovnání všech povinných komponent RVP se ŠVP.\n\n- **Dekompozice RVP:** Rozložit RVP na základní povinné komponenty: Klíčové kompetence, Vzdělávací oblasti a obory, Očekávané výstupy (OVU), Průřezová témata (PT).\n- **Přiřazovací mapa:** Vytvořit hlavní kontrolní matici (Master Matice) pro záznam vazeb.\n\n| Oblast RVP | Výstup RVP (OVU) | Odpovídající Část ŠVP (Předmět/Ročník) | Konkrétní Tématický Celek v ŠVP | Stav Shody (Protokol) |\n| --- | --- | --- | --- | --- |\n| ... | ... | ... | ... | ... |\n| --- | --- | --- | --- | --- |\n\n## FÁZE 3: ALGORITMICKÁ KONTROLA POKRYTÍ A HLOUBKY\n\n**Cíl:** Posoudit, zda každý povinný výstup RVP je adekvátně reflektován v obsahu ŠVP, a přidělit bodovou hodnotu pro kvantifikaci.\n\n- **Audit OVU:** Projít každý jednotlivý Očekávaný výstup (OVU) z RVP.\n- **Kódování stavu a bodování:** U každého OVU v matici označit stav pokrytí dle následujícího schématu:\n\n| Kód (Protokol) | Popis (Kvalitativní zjištění) | Bodová hodnota (Kvantifikace) |\n| --- | --- | --- |\n| ✅ | Plná shoda (Výstup pokryt v plném rozsahu, odpovídající úrovni RVP) | 1,0 |\n| --- | --- | --- |\n| ⚠️ | Částečná shoda (Formální pokrytí, omezený rozsah, chybná návaznost) | 0,5 |\n| --- | --- | --- |\n| ❌ | Absence (Výstup zcela chybí v obsahu ŠVP) | 0,0 |\n| --- | --- | --- |\n\n- **Defektologie ŠVP:** Identifikovat a zaznamenat deficity ŠVP: Chybějící výstupy (❌), Sémantické překryvy, Přetížení obsahu.\n- **Kvalitativní posun:** Ověřit, zda je formulace výstupů v ŠVP **aktivní, měřitelná a v souladu** s úrovní RVP.\n\n## FÁZE 4: STRUKTURÁLNÍ VERIFIKACE NÁVAZNOSTI (VERTIKÁLA/HORIZONTÁLA)\n\n**Cíl:** Zkontrolovat logickou posloupnost a provázanost učiva v rámci ŠVP.\n\n- **Vertikální Kontrola:** Ověřit posloupnost OVU a učiva uvnitř jednoho předmětu/oblasti (postup od jednodušších ke složitějším konceptům napříč ročníky).\n- **Horizontální Kontrola:** Zkontrolovat logické provázání napříč vzdělávacími oblastmi a předměty (např. fyzika ↔ matematika).\n- **PT Integrace:** Audit reálné integrace Průřezových témat (PT) do konkrétních částí obsahu, metod a projektů.\n\n## FÁZE 5: ANALÝZA ŠKOLNÍ PROFILACE A ROZŠÍŘENÍ RVP\n\n**Cíl:** Validovat, že profilace školy je **v souladu** s RVP a nejedná se o **rozpor**.\n\n- **Nekonfliktnost:** Porovnat definovaný Profil absolventa školy s Klíčovými kompetencemi RVP. Profil ŠVP musí RVP rozvíjet, nikoli mu odporovat.\n- **Modularita:** Zkontrolovat, zda volitelné předměty a rozšiřující moduly logicky navazují na vzdělávací oblasti RVP.\n- **Implementace specializace:** Popisně uvést, jak je školní profilace (např. STEM zaměření, projektová výuka) integrována do OVU a kompetencí definovaných RVP.\n\n## FÁZE 6: GENERÁTOR ZÁVĚREČNÉ ZPRÁVY A KVANTIFIKACE\n\n**Cíl:** Syntetizovat výsledky, kvantifikovat soulad a generovat závazné návrhy na korekce.\n\n### 6.1 Kvantifikace Souladu\n\nVypočítat Index shody (IS) na základě bodového hodnocení (Fáze 3):\n\n### 6.2 Interpretace Indexu Shody (IS)\n\nKlasifikace souladu pro standardizované vyhodnocení:\n\n| Interval IS | Klasifikace souladu | Popis |\n| --- | --- | --- |\n| 95-100 % | Výborný soulad | ŠVP plně odpovídá RVP, pouze stylistické nebo formální rozdíly. |\n| --- | --- | --- |\n| 85-94 % | Dobrá shoda | ŠVP pokrývá všechny klíčové výstupy, menší korekce nutné. |\n| --- | --- | --- |\n| 70-84 % | Částečná shoda | Významné nedostatky v některých oblastech, nutná revize obsahu. |\n| --- | --- | --- |\n| < 70 % | Kritická neshoda | ŠVP neplní rámcové požadavky, ohrožuje legislativní soulad. |\n| --- | --- | --- |\n\n### 6.3 Doplňkové Indexy\n\nVypočítat následující doplňkové indexy pro detailní kvalitativní analýzu:\n\n- **Index kompetenčního souladu (IKS):** Poměr pokrytí klíčových kompetencí RVP v ŠVP.\n- **Index průřezové integrace (IPI):** Míra reálné integrace průřezových témat do výuky.\n- **Index hloubky pokrytí (IHP):** Procento výstupů, které jsou v ŠVP rozvedeny na konkrétní výukové cíle (měřitelné, aktivní formulace).\n- **Index profilové rozšiřitelnosti (IPR):** Kolik rozšiřujících nebo profilových výstupů přesahuje rámec RVP, aniž by narušily jeho strukturu.\n\n### 6.4 Vizuální výstupy\n\nZajistit generování následujících vizualizací pro Závěrečnou zprávu:\n\n- Graf pokrytí po vzdělávacích oblastech (Sloupcový graf IS pro VO).\n- Pavoukový diagram Klíčových kompetencí (RVP vs. ŠVP).\n- Mapa defektů (Vizualizace ❌ a ⚠️ výstupů).\n\n### 6.5 Struktura Závěrečné Zprávy\n\nZpráva musí být strukturována dle standardizovaného formátu:\n\n| Oddíl | Obsah |\n| --- | --- |\n| A. Identifikace | Název školy, IZO, typ školy, datum revize, zpracovatel, verze ŠVP a RVP. |\n| --- | --- |\n| B. Shrnutí výsledků | Celkový Index Shody (IS), hlavní závěry a doporučení. |\n| --- | --- |\n| C. Kvantitativní analýza | Přehled IS v % dle kategorií OVU / VO / kompetencí. |\n| --- | --- |\n| D. Kvalitativní analýza | Slovní zhodnocení kvality souladu (formulace, obtížnost, integrace PT). |\n| --- | --- |\n| E. Rizikové oblasti | Přehled nalezených defektů (chybějící OVU, přetížení, formální shoda). |\n| --- | --- |\n| F. Návrhy opatření (Korekční plán) | Přesné návrhy změn - **Co, Kde, Kdo** má upravit, včetně termínu. |\n| --- | --- |\n| G. Přílohy | Master Matice (Fáze 2-3), revizní tabulka, výstupní grafy a metriky. |\n| --- | --- |\n\n\n\n\n.\n"}],sourceFile:"./books/examples/lsvp-asistent.book"}];
5714
5759
 
5715
5760
  /**
5716
5761
  * Function `validatePipelineString` will validate the if the string is a valid pipeline string
@@ -10436,260 +10481,1970 @@
10436
10481
  */
10437
10482
 
10438
10483
  /**
10439
- * Execution Tools for calling LLM models with a predefined agent "soul"
10440
- * This wraps underlying LLM execution tools and applies agent-specific system prompts and requirements
10484
+ * Helper of usage compute
10441
10485
  *
10442
- * @public exported from `@promptbook/core`
10486
+ * @param content the content of prompt or response
10487
+ * @returns part of UsageCounts
10488
+ *
10489
+ * @private internal utility of LlmExecutionTools
10443
10490
  */
10444
- class AgentLlmExecutionTools {
10445
- /**
10446
- * Creates new AgentLlmExecutionTools
10447
- *
10448
- * @param llmTools The underlying LLM execution tools to wrap
10449
- * @param agentSource The agent source string that defines the agent's behavior
10450
- */
10451
- constructor(llmTools, agentSource) {
10452
- this.llmTools = llmTools;
10453
- this.agentSource = agentSource;
10454
- /**
10455
- * Cached model requirements to avoid re-parsing the agent source
10456
- */
10457
- this._cachedModelRequirements = null;
10458
- /**
10459
- * Cached parsed agent information
10460
- */
10461
- this._cachedAgentInfo = null;
10462
- }
10463
- /**
10464
- * Get cached or parse agent information
10465
- */
10466
- getAgentInfo() {
10467
- if (this._cachedAgentInfo === null) {
10468
- this._cachedAgentInfo = parseAgentSource(this.agentSource);
10469
- }
10470
- return this._cachedAgentInfo;
10471
- }
10472
- /**
10473
- * Get cached or create agent model requirements
10474
- */
10475
- async getAgentModelRequirements() {
10476
- if (this._cachedModelRequirements === null) {
10477
- // Get available models from underlying LLM tools for best model selection
10478
- const availableModels = await this.llmTools.listModels();
10479
- this._cachedModelRequirements = await createAgentModelRequirements(this.agentSource, undefined, // Let the function pick the best model
10480
- availableModels);
10481
- }
10482
- return this._cachedModelRequirements;
10483
- }
10484
- get title() {
10485
- const agentInfo = this.getAgentInfo();
10486
- return (agentInfo.agentName || 'Agent');
10487
- }
10488
- get description() {
10489
- const agentInfo = this.getAgentInfo();
10490
- return agentInfo.personaDescription || 'AI Agent with predefined personality and behavior';
10491
- }
10492
- get profile() {
10493
- const agentInfo = this.getAgentInfo();
10494
- if (!agentInfo.agentName) {
10495
- return undefined;
10496
- }
10497
- return {
10498
- name: agentInfo.agentName.toUpperCase().replace(/\s+/g, '_'),
10499
- fullname: agentInfo.agentName,
10500
- color: agentInfo.meta.color || '#6366f1',
10501
- avatarSrc: agentInfo.meta.image,
10502
- };
10503
- }
10504
- checkConfiguration() {
10505
- // Check underlying tools configuration
10506
- return this.llmTools.checkConfiguration();
10507
- }
10508
- /**
10509
- * Returns a virtual model name representing the agent behavior
10510
- */
10511
- get modelName() {
10512
- const hash = cryptoJs.SHA256(hexEncoder__default["default"].parse(this.agentSource))
10513
- // <- TODO: [🥬] Encapsulate sha256 to some private utility function
10514
- .toString( /* hex */);
10515
- // <- TODO: [🥬] Make some system for hashes and ids of promptbook
10516
- const agentId = hash.substring(0, 10);
10517
- // <- TODO: [🥬] Make some system for hashes and ids of promptbook
10518
- return (normalizeToKebabCase(this.title) + '-' + agentId);
10519
- }
10520
- listModels() {
10521
- return [
10522
- {
10523
- modelName: this.modelName,
10524
- modelVariant: 'CHAT',
10525
- modelTitle: `${this.title} (Agent Chat Default)`,
10526
- modelDescription: `Chat model with agent behavior: ${this.description}`,
10527
- },
10528
- // <- Note: We only list a single "virtual" agent model here as this wrapper only supports chat prompts
10529
- ];
10530
- }
10531
- /**
10532
- * Calls the chat model with agent-specific system prompt and requirements
10533
- */
10534
- async callChatModel(prompt) {
10535
- if (!this.llmTools.callChatModel) {
10536
- throw new Error('Underlying LLM execution tools do not support chat model calls');
10537
- }
10538
- // Ensure we're working with a chat prompt
10539
- if (prompt.modelRequirements.modelVariant !== 'CHAT') {
10540
- throw new Error('AgentLlmExecutionTools only supports chat prompts');
10541
- }
10542
- const chatPrompt = prompt;
10543
- // Get agent model requirements (cached with best model selection)
10544
- const modelRequirements = await this.getAgentModelRequirements();
10545
- // Create modified chat prompt with agent system message
10546
- const modifiedChatPrompt = {
10547
- ...chatPrompt,
10548
- modelRequirements: {
10549
- ...chatPrompt.modelRequirements,
10550
- ...modelRequirements,
10551
- // Prepend agent system message to existing system message
10552
- systemMessage: modelRequirements.systemMessage +
10553
- (chatPrompt.modelRequirements.systemMessage
10554
- ? `\n\n${chatPrompt.modelRequirements.systemMessage}`
10555
- : ''),
10556
- },
10557
- };
10558
- const underlyingLlmResult = await this.llmTools.callChatModel(modifiedChatPrompt);
10559
- let content = underlyingLlmResult.content;
10560
- // Note: Cleanup the AI artifacts from the content
10561
- content = humanizeAiText(content);
10562
- // Note: Make sure the content is Promptbook-like
10563
- content = promptbookifyAiText(content);
10564
- const agentResult = {
10565
- ...underlyingLlmResult,
10566
- content,
10567
- modelName: this.modelName,
10568
- };
10569
- return agentResult;
10570
- }
10491
+ function computeUsageCounts(content) {
10492
+ return {
10493
+ charactersCount: { value: countCharacters(content) },
10494
+ wordsCount: { value: countWords(content) },
10495
+ sentencesCount: { value: countSentences(content) },
10496
+ linesCount: { value: countLines(content) },
10497
+ paragraphsCount: { value: countParagraphs(content) },
10498
+ pagesCount: { value: countPages(content) },
10499
+ };
10571
10500
  }
10572
- /**
10573
- * TODO: [🍚] Implement Destroyable pattern to free resources
10574
- * TODO: [🧠] Adding parameter substitution support (here or should be responsibility of the underlying LLM Tools)
10575
- */
10576
10501
 
10577
10502
  /**
10578
- * Creates new AgentLlmExecutionTools that wrap underlying LLM tools with agent-specific behavior
10503
+ * Make UncertainNumber
10579
10504
  *
10580
- * @public exported from `@promptbook/core`
10581
- */
10582
- const createAgentLlmExecutionTools = Object.assign((options) => {
10583
- return new AgentLlmExecutionTools(options.llmTools, options.agentSource);
10584
- }, {
10585
- packageName: '@promptbook/core',
10586
- className: 'AgentLlmExecutionTools',
10587
- });
10588
- /**
10589
- * TODO: [🧠] Consider adding validation for agent source format
10590
- * TODO: [🧠] Consider adding options for caching behavior
10591
- */
10592
-
10593
- /**
10594
- * Metadata for Agent LLM execution tools
10505
+ * @param value value of the uncertain number, if `NaN` or `undefined`, it will be set to 0 and `isUncertain=true`
10506
+ * @param isUncertain if `true`, the value is uncertain, otherwise depends on the value
10595
10507
  *
10596
- * @public exported from `@promptbook/core`
10597
- */
10598
- $llmToolsMetadataRegister.register({
10599
- packageName: '@promptbook/core',
10600
- className: 'AgentLlmExecutionTools',
10601
- title: 'Agent',
10602
- trustLevel: 'UNTRUSTED',
10603
- order: MODEL_ORDERS.LOW_TIER,
10604
- envVariables: null,
10605
- getBoilerplateConfiguration() {
10606
- return {
10607
- packageName: '@promptbook/core',
10608
- className: 'AgentLlmExecutionTools',
10609
- title: 'Agent',
10610
- options: {
10611
- // Note: Agent tools require runtime configuration with underlying tools and agent source
10612
- // This cannot be provided as a static configuration
10613
- },
10614
- };
10615
- },
10616
- createConfigurationFromEnv() {
10617
- // Agent tools cannot be configured from environment variables alone
10618
- // They require underlying LLM tools and agent source to be provided programmatically
10619
- return null;
10620
- },
10621
- });
10622
- /**
10623
- * TODO: [🧠] Consider adding a special trust level for AgentLlmExecutionTools
10624
- * TODO: [🎶] Naming "constructor" vs "creator" vs "factory"
10625
- * Note: [💞] Ignore a discrepancy between file name and entity name
10508
+ * @private utility for initializating UncertainNumber
10626
10509
  */
10510
+ function uncertainNumber(value, isUncertain) {
10511
+ if (value === null || value === undefined || Number.isNaN(value)) {
10512
+ return UNCERTAIN_ZERO_VALUE;
10513
+ }
10514
+ if (isUncertain === true) {
10515
+ return { value, isUncertain };
10516
+ }
10517
+ return { value };
10518
+ }
10627
10519
 
10628
10520
  /**
10629
- * Registration of Agent LLM provider
10630
- *
10631
- * Warning: This is not useful for the end user, it is just a side effect of the mechanism that handles all available LLM tools
10521
+ * Create price per one token based on the string value found on openai page
10632
10522
  *
10633
- * @public exported from `@promptbook/core`
10634
- */
10635
- $llmToolsRegister.register(createAgentLlmExecutionTools);
10636
- /**
10637
- * TODO: [🎶] Naming "constructor" vs "creator" vs "factory"
10638
- * Note: [💞] Ignore a discrepancy between file name and entity name
10523
+ * @private within the repository, used only as internal helper for `OPENAI_MODELS`
10639
10524
  */
10525
+ function pricing(value) {
10526
+ const [price, tokens] = value.split(' / ');
10527
+ return parseFloat(price.replace('$', '')) / parseFloat(tokens.replace('M tokens', '')) / 1000000;
10528
+ }
10640
10529
 
10641
10530
  /**
10642
- * Registration of LLM provider metadata
10531
+ * List of available OpenAI models with pricing
10643
10532
  *
10644
- * Warning: This is not useful for the end user, it is just a side effect of the mechanism that handles all available LLM tools
10533
+ * Note: Synced with official API docs at 2025-08-20
10645
10534
  *
10646
- * @public exported from `@promptbook/core`
10647
- * @public exported from `@promptbook/wizard`
10648
- * @public exported from `@promptbook/cli`
10535
+ * @see https://platform.openai.com/docs/models/
10536
+ * @see https://openai.com/api/pricing/
10537
+ * @public exported from `@promptbook/openai`
10649
10538
  */
10650
- $llmToolsMetadataRegister.register({
10651
- title: 'Anthropic Claude',
10652
- packageName: '@promptbook/anthropic-claude',
10653
- className: 'AnthropicClaudeExecutionTools',
10654
- envVariables: ['ANTHROPIC_CLAUDE_API_KEY'],
10655
- trustLevel: 'CLOSED',
10656
- order: MODEL_ORDERS.TOP_TIER,
10657
- getBoilerplateConfiguration() {
10658
- return {
10659
- title: 'Anthropic Claude',
10660
- packageName: '@promptbook/anthropic-claude',
10661
- className: 'AnthropicClaudeExecutionTools',
10662
- options: {
10663
- apiKey: 'sk-ant-api03-',
10664
- isProxied: true,
10665
- remoteServerUrl: DEFAULT_REMOTE_SERVER_URL,
10666
- maxRequestsPerMinute: DEFAULT_MAX_REQUESTS_PER_MINUTE,
10539
+ const OPENAI_MODELS = exportJson({
10540
+ name: 'OPENAI_MODELS',
10541
+ value: [
10542
+ /**/
10543
+ {
10544
+ modelVariant: 'CHAT',
10545
+ modelTitle: 'gpt-5',
10546
+ modelName: 'gpt-5',
10547
+ modelDescription: "OpenAI's most advanced language model with unprecedented reasoning capabilities and 200K context window. Features revolutionary improvements in complex problem-solving, scientific reasoning, and creative tasks. Demonstrates human-level performance across diverse domains with enhanced safety measures and alignment. Represents the next generation of AI with superior understanding, nuanced responses, and advanced multimodal capabilities.",
10548
+ pricing: {
10549
+ prompt: pricing(`$1.25 / 1M tokens`),
10550
+ output: pricing(`$10.00 / 1M tokens`),
10667
10551
  },
10668
- };
10669
- },
10670
- createConfigurationFromEnv(env) {
10671
- // Note: Note using `process.env` BUT `env` to pass in the environment variables dynamically
10672
- if (typeof env.ANTHROPIC_CLAUDE_API_KEY === 'string') {
10673
- return {
10674
- title: 'Claude (from env)',
10675
- packageName: '@promptbook/anthropic-claude',
10676
- className: 'AnthropicClaudeExecutionTools',
10677
- options: {
10678
- apiKey: env.ANTHROPIC_CLAUDE_API_KEY,
10679
- },
10680
- };
10681
- }
10682
- return null;
10683
- },
10684
- });
10685
- /**
10686
- * Note: [💞] Ignore a discrepancy between file name and entity name
10687
- */
10688
-
10689
- /**
10690
- * Registration of LLM provider metadata
10691
- *
10692
- * Warning: This is not useful for the end user, it is just a side effect of the mechanism that handles all available LLM tools
10552
+ },
10553
+ /**/
10554
+ /**/
10555
+ {
10556
+ modelVariant: 'CHAT',
10557
+ modelTitle: 'gpt-5-mini',
10558
+ modelName: 'gpt-5-mini',
10559
+ modelDescription: 'A faster, cost-efficient version of GPT-5 for well-defined tasks with 200K context window. Maintains core GPT-5 capabilities while offering 5x faster inference and significantly lower costs. Features enhanced instruction following and reduced latency for production applications requiring quick responses with high quality.',
10560
+ pricing: {
10561
+ prompt: pricing(`$0.25 / 1M tokens`),
10562
+ output: pricing(`$2.00 / 1M tokens`),
10563
+ },
10564
+ },
10565
+ /**/
10566
+ /**/
10567
+ {
10568
+ modelVariant: 'CHAT',
10569
+ modelTitle: 'gpt-5-nano',
10570
+ modelName: 'gpt-5-nano',
10571
+ modelDescription: 'The fastest, most cost-efficient version of GPT-5 with 200K context window. Optimized for summarization, classification, and simple reasoning tasks. Features 10x faster inference than base GPT-5 while maintaining good quality for straightforward applications. Ideal for high-volume, cost-sensitive deployments.',
10572
+ pricing: {
10573
+ prompt: pricing(`$0.05 / 1M tokens`),
10574
+ output: pricing(`$0.40 / 1M tokens`),
10575
+ },
10576
+ },
10577
+ /**/
10578
+ /**/
10579
+ {
10580
+ modelVariant: 'CHAT',
10581
+ modelTitle: 'gpt-4.1',
10582
+ modelName: 'gpt-4.1',
10583
+ modelDescription: 'Smartest non-reasoning model with 128K context window. Enhanced version of GPT-4 with improved instruction following, better factual accuracy, and reduced hallucinations. Features advanced function calling capabilities and superior performance on coding tasks. Ideal for applications requiring high intelligence without reasoning overhead.',
10584
+ pricing: {
10585
+ prompt: pricing(`$3.00 / 1M tokens`),
10586
+ output: pricing(`$12.00 / 1M tokens`),
10587
+ },
10588
+ },
10589
+ /**/
10590
+ /**/
10591
+ {
10592
+ modelVariant: 'CHAT',
10593
+ modelTitle: 'gpt-4.1-mini',
10594
+ modelName: 'gpt-4.1-mini',
10595
+ modelDescription: 'Smaller, faster version of GPT-4.1 with 128K context window. Balances intelligence and efficiency with 3x faster inference than base GPT-4.1. Maintains strong capabilities across text generation, reasoning, and coding while offering better cost-performance ratio for most applications.',
10596
+ pricing: {
10597
+ prompt: pricing(`$0.80 / 1M tokens`),
10598
+ output: pricing(`$3.20 / 1M tokens`),
10599
+ },
10600
+ },
10601
+ /**/
10602
+ /**/
10603
+ {
10604
+ modelVariant: 'CHAT',
10605
+ modelTitle: 'gpt-4.1-nano',
10606
+ modelName: 'gpt-4.1-nano',
10607
+ modelDescription: 'Fastest, most cost-efficient version of GPT-4.1 with 128K context window. Optimized for high-throughput applications requiring good quality at minimal cost. Features 5x faster inference than GPT-4.1 while maintaining adequate performance for most general-purpose tasks.',
10608
+ pricing: {
10609
+ prompt: pricing(`$0.20 / 1M tokens`),
10610
+ output: pricing(`$0.80 / 1M tokens`),
10611
+ },
10612
+ },
10613
+ /**/
10614
+ /**/
10615
+ {
10616
+ modelVariant: 'CHAT',
10617
+ modelTitle: 'o3',
10618
+ modelName: 'o3',
10619
+ modelDescription: 'Advanced reasoning model with 128K context window specializing in complex logical, mathematical, and analytical tasks. Successor to o1 with enhanced step-by-step problem-solving capabilities and superior performance on STEM-focused problems. Ideal for professional applications requiring deep analytical thinking and precise reasoning.',
10620
+ pricing: {
10621
+ prompt: pricing(`$15.00 / 1M tokens`),
10622
+ output: pricing(`$60.00 / 1M tokens`),
10623
+ },
10624
+ },
10625
+ /**/
10626
+ /**/
10627
+ {
10628
+ modelVariant: 'CHAT',
10629
+ modelTitle: 'o3-pro',
10630
+ modelName: 'o3-pro',
10631
+ modelDescription: 'Enhanced version of o3 with more compute allocated for better responses on the most challenging problems. Features extended reasoning time and improved accuracy on complex analytical tasks. Designed for applications where maximum reasoning quality is more important than response speed.',
10632
+ pricing: {
10633
+ prompt: pricing(`$30.00 / 1M tokens`),
10634
+ output: pricing(`$120.00 / 1M tokens`),
10635
+ },
10636
+ },
10637
+ /**/
10638
+ /**/
10639
+ {
10640
+ modelVariant: 'CHAT',
10641
+ modelTitle: 'o4-mini',
10642
+ modelName: 'o4-mini',
10643
+ modelDescription: 'Fast, cost-efficient reasoning model with 128K context window. Successor to o1-mini with improved analytical capabilities while maintaining speed advantages. Features enhanced mathematical reasoning and logical problem-solving at significantly lower cost than full reasoning models.',
10644
+ pricing: {
10645
+ prompt: pricing(`$4.00 / 1M tokens`),
10646
+ output: pricing(`$16.00 / 1M tokens`),
10647
+ },
10648
+ },
10649
+ /**/
10650
+ /**/
10651
+ {
10652
+ modelVariant: 'CHAT',
10653
+ modelTitle: 'o3-deep-research',
10654
+ modelName: 'o3-deep-research',
10655
+ modelDescription: 'Most powerful deep research model with 128K context window. Specialized for comprehensive research tasks, literature analysis, and complex information synthesis. Features advanced citation capabilities and enhanced factual accuracy for academic and professional research applications.',
10656
+ pricing: {
10657
+ prompt: pricing(`$25.00 / 1M tokens`),
10658
+ output: pricing(`$100.00 / 1M tokens`),
10659
+ },
10660
+ },
10661
+ /**/
10662
+ /**/
10663
+ {
10664
+ modelVariant: 'CHAT',
10665
+ modelTitle: 'o4-mini-deep-research',
10666
+ modelName: 'o4-mini-deep-research',
10667
+ modelDescription: 'Faster, more affordable deep research model with 128K context window. Balances research capabilities with cost efficiency, offering good performance on literature review, fact-checking, and information synthesis tasks at a more accessible price point.',
10668
+ pricing: {
10669
+ prompt: pricing(`$12.00 / 1M tokens`),
10670
+ output: pricing(`$48.00 / 1M tokens`),
10671
+ },
10672
+ },
10673
+ /**/
10674
+ /*/
10675
+ {
10676
+ modelTitle: 'dall-e-3',
10677
+ modelName: 'dall-e-3',
10678
+ },
10679
+ /**/
10680
+ /*/
10681
+ {
10682
+ modelTitle: 'whisper-1',
10683
+ modelName: 'whisper-1',
10684
+ },
10685
+ /**/
10686
+ /**/
10687
+ {
10688
+ modelVariant: 'COMPLETION',
10689
+ modelTitle: 'davinci-002',
10690
+ modelName: 'davinci-002',
10691
+ modelDescription: 'Legacy completion model with 4K token context window. Excels at complex text generation, creative writing, and detailed content creation with strong contextual understanding. Optimized for instructions requiring nuanced outputs and extended reasoning. Suitable for applications needing high-quality text generation without conversation management.',
10692
+ pricing: {
10693
+ prompt: pricing(`$2.00 / 1M tokens`),
10694
+ output: pricing(`$2.00 / 1M tokens`),
10695
+ },
10696
+ },
10697
+ /**/
10698
+ /*/
10699
+ {
10700
+ modelTitle: 'dall-e-2',
10701
+ modelName: 'dall-e-2',
10702
+ },
10703
+ /**/
10704
+ /**/
10705
+ {
10706
+ modelVariant: 'CHAT',
10707
+ modelTitle: 'gpt-3.5-turbo-16k',
10708
+ modelName: 'gpt-3.5-turbo-16k',
10709
+ modelDescription: 'Extended context GPT-3.5 Turbo with 16K token window. Maintains core capabilities of standard 3.5 Turbo while supporting longer conversations and documents. Features good balance of performance and cost for applications requiring more context than standard 4K models. Effective for document analysis, extended conversations, and multi-step reasoning tasks.',
10710
+ pricing: {
10711
+ prompt: pricing(`$3.00 / 1M tokens`),
10712
+ output: pricing(`$4.00 / 1M tokens`),
10713
+ },
10714
+ },
10715
+ /**/
10716
+ /*/
10717
+ {
10718
+ modelTitle: 'tts-1-hd-1106',
10719
+ modelName: 'tts-1-hd-1106',
10720
+ },
10721
+ /**/
10722
+ /*/
10723
+ {
10724
+ modelTitle: 'tts-1-hd',
10725
+ modelName: 'tts-1-hd',
10726
+ },
10727
+ /**/
10728
+ /**/
10729
+ {
10730
+ modelVariant: 'CHAT',
10731
+ modelTitle: 'gpt-4',
10732
+ modelName: 'gpt-4',
10733
+ modelDescription: 'Powerful language model with 8K context window featuring sophisticated reasoning, instruction-following, and knowledge capabilities. Demonstrates strong performance on complex tasks requiring deep understanding and multi-step reasoning. Excels at code generation, logical analysis, and nuanced content creation. Suitable for advanced applications requiring high-quality outputs.',
10734
+ pricing: {
10735
+ prompt: pricing(`$30.00 / 1M tokens`),
10736
+ output: pricing(`$60.00 / 1M tokens`),
10737
+ },
10738
+ },
10739
+ /**/
10740
+ /**/
10741
+ {
10742
+ modelVariant: 'CHAT',
10743
+ modelTitle: 'gpt-4-32k',
10744
+ modelName: 'gpt-4-32k',
10745
+ modelDescription: 'Extended context version of GPT-4 with 32K token window. Maintains all capabilities of standard GPT-4 while supporting analysis of very lengthy documents, code bases, and conversations. Features enhanced ability to maintain context over long interactions and process detailed information from large inputs. Ideal for document analysis, legal review, and complex problem-solving.',
10746
+ pricing: {
10747
+ prompt: pricing(`$60.00 / 1M tokens`),
10748
+ output: pricing(`$120.00 / 1M tokens`),
10749
+ },
10750
+ },
10751
+ /**/
10752
+ /*/
10753
+ {
10754
+ modelVariant: 'CHAT',
10755
+ modelTitle: 'gpt-4-0613',
10756
+ modelName: 'gpt-4-0613',
10757
+ pricing: {
10758
+ prompt: computeUsage(` / 1M tokens`),
10759
+ output: computeUsage(` / 1M tokens`),
10760
+ },
10761
+ },
10762
+ /**/
10763
+ /**/
10764
+ {
10765
+ modelVariant: 'CHAT',
10766
+ modelTitle: 'gpt-4-turbo-2024-04-09',
10767
+ modelName: 'gpt-4-turbo-2024-04-09',
10768
+ modelDescription: 'Latest stable GPT-4 Turbo from April 2024 with 128K context window. Features enhanced reasoning chains, improved factual accuracy with 40% reduction in hallucinations, and better instruction following compared to earlier versions. Includes advanced function calling capabilities and knowledge up to April 2024. Provides optimal performance for enterprise applications requiring reliability.',
10769
+ pricing: {
10770
+ prompt: pricing(`$10.00 / 1M tokens`),
10771
+ output: pricing(`$30.00 / 1M tokens`),
10772
+ },
10773
+ },
10774
+ /**/
10775
+ /**/
10776
+ {
10777
+ modelVariant: 'CHAT',
10778
+ modelTitle: 'gpt-3.5-turbo-1106',
10779
+ modelName: 'gpt-3.5-turbo-1106',
10780
+ modelDescription: 'November 2023 version of GPT-3.5 Turbo with 16K token context window. Features improved instruction following, more consistent output formatting, and enhanced function calling capabilities. Includes knowledge cutoff from April 2023. Suitable for applications requiring good performance at lower cost than GPT-4 models.',
10781
+ pricing: {
10782
+ prompt: pricing(`$1.00 / 1M tokens`),
10783
+ output: pricing(`$2.00 / 1M tokens`),
10784
+ },
10785
+ },
10786
+ /**/
10787
+ /**/
10788
+ {
10789
+ modelVariant: 'CHAT',
10790
+ modelTitle: 'gpt-4-turbo',
10791
+ modelName: 'gpt-4-turbo',
10792
+ modelDescription: 'More capable and cost-efficient version of GPT-4 with 128K token context window. Features improved instruction following, advanced function calling capabilities, and better performance on coding tasks. Maintains superior reasoning and knowledge while offering substantial cost reduction compared to base GPT-4. Ideal for complex applications requiring extensive context processing.',
10793
+ pricing: {
10794
+ prompt: pricing(`$10.00 / 1M tokens`),
10795
+ output: pricing(`$30.00 / 1M tokens`),
10796
+ },
10797
+ },
10798
+ /**/
10799
+ /**/
10800
+ {
10801
+ modelVariant: 'COMPLETION',
10802
+ modelTitle: 'gpt-3.5-turbo-instruct-0914',
10803
+ modelName: 'gpt-3.5-turbo-instruct-0914',
10804
+ modelDescription: 'September 2023 version of GPT-3.5 Turbo Instruct with 4K context window. Optimized for completion-style instruction following with deterministic responses. Better suited than chat models for applications requiring specific formatted outputs without conversation management. Knowledge cutoff from September 2021.',
10805
+ pricing: {
10806
+ prompt: pricing(`$1.50 / 1M tokens`),
10807
+ output: pricing(`$2.00 / 1M tokens`),
10808
+ },
10809
+ },
10810
+ /**/
10811
+ /**/
10812
+ {
10813
+ modelVariant: 'COMPLETION',
10814
+ modelTitle: 'gpt-3.5-turbo-instruct',
10815
+ modelName: 'gpt-3.5-turbo-instruct',
10816
+ modelDescription: 'Optimized version of GPT-3.5 for completion-style API with 4K token context window. Features strong instruction following with single-turn design rather than multi-turn conversation. Provides more consistent, deterministic outputs compared to chat models. Well-suited for templated content generation and structured text transformation tasks.',
10817
+ pricing: {
10818
+ prompt: pricing(`$1.50 / 1M tokens`),
10819
+ output: pricing(`$2.00 / 1M tokens`),
10820
+ },
10821
+ },
10822
+ /**/
10823
+ /*/
10824
+ {
10825
+ modelTitle: 'tts-1',
10826
+ modelName: 'tts-1',
10827
+ },
10828
+ /**/
10829
+ /**/
10830
+ {
10831
+ modelVariant: 'CHAT',
10832
+ modelTitle: 'gpt-3.5-turbo',
10833
+ modelName: 'gpt-3.5-turbo',
10834
+ modelDescription: 'Latest version of GPT-3.5 Turbo with 4K token default context window (16K available). Features continually improved performance with enhanced instruction following and reduced hallucinations. Offers excellent balance between capability and cost efficiency. Suitable for most general-purpose applications requiring good AI capabilities at reasonable cost.',
10835
+ pricing: {
10836
+ prompt: pricing(`$0.50 / 1M tokens`),
10837
+ output: pricing(`$1.50 / 1M tokens`),
10838
+ },
10839
+ },
10840
+ /**/
10841
+ /**/
10842
+ {
10843
+ modelVariant: 'CHAT',
10844
+ modelTitle: 'gpt-3.5-turbo-0301',
10845
+ modelName: 'gpt-3.5-turbo-0301',
10846
+ modelDescription: 'March 2023 version of GPT-3.5 Turbo with 4K token context window. Legacy model maintained for backward compatibility with specific application behaviors. Features solid conversational abilities and basic instruction following. Knowledge cutoff from September 2021. Suitable for applications explicitly designed for this version.',
10847
+ pricing: {
10848
+ prompt: pricing(`$1.50 / 1M tokens`),
10849
+ output: pricing(`$2.00 / 1M tokens`),
10850
+ },
10851
+ },
10852
+ /**/
10853
+ /**/
10854
+ {
10855
+ modelVariant: 'COMPLETION',
10856
+ modelTitle: 'babbage-002',
10857
+ modelName: 'babbage-002',
10858
+ modelDescription: 'Efficient legacy completion model with 4K context window balancing performance and speed. Features moderate reasoning capabilities with focus on straightforward text generation tasks. Significantly more efficient than davinci models while maintaining adequate quality for many applications. Suitable for high-volume, cost-sensitive text generation needs.',
10859
+ pricing: {
10860
+ prompt: pricing(`$0.40 / 1M tokens`),
10861
+ output: pricing(`$0.40 / 1M tokens`),
10862
+ },
10863
+ },
10864
+ /**/
10865
+ /**/
10866
+ {
10867
+ modelVariant: 'CHAT',
10868
+ modelTitle: 'gpt-4-1106-preview',
10869
+ modelName: 'gpt-4-1106-preview',
10870
+ modelDescription: 'November 2023 preview version of GPT-4 Turbo with 128K token context window. Features improved instruction following, better function calling capabilities, and enhanced reasoning. Includes knowledge cutoff from April 2023. Suitable for complex applications requiring extensive document understanding and sophisticated interactions.',
10871
+ pricing: {
10872
+ prompt: pricing(`$10.00 / 1M tokens`),
10873
+ output: pricing(`$30.00 / 1M tokens`),
10874
+ },
10875
+ },
10876
+ /**/
10877
+ /**/
10878
+ {
10879
+ modelVariant: 'CHAT',
10880
+ modelTitle: 'gpt-4-0125-preview',
10881
+ modelName: 'gpt-4-0125-preview',
10882
+ modelDescription: 'January 2024 preview version of GPT-4 Turbo with 128K token context window. Features improved reasoning capabilities, enhanced tool use, and more reliable function calling. Includes knowledge cutoff from October 2023. Offers better performance on complex logical tasks and more consistent outputs than previous preview versions.',
10883
+ pricing: {
10884
+ prompt: pricing(`$10.00 / 1M tokens`),
10885
+ output: pricing(`$30.00 / 1M tokens`),
10886
+ },
10887
+ },
10888
+ /**/
10889
+ /*/
10890
+ {
10891
+ modelTitle: 'tts-1-1106',
10892
+ modelName: 'tts-1-1106',
10893
+ },
10894
+ /**/
10895
+ /**/
10896
+ {
10897
+ modelVariant: 'CHAT',
10898
+ modelTitle: 'gpt-3.5-turbo-0125',
10899
+ modelName: 'gpt-3.5-turbo-0125',
10900
+ modelDescription: 'January 2024 version of GPT-3.5 Turbo with 16K token context window. Features improved reasoning capabilities, better instruction adherence, and reduced hallucinations compared to previous versions. Includes knowledge cutoff from September 2021. Provides good performance for most general applications at reasonable cost.',
10901
+ pricing: {
10902
+ prompt: pricing(`$0.50 / 1M tokens`),
10903
+ output: pricing(`$1.50 / 1M tokens`),
10904
+ },
10905
+ },
10906
+ /**/
10907
+ /**/
10908
+ {
10909
+ modelVariant: 'CHAT',
10910
+ modelTitle: 'gpt-4-turbo-preview',
10911
+ modelName: 'gpt-4-turbo-preview',
10912
+ modelDescription: 'Preview version of GPT-4 Turbo with 128K token context window that points to the latest development model. Features cutting-edge improvements to instruction following, knowledge representation, and tool use capabilities. Provides access to newest features but may have occasional behavior changes. Best for non-critical applications wanting latest capabilities.',
10913
+ pricing: {
10914
+ prompt: pricing(`$10.00 / 1M tokens`),
10915
+ output: pricing(`$30.00 / 1M tokens`),
10916
+ },
10917
+ },
10918
+ /**/
10919
+ /**/
10920
+ {
10921
+ modelVariant: 'EMBEDDING',
10922
+ modelTitle: 'text-embedding-3-large',
10923
+ modelName: 'text-embedding-3-large',
10924
+ modelDescription: "OpenAI's most capable text embedding model generating 3072-dimensional vectors. Designed for high-quality embeddings for complex similarity tasks, clustering, and information retrieval. Features enhanced cross-lingual capabilities and significantly improved performance on retrieval and classification benchmarks. Ideal for sophisticated RAG systems and semantic search applications.",
10925
+ pricing: {
10926
+ prompt: pricing(`$0.13 / 1M tokens`),
10927
+ output: 0,
10928
+ },
10929
+ },
10930
+ /**/
10931
+ /**/
10932
+ {
10933
+ modelVariant: 'EMBEDDING',
10934
+ modelTitle: 'text-embedding-3-small',
10935
+ modelName: 'text-embedding-3-small',
10936
+ modelDescription: 'Cost-effective embedding model generating 1536-dimensional vectors. Balances quality and efficiency for simpler tasks while maintaining good performance on text similarity and retrieval applications. Offers 20% better quality than ada-002 at significantly lower cost. Ideal for production embedding applications with cost constraints.',
10937
+ pricing: {
10938
+ prompt: pricing(`$0.02 / 1M tokens`),
10939
+ output: 0,
10940
+ },
10941
+ },
10942
+ /**/
10943
+ /**/
10944
+ {
10945
+ modelVariant: 'CHAT',
10946
+ modelTitle: 'gpt-3.5-turbo-0613',
10947
+ modelName: 'gpt-3.5-turbo-0613',
10948
+ modelDescription: "June 2023 version of GPT-3.5 Turbo with 4K token context window. Features function calling capabilities for structured data extraction and API interaction. Includes knowledge cutoff from September 2021. Maintained for applications specifically designed for this version's behaviors and capabilities.",
10949
+ pricing: {
10950
+ prompt: pricing(`$1.50 / 1M tokens`),
10951
+ output: pricing(`$2.00 / 1M tokens`),
10952
+ },
10953
+ },
10954
+ /**/
10955
+ /**/
10956
+ {
10957
+ modelVariant: 'EMBEDDING',
10958
+ modelTitle: 'text-embedding-ada-002',
10959
+ modelName: 'text-embedding-ada-002',
10960
+ modelDescription: 'Legacy text embedding model generating 1536-dimensional vectors suitable for text similarity and retrieval applications. Processes up to 8K tokens per request with consistent embedding quality. While superseded by newer embedding-3 models, still maintains adequate performance for many semantic search and classification tasks.',
10961
+ pricing: {
10962
+ prompt: pricing(`$0.1 / 1M tokens`),
10963
+ output: 0,
10964
+ },
10965
+ },
10966
+ /**/
10967
+ /*/
10968
+ {
10969
+ modelVariant: 'CHAT',
10970
+ modelTitle: 'gpt-4-1106-vision-preview',
10971
+ modelName: 'gpt-4-1106-vision-preview',
10972
+ },
10973
+ /**/
10974
+ /*/
10975
+ {
10976
+ modelVariant: 'CHAT',
10977
+ modelTitle: 'gpt-4-vision-preview',
10978
+ modelName: 'gpt-4-vision-preview',
10979
+ pricing: {
10980
+ prompt: computeUsage(`$10.00 / 1M tokens`),
10981
+ output: computeUsage(`$30.00 / 1M tokens`),
10982
+ },
10983
+ },
10984
+ /**/
10985
+ /**/
10986
+ {
10987
+ modelVariant: 'CHAT',
10988
+ modelTitle: 'gpt-4o-2024-05-13',
10989
+ modelName: 'gpt-4o-2024-05-13',
10990
+ modelDescription: 'May 2024 version of GPT-4o with 128K context window. Features enhanced multimodal capabilities including superior image understanding (up to 20MP), audio processing, and improved reasoning. Optimized for 2x lower latency than GPT-4 Turbo while maintaining high performance. Includes knowledge up to October 2023. Ideal for production applications requiring reliable multimodal capabilities.',
10991
+ pricing: {
10992
+ prompt: pricing(`$5.00 / 1M tokens`),
10993
+ output: pricing(`$15.00 / 1M tokens`),
10994
+ },
10995
+ },
10996
+ /**/
10997
+ /**/
10998
+ {
10999
+ modelVariant: 'CHAT',
11000
+ modelTitle: 'gpt-4o',
11001
+ modelName: 'gpt-4o',
11002
+ modelDescription: "OpenAI's most advanced general-purpose multimodal model with 128K context window. Optimized for balanced performance, speed, and cost with 2x faster responses than GPT-4 Turbo. Features excellent vision processing, audio understanding, reasoning, and text generation quality. Represents optimal balance of capability and efficiency for most advanced applications.",
11003
+ pricing: {
11004
+ prompt: pricing(`$5.00 / 1M tokens`),
11005
+ output: pricing(`$15.00 / 1M tokens`),
11006
+ },
11007
+ },
11008
+ /**/
11009
+ /**/
11010
+ {
11011
+ modelVariant: 'CHAT',
11012
+ modelTitle: 'gpt-4o-mini',
11013
+ modelName: 'gpt-4o-mini',
11014
+ modelDescription: 'Smaller, more cost-effective version of GPT-4o with 128K context window. Maintains impressive capabilities across text, vision, and audio tasks while operating at significantly lower cost. Features 3x faster inference than GPT-4o with good performance on general tasks. Excellent for applications requiring good quality multimodal capabilities at scale.',
11015
+ pricing: {
11016
+ prompt: pricing(`$0.15 / 1M tokens`),
11017
+ output: pricing(`$0.60 / 1M tokens`),
11018
+ },
11019
+ },
11020
+ /**/
11021
+ /**/
11022
+ {
11023
+ modelVariant: 'CHAT',
11024
+ modelTitle: 'o1-preview',
11025
+ modelName: 'o1-preview',
11026
+ modelDescription: 'Advanced reasoning model with 128K context window specializing in complex logical, mathematical, and analytical tasks. Features exceptional step-by-step problem-solving capabilities, advanced mathematical and scientific reasoning, and superior performance on STEM-focused problems. Significantly outperforms GPT-4 on quantitative reasoning benchmarks. Ideal for professional and specialized applications.',
11027
+ pricing: {
11028
+ prompt: pricing(`$15.00 / 1M tokens`),
11029
+ output: pricing(`$60.00 / 1M tokens`),
11030
+ },
11031
+ },
11032
+ /**/
11033
+ /**/
11034
+ {
11035
+ modelVariant: 'CHAT',
11036
+ modelTitle: 'o1-preview-2024-09-12',
11037
+ modelName: 'o1-preview-2024-09-12',
11038
+ modelDescription: 'September 2024 version of O1 preview with 128K context window. Features specialized reasoning capabilities with 30% improvement on mathematical and scientific accuracy over previous versions. Includes enhanced support for formal logic, statistical analysis, and technical domains. Optimized for professional applications requiring precise analytical thinking and rigorous methodologies.',
11039
+ pricing: {
11040
+ prompt: pricing(`$15.00 / 1M tokens`),
11041
+ output: pricing(`$60.00 / 1M tokens`),
11042
+ },
11043
+ },
11044
+ /**/
11045
+ /**/
11046
+ {
11047
+ modelVariant: 'CHAT',
11048
+ modelTitle: 'o1-mini',
11049
+ modelName: 'o1-mini',
11050
+ modelDescription: 'Smaller, cost-effective version of the O1 model with 128K context window. Maintains strong analytical reasoning abilities while reducing computational requirements by 70%. Features good performance on mathematical, logical, and scientific tasks at significantly lower cost than full O1. Excellent for everyday analytical applications that benefit from reasoning focus.',
11051
+ pricing: {
11052
+ prompt: pricing(`$3.00 / 1M tokens`),
11053
+ output: pricing(`$12.00 / 1M tokens`),
11054
+ },
11055
+ },
11056
+ /**/
11057
+ /**/
11058
+ {
11059
+ modelVariant: 'CHAT',
11060
+ modelTitle: 'o1',
11061
+ modelName: 'o1',
11062
+ modelDescription: "OpenAI's advanced reasoning model with 128K context window focusing on logical problem-solving and analytical thinking. Features exceptional performance on quantitative tasks, step-by-step deduction, and complex technical problems. Maintains 95%+ of o1-preview capabilities with production-ready stability. Ideal for scientific computing, financial analysis, and professional applications.",
11063
+ pricing: {
11064
+ prompt: pricing(`$15.00 / 1M tokens`),
11065
+ output: pricing(`$60.00 / 1M tokens`),
11066
+ },
11067
+ },
11068
+ /**/
11069
+ /**/
11070
+ {
11071
+ modelVariant: 'CHAT',
11072
+ modelTitle: 'o3-mini',
11073
+ modelName: 'o3-mini',
11074
+ modelDescription: 'Cost-effective reasoning model with 128K context window optimized for academic and scientific problem-solving. Features efficient performance on STEM tasks with specialized capabilities in mathematics, physics, chemistry, and computer science. Offers 80% of O1 performance on technical domains at significantly lower cost. Ideal for educational applications and research support.',
11075
+ pricing: {
11076
+ prompt: pricing(`$3.00 / 1M tokens`),
11077
+ output: pricing(`$12.00 / 1M tokens`),
11078
+ },
11079
+ },
11080
+ /**/
11081
+ /**/
11082
+ {
11083
+ modelVariant: 'CHAT',
11084
+ modelTitle: 'o1-mini-2024-09-12',
11085
+ modelName: 'o1-mini-2024-09-12',
11086
+ modelDescription: "September 2024 version of O1-mini with 128K context window featuring balanced reasoning capabilities and cost-efficiency. Includes 25% improvement in mathematical accuracy and enhanced performance on coding tasks compared to previous versions. Maintains efficient resource utilization while delivering improved results for analytical applications that don't require the full O1 model.",
11087
+ pricing: {
11088
+ prompt: pricing(`$3.00 / 1M tokens`),
11089
+ output: pricing(`$12.00 / 1M tokens`),
11090
+ },
11091
+ },
11092
+ /**/
11093
+ /**/
11094
+ {
11095
+ modelVariant: 'CHAT',
11096
+ modelTitle: 'gpt-3.5-turbo-16k-0613',
11097
+ modelName: 'gpt-3.5-turbo-16k-0613',
11098
+ modelDescription: "June 2023 version of GPT-3.5 Turbo with extended 16K token context window. Features good handling of longer conversations and documents with improved memory management across extended contexts. Includes knowledge cutoff from September 2021. Maintained for applications specifically designed for this version's behaviors and capabilities.",
11099
+ pricing: {
11100
+ prompt: pricing(`$3.00 / 1M tokens`),
11101
+ output: pricing(`$4.00 / 1M tokens`),
11102
+ },
11103
+ },
11104
+ /**/
11105
+ // <- [🕕]
11106
+ ],
11107
+ });
11108
+ /**
11109
+ * Note: [🤖] Add models of new variant
11110
+ * TODO: [🧠] Some mechanism to propagate unsureness
11111
+ * TODO: [🎰] Some mechanism to auto-update available models
11112
+ * TODO: [🎰][👮‍♀️] Make this list dynamic - dynamically can be listed modelNames but not modelVariant, legacy status, context length and pricing
11113
+ * TODO: [🧠][👮‍♀️] Put here more info like description, isVision, trainingDateCutoff, languages, strengths ( Top-level performance, intelligence, fluency, and understanding), contextWindow,...
11114
+ * @see https://platform.openai.com/docs/models/gpt-4-turbo-and-gpt-4
11115
+ * @see https://openai.com/api/pricing/
11116
+ * @see /other/playground/playground.ts
11117
+ * TODO: [🍓][💩] Make better
11118
+ * TODO: Change model titles to human eg: "gpt-4-turbo-2024-04-09" -> "GPT-4 Turbo (2024-04-09)"
11119
+ * TODO: [🚸] Not all models are compatible with JSON mode, add this information here and use it
11120
+ * Note: [💞] Ignore a discrepancy between file name and entity name
11121
+ */
11122
+
11123
+ /**
11124
+ * Computes the usage of the OpenAI API based on the response from OpenAI
11125
+ *
11126
+ * @param promptContent The content of the prompt
11127
+ * @param resultContent The content of the result (for embedding prompts or failed prompts pass empty string)
11128
+ * @param rawResponse The raw response from OpenAI API
11129
+ * @throws {PipelineExecutionError} If the usage is not defined in the response from OpenAI
11130
+ * @private internal utility of `OpenAiExecutionTools`
11131
+ */
11132
+ function computeOpenAiUsage(promptContent, // <- Note: Intentionally using [] to access type properties to bring jsdoc from Prompt/PromptResult to consumer
11133
+ resultContent, rawResponse) {
11134
+ var _a, _b;
11135
+ if (rawResponse.usage === undefined) {
11136
+ throw new PipelineExecutionError('The usage is not defined in the response from OpenAI');
11137
+ }
11138
+ if (((_a = rawResponse.usage) === null || _a === void 0 ? void 0 : _a.prompt_tokens) === undefined) {
11139
+ throw new PipelineExecutionError('In OpenAI response `usage.prompt_tokens` not defined');
11140
+ }
11141
+ const inputTokens = rawResponse.usage.prompt_tokens;
11142
+ const outputTokens = ((_b = rawResponse.usage) === null || _b === void 0 ? void 0 : _b.completion_tokens) || 0;
11143
+ let isUncertain = false;
11144
+ let modelInfo = OPENAI_MODELS.find((model) => model.modelName === rawResponse.model);
11145
+ if (modelInfo === undefined) {
11146
+ // Note: Model is not in the list of known models, fallback to the family of the models and mark price as uncertain
11147
+ modelInfo = OPENAI_MODELS.find((model) => (rawResponse.model || SALT_NONCE).startsWith(model.modelName));
11148
+ if (modelInfo !== undefined) {
11149
+ isUncertain = true;
11150
+ }
11151
+ }
11152
+ let price;
11153
+ if (modelInfo === undefined || modelInfo.pricing === undefined) {
11154
+ price = uncertainNumber();
11155
+ }
11156
+ else {
11157
+ price = uncertainNumber(inputTokens * modelInfo.pricing.prompt + outputTokens * modelInfo.pricing.output, isUncertain);
11158
+ }
11159
+ return {
11160
+ price,
11161
+ input: {
11162
+ tokensCount: uncertainNumber(rawResponse.usage.prompt_tokens),
11163
+ ...computeUsageCounts(promptContent),
11164
+ },
11165
+ output: {
11166
+ tokensCount: uncertainNumber(outputTokens),
11167
+ ...computeUsageCounts(resultContent),
11168
+ },
11169
+ };
11170
+ }
11171
+ /**
11172
+ * TODO: [🤝] DRY Maybe some common abstraction between `computeOpenAiUsage` and `computeAnthropicClaudeUsage`
11173
+ */
11174
+
11175
+ /**
11176
+ * Parses an OpenAI error message to identify which parameter is unsupported
11177
+ *
11178
+ * @param errorMessage The error message from OpenAI API
11179
+ * @returns The parameter name that is unsupported, or null if not an unsupported parameter error
11180
+ * @private utility of LLM Tools
11181
+ */
11182
+ function parseUnsupportedParameterError(errorMessage) {
11183
+ // Pattern to match "Unsupported value: 'parameter' does not support ..."
11184
+ const unsupportedValueMatch = errorMessage.match(/Unsupported value:\s*'([^']+)'\s*does not support/i);
11185
+ if (unsupportedValueMatch === null || unsupportedValueMatch === void 0 ? void 0 : unsupportedValueMatch[1]) {
11186
+ return unsupportedValueMatch[1];
11187
+ }
11188
+ // Pattern to match "'parameter' of type ... is not supported with this model"
11189
+ const parameterTypeMatch = errorMessage.match(/'([^']+)'\s*of type.*is not supported with this model/i);
11190
+ if (parameterTypeMatch === null || parameterTypeMatch === void 0 ? void 0 : parameterTypeMatch[1]) {
11191
+ return parameterTypeMatch[1];
11192
+ }
11193
+ return null;
11194
+ }
11195
+ /**
11196
+ * Creates a copy of model requirements with the specified parameter removed
11197
+ *
11198
+ * @param modelRequirements Original model requirements
11199
+ * @param unsupportedParameter The parameter to remove
11200
+ * @returns New model requirements without the unsupported parameter
11201
+ * @private utility of LLM Tools
11202
+ */
11203
+ function removeUnsupportedModelRequirement(modelRequirements, unsupportedParameter) {
11204
+ const newRequirements = { ...modelRequirements };
11205
+ // Map of parameter names that might appear in error messages to ModelRequirements properties
11206
+ const parameterMap = {
11207
+ temperature: 'temperature',
11208
+ max_tokens: 'maxTokens',
11209
+ maxTokens: 'maxTokens',
11210
+ seed: 'seed',
11211
+ };
11212
+ const propertyToRemove = parameterMap[unsupportedParameter];
11213
+ if (propertyToRemove && propertyToRemove in newRequirements) {
11214
+ delete newRequirements[propertyToRemove];
11215
+ }
11216
+ return newRequirements;
11217
+ }
11218
+ /**
11219
+ * Checks if an error is an "Unsupported value" error from OpenAI
11220
+ * @param error The error to check
11221
+ * @returns true if this is an unsupported parameter error
11222
+ * @private utility of LLM Tools
11223
+ */
11224
+ function isUnsupportedParameterError(error) {
11225
+ const errorMessage = error.message.toLowerCase();
11226
+ return (errorMessage.includes('unsupported value:') ||
11227
+ errorMessage.includes('is not supported with this model') ||
11228
+ errorMessage.includes('does not support'));
11229
+ }
11230
+
11231
+ /**
11232
+ * Execution Tools for calling OpenAI API or other OpenAI compatible provider
11233
+ *
11234
+ * @public exported from `@promptbook/openai`
11235
+ */
11236
+ class OpenAiCompatibleExecutionTools {
11237
+ // Removed retriedUnsupportedParameters and attemptHistory instance fields
11238
+ /**
11239
+ * Creates OpenAI compatible Execution Tools.
11240
+ *
11241
+ * @param options which are relevant are directly passed to the OpenAI compatible client
11242
+ */
11243
+ constructor(options) {
11244
+ this.options = options;
11245
+ /**
11246
+ * OpenAI API client.
11247
+ */
11248
+ this.client = null;
11249
+ // TODO: Allow configuring rate limits via options
11250
+ this.limiter = new Bottleneck__default["default"]({
11251
+ minTime: 60000 / (this.options.maxRequestsPerMinute || DEFAULT_MAX_REQUESTS_PER_MINUTE),
11252
+ });
11253
+ }
11254
+ async getClient() {
11255
+ if (this.client === null) {
11256
+ // Note: Passing only OpenAI relevant options to OpenAI constructor
11257
+ const openAiOptions = { ...this.options };
11258
+ delete openAiOptions.isVerbose;
11259
+ delete openAiOptions.userId;
11260
+ // Enhanced configuration for better ECONNRESET handling
11261
+ const enhancedOptions = {
11262
+ ...openAiOptions,
11263
+ timeout: API_REQUEST_TIMEOUT,
11264
+ maxRetries: CONNECTION_RETRIES_LIMIT,
11265
+ defaultHeaders: {
11266
+ Connection: 'keep-alive',
11267
+ 'Keep-Alive': 'timeout=30, max=100',
11268
+ ...openAiOptions.defaultHeaders,
11269
+ },
11270
+ };
11271
+ this.client = new OpenAI__default["default"](enhancedOptions);
11272
+ }
11273
+ return this.client;
11274
+ }
11275
+ /**
11276
+ * Check the `options` passed to `constructor`
11277
+ */
11278
+ async checkConfiguration() {
11279
+ await this.getClient();
11280
+ // TODO: [🎍] Do here a real check that API is online, working and API key is correct
11281
+ }
11282
+ /**
11283
+ * List all available OpenAI compatible models that can be used
11284
+ */
11285
+ async listModels() {
11286
+ const client = await this.getClient();
11287
+ const rawModelsList = await client.models.list();
11288
+ const availableModels = rawModelsList.data
11289
+ .sort((a, b) => (a.created > b.created ? 1 : -1))
11290
+ .map((modelFromApi) => {
11291
+ const modelFromList = this.HARDCODED_MODELS.find(({ modelName }) => modelName === modelFromApi.id ||
11292
+ modelName.startsWith(modelFromApi.id) ||
11293
+ modelFromApi.id.startsWith(modelName));
11294
+ if (modelFromList !== undefined) {
11295
+ return modelFromList;
11296
+ }
11297
+ return {
11298
+ modelVariant: 'CHAT',
11299
+ modelTitle: modelFromApi.id,
11300
+ modelName: modelFromApi.id,
11301
+ modelDescription: '',
11302
+ };
11303
+ });
11304
+ return availableModels;
11305
+ }
11306
+ /**
11307
+ * Calls OpenAI compatible API to use a chat model.
11308
+ */
11309
+ async callChatModel(prompt) {
11310
+ // Deep clone prompt and modelRequirements to avoid mutation across calls
11311
+ const clonedPrompt = JSON.parse(JSON.stringify(prompt));
11312
+ // Use local Set for retried parameters to ensure independence and thread safety
11313
+ const retriedUnsupportedParameters = new Set();
11314
+ return this.callChatModelWithRetry(clonedPrompt, clonedPrompt.modelRequirements, [], retriedUnsupportedParameters);
11315
+ }
11316
+ /**
11317
+ * Internal method that handles parameter retry for chat model calls
11318
+ */
11319
+ async callChatModelWithRetry(prompt, currentModelRequirements, attemptStack = [], retriedUnsupportedParameters = new Set()) {
11320
+ var _a;
11321
+ if (this.options.isVerbose) {
11322
+ console.info(`💬 ${this.title} callChatModel call`, { prompt, currentModelRequirements });
11323
+ }
11324
+ const { content, parameters, format } = prompt;
11325
+ const client = await this.getClient();
11326
+ // TODO: [☂] Use here more modelRequirements
11327
+ if (currentModelRequirements.modelVariant !== 'CHAT') {
11328
+ throw new PipelineExecutionError('Use callChatModel only for CHAT variant');
11329
+ }
11330
+ const modelName = currentModelRequirements.modelName || this.getDefaultChatModel().modelName;
11331
+ const modelSettings = {
11332
+ model: modelName,
11333
+ max_tokens: currentModelRequirements.maxTokens,
11334
+ temperature: currentModelRequirements.temperature,
11335
+ // <- TODO: [🈁] Use `seed` here AND/OR use is `isDeterministic` for entire execution tools
11336
+ // <- Note: [🧆]
11337
+ }; // <- TODO: [💩] Guard here types better
11338
+ if (format === 'JSON') {
11339
+ modelSettings.response_format = {
11340
+ type: 'json_object',
11341
+ };
11342
+ }
11343
+ // <- TODO: [🚸] Not all models are compatible with JSON mode
11344
+ // > 'response_format' of type 'json_object' is not supported with this model.
11345
+ const rawPromptContent = templateParameters(content, { ...parameters, modelName });
11346
+ // Convert thread to OpenAI format if present
11347
+ let threadMessages = [];
11348
+ if ('thread' in prompt && Array.isArray(prompt.thread)) {
11349
+ threadMessages = prompt.thread.map((msg) => ({
11350
+ role: msg.role === 'assistant' ? 'assistant' : 'user',
11351
+ content: msg.content,
11352
+ }));
11353
+ }
11354
+ const rawRequest = {
11355
+ ...modelSettings,
11356
+ messages: [
11357
+ ...(currentModelRequirements.systemMessage === undefined
11358
+ ? []
11359
+ : [
11360
+ {
11361
+ role: 'system',
11362
+ content: currentModelRequirements.systemMessage,
11363
+ },
11364
+ ]),
11365
+ ...threadMessages,
11366
+ {
11367
+ role: 'user',
11368
+ content: rawPromptContent,
11369
+ },
11370
+ ],
11371
+ user: (_a = this.options.userId) === null || _a === void 0 ? void 0 : _a.toString(),
11372
+ };
11373
+ const start = $getCurrentDate();
11374
+ if (this.options.isVerbose) {
11375
+ console.info(colors__default["default"].bgWhite('rawRequest'), JSON.stringify(rawRequest, null, 4));
11376
+ }
11377
+ try {
11378
+ const rawResponse = await this.limiter
11379
+ .schedule(() => this.makeRequestWithNetworkRetry(() => client.chat.completions.create(rawRequest)))
11380
+ .catch((error) => {
11381
+ assertsError(error);
11382
+ if (this.options.isVerbose) {
11383
+ console.info(colors__default["default"].bgRed('error'), error);
11384
+ }
11385
+ throw error;
11386
+ });
11387
+ if (this.options.isVerbose) {
11388
+ console.info(colors__default["default"].bgWhite('rawResponse'), JSON.stringify(rawResponse, null, 4));
11389
+ }
11390
+ const complete = $getCurrentDate();
11391
+ if (!rawResponse.choices[0]) {
11392
+ throw new PipelineExecutionError(`No choises from ${this.title}`);
11393
+ }
11394
+ if (rawResponse.choices.length > 1) {
11395
+ // TODO: This should be maybe only warning
11396
+ throw new PipelineExecutionError(`More than one choise from ${this.title}`);
11397
+ }
11398
+ const resultContent = rawResponse.choices[0].message.content;
11399
+ const usage = this.computeUsage(content || '', resultContent || '', rawResponse);
11400
+ if (resultContent === null) {
11401
+ throw new PipelineExecutionError(`No response message from ${this.title}`);
11402
+ }
11403
+ return exportJson({
11404
+ name: 'promptResult',
11405
+ message: `Result of \`OpenAiCompatibleExecutionTools.callChatModel\``,
11406
+ order: [],
11407
+ value: {
11408
+ content: resultContent,
11409
+ modelName: rawResponse.model || modelName,
11410
+ timing: {
11411
+ start,
11412
+ complete,
11413
+ },
11414
+ usage,
11415
+ rawPromptContent,
11416
+ rawRequest,
11417
+ rawResponse,
11418
+ // <- [🗯]
11419
+ },
11420
+ });
11421
+ }
11422
+ catch (error) {
11423
+ assertsError(error);
11424
+ // Check if this is an unsupported parameter error
11425
+ if (!isUnsupportedParameterError(error)) {
11426
+ // If we have attemptStack, include it in the error message
11427
+ if (attemptStack.length > 0) {
11428
+ throw new PipelineExecutionError(`All attempts failed. Attempt history:\n` +
11429
+ attemptStack
11430
+ .map((a, i) => ` ${i + 1}. Model: ${a.modelName}` +
11431
+ (a.unsupportedParameter ? `, Stripped: ${a.unsupportedParameter}` : '') +
11432
+ `, Error: ${a.errorMessage}` +
11433
+ (a.stripped ? ' (stripped and retried)' : ''))
11434
+ .join('\n') +
11435
+ `\nFinal error: ${error.message}`);
11436
+ }
11437
+ throw error;
11438
+ }
11439
+ // Parse which parameter is unsupported
11440
+ const unsupportedParameter = parseUnsupportedParameterError(error.message);
11441
+ if (!unsupportedParameter) {
11442
+ if (this.options.isVerbose) {
11443
+ console.warn(colors__default["default"].bgYellow('Warning'), 'Could not parse unsupported parameter from error:', error.message);
11444
+ }
11445
+ throw error;
11446
+ }
11447
+ // Create a unique key for this model + parameter combination to prevent infinite loops
11448
+ const retryKey = `${modelName}-${unsupportedParameter}`;
11449
+ if (retriedUnsupportedParameters.has(retryKey)) {
11450
+ // Already retried this parameter, throw the error with attemptStack
11451
+ attemptStack.push({
11452
+ modelName,
11453
+ unsupportedParameter,
11454
+ errorMessage: error.message,
11455
+ stripped: true,
11456
+ });
11457
+ throw new PipelineExecutionError(`All attempts failed. Attempt history:\n` +
11458
+ attemptStack
11459
+ .map((a, i) => ` ${i + 1}. Model: ${a.modelName}` +
11460
+ (a.unsupportedParameter ? `, Stripped: ${a.unsupportedParameter}` : '') +
11461
+ `, Error: ${a.errorMessage}` +
11462
+ (a.stripped ? ' (stripped and retried)' : ''))
11463
+ .join('\n') +
11464
+ `\nFinal error: ${error.message}`);
11465
+ }
11466
+ // Mark this parameter as retried
11467
+ retriedUnsupportedParameters.add(retryKey);
11468
+ // Log warning in verbose mode
11469
+ if (this.options.isVerbose) {
11470
+ console.warn(colors__default["default"].bgYellow('Warning'), `Removing unsupported parameter '${unsupportedParameter}' for model '${modelName}' and retrying request`);
11471
+ }
11472
+ // Add to attemptStack
11473
+ attemptStack.push({
11474
+ modelName,
11475
+ unsupportedParameter,
11476
+ errorMessage: error.message,
11477
+ stripped: true,
11478
+ });
11479
+ // Remove the unsupported parameter and retry
11480
+ const modifiedModelRequirements = removeUnsupportedModelRequirement(currentModelRequirements, unsupportedParameter);
11481
+ return this.callChatModelWithRetry(prompt, modifiedModelRequirements, attemptStack, retriedUnsupportedParameters);
11482
+ }
11483
+ }
11484
+ /**
11485
+ * Calls OpenAI API to use a complete model.
11486
+ */
11487
+ async callCompletionModel(prompt) {
11488
+ // Deep clone prompt and modelRequirements to avoid mutation across calls
11489
+ const clonedPrompt = JSON.parse(JSON.stringify(prompt));
11490
+ const retriedUnsupportedParameters = new Set();
11491
+ return this.callCompletionModelWithRetry(clonedPrompt, clonedPrompt.modelRequirements, [], retriedUnsupportedParameters);
11492
+ }
11493
+ /**
11494
+ * Internal method that handles parameter retry for completion model calls
11495
+ */
11496
+ async callCompletionModelWithRetry(prompt, currentModelRequirements, attemptStack = [], retriedUnsupportedParameters = new Set()) {
11497
+ var _a;
11498
+ if (this.options.isVerbose) {
11499
+ console.info(`🖋 ${this.title} callCompletionModel call`, { prompt, currentModelRequirements });
11500
+ }
11501
+ const { content, parameters } = prompt;
11502
+ const client = await this.getClient();
11503
+ // TODO: [☂] Use here more modelRequirements
11504
+ if (currentModelRequirements.modelVariant !== 'COMPLETION') {
11505
+ throw new PipelineExecutionError('Use callCompletionModel only for COMPLETION variant');
11506
+ }
11507
+ const modelName = currentModelRequirements.modelName || this.getDefaultCompletionModel().modelName;
11508
+ const modelSettings = {
11509
+ model: modelName,
11510
+ max_tokens: currentModelRequirements.maxTokens,
11511
+ temperature: currentModelRequirements.temperature,
11512
+ };
11513
+ const rawPromptContent = templateParameters(content, { ...parameters, modelName });
11514
+ const rawRequest = {
11515
+ ...modelSettings,
11516
+ prompt: rawPromptContent,
11517
+ user: (_a = this.options.userId) === null || _a === void 0 ? void 0 : _a.toString(),
11518
+ };
11519
+ const start = $getCurrentDate();
11520
+ if (this.options.isVerbose) {
11521
+ console.info(colors__default["default"].bgWhite('rawRequest'), JSON.stringify(rawRequest, null, 4));
11522
+ }
11523
+ try {
11524
+ const rawResponse = await this.limiter
11525
+ .schedule(() => this.makeRequestWithNetworkRetry(() => client.completions.create(rawRequest)))
11526
+ .catch((error) => {
11527
+ assertsError(error);
11528
+ if (this.options.isVerbose) {
11529
+ console.info(colors__default["default"].bgRed('error'), error);
11530
+ }
11531
+ throw error;
11532
+ });
11533
+ if (this.options.isVerbose) {
11534
+ console.info(colors__default["default"].bgWhite('rawResponse'), JSON.stringify(rawResponse, null, 4));
11535
+ }
11536
+ const complete = $getCurrentDate();
11537
+ if (!rawResponse.choices[0]) {
11538
+ throw new PipelineExecutionError(`No choises from ${this.title}`);
11539
+ }
11540
+ if (rawResponse.choices.length > 1) {
11541
+ throw new PipelineExecutionError(`More than one choise from ${this.title}`);
11542
+ }
11543
+ const resultContent = rawResponse.choices[0].text;
11544
+ const usage = this.computeUsage(content || '', resultContent || '', rawResponse);
11545
+ return exportJson({
11546
+ name: 'promptResult',
11547
+ message: `Result of \`OpenAiCompatibleExecutionTools.callCompletionModel\``,
11548
+ order: [],
11549
+ value: {
11550
+ content: resultContent,
11551
+ modelName: rawResponse.model || modelName,
11552
+ timing: {
11553
+ start,
11554
+ complete,
11555
+ },
11556
+ usage,
11557
+ rawPromptContent,
11558
+ rawRequest,
11559
+ rawResponse,
11560
+ },
11561
+ });
11562
+ }
11563
+ catch (error) {
11564
+ assertsError(error);
11565
+ if (!isUnsupportedParameterError(error)) {
11566
+ if (attemptStack.length > 0) {
11567
+ throw new PipelineExecutionError(`All attempts failed. Attempt history:\n` +
11568
+ attemptStack
11569
+ .map((a, i) => ` ${i + 1}. Model: ${a.modelName}` +
11570
+ (a.unsupportedParameter ? `, Stripped: ${a.unsupportedParameter}` : '') +
11571
+ `, Error: ${a.errorMessage}` +
11572
+ (a.stripped ? ' (stripped and retried)' : ''))
11573
+ .join('\n') +
11574
+ `\nFinal error: ${error.message}`);
11575
+ }
11576
+ throw error;
11577
+ }
11578
+ const unsupportedParameter = parseUnsupportedParameterError(error.message);
11579
+ if (!unsupportedParameter) {
11580
+ if (this.options.isVerbose) {
11581
+ console.warn(colors__default["default"].bgYellow('Warning'), 'Could not parse unsupported parameter from error:', error.message);
11582
+ }
11583
+ throw error;
11584
+ }
11585
+ const retryKey = `${modelName}-${unsupportedParameter}`;
11586
+ if (retriedUnsupportedParameters.has(retryKey)) {
11587
+ attemptStack.push({
11588
+ modelName,
11589
+ unsupportedParameter,
11590
+ errorMessage: error.message,
11591
+ stripped: true,
11592
+ });
11593
+ throw new PipelineExecutionError(`All attempts failed. Attempt history:\n` +
11594
+ attemptStack
11595
+ .map((a, i) => ` ${i + 1}. Model: ${a.modelName}` +
11596
+ (a.unsupportedParameter ? `, Stripped: ${a.unsupportedParameter}` : '') +
11597
+ `, Error: ${a.errorMessage}` +
11598
+ (a.stripped ? ' (stripped and retried)' : ''))
11599
+ .join('\n') +
11600
+ `\nFinal error: ${error.message}`);
11601
+ }
11602
+ retriedUnsupportedParameters.add(retryKey);
11603
+ if (this.options.isVerbose) {
11604
+ console.warn(colors__default["default"].bgYellow('Warning'), `Removing unsupported parameter '${unsupportedParameter}' for model '${modelName}' and retrying request`);
11605
+ }
11606
+ attemptStack.push({
11607
+ modelName,
11608
+ unsupportedParameter,
11609
+ errorMessage: error.message,
11610
+ stripped: true,
11611
+ });
11612
+ const modifiedModelRequirements = removeUnsupportedModelRequirement(currentModelRequirements, unsupportedParameter);
11613
+ return this.callCompletionModelWithRetry(prompt, modifiedModelRequirements, attemptStack, retriedUnsupportedParameters);
11614
+ }
11615
+ }
11616
+ /**
11617
+ * Calls OpenAI compatible API to use a embedding model
11618
+ */
11619
+ async callEmbeddingModel(prompt) {
11620
+ // Deep clone prompt and modelRequirements to avoid mutation across calls
11621
+ const clonedPrompt = JSON.parse(JSON.stringify(prompt));
11622
+ const retriedUnsupportedParameters = new Set();
11623
+ return this.callEmbeddingModelWithRetry(clonedPrompt, clonedPrompt.modelRequirements, [], retriedUnsupportedParameters);
11624
+ }
11625
+ /**
11626
+ * Internal method that handles parameter retry for embedding model calls
11627
+ */
11628
+ async callEmbeddingModelWithRetry(prompt, currentModelRequirements, attemptStack = [], retriedUnsupportedParameters = new Set()) {
11629
+ if (this.options.isVerbose) {
11630
+ console.info(`🖋 ${this.title} embedding call`, { prompt, currentModelRequirements });
11631
+ }
11632
+ const { content, parameters } = prompt;
11633
+ const client = await this.getClient();
11634
+ if (currentModelRequirements.modelVariant !== 'EMBEDDING') {
11635
+ throw new PipelineExecutionError('Use embed only for EMBEDDING variant');
11636
+ }
11637
+ const modelName = currentModelRequirements.modelName || this.getDefaultEmbeddingModel().modelName;
11638
+ const rawPromptContent = templateParameters(content, { ...parameters, modelName });
11639
+ const rawRequest = {
11640
+ input: rawPromptContent,
11641
+ model: modelName,
11642
+ };
11643
+ const start = $getCurrentDate();
11644
+ if (this.options.isVerbose) {
11645
+ console.info(colors__default["default"].bgWhite('rawRequest'), JSON.stringify(rawRequest, null, 4));
11646
+ }
11647
+ try {
11648
+ const rawResponse = await this.limiter
11649
+ .schedule(() => this.makeRequestWithNetworkRetry(() => client.embeddings.create(rawRequest)))
11650
+ .catch((error) => {
11651
+ assertsError(error);
11652
+ if (this.options.isVerbose) {
11653
+ console.info(colors__default["default"].bgRed('error'), error);
11654
+ }
11655
+ throw error;
11656
+ });
11657
+ if (this.options.isVerbose) {
11658
+ console.info(colors__default["default"].bgWhite('rawResponse'), JSON.stringify(rawResponse, null, 4));
11659
+ }
11660
+ const complete = $getCurrentDate();
11661
+ if (rawResponse.data.length !== 1) {
11662
+ throw new PipelineExecutionError(`Expected exactly 1 data item in response, got ${rawResponse.data.length}`);
11663
+ }
11664
+ const resultContent = rawResponse.data[0].embedding;
11665
+ const usage = this.computeUsage(content || '', '', rawResponse);
11666
+ return exportJson({
11667
+ name: 'promptResult',
11668
+ message: `Result of \`OpenAiCompatibleExecutionTools.callEmbeddingModel\``,
11669
+ order: [],
11670
+ value: {
11671
+ content: resultContent,
11672
+ modelName: rawResponse.model || modelName,
11673
+ timing: {
11674
+ start,
11675
+ complete,
11676
+ },
11677
+ usage,
11678
+ rawPromptContent,
11679
+ rawRequest,
11680
+ rawResponse,
11681
+ },
11682
+ });
11683
+ }
11684
+ catch (error) {
11685
+ assertsError(error);
11686
+ if (!isUnsupportedParameterError(error)) {
11687
+ if (attemptStack.length > 0) {
11688
+ throw new PipelineExecutionError(`All attempts failed. Attempt history:\n` +
11689
+ attemptStack
11690
+ .map((a, i) => ` ${i + 1}. Model: ${a.modelName}` +
11691
+ (a.unsupportedParameter ? `, Stripped: ${a.unsupportedParameter}` : '') +
11692
+ `, Error: ${a.errorMessage}` +
11693
+ (a.stripped ? ' (stripped and retried)' : ''))
11694
+ .join('\n') +
11695
+ `\nFinal error: ${error.message}`);
11696
+ }
11697
+ throw error;
11698
+ }
11699
+ const unsupportedParameter = parseUnsupportedParameterError(error.message);
11700
+ if (!unsupportedParameter) {
11701
+ if (this.options.isVerbose) {
11702
+ console.warn(colors__default["default"].bgYellow('Warning'), 'Could not parse unsupported parameter from error:', error.message);
11703
+ }
11704
+ throw error;
11705
+ }
11706
+ const retryKey = `${modelName}-${unsupportedParameter}`;
11707
+ if (retriedUnsupportedParameters.has(retryKey)) {
11708
+ attemptStack.push({
11709
+ modelName,
11710
+ unsupportedParameter,
11711
+ errorMessage: error.message,
11712
+ stripped: true,
11713
+ });
11714
+ throw new PipelineExecutionError(`All attempts failed. Attempt history:\n` +
11715
+ attemptStack
11716
+ .map((a, i) => ` ${i + 1}. Model: ${a.modelName}` +
11717
+ (a.unsupportedParameter ? `, Stripped: ${a.unsupportedParameter}` : '') +
11718
+ `, Error: ${a.errorMessage}` +
11719
+ (a.stripped ? ' (stripped and retried)' : ''))
11720
+ .join('\n') +
11721
+ `\nFinal error: ${error.message}`);
11722
+ }
11723
+ retriedUnsupportedParameters.add(retryKey);
11724
+ if (this.options.isVerbose) {
11725
+ console.warn(colors__default["default"].bgYellow('Warning'), `Removing unsupported parameter '${unsupportedParameter}' for model '${modelName}' and retrying request`);
11726
+ }
11727
+ attemptStack.push({
11728
+ modelName,
11729
+ unsupportedParameter,
11730
+ errorMessage: error.message,
11731
+ stripped: true,
11732
+ });
11733
+ const modifiedModelRequirements = removeUnsupportedModelRequirement(currentModelRequirements, unsupportedParameter);
11734
+ return this.callEmbeddingModelWithRetry(prompt, modifiedModelRequirements, attemptStack, retriedUnsupportedParameters);
11735
+ }
11736
+ }
11737
+ // <- Note: [🤖] callXxxModel
11738
+ /**
11739
+ * Get the model that should be used as default
11740
+ */
11741
+ getDefaultModel(defaultModelName) {
11742
+ // Note: Match exact or prefix for model families
11743
+ const model = this.HARDCODED_MODELS.find(({ modelName }) => modelName === defaultModelName || modelName.startsWith(defaultModelName));
11744
+ if (model === undefined) {
11745
+ throw new PipelineExecutionError(spaceTrim__default["default"]((block) => `
11746
+ Cannot find model in ${this.title} models with name "${defaultModelName}" which should be used as default.
11747
+
11748
+ Available models:
11749
+ ${block(this.HARDCODED_MODELS.map(({ modelName }) => `- "${modelName}"`).join('\n'))}
11750
+
11751
+ Model "${defaultModelName}" is probably not available anymore, not installed, inaccessible or misconfigured.
11752
+
11753
+ `));
11754
+ }
11755
+ return model;
11756
+ }
11757
+ // <- Note: [🤖] getDefaultXxxModel
11758
+ /**
11759
+ * Makes a request with retry logic for network errors like ECONNRESET
11760
+ */
11761
+ async makeRequestWithNetworkRetry(requestFn) {
11762
+ let lastError;
11763
+ for (let attempt = 1; attempt <= CONNECTION_RETRIES_LIMIT; attempt++) {
11764
+ try {
11765
+ return await requestFn();
11766
+ }
11767
+ catch (error) {
11768
+ assertsError(error);
11769
+ lastError = error;
11770
+ // Check if this is a retryable network error
11771
+ const isRetryableError = this.isRetryableNetworkError(error);
11772
+ if (!isRetryableError || attempt === CONNECTION_RETRIES_LIMIT) {
11773
+ if (this.options.isVerbose && this.isRetryableNetworkError(error)) {
11774
+ console.info(colors__default["default"].bgRed('Final network error after retries'), `Attempt ${attempt}/${CONNECTION_RETRIES_LIMIT}:`, error);
11775
+ }
11776
+ throw error;
11777
+ }
11778
+ // Calculate exponential backoff delay
11779
+ const baseDelay = 1000; // 1 second
11780
+ const backoffDelay = baseDelay * Math.pow(2, attempt - 1);
11781
+ const jitterDelay = Math.random() * 500; // Add some randomness
11782
+ const totalDelay = backoffDelay + jitterDelay;
11783
+ if (this.options.isVerbose) {
11784
+ console.info(colors__default["default"].bgYellow('Retrying network request'), `Attempt ${attempt}/${CONNECTION_RETRIES_LIMIT}, waiting ${Math.round(totalDelay)}ms:`, error.message);
11785
+ }
11786
+ // Wait before retrying
11787
+ await new Promise((resolve) => setTimeout(resolve, totalDelay));
11788
+ }
11789
+ }
11790
+ throw lastError;
11791
+ }
11792
+ /**
11793
+ * Determines if an error is retryable (network-related errors)
11794
+ */
11795
+ isRetryableNetworkError(error) {
11796
+ const errorMessage = error.message.toLowerCase();
11797
+ const errorCode = error.code;
11798
+ // Network connection errors that should be retried
11799
+ const retryableErrors = [
11800
+ 'econnreset',
11801
+ 'enotfound',
11802
+ 'econnrefused',
11803
+ 'etimedout',
11804
+ 'socket hang up',
11805
+ 'network error',
11806
+ 'fetch failed',
11807
+ 'connection reset',
11808
+ 'connection refused',
11809
+ 'timeout',
11810
+ ];
11811
+ // Check error message
11812
+ if (retryableErrors.some((retryableError) => errorMessage.includes(retryableError))) {
11813
+ return true;
11814
+ }
11815
+ // Check error code
11816
+ if (errorCode && retryableErrors.includes(errorCode.toLowerCase())) {
11817
+ return true;
11818
+ }
11819
+ // Check for specific HTTP status codes that are retryable
11820
+ const errorWithStatus = error;
11821
+ const httpStatus = errorWithStatus.status || errorWithStatus.statusCode;
11822
+ if (httpStatus && [429, 500, 502, 503, 504].includes(httpStatus)) {
11823
+ return true;
11824
+ }
11825
+ return false;
11826
+ }
11827
+ }
11828
+ /**
11829
+ * TODO: [🛄] Some way how to re-wrap the errors from `OpenAiCompatibleExecutionTools`
11830
+ * TODO: [🛄] Maybe make custom `OpenAiCompatibleError`
11831
+ * TODO: [🧠][🈁] Maybe use `isDeterministic` from options
11832
+ * TODO: [🧠][🌰] Allow to pass `title` for tracking purposes
11833
+ * TODO: [🧠][🦢] Make reverse adapter from LlmExecutionTools to OpenAI-compatible:
11834
+ */
11835
+
11836
+ /**
11837
+ * Profile for OpenAI provider
11838
+ */
11839
+ const OPENAI_PROVIDER_PROFILE = {
11840
+ name: 'OPENAI',
11841
+ fullname: 'OpenAI GPT',
11842
+ color: '#10a37f',
11843
+ };
11844
+ /**
11845
+ * Execution Tools for calling OpenAI API
11846
+ *
11847
+ * @public exported from `@promptbook/openai`
11848
+ */
11849
+ class OpenAiExecutionTools extends OpenAiCompatibleExecutionTools {
11850
+ constructor() {
11851
+ super(...arguments);
11852
+ /**
11853
+ * Computes the usage of the OpenAI API based on the response from OpenAI
11854
+ */
11855
+ this.computeUsage = computeOpenAiUsage;
11856
+ // <- Note: [🤖] getDefaultXxxModel
11857
+ }
11858
+ /* <- TODO: [🍚] `, Destroyable` */
11859
+ get title() {
11860
+ return 'OpenAI';
11861
+ }
11862
+ get description() {
11863
+ return 'Use all models provided by OpenAI';
11864
+ }
11865
+ get profile() {
11866
+ return OPENAI_PROVIDER_PROFILE;
11867
+ }
11868
+ /*
11869
+ Note: Commenting this out to avoid circular dependency
11870
+ /**
11871
+ * Create (sub)tools for calling OpenAI API Assistants
11872
+ *
11873
+ * @param assistantId Which assistant to use
11874
+ * @returns Tools for calling OpenAI API Assistants with same token
11875
+ * /
11876
+ public createAssistantSubtools(assistantId: string_token): OpenAiAssistantExecutionTools {
11877
+ return new OpenAiAssistantExecutionTools({ ...this.options, assistantId });
11878
+ }
11879
+ */
11880
+ /**
11881
+ * List all available models (non dynamically)
11882
+ *
11883
+ * Note: Purpose of this is to provide more information about models than standard listing from API
11884
+ */
11885
+ get HARDCODED_MODELS() {
11886
+ return OPENAI_MODELS;
11887
+ }
11888
+ /**
11889
+ * Default model for chat variant.
11890
+ */
11891
+ getDefaultChatModel() {
11892
+ return this.getDefaultModel('gpt-5');
11893
+ }
11894
+ /**
11895
+ * Default model for completion variant.
11896
+ */
11897
+ getDefaultCompletionModel() {
11898
+ return this.getDefaultModel('gpt-3.5-turbo-instruct');
11899
+ }
11900
+ /**
11901
+ * Default model for completion variant.
11902
+ */
11903
+ getDefaultEmbeddingModel() {
11904
+ return this.getDefaultModel('text-embedding-3-large');
11905
+ }
11906
+ }
11907
+
11908
+ /**
11909
+ * Execution Tools for calling OpenAI API Assistants
11910
+ *
11911
+ * This is useful for calling OpenAI API with a single assistant, for more wide usage use `OpenAiExecutionTools`.
11912
+ *
11913
+ * @public exported from `@promptbook/openai`
11914
+ */
11915
+ class OpenAiAssistantExecutionTools extends OpenAiExecutionTools {
11916
+ /**
11917
+ * Creates OpenAI Execution Tools.
11918
+ *
11919
+ * @param options which are relevant are directly passed to the OpenAI client
11920
+ */
11921
+ constructor(options) {
11922
+ var _a;
11923
+ if (options.isProxied) {
11924
+ throw new NotYetImplementedError(`Proxy mode is not yet implemented for OpenAI assistants`);
11925
+ }
11926
+ super(options);
11927
+ this.isCreatingNewAssistantsAllowed = false;
11928
+ this.assistantId = options.assistantId;
11929
+ this.isCreatingNewAssistantsAllowed = (_a = options.isCreatingNewAssistantsAllowed) !== null && _a !== void 0 ? _a : false;
11930
+ if (this.assistantId === null && !this.isCreatingNewAssistantsAllowed) {
11931
+ throw new NotAllowed(`Assistant ID is null and creating new assistants is not allowed - this configuration does not make sense`);
11932
+ }
11933
+ // <- TODO: !!! `OpenAiAssistantExecutionToolsOptions` - Allow `assistantId: null` together with `isCreatingNewAssistantsAllowed: true`
11934
+ // TODO: [👱] Make limiter same as in `OpenAiExecutionTools`
11935
+ }
11936
+ get title() {
11937
+ return 'OpenAI Assistant';
11938
+ }
11939
+ get description() {
11940
+ return 'Use single assistant provided by OpenAI';
11941
+ }
11942
+ /**
11943
+ * Calls OpenAI API to use a chat model.
11944
+ */
11945
+ async callChatModel(prompt) {
11946
+ var _a, _b, _c;
11947
+ if (this.options.isVerbose) {
11948
+ console.info('💬 OpenAI callChatModel call', { prompt });
11949
+ }
11950
+ const { content, parameters, modelRequirements /*, format*/ } = prompt;
11951
+ const client = await this.getClient();
11952
+ // TODO: [☂] Use here more modelRequirements
11953
+ if (modelRequirements.modelVariant !== 'CHAT') {
11954
+ throw new PipelineExecutionError('Use callChatModel only for CHAT variant');
11955
+ }
11956
+ // TODO: [👨‍👨‍👧‍👧] Remove:
11957
+ for (const key of ['maxTokens', 'modelName', 'seed', 'temperature']) {
11958
+ if (modelRequirements[key] !== undefined) {
11959
+ throw new NotYetImplementedError(`In \`OpenAiAssistantExecutionTools\` you cannot specify \`${key}\``);
11960
+ }
11961
+ }
11962
+ /*
11963
+ TODO: [👨‍👨‍👧‍👧] Implement all of this for Assistants
11964
+ const modelName = modelRequirements.modelName || this.getDefaultChatModel().modelName;
11965
+ const modelSettings = {
11966
+ model: modelName,
11967
+
11968
+ temperature: modelRequirements.temperature,
11969
+
11970
+ // <- TODO: [🈁] Use `seed` here AND/OR use is `isDeterministic` for entire execution tools
11971
+ // <- Note: [🧆]
11972
+ } as OpenAI.Chat.Completions.CompletionCreateParamsNonStreaming; // <- TODO: Guard here types better
11973
+
11974
+ if (format === 'JSON') {
11975
+ modelSettings.response_format = {
11976
+ type: 'json_object',
11977
+ };
11978
+ }
11979
+ */
11980
+ // <- TODO: [🚸] Not all models are compatible with JSON mode
11981
+ // > 'response_format' of type 'json_object' is not supported with this model.
11982
+ const rawPromptContent = templateParameters(content, {
11983
+ ...parameters,
11984
+ modelName: 'assistant',
11985
+ // <- [🧠] What is the best value here
11986
+ });
11987
+ const rawRequest = {
11988
+ // TODO: [👨‍👨‍👧‍👧] ...modelSettings,
11989
+ // TODO: [👨‍👨‍👧‍👧][🧠] What about system message for assistants, does it make sense - combination of OpenAI assistants with Promptbook Personas
11990
+ assistant_id: this.assistantId,
11991
+ thread: {
11992
+ messages: 'thread' in prompt &&
11993
+ Array.isArray(prompt.thread)
11994
+ ? prompt.thread.map((msg) => ({
11995
+ role: msg.role === 'assistant' ? 'assistant' : 'user',
11996
+ content: msg.content,
11997
+ }))
11998
+ : [{ role: 'user', content: rawPromptContent }],
11999
+ },
12000
+ // <- TODO: Add user identification here> user: this.options.user,
12001
+ };
12002
+ const start = $getCurrentDate();
12003
+ let complete;
12004
+ if (this.options.isVerbose) {
12005
+ console.info(colors__default["default"].bgWhite('rawRequest'), JSON.stringify(rawRequest, null, 4));
12006
+ }
12007
+ const stream = await client.beta.threads.createAndRunStream(rawRequest);
12008
+ stream.on('connect', () => {
12009
+ if (this.options.isVerbose) {
12010
+ console.info('connect', stream.currentEvent);
12011
+ }
12012
+ });
12013
+ stream.on('messageDelta', (messageDelta) => {
12014
+ var _a;
12015
+ if (this.options.isVerbose &&
12016
+ messageDelta &&
12017
+ messageDelta.content &&
12018
+ messageDelta.content[0] &&
12019
+ messageDelta.content[0].type === 'text') {
12020
+ console.info('messageDelta', (_a = messageDelta.content[0].text) === null || _a === void 0 ? void 0 : _a.value);
12021
+ }
12022
+ // <- TODO: [🐚] Make streaming and running tasks working
12023
+ });
12024
+ stream.on('messageCreated', (message) => {
12025
+ if (this.options.isVerbose) {
12026
+ console.info('messageCreated', message);
12027
+ }
12028
+ });
12029
+ stream.on('messageDone', (message) => {
12030
+ if (this.options.isVerbose) {
12031
+ console.info('messageDone', message);
12032
+ }
12033
+ });
12034
+ const rawResponse = await stream.finalMessages();
12035
+ if (this.options.isVerbose) {
12036
+ console.info(colors__default["default"].bgWhite('rawResponse'), JSON.stringify(rawResponse, null, 4));
12037
+ }
12038
+ if (rawResponse.length !== 1) {
12039
+ throw new PipelineExecutionError(`There is NOT 1 BUT ${rawResponse.length} finalMessages from OpenAI`);
12040
+ }
12041
+ if (rawResponse[0].content.length !== 1) {
12042
+ throw new PipelineExecutionError(`There is NOT 1 BUT ${rawResponse[0].content.length} finalMessages content from OpenAI`);
12043
+ }
12044
+ if (((_a = rawResponse[0].content[0]) === null || _a === void 0 ? void 0 : _a.type) !== 'text') {
12045
+ throw new PipelineExecutionError(`There is NOT 'text' BUT ${(_b = rawResponse[0].content[0]) === null || _b === void 0 ? void 0 : _b.type} finalMessages content type from OpenAI`);
12046
+ }
12047
+ const resultContent = (_c = rawResponse[0].content[0]) === null || _c === void 0 ? void 0 : _c.text.value;
12048
+ // <- TODO: [🧠] There are also annotations, maybe use them
12049
+ // eslint-disable-next-line prefer-const
12050
+ complete = $getCurrentDate();
12051
+ const usage = UNCERTAIN_USAGE;
12052
+ // <- TODO: [🥘] Compute real usage for assistant
12053
+ // ?> const usage = computeOpenAiUsage(content, resultContent || '', rawResponse);
12054
+ if (resultContent === null) {
12055
+ throw new PipelineExecutionError('No response message from OpenAI');
12056
+ }
12057
+ return exportJson({
12058
+ name: 'promptResult',
12059
+ message: `Result of \`OpenAiAssistantExecutionTools.callChatModel\``,
12060
+ order: [],
12061
+ value: {
12062
+ content: resultContent,
12063
+ modelName: 'assistant',
12064
+ // <- TODO: [🥘] Detect used model in assistant
12065
+ // ?> model: rawResponse.model || modelName,
12066
+ timing: {
12067
+ start,
12068
+ complete,
12069
+ },
12070
+ usage,
12071
+ rawPromptContent,
12072
+ rawRequest,
12073
+ rawResponse,
12074
+ // <- [🗯]
12075
+ },
12076
+ });
12077
+ }
12078
+ async createNewAssistant() {
12079
+ if (!this.isCreatingNewAssistantsAllowed) {
12080
+ throw new NotAllowed(`Creating new assistants is not allowed. Set \`isCreatingNewAssistantsAllowed: true\` in options to enable this feature.`);
12081
+ }
12082
+ const client = await this.getClient();
12083
+ /*
12084
+ TODO: !!!
12085
+ async function downloadFile(url: string, folder = './tmp'): Promise<string> {
12086
+ const filename = path.basename(url.split('?')[0]);
12087
+ const filepath = path.join(folder, filename);
12088
+
12089
+ if (!fs.existsSync(folder)) fs.mkdirSync(folder);
12090
+
12091
+ const res = await fetch(url);
12092
+ if (!res.ok) throw new Error(`Download error: ${url}`);
12093
+ const buffer = await res.arrayBuffer();
12094
+ fs.writeFileSync(filepath, Buffer.from(buffer));
12095
+ console.log(`📥 File downloaded: ${filename}`);
12096
+
12097
+ return filepath;
12098
+ }
12099
+
12100
+ async function uploadFileToOpenAI(filepath: string) {
12101
+ const file = await client.files.create({
12102
+ file: fs.createReadStream(filepath),
12103
+ purpose: 'assistants',
12104
+ });
12105
+ console.log(`⬆️ File uploaded to OpenAI: ${file.filename} (${file.id})`);
12106
+ return file;
12107
+ }
12108
+
12109
+ // 🌐 URL addresses of files to upload
12110
+ const fileUrls = [
12111
+ 'https://raw.githubusercontent.com/vercel/next.js/canary/packages/next/README.md',
12112
+ 'https://raw.githubusercontent.com/openai/openai-cookbook/main/examples/How_to_call_the_Assistants_API_with_Node.js.ipynb',
12113
+ ];
12114
+
12115
+ // 1️⃣ Download files from URL
12116
+ const localFiles = [];
12117
+ for (const url of fileUrls) {
12118
+ const filepath = await downloadFile(url);
12119
+ localFiles.push(filepath);
12120
+ }
12121
+
12122
+ // 2️⃣ Upload files to OpenAI
12123
+ const uploadedFiles = [];
12124
+ for (const filepath of localFiles) {
12125
+ const file = await uploadFileToOpenAI(filepath);
12126
+ uploadedFiles.push(file.id);
12127
+ }
12128
+ */
12129
+ // 3️⃣ Create assistant with uploaded files
12130
+ const assistant = await client.beta.assistants.create({
12131
+ name: 'Next.js documentation assistant',
12132
+ description: 'Assistant that can answer questions about Next.js and working with APIs.',
12133
+ model: 'gpt-4o',
12134
+ instructions: spaceTrim__default["default"](`
12135
+ Answer clearly and comprehensively.
12136
+ Quote parts from uploaded files if needed.
12137
+ `),
12138
+ // <- TODO: !!!! Generate the `instructions` from passed `agentSource` (generate outside of this class)
12139
+ tools: [{ type: 'code_interpreter' }, { type: 'file_search' }],
12140
+ // !!!! file_ids: uploadedFiles,
12141
+ });
12142
+ // TODO: !!!! Change Czech to English
12143
+ console.log(`✅ Assistant created: ${assistant.id}`);
12144
+ return new OpenAiAssistantExecutionTools({
12145
+ ...this.options,
12146
+ isCreatingNewAssistantsAllowed: false,
12147
+ assistantId: assistant.id,
12148
+ });
12149
+ }
12150
+ /**
12151
+ * Discriminant for type guards
12152
+ */
12153
+ get discriminant() {
12154
+ return DISCRIMINANT;
12155
+ }
12156
+ /**
12157
+ * Type guard to check if given `LlmExecutionTools` are instanceof `OpenAiAssistantExecutionTools`
12158
+ *
12159
+ * Note: This is useful when you can possibly have multiple versions of `@promptbook/openai` installed
12160
+ */
12161
+ static isOpenAiAssistantExecutionTools(llmExecutionTools) {
12162
+ return llmExecutionTools.discriminant === DISCRIMINANT;
12163
+ }
12164
+ }
12165
+ /**
12166
+ * Discriminant for type guards
12167
+ *
12168
+ * @private const of `OpenAiAssistantExecutionTools`
12169
+ */
12170
+ const DISCRIMINANT = 'OPEN_AI_ASSISTANT_V1';
12171
+ /**
12172
+ * TODO: [🧠][🧙‍♂️] Maybe there can be some wizard for those who want to use just OpenAI
12173
+ * TODO: Maybe make custom OpenAiError
12174
+ * TODO: [🧠][🈁] Maybe use `isDeterministic` from options
12175
+ * TODO: [🧠][🌰] Allow to pass `title` for tracking purposes
12176
+ */
12177
+
12178
+ /**
12179
+ * Execution Tools for calling LLM models with a predefined agent "soul"
12180
+ * This wraps underlying LLM execution tools and applies agent-specific system prompts and requirements
12181
+ *
12182
+ * @public exported from `@promptbook/core`
12183
+ */
12184
+ class AgentLlmExecutionTools {
12185
+ /**
12186
+ * Creates new AgentLlmExecutionTools
12187
+ *
12188
+ * @param llmTools The underlying LLM execution tools to wrap
12189
+ * @param agentSource The agent source string that defines the agent's behavior
12190
+ */
12191
+ constructor(llmTools, agentSource) {
12192
+ this.llmTools = llmTools;
12193
+ this.agentSource = agentSource;
12194
+ /**
12195
+ * Cached model requirements to avoid re-parsing the agent source
12196
+ */
12197
+ this._cachedModelRequirements = null;
12198
+ /**
12199
+ * Cached parsed agent information
12200
+ */
12201
+ this._cachedAgentInfo = null;
12202
+ // <- TODO: !!!! CreateAgentLlmExecutionToolsOptions
12203
+ // <- TODO: !!!! Leverage `OpenAiAssistantExecutionTools`
12204
+ }
12205
+ /**
12206
+ * Get cached or parse agent information
12207
+ */
12208
+ getAgentInfo() {
12209
+ if (this._cachedAgentInfo === null) {
12210
+ this._cachedAgentInfo = parseAgentSource(this.agentSource);
12211
+ }
12212
+ return this._cachedAgentInfo;
12213
+ }
12214
+ /**
12215
+ * Get cached or create agent model requirements
12216
+ */
12217
+ async getAgentModelRequirements() {
12218
+ if (this._cachedModelRequirements === null) {
12219
+ // Get available models from underlying LLM tools for best model selection
12220
+ const availableModels = await this.llmTools.listModels();
12221
+ this._cachedModelRequirements = await createAgentModelRequirements(this.agentSource, undefined, // Let the function pick the best model
12222
+ availableModels);
12223
+ }
12224
+ return this._cachedModelRequirements;
12225
+ }
12226
+ get title() {
12227
+ const agentInfo = this.getAgentInfo();
12228
+ return (agentInfo.agentName || 'Agent');
12229
+ }
12230
+ get description() {
12231
+ const agentInfo = this.getAgentInfo();
12232
+ return agentInfo.personaDescription || 'AI Agent with predefined personality and behavior';
12233
+ }
12234
+ get profile() {
12235
+ const agentInfo = this.getAgentInfo();
12236
+ if (!agentInfo.agentName) {
12237
+ return undefined;
12238
+ }
12239
+ return {
12240
+ name: agentInfo.agentName.toUpperCase().replace(/\s+/g, '_'),
12241
+ fullname: agentInfo.agentName,
12242
+ color: agentInfo.meta.color || '#6366f1',
12243
+ avatarSrc: agentInfo.meta.image,
12244
+ };
12245
+ }
12246
+ checkConfiguration() {
12247
+ // Check underlying tools configuration
12248
+ return this.llmTools.checkConfiguration();
12249
+ }
12250
+ /**
12251
+ * Returns a virtual model name representing the agent behavior
12252
+ */
12253
+ get modelName() {
12254
+ const hash = cryptoJs.SHA256(hexEncoder__default["default"].parse(this.agentSource))
12255
+ // <- TODO: [🥬] Encapsulate sha256 to some private utility function
12256
+ .toString( /* hex */);
12257
+ // <- TODO: [🥬] Make some system for hashes and ids of promptbook
12258
+ const agentId = hash.substring(0, 10);
12259
+ // <- TODO: [🥬] Make some system for hashes and ids of promptbook
12260
+ return (normalizeToKebabCase(this.title) + '-' + agentId);
12261
+ }
12262
+ listModels() {
12263
+ return [
12264
+ {
12265
+ modelName: this.modelName,
12266
+ modelVariant: 'CHAT',
12267
+ modelTitle: `${this.title} (Agent Chat Default)`,
12268
+ modelDescription: `Chat model with agent behavior: ${this.description}`,
12269
+ },
12270
+ // <- Note: We only list a single "virtual" agent model here as this wrapper only supports chat prompts
12271
+ ];
12272
+ }
12273
+ /**
12274
+ * Calls the chat model with agent-specific system prompt and requirements
12275
+ */
12276
+ async callChatModel(prompt) {
12277
+ if (!this.llmTools.callChatModel) {
12278
+ throw new Error('Underlying LLM execution tools do not support chat model calls');
12279
+ }
12280
+ // Ensure we're working with a chat prompt
12281
+ if (prompt.modelRequirements.modelVariant !== 'CHAT') {
12282
+ throw new Error('AgentLlmExecutionTools only supports chat prompts');
12283
+ }
12284
+ const chatPrompt = prompt;
12285
+ let underlyingLlmResult;
12286
+ if (OpenAiAssistantExecutionTools.isOpenAiAssistantExecutionTools(this.llmTools)) {
12287
+ // <- TODO: !!! Check also `isCreatingNewAssistantsAllowed` and warn about it
12288
+ const assistant = await this.llmTools.createNewAssistant( /* <- TODO: !!!! Generate the `instructions` from passed `agentSource` */);
12289
+ // <- TODO: !!! Cache the assistant in prepareCache
12290
+ underlyingLlmResult = await assistant.callChatModel(chatPrompt);
12291
+ }
12292
+ else {
12293
+ // Get agent model requirements (cached with best model selection)
12294
+ const modelRequirements = await this.getAgentModelRequirements();
12295
+ // Create modified chat prompt with agent system message
12296
+ const modifiedChatPrompt = {
12297
+ ...chatPrompt,
12298
+ modelRequirements: {
12299
+ ...chatPrompt.modelRequirements,
12300
+ ...modelRequirements,
12301
+ // Prepend agent system message to existing system message
12302
+ systemMessage: modelRequirements.systemMessage +
12303
+ (chatPrompt.modelRequirements.systemMessage
12304
+ ? `\n\n${chatPrompt.modelRequirements.systemMessage}`
12305
+ : ''),
12306
+ },
12307
+ };
12308
+ underlyingLlmResult = await this.llmTools.callChatModel(modifiedChatPrompt);
12309
+ }
12310
+ let content = underlyingLlmResult.content;
12311
+ // Note: Cleanup the AI artifacts from the content
12312
+ content = humanizeAiText(content);
12313
+ // Note: Make sure the content is Promptbook-like
12314
+ content = promptbookifyAiText(content);
12315
+ const agentResult = {
12316
+ ...underlyingLlmResult,
12317
+ content,
12318
+ modelName: this.modelName,
12319
+ };
12320
+ return agentResult;
12321
+ }
12322
+ }
12323
+ /**
12324
+ * TODO: [🍚] Implement Destroyable pattern to free resources
12325
+ * TODO: [🧠] Adding parameter substitution support (here or should be responsibility of the underlying LLM Tools)
12326
+ */
12327
+
12328
+ /**
12329
+ * Creates new AgentLlmExecutionTools that wrap underlying LLM tools with agent-specific behavior
12330
+ *
12331
+ * @public exported from `@promptbook/core`
12332
+ */
12333
+ const createAgentLlmExecutionTools = Object.assign((options) => {
12334
+ /*
12335
+ if (llmTools instanceof OpenAiAssistantExecutionTools) {
12336
+ // !!!!! Leverage `OpenAiAssistantExecutionTools` specific features here
12337
+ }*/
12338
+ return new AgentLlmExecutionTools(options.llmTools, options.agentSource);
12339
+ }, {
12340
+ packageName: '@promptbook/core',
12341
+ className: 'AgentLlmExecutionTools',
12342
+ });
12343
+ /**
12344
+ * TODO: [🧠] Consider adding validation for agent source format
12345
+ * TODO: [🧠] Consider adding options for caching behavior
12346
+ */
12347
+
12348
+ /**
12349
+ * Metadata for Agent LLM execution tools
12350
+ *
12351
+ * @public exported from `@promptbook/core`
12352
+ */
12353
+ $llmToolsMetadataRegister.register({
12354
+ packageName: '@promptbook/core',
12355
+ className: 'AgentLlmExecutionTools',
12356
+ title: 'Agent',
12357
+ trustLevel: 'UNTRUSTED',
12358
+ order: MODEL_ORDERS.LOW_TIER,
12359
+ envVariables: null,
12360
+ getBoilerplateConfiguration() {
12361
+ return {
12362
+ packageName: '@promptbook/core',
12363
+ className: 'AgentLlmExecutionTools',
12364
+ title: 'Agent',
12365
+ options: {
12366
+ // Note: Agent tools require runtime configuration with underlying tools and agent source
12367
+ // This cannot be provided as a static configuration
12368
+ },
12369
+ };
12370
+ },
12371
+ createConfigurationFromEnv() {
12372
+ // Agent tools cannot be configured from environment variables alone
12373
+ // They require underlying LLM tools and agent source to be provided programmatically
12374
+ return null;
12375
+ },
12376
+ });
12377
+ /**
12378
+ * TODO: [🧠] Consider adding a special trust level for AgentLlmExecutionTools
12379
+ * TODO: [🎶] Naming "constructor" vs "creator" vs "factory"
12380
+ * Note: [💞] Ignore a discrepancy between file name and entity name
12381
+ */
12382
+
12383
+ /**
12384
+ * Registration of Agent LLM provider
12385
+ *
12386
+ * Warning: This is not useful for the end user, it is just a side effect of the mechanism that handles all available LLM tools
12387
+ *
12388
+ * @public exported from `@promptbook/core`
12389
+ */
12390
+ $llmToolsRegister.register(createAgentLlmExecutionTools);
12391
+ /**
12392
+ * TODO: [🎶] Naming "constructor" vs "creator" vs "factory"
12393
+ * Note: [💞] Ignore a discrepancy between file name and entity name
12394
+ */
12395
+
12396
+ /**
12397
+ * Registration of LLM provider metadata
12398
+ *
12399
+ * Warning: This is not useful for the end user, it is just a side effect of the mechanism that handles all available LLM tools
12400
+ *
12401
+ * @public exported from `@promptbook/core`
12402
+ * @public exported from `@promptbook/wizard`
12403
+ * @public exported from `@promptbook/cli`
12404
+ */
12405
+ $llmToolsMetadataRegister.register({
12406
+ title: 'Anthropic Claude',
12407
+ packageName: '@promptbook/anthropic-claude',
12408
+ className: 'AnthropicClaudeExecutionTools',
12409
+ envVariables: ['ANTHROPIC_CLAUDE_API_KEY'],
12410
+ trustLevel: 'CLOSED',
12411
+ order: MODEL_ORDERS.TOP_TIER,
12412
+ getBoilerplateConfiguration() {
12413
+ return {
12414
+ title: 'Anthropic Claude',
12415
+ packageName: '@promptbook/anthropic-claude',
12416
+ className: 'AnthropicClaudeExecutionTools',
12417
+ options: {
12418
+ apiKey: 'sk-ant-api03-',
12419
+ isProxied: true,
12420
+ remoteServerUrl: DEFAULT_REMOTE_SERVER_URL,
12421
+ maxRequestsPerMinute: DEFAULT_MAX_REQUESTS_PER_MINUTE,
12422
+ },
12423
+ };
12424
+ },
12425
+ createConfigurationFromEnv(env) {
12426
+ // Note: Note using `process.env` BUT `env` to pass in the environment variables dynamically
12427
+ if (typeof env.ANTHROPIC_CLAUDE_API_KEY === 'string') {
12428
+ return {
12429
+ title: 'Claude (from env)',
12430
+ packageName: '@promptbook/anthropic-claude',
12431
+ className: 'AnthropicClaudeExecutionTools',
12432
+ options: {
12433
+ apiKey: env.ANTHROPIC_CLAUDE_API_KEY,
12434
+ },
12435
+ };
12436
+ }
12437
+ return null;
12438
+ },
12439
+ });
12440
+ /**
12441
+ * Note: [💞] Ignore a discrepancy between file name and entity name
12442
+ */
12443
+
12444
+ /**
12445
+ * Registration of LLM provider metadata
12446
+ *
12447
+ * Warning: This is not useful for the end user, it is just a side effect of the mechanism that handles all available LLM tools
10693
12448
  *
10694
12449
  * @public exported from `@promptbook/core`
10695
12450
  * @public exported from `@promptbook/wizard`
@@ -11364,7 +13119,7 @@
11364
13119
  * Note: [🔵] Code in this file should never be published outside of `@promptbook/browser`
11365
13120
  */
11366
13121
 
11367
- var css_248z$4 = ".MarkdownContent-module_MarkdownContent__2JuyX h1{font-size:2em}.MarkdownContent-module_MarkdownContent__2JuyX h2{font-size:1.75em}.MarkdownContent-module_MarkdownContent__2JuyX h3{font-size:1.5em}.MarkdownContent-module_MarkdownContent__2JuyX h4{font-size:1.25em}.MarkdownContent-module_MarkdownContent__2JuyX h5{font-size:1.1em}.MarkdownContent-module_MarkdownContent__2JuyX ul{list-style:disc;margin-left:20px}.MarkdownContent-module_MarkdownContent__2JuyX ol{list-style:decimal;margin-left:20px}.MarkdownContent-module_MarkdownContent__2JuyX blockquote,.MarkdownContent-module_MarkdownContent__2JuyX img,.MarkdownContent-module_MarkdownContent__2JuyX pre,.MarkdownContent-module_MarkdownContent__2JuyX table{border-radius:8px;margin-bottom:10px;margin-top:10px}.MarkdownContent-module_MarkdownContent__2JuyX pre{background:#000;border:none;box-shadow:none;color:#fff;display:block;font-size:inherit;line-height:inherit;padding:1em}.MarkdownContent-module_MarkdownContent__2JuyX blockquote{background:#ffffffcc;border:none;box-shadow:none;color:#000;display:block;font-size:inherit;line-height:inherit;padding:1em}.MarkdownContent-module_MarkdownContent__2JuyX code{background:#cccccc55;border:none;box-shadow:none;color:inherit;display:inline-block;font-size:inherit;line-height:inherit;margin:0;padding:0}.MarkdownContent-module_MarkdownContent__2JuyX pre code{background-color:#000000cc;border-radius:8px}.MarkdownContent-module_MarkdownContent__2JuyX .MarkdownContent-module_chat-code-block__ZffFg{background:#181c23;border-color:#23272f;box-shadow:0 2px 8px rgba(0,0,0,.12);color:#f8fafc;font-family:Fira Mono,Menlo,Consolas,Liberation Mono,monospace;font-size:14px;line-height:1.6;overflow-x:auto}.MarkdownContent-module_MarkdownContent__2JuyX .MarkdownContent-module_chat-code-block__ZffFg code{background:none!important;border:none!important;box-shadow:none!important;color:inherit!important;display:block;font-family:inherit!important;font-size:inherit!important;overflow-x:auto;padding:0!important;white-space:pre;word-break:break-word}.MarkdownContent-module_MarkdownContent__2JuyX table{background:#f8fafc;border-collapse:separate;border-spacing:0;box-shadow:0 2px 8px rgba(0,0,0,.08);color:#17223b;font-size:14px;margin:16px 0;width:100%}.MarkdownContent-module_MarkdownContent__2JuyX td,.MarkdownContent-module_MarkdownContent__2JuyX th{background:none;border-bottom:1px solid #d1dbe8;color:#17223b;padding:10px 16px;text-align:left}.MarkdownContent-module_MarkdownContent__2JuyX th{background:linear-gradient(90deg,#eaf3fa 80%,#d1e3f8);border-bottom:2px solid #b5c7de;color:#17223b;font-weight:700}.MarkdownContent-module_MarkdownContent__2JuyX tr:last-child td{border-bottom:none}.MarkdownContent-module_MarkdownContent__2JuyX tr:nth-child(2n) td{background:#eaf3fa}.MarkdownContent-module_MarkdownContent__2JuyX tr:hover td{background:#cbe0f7;transition:background .2s}.MarkdownContent-module_MarkdownContent__2JuyX table{border-radius:12px;overflow:hidden}.MarkdownContent-module_MarkdownContent__2JuyX td:first-child,.MarkdownContent-module_MarkdownContent__2JuyX th:first-child{border-top-left-radius:12px}.MarkdownContent-module_MarkdownContent__2JuyX td:last-child,.MarkdownContent-module_MarkdownContent__2JuyX th:last-child{border-top-right-radius:12px}\n/*# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIk1hcmtkb3duQ29udGVudC5tb2R1bGUuY3NzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLGtEQUNJLGFBQ0osQ0FFQSxrREFDSSxnQkFDSixDQUVBLGtEQUNJLGVBQ0osQ0FFQSxrREFDSSxnQkFDSixDQUVBLGtEQUNJLGVBQ0osQ0FFQSxrREFDSSxlQUFnQixDQUNoQixnQkFDSixDQUVBLGtEQUNJLGtCQUFtQixDQUNuQixnQkFDSixDQUVBLHFOQU1JLGlCQUFrQixDQURsQixrQkFBbUIsQ0FEbkIsZUFHSixDQUVBLG1EQUlJLGVBQXFCLENBRnJCLFdBQVksQ0FDWixlQUFnQixDQUloQixVQUFXLENBTlgsYUFBYyxDQUlkLGlCQUFrQixDQUNsQixtQkFBb0IsQ0FFcEIsV0FDSixDQUVBLDBEQUlJLG9CQUFxQixDQUZyQixXQUFZLENBQ1osZUFBZ0IsQ0FJaEIsVUFBVyxDQU5YLGFBQWMsQ0FJZCxpQkFBa0IsQ0FDbEIsbUJBQW9CLENBRXBCLFdBQ0osQ0FFQSxvREFNSSxvQkFBcUIsQ0FGckIsV0FBWSxDQUNaLGVBQWdCLENBSWhCLGFBQWMsQ0FSZCxvQkFBcUIsQ0FNckIsaUJBQWtCLENBQ2xCLG1CQUFvQixDQU5wQixRQUFTLENBQ1QsU0FPSixDQUVBLHdEQUNJLDBCQUEyQixDQUMzQixpQkFDSixDQUVBLDhGQUNJLGtCQUFtQixDQUtuQixvQkFBcUIsQ0FDckIsb0NBQXlDLENBTHpDLGFBQWMsQ0FNZCw4REFBMkUsQ0FMM0UsY0FBZSxDQUNmLGVBQWdCLENBQ2hCLGVBSUosQ0FDQSxtR0FDSSx5QkFBMkIsQ0FLM0IscUJBQXVCLENBQ3ZCLHlCQUEyQixDQUwzQix1QkFBeUIsQ0FTekIsYUFBYyxDQVJkLDZCQUErQixDQUMvQiwyQkFBNkIsQ0FNN0IsZUFBZ0IsQ0FMaEIsbUJBQXFCLENBR3JCLGVBQWdCLENBQ2hCLHFCQUdKLENBQ0EscURBS0ksa0JBQW1CLENBSG5CLHdCQUF5QixDQUN6QixnQkFBaUIsQ0FLakIsb0NBQXlDLENBRXpDLGFBQWMsQ0FEZCxjQUFlLENBTGYsYUFBYyxDQUhkLFVBVUosQ0FDQSxvR0FNSSxlQUFnQixDQUhoQiwrQkFBZ0MsQ0FFaEMsYUFBYyxDQUhkLGlCQUFrQixDQUVsQixlQUdKLENBQ0Esa0RBQ0kscURBQTZELENBRzdELCtCQUFnQyxDQURoQyxhQUFjLENBRGQsZUFHSixDQUNBLGdFQUNJLGtCQUNKLENBQ0EsbUVBQ0ksa0JBQ0osQ0FDQSwyREFDSSxrQkFBbUIsQ0FDbkIseUJBQ0osQ0FDQSxxREFDSSxrQkFBbUIsQ0FDbkIsZUFDSixDQUNBLDRIQUVJLDJCQUNKLENBQ0EsMEhBRUksNEJBQ0oiLCJmaWxlIjoiTWFya2Rvd25Db250ZW50Lm1vZHVsZS5jc3MiLCJzb3VyY2VzQ29udGVudCI6WyIuTWFya2Rvd25Db250ZW50IGgxIHtcbiAgICBmb250LXNpemU6IDJlbTtcbn1cblxuLk1hcmtkb3duQ29udGVudCBoMiB7XG4gICAgZm9udC1zaXplOiAxLjc1ZW07XG59XG5cbi5NYXJrZG93bkNvbnRlbnQgaDMge1xuICAgIGZvbnQtc2l6ZTogMS41ZW07XG59XG5cbi5NYXJrZG93bkNvbnRlbnQgaDQge1xuICAgIGZvbnQtc2l6ZTogMS4yNWVtO1xufVxuXG4uTWFya2Rvd25Db250ZW50IGg1IHtcbiAgICBmb250LXNpemU6IDEuMWVtO1xufVxuXG4uTWFya2Rvd25Db250ZW50IHVsIHtcbiAgICBsaXN0LXN0eWxlOiBkaXNjO1xuICAgIG1hcmdpbi1sZWZ0OiAyMHB4O1xufVxuXG4uTWFya2Rvd25Db250ZW50IG9sIHtcbiAgICBsaXN0LXN0eWxlOiBkZWNpbWFsO1xuICAgIG1hcmdpbi1sZWZ0OiAyMHB4O1xufVxuXG4uTWFya2Rvd25Db250ZW50IGltZyxcbi5NYXJrZG93bkNvbnRlbnQgcHJlLFxuLk1hcmtkb3duQ29udGVudCBibG9ja3F1b3RlLFxuLk1hcmtkb3duQ29udGVudCB0YWJsZSB7XG4gICAgbWFyZ2luLXRvcDogMTBweDtcbiAgICBtYXJnaW4tYm90dG9tOiAxMHB4O1xuICAgIGJvcmRlci1yYWRpdXM6IDhweDtcbn1cblxuLk1hcmtkb3duQ29udGVudCBwcmUge1xuICAgIGRpc3BsYXk6IGJsb2NrO1xuICAgIGJvcmRlcjogbm9uZTtcbiAgICBib3gtc2hhZG93OiBub25lO1xuICAgIGJhY2tncm91bmQ6ICMwMDAwMDBmZjtcbiAgICBmb250LXNpemU6IGluaGVyaXQ7XG4gICAgbGluZS1oZWlnaHQ6IGluaGVyaXQ7XG4gICAgY29sb3I6ICNmZmY7XG4gICAgcGFkZGluZzogMWVtO1xufVxuXG4uTWFya2Rvd25Db250ZW50IGJsb2NrcXVvdGUge1xuICAgIGRpc3BsYXk6IGJsb2NrO1xuICAgIGJvcmRlcjogbm9uZTtcbiAgICBib3gtc2hhZG93OiBub25lO1xuICAgIGJhY2tncm91bmQ6ICNmZmZmZmZjYztcbiAgICBmb250LXNpemU6IGluaGVyaXQ7XG4gICAgbGluZS1oZWlnaHQ6IGluaGVyaXQ7XG4gICAgY29sb3I6ICMwMDA7XG4gICAgcGFkZGluZzogMWVtO1xufVxuXG4uTWFya2Rvd25Db250ZW50IGNvZGUge1xuICAgIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbiAgICBtYXJnaW46IDA7XG4gICAgcGFkZGluZzogMDtcbiAgICBib3JkZXI6IG5vbmU7XG4gICAgYm94LXNoYWRvdzogbm9uZTtcbiAgICBiYWNrZ3JvdW5kOiAjY2NjY2NjNTU7XG4gICAgZm9udC1zaXplOiBpbmhlcml0O1xuICAgIGxpbmUtaGVpZ2h0OiBpbmhlcml0O1xuICAgIGNvbG9yOiBpbmhlcml0O1xufVxuXG4uTWFya2Rvd25Db250ZW50IHByZSBjb2RlIHtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjMDAwMDAwY2M7XG4gICAgYm9yZGVyLXJhZGl1czogOHB4O1xufVxuXG4uTWFya2Rvd25Db250ZW50IC5jaGF0LWNvZGUtYmxvY2sge1xuICAgIGJhY2tncm91bmQ6ICMxODFjMjM7XG4gICAgY29sb3I6ICNmOGZhZmM7XG4gICAgZm9udC1zaXplOiAxNHB4O1xuICAgIGxpbmUtaGVpZ2h0OiAxLjY7XG4gICAgb3ZlcmZsb3cteDogYXV0bztcbiAgICBib3JkZXItY29sb3I6ICMyMzI3MmY7XG4gICAgYm94LXNoYWRvdzogMCAycHggOHB4IHJnYmEoMCwgMCwgMCwgMC4xMik7XG4gICAgZm9udC1mYW1pbHk6ICdGaXJhIE1vbm8nLCAnTWVubG8nLCAnQ29uc29sYXMnLCAnTGliZXJhdGlvbiBNb25vJywgbW9ub3NwYWNlO1xufVxuLk1hcmtkb3duQ29udGVudCAuY2hhdC1jb2RlLWJsb2NrIGNvZGUge1xuICAgIGJhY2tncm91bmQ6IG5vbmUgIWltcG9ydGFudDtcbiAgICBjb2xvcjogaW5oZXJpdCAhaW1wb3J0YW50O1xuICAgIGZvbnQtZmFtaWx5OiBpbmhlcml0ICFpbXBvcnRhbnQ7XG4gICAgZm9udC1zaXplOiBpbmhlcml0ICFpbXBvcnRhbnQ7XG4gICAgcGFkZGluZzogMCAhaW1wb3J0YW50O1xuICAgIGJvcmRlcjogbm9uZSAhaW1wb3J0YW50O1xuICAgIGJveC1zaGFkb3c6IG5vbmUgIWltcG9ydGFudDtcbiAgICB3aGl0ZS1zcGFjZTogcHJlO1xuICAgIHdvcmQtYnJlYWs6IGJyZWFrLXdvcmQ7XG4gICAgb3ZlcmZsb3cteDogYXV0bztcbiAgICBkaXNwbGF5OiBibG9jaztcbn1cbi5NYXJrZG93bkNvbnRlbnQgdGFibGUge1xuICAgIHdpZHRoOiAxMDAlO1xuICAgIGJvcmRlci1jb2xsYXBzZTogc2VwYXJhdGU7XG4gICAgYm9yZGVyLXNwYWNpbmc6IDA7XG4gICAgbWFyZ2luOiAxNnB4IDA7XG4gICAgYmFja2dyb3VuZDogI2Y4ZmFmYzsgLyogU3Ryb25nZXIgbGlnaHQgYmFja2dyb3VuZCBmb3IgY29udHJhc3QgKi9cbiAgICBib3JkZXItcmFkaXVzOiAxMnB4O1xuICAgIG92ZXJmbG93OiBoaWRkZW47XG4gICAgYm94LXNoYWRvdzogMCAycHggOHB4IHJnYmEoMCwgMCwgMCwgMC4wOCk7XG4gICAgZm9udC1zaXplOiAxNHB4O1xuICAgIGNvbG9yOiAjMTcyMjNiOyAvKiBEYXJrIHRleHQgZm9yIGNvbnRyYXN0ICovXG59XG4uTWFya2Rvd25Db250ZW50IHRoLFxuLk1hcmtkb3duQ29udGVudCB0ZCB7XG4gICAgcGFkZGluZzogMTBweCAxNnB4O1xuICAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCAjZDFkYmU4O1xuICAgIHRleHQtYWxpZ246IGxlZnQ7XG4gICAgY29sb3I6ICMxNzIyM2I7IC8qIEVuc3VyZSBzdHJvbmcgdGV4dCBjb2xvciBmb3IgYWxsIGNlbGxzICovXG4gICAgYmFja2dyb3VuZDogbm9uZTtcbn1cbi5NYXJrZG93bkNvbnRlbnQgdGgge1xuICAgIGJhY2tncm91bmQ6IGxpbmVhci1ncmFkaWVudCg5MGRlZywgI2VhZjNmYSA4MCUsICNkMWUzZjggMTAwJSk7XG4gICAgZm9udC13ZWlnaHQ6IDcwMDtcbiAgICBjb2xvcjogIzE3MjIzYjsgLyogU3Ryb25nIGhlYWRlciB0ZXh0ICovXG4gICAgYm9yZGVyLWJvdHRvbTogMnB4IHNvbGlkICNiNWM3ZGU7XG59XG4uTWFya2Rvd25Db250ZW50IHRyOmxhc3QtY2hpbGQgdGQge1xuICAgIGJvcmRlci1ib3R0b206IG5vbmU7XG59XG4uTWFya2Rvd25Db250ZW50IHRyOm50aC1jaGlsZChldmVuKSB0ZCB7XG4gICAgYmFja2dyb3VuZDogI2VhZjNmYTtcbn1cbi5NYXJrZG93bkNvbnRlbnQgdHI6aG92ZXIgdGQge1xuICAgIGJhY2tncm91bmQ6ICNjYmUwZjc7XG4gICAgdHJhbnNpdGlvbjogYmFja2dyb3VuZCAwLjJzO1xufVxuLk1hcmtkb3duQ29udGVudCB0YWJsZSB7XG4gICAgYm9yZGVyLXJhZGl1czogMTJweDtcbiAgICBvdmVyZmxvdzogaGlkZGVuO1xufVxuLk1hcmtkb3duQ29udGVudCB0aDpmaXJzdC1jaGlsZCxcbi5NYXJrZG93bkNvbnRlbnQgdGQ6Zmlyc3QtY2hpbGQge1xuICAgIGJvcmRlci10b3AtbGVmdC1yYWRpdXM6IDEycHg7XG59XG4uTWFya2Rvd25Db250ZW50IHRoOmxhc3QtY2hpbGQsXG4uTWFya2Rvd25Db250ZW50IHRkOmxhc3QtY2hpbGQge1xuICAgIGJvcmRlci10b3AtcmlnaHQtcmFkaXVzOiAxMnB4O1xufVxuXG4vKipcbiAqIFRPRE86IFvwn4yJXSBEUlkgTWFya2Rvd24gcHJpbWl0aXZlcyBzdHlsaW5nXG4gKi9cbiJdfQ== */";
13122
+ var css_248z$4 = ".MarkdownContent-module_MarkdownContent__2JuyX h1{font-size:2em}.MarkdownContent-module_MarkdownContent__2JuyX h2{font-size:1.75em}.MarkdownContent-module_MarkdownContent__2JuyX h3{font-size:1.5em}.MarkdownContent-module_MarkdownContent__2JuyX h4{font-size:1.25em}.MarkdownContent-module_MarkdownContent__2JuyX h5{font-size:1.1em}.MarkdownContent-module_MarkdownContent__2JuyX p{text-wrap:auto}.MarkdownContent-module_MarkdownContent__2JuyX ul{list-style:disc;margin-left:20px}.MarkdownContent-module_MarkdownContent__2JuyX ol{list-style:decimal;margin-left:20px}.MarkdownContent-module_MarkdownContent__2JuyX blockquote,.MarkdownContent-module_MarkdownContent__2JuyX img,.MarkdownContent-module_MarkdownContent__2JuyX pre,.MarkdownContent-module_MarkdownContent__2JuyX table{border-radius:8px;margin-bottom:10px;margin-top:10px}.MarkdownContent-module_MarkdownContent__2JuyX pre{background:#000;border:none;box-shadow:none;color:#fff;display:block;font-size:inherit;line-height:inherit;padding:1em}.MarkdownContent-module_MarkdownContent__2JuyX blockquote{background:#ffffffcc;border:none;box-shadow:none;color:#000;display:block;font-size:inherit;line-height:inherit;padding:1em}.MarkdownContent-module_MarkdownContent__2JuyX code{background:#cccccc55;border:none;box-shadow:none;color:inherit;display:inline-block;font-size:inherit;line-height:inherit;margin:0;padding:0}.MarkdownContent-module_MarkdownContent__2JuyX pre code{background-color:#000000cc;border-radius:8px}.MarkdownContent-module_MarkdownContent__2JuyX .MarkdownContent-module_chat-code-block__ZffFg{background:#181c23;border-color:#23272f;box-shadow:0 2px 8px rgba(0,0,0,.12);color:#f8fafc;font-family:Fira Mono,Menlo,Consolas,Liberation Mono,monospace;font-size:14px;line-height:1.6;overflow-x:auto}.MarkdownContent-module_MarkdownContent__2JuyX .MarkdownContent-module_chat-code-block__ZffFg code{background:none!important;border:none!important;box-shadow:none!important;color:inherit!important;display:block;font-family:inherit!important;font-size:inherit!important;overflow-x:auto;padding:0!important;white-space:pre;word-break:break-word}.MarkdownContent-module_MarkdownContent__2JuyX table{background:#f8fafc;border-collapse:separate;border-spacing:0;box-shadow:0 2px 8px rgba(0,0,0,.08);color:#17223b;font-size:14px;margin:16px 0;width:100%}.MarkdownContent-module_MarkdownContent__2JuyX td,.MarkdownContent-module_MarkdownContent__2JuyX th{background:none;border-bottom:1px solid #d1dbe8;color:#17223b;padding:10px 16px;text-align:left}.MarkdownContent-module_MarkdownContent__2JuyX th{background:linear-gradient(90deg,#eaf3fa 80%,#d1e3f8);border-bottom:2px solid #b5c7de;color:#17223b;font-weight:700}.MarkdownContent-module_MarkdownContent__2JuyX tr:last-child td{border-bottom:none}.MarkdownContent-module_MarkdownContent__2JuyX tr:nth-child(2n) td{background:#eaf3fa}.MarkdownContent-module_MarkdownContent__2JuyX tr:hover td{background:#cbe0f7;transition:background .2s}.MarkdownContent-module_MarkdownContent__2JuyX table{border-radius:12px;overflow:hidden}.MarkdownContent-module_MarkdownContent__2JuyX td:first-child,.MarkdownContent-module_MarkdownContent__2JuyX th:first-child{border-top-left-radius:12px}.MarkdownContent-module_MarkdownContent__2JuyX td:last-child,.MarkdownContent-module_MarkdownContent__2JuyX th:last-child{border-top-right-radius:12px}\n/*# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIk1hcmtkb3duQ29udGVudC5tb2R1bGUuY3NzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLGtEQUNJLGFBQ0osQ0FFQSxrREFDSSxnQkFDSixDQUVBLGtEQUNJLGVBQ0osQ0FFQSxrREFDSSxnQkFDSixDQUVBLGtEQUNJLGVBQ0osQ0FFQSxpREFDSSxjQUNKLENBRUEsa0RBQ0ksZUFBZ0IsQ0FDaEIsZ0JBQ0osQ0FFQSxrREFDSSxrQkFBbUIsQ0FDbkIsZ0JBQ0osQ0FFQSxxTkFNSSxpQkFBa0IsQ0FEbEIsa0JBQW1CLENBRG5CLGVBR0osQ0FFQSxtREFJSSxlQUFxQixDQUZyQixXQUFZLENBQ1osZUFBZ0IsQ0FJaEIsVUFBVyxDQU5YLGFBQWMsQ0FJZCxpQkFBa0IsQ0FDbEIsbUJBQW9CLENBRXBCLFdBQ0osQ0FFQSwwREFJSSxvQkFBcUIsQ0FGckIsV0FBWSxDQUNaLGVBQWdCLENBSWhCLFVBQVcsQ0FOWCxhQUFjLENBSWQsaUJBQWtCLENBQ2xCLG1CQUFvQixDQUVwQixXQUNKLENBRUEsb0RBTUksb0JBQXFCLENBRnJCLFdBQVksQ0FDWixlQUFnQixDQUloQixhQUFjLENBUmQsb0JBQXFCLENBTXJCLGlCQUFrQixDQUNsQixtQkFBb0IsQ0FOcEIsUUFBUyxDQUNULFNBT0osQ0FFQSx3REFDSSwwQkFBMkIsQ0FDM0IsaUJBQ0osQ0FFQSw4RkFDSSxrQkFBbUIsQ0FLbkIsb0JBQXFCLENBQ3JCLG9DQUF5QyxDQUx6QyxhQUFjLENBTWQsOERBQTJFLENBTDNFLGNBQWUsQ0FDZixlQUFnQixDQUNoQixlQUlKLENBQ0EsbUdBQ0kseUJBQTJCLENBSzNCLHFCQUF1QixDQUN2Qix5QkFBMkIsQ0FMM0IsdUJBQXlCLENBU3pCLGFBQWMsQ0FSZCw2QkFBK0IsQ0FDL0IsMkJBQTZCLENBTTdCLGVBQWdCLENBTGhCLG1CQUFxQixDQUdyQixlQUFnQixDQUNoQixxQkFHSixDQUNBLHFEQUtJLGtCQUFtQixDQUhuQix3QkFBeUIsQ0FDekIsZ0JBQWlCLENBS2pCLG9DQUF5QyxDQUV6QyxhQUFjLENBRGQsY0FBZSxDQUxmLGFBQWMsQ0FIZCxVQVVKLENBQ0Esb0dBTUksZUFBZ0IsQ0FIaEIsK0JBQWdDLENBRWhDLGFBQWMsQ0FIZCxpQkFBa0IsQ0FFbEIsZUFHSixDQUNBLGtEQUNJLHFEQUE2RCxDQUc3RCwrQkFBZ0MsQ0FEaEMsYUFBYyxDQURkLGVBR0osQ0FDQSxnRUFDSSxrQkFDSixDQUNBLG1FQUNJLGtCQUNKLENBQ0EsMkRBQ0ksa0JBQW1CLENBQ25CLHlCQUNKLENBQ0EscURBQ0ksa0JBQW1CLENBQ25CLGVBQ0osQ0FDQSw0SEFFSSwyQkFDSixDQUNBLDBIQUVJLDRCQUNKIiwiZmlsZSI6Ik1hcmtkb3duQ29udGVudC5tb2R1bGUuY3NzIiwic291cmNlc0NvbnRlbnQiOlsiLk1hcmtkb3duQ29udGVudCBoMSB7XG4gICAgZm9udC1zaXplOiAyZW07XG59XG5cbi5NYXJrZG93bkNvbnRlbnQgaDIge1xuICAgIGZvbnQtc2l6ZTogMS43NWVtO1xufVxuXG4uTWFya2Rvd25Db250ZW50IGgzIHtcbiAgICBmb250LXNpemU6IDEuNWVtO1xufVxuXG4uTWFya2Rvd25Db250ZW50IGg0IHtcbiAgICBmb250LXNpemU6IDEuMjVlbTtcbn1cblxuLk1hcmtkb3duQ29udGVudCBoNSB7XG4gICAgZm9udC1zaXplOiAxLjFlbTtcbn1cblxuLk1hcmtkb3duQ29udGVudCBwIHtcbiAgICB0ZXh0LXdyYXA6IGF1dG87XG59XG5cbi5NYXJrZG93bkNvbnRlbnQgdWwge1xuICAgIGxpc3Qtc3R5bGU6IGRpc2M7XG4gICAgbWFyZ2luLWxlZnQ6IDIwcHg7XG59XG5cbi5NYXJrZG93bkNvbnRlbnQgb2wge1xuICAgIGxpc3Qtc3R5bGU6IGRlY2ltYWw7XG4gICAgbWFyZ2luLWxlZnQ6IDIwcHg7XG59XG5cbi5NYXJrZG93bkNvbnRlbnQgaW1nLFxuLk1hcmtkb3duQ29udGVudCBwcmUsXG4uTWFya2Rvd25Db250ZW50IGJsb2NrcXVvdGUsXG4uTWFya2Rvd25Db250ZW50IHRhYmxlIHtcbiAgICBtYXJnaW4tdG9wOiAxMHB4O1xuICAgIG1hcmdpbi1ib3R0b206IDEwcHg7XG4gICAgYm9yZGVyLXJhZGl1czogOHB4O1xufVxuXG4uTWFya2Rvd25Db250ZW50IHByZSB7XG4gICAgZGlzcGxheTogYmxvY2s7XG4gICAgYm9yZGVyOiBub25lO1xuICAgIGJveC1zaGFkb3c6IG5vbmU7XG4gICAgYmFja2dyb3VuZDogIzAwMDAwMGZmO1xuICAgIGZvbnQtc2l6ZTogaW5oZXJpdDtcbiAgICBsaW5lLWhlaWdodDogaW5oZXJpdDtcbiAgICBjb2xvcjogI2ZmZjtcbiAgICBwYWRkaW5nOiAxZW07XG59XG5cbi5NYXJrZG93bkNvbnRlbnQgYmxvY2txdW90ZSB7XG4gICAgZGlzcGxheTogYmxvY2s7XG4gICAgYm9yZGVyOiBub25lO1xuICAgIGJveC1zaGFkb3c6IG5vbmU7XG4gICAgYmFja2dyb3VuZDogI2ZmZmZmZmNjO1xuICAgIGZvbnQtc2l6ZTogaW5oZXJpdDtcbiAgICBsaW5lLWhlaWdodDogaW5oZXJpdDtcbiAgICBjb2xvcjogIzAwMDtcbiAgICBwYWRkaW5nOiAxZW07XG59XG5cbi5NYXJrZG93bkNvbnRlbnQgY29kZSB7XG4gICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICAgIG1hcmdpbjogMDtcbiAgICBwYWRkaW5nOiAwO1xuICAgIGJvcmRlcjogbm9uZTtcbiAgICBib3gtc2hhZG93OiBub25lO1xuICAgIGJhY2tncm91bmQ6ICNjY2NjY2M1NTtcbiAgICBmb250LXNpemU6IGluaGVyaXQ7XG4gICAgbGluZS1oZWlnaHQ6IGluaGVyaXQ7XG4gICAgY29sb3I6IGluaGVyaXQ7XG59XG5cbi5NYXJrZG93bkNvbnRlbnQgcHJlIGNvZGUge1xuICAgIGJhY2tncm91bmQtY29sb3I6ICMwMDAwMDBjYztcbiAgICBib3JkZXItcmFkaXVzOiA4cHg7XG59XG5cbi5NYXJrZG93bkNvbnRlbnQgLmNoYXQtY29kZS1ibG9jayB7XG4gICAgYmFja2dyb3VuZDogIzE4MWMyMztcbiAgICBjb2xvcjogI2Y4ZmFmYztcbiAgICBmb250LXNpemU6IDE0cHg7XG4gICAgbGluZS1oZWlnaHQ6IDEuNjtcbiAgICBvdmVyZmxvdy14OiBhdXRvO1xuICAgIGJvcmRlci1jb2xvcjogIzIzMjcyZjtcbiAgICBib3gtc2hhZG93OiAwIDJweCA4cHggcmdiYSgwLCAwLCAwLCAwLjEyKTtcbiAgICBmb250LWZhbWlseTogJ0ZpcmEgTW9ubycsICdNZW5sbycsICdDb25zb2xhcycsICdMaWJlcmF0aW9uIE1vbm8nLCBtb25vc3BhY2U7XG59XG4uTWFya2Rvd25Db250ZW50IC5jaGF0LWNvZGUtYmxvY2sgY29kZSB7XG4gICAgYmFja2dyb3VuZDogbm9uZSAhaW1wb3J0YW50O1xuICAgIGNvbG9yOiBpbmhlcml0ICFpbXBvcnRhbnQ7XG4gICAgZm9udC1mYW1pbHk6IGluaGVyaXQgIWltcG9ydGFudDtcbiAgICBmb250LXNpemU6IGluaGVyaXQgIWltcG9ydGFudDtcbiAgICBwYWRkaW5nOiAwICFpbXBvcnRhbnQ7XG4gICAgYm9yZGVyOiBub25lICFpbXBvcnRhbnQ7XG4gICAgYm94LXNoYWRvdzogbm9uZSAhaW1wb3J0YW50O1xuICAgIHdoaXRlLXNwYWNlOiBwcmU7XG4gICAgd29yZC1icmVhazogYnJlYWstd29yZDtcbiAgICBvdmVyZmxvdy14OiBhdXRvO1xuICAgIGRpc3BsYXk6IGJsb2NrO1xufVxuLk1hcmtkb3duQ29udGVudCB0YWJsZSB7XG4gICAgd2lkdGg6IDEwMCU7XG4gICAgYm9yZGVyLWNvbGxhcHNlOiBzZXBhcmF0ZTtcbiAgICBib3JkZXItc3BhY2luZzogMDtcbiAgICBtYXJnaW46IDE2cHggMDtcbiAgICBiYWNrZ3JvdW5kOiAjZjhmYWZjOyAvKiBTdHJvbmdlciBsaWdodCBiYWNrZ3JvdW5kIGZvciBjb250cmFzdCAqL1xuICAgIGJvcmRlci1yYWRpdXM6IDEycHg7XG4gICAgb3ZlcmZsb3c6IGhpZGRlbjtcbiAgICBib3gtc2hhZG93OiAwIDJweCA4cHggcmdiYSgwLCAwLCAwLCAwLjA4KTtcbiAgICBmb250LXNpemU6IDE0cHg7XG4gICAgY29sb3I6ICMxNzIyM2I7IC8qIERhcmsgdGV4dCBmb3IgY29udHJhc3QgKi9cbn1cbi5NYXJrZG93bkNvbnRlbnQgdGgsXG4uTWFya2Rvd25Db250ZW50IHRkIHtcbiAgICBwYWRkaW5nOiAxMHB4IDE2cHg7XG4gICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICNkMWRiZTg7XG4gICAgdGV4dC1hbGlnbjogbGVmdDtcbiAgICBjb2xvcjogIzE3MjIzYjsgLyogRW5zdXJlIHN0cm9uZyB0ZXh0IGNvbG9yIGZvciBhbGwgY2VsbHMgKi9cbiAgICBiYWNrZ3JvdW5kOiBub25lO1xufVxuLk1hcmtkb3duQ29udGVudCB0aCB7XG4gICAgYmFja2dyb3VuZDogbGluZWFyLWdyYWRpZW50KDkwZGVnLCAjZWFmM2ZhIDgwJSwgI2QxZTNmOCAxMDAlKTtcbiAgICBmb250LXdlaWdodDogNzAwO1xuICAgIGNvbG9yOiAjMTcyMjNiOyAvKiBTdHJvbmcgaGVhZGVyIHRleHQgKi9cbiAgICBib3JkZXItYm90dG9tOiAycHggc29saWQgI2I1YzdkZTtcbn1cbi5NYXJrZG93bkNvbnRlbnQgdHI6bGFzdC1jaGlsZCB0ZCB7XG4gICAgYm9yZGVyLWJvdHRvbTogbm9uZTtcbn1cbi5NYXJrZG93bkNvbnRlbnQgdHI6bnRoLWNoaWxkKGV2ZW4pIHRkIHtcbiAgICBiYWNrZ3JvdW5kOiAjZWFmM2ZhO1xufVxuLk1hcmtkb3duQ29udGVudCB0cjpob3ZlciB0ZCB7XG4gICAgYmFja2dyb3VuZDogI2NiZTBmNztcbiAgICB0cmFuc2l0aW9uOiBiYWNrZ3JvdW5kIDAuMnM7XG59XG4uTWFya2Rvd25Db250ZW50IHRhYmxlIHtcbiAgICBib3JkZXItcmFkaXVzOiAxMnB4O1xuICAgIG92ZXJmbG93OiBoaWRkZW47XG59XG4uTWFya2Rvd25Db250ZW50IHRoOmZpcnN0LWNoaWxkLFxuLk1hcmtkb3duQ29udGVudCB0ZDpmaXJzdC1jaGlsZCB7XG4gICAgYm9yZGVyLXRvcC1sZWZ0LXJhZGl1czogMTJweDtcbn1cbi5NYXJrZG93bkNvbnRlbnQgdGg6bGFzdC1jaGlsZCxcbi5NYXJrZG93bkNvbnRlbnQgdGQ6bGFzdC1jaGlsZCB7XG4gICAgYm9yZGVyLXRvcC1yaWdodC1yYWRpdXM6IDEycHg7XG59XG5cbi8qKlxuICogVE9ETzogW/CfjIldIERSWSBNYXJrZG93biBwcmltaXRpdmVzIHN0eWxpbmdcbiAqL1xuIl19 */";
11368
13123
  var styles$3 = {"MarkdownContent":"MarkdownContent-module_MarkdownContent__2JuyX","chat-code-block":"MarkdownContent-module_chat-code-block__ZffFg"};
11369
13124
  styleInject(css_248z$4);
11370
13125
 
@@ -12451,6 +14206,7 @@
12451
14206
  fileExtension: 'html',
12452
14207
  };
12453
14208
  /**
14209
+ * TODO: !!! Add QR code with branding to the footer
12454
14210
  * TODO: [😬] Take chat save to HTML from existing parallel implementation
12455
14211
  */
12456
14212
 
@@ -12510,6 +14266,10 @@
12510
14266
  mimeType: 'application/pdf',
12511
14267
  fileExtension: 'pdf',
12512
14268
  };
14269
+ /**
14270
+ * TODO: !!! Add QR code with branding to the footer
14271
+ * TODO: !!! Add print option
14272
+ */
12513
14273
 
12514
14274
  /**
12515
14275
  * React <jsx/> export plugin (full metadata)