@promptbook/pdf 0.92.0-20 β†’ 0.92.0-22

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.
@@ -32,6 +32,7 @@ import { DEFAULT_IS_VERBOSE } from '../config';
32
32
  import { SET_IS_VERBOSE } from '../config';
33
33
  import { DEFAULT_IS_AUTO_INSTALLED } from '../config';
34
34
  import { DEFAULT_GET_PIPELINE_COLLECTION_FUNCTION_NAME } from '../config';
35
+ import { DEFAULT_RPM } from '../config';
35
36
  import { ORDER_OF_PIPELINE_JSON } from '../constants';
36
37
  import { RESERVED_PARAMETER_NAMES } from '../constants';
37
38
  import { compilePipeline } from '../conversion/compilePipeline';
@@ -81,6 +82,7 @@ import { MANDATORY_CSV_SETTINGS } from '../formats/csv/CsvSettings';
81
82
  import { TextFormatParser } from '../formats/text/TextFormatParser';
82
83
  import { BoilerplateFormfactorDefinition } from '../formfactors/_boilerplate/BoilerplateFormfactorDefinition';
83
84
  import { ChatbotFormfactorDefinition } from '../formfactors/chatbot/ChatbotFormfactorDefinition';
85
+ import { CompletionFormfactorDefinition } from '../formfactors/completion/CompletionFormfactorDefinition';
84
86
  import { GeneratorFormfactorDefinition } from '../formfactors/generator/GeneratorFormfactorDefinition';
85
87
  import { GenericFormfactorDefinition } from '../formfactors/generic/GenericFormfactorDefinition';
86
88
  import { ImageGeneratorFormfactorDefinition } from '../formfactors/image-generator/ImageGeneratorFormfactorDefinition';
@@ -175,6 +177,7 @@ export { DEFAULT_IS_VERBOSE };
175
177
  export { SET_IS_VERBOSE };
176
178
  export { DEFAULT_IS_AUTO_INSTALLED };
177
179
  export { DEFAULT_GET_PIPELINE_COLLECTION_FUNCTION_NAME };
180
+ export { DEFAULT_RPM };
178
181
  export { ORDER_OF_PIPELINE_JSON };
179
182
  export { RESERVED_PARAMETER_NAMES };
180
183
  export { compilePipeline };
@@ -224,6 +227,7 @@ export { MANDATORY_CSV_SETTINGS };
224
227
  export { TextFormatParser };
225
228
  export { BoilerplateFormfactorDefinition };
226
229
  export { ChatbotFormfactorDefinition };
230
+ export { CompletionFormfactorDefinition };
227
231
  export { GeneratorFormfactorDefinition };
228
232
  export { GenericFormfactorDefinition };
229
233
  export { ImageGeneratorFormfactorDefinition };
@@ -62,6 +62,7 @@ import type { UsageCounts } from '../execution/Usage';
62
62
  import type { UserInterfaceTools } from '../execution/UserInterfaceTools';
63
63
  import type { UserInterfaceToolsPromptDialogOptions } from '../execution/UserInterfaceTools';
64
64
  import type { FormatSubvalueParser } from '../formats/_common/FormatSubvalueParser';
65
+ import type { FormatSubvalueParserMapValuesOptions } from '../formats/_common/FormatSubvalueParser';
65
66
  import type { CsvSettings } from '../formats/csv/CsvSettings';
66
67
  import type { AbstractFormfactorDefinition } from '../formfactors/_common/AbstractFormfactorDefinition';
67
68
  import type { FormfactorDefinition } from '../formfactors/_common/FormfactorDefinition';
@@ -358,6 +359,7 @@ export type { UsageCounts };
358
359
  export type { UserInterfaceTools };
359
360
  export type { UserInterfaceToolsPromptDialogOptions };
360
361
  export type { FormatSubvalueParser };
362
+ export type { FormatSubvalueParserMapValuesOptions };
361
363
  export type { CsvSettings };
362
364
  export type { AbstractFormfactorDefinition };
363
365
  export type { FormfactorDefinition };
@@ -265,6 +265,14 @@ export declare const DEFAULT_IS_AUTO_INSTALLED = false;
265
265
  * @public exported from `@promptbook/core`
266
266
  */
267
267
  export declare const DEFAULT_GET_PIPELINE_COLLECTION_FUNCTION_NAME = "getPipelineCollection";
268
+ /**
269
+ * Default rate limits (requests per minute)
270
+ *
271
+ * Note: Adjust based on the provider tier you are have
272
+ *
273
+ * @public exported from `@promptbook/core`
274
+ */
275
+ export declare const DEFAULT_RPM = 60;
268
276
  /**
269
277
  * @@@
270
278
  *
@@ -1,11 +1,18 @@
1
+ import type { PartialDeep, Promisable } from 'type-fest';
1
2
  import type { TODO_any } from '../../utils/organization/TODO_any';
3
+ import type { PipelineExecutorResult } from '../PipelineExecutorResult';
2
4
  import type { ExecuteAttemptsOptions } from './40-executeAttempts';
3
5
  /**
4
6
  * @@@
5
7
  *
6
8
  * @private internal type of `executeFormatSubvalues`
7
9
  */
8
- type ExecuteFormatCellsOptions = ExecuteAttemptsOptions;
10
+ type ExecuteFormatCellsOptions = ExecuteAttemptsOptions & {
11
+ /**
12
+ * @@@
13
+ */
14
+ readonly onProgress: (newOngoingResult: PartialDeep<PipelineExecutorResult>) => Promisable<void>;
15
+ };
9
16
  /**
10
17
  * @@@
11
18
  *
@@ -24,7 +24,17 @@ export type FormatSubvalueParser<TValue extends string, TSettings extends empty_
24
24
  * For example, if you have a JSON object and you want to map all values to uppercase
25
25
  * Or iterate over all CSV cells @@@
26
26
  */
27
- mapValues(value: TValue, outputParameterName: string_parameter_name, settings: TSettings, mapCallback: (subvalues: Parameters, index: number) => Promisable<string>): Promise<string>;
27
+ mapValues(options: FormatSubvalueParserMapValuesOptions<TValue, TSettings>): Promise<string>;
28
+ };
29
+ /**
30
+ * @@@
31
+ */
32
+ export type FormatSubvalueParserMapValuesOptions<TValue extends string, TSettings extends empty_object> = {
33
+ readonly value: TValue;
34
+ readonly outputParameterName: string_parameter_name;
35
+ readonly settings: TSettings;
36
+ mapCallback: (subvalues: Parameters, index: number) => Promisable<TValue>;
37
+ onProgress(partialResultString: TValue): Promisable<void>;
28
38
  };
29
39
  /**
30
40
  * Note: [πŸ‘©πŸΎβ€πŸ€β€πŸ§‘πŸ½]
@@ -6,6 +6,3 @@
6
6
  * @public exported from `@promptbook/utils`
7
7
  */
8
8
  export declare function jsonParse<T>(value: string): T;
9
- /**
10
- * TODO: !!!! Use in Promptbook.studio
11
- */
@@ -0,0 +1,29 @@
1
+ /**
2
+ * Completion is formfactor that emulates completion models
3
+ *
4
+ * @public exported from `@promptbook/core`
5
+ */
6
+ export declare const CompletionFormfactorDefinition: {
7
+ readonly name: "COMPLETION";
8
+ readonly description: "@@@";
9
+ readonly documentationUrl: "https://github.com/webgptorg/promptbook/discussions/@@";
10
+ readonly pipelineInterface: {
11
+ readonly inputParameters: readonly [{
12
+ readonly name: "inputText";
13
+ readonly description: "Input text to be completed";
14
+ readonly isInput: true;
15
+ readonly isOutput: false;
16
+ }, {
17
+ readonly name: "instructions";
18
+ readonly description: "Additional instructions for the model, for example the required length, empty by default";
19
+ readonly isInput: true;
20
+ readonly isOutput: false;
21
+ }];
22
+ readonly outputParameters: readonly [{
23
+ readonly name: "followingText";
24
+ readonly description: "Text that follows the input text";
25
+ readonly isInput: false;
26
+ readonly isOutput: true;
27
+ }];
28
+ };
29
+ };
@@ -36,9 +36,6 @@ export declare const FORMFACTOR_DEFINITIONS: readonly [{
36
36
  readonly outputParameters: readonly [{
37
37
  readonly name: "title";
38
38
  readonly description: "Title of the conversation";
39
- /**
40
- * Note: [πŸ’ž] Ignore a discrepancy between file name and entity name
41
- */
42
39
  readonly isInput: false;
43
40
  readonly isOutput: true;
44
41
  }, {
@@ -132,6 +129,11 @@ export declare const FORMFACTOR_DEFINITIONS: readonly [{
132
129
  readonly isInput: true;
133
130
  readonly isOutput: false;
134
131
  }];
132
+ /**
133
+ * All available formfactor definitions
134
+ *
135
+ * @public exported from `@promptbook/core`
136
+ */
135
137
  readonly outputParameters: readonly [{
136
138
  readonly name: "prompt";
137
139
  readonly description: "Prompt to be used for image generation";
@@ -139,6 +141,29 @@ export declare const FORMFACTOR_DEFINITIONS: readonly [{
139
141
  readonly isOutput: true;
140
142
  }];
141
143
  };
144
+ }, {
145
+ readonly name: "COMPLETION";
146
+ readonly description: "@@@";
147
+ readonly documentationUrl: "https://github.com/webgptorg/promptbook/discussions/@@";
148
+ readonly pipelineInterface: {
149
+ readonly inputParameters: readonly [{
150
+ readonly name: "inputText";
151
+ readonly description: "Input text to be completed";
152
+ readonly isInput: true;
153
+ readonly isOutput: false;
154
+ }, {
155
+ readonly name: "instructions";
156
+ readonly description: "Additional instructions for the model, for example the required length, empty by default";
157
+ readonly isInput: true;
158
+ readonly isOutput: false;
159
+ }];
160
+ readonly outputParameters: readonly [{
161
+ readonly name: "followingText";
162
+ readonly description: "Text that follows the input text";
163
+ readonly isInput: false;
164
+ readonly isOutput: true;
165
+ }];
166
+ };
142
167
  }];
143
168
  /**
144
169
  * Note: [πŸ’ž] Ignore a discrepancy between file name and entity name
@@ -23,7 +23,7 @@ export declare const HIGH_LEVEL_ABSTRACTIONS: readonly [{
23
23
  path: string | null;
24
24
  content: import("../pipeline/PipelineString").PipelineString;
25
25
  }[];
26
- readonly formfactorName?: "CHATBOT" | "GENERATOR" | "GENERIC" | "IMAGE_GENERATOR" | "EXPERIMENTAL_MATCHER" | "SHEETS" | "TRANSLATOR" | undefined;
26
+ readonly formfactorName?: "CHATBOT" | "COMPLETION" | "GENERATOR" | "GENERIC" | "IMAGE_GENERATOR" | "EXPERIMENTAL_MATCHER" | "SHEETS" | "TRANSLATOR" | undefined;
27
27
  }>): void;
28
28
  }, {
29
29
  type: "SYNC";
@@ -45,7 +45,7 @@ export declare const HIGH_LEVEL_ABSTRACTIONS: readonly [{
45
45
  path: string | null;
46
46
  content: import("../pipeline/PipelineString").PipelineString;
47
47
  }[];
48
- readonly formfactorName?: "CHATBOT" | "GENERATOR" | "GENERIC" | "IMAGE_GENERATOR" | "EXPERIMENTAL_MATCHER" | "SHEETS" | "TRANSLATOR" | undefined;
48
+ readonly formfactorName?: "CHATBOT" | "COMPLETION" | "GENERATOR" | "GENERIC" | "IMAGE_GENERATOR" | "EXPERIMENTAL_MATCHER" | "SHEETS" | "TRANSLATOR" | undefined;
49
49
  }>): void;
50
50
  }];
51
51
  /**
@@ -2,6 +2,8 @@ import type { PipelineJson } from '../pipeline/PipelineJson/PipelineJson';
2
2
  /**
3
3
  * Migrates the pipeline to the latest version
4
4
  *
5
+ * Note: Migration does not do heavy lifting like calling the LLMs, just lightweight changes of the structure
6
+ *
5
7
  * @public exported from `@promptbook/core`
6
8
  */
7
9
  export declare function migratePipeline(deprecatedPipeline: PipelineJson): PipelineJson;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@promptbook/pdf",
3
- "version": "0.92.0-20",
3
+ "version": "0.92.0-22",
4
4
  "description": "It's time for a paradigm shift. The future of software in plain English, French or Latin",
5
5
  "private": false,
6
6
  "sideEffects": false,
@@ -51,7 +51,7 @@
51
51
  "module": "./esm/index.es.js",
52
52
  "typings": "./esm/typings/src/_packages/pdf.index.d.ts",
53
53
  "peerDependencies": {
54
- "@promptbook/core": "0.92.0-20"
54
+ "@promptbook/core": "0.92.0-22"
55
55
  },
56
56
  "dependencies": {
57
57
  "crypto": "1.0.1",
package/umd/index.umd.js CHANGED
@@ -25,7 +25,7 @@
25
25
  * @generated
26
26
  * @see https://github.com/webgptorg/promptbook
27
27
  */
28
- const PROMPTBOOK_ENGINE_VERSION = '0.92.0-20';
28
+ const PROMPTBOOK_ENGINE_VERSION = '0.92.0-22';
29
29
  /**
30
30
  * TODO: string_promptbook_version should be constrained to the all versions of Promptbook engine
31
31
  * Note: [πŸ’ž] Ignore a discrepancy between file name and entity name
@@ -2383,15 +2383,12 @@
2383
2383
  }
2384
2384
  throw new Error(spaceTrim__default["default"]((block) => `
2385
2385
  ${block(error.message)}
2386
-
2386
+
2387
2387
  The JSON text:
2388
2388
  ${block(value)}
2389
2389
  `));
2390
2390
  }
2391
2391
  }
2392
- /**
2393
- * TODO: !!!! Use in Promptbook.studio
2394
- */
2395
2392
 
2396
2393
  /**
2397
2394
  * Recursively converts JSON strings to JSON objects
@@ -4153,7 +4150,8 @@
4153
4150
  subvalueParsers: [
4154
4151
  {
4155
4152
  subvalueName: 'ROW',
4156
- async mapValues(value, outputParameterName, settings, mapCallback) {
4153
+ async mapValues(options) {
4154
+ const { value, outputParameterName, settings, mapCallback, onProgress } = options;
4157
4155
  const csv = csvParse(value, settings);
4158
4156
  if (csv.errors.length !== 0) {
4159
4157
  throw new CsvFormatError(spaceTrim__default["default"]((block) => `
@@ -4169,21 +4167,29 @@
4169
4167
  ${block(value)}
4170
4168
  `));
4171
4169
  }
4172
- const mappedData = await Promise.all(csv.data.map(async (row, index) => {
4170
+ const mappedData = [];
4171
+ for (let index = 0; index < csv.data.length; index++) {
4172
+ const row = csv.data[index];
4173
4173
  if (row[outputParameterName]) {
4174
4174
  throw new CsvFormatError(`Can not overwrite existing column "${outputParameterName}" in CSV row`);
4175
4175
  }
4176
- return {
4176
+ const mappedRow = {
4177
4177
  ...row,
4178
4178
  [outputParameterName]: await mapCallback(row, index),
4179
4179
  };
4180
- }));
4180
+ mappedData.push(mappedRow);
4181
+ if (onProgress) {
4182
+ // Note: Report the CSV with all rows mapped so far
4183
+ await onProgress(papaparse.unparse(mappedData, { ...settings, ...MANDATORY_CSV_SETTINGS }));
4184
+ }
4185
+ }
4181
4186
  return papaparse.unparse(mappedData, { ...settings, ...MANDATORY_CSV_SETTINGS });
4182
4187
  },
4183
4188
  },
4184
4189
  {
4185
4190
  subvalueName: 'CELL',
4186
- async mapValues(value, outputParameterName, settings, mapCallback) {
4191
+ async mapValues(options) {
4192
+ const { value, settings, mapCallback, onProgress } = options;
4187
4193
  const csv = csvParse(value, settings);
4188
4194
  if (csv.errors.length !== 0) {
4189
4195
  throw new CsvFormatError(spaceTrim__default["default"]((block) => `
@@ -4270,7 +4276,8 @@
4270
4276
  subvalueParsers: [
4271
4277
  {
4272
4278
  subvalueName: 'LINE',
4273
- async mapValues(value, outputParameterName, settings, mapCallback) {
4279
+ async mapValues(options) {
4280
+ const { value, mapCallback, onProgress } = options;
4274
4281
  const lines = value.split('\n');
4275
4282
  const mappedLines = await Promise.all(lines.map((lineContent, lineNumber) =>
4276
4283
  // TODO: [🧠] Maybe option to skip empty line
@@ -5091,7 +5098,7 @@
5091
5098
  * @private internal utility of `createPipelineExecutor`
5092
5099
  */
5093
5100
  async function executeFormatSubvalues(options) {
5094
- const { task, jokerParameterNames, parameters, priority, csvSettings, pipelineIdentification } = options;
5101
+ const { task, jokerParameterNames, parameters, priority, csvSettings, onProgress, pipelineIdentification } = options;
5095
5102
  if (task.foreach === undefined) {
5096
5103
  return /* not await */ executeAttempts(options);
5097
5104
  }
@@ -5145,21 +5152,32 @@
5145
5152
  formatSettings = csvSettings;
5146
5153
  // <- TODO: [πŸ€Ήβ€β™‚οΈ] More universal, make simmilar pattern for other formats for example \n vs \r\n in text
5147
5154
  }
5148
- const resultString = await subvalueParser.mapValues(parameterValue, task.foreach.outputSubparameterName, formatSettings, async (subparameters, index) => {
5149
- let mappedParameters;
5150
- // TODO: [πŸ€Ήβ€β™‚οΈ][πŸͺ‚] Limit to N concurrent executions
5151
- // TODO: When done [🐚] Report progress also for each subvalue here
5152
- try {
5153
- mappedParameters = mapAvailableToExpectedParameters({
5154
- expectedParameters: Object.fromEntries(task.foreach.inputSubparameterNames.map((subparameterName) => [subparameterName, null])),
5155
- availableParameters: subparameters,
5156
- });
5157
- }
5158
- catch (error) {
5159
- if (!(error instanceof PipelineExecutionError)) {
5160
- throw error;
5155
+ const resultString = await subvalueParser.mapValues({
5156
+ value: parameterValue,
5157
+ outputParameterName: task.foreach.outputSubparameterName,
5158
+ settings: formatSettings,
5159
+ onProgress(partialResultString) {
5160
+ return onProgress(Object.freeze({
5161
+ [task.resultingParameterName]:
5162
+ // <- Note: [πŸ‘©β€πŸ‘©β€πŸ‘§] No need to detect parameter collision here because pipeline checks logic consistency during construction
5163
+ partialResultString,
5164
+ }));
5165
+ },
5166
+ async mapCallback(subparameters, index) {
5167
+ let mappedParameters;
5168
+ // TODO: [πŸ€Ήβ€β™‚οΈ][πŸͺ‚] Limit to N concurrent executions
5169
+ // TODO: When done [🐚] Report progress also for each subvalue here
5170
+ try {
5171
+ mappedParameters = mapAvailableToExpectedParameters({
5172
+ expectedParameters: Object.fromEntries(task.foreach.inputSubparameterNames.map((subparameterName) => [subparameterName, null])),
5173
+ availableParameters: subparameters,
5174
+ });
5161
5175
  }
5162
- throw new PipelineExecutionError(spaceTrim__default["default"]((block) => `
5176
+ catch (error) {
5177
+ if (!(error instanceof PipelineExecutionError)) {
5178
+ throw error;
5179
+ }
5180
+ throw new PipelineExecutionError(spaceTrim__default["default"]((block) => `
5163
5181
  ${error.message}
5164
5182
 
5165
5183
  This is error in FOREACH command
@@ -5168,23 +5186,24 @@
5168
5186
  ${block(pipelineIdentification)}
5169
5187
  Subparameter index: ${index}
5170
5188
  `));
5171
- }
5172
- const allSubparameters = {
5173
- ...parameters,
5174
- ...mappedParameters,
5175
- };
5176
- // Note: [πŸ‘¨β€πŸ‘¨β€πŸ‘§] Now we can freeze `subparameters` because we are sure that all and only used parameters are defined and are not going to be changed
5177
- Object.freeze(allSubparameters);
5178
- const subresultString = await executeAttempts({
5179
- ...options,
5180
- priority: priority + index,
5181
- parameters: allSubparameters,
5182
- pipelineIdentification: spaceTrim__default["default"]((block) => `
5189
+ }
5190
+ const allSubparameters = {
5191
+ ...parameters,
5192
+ ...mappedParameters,
5193
+ };
5194
+ // Note: [πŸ‘¨β€πŸ‘¨β€πŸ‘§] Now we can freeze `subparameters` because we are sure that all and only used parameters are defined and are not going to be changed
5195
+ Object.freeze(allSubparameters);
5196
+ const subresultString = await executeAttempts({
5197
+ ...options,
5198
+ priority: priority + index,
5199
+ parameters: allSubparameters,
5200
+ pipelineIdentification: spaceTrim__default["default"]((block) => `
5183
5201
  ${block(pipelineIdentification)}
5184
5202
  Subparameter index: ${index}
5185
5203
  `),
5186
- });
5187
- return subresultString;
5204
+ });
5205
+ return subresultString;
5206
+ },
5188
5207
  });
5189
5208
  return resultString;
5190
5209
  }
@@ -5358,11 +5377,6 @@
5358
5377
  async function executeTask(options) {
5359
5378
  const { currentTask, preparedPipeline, parametersToPass, tools, onProgress, $executionReport, pipelineIdentification, maxExecutionAttempts, maxParallelCount, csvSettings, isVerbose, rootDirname, cacheDirname, intermediateFilesStrategy, isAutoInstalled, isNotPreparedWarningSupressed, } = options;
5360
5379
  const priority = preparedPipeline.tasks.length - preparedPipeline.tasks.indexOf(currentTask);
5361
- await onProgress({
5362
- outputParameters: {
5363
- [currentTask.resultingParameterName]: '', // <- TODO: [🧠] What is the best value here?
5364
- },
5365
- });
5366
5380
  // Note: Check consistency of used and dependent parameters which was also done in `validatePipeline`, but it’s good to doublecheck
5367
5381
  const usedParameterNames = extractParameterNamesFromTask(currentTask);
5368
5382
  const dependentParameterNames = new Set(currentTask.dependentParameterNames);
@@ -5437,6 +5451,7 @@
5437
5451
  preparedPipeline,
5438
5452
  tools,
5439
5453
  $executionReport,
5454
+ onProgress,
5440
5455
  pipelineIdentification,
5441
5456
  maxExecutionAttempts,
5442
5457
  maxParallelCount,