@promptbook/openai 0.103.0-46 → 0.103.0-48

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (70) hide show
  1. package/esm/index.es.js +196 -71
  2. package/esm/index.es.js.map +1 -1
  3. package/esm/typings/servers.d.ts +1 -7
  4. package/esm/typings/src/_packages/components.index.d.ts +4 -0
  5. package/esm/typings/src/_packages/core.index.d.ts +22 -14
  6. package/esm/typings/src/_packages/types.index.d.ts +14 -6
  7. package/esm/typings/src/book-2.0/agent-source/AgentBasicInformation.d.ts +7 -3
  8. package/esm/typings/src/book-2.0/agent-source/AgentModelRequirements.d.ts +6 -1
  9. package/esm/typings/src/book-2.0/agent-source/AgentSourceParseResult.d.ts +3 -2
  10. package/esm/typings/src/book-2.0/agent-source/computeAgentHash.d.ts +8 -0
  11. package/esm/typings/src/book-2.0/agent-source/computeAgentHash.test.d.ts +1 -0
  12. package/esm/typings/src/book-2.0/agent-source/createCommitmentRegex.d.ts +1 -1
  13. package/esm/typings/src/book-2.0/agent-source/createDefaultAgentName.d.ts +8 -0
  14. package/esm/typings/src/book-2.0/agent-source/normalizeAgentName.d.ts +9 -0
  15. package/esm/typings/src/book-2.0/agent-source/normalizeAgentName.test.d.ts +1 -0
  16. package/esm/typings/src/book-2.0/agent-source/parseAgentSourceWithCommitments.d.ts +1 -1
  17. package/esm/typings/src/book-components/Chat/AgentChat/AgentChat.d.ts +14 -0
  18. package/esm/typings/src/book-components/Chat/AgentChat/AgentChat.test.d.ts +1 -0
  19. package/esm/typings/src/book-components/Chat/AgentChat/AgentChatProps.d.ts +13 -0
  20. package/esm/typings/src/collection/agent-collection/constructors/agent-collection-in-supabase/AgentCollectionInSupabase.d.ts +1 -60
  21. package/esm/typings/src/collection/agent-collection/constructors/agent-collection-in-supabase/AgentsDatabaseSchema.d.ts +57 -32
  22. package/esm/typings/src/{book-2.0/commitments → commitments}/ACTION/ACTION.d.ts +1 -1
  23. package/esm/typings/src/{book-2.0/commitments → commitments}/DELETE/DELETE.d.ts +1 -1
  24. package/esm/typings/src/{book-2.0/commitments → commitments}/FORMAT/FORMAT.d.ts +1 -1
  25. package/esm/typings/src/{book-2.0/commitments → commitments}/GOAL/GOAL.d.ts +1 -1
  26. package/esm/typings/src/{book-2.0/commitments → commitments}/KNOWLEDGE/KNOWLEDGE.d.ts +1 -5
  27. package/esm/typings/src/{book-2.0/commitments → commitments}/MEMORY/MEMORY.d.ts +1 -1
  28. package/esm/typings/src/{book-2.0/commitments → commitments}/MESSAGE/MESSAGE.d.ts +1 -1
  29. package/esm/typings/src/{book-2.0/commitments → commitments}/META/META.d.ts +1 -1
  30. package/esm/typings/src/{book-2.0/commitments → commitments}/META_IMAGE/META_IMAGE.d.ts +1 -1
  31. package/esm/typings/src/{book-2.0/commitments → commitments}/META_LINK/META_LINK.d.ts +1 -1
  32. package/esm/typings/src/{book-2.0/commitments → commitments}/MODEL/MODEL.d.ts +1 -1
  33. package/esm/typings/src/{book-2.0/commitments → commitments}/NOTE/NOTE.d.ts +1 -1
  34. package/esm/typings/src/{book-2.0/commitments → commitments}/PERSONA/PERSONA.d.ts +1 -1
  35. package/esm/typings/src/{book-2.0/commitments → commitments}/RULE/RULE.d.ts +1 -1
  36. package/esm/typings/src/{book-2.0/commitments → commitments}/SAMPLE/SAMPLE.d.ts +1 -1
  37. package/esm/typings/src/{book-2.0/commitments → commitments}/SCENARIO/SCENARIO.d.ts +1 -1
  38. package/esm/typings/src/{book-2.0/commitments → commitments}/STYLE/STYLE.d.ts +1 -1
  39. package/esm/typings/src/{book-2.0/commitments → commitments}/_base/BaseCommitmentDefinition.d.ts +1 -1
  40. package/esm/typings/src/{book-2.0/commitments → commitments}/_base/CommitmentDefinition.d.ts +1 -1
  41. package/esm/typings/src/{book-2.0/commitments → commitments}/_base/NotYetImplementedCommitmentDefinition.d.ts +1 -1
  42. package/esm/typings/src/{book-2.0/commitments → commitments}/_base/createEmptyAgentModelRequirements.d.ts +1 -1
  43. package/esm/typings/src/execution/LlmExecutionTools.d.ts +1 -1
  44. package/esm/typings/src/llm-providers/_common/utils/assertUniqueModels.d.ts +12 -0
  45. package/esm/typings/src/llm-providers/agent/Agent.d.ts +10 -9
  46. package/esm/typings/src/llm-providers/agent/AgentLlmExecutionTools.d.ts +5 -1
  47. package/esm/typings/src/llm-providers/agent/CreateAgentLlmExecutionToolsOptions.d.ts +1 -1
  48. package/esm/typings/src/llm-providers/agent/RemoteAgent.d.ts +32 -0
  49. package/esm/typings/src/llm-providers/agent/RemoteAgentOptions.d.ts +11 -0
  50. package/esm/typings/src/llm-providers/openai/OpenAiAssistantExecutionTools.d.ts +29 -4
  51. package/esm/typings/src/llm-providers/openai/openai-models.test.d.ts +4 -0
  52. package/esm/typings/src/remote-server/startAgentServer.d.ts +1 -1
  53. package/esm/typings/src/remote-server/startRemoteServer.d.ts +1 -2
  54. package/esm/typings/src/storage/_common/PromptbookStorage.d.ts +1 -0
  55. package/esm/typings/src/transpilers/openai-sdk/register.d.ts +1 -1
  56. package/esm/typings/src/types/typeAliases.d.ts +12 -0
  57. package/esm/typings/src/utils/color/internal-utils/checkChannelValue.d.ts +0 -3
  58. package/esm/typings/src/utils/normalization/normalize-to-kebab-case.d.ts +2 -0
  59. package/esm/typings/src/utils/normalization/normalizeTo_PascalCase.d.ts +3 -0
  60. package/esm/typings/src/utils/normalization/normalizeTo_camelCase.d.ts +2 -0
  61. package/esm/typings/src/utils/normalization/titleToName.d.ts +2 -0
  62. package/esm/typings/src/utils/random/$generateBookBoilerplate.d.ts +2 -2
  63. package/esm/typings/src/utils/random/$randomFullnameWithColor.d.ts +1 -1
  64. package/esm/typings/src/version.d.ts +1 -1
  65. package/package.json +3 -4
  66. package/umd/index.umd.js +201 -75
  67. package/umd/index.umd.js.map +1 -1
  68. /package/esm/typings/src/{book-2.0/commitments → commitments}/_base/BookCommitment.d.ts +0 -0
  69. /package/esm/typings/src/{book-2.0/commitments → commitments}/_base/ParsedCommitment.d.ts +0 -0
  70. /package/esm/typings/src/{book-2.0/commitments → commitments}/index.d.ts +0 -0
package/esm/index.es.js CHANGED
@@ -1,5 +1,4 @@
1
1
  import colors from 'colors';
2
- import { forEver } from 'waitasecond';
3
2
  import spaceTrim$1, { spaceTrim } from 'spacetrim';
4
3
  import { randomBytes } from 'crypto';
5
4
  import Bottleneck from 'bottleneck';
@@ -20,7 +19,7 @@ const BOOK_LANGUAGE_VERSION = '2.0.0';
20
19
  * @generated
21
20
  * @see https://github.com/webgptorg/promptbook
22
21
  */
23
- const PROMPTBOOK_ENGINE_VERSION = '0.103.0-46';
22
+ const PROMPTBOOK_ENGINE_VERSION = '0.103.0-48';
24
23
  /**
25
24
  * TODO: string_promptbook_version should be constrained to the all versions of Promptbook engine
26
25
  * Note: [💞] Ignore a discrepancy between file name and entity name
@@ -474,9 +473,6 @@ function checkChannelValue(channelName, value) {
474
473
  throw new Error(`${channelName} channel is greater than 255, it is ${value}`);
475
474
  }
476
475
  }
477
- /**
478
- * TODO: [🧠][🚓] Is/which combination it better to use asserts/check, validate or is utility function?
479
- */
480
476
 
481
477
  /**
482
478
  * Color object represents an RGB color with alpha channel
@@ -2364,17 +2360,17 @@ const OPENAI_MODELS = exportJson({
2364
2360
  },
2365
2361
  /**/
2366
2362
  /*/
2367
- {
2368
- modelTitle: 'tts-1-hd-1106',
2369
- modelName: 'tts-1-hd-1106',
2370
- },
2371
- /**/
2363
+ {
2364
+ modelTitle: 'tts-1-hd-1106',
2365
+ modelName: 'tts-1-hd-1106',
2366
+ },
2367
+ /**/
2372
2368
  /*/
2373
- {
2374
- modelTitle: 'tts-1-hd',
2375
- modelName: 'tts-1-hd',
2376
- },
2377
- /**/
2369
+ {
2370
+ modelTitle: 'tts-1-hd',
2371
+ modelName: 'tts-1-hd',
2372
+ },
2373
+ /**/
2378
2374
  /**/
2379
2375
  {
2380
2376
  modelVariant: 'CHAT',
@@ -3560,7 +3556,7 @@ class OpenAiExecutionTools extends OpenAiCompatibleExecutionTools {
3560
3556
  *
3561
3557
  * This is useful for calling OpenAI API with a single assistant, for more wide usage use `OpenAiExecutionTools`.
3562
3558
  *
3563
- * Note: [🦖] There are several different things in Promptbook:
3559
+ * !!! Note: [🦖] There are several different things in Promptbook:
3564
3560
  * - `Agent` - which represents an AI Agent with its source, memories, actions, etc. Agent is a higher-level abstraction which is internally using:
3565
3561
  * - `LlmExecutionTools` - which wraps one or more LLM models and provides an interface to execute them
3566
3562
  * - `AgentLlmExecutionTools` - which is a specific implementation of `LlmExecutionTools` that wraps another LlmExecutionTools and applies agent-specific system prompts and requirements
@@ -3666,17 +3662,21 @@ class OpenAiAssistantExecutionTools extends OpenAiExecutionTools {
3666
3662
  console.info('connect', stream.currentEvent);
3667
3663
  }
3668
3664
  });
3665
+ /*
3669
3666
  stream.on('messageDelta', (messageDelta) => {
3670
- var _a;
3671
- if (this.options.isVerbose &&
3667
+ if (
3668
+ this.options.isVerbose &&
3672
3669
  messageDelta &&
3673
3670
  messageDelta.content &&
3674
3671
  messageDelta.content[0] &&
3675
- messageDelta.content[0].type === 'text') {
3676
- console.info('messageDelta', (_a = messageDelta.content[0].text) === null || _a === void 0 ? void 0 : _a.value);
3672
+ messageDelta.content[0].type === 'text'
3673
+ ) {
3674
+ console.info('messageDelta', messageDelta.content[0].text?.value);
3677
3675
  }
3676
+
3678
3677
  // <- TODO: [🐚] Make streaming and running tasks working
3679
3678
  });
3679
+ */
3680
3680
  stream.on('messageCreated', (message) => {
3681
3681
  if (this.options.isVerbose) {
3682
3682
  console.info('messageCreated', message);
@@ -3731,15 +3731,19 @@ class OpenAiAssistantExecutionTools extends OpenAiExecutionTools {
3731
3731
  },
3732
3732
  });
3733
3733
  }
3734
- async playground() {
3734
+ /*
3735
+ public async playground() {
3735
3736
  const client = await this.getClient();
3737
+
3736
3738
  // List all assistants
3737
3739
  const assistants = await client.beta.assistants.list();
3738
3740
  console.log('!!! Assistants:', assistants);
3741
+
3739
3742
  // Get details of a specific assistant
3740
3743
  const assistantId = 'asst_MO8fhZf4dGloCfXSHeLcIik0';
3741
3744
  const assistant = await client.beta.assistants.retrieve(assistantId);
3742
3745
  console.log('!!! Assistant Details:', assistant);
3746
+
3743
3747
  // Update an assistant
3744
3748
  const updatedAssistant = await client.beta.assistants.update(assistantId, {
3745
3749
  name: assistant.name + '(M)',
@@ -3749,71 +3753,103 @@ class OpenAiAssistantExecutionTools extends OpenAiExecutionTools {
3749
3753
  },
3750
3754
  });
3751
3755
  console.log('!!! Updated Assistant:', updatedAssistant);
3756
+
3752
3757
  await forEver();
3753
3758
  }
3759
+ */
3760
+ /**
3761
+ * Get an existing assistant tool wrapper
3762
+ */
3763
+ getAssistant(assistantId) {
3764
+ return new OpenAiAssistantExecutionTools({
3765
+ ...this.options,
3766
+ assistantId,
3767
+ });
3768
+ }
3754
3769
  async createNewAssistant(options) {
3755
3770
  if (!this.isCreatingNewAssistantsAllowed) {
3756
3771
  throw new NotAllowed(`Creating new assistants is not allowed. Set \`isCreatingNewAssistantsAllowed: true\` in options to enable this feature.`);
3757
3772
  }
3758
3773
  // await this.playground();
3759
- const { name, instructions } = options;
3774
+ const { name, instructions, knowledgeSources } = options;
3760
3775
  const client = await this.getClient();
3761
- /*/
3762
- //TODO: !!!
3763
- async function downloadFile(url: string, folder = './tmp'): Promise<string> {
3764
- const filename = path.basename(url.split('?')[0]);
3765
- const filepath = path.join(folder, filename);
3766
-
3767
- if (!fs.existsSync(folder)) fs.mkdirSync(folder);
3768
-
3769
- const res = await fetch(url);
3770
- if (!res.ok) throw new Error(`Download error: ${url}`);
3771
- const buffer = await res.arrayBuffer();
3772
- fs.writeFileSync(filepath, Buffer.from(buffer));
3773
- console.log(`📥 File downloaded: ${filename}`);
3774
-
3775
- return filepath;
3776
- }
3777
-
3778
- async function uploadFileToOpenAI(filepath: string) {
3779
- const file = await client.files.create({
3780
- file: fs.createReadStream(filepath),
3781
- purpose: 'assistants',
3776
+ let vectorStoreId;
3777
+ // If knowledge sources are provided, create a vector store with them
3778
+ if (knowledgeSources && knowledgeSources.length > 0) {
3779
+ if (this.options.isVerbose) {
3780
+ console.info(`📚 Creating vector store with ${knowledgeSources.length} knowledge sources...`);
3781
+ }
3782
+ // Create a vector store
3783
+ const vectorStore = await client.beta.vectorStores.create({
3784
+ name: `${name} Knowledge Base`,
3782
3785
  });
3783
- console.log(`⬆️ File uploaded to OpenAI: ${file.filename} (${file.id})`);
3784
- return file;
3785
- }
3786
-
3787
- // 🌐 URL addresses of files to upload
3788
- const fileUrls = [
3789
- 'https://raw.githubusercontent.com/vercel/next.js/canary/packages/next/README.md',
3790
- 'https://raw.githubusercontent.com/openai/openai-cookbook/main/examples/How_to_call_the_Assistants_API_with_Node.js.ipynb',
3791
- ];
3792
-
3793
- // 1️⃣ Download files from URL
3794
- const localFiles = [];
3795
- for (const url of fileUrls) {
3796
- const filepath = await downloadFile(url);
3797
- localFiles.push(filepath);
3798
- }
3799
-
3800
- // 2️⃣ Upload files to OpenAI
3801
- const uploadedFiles = [];
3802
- for (const filepath of localFiles) {
3803
- const file = await uploadFileToOpenAI(filepath);
3804
- uploadedFiles.push(file.id);
3786
+ vectorStoreId = vectorStore.id;
3787
+ if (this.options.isVerbose) {
3788
+ console.info(`✅ Vector store created: ${vectorStoreId}`);
3789
+ }
3790
+ // Upload files from knowledge sources to the vector store
3791
+ const fileStreams = [];
3792
+ for (const source of knowledgeSources) {
3793
+ try {
3794
+ // Check if it's a URL
3795
+ if (source.startsWith('http://') || source.startsWith('https://')) {
3796
+ // Download the file
3797
+ const response = await fetch(source);
3798
+ if (!response.ok) {
3799
+ console.error(`Failed to download ${source}: ${response.statusText}`);
3800
+ continue;
3801
+ }
3802
+ const buffer = await response.arrayBuffer();
3803
+ const filename = source.split('/').pop() || 'downloaded-file';
3804
+ const blob = new Blob([buffer]);
3805
+ const file = new File([blob], filename);
3806
+ fileStreams.push(file);
3807
+ }
3808
+ else {
3809
+ // Assume it's a local file path
3810
+ // Note: This will work in Node.js environment
3811
+ // For browser environments, this would need different handling
3812
+ const fs = await import('fs');
3813
+ const fileStream = fs.createReadStream(source);
3814
+ fileStreams.push(fileStream);
3815
+ }
3816
+ }
3817
+ catch (error) {
3818
+ console.error(`Error processing knowledge source ${source}:`, error);
3819
+ }
3820
+ }
3821
+ // Batch upload files to the vector store
3822
+ if (fileStreams.length > 0) {
3823
+ try {
3824
+ await client.beta.vectorStores.fileBatches.uploadAndPoll(vectorStoreId, {
3825
+ files: fileStreams,
3826
+ });
3827
+ if (this.options.isVerbose) {
3828
+ console.info(`✅ Uploaded ${fileStreams.length} files to vector store`);
3829
+ }
3830
+ }
3831
+ catch (error) {
3832
+ console.error('Error uploading files to vector store:', error);
3833
+ }
3834
+ }
3805
3835
  }
3806
- /**/
3807
- // alert('!!!! Creating new OpenAI assistant');
3808
- // 3️⃣ Create assistant with uploaded files
3809
- const assistant = await client.beta.assistants.create({
3836
+ // Create assistant with vector store attached
3837
+ const assistantConfig = {
3810
3838
  name,
3811
3839
  description: 'Assistant created via Promptbook',
3812
3840
  model: 'gpt-4o',
3813
3841
  instructions,
3814
3842
  tools: [/* TODO: [🧠] Maybe add { type: 'code_interpreter' }, */ { type: 'file_search' }],
3815
- // !!!! file_ids: uploadedFiles,
3816
- });
3843
+ };
3844
+ // Attach vector store if created
3845
+ if (vectorStoreId) {
3846
+ assistantConfig.tool_resources = {
3847
+ file_search: {
3848
+ vector_store_ids: [vectorStoreId],
3849
+ },
3850
+ };
3851
+ }
3852
+ const assistant = await client.beta.assistants.create(assistantConfig);
3817
3853
  console.log(`✅ Assistant created: ${assistant.id}`);
3818
3854
  // TODO: !!!! Try listing existing assistants
3819
3855
  // TODO: !!!! Try marking existing assistants by DISCRIMINANT
@@ -3824,6 +3860,95 @@ class OpenAiAssistantExecutionTools extends OpenAiExecutionTools {
3824
3860
  assistantId: assistant.id,
3825
3861
  });
3826
3862
  }
3863
+ async updateAssistant(options) {
3864
+ if (!this.isCreatingNewAssistantsAllowed) {
3865
+ throw new NotAllowed(`Updating assistants is not allowed. Set \`isCreatingNewAssistantsAllowed: true\` in options to enable this feature.`);
3866
+ }
3867
+ const { assistantId, name, instructions, knowledgeSources } = options;
3868
+ const client = await this.getClient();
3869
+ let vectorStoreId;
3870
+ // If knowledge sources are provided, create a vector store with them
3871
+ // TODO: [🧠] Reuse vector store creation logic from createNewAssistant
3872
+ if (knowledgeSources && knowledgeSources.length > 0) {
3873
+ if (this.options.isVerbose) {
3874
+ console.info(`📚 Creating vector store for update with ${knowledgeSources.length} knowledge sources...`);
3875
+ }
3876
+ // Create a vector store
3877
+ const vectorStore = await client.beta.vectorStores.create({
3878
+ name: `${name} Knowledge Base`,
3879
+ });
3880
+ vectorStoreId = vectorStore.id;
3881
+ if (this.options.isVerbose) {
3882
+ console.info(`✅ Vector store created: ${vectorStoreId}`);
3883
+ }
3884
+ // Upload files from knowledge sources to the vector store
3885
+ const fileStreams = [];
3886
+ for (const source of knowledgeSources) {
3887
+ try {
3888
+ // Check if it's a URL
3889
+ if (source.startsWith('http://') || source.startsWith('https://')) {
3890
+ // Download the file
3891
+ const response = await fetch(source);
3892
+ if (!response.ok) {
3893
+ console.error(`Failed to download ${source}: ${response.statusText}`);
3894
+ continue;
3895
+ }
3896
+ const buffer = await response.arrayBuffer();
3897
+ const filename = source.split('/').pop() || 'downloaded-file';
3898
+ const blob = new Blob([buffer]);
3899
+ const file = new File([blob], filename);
3900
+ fileStreams.push(file);
3901
+ }
3902
+ else {
3903
+ // Assume it's a local file path
3904
+ // Note: This will work in Node.js environment
3905
+ // For browser environments, this would need different handling
3906
+ const fs = await import('fs');
3907
+ const fileStream = fs.createReadStream(source);
3908
+ fileStreams.push(fileStream);
3909
+ }
3910
+ }
3911
+ catch (error) {
3912
+ console.error(`Error processing knowledge source ${source}:`, error);
3913
+ }
3914
+ }
3915
+ // Batch upload files to the vector store
3916
+ if (fileStreams.length > 0) {
3917
+ try {
3918
+ await client.beta.vectorStores.fileBatches.uploadAndPoll(vectorStoreId, {
3919
+ files: fileStreams,
3920
+ });
3921
+ if (this.options.isVerbose) {
3922
+ console.info(`✅ Uploaded ${fileStreams.length} files to vector store`);
3923
+ }
3924
+ }
3925
+ catch (error) {
3926
+ console.error('Error uploading files to vector store:', error);
3927
+ }
3928
+ }
3929
+ }
3930
+ const assistantUpdate = {
3931
+ name,
3932
+ instructions,
3933
+ tools: [/* TODO: [🧠] Maybe add { type: 'code_interpreter' }, */ { type: 'file_search' }],
3934
+ };
3935
+ if (vectorStoreId) {
3936
+ assistantUpdate.tool_resources = {
3937
+ file_search: {
3938
+ vector_store_ids: [vectorStoreId],
3939
+ },
3940
+ };
3941
+ }
3942
+ const assistant = await client.beta.assistants.update(assistantId, assistantUpdate);
3943
+ if (this.options.isVerbose) {
3944
+ console.log(`✅ Assistant updated: ${assistant.id}`);
3945
+ }
3946
+ return new OpenAiAssistantExecutionTools({
3947
+ ...this.options,
3948
+ isCreatingNewAssistantsAllowed: false,
3949
+ assistantId: assistant.id,
3950
+ });
3951
+ }
3827
3952
  /**
3828
3953
  * Discriminant for type guards
3829
3954
  */