@promptbook/core 0.72.0-6 → 0.72.0-7
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.
- package/README.md +6 -0
- package/esm/index.es.js +1512 -453
- package/esm/index.es.js.map +1 -1
- package/esm/typings/src/_packages/browser.index.d.ts +1 -1
- package/esm/typings/src/_packages/core.index.d.ts +24 -10
- package/esm/typings/src/_packages/node.index.d.ts +6 -2
- package/esm/typings/src/_packages/types.index.d.ts +28 -20
- package/esm/typings/src/cli/cli-commands/about.d.ts +1 -1
- package/esm/typings/src/cli/cli-commands/hello.d.ts +2 -1
- package/esm/typings/src/cli/cli-commands/make.d.ts +1 -1
- package/esm/typings/src/cli/cli-commands/prettify.d.ts +2 -1
- package/esm/typings/src/cli/cli-commands/test-command.d.ts +13 -0
- package/esm/typings/src/cli/main.d.ts +1 -1
- package/esm/typings/src/cli/promptbookCli.d.ts +1 -1
- package/esm/typings/src/collection/constructors/createCollectionFromDirectory.d.ts +8 -5
- package/esm/typings/src/commands/EXPECT/expectCommandParser.d.ts +1 -1
- package/esm/typings/src/commands/FOREACH/foreachCommandParser.d.ts +1 -1
- package/esm/typings/src/commands/FORMAT/formatCommandParser.d.ts +1 -1
- package/esm/typings/src/commands/JOKER/jokerCommandParser.d.ts +1 -1
- package/esm/typings/src/commands/KNOWLEDGE/knowledgeCommandParser.d.ts +1 -1
- package/esm/typings/src/commands/KNOWLEDGE/utils/sourceContentToName.d.ts +11 -0
- package/esm/typings/src/commands/KNOWLEDGE/utils/sourceContentToName.test.d.ts +4 -0
- package/esm/typings/src/commands/MODEL/modelCommandParser.d.ts +1 -1
- package/esm/typings/src/commands/PARAMETER/parameterCommandParser.d.ts +1 -1
- package/esm/typings/src/commands/PERSONA/personaCommandParser.d.ts +1 -1
- package/esm/typings/src/commands/POSTPROCESS/postprocessCommandParser.d.ts +1 -1
- package/esm/typings/src/commands/PROMPTBOOK_VERSION/promptbookVersionCommandParser.d.ts +1 -1
- package/esm/typings/src/commands/TEMPLATE/templateCommandParser.d.ts +1 -1
- package/esm/typings/src/commands/URL/urlCommandParser.d.ts +1 -1
- package/esm/typings/src/commands/X_ACTION/actionCommandParser.d.ts +1 -1
- package/esm/typings/src/commands/X_INSTRUMENT/instrumentCommandParser.d.ts +1 -1
- package/esm/typings/src/commands/_BOILERPLATE/boilerplateCommandParser.d.ts +1 -1
- package/esm/typings/src/config.d.ts +10 -0
- package/esm/typings/src/conversion/pipelineStringToJson.d.ts +2 -15
- package/esm/typings/src/conversion/validation/_importPipeline.d.ts +1 -1
- package/esm/typings/src/conversion/validation/validatePipeline.d.ts +5 -5
- package/esm/typings/src/{knowledge/dialogs → dialogs}/callback/CallbackInterfaceTools.d.ts +2 -2
- package/esm/typings/src/{knowledge/dialogs → dialogs}/callback/CallbackInterfaceToolsOptions.d.ts +2 -2
- package/esm/typings/src/{knowledge/dialogs → dialogs}/simple-prompt/SimplePromptInterfaceTools.d.ts +4 -4
- package/esm/typings/src/errors/KnowledgeScrapeError.d.ts +9 -0
- package/esm/typings/src/errors/MissingToolsError.d.ts +9 -0
- package/esm/typings/src/execution/ExecutionTools.d.ts +3 -3
- package/esm/typings/src/execution/createPipelineExecutor/00-CreatePipelineExecutorOptions.d.ts +5 -2
- package/esm/typings/src/execution/createPipelineExecutor/00-CreatePipelineExecutorSettings.d.ts +2 -13
- package/esm/typings/src/execution/createPipelineExecutor/00-createPipelineExecutor.d.ts +1 -1
- package/esm/typings/src/execution/createPipelineExecutor/10-executePipeline.d.ts +1 -1
- package/esm/typings/src/execution/translation/automatic-translate/translateMessages.d.ts +3 -0
- package/esm/typings/src/execution/utils/forEachAsync.d.ts +1 -0
- package/esm/typings/src/llm-providers/_common/createLlmToolsFromConfigurationFromEnv.d.ts +1 -1
- package/esm/typings/src/llm-providers/_common/createLlmToolsFromEnv.d.ts +1 -1
- package/esm/typings/src/llm-providers/_common/getLlmToolsForCli.d.ts +1 -1
- package/esm/typings/src/llm-providers/anthropic-claude/playground/playground.d.ts +1 -0
- package/esm/typings/src/llm-providers/azure-openai/AzureOpenAiExecutionTools.d.ts +6 -0
- package/esm/typings/src/llm-providers/azure-openai/playground/playground.d.ts +1 -0
- package/esm/typings/src/llm-providers/langtail/playground/playground.d.ts +3 -0
- package/esm/typings/src/llm-providers/multiple/playground/playground.d.ts +3 -0
- package/esm/typings/src/llm-providers/openai/playground/playground.d.ts +1 -0
- package/esm/typings/src/llm-providers/remote/playground/playground.d.ts +3 -0
- package/esm/typings/src/personas/preparePersona.d.ts +2 -2
- package/esm/typings/src/prepare/PrepareAndScrapeOptions.d.ts +67 -0
- package/esm/typings/src/prepare/preparePipeline.d.ts +2 -2
- package/esm/typings/src/prepare/prepareTemplates.d.ts +2 -2
- package/esm/typings/src/scrapers/_common/Converter.d.ts +28 -0
- package/esm/typings/src/scrapers/_common/Scraper.d.ts +71 -0
- package/esm/typings/src/scrapers/_common/ScraperIntermediateSource.d.ts +11 -0
- package/esm/typings/src/{knowledge/prepare-knowledge → scrapers}/_common/prepareKnowledgePieces.d.ts +4 -4
- package/esm/typings/src/scrapers/_common/utils/getScraperIntermediateSource.d.ts +33 -0
- package/esm/typings/src/scrapers/_common/utils/getScraperIntermediateSource.test.d.ts +4 -0
- package/esm/typings/src/scrapers/_common/utils/makeKnowledgeSourceHandler.d.ts +10 -0
- package/esm/typings/src/scrapers/document/documentScraper.d.ts +37 -0
- package/esm/typings/src/scrapers/document/documentScraper.test.d.ts +4 -0
- package/esm/typings/src/scrapers/document/playground/document-scraper-playground.d.ts +5 -0
- package/esm/typings/src/scrapers/document-legacy/legacyDocumentScraper.d.ts +37 -0
- package/esm/typings/src/scrapers/document-legacy/legacyDocumentScraper.test.d.ts +4 -0
- package/esm/typings/src/scrapers/document-legacy/playground/legacy-document-scraper-playground.d.ts +5 -0
- package/esm/typings/src/scrapers/index.d.ts +7 -0
- package/esm/typings/src/scrapers/markdown/markdownScraper.d.ts +29 -0
- package/esm/typings/src/scrapers/markdown/playground/markdown-scraper-playground.d.ts +5 -0
- package/esm/typings/src/scrapers/pdf/pdfScraper.d.ts +35 -0
- package/esm/typings/src/scrapers/pdf/playground/pdf-scraper-playground.d.ts +5 -0
- package/esm/typings/src/scrapers/website/playground/website-scraper-playground.d.ts +5 -0
- package/esm/typings/src/scrapers/website/utils/markdownConverter.d.ts +12 -0
- package/esm/typings/src/scrapers/website/websiteScraper.d.ts +43 -0
- package/esm/typings/src/storage/{files-storage/FilesStorage.d.ts → file-cache-storage/FileCacheStorage.d.ts} +5 -5
- package/esm/typings/src/storage/file-cache-storage/FileCacheStorageOptions.d.ts +10 -0
- package/esm/typings/src/storage/{files-storage → file-cache-storage}/utils/nameToSubfolderPath.d.ts +1 -1
- package/esm/typings/src/storage/file-cache-storage/utils/nameToSubfolderPath.test.d.ts +1 -0
- package/esm/typings/src/storage/local-storage/getLocalStorage.d.ts +1 -1
- package/esm/typings/src/storage/local-storage/getSessionStorage.d.ts +1 -1
- package/esm/typings/src/types/PipelineJson/KnowledgeSourceJson.d.ts +9 -2
- package/esm/typings/src/types/PipelineJson/PipelineJson.d.ts +2 -2
- package/esm/typings/src/types/typeAliases.d.ts +8 -11
- package/esm/typings/src/utils/execCommand/$execCommand.d.ts +14 -0
- package/esm/typings/src/utils/execCommand/$execCommands.d.ts +17 -0
- package/esm/typings/src/utils/execCommand/IExecCommandOptions.d.ts +23 -0
- package/esm/typings/src/utils/execCommand/execCommand.test.d.ts +1 -0
- package/esm/typings/src/utils/execCommand/execCommandNormalizeOptions.d.ts +10 -0
- package/esm/typings/src/utils/execCommand/execCommandNormalizeOptions.test.d.ts +1 -0
- package/esm/typings/src/utils/files/$isDirectoryExisting.d.ts +3 -3
- package/esm/typings/src/utils/files/$isFileExisting.d.ts +3 -3
- package/esm/typings/src/utils/files/$listAllFiles.d.ts +5 -4
- package/esm/typings/src/utils/files/extensionToMimeType.d.ts +8 -0
- package/esm/typings/src/utils/files/extensionToMimeType.test.d.ts +1 -0
- package/esm/typings/src/utils/files/getFileExtension.d.ts +8 -0
- package/esm/typings/src/utils/files/getFileExtension.test.d.ts +1 -0
- package/esm/typings/src/utils/validators/filePath/isValidFilePath.d.ts +2 -2
- package/package.json +6 -1
- package/umd/index.umd.js +1517 -458
- package/umd/index.umd.js.map +1 -1
- package/esm/typings/src/knowledge/prepare-knowledge/_common/Scraper.d.ts +0 -37
- package/esm/typings/src/knowledge/prepare-knowledge/markdown/playground/markdown-knowledge-playground.d.ts +0 -2
- package/esm/typings/src/knowledge/prepare-knowledge/markdown/prepareKnowledgeFromMarkdown.d.ts +0 -14
- package/esm/typings/src/knowledge/prepare-knowledge/pdf/prepareKnowledgeFromPdf.d.ts +0 -15
- package/esm/typings/src/prepare/PrepareOptions.d.ts +0 -22
- package/esm/typings/src/storage/files-storage/FilesStorageOptions.d.ts +0 -10
- /package/esm/typings/src/{knowledge/dialogs → dialogs}/user-interface-execution-tools.test.d.ts +0 -0
- /package/esm/typings/src/{knowledge/prepare-knowledge → scrapers}/_common/prepareKnowledgePieces.test.d.ts +0 -0
- /package/esm/typings/src/{knowledge/prepare-knowledge/markdown/prepareKnowledgeFromMarkdown.test.d.ts → scrapers/markdown/markdownScraper.test.d.ts} +0 -0
- /package/esm/typings/src/{knowledge/prepare-knowledge/pdf/prepareKnowledgeFromPdf.test.d.ts → scrapers/website/utils/markdownConverter.test.d.ts} +0 -0
- /package/esm/typings/src/{storage/files-storage/utils/nameToSubfolderPath.test.d.ts → scrapers/website/websiteScraper.test.d.ts} +0 -0
package/umd/index.umd.js
CHANGED
|
@@ -1,13 +1,14 @@
|
|
|
1
1
|
(function (global, factory) {
|
|
2
|
-
typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('spacetrim'), require('prettier'), require('prettier/parser-html'), require('waitasecond'), require('
|
|
3
|
-
typeof define === 'function' && define.amd ? define(['exports', 'spacetrim', 'prettier', 'prettier/parser-html', 'waitasecond', '
|
|
4
|
-
(global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory(global["promptbook-core"] = {}, global.spaceTrim, global.prettier, global.parserHtml, global.waitasecond, global.
|
|
5
|
-
})(this, (function (exports, spaceTrim, prettier, parserHtml, waitasecond,
|
|
2
|
+
typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('spacetrim'), require('prettier'), require('prettier/parser-html'), require('fs/promises'), require('path'), require('child_process'), require('colors'), require('waitasecond'), require('crypto-js'), require('crypto-js/enc-hex'), require('papaparse'), require('@mozilla/readability'), require('jsdom'), require('showdown'), require('mime-types'), require('crypto-js/sha256'), require('moment')) :
|
|
3
|
+
typeof define === 'function' && define.amd ? define(['exports', 'spacetrim', 'prettier', 'prettier/parser-html', 'fs/promises', 'path', 'child_process', 'colors', 'waitasecond', 'crypto-js', 'crypto-js/enc-hex', 'papaparse', '@mozilla/readability', 'jsdom', 'showdown', 'mime-types', 'crypto-js/sha256', 'moment'], factory) :
|
|
4
|
+
(global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory(global["promptbook-core"] = {}, global.spaceTrim, global.prettier, global.parserHtml, global.promises, global.path, global.child_process, global.colors, global.waitasecond, global.cryptoJs, global.hexEncoder, global.papaparse, global.readability, global.jsdom, global.showdown, global.mimeTypes, global.sha256, global.moment));
|
|
5
|
+
})(this, (function (exports, spaceTrim, prettier, parserHtml, promises, path, child_process, colors, waitasecond, cryptoJs, hexEncoder, papaparse, readability, jsdom, showdown, mimeTypes, sha256, moment) { 'use strict';
|
|
6
6
|
|
|
7
7
|
function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }
|
|
8
8
|
|
|
9
9
|
var spaceTrim__default = /*#__PURE__*/_interopDefaultLegacy(spaceTrim);
|
|
10
10
|
var parserHtml__default = /*#__PURE__*/_interopDefaultLegacy(parserHtml);
|
|
11
|
+
var colors__default = /*#__PURE__*/_interopDefaultLegacy(colors);
|
|
11
12
|
var hexEncoder__default = /*#__PURE__*/_interopDefaultLegacy(hexEncoder);
|
|
12
13
|
var sha256__default = /*#__PURE__*/_interopDefaultLegacy(sha256);
|
|
13
14
|
var moment__default = /*#__PURE__*/_interopDefaultLegacy(moment);
|
|
@@ -16,7 +17,7 @@
|
|
|
16
17
|
/**
|
|
17
18
|
* The version of the Promptbook library
|
|
18
19
|
*/
|
|
19
|
-
var PROMPTBOOK_VERSION = '0.72.0-
|
|
20
|
+
var PROMPTBOOK_VERSION = '0.72.0-6';
|
|
20
21
|
// TODO: [main] !!!! List here all the versions and annotate + put into script
|
|
21
22
|
|
|
22
23
|
/*! *****************************************************************************
|
|
@@ -688,9 +689,19 @@
|
|
|
688
689
|
/**
|
|
689
690
|
* Where to store the cache of executions for promptbook CLI
|
|
690
691
|
*
|
|
692
|
+
* Note: When the folder does not exist, it is created recursively
|
|
693
|
+
*
|
|
691
694
|
* @public exported from `@promptbook/core`
|
|
692
695
|
*/
|
|
693
696
|
var EXECUTIONS_CACHE_DIRNAME = '/.promptbook/executions-cache';
|
|
697
|
+
/**
|
|
698
|
+
* Where to store the scrape cache
|
|
699
|
+
*
|
|
700
|
+
* Note: When the folder does not exist, it is created recursively
|
|
701
|
+
*
|
|
702
|
+
* @public exported from `@promptbook/core`
|
|
703
|
+
*/
|
|
704
|
+
var SCRAPE_CACHE_DIRNAME = '/.promptbook/scrape-cache';
|
|
694
705
|
/**
|
|
695
706
|
* The name of the builded pipeline collection made by CLI `ptbk make` and for lookup in `createCollectionFromDirectory`
|
|
696
707
|
*
|
|
@@ -1220,11 +1231,11 @@
|
|
|
1220
1231
|
* > ex port function validatePipeline(promptbook: really_unknown): asserts promptbook is PipelineJson {
|
|
1221
1232
|
*/
|
|
1222
1233
|
/**
|
|
1223
|
-
* TODO: [
|
|
1224
|
-
* TODO: [
|
|
1225
|
-
* TODO: [
|
|
1226
|
-
* TODO: [
|
|
1227
|
-
* TODO: [
|
|
1234
|
+
* TODO: [🧳][main] !!!! Validate that all samples match expectations
|
|
1235
|
+
* TODO: [🧳][🐝][main] !!!! Validate that knowledge is valid (non-void)
|
|
1236
|
+
* TODO: [🧳][main] !!!! Validate that persona can be used only with CHAT variant
|
|
1237
|
+
* TODO: [🧳][main] !!!! Validate that parameter with reserved name not used RESERVED_PARAMETER_NAMES
|
|
1238
|
+
* TODO: [🧳][main] !!!! Validate that reserved parameter is not used as joker
|
|
1228
1239
|
* TODO: [🧠] Validation not only logic itself but imports around - files and websites and rerefenced pipelines exists
|
|
1229
1240
|
* TODO: [🛠] Actions, instruments (and maybe knowledge) => Functions and tools
|
|
1230
1241
|
*/
|
|
@@ -1639,6 +1650,22 @@
|
|
|
1639
1650
|
// <- [🅱]
|
|
1640
1651
|
];
|
|
1641
1652
|
|
|
1653
|
+
/**
|
|
1654
|
+
* This error indicates that the promptbook can not retrieve knowledge from external sources
|
|
1655
|
+
*
|
|
1656
|
+
* @public exported from `@promptbook/core`
|
|
1657
|
+
*/
|
|
1658
|
+
var KnowledgeScrapeError = /** @class */ (function (_super) {
|
|
1659
|
+
__extends(KnowledgeScrapeError, _super);
|
|
1660
|
+
function KnowledgeScrapeError(message) {
|
|
1661
|
+
var _this = _super.call(this, message) || this;
|
|
1662
|
+
_this.name = 'KnowledgeScrapeError';
|
|
1663
|
+
Object.setPrototypeOf(_this, KnowledgeScrapeError.prototype);
|
|
1664
|
+
return _this;
|
|
1665
|
+
}
|
|
1666
|
+
return KnowledgeScrapeError;
|
|
1667
|
+
}(Error));
|
|
1668
|
+
|
|
1642
1669
|
/**
|
|
1643
1670
|
* Async version of Array.forEach
|
|
1644
1671
|
*
|
|
@@ -1646,6 +1673,7 @@
|
|
|
1646
1673
|
* @param options - Options for the function
|
|
1647
1674
|
* @param callbackfunction - Function to call for each item
|
|
1648
1675
|
* @public exported from `@promptbook/utils`
|
|
1676
|
+
* @deprecated [🪂] Use queues instead
|
|
1649
1677
|
*/
|
|
1650
1678
|
function forEachAsync(array, options, callbackfunction) {
|
|
1651
1679
|
return __awaiter(this, void 0, void 0, function () {
|
|
@@ -1715,59 +1743,246 @@
|
|
|
1715
1743
|
}
|
|
1716
1744
|
|
|
1717
1745
|
/**
|
|
1718
|
-
*
|
|
1746
|
+
* This error type indicates that some tools are missing for pipeline execution or preparation
|
|
1719
1747
|
*
|
|
1720
1748
|
* @public exported from `@promptbook/core`
|
|
1721
1749
|
*/
|
|
1722
|
-
var
|
|
1723
|
-
|
|
1724
|
-
|
|
1725
|
-
|
|
1726
|
-
|
|
1727
|
-
|
|
1728
|
-
|
|
1729
|
-
|
|
1730
|
-
|
|
1731
|
-
|
|
1732
|
-
|
|
1733
|
-
output: {
|
|
1734
|
-
tokensCount: { value: 0 },
|
|
1735
|
-
charactersCount: { value: 0 },
|
|
1736
|
-
wordsCount: { value: 0 },
|
|
1737
|
-
sentencesCount: { value: 0 },
|
|
1738
|
-
linesCount: { value: 0 },
|
|
1739
|
-
paragraphsCount: { value: 0 },
|
|
1740
|
-
pagesCount: { value: 0 },
|
|
1741
|
-
},
|
|
1742
|
-
});
|
|
1750
|
+
var MissingToolsError = /** @class */ (function (_super) {
|
|
1751
|
+
__extends(MissingToolsError, _super);
|
|
1752
|
+
function MissingToolsError(message) {
|
|
1753
|
+
var _this = _super.call(this, spaceTrim.spaceTrim(function (block) { return "\n ".concat(block(message), "\n\n Note: You have probbably forgot to provide some tools for pipeline execution or preparation\n\n "); })) || this;
|
|
1754
|
+
_this.name = 'MissingToolsError';
|
|
1755
|
+
Object.setPrototypeOf(_this, MissingToolsError.prototype);
|
|
1756
|
+
return _this;
|
|
1757
|
+
}
|
|
1758
|
+
return MissingToolsError;
|
|
1759
|
+
}(Error));
|
|
1760
|
+
|
|
1743
1761
|
/**
|
|
1744
|
-
*
|
|
1762
|
+
* Detects if the code is running in a Node.js environment
|
|
1763
|
+
*
|
|
1764
|
+
* Note: `$` is used to indicate that this function is not a pure function - it looks at the global object to determine the environment
|
|
1765
|
+
*
|
|
1766
|
+
* @public exported from `@promptbook/utils`
|
|
1767
|
+
*/
|
|
1768
|
+
var $isRunningInNode = new Function("\n try {\n return this === global;\n } catch (e) {\n return false;\n }\n");
|
|
1769
|
+
|
|
1770
|
+
/**
|
|
1771
|
+
* This error type indicates that you try to use a feature that is not available in the current environment
|
|
1745
1772
|
*
|
|
1746
1773
|
* @public exported from `@promptbook/core`
|
|
1747
1774
|
*/
|
|
1748
|
-
var
|
|
1749
|
-
|
|
1750
|
-
|
|
1751
|
-
|
|
1752
|
-
|
|
1753
|
-
|
|
1754
|
-
|
|
1755
|
-
|
|
1756
|
-
|
|
1757
|
-
|
|
1758
|
-
},
|
|
1759
|
-
output: {
|
|
1760
|
-
tokensCount: { value: 0, isUncertain: true },
|
|
1761
|
-
charactersCount: { value: 0, isUncertain: true },
|
|
1762
|
-
wordsCount: { value: 0, isUncertain: true },
|
|
1763
|
-
sentencesCount: { value: 0, isUncertain: true },
|
|
1764
|
-
linesCount: { value: 0, isUncertain: true },
|
|
1765
|
-
paragraphsCount: { value: 0, isUncertain: true },
|
|
1766
|
-
pagesCount: { value: 0, isUncertain: true },
|
|
1767
|
-
},
|
|
1768
|
-
});
|
|
1775
|
+
var EnvironmentMismatchError = /** @class */ (function (_super) {
|
|
1776
|
+
__extends(EnvironmentMismatchError, _super);
|
|
1777
|
+
function EnvironmentMismatchError(message) {
|
|
1778
|
+
var _this = _super.call(this, message) || this;
|
|
1779
|
+
_this.name = 'EnvironmentMismatchError';
|
|
1780
|
+
Object.setPrototypeOf(_this, EnvironmentMismatchError.prototype);
|
|
1781
|
+
return _this;
|
|
1782
|
+
}
|
|
1783
|
+
return EnvironmentMismatchError;
|
|
1784
|
+
}(Error));
|
|
1769
1785
|
|
|
1770
|
-
|
|
1786
|
+
/**
|
|
1787
|
+
* Normalize options for `execCommand` and `execCommands`
|
|
1788
|
+
*
|
|
1789
|
+
* @private internal utility of `execCommand` and `execCommands`
|
|
1790
|
+
*/
|
|
1791
|
+
function execCommandNormalizeOptions(options) {
|
|
1792
|
+
var _a;
|
|
1793
|
+
var _b, _c, _d;
|
|
1794
|
+
var command;
|
|
1795
|
+
var cwd;
|
|
1796
|
+
var crashOnError;
|
|
1797
|
+
var args = [];
|
|
1798
|
+
var timeout;
|
|
1799
|
+
if (typeof options === 'string') {
|
|
1800
|
+
// TODO: [1] DRY default values
|
|
1801
|
+
command = options;
|
|
1802
|
+
cwd = process.cwd();
|
|
1803
|
+
crashOnError = true;
|
|
1804
|
+
timeout = Infinity;
|
|
1805
|
+
}
|
|
1806
|
+
else {
|
|
1807
|
+
/*
|
|
1808
|
+
TODO:
|
|
1809
|
+
if ((options as any).commands !== undefined) {
|
|
1810
|
+
commands = (options as any).commands;
|
|
1811
|
+
} else {
|
|
1812
|
+
commands = [(options as any).command];
|
|
1813
|
+
}
|
|
1814
|
+
*/
|
|
1815
|
+
// TODO: [1] DRY default values
|
|
1816
|
+
command = options.command;
|
|
1817
|
+
cwd = (_b = options.cwd) !== null && _b !== void 0 ? _b : process.cwd();
|
|
1818
|
+
crashOnError = (_c = options.crashOnError) !== null && _c !== void 0 ? _c : true;
|
|
1819
|
+
timeout = (_d = options.timeout) !== null && _d !== void 0 ? _d : Infinity;
|
|
1820
|
+
}
|
|
1821
|
+
// TODO: /(-[a-zA-Z0-9-]+\s+[^\s]*)|[^\s]*/g
|
|
1822
|
+
var _ = Array.from(command.matchAll(/(".*")|([^\s]*)/g))
|
|
1823
|
+
.map(function (_a) {
|
|
1824
|
+
var _b = __read(_a, 1), match = _b[0];
|
|
1825
|
+
return match;
|
|
1826
|
+
})
|
|
1827
|
+
.filter(function (arg) { return arg !== ''; });
|
|
1828
|
+
if (_.length > 1) {
|
|
1829
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
1830
|
+
_a = __read(_), command = _a[0], args = _a.slice(1);
|
|
1831
|
+
}
|
|
1832
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
1833
|
+
if (options.args) {
|
|
1834
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
1835
|
+
args = __spreadArray(__spreadArray([], __read(args), false), __read(options.args), false);
|
|
1836
|
+
}
|
|
1837
|
+
var humanReadableCommand = !['npx', 'npm'].includes(command) ? command : args[0];
|
|
1838
|
+
if (['ts-node'].includes(humanReadableCommand)) {
|
|
1839
|
+
humanReadableCommand += " ".concat(args[1]);
|
|
1840
|
+
}
|
|
1841
|
+
return { command: command, humanReadableCommand: humanReadableCommand, args: args, cwd: cwd, crashOnError: crashOnError, timeout: timeout };
|
|
1842
|
+
}
|
|
1843
|
+
// TODO: This should show type error> execCommandNormalizeOptions({ command: '', commands: [''] });
|
|
1844
|
+
|
|
1845
|
+
/**
|
|
1846
|
+
* Run one command in a shell
|
|
1847
|
+
*
|
|
1848
|
+
* Note: There are 2 similar functions in the codebase:
|
|
1849
|
+
* - `$execCommand` which runs a single command
|
|
1850
|
+
* - `$execCommands` which runs multiple commands
|
|
1851
|
+
*
|
|
1852
|
+
* @public exported from `@promptbook/node`
|
|
1853
|
+
*/
|
|
1854
|
+
function $execCommand(options) {
|
|
1855
|
+
if (!$isRunningInNode()) {
|
|
1856
|
+
throw new EnvironmentMismatchError('Function `$execCommand` can run only in Node environment.js');
|
|
1857
|
+
}
|
|
1858
|
+
return new Promise(
|
|
1859
|
+
// <- TODO: [🧱] Implement in a functional (not new Class) way
|
|
1860
|
+
function (resolve, reject) {
|
|
1861
|
+
// eslint-disable-next-line prefer-const
|
|
1862
|
+
var _a = execCommandNormalizeOptions(options), command = _a.command, humanReadableCommand = _a.humanReadableCommand, args = _a.args, cwd = _a.cwd, crashOnError = _a.crashOnError, timeout = _a.timeout;
|
|
1863
|
+
if (timeout !== Infinity) {
|
|
1864
|
+
// TODO: In waitasecond forTime(Infinity) should be equivalent to forEver()
|
|
1865
|
+
waitasecond.forTime(timeout).then(function () {
|
|
1866
|
+
if (crashOnError) {
|
|
1867
|
+
reject(new Error("Command \"".concat(humanReadableCommand, "\" exceeded time limit of ").concat(timeout, "ms")));
|
|
1868
|
+
}
|
|
1869
|
+
else {
|
|
1870
|
+
console.warn("Command \"".concat(humanReadableCommand, "\" exceeded time limit of ").concat(timeout, "ms but continues running"));
|
|
1871
|
+
resolve('Command exceeded time limit');
|
|
1872
|
+
}
|
|
1873
|
+
});
|
|
1874
|
+
}
|
|
1875
|
+
if (/^win/.test(process.platform) && ['npm', 'npx'].includes(command)) {
|
|
1876
|
+
command = "".concat(command, ".cmd");
|
|
1877
|
+
}
|
|
1878
|
+
// !!!!!! Verbose mode - to all consoles
|
|
1879
|
+
console.info(colors__default["default"].yellow(cwd) + ' ' + colors__default["default"].green(command) + ' ' + colors__default["default"].blue(args.join(' ')));
|
|
1880
|
+
try {
|
|
1881
|
+
var commandProcess = child_process.spawn(command, args, { cwd: cwd, shell: true });
|
|
1882
|
+
commandProcess.on('message', function (message) {
|
|
1883
|
+
console.info({ message: message });
|
|
1884
|
+
});
|
|
1885
|
+
var output_1 = [];
|
|
1886
|
+
commandProcess.stdout.on('data', function (stdout) {
|
|
1887
|
+
output_1.push(stdout.toString());
|
|
1888
|
+
console.info(stdout.toString());
|
|
1889
|
+
});
|
|
1890
|
+
commandProcess.stderr.on('data', function (stderr) {
|
|
1891
|
+
output_1.push(stderr.toString());
|
|
1892
|
+
if (stderr.toString().trim()) {
|
|
1893
|
+
console.warn(stderr.toString());
|
|
1894
|
+
}
|
|
1895
|
+
});
|
|
1896
|
+
var finishWithCode = function (code) {
|
|
1897
|
+
if (code !== 0) {
|
|
1898
|
+
if (crashOnError) {
|
|
1899
|
+
reject(new Error(output_1.join('\n').trim() ||
|
|
1900
|
+
"Command \"".concat(humanReadableCommand, "\" exited with code ").concat(code)));
|
|
1901
|
+
}
|
|
1902
|
+
else {
|
|
1903
|
+
console.warn("Command \"".concat(humanReadableCommand, "\" exited with code ").concat(code));
|
|
1904
|
+
resolve(spaceTrim.spaceTrim(output_1.join('\n')));
|
|
1905
|
+
}
|
|
1906
|
+
}
|
|
1907
|
+
else {
|
|
1908
|
+
resolve(spaceTrim.spaceTrim(output_1.join('\n')));
|
|
1909
|
+
}
|
|
1910
|
+
};
|
|
1911
|
+
commandProcess.on('close', finishWithCode);
|
|
1912
|
+
commandProcess.on('exit', finishWithCode);
|
|
1913
|
+
commandProcess.on('disconnect', function () {
|
|
1914
|
+
// Note: Unexpected disconnection should always result in rejection
|
|
1915
|
+
reject(new Error("Command \"".concat(humanReadableCommand, "\" disconnected")));
|
|
1916
|
+
});
|
|
1917
|
+
commandProcess.on('error', function (error) {
|
|
1918
|
+
if (crashOnError) {
|
|
1919
|
+
reject(new Error("Command \"".concat(humanReadableCommand, "\" failed: \n").concat(error.message)));
|
|
1920
|
+
}
|
|
1921
|
+
else {
|
|
1922
|
+
console.warn(error);
|
|
1923
|
+
resolve(spaceTrim.spaceTrim(output_1.join('\n')));
|
|
1924
|
+
}
|
|
1925
|
+
});
|
|
1926
|
+
}
|
|
1927
|
+
catch (error) {
|
|
1928
|
+
// Note: Unexpected error in sync code should always result in rejection
|
|
1929
|
+
reject(error);
|
|
1930
|
+
}
|
|
1931
|
+
});
|
|
1932
|
+
}
|
|
1933
|
+
/**
|
|
1934
|
+
* Note: [🟢 <- TODO: [🦖] !!!!!! Split scrapers into packages and enable] Code in this file should never be published outside of `@promptbook/node` and `@promptbook/cli`
|
|
1935
|
+
*/
|
|
1936
|
+
|
|
1937
|
+
/**
|
|
1938
|
+
* Checks if the file exists
|
|
1939
|
+
*
|
|
1940
|
+
* Note: `$` is used to indicate that this function is not a pure function - it looks at the filesystem
|
|
1941
|
+
*
|
|
1942
|
+
* @private within the repository
|
|
1943
|
+
*/
|
|
1944
|
+
function $isFileExisting(filename) {
|
|
1945
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
1946
|
+
var isReadAccessAllowed, isFile;
|
|
1947
|
+
return __generator(this, function (_a) {
|
|
1948
|
+
switch (_a.label) {
|
|
1949
|
+
case 0:
|
|
1950
|
+
if (!$isRunningInNode()) {
|
|
1951
|
+
throw new EnvironmentMismatchError('Function `$isFileExisting` works only in Node environment.js');
|
|
1952
|
+
}
|
|
1953
|
+
return [4 /*yield*/, promises.access(filename, promises.constants.R_OK)
|
|
1954
|
+
.then(function () { return true; })
|
|
1955
|
+
.catch(function () { return false; })];
|
|
1956
|
+
case 1:
|
|
1957
|
+
isReadAccessAllowed = _a.sent();
|
|
1958
|
+
if (!isReadAccessAllowed) {
|
|
1959
|
+
return [2 /*return*/, false];
|
|
1960
|
+
}
|
|
1961
|
+
return [4 /*yield*/, promises.stat(filename)
|
|
1962
|
+
.then(function (fileStat) { return fileStat.isFile(); })
|
|
1963
|
+
.catch(function () { return false; })];
|
|
1964
|
+
case 2:
|
|
1965
|
+
isFile = _a.sent();
|
|
1966
|
+
return [2 /*return*/, isFile];
|
|
1967
|
+
}
|
|
1968
|
+
});
|
|
1969
|
+
});
|
|
1970
|
+
}
|
|
1971
|
+
/**
|
|
1972
|
+
* Note: [🟢 <- TODO: [🦖] !!!!!! Split scrapers into packages and enable] Code in this file should never be published outside of `@promptbook/node` and `@promptbook/cli`
|
|
1973
|
+
* TODO: [🐠] This can be a validator - with variants that return true/false and variants that throw errors with meaningless messages
|
|
1974
|
+
* TODO: [🖇] What about symlinks?
|
|
1975
|
+
*/
|
|
1976
|
+
|
|
1977
|
+
/**
|
|
1978
|
+
* Get the file extension from a file name
|
|
1979
|
+
*
|
|
1980
|
+
* @private within the repository
|
|
1981
|
+
*/
|
|
1982
|
+
function getFileExtension(value) {
|
|
1983
|
+
var match = value.match(/\.([0-9a-z]+)(?:[?#]|$)/i);
|
|
1984
|
+
return match ? match[1].toLowerCase() : null;
|
|
1985
|
+
}
|
|
1771
1986
|
|
|
1772
1987
|
var defaultDiacriticsRemovalMap = [
|
|
1773
1988
|
{
|
|
@@ -2061,10 +2276,6 @@
|
|
|
2061
2276
|
charType = 'NUMBER';
|
|
2062
2277
|
normalizedChar = char;
|
|
2063
2278
|
}
|
|
2064
|
-
else if (/^\/$/.test(char)) {
|
|
2065
|
-
charType = 'SLASH';
|
|
2066
|
-
normalizedChar = char;
|
|
2067
|
-
}
|
|
2068
2279
|
else {
|
|
2069
2280
|
charType = 'OTHER';
|
|
2070
2281
|
normalizedChar = '-';
|
|
@@ -2109,6 +2320,32 @@
|
|
|
2109
2320
|
return text;
|
|
2110
2321
|
}
|
|
2111
2322
|
|
|
2323
|
+
/**
|
|
2324
|
+
* Tests if given string is valid URL.
|
|
2325
|
+
*
|
|
2326
|
+
* Note: This does not check if the file exists only if the path is valid
|
|
2327
|
+
* @public exported from `@promptbook/utils`
|
|
2328
|
+
*/
|
|
2329
|
+
function isValidFilePath(filename) {
|
|
2330
|
+
if (typeof filename !== 'string') {
|
|
2331
|
+
return false;
|
|
2332
|
+
}
|
|
2333
|
+
var filenameSlashes = filename.split('\\').join('/');
|
|
2334
|
+
// Absolute Unix path: /hello.txt
|
|
2335
|
+
if (/^(\/)/i.test(filenameSlashes)) {
|
|
2336
|
+
return true;
|
|
2337
|
+
}
|
|
2338
|
+
// Absolute Windows path: /hello.txt
|
|
2339
|
+
if (/^([A-Z]{1,2}:\/?)\//i.test(filenameSlashes)) {
|
|
2340
|
+
return true;
|
|
2341
|
+
}
|
|
2342
|
+
// Relative path: ./hello.txt
|
|
2343
|
+
if (/^(\.\.?\/)+/i.test(filenameSlashes)) {
|
|
2344
|
+
return true;
|
|
2345
|
+
}
|
|
2346
|
+
return false;
|
|
2347
|
+
}
|
|
2348
|
+
|
|
2112
2349
|
/**
|
|
2113
2350
|
* @@@
|
|
2114
2351
|
*
|
|
@@ -2118,20 +2355,121 @@
|
|
|
2118
2355
|
* @public exported from `@promptbook/utils`
|
|
2119
2356
|
*/
|
|
2120
2357
|
function titleToName(value) {
|
|
2121
|
-
if (
|
|
2122
|
-
|
|
2123
|
-
|
|
2358
|
+
if (isValidUrl(value)) {
|
|
2359
|
+
value = value.replace(/^https?:\/\//, '');
|
|
2360
|
+
value = value.replace(/\.html$/, '');
|
|
2124
2361
|
}
|
|
2125
|
-
if (
|
|
2126
|
-
|
|
2127
|
-
|
|
2362
|
+
else if (isValidFilePath(value)) {
|
|
2363
|
+
value = path.basename(value);
|
|
2364
|
+
// Note: Keeping extension in the name
|
|
2128
2365
|
}
|
|
2366
|
+
value = value.split('/').join('-');
|
|
2129
2367
|
value = removeEmojis(value);
|
|
2130
2368
|
value = normalizeToKebabCase(value);
|
|
2131
2369
|
// TODO: [🧠] Maybe warn or add some padding to short name which are not good identifiers
|
|
2132
2370
|
return value;
|
|
2133
2371
|
}
|
|
2134
2372
|
|
|
2373
|
+
/**
|
|
2374
|
+
* @@@
|
|
2375
|
+
*
|
|
2376
|
+
* @private for `FileCacheStorage`
|
|
2377
|
+
*/
|
|
2378
|
+
function nameToSubfolderPath(name) {
|
|
2379
|
+
return [name.substr(0, 1).toLowerCase(), name.substr(1, 1).toLowerCase()];
|
|
2380
|
+
}
|
|
2381
|
+
|
|
2382
|
+
/**
|
|
2383
|
+
* Just marks a place of place where should be something implemented
|
|
2384
|
+
* No side effects.
|
|
2385
|
+
*
|
|
2386
|
+
* Note: It can be usefull suppressing eslint errors of unused variables
|
|
2387
|
+
*
|
|
2388
|
+
* @param value any values
|
|
2389
|
+
* @returns void
|
|
2390
|
+
* @private within the repository
|
|
2391
|
+
*/
|
|
2392
|
+
function TODO_USE() {
|
|
2393
|
+
var value = [];
|
|
2394
|
+
for (var _i = 0; _i < arguments.length; _i++) {
|
|
2395
|
+
value[_i] = arguments[_i];
|
|
2396
|
+
}
|
|
2397
|
+
}
|
|
2398
|
+
|
|
2399
|
+
/**
|
|
2400
|
+
* Create a filename for intermediate cache for scrapers
|
|
2401
|
+
*
|
|
2402
|
+
* Note: It also checks if directory exists and creates it if not
|
|
2403
|
+
*
|
|
2404
|
+
* @private as internal utility for scrapers
|
|
2405
|
+
*/
|
|
2406
|
+
function getScraperIntermediateSource(source, options) {
|
|
2407
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
2408
|
+
var sourceFilename, url, rootDirname, cacheDirname, isCacheCleaned, extension, isVerbose, hash, semanticName, pieces, name, cacheFilename, isDestroyed, fileHandler;
|
|
2409
|
+
return __generator(this, function (_a) {
|
|
2410
|
+
switch (_a.label) {
|
|
2411
|
+
case 0:
|
|
2412
|
+
sourceFilename = source.filename, url = source.url;
|
|
2413
|
+
rootDirname = options.rootDirname, cacheDirname = options.cacheDirname, isCacheCleaned = options.isCacheCleaned, extension = options.extension, isVerbose = options.isVerbose;
|
|
2414
|
+
hash = cryptoJs.SHA256(
|
|
2415
|
+
// <- TODO: [🥬] Encapsulate sha256 to some private utility function
|
|
2416
|
+
hexEncoder__default["default"].parse(sourceFilename || url || 'untitled'))
|
|
2417
|
+
.toString( /* hex */)
|
|
2418
|
+
.substring(0, 20);
|
|
2419
|
+
semanticName = normalizeToKebabCase(titleToName((sourceFilename || url || '').split('intermediate').join(''))).substring(0, 20);
|
|
2420
|
+
pieces = ['intermediate', semanticName, hash].filter(function (piece) { return piece !== ''; });
|
|
2421
|
+
name = pieces.join('-').split('--').join('-');
|
|
2422
|
+
// <- TODO: Use MAX_FILENAME_LENGTH
|
|
2423
|
+
TODO_USE(rootDirname); // <- TODO: !!!!!!
|
|
2424
|
+
cacheFilename = path.join.apply(void 0, __spreadArray(__spreadArray([process.cwd(),
|
|
2425
|
+
cacheDirname], __read(nameToSubfolderPath(hash /* <- TODO: [🎎] Maybe add some SHA256 prefix */)), false), [name], false)).split('\\')
|
|
2426
|
+
.join('/') +
|
|
2427
|
+
'.' +
|
|
2428
|
+
extension;
|
|
2429
|
+
return [4 /*yield*/, promises.mkdir(path.dirname(cacheFilename), { recursive: true })];
|
|
2430
|
+
case 1:
|
|
2431
|
+
_a.sent();
|
|
2432
|
+
isDestroyed = true;
|
|
2433
|
+
fileHandler = {
|
|
2434
|
+
filename: cacheFilename,
|
|
2435
|
+
get isDestroyed() {
|
|
2436
|
+
return isDestroyed;
|
|
2437
|
+
},
|
|
2438
|
+
destroy: function () {
|
|
2439
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
2440
|
+
return __generator(this, function (_a) {
|
|
2441
|
+
switch (_a.label) {
|
|
2442
|
+
case 0:
|
|
2443
|
+
if (!isCacheCleaned) return [3 /*break*/, 2];
|
|
2444
|
+
if (isVerbose) {
|
|
2445
|
+
console.info('legacyDocumentScraper: Clening cache');
|
|
2446
|
+
}
|
|
2447
|
+
return [4 /*yield*/, promises.rm(cacheFilename)];
|
|
2448
|
+
case 1:
|
|
2449
|
+
_a.sent();
|
|
2450
|
+
_a.label = 2;
|
|
2451
|
+
case 2:
|
|
2452
|
+
isDestroyed = true;
|
|
2453
|
+
return [2 /*return*/];
|
|
2454
|
+
}
|
|
2455
|
+
});
|
|
2456
|
+
});
|
|
2457
|
+
},
|
|
2458
|
+
};
|
|
2459
|
+
return [2 /*return*/, fileHandler];
|
|
2460
|
+
}
|
|
2461
|
+
});
|
|
2462
|
+
});
|
|
2463
|
+
}
|
|
2464
|
+
/**
|
|
2465
|
+
* Note: Not using `FileCacheStorage` for two reasons:
|
|
2466
|
+
* 1) Need to store more than serialized JSONs
|
|
2467
|
+
* 2) Need to switch between a `rootDirname` and `cacheDirname` <- TODO: !!!!
|
|
2468
|
+
* TODO: [🐱🐉][🧠] Make some smart crop
|
|
2469
|
+
*/
|
|
2470
|
+
|
|
2471
|
+
var PipelineCollection = [{title:"Prepare Knowledge from Markdown",pipelineUrl:"https://promptbook.studio/promptbook/prepare-knowledge-from-markdown.ptbk.md",parameters:[{name:"knowledgeContent",description:"Markdown document content",isInput:true,isOutput:false},{name:"knowledgePieces",description:"The knowledge JSON object",isInput:false,isOutput:true}],templates:[{templateType:"PROMPT_TEMPLATE",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"]}],knowledgeSources:[],knowledgePieces:[],personas:[],preparations:[],sourceFile:"./promptbook-collection/prepare-knowledge-from-markdown.ptbk.md"},{title:"Prepare Keywords",pipelineUrl:"https://promptbook.studio/promptbook/prepare-knowledge-keywords.ptbk.md",parameters:[{name:"knowledgePieceContent",description:"The content",isInput:true,isOutput:false},{name:"keywords",description:"Keywords separated by comma",isInput:false,isOutput:true}],templates:[{templateType:"PROMPT_TEMPLATE",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"]}],knowledgeSources:[],knowledgePieces:[],personas:[],preparations:[],sourceFile:"./promptbook-collection/prepare-knowledge-keywords.ptbk.md"},{title:"Prepare Title",pipelineUrl:"https://promptbook.studio/promptbook/prepare-knowledge-title.ptbk.md",parameters:[{name:"knowledgePieceContent",description:"The content",isInput:true,isOutput:false},{name:"title",description:"The title of the document",isInput:false,isOutput:true}],templates:[{templateType:"PROMPT_TEMPLATE",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- Title should be concise and clear\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"]}],knowledgeSources:[],knowledgePieces:[],personas:[],preparations:[],sourceFile:"./promptbook-collection/prepare-knowledge-title.ptbk.md"},{title:"Prepare Keywords",pipelineUrl:"https://promptbook.studio/promptbook/prepare-persona.ptbk.md",parameters:[{name:"availableModelNames",description:"List of available model names separated by comma (,)",isInput:true,isOutput:false},{name:"personaDescription",description:"Description of the persona",isInput:true,isOutput:false},{name:"modelRequirements",description:"Specific requirements for the model",isInput:false,isOutput:true}],templates:[{templateType:"PROMPT_TEMPLATE",name:"make-model-requirements",title:"Make modelRequirements",content:"You are experienced AI engineer, you need to create virtual assistant.\nWrite\n\n## Sample\n\n```json\n{\n\"modelName\": \"gpt-4o\",\n\"systemMessage\": \"You are experienced AI engineer and helpfull assistant.\",\n\"temperature\": 0.7\n}\n```\n\n## Instructions\n\n- Your output format is JSON object\n- Write just the JSON object, no other text should be present\n- It contains the 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\nPick from the following models:\n\n- {availableModelNames}\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:"modelRequirements",format:"JSON",dependentParameterNames:["availableModelNames","personaDescription"]}],knowledgeSources:[],knowledgePieces:[],personas:[],preparations:[],sourceFile:"./promptbook-collection/prepare-persona.ptbk.md"}];
|
|
2472
|
+
|
|
2135
2473
|
/**
|
|
2136
2474
|
* This error indicates errors during the execution of the pipeline
|
|
2137
2475
|
*
|
|
@@ -2164,22 +2502,6 @@
|
|
|
2164
2502
|
return CollectionError;
|
|
2165
2503
|
}(Error));
|
|
2166
2504
|
|
|
2167
|
-
/**
|
|
2168
|
-
* This error type indicates that you try to use a feature that is not available in the current environment
|
|
2169
|
-
*
|
|
2170
|
-
* @public exported from `@promptbook/core`
|
|
2171
|
-
*/
|
|
2172
|
-
var EnvironmentMismatchError = /** @class */ (function (_super) {
|
|
2173
|
-
__extends(EnvironmentMismatchError, _super);
|
|
2174
|
-
function EnvironmentMismatchError(message) {
|
|
2175
|
-
var _this = _super.call(this, message) || this;
|
|
2176
|
-
_this.name = 'EnvironmentMismatchError';
|
|
2177
|
-
Object.setPrototypeOf(_this, EnvironmentMismatchError.prototype);
|
|
2178
|
-
return _this;
|
|
2179
|
-
}
|
|
2180
|
-
return EnvironmentMismatchError;
|
|
2181
|
-
}(Error));
|
|
2182
|
-
|
|
2183
2505
|
/**
|
|
2184
2506
|
* This error occurs when some expectation is not met in the execution of the pipeline
|
|
2185
2507
|
*
|
|
@@ -2679,19 +3001,72 @@
|
|
|
2679
3001
|
*/
|
|
2680
3002
|
|
|
2681
3003
|
/**
|
|
2682
|
-
*
|
|
2683
|
-
*
|
|
2684
|
-
* Note: If you provide 0 values, it returns ZERO_USAGE
|
|
3004
|
+
* Represents the usage with no resources consumed
|
|
2685
3005
|
*
|
|
2686
3006
|
* @public exported from `@promptbook/core`
|
|
2687
3007
|
*/
|
|
2688
|
-
|
|
2689
|
-
|
|
2690
|
-
|
|
2691
|
-
|
|
2692
|
-
|
|
2693
|
-
|
|
2694
|
-
|
|
3008
|
+
var ZERO_USAGE = $deepFreeze({
|
|
3009
|
+
price: { value: 0 },
|
|
3010
|
+
input: {
|
|
3011
|
+
tokensCount: { value: 0 },
|
|
3012
|
+
charactersCount: { value: 0 },
|
|
3013
|
+
wordsCount: { value: 0 },
|
|
3014
|
+
sentencesCount: { value: 0 },
|
|
3015
|
+
linesCount: { value: 0 },
|
|
3016
|
+
paragraphsCount: { value: 0 },
|
|
3017
|
+
pagesCount: { value: 0 },
|
|
3018
|
+
},
|
|
3019
|
+
output: {
|
|
3020
|
+
tokensCount: { value: 0 },
|
|
3021
|
+
charactersCount: { value: 0 },
|
|
3022
|
+
wordsCount: { value: 0 },
|
|
3023
|
+
sentencesCount: { value: 0 },
|
|
3024
|
+
linesCount: { value: 0 },
|
|
3025
|
+
paragraphsCount: { value: 0 },
|
|
3026
|
+
pagesCount: { value: 0 },
|
|
3027
|
+
},
|
|
3028
|
+
});
|
|
3029
|
+
/**
|
|
3030
|
+
* Represents the usage with unknown resources consumed
|
|
3031
|
+
*
|
|
3032
|
+
* @public exported from `@promptbook/core`
|
|
3033
|
+
*/
|
|
3034
|
+
var UNCERTAIN_USAGE = $deepFreeze({
|
|
3035
|
+
price: { value: 0, isUncertain: true },
|
|
3036
|
+
input: {
|
|
3037
|
+
tokensCount: { value: 0, isUncertain: true },
|
|
3038
|
+
charactersCount: { value: 0, isUncertain: true },
|
|
3039
|
+
wordsCount: { value: 0, isUncertain: true },
|
|
3040
|
+
sentencesCount: { value: 0, isUncertain: true },
|
|
3041
|
+
linesCount: { value: 0, isUncertain: true },
|
|
3042
|
+
paragraphsCount: { value: 0, isUncertain: true },
|
|
3043
|
+
pagesCount: { value: 0, isUncertain: true },
|
|
3044
|
+
},
|
|
3045
|
+
output: {
|
|
3046
|
+
tokensCount: { value: 0, isUncertain: true },
|
|
3047
|
+
charactersCount: { value: 0, isUncertain: true },
|
|
3048
|
+
wordsCount: { value: 0, isUncertain: true },
|
|
3049
|
+
sentencesCount: { value: 0, isUncertain: true },
|
|
3050
|
+
linesCount: { value: 0, isUncertain: true },
|
|
3051
|
+
paragraphsCount: { value: 0, isUncertain: true },
|
|
3052
|
+
pagesCount: { value: 0, isUncertain: true },
|
|
3053
|
+
},
|
|
3054
|
+
});
|
|
3055
|
+
|
|
3056
|
+
/**
|
|
3057
|
+
* Function `addUsage` will add multiple usages into one
|
|
3058
|
+
*
|
|
3059
|
+
* Note: If you provide 0 values, it returns ZERO_USAGE
|
|
3060
|
+
*
|
|
3061
|
+
* @public exported from `@promptbook/core`
|
|
3062
|
+
*/
|
|
3063
|
+
function addUsage() {
|
|
3064
|
+
var usageItems = [];
|
|
3065
|
+
for (var _i = 0; _i < arguments.length; _i++) {
|
|
3066
|
+
usageItems[_i] = arguments[_i];
|
|
3067
|
+
}
|
|
3068
|
+
return usageItems.reduce(function (acc, item) {
|
|
3069
|
+
var e_1, _a, e_2, _b;
|
|
2695
3070
|
var _c;
|
|
2696
3071
|
acc.price.value += ((_c = item.price) === null || _c === void 0 ? void 0 : _c.value) || 0;
|
|
2697
3072
|
try {
|
|
@@ -2955,23 +3330,6 @@
|
|
|
2955
3330
|
return union;
|
|
2956
3331
|
}
|
|
2957
3332
|
|
|
2958
|
-
/**
|
|
2959
|
-
* Just marks a place of place where should be something implemented
|
|
2960
|
-
* No side effects.
|
|
2961
|
-
*
|
|
2962
|
-
* Note: It can be usefull suppressing eslint errors of unused variables
|
|
2963
|
-
*
|
|
2964
|
-
* @param value any values
|
|
2965
|
-
* @returns void
|
|
2966
|
-
* @private within the repository
|
|
2967
|
-
*/
|
|
2968
|
-
function TODO_USE() {
|
|
2969
|
-
var value = [];
|
|
2970
|
-
for (var _i = 0; _i < arguments.length; _i++) {
|
|
2971
|
-
value[_i] = arguments[_i];
|
|
2972
|
-
}
|
|
2973
|
-
}
|
|
2974
|
-
|
|
2975
3333
|
/**
|
|
2976
3334
|
* This error indicates problems parsing the format value
|
|
2977
3335
|
*
|
|
@@ -3015,7 +3373,7 @@
|
|
|
3015
3373
|
*/
|
|
3016
3374
|
var MANDATORY_CSV_SETTINGS = Object.freeze({
|
|
3017
3375
|
header: true,
|
|
3018
|
-
// encoding: '
|
|
3376
|
+
// encoding: 'utf-8',
|
|
3019
3377
|
});
|
|
3020
3378
|
|
|
3021
3379
|
/**
|
|
@@ -4469,25 +4827,26 @@
|
|
|
4469
4827
|
*/
|
|
4470
4828
|
function executePipeline(options) {
|
|
4471
4829
|
return __awaiter(this, void 0, void 0, function () {
|
|
4472
|
-
var inputParameters, tools, onProgress, pipeline, setPreparedPipeline, pipelineIdentification, settings, maxParallelCount, isVerbose, preparedPipeline, llmTools, errors, warnings, executionReport, isReturned,
|
|
4473
|
-
var e_1,
|
|
4474
|
-
return __generator(this, function (
|
|
4475
|
-
switch (
|
|
4830
|
+
var inputParameters, tools, onProgress, pipeline, setPreparedPipeline, pipelineIdentification, settings, maxParallelCount, rootDirname, _a, isVerbose, preparedPipeline, llmTools, errors, warnings, executionReport, isReturned, _b, _c, parameter, e_1_1, _loop_1, _d, _e, parameterName, state_1, e_2_1, parametersToPass, resovedParameterNames_1, unresovedTemplates_1, resolving_1, loopLimit, _loop_2, error_1, usage_1, outputParameters_1, usage, outputParameters;
|
|
4831
|
+
var e_1, _f, e_2, _g;
|
|
4832
|
+
return __generator(this, function (_h) {
|
|
4833
|
+
switch (_h.label) {
|
|
4476
4834
|
case 0:
|
|
4477
4835
|
inputParameters = options.inputParameters, tools = options.tools, onProgress = options.onProgress, pipeline = options.pipeline, setPreparedPipeline = options.setPreparedPipeline, pipelineIdentification = options.pipelineIdentification, settings = options.settings;
|
|
4478
|
-
maxParallelCount = settings.maxParallelCount,
|
|
4836
|
+
maxParallelCount = settings.maxParallelCount, rootDirname = settings.rootDirname, _a = settings.isVerbose, isVerbose = _a === void 0 ? IS_VERBOSE : _a;
|
|
4479
4837
|
preparedPipeline = options.preparedPipeline;
|
|
4480
4838
|
llmTools = joinLlmExecutionTools.apply(void 0, __spreadArray([], __read(arrayableToArray(tools.llm)), false));
|
|
4481
4839
|
if (!(preparedPipeline === undefined)) return [3 /*break*/, 2];
|
|
4482
4840
|
return [4 /*yield*/, preparePipeline(pipeline, {
|
|
4483
4841
|
llmTools: llmTools,
|
|
4842
|
+
rootDirname: rootDirname,
|
|
4484
4843
|
isVerbose: isVerbose,
|
|
4485
4844
|
maxParallelCount: maxParallelCount,
|
|
4486
4845
|
})];
|
|
4487
4846
|
case 1:
|
|
4488
|
-
preparedPipeline =
|
|
4847
|
+
preparedPipeline = _h.sent();
|
|
4489
4848
|
setPreparedPipeline(preparedPipeline);
|
|
4490
|
-
|
|
4849
|
+
_h.label = 2;
|
|
4491
4850
|
case 2:
|
|
4492
4851
|
errors = [];
|
|
4493
4852
|
warnings = [];
|
|
@@ -4500,17 +4859,17 @@
|
|
|
4500
4859
|
promptExecutions: [],
|
|
4501
4860
|
};
|
|
4502
4861
|
isReturned = false;
|
|
4503
|
-
|
|
4862
|
+
_h.label = 3;
|
|
4504
4863
|
case 3:
|
|
4505
|
-
|
|
4506
|
-
|
|
4864
|
+
_h.trys.push([3, 9, 10, 11]);
|
|
4865
|
+
_b = __values(preparedPipeline.parameters.filter(function (_a) {
|
|
4507
4866
|
var isInput = _a.isInput;
|
|
4508
4867
|
return isInput;
|
|
4509
|
-
})),
|
|
4510
|
-
|
|
4868
|
+
})), _c = _b.next();
|
|
4869
|
+
_h.label = 4;
|
|
4511
4870
|
case 4:
|
|
4512
|
-
if (!!
|
|
4513
|
-
parameter =
|
|
4871
|
+
if (!!_c.done) return [3 /*break*/, 8];
|
|
4872
|
+
parameter = _c.value;
|
|
4514
4873
|
if (!(inputParameters[parameter.name] === undefined)) return [3 /*break*/, 7];
|
|
4515
4874
|
isReturned = true;
|
|
4516
4875
|
if (!(onProgress !== undefined)) return [3 /*break*/, 6];
|
|
@@ -4518,8 +4877,8 @@
|
|
|
4518
4877
|
return [4 /*yield*/, waitasecond.forTime(IMMEDIATE_TIME)];
|
|
4519
4878
|
case 5:
|
|
4520
4879
|
// Note: Wait a short time to prevent race conditions
|
|
4521
|
-
|
|
4522
|
-
|
|
4880
|
+
_h.sent();
|
|
4881
|
+
_h.label = 6;
|
|
4523
4882
|
case 6: return [2 /*return*/, $asDeeplyFrozenSerializableJson("Unuccessful PipelineExecutorResult (with missing parameter {".concat(parameter.name, "}) PipelineExecutorResult"), {
|
|
4524
4883
|
isSuccessful: false,
|
|
4525
4884
|
errors: __spreadArray([
|
|
@@ -4532,24 +4891,24 @@
|
|
|
4532
4891
|
preparedPipeline: preparedPipeline,
|
|
4533
4892
|
})];
|
|
4534
4893
|
case 7:
|
|
4535
|
-
|
|
4894
|
+
_c = _b.next();
|
|
4536
4895
|
return [3 /*break*/, 4];
|
|
4537
4896
|
case 8: return [3 /*break*/, 11];
|
|
4538
4897
|
case 9:
|
|
4539
|
-
e_1_1 =
|
|
4898
|
+
e_1_1 = _h.sent();
|
|
4540
4899
|
e_1 = { error: e_1_1 };
|
|
4541
4900
|
return [3 /*break*/, 11];
|
|
4542
4901
|
case 10:
|
|
4543
4902
|
try {
|
|
4544
|
-
if (
|
|
4903
|
+
if (_c && !_c.done && (_f = _b.return)) _f.call(_b);
|
|
4545
4904
|
}
|
|
4546
4905
|
finally { if (e_1) throw e_1.error; }
|
|
4547
4906
|
return [7 /*endfinally*/];
|
|
4548
4907
|
case 11:
|
|
4549
4908
|
_loop_1 = function (parameterName) {
|
|
4550
4909
|
var parameter;
|
|
4551
|
-
return __generator(this, function (
|
|
4552
|
-
switch (
|
|
4910
|
+
return __generator(this, function (_j) {
|
|
4911
|
+
switch (_j.label) {
|
|
4553
4912
|
case 0:
|
|
4554
4913
|
parameter = preparedPipeline.parameters.find(function (_a) {
|
|
4555
4914
|
var name = _a.name;
|
|
@@ -4566,8 +4925,8 @@
|
|
|
4566
4925
|
return [4 /*yield*/, waitasecond.forTime(IMMEDIATE_TIME)];
|
|
4567
4926
|
case 2:
|
|
4568
4927
|
// Note: Wait a short time to prevent race conditions
|
|
4569
|
-
|
|
4570
|
-
|
|
4928
|
+
_j.sent();
|
|
4929
|
+
_j.label = 3;
|
|
4571
4930
|
case 3: return [2 /*return*/, { value: $asDeeplyFrozenSerializableJson(spaceTrim.spaceTrim(function (block) { return "\n Unuccessful PipelineExecutorResult (with extra parameter {".concat(parameter.name, "}) PipelineExecutorResult\n\n ").concat(block(pipelineIdentification), "\n "); }), {
|
|
4572
4931
|
isSuccessful: false,
|
|
4573
4932
|
errors: __spreadArray([
|
|
@@ -4583,39 +4942,39 @@
|
|
|
4583
4942
|
}
|
|
4584
4943
|
});
|
|
4585
4944
|
};
|
|
4586
|
-
|
|
4945
|
+
_h.label = 12;
|
|
4587
4946
|
case 12:
|
|
4588
|
-
|
|
4589
|
-
|
|
4590
|
-
|
|
4947
|
+
_h.trys.push([12, 17, 18, 19]);
|
|
4948
|
+
_d = __values(Object.keys(inputParameters)), _e = _d.next();
|
|
4949
|
+
_h.label = 13;
|
|
4591
4950
|
case 13:
|
|
4592
|
-
if (!!
|
|
4593
|
-
parameterName =
|
|
4951
|
+
if (!!_e.done) return [3 /*break*/, 16];
|
|
4952
|
+
parameterName = _e.value;
|
|
4594
4953
|
return [5 /*yield**/, _loop_1(parameterName)];
|
|
4595
4954
|
case 14:
|
|
4596
|
-
state_1 =
|
|
4955
|
+
state_1 = _h.sent();
|
|
4597
4956
|
if (typeof state_1 === "object")
|
|
4598
4957
|
return [2 /*return*/, state_1.value];
|
|
4599
|
-
|
|
4958
|
+
_h.label = 15;
|
|
4600
4959
|
case 15:
|
|
4601
|
-
|
|
4960
|
+
_e = _d.next();
|
|
4602
4961
|
return [3 /*break*/, 13];
|
|
4603
4962
|
case 16: return [3 /*break*/, 19];
|
|
4604
4963
|
case 17:
|
|
4605
|
-
e_2_1 =
|
|
4964
|
+
e_2_1 = _h.sent();
|
|
4606
4965
|
e_2 = { error: e_2_1 };
|
|
4607
4966
|
return [3 /*break*/, 19];
|
|
4608
4967
|
case 18:
|
|
4609
4968
|
try {
|
|
4610
|
-
if (
|
|
4969
|
+
if (_e && !_e.done && (_g = _d.return)) _g.call(_d);
|
|
4611
4970
|
}
|
|
4612
4971
|
finally { if (e_2) throw e_2.error; }
|
|
4613
4972
|
return [7 /*endfinally*/];
|
|
4614
4973
|
case 19:
|
|
4615
4974
|
parametersToPass = inputParameters;
|
|
4616
|
-
|
|
4975
|
+
_h.label = 20;
|
|
4617
4976
|
case 20:
|
|
4618
|
-
|
|
4977
|
+
_h.trys.push([20, 25, , 28]);
|
|
4619
4978
|
resovedParameterNames_1 = preparedPipeline.parameters
|
|
4620
4979
|
.filter(function (_a) {
|
|
4621
4980
|
var isInput = _a.isInput;
|
|
@@ -4630,8 +4989,8 @@
|
|
|
4630
4989
|
loopLimit = LOOP_LIMIT;
|
|
4631
4990
|
_loop_2 = function () {
|
|
4632
4991
|
var currentTemplate, work_1;
|
|
4633
|
-
return __generator(this, function (
|
|
4634
|
-
switch (
|
|
4992
|
+
return __generator(this, function (_k) {
|
|
4993
|
+
switch (_k.label) {
|
|
4635
4994
|
case 0:
|
|
4636
4995
|
if (loopLimit-- < 0) {
|
|
4637
4996
|
// Note: Really UnexpectedError not LimitReachedError - this should be catched during validatePipeline
|
|
@@ -4657,7 +5016,7 @@
|
|
|
4657
5016
|
if (!!currentTemplate) return [3 /*break*/, 3];
|
|
4658
5017
|
/* [🤹♂️] */ return [4 /*yield*/, Promise.race(resolving_1)];
|
|
4659
5018
|
case 2:
|
|
4660
|
-
/* [🤹♂️] */
|
|
5019
|
+
/* [🤹♂️] */ _k.sent();
|
|
4661
5020
|
return [3 /*break*/, 4];
|
|
4662
5021
|
case 3:
|
|
4663
5022
|
unresovedTemplates_1 = unresovedTemplates_1.filter(function (template) { return template !== currentTemplate; });
|
|
@@ -4692,24 +5051,24 @@
|
|
|
4692
5051
|
// <- Note: Errors are catched here [3]
|
|
4693
5052
|
// TODO: BUT if in multiple templates are errors, only the first one is catched so maybe we should catch errors here and save them to errors array here
|
|
4694
5053
|
resolving_1.push(work_1);
|
|
4695
|
-
|
|
5054
|
+
_k.label = 4;
|
|
4696
5055
|
case 4: return [2 /*return*/];
|
|
4697
5056
|
}
|
|
4698
5057
|
});
|
|
4699
5058
|
};
|
|
4700
|
-
|
|
5059
|
+
_h.label = 21;
|
|
4701
5060
|
case 21:
|
|
4702
5061
|
if (!(unresovedTemplates_1.length > 0)) return [3 /*break*/, 23];
|
|
4703
5062
|
return [5 /*yield**/, _loop_2()];
|
|
4704
5063
|
case 22:
|
|
4705
|
-
|
|
5064
|
+
_h.sent();
|
|
4706
5065
|
return [3 /*break*/, 21];
|
|
4707
5066
|
case 23: return [4 /*yield*/, Promise.all(resolving_1)];
|
|
4708
5067
|
case 24:
|
|
4709
|
-
|
|
5068
|
+
_h.sent();
|
|
4710
5069
|
return [3 /*break*/, 28];
|
|
4711
5070
|
case 25:
|
|
4712
|
-
error_1 =
|
|
5071
|
+
error_1 = _h.sent();
|
|
4713
5072
|
if (!(error_1 instanceof Error)) {
|
|
4714
5073
|
throw error_1;
|
|
4715
5074
|
}
|
|
@@ -4729,8 +5088,8 @@
|
|
|
4729
5088
|
return [4 /*yield*/, waitasecond.forTime(IMMEDIATE_TIME)];
|
|
4730
5089
|
case 26:
|
|
4731
5090
|
// Note: Wait a short time to prevent race conditions
|
|
4732
|
-
|
|
4733
|
-
|
|
5091
|
+
_h.sent();
|
|
5092
|
+
_h.label = 27;
|
|
4734
5093
|
case 27: return [2 /*return*/, $asDeeplyFrozenSerializableJson('Unuccessful PipelineExecutorResult (with misc errors) PipelineExecutorResult', {
|
|
4735
5094
|
isSuccessful: false,
|
|
4736
5095
|
errors: __spreadArray([error_1], __read(errors), false).map(serializeError),
|
|
@@ -4757,8 +5116,8 @@
|
|
|
4757
5116
|
return [4 /*yield*/, waitasecond.forTime(IMMEDIATE_TIME)];
|
|
4758
5117
|
case 29:
|
|
4759
5118
|
// Note: Wait a short time to prevent race conditions
|
|
4760
|
-
|
|
4761
|
-
|
|
5119
|
+
_h.sent();
|
|
5120
|
+
_h.label = 30;
|
|
4762
5121
|
case 30: return [2 /*return*/, $asDeeplyFrozenSerializableJson('Successful PipelineExecutorResult', {
|
|
4763
5122
|
isSuccessful: true,
|
|
4764
5123
|
errors: errors.map(serializeError),
|
|
@@ -4770,211 +5129,883 @@
|
|
|
4770
5129
|
})];
|
|
4771
5130
|
}
|
|
4772
5131
|
});
|
|
4773
|
-
});
|
|
4774
|
-
}
|
|
5132
|
+
});
|
|
5133
|
+
}
|
|
5134
|
+
/**
|
|
5135
|
+
* TODO: [🐚] Change onProgress to object that represents the running execution, can be subscribed via RxJS to and also awaited
|
|
5136
|
+
*/
|
|
5137
|
+
|
|
5138
|
+
/**
|
|
5139
|
+
* Creates executor function from pipeline and execution tools.
|
|
5140
|
+
*
|
|
5141
|
+
* @returns The executor function
|
|
5142
|
+
* @throws {PipelineLogicError} on logical error in the pipeline
|
|
5143
|
+
* @public exported from `@promptbook/core`
|
|
5144
|
+
*/
|
|
5145
|
+
function createPipelineExecutor(options) {
|
|
5146
|
+
var _this = this;
|
|
5147
|
+
var pipeline = options.pipeline, tools = options.tools, _a = options.settings, settings = _a === void 0 ? {} : _a;
|
|
5148
|
+
var _b = settings.maxExecutionAttempts, maxExecutionAttempts = _b === void 0 ? MAX_EXECUTION_ATTEMPTS : _b, _c = settings.maxParallelCount, maxParallelCount = _c === void 0 ? MAX_PARALLEL_COUNT : _c, _d = settings.csvSettings, csvSettings = _d === void 0 ? DEFAULT_CSV_SETTINGS : _d, _e = settings.isVerbose, isVerbose = _e === void 0 ? IS_VERBOSE : _e, _f = settings.isNotPreparedWarningSupressed, isNotPreparedWarningSupressed = _f === void 0 ? false : _f, _g = settings.rootDirname, rootDirname = _g === void 0 ? null : _g;
|
|
5149
|
+
validatePipeline(pipeline);
|
|
5150
|
+
var pipelineIdentification = (function () {
|
|
5151
|
+
// Note: This is a 😐 implementation of [🚞]
|
|
5152
|
+
var _ = [];
|
|
5153
|
+
if (pipeline.sourceFile !== undefined) {
|
|
5154
|
+
_.push("File: ".concat(pipeline.sourceFile));
|
|
5155
|
+
}
|
|
5156
|
+
if (pipeline.pipelineUrl !== undefined) {
|
|
5157
|
+
_.push("Url: ".concat(pipeline.pipelineUrl));
|
|
5158
|
+
}
|
|
5159
|
+
return _.join('\n');
|
|
5160
|
+
})();
|
|
5161
|
+
var preparedPipeline;
|
|
5162
|
+
if (isPipelinePrepared(pipeline)) {
|
|
5163
|
+
preparedPipeline = pipeline;
|
|
5164
|
+
}
|
|
5165
|
+
else if (isNotPreparedWarningSupressed !== true) {
|
|
5166
|
+
console.warn(spaceTrim.spaceTrim(function (block) { return "\n Pipeline is not prepared\n\n ".concat(block(pipelineIdentification), "\n\n It will be prepared ad-hoc before the first execution and **returned as `preparedPipeline` in `PipelineExecutorResult`**\n But it is recommended to prepare the pipeline during collection preparation\n\n @see more at https://ptbk.io/prepare-pipeline\n "); }));
|
|
5167
|
+
}
|
|
5168
|
+
var runCount = 0;
|
|
5169
|
+
var pipelineExecutor = function (inputParameters, onProgress) { return __awaiter(_this, void 0, void 0, function () {
|
|
5170
|
+
return __generator(this, function (_a) {
|
|
5171
|
+
runCount++;
|
|
5172
|
+
return [2 /*return*/, /* not await */ executePipeline({
|
|
5173
|
+
pipeline: pipeline,
|
|
5174
|
+
preparedPipeline: preparedPipeline,
|
|
5175
|
+
setPreparedPipeline: function (newPreparedPipeline) {
|
|
5176
|
+
preparedPipeline = newPreparedPipeline;
|
|
5177
|
+
},
|
|
5178
|
+
inputParameters: inputParameters,
|
|
5179
|
+
tools: tools,
|
|
5180
|
+
onProgress: onProgress,
|
|
5181
|
+
pipelineIdentification: spaceTrim.spaceTrim(function (block) { return "\n ".concat(block(pipelineIdentification), "\n ").concat(runCount === 1 ? '' : "Run #".concat(runCount), "\n "); }),
|
|
5182
|
+
settings: {
|
|
5183
|
+
maxExecutionAttempts: maxExecutionAttempts,
|
|
5184
|
+
maxParallelCount: maxParallelCount,
|
|
5185
|
+
csvSettings: csvSettings,
|
|
5186
|
+
isVerbose: isVerbose,
|
|
5187
|
+
isNotPreparedWarningSupressed: isNotPreparedWarningSupressed,
|
|
5188
|
+
rootDirname: rootDirname,
|
|
5189
|
+
},
|
|
5190
|
+
})];
|
|
5191
|
+
});
|
|
5192
|
+
}); };
|
|
5193
|
+
return pipelineExecutor;
|
|
5194
|
+
}
|
|
5195
|
+
/**
|
|
5196
|
+
* TODO: [🐚] Change onProgress to object that represents the running execution, can be subscribed via RxJS to and also awaited
|
|
5197
|
+
*/
|
|
5198
|
+
|
|
5199
|
+
/**
|
|
5200
|
+
* Scraper for markdown files
|
|
5201
|
+
*
|
|
5202
|
+
* @see `documentationUrl` for more details
|
|
5203
|
+
* @public exported from `@promptbook/core`
|
|
5204
|
+
*/
|
|
5205
|
+
var markdownScraper = {
|
|
5206
|
+
/**
|
|
5207
|
+
* Mime types that this scraper can handle
|
|
5208
|
+
*/
|
|
5209
|
+
mimeTypes: ['text/markdown', 'text/plain'],
|
|
5210
|
+
/**
|
|
5211
|
+
* Link to documentation
|
|
5212
|
+
*/
|
|
5213
|
+
documentationUrl: 'https://github.com/webgptorg/promptbook/discussions/@@',
|
|
5214
|
+
/**
|
|
5215
|
+
* Scrapes the markdown file and returns the knowledge pieces or `null` if it can't scrape it
|
|
5216
|
+
*/
|
|
5217
|
+
scrape: function (source, options) {
|
|
5218
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
5219
|
+
var llmTools, _a, maxParallelCount, _b, isVerbose, collection, prepareKnowledgeFromMarkdownExecutor, _c, prepareTitleExecutor, _d, prepareKeywordsExecutor, _e, knowledgeContent, result, outputParameters, knowledgePiecesRaw, knowledgeTextPieces, knowledge;
|
|
5220
|
+
var _f, _g, _h;
|
|
5221
|
+
var _this = this;
|
|
5222
|
+
return __generator(this, function (_j) {
|
|
5223
|
+
switch (_j.label) {
|
|
5224
|
+
case 0:
|
|
5225
|
+
llmTools = options.llmTools, _a = options.maxParallelCount, maxParallelCount = _a === void 0 ? MAX_PARALLEL_COUNT : _a, _b = options.isVerbose, isVerbose = _b === void 0 ? IS_VERBOSE : _b;
|
|
5226
|
+
if (llmTools === undefined) {
|
|
5227
|
+
throw new MissingToolsError('LLM tools are required for scraping external files');
|
|
5228
|
+
// <- Note: This scraper is used in all other scrapers, so saying "external files" not "markdown files"
|
|
5229
|
+
}
|
|
5230
|
+
TODO_USE(maxParallelCount); // <- [🪂]
|
|
5231
|
+
collection = createCollectionFromJson.apply(void 0, __spreadArray([], __read(PipelineCollection), false));
|
|
5232
|
+
_c = createPipelineExecutor;
|
|
5233
|
+
_f = {};
|
|
5234
|
+
return [4 /*yield*/, collection.getPipelineByUrl('https://promptbook.studio/promptbook/prepare-knowledge-from-markdown.ptbk.md')];
|
|
5235
|
+
case 1:
|
|
5236
|
+
prepareKnowledgeFromMarkdownExecutor = _c.apply(void 0, [(_f.pipeline = _j.sent(),
|
|
5237
|
+
_f.tools = {
|
|
5238
|
+
llm: llmTools,
|
|
5239
|
+
},
|
|
5240
|
+
_f)]);
|
|
5241
|
+
_d = createPipelineExecutor;
|
|
5242
|
+
_g = {};
|
|
5243
|
+
return [4 /*yield*/, collection.getPipelineByUrl('https://promptbook.studio/promptbook/prepare-knowledge-title.ptbk.md')];
|
|
5244
|
+
case 2:
|
|
5245
|
+
prepareTitleExecutor = _d.apply(void 0, [(_g.pipeline = _j.sent(),
|
|
5246
|
+
_g.tools = {
|
|
5247
|
+
llm: llmTools,
|
|
5248
|
+
},
|
|
5249
|
+
_g)]);
|
|
5250
|
+
_e = createPipelineExecutor;
|
|
5251
|
+
_h = {};
|
|
5252
|
+
return [4 /*yield*/, collection.getPipelineByUrl('https://promptbook.studio/promptbook/prepare-knowledge-keywords.ptbk.md')];
|
|
5253
|
+
case 3:
|
|
5254
|
+
prepareKeywordsExecutor = _e.apply(void 0, [(_h.pipeline = _j.sent(),
|
|
5255
|
+
_h.tools = {
|
|
5256
|
+
llm: llmTools,
|
|
5257
|
+
},
|
|
5258
|
+
_h)]);
|
|
5259
|
+
return [4 /*yield*/, source.asText()];
|
|
5260
|
+
case 4:
|
|
5261
|
+
knowledgeContent = _j.sent();
|
|
5262
|
+
return [4 /*yield*/, prepareKnowledgeFromMarkdownExecutor({ knowledgeContent: knowledgeContent })];
|
|
5263
|
+
case 5:
|
|
5264
|
+
result = _j.sent();
|
|
5265
|
+
assertsExecutionSuccessful(result);
|
|
5266
|
+
outputParameters = result.outputParameters;
|
|
5267
|
+
knowledgePiecesRaw = outputParameters.knowledgePieces;
|
|
5268
|
+
knowledgeTextPieces = (knowledgePiecesRaw || '').split('\n---\n');
|
|
5269
|
+
// <- TODO: [main] !!!!! Smarter split and filter out empty pieces
|
|
5270
|
+
if (isVerbose) {
|
|
5271
|
+
console.info('knowledgeTextPieces:', knowledgeTextPieces);
|
|
5272
|
+
}
|
|
5273
|
+
return [4 /*yield*/, Promise.all(
|
|
5274
|
+
// TODO: [🪂] !! Do not send all at once but in chunks
|
|
5275
|
+
knowledgeTextPieces.map(function (knowledgeTextPiece, i) { return __awaiter(_this, void 0, void 0, function () {
|
|
5276
|
+
var name, title, knowledgePieceContent, keywords, index, titleResult, _a, titleRaw, keywordsResult, _b, keywordsRaw, embeddingResult, error_1;
|
|
5277
|
+
return __generator(this, function (_c) {
|
|
5278
|
+
switch (_c.label) {
|
|
5279
|
+
case 0:
|
|
5280
|
+
name = "piece-".concat(i);
|
|
5281
|
+
title = spaceTrim__default["default"](knowledgeTextPiece.substring(0, 100));
|
|
5282
|
+
knowledgePieceContent = spaceTrim__default["default"](knowledgeTextPiece);
|
|
5283
|
+
keywords = [];
|
|
5284
|
+
index = [];
|
|
5285
|
+
_c.label = 1;
|
|
5286
|
+
case 1:
|
|
5287
|
+
_c.trys.push([1, 7, , 8]);
|
|
5288
|
+
return [4 /*yield*/, prepareTitleExecutor({ knowledgePieceContent: knowledgePieceContent })];
|
|
5289
|
+
case 2:
|
|
5290
|
+
titleResult = _c.sent();
|
|
5291
|
+
_a = titleResult.outputParameters.title, titleRaw = _a === void 0 ? 'Untitled' : _a;
|
|
5292
|
+
title = spaceTrim__default["default"](titleRaw) /* <- TODO: Maybe do in pipeline */;
|
|
5293
|
+
name = titleToName(title);
|
|
5294
|
+
return [4 /*yield*/, prepareKeywordsExecutor({ knowledgePieceContent: knowledgePieceContent })];
|
|
5295
|
+
case 3:
|
|
5296
|
+
keywordsResult = _c.sent();
|
|
5297
|
+
_b = keywordsResult.outputParameters.keywords, keywordsRaw = _b === void 0 ? '' : _b;
|
|
5298
|
+
keywords = (keywordsRaw || '')
|
|
5299
|
+
.split(',')
|
|
5300
|
+
.map(function (keyword) { return keyword.trim(); })
|
|
5301
|
+
.filter(function (keyword) { return keyword !== ''; });
|
|
5302
|
+
if (isVerbose) {
|
|
5303
|
+
console.info("Keywords for \"".concat(title, "\":"), keywords);
|
|
5304
|
+
}
|
|
5305
|
+
if (!!llmTools.callEmbeddingModel) return [3 /*break*/, 4];
|
|
5306
|
+
// TODO: [🟥] Detect browser / node and make it colorfull
|
|
5307
|
+
console.error('No callEmbeddingModel function provided');
|
|
5308
|
+
return [3 /*break*/, 6];
|
|
5309
|
+
case 4: return [4 /*yield*/, llmTools.callEmbeddingModel({
|
|
5310
|
+
title: "Embedding for ".concat(title) /* <- Note: No impact on embedding result itself, just for logging */,
|
|
5311
|
+
parameters: {},
|
|
5312
|
+
content: knowledgePieceContent,
|
|
5313
|
+
modelRequirements: {
|
|
5314
|
+
modelVariant: 'EMBEDDING',
|
|
5315
|
+
},
|
|
5316
|
+
})];
|
|
5317
|
+
case 5:
|
|
5318
|
+
embeddingResult = _c.sent();
|
|
5319
|
+
index.push({
|
|
5320
|
+
modelName: embeddingResult.modelName,
|
|
5321
|
+
position: embeddingResult.content,
|
|
5322
|
+
});
|
|
5323
|
+
_c.label = 6;
|
|
5324
|
+
case 6: return [3 /*break*/, 8];
|
|
5325
|
+
case 7:
|
|
5326
|
+
error_1 = _c.sent();
|
|
5327
|
+
// Note: Here is expected error:
|
|
5328
|
+
// > PipelineExecutionError: You have not provided any `LlmExecutionTools` that support model variant "EMBEDDING
|
|
5329
|
+
if (!(error_1 instanceof PipelineExecutionError)) {
|
|
5330
|
+
throw error_1;
|
|
5331
|
+
}
|
|
5332
|
+
// TODO: [🟥] Detect browser / node and make it colorfull
|
|
5333
|
+
console.error(error_1, "<- Note: This error is not critical to prepare the pipeline, just knowledge pieces won't have embeddings");
|
|
5334
|
+
return [3 /*break*/, 8];
|
|
5335
|
+
case 8: return [2 /*return*/, {
|
|
5336
|
+
name: name,
|
|
5337
|
+
title: title,
|
|
5338
|
+
content: knowledgePieceContent,
|
|
5339
|
+
keywords: keywords,
|
|
5340
|
+
index: index,
|
|
5341
|
+
// <- TODO: [☀] sources,
|
|
5342
|
+
}];
|
|
5343
|
+
}
|
|
5344
|
+
});
|
|
5345
|
+
}); }))];
|
|
5346
|
+
case 6:
|
|
5347
|
+
knowledge = _j.sent();
|
|
5348
|
+
return [2 /*return*/, knowledge];
|
|
5349
|
+
}
|
|
5350
|
+
});
|
|
5351
|
+
});
|
|
5352
|
+
},
|
|
5353
|
+
} /* TODO: [🦷] as const */;
|
|
5354
|
+
/**
|
|
5355
|
+
* TODO: [🦖] Make some system for putting scrapers to separete packages
|
|
5356
|
+
* TODO: [🪂] Do it in parallel 11:11
|
|
5357
|
+
* TODO: [🦷] Ideally use `as const satisfies Scraper` BUT this combination throws errors
|
|
5358
|
+
* Note: No need to aggregate usage here, it is done by intercepting the llmTools
|
|
5359
|
+
*/
|
|
5360
|
+
|
|
5361
|
+
/**
|
|
5362
|
+
* Scraper of .docx and .odt files
|
|
5363
|
+
*
|
|
5364
|
+
* @see `documentationUrl` for more details
|
|
5365
|
+
* @public exported from `@promptbook/core`
|
|
5366
|
+
*/
|
|
5367
|
+
var documentScraper = {
|
|
5368
|
+
/**
|
|
5369
|
+
* Mime types that this scraper can handle
|
|
5370
|
+
*/
|
|
5371
|
+
mimeTypes: ['application/vnd.openxmlformats-officedocument.wordprocessingml.document'],
|
|
5372
|
+
/**
|
|
5373
|
+
* Link to documentation
|
|
5374
|
+
*/
|
|
5375
|
+
documentationUrl: 'https://github.com/webgptorg/promptbook/discussions/@@',
|
|
5376
|
+
/**
|
|
5377
|
+
* Convert the `.docx` or `.odt` to `.md` file and returns intermediate source
|
|
5378
|
+
*
|
|
5379
|
+
* Note: `$` is used to indicate that this function is not a pure function - it leaves files on the disk and you are responsible for cleaning them by calling `destroy` method of returned object
|
|
5380
|
+
*/
|
|
5381
|
+
$convert: function (source, options) {
|
|
5382
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
5383
|
+
var _a, externalProgramsPaths, rootDirname, _b, cacheDirname, _c, isCacheCleaned, _d, isVerbose, extension, cacheFilehandler, command_1;
|
|
5384
|
+
return __generator(this, function (_e) {
|
|
5385
|
+
switch (_e.label) {
|
|
5386
|
+
case 0:
|
|
5387
|
+
_a = options.externalProgramsPaths, externalProgramsPaths = _a === void 0 ? {} : _a, rootDirname = options.rootDirname, _b = options.cacheDirname, cacheDirname = _b === void 0 ? SCRAPE_CACHE_DIRNAME : _b, _c = options.isCacheCleaned, isCacheCleaned = _c === void 0 ? false : _c, _d = options.isVerbose, isVerbose = _d === void 0 ? IS_VERBOSE : _d;
|
|
5388
|
+
if (!$isRunningInNode()) {
|
|
5389
|
+
throw new KnowledgeScrapeError('Scraping .docx files is only supported in Node environment');
|
|
5390
|
+
}
|
|
5391
|
+
if (externalProgramsPaths.pandocPath === undefined) {
|
|
5392
|
+
throw new MissingToolsError('Pandoc is required for scraping .docx files');
|
|
5393
|
+
}
|
|
5394
|
+
if (source.filename === null) {
|
|
5395
|
+
// TODO: [🧠] Maybe save file as temporary
|
|
5396
|
+
throw new KnowledgeScrapeError('When parsing .docx file, it must be real file in the file system');
|
|
5397
|
+
}
|
|
5398
|
+
extension = getFileExtension(source.filename);
|
|
5399
|
+
return [4 /*yield*/, getScraperIntermediateSource(source, {
|
|
5400
|
+
rootDirname: rootDirname,
|
|
5401
|
+
cacheDirname: cacheDirname,
|
|
5402
|
+
isCacheCleaned: isCacheCleaned,
|
|
5403
|
+
extension: 'md',
|
|
5404
|
+
isVerbose: isVerbose,
|
|
5405
|
+
})];
|
|
5406
|
+
case 1:
|
|
5407
|
+
cacheFilehandler = _e.sent();
|
|
5408
|
+
return [4 /*yield*/, $isFileExisting(cacheFilehandler.filename)];
|
|
5409
|
+
case 2:
|
|
5410
|
+
if (!!(_e.sent())) return [3 /*break*/, 5];
|
|
5411
|
+
command_1 = "\"".concat(externalProgramsPaths.pandocPath, "\" -f ").concat(extension, " -t markdown \"").concat(source.filename, "\" -o \"").concat(cacheFilehandler.filename, "\"");
|
|
5412
|
+
// TODO: !!!!!! [🕊] Make execCommand standard (?node-)util of the promptbook
|
|
5413
|
+
return [4 /*yield*/, $execCommand(command_1)];
|
|
5414
|
+
case 3:
|
|
5415
|
+
// TODO: !!!!!! [🕊] Make execCommand standard (?node-)util of the promptbook
|
|
5416
|
+
_e.sent();
|
|
5417
|
+
return [4 /*yield*/, $isFileExisting(cacheFilehandler.filename)];
|
|
5418
|
+
case 4:
|
|
5419
|
+
// Note: [0]
|
|
5420
|
+
if (!(_e.sent())) {
|
|
5421
|
+
throw new UnexpectedError(spaceTrim__default["default"](function (block) { return "\n File that was supposed to be created by Pandoc does not exist for unknown reason\n\n Expected file:\n ".concat(block(cacheFilehandler.filename), "\n\n Command:\n > ").concat(block(command_1), "\n\n "); }));
|
|
5422
|
+
}
|
|
5423
|
+
_e.label = 5;
|
|
5424
|
+
case 5: return [2 /*return*/, cacheFilehandler];
|
|
5425
|
+
}
|
|
5426
|
+
});
|
|
5427
|
+
});
|
|
5428
|
+
},
|
|
5429
|
+
/**
|
|
5430
|
+
* Scrapes the docx file and returns the knowledge pieces or `null` if it can't scrape it
|
|
5431
|
+
*/
|
|
5432
|
+
scrape: function (source, options) {
|
|
5433
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
5434
|
+
var cacheFilehandler, markdownSource, knowledge;
|
|
5435
|
+
return __generator(this, function (_a) {
|
|
5436
|
+
switch (_a.label) {
|
|
5437
|
+
case 0: return [4 /*yield*/, documentScraper.$convert(source, options)];
|
|
5438
|
+
case 1:
|
|
5439
|
+
cacheFilehandler = _a.sent();
|
|
5440
|
+
markdownSource = {
|
|
5441
|
+
source: source.source,
|
|
5442
|
+
filename: cacheFilehandler.filename,
|
|
5443
|
+
url: null,
|
|
5444
|
+
mimeType: 'text/markdown',
|
|
5445
|
+
asText: function () {
|
|
5446
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
5447
|
+
return __generator(this, function (_a) {
|
|
5448
|
+
switch (_a.label) {
|
|
5449
|
+
case 0: return [4 /*yield*/, promises.readFile(cacheFilehandler.filename, 'utf-8')];
|
|
5450
|
+
case 1:
|
|
5451
|
+
// Note: [0] In $convert we check that the file exists
|
|
5452
|
+
return [2 /*return*/, _a.sent()];
|
|
5453
|
+
}
|
|
5454
|
+
});
|
|
5455
|
+
});
|
|
5456
|
+
},
|
|
5457
|
+
asJson: function () {
|
|
5458
|
+
throw new UnexpectedError('Did not expect that `markdownScraper` would need to get the content `asJson`');
|
|
5459
|
+
},
|
|
5460
|
+
asBlob: function () {
|
|
5461
|
+
throw new UnexpectedError('Did not expect that `markdownScraper` would need to get the content `asBlob`');
|
|
5462
|
+
},
|
|
5463
|
+
};
|
|
5464
|
+
knowledge = markdownScraper.scrape(markdownSource, options);
|
|
5465
|
+
return [4 /*yield*/, cacheFilehandler.destroy()];
|
|
5466
|
+
case 2:
|
|
5467
|
+
_a.sent();
|
|
5468
|
+
return [2 /*return*/, knowledge];
|
|
5469
|
+
}
|
|
5470
|
+
});
|
|
5471
|
+
});
|
|
5472
|
+
},
|
|
5473
|
+
} /* TODO: [🦷] as const */;
|
|
5474
|
+
/**
|
|
5475
|
+
* TODO: [👣] Converted documents can act as cached items - there is no need to run conversion each time
|
|
5476
|
+
* TODO: [🦖] Make some system for putting scrapers to separete packages
|
|
5477
|
+
* TODO: [🪂] Do it in parallel 11:11
|
|
5478
|
+
* TODO: [🦷] Ideally use `as const satisfies Converter & Scraper` BUT this combination throws errors
|
|
5479
|
+
* Note: No need to aggregate usage here, it is done by intercepting the llmTools
|
|
5480
|
+
*/
|
|
5481
|
+
|
|
5482
|
+
/**
|
|
5483
|
+
* Scraper for .docx files
|
|
5484
|
+
*
|
|
5485
|
+
* @see `documentationUrl` for more details
|
|
5486
|
+
* @public exported from `@promptbook/core`
|
|
5487
|
+
*/
|
|
5488
|
+
var legacyDocumentScraper = {
|
|
5489
|
+
/**
|
|
5490
|
+
* Mime types that this scraper can handle
|
|
5491
|
+
*/
|
|
5492
|
+
mimeTypes: ['application/msword', 'text/rtf'],
|
|
5493
|
+
/**
|
|
5494
|
+
* Link to documentation
|
|
5495
|
+
*/
|
|
5496
|
+
documentationUrl: 'https://github.com/webgptorg/promptbook/discussions/@@',
|
|
5497
|
+
/**
|
|
5498
|
+
* Convert the `.doc` or `.rtf` to `.doc` file and returns intermediate source
|
|
5499
|
+
*
|
|
5500
|
+
* Note: `$` is used to indicate that this function is not a pure function - it leaves files on the disk and you are responsible for cleaning them by calling `destroy` method of returned object
|
|
5501
|
+
*/
|
|
5502
|
+
$convert: function (source, options) {
|
|
5503
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
5504
|
+
var _a, externalProgramsPaths, rootDirname, _b, cacheDirname, _c, isCacheCleaned, _d, isVerbose, extension, cacheFilehandler, documentSourceOutdirPathForLibreOffice_1, command_1, files_1, file;
|
|
5505
|
+
return __generator(this, function (_e) {
|
|
5506
|
+
switch (_e.label) {
|
|
5507
|
+
case 0:
|
|
5508
|
+
_a = options.externalProgramsPaths, externalProgramsPaths = _a === void 0 ? {} : _a, rootDirname = options.rootDirname, _b = options.cacheDirname, cacheDirname = _b === void 0 ? SCRAPE_CACHE_DIRNAME : _b, _c = options.isCacheCleaned, isCacheCleaned = _c === void 0 ? false : _c, _d = options.isVerbose, isVerbose = _d === void 0 ? IS_VERBOSE : _d;
|
|
5509
|
+
if (!$isRunningInNode()) {
|
|
5510
|
+
throw new KnowledgeScrapeError('Scraping .doc files is only supported in Node environment');
|
|
5511
|
+
}
|
|
5512
|
+
if (externalProgramsPaths.libreOfficePath === undefined) {
|
|
5513
|
+
throw new MissingToolsError('LibreOffice is required for scraping .doc and .rtf files');
|
|
5514
|
+
}
|
|
5515
|
+
if (source.filename === null) {
|
|
5516
|
+
// TODO: [🧠] Maybe save file as temporary
|
|
5517
|
+
throw new KnowledgeScrapeError('When parsing .doc or .rtf file, it must be real file in the file system');
|
|
5518
|
+
}
|
|
5519
|
+
extension = getFileExtension(source.filename);
|
|
5520
|
+
return [4 /*yield*/, getScraperIntermediateSource(source, {
|
|
5521
|
+
rootDirname: rootDirname,
|
|
5522
|
+
cacheDirname: cacheDirname,
|
|
5523
|
+
isCacheCleaned: isCacheCleaned,
|
|
5524
|
+
extension: 'docx',
|
|
5525
|
+
isVerbose: isVerbose,
|
|
5526
|
+
})];
|
|
5527
|
+
case 1:
|
|
5528
|
+
cacheFilehandler = _e.sent();
|
|
5529
|
+
if (isVerbose) {
|
|
5530
|
+
console.info("documentScraper: Converting .".concat(extension, " -> .docx"));
|
|
5531
|
+
}
|
|
5532
|
+
return [4 /*yield*/, $isFileExisting(cacheFilehandler.filename)];
|
|
5533
|
+
case 2:
|
|
5534
|
+
if (!!(_e.sent())) return [3 /*break*/, 8];
|
|
5535
|
+
documentSourceOutdirPathForLibreOffice_1 = path.join(path.dirname(cacheFilehandler.filename), 'libreoffice')
|
|
5536
|
+
.split('\\')
|
|
5537
|
+
.join('/');
|
|
5538
|
+
command_1 = "\"".concat(externalProgramsPaths.libreOfficePath, "\" --headless --convert-to docx \"").concat(source.filename, "\" --outdir \"").concat(documentSourceOutdirPathForLibreOffice_1, "\"");
|
|
5539
|
+
// TODO: !!!!!! [🕊] Make execCommand standard (?node-)util of the promptbook - this should trigger build polution error
|
|
5540
|
+
return [4 /*yield*/, $execCommand(command_1)];
|
|
5541
|
+
case 3:
|
|
5542
|
+
// TODO: !!!!!! [🕊] Make execCommand standard (?node-)util of the promptbook - this should trigger build polution error
|
|
5543
|
+
_e.sent();
|
|
5544
|
+
return [4 /*yield*/, promises.readdir(documentSourceOutdirPathForLibreOffice_1)];
|
|
5545
|
+
case 4:
|
|
5546
|
+
files_1 = _e.sent();
|
|
5547
|
+
if (files_1.length !== 1) {
|
|
5548
|
+
throw new UnexpectedError(spaceTrim__default["default"](function (block) { return "\n Expected exactly 1 file in the LibreOffice output directory, got ".concat(files_1.length, "\n\n The temporary folder:\n ").concat(block(documentSourceOutdirPathForLibreOffice_1), "\n\n Command:\n > ").concat(block(command_1), "\n "); }));
|
|
5549
|
+
}
|
|
5550
|
+
file = files_1[0];
|
|
5551
|
+
return [4 /*yield*/, promises.rename(path.join(documentSourceOutdirPathForLibreOffice_1, file), cacheFilehandler.filename)];
|
|
5552
|
+
case 5:
|
|
5553
|
+
_e.sent();
|
|
5554
|
+
return [4 /*yield*/, promises.rmdir(documentSourceOutdirPathForLibreOffice_1)];
|
|
5555
|
+
case 6:
|
|
5556
|
+
_e.sent();
|
|
5557
|
+
return [4 /*yield*/, $isFileExisting(cacheFilehandler.filename)];
|
|
5558
|
+
case 7:
|
|
5559
|
+
if (!(_e.sent())) {
|
|
5560
|
+
throw new UnexpectedError(spaceTrim__default["default"](function (block) { return "\n File that was supposed to be created by LibreOffice does not exist for unknown reason\n\n Expected file:\n ".concat(block(cacheFilehandler.filename), "\n\n The temporary folder:\n ").concat(block(documentSourceOutdirPathForLibreOffice_1), "\n\n Command:\n > ").concat(block(command_1), "\n\n "); }));
|
|
5561
|
+
}
|
|
5562
|
+
_e.label = 8;
|
|
5563
|
+
case 8: return [2 /*return*/, cacheFilehandler];
|
|
5564
|
+
}
|
|
5565
|
+
});
|
|
5566
|
+
});
|
|
5567
|
+
},
|
|
5568
|
+
/**
|
|
5569
|
+
* Scrapes the `.doc` or `.rtf` file and returns the knowledge pieces or `null` if it can't scrape it
|
|
5570
|
+
*/
|
|
5571
|
+
scrape: function (source, options) {
|
|
5572
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
5573
|
+
var cacheFilehandler, markdownSource, knowledge;
|
|
5574
|
+
return __generator(this, function (_a) {
|
|
5575
|
+
switch (_a.label) {
|
|
5576
|
+
case 0: return [4 /*yield*/, legacyDocumentScraper.$convert(source, options)];
|
|
5577
|
+
case 1:
|
|
5578
|
+
cacheFilehandler = _a.sent();
|
|
5579
|
+
markdownSource = {
|
|
5580
|
+
source: source.source,
|
|
5581
|
+
filename: cacheFilehandler.filename,
|
|
5582
|
+
url: null,
|
|
5583
|
+
mimeType: 'text/markdown',
|
|
5584
|
+
asText: function () {
|
|
5585
|
+
throw new UnexpectedError('Did not expect that `documentScraper` would need to get the content `asText`');
|
|
5586
|
+
},
|
|
5587
|
+
asJson: function () {
|
|
5588
|
+
throw new UnexpectedError('Did not expect that `documentScraper` would need to get the content `asJson`');
|
|
5589
|
+
},
|
|
5590
|
+
asBlob: function () {
|
|
5591
|
+
throw new UnexpectedError('Did not expect that `documentScraper` would need to get the content `asBlob`');
|
|
5592
|
+
},
|
|
5593
|
+
};
|
|
5594
|
+
knowledge = documentScraper.scrape(markdownSource, options);
|
|
5595
|
+
return [4 /*yield*/, cacheFilehandler.destroy()];
|
|
5596
|
+
case 2:
|
|
5597
|
+
_a.sent();
|
|
5598
|
+
return [2 /*return*/, knowledge];
|
|
5599
|
+
}
|
|
5600
|
+
});
|
|
5601
|
+
});
|
|
5602
|
+
},
|
|
5603
|
+
} /* TODO: [🦷] as const */;
|
|
5604
|
+
/**
|
|
5605
|
+
* TODO: [👣] Converted documents can act as cached items - there is no need to run conversion each time
|
|
5606
|
+
* TODO: [🦖] Make some system for putting scrapers to separete packages
|
|
5607
|
+
* TODO: [🪂] Do it in parallel 11:11
|
|
5608
|
+
* TODO: [🦷] Ideally use `as const satisfies Converter & Scraper` BUT this combination throws errors
|
|
5609
|
+
* Note: No need to aggregate usage here, it is done by intercepting the llmTools
|
|
5610
|
+
*/
|
|
5611
|
+
|
|
5612
|
+
/**
|
|
5613
|
+
* Scraper for .docx files
|
|
5614
|
+
*
|
|
5615
|
+
* @see `documentationUrl` for more details
|
|
5616
|
+
* @public exported from `@promptbook/core`
|
|
5617
|
+
*/
|
|
5618
|
+
var pdfScraper = {
|
|
5619
|
+
/**
|
|
5620
|
+
* Mime types that this scraper can handle
|
|
5621
|
+
*/
|
|
5622
|
+
mimeTypes: ['application/pdf'],
|
|
5623
|
+
/**
|
|
5624
|
+
* Link to documentation
|
|
5625
|
+
*/
|
|
5626
|
+
documentationUrl: 'https://github.com/webgptorg/promptbook/discussions/@@',
|
|
5627
|
+
/**
|
|
5628
|
+
* Converts the `.pdf` file to `.md` file and returns intermediate source
|
|
5629
|
+
*/
|
|
5630
|
+
$convert: function (source, options) {
|
|
5631
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
5632
|
+
return __generator(this, function (_a) {
|
|
5633
|
+
TODO_USE(source);
|
|
5634
|
+
TODO_USE(options);
|
|
5635
|
+
throw new NotYetImplementedError('PDF conversion not yet implemented');
|
|
5636
|
+
});
|
|
5637
|
+
});
|
|
5638
|
+
},
|
|
5639
|
+
/**
|
|
5640
|
+
* Scrapes the `.pdf` file and returns the knowledge pieces or `null` if it can't scrape it
|
|
5641
|
+
*/
|
|
5642
|
+
scrape: function (source, options) {
|
|
5643
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
5644
|
+
return __generator(this, function (_a) {
|
|
5645
|
+
TODO_USE(source);
|
|
5646
|
+
TODO_USE(options);
|
|
5647
|
+
/*
|
|
5648
|
+
const {
|
|
5649
|
+
externalProgramsPaths = {},
|
|
5650
|
+
cacheDirname = SCRAPE_CACHE_DIRNAME,
|
|
5651
|
+
isCacheCleaned = false,
|
|
5652
|
+
isVerbose = IS_VERBOSE,
|
|
5653
|
+
} = options;
|
|
5654
|
+
*/
|
|
5655
|
+
throw new NotYetImplementedError('PDF scraping not yet implemented');
|
|
5656
|
+
});
|
|
5657
|
+
});
|
|
5658
|
+
},
|
|
5659
|
+
} /* TODO: [🦷] as const */;
|
|
5660
|
+
/**
|
|
5661
|
+
* TODO: [👣] Converted documents can act as cached items - there is no need to run conversion each time
|
|
5662
|
+
* TODO: [🦖] Make some system for putting scrapers to separete packages
|
|
5663
|
+
* TODO: [🪂] Do it in parallel 11:11
|
|
5664
|
+
* TODO: [🦷] Ideally use `as const satisfies Converter & Scraper` BUT this combination throws errors
|
|
5665
|
+
* Note: No need to aggregate usage here, it is done by intercepting the llmTools
|
|
5666
|
+
*/
|
|
5667
|
+
|
|
5668
|
+
/**
|
|
5669
|
+
* A converter instance that uses showdown and highlight extensions
|
|
5670
|
+
*
|
|
5671
|
+
* @type {Converter}
|
|
5672
|
+
* @private for markdown and html knowledge scrapers
|
|
5673
|
+
*/
|
|
5674
|
+
var markdownConverter = new showdown.Converter({
|
|
5675
|
+
flavor: 'github', // <- TODO: !!!!!! Explicitly specify the flavor of promptbook markdown
|
|
5676
|
+
/*
|
|
5677
|
+
> import showdownHighlight from 'showdown-highlight';
|
|
5678
|
+
> extensions: [
|
|
5679
|
+
> showdownHighlight({
|
|
5680
|
+
> // Whether to add the classes to the <pre> tag, default is false
|
|
5681
|
+
> pre: true,
|
|
5682
|
+
> // Whether to use hljs' auto language detection, default is true
|
|
5683
|
+
> auto_detection: true,
|
|
5684
|
+
> }),
|
|
5685
|
+
> ],
|
|
5686
|
+
*/
|
|
5687
|
+
});
|
|
5688
|
+
/**
|
|
5689
|
+
* TODO: !!!!!! Figure out better name not to confuse with `Converter`
|
|
5690
|
+
* TODO: !!!!!! Lazy-make converter
|
|
5691
|
+
*/
|
|
5692
|
+
|
|
5693
|
+
/**
|
|
5694
|
+
* Scraper for .docx files
|
|
5695
|
+
*
|
|
5696
|
+
* @see `documentationUrl` for more details
|
|
5697
|
+
* @public exported from `@promptbook/core`
|
|
5698
|
+
*/
|
|
5699
|
+
var websiteScraper = {
|
|
5700
|
+
/**
|
|
5701
|
+
* Mime types that this scraper can handle
|
|
5702
|
+
*/
|
|
5703
|
+
mimeTypes: ['text/html'],
|
|
5704
|
+
/**
|
|
5705
|
+
* Link to documentation
|
|
5706
|
+
*/
|
|
5707
|
+
documentationUrl: 'https://github.com/webgptorg/promptbook/discussions/@@',
|
|
5708
|
+
/**
|
|
5709
|
+
* Convert the website to `.md` file and returns intermediate source
|
|
5710
|
+
*
|
|
5711
|
+
* Note: `$` is used to indicate that this function is not a pure function - it leaves files on the disk and you are responsible for cleaning them by calling `destroy` method of returned object
|
|
5712
|
+
*/
|
|
5713
|
+
$convert: function (source, options) {
|
|
5714
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
5715
|
+
var
|
|
5716
|
+
// TODO: [🧠] Maybe in node use headless browser not just JSDOM
|
|
5717
|
+
// externalProgramsPaths = {},
|
|
5718
|
+
rootDirname, _a, cacheDirname, _b, isCacheCleaned, _c, isVerbose, jsdom$1, _d, reader, article, html, i, cacheFilehandler, markdown;
|
|
5719
|
+
return __generator(this, function (_e) {
|
|
5720
|
+
switch (_e.label) {
|
|
5721
|
+
case 0:
|
|
5722
|
+
rootDirname = options.rootDirname, _a = options.cacheDirname, cacheDirname = _a === void 0 ? SCRAPE_CACHE_DIRNAME : _a, _b = options.isCacheCleaned, isCacheCleaned = _b === void 0 ? false : _b, _c = options.isVerbose, isVerbose = _c === void 0 ? IS_VERBOSE : _c;
|
|
5723
|
+
// TODO: !!!!!! Does this work in browser? Make it work.
|
|
5724
|
+
if (source.url === null) {
|
|
5725
|
+
throw new KnowledgeScrapeError('Website scraper requires URL');
|
|
5726
|
+
}
|
|
5727
|
+
_d = jsdom.JSDOM.bind;
|
|
5728
|
+
return [4 /*yield*/, source.asText()];
|
|
5729
|
+
case 1:
|
|
5730
|
+
jsdom$1 = new (_d.apply(jsdom.JSDOM, [void 0, _e.sent(), {
|
|
5731
|
+
url: source.url,
|
|
5732
|
+
}]))();
|
|
5733
|
+
reader = new readability.Readability(jsdom$1.window.document);
|
|
5734
|
+
article = reader.parse();
|
|
5735
|
+
console.log(article);
|
|
5736
|
+
return [4 /*yield*/, waitasecond.forTime(10000)];
|
|
5737
|
+
case 2:
|
|
5738
|
+
_e.sent();
|
|
5739
|
+
html = (article === null || article === void 0 ? void 0 : article.content) || (article === null || article === void 0 ? void 0 : article.textContent) || jsdom$1.window.document.body.innerHTML;
|
|
5740
|
+
// Note: Unwrap html such as it is convertable by `markdownConverter`
|
|
5741
|
+
for (i = 0; i < 2; i++) {
|
|
5742
|
+
html = html.replace(/<div\s*(?:id="readability-page-\d+"\s+class="page")?>(.*)<\/div>/is, '$1');
|
|
5743
|
+
}
|
|
5744
|
+
if (html.includes('<div')) {
|
|
5745
|
+
html = (article === null || article === void 0 ? void 0 : article.textContent) || '';
|
|
5746
|
+
}
|
|
5747
|
+
return [4 /*yield*/, getScraperIntermediateSource(source, {
|
|
5748
|
+
rootDirname: rootDirname,
|
|
5749
|
+
cacheDirname: cacheDirname,
|
|
5750
|
+
isCacheCleaned: isCacheCleaned,
|
|
5751
|
+
extension: 'html',
|
|
5752
|
+
isVerbose: isVerbose,
|
|
5753
|
+
})];
|
|
5754
|
+
case 3:
|
|
5755
|
+
cacheFilehandler = _e.sent();
|
|
5756
|
+
return [4 /*yield*/, promises.writeFile(cacheFilehandler.filename, html, 'utf-8')];
|
|
5757
|
+
case 4:
|
|
5758
|
+
_e.sent();
|
|
5759
|
+
markdown = markdownConverter.makeMarkdown(html, jsdom$1.window.document);
|
|
5760
|
+
return [2 /*return*/, __assign(__assign({}, cacheFilehandler), { markdown: markdown })];
|
|
5761
|
+
}
|
|
5762
|
+
});
|
|
5763
|
+
});
|
|
5764
|
+
},
|
|
5765
|
+
/**
|
|
5766
|
+
* Scrapes the website and returns the knowledge pieces or `null` if it can't scrape it
|
|
5767
|
+
*/
|
|
5768
|
+
scrape: function (source, options) {
|
|
5769
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
5770
|
+
var cacheFilehandler, markdownSource, knowledge;
|
|
5771
|
+
return __generator(this, function (_a) {
|
|
5772
|
+
switch (_a.label) {
|
|
5773
|
+
case 0: return [4 /*yield*/, websiteScraper.$convert(source, options)];
|
|
5774
|
+
case 1:
|
|
5775
|
+
cacheFilehandler = _a.sent();
|
|
5776
|
+
markdownSource = {
|
|
5777
|
+
source: source.source,
|
|
5778
|
+
filename: cacheFilehandler.filename,
|
|
5779
|
+
url: null,
|
|
5780
|
+
mimeType: 'text/markdown',
|
|
5781
|
+
asText: function () {
|
|
5782
|
+
return cacheFilehandler.markdown;
|
|
5783
|
+
},
|
|
5784
|
+
asJson: function () {
|
|
5785
|
+
throw new UnexpectedError('Did not expect that `markdownScraper` would need to get the content `asJson`');
|
|
5786
|
+
},
|
|
5787
|
+
asBlob: function () {
|
|
5788
|
+
throw new UnexpectedError('Did not expect that `markdownScraper` would need to get the content `asBlob`');
|
|
5789
|
+
},
|
|
5790
|
+
};
|
|
5791
|
+
knowledge = markdownScraper.scrape(markdownSource, options);
|
|
5792
|
+
return [4 /*yield*/, cacheFilehandler.destroy()];
|
|
5793
|
+
case 2:
|
|
5794
|
+
_a.sent();
|
|
5795
|
+
return [2 /*return*/, knowledge];
|
|
5796
|
+
}
|
|
5797
|
+
});
|
|
5798
|
+
});
|
|
5799
|
+
},
|
|
5800
|
+
} /* TODO: [🦷] as const */;
|
|
4775
5801
|
/**
|
|
4776
|
-
* TODO:
|
|
5802
|
+
* TODO: !!!!!! Put into separate package
|
|
5803
|
+
* TODO: [👣] Scraped website in .md can act as cache item - there is no need to run conversion each time
|
|
5804
|
+
* TODO: [🦖] Make some system for putting scrapers to separete packages
|
|
5805
|
+
* TODO: [🪂] Do it in parallel 11:11
|
|
5806
|
+
* TODO: [🦷] Ideally use `as const satisfies Converter & Scraper` BUT this combination throws errors
|
|
5807
|
+
* Note: No need to aggregate usage here, it is done by intercepting the llmTools
|
|
4777
5808
|
*/
|
|
4778
5809
|
|
|
5810
|
+
// TODO: [🦖] !!!!!! Pass scrapers as dependency,
|
|
4779
5811
|
/**
|
|
4780
|
-
*
|
|
5812
|
+
* @@@
|
|
4781
5813
|
*
|
|
4782
|
-
* @returns The executor function
|
|
4783
|
-
* @throws {PipelineLogicError} on logical error in the pipeline
|
|
4784
5814
|
* @public exported from `@promptbook/core`
|
|
4785
5815
|
*/
|
|
4786
|
-
|
|
4787
|
-
|
|
4788
|
-
|
|
4789
|
-
|
|
4790
|
-
|
|
4791
|
-
|
|
4792
|
-
|
|
4793
|
-
|
|
4794
|
-
|
|
4795
|
-
|
|
4796
|
-
|
|
4797
|
-
|
|
4798
|
-
|
|
4799
|
-
|
|
4800
|
-
|
|
4801
|
-
|
|
4802
|
-
var
|
|
4803
|
-
|
|
4804
|
-
|
|
4805
|
-
|
|
4806
|
-
|
|
4807
|
-
|
|
4808
|
-
}
|
|
4809
|
-
var
|
|
4810
|
-
|
|
4811
|
-
|
|
4812
|
-
runCount++;
|
|
4813
|
-
return [2 /*return*/, /* not await */ executePipeline({
|
|
4814
|
-
pipeline: pipeline,
|
|
4815
|
-
preparedPipeline: preparedPipeline,
|
|
4816
|
-
setPreparedPipeline: function (newPreparedPipeline) {
|
|
4817
|
-
preparedPipeline = newPreparedPipeline;
|
|
4818
|
-
},
|
|
4819
|
-
inputParameters: inputParameters,
|
|
4820
|
-
tools: tools,
|
|
4821
|
-
onProgress: onProgress,
|
|
4822
|
-
pipelineIdentification: spaceTrim.spaceTrim(function (block) { return "\n ".concat(block(pipelineIdentification), "\n ").concat(runCount === 1 ? '' : "Run #".concat(runCount), "\n "); }),
|
|
4823
|
-
settings: {
|
|
4824
|
-
maxExecutionAttempts: maxExecutionAttempts,
|
|
4825
|
-
maxParallelCount: maxParallelCount,
|
|
4826
|
-
csvSettings: csvSettings,
|
|
4827
|
-
isVerbose: isVerbose,
|
|
4828
|
-
isNotPreparedWarningSupressed: isNotPreparedWarningSupressed,
|
|
4829
|
-
},
|
|
4830
|
-
})];
|
|
4831
|
-
});
|
|
4832
|
-
}); };
|
|
4833
|
-
return pipelineExecutor;
|
|
5816
|
+
var SCRAPERS = [
|
|
5817
|
+
markdownScraper,
|
|
5818
|
+
documentScraper,
|
|
5819
|
+
legacyDocumentScraper,
|
|
5820
|
+
pdfScraper,
|
|
5821
|
+
websiteScraper,
|
|
5822
|
+
// <- Note: [♓️] This is the order of the scrapers for knowledge, BUT consider some better (more explicit) way to do this
|
|
5823
|
+
];
|
|
5824
|
+
|
|
5825
|
+
/**
|
|
5826
|
+
* Creates unique name for the source
|
|
5827
|
+
*
|
|
5828
|
+
* @private within the repository
|
|
5829
|
+
*/
|
|
5830
|
+
function sourceContentToName(sourceContent) {
|
|
5831
|
+
// TODO: !!!!!! Better name for source than gibberish hash
|
|
5832
|
+
var hash = cryptoJs.SHA256(hexEncoder__default["default"].parse(JSON.stringify(sourceContent)))
|
|
5833
|
+
// <- TODO: [🥬] Encapsulate sha256 to some private utility function
|
|
5834
|
+
.toString( /* hex */)
|
|
5835
|
+
.substring(0, 20);
|
|
5836
|
+
// <- TODO: [🥬] Make some system for hashes and ids of promptbook
|
|
5837
|
+
var semanticName = normalizeToKebabCase(sourceContent.substring(0, 20));
|
|
5838
|
+
var pieces = ['source', semanticName, hash].filter(function (piece) { return piece !== ''; });
|
|
5839
|
+
var name = pieces.join('-').split('--').join('-');
|
|
5840
|
+
// <- TODO: Use MAX_FILENAME_LENGTH
|
|
5841
|
+
return name;
|
|
4834
5842
|
}
|
|
4835
5843
|
/**
|
|
4836
|
-
* TODO: [
|
|
5844
|
+
* TODO: [🐱🐉][🧠] Make some smart crop NOT source-i-m-pavol-a-develop-... BUT source-i-m-pavol-a-developer-...
|
|
5845
|
+
*/
|
|
5846
|
+
|
|
5847
|
+
/**
|
|
5848
|
+
* Convert file extension to mime type
|
|
5849
|
+
*
|
|
5850
|
+
* @private within the repository
|
|
4837
5851
|
*/
|
|
5852
|
+
function extensionToMimeType(value) {
|
|
5853
|
+
return mimeTypes.lookup(value) || 'application/octet-stream';
|
|
5854
|
+
}
|
|
4838
5855
|
|
|
4839
5856
|
/**
|
|
4840
5857
|
* @@@
|
|
4841
5858
|
*
|
|
4842
|
-
* @
|
|
5859
|
+
* @private for scraper utilities
|
|
4843
5860
|
*/
|
|
4844
|
-
function
|
|
5861
|
+
function makeKnowledgeSourceHandler(knowledgeSource, options) {
|
|
5862
|
+
var _a;
|
|
4845
5863
|
return __awaiter(this, void 0, void 0, function () {
|
|
4846
|
-
var
|
|
4847
|
-
|
|
4848
|
-
|
|
4849
|
-
return __generator(this, function (_j) {
|
|
4850
|
-
switch (_j.label) {
|
|
5864
|
+
var sourceContent, name, _b, _c, rootDirname, _d, isVerbose, url, response_1, mimeType, filename_1, fileExtension, mimeType_1;
|
|
5865
|
+
return __generator(this, function (_e) {
|
|
5866
|
+
switch (_e.label) {
|
|
4851
5867
|
case 0:
|
|
4852
|
-
|
|
4853
|
-
|
|
4854
|
-
|
|
4855
|
-
|
|
4856
|
-
|
|
4857
|
-
|
|
5868
|
+
sourceContent = knowledgeSource.sourceContent;
|
|
5869
|
+
name = knowledgeSource.name;
|
|
5870
|
+
_b = options || {}, _c = _b.rootDirname, rootDirname = _c === void 0 ? null : _c, _d = _b.isVerbose, isVerbose = _d === void 0 ? IS_VERBOSE : _d;
|
|
5871
|
+
TODO_USE(isVerbose);
|
|
5872
|
+
if (!name) {
|
|
5873
|
+
name = sourceContentToName(sourceContent);
|
|
5874
|
+
}
|
|
5875
|
+
if (!isValidUrl(sourceContent)) return [3 /*break*/, 2];
|
|
5876
|
+
url = sourceContent;
|
|
5877
|
+
return [4 /*yield*/, fetch(url)];
|
|
4858
5878
|
case 1:
|
|
4859
|
-
|
|
4860
|
-
|
|
4861
|
-
|
|
5879
|
+
response_1 = _e.sent();
|
|
5880
|
+
mimeType = ((_a = response_1.headers.get('content-type')) === null || _a === void 0 ? void 0 : _a.split(';')[0]) || 'text/html';
|
|
5881
|
+
return [2 /*return*/, {
|
|
5882
|
+
source: name,
|
|
5883
|
+
filename: null,
|
|
5884
|
+
url: url,
|
|
5885
|
+
mimeType: mimeType,
|
|
5886
|
+
asBlob: function () {
|
|
5887
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
5888
|
+
var content;
|
|
5889
|
+
return __generator(this, function (_a) {
|
|
5890
|
+
switch (_a.label) {
|
|
5891
|
+
case 0: return [4 /*yield*/, response_1.blob()];
|
|
5892
|
+
case 1:
|
|
5893
|
+
content = _a.sent();
|
|
5894
|
+
return [2 /*return*/, content];
|
|
5895
|
+
}
|
|
5896
|
+
});
|
|
5897
|
+
});
|
|
4862
5898
|
},
|
|
4863
|
-
|
|
4864
|
-
|
|
4865
|
-
|
|
4866
|
-
|
|
4867
|
-
|
|
4868
|
-
|
|
4869
|
-
|
|
4870
|
-
|
|
5899
|
+
asJson: function () {
|
|
5900
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
5901
|
+
var content;
|
|
5902
|
+
return __generator(this, function (_a) {
|
|
5903
|
+
switch (_a.label) {
|
|
5904
|
+
case 0: return [4 /*yield*/, response_1.json()];
|
|
5905
|
+
case 1:
|
|
5906
|
+
content = _a.sent();
|
|
5907
|
+
return [2 /*return*/, content];
|
|
5908
|
+
}
|
|
5909
|
+
});
|
|
5910
|
+
});
|
|
4871
5911
|
},
|
|
4872
|
-
|
|
4873
|
-
|
|
4874
|
-
|
|
4875
|
-
|
|
4876
|
-
|
|
4877
|
-
|
|
4878
|
-
|
|
4879
|
-
|
|
5912
|
+
asText: function () {
|
|
5913
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
5914
|
+
var content;
|
|
5915
|
+
return __generator(this, function (_a) {
|
|
5916
|
+
switch (_a.label) {
|
|
5917
|
+
case 0: return [4 /*yield*/, response_1.text()];
|
|
5918
|
+
case 1:
|
|
5919
|
+
content = _a.sent();
|
|
5920
|
+
return [2 /*return*/, content];
|
|
5921
|
+
}
|
|
5922
|
+
});
|
|
5923
|
+
});
|
|
4880
5924
|
},
|
|
4881
|
-
|
|
4882
|
-
|
|
4883
|
-
|
|
4884
|
-
|
|
4885
|
-
|
|
4886
|
-
outputParameters = result.outputParameters;
|
|
4887
|
-
knowledgePiecesRaw = outputParameters.knowledgePieces;
|
|
4888
|
-
knowledgeTextPieces = (knowledgePiecesRaw || '').split('\n---\n');
|
|
4889
|
-
// <- TODO: [main] !!!!! Smarter split and filter out empty pieces
|
|
4890
|
-
if (isVerbose) {
|
|
4891
|
-
console.info('knowledgeTextPieces:', knowledgeTextPieces);
|
|
5925
|
+
}];
|
|
5926
|
+
case 2:
|
|
5927
|
+
if (!(isValidFilePath(sourceContent) || /\.[a-z]{1,10}$/i.exec(sourceContent))) return [3 /*break*/, 4];
|
|
5928
|
+
if (!$isRunningInNode()) {
|
|
5929
|
+
throw new EnvironmentMismatchError('Importing knowledge source file works only in Node.js environment');
|
|
4892
5930
|
}
|
|
4893
|
-
|
|
4894
|
-
|
|
4895
|
-
|
|
4896
|
-
|
|
4897
|
-
|
|
4898
|
-
|
|
4899
|
-
|
|
4900
|
-
|
|
4901
|
-
|
|
4902
|
-
|
|
4903
|
-
|
|
4904
|
-
|
|
4905
|
-
|
|
4906
|
-
|
|
4907
|
-
|
|
4908
|
-
|
|
4909
|
-
|
|
4910
|
-
|
|
4911
|
-
|
|
4912
|
-
|
|
4913
|
-
|
|
4914
|
-
|
|
4915
|
-
|
|
4916
|
-
|
|
4917
|
-
|
|
4918
|
-
|
|
4919
|
-
|
|
4920
|
-
|
|
4921
|
-
|
|
4922
|
-
|
|
4923
|
-
|
|
5931
|
+
if (rootDirname === null) {
|
|
5932
|
+
throw new EnvironmentMismatchError('Can not import file knowledge in non-file pipeline');
|
|
5933
|
+
// <- TODO: [🧠] What is the best error type here`
|
|
5934
|
+
}
|
|
5935
|
+
filename_1 = path.join(rootDirname, sourceContent).split('\\').join('/');
|
|
5936
|
+
fileExtension = getFileExtension(filename_1);
|
|
5937
|
+
mimeType_1 = extensionToMimeType(fileExtension || '');
|
|
5938
|
+
return [4 /*yield*/, $isFileExisting(filename_1)];
|
|
5939
|
+
case 3:
|
|
5940
|
+
if (!(_e.sent())) {
|
|
5941
|
+
throw new NotFoundError(spaceTrim__default["default"](function (block) { return "\n Can not make source handler for file which does not exist:\n\n File:\n ".concat(block(filename_1), "\n "); }));
|
|
5942
|
+
}
|
|
5943
|
+
// TODO: !!!!!! Test security file - file is scoped to the project (maybe do this in `filesystemTools`)
|
|
5944
|
+
return [2 /*return*/, {
|
|
5945
|
+
source: name,
|
|
5946
|
+
filename: filename_1,
|
|
5947
|
+
url: null,
|
|
5948
|
+
mimeType: mimeType_1,
|
|
5949
|
+
asBlob: function () {
|
|
5950
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
5951
|
+
var content;
|
|
5952
|
+
return __generator(this, function (_a) {
|
|
5953
|
+
switch (_a.label) {
|
|
5954
|
+
case 0: return [4 /*yield*/, promises.readFile(filename_1)];
|
|
5955
|
+
case 1:
|
|
5956
|
+
content = _a.sent();
|
|
5957
|
+
// <- Note: Its OK to use sync in tooling for tests
|
|
5958
|
+
return [2 /*return*/, new Blob([
|
|
5959
|
+
content,
|
|
5960
|
+
// <- TODO: !!!!!! Maybe not working
|
|
5961
|
+
], { type: mimeType_1 })];
|
|
4924
5962
|
}
|
|
4925
|
-
|
|
4926
|
-
|
|
4927
|
-
|
|
4928
|
-
|
|
4929
|
-
|
|
4930
|
-
|
|
4931
|
-
|
|
4932
|
-
|
|
4933
|
-
|
|
4934
|
-
|
|
4935
|
-
|
|
4936
|
-
|
|
4937
|
-
case 5:
|
|
4938
|
-
embeddingResult = _c.sent();
|
|
4939
|
-
index.push({
|
|
4940
|
-
modelName: embeddingResult.modelName,
|
|
4941
|
-
position: embeddingResult.content,
|
|
4942
|
-
});
|
|
4943
|
-
_c.label = 6;
|
|
4944
|
-
case 6: return [3 /*break*/, 8];
|
|
4945
|
-
case 7:
|
|
4946
|
-
error_1 = _c.sent();
|
|
4947
|
-
// Note: Here is expected error:
|
|
4948
|
-
// > PipelineExecutionError: You have not provided any `LlmExecutionTools` that support model variant "EMBEDDING
|
|
4949
|
-
if (!(error_1 instanceof PipelineExecutionError)) {
|
|
4950
|
-
throw error_1;
|
|
5963
|
+
});
|
|
5964
|
+
});
|
|
5965
|
+
},
|
|
5966
|
+
asJson: function () {
|
|
5967
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
5968
|
+
var _a, _b;
|
|
5969
|
+
return __generator(this, function (_c) {
|
|
5970
|
+
switch (_c.label) {
|
|
5971
|
+
case 0:
|
|
5972
|
+
_b = (_a = JSON).parse;
|
|
5973
|
+
return [4 /*yield*/, promises.readFile(filename_1, 'utf-8')];
|
|
5974
|
+
case 1: return [2 /*return*/, _b.apply(_a, [_c.sent()])];
|
|
4951
5975
|
}
|
|
4952
|
-
|
|
4953
|
-
|
|
4954
|
-
|
|
4955
|
-
|
|
4956
|
-
|
|
4957
|
-
|
|
4958
|
-
|
|
4959
|
-
|
|
4960
|
-
|
|
4961
|
-
|
|
4962
|
-
|
|
4963
|
-
}
|
|
4964
|
-
}
|
|
4965
|
-
}
|
|
4966
|
-
case
|
|
4967
|
-
|
|
4968
|
-
|
|
5976
|
+
});
|
|
5977
|
+
});
|
|
5978
|
+
},
|
|
5979
|
+
asText: function () {
|
|
5980
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
5981
|
+
return __generator(this, function (_a) {
|
|
5982
|
+
switch (_a.label) {
|
|
5983
|
+
case 0: return [4 /*yield*/, promises.readFile(filename_1, 'utf-8')];
|
|
5984
|
+
case 1: return [2 /*return*/, _a.sent()];
|
|
5985
|
+
}
|
|
5986
|
+
});
|
|
5987
|
+
});
|
|
5988
|
+
},
|
|
5989
|
+
}];
|
|
5990
|
+
case 4: return [2 /*return*/, {
|
|
5991
|
+
source: name,
|
|
5992
|
+
filename: null,
|
|
5993
|
+
url: null,
|
|
5994
|
+
mimeType: 'text/markdown',
|
|
5995
|
+
asText: function () {
|
|
5996
|
+
return knowledgeSource.sourceContent;
|
|
5997
|
+
},
|
|
5998
|
+
asJson: function () {
|
|
5999
|
+
throw new UnexpectedError('Did not expect that `markdownScraper` would need to get the content `asJson`');
|
|
6000
|
+
},
|
|
6001
|
+
asBlob: function () {
|
|
6002
|
+
throw new UnexpectedError('Did not expect that `markdownScraper` would need to get the content `asBlob`');
|
|
6003
|
+
},
|
|
6004
|
+
}];
|
|
4969
6005
|
}
|
|
4970
6006
|
});
|
|
4971
6007
|
});
|
|
4972
6008
|
}
|
|
4973
|
-
/**
|
|
4974
|
-
* TODO: [🐝][🔼][main] !!! Export via `@promptbook/markdown`
|
|
4975
|
-
* TODO: [🪂] Do it in parallel 11:11
|
|
4976
|
-
* Note: No need to aggregate usage here, it is done by intercepting the llmTools
|
|
4977
|
-
*/
|
|
4978
6009
|
|
|
4979
6010
|
/**
|
|
4980
6011
|
* Prepares the knowle
|
|
@@ -4984,21 +6015,64 @@
|
|
|
4984
6015
|
*/
|
|
4985
6016
|
function prepareKnowledgePieces(knowledgeSources, options) {
|
|
4986
6017
|
return __awaiter(this, void 0, void 0, function () {
|
|
4987
|
-
var _a, maxParallelCount, knowledgePrepared;
|
|
6018
|
+
var _a, maxParallelCount, rootDirname, _b, isVerbose, knowledgePreparedUnflatten, knowledgePrepared;
|
|
4988
6019
|
var _this = this;
|
|
4989
|
-
return __generator(this, function (
|
|
4990
|
-
switch (
|
|
6020
|
+
return __generator(this, function (_c) {
|
|
6021
|
+
switch (_c.label) {
|
|
4991
6022
|
case 0:
|
|
4992
|
-
_a = options.maxParallelCount, maxParallelCount = _a === void 0 ? MAX_PARALLEL_COUNT : _a;
|
|
4993
|
-
|
|
4994
|
-
return [4 /*yield*/, forEachAsync(knowledgeSources, { maxParallelCount: maxParallelCount }, function (knowledgeSource) { return __awaiter(_this, void 0, void 0, function () {
|
|
4995
|
-
var partialPieces, pieces;
|
|
4996
|
-
|
|
4997
|
-
|
|
4998
|
-
|
|
4999
|
-
|
|
6023
|
+
_a = options.maxParallelCount, maxParallelCount = _a === void 0 ? MAX_PARALLEL_COUNT : _a, rootDirname = options.rootDirname, _b = options.isVerbose, isVerbose = _b === void 0 ? IS_VERBOSE : _b;
|
|
6024
|
+
knowledgePreparedUnflatten = new Array(knowledgeSources.length);
|
|
6025
|
+
return [4 /*yield*/, forEachAsync(knowledgeSources, { maxParallelCount: maxParallelCount }, function (knowledgeSource, index) { return __awaiter(_this, void 0, void 0, function () {
|
|
6026
|
+
var partialPieces, sourceHandler, SCRAPERS_1, SCRAPERS_1_1, scraper, partialPiecesUnchecked, e_1_1, pieces;
|
|
6027
|
+
var e_1, _a;
|
|
6028
|
+
return __generator(this, function (_b) {
|
|
6029
|
+
switch (_b.label) {
|
|
6030
|
+
case 0:
|
|
6031
|
+
partialPieces = null;
|
|
6032
|
+
return [4 /*yield*/, makeKnowledgeSourceHandler(knowledgeSource, { rootDirname: rootDirname, isVerbose: isVerbose })];
|
|
5000
6033
|
case 1:
|
|
5001
|
-
|
|
6034
|
+
sourceHandler = _b.sent();
|
|
6035
|
+
_b.label = 2;
|
|
6036
|
+
case 2:
|
|
6037
|
+
_b.trys.push([2, 7, 8, 9]);
|
|
6038
|
+
SCRAPERS_1 = __values(SCRAPERS), SCRAPERS_1_1 = SCRAPERS_1.next();
|
|
6039
|
+
_b.label = 3;
|
|
6040
|
+
case 3:
|
|
6041
|
+
if (!!SCRAPERS_1_1.done) return [3 /*break*/, 6];
|
|
6042
|
+
scraper = SCRAPERS_1_1.value;
|
|
6043
|
+
if (!scraper.mimeTypes.includes(sourceHandler.mimeType)
|
|
6044
|
+
// <- TODO: [🦔] Implement mime-type wildcards
|
|
6045
|
+
) {
|
|
6046
|
+
return [3 /*break*/, 5];
|
|
6047
|
+
}
|
|
6048
|
+
return [4 /*yield*/, scraper.scrape(sourceHandler, options)];
|
|
6049
|
+
case 4:
|
|
6050
|
+
partialPiecesUnchecked = _b.sent();
|
|
6051
|
+
if (partialPiecesUnchecked !== null) {
|
|
6052
|
+
partialPieces = partialPiecesUnchecked;
|
|
6053
|
+
return [3 /*break*/, 6];
|
|
6054
|
+
}
|
|
6055
|
+
_b.label = 5;
|
|
6056
|
+
case 5:
|
|
6057
|
+
SCRAPERS_1_1 = SCRAPERS_1.next();
|
|
6058
|
+
return [3 /*break*/, 3];
|
|
6059
|
+
case 6: return [3 /*break*/, 9];
|
|
6060
|
+
case 7:
|
|
6061
|
+
e_1_1 = _b.sent();
|
|
6062
|
+
e_1 = { error: e_1_1 };
|
|
6063
|
+
return [3 /*break*/, 9];
|
|
6064
|
+
case 8:
|
|
6065
|
+
try {
|
|
6066
|
+
if (SCRAPERS_1_1 && !SCRAPERS_1_1.done && (_a = SCRAPERS_1.return)) _a.call(SCRAPERS_1);
|
|
6067
|
+
}
|
|
6068
|
+
finally { if (e_1) throw e_1.error; }
|
|
6069
|
+
return [7 /*endfinally*/];
|
|
6070
|
+
case 9:
|
|
6071
|
+
if (partialPieces === null) {
|
|
6072
|
+
throw new KnowledgeScrapeError(spaceTrim__default["default"](function (block) { return "\n Cannot scrape knowledge from source: ".concat(knowledgeSource.sourceContent, "\n\n No scraper found for the mime type \"").concat(sourceHandler.mimeType, "\"\n\n Available scrapers:\n ").concat(block(SCRAPERS.flatMap(function (scraper) { return scraper.mimeTypes; })
|
|
6073
|
+
.map(function (mimeType) { return "- ".concat(mimeType); })
|
|
6074
|
+
.join('\n')), "\n\n\n "); }));
|
|
6075
|
+
}
|
|
5002
6076
|
pieces = partialPieces.map(function (partialPiece) { return (__assign(__assign({}, partialPiece), { sources: [
|
|
5003
6077
|
{
|
|
5004
6078
|
name: knowledgeSource.name,
|
|
@@ -5006,13 +6080,14 @@
|
|
|
5006
6080
|
// <- TODO: [❎]
|
|
5007
6081
|
},
|
|
5008
6082
|
] })); });
|
|
5009
|
-
|
|
6083
|
+
knowledgePreparedUnflatten[index] = pieces;
|
|
5010
6084
|
return [2 /*return*/];
|
|
5011
6085
|
}
|
|
5012
6086
|
});
|
|
5013
6087
|
}); })];
|
|
5014
6088
|
case 1:
|
|
5015
|
-
|
|
6089
|
+
_c.sent();
|
|
6090
|
+
knowledgePrepared = knowledgePreparedUnflatten.flat();
|
|
5016
6091
|
return [2 /*return*/, knowledgePrepared];
|
|
5017
6092
|
}
|
|
5018
6093
|
});
|
|
@@ -5029,7 +6104,7 @@
|
|
|
5029
6104
|
>
|
|
5030
6105
|
> export async function prepareKnowledgePieces(
|
|
5031
6106
|
> knowledge: PrepareKnowledgeKnowledge,
|
|
5032
|
-
> options:
|
|
6107
|
+
> options: PrepareAndScrapeOptions,
|
|
5033
6108
|
> ):
|
|
5034
6109
|
*/
|
|
5035
6110
|
/**
|
|
@@ -5142,6 +6217,9 @@
|
|
|
5142
6217
|
switch (_d.label) {
|
|
5143
6218
|
case 0:
|
|
5144
6219
|
llmTools = options.llmTools, _a = options.isVerbose, isVerbose = _a === void 0 ? IS_VERBOSE : _a;
|
|
6220
|
+
if (llmTools === undefined) {
|
|
6221
|
+
throw new MissingToolsError('LLM tools are required for preparing persona');
|
|
6222
|
+
}
|
|
5145
6223
|
collection = createCollectionFromJson.apply(void 0, __spreadArray([], __read(PipelineCollection), false));
|
|
5146
6224
|
_b = createPipelineExecutor;
|
|
5147
6225
|
_c = {};
|
|
@@ -5285,7 +6363,7 @@
|
|
|
5285
6363
|
*/
|
|
5286
6364
|
function preparePipeline(pipeline, options) {
|
|
5287
6365
|
return __awaiter(this, void 0, void 0, function () {
|
|
5288
|
-
var llmTools, _a, maxParallelCount, _b, isVerbose, parameters, templates,
|
|
6366
|
+
var llmTools, rootDirname, _a, maxParallelCount, _b, isVerbose, parameters, templates,
|
|
5289
6367
|
/*
|
|
5290
6368
|
<- TODO: [🧠][🪑] `promptbookVersion` */
|
|
5291
6369
|
knowledgeSources /*
|
|
@@ -5298,8 +6376,11 @@
|
|
|
5298
6376
|
if (isPipelinePrepared(pipeline)) {
|
|
5299
6377
|
return [2 /*return*/, pipeline];
|
|
5300
6378
|
}
|
|
5301
|
-
llmTools = options.llmTools, _a = options.maxParallelCount, maxParallelCount = _a === void 0 ? MAX_PARALLEL_COUNT : _a, _b = options.isVerbose, isVerbose = _b === void 0 ? IS_VERBOSE : _b;
|
|
6379
|
+
llmTools = options.llmTools, rootDirname = options.rootDirname, _a = options.maxParallelCount, maxParallelCount = _a === void 0 ? MAX_PARALLEL_COUNT : _a, _b = options.isVerbose, isVerbose = _b === void 0 ? IS_VERBOSE : _b;
|
|
5302
6380
|
parameters = pipeline.parameters, templates = pipeline.templates, knowledgeSources = pipeline.knowledgeSources, personas = pipeline.personas;
|
|
6381
|
+
if (llmTools === undefined) {
|
|
6382
|
+
throw new MissingToolsError('LLM tools are required for preparing the pipeline');
|
|
6383
|
+
}
|
|
5303
6384
|
llmToolsWithUsage = countTotalUsage(llmTools);
|
|
5304
6385
|
currentPreparation = {
|
|
5305
6386
|
id: 1,
|
|
@@ -5321,6 +6402,7 @@
|
|
|
5321
6402
|
switch (_a.label) {
|
|
5322
6403
|
case 0: return [4 /*yield*/, preparePersona(persona.description, {
|
|
5323
6404
|
llmTools: llmToolsWithUsage,
|
|
6405
|
+
rootDirname: rootDirname,
|
|
5324
6406
|
maxParallelCount: maxParallelCount /* <- TODO: [🪂] */,
|
|
5325
6407
|
isVerbose: isVerbose,
|
|
5326
6408
|
})];
|
|
@@ -5335,11 +6417,7 @@
|
|
|
5335
6417
|
case 1:
|
|
5336
6418
|
_c.sent();
|
|
5337
6419
|
knowledgeSourcesPrepared = knowledgeSources.map(function (source) { return (__assign(__assign({}, source), { preparationIds: [/* TODO: [🧊] -> */ currentPreparation.id] })); });
|
|
5338
|
-
return [4 /*yield*/, prepareKnowledgePieces(knowledgeSources /* <- TODO: [🧊] {knowledgeSources, knowledgePieces} */, {
|
|
5339
|
-
llmTools: llmToolsWithUsage,
|
|
5340
|
-
maxParallelCount: maxParallelCount /* <- TODO: [🪂] */,
|
|
5341
|
-
isVerbose: isVerbose,
|
|
5342
|
-
})];
|
|
6420
|
+
return [4 /*yield*/, prepareKnowledgePieces(knowledgeSources /* <- TODO: [🧊] {knowledgeSources, knowledgePieces} */, __assign(__assign({}, options), { llmTools: llmToolsWithUsage, rootDirname: rootDirname, maxParallelCount: maxParallelCount /* <- TODO: [🪂] */, isVerbose: isVerbose }))];
|
|
5343
6421
|
case 2:
|
|
5344
6422
|
partialknowledgePiecesPrepared = _c.sent();
|
|
5345
6423
|
knowledgePiecesPrepared = partialknowledgePiecesPrepared.map(function (piece) { return (__assign(__assign({}, piece), { preparationIds: [/* TODO: [🧊] -> */ currentPreparation.id] })); });
|
|
@@ -5349,6 +6427,7 @@
|
|
|
5349
6427
|
knowledgePiecesCount: knowledgePiecesPrepared.length,
|
|
5350
6428
|
}, {
|
|
5351
6429
|
llmTools: llmToolsWithUsage,
|
|
6430
|
+
rootDirname: rootDirname,
|
|
5352
6431
|
maxParallelCount: maxParallelCount /* <- TODO: [🪂] */,
|
|
5353
6432
|
isVerbose: isVerbose,
|
|
5354
6433
|
})];
|
|
@@ -5371,36 +6450,10 @@
|
|
|
5371
6450
|
* @see https://docs.anthropic.com/en/docs/test-and-evaluate/strengthen-guardrails/increase-consistency#specify-the-desired-output-format
|
|
5372
6451
|
*/
|
|
5373
6452
|
|
|
5374
|
-
/**
|
|
5375
|
-
* Tests if given string is valid URL.
|
|
5376
|
-
*
|
|
5377
|
-
* Note: This does not check if the file exists only if the path is valid
|
|
5378
|
-
* @public exported from `@promptbook/utils`
|
|
5379
|
-
*/
|
|
5380
|
-
function isValidFilePath(filePath) {
|
|
5381
|
-
if (typeof filePath !== 'string') {
|
|
5382
|
-
return false;
|
|
5383
|
-
}
|
|
5384
|
-
var filePathSlashes = filePath.split('\\').join('/');
|
|
5385
|
-
// Absolute Unix path: /hello.txt
|
|
5386
|
-
if (/^(\/)/i.test(filePathSlashes)) {
|
|
5387
|
-
return true;
|
|
5388
|
-
}
|
|
5389
|
-
// Absolute Windows path: /hello.txt
|
|
5390
|
-
if (/^([A-Z]{1,2}:\/?)\//i.test(filePathSlashes)) {
|
|
5391
|
-
return true;
|
|
5392
|
-
}
|
|
5393
|
-
// Relative path: ./hello.txt
|
|
5394
|
-
if (/^(\.\.?\/)+/i.test(filePathSlashes)) {
|
|
5395
|
-
return true;
|
|
5396
|
-
}
|
|
5397
|
-
return false;
|
|
5398
|
-
}
|
|
5399
|
-
|
|
5400
6453
|
/**
|
|
5401
6454
|
* Parses the knowledge command
|
|
5402
6455
|
*
|
|
5403
|
-
* @see
|
|
6456
|
+
* @see `documentationUrl` for more details
|
|
5404
6457
|
* @private within the commands folder
|
|
5405
6458
|
*/
|
|
5406
6459
|
var knowledgeCommandParser = {
|
|
@@ -5418,7 +6471,7 @@
|
|
|
5418
6471
|
*/
|
|
5419
6472
|
description: "Tells promptbook which external knowledge to use",
|
|
5420
6473
|
/**
|
|
5421
|
-
* Link to
|
|
6474
|
+
* Link to documentation
|
|
5422
6475
|
*/
|
|
5423
6476
|
documentationUrl: 'https://github.com/webgptorg/promptbook/discussions/41',
|
|
5424
6477
|
/**
|
|
@@ -5462,11 +6515,8 @@
|
|
|
5462
6515
|
*/
|
|
5463
6516
|
$applyToPipelineJson: function (command, $pipelineJson) {
|
|
5464
6517
|
var sourceContent = command.sourceContent;
|
|
5465
|
-
var name = 'source-' + sha256__default["default"](hexEncoder__default["default"].parse(JSON.stringify(sourceContent))).toString( /* hex */);
|
|
5466
|
-
// <- TODO: [🥬] Encapsulate sha256 to some private utility function
|
|
5467
|
-
// <- TODO: This should be replaced with a better name later in preparation (done with some propper LLM summarization)
|
|
5468
6518
|
$pipelineJson.knowledgeSources.push({
|
|
5469
|
-
name:
|
|
6519
|
+
name: sourceContentToName(sourceContent),
|
|
5470
6520
|
sourceContent: sourceContent,
|
|
5471
6521
|
});
|
|
5472
6522
|
},
|
|
@@ -5496,7 +6546,7 @@
|
|
|
5496
6546
|
/**
|
|
5497
6547
|
* Parses the template command
|
|
5498
6548
|
*
|
|
5499
|
-
* @see
|
|
6549
|
+
* @see `documentationUrl` for more details
|
|
5500
6550
|
* @private within the commands folder
|
|
5501
6551
|
*/
|
|
5502
6552
|
var templateCommandParser = {
|
|
@@ -5532,7 +6582,7 @@
|
|
|
5532
6582
|
*/
|
|
5533
6583
|
description: "What should the code template template do",
|
|
5534
6584
|
/**
|
|
5535
|
-
* Link to
|
|
6585
|
+
* Link to documentation
|
|
5536
6586
|
*/
|
|
5537
6587
|
documentationUrl: 'https://github.com/webgptorg/promptbook/discussions/64',
|
|
5538
6588
|
/**
|
|
@@ -5757,7 +6807,7 @@
|
|
|
5757
6807
|
/**
|
|
5758
6808
|
* Parses the expect command
|
|
5759
6809
|
*
|
|
5760
|
-
* @see
|
|
6810
|
+
* @see `documentationUrl` for more details
|
|
5761
6811
|
* @private within the commands folder
|
|
5762
6812
|
*/
|
|
5763
6813
|
var expectCommandParser = {
|
|
@@ -5775,7 +6825,7 @@
|
|
|
5775
6825
|
*/
|
|
5776
6826
|
description: spaceTrim__default["default"]("\n Expect command describes the desired output of the template (after post-processing)\n It can set limits for the maximum/minimum length of the output, measured in characters, words, sentences, paragraphs or some other shape of the output.\n "),
|
|
5777
6827
|
/**
|
|
5778
|
-
* Link to
|
|
6828
|
+
* Link to documentation
|
|
5779
6829
|
*/
|
|
5780
6830
|
documentationUrl: 'https://github.com/webgptorg/promptbook/discussions/30',
|
|
5781
6831
|
/**
|
|
@@ -5935,10 +6985,6 @@
|
|
|
5935
6985
|
charType = 'NUMBER';
|
|
5936
6986
|
normalizedChar = char;
|
|
5937
6987
|
}
|
|
5938
|
-
else if (/^\/$/.test(char)) {
|
|
5939
|
-
charType = 'SLASH';
|
|
5940
|
-
normalizedChar = char;
|
|
5941
|
-
}
|
|
5942
6988
|
else {
|
|
5943
6989
|
charType = 'OTHER';
|
|
5944
6990
|
normalizedChar = '_';
|
|
@@ -6145,7 +7191,7 @@
|
|
|
6145
7191
|
*
|
|
6146
7192
|
* Note: @@@ This command is used as foreach for new commands - it should NOT be used in any `.ptbk.md` file
|
|
6147
7193
|
*
|
|
6148
|
-
* @see
|
|
7194
|
+
* @see `documentationUrl` for more details
|
|
6149
7195
|
* @private within the commands folder
|
|
6150
7196
|
*/
|
|
6151
7197
|
var foreachCommandParser = {
|
|
@@ -6167,7 +7213,7 @@
|
|
|
6167
7213
|
*/
|
|
6168
7214
|
description: "@@",
|
|
6169
7215
|
/**
|
|
6170
|
-
* Link to
|
|
7216
|
+
* Link to documentation
|
|
6171
7217
|
*/
|
|
6172
7218
|
documentationUrl: 'https://github.com/webgptorg/promptbook/discussions/148',
|
|
6173
7219
|
/**
|
|
@@ -6302,7 +7348,7 @@
|
|
|
6302
7348
|
/**
|
|
6303
7349
|
* Parses the format command
|
|
6304
7350
|
*
|
|
6305
|
-
* @see
|
|
7351
|
+
* @see `documentationUrl` for more details
|
|
6306
7352
|
* @private within the commands folder
|
|
6307
7353
|
*/
|
|
6308
7354
|
var formatCommandParser = {
|
|
@@ -6320,7 +7366,7 @@
|
|
|
6320
7366
|
*/
|
|
6321
7367
|
description: spaceTrim__default["default"]("\n Format command describes the desired output of the template (after post-processing)\n It can set limits for the maximum/minimum length of the output, measured in characters, words, sentences, paragraphs or some other shape of the output.\n "),
|
|
6322
7368
|
/**
|
|
6323
|
-
* Link to
|
|
7369
|
+
* Link to documentation
|
|
6324
7370
|
*/
|
|
6325
7371
|
documentationUrl: 'https://github.com/webgptorg/promptbook/discussions/30',
|
|
6326
7372
|
/**
|
|
@@ -6376,7 +7422,7 @@
|
|
|
6376
7422
|
/**
|
|
6377
7423
|
* Parses the joker command
|
|
6378
7424
|
*
|
|
6379
|
-
* @see
|
|
7425
|
+
* @see `documentationUrl` for more details
|
|
6380
7426
|
* @private within the commands folder
|
|
6381
7427
|
*/
|
|
6382
7428
|
var jokerCommandParser = {
|
|
@@ -6394,7 +7440,7 @@
|
|
|
6394
7440
|
*/
|
|
6395
7441
|
description: "Joker parameter is used instead of executing the template result if jokers value meets the expectations requirements",
|
|
6396
7442
|
/**
|
|
6397
|
-
* Link to
|
|
7443
|
+
* Link to documentation
|
|
6398
7444
|
*/
|
|
6399
7445
|
documentationUrl: 'https://github.com/webgptorg/promptbook/discussions/66',
|
|
6400
7446
|
/**
|
|
@@ -6455,7 +7501,7 @@
|
|
|
6455
7501
|
/**
|
|
6456
7502
|
* Parses the model command
|
|
6457
7503
|
*
|
|
6458
|
-
* @see
|
|
7504
|
+
* @see `documentationUrl` for more details
|
|
6459
7505
|
* @private within the commands folder
|
|
6460
7506
|
*/
|
|
6461
7507
|
var modelCommandParser = {
|
|
@@ -6473,7 +7519,7 @@
|
|
|
6473
7519
|
*/
|
|
6474
7520
|
description: "Tells which `modelRequirements` (for example which model) to use for the prompt template execution",
|
|
6475
7521
|
/**
|
|
6476
|
-
* Link to
|
|
7522
|
+
* Link to documentation
|
|
6477
7523
|
*/
|
|
6478
7524
|
documentationUrl: 'https://github.com/webgptorg/promptbook/discussions/67',
|
|
6479
7525
|
/**
|
|
@@ -6555,7 +7601,11 @@
|
|
|
6555
7601
|
// TODO: [🚜] DRY
|
|
6556
7602
|
if ($templateJson.modelRequirements[command.key] !== undefined) {
|
|
6557
7603
|
if ($templateJson.modelRequirements[command.key] === command.value) {
|
|
6558
|
-
console.warn("Multiple commands `MODEL ".concat(
|
|
7604
|
+
console.warn("Multiple commands `MODEL ".concat({
|
|
7605
|
+
modelName: 'NAME',
|
|
7606
|
+
modelVariant: 'VARIANT',
|
|
7607
|
+
maxTokens: '???',
|
|
7608
|
+
}[command.key], " ").concat(command.value, "` in the template \"").concat($templateJson.title || $templateJson.name, "\""));
|
|
6559
7609
|
}
|
|
6560
7610
|
else {
|
|
6561
7611
|
throw new ParseError(spaceTrim__default["default"]("\n Redefinition of MODEL `".concat(command.key, "` in the template \"").concat($templateJson.title || $templateJson.name, "\"\n\n You have used:\n - MODEL ").concat(command.key, " ").concat($templateJson.modelRequirements[command.key], "\n - MODEL ").concat(command.key, " ").concat(command.value, "\n ")));
|
|
@@ -6598,7 +7648,7 @@
|
|
|
6598
7648
|
/**
|
|
6599
7649
|
* Parses the parameter command
|
|
6600
7650
|
*
|
|
6601
|
-
* @see
|
|
7651
|
+
* @see `documentationUrl` for more details
|
|
6602
7652
|
* @private within the commands folder
|
|
6603
7653
|
*/
|
|
6604
7654
|
var parameterCommandParser = {
|
|
@@ -6623,7 +7673,7 @@
|
|
|
6623
7673
|
*/
|
|
6624
7674
|
description: "Describes one parameter of the template",
|
|
6625
7675
|
/**
|
|
6626
|
-
* Link to
|
|
7676
|
+
* Link to documentation
|
|
6627
7677
|
*/
|
|
6628
7678
|
documentationUrl: 'https://github.com/webgptorg/promptbook/discussions/68',
|
|
6629
7679
|
/**
|
|
@@ -6708,7 +7758,7 @@
|
|
|
6708
7758
|
/**
|
|
6709
7759
|
* Parses the persona command
|
|
6710
7760
|
*
|
|
6711
|
-
* @see
|
|
7761
|
+
* @see `documentationUrl` for more details
|
|
6712
7762
|
* @private within the commands folder
|
|
6713
7763
|
*/
|
|
6714
7764
|
var personaCommandParser = {
|
|
@@ -6730,7 +7780,7 @@
|
|
|
6730
7780
|
*/
|
|
6731
7781
|
description: "Persona command is used to specify who the system is, it will be transformed into system message, top_t,...",
|
|
6732
7782
|
/**
|
|
6733
|
-
* Link to
|
|
7783
|
+
* Link to documentation
|
|
6734
7784
|
*/
|
|
6735
7785
|
documentationUrl: 'https://github.com/webgptorg/promptbook/discussions/22',
|
|
6736
7786
|
/**
|
|
@@ -6846,7 +7896,7 @@
|
|
|
6846
7896
|
/**
|
|
6847
7897
|
* Parses the postprocess command
|
|
6848
7898
|
*
|
|
6849
|
-
* @see
|
|
7899
|
+
* @see `documentationUrl` for more details
|
|
6850
7900
|
* @private within the commands folder
|
|
6851
7901
|
*/
|
|
6852
7902
|
var postprocessCommandParser = {
|
|
@@ -6865,7 +7915,7 @@
|
|
|
6865
7915
|
*/
|
|
6866
7916
|
description: "Defines the postprocess function to be used on the result from LLM and before the result is validated",
|
|
6867
7917
|
/**
|
|
6868
|
-
* Link to
|
|
7918
|
+
* Link to documentation
|
|
6869
7919
|
*/
|
|
6870
7920
|
documentationUrl: 'https://github.com/webgptorg/promptbook/discussions/31',
|
|
6871
7921
|
/**
|
|
@@ -6926,7 +7976,7 @@
|
|
|
6926
7976
|
/**
|
|
6927
7977
|
* Parses the PROMPTBOOK_VERSION command
|
|
6928
7978
|
*
|
|
6929
|
-
* @see
|
|
7979
|
+
* @see `documentationUrl` for more details
|
|
6930
7980
|
* @private within the commands folder
|
|
6931
7981
|
*/
|
|
6932
7982
|
var promptbookVersionCommandParser = {
|
|
@@ -6945,7 +7995,7 @@
|
|
|
6945
7995
|
*/
|
|
6946
7996
|
description: "Which version of the promptbook is the .ptbk.md using",
|
|
6947
7997
|
/**
|
|
6948
|
-
* Link to
|
|
7998
|
+
* Link to documentation
|
|
6949
7999
|
*/
|
|
6950
8000
|
documentationUrl: 'https://github.com/webgptorg/promptbook/discussions/69',
|
|
6951
8001
|
/**
|
|
@@ -7004,7 +8054,7 @@
|
|
|
7004
8054
|
/**
|
|
7005
8055
|
* Parses the url command
|
|
7006
8056
|
*
|
|
7007
|
-
* @see
|
|
8057
|
+
* @see `documentationUrl` for more details
|
|
7008
8058
|
* @private within the commands folder
|
|
7009
8059
|
*/
|
|
7010
8060
|
var urlCommandParser = {
|
|
@@ -7027,7 +8077,7 @@
|
|
|
7027
8077
|
*/
|
|
7028
8078
|
description: "Declares unique URL for the pipeline",
|
|
7029
8079
|
/**
|
|
7030
|
-
* Link to
|
|
8080
|
+
* Link to documentation
|
|
7031
8081
|
*/
|
|
7032
8082
|
documentationUrl: 'https://github.com/webgptorg/promptbook/discussions/70',
|
|
7033
8083
|
/**
|
|
@@ -7107,7 +8157,7 @@
|
|
|
7107
8157
|
/**
|
|
7108
8158
|
* Parses the action command
|
|
7109
8159
|
*
|
|
7110
|
-
* @see
|
|
8160
|
+
* @see `documentationUrl` for more details
|
|
7111
8161
|
* @private within the commands folder
|
|
7112
8162
|
*/
|
|
7113
8163
|
var actionCommandParser = {
|
|
@@ -7125,7 +8175,7 @@
|
|
|
7125
8175
|
*/
|
|
7126
8176
|
description: "Actions influences from the pipeline or template into external world. Like turning on a light, sending an email, etc.",
|
|
7127
8177
|
/**
|
|
7128
|
-
* Link to
|
|
8178
|
+
* Link to documentation
|
|
7129
8179
|
*/
|
|
7130
8180
|
documentationUrl: 'https://github.com/webgptorg/promptbook/discussions/72',
|
|
7131
8181
|
/**
|
|
@@ -7177,7 +8227,7 @@
|
|
|
7177
8227
|
/**
|
|
7178
8228
|
* Parses the instrument command
|
|
7179
8229
|
*
|
|
7180
|
-
* @see
|
|
8230
|
+
* @see `documentationUrl` for more details
|
|
7181
8231
|
* @private within the commands folder
|
|
7182
8232
|
*/
|
|
7183
8233
|
var instrumentCommandParser = {
|
|
@@ -7195,7 +8245,7 @@
|
|
|
7195
8245
|
*/
|
|
7196
8246
|
description: "Instrument command is used to specify the instrument to be used in the pipeline or template like search, calculate, etc.",
|
|
7197
8247
|
/**
|
|
7198
|
-
* Link to
|
|
8248
|
+
* Link to documentation
|
|
7199
8249
|
*/
|
|
7200
8250
|
documentationUrl: 'https://github.com/webgptorg/promptbook/discussions/71',
|
|
7201
8251
|
/**
|
|
@@ -7250,7 +8300,7 @@
|
|
|
7250
8300
|
*
|
|
7251
8301
|
* Note: @@@ This command is used as boilerplate for new commands - it should NOT be used in any `.ptbk.md` file
|
|
7252
8302
|
*
|
|
7253
|
-
* @see
|
|
8303
|
+
* @see `documentationUrl` for more details
|
|
7254
8304
|
* @private within the commands folder
|
|
7255
8305
|
*/
|
|
7256
8306
|
var boilerplateCommandParser = {
|
|
@@ -7272,7 +8322,7 @@
|
|
|
7272
8322
|
*/
|
|
7273
8323
|
description: "@@",
|
|
7274
8324
|
/**
|
|
7275
|
-
* Link to
|
|
8325
|
+
* Link to documentation
|
|
7276
8326
|
*/
|
|
7277
8327
|
documentationUrl: 'https://github.com/webgptorg/promptbook/discussions/@@',
|
|
7278
8328
|
/**
|
|
@@ -8122,16 +9172,17 @@
|
|
|
8122
9172
|
* @public exported from `@promptbook/core`
|
|
8123
9173
|
*/
|
|
8124
9174
|
function pipelineStringToJson(pipelineString, options) {
|
|
8125
|
-
if (options === void 0) { options = { llmTools: null }; }
|
|
8126
9175
|
return __awaiter(this, void 0, void 0, function () {
|
|
8127
9176
|
var llmTools, pipelineJson;
|
|
8128
9177
|
return __generator(this, function (_a) {
|
|
8129
9178
|
switch (_a.label) {
|
|
8130
9179
|
case 0:
|
|
8131
|
-
llmTools = options.llmTools;
|
|
9180
|
+
llmTools = (options || {}).llmTools;
|
|
8132
9181
|
pipelineJson = pipelineStringToJsonSync(pipelineString);
|
|
8133
|
-
if (!(llmTools !==
|
|
8134
|
-
return [4 /*yield*/, preparePipeline(pipelineJson,
|
|
9182
|
+
if (!(llmTools !== undefined)) return [3 /*break*/, 2];
|
|
9183
|
+
return [4 /*yield*/, preparePipeline(pipelineJson, options || {
|
|
9184
|
+
rootDirname: null,
|
|
9185
|
+
})];
|
|
8135
9186
|
case 1:
|
|
8136
9187
|
pipelineJson = _a.sent();
|
|
8137
9188
|
_a.label = 2;
|
|
@@ -8339,6 +9390,38 @@
|
|
|
8339
9390
|
* TODO: [🍙] Make some standard order of json properties
|
|
8340
9391
|
*/
|
|
8341
9392
|
|
|
9393
|
+
/**
|
|
9394
|
+
* Delagates the user interaction to a async callback function
|
|
9395
|
+
* You need to provide your own implementation of this callback function and its bind to UI.
|
|
9396
|
+
*
|
|
9397
|
+
* @public exported from `@promptbook/core`
|
|
9398
|
+
*/
|
|
9399
|
+
var CallbackInterfaceTools = /** @class */ (function () {
|
|
9400
|
+
function CallbackInterfaceTools(options) {
|
|
9401
|
+
this.options = options;
|
|
9402
|
+
}
|
|
9403
|
+
/**
|
|
9404
|
+
* Trigger the custom callback function
|
|
9405
|
+
*/
|
|
9406
|
+
CallbackInterfaceTools.prototype.promptDialog = function (options) {
|
|
9407
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
9408
|
+
var answer;
|
|
9409
|
+
return __generator(this, function (_a) {
|
|
9410
|
+
switch (_a.label) {
|
|
9411
|
+
case 0: return [4 /*yield*/, this.options.callback(options)];
|
|
9412
|
+
case 1:
|
|
9413
|
+
answer = _a.sent();
|
|
9414
|
+
if (this.options.isVerbose) {
|
|
9415
|
+
console.info(spaceTrim.spaceTrim(function (block) { return "\n \uD83D\uDCD6 ".concat(block(options.promptTitle), "\n \uD83D\uDC64 ").concat(block(answer), "\n "); }));
|
|
9416
|
+
}
|
|
9417
|
+
return [2 /*return*/, answer];
|
|
9418
|
+
}
|
|
9419
|
+
});
|
|
9420
|
+
});
|
|
9421
|
+
};
|
|
9422
|
+
return CallbackInterfaceTools;
|
|
9423
|
+
}());
|
|
9424
|
+
|
|
8342
9425
|
/**
|
|
8343
9426
|
* Pretty print an embedding vector for logging
|
|
8344
9427
|
*
|
|
@@ -8414,38 +9497,6 @@
|
|
|
8414
9497
|
* TODO: [🏛] Maybe make some markdown builder
|
|
8415
9498
|
*/
|
|
8416
9499
|
|
|
8417
|
-
/**
|
|
8418
|
-
* Delagates the user interaction to a async callback function
|
|
8419
|
-
* You need to provide your own implementation of this callback function and its bind to UI.
|
|
8420
|
-
*
|
|
8421
|
-
* @public exported from `@promptbook/core`
|
|
8422
|
-
*/
|
|
8423
|
-
var CallbackInterfaceTools = /** @class */ (function () {
|
|
8424
|
-
function CallbackInterfaceTools(options) {
|
|
8425
|
-
this.options = options;
|
|
8426
|
-
}
|
|
8427
|
-
/**
|
|
8428
|
-
* Trigger the custom callback function
|
|
8429
|
-
*/
|
|
8430
|
-
CallbackInterfaceTools.prototype.promptDialog = function (options) {
|
|
8431
|
-
return __awaiter(this, void 0, void 0, function () {
|
|
8432
|
-
var answer;
|
|
8433
|
-
return __generator(this, function (_a) {
|
|
8434
|
-
switch (_a.label) {
|
|
8435
|
-
case 0: return [4 /*yield*/, this.options.callback(options)];
|
|
8436
|
-
case 1:
|
|
8437
|
-
answer = _a.sent();
|
|
8438
|
-
if (this.options.isVerbose) {
|
|
8439
|
-
console.info(spaceTrim.spaceTrim(function (block) { return "\n \uD83D\uDCD6 ".concat(block(options.promptTitle), "\n \uD83D\uDC64 ").concat(block(answer), "\n "); }));
|
|
8440
|
-
}
|
|
8441
|
-
return [2 /*return*/, answer];
|
|
8442
|
-
}
|
|
8443
|
-
});
|
|
8444
|
-
});
|
|
8445
|
-
};
|
|
8446
|
-
return CallbackInterfaceTools;
|
|
8447
|
-
}());
|
|
8448
|
-
|
|
8449
9500
|
/**
|
|
8450
9501
|
* @@@
|
|
8451
9502
|
*
|
|
@@ -9413,6 +10464,7 @@
|
|
|
9413
10464
|
exports.ExecutionReportStringOptionsDefaults = ExecutionReportStringOptionsDefaults;
|
|
9414
10465
|
exports.ExpectError = ExpectError;
|
|
9415
10466
|
exports.IS_VERBOSE = IS_VERBOSE;
|
|
10467
|
+
exports.KnowledgeScrapeError = KnowledgeScrapeError;
|
|
9416
10468
|
exports.LimitReachedError = LimitReachedError;
|
|
9417
10469
|
exports.MANDATORY_CSV_SETTINGS = MANDATORY_CSV_SETTINGS;
|
|
9418
10470
|
exports.MAX_EXECUTION_ATTEMPTS = MAX_EXECUTION_ATTEMPTS;
|
|
@@ -9422,6 +10474,7 @@
|
|
|
9422
10474
|
exports.MAX_PARALLEL_COUNT = MAX_PARALLEL_COUNT;
|
|
9423
10475
|
exports.MODEL_VARIANTS = MODEL_VARIANTS;
|
|
9424
10476
|
exports.MemoryStorage = MemoryStorage;
|
|
10477
|
+
exports.MissingToolsError = MissingToolsError;
|
|
9425
10478
|
exports.NotFoundError = NotFoundError;
|
|
9426
10479
|
exports.NotYetImplementedError = NotYetImplementedError;
|
|
9427
10480
|
exports.PIPELINE_COLLECTION_BASE_FILENAME = PIPELINE_COLLECTION_BASE_FILENAME;
|
|
@@ -9432,6 +10485,8 @@
|
|
|
9432
10485
|
exports.PipelineUrlError = PipelineUrlError;
|
|
9433
10486
|
exports.PrefixStorage = PrefixStorage;
|
|
9434
10487
|
exports.RESERVED_PARAMETER_NAMES = RESERVED_PARAMETER_NAMES;
|
|
10488
|
+
exports.SCRAPERS = SCRAPERS;
|
|
10489
|
+
exports.SCRAPE_CACHE_DIRNAME = SCRAPE_CACHE_DIRNAME;
|
|
9435
10490
|
exports.TemplateTypes = TemplateTypes;
|
|
9436
10491
|
exports.TextFormatDefinition = TextFormatDefinition;
|
|
9437
10492
|
exports.UNCERTAIN_USAGE = UNCERTAIN_USAGE;
|
|
@@ -9452,16 +10507,19 @@
|
|
|
9452
10507
|
exports.createLlmToolsFromConfiguration = createLlmToolsFromConfiguration;
|
|
9453
10508
|
exports.createPipelineExecutor = createPipelineExecutor;
|
|
9454
10509
|
exports.createSubcollection = createSubcollection;
|
|
10510
|
+
exports.documentScraper = documentScraper;
|
|
9455
10511
|
exports.embeddingVectorToString = embeddingVectorToString;
|
|
9456
10512
|
exports.executionReportJsonToString = executionReportJsonToString;
|
|
9457
10513
|
exports.isPassingExpectations = isPassingExpectations;
|
|
9458
10514
|
exports.isPipelinePrepared = isPipelinePrepared;
|
|
9459
10515
|
exports.joinLlmExecutionTools = joinLlmExecutionTools;
|
|
10516
|
+
exports.legacyDocumentScraper = legacyDocumentScraper;
|
|
9460
10517
|
exports.limitTotalUsage = limitTotalUsage;
|
|
10518
|
+
exports.markdownScraper = markdownScraper;
|
|
10519
|
+
exports.pdfScraper = pdfScraper;
|
|
9461
10520
|
exports.pipelineJsonToString = pipelineJsonToString;
|
|
9462
10521
|
exports.pipelineStringToJson = pipelineStringToJson;
|
|
9463
10522
|
exports.pipelineStringToJsonSync = pipelineStringToJsonSync;
|
|
9464
|
-
exports.prepareKnowledgeFromMarkdown = prepareKnowledgeFromMarkdown;
|
|
9465
10523
|
exports.prepareKnowledgePieces = prepareKnowledgePieces;
|
|
9466
10524
|
exports.preparePersona = preparePersona;
|
|
9467
10525
|
exports.preparePipeline = preparePipeline;
|
|
@@ -9472,6 +10530,7 @@
|
|
|
9472
10530
|
exports.usageToHuman = usageToHuman;
|
|
9473
10531
|
exports.usageToWorktime = usageToWorktime;
|
|
9474
10532
|
exports.validatePipeline = validatePipeline;
|
|
10533
|
+
exports.websiteScraper = websiteScraper;
|
|
9475
10534
|
|
|
9476
10535
|
Object.defineProperty(exports, '__esModule', { value: true });
|
|
9477
10536
|
|