@promptbook/remote-server 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/remote-server",
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/remote-server.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
  "colors": "1.4.0",
package/umd/index.umd.js CHANGED
@@ -48,7 +48,7 @@
48
48
  * @generated
49
49
  * @see https://github.com/webgptorg/promptbook
50
50
  */
51
- const PROMPTBOOK_ENGINE_VERSION = '0.92.0-20';
51
+ const PROMPTBOOK_ENGINE_VERSION = '0.92.0-22';
52
52
  /**
53
53
  * TODO: string_promptbook_version should be constrained to the all versions of Promptbook engine
54
54
  * Note: [πŸ’ž] Ignore a discrepancy between file name and entity name
@@ -1883,15 +1883,12 @@
1883
1883
  }
1884
1884
  throw new Error(spaceTrim__default["default"]((block) => `
1885
1885
  ${block(error.message)}
1886
-
1886
+
1887
1887
  The JSON text:
1888
1888
  ${block(value)}
1889
1889
  `));
1890
1890
  }
1891
1891
  }
1892
- /**
1893
- * TODO: !!!! Use in Promptbook.studio
1894
- */
1895
1892
 
1896
1893
  /**
1897
1894
  * Recursively converts JSON strings to JSON objects
@@ -4487,7 +4484,8 @@
4487
4484
  subvalueParsers: [
4488
4485
  {
4489
4486
  subvalueName: 'ROW',
4490
- async mapValues(value, outputParameterName, settings, mapCallback) {
4487
+ async mapValues(options) {
4488
+ const { value, outputParameterName, settings, mapCallback, onProgress } = options;
4491
4489
  const csv = csvParse(value, settings);
4492
4490
  if (csv.errors.length !== 0) {
4493
4491
  throw new CsvFormatError(spaceTrim__default["default"]((block) => `
@@ -4503,21 +4501,29 @@
4503
4501
  ${block(value)}
4504
4502
  `));
4505
4503
  }
4506
- const mappedData = await Promise.all(csv.data.map(async (row, index) => {
4504
+ const mappedData = [];
4505
+ for (let index = 0; index < csv.data.length; index++) {
4506
+ const row = csv.data[index];
4507
4507
  if (row[outputParameterName]) {
4508
4508
  throw new CsvFormatError(`Can not overwrite existing column "${outputParameterName}" in CSV row`);
4509
4509
  }
4510
- return {
4510
+ const mappedRow = {
4511
4511
  ...row,
4512
4512
  [outputParameterName]: await mapCallback(row, index),
4513
4513
  };
4514
- }));
4514
+ mappedData.push(mappedRow);
4515
+ if (onProgress) {
4516
+ // Note: Report the CSV with all rows mapped so far
4517
+ await onProgress(papaparse.unparse(mappedData, { ...settings, ...MANDATORY_CSV_SETTINGS }));
4518
+ }
4519
+ }
4515
4520
  return papaparse.unparse(mappedData, { ...settings, ...MANDATORY_CSV_SETTINGS });
4516
4521
  },
4517
4522
  },
4518
4523
  {
4519
4524
  subvalueName: 'CELL',
4520
- async mapValues(value, outputParameterName, settings, mapCallback) {
4525
+ async mapValues(options) {
4526
+ const { value, settings, mapCallback, onProgress } = options;
4521
4527
  const csv = csvParse(value, settings);
4522
4528
  if (csv.errors.length !== 0) {
4523
4529
  throw new CsvFormatError(spaceTrim__default["default"]((block) => `
@@ -4604,7 +4610,8 @@
4604
4610
  subvalueParsers: [
4605
4611
  {
4606
4612
  subvalueName: 'LINE',
4607
- async mapValues(value, outputParameterName, settings, mapCallback) {
4613
+ async mapValues(options) {
4614
+ const { value, mapCallback, onProgress } = options;
4608
4615
  const lines = value.split('\n');
4609
4616
  const mappedLines = await Promise.all(lines.map((lineContent, lineNumber) =>
4610
4617
  // TODO: [🧠] Maybe option to skip empty line
@@ -5442,7 +5449,7 @@
5442
5449
  * @private internal utility of `createPipelineExecutor`
5443
5450
  */
5444
5451
  async function executeFormatSubvalues(options) {
5445
- const { task, jokerParameterNames, parameters, priority, csvSettings, pipelineIdentification } = options;
5452
+ const { task, jokerParameterNames, parameters, priority, csvSettings, onProgress, pipelineIdentification } = options;
5446
5453
  if (task.foreach === undefined) {
5447
5454
  return /* not await */ executeAttempts(options);
5448
5455
  }
@@ -5496,21 +5503,32 @@
5496
5503
  formatSettings = csvSettings;
5497
5504
  // <- TODO: [πŸ€Ήβ€β™‚οΈ] More universal, make simmilar pattern for other formats for example \n vs \r\n in text
5498
5505
  }
5499
- const resultString = await subvalueParser.mapValues(parameterValue, task.foreach.outputSubparameterName, formatSettings, async (subparameters, index) => {
5500
- let mappedParameters;
5501
- // TODO: [πŸ€Ήβ€β™‚οΈ][πŸͺ‚] Limit to N concurrent executions
5502
- // TODO: When done [🐚] Report progress also for each subvalue here
5503
- try {
5504
- mappedParameters = mapAvailableToExpectedParameters({
5505
- expectedParameters: Object.fromEntries(task.foreach.inputSubparameterNames.map((subparameterName) => [subparameterName, null])),
5506
- availableParameters: subparameters,
5507
- });
5508
- }
5509
- catch (error) {
5510
- if (!(error instanceof PipelineExecutionError)) {
5511
- throw error;
5506
+ const resultString = await subvalueParser.mapValues({
5507
+ value: parameterValue,
5508
+ outputParameterName: task.foreach.outputSubparameterName,
5509
+ settings: formatSettings,
5510
+ onProgress(partialResultString) {
5511
+ return onProgress(Object.freeze({
5512
+ [task.resultingParameterName]:
5513
+ // <- Note: [πŸ‘©β€πŸ‘©β€πŸ‘§] No need to detect parameter collision here because pipeline checks logic consistency during construction
5514
+ partialResultString,
5515
+ }));
5516
+ },
5517
+ async mapCallback(subparameters, index) {
5518
+ let mappedParameters;
5519
+ // TODO: [πŸ€Ήβ€β™‚οΈ][πŸͺ‚] Limit to N concurrent executions
5520
+ // TODO: When done [🐚] Report progress also for each subvalue here
5521
+ try {
5522
+ mappedParameters = mapAvailableToExpectedParameters({
5523
+ expectedParameters: Object.fromEntries(task.foreach.inputSubparameterNames.map((subparameterName) => [subparameterName, null])),
5524
+ availableParameters: subparameters,
5525
+ });
5512
5526
  }
5513
- throw new PipelineExecutionError(spaceTrim__default["default"]((block) => `
5527
+ catch (error) {
5528
+ if (!(error instanceof PipelineExecutionError)) {
5529
+ throw error;
5530
+ }
5531
+ throw new PipelineExecutionError(spaceTrim__default["default"]((block) => `
5514
5532
  ${error.message}
5515
5533
 
5516
5534
  This is error in FOREACH command
@@ -5519,23 +5537,24 @@
5519
5537
  ${block(pipelineIdentification)}
5520
5538
  Subparameter index: ${index}
5521
5539
  `));
5522
- }
5523
- const allSubparameters = {
5524
- ...parameters,
5525
- ...mappedParameters,
5526
- };
5527
- // 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
5528
- Object.freeze(allSubparameters);
5529
- const subresultString = await executeAttempts({
5530
- ...options,
5531
- priority: priority + index,
5532
- parameters: allSubparameters,
5533
- pipelineIdentification: spaceTrim__default["default"]((block) => `
5540
+ }
5541
+ const allSubparameters = {
5542
+ ...parameters,
5543
+ ...mappedParameters,
5544
+ };
5545
+ // 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
5546
+ Object.freeze(allSubparameters);
5547
+ const subresultString = await executeAttempts({
5548
+ ...options,
5549
+ priority: priority + index,
5550
+ parameters: allSubparameters,
5551
+ pipelineIdentification: spaceTrim__default["default"]((block) => `
5534
5552
  ${block(pipelineIdentification)}
5535
5553
  Subparameter index: ${index}
5536
5554
  `),
5537
- });
5538
- return subresultString;
5555
+ });
5556
+ return subresultString;
5557
+ },
5539
5558
  });
5540
5559
  return resultString;
5541
5560
  }
@@ -5709,11 +5728,6 @@
5709
5728
  async function executeTask(options) {
5710
5729
  const { currentTask, preparedPipeline, parametersToPass, tools, onProgress, $executionReport, pipelineIdentification, maxExecutionAttempts, maxParallelCount, csvSettings, isVerbose, rootDirname, cacheDirname, intermediateFilesStrategy, isAutoInstalled, isNotPreparedWarningSupressed, } = options;
5711
5730
  const priority = preparedPipeline.tasks.length - preparedPipeline.tasks.indexOf(currentTask);
5712
- await onProgress({
5713
- outputParameters: {
5714
- [currentTask.resultingParameterName]: '', // <- TODO: [🧠] What is the best value here?
5715
- },
5716
- });
5717
5731
  // Note: Check consistency of used and dependent parameters which was also done in `validatePipeline`, but it’s good to doublecheck
5718
5732
  const usedParameterNames = extractParameterNamesFromTask(currentTask);
5719
5733
  const dependentParameterNames = new Set(currentTask.dependentParameterNames);
@@ -5788,6 +5802,7 @@
5788
5802
  preparedPipeline,
5789
5803
  tools,
5790
5804
  $executionReport,
5805
+ onProgress,
5791
5806
  pipelineIdentification,
5792
5807
  maxExecutionAttempts,
5793
5808
  maxParallelCount,