@fonoster/autopilot 0.7.32 → 0.7.35

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 CHANGED
@@ -94,7 +94,30 @@ The Autopilot supports multiple language model providers. The following is a lis
94
94
 
95
95
  ## Adding Knowledge Base
96
96
 
97
- Coming soon...
97
+ A knowledge base provides information to the language model, such as business hours, services, or products.
98
+
99
+ Currently, we support retrieving documents from an S3 bucket.
100
+
101
+ To add a knowledge base, include a new entry in the `knowledgeBase` array in the configuration file. Below is an example of a knowledge for a menu PDF.
102
+
103
+ ```json
104
+ {
105
+ "conversationSettings": { ... },
106
+ "languageModel": {
107
+ "provider": "openai",
108
+ "model": "gpt-4o-mini",
109
+ "apiKey": "your-api-key",
110
+ "maxTokens": 100,
111
+ "temperature": 0.4,
112
+ "knowledgeBase": [{
113
+ "type": "s3",
114
+ "title": "Menu PDF",
115
+ "document": "sample.pdf"
116
+ }],
117
+ "tools": []
118
+ }
119
+ }
120
+ ```
98
121
 
99
122
  ## Adding Tools
100
123
 
@@ -108,8 +131,9 @@ You can configure a new tool by adding a new entry in the `tools` array in the c
108
131
  "languageModel": {
109
132
  "provider": "openai",
110
133
  "model": "gpt-4o-mini",
111
- "maxTokens": 250,
112
- "temperature": 0.7,
134
+ "apiKey": "your-api-key",
135
+ "maxTokens": 100,
136
+ "temperature": 0.4,
113
137
  "knowledgeBase": [],
114
138
  "tools": [
115
139
  {
@@ -227,7 +227,10 @@ declare const languageModelConfigSchema: z.ZodObject<{
227
227
  requestStartMessage?: string | undefined;
228
228
  }>, "many">;
229
229
  }, "strip", z.ZodTypeAny, {
230
+ provider: LANGUAGE_MODEL_PROVIDER;
230
231
  model: string;
232
+ temperature: number;
233
+ maxTokens: number;
231
234
  knowledgeBase: {
232
235
  type: "s3" | "file";
233
236
  url: string;
@@ -253,13 +256,13 @@ declare const languageModelConfigSchema: z.ZodObject<{
253
256
  };
254
257
  requestStartMessage?: string | undefined;
255
258
  }[];
256
- temperature: number;
257
- maxTokens: number;
258
- provider: LANGUAGE_MODEL_PROVIDER;
259
259
  apiKey?: string | undefined;
260
260
  baseUrl?: string | undefined;
261
261
  }, {
262
+ provider: LANGUAGE_MODEL_PROVIDER;
262
263
  model: string;
264
+ temperature: number;
265
+ maxTokens: number;
263
266
  knowledgeBase: {
264
267
  type: "s3" | "file";
265
268
  url: string;
@@ -285,9 +288,6 @@ declare const languageModelConfigSchema: z.ZodObject<{
285
288
  };
286
289
  requestStartMessage?: string | undefined;
287
290
  }[];
288
- temperature: number;
289
- maxTokens: number;
290
- provider: LANGUAGE_MODEL_PROVIDER;
291
291
  apiKey?: string | undefined;
292
292
  baseUrl?: string | undefined;
293
293
  }>;
@@ -519,7 +519,10 @@ declare const assistantSchema: z.ZodObject<{
519
519
  requestStartMessage?: string | undefined;
520
520
  }>, "many">;
521
521
  }, "strip", z.ZodTypeAny, {
522
+ provider: LANGUAGE_MODEL_PROVIDER;
522
523
  model: string;
524
+ temperature: number;
525
+ maxTokens: number;
523
526
  knowledgeBase: {
524
527
  type: "s3" | "file";
525
528
  url: string;
@@ -545,13 +548,13 @@ declare const assistantSchema: z.ZodObject<{
545
548
  };
546
549
  requestStartMessage?: string | undefined;
547
550
  }[];
548
- temperature: number;
549
- maxTokens: number;
550
- provider: LANGUAGE_MODEL_PROVIDER;
551
551
  apiKey?: string | undefined;
552
552
  baseUrl?: string | undefined;
553
553
  }, {
554
+ provider: LANGUAGE_MODEL_PROVIDER;
554
555
  model: string;
556
+ temperature: number;
557
+ maxTokens: number;
555
558
  knowledgeBase: {
556
559
  type: "s3" | "file";
557
560
  url: string;
@@ -577,9 +580,6 @@ declare const assistantSchema: z.ZodObject<{
577
580
  };
578
581
  requestStartMessage?: string | undefined;
579
582
  }[];
580
- temperature: number;
581
- maxTokens: number;
582
- provider: LANGUAGE_MODEL_PROVIDER;
583
583
  apiKey?: string | undefined;
584
584
  baseUrl?: string | undefined;
585
585
  }>;
@@ -609,7 +609,10 @@ declare const assistantSchema: z.ZodObject<{
609
609
  } | undefined;
610
610
  };
611
611
  languageModel: {
612
+ provider: LANGUAGE_MODEL_PROVIDER;
612
613
  model: string;
614
+ temperature: number;
615
+ maxTokens: number;
613
616
  knowledgeBase: {
614
617
  type: "s3" | "file";
615
618
  url: string;
@@ -635,9 +638,6 @@ declare const assistantSchema: z.ZodObject<{
635
638
  };
636
639
  requestStartMessage?: string | undefined;
637
640
  }[];
638
- temperature: number;
639
- maxTokens: number;
640
- provider: LANGUAGE_MODEL_PROVIDER;
641
641
  apiKey?: string | undefined;
642
642
  baseUrl?: string | undefined;
643
643
  };
@@ -667,7 +667,10 @@ declare const assistantSchema: z.ZodObject<{
667
667
  } | undefined;
668
668
  };
669
669
  languageModel: {
670
+ provider: LANGUAGE_MODEL_PROVIDER;
670
671
  model: string;
672
+ temperature: number;
673
+ maxTokens: number;
671
674
  knowledgeBase: {
672
675
  type: "s3" | "file";
673
676
  url: string;
@@ -693,9 +696,6 @@ declare const assistantSchema: z.ZodObject<{
693
696
  };
694
697
  requestStartMessage?: string | undefined;
695
698
  }[];
696
- temperature: number;
697
- maxTokens: number;
698
- provider: LANGUAGE_MODEL_PROVIDER;
699
699
  apiKey?: string | undefined;
700
700
  baseUrl?: string | undefined;
701
701
  };
@@ -1,8 +1,8 @@
1
- import { AssistantConfig, FilesKnowledgeBase, TelephonyContext, Voice } from ".";
1
+ import { AssistantConfig, KnowledgeBase, TelephonyContext, Voice } from ".";
2
2
  declare function createLanguageModel(params: {
3
3
  voice: Voice;
4
4
  assistantConfig: AssistantConfig;
5
- knowledgeBase: FilesKnowledgeBase;
5
+ knowledgeBase: KnowledgeBase;
6
6
  telephonyContext: TelephonyContext;
7
7
  }): import("./models/AbstractLanguageModel").AbstractLanguageModel;
8
8
  export { createLanguageModel };
@@ -56,7 +56,6 @@ const common_1 = require("@fonoster/common");
56
56
  const logger_1 = require("@fonoster/logger");
57
57
  const createLanguageModel_1 = require("./createLanguageModel");
58
58
  const loadAssistantConfigFromFile_1 = require("./loadAssistantConfigFromFile");
59
- const loadKnowledgeBaseFromFile_1 = require("./loadKnowledgeBaseFromFile");
60
59
  const _1 = __importStar(require("."));
61
60
  const logger = (0, logger_1.getLogger)({ service: "autopilot", filePath: __filename });
62
61
  async function handleVoiceRequest(req, res) {
@@ -68,7 +67,8 @@ async function handleVoiceRequest(req, res) {
68
67
  metadata: req.metadata
69
68
  });
70
69
  const assistantConfig = (0, loadAssistantConfigFromFile_1.loadAssistantConfigFromFile)(`${process.cwd()}/config/assistant.json`);
71
- const knowledgeBase = await (0, loadKnowledgeBaseFromFile_1.loadKnowledgeBaseFromFile)(`${process.cwd()}/config/sample.pdf`);
70
+ // const knowledgeBase = await loadKnowledgeBaseFromS3(["sample.pdf"]);
71
+ const knowledgeBase = await (0, _1.loadKnowledgeBaseFromFiles)(`${process.cwd()}/config/sample.pdf`);
72
72
  const voice = new _1.VoiceImpl(sessionRef, res);
73
73
  const languageModel = (0, createLanguageModel_1.createLanguageModel)({
74
74
  voice,
@@ -7,7 +7,8 @@ declare abstract class AbstractKnowledgeBase implements KnowledgeBase {
7
7
  constructor(params?: {
8
8
  embeddings?: Embeddings;
9
9
  });
10
- abstract load(params: unknown): Promise<void>;
10
+ abstract getLoaders(): Promise<unknown>;
11
+ load(): Promise<void>;
11
12
  queryKnowledgeBase(query: string, k?: number): Promise<string>;
12
13
  }
13
14
  export { AbstractKnowledgeBase };
@@ -2,16 +2,31 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.AbstractKnowledgeBase = void 0;
4
4
  const openai_1 = require("@langchain/openai");
5
+ const text_splitter_1 = require("langchain/text_splitter");
6
+ const memory_1 = require("langchain/vectorstores/memory");
5
7
  class AbstractKnowledgeBase {
6
8
  constructor(params) {
7
9
  this.embeddings = params?.embeddings || new openai_1.OpenAIEmbeddings();
8
10
  }
11
+ async load() {
12
+ const loaders = (await this.getLoaders());
13
+ if (loaders.length === 0) {
14
+ throw new Error("No files provided");
15
+ }
16
+ const loadedDocs = await Promise.all(loaders.map((loader) => loader.load()));
17
+ const textSplitter = new text_splitter_1.RecursiveCharacterTextSplitter({
18
+ chunkSize: 1000,
19
+ chunkOverlap: 200
20
+ });
21
+ const splitDocs = await Promise.all(loadedDocs.map((docs) => textSplitter.splitDocuments(docs)));
22
+ console.log("xxxx splitDocs", splitDocs);
23
+ this.vectorStore = await memory_1.MemoryVectorStore.fromDocuments(splitDocs.flat(), this.embeddings);
24
+ }
9
25
  async queryKnowledgeBase(query, k = 2) {
10
- const { vectorStore } = this;
11
- if (!vectorStore) {
26
+ if (!this.vectorStore) {
12
27
  throw new Error("Vector store is not initialized");
13
28
  }
14
- const results = await vectorStore.similaritySearch(query, k);
29
+ const results = await this.vectorStore.similaritySearch(query, k);
15
30
  return results.join("\n");
16
31
  }
17
32
  }
@@ -1,3 +1,4 @@
1
+ import { PDFLoader } from "@langchain/community/document_loaders/fs/pdf";
1
2
  import { Embeddings } from "@langchain/core/embeddings";
2
3
  import { AbstractKnowledgeBase } from "./AbstractKnowledgeBase";
3
4
  declare class FilesKnowledgeBase extends AbstractKnowledgeBase {
@@ -7,6 +8,6 @@ declare class FilesKnowledgeBase extends AbstractKnowledgeBase {
7
8
  embeddings?: Embeddings;
8
9
  files: string[];
9
10
  });
10
- load(): Promise<void>;
11
+ getLoaders(): Promise<PDFLoader[]>;
11
12
  }
12
13
  export { FilesKnowledgeBase };
@@ -20,8 +20,6 @@ exports.FilesKnowledgeBase = void 0;
20
20
  * limitations under the License.
21
21
  */
22
22
  const pdf_1 = require("@langchain/community/document_loaders/fs/pdf");
23
- const text_splitter_1 = require("langchain/text_splitter");
24
- const memory_1 = require("langchain/vectorstores/memory");
25
23
  const AbstractKnowledgeBase_1 = require("./AbstractKnowledgeBase");
26
24
  class FilesKnowledgeBase extends AbstractKnowledgeBase_1.AbstractKnowledgeBase {
27
25
  constructor(params) {
@@ -29,22 +27,11 @@ class FilesKnowledgeBase extends AbstractKnowledgeBase_1.AbstractKnowledgeBase {
29
27
  this.params = params;
30
28
  this.files = params?.files || [];
31
29
  }
32
- async load() {
33
- const { files } = this;
34
- if (files.length === 0) {
35
- throw new Error("No files provided");
36
- }
37
- else if (!files.every((file) => file.endsWith(".pdf"))) {
30
+ async getLoaders() {
31
+ if (!this.files.every((file) => file.endsWith(".pdf"))) {
38
32
  throw new Error("Only PDF files are supported");
39
33
  }
40
- const loaders = files.map((file) => new pdf_1.PDFLoader(file, { splitPages: false }));
41
- const loadedDocs = await Promise.all(loaders.map((loader) => loader.load()));
42
- const textSplitter = new text_splitter_1.RecursiveCharacterTextSplitter({
43
- chunkSize: 1000,
44
- chunkOverlap: 200
45
- });
46
- const splitDocs = await Promise.all(loadedDocs.map((docs) => textSplitter.splitDocuments(docs)));
47
- this.vectorStore = await memory_1.MemoryVectorStore.fromDocuments(splitDocs.flat(), this.embeddings);
34
+ return this.files.map((file) => new pdf_1.PDFLoader(file, { splitPages: false }));
48
35
  }
49
36
  }
50
37
  exports.FilesKnowledgeBase = FilesKnowledgeBase;
@@ -0,0 +1,10 @@
1
+ import { S3Loader } from "@langchain/community/document_loaders/web/s3";
2
+ import { AbstractKnowledgeBase } from "./AbstractKnowledgeBase";
3
+ import { S3KnowledgeBaseParams } from "./types";
4
+ declare class S3KnowledgeBase extends AbstractKnowledgeBase {
5
+ private params;
6
+ documents: string[];
7
+ constructor(params: S3KnowledgeBaseParams);
8
+ getLoaders(): Promise<S3Loader[]>;
9
+ }
10
+ export { S3KnowledgeBase };
@@ -0,0 +1,44 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.S3KnowledgeBase = void 0;
4
+ /*
5
+ * Copyright (C) 2024 by Fonoster Inc (https://fonoster.com)
6
+ * http://github.com/fonoster/fonoster
7
+ *
8
+ * This file is part of Fonoster
9
+ *
10
+ * Licensed under the MIT License (the "License");
11
+ * you may not use this file except in compliance with
12
+ * the License. You may obtain a copy of the License at
13
+ *
14
+ * https://opensource.org/licenses/MIT
15
+ *
16
+ * Unless required by applicable law or agreed to in writing, software
17
+ * distributed under the License is distributed on an "AS IS" BASIS,
18
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
19
+ * See the License for the specific language governing permissions and
20
+ * limitations under the License.
21
+ */
22
+ const s3_1 = require("@langchain/community/document_loaders/web/s3");
23
+ const AbstractKnowledgeBase_1 = require("./AbstractKnowledgeBase");
24
+ class S3KnowledgeBase extends AbstractKnowledgeBase_1.AbstractKnowledgeBase {
25
+ constructor(params) {
26
+ super(params);
27
+ this.params = params;
28
+ this.params = params;
29
+ }
30
+ async getLoaders() {
31
+ if (!this.documents.every((file) => file.endsWith(".pdf"))) {
32
+ throw new Error("Only PDF files are supported");
33
+ }
34
+ const { bucket, key, s3Config, unstructuredAPIURL, unstructuredAPIKey } = this.params;
35
+ return this.documents.map(() => new s3_1.S3Loader({
36
+ bucket,
37
+ key,
38
+ s3Config,
39
+ unstructuredAPIURL,
40
+ unstructuredAPIKey
41
+ }));
42
+ }
43
+ }
44
+ exports.S3KnowledgeBase = S3KnowledgeBase;
@@ -1,3 +1,6 @@
1
1
  export * from "./AbstractKnowledgeBase";
2
2
  export * from "./FilesKnowledgeBase";
3
+ export * from "./S3KnowledgeBase";
4
+ export * from "./loadKnowledgeBaseFromFiles";
5
+ export * from "./loadKnowledgeBaseFromS3";
3
6
  export * from "./types";
@@ -14,8 +14,6 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
14
  for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
15
  };
16
16
  Object.defineProperty(exports, "__esModule", { value: true });
17
- __exportStar(require("./AbstractKnowledgeBase"), exports);
18
- __exportStar(require("./FilesKnowledgeBase"), exports);
19
17
  /*
20
18
  * Copyright (C) 2024 by Fonoster Inc (https://fonoster.com)
21
19
  * http://github.com/fonoster/fonoster
@@ -34,4 +32,9 @@ __exportStar(require("./FilesKnowledgeBase"), exports);
34
32
  * See the License for the specific language governing permissions and
35
33
  * limitations under the License.
36
34
  */
35
+ __exportStar(require("./AbstractKnowledgeBase"), exports);
36
+ __exportStar(require("./FilesKnowledgeBase"), exports);
37
+ __exportStar(require("./S3KnowledgeBase"), exports);
38
+ __exportStar(require("./loadKnowledgeBaseFromFiles"), exports);
39
+ __exportStar(require("./loadKnowledgeBaseFromS3"), exports);
37
40
  __exportStar(require("./types"), exports);
@@ -0,0 +1,3 @@
1
+ import { FilesKnowledgeBase } from "..";
2
+ declare function loadKnowledgeBaseFromFiles(pathToKnowledgeBase: string): Promise<FilesKnowledgeBase>;
3
+ export { loadKnowledgeBaseFromFiles };
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.loadKnowledgeBaseFromFile = loadKnowledgeBaseFromFile;
3
+ exports.loadKnowledgeBaseFromFiles = loadKnowledgeBaseFromFiles;
4
4
  /*
5
5
  * Copyright (C) 2024 by Fonoster Inc (https://fonoster.com)
6
6
  * http://github.com/fonoster/fonoster
@@ -19,9 +19,9 @@ exports.loadKnowledgeBaseFromFile = loadKnowledgeBaseFromFile;
19
19
  * See the License for the specific language governing permissions and
20
20
  * limitations under the License.
21
21
  */
22
- const _1 = require(".");
23
- async function loadKnowledgeBaseFromFile(pathToKnowledgeBase) {
24
- const knowledgeBase = new _1.FilesKnowledgeBase({
22
+ const __1 = require("..");
23
+ async function loadKnowledgeBaseFromFiles(pathToKnowledgeBase) {
24
+ const knowledgeBase = new __1.FilesKnowledgeBase({
25
25
  files: [pathToKnowledgeBase]
26
26
  });
27
27
  await knowledgeBase.load();
@@ -0,0 +1,3 @@
1
+ import { S3KnowledgeBase, S3KnowledgeBaseParams } from ".";
2
+ declare function loadKnowledgeBaseFromS3(params: S3KnowledgeBaseParams): Promise<S3KnowledgeBase>;
3
+ export { loadKnowledgeBaseFromS3 };
@@ -0,0 +1,27 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.loadKnowledgeBaseFromS3 = loadKnowledgeBaseFromS3;
4
+ /*
5
+ * Copyright (C) 2024 by Fonoster Inc (https://fonoster.com)
6
+ * http://github.com/fonoster/fonoster
7
+ *
8
+ * This file is part of Fonoster
9
+ *
10
+ * Licensed under the MIT License (the "License");
11
+ * you may not use this file except in compliance with
12
+ * the License. You may obtain a copy of the License at
13
+ *
14
+ * https://opensource.org/licenses/MIT
15
+ *
16
+ * Unless required by applicable law or agreed to in writing, software
17
+ * distributed under the License is distributed on an "AS IS" BASIS,
18
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
19
+ * See the License for the specific language governing permissions and
20
+ * limitations under the License.
21
+ */
22
+ const _1 = require(".");
23
+ async function loadKnowledgeBaseFromS3(params) {
24
+ const knowledgeBase = new _1.S3KnowledgeBase(params);
25
+ await knowledgeBase.load();
26
+ return knowledgeBase;
27
+ }
@@ -1,4 +1,22 @@
1
+ import { Embeddings } from "@langchain/core/embeddings";
1
2
  type KnowledgeBase = {
2
3
  queryKnowledgeBase: (query: string, k?: number) => Promise<string>;
3
4
  };
4
- export { KnowledgeBase };
5
+ type S3KnowledgeBaseParams = {
6
+ embeddings?: Embeddings;
7
+ documents: string[];
8
+ bucket: string;
9
+ key: string;
10
+ s3Config: {
11
+ endpoint: string;
12
+ region: string;
13
+ credentials: {
14
+ accessKeyId: string;
15
+ secretAccessKey: string;
16
+ };
17
+ forcePathStyle: boolean;
18
+ };
19
+ unstructuredAPIURL: string;
20
+ unstructuredAPIKey: string;
21
+ };
22
+ export { KnowledgeBase, S3KnowledgeBaseParams };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fonoster/autopilot",
3
- "version": "0.7.32",
3
+ "version": "0.7.35",
4
4
  "description": "Voice AI for the Fonoster platform",
5
5
  "author": "Pedro Sanders <psanders@fonoster.com>",
6
6
  "homepage": "https://github.com/fonoster/fonoster#readme",
@@ -35,10 +35,11 @@
35
35
  "url": "https://github.com/fonoster/fonoster/issues"
36
36
  },
37
37
  "dependencies": {
38
- "@fonoster/common": "^0.7.32",
39
- "@fonoster/logger": "^0.7.32",
40
- "@fonoster/types": "^0.7.32",
41
- "@fonoster/voice": "^0.7.32",
38
+ "@aws-sdk/client-s3": "^3.701.0",
39
+ "@fonoster/common": "^0.7.35",
40
+ "@fonoster/logger": "^0.7.35",
41
+ "@fonoster/types": "^0.7.35",
42
+ "@fonoster/voice": "^0.7.35",
42
43
  "@langchain/community": "^0.3.16",
43
44
  "@langchain/core": "^0.3.19",
44
45
  "@langchain/groq": "^0.1.2",
@@ -56,5 +57,5 @@
56
57
  "devDependencies": {
57
58
  "typescript": "^5.5.4"
58
59
  },
59
- "gitHead": "96c1aa03e97f05179d83c3bbdda4cc2dde61a367"
60
+ "gitHead": "310b53e483cda3937e2d093c56428c94a15466e6"
60
61
  }
@@ -1,3 +0,0 @@
1
- import { FilesKnowledgeBase } from ".";
2
- declare function loadKnowledgeBaseFromFile(pathToKnowledgeBase: string): Promise<FilesKnowledgeBase>;
3
- export { loadKnowledgeBaseFromFile };