diff --git a/examples/with-lancedb/.env.example b/examples/with-lancedb/.env.example new file mode 100644 index 000000000..32ccdc476 --- /dev/null +++ b/examples/with-lancedb/.env.example @@ -0,0 +1,4 @@ +LANCEDB_URI=.voltagent/lancedb +OPENAI_API_KEY=your_openai_api_key_here +# Optional: LanceDB Cloud URI (e.g. lancedb+cloud://...) or local path +# LANCEDB_URI=.voltagent/lancedb diff --git a/examples/with-lancedb/.gitignore b/examples/with-lancedb/.gitignore new file mode 100644 index 000000000..88c7df2ec --- /dev/null +++ b/examples/with-lancedb/.gitignore @@ -0,0 +1,5 @@ +node_modules +dist +.env +.voltagent +.DS_Store diff --git a/examples/with-lancedb/README.md b/examples/with-lancedb/README.md new file mode 100644 index 000000000..de5686a16 --- /dev/null +++ b/examples/with-lancedb/README.md @@ -0,0 +1,51 @@ +# VoltAgent with LanceDB Example + +This example demonstrates how to use [LanceDB](https://lancedb.github.io/lancedb/) as a vector database/retriever within a VoltAgent application. + +## Features + +- **Local & Serverless**: Uses [LanceDB](https://lancedb.github.io/lancedb/) which runs embedded locallyβ€”no Docker or API keys required (unless using LanceDB Cloud). +- **Multimodal Ready**: LanceDB is optimized for multimodal data (text, images, video), making this a future-proof foundation. +- **Automatic Initialization**: Automatically creates the knowledge base table and populates it with sample data on first run. +- **Semantic Search**: Uses OpenAI embeddings to retrieve relevant documents based on user queries. +- **Two Agent Patterns**: + 1. **Assistant with Retriever**: Automatically uses retrieved context for every message. + 2. **Assistant with Tools**: Autonomously decides when to use the retrieval tool. + +## Prerequisites + +- Node.js 20+ +- OpenAI API Key (for embeddings and LLM) + +## Getting Started + +1. **Install dependencies**: + + ```bash + npm install + ``` + +2. **Configure Environment**: + Copy `.env.example` to `.env` and add your OpenAI API Key: + + ```bash + cp .env.example .env + ``` + + Edit `.env`: + + ```env + OPENAI_API_KEY=sk-... + ``` + +3. **Run the Agent**: + ```bash + npm run dev + ``` + +## How It Works + +- The database is stored locally in `.voltagent/lancedb`. +- On startup, `src/retriever/index.ts` checks if the table exists. +- If not, it creates it and indexes the sample documents defined in the code. +- Agents can then query this local database with low latency. diff --git a/examples/with-lancedb/package.json b/examples/with-lancedb/package.json new file mode 100644 index 000000000..7aba12ed7 --- /dev/null +++ b/examples/with-lancedb/package.json @@ -0,0 +1,32 @@ +{ + "name": "voltagent-example-with-lancedb", + "version": "1.0.0", + "description": "Example demonstrating VoltAgent integration with LanceDB for serverless vector storage", + "private": true, + "main": "dist/index.js", + "type": "module", + "scripts": { + "build": "tsc", + "dev": "tsx watch --env-file=.env ./src/index.ts", + "start": "node dist/index.js" + }, + "keywords": [], + "author": "", + "license": "ISC", + "devDependencies": { + "@types/node": "^24.6.2", + "tsx": "^4.20.4", + "typescript": "^5.9.3" + }, + "dependencies": { + "@ai-sdk/openai": "^3.0.1", + "@lancedb/lancedb": "^0.23.0", + "@voltagent/core": "workspace:^", + "@voltagent/libsql": "workspace:^", + "@voltagent/logger": "workspace:^", + "@voltagent/server-hono": "workspace:^", + "ai": "^6.0.0", + "openai": "^6.15.0", + "zod": "^3.25.76" + } +} \ No newline at end of file diff --git a/examples/with-lancedb/src/index.ts b/examples/with-lancedb/src/index.ts new file mode 100644 index 000000000..e82e56ff9 --- /dev/null +++ b/examples/with-lancedb/src/index.ts @@ -0,0 +1,53 @@ +import { openai } from "@ai-sdk/openai"; +import { Agent, Memory, VoltAgent } from "@voltagent/core"; +import { LibSQLMemoryAdapter } from "@voltagent/libsql"; +import { createPinoLogger } from "@voltagent/logger"; +import { honoServer } from "@voltagent/server-hono"; + +import { retriever } from "./retriever/index.js"; + +// Create logger +const logger = createPinoLogger({ + name: "with-lancedb", + level: "info", +}); + +// Create LibSQL storage for persistent memory +const memory = new Memory({ + storage: new LibSQLMemoryAdapter({ + url: "file:./.voltagent/memory.db", + }), +}); + +// Agent 1: Automatic Retrieval +const agentWithRetriever = new Agent({ + name: "Assistant with Retriever", + instructions: + "You are a helpful assistant. You have access to a knowledge base about VoltAgent and LanceDB. You automatically retrieve relevant information to answer user questions.", + model: openai("gpt-4o-mini"), + retriever: retriever, + memory, +}); + +// Agent 2: Tool-based Retrieval +const agentWithTools = new Agent({ + name: "Assistant with Tools", + instructions: + "You represent a helpful assistant that can search the knowledge base using tools. Decide when to search based on the user's question.", + model: openai("gpt-4o-mini"), + tools: [retriever.tool], + memory, +}); + +// Initialize VoltAgent +new VoltAgent({ + agents: { + agentWithRetriever, + agentWithTools, + }, + logger, + server: honoServer({ port: 3000 }), +}); + +console.log("πŸš€ VoltAgent with LanceDB is running!"); +console.log("Try asking: 'What is VoltAgent?' or 'Tell me about LanceDB'"); diff --git a/examples/with-lancedb/src/retriever/index.ts b/examples/with-lancedb/src/retriever/index.ts new file mode 100644 index 000000000..65d5382d7 --- /dev/null +++ b/examples/with-lancedb/src/retriever/index.ts @@ -0,0 +1,173 @@ +import fs from "node:fs/promises"; +import path from "node:path"; +import { openai } from "@ai-sdk/openai"; +import { type Connection, type Table, connect } from "@lancedb/lancedb"; +import { type BaseMessage, BaseRetriever, type RetrieveOptions } from "@voltagent/core"; +import { embed } from "ai"; + +const tableName = "voltagent-knowledge-base"; +const dbUri = process.env.LANCEDB_URI || path.resolve(process.cwd(), ".voltagent/lancedb"); + +const sampleDocuments = [ + { + text: "LanceDB is a developer-friendly, serverless vector database for AI applications.", + metadata: { + category: "database", + source: "documentation", + title: "What is LanceDB", + }, + }, + { + text: "VoltAgent is an open-source TypeScript framework for building AI agents.", + metadata: { + category: "framework", + source: "documentation", + title: "What is VoltAgent", + }, + }, + { + text: "Vector embeddings capture semantic meaning in high-dimensional space.", + metadata: { + category: "concept", + source: "documentation", + title: "Vector Embeddings", + }, + }, +]; + +let db: Connection | null = null; +let table: Table | null = null; + +async function getEmbedding(text: string): Promise { + const { embedding } = await embed({ + model: openai.embedding("text-embedding-3-small"), + value: text, + }); + return embedding; +} + +// Ensure directory exists for safety (only if local path) +async function ensureDbDir() { + try { + if (!dbUri.startsWith("lancedb+")) { + await fs.mkdir(path.dirname(dbUri), { recursive: true }); + } + } catch (_e) { + // Ignore if exists + } +} + +async function initializeIndex() { + try { + await ensureDbDir(); + + db = await connect(dbUri); + console.log(`Connected to LanceDB at ${dbUri}`); + + const tableNames = await db.tableNames(); + + if (tableNames.includes(tableName)) { + table = await db.openTable(tableName); + const count = await table.countRows(); + console.log(`πŸ“‹ Table "${tableName}" exists with ${count} records`); + } else { + console.log(`πŸ“‹ Creating new table "${tableName}"...`); + console.log("πŸ“š Generating embeddings for sample documents..."); + + const recordsWithEmbeddings = []; + + for (const doc of sampleDocuments) { + try { + const vector = await getEmbedding(doc.text); + recordsWithEmbeddings.push({ + text: doc.text, + ...doc.metadata, + vector, + }); + } catch (error) { + console.error(`Error generating embedding for "${doc.metadata.title}":`, error); + } + } + + if (recordsWithEmbeddings.length > 0) { + // Create table with sample data + table = await db.createTable(tableName, recordsWithEmbeddings); + console.log(`βœ… Table "${tableName}" created with ${recordsWithEmbeddings.length} records`); + } else { + console.warn("⚠️ No embeddings generated. Table not created."); + } + } + } catch (error) { + console.error("Error initializing LanceDB:", error); + } +} + +// Start initialization +const initPromise = initializeIndex(); + +export class LanceDBRetriever extends BaseRetriever { + /** + * Retrieve documents from LanceDB based on semantic similarity + */ + async retrieve(input: string | BaseMessage[], options: RetrieveOptions): Promise { + // Ensure initialized + if (!table) { + await initPromise; + if (!table) return "Knowledge base is not initialized yet."; + } + + // Determine search text + let searchText = ""; + if (typeof input === "string") { + searchText = input; + } else if (Array.isArray(input) && input.length > 0) { + const lastMessage = input[input.length - 1]; + if (Array.isArray(lastMessage.content)) { + const textParts = lastMessage.content + .filter((part: any) => part.type === "text") + .map((part: any) => part.text); + searchText = textParts.join(" "); + } else { + searchText = lastMessage.content as string; + } + } + + try { + const queryVector = await getEmbedding(searchText); + + // Perform vector search + // Default metric is L2 (Euclidean). For normalized embeddings (like OpenAI), + // L2 corresponds to Cosine distance. + const results = await table.vectorSearch(queryVector).limit(3).toArray(); + + // Track sources in context + if (options.context && results.length > 0) { + const references = results.map((doc: any, index: number) => ({ + id: `ref-${index}`, + title: doc.title || `Document ${index + 1}`, + source: "LanceDB", + category: doc.category, + score: doc._distance, // LanceDB returns distance + })); + options.context.set("references", references); + } + + if (results.length === 0) { + return "No relevant documents found."; + } + + // Format results for the LLM + return results + .map( + (doc: any, index: number) => + `Document ${index + 1} (Title: ${doc.title}, Category: ${doc.category}):\n${doc.text}`, + ) + .join("\n\n---\n\n"); + } catch (error) { + console.error("Error retrieving documents from LanceDB:", error); + return "Error retrieving documents."; + } + } +} + +export const retriever = new LanceDBRetriever(); diff --git a/examples/with-lancedb/tsconfig.json b/examples/with-lancedb/tsconfig.json new file mode 100644 index 000000000..43e4d2939 --- /dev/null +++ b/examples/with-lancedb/tsconfig.json @@ -0,0 +1,13 @@ +{ + "extends": "../../tsconfig.json", + "compilerOptions": { + "rootDir": "./src", + "outDir": "./dist", + "noEmit": false, + "composite": false, + "incremental": true, + "tsBuildInfoFile": "./dist/.tsbuildinfo" + }, + "include": ["src/**/*"], + "exclude": ["node_modules", "dist", "**/*.test.ts", "**/*.spec.ts"] +} \ No newline at end of file diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 11cac2c8c..fa41f6707 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1273,7 +1273,7 @@ importers: version: link:../../../packages/server-hono composio-core: specifier: ^0.5.33 - version: 0.5.39(@ai-sdk/openai@3.0.1)(@cloudflare/workers-types@4.20250813.0)(@langchain/core@0.3.70)(@langchain/openai@0.6.7)(ai@6.0.3)(langchain@0.3.30)(openai@4.104.0) + version: 0.5.39(@ai-sdk/openai@3.0.1)(@cloudflare/workers-types@4.20250813.0)(@langchain/core@0.3.70)(@langchain/openai@0.6.7)(ai@6.0.3)(langchain@0.3.30)(openai@6.15.0) hono: specifier: ^4.7.7 version: 4.9.1 @@ -1513,6 +1513,46 @@ importers: specifier: ^5.8.2 version: 5.9.2 + examples/with-lancedb: + dependencies: + '@ai-sdk/openai': + specifier: ^3.0.1 + version: 3.0.1(zod@3.25.76) + '@lancedb/lancedb': + specifier: ^0.23.0 + version: 0.23.0(apache-arrow@18.1.0) + '@voltagent/core': + specifier: workspace:^ + version: link:../../packages/core + '@voltagent/libsql': + specifier: workspace:^ + version: link:../../packages/libsql + '@voltagent/logger': + specifier: workspace:^ + version: link:../../packages/logger + '@voltagent/server-hono': + specifier: workspace:^ + version: link:../../packages/server-hono + ai: + specifier: ^6.0.0 + version: 6.0.3(zod@3.25.76) + openai: + specifier: ^6.15.0 + version: 6.15.0(zod@3.25.76) + zod: + specifier: ^3.25.76 + version: 3.25.76 + devDependencies: + '@types/node': + specifier: ^24.6.2 + version: 24.6.2 + tsx: + specifier: ^4.20.4 + version: 4.20.4 + typescript: + specifier: ^5.9.3 + version: 5.9.3 + examples/with-langfuse: dependencies: '@ai-sdk/openai': @@ -1889,10 +1929,10 @@ importers: version: 3.0.1(zod@3.25.76) '@nuxt/eslint': specifier: ^1.9.0 - version: 1.9.0(@vue/compiler-sfc@3.5.22)(eslint@9.33.0)(typescript@5.9.2)(vite@7.2.7) + version: 1.9.0(@vue/compiler-sfc@3.5.22)(eslint@9.33.0)(typescript@5.9.3)(vite@7.2.7) '@nuxt/ui': specifier: ^4.0.0 - version: 4.0.1(embla-carousel@8.6.0)(typescript@5.9.2)(vite@7.2.7)(vue-router@4.5.1)(vue@3.5.22)(zod@3.25.76) + version: 4.0.1(embla-carousel@8.6.0)(typescript@5.9.3)(vite@7.2.7)(vue-router@4.5.1)(vue@3.5.22)(zod@3.25.76) '@voltagent/core': specifier: ^2.0.5 version: link:../../packages/core @@ -1907,10 +1947,10 @@ importers: version: 6.0.3(zod@3.25.76) nuxt: specifier: ^4.1.2 - version: 4.1.3(@biomejs/biome@1.9.4)(@types/node@24.2.1)(@vue/compiler-sfc@3.5.22)(eslint@9.33.0)(typescript@5.9.2)(vite@7.2.7) + version: 4.1.3(@biomejs/biome@1.9.4)(@types/node@24.2.1)(@vue/compiler-sfc@3.5.22)(eslint@9.33.0)(typescript@5.9.3)(vite@7.2.7) vue: specifier: ^3.5.22 - version: 3.5.22(typescript@5.9.2) + version: 3.5.22(typescript@5.9.3) vue-router: specifier: ^4.5.1 version: 4.5.1(vue@3.5.22) @@ -3583,7 +3623,7 @@ importers: version: 29.7.0(@types/node@24.2.1) ts-jest: specifier: ^29.1.0 - version: 29.4.1(@babel/core@7.28.5)(esbuild@0.25.10)(jest@29.7.0)(typescript@5.9.2) + version: 29.4.1(@babel/core@7.28.5)(esbuild@0.25.10)(jest@29.7.0)(typescript@5.9.3) packages/docs-mcp: dependencies: @@ -4490,7 +4530,7 @@ packages: zod: ^3.25.76 || ^4.1.8 dependencies: '@ai-sdk/provider': 2.0.0 - '@standard-schema/spec': 1.0.0 + '@standard-schema/spec': 1.1.0 eventsource-parser: 3.0.6 zod: 3.25.76 @@ -4668,7 +4708,7 @@ packages: '@ai-sdk/provider': 1.1.3 '@ai-sdk/provider-utils': 2.2.8(zod@3.25.76) zod: 3.25.76 - zod-to-json-schema: 3.25.0(zod@3.25.76) + zod-to-json-schema: 3.25.1(zod@3.25.76) dev: false /@ai-sdk/vue@2.0.63(vue@3.5.22)(zod@3.25.76): @@ -4686,7 +4726,7 @@ packages: '@ai-sdk/provider-utils': 3.0.11(zod@3.25.76) ai: 5.0.63(zod@3.25.76) swrv: 1.1.0(vue@3.5.22) - vue: 3.5.22(typescript@5.9.2) + vue: 3.5.22(typescript@5.9.3) zod: 3.25.76 dev: false @@ -5442,7 +5482,7 @@ packages: resolution: {integrity: sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==} engines: {node: '>=6.9.0'} dependencies: - '@babel/helper-validator-identifier': 7.27.1 + '@babel/helper-validator-identifier': 7.28.5 js-tokens: 4.0.0 picocolors: 1.1.1 dev: true @@ -5518,8 +5558,8 @@ packages: resolution: {integrity: sha512-3lSpxGgvnmZznmBkCRnVREPUFJv2wrv9iAoFDvADJc0ypmdOxdUtcLeBgBJ6zE0PMeTKnxeQzyk0xTBq4Ep7zw==} engines: {node: '>=6.9.0'} dependencies: - '@babel/parser': 7.28.4 - '@babel/types': 7.28.4 + '@babel/parser': 7.28.5 + '@babel/types': 7.28.5 '@jridgewell/gen-mapping': 0.3.13 '@jridgewell/trace-mapping': 0.3.30 jsesc: 3.1.0 @@ -5538,7 +5578,7 @@ packages: resolution: {integrity: sha512-fXSwMQqitTGeHLBC08Eq5yXz2m37E4pJX1qAU1+2cNedz/ifv/bVXft90VeSav5nFO61EcNgwr0aJxbyPaWBPg==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.28.4 + '@babel/types': 7.28.5 /@babel/helper-compilation-targets@7.27.2: resolution: {integrity: sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==} @@ -5621,7 +5661,7 @@ packages: engines: {node: '>=6.9.0'} dependencies: '@babel/traverse': 7.28.0 - '@babel/types': 7.28.4 + '@babel/types': 7.28.5 transitivePeerDependencies: - supports-color @@ -5630,7 +5670,7 @@ packages: engines: {node: '>=6.9.0'} dependencies: '@babel/traverse': 7.28.0 - '@babel/types': 7.28.2 + '@babel/types': 7.28.5 transitivePeerDependencies: - supports-color @@ -5642,7 +5682,7 @@ packages: dependencies: '@babel/core': 7.28.0 '@babel/helper-module-imports': 7.27.1 - '@babel/helper-validator-identifier': 7.27.1 + '@babel/helper-validator-identifier': 7.28.5 '@babel/traverse': 7.28.0 transitivePeerDependencies: - supports-color @@ -5656,7 +5696,7 @@ packages: dependencies: '@babel/core': 7.28.5 '@babel/helper-module-imports': 7.27.1 - '@babel/helper-validator-identifier': 7.27.1 + '@babel/helper-validator-identifier': 7.28.5 '@babel/traverse': 7.28.0 transitivePeerDependencies: - supports-color @@ -5693,7 +5733,7 @@ packages: resolution: {integrity: sha512-URMGH08NzYFhubNSGJrpUEphGKQwMQYBySzat5cAByY1/YgIRkULnIy3tAMeszlL/so2HbeilYloUmSpd7GdVw==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.28.4 + '@babel/types': 7.28.5 /@babel/helper-plugin-utils@7.27.1: resolution: {integrity: sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw==} @@ -5745,7 +5785,7 @@ packages: engines: {node: '>=6.9.0'} dependencies: '@babel/traverse': 7.28.0 - '@babel/types': 7.28.4 + '@babel/types': 7.28.5 transitivePeerDependencies: - supports-color @@ -5771,7 +5811,7 @@ packages: dependencies: '@babel/template': 7.27.2 '@babel/traverse': 7.28.4 - '@babel/types': 7.28.4 + '@babel/types': 7.28.5 transitivePeerDependencies: - supports-color dev: true @@ -5781,14 +5821,15 @@ packages: engines: {node: '>=6.9.0'} dependencies: '@babel/template': 7.27.2 - '@babel/types': 7.28.4 + '@babel/types': 7.28.5 /@babel/parser@7.28.0: resolution: {integrity: sha512-jVZGvOxOuNSsuQuLRTh13nU0AogFlw32w/MT+LV6D3sP5WdbW61E77RnkbaO2dUvmPAYrBDJXGn5gGS6tH4j8g==} engines: {node: '>=6.0.0'} hasBin: true dependencies: - '@babel/types': 7.28.2 + '@babel/types': 7.28.5 + dev: true /@babel/parser@7.28.4: resolution: {integrity: sha512-yZbBqeM6TkpP9du/I2pUZnJsRMGGvOuIrhjzC1AwHwW+6he4mni6Bp/m8ijn0iOuZuPI2BfkCoSRunpyjnrQKg==} @@ -6991,7 +7032,7 @@ packages: dependencies: '@babel/core': 7.28.0 '@babel/helper-plugin-utils': 7.27.1 - '@babel/types': 7.28.4 + '@babel/types': 7.28.5 esutils: 2.0.3 dev: true @@ -7036,8 +7077,8 @@ packages: engines: {node: '>=6.9.0'} dependencies: '@babel/code-frame': 7.27.1 - '@babel/parser': 7.28.0 - '@babel/types': 7.28.2 + '@babel/parser': 7.28.5 + '@babel/types': 7.28.5 /@babel/traverse@7.28.0: resolution: {integrity: sha512-mGe7UK5wWyh0bKRfupsUchrQGqvDbZDbKJw+kcRGSmdHVYrv+ltd0pnpDTVpiTqnaBru9iEvA8pz8W46v0Amwg==} @@ -7046,9 +7087,9 @@ packages: '@babel/code-frame': 7.27.1 '@babel/generator': 7.28.0 '@babel/helper-globals': 7.28.0 - '@babel/parser': 7.28.4 + '@babel/parser': 7.28.5 '@babel/template': 7.27.2 - '@babel/types': 7.28.4 + '@babel/types': 7.28.5 debug: 4.4.3(supports-color@10.2.2) transitivePeerDependencies: - supports-color @@ -7081,13 +7122,6 @@ packages: transitivePeerDependencies: - supports-color - /@babel/types@7.28.2: - resolution: {integrity: sha512-ruv7Ae4J5dUYULmeXw1gmb7rYRz57OWCPM57pHojnLq/3Z1CK2lNSLTCVjxVk1F/TZHwOZZrOWi0ur95BbLxNQ==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/helper-string-parser': 7.27.1 - '@babel/helper-validator-identifier': 7.27.1 - /@babel/types@7.28.4: resolution: {integrity: sha512-bkFqkLhh3pMBUQQkpVgWDWq/lqzc2678eUyDlTBhRqhCHFguYYGM0Efga7tYk4TogG/3x0EEl66/OQ+WGbWB/Q==} engines: {node: '>=6.9.0'} @@ -9197,7 +9231,7 @@ packages: vue: '>=3' dependencies: '@iconify/types': 2.0.0 - vue: 3.5.22(typescript@5.9.2) + vue: 3.5.22(typescript@5.9.3) dev: false /@img/colour@1.0.0: @@ -10336,7 +10370,89 @@ packages: resolution: {integrity: sha512-GaHYm+c0O9MjZRu0ongGBRbinu8gVAMd2UZjji6jVmqKtZluZnptXGWhz1E8j8D2HJ3f/yMxKAUC0b+57wncIw==} dev: false - /@langchain/core@0.3.70(openai@4.104.0): + /@lancedb/lancedb-darwin-arm64@0.23.0: + resolution: {integrity: sha512-8w0sMCNMwBv2kv5+fczGeSVlNOL+BOKChSsO4usM0hMw3PmxasONPctQBsESDuPS8lQ6/AKAQc2HT/ddd5Mg5w==} + engines: {node: '>= 18'} + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: false + optional: true + + /@lancedb/lancedb-linux-arm64-gnu@0.23.0: + resolution: {integrity: sha512-+xse2IspO7hbuHT4H62q8Ct00fTojnuBxXp1X1I3/27dDvW8E+/itFiJuTZ0YMaJc7nNr9qh9YFXZ9hZdEmReg==} + engines: {node: '>= 18'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@lancedb/lancedb-linux-arm64-musl@0.23.0: + resolution: {integrity: sha512-c2UCtGoYjA3oDdw5y3RLK7J2th3rSjYBng+1I03vU9g092y8KATAJO/lV2AtyxSC+esSuyY1dMEaj8ADcXjZAA==} + engines: {node: '>= 18'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@lancedb/lancedb-linux-x64-gnu@0.23.0: + resolution: {integrity: sha512-OPL7tK3JCTx43ZxvbVs+CljfCer0KrojANQbcJ2V4VAp6XBhKx1sBAlIVGuCrd93pA8UOUP3iHsM7aglPo6rCg==} + engines: {node: '>= 18'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@lancedb/lancedb-linux-x64-musl@0.23.0: + resolution: {integrity: sha512-1ZEoQDwOrKvwPyAG+95/r1NYqX8Ca5bRek8Vr62CzWCEmHd/pFeEGWZ5STrkh+Bt3GLdi2JOivFtRbmuBAJypQ==} + engines: {node: '>= 18'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@lancedb/lancedb-win32-arm64-msvc@0.23.0: + resolution: {integrity: sha512-OuD1mkrgXvijRlXdbx3LvfuorO04FD5qHegnTOWGXh1sIwwrvvhcJAvXUGBNLY4n/lsWvA+xTjtMwRjUitvPKg==} + engines: {node: '>= 18'} + cpu: [arm64] + os: [win32] + requiresBuild: true + dev: false + optional: true + + /@lancedb/lancedb-win32-x64-msvc@0.23.0: + resolution: {integrity: sha512-5ve1hvVtp8zWxSE9A+MOQaicXl2Rn0ZG/NUaMTjTD3/CQHPKFmtrqDnM5khoPICTj2O2b10F6mn4cUzl5PASgA==} + engines: {node: '>= 18'} + cpu: [x64] + os: [win32] + requiresBuild: true + dev: false + optional: true + + /@lancedb/lancedb@0.23.0(apache-arrow@18.1.0): + resolution: {integrity: sha512-aYrIoEG24AC+wILCL57Ius/Y4yU+xFHDPKLvmjzzN4byAjzeIGF0TC86S5RBt4Ji+dxS7yIWV5Q/gE5/fybIFQ==} + engines: {node: '>= 18'} + os: [darwin, linux, win32] + peerDependencies: + apache-arrow: '>=15.0.0 <=18.1.0' + dependencies: + apache-arrow: 18.1.0 + reflect-metadata: 0.2.2 + optionalDependencies: + '@lancedb/lancedb-darwin-arm64': 0.23.0 + '@lancedb/lancedb-linux-arm64-gnu': 0.23.0 + '@lancedb/lancedb-linux-arm64-musl': 0.23.0 + '@lancedb/lancedb-linux-x64-gnu': 0.23.0 + '@lancedb/lancedb-linux-x64-musl': 0.23.0 + '@lancedb/lancedb-win32-arm64-msvc': 0.23.0 + '@lancedb/lancedb-win32-x64-msvc': 0.23.0 + dev: false + + /@langchain/core@0.3.70(openai@5.23.2): resolution: {integrity: sha512-nMH+aX/vnPPB4HNDxyesnUmhxZgipElcQrtXXznmzKTeFoJDez/cC/lDhO/o8DvI4Zq0cTtKitE3/YSibEbxPQ==} engines: {node: '>=18'} dependencies: @@ -10345,7 +10461,7 @@ packages: camelcase: 6.3.0 decamelize: 1.2.0 js-tiktoken: 1.0.21 - langsmith: 0.3.58(openai@4.104.0) + langsmith: 0.3.58(openai@5.23.2) mustache: 4.2.0 p-queue: 6.6.2 p-retry: 4.6.2 @@ -10357,9 +10473,8 @@ packages: - '@opentelemetry/exporter-trace-otlp-proto' - '@opentelemetry/sdk-trace-base' - openai - dev: false - /@langchain/core@0.3.70(openai@5.23.2): + /@langchain/core@0.3.70(openai@6.15.0): resolution: {integrity: sha512-nMH+aX/vnPPB4HNDxyesnUmhxZgipElcQrtXXznmzKTeFoJDez/cC/lDhO/o8DvI4Zq0cTtKitE3/YSibEbxPQ==} engines: {node: '>=18'} dependencies: @@ -10368,7 +10483,7 @@ packages: camelcase: 6.3.0 decamelize: 1.2.0 js-tiktoken: 1.0.21 - langsmith: 0.3.58(openai@5.23.2) + langsmith: 0.3.58(openai@6.15.0) mustache: 4.2.0 p-queue: 6.6.2 p-retry: 4.6.2 @@ -10380,6 +10495,7 @@ packages: - '@opentelemetry/exporter-trace-otlp-proto' - '@opentelemetry/sdk-trace-base' - openai + dev: false /@langchain/langgraph-sdk@0.1.10(@langchain/core@0.3.70): resolution: {integrity: sha512-9srSCb2bSvcvehMgjA2sMMwX0o1VUgPN6ghwm5Fwc9JGAKsQa6n1S4eCwy1h4abuYxwajH5n3spBw+4I2WYbgw==} @@ -10407,7 +10523,7 @@ packages: peerDependencies: '@langchain/core': '>=0.3.68 <0.4.0' dependencies: - '@langchain/core': 0.3.70(openai@4.104.0) + '@langchain/core': 0.3.70(openai@6.15.0) js-tiktoken: 1.0.21 openai: 5.23.2(zod@3.25.76) zod: 3.25.76 @@ -10421,7 +10537,7 @@ packages: peerDependencies: '@langchain/core': '>=0.2.21 <0.4.0' dependencies: - '@langchain/core': 0.3.70(openai@4.104.0) + '@langchain/core': 0.3.70(openai@6.15.0) js-tiktoken: 1.0.21 dev: false @@ -11240,8 +11356,8 @@ packages: string-width: 7.2.0 supports-color: 10.2.2 terminal-link: 4.0.0 - ts-node: 10.9.2(@swc/core@1.5.29)(@types/node@24.2.1)(typescript@5.9.2) - typescript: 5.9.2 + ts-node: 10.9.2(@swc/core@1.5.29)(@types/node@24.2.1)(typescript@5.9.3) + typescript: 5.9.3 uuid: 11.1.0 yaml: 2.8.1 yargs: 17.7.2 @@ -11966,7 +12082,7 @@ packages: - vue dev: false - /@nuxt/eslint-config@1.9.0(@vue/compiler-sfc@3.5.22)(eslint@9.33.0)(typescript@5.9.2): + /@nuxt/eslint-config@1.9.0(@vue/compiler-sfc@3.5.22)(eslint@9.33.0)(typescript@5.9.3): resolution: {integrity: sha512-KLiYlX/MmWR9dhC0u7GSZQl6wyVLGAHme5aAL5fAUT1PLYgcFiJIUg1Z+b296LmwHGTa+oGPRBIk3yoDmX9/9Q==} peerDependencies: eslint: ^9.0.0 @@ -11978,15 +12094,15 @@ packages: '@antfu/install-pkg': 1.1.0 '@clack/prompts': 0.11.0 '@eslint/js': 9.33.0 - '@nuxt/eslint-plugin': 1.9.0(eslint@9.33.0)(typescript@5.9.2) + '@nuxt/eslint-plugin': 1.9.0(eslint@9.33.0)(typescript@5.9.3) '@stylistic/eslint-plugin': 5.4.0(eslint@9.33.0) - '@typescript-eslint/eslint-plugin': 8.46.0(@typescript-eslint/parser@8.46.0)(eslint@9.33.0)(typescript@5.9.2) - '@typescript-eslint/parser': 8.46.0(eslint@9.33.0)(typescript@5.9.2) + '@typescript-eslint/eslint-plugin': 8.46.0(@typescript-eslint/parser@8.46.0)(eslint@9.33.0)(typescript@5.9.3) + '@typescript-eslint/parser': 8.46.0(eslint@9.33.0)(typescript@5.9.3) eslint: 9.33.0 eslint-config-flat-gitignore: 2.1.0(eslint@9.33.0) eslint-flat-config-utils: 2.1.4 eslint-merge-processors: 2.0.0(eslint@9.33.0) - eslint-plugin-import-lite: 0.3.0(eslint@9.33.0)(typescript@5.9.2) + eslint-plugin-import-lite: 0.3.0(eslint@9.33.0)(typescript@5.9.3) eslint-plugin-import-x: 4.16.1(eslint@9.33.0) eslint-plugin-jsdoc: 54.7.0(eslint@9.33.0) eslint-plugin-regexp: 2.10.0(eslint@9.33.0) @@ -12005,20 +12121,20 @@ packages: - typescript dev: false - /@nuxt/eslint-plugin@1.9.0(eslint@9.33.0)(typescript@5.9.2): + /@nuxt/eslint-plugin@1.9.0(eslint@9.33.0)(typescript@5.9.3): resolution: {integrity: sha512-DY4ZSavgFyKQxI/NCOpSCUHg3dpS2O4lAdic5UmvP2NWj1xwtvmA9UwEZQ2nW2/f/Km6N+Q53UsgFSIBjz8jDQ==} peerDependencies: eslint: ^9.0.0 dependencies: '@typescript-eslint/types': 8.44.1 - '@typescript-eslint/utils': 8.46.0(eslint@9.33.0)(typescript@5.9.2) + '@typescript-eslint/utils': 8.46.0(eslint@9.33.0)(typescript@5.9.3) eslint: 9.33.0 transitivePeerDependencies: - supports-color - typescript dev: false - /@nuxt/eslint@1.9.0(@vue/compiler-sfc@3.5.22)(eslint@9.33.0)(typescript@5.9.2)(vite@7.2.7): + /@nuxt/eslint@1.9.0(@vue/compiler-sfc@3.5.22)(eslint@9.33.0)(typescript@5.9.3)(vite@7.2.7): resolution: {integrity: sha512-8Wm2fDD9za+vJOOhRS2jj+MzyjCNvDhS+04Y55q9W1Ai5hFjTZ1a94jlgSwaqI1B3Zt7y5fqFoEb4wKpZ3ycWg==} peerDependencies: eslint: ^9.0.0 @@ -12032,8 +12148,8 @@ packages: dependencies: '@eslint/config-inspector': 1.3.0(eslint@9.33.0) '@nuxt/devtools-kit': 2.6.5(magicast@0.3.5)(vite@7.2.7) - '@nuxt/eslint-config': 1.9.0(@vue/compiler-sfc@3.5.22)(eslint@9.33.0)(typescript@5.9.2) - '@nuxt/eslint-plugin': 1.9.0(eslint@9.33.0)(typescript@5.9.2) + '@nuxt/eslint-config': 1.9.0(@vue/compiler-sfc@3.5.22)(eslint@9.33.0)(typescript@5.9.3) + '@nuxt/eslint-plugin': 1.9.0(eslint@9.33.0)(typescript@5.9.3) '@nuxt/kit': 4.1.3 chokidar: 4.0.3 eslint: 9.33.0 @@ -12232,7 +12348,7 @@ packages: - magicast dev: false - /@nuxt/ui@4.0.1(embla-carousel@8.6.0)(typescript@5.9.2)(vite@7.2.7)(vue-router@4.5.1)(vue@3.5.22)(zod@3.25.76): + /@nuxt/ui@4.0.1(embla-carousel@8.6.0)(typescript@5.9.3)(vite@7.2.7)(vue-router@4.5.1)(vue@3.5.22)(zod@3.25.76): resolution: {integrity: sha512-mtY8wairYw2WXotCYxXG0CmxbqyJWaMHYbes3p+vFaOJ2kdQHQh7QM/7ziQeZHxVNHciBcWayi6G+55ok/kHAQ==} hasBin: true peerDependencies: @@ -12294,13 +12410,13 @@ packages: motion-v: 1.7.2(@vueuse/core@13.9.0)(vue@3.5.22) ohash: 2.0.11 pathe: 2.0.3 - reka-ui: 2.5.1(typescript@5.9.2)(vue@3.5.22) + reka-ui: 2.5.1(typescript@5.9.3)(vue@3.5.22) scule: 1.3.0 tailwind-merge: 3.4.0 tailwind-variants: 3.1.1(tailwind-merge@3.4.0)(tailwindcss@4.1.14) tailwindcss: 4.1.14 tinyglobby: 0.2.15 - typescript: 5.9.2 + typescript: 5.9.3 unplugin: 2.3.10 unplugin-auto-import: 20.2.0(@nuxt/kit@4.1.3)(@vueuse/core@13.9.0) unplugin-vue-components: 29.1.0(@nuxt/kit@4.1.3)(vue@3.5.22) @@ -12351,7 +12467,7 @@ packages: - vue dev: false - /@nuxt/vite-builder@4.1.3(@biomejs/biome@1.9.4)(@types/node@24.2.1)(eslint@9.33.0)(typescript@5.9.2)(vue@3.5.22): + /@nuxt/vite-builder@4.1.3(@biomejs/biome@1.9.4)(@types/node@24.2.1)(eslint@9.33.0)(typescript@5.9.3)(vue@3.5.22): resolution: {integrity: sha512-yrblLSpGW6h9k+sDZa+vtevQz/6JLrPAj3n97HrEmVa6qB+4sE4HWtkMNUtWsOPe60sAm9usRsjDUkkiHZ0DpA==} engines: {node: ^20.19.0 || >=22.12.0} peerDependencies: @@ -12388,8 +12504,8 @@ packages: unenv: 2.0.0-rc.21 vite: 7.2.7(@types/node@24.2.1)(jiti@2.6.1) vite-node: 3.2.4(@types/node@24.2.1)(jiti@2.6.1) - vite-plugin-checker: 0.11.0(@biomejs/biome@1.9.4)(eslint@9.33.0)(typescript@5.9.2)(vite@7.2.7) - vue: 3.5.22(typescript@5.9.2) + vite-plugin-checker: 0.11.0(@biomejs/biome@1.9.4)(eslint@9.33.0)(typescript@5.9.3)(vite@7.2.7) + vue: 3.5.22(typescript@5.9.3) vue-bundle-renderer: 2.2.0 transitivePeerDependencies: - '@biomejs/biome' @@ -17926,7 +18042,7 @@ packages: '@babel/plugin-syntax-typescript': 7.27.1(@babel/core@7.28.5) '@babel/template': 7.27.2 '@babel/traverse': 7.28.4 - '@babel/types': 7.28.4 + '@babel/types': 7.28.5 '@tanstack/react-router': 1.131.44(react-dom@19.2.3)(react@19.2.3) '@tanstack/router-core': 1.131.44 '@tanstack/router-generator': 1.131.44 @@ -17976,7 +18092,7 @@ packages: '@babel/plugin-syntax-typescript': 7.27.1(@babel/core@7.28.5) '@babel/template': 7.27.2 '@babel/traverse': 7.28.4 - '@babel/types': 7.28.4 + '@babel/types': 7.28.5 '@tanstack/directive-functions-plugin': 1.131.2(vite@7.2.7) babel-dead-code-elimination: 1.0.10 tiny-invariant: 1.3.3 @@ -18138,7 +18254,7 @@ packages: vue: '>=3.2' dependencies: '@tanstack/table-core': 8.21.3 - vue: 3.5.22(typescript@5.9.2) + vue: 3.5.22(typescript@5.9.3) dev: false /@tanstack/vue-virtual@3.13.12(vue@3.5.22): @@ -18147,7 +18263,7 @@ packages: vue: ^2.7.0 || ^3.0.0 dependencies: '@tanstack/virtual-core': 3.13.12 - vue: 3.5.22(typescript@5.9.2) + vue: 3.5.22(typescript@5.9.3) dev: false /@tavily/core@0.6.3: @@ -18265,20 +18381,20 @@ packages: /@types/babel__generator@7.27.0: resolution: {integrity: sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==} dependencies: - '@babel/types': 7.28.2 + '@babel/types': 7.28.5 dev: true /@types/babel__template@7.4.4: resolution: {integrity: sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==} dependencies: - '@babel/parser': 7.28.0 - '@babel/types': 7.28.2 + '@babel/parser': 7.28.5 + '@babel/types': 7.28.5 dev: true /@types/babel__traverse@7.28.0: resolution: {integrity: sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q==} dependencies: - '@babel/types': 7.28.2 + '@babel/types': 7.28.5 dev: true /@types/body-parser@1.19.6: @@ -18313,6 +18429,14 @@ packages: '@types/deep-eql': 4.0.2 dev: true + /@types/command-line-args@5.2.3: + resolution: {integrity: sha512-uv0aG6R0Y8WHZLTamZwtfsDLVRnOa+n+n5rEvFWL5Na5gZ8V2Teab/duDPFzIIIhs9qizDpcavCusCLJZu62Kw==} + dev: false + + /@types/command-line-usage@5.0.4: + resolution: {integrity: sha512-BwR5KP3Es/CSht0xqBcUXS3qCAUVXwpRKsV2+arxeb65atasuXG9LykC9Ab10Cw3s2raH92ZqOeILaQbsB2ACg==} + dev: false + /@types/configstore@6.0.2: resolution: {integrity: sha512-OS//b51j9uyR3zvwD04Kfs5kHpve2qalQ18JhY/ho3voGYUTPLEG90/ocfKPI48hyHH8T04f7KEEbK6Ue60oZQ==} dev: true @@ -18748,6 +18872,12 @@ packages: dependencies: undici-types: 5.26.5 + /@types/node@20.19.27: + resolution: {integrity: sha512-N2clP5pJhB2YnZJ3PIHFk5RkygRX5WO/5f0WC08tp0wd+sv0rsJk3MqWn3CbNmT2J505a5336jaQj4ph1AdMug==} + dependencies: + undici-types: 6.21.0 + dev: false + /@types/node@22.17.1: resolution: {integrity: sha512-y3tBaz+rjspDTylNjAX37jEC3TETEFGNJL6uQDxwF9/8GLLIjW1rvVHlynyuUKMnMr1Roq8jOv3vkopBjC4/VA==} dependencies: @@ -18983,7 +19113,7 @@ packages: dev: true optional: true - /@typescript-eslint/eslint-plugin@8.46.0(@typescript-eslint/parser@8.46.0)(eslint@9.33.0)(typescript@5.9.2): + /@typescript-eslint/eslint-plugin@8.46.0(@typescript-eslint/parser@8.46.0)(eslint@9.33.0)(typescript@5.9.3): resolution: {integrity: sha512-hA8gxBq4ukonVXPy0OKhiaUh/68D0E88GSmtC1iAEnGaieuDi38LhS7jdCHRLi6ErJBNDGCzvh5EnzdPwUc0DA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: @@ -18992,22 +19122,22 @@ packages: typescript: '>=4.8.4 <6.0.0' dependencies: '@eslint-community/regexpp': 4.12.1 - '@typescript-eslint/parser': 8.46.0(eslint@9.33.0)(typescript@5.9.2) + '@typescript-eslint/parser': 8.46.0(eslint@9.33.0)(typescript@5.9.3) '@typescript-eslint/scope-manager': 8.46.0 - '@typescript-eslint/type-utils': 8.46.0(eslint@9.33.0)(typescript@5.9.2) - '@typescript-eslint/utils': 8.46.0(eslint@9.33.0)(typescript@5.9.2) + '@typescript-eslint/type-utils': 8.46.0(eslint@9.33.0)(typescript@5.9.3) + '@typescript-eslint/utils': 8.46.0(eslint@9.33.0)(typescript@5.9.3) '@typescript-eslint/visitor-keys': 8.46.0 eslint: 9.33.0 graphemer: 1.4.0 ignore: 7.0.5 natural-compare: 1.4.0 - ts-api-utils: 2.1.0(typescript@5.9.2) - typescript: 5.9.2 + ts-api-utils: 2.1.0(typescript@5.9.3) + typescript: 5.9.3 transitivePeerDependencies: - supports-color dev: false - /@typescript-eslint/parser@8.46.0(eslint@9.33.0)(typescript@5.9.2): + /@typescript-eslint/parser@8.46.0(eslint@9.33.0)(typescript@5.9.3): resolution: {integrity: sha512-n1H6IcDhmmUEG7TNVSspGmiHHutt7iVKtZwRppD7e04wha5MrkV1h3pti9xQLcCMt6YWsncpoT0HMjkH1FNwWQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: @@ -19016,39 +19146,39 @@ packages: dependencies: '@typescript-eslint/scope-manager': 8.46.0 '@typescript-eslint/types': 8.46.0 - '@typescript-eslint/typescript-estree': 8.46.0(typescript@5.9.2) + '@typescript-eslint/typescript-estree': 8.46.0(typescript@5.9.3) '@typescript-eslint/visitor-keys': 8.46.0 debug: 4.4.3(supports-color@10.2.2) eslint: 9.33.0 - typescript: 5.9.2 + typescript: 5.9.3 transitivePeerDependencies: - supports-color dev: false - /@typescript-eslint/project-service@8.44.1(supports-color@10.2.2)(typescript@5.9.2): + /@typescript-eslint/project-service@8.44.1(supports-color@10.2.2)(typescript@5.9.3): resolution: {integrity: sha512-ycSa60eGg8GWAkVsKV4E6Nz33h+HjTXbsDT4FILyL8Obk5/mx4tbvCNsLf9zret3ipSumAOG89UcCs/KRaKYrA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <6.0.0' dependencies: - '@typescript-eslint/tsconfig-utils': 8.44.1(typescript@5.9.2) + '@typescript-eslint/tsconfig-utils': 8.44.1(typescript@5.9.3) '@typescript-eslint/types': 8.44.1 debug: 4.4.3(supports-color@10.2.2) - typescript: 5.9.2 + typescript: 5.9.3 transitivePeerDependencies: - supports-color dev: true - /@typescript-eslint/project-service@8.46.0(typescript@5.9.2): + /@typescript-eslint/project-service@8.46.0(typescript@5.9.3): resolution: {integrity: sha512-OEhec0mH+U5Je2NZOeK1AbVCdm0ChyapAyTeXVIYTPXDJ3F07+cu87PPXcGoYqZ7M9YJVvFnfpGg1UmCIqM+QQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <6.0.0' dependencies: - '@typescript-eslint/tsconfig-utils': 8.46.0(typescript@5.9.2) + '@typescript-eslint/tsconfig-utils': 8.46.0(typescript@5.9.3) '@typescript-eslint/types': 8.46.0 debug: 4.4.3(supports-color@10.2.2) - typescript: 5.9.2 + typescript: 5.9.3 transitivePeerDependencies: - supports-color dev: false @@ -19061,25 +19191,25 @@ packages: '@typescript-eslint/visitor-keys': 8.46.0 dev: false - /@typescript-eslint/tsconfig-utils@8.44.1(typescript@5.9.2): + /@typescript-eslint/tsconfig-utils@8.44.1(typescript@5.9.3): resolution: {integrity: sha512-B5OyACouEjuIvof3o86lRMvyDsFwZm+4fBOqFHccIctYgBjqR3qT39FBYGN87khcgf0ExpdCBeGKpKRhSFTjKQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <6.0.0' dependencies: - typescript: 5.9.2 + typescript: 5.9.3 dev: true - /@typescript-eslint/tsconfig-utils@8.46.0(typescript@5.9.2): + /@typescript-eslint/tsconfig-utils@8.46.0(typescript@5.9.3): resolution: {integrity: sha512-WrYXKGAHY836/N7zoK/kzi6p8tXFhasHh8ocFL9VZSAkvH956gfeRfcnhs3xzRy8qQ/dq3q44v1jvQieMFg2cw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <6.0.0' dependencies: - typescript: 5.9.2 + typescript: 5.9.3 dev: false - /@typescript-eslint/type-utils@8.46.0(eslint@9.33.0)(typescript@5.9.2): + /@typescript-eslint/type-utils@8.46.0(eslint@9.33.0)(typescript@5.9.3): resolution: {integrity: sha512-hy+lvYV1lZpVs2jRaEYvgCblZxUoJiPyCemwbQZ+NGulWkQRy0HRPYAoef/CNSzaLt+MLvMptZsHXHlkEilaeg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: @@ -19087,12 +19217,12 @@ packages: typescript: '>=4.8.4 <6.0.0' dependencies: '@typescript-eslint/types': 8.46.0 - '@typescript-eslint/typescript-estree': 8.46.0(typescript@5.9.2) - '@typescript-eslint/utils': 8.46.0(eslint@9.33.0)(typescript@5.9.2) + '@typescript-eslint/typescript-estree': 8.46.0(typescript@5.9.3) + '@typescript-eslint/utils': 8.46.0(eslint@9.33.0)(typescript@5.9.3) debug: 4.4.3(supports-color@10.2.2) eslint: 9.33.0 - ts-api-utils: 2.1.0(typescript@5.9.2) - typescript: 5.9.2 + ts-api-utils: 2.1.0(typescript@5.9.3) + typescript: 5.9.3 transitivePeerDependencies: - supports-color dev: false @@ -19106,14 +19236,14 @@ packages: engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} dev: false - /@typescript-eslint/typescript-estree@8.44.1(supports-color@10.2.2)(typescript@5.9.2): + /@typescript-eslint/typescript-estree@8.44.1(supports-color@10.2.2)(typescript@5.9.3): resolution: {integrity: sha512-qnQJ+mVa7szevdEyvfItbO5Vo+GfZ4/GZWWDRRLjrxYPkhM+6zYB2vRYwCsoJLzqFCdZT4mEqyJoyzkunsZ96A==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <6.0.0' dependencies: - '@typescript-eslint/project-service': 8.44.1(supports-color@10.2.2)(typescript@5.9.2) - '@typescript-eslint/tsconfig-utils': 8.44.1(typescript@5.9.2) + '@typescript-eslint/project-service': 8.44.1(supports-color@10.2.2)(typescript@5.9.3) + '@typescript-eslint/tsconfig-utils': 8.44.1(typescript@5.9.3) '@typescript-eslint/types': 8.44.1 '@typescript-eslint/visitor-keys': 8.44.1 debug: 4.4.3(supports-color@10.2.2) @@ -19121,20 +19251,20 @@ packages: is-glob: 4.0.3 minimatch: 9.0.5 semver: 7.7.2 - ts-api-utils: 2.1.0(typescript@5.9.2) - typescript: 5.9.2 + ts-api-utils: 2.1.0(typescript@5.9.3) + typescript: 5.9.3 transitivePeerDependencies: - supports-color dev: true - /@typescript-eslint/typescript-estree@8.46.0(typescript@5.9.2): + /@typescript-eslint/typescript-estree@8.46.0(typescript@5.9.3): resolution: {integrity: sha512-ekDCUfVpAKWJbRfm8T1YRrCot1KFxZn21oV76v5Fj4tr7ELyk84OS+ouvYdcDAwZL89WpEkEj2DKQ+qg//+ucg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <6.0.0' dependencies: - '@typescript-eslint/project-service': 8.46.0(typescript@5.9.2) - '@typescript-eslint/tsconfig-utils': 8.46.0(typescript@5.9.2) + '@typescript-eslint/project-service': 8.46.0(typescript@5.9.3) + '@typescript-eslint/tsconfig-utils': 8.46.0(typescript@5.9.3) '@typescript-eslint/types': 8.46.0 '@typescript-eslint/visitor-keys': 8.46.0 debug: 4.4.3(supports-color@10.2.2) @@ -19142,13 +19272,13 @@ packages: is-glob: 4.0.3 minimatch: 9.0.5 semver: 7.7.2 - ts-api-utils: 2.1.0(typescript@5.9.2) - typescript: 5.9.2 + ts-api-utils: 2.1.0(typescript@5.9.3) + typescript: 5.9.3 transitivePeerDependencies: - supports-color dev: false - /@typescript-eslint/utils@8.46.0(eslint@9.33.0)(typescript@5.9.2): + /@typescript-eslint/utils@8.46.0(eslint@9.33.0)(typescript@5.9.3): resolution: {integrity: sha512-nD6yGWPj1xiOm4Gk0k6hLSZz2XkNXhuYmyIrOWcHoPuAhjT9i5bAG+xbWPgFeNR8HPHHtpNKdYUXJl/D3x7f5g==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: @@ -19158,9 +19288,9 @@ packages: '@eslint-community/eslint-utils': 4.9.0(eslint@9.33.0) '@typescript-eslint/scope-manager': 8.46.0 '@typescript-eslint/types': 8.46.0 - '@typescript-eslint/typescript-estree': 8.46.0(typescript@5.9.2) + '@typescript-eslint/typescript-estree': 8.46.0(typescript@5.9.3) eslint: 9.33.0 - typescript: 5.9.2 + typescript: 5.9.3 transitivePeerDependencies: - supports-color dev: false @@ -19198,7 +19328,7 @@ packages: dependencies: hookable: 5.5.3 unhead: 2.0.19 - vue: 3.5.22(typescript@5.9.2) + vue: 3.5.22(typescript@5.9.3) dev: false /@unrs/resolver-binding-android-arm-eabi@1.11.1: @@ -19448,7 +19578,7 @@ packages: '@rolldown/pluginutils': 1.0.0-beta.58 '@vue/babel-plugin-jsx': 1.5.0(@babel/core@7.28.5) vite: 7.2.7(@types/node@24.2.1)(jiti@2.6.1) - vue: 3.5.22(typescript@5.9.2) + vue: 3.5.22(typescript@5.9.3) transitivePeerDependencies: - supports-color dev: false @@ -19462,7 +19592,7 @@ packages: dependencies: '@rolldown/pluginutils': 1.0.0-beta.29 vite: 7.2.7(@types/node@24.2.1)(jiti@2.6.1) - vue: 3.5.22(typescript@5.9.2) + vue: 3.5.22(typescript@5.9.3) dev: false /@vitest/coverage-v8@3.2.4(vitest@3.2.4): @@ -19816,7 +19946,7 @@ packages: local-pkg: 1.1.2 magic-string-ast: 1.0.3 unplugin-utils: 0.2.5 - vue: 3.5.22(typescript@5.9.2) + vue: 3.5.22(typescript@5.9.3) dev: false /@vue/babel-helper-vue-transform-on@1.5.0: @@ -19878,7 +20008,7 @@ packages: /@vue/compiler-sfc@3.5.22: resolution: {integrity: sha512-tbTR1zKGce4Lj+JLzFXDq36K4vcSZbJ1RBu8FxcDv1IGRz//Dh2EBqksyGVypz3kXpshIfWKGOCcqpSbyGWRJQ==} dependencies: - '@babel/parser': 7.28.4 + '@babel/parser': 7.28.5 '@vue/compiler-core': 3.5.22 '@vue/compiler-dom': 3.5.22 '@vue/compiler-ssr': 3.5.22 @@ -19909,7 +20039,7 @@ packages: nanoid: 5.1.6 pathe: 2.0.3 vite-hot-client: 2.1.0(vite@7.2.7) - vue: 3.5.22(typescript@5.9.2) + vue: 3.5.22(typescript@5.9.3) transitivePeerDependencies: - vite dev: false @@ -19932,7 +20062,7 @@ packages: rfdc: 1.4.1 dev: false - /@vue/language-core@3.1.1(typescript@5.9.2): + /@vue/language-core@3.1.1(typescript@5.9.3): resolution: {integrity: sha512-qjMY3Q+hUCjdH+jLrQapqgpsJ0rd/2mAY02lZoHG3VFJZZZKLjAlV+Oo9QmWIT4jh8+Rx8RUGUi++d7T9Wb6Mw==} peerDependencies: typescript: '*' @@ -19947,7 +20077,7 @@ packages: muggle-string: 0.4.1 path-browserify: 1.0.1 picomatch: 4.0.3 - typescript: 5.9.2 + typescript: 5.9.3 dev: false /@vue/reactivity@3.5.22: @@ -19979,7 +20109,7 @@ packages: dependencies: '@vue/compiler-ssr': 3.5.22 '@vue/shared': 3.5.22 - vue: 3.5.22(typescript@5.9.2) + vue: 3.5.22(typescript@5.9.3) dev: false /@vue/shared@3.5.22: @@ -19997,13 +20127,13 @@ packages: - vue dev: false - /@vueuse/core@12.8.2(typescript@5.9.2): + /@vueuse/core@12.8.2(typescript@5.9.3): resolution: {integrity: sha512-HbvCmZdzAu3VGi/pWYm5Ut+Kd9mn1ZHnn4L5G8kOQTPs/IwIAmJoBrmYk2ckLArgMXZj0AW3n5CAejLUO+PhdQ==} dependencies: '@types/web-bluetooth': 0.0.21 '@vueuse/metadata': 12.8.2 - '@vueuse/shared': 12.8.2(typescript@5.9.2) - vue: 3.5.22(typescript@5.9.2) + '@vueuse/shared': 12.8.2(typescript@5.9.3) + vue: 3.5.22(typescript@5.9.3) transitivePeerDependencies: - typescript dev: false @@ -20016,7 +20146,7 @@ packages: '@types/web-bluetooth': 0.0.21 '@vueuse/metadata': 13.9.0 '@vueuse/shared': 13.9.0(vue@3.5.22) - vue: 3.5.22(typescript@5.9.2) + vue: 3.5.22(typescript@5.9.3) dev: false /@vueuse/integrations@13.9.0(fuse.js@7.1.0)(vue@3.5.22): @@ -20064,7 +20194,7 @@ packages: '@vueuse/core': 13.9.0(vue@3.5.22) '@vueuse/shared': 13.9.0(vue@3.5.22) fuse.js: 7.1.0 - vue: 3.5.22(typescript@5.9.2) + vue: 3.5.22(typescript@5.9.3) dev: false /@vueuse/metadata@10.11.1: @@ -20088,10 +20218,10 @@ packages: - vue dev: false - /@vueuse/shared@12.8.2(typescript@5.9.2): + /@vueuse/shared@12.8.2(typescript@5.9.3): resolution: {integrity: sha512-dznP38YzxZoNloI0qpEfpkms8knDtaoQ6Y/sfS0L7Yki4zh40LFHEhur0odJC6xTHG5dxWVPiUWBXn+wCG2s5w==} dependencies: - vue: 3.5.22(typescript@5.9.2) + vue: 3.5.22(typescript@5.9.3) transitivePeerDependencies: - typescript dev: false @@ -20101,7 +20231,7 @@ packages: peerDependencies: vue: ^3.5.0 dependencies: - vue: 3.5.22(typescript@5.9.2) + vue: 3.5.22(typescript@5.9.3) dev: false /@webassemblyjs/ast@1.14.1: @@ -20805,6 +20935,21 @@ packages: normalize-path: 3.0.0 picomatch: 2.3.1 + /apache-arrow@18.1.0: + resolution: {integrity: sha512-v/ShMp57iBnBp4lDgV8Jx3d3Q5/Hac25FWmQ98eMahUiHPXcvwIMKJD0hBIgclm/FCG+LwPkAKtkRO1O/W0YGg==} + hasBin: true + dependencies: + '@swc/helpers': 0.5.17 + '@types/command-line-args': 5.2.3 + '@types/command-line-usage': 5.0.4 + '@types/node': 20.19.27 + command-line-args: 5.2.1 + command-line-usage: 7.0.3 + flatbuffers: 24.12.23 + json-bignum: 0.0.3 + tslib: 2.8.1 + dev: false + /append-field@1.0.0: resolution: {integrity: sha512-klpgFSWLW1ZEs8svjfb7g4qWY0YS5imI82dTg+QahUvJ8YqAY0P10Uk8tTyh9ZGuYEZEMaeJYCF5BFuX552hsw==} dev: false @@ -20874,6 +21019,16 @@ packages: dependencies: tslib: 2.8.1 + /array-back@3.1.0: + resolution: {integrity: sha512-TkuxA4UCOvxuDK6NZYXCalszEzj+TLszyASooky+i742l9TqsOdYCMJJupxRic61hwquNtppB3hgcuq9SVSH1Q==} + engines: {node: '>=6'} + dev: false + + /array-back@6.2.2: + resolution: {integrity: sha512-gUAZ7HPyb4SJczXAMUXMGAvI976JoK3qEx9v1FTmeYuJj0IBiaKttG1ydtGKdkfqWkIkouke7nG8ufGy77+Cvw==} + engines: {node: '>=12.17'} + dev: false + /array-differ@3.0.0: resolution: {integrity: sha512-THtfYS6KtME/yIAhKjZ2ul7XI96lQGHRputJQHO80LAWQnuGP4iCIN8vdMRboGbIEYBwU33q8Tch1os2+X0kMg==} engines: {node: '>=8'} @@ -21828,6 +21983,13 @@ packages: pathval: 2.0.1 dev: true + /chalk-template@0.4.0: + resolution: {integrity: sha512-/ghrgmhfY8RaSdeo43hNXxpoHAtxdbskUHjPpfqUWGttFgycUhYPGx3YZBCnUCvOa7Doivn1IZec3DEGFoMgLg==} + engines: {node: '>=12'} + dependencies: + chalk: 4.1.2 + dev: false + /chalk-template@1.1.0: resolution: {integrity: sha512-T2VJbcDuZQ0Tb2EWwSotMPJjgpy1/tGee1BTpUNsGZ/qgNjV2t7Mvu+d4600U564nbLesN1x2dPL+xii174Ekg==} engines: {node: '>=14.16'} @@ -22426,6 +22588,26 @@ packages: resolution: {integrity: sha512-LTQ/SGc+s0Xc0Fu5WaKnR0YiygZkm9eKFvyS+fRsU7/ZWFF8ykFM6Pc9aCVf1+xasOOZpO3BAVgVrKvsqKHV7w==} dev: false + /command-line-args@5.2.1: + resolution: {integrity: sha512-H4UfQhZyakIjC74I9d34fGYDwk3XpSr17QhEd0Q3I9Xq1CETHo4Hcuo87WyWHpAF1aSLjLRf5lD9ZGX2qStUvg==} + engines: {node: '>=4.0.0'} + dependencies: + array-back: 3.1.0 + find-replace: 3.0.0 + lodash.camelcase: 4.3.0 + typical: 4.0.0 + dev: false + + /command-line-usage@7.0.3: + resolution: {integrity: sha512-PqMLy5+YGwhMh1wS04mVG44oqDsgyLRSKJBdOo1bnYhMKBW65gZF1dRp2OZRhiTjgUHljy99qkO7bsctLaw35Q==} + engines: {node: '>=12.20.0'} + dependencies: + array-back: 6.2.2 + chalk-template: 0.4.0 + table-layout: 4.1.1 + typical: 7.3.0 + dev: false + /commander@10.0.1: resolution: {integrity: sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==} engines: {node: '>=14'} @@ -22511,7 +22693,7 @@ packages: /compatx@0.2.0: resolution: {integrity: sha512-6gLRNt4ygsi5NyMVhceOCFv14CIdDFN7fQjX1U4+47qVE/+kjPoXMK65KWK+dWxmFzMTuKazoQ9sch6pM0p5oA==} - /composio-core@0.5.39(@ai-sdk/openai@3.0.1)(@cloudflare/workers-types@4.20250813.0)(@langchain/core@0.3.70)(@langchain/openai@0.6.7)(ai@6.0.3)(langchain@0.3.30)(openai@4.104.0): + /composio-core@0.5.39(@ai-sdk/openai@3.0.1)(@cloudflare/workers-types@4.20250813.0)(@langchain/core@0.3.70)(@langchain/openai@0.6.7)(ai@6.0.3)(langchain@0.3.30)(openai@6.15.0): resolution: {integrity: sha512-7BeSFlfRzr1cbIfGYJW4jQ3BHwaObOaFKiRJIFuWOmvOrTABl1hbxGkWPA3C+uFw9CFXbZhrLWNyD7lhYy2Scg==} hasBin: true peerDependencies: @@ -22527,7 +22709,7 @@ packages: '@cloudflare/workers-types': 4.20250813.0 '@composio/mcp': 1.0.3-0 '@hey-api/client-axios': 0.2.12(axios@1.11.0) - '@langchain/core': 0.3.70(openai@4.104.0) + '@langchain/core': 0.3.70(openai@6.15.0) '@langchain/openai': 0.6.7(@langchain/core@0.3.70) ai: 6.0.3(zod@3.25.76) axios: 1.11.0 @@ -22535,9 +22717,9 @@ packages: cli-progress: 3.12.0 commander: 12.1.0 inquirer: 10.2.2 - langchain: 0.3.30(@langchain/core@0.3.70)(axios@1.11.0)(openai@4.104.0) + langchain: 0.3.30(@langchain/core@0.3.70)(axios@1.11.0)(openai@6.15.0) open: 8.4.2 - openai: 4.104.0(ws@8.18.3)(zod@3.25.76) + openai: 6.15.0(zod@3.25.76) pusher-js: 8.4.0-rc2 resolve-package-path: 4.0.3 uuid: 10.0.0 @@ -23812,21 +23994,21 @@ packages: engines: {node: '>=18'} dev: true - /detective-typescript@14.0.0(supports-color@10.2.2)(typescript@5.9.2): + /detective-typescript@14.0.0(supports-color@10.2.2)(typescript@5.9.3): resolution: {integrity: sha512-pgN43/80MmWVSEi5LUuiVvO/0a9ss5V7fwVfrJ4QzAQRd3cwqU1SfWGXJFcNKUqoD5cS+uIovhw5t/0rSeC5Mw==} engines: {node: '>=18'} peerDependencies: typescript: ^5.4.4 dependencies: - '@typescript-eslint/typescript-estree': 8.44.1(supports-color@10.2.2)(typescript@5.9.2) + '@typescript-eslint/typescript-estree': 8.44.1(supports-color@10.2.2)(typescript@5.9.3) ast-module-types: 6.0.1 node-source-walk: 7.0.1 - typescript: 5.9.2 + typescript: 5.9.3 transitivePeerDependencies: - supports-color dev: true - /detective-vue2@2.2.0(supports-color@10.2.2)(typescript@5.9.2): + /detective-vue2@2.2.0(supports-color@10.2.2)(typescript@5.9.3): resolution: {integrity: sha512-sVg/t6O2z1zna8a/UIV6xL5KUa2cMTQbdTIIvqNM0NIPswp52fe43Nwmbahzj3ww4D844u/vC2PYfiGLvD3zFA==} engines: {node: '>=18'} peerDependencies: @@ -23838,8 +24020,8 @@ packages: detective-sass: 6.0.1 detective-scss: 5.0.1 detective-stylus: 5.0.1 - detective-typescript: 14.0.0(supports-color@10.2.2)(typescript@5.9.2) - typescript: 5.9.2 + detective-typescript: 14.0.0(supports-color@10.2.2)(typescript@5.9.3) + typescript: 5.9.3 transitivePeerDependencies: - supports-color dev: true @@ -24187,7 +24369,7 @@ packages: dependencies: embla-carousel: 8.6.0 embla-carousel-reactive-utils: 8.6.0(embla-carousel@8.6.0) - vue: 3.5.22(typescript@5.9.2) + vue: 3.5.22(typescript@5.9.3) dev: false /embla-carousel-wheel-gestures@8.1.0(embla-carousel@8.6.0): @@ -24525,7 +24707,7 @@ packages: eslint: 9.33.0 dev: false - /eslint-plugin-import-lite@0.3.0(eslint@9.33.0)(typescript@5.9.2): + /eslint-plugin-import-lite@0.3.0(eslint@9.33.0)(typescript@5.9.3): resolution: {integrity: sha512-dkNBAL6jcoCsXZsQ/Tt2yXmMDoNt5NaBh/U7yvccjiK8cai6Ay+MK77bMykmqQA2bTF6lngaLCDij6MTO3KkvA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: @@ -24538,7 +24720,7 @@ packages: '@eslint-community/eslint-utils': 4.9.0(eslint@9.33.0) '@typescript-eslint/types': 8.44.1 eslint: 9.33.0 - typescript: 5.9.2 + typescript: 5.9.3 dev: false /eslint-plugin-import-x@4.16.1(eslint@9.33.0): @@ -24648,7 +24830,7 @@ packages: dependencies: '@eslint-community/eslint-utils': 4.9.0(eslint@9.33.0) '@stylistic/eslint-plugin': 5.4.0(eslint@9.33.0) - '@typescript-eslint/parser': 8.46.0(eslint@9.33.0)(typescript@5.9.2) + '@typescript-eslint/parser': 8.46.0(eslint@9.33.0)(typescript@5.9.3) eslint: 9.33.0 natural-compare: 1.4.0 nth-check: 2.1.1 @@ -25407,6 +25589,13 @@ packages: safe-regex2: 3.1.0 dev: true + /find-replace@3.0.0: + resolution: {integrity: sha512-6Tb2myMioCAgv5kfvP5/PkZZ/ntTpVK39fHY7WkWBgvbeE+VHd/tZuZ4mrC+bxh4cfOZeYKVPaJIZtZXV7GNCQ==} + engines: {node: '>=4.0.0'} + dependencies: + array-back: 3.1.0 + dev: false + /find-up-simple@1.0.1: resolution: {integrity: sha512-afd4O7zpqHeRyg4PfDQsXmlDe2PfdHtJt6Akt8jOWaApLOZk5JXs6VMR29lz03pRe9mpykrRCYIYxaJYcfpncQ==} engines: {node: '>=18'} @@ -25468,6 +25657,10 @@ packages: hasBin: true dev: true + /flatbuffers@24.12.23: + resolution: {integrity: sha512-dLVCAISd5mhls514keQzmEG6QHmUUsNuWsb4tFafIUwvvgDjXhtfAYSKOzt5SWOy+qByV5pbsDZ+Vb7HUOBEdA==} + dev: false + /flatbuffers@25.2.10: resolution: {integrity: sha512-7JlN9ZvLDG1McO3kbX0k4v+SUAg48L1rIwEvN6ZQl/eCtgJz9UylTMzE9wrmYrcorgxm3CX/3T/w5VAub99UUw==} dev: false @@ -28377,6 +28570,11 @@ packages: bignumber.js: 9.3.1 dev: false + /json-bignum@0.0.3: + resolution: {integrity: sha512-2WHyXj3OfHSgNyuzDbSxI1w2jgw5gkWSWhS7Qg4bWXx1nLk3jnbwfUeS0PSba3IzpTUWdHxBieELUzXRjQB2zg==} + engines: {node: '>=0.8'} + dev: false + /json-buffer@3.0.0: resolution: {integrity: sha512-CuUqjv0FUZIdXkHPI8MezCnFCdaTAacej1TZYulLoAg1h/PhwkdXFN4V/gzY4g+fMBCOV2xF+rp7t2XD2ns/NQ==} dev: false @@ -28613,7 +28811,7 @@ packages: - ws dev: false - /langchain@0.3.30(@langchain/core@0.3.70)(axios@1.11.0)(openai@4.104.0): + /langchain@0.3.30(@langchain/core@0.3.70)(axios@1.11.0)(openai@6.15.0): resolution: {integrity: sha512-UyVsfwHDpHbrnWrjWuhJHqi8Non+Zcsf2kdpDTqyJF8NXrHBOpjdHT5LvPuW9fnE7miDTWf5mLcrWAGZgcrznQ==} engines: {node: '>=18'} peerDependencies: @@ -28671,14 +28869,14 @@ packages: typeorm: optional: true dependencies: - '@langchain/core': 0.3.70(openai@4.104.0) + '@langchain/core': 0.3.70(openai@6.15.0) '@langchain/openai': 0.6.7(@langchain/core@0.3.70) '@langchain/textsplitters': 0.1.0(@langchain/core@0.3.70) axios: 1.11.0 js-tiktoken: 1.0.21 js-yaml: 4.1.0 jsonpointer: 5.0.1 - langsmith: 0.3.58(openai@4.104.0) + langsmith: 0.3.58(openai@6.15.0) openapi-types: 12.1.3 p-retry: 4.6.2 uuid: 10.0.0 @@ -28717,7 +28915,7 @@ packages: vscode-uri: 3.0.8 dev: false - /langsmith@0.3.58(openai@4.104.0): + /langsmith@0.3.58(openai@5.23.2): resolution: {integrity: sha512-bbqSVCDSF8zzl7KBvd33YpaTOuMVk05XF/WSEvP6nF17g9mt6lIVo1JM9BgC20fDTeSQ35TjMN6NS5Nl2TVC5w==} peerDependencies: '@opentelemetry/api': '*' @@ -28737,14 +28935,13 @@ packages: '@types/uuid': 10.0.0 chalk: 4.1.2 console-table-printer: 2.14.6 - openai: 4.104.0(ws@8.18.3)(zod@3.25.76) + openai: 5.23.2(zod@3.25.76) p-queue: 6.6.2 p-retry: 4.6.2 semver: 7.7.2 uuid: 10.0.0 - dev: false - /langsmith@0.3.58(openai@5.23.2): + /langsmith@0.3.58(openai@6.15.0): resolution: {integrity: sha512-bbqSVCDSF8zzl7KBvd33YpaTOuMVk05XF/WSEvP6nF17g9mt6lIVo1JM9BgC20fDTeSQ35TjMN6NS5Nl2TVC5w==} peerDependencies: '@opentelemetry/api': '*' @@ -28764,11 +28961,12 @@ packages: '@types/uuid': 10.0.0 chalk: 4.1.2 console-table-printer: 2.14.6 - openai: 5.23.2(zod@3.25.76) + openai: 6.15.0(zod@3.25.76) p-queue: 6.6.2 p-retry: 4.6.2 semver: 7.7.2 uuid: 10.0.0 + dev: false /latest-version@5.1.0: resolution: {integrity: sha512-weT+r0kTkRQdCdYCNtkMwWXQTMEswKrFBkm4ckQOMVhhqhIMI1UT2hMj+1iigIhgSZm5gTmrRXBNoGUgaTY1xA==} @@ -29545,8 +29743,8 @@ packages: /magicast@0.3.5: resolution: {integrity: sha512-L0WhttDl+2BOsybvEOLK7fW3UA0OQ0IQ2d6Zl2x/a6vVRs3bAY0ECOSHHeL5jD+SbOpOCUEi0y1DgHEn9Qn1AQ==} dependencies: - '@babel/parser': 7.28.5 - '@babel/types': 7.28.5 + '@babel/parser': 7.28.4 + '@babel/types': 7.28.4 source-map-js: 1.2.1 /make-dir@2.1.0: @@ -30829,7 +31027,7 @@ packages: framer-motion: 12.23.12 hey-listen: 1.0.8 motion-dom: 12.23.12 - vue: 3.5.22(typescript@5.9.2) + vue: 3.5.22(typescript@5.9.3) transitivePeerDependencies: - '@emotion/is-prop-valid' - react @@ -31722,7 +31920,7 @@ packages: dependencies: boolbase: 1.0.0 - /nuxt@4.1.3(@biomejs/biome@1.9.4)(@types/node@24.2.1)(@vue/compiler-sfc@3.5.22)(eslint@9.33.0)(typescript@5.9.2)(vite@7.2.7): + /nuxt@4.1.3(@biomejs/biome@1.9.4)(@types/node@24.2.1)(@vue/compiler-sfc@3.5.22)(eslint@9.33.0)(typescript@5.9.3)(vite@7.2.7): resolution: {integrity: sha512-FPl+4HNIOTRYWQXtsZe5KJAr/eddFesuXABvcSTnFLYckIfnxcistwmbtPlkJhkW6vr/Jdhef5QqqYYkBsowGg==} engines: {node: ^20.19.0 || >=22.12.0} hasBin: true @@ -31741,7 +31939,7 @@ packages: '@nuxt/kit': 4.1.3 '@nuxt/schema': 4.1.3 '@nuxt/telemetry': 2.6.6 - '@nuxt/vite-builder': 4.1.3(@biomejs/biome@1.9.4)(@types/node@24.2.1)(eslint@9.33.0)(typescript@5.9.2)(vue@3.5.22) + '@nuxt/vite-builder': 4.1.3(@biomejs/biome@1.9.4)(@types/node@24.2.1)(eslint@9.33.0)(typescript@5.9.3)(vue@3.5.22) '@types/node': 24.2.1 '@unhead/vue': 2.0.19(vue@3.5.22) '@vue/shared': 3.5.22 @@ -31792,10 +31990,10 @@ packages: unctx: 2.4.1 unimport: 5.4.1 unplugin: 2.3.10 - unplugin-vue-router: 0.15.0(@vue/compiler-sfc@3.5.22)(typescript@5.9.2)(vue-router@4.5.1)(vue@3.5.22) + unplugin-vue-router: 0.15.0(@vue/compiler-sfc@3.5.22)(typescript@5.9.3)(vue-router@4.5.1)(vue@3.5.22) unstorage: 1.17.1(db0@0.3.2)(ioredis@5.7.0) untyped: 2.0.0 - vue: 3.5.22(typescript@5.9.2) + vue: 3.5.22(typescript@5.9.3) vue-bundle-renderer: 2.2.0 vue-devtools-stub: 0.1.0 vue-router: 4.5.1(vue@3.5.22) @@ -32308,6 +32506,21 @@ packages: zod: 4.2.1 dev: true + /openai@6.15.0(zod@3.25.76): + resolution: {integrity: sha512-F1Lvs5BoVvmZtzkUEVyh8mDQPPFolq4F+xdsx/DO8Hee8YF3IGAlZqUIsF+DVGhqf4aU0a3bTghsxB6OIsRy1g==} + hasBin: true + peerDependencies: + ws: ^8.18.0 + zod: ^3.25 || ^4.0 + peerDependenciesMeta: + ws: + optional: true + zod: + optional: true + dependencies: + zod: 3.25.76 + dev: false + /openapi-types@12.1.3: resolution: {integrity: sha512-N4YtSYJqghVu4iek2ZUvcN/0aqH1kRDuNqzcycDxhOUpg7GdvLa2F3DgS6yBNhInhv2r/6I0Flkn7CqL8+nIcw==} dev: false @@ -33686,12 +33899,12 @@ packages: detective-sass: 6.0.1 detective-scss: 5.0.1 detective-stylus: 5.0.1 - detective-typescript: 14.0.0(supports-color@10.2.2)(typescript@5.9.2) - detective-vue2: 2.2.0(supports-color@10.2.2)(typescript@5.9.2) + detective-typescript: 14.0.0(supports-color@10.2.2)(typescript@5.9.3) + detective-vue2: 2.2.0(supports-color@10.2.2)(typescript@5.9.3) module-definition: 6.0.1 node-source-walk: 7.0.1 postcss: 8.5.6 - typescript: 5.9.2 + typescript: 5.9.3 transitivePeerDependencies: - supports-color dev: true @@ -34648,7 +34861,7 @@ packages: vfile: 6.0.3 dev: false - /reka-ui@2.5.1(typescript@5.9.2)(vue@3.5.22): + /reka-ui@2.5.1(typescript@5.9.3)(vue@3.5.22): resolution: {integrity: sha512-QJGB3q21wQ1Kw28HhhNDpjfFe8qpePX1gK4FTBRd68XTh9aEnhR5bTJnlV0jxi8FBPh0xivZBeNFUc3jiGx7mQ==} peerDependencies: vue: '>= 3.2.0' @@ -34658,12 +34871,12 @@ packages: '@internationalized/date': 3.10.0 '@internationalized/number': 3.6.5 '@tanstack/vue-virtual': 3.13.12(vue@3.5.22) - '@vueuse/core': 12.8.2(typescript@5.9.2) - '@vueuse/shared': 12.8.2(typescript@5.9.2) + '@vueuse/core': 12.8.2(typescript@5.9.3) + '@vueuse/shared': 12.8.2(typescript@5.9.3) aria-hidden: 1.2.6 defu: 6.1.4 ohash: 2.0.11 - vue: 3.5.22(typescript@5.9.2) + vue: 3.5.22(typescript@5.9.3) transitivePeerDependencies: - '@vue/composition-api' - typescript @@ -36341,7 +36554,7 @@ packages: peerDependencies: vue: '>=3.2.26 < 4' dependencies: - vue: 3.5.22(typescript@5.9.2) + vue: 3.5.22(typescript@5.9.3) dev: false /symbol-observable@4.0.0: @@ -36387,6 +36600,14 @@ packages: resolution: {integrity: sha512-EIHvdY5bPLuWForiR/AN2Bxngzpuwn1is4asboytXtpTgsArc+WmSJKVLlhdh71u7jFcryDqB2A8lQvj78MkyQ==} dev: false + /table-layout@4.1.1: + resolution: {integrity: sha512-iK5/YhZxq5GO5z8wb0bY1317uDF3Zjpha0QFFLA8/trAoiLbQD0HUbMesEaxyzUgDxi2QlcbM8IvqOlEjgoXBA==} + engines: {node: '>=12.17'} + dependencies: + array-back: 6.2.2 + wordwrapjs: 5.1.1 + dev: false + /tailwind-merge@3.3.1: resolution: {integrity: sha512-gBXpgUm/3rp1lMZZrM/w7D8GKqshif0zAymAhbCyIt8KMe+0v9DQ7cdYLR4FHH/cKpdTXb+A/tKKU3eolfsI+g==} dev: false @@ -36902,13 +37123,13 @@ packages: /trough@2.2.0: resolution: {integrity: sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==} - /ts-api-utils@2.1.0(typescript@5.9.2): + /ts-api-utils@2.1.0(typescript@5.9.3): resolution: {integrity: sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ==} engines: {node: '>=18.12'} peerDependencies: typescript: '>=4.8.4' dependencies: - typescript: 5.9.2 + typescript: 5.9.3 /ts-dedent@2.2.0: resolution: {integrity: sha512-q5W7tVM71e2xjHZTlgfTDoPF/SmqKG5hddq9SzR49CH2hayqRKJtQ4mtRlSxKaJlR/+9rEM+mnBHf7I2/BQcpQ==} @@ -36924,7 +37145,7 @@ packages: resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==} dev: true - /ts-jest@29.4.1(@babel/core@7.28.5)(esbuild@0.25.10)(jest@29.7.0)(typescript@5.9.2): + /ts-jest@29.4.1(@babel/core@7.28.5)(esbuild@0.25.10)(jest@29.7.0)(typescript@5.9.3): resolution: {integrity: sha512-SaeUtjfpg9Uqu8IbeDKtdaS0g8lS6FT6OzM3ezrDfErPJPHNDo/Ey+VFGP1bQIDfagYDLyRpd7O15XpG1Es2Uw==} engines: {node: ^14.15.0 || ^16.10.0 || ^18.0.0 || >=20.0.0} hasBin: true @@ -36962,7 +37183,7 @@ packages: make-error: 1.3.6 semver: 7.7.2 type-fest: 4.41.0 - typescript: 5.9.2 + typescript: 5.9.3 yargs-parser: 21.1.1 dev: true @@ -37030,7 +37251,7 @@ packages: yn: 3.1.1 dev: true - /ts-node@10.9.2(@swc/core@1.5.29)(@types/node@24.2.1)(typescript@5.9.2): + /ts-node@10.9.2(@swc/core@1.5.29)(@types/node@24.2.1)(typescript@5.9.3): resolution: {integrity: sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==} hasBin: true peerDependencies: @@ -37057,7 +37278,7 @@ packages: create-require: 1.1.1 diff: 4.0.2 make-error: 1.3.6 - typescript: 5.9.2 + typescript: 5.9.3 v8-compile-cache-lib: 3.0.1 yn: 3.1.1 dev: true @@ -37344,6 +37565,21 @@ packages: engines: {node: '>=14.17'} hasBin: true + /typescript@5.9.3: + resolution: {integrity: sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==} + engines: {node: '>=14.17'} + hasBin: true + + /typical@4.0.0: + resolution: {integrity: sha512-VAH4IvQ7BDFYglMd7BPRDfLgxZZX4O4TFcRDA6EN5X7erNJJq+McIEp8np9aVtxrCJ6qx4GTYVfOWNjcqwZgRw==} + engines: {node: '>=8'} + dev: false + + /typical@7.3.0: + resolution: {integrity: sha512-ya4mg/30vm+DOWfBg4YK3j2WD6TWtRkCbasOJr40CseYENzCUby/7rIvXA99JGsQHeNxLbnXdyLLxKSv3tauFw==} + engines: {node: '>=12.17'} + dev: false + /ufo@1.6.1: resolution: {integrity: sha512-9a4/uxlTWJ4+a5i0ooc1rU7C7YOw3wT+UGqdeNNHWnOF9qcMBgLRS+4IYUqbczewFx4mLEig6gawh7X6mFlEkA==} @@ -37812,12 +38048,12 @@ packages: tinyglobby: 0.2.15 unplugin: 2.3.10 unplugin-utils: 0.3.0 - vue: 3.5.22(typescript@5.9.2) + vue: 3.5.22(typescript@5.9.3) transitivePeerDependencies: - supports-color dev: false - /unplugin-vue-router@0.15.0(@vue/compiler-sfc@3.5.22)(typescript@5.9.2)(vue-router@4.5.1)(vue@3.5.22): + /unplugin-vue-router@0.15.0(@vue/compiler-sfc@3.5.22)(typescript@5.9.3)(vue-router@4.5.1)(vue@3.5.22): resolution: {integrity: sha512-PyGehCjd9Ny9h+Uer4McbBjjib3lHihcyUEILa7pHKl6+rh8N7sFyw4ZkV+N30Oq2zmIUG7iKs3qpL0r+gXAaQ==} peerDependencies: '@vue/compiler-sfc': ^3.5.17 @@ -37828,7 +38064,7 @@ packages: dependencies: '@vue-macros/common': 3.0.0-beta.16(vue@3.5.22) '@vue/compiler-sfc': 3.5.22 - '@vue/language-core': 3.1.1(typescript@5.9.2) + '@vue/language-core': 3.1.1(typescript@5.9.3) ast-walker-scope: 0.8.3 chokidar: 4.0.3 json5: 2.2.3 @@ -38383,8 +38619,8 @@ packages: vue: ^3.3.0 dependencies: '@vueuse/core': 10.11.1(vue@3.5.22) - reka-ui: 2.5.1(typescript@5.9.2)(vue@3.5.22) - vue: 3.5.22(typescript@5.9.2) + reka-ui: 2.5.1(typescript@5.9.3)(vue@3.5.22) + vue: 3.5.22(typescript@5.9.3) transitivePeerDependencies: - '@vue/composition-api' dev: false @@ -38492,7 +38728,7 @@ packages: - yaml dev: false - /vite-plugin-checker@0.11.0(@biomejs/biome@1.9.4)(eslint@9.33.0)(typescript@5.9.2)(vite@7.2.7): + /vite-plugin-checker@0.11.0(@biomejs/biome@1.9.4)(eslint@9.33.0)(typescript@5.9.3)(vite@7.2.7): resolution: {integrity: sha512-iUdO9Pl9UIBRPAragwi3as/BXXTtRu4G12L3CMrjx+WVTd9g/MsqNakreib9M/2YRVkhZYiTEwdH2j4Dm0w7lw==} engines: {node: '>=16.11'} peerDependencies: @@ -38538,7 +38774,7 @@ packages: picomatch: 4.0.3 tiny-invariant: 1.3.3 tinyglobby: 0.2.15 - typescript: 5.9.2 + typescript: 5.9.3 vite: 7.2.7(@types/node@24.2.1)(jiti@2.6.1) vscode-uri: 3.1.0 dev: false @@ -38580,7 +38816,7 @@ packages: pathe: 2.0.3 source-map-js: 1.2.1 vite: 7.2.7(@types/node@24.2.1)(jiti@2.5.1)(tsx@4.20.4) - vue: 3.5.22(typescript@5.9.2) + vue: 3.5.22(typescript@5.9.3) dev: false /vite@7.2.7(@types/node@24.2.1)(jiti@2.5.1)(tsx@4.20.4): @@ -38885,7 +39121,7 @@ packages: '@vue/composition-api': optional: true dependencies: - vue: 3.5.22(typescript@5.9.2) + vue: 3.5.22(typescript@5.9.3) dev: false /vue-devtools-stub@0.1.0: @@ -38915,10 +39151,10 @@ packages: vue: ^3.2.0 dependencies: '@vue/devtools-api': 6.6.4 - vue: 3.5.22(typescript@5.9.2) + vue: 3.5.22(typescript@5.9.3) dev: false - /vue@3.5.22(typescript@5.9.2): + /vue@3.5.22(typescript@5.9.3): resolution: {integrity: sha512-toaZjQ3a/G/mYaLSbV+QsQhIdMo9x5rrqIpYRObsJ6T/J+RyCSFwN2LHNVH9v8uIcljDNa3QzPVdv3Y6b9hAJQ==} peerDependencies: typescript: '*' @@ -38931,7 +39167,7 @@ packages: '@vue/runtime-dom': 3.5.22 '@vue/server-renderer': 3.5.22(vue@3.5.22) '@vue/shared': 3.5.22 - typescript: 5.9.2 + typescript: 5.9.3 dev: false /w3c-xmlserializer@4.0.0: @@ -39218,6 +39454,11 @@ packages: resolution: {integrity: sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==} dev: true + /wordwrapjs@5.1.1: + resolution: {integrity: sha512-0yweIbkINJodk27gX9LBGMzyQdBDan3s/dEAiwBOj+Mf0PPyWL6/rikalkv8EeD0E8jm4o5RXEOrFTP3NXbhJg==} + engines: {node: '>=12.17'} + dev: false + /workerd@1.20250718.0: resolution: {integrity: sha512-kqkIJP/eOfDlUyBzU7joBg+tl8aB25gEAGqDap+nFWb+WHhnooxjGHgxPBy3ipw2hnShPFNOQt5lFRxbwALirg==} engines: {node: '>=16'} diff --git a/website/docs/rag/lancedb.md b/website/docs/rag/lancedb.md new file mode 100644 index 000000000..731d95bb8 --- /dev/null +++ b/website/docs/rag/lancedb.md @@ -0,0 +1,272 @@ +--- +title: LanceDB Integration +slug: /rag/lancedb +--- + +# VoltAgent with LanceDB + +[LanceDB](https://lancedb.com/) is a developer-friendly, serverless vector database for developers. It runs in-process (embedded) or in the cloud, making it perfect for both local prototyping and production scaling without managing infrastructure. + +## Prerequisites + +Before starting, ensure you have: + +- Node.js 20+ installed +- OpenAI API key (for embeddings) +- (Optional) LanceDB Cloud account if deploying to production + +## Installation + +Create a new VoltAgent project with LanceDB integration: + +```bash +npm create voltagent-app@latest -- --example with-lancedb +cd with-lancedb +``` + +This creates a complete VoltAgent + LanceDB setup with sample data and two different agent configurations. + +Install the dependencies: + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; + + + + ```bash + npm install + ``` + + + ```bash + pnpm install + ``` + + + ```bash + yarn install + ``` + + + +## Environment Setup + +Create a `.env` file with your configuration: + +```env +# OpenAI API key for embeddings and LLM +OPENAI_API_KEY=your-openai-api-key-here + +# Optional: Custom path for local DB (defaults to .voltagent/lancedb) +# LANCEDB_URI=.voltagent/lancedb +``` + +## Run Your Application + +Start your VoltAgent application: + + + + ```bash + npm run dev + ``` + + + ```bash + pnpm dev + ``` + + + ```bash + yarn dev + ``` + + + +You'll see: + +``` +πŸš€ VoltAgent with LanceDB is running! +Connected to LanceDB at .voltagent/lancedb +πŸ“‹ Creating new table "voltagent-knowledge-base"... +πŸ“š Generating embeddings for sample documents... +βœ… Table "voltagent-knowledge-base" created with 3 records +πŸ“š Two different agents are ready: + 1️⃣ Assistant with Retriever - Automatic semantic search on every interaction + 2️⃣ Assistant with Tools - LLM decides when to search autonomously + + ══════════════════════════════════════════════════ + VOLTAGENT SERVER STARTED SUCCESSFULLY + ══════════════════════════════════════════════════ + βœ“ HTTP Server: http://localhost:3141 +``` + +## How It Works + +### Create the LanceDB Retriever + +Create `src/retriever/index.ts`: + +```typescript +import fs from "node:fs/promises"; +import path from "node:path"; +import { openai } from "@ai-sdk/openai"; +import { connect } from "@lancedb/lancedb"; +import { BaseRetriever, type BaseMessage, type RetrieveOptions } from "@voltagent/core"; +import { embed } from "ai"; + +// Initialize LanceDB configuration +const dbUri = process.env.LANCEDB_URI || path.resolve(process.cwd(), ".voltagent/lancedb"); +const tableName = "voltagent-knowledge-base"; +``` + +**Key Components Explained**: + +- **Embedded Database**: LanceDB runs locally within your Node.js process by default +- **Zero Config**: No servers to provision or manage +- **Path-based Storage**: Data persists in the `.voltagent/lancedb` directory + +### Initialize Table and Sample Data + +The example checks if the table exists and populates it if not: + +```typescript +async function initializeIndex() { + try { + // Ensure directory exists + if (!dbUri.startsWith("lancedb+")) { + await fs.mkdir(path.dirname(dbUri), { recursive: true }); + } + + const db = await connect(dbUri); + const tableNames = await db.tableNames(); + + if (!tableNames.includes(tableName)) { + console.log(`πŸ“‹ Creating new table "${tableName}"...`); + // ... generate embeddings ... + await db.createTable(tableName, recordsWithEmbeddings); + } + } catch (error) { + console.error("Error initializing LanceDB:", error); + } +} +``` + +### Implement the Retriever Class + +```typescript +export class LanceDBRetriever extends BaseRetriever { + async retrieve(input: string | BaseMessage[], options: RetrieveOptions): Promise { + const db = await connect(dbUri); + const table = await db.openTable(tableName); + + // 1. Determine search text + let searchText = ""; + if (typeof input === "string") { + searchText = input; + } else if (Array.isArray(input)) { + const lastMessage = input[input.length - 1]; + searchText = + typeof lastMessage.content === "string" + ? lastMessage.content + : lastMessage.content.map((p) => (p.type === "text" ? p.text : "")).join(" "); + } + + // 2. Generate Embedding + const { embedding } = await embed({ + model: openai.embedding("text-embedding-3-small"), + value: searchText, + }); + + // 3. Vector Search + const results = await table.vectorSearch(embedding).limit(3).toArray(); + + // 4. Format Output + if (results.length === 0) return "No relevant documents found."; + + return results + .map((doc, i) => `Document ${i + 1} (${doc.title}):\n${doc.text}`) + .join("\n\n---\n\n"); + } +} +``` + +## Customization Options + +### Different Embedding Models + +You can swap OpenAI for other providers: + +```typescript +// Using a larger model +const { embedding } = await embed({ + model: openai.embedding("text-embedding-3-large"), + value: query, +}); +``` + +### Adding Documents Programmatically + +```typescript +async function addDocument(text: string, metadata: Record) { + const db = await connect(dbUri); + const table = await db.openTable(tableName); + + const { embedding } = await embed({ + model: openai.embedding("text-embedding-3-small"), + value: text, + }); + + await table.add([ + { + text, + vector: embedding, + ...metadata, + timestamp: Date.now(), + }, + ]); +} +``` + +### Filtering + +LanceDB supports SQL-like filtering: + +```typescript +const results = await table + .vectorSearch(embedding) + .where("category = 'documentation' AND timestamp > 1700000000") + .limit(5) + .toArray(); +``` + +## Best Practices + +**Storage**: + +- For local dev, `.voltagent/lancedb` is great (git-ignore it). +- For production, store data in S3/GCS or use **LanceDB Cloud**. + +**Performance**: + +- Create an IVFFlat index for large datasets (>100k vectors) to speed up search. +- Use `table.createIndex()` for scalar columns you filter on frequently. + +**Multimodal**: + +- LanceDB isn't just for text! It natively stores images, audio, and more. You can store file paths or binary data in columns alongside your vectors. + +## Troubleshooting + +**Native Module Errors**: + +- Ensure you are on a supported architecture (x64/arm64). +- If you see errors about `libssl` or GLIBC, try rebuilding: `npm rebuild @lancedb/lancedb`. + +**Version Mismatches**: + +- Ensure your embedding dimensions (e.g. 1536) match what you defined when creating the table. LanceDB infers schema from the first row, so be consistent. + +**Lockfile Issues**: + +- Local LanceDB uses file locks. Ensure you don't have multiple processes trying to write to the same table path simultaneously in strict modes. diff --git a/website/docs/rag/overview.md b/website/docs/rag/overview.md index 21800ddc6..6c04de785 100644 --- a/website/docs/rag/overview.md +++ b/website/docs/rag/overview.md @@ -212,6 +212,16 @@ npm create voltagent-app@latest -- --example with-qdrant [**β†’ Full Qdrant Guide**](/docs/rag/qdrant) +### LanceDB Vector Database + +Developer-friendly, serverless vector database that runs locally or in the cloud. Great for getting started without credentials. + +```bash +npm create voltagent-app@latest -- --example with-lancedb +``` + +[**β†’ Full LanceDB Guide**](/docs/rag/lancedb) + ## Choose Your Path **I want the fastest setup** β†’ [VoltAgent Knowledge Base](/docs/rag/voltagent) (5 mins) @@ -222,6 +232,8 @@ npm create voltagent-app@latest -- --example with-qdrant **I want open-source and production-ready** β†’ [Qdrant Tutorial](/docs/rag/qdrant) (10 mins) +**I want embedded/serverless (No API Key)** β†’ [LanceDB Tutorial](/docs/rag/lancedb) (5 mins) + **I want to build custom** β†’ [Build Your Own Retriever](/docs/rag/custom-retrievers) **I want to see examples** β†’ [GitHub Examples](https://github.com/voltagent/voltagent/tree/main/examples)