├── store ├── memory.index │ ├── args.json │ ├── hnswlib.index │ └── docstore.json └── memory.md ├── .env.example ├── bun.lockb ├── src ├── guards │ └── guard.ts ├── tools │ ├── notion.ts │ ├── todoist.dt.ts │ ├── schema.ts │ └── todoist.ts ├── server │ └── server.ts ├── memories │ └── store.ts ├── app.ts └── helpers.ts ├── package.json ├── tsconfig.json ├── .gitignore ├── README.md └── pnpm-lock.yaml /store/memory.index/args.json: -------------------------------------------------------------------------------- 1 | {"space":"cosine","numDimensions":1536} -------------------------------------------------------------------------------- /.env.example: -------------------------------------------------------------------------------- 1 | API_KEY=... 2 | 3 | OPENAI_API_KEY=sk-... 4 | TODOIST_API_KEY=... -------------------------------------------------------------------------------- /bun.lockb: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iceener/personalized-gpt-4/HEAD/bun.lockb -------------------------------------------------------------------------------- /store/memory.index/hnswlib.index: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iceener/personalized-gpt-4/HEAD/store/memory.index/hnswlib.index -------------------------------------------------------------------------------- /store/memory.md: -------------------------------------------------------------------------------- 1 | Adam's fiancée's name is Kate 2 | 3 | Adam has a dog named Alexa 4 | 5 | AI_Devs is a course I create with Mateusz and Jakub 6 | 7 | Mateusz lives in Katowice -------------------------------------------------------------------------------- /store/memory.index/docstore.json: -------------------------------------------------------------------------------- 1 | [["0",{"pageContent":"Adam's fiancée's name is Kate","metadata":{}}],["1",{"pageContent":"Adam has a dog named Alexa","metadata":{}}],["2",{"pageContent":"AI_Devs is a course I create with Mateusz and Jakub","metadata":{}}],["3",{"pageContent":"Mateusz lives in Katowice","metadata":{}}]] -------------------------------------------------------------------------------- /src/guards/guard.ts: -------------------------------------------------------------------------------- 1 | import type {NextFunction, Request, Response} from 'express'; 2 | 3 | export const auth = (req: Request, res: Response, next: NextFunction) => { 4 | const token = req.headers.authorization?.split(' ')[1]; 5 | 6 | if (token === process.env.API_KEY) { 7 | next(); 8 | } else { 9 | res.status(401).send('Unauthorized'); 10 | } 11 | } -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "tools", 3 | "module": "index.ts", 4 | "type": "module", 5 | "scripts": { 6 | "start": "bun --hot src/server/server.ts" 7 | }, 8 | "devDependencies": { 9 | "bun-types": "latest" 10 | }, 11 | "peerDependencies": { 12 | "typescript": "^5.0.0" 13 | }, 14 | "dependencies": { 15 | "@types/express": "^4.17.19", 16 | "express": "^4.18.2", 17 | "hnswlib-node": "^2.0.0", 18 | "langchain": "^0.0.154" 19 | } 20 | } -------------------------------------------------------------------------------- /src/tools/notion.ts: -------------------------------------------------------------------------------- 1 | // THIS METHOD IS NOT USED IN THE DEMO. Its purpose is to show how to use the make.com to add a quick note to the Notion 2 | // Scenario IS NOT INCLUDED HERE 3 | export const addQuickNote = async (content: string) => { 4 | const response = await fetch("https://hook.eu1.make.com/WEBHOOK_ID", { 5 | method: "POST", 6 | headers: {"Content-Type": "application/json"}, 7 | body: JSON.stringify(content) 8 | }); 9 | const { data } = await response.json() as { data: string }; 10 | return data; 11 | } -------------------------------------------------------------------------------- /src/server/server.ts: -------------------------------------------------------------------------------- 1 | import express, {Request, Response} from 'express'; 2 | import {auth} from "../guards/guard.ts"; 3 | import {act} from "../app.ts"; 4 | 5 | // Initialize the server 6 | const app = express(); 7 | app.use(express.json()); 8 | const port = 3000; 9 | 10 | // Setup main route 11 | app.post('/', auth, async (req: Request, res: Response) => { 12 | const response = await act(req.body.query); 13 | res.json(response); 14 | }); 15 | 16 | // Start the server 17 | app.listen(port, () => { 18 | console.log(`Server is running at http://localhost:${port}`); 19 | }); -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "lib": ["ESNext"], 4 | "module": "esnext", 5 | "target": "esnext", 6 | "moduleResolution": "bundler", 7 | "moduleDetection": "force", 8 | "allowImportingTsExtensions": true, 9 | "noEmit": true, 10 | "composite": true, 11 | "strict": true, 12 | "downlevelIteration": true, 13 | "skipLibCheck": true, 14 | "jsx": "preserve", 15 | "allowSyntheticDefaultImports": true, 16 | "forceConsistentCasingInFileNames": true, 17 | "allowJs": true, 18 | "types": [ 19 | "bun-types" // add Bun global 20 | ] 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /src/memories/store.ts: -------------------------------------------------------------------------------- 1 | import * as fs from "fs"; 2 | import {HNSWLib} from "langchain/vectorstores/hnswlib"; 3 | import {OpenAIEmbeddings} from "langchain/embeddings/openai"; 4 | import {TextLoader} from "langchain/document_loaders/fs/text"; 5 | import {Document} from "langchain/document"; 6 | 7 | const VECTOR_STORE_PATH = `store/memory.index`; 8 | const MEMORY_PATH = "store/memory.md"; 9 | 10 | export const getVectorStore = async (): Promise => { 11 | if (fs.existsSync(VECTOR_STORE_PATH)) { 12 | return HNSWLib.load(VECTOR_STORE_PATH, new OpenAIEmbeddings()); 13 | } 14 | 15 | const loader = new TextLoader(MEMORY_PATH); 16 | let [memory] = await loader.load(); 17 | const documents = memory.pageContent.split("\n\n").map((content) => (new Document({pageContent: content,}))); 18 | const store = await HNSWLib.fromDocuments(documents, new OpenAIEmbeddings()); 19 | await store.save(VECTOR_STORE_PATH); 20 | return store; 21 | } -------------------------------------------------------------------------------- /src/tools/todoist.dt.ts: -------------------------------------------------------------------------------- 1 | export interface IDue { 2 | date: string; 3 | timezone: string; 4 | string: string; 5 | lang: string; 6 | is_recurring: boolean; 7 | datetime: string; 8 | } 9 | 10 | export interface ITaskModify { 11 | id?: string; 12 | content?: string; 13 | due_string?: string | null; 14 | is_completed?: boolean; 15 | } 16 | 17 | export interface ITaskCompleted { 18 | [key: string]: 'completed' 19 | } 20 | 21 | export interface ITaskClose { 22 | id: string; 23 | } 24 | 25 | export interface ITask { 26 | id: string; 27 | assigner_id: string | null; 28 | assignee_id: string | null; 29 | project_id: string; 30 | section_id: string | null; 31 | parent_id: string | null; 32 | order: number; 33 | content: string; 34 | description: string; 35 | is_completed: boolean; 36 | labels: string[]; 37 | priority: number; 38 | comment_count: number; 39 | creator_id: string; 40 | created_at: string; 41 | due: IDue; 42 | url: string; 43 | duration: string | null; 44 | } -------------------------------------------------------------------------------- /src/app.ts: -------------------------------------------------------------------------------- 1 | import { ChatOpenAI } from "langchain/chat_models/openai"; 2 | import {HumanMessage, SystemMessage} from "langchain/schema"; 3 | import {parseFunctionCall, rephrase, systemPrompt} from "./helpers.ts"; 4 | import {addTasks, closeTasks, getTasks, updateTasks} from "./tools/todoist.ts"; 5 | import {addTasksSchema, finishTasksSchema, getTasksSchema, quickNotesSchema} from "./tools/schema.ts"; 6 | import {getVectorStore} from "./memories/store.ts"; 7 | import {addQuickNote} from "./tools/notion.ts"; 8 | 9 | // Initialize the model and schema bindings for Function Calling 10 | const model = new ChatOpenAI({modelName: "gpt-4-0613"}) 11 | .bind({functions: [getTasksSchema, addTasksSchema, finishTasksSchema]}); // removed: quickNotesSchema 12 | 13 | // Define the tools for the functions 14 | const tools: any = {getTasks, addTasks, closeTasks, updateTasks} // removed: addQuickNote 15 | 16 | // Main action 17 | export const act = async (query: string) => { 18 | // initialize the vector store and get the context and tasks 19 | const vectorStore = await getVectorStore(); 20 | // get the context and tasks 21 | const [context, tasks] = await Promise.all([ 22 | vectorStore.similaritySearchWithScore(query, 3), 23 | getTasks() 24 | ]); 25 | // invoke the model 26 | const conversation = await model.invoke([ 27 | new SystemMessage(systemPrompt({ context, tasks })), 28 | new HumanMessage(query), 29 | ]); 30 | // parse the function call 31 | const action = parseFunctionCall(conversation); 32 | 33 | // if there is a function call, invoke the function 34 | if (action) { 35 | const response = await tools[action.name](action.args); 36 | return await rephrase(response, query); 37 | } 38 | 39 | // otherwise, return the response 40 | return conversation.content; 41 | } 42 | 43 | 44 | 45 | -------------------------------------------------------------------------------- /src/tools/schema.ts: -------------------------------------------------------------------------------- 1 | export const getTasksSchema = { 2 | "name": "getTasks", 3 | "description": "Only for listing (unfinished) tasks from Todoist", 4 | "parameters": { 5 | "type": "object", 6 | "properties": {} 7 | } 8 | } 9 | 10 | export const addTasksSchema = { 11 | "name": "addTasks", 12 | "description": "Add multiple tasks to Todoist", 13 | "parameters": { 14 | "type": "object", 15 | "properties": { 16 | "tasks": { 17 | "type": "array", 18 | "description": "List of tasks that needs to be added to the Todoist", 19 | "items": { 20 | "type": "object", 21 | "properties": { 22 | "content": { 23 | "type": "string", 24 | "description": "Format: task detailed description" 25 | }, 26 | "due_string": { 27 | "type": "string", 28 | "description": "Natural language date user mentions, defaults always to 'today' (examples: monday at 5 pm etc.) so user doesn't need to mention it" 29 | } 30 | } 31 | } 32 | } 33 | } 34 | } 35 | } 36 | 37 | export const finishTasksSchema = { 38 | "name": "closeTasks", 39 | "description": "Finish/Complete tasks in Todoist", 40 | "parameters": { 41 | "type": "object", 42 | "properties": { 43 | "tasks": { 44 | "type": "array", 45 | "description": "List of IDs of tasks that needs to be finished/completed", 46 | "items": { 47 | "type": "number", 48 | } 49 | } 50 | } 51 | } 52 | } 53 | 54 | export const quickNotesSchema = { 55 | "name": "addQuickNote", 56 | "description": "Add quick note to the Notion", 57 | "parameters": { 58 | "type": "object", 59 | "properties": { 60 | "content": { 61 | "type": "string", 62 | "description": "Exact, to the word message from the user, that needs to be added to the Notion as a quick note" 63 | } 64 | } 65 | } 66 | } -------------------------------------------------------------------------------- /src/helpers.ts: -------------------------------------------------------------------------------- 1 | import {BaseMessageChunk, SystemMessage} from "langchain/schema"; 2 | import {ChatOpenAI} from "langchain/chat_models/openai"; 3 | import {Document} from "langchain/document"; 4 | import {ITask} from "./tools/todoist.dt.ts"; 5 | 6 | // rephrase the response 7 | export const rephrase = async (response: string, query: string) => { 8 | const model = new ChatOpenAI({ 9 | modelName: "gpt-3.5-turbo", 10 | temperature: 1, 11 | }); 12 | // invoke the model 13 | const { content } = await model.call([ 14 | // basic rephrase prompt 15 | new SystemMessage(` 16 | Answer the question ultra-briefly & short using casual, human-friendly tone: 17 | ###${query}### 18 | and act as if you just performed this action for the user and confirming this fact to the user, using the following response: 19 | ###${JSON.stringify(response)}### 20 | `), 21 | ]) 22 | 23 | return content; 24 | } 25 | 26 | // get the system prompt 27 | export const systemPrompt = ({ context, tasks }: { context: any, tasks: ITask[] }) => { 28 | return ` 29 | Use facts and context to answer the questions and perform the actions. If you don't know the answer, say "don't know". 30 | Actions may be enriched with additional information from the context. 31 | Fact: Today is ${currentDate()} and user's name is Adam. 32 | Context: ###${context.map((c: [Document, number]) => c[0].pageContent).join('### ###')}### 33 | Current tasks: ###${tasks.map((task: ITask) => task.content + ' (ID: ' + task.id + ')').join(', ')}### 34 | ` 35 | } 36 | 37 | // parse the function call 38 | export const parseFunctionCall = (result: BaseMessageChunk): { name: string, args: any } | null => { 39 | if (result?.additional_kwargs?.function_call === undefined) { 40 | return null; 41 | } 42 | return { 43 | name: result.additional_kwargs.function_call.name, 44 | args: JSON.parse(result.additional_kwargs.function_call.arguments), 45 | } 46 | } 47 | 48 | // simple date formatter 49 | export const currentDate = () => { 50 | let date = new Date(); 51 | 52 | let weekdays = ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday']; 53 | let weekday = weekdays[date.getDay()]; 54 | 55 | let month = (date.getMonth() + 1).toString().padStart(2, '0'); // months are 0-based in JS 56 | let day = date.getDate().toString().padStart(2, '0'); 57 | let year = date.getFullYear(); 58 | 59 | let hours = date.getHours().toString().padStart(2, '0'); 60 | let minutes = date.getMinutes().toString().padStart(2, '0'); 61 | 62 | return `${weekday}, ${month}/${day}/${year} ${hours}:${minutes}`; 63 | } -------------------------------------------------------------------------------- /src/tools/todoist.ts: -------------------------------------------------------------------------------- 1 | import {ITask, ITaskClose, ITaskCompleted, ITaskModify} from "./todoist.dt.ts"; 2 | 3 | const apiCall = async (endpoint = '/me', method = 'GET', body = {}) => { 4 | const response = await fetch(`https://api.todoist.com/rest/v2${endpoint}`, { 5 | method, 6 | headers: { 7 | 'Content-Type': 'application/json', 8 | 'Authorization': `Bearer ${process.env.TODOIST_API_KEY}` 9 | }, 10 | body: method === 'POST' ? JSON.stringify(body) : undefined, 11 | }); 12 | return response.status === 204 ? true : await response.json(); 13 | } 14 | 15 | 16 | export const getTasks = async (): Promise => { 17 | const uncompleted = await apiCall('/tasks', 'GET') as any; 18 | return uncompleted.map((task: ITask) => { 19 | return { 20 | id: task.id, 21 | content: task.content, 22 | due: task.due ? task.due.string : undefined, 23 | } 24 | }); 25 | } 26 | export const addTasks = async ({tasks}: { tasks: ITaskModify[] }): Promise => { 27 | console.log(tasks); 28 | const promises = tasks.map(task => 29 | apiCall('/tasks', 'POST', { 30 | content: task.content, 31 | due_string: task.due_string 32 | }) 33 | ); 34 | 35 | const addedTasks = await Promise.all(promises) as any; 36 | 37 | return addedTasks.map((addedTask: ITask) => ({ 38 | id: addedTask.id, 39 | content: addedTask.content, 40 | due_string: addedTask.due ? addedTask.due.string : null, 41 | })); 42 | } 43 | 44 | export const updateTasks = async ({tasks}: { tasks: ITaskModify[] }): Promise => { 45 | const promises = tasks.map((task) => 46 | apiCall(`/tasks/${task.id}`, 'POST', { 47 | content: task.content, 48 | due_string: task.due_string, 49 | is_completed: task.is_completed 50 | }) 51 | ); 52 | 53 | const updatedTasks = await Promise.all(promises); 54 | 55 | return updatedTasks.map((updatedTask: any) => ({ 56 | id: updatedTask.id, 57 | content: updatedTask.content, 58 | due_string: updatedTask.due ? updatedTask.due.string : undefined, 59 | })); 60 | } 61 | 62 | export const closeTasks = async ({tasks}: { tasks: ITaskClose[]}): Promise => { 63 | const promises = tasks.map((id) => 64 | apiCall(`/tasks/${id}/close`, 'POST') 65 | ); 66 | 67 | try { 68 | await Promise.all(promises); 69 | return tasks.map(closedTask => ({ 70 | [closedTask.toString()]: 'completed', 71 | })); 72 | } catch (e) { 73 | return 'No tasks were closed (maybe they were already closed)'; 74 | } 75 | } 76 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Based on https://raw.githubusercontent.com/github/gitignore/main/Node.gitignore 2 | .idea 3 | 4 | # Logs 5 | 6 | logs 7 | _.log 8 | npm-debug.log_ 9 | yarn-debug.log* 10 | yarn-error.log* 11 | lerna-debug.log* 12 | .pnpm-debug.log* 13 | 14 | # Diagnostic reports (https://nodejs.org/api/report.html) 15 | 16 | report.[0-9]_.[0-9]_.[0-9]_.[0-9]_.json 17 | 18 | # Runtime data 19 | 20 | pids 21 | _.pid 22 | _.seed 23 | \*.pid.lock 24 | 25 | # Directory for instrumented libs generated by jscoverage/JSCover 26 | 27 | lib-cov 28 | 29 | # Coverage directory used by tools like istanbul 30 | 31 | coverage 32 | \*.lcov 33 | 34 | # nyc test coverage 35 | 36 | .nyc_output 37 | 38 | # Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files) 39 | 40 | .grunt 41 | 42 | # Bower dependency directory (https://bower.io/) 43 | 44 | bower_components 45 | 46 | # node-waf configuration 47 | 48 | .lock-wscript 49 | 50 | # Compiled binary addons (https://nodejs.org/api/addons.html) 51 | 52 | build/Release 53 | 54 | # Dependency directories 55 | 56 | node_modules/ 57 | jspm_packages/ 58 | 59 | # Snowpack dependency directory (https://snowpack.dev/) 60 | 61 | web_modules/ 62 | 63 | # TypeScript cache 64 | 65 | \*.tsbuildinfo 66 | 67 | # Optional npm cache directory 68 | 69 | .npm 70 | 71 | # Optional eslint cache 72 | 73 | .eslintcache 74 | 75 | # Optional stylelint cache 76 | 77 | .stylelintcache 78 | 79 | # Microbundle cache 80 | 81 | .rpt2_cache/ 82 | .rts2_cache_cjs/ 83 | .rts2_cache_es/ 84 | .rts2_cache_umd/ 85 | 86 | # Optional REPL history 87 | 88 | .node_repl_history 89 | 90 | # Output of 'npm pack' 91 | 92 | \*.tgz 93 | 94 | # Yarn Integrity file 95 | 96 | .yarn-integrity 97 | 98 | # dotenv environment variable files 99 | 100 | .env 101 | .env.development.local 102 | .env.test.local 103 | .env.production.local 104 | .env.local 105 | 106 | # parcel-bundler cache (https://parceljs.org/) 107 | 108 | .cache 109 | .parcel-cache 110 | 111 | # Next.js build output 112 | 113 | .next 114 | out 115 | 116 | # Nuxt.js build / generate output 117 | 118 | .nuxt 119 | dist 120 | 121 | # Gatsby files 122 | 123 | .cache/ 124 | 125 | # Comment in the public line in if your project uses Gatsby and not Next.js 126 | 127 | # https://nextjs.org/blog/next-9-1#public-directory-support 128 | 129 | # public 130 | 131 | # vuepress build output 132 | 133 | .vuepress/dist 134 | 135 | # vuepress v2.x temp and cache directory 136 | 137 | .temp 138 | .cache 139 | 140 | # Docusaurus cache and generated files 141 | 142 | .docusaurus 143 | 144 | # Serverless directories 145 | 146 | .serverless/ 147 | 148 | # FuseBox cache 149 | 150 | .fusebox/ 151 | 152 | # DynamoDB Local files 153 | 154 | .dynamodb/ 155 | 156 | # TernJS port file 157 | 158 | .tern-port 159 | 160 | # Stores VSCode versions used for testing VSCode extensions 161 | 162 | .vscode-test 163 | 164 | # yarn v2 165 | 166 | .yarn/cache 167 | .yarn/unplugged 168 | .yarn/build-state.yml 169 | .yarn/install-state.gz 170 | .pnp.\* 171 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | ![AI_Devs #2](https://cloud.overment.com/aidevs-1694672760.png) 2 | 3 | Repozytorium z kodem źródłowym z webinaru **Hiperpersonalizacja AI, czyli GPT-4 dopasowane do Ciebie** 4 | Nagranie ze spotkania dostępne jest tutaj: https://www.youtube.com/watch?v=fgGrGF18ah8 5 | 6 | Szkolenie AI Devs #2 zaczynamy 23 października. Dołącz do nas na https://aidevs.pl 7 | 8 | ⚠️ **UWAGA!** ⚠️ 9 | - Kod źródłowy jest przeznaczony wyłącznie do celów edukacyjnych. Nie należy go używać w środowisku produkcyjnym. 10 | - Kod **nie jest** zoptymalizowany do pracy z dużymi zestawami danych. 11 | - 🚨🚨 WAŻNE 🚨🚨 Przed uruchomieniem kodu, ustaw twardy limit $ na swoim koncie https://platform.openai.com 12 | - Podczas webinaru kod był uruchamiany z modelem GPT-4 i jest to **rekomendowany model do realizowania takich zadań**. Jeśli nie posiadasz do niego dostępu, możesz zmienić model z gpt-4-0613 na gpt-3.5-turbo-0613, jednak precyzja aplikacji **znacznie spadnie** 13 | 14 | ## Instalacja 15 | 16 | 1. Pobierz repozytorium na swój komputer 17 | 2. Zmień nazwę pliku .env.example na .env 18 | 3. Dodaj swój klucz OpenAI API do pliku .env 19 | 4. Dodaj swój klucz Todoist API do pliku .env 20 | 5. Dodaj dowolny klucz API chroniący aplikację (może to być dowolny ciąg znaków) do pliku .env 21 | 6. Zainstaluj zależności poleceniem `bun install` 22 | 7. Uruchom kod poleceniem `bun start` 23 | 8. Serwer uruchomi się na porcie 3000 24 | 9. Wykonaj zapytanie CURL według poniższego przykładu, aby przetestować działanie aplikacji 25 | 26 | ## Ograniczenia 27 | 28 | - Usunąłem z aplikacji obsługę notatek Notion, zostawiłem jednak schematy funkcji oraz przykładowe zapytanie do scenariusza make.com 29 | 30 | ## Pamięć długoterminowa 31 | 32 | W pliku memory.md zapisane jest kilka wspomnień na mój temat. Jeśli chcesz je zmodyfikować lub dodać własne, możesz to zrobić, ale **pamię†aj o usunięciu pliku memory.index z katalogu "store"**. Wówczas przy pierwszym uruchomieniu aplikacji, indeks utworzy się ponownie. 33 | 34 | UWAGA: Na potrzeby testów unikaj dodawania dużych ilości danych do tego pliku, a ich poszczególne fragmenty oddzielaj pustą linią. 35 | 36 | ## Przykładowe polecenie 37 | 38 | Po uruchomieniu serwera według powyższych instrukcji wykonaj poniższe polecenie, aby przetestować działanie aplikacji. 39 | Pamiętaj, aby w nagłówku Authorization podać swój klucz API (czyli dowolny ciąg znaków, z pliku .env). 40 | 41 | Jeśli ustawisz jako zapytanie "polecenie dodania zadania do Todoist", to aplikacja zrobi to, pod warunkiem że Twój klucz API Todoist jest prawidłowy. 42 | 43 | ```bash 44 | curl -X POST -H "Content-Type: application/json" -H "Authorization: Bearer API_KEY" -d '{"query":"Who is Adam?"}' localhost:3000 45 | ``` 46 | 47 | ## (zaawansowane) Integracja Slack & Wiadomości głosowe 48 | 49 | Ten krok jest opcjonalny i nie jest wymagany do uruchomienia aplikacji. Pozwala jednak na podłączenie jej do Slacka, w tym także obsługę wiadomości głosowych. 50 | Logika integracji Slack oraz wiadomości głosowych została stworzona w make.com (potrzebujesz podstaw jego obsługi, aby przejść przez poniższe kroki). Aby ją odwzorować, potrzebujesz: 51 | 52 | 1. Konto w make.com i Slack 53 | 2. Utworzyć nowy scenariusz automatyzacji w make.com 54 | 3. Zaimportować ten schemat (blueprint) — [Pobierz](https://cloud.overment.com/aidevs_slack-1697665252.json) 55 | 4. Zalogować się na konto Slack 56 | 5. 🚨 WAŻNE: Pomiędzy pierwszym modułem "New Message" a "Router" znajduje się filtr, na który należy kliknąć i ustawić w nim warunki sprawdzające, czy wiadomość pochodzi od naszego bota (można to zrobić na podstawie identyfikatora). Jest to konieczne, aby uniknąć ciągłego wysyłania wiadomości. 57 | 6. W module "Message JSON" należy utworzyć nową strukturę danych. Można ją utworzyć z pomocą generatora, w którym można wpisać obiekt JSON: **{"query":"..."}** 58 | 7. W module HTTP Request należy ustawić adres naszego serwera VPS oraz klucz API podany w pliku .env 59 | 60 | Wskazówka: nie musisz konfigurować serwera, aby skorzystać w make.com ze swojej aplikacji. Na potrzeby testów, możesz skorzystać z bezpłatnego planu https://ngrok.com z pomocą którego udostępnisz serwer działający na **localhost:3000** publicznie. Wystarczy polecenie: 61 | 62 | ```bash 63 | ngrok http localhost:3000 64 | ``` 65 | 66 | Wygenerowany adres URL możesz wpisać w module "Ask AI" w make.com. 67 | 68 | ![](https://cloud.overment.com/aidevs_dm-e08c8409-0.png) 69 | 70 | 71 | ## Dołącz do drugiej edycji AI_Devs 72 | 73 | Więcej na temat pracy z dużymi modelami językowymi i łączenia ich z kodem, znajdziesz w drugiej edycji AI_Devs. Dołącz do nas na https://aidevs.pl -------------------------------------------------------------------------------- /pnpm-lock.yaml: -------------------------------------------------------------------------------- 1 | lockfileVersion: '6.0' 2 | 3 | dependencies: 4 | '@types/express': 5 | specifier: ^4.17.19 6 | version: 4.17.19 7 | express: 8 | specifier: ^4.18.2 9 | version: 4.18.2 10 | hnswlib-node: 11 | specifier: ^2.0.0 12 | version: 2.0.0 13 | langchain: 14 | specifier: ^0.0.154 15 | version: 0.0.154(hnswlib-node@2.0.0) 16 | 17 | devDependencies: 18 | bun-types: 19 | specifier: latest 20 | version: 1.0.6 21 | 22 | packages: 23 | 24 | /@anthropic-ai/sdk@0.6.2: 25 | resolution: {integrity: sha512-fB9PUj9RFT+XjkL+E9Ol864ZIJi+1P8WnbHspN3N3/GK2uSzjd0cbVIKTGgf4v3N8MwaQu+UWnU7C4BG/fap/g==} 26 | dependencies: 27 | '@types/node': 18.18.5 28 | '@types/node-fetch': 2.6.6 29 | abort-controller: 3.0.0 30 | agentkeepalive: 4.5.0 31 | digest-fetch: 1.3.0 32 | form-data-encoder: 1.7.2 33 | formdata-node: 4.4.1 34 | node-fetch: 2.7.0 35 | transitivePeerDependencies: 36 | - encoding 37 | dev: false 38 | 39 | /@types/body-parser@1.19.3: 40 | resolution: {integrity: sha512-oyl4jvAfTGX9Bt6Or4H9ni1Z447/tQuxnZsytsCaExKlmJiU8sFgnIBRzJUpKwB5eWn9HuBYlUlVA74q/yN0eQ==} 41 | dependencies: 42 | '@types/connect': 3.4.36 43 | '@types/node': 20.8.5 44 | dev: false 45 | 46 | /@types/connect@3.4.36: 47 | resolution: {integrity: sha512-P63Zd/JUGq+PdrM1lv0Wv5SBYeA2+CORvbrXbngriYY0jzLUWfQMQQxOhjONEz/wlHOAxOdY7CY65rgQdTjq2w==} 48 | dependencies: 49 | '@types/node': 20.8.5 50 | dev: false 51 | 52 | /@types/express-serve-static-core@4.17.37: 53 | resolution: {integrity: sha512-ZohaCYTgGFcOP7u6aJOhY9uIZQgZ2vxC2yWoArY+FeDXlqeH66ZVBjgvg+RLVAS/DWNq4Ap9ZXu1+SUQiiWYMg==} 54 | dependencies: 55 | '@types/node': 20.8.5 56 | '@types/qs': 6.9.8 57 | '@types/range-parser': 1.2.5 58 | '@types/send': 0.17.2 59 | dev: false 60 | 61 | /@types/express@4.17.19: 62 | resolution: {integrity: sha512-UtOfBtzN9OvpZPPbnnYunfjM7XCI4jyk1NvnFhTVz5krYAnW4o5DCoIekvms+8ApqhB4+9wSge1kBijdfTSmfg==} 63 | dependencies: 64 | '@types/body-parser': 1.19.3 65 | '@types/express-serve-static-core': 4.17.37 66 | '@types/qs': 6.9.8 67 | '@types/serve-static': 1.15.3 68 | dev: false 69 | 70 | /@types/http-errors@2.0.2: 71 | resolution: {integrity: sha512-lPG6KlZs88gef6aD85z3HNkztpj7w2R7HmR3gygjfXCQmsLloWNARFkMuzKiiY8FGdh1XDpgBdrSf4aKDiA7Kg==} 72 | dev: false 73 | 74 | /@types/mime@1.3.3: 75 | resolution: {integrity: sha512-Ys+/St+2VF4+xuY6+kDIXGxbNRO0mesVg0bbxEfB97Od1Vjpjx9KD1qxs64Gcb3CWPirk9Xe+PT4YiiHQ9T+eg==} 76 | dev: false 77 | 78 | /@types/mime@3.0.2: 79 | resolution: {integrity: sha512-Wj+fqpTLtTbG7c0tH47dkahefpLKEbB+xAZuLq7b4/IDHPl/n6VoXcyUQ2bypFlbSwvCr0y+bD4euTTqTJsPxQ==} 80 | dev: false 81 | 82 | /@types/node-fetch@2.6.6: 83 | resolution: {integrity: sha512-95X8guJYhfqiuVVhRFxVQcf4hW/2bCuoPwDasMf/531STFoNoWTT7YDnWdXHEZKqAGUigmpG31r2FE70LwnzJw==} 84 | dependencies: 85 | '@types/node': 18.18.5 86 | form-data: 4.0.0 87 | dev: false 88 | 89 | /@types/node@18.18.5: 90 | resolution: {integrity: sha512-4slmbtwV59ZxitY4ixUZdy1uRLf9eSIvBWPQxNjhHYWEtn0FryfKpyS2cvADYXTayWdKEIsJengncrVvkI4I6A==} 91 | dev: false 92 | 93 | /@types/node@20.8.5: 94 | resolution: {integrity: sha512-SPlobFgbidfIeOYlzXiEjSYeIJiOCthv+9tSQVpvk4PAdIIc+2SmjNVzWXk9t0Y7dl73Zdf+OgXKHX9XtkqUpw==} 95 | dependencies: 96 | undici-types: 5.25.3 97 | dev: false 98 | 99 | /@types/qs@6.9.8: 100 | resolution: {integrity: sha512-u95svzDlTysU5xecFNTgfFG5RUWu1A9P0VzgpcIiGZA9iraHOdSzcxMxQ55DyeRaGCSxQi7LxXDI4rzq/MYfdg==} 101 | dev: false 102 | 103 | /@types/range-parser@1.2.5: 104 | resolution: {integrity: sha512-xrO9OoVPqFuYyR/loIHjnbvvyRZREYKLjxV4+dY6v3FQR3stQ9ZxIGkaclF7YhI9hfjpuTbu14hZEy94qKLtOA==} 105 | dev: false 106 | 107 | /@types/retry@0.12.0: 108 | resolution: {integrity: sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==} 109 | dev: false 110 | 111 | /@types/send@0.17.2: 112 | resolution: {integrity: sha512-aAG6yRf6r0wQ29bkS+x97BIs64ZLxeE/ARwyS6wrldMm3C1MdKwCcnnEwMC1slI8wuxJOpiUH9MioC0A0i+GJw==} 113 | dependencies: 114 | '@types/mime': 1.3.3 115 | '@types/node': 20.8.5 116 | dev: false 117 | 118 | /@types/serve-static@1.15.3: 119 | resolution: {integrity: sha512-yVRvFsEMrv7s0lGhzrggJjNOSmZCdgCjw9xWrPr/kNNLp6FaDfMC1KaYl3TSJ0c58bECwNBMoQrZJ8hA8E1eFg==} 120 | dependencies: 121 | '@types/http-errors': 2.0.2 122 | '@types/mime': 3.0.2 123 | '@types/node': 20.8.5 124 | dev: false 125 | 126 | /@types/uuid@9.0.5: 127 | resolution: {integrity: sha512-xfHdwa1FMJ082prjSJpoEI57GZITiQz10r3vEJCHa2khEFQjKy91aWKz6+zybzssCvXUwE1LQWgWVwZ4nYUvHQ==} 128 | dev: false 129 | 130 | /abort-controller@3.0.0: 131 | resolution: {integrity: sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==} 132 | engines: {node: '>=6.5'} 133 | dependencies: 134 | event-target-shim: 5.0.1 135 | dev: false 136 | 137 | /accepts@1.3.8: 138 | resolution: {integrity: sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==} 139 | engines: {node: '>= 0.6'} 140 | dependencies: 141 | mime-types: 2.1.35 142 | negotiator: 0.6.3 143 | dev: false 144 | 145 | /agentkeepalive@4.5.0: 146 | resolution: {integrity: sha512-5GG/5IbQQpC9FpkRGsSvZI5QYeSCzlJHdpBQntCsuTOxhKD8lqKhrleg2Yi7yvMIf82Ycmmqln9U8V9qwEiJew==} 147 | engines: {node: '>= 8.0.0'} 148 | dependencies: 149 | humanize-ms: 1.2.1 150 | dev: false 151 | 152 | /ansi-styles@5.2.0: 153 | resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==} 154 | engines: {node: '>=10'} 155 | dev: false 156 | 157 | /argparse@2.0.1: 158 | resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} 159 | dev: false 160 | 161 | /array-flatten@1.1.1: 162 | resolution: {integrity: sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==} 163 | dev: false 164 | 165 | /asynckit@0.4.0: 166 | resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} 167 | dev: false 168 | 169 | /base-64@0.1.0: 170 | resolution: {integrity: sha512-Y5gU45svrR5tI2Vt/X9GPd3L0HNIKzGu202EjxrXMpuc2V2CiKgemAbUUsqYmZJvPtCXoUKjNZwBJzsNScUbXA==} 171 | dev: false 172 | 173 | /base64-js@1.5.1: 174 | resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} 175 | dev: false 176 | 177 | /binary-extensions@2.2.0: 178 | resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==} 179 | engines: {node: '>=8'} 180 | dev: false 181 | 182 | /binary-search@1.3.6: 183 | resolution: {integrity: sha512-nbE1WxOTTrUWIfsfZ4aHGYu5DOuNkbxGokjV6Z2kxfJK3uaAb8zNK1muzOeipoLHZjInT4Br88BHpzevc681xA==} 184 | dev: false 185 | 186 | /bindings@1.5.0: 187 | resolution: {integrity: sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==} 188 | dependencies: 189 | file-uri-to-path: 1.0.0 190 | dev: false 191 | 192 | /body-parser@1.20.1: 193 | resolution: {integrity: sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==} 194 | engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} 195 | dependencies: 196 | bytes: 3.1.2 197 | content-type: 1.0.5 198 | debug: 2.6.9 199 | depd: 2.0.0 200 | destroy: 1.2.0 201 | http-errors: 2.0.0 202 | iconv-lite: 0.4.24 203 | on-finished: 2.4.1 204 | qs: 6.11.0 205 | raw-body: 2.5.1 206 | type-is: 1.6.18 207 | unpipe: 1.0.0 208 | transitivePeerDependencies: 209 | - supports-color 210 | dev: false 211 | 212 | /bun-types@1.0.6: 213 | resolution: {integrity: sha512-5QwynfXiRCRxPW3ZnC0Dv+sHHmctP4SHIuzsRKOWYO0HF/qUpsxQVexoviaxpmwDsF1hoVDDFdc4xUuafOzx1g==} 214 | dev: true 215 | 216 | /bytes@3.1.2: 217 | resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==} 218 | engines: {node: '>= 0.8'} 219 | dev: false 220 | 221 | /call-bind@1.0.2: 222 | resolution: {integrity: sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==} 223 | dependencies: 224 | function-bind: 1.1.2 225 | get-intrinsic: 1.2.1 226 | dev: false 227 | 228 | /camelcase@6.3.0: 229 | resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} 230 | engines: {node: '>=10'} 231 | dev: false 232 | 233 | /charenc@0.0.2: 234 | resolution: {integrity: sha512-yrLQ/yVUFXkzg7EDQsPieE/53+0RlaWTs+wBrvW36cyilJ2SaDWfl4Yj7MtLTXleV9uEKefbAGUPv2/iWSooRA==} 235 | dev: false 236 | 237 | /combined-stream@1.0.8: 238 | resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} 239 | engines: {node: '>= 0.8'} 240 | dependencies: 241 | delayed-stream: 1.0.0 242 | dev: false 243 | 244 | /commander@10.0.1: 245 | resolution: {integrity: sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==} 246 | engines: {node: '>=14'} 247 | dev: false 248 | 249 | /content-disposition@0.5.4: 250 | resolution: {integrity: sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==} 251 | engines: {node: '>= 0.6'} 252 | dependencies: 253 | safe-buffer: 5.2.1 254 | dev: false 255 | 256 | /content-type@1.0.5: 257 | resolution: {integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==} 258 | engines: {node: '>= 0.6'} 259 | dev: false 260 | 261 | /cookie-signature@1.0.6: 262 | resolution: {integrity: sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==} 263 | dev: false 264 | 265 | /cookie@0.5.0: 266 | resolution: {integrity: sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==} 267 | engines: {node: '>= 0.6'} 268 | dev: false 269 | 270 | /crypt@0.0.2: 271 | resolution: {integrity: sha512-mCxBlsHFYh9C+HVpiEacem8FEBnMXgU9gy4zmNC+SXAZNB/1idgp/aulFJ4FgCi7GPEVbfyng092GqL2k2rmow==} 272 | dev: false 273 | 274 | /debug@2.6.9: 275 | resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==} 276 | peerDependencies: 277 | supports-color: '*' 278 | peerDependenciesMeta: 279 | supports-color: 280 | optional: true 281 | dependencies: 282 | ms: 2.0.0 283 | dev: false 284 | 285 | /decamelize@1.2.0: 286 | resolution: {integrity: sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==} 287 | engines: {node: '>=0.10.0'} 288 | dev: false 289 | 290 | /delayed-stream@1.0.0: 291 | resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} 292 | engines: {node: '>=0.4.0'} 293 | dev: false 294 | 295 | /depd@2.0.0: 296 | resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==} 297 | engines: {node: '>= 0.8'} 298 | dev: false 299 | 300 | /destroy@1.2.0: 301 | resolution: {integrity: sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==} 302 | engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} 303 | dev: false 304 | 305 | /digest-fetch@1.3.0: 306 | resolution: {integrity: sha512-CGJuv6iKNM7QyZlM2T3sPAdZWd/p9zQiRNS9G+9COUCwzWFTs0Xp8NF5iePx7wtvhDykReiRRrSeNb4oMmB8lA==} 307 | dependencies: 308 | base-64: 0.1.0 309 | md5: 2.3.0 310 | dev: false 311 | 312 | /ee-first@1.1.1: 313 | resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} 314 | dev: false 315 | 316 | /encodeurl@1.0.2: 317 | resolution: {integrity: sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==} 318 | engines: {node: '>= 0.8'} 319 | dev: false 320 | 321 | /escape-html@1.0.3: 322 | resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==} 323 | dev: false 324 | 325 | /etag@1.8.1: 326 | resolution: {integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==} 327 | engines: {node: '>= 0.6'} 328 | dev: false 329 | 330 | /event-target-shim@5.0.1: 331 | resolution: {integrity: sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==} 332 | engines: {node: '>=6'} 333 | dev: false 334 | 335 | /eventemitter3@4.0.7: 336 | resolution: {integrity: sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==} 337 | dev: false 338 | 339 | /expr-eval@2.0.2: 340 | resolution: {integrity: sha512-4EMSHGOPSwAfBiibw3ndnP0AvjDWLsMvGOvWEZ2F96IGk0bIVdjQisOHxReSkE13mHcfbuCiXw+G4y0zv6N8Eg==} 341 | dev: false 342 | 343 | /express@4.18.2: 344 | resolution: {integrity: sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==} 345 | engines: {node: '>= 0.10.0'} 346 | dependencies: 347 | accepts: 1.3.8 348 | array-flatten: 1.1.1 349 | body-parser: 1.20.1 350 | content-disposition: 0.5.4 351 | content-type: 1.0.5 352 | cookie: 0.5.0 353 | cookie-signature: 1.0.6 354 | debug: 2.6.9 355 | depd: 2.0.0 356 | encodeurl: 1.0.2 357 | escape-html: 1.0.3 358 | etag: 1.8.1 359 | finalhandler: 1.2.0 360 | fresh: 0.5.2 361 | http-errors: 2.0.0 362 | merge-descriptors: 1.0.1 363 | methods: 1.1.2 364 | on-finished: 2.4.1 365 | parseurl: 1.3.3 366 | path-to-regexp: 0.1.7 367 | proxy-addr: 2.0.7 368 | qs: 6.11.0 369 | range-parser: 1.2.1 370 | safe-buffer: 5.2.1 371 | send: 0.18.0 372 | serve-static: 1.15.0 373 | setprototypeof: 1.2.0 374 | statuses: 2.0.1 375 | type-is: 1.6.18 376 | utils-merge: 1.0.1 377 | vary: 1.1.2 378 | transitivePeerDependencies: 379 | - supports-color 380 | dev: false 381 | 382 | /file-uri-to-path@1.0.0: 383 | resolution: {integrity: sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==} 384 | dev: false 385 | 386 | /finalhandler@1.2.0: 387 | resolution: {integrity: sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==} 388 | engines: {node: '>= 0.8'} 389 | dependencies: 390 | debug: 2.6.9 391 | encodeurl: 1.0.2 392 | escape-html: 1.0.3 393 | on-finished: 2.4.1 394 | parseurl: 1.3.3 395 | statuses: 2.0.1 396 | unpipe: 1.0.0 397 | transitivePeerDependencies: 398 | - supports-color 399 | dev: false 400 | 401 | /flat@5.0.2: 402 | resolution: {integrity: sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==} 403 | hasBin: true 404 | dev: false 405 | 406 | /form-data-encoder@1.7.2: 407 | resolution: {integrity: sha512-qfqtYan3rxrnCk1VYaA4H+Ms9xdpPqvLZa6xmMgFvhO32x7/3J/ExcTd6qpxM0vH2GdMI+poehyBZvqfMTto8A==} 408 | dev: false 409 | 410 | /form-data@4.0.0: 411 | resolution: {integrity: sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==} 412 | engines: {node: '>= 6'} 413 | dependencies: 414 | asynckit: 0.4.0 415 | combined-stream: 1.0.8 416 | mime-types: 2.1.35 417 | dev: false 418 | 419 | /formdata-node@4.4.1: 420 | resolution: {integrity: sha512-0iirZp3uVDjVGt9p49aTaqjk84TrglENEDuqfdlZQ1roC9CWlPk6Avf8EEnZNcAqPonwkG35x4n3ww/1THYAeQ==} 421 | engines: {node: '>= 12.20'} 422 | dependencies: 423 | node-domexception: 1.0.0 424 | web-streams-polyfill: 4.0.0-beta.3 425 | dev: false 426 | 427 | /forwarded@0.2.0: 428 | resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==} 429 | engines: {node: '>= 0.6'} 430 | dev: false 431 | 432 | /fresh@0.5.2: 433 | resolution: {integrity: sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==} 434 | engines: {node: '>= 0.6'} 435 | dev: false 436 | 437 | /function-bind@1.1.2: 438 | resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} 439 | dev: false 440 | 441 | /get-intrinsic@1.2.1: 442 | resolution: {integrity: sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==} 443 | dependencies: 444 | function-bind: 1.1.2 445 | has: 1.0.4 446 | has-proto: 1.0.1 447 | has-symbols: 1.0.3 448 | dev: false 449 | 450 | /has-proto@1.0.1: 451 | resolution: {integrity: sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==} 452 | engines: {node: '>= 0.4'} 453 | dev: false 454 | 455 | /has-symbols@1.0.3: 456 | resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==} 457 | engines: {node: '>= 0.4'} 458 | dev: false 459 | 460 | /has@1.0.4: 461 | resolution: {integrity: sha512-qdSAmqLF6209RFj4VVItywPMbm3vWylknmB3nvNiUIs72xAimcM8nVYxYr7ncvZq5qzk9MKIZR8ijqD/1QuYjQ==} 462 | engines: {node: '>= 0.4.0'} 463 | dev: false 464 | 465 | /hnswlib-node@2.0.0: 466 | resolution: {integrity: sha512-ib5c5m5JSW0w/8CfufAozrgXSGnWizH62YZkd2JvGVCi2OE45jQZmtQzh5aXszQiJTr8+6bMxnN/Qo2w4e+Z4A==} 467 | requiresBuild: true 468 | dependencies: 469 | bindings: 1.5.0 470 | node-addon-api: 7.0.0 471 | dev: false 472 | 473 | /http-errors@2.0.0: 474 | resolution: {integrity: sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==} 475 | engines: {node: '>= 0.8'} 476 | dependencies: 477 | depd: 2.0.0 478 | inherits: 2.0.4 479 | setprototypeof: 1.2.0 480 | statuses: 2.0.1 481 | toidentifier: 1.0.1 482 | dev: false 483 | 484 | /humanize-ms@1.2.1: 485 | resolution: {integrity: sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==} 486 | dependencies: 487 | ms: 2.1.3 488 | dev: false 489 | 490 | /iconv-lite@0.4.24: 491 | resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} 492 | engines: {node: '>=0.10.0'} 493 | dependencies: 494 | safer-buffer: 2.1.2 495 | dev: false 496 | 497 | /inherits@2.0.4: 498 | resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} 499 | dev: false 500 | 501 | /ipaddr.js@1.9.1: 502 | resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==} 503 | engines: {node: '>= 0.10'} 504 | dev: false 505 | 506 | /is-any-array@2.0.1: 507 | resolution: {integrity: sha512-UtilS7hLRu++wb/WBAw9bNuP1Eg04Ivn1vERJck8zJthEvXCBEBpGR/33u/xLKWEQf95803oalHrVDptcAvFdQ==} 508 | dev: false 509 | 510 | /is-buffer@1.1.6: 511 | resolution: {integrity: sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==} 512 | dev: false 513 | 514 | /js-tiktoken@1.0.7: 515 | resolution: {integrity: sha512-biba8u/clw7iesNEWLOLwrNGoBP2lA+hTaBLs/D45pJdUPFXyxD6nhcDVtADChghv4GgyAiMKYMiRx7x6h7Biw==} 516 | dependencies: 517 | base64-js: 1.5.1 518 | dev: false 519 | 520 | /js-yaml@4.1.0: 521 | resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} 522 | hasBin: true 523 | dependencies: 524 | argparse: 2.0.1 525 | dev: false 526 | 527 | /jsonpointer@5.0.1: 528 | resolution: {integrity: sha512-p/nXbhSEcu3pZRdkW1OfJhpsVtW1gd4Wa1fnQc9YLiTfAjn0312eMKimbdIQzuZl9aa9xUGaRlP9T/CJE/ditQ==} 529 | engines: {node: '>=0.10.0'} 530 | dev: false 531 | 532 | /langchain@0.0.154(hnswlib-node@2.0.0): 533 | resolution: {integrity: sha512-BnUvUZ9OBL/0BM4jhy53H8RF8+AmisrJq3tvNks6U/ueFC9ZKG9r4U9zqjwM2dTaWjW+oN3ig83Ioa9Y7d6ZFw==} 534 | engines: {node: '>=18'} 535 | peerDependencies: 536 | '@aws-crypto/sha256-js': ^5.0.0 537 | '@aws-sdk/client-dynamodb': ^3.310.0 538 | '@aws-sdk/client-kendra': ^3.352.0 539 | '@aws-sdk/client-lambda': ^3.310.0 540 | '@aws-sdk/client-s3': ^3.310.0 541 | '@aws-sdk/client-sagemaker-runtime': ^3.310.0 542 | '@aws-sdk/client-sfn': ^3.310.0 543 | '@aws-sdk/credential-provider-node': ^3.388.0 544 | '@aws-sdk/protocol-http': ^3.374.0 545 | '@aws-sdk/signature-v4': ^3.374.0 546 | '@azure/storage-blob': ^12.15.0 547 | '@clickhouse/client': ^0.0.14 548 | '@cloudflare/workers-types': ^4.20230904.0 549 | '@elastic/elasticsearch': ^8.4.0 550 | '@getmetal/metal-sdk': '*' 551 | '@getzep/zep-js': ^0.7.0 552 | '@gomomento/sdk': ^1.23.0 553 | '@google-ai/generativelanguage': ^0.2.1 554 | '@google-cloud/storage': ^6.10.1 555 | '@huggingface/inference': ^1.5.1 556 | '@mozilla/readability': '*' 557 | '@notionhq/client': ^2.2.10 558 | '@opensearch-project/opensearch': '*' 559 | '@pinecone-database/pinecone': '*' 560 | '@planetscale/database': ^1.8.0 561 | '@qdrant/js-client-rest': ^1.2.0 562 | '@raycast/api': ^1.55.2 563 | '@smithy/eventstream-codec': ^2.0.5 564 | '@smithy/util-utf8': ^2.0.0 565 | '@supabase/postgrest-js': ^1.1.1 566 | '@supabase/supabase-js': ^2.10.0 567 | '@tensorflow-models/universal-sentence-encoder': '*' 568 | '@tensorflow/tfjs-converter': '*' 569 | '@tensorflow/tfjs-core': '*' 570 | '@upstash/redis': ^1.20.6 571 | '@writerai/writer-sdk': ^0.40.2 572 | '@xata.io/client': ^0.25.1 573 | '@xenova/transformers': ^2.5.4 574 | '@zilliz/milvus2-sdk-node': '>=2.2.7' 575 | apify-client: ^2.7.1 576 | axios: '*' 577 | cheerio: ^1.0.0-rc.12 578 | chromadb: '*' 579 | cohere-ai: '>=6.0.0' 580 | d3-dsv: ^2.0.0 581 | epub2: ^3.0.1 582 | faiss-node: ^0.3.0 583 | fast-xml-parser: ^4.2.7 584 | firebase-admin: ^11.9.0 585 | google-auth-library: ^8.9.0 586 | hnswlib-node: ^1.4.2 587 | html-to-text: ^9.0.5 588 | ignore: ^5.2.0 589 | ioredis: ^5.3.2 590 | jsdom: '*' 591 | llmonitor: '*' 592 | mammoth: '*' 593 | mongodb: ^5.2.0 594 | mysql2: ^3.3.3 595 | node-llama-cpp: '*' 596 | notion-to-md: ^3.1.0 597 | pdf-parse: 1.1.1 598 | peggy: ^3.0.2 599 | pg: ^8.11.0 600 | pg-copy-streams: ^6.0.5 601 | pickleparser: ^0.1.0 602 | playwright: ^1.32.1 603 | puppeteer: ^19.7.2 604 | redis: ^4.6.4 605 | replicate: ^0.18.0 606 | sonix-speech-recognition: ^2.1.1 607 | srt-parser-2: ^1.2.2 608 | typeorm: ^0.3.12 609 | typesense: ^1.5.3 610 | usearch: ^1.1.1 611 | vectordb: ^0.1.4 612 | voy-search: 0.6.2 613 | weaviate-ts-client: ^1.4.0 614 | web-auth-library: ^1.0.3 615 | youtube-transcript: ^1.0.6 616 | youtubei.js: ^5.8.0 617 | peerDependenciesMeta: 618 | '@aws-crypto/sha256-js': 619 | optional: true 620 | '@aws-sdk/client-dynamodb': 621 | optional: true 622 | '@aws-sdk/client-kendra': 623 | optional: true 624 | '@aws-sdk/client-lambda': 625 | optional: true 626 | '@aws-sdk/client-s3': 627 | optional: true 628 | '@aws-sdk/client-sagemaker-runtime': 629 | optional: true 630 | '@aws-sdk/client-sfn': 631 | optional: true 632 | '@aws-sdk/credential-provider-node': 633 | optional: true 634 | '@aws-sdk/protocol-http': 635 | optional: true 636 | '@aws-sdk/signature-v4': 637 | optional: true 638 | '@azure/storage-blob': 639 | optional: true 640 | '@clickhouse/client': 641 | optional: true 642 | '@cloudflare/workers-types': 643 | optional: true 644 | '@elastic/elasticsearch': 645 | optional: true 646 | '@getmetal/metal-sdk': 647 | optional: true 648 | '@getzep/zep-js': 649 | optional: true 650 | '@gomomento/sdk': 651 | optional: true 652 | '@google-ai/generativelanguage': 653 | optional: true 654 | '@google-cloud/storage': 655 | optional: true 656 | '@huggingface/inference': 657 | optional: true 658 | '@mozilla/readability': 659 | optional: true 660 | '@notionhq/client': 661 | optional: true 662 | '@opensearch-project/opensearch': 663 | optional: true 664 | '@pinecone-database/pinecone': 665 | optional: true 666 | '@planetscale/database': 667 | optional: true 668 | '@qdrant/js-client-rest': 669 | optional: true 670 | '@raycast/api': 671 | optional: true 672 | '@smithy/eventstream-codec': 673 | optional: true 674 | '@smithy/util-utf8': 675 | optional: true 676 | '@supabase/postgrest-js': 677 | optional: true 678 | '@supabase/supabase-js': 679 | optional: true 680 | '@tensorflow-models/universal-sentence-encoder': 681 | optional: true 682 | '@tensorflow/tfjs-converter': 683 | optional: true 684 | '@tensorflow/tfjs-core': 685 | optional: true 686 | '@upstash/redis': 687 | optional: true 688 | '@writerai/writer-sdk': 689 | optional: true 690 | '@xata.io/client': 691 | optional: true 692 | '@xenova/transformers': 693 | optional: true 694 | '@zilliz/milvus2-sdk-node': 695 | optional: true 696 | apify-client: 697 | optional: true 698 | axios: 699 | optional: true 700 | cheerio: 701 | optional: true 702 | chromadb: 703 | optional: true 704 | cohere-ai: 705 | optional: true 706 | d3-dsv: 707 | optional: true 708 | epub2: 709 | optional: true 710 | faiss-node: 711 | optional: true 712 | fast-xml-parser: 713 | optional: true 714 | firebase-admin: 715 | optional: true 716 | google-auth-library: 717 | optional: true 718 | hnswlib-node: 719 | optional: true 720 | html-to-text: 721 | optional: true 722 | ignore: 723 | optional: true 724 | ioredis: 725 | optional: true 726 | jsdom: 727 | optional: true 728 | llmonitor: 729 | optional: true 730 | mammoth: 731 | optional: true 732 | mongodb: 733 | optional: true 734 | mysql2: 735 | optional: true 736 | node-llama-cpp: 737 | optional: true 738 | notion-to-md: 739 | optional: true 740 | pdf-parse: 741 | optional: true 742 | peggy: 743 | optional: true 744 | pg: 745 | optional: true 746 | pg-copy-streams: 747 | optional: true 748 | pickleparser: 749 | optional: true 750 | playwright: 751 | optional: true 752 | puppeteer: 753 | optional: true 754 | redis: 755 | optional: true 756 | replicate: 757 | optional: true 758 | sonix-speech-recognition: 759 | optional: true 760 | srt-parser-2: 761 | optional: true 762 | typeorm: 763 | optional: true 764 | typesense: 765 | optional: true 766 | usearch: 767 | optional: true 768 | vectordb: 769 | optional: true 770 | voy-search: 771 | optional: true 772 | weaviate-ts-client: 773 | optional: true 774 | web-auth-library: 775 | optional: true 776 | youtube-transcript: 777 | optional: true 778 | youtubei.js: 779 | optional: true 780 | dependencies: 781 | '@anthropic-ai/sdk': 0.6.2 782 | ansi-styles: 5.2.0 783 | binary-extensions: 2.2.0 784 | camelcase: 6.3.0 785 | decamelize: 1.2.0 786 | expr-eval: 2.0.2 787 | flat: 5.0.2 788 | hnswlib-node: 2.0.0 789 | js-tiktoken: 1.0.7 790 | js-yaml: 4.1.0 791 | jsonpointer: 5.0.1 792 | langchainhub: 0.0.6 793 | langsmith: 0.0.42 794 | ml-distance: 4.0.1 795 | object-hash: 3.0.0 796 | openai: 4.4.0 797 | openapi-types: 12.1.3 798 | p-queue: 6.6.2 799 | p-retry: 4.6.2 800 | uuid: 9.0.1 801 | yaml: 2.3.2 802 | zod: 3.22.4 803 | zod-to-json-schema: 3.21.4(zod@3.22.4) 804 | transitivePeerDependencies: 805 | - encoding 806 | dev: false 807 | 808 | /langchainhub@0.0.6: 809 | resolution: {integrity: sha512-SW6105T+YP1cTe0yMf//7kyshCgvCTyFBMTgH2H3s9rTAR4e+78DA/BBrUL/Mt4Q5eMWui7iGuAYb3pgGsdQ9w==} 810 | dev: false 811 | 812 | /langsmith@0.0.42: 813 | resolution: {integrity: sha512-sFuN+e7E+pPBIRaRgFqZh/BRBWNHTZNAwi6uj4kydQawooCZYoJmM5snOkiQrhVSvAhgu6xFhLvmfvkPcKzD7w==} 814 | hasBin: true 815 | dependencies: 816 | '@types/uuid': 9.0.5 817 | commander: 10.0.1 818 | p-queue: 6.6.2 819 | p-retry: 4.6.2 820 | uuid: 9.0.1 821 | dev: false 822 | 823 | /md5@2.3.0: 824 | resolution: {integrity: sha512-T1GITYmFaKuO91vxyoQMFETst+O71VUPEU3ze5GNzDm0OWdP8v1ziTaAEPUr/3kLsY3Sftgz242A1SetQiDL7g==} 825 | dependencies: 826 | charenc: 0.0.2 827 | crypt: 0.0.2 828 | is-buffer: 1.1.6 829 | dev: false 830 | 831 | /media-typer@0.3.0: 832 | resolution: {integrity: sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==} 833 | engines: {node: '>= 0.6'} 834 | dev: false 835 | 836 | /merge-descriptors@1.0.1: 837 | resolution: {integrity: sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==} 838 | dev: false 839 | 840 | /methods@1.1.2: 841 | resolution: {integrity: sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==} 842 | engines: {node: '>= 0.6'} 843 | dev: false 844 | 845 | /mime-db@1.52.0: 846 | resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} 847 | engines: {node: '>= 0.6'} 848 | dev: false 849 | 850 | /mime-types@2.1.35: 851 | resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} 852 | engines: {node: '>= 0.6'} 853 | dependencies: 854 | mime-db: 1.52.0 855 | dev: false 856 | 857 | /mime@1.6.0: 858 | resolution: {integrity: sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==} 859 | engines: {node: '>=4'} 860 | hasBin: true 861 | dev: false 862 | 863 | /ml-array-mean@1.1.6: 864 | resolution: {integrity: sha512-MIdf7Zc8HznwIisyiJGRH9tRigg3Yf4FldW8DxKxpCCv/g5CafTw0RRu51nojVEOXuCQC7DRVVu5c7XXO/5joQ==} 865 | dependencies: 866 | ml-array-sum: 1.1.6 867 | dev: false 868 | 869 | /ml-array-sum@1.1.6: 870 | resolution: {integrity: sha512-29mAh2GwH7ZmiRnup4UyibQZB9+ZLyMShvt4cH4eTK+cL2oEMIZFnSyB3SS8MlsTh6q/w/yh48KmqLxmovN4Dw==} 871 | dependencies: 872 | is-any-array: 2.0.1 873 | dev: false 874 | 875 | /ml-distance-euclidean@2.0.0: 876 | resolution: {integrity: sha512-yC9/2o8QF0A3m/0IXqCTXCzz2pNEzvmcE/9HFKOZGnTjatvBbsn4lWYJkxENkA4Ug2fnYl7PXQxnPi21sgMy/Q==} 877 | dev: false 878 | 879 | /ml-distance@4.0.1: 880 | resolution: {integrity: sha512-feZ5ziXs01zhyFUUUeZV5hwc0f5JW0Sh0ckU1koZe/wdVkJdGxcP06KNQuF0WBTj8FttQUzcvQcpcrOp/XrlEw==} 881 | dependencies: 882 | ml-array-mean: 1.1.6 883 | ml-distance-euclidean: 2.0.0 884 | ml-tree-similarity: 1.0.0 885 | dev: false 886 | 887 | /ml-tree-similarity@1.0.0: 888 | resolution: {integrity: sha512-XJUyYqjSuUQkNQHMscr6tcjldsOoAekxADTplt40QKfwW6nd++1wHWV9AArl0Zvw/TIHgNaZZNvr8QGvE8wLRg==} 889 | dependencies: 890 | binary-search: 1.3.6 891 | num-sort: 2.1.0 892 | dev: false 893 | 894 | /ms@2.0.0: 895 | resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==} 896 | dev: false 897 | 898 | /ms@2.1.3: 899 | resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} 900 | dev: false 901 | 902 | /negotiator@0.6.3: 903 | resolution: {integrity: sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==} 904 | engines: {node: '>= 0.6'} 905 | dev: false 906 | 907 | /node-addon-api@7.0.0: 908 | resolution: {integrity: sha512-vgbBJTS4m5/KkE16t5Ly0WW9hz46swAstv0hYYwMtbG7AznRhNyfLRe8HZAiWIpcHzoO7HxhLuBQj9rJ/Ho0ZA==} 909 | dev: false 910 | 911 | /node-domexception@1.0.0: 912 | resolution: {integrity: sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==} 913 | engines: {node: '>=10.5.0'} 914 | dev: false 915 | 916 | /node-fetch@2.7.0: 917 | resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==} 918 | engines: {node: 4.x || >=6.0.0} 919 | peerDependencies: 920 | encoding: ^0.1.0 921 | peerDependenciesMeta: 922 | encoding: 923 | optional: true 924 | dependencies: 925 | whatwg-url: 5.0.0 926 | dev: false 927 | 928 | /num-sort@2.1.0: 929 | resolution: {integrity: sha512-1MQz1Ed8z2yckoBeSfkQHHO9K1yDRxxtotKSJ9yvcTUUxSvfvzEq5GwBrjjHEpMlq/k5gvXdmJ1SbYxWtpNoVg==} 930 | engines: {node: '>=8'} 931 | dev: false 932 | 933 | /object-hash@3.0.0: 934 | resolution: {integrity: sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==} 935 | engines: {node: '>= 6'} 936 | dev: false 937 | 938 | /object-inspect@1.12.3: 939 | resolution: {integrity: sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==} 940 | dev: false 941 | 942 | /on-finished@2.4.1: 943 | resolution: {integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==} 944 | engines: {node: '>= 0.8'} 945 | dependencies: 946 | ee-first: 1.1.1 947 | dev: false 948 | 949 | /openai@4.4.0: 950 | resolution: {integrity: sha512-JN0t628Kh95T0IrXl0HdBqnlJg+4Vq0Bnh55tio+dfCnyzHvMLiWyCM9m726MAJD2YkDU4/8RQB6rNbEq9ct2w==} 951 | hasBin: true 952 | dependencies: 953 | '@types/node': 18.18.5 954 | '@types/node-fetch': 2.6.6 955 | abort-controller: 3.0.0 956 | agentkeepalive: 4.5.0 957 | digest-fetch: 1.3.0 958 | form-data-encoder: 1.7.2 959 | formdata-node: 4.4.1 960 | node-fetch: 2.7.0 961 | transitivePeerDependencies: 962 | - encoding 963 | dev: false 964 | 965 | /openapi-types@12.1.3: 966 | resolution: {integrity: sha512-N4YtSYJqghVu4iek2ZUvcN/0aqH1kRDuNqzcycDxhOUpg7GdvLa2F3DgS6yBNhInhv2r/6I0Flkn7CqL8+nIcw==} 967 | dev: false 968 | 969 | /p-finally@1.0.0: 970 | resolution: {integrity: sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==} 971 | engines: {node: '>=4'} 972 | dev: false 973 | 974 | /p-queue@6.6.2: 975 | resolution: {integrity: sha512-RwFpb72c/BhQLEXIZ5K2e+AhgNVmIejGlTgiB9MzZ0e93GRvqZ7uSi0dvRF7/XIXDeNkra2fNHBxTyPDGySpjQ==} 976 | engines: {node: '>=8'} 977 | dependencies: 978 | eventemitter3: 4.0.7 979 | p-timeout: 3.2.0 980 | dev: false 981 | 982 | /p-retry@4.6.2: 983 | resolution: {integrity: sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ==} 984 | engines: {node: '>=8'} 985 | dependencies: 986 | '@types/retry': 0.12.0 987 | retry: 0.13.1 988 | dev: false 989 | 990 | /p-timeout@3.2.0: 991 | resolution: {integrity: sha512-rhIwUycgwwKcP9yTOOFK/AKsAopjjCakVqLHePO3CC6Mir1Z99xT+R63jZxAT5lFZLa2inS5h+ZS2GvR99/FBg==} 992 | engines: {node: '>=8'} 993 | dependencies: 994 | p-finally: 1.0.0 995 | dev: false 996 | 997 | /parseurl@1.3.3: 998 | resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==} 999 | engines: {node: '>= 0.8'} 1000 | dev: false 1001 | 1002 | /path-to-regexp@0.1.7: 1003 | resolution: {integrity: sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==} 1004 | dev: false 1005 | 1006 | /proxy-addr@2.0.7: 1007 | resolution: {integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==} 1008 | engines: {node: '>= 0.10'} 1009 | dependencies: 1010 | forwarded: 0.2.0 1011 | ipaddr.js: 1.9.1 1012 | dev: false 1013 | 1014 | /qs@6.11.0: 1015 | resolution: {integrity: sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==} 1016 | engines: {node: '>=0.6'} 1017 | dependencies: 1018 | side-channel: 1.0.4 1019 | dev: false 1020 | 1021 | /range-parser@1.2.1: 1022 | resolution: {integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==} 1023 | engines: {node: '>= 0.6'} 1024 | dev: false 1025 | 1026 | /raw-body@2.5.1: 1027 | resolution: {integrity: sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==} 1028 | engines: {node: '>= 0.8'} 1029 | dependencies: 1030 | bytes: 3.1.2 1031 | http-errors: 2.0.0 1032 | iconv-lite: 0.4.24 1033 | unpipe: 1.0.0 1034 | dev: false 1035 | 1036 | /retry@0.13.1: 1037 | resolution: {integrity: sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==} 1038 | engines: {node: '>= 4'} 1039 | dev: false 1040 | 1041 | /safe-buffer@5.2.1: 1042 | resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} 1043 | dev: false 1044 | 1045 | /safer-buffer@2.1.2: 1046 | resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} 1047 | dev: false 1048 | 1049 | /send@0.18.0: 1050 | resolution: {integrity: sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==} 1051 | engines: {node: '>= 0.8.0'} 1052 | dependencies: 1053 | debug: 2.6.9 1054 | depd: 2.0.0 1055 | destroy: 1.2.0 1056 | encodeurl: 1.0.2 1057 | escape-html: 1.0.3 1058 | etag: 1.8.1 1059 | fresh: 0.5.2 1060 | http-errors: 2.0.0 1061 | mime: 1.6.0 1062 | ms: 2.1.3 1063 | on-finished: 2.4.1 1064 | range-parser: 1.2.1 1065 | statuses: 2.0.1 1066 | transitivePeerDependencies: 1067 | - supports-color 1068 | dev: false 1069 | 1070 | /serve-static@1.15.0: 1071 | resolution: {integrity: sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==} 1072 | engines: {node: '>= 0.8.0'} 1073 | dependencies: 1074 | encodeurl: 1.0.2 1075 | escape-html: 1.0.3 1076 | parseurl: 1.3.3 1077 | send: 0.18.0 1078 | transitivePeerDependencies: 1079 | - supports-color 1080 | dev: false 1081 | 1082 | /setprototypeof@1.2.0: 1083 | resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} 1084 | dev: false 1085 | 1086 | /side-channel@1.0.4: 1087 | resolution: {integrity: sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==} 1088 | dependencies: 1089 | call-bind: 1.0.2 1090 | get-intrinsic: 1.2.1 1091 | object-inspect: 1.12.3 1092 | dev: false 1093 | 1094 | /statuses@2.0.1: 1095 | resolution: {integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==} 1096 | engines: {node: '>= 0.8'} 1097 | dev: false 1098 | 1099 | /toidentifier@1.0.1: 1100 | resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==} 1101 | engines: {node: '>=0.6'} 1102 | dev: false 1103 | 1104 | /tr46@0.0.3: 1105 | resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} 1106 | dev: false 1107 | 1108 | /type-is@1.6.18: 1109 | resolution: {integrity: sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==} 1110 | engines: {node: '>= 0.6'} 1111 | dependencies: 1112 | media-typer: 0.3.0 1113 | mime-types: 2.1.35 1114 | dev: false 1115 | 1116 | /undici-types@5.25.3: 1117 | resolution: {integrity: sha512-Ga1jfYwRn7+cP9v8auvEXN1rX3sWqlayd4HP7OKk4mZWylEmu3KzXDUGrQUN6Ol7qo1gPvB2e5gX6udnyEPgdA==} 1118 | dev: false 1119 | 1120 | /unpipe@1.0.0: 1121 | resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==} 1122 | engines: {node: '>= 0.8'} 1123 | dev: false 1124 | 1125 | /utils-merge@1.0.1: 1126 | resolution: {integrity: sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==} 1127 | engines: {node: '>= 0.4.0'} 1128 | dev: false 1129 | 1130 | /uuid@9.0.1: 1131 | resolution: {integrity: sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==} 1132 | hasBin: true 1133 | dev: false 1134 | 1135 | /vary@1.1.2: 1136 | resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} 1137 | engines: {node: '>= 0.8'} 1138 | dev: false 1139 | 1140 | /web-streams-polyfill@4.0.0-beta.3: 1141 | resolution: {integrity: sha512-QW95TCTaHmsYfHDybGMwO5IJIM93I/6vTRk+daHTWFPhwh+C8Cg7j7XyKrwrj8Ib6vYXe0ocYNrmzY4xAAN6ug==} 1142 | engines: {node: '>= 14'} 1143 | dev: false 1144 | 1145 | /webidl-conversions@3.0.1: 1146 | resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} 1147 | dev: false 1148 | 1149 | /whatwg-url@5.0.0: 1150 | resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} 1151 | dependencies: 1152 | tr46: 0.0.3 1153 | webidl-conversions: 3.0.1 1154 | dev: false 1155 | 1156 | /yaml@2.3.2: 1157 | resolution: {integrity: sha512-N/lyzTPaJasoDmfV7YTrYCI0G/3ivm/9wdG0aHuheKowWQwGTsK0Eoiw6utmzAnI6pkJa0DUVygvp3spqqEKXg==} 1158 | engines: {node: '>= 14'} 1159 | dev: false 1160 | 1161 | /zod-to-json-schema@3.21.4(zod@3.22.4): 1162 | resolution: {integrity: sha512-fjUZh4nQ1s6HMccgIeE0VP4QG/YRGPmyjO9sAh890aQKPEk3nqbfUXhMFaC+Dr5KvYBm8BCyvfpZf2jY9aGSsw==} 1163 | peerDependencies: 1164 | zod: ^3.21.4 1165 | dependencies: 1166 | zod: 3.22.4 1167 | dev: false 1168 | 1169 | /zod@3.22.4: 1170 | resolution: {integrity: sha512-iC+8Io04lddc+mVqQ9AZ7OQ2MrUKGN+oIQyq1vemgt46jwCwLfhq7/pwnBnNXXXZb8VTVLKwp9EDkx+ryxIWmg==} 1171 | dev: false 1172 | --------------------------------------------------------------------------------