@promptbook/markdown-utils 0.92.0-5 → 0.92.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.
@@ -16,6 +16,13 @@ export declare const openapiJson: {
16
16
  responses: {
17
17
  '200': {
18
18
  description: string;
19
+ content: {
20
+ 'text/markdown': {
21
+ schema: {
22
+ type: string;
23
+ };
24
+ };
25
+ };
19
26
  };
20
27
  };
21
28
  };
@@ -46,13 +53,22 @@ export declare const openapiJson: {
46
53
  };
47
54
  };
48
55
  responses: {
49
- '200': {
56
+ '201': {
50
57
  description: string;
51
58
  content: {
52
59
  'application/json': {
53
60
  schema: {
54
61
  type: string;
55
62
  properties: {
63
+ isSuccess: {
64
+ type: string;
65
+ };
66
+ message: {
67
+ type: string;
68
+ };
69
+ error: {
70
+ type: string;
71
+ };
56
72
  identification: {
57
73
  type: string;
58
74
  };
@@ -61,6 +77,43 @@ export declare const openapiJson: {
61
77
  };
62
78
  };
63
79
  };
80
+ '400': {
81
+ description: string;
82
+ content: {
83
+ 'application/json': {
84
+ schema: {
85
+ type: string;
86
+ properties: {
87
+ error: {
88
+ type: string;
89
+ };
90
+ };
91
+ };
92
+ };
93
+ };
94
+ };
95
+ '401': {
96
+ description: string;
97
+ content: {
98
+ 'application/json': {
99
+ schema: {
100
+ type: string;
101
+ properties: {
102
+ isSuccess: {
103
+ type: string;
104
+ enum: boolean[];
105
+ };
106
+ message: {
107
+ type: string;
108
+ };
109
+ error: {
110
+ type: string;
111
+ };
112
+ };
113
+ };
114
+ };
115
+ };
116
+ };
64
117
  };
65
118
  };
66
119
  };
@@ -82,6 +135,16 @@ export declare const openapiJson: {
82
135
  };
83
136
  };
84
137
  };
138
+ '500': {
139
+ description: string;
140
+ content: {
141
+ 'text/plain': {
142
+ schema: {
143
+ type: string;
144
+ };
145
+ };
146
+ };
147
+ };
85
148
  };
86
149
  };
87
150
  };
@@ -111,6 +174,28 @@ export declare const openapiJson: {
111
174
  };
112
175
  '404': {
113
176
  description: string;
177
+ content: {
178
+ 'application/json': {
179
+ schema: {
180
+ type: string;
181
+ properties: {
182
+ error: {
183
+ type: string;
184
+ };
185
+ };
186
+ };
187
+ };
188
+ };
189
+ };
190
+ '500': {
191
+ description: string;
192
+ content: {
193
+ 'text/plain': {
194
+ schema: {
195
+ type: string;
196
+ };
197
+ };
198
+ };
114
199
  };
115
200
  };
116
201
  };
@@ -128,11 +213,172 @@ export declare const openapiJson: {
128
213
  type: string;
129
214
  items: {
130
215
  type: string;
216
+ properties: {
217
+ nonce: {
218
+ type: string;
219
+ };
220
+ taskId: {
221
+ type: string;
222
+ };
223
+ taskType: {
224
+ type: string;
225
+ };
226
+ status: {
227
+ type: string;
228
+ };
229
+ createdAt: {
230
+ type: string;
231
+ format: string;
232
+ };
233
+ updatedAt: {
234
+ type: string;
235
+ format: string;
236
+ };
237
+ };
238
+ };
239
+ };
240
+ };
241
+ };
242
+ };
243
+ };
244
+ };
245
+ };
246
+ '/executions/last': {
247
+ get: {
248
+ summary: string;
249
+ description: string;
250
+ responses: {
251
+ '200': {
252
+ description: string;
253
+ content: {
254
+ 'application/json': {
255
+ schema: {
256
+ type: string;
257
+ properties: {
258
+ nonce: {
259
+ type: string;
260
+ };
261
+ taskId: {
262
+ type: string;
263
+ };
264
+ taskType: {
265
+ type: string;
266
+ };
267
+ status: {
268
+ type: string;
269
+ };
270
+ errors: {
271
+ type: string;
272
+ items: {
273
+ type: string;
274
+ };
275
+ };
276
+ warnings: {
277
+ type: string;
278
+ items: {
279
+ type: string;
280
+ };
281
+ };
282
+ createdAt: {
283
+ type: string;
284
+ format: string;
285
+ };
286
+ updatedAt: {
287
+ type: string;
288
+ format: string;
289
+ };
290
+ currentValue: {
291
+ type: string;
292
+ };
293
+ };
294
+ };
295
+ };
296
+ };
297
+ };
298
+ '404': {
299
+ description: string;
300
+ content: {
301
+ 'text/plain': {
302
+ schema: {
303
+ type: string;
304
+ };
305
+ };
306
+ };
307
+ };
308
+ };
309
+ };
310
+ };
311
+ '/executions/{taskId}': {
312
+ get: {
313
+ summary: string;
314
+ description: string;
315
+ parameters: {
316
+ in: string;
317
+ name: string;
318
+ required: boolean;
319
+ schema: {
320
+ type: string;
321
+ };
322
+ description: string;
323
+ }[];
324
+ responses: {
325
+ '200': {
326
+ description: string;
327
+ content: {
328
+ 'application/json': {
329
+ schema: {
330
+ type: string;
331
+ properties: {
332
+ nonce: {
333
+ type: string;
334
+ };
335
+ taskId: {
336
+ type: string;
337
+ };
338
+ taskType: {
339
+ type: string;
340
+ };
341
+ status: {
342
+ type: string;
343
+ };
344
+ errors: {
345
+ type: string;
346
+ items: {
347
+ type: string;
348
+ };
349
+ };
350
+ warnings: {
351
+ type: string;
352
+ items: {
353
+ type: string;
354
+ };
355
+ };
356
+ createdAt: {
357
+ type: string;
358
+ format: string;
359
+ };
360
+ updatedAt: {
361
+ type: string;
362
+ format: string;
363
+ };
364
+ currentValue: {
365
+ type: string;
366
+ };
131
367
  };
132
368
  };
133
369
  };
134
370
  };
135
371
  };
372
+ '404': {
373
+ description: string;
374
+ content: {
375
+ 'text/plain': {
376
+ schema: {
377
+ type: string;
378
+ };
379
+ };
380
+ };
381
+ };
136
382
  };
137
383
  };
138
384
  };
@@ -149,12 +395,19 @@ export declare const openapiJson: {
149
395
  properties: {
150
396
  pipelineUrl: {
151
397
  type: string;
398
+ description: string;
399
+ };
400
+ book: {
401
+ type: string;
402
+ description: string;
152
403
  };
153
404
  inputParameters: {
154
405
  type: string;
406
+ description: string;
155
407
  };
156
408
  identification: {
157
409
  type: string;
410
+ description: string;
158
411
  };
159
412
  };
160
413
  };
@@ -174,13 +427,154 @@ export declare const openapiJson: {
174
427
  };
175
428
  '400': {
176
429
  description: string;
430
+ content: {
431
+ 'application/json': {
432
+ schema: {
433
+ type: string;
434
+ properties: {
435
+ error: {
436
+ type: string;
437
+ };
438
+ };
439
+ };
440
+ };
441
+ };
442
+ };
443
+ '404': {
444
+ description: string;
445
+ content: {
446
+ 'text/plain': {
447
+ schema: {
448
+ type: string;
449
+ };
450
+ };
451
+ };
452
+ };
453
+ };
454
+ };
455
+ };
456
+ '/api-docs': {
457
+ get: {
458
+ summary: string;
459
+ description: string;
460
+ responses: {
461
+ '200': {
462
+ description: string;
463
+ };
464
+ };
465
+ };
466
+ };
467
+ '/swagger': {
468
+ get: {
469
+ summary: string;
470
+ description: string;
471
+ responses: {
472
+ '200': {
473
+ description: string;
474
+ };
475
+ };
476
+ };
477
+ };
478
+ '/openapi': {
479
+ get: {
480
+ summary: string;
481
+ description: string;
482
+ responses: {
483
+ '200': {
484
+ description: string;
485
+ content: {
486
+ 'application/json': {
487
+ schema: {
488
+ type: string;
489
+ };
490
+ };
491
+ };
177
492
  };
178
493
  };
179
494
  };
180
495
  };
181
496
  };
182
- components: {};
183
- tags: never[];
497
+ components: {
498
+ schemas: {
499
+ Error: {
500
+ type: string;
501
+ properties: {
502
+ error: {
503
+ type: string;
504
+ };
505
+ };
506
+ };
507
+ ExecutionTaskSummary: {
508
+ type: string;
509
+ properties: {
510
+ nonce: {
511
+ type: string;
512
+ };
513
+ taskId: {
514
+ type: string;
515
+ };
516
+ taskType: {
517
+ type: string;
518
+ };
519
+ status: {
520
+ type: string;
521
+ };
522
+ createdAt: {
523
+ type: string;
524
+ format: string;
525
+ };
526
+ updatedAt: {
527
+ type: string;
528
+ format: string;
529
+ };
530
+ };
531
+ };
532
+ ExecutionTaskFull: {
533
+ type: string;
534
+ properties: {
535
+ nonce: {
536
+ type: string;
537
+ };
538
+ taskId: {
539
+ type: string;
540
+ };
541
+ taskType: {
542
+ type: string;
543
+ };
544
+ status: {
545
+ type: string;
546
+ };
547
+ errors: {
548
+ type: string;
549
+ items: {
550
+ type: string;
551
+ };
552
+ };
553
+ warnings: {
554
+ type: string;
555
+ items: {
556
+ type: string;
557
+ };
558
+ };
559
+ createdAt: {
560
+ type: string;
561
+ format: string;
562
+ };
563
+ updatedAt: {
564
+ type: string;
565
+ format: string;
566
+ };
567
+ currentValue: {
568
+ type: string;
569
+ };
570
+ };
571
+ };
572
+ };
573
+ };
574
+ tags: {
575
+ name: string;
576
+ description: string;
577
+ }[];
184
578
  };
185
579
  /**
186
580
  * Note: [💞] Ignore a discrepancy between file name and entity name
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@promptbook/markdown-utils",
3
- "version": "0.92.0-5",
3
+ "version": "0.92.0-7",
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,
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-5';
28
+ const PROMPTBOOK_ENGINE_VERSION = '0.92.0-7';
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
@@ -1797,6 +1797,45 @@
1797
1797
  * - [♨] Are tasks prepared
1798
1798
  */
1799
1799
 
1800
+ /**
1801
+ * Converts a JavaScript Object Notation (JSON) string into an object.
1802
+ *
1803
+ * Note: This is wrapper around `JSON.parse()` with better error and type handling
1804
+ *
1805
+ * @public exported from `@promptbook/utils`
1806
+ */
1807
+ function jsonParse(value) {
1808
+ if (value === undefined) {
1809
+ throw new Error(`Can not parse JSON from undefined value.`);
1810
+ }
1811
+ else if (typeof value !== 'string') {
1812
+ console.error('Can not parse JSON from non-string value.', { text: value });
1813
+ throw new Error(spaceTrim__default["default"](`
1814
+ Can not parse JSON from non-string value.
1815
+
1816
+ The value type: ${typeof value}
1817
+ See more in console.
1818
+ `));
1819
+ }
1820
+ try {
1821
+ return JSON.parse(value);
1822
+ }
1823
+ catch (error) {
1824
+ if (!(error instanceof Error)) {
1825
+ throw error;
1826
+ }
1827
+ throw new Error(spaceTrim__default["default"]((block) => `
1828
+ ${block(error.message)}
1829
+
1830
+ The JSON text:
1831
+ ${block(value)}
1832
+ `));
1833
+ }
1834
+ }
1835
+ /**
1836
+ * TODO: !!!! Use in Promptbook.studio
1837
+ */
1838
+
1800
1839
  /**
1801
1840
  * Recursively converts JSON strings to JSON objects
1802
1841
 
@@ -1815,7 +1854,7 @@
1815
1854
  const newObject = { ...object };
1816
1855
  for (const [key, value] of Object.entries(object)) {
1817
1856
  if (typeof value === 'string' && isValidJsonString(value)) {
1818
- newObject[key] = JSON.parse(value);
1857
+ newObject[key] = jsonParse(value);
1819
1858
  }
1820
1859
  else {
1821
1860
  newObject[key] = jsonStringsToJsons(value);
@@ -2688,18 +2727,26 @@
2688
2727
  }).asPromise();
2689
2728
  const { outputParameters } = result;
2690
2729
  const { modelsRequirements: modelsRequirementsJson } = outputParameters;
2691
- const modelsRequirementsUnchecked = JSON.parse(modelsRequirementsJson);
2730
+ let modelsRequirementsUnchecked = jsonParse(modelsRequirementsJson);
2692
2731
  if (isVerbose) {
2693
2732
  console.info(`PERSONA ${personaDescription}`, modelsRequirementsUnchecked);
2694
2733
  }
2695
2734
  if (!Array.isArray(modelsRequirementsUnchecked)) {
2696
- throw new UnexpectedError(spaceTrim__default["default"]((block) => `
2697
- Invalid \`modelsRequirements\`:
2735
+ // <- TODO: Book should have syntax and system to enforce shape of JSON
2736
+ modelsRequirementsUnchecked = [modelsRequirementsUnchecked];
2737
+ /*
2738
+ throw new UnexpectedError(
2739
+ spaceTrim(
2740
+ (block) => `
2741
+ Invalid \`modelsRequirements\`:
2698
2742
 
2699
- \`\`\`json
2700
- ${block(JSON.stringify(modelsRequirementsUnchecked, null, 4))}
2701
- \`\`\`
2702
- `));
2743
+ \`\`\`json
2744
+ ${block(JSON.stringify(modelsRequirementsUnchecked, null, 4))}
2745
+ \`\`\`
2746
+ `,
2747
+ ),
2748
+ );
2749
+ */
2703
2750
  }
2704
2751
  const modelsRequirements = modelsRequirementsUnchecked.map((modelRequirements) => ({
2705
2752
  modelVariant: 'CHAT',
@@ -3530,7 +3577,7 @@
3530
3577
  > },
3531
3578
  */
3532
3579
  async asJson() {
3533
- return JSON.parse(await tools.fs.readFile(filename, 'utf-8'));
3580
+ return jsonParse(await tools.fs.readFile(filename, 'utf-8'));
3534
3581
  },
3535
3582
  async asText() {
3536
3583
  return await tools.fs.readFile(filename, 'utf-8');
@@ -5115,13 +5162,79 @@
5115
5162
  /**
5116
5163
  * @@@
5117
5164
  *
5165
+ * Here is the place where RAG (retrieval-augmented generation) happens
5166
+ *
5118
5167
  * @private internal utility of `createPipelineExecutor`
5119
5168
  */
5120
5169
  async function getKnowledgeForTask(options) {
5121
- const { preparedPipeline, task } = options;
5122
- return preparedPipeline.knowledgePieces.map(({ content }) => `- ${content}`).join('\n');
5170
+ const { tools, preparedPipeline, task } = options;
5171
+ const firstKnowlegePiece = preparedPipeline.knowledgePieces[0];
5172
+ const firstKnowlegeIndex = firstKnowlegePiece === null || firstKnowlegePiece === void 0 ? void 0 : firstKnowlegePiece.index[0];
5173
+ // <- TODO: Do not use just first knowledge piece and first index to determine embedding model, use also keyword search
5174
+ if (firstKnowlegePiece === undefined || firstKnowlegeIndex === undefined) {
5175
+ return 'No knowledge pieces found';
5176
+ }
5177
+ // TODO: [🚐] Make arrayable LLMs -> single LLM DRY
5178
+ const _llms = arrayableToArray(tools.llm);
5179
+ const llmTools = _llms.length === 1 ? _llms[0] : joinLlmExecutionTools(..._llms);
5180
+ const taskEmbeddingPrompt = {
5181
+ title: 'Knowledge Search',
5182
+ modelRequirements: {
5183
+ modelVariant: 'EMBEDDING',
5184
+ modelName: firstKnowlegeIndex.modelName,
5185
+ },
5186
+ content: task.content,
5187
+ parameters: {
5188
+ /* !!!!!!!! */
5189
+ },
5190
+ };
5191
+ const taskEmbeddingResult = await llmTools.callEmbeddingModel(taskEmbeddingPrompt);
5192
+ const knowledgePiecesWithRelevance = preparedPipeline.knowledgePieces.map((knowledgePiece) => {
5193
+ const { index } = knowledgePiece;
5194
+ const knowledgePieceIndex = index.find((i) => i.modelName === firstKnowlegeIndex.modelName);
5195
+ // <- TODO: Do not use just first knowledge piece and first index to determine embedding model
5196
+ if (knowledgePieceIndex === undefined) {
5197
+ return {
5198
+ content: knowledgePiece.content,
5199
+ relevance: 0,
5200
+ };
5201
+ }
5202
+ const relevance = computeCosineSimilarity(knowledgePieceIndex.position, taskEmbeddingResult.content);
5203
+ return {
5204
+ content: knowledgePiece.content,
5205
+ relevance,
5206
+ };
5207
+ });
5208
+ const knowledgePiecesSorted = knowledgePiecesWithRelevance.sort((a, b) => a.relevance - b.relevance);
5209
+ const knowledgePiecesLimited = knowledgePiecesSorted.slice(0, 5);
5210
+ console.log('!!! Embedding', {
5211
+ task,
5212
+ taskEmbeddingPrompt,
5213
+ taskEmbeddingResult,
5214
+ firstKnowlegePiece,
5215
+ firstKnowlegeIndex,
5216
+ knowledgePiecesWithRelevance,
5217
+ knowledgePiecesSorted,
5218
+ knowledgePiecesLimited,
5219
+ });
5220
+ return knowledgePiecesLimited.map(({ content }) => `- ${content}`).join('\n');
5123
5221
  // <- TODO: [🧠] Some smart aggregation of knowledge pieces, single-line vs multi-line vs mixed
5124
5222
  }
5223
+ // TODO: !!!!!! Annotate + to new file
5224
+ function computeCosineSimilarity(embeddingVector1, embeddingVector2) {
5225
+ if (embeddingVector1.length !== embeddingVector2.length) {
5226
+ throw new TypeError('Embedding vectors must have the same length');
5227
+ }
5228
+ const dotProduct = embeddingVector1.reduce((sum, value, index) => sum + value * embeddingVector2[index], 0);
5229
+ const magnitude1 = Math.sqrt(embeddingVector1.reduce((sum, value) => sum + value * value, 0));
5230
+ const magnitude2 = Math.sqrt(embeddingVector2.reduce((sum, value) => sum + value * value, 0));
5231
+ return 1 - dotProduct / (magnitude1 * magnitude2);
5232
+ }
5233
+ /**
5234
+ * TODO: !!!! Verify if this is working
5235
+ * TODO: [♨] Implement Better - use keyword search
5236
+ * TODO: [♨] Examples of values
5237
+ */
5125
5238
 
5126
5239
  /**
5127
5240
  * @@@
@@ -5129,9 +5242,9 @@
5129
5242
  * @private internal utility of `createPipelineExecutor`
5130
5243
  */
5131
5244
  async function getReservedParametersForTask(options) {
5132
- const { preparedPipeline, task, pipelineIdentification } = options;
5245
+ const { tools, preparedPipeline, task, pipelineIdentification } = options;
5133
5246
  const context = await getContextForTask(); // <- [🏍]
5134
- const knowledge = await getKnowledgeForTask({ preparedPipeline, task });
5247
+ const knowledge = await getKnowledgeForTask({ tools, preparedPipeline, task });
5135
5248
  const examples = await getExamplesForTask();
5136
5249
  const currentDate = new Date().toISOString(); // <- TODO: [🧠][💩] Better
5137
5250
  const modelName = RESERVED_PARAMETER_MISSING_VALUE;
@@ -5193,6 +5306,7 @@
5193
5306
  }
5194
5307
  const definedParameters = Object.freeze({
5195
5308
  ...(await getReservedParametersForTask({
5309
+ tools,
5196
5310
  preparedPipeline,
5197
5311
  task: currentTask,
5198
5312
  pipelineIdentification,