diff --git a/package.json b/package.json index 2b7432678a..b989c1ea45 100644 --- a/package.json +++ b/package.json @@ -53,6 +53,7 @@ "@electron-toolkit/utils": "^3.0.0", "@electron/notarize": "^2.5.0", "@google/generative-ai": "^0.21.0", + "@langchain/community": "^0.3.36", "@llm-tools/embedjs": "patch:@llm-tools/embedjs@npm%3A0.1.28#~/.yarn/patches/@llm-tools-embedjs-npm-0.1.28-8e4393fa2d.patch", "@llm-tools/embedjs-libsql": "^0.1.28", "@llm-tools/embedjs-loader-csv": "^0.1.28", diff --git a/src/main/embeddings/Embeddings.ts b/src/main/embeddings/Embeddings.ts new file mode 100644 index 0000000000..1cbbce9ee8 --- /dev/null +++ b/src/main/embeddings/Embeddings.ts @@ -0,0 +1,24 @@ +import type { BaseEmbeddings } from '@llm-tools/embedjs-interfaces' +import { KnowledgeBaseParams } from '@types' + +import EmbeddingsFactory from './EmbeddingsFactory' + +export default class Embeddings { + private sdk: BaseEmbeddings + constructor({ model, apiKey, apiVersion, baseURL, dimensions }: KnowledgeBaseParams) { + this.sdk = EmbeddingsFactory.create({ model, apiKey, apiVersion, baseURL, dimensions } as KnowledgeBaseParams) + } + public async init(): Promise { + return this.sdk.init() + } + public async getDimensions(): Promise { + return this.sdk.getDimensions() + } + public async embedDocuments(texts: string[]): Promise { + return this.sdk.embedDocuments(texts) + } + + public async embedQuery(text: string): Promise { + return this.sdk.embedQuery(text) + } +} diff --git a/src/main/embeddings/EmbeddingsFactory.ts b/src/main/embeddings/EmbeddingsFactory.ts new file mode 100644 index 0000000000..6524f9b97d --- /dev/null +++ b/src/main/embeddings/EmbeddingsFactory.ts @@ -0,0 +1,38 @@ +import type { BaseEmbeddings } from '@llm-tools/embedjs-interfaces' +import { OpenAiEmbeddings } from '@llm-tools/embedjs-openai' +import { AzureOpenAiEmbeddings } from '@llm-tools/embedjs-openai/src/azure-openai-embeddings' +import { getInstanceName } from '@main/utils' +import { KnowledgeBaseParams } from '@types' + +import VoyageEmbeddings from './VoyageEmbeddings' + +export default class EmbeddingsFactory { + static create({ model, apiKey, apiVersion, baseURL, dimensions }: KnowledgeBaseParams): BaseEmbeddings { + const batchSize = 10 + if (model.includes('voyage')) { + return new VoyageEmbeddings({ + modelName: model, + apiKey, + outputDimension: dimensions, + batchSize: 8 + }) + } + if (apiVersion !== undefined) { + return new AzureOpenAiEmbeddings({ + azureOpenAIApiKey: apiKey, + azureOpenAIApiVersion: apiVersion, + azureOpenAIApiDeploymentName: model, + azureOpenAIApiInstanceName: getInstanceName(baseURL), + dimensions, + batchSize + }) + } + return new OpenAiEmbeddings({ + model, + apiKey, + dimensions, + batchSize, + configuration: { baseURL } + }) + } +} diff --git a/src/main/embeddings/VoyageEmbeddings.ts b/src/main/embeddings/VoyageEmbeddings.ts new file mode 100644 index 0000000000..7635c1146d --- /dev/null +++ b/src/main/embeddings/VoyageEmbeddings.ts @@ -0,0 +1,30 @@ +import { VoyageEmbeddings as _VoyageEmbeddings } from '@langchain/community/embeddings/voyage' +import { BaseEmbeddings } from '@llm-tools/embedjs-interfaces' + +export default class VoyageEmbeddings extends BaseEmbeddings { + private model: _VoyageEmbeddings + constructor(private readonly configuration?: ConstructorParameters[0]) { + super() + if (!this.configuration) this.configuration = {} + if (!this.configuration.modelName) this.configuration.modelName = 'voyage-3' + + if (!this.configuration.outputDimension) { + throw new Error('You need to pass in the optional dimensions parameter for this model') + } + this.model = new _VoyageEmbeddings(this.configuration) + } + override async getDimensions(): Promise { + if (!this.configuration?.outputDimension) { + throw new Error('You need to pass in the optional dimensions parameter for this model') + } + return this.configuration?.outputDimension + } + + override async embedDocuments(texts: string[]): Promise { + return this.model.embedDocuments(texts) + } + + override async embedQuery(text: string): Promise { + return this.model.embedQuery(text) + } +} diff --git a/src/main/reranker/RerankerFactory.ts b/src/main/reranker/RerankerFactory.ts index 0c2e8d7dd3..9557d58a97 100644 --- a/src/main/reranker/RerankerFactory.ts +++ b/src/main/reranker/RerankerFactory.ts @@ -4,6 +4,7 @@ import BaseReranker from './BaseReranker' import DefaultReranker from './DefaultReranker' import JinaReranker from './JinaReranker' import SiliconFlowReranker from './SiliconFlowReranker' +import VoyageReranker from './VoyageReranker' export default class RerankerFactory { static create(base: KnowledgeBaseParams): BaseReranker { @@ -11,6 +12,8 @@ export default class RerankerFactory { return new SiliconFlowReranker(base) } else if (base.rerankModelProvider === 'jina') { return new JinaReranker(base) + } else if (base.rerankModelProvider === 'voyageai') { + return new VoyageReranker(base) } return new DefaultReranker(base) } diff --git a/src/main/reranker/VoyageReranker.ts b/src/main/reranker/VoyageReranker.ts new file mode 100644 index 0000000000..7105788291 --- /dev/null +++ b/src/main/reranker/VoyageReranker.ts @@ -0,0 +1,60 @@ +import { ExtractChunkData } from '@llm-tools/embedjs-interfaces' +import { KnowledgeBaseParams } from '@types' +import axios from 'axios' + +import BaseReranker from './BaseReranker' + +export default class VoyageReranker extends BaseReranker { + constructor(base: KnowledgeBaseParams) { + super(base) + } + + public rerank = async (query: string, searchResults: ExtractChunkData[]): Promise => { + let baseURL = this.base?.rerankBaseURL?.endsWith('/') + ? this.base.rerankBaseURL.slice(0, -1) + : this.base.rerankBaseURL + + if (baseURL && !baseURL.endsWith('/v1')) { + baseURL = `${baseURL}/v1` + } + + const url = `${baseURL}/rerank` + + const requestBody = { + model: this.base.rerankModel, + query, + documents: searchResults.map((doc) => doc.pageContent), + top_k: this.base.topN, + return_documents: false, + truncation: true + } + + try { + const { data } = await axios.post(url, requestBody, { + headers: { + ...this.defaultHeaders() + } + }) + + const rerankResults = data.data + + const resultMap = new Map(rerankResults.map((result: any) => [result.index, result.relevance_score || 0])) + + return searchResults + .map((doc: ExtractChunkData, index: number) => { + const score = resultMap.get(index) + if (score === undefined) return undefined + + return { + ...doc, + score + } + }) + .filter((doc): doc is ExtractChunkData => doc !== undefined) + .sort((a, b) => b.score - a.score) + } catch (error: any) { + console.error('Voyage Reranker API 错误:', error.message || error) + throw new Error(`${error} - BaseUrl: ${baseURL}`) + } + } +} diff --git a/src/main/services/KnowledgeService.ts b/src/main/services/KnowledgeService.ts index f9fedb78b7..098f3170c4 100644 --- a/src/main/services/KnowledgeService.ts +++ b/src/main/services/KnowledgeService.ts @@ -21,11 +21,10 @@ import type { ExtractChunkData } from '@llm-tools/embedjs-interfaces' import { LibSqlDb } from '@llm-tools/embedjs-libsql' import { SitemapLoader } from '@llm-tools/embedjs-loader-sitemap' import { WebLoader } from '@llm-tools/embedjs-loader-web' -import { AzureOpenAiEmbeddings, OpenAiEmbeddings } from '@llm-tools/embedjs-openai' +import Embeddings from '@main/embeddings/Embeddings' import { addFileLoader } from '@main/loader' import Reranker from '@main/reranker/Reranker' import { windowService } from '@main/services/WindowService' -import { getInstanceName } from '@main/utils' import { getAllFiles } from '@main/utils/file' import type { LoaderReturn } from '@shared/config/types' import { FileType, KnowledgeBaseParams, KnowledgeItem } from '@types' @@ -114,29 +113,20 @@ class KnowledgeService { baseURL, dimensions }: KnowledgeBaseParams): Promise => { - const batchSize = 10 - return new RAGApplicationBuilder() - .setModel('NO_MODEL') - .setEmbeddingModel( - apiVersion - ? new AzureOpenAiEmbeddings({ - azureOpenAIApiKey: apiKey, - azureOpenAIApiVersion: apiVersion, - azureOpenAIApiDeploymentName: model, - azureOpenAIApiInstanceName: getInstanceName(baseURL), - dimensions, - batchSize - }) - : new OpenAiEmbeddings({ - model, - apiKey, - dimensions, - batchSize, - configuration: { baseURL } - }) - ) - .setVectorDatabase(new LibSqlDb({ path: path.join(this.storageDir, id) })) - .build() + let ragApplication: RAGApplication + const embeddings = new Embeddings({ model, apiKey, apiVersion, baseURL, dimensions } as KnowledgeBaseParams) + try { + ragApplication = await new RAGApplicationBuilder() + .setModel('NO_MODEL') + .setEmbeddingModel(embeddings) + .setVectorDatabase(new LibSqlDb({ path: path.join(this.storageDir, id) })) + .build() + } catch (e) { + Logger.error(e) + throw new Error(`Failed to create RAGApplication: ${e}`) + } + + return ragApplication } public create = async (_: Electron.IpcMainInvokeEvent, base: KnowledgeBaseParams): Promise => { diff --git a/src/renderer/src/assets/images/models/voyageai.png b/src/renderer/src/assets/images/models/voyageai.png new file mode 100644 index 0000000000..dfdfcd36da Binary files /dev/null and b/src/renderer/src/assets/images/models/voyageai.png differ diff --git a/src/renderer/src/assets/images/providers/voyageai.png b/src/renderer/src/assets/images/providers/voyageai.png new file mode 100644 index 0000000000..dfdfcd36da Binary files /dev/null and b/src/renderer/src/assets/images/providers/voyageai.png differ diff --git a/src/renderer/src/config/embedings.ts b/src/renderer/src/config/embedings.ts index 12734cc153..1530a006c4 100644 --- a/src/renderer/src/config/embedings.ts +++ b/src/renderer/src/config/embedings.ts @@ -242,6 +242,58 @@ export const EMBEDDING_MODELS = [ { id: 'mistral-embed', max_context: 8000 + }, + { + id: 'voyage-3-large', + max_context: 1024 + }, + { + id: 'voyage-3-large', + max_context: 256 + }, + { + id: 'voyage-3-large', + max_context: 512 + }, + { + id: 'voyage-3-large', + max_context: 2048 + }, + { + id: 'voyage-3', + max_context: 1024 + }, + { + id: 'voyage-3-lite', + max_context: 512 + }, + { + id: 'voyage-code-3', + max_context: 1024 + }, + { + id: 'voyage-code-3', + max_context: 256 + }, + { + id: 'voyage-code-3', + max_context: 512 + }, + { + id: 'voyage-code-3', + max_context: 2048 + }, + { + id: 'voyage-finance-2', + max_context: 1024 + }, + { + id: 'voyage-law-2', + max_context: 1024 + }, + { + id: 'voyage-code-2', + max_context: 1536 } ] diff --git a/src/renderer/src/config/models.ts b/src/renderer/src/config/models.ts index 597fbcbf60..14f1216d6c 100644 --- a/src/renderer/src/config/models.ts +++ b/src/renderer/src/config/models.ts @@ -122,6 +122,7 @@ import UpstageModelLogo from '@renderer/assets/images/models/upstage.png' import UpstageModelLogoDark from '@renderer/assets/images/models/upstage_dark.png' import ViduModelLogo from '@renderer/assets/images/models/vidu.png' import ViduModelLogoDark from '@renderer/assets/images/models/vidu_dark.png' +import VoyageModelLogo from '@renderer/assets/images/models/voyageai.png' import WenxinModelLogo from '@renderer/assets/images/models/wenxin.png' import WenxinModelLogoDark from '@renderer/assets/images/models/wenxin_dark.png' import XirangModelLogo from '@renderer/assets/images/models/xirang.png' @@ -175,7 +176,8 @@ export const REASONING_REGEX = /^(o\d+(?:-[\w-]+)?|.*\b(?:reasoner|thinking)\b.*|.*-[rR]\d+.*|.*\bqwq(?:-[\w-]+)?\b.*|.*\bhunyuan-t1(?:-[\w-]+)?\b.*)$/i // Embedding models -export const EMBEDDING_REGEX = /(?:^text-|embed|bge-|e5-|LLM2Vec|retrieval|uae-|gte-|jina-clip|jina-embeddings)/i +export const EMBEDDING_REGEX = + /(?:^text-|embed|bge-|e5-|LLM2Vec|retrieval|uae-|gte-|jina-clip|jina-embeddings|voyage-)/i // Rerank models export const RERANKING_REGEX = /(?:rerank|re-rank|re-ranker|re-ranking|retrieval|retriever)/i @@ -327,7 +329,8 @@ export function getModelLogo(modelId: string) { embedding: isLight ? EmbeddingModelLogo : EmbeddingModelLogoDark, perplexity: isLight ? PerplexityModelLogo : PerplexityModelLogoDark, sonar: isLight ? PerplexityModelLogo : PerplexityModelLogoDark, - 'bge-': BgeModelLogo + 'bge-': BgeModelLogo, + 'voyage-': VoyageModelLogo } for (const key in logoMap) { @@ -1801,7 +1804,63 @@ export const SYSTEM_MODELS: Record = { group: 'DeepSeek' } ], - gpustack: [] + gpustack: [], + voyageai: [ + { + id: 'voyage-3-large', + provider: 'voyageai', + name: 'voyage-3-large', + group: 'Voyage Embeddings V3' + }, + { + id: 'voyage-3', + provider: 'voyageai', + name: 'voyage-3', + group: 'Voyage Embeddings V3' + }, + { + id: 'voyage-3-lite', + provider: 'voyageai', + name: 'voyage-3-lite', + group: 'Voyage Embeddings V3' + }, + { + id: 'voyage-code-3', + provider: 'voyageai', + name: 'voyage-code-3', + group: 'Voyage Embeddings V3' + }, + { + id: 'voyage-finance-3', + provider: 'voyageai', + name: 'voyage-finance-3', + group: 'Voyage Embeddings V2' + }, + { + id: 'voyage-law-2', + provider: 'voyageai', + name: 'voyage-law-2', + group: 'Voyage Embeddings V2' + }, + { + id: 'voyage-code-2', + provider: 'voyageai', + name: 'voyage-code-2', + group: 'Voyage Embeddings V2' + }, + { + id: 'rerank-2', + provider: 'voyageai', + name: 'rerank-2', + group: 'Voyage Rerank V2' + }, + { + id: 'rerank-2-lite', + provider: 'voyageai', + name: 'rerank-2-lite', + group: 'Voyage Rerank V2' + } + ] } export const TEXT_TO_IMAGES_MODELS = [ diff --git a/src/renderer/src/config/providers.ts b/src/renderer/src/config/providers.ts index 7e01f5f866..59a6617de4 100644 --- a/src/renderer/src/config/providers.ts +++ b/src/renderer/src/config/providers.ts @@ -38,6 +38,7 @@ import StepProviderLogo from '@renderer/assets/images/providers/step.png' import TencentCloudProviderLogo from '@renderer/assets/images/providers/tencent-cloud-ti.png' import TogetherProviderLogo from '@renderer/assets/images/providers/together.png' import BytedanceProviderLogo from '@renderer/assets/images/providers/volcengine.png' +import VoyageAIProviderLogo from '@renderer/assets/images/providers/voyageai.png' import XirangProviderLogo from '@renderer/assets/images/providers/xirang.png' import ZeroOneProviderLogo from '@renderer/assets/images/providers/zero-one.png' import ZhipuProviderLogo from '@renderer/assets/images/providers/zhipu.png' @@ -86,14 +87,15 @@ const PROVIDER_LOGO_MAP = { o3: O3ProviderLogo, 'tencent-cloud-ti': TencentCloudProviderLogo, gpustack: GPUStackProviderLogo, - alayanew: AlayaNewProviderLogo + alayanew: AlayaNewProviderLogo, + voyageai: VoyageAIProviderLogo } as const export function getProviderLogo(providerId: string) { return PROVIDER_LOGO_MAP[providerId as keyof typeof PROVIDER_LOGO_MAP] } -export const SUPPORTED_REANK_PROVIDERS = ['silicon', 'jina'] +export const SUPPORTED_REANK_PROVIDERS = ['silicon', 'jina', 'voyageai'] export const PROVIDER_CONFIG = { openai: { @@ -560,5 +562,16 @@ export const PROVIDER_CONFIG = { docs: 'https://docs.gpustack.ai/latest/', models: 'https://docs.gpustack.ai/latest/overview/#supported-models' } + }, + voyageai: { + api: { + url: 'https://api.voyageai.com' + }, + websites: { + official: 'https://www.voyageai.com/', + apiKey: 'https://dashboard.voyageai.com/organization/api-keys', + docs: 'https://docs.voyageai.com/docs', + models: 'https://docs.voyageai.com/docs' + } } } diff --git a/src/renderer/src/i18n/locales/en-us.json b/src/renderer/src/i18n/locales/en-us.json index 9952bd6f87..2b653a4ede 100644 --- a/src/renderer/src/i18n/locales/en-us.json +++ b/src/renderer/src/i18n/locales/en-us.json @@ -678,7 +678,8 @@ "xirang": "State Cloud Xirang", "yi": "Yi", "zhinao": "360AI", - "zhipu": "ZHIPU AI" + "zhipu": "ZHIPU AI", + "voyageai": "Voyage AI" }, "restore": { "confirm": "Are you sure you want to restore data?", diff --git a/src/renderer/src/i18n/locales/ja-jp.json b/src/renderer/src/i18n/locales/ja-jp.json index 94d8f964a5..b0d67aaced 100644 --- a/src/renderer/src/i18n/locales/ja-jp.json +++ b/src/renderer/src/i18n/locales/ja-jp.json @@ -678,7 +678,8 @@ "xirang": "天翼クラウド 息壤", "yi": "零一万物", "zhinao": "360智脳", - "zhipu": "智譜AI" + "zhipu": "智譜AI", + "voyageai": "Voyage AI" }, "restore": { "confirm": "データを復元しますか?", diff --git a/src/renderer/src/i18n/locales/ru-ru.json b/src/renderer/src/i18n/locales/ru-ru.json index fc7c9d6817..9ee575355d 100644 --- a/src/renderer/src/i18n/locales/ru-ru.json +++ b/src/renderer/src/i18n/locales/ru-ru.json @@ -678,7 +678,8 @@ "xirang": "State Cloud Xirang", "yi": "Yi", "zhinao": "360AI", - "zhipu": "ZHIPU AI" + "zhipu": "ZHIPU AI", + "voyageai": "Voyage AI" }, "restore": { "confirm": "Вы уверены, что хотите восстановить данные?", diff --git a/src/renderer/src/i18n/locales/zh-cn.json b/src/renderer/src/i18n/locales/zh-cn.json index 12457f2340..3857d77ee2 100644 --- a/src/renderer/src/i18n/locales/zh-cn.json +++ b/src/renderer/src/i18n/locales/zh-cn.json @@ -678,7 +678,8 @@ "xirang": "天翼云息壤", "yi": "零一万物", "zhinao": "360智脑", - "zhipu": "智谱AI" + "zhipu": "智谱AI", + "voyageai":"Voyage AI" }, "restore": { "confirm": "确定要恢复数据吗?", diff --git a/src/renderer/src/i18n/locales/zh-tw.json b/src/renderer/src/i18n/locales/zh-tw.json index 27d9b5da08..e5fdc1d194 100644 --- a/src/renderer/src/i18n/locales/zh-tw.json +++ b/src/renderer/src/i18n/locales/zh-tw.json @@ -678,7 +678,8 @@ "xirang": "天翼雲息壤", "yi": "零一萬物", "zhinao": "360 智腦", - "zhipu": "智譜 AI" + "zhipu": "智譜 AI", + "voyageai": "Voyage AI" }, "restore": { "confirm": "確定要復原資料嗎?", diff --git a/src/renderer/src/pages/settings/ProviderSettings/ModelList.tsx b/src/renderer/src/pages/settings/ProviderSettings/ModelList.tsx index 4785758202..2d881bd2fa 100644 --- a/src/renderer/src/pages/settings/ProviderSettings/ModelList.tsx +++ b/src/renderer/src/pages/settings/ProviderSettings/ModelList.tsx @@ -257,6 +257,7 @@ const ModelList: React.FC = ({ provider: _provider, modelStatuse {sortedModelGroups[group].map((model) => { const modelStatus = modelStatuses.find((status) => status.model.id === model.id) const isChecking = modelStatus?.checking === true + console.log('model', model.id, getModelLogo(model.id)) return ( diff --git a/src/renderer/src/store/index.ts b/src/renderer/src/store/index.ts index 3eabb1e090..27f24daa2f 100644 --- a/src/renderer/src/store/index.ts +++ b/src/renderer/src/store/index.ts @@ -40,7 +40,7 @@ const persistedReducer = persistReducer( { key: 'cherry-studio', storage, - version: 83, + version: 84, blacklist: ['runtime', 'messages'], migrate }, diff --git a/src/renderer/src/store/llm.ts b/src/renderer/src/store/llm.ts index ae28ec8f6a..00da25f400 100644 --- a/src/renderer/src/store/llm.ts +++ b/src/renderer/src/store/llm.ts @@ -456,6 +456,16 @@ export const INITIAL_PROVIDERS: Provider[] = [ models: SYSTEM_MODELS.gpustack, isSystem: true, enabled: false + }, + { + id: 'voyageai', + name: 'VoyageAI', + type: 'openai', + apiKey: '', + apiHost: 'https://api.voyageai.com', + models: SYSTEM_MODELS.voyageai, + isSystem: true, + enabled: false } ] diff --git a/src/renderer/src/store/migrate.ts b/src/renderer/src/store/migrate.ts index a781101a30..8156d6a692 100644 --- a/src/renderer/src/store/migrate.ts +++ b/src/renderer/src/store/migrate.ts @@ -795,6 +795,10 @@ const migrateConfig = { state.settings.launchToTray = false state.settings.trayOnClose = true return state + }, + '84': (state: RootState) => { + addProvider(state, 'voyageai') + return state } } diff --git a/yarn.lock b/yarn.lock index 2d9f3ed3d9..ef9815c3ab 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1590,6 +1590,396 @@ __metadata: languageName: node linkType: hard +"@langchain/community@npm:^0.3.36": + version: 0.3.36 + resolution: "@langchain/community@npm:0.3.36" + dependencies: + "@langchain/openai": "npm:>=0.2.0 <0.5.0" + binary-extensions: "npm:^2.2.0" + expr-eval: "npm:^2.0.2" + flat: "npm:^5.0.2" + js-yaml: "npm:^4.1.0" + langchain: "npm:>=0.2.3 <0.3.0 || >=0.3.4 <0.4.0" + langsmith: "npm:>=0.2.8 <0.4.0" + uuid: "npm:^10.0.0" + zod: "npm:^3.22.3" + zod-to-json-schema: "npm:^3.22.5" + peerDependencies: + "@arcjet/redact": ^v1.0.0-alpha.23 + "@aws-crypto/sha256-js": ^5.0.0 + "@aws-sdk/client-bedrock-agent-runtime": ^3.749.0 + "@aws-sdk/client-bedrock-runtime": ^3.749.0 + "@aws-sdk/client-dynamodb": ^3.749.0 + "@aws-sdk/client-kendra": ^3.749.0 + "@aws-sdk/client-lambda": ^3.749.0 + "@aws-sdk/client-s3": ^3.749.0 + "@aws-sdk/client-sagemaker-runtime": ^3.749.0 + "@aws-sdk/client-sfn": ^3.749.0 + "@aws-sdk/credential-provider-node": ^3.388.0 + "@azure/search-documents": ^12.0.0 + "@azure/storage-blob": ^12.15.0 + "@browserbasehq/sdk": "*" + "@browserbasehq/stagehand": ^1.0.0 + "@clickhouse/client": ^0.2.5 + "@cloudflare/ai": "*" + "@datastax/astra-db-ts": ^1.0.0 + "@elastic/elasticsearch": ^8.4.0 + "@getmetal/metal-sdk": "*" + "@getzep/zep-cloud": ^1.0.6 + "@getzep/zep-js": ^0.9.0 + "@gomomento/sdk": ^1.51.1 + "@gomomento/sdk-core": ^1.51.1 + "@google-ai/generativelanguage": "*" + "@google-cloud/storage": ^6.10.1 || ^7.7.0 + "@gradientai/nodejs-sdk": ^1.2.0 + "@huggingface/inference": ^2.6.4 + "@huggingface/transformers": ^3.2.3 + "@ibm-cloud/watsonx-ai": "*" + "@lancedb/lancedb": ^0.12.0 + "@langchain/core": ">=0.2.21 <0.4.0" + "@layerup/layerup-security": ^1.5.12 + "@libsql/client": ^0.14.0 + "@mendable/firecrawl-js": ^1.4.3 + "@mlc-ai/web-llm": "*" + "@mozilla/readability": "*" + "@neondatabase/serverless": "*" + "@notionhq/client": ^2.2.10 + "@opensearch-project/opensearch": "*" + "@pinecone-database/pinecone": "*" + "@planetscale/database": ^1.8.0 + "@premai/prem-sdk": ^0.3.25 + "@qdrant/js-client-rest": ^1.8.2 + "@raycast/api": ^1.55.2 + "@rockset/client": ^0.9.1 + "@smithy/eventstream-codec": ^2.0.5 + "@smithy/protocol-http": ^3.0.6 + "@smithy/signature-v4": ^2.0.10 + "@smithy/util-utf8": ^2.0.0 + "@spider-cloud/spider-client": ^0.0.21 + "@supabase/supabase-js": ^2.45.0 + "@tensorflow-models/universal-sentence-encoder": "*" + "@tensorflow/tfjs-converter": "*" + "@tensorflow/tfjs-core": "*" + "@upstash/ratelimit": ^1.1.3 || ^2.0.3 + "@upstash/redis": ^1.20.6 + "@upstash/vector": ^1.1.1 + "@vercel/kv": "*" + "@vercel/postgres": "*" + "@writerai/writer-sdk": ^0.40.2 + "@xata.io/client": ^0.28.0 + "@zilliz/milvus2-sdk-node": ">=2.3.5" + apify-client: ^2.7.1 + assemblyai: ^4.6.0 + better-sqlite3: ">=9.4.0 <12.0.0" + cassandra-driver: ^4.7.2 + cborg: ^4.1.1 + cheerio: ^1.0.0-rc.12 + chromadb: "*" + closevector-common: 0.1.3 + closevector-node: 0.1.6 + closevector-web: 0.1.6 + cohere-ai: "*" + convex: ^1.3.1 + crypto-js: ^4.2.0 + d3-dsv: ^2.0.0 + discord.js: ^14.14.1 + dria: ^0.0.3 + duck-duck-scrape: ^2.2.5 + epub2: ^3.0.1 + fast-xml-parser: "*" + firebase-admin: ^11.9.0 || ^12.0.0 + google-auth-library: "*" + googleapis: "*" + hnswlib-node: ^3.0.0 + html-to-text: ^9.0.5 + ibm-cloud-sdk-core: "*" + ignore: ^5.2.0 + interface-datastore: ^8.2.11 + ioredis: ^5.3.2 + it-all: ^3.0.4 + jsdom: "*" + jsonwebtoken: ^9.0.2 + llmonitor: ^0.5.9 + lodash: ^4.17.21 + lunary: ^0.7.10 + mammoth: ^1.6.0 + mariadb: ^3.4.0 + mongodb: ">=5.2.0" + mysql2: ^3.9.8 + neo4j-driver: "*" + notion-to-md: ^3.1.0 + officeparser: ^4.0.4 + openai: "*" + pdf-parse: 1.1.1 + pg: ^8.11.0 + pg-copy-streams: ^6.0.5 + pickleparser: ^0.2.1 + playwright: ^1.32.1 + portkey-ai: ^0.1.11 + puppeteer: "*" + pyodide: ">=0.24.1 <0.27.0" + redis: "*" + replicate: "*" + sonix-speech-recognition: ^2.1.1 + srt-parser-2: ^1.2.3 + typeorm: ^0.3.20 + typesense: ^1.5.3 + usearch: ^1.1.1 + voy-search: 0.6.2 + weaviate-ts-client: "*" + web-auth-library: ^1.0.3 + word-extractor: "*" + ws: ^8.14.2 + youtubei.js: "*" + peerDependenciesMeta: + "@arcjet/redact": + optional: true + "@aws-crypto/sha256-js": + optional: true + "@aws-sdk/client-bedrock-agent-runtime": + optional: true + "@aws-sdk/client-bedrock-runtime": + optional: true + "@aws-sdk/client-dynamodb": + optional: true + "@aws-sdk/client-kendra": + optional: true + "@aws-sdk/client-lambda": + optional: true + "@aws-sdk/client-s3": + optional: true + "@aws-sdk/client-sagemaker-runtime": + optional: true + "@aws-sdk/client-sfn": + optional: true + "@aws-sdk/credential-provider-node": + optional: true + "@aws-sdk/dsql-signer": + optional: true + "@azure/search-documents": + optional: true + "@azure/storage-blob": + optional: true + "@browserbasehq/sdk": + optional: true + "@clickhouse/client": + optional: true + "@cloudflare/ai": + optional: true + "@datastax/astra-db-ts": + optional: true + "@elastic/elasticsearch": + optional: true + "@getmetal/metal-sdk": + optional: true + "@getzep/zep-cloud": + optional: true + "@getzep/zep-js": + optional: true + "@gomomento/sdk": + optional: true + "@gomomento/sdk-core": + optional: true + "@google-ai/generativelanguage": + optional: true + "@google-cloud/storage": + optional: true + "@gradientai/nodejs-sdk": + optional: true + "@huggingface/inference": + optional: true + "@huggingface/transformers": + optional: true + "@lancedb/lancedb": + optional: true + "@layerup/layerup-security": + optional: true + "@libsql/client": + optional: true + "@mendable/firecrawl-js": + optional: true + "@mlc-ai/web-llm": + optional: true + "@mozilla/readability": + optional: true + "@neondatabase/serverless": + optional: true + "@notionhq/client": + optional: true + "@opensearch-project/opensearch": + optional: true + "@pinecone-database/pinecone": + optional: true + "@planetscale/database": + optional: true + "@premai/prem-sdk": + optional: true + "@qdrant/js-client-rest": + optional: true + "@raycast/api": + optional: true + "@rockset/client": + optional: true + "@smithy/eventstream-codec": + optional: true + "@smithy/protocol-http": + optional: true + "@smithy/signature-v4": + optional: true + "@smithy/util-utf8": + optional: true + "@spider-cloud/spider-client": + optional: true + "@supabase/supabase-js": + optional: true + "@tensorflow-models/universal-sentence-encoder": + optional: true + "@tensorflow/tfjs-converter": + optional: true + "@tensorflow/tfjs-core": + optional: true + "@upstash/ratelimit": + optional: true + "@upstash/redis": + optional: true + "@upstash/vector": + optional: true + "@vercel/kv": + optional: true + "@vercel/postgres": + optional: true + "@writerai/writer-sdk": + optional: true + "@xata.io/client": + optional: true + "@zilliz/milvus2-sdk-node": + optional: true + apify-client: + optional: true + assemblyai: + optional: true + better-sqlite3: + optional: true + cassandra-driver: + optional: true + cborg: + optional: true + cheerio: + optional: true + chromadb: + optional: true + closevector-common: + optional: true + closevector-node: + optional: true + closevector-web: + optional: true + cohere-ai: + optional: true + convex: + optional: true + crypto-js: + optional: true + d3-dsv: + optional: true + discord.js: + optional: true + dria: + optional: true + duck-duck-scrape: + optional: true + epub2: + optional: true + fast-xml-parser: + optional: true + firebase-admin: + optional: true + google-auth-library: + optional: true + googleapis: + optional: true + hnswlib-node: + optional: true + html-to-text: + optional: true + ignore: + optional: true + interface-datastore: + optional: true + ioredis: + optional: true + it-all: + optional: true + jsdom: + optional: true + jsonwebtoken: + optional: true + llmonitor: + optional: true + lodash: + optional: true + lunary: + optional: true + mammoth: + optional: true + mariadb: + optional: true + mongodb: + optional: true + mysql2: + optional: true + neo4j-driver: + optional: true + notion-to-md: + optional: true + officeparser: + optional: true + pdf-parse: + optional: true + pg: + optional: true + pg-copy-streams: + optional: true + pickleparser: + optional: true + playwright: + optional: true + portkey-ai: + optional: true + puppeteer: + optional: true + pyodide: + optional: true + redis: + optional: true + replicate: + optional: true + sonix-speech-recognition: + optional: true + srt-parser-2: + optional: true + typeorm: + optional: true + typesense: + optional: true + usearch: + optional: true + voy-search: + optional: true + weaviate-ts-client: + optional: true + web-auth-library: + optional: true + word-extractor: + optional: true + ws: + optional: true + youtubei.js: + optional: true + checksum: 10c0/7945ba936c1b18506ca8ca70449d41208c627cadf52782a9d41e54e395fdc86a4421c01fa4977b582f7eddf5458dd7c418f932016c558a058abea3442828b8dd + languageName: node + linkType: hard + "@langchain/core@npm:^0.3.26": version: 0.3.42 resolution: "@langchain/core@npm:0.3.42" @@ -1638,6 +2028,20 @@ __metadata: languageName: node linkType: hard +"@langchain/openai@npm:>=0.2.0 <0.5.0": + version: 0.4.7 + resolution: "@langchain/openai@npm:0.4.7" + dependencies: + js-tiktoken: "npm:^1.0.12" + openai: "npm:^4.87.3" + zod: "npm:^3.22.4" + zod-to-json-schema: "npm:^3.22.3" + peerDependencies: + "@langchain/core": ">=0.3.39 <0.4.0" + checksum: 10c0/4c809100c1e039c8c786141f097764cc399699ca9b149861396b2339147ad8b7fec5c97e5365a546bb7c123c4ec1943cfe3ef2eb5f056d6ab5a3fd1dc35940bc + languageName: node + linkType: hard + "@langchain/openai@patch:@langchain/openai@npm%3A0.3.16#~/.yarn/patches/@langchain-openai-npm-0.3.16-e525b59526.patch": version: 0.3.16 resolution: "@langchain/openai@patch:@langchain/openai@npm%3A0.3.16#~/.yarn/patches/@langchain-openai-npm-0.3.16-e525b59526.patch::version=0.3.16&hash=642f39" @@ -2798,20 +3202,6 @@ __metadata: languageName: node linkType: hard -"@types/command-line-args@npm:^5.2.3": - version: 5.2.3 - resolution: "@types/command-line-args@npm:5.2.3" - checksum: 10c0/3a9bc58fd26e546391f6369dd28c03d59349dc4ac39eada1a5c39cc3578e02e4aac222615170e0db79b198ffba2af84fdbdda46e08c6edc4da42bc17ea85200f - languageName: node - linkType: hard - -"@types/command-line-usage@npm:^5.0.4": - version: 5.0.4 - resolution: "@types/command-line-usage@npm:5.0.4" - checksum: 10c0/67840ebf4bcfee200c07d978669ad596fe2adc350fd5c19d44ec2248623575d96ec917f513d1d59453f8f57e879133861a4cc41c20045c07f6c959f1fcaac7ad - languageName: node - linkType: hard - "@types/d3-color@npm:*": version: 3.1.3 resolution: "@types/d3-color@npm:3.1.3" @@ -3421,6 +3811,7 @@ __metadata: "@google/generative-ai": "npm:^0.21.0" "@hello-pangea/dnd": "npm:^16.6.0" "@kangfenmao/keyv-storage": "npm:^0.1.0" + "@langchain/community": "npm:^0.3.36" "@llm-tools/embedjs": "patch:@llm-tools/embedjs@npm%3A0.1.28#~/.yarn/patches/@llm-tools-embedjs-npm-0.1.28-8e4393fa2d.patch" "@llm-tools/embedjs-libsql": "npm:^0.1.28" "@llm-tools/embedjs-loader-csv": "npm:^0.1.28" @@ -4091,6 +4482,13 @@ __metadata: languageName: node linkType: hard +"binary-extensions@npm:^2.2.0": + version: 2.3.0 + resolution: "binary-extensions@npm:2.3.0" + checksum: 10c0/75a59cafc10fb12a11d510e77110c6c7ae3f4ca22463d52487709ca7f18f69d886aa387557cc9864fbdb10153d0bdb4caacabf11541f55e89ed6e18d12ece2b5 + languageName: node + linkType: hard + "bindings@npm:^1.5.0": version: 1.5.0 resolution: "bindings@npm:1.5.0" @@ -6742,6 +7140,13 @@ __metadata: languageName: node linkType: hard +"expr-eval@npm:^2.0.2": + version: 2.0.2 + resolution: "expr-eval@npm:2.0.2" + checksum: 10c0/642f112ff28ea34574c595c3ad73ccd8e638498879a4dd28620c4dabebab2e11987a851266ba81883dae85a5800e0c93b3d06f81718b71a215f831534646e4f2 + languageName: node + linkType: hard + "express-rate-limit@npm:^7.5.0": version: 7.5.0 resolution: "express-rate-limit@npm:7.5.0" @@ -7095,6 +7500,15 @@ __metadata: languageName: node linkType: hard +"flat@npm:^5.0.2": + version: 5.0.2 + resolution: "flat@npm:5.0.2" + bin: + flat: cli.js + checksum: 10c0/f178b13482f0cd80c7fede05f4d10585b1f2fdebf26e12edc138e32d3150c6ea6482b7f12813a1091143bad52bb6d3596bca51a162257a21163c0ff438baa5fe + languageName: node + linkType: hard + "flatted@npm:^3.2.9": version: 3.3.3 resolution: "flatted@npm:3.3.3" @@ -9067,7 +9481,7 @@ __metadata: languageName: node linkType: hard -"langchain@npm:^0.3.8": +"langchain@npm:>=0.2.3 <0.3.0 || >=0.3.4 <0.4.0, langchain@npm:^0.3.8": version: 0.3.19 resolution: "langchain@npm:0.3.19" dependencies: @@ -16029,6 +16443,15 @@ __metadata: languageName: node linkType: hard +"zod-to-json-schema@npm:^3.22.5": + version: 3.24.5 + resolution: "zod-to-json-schema@npm:3.24.5" + peerDependencies: + zod: ^3.24.1 + checksum: 10c0/0745b94ba53e652d39f262641cdeb2f75d24339fb6076a38ce55bcf53d82dfaea63adf524ebc5f658681005401687f8e9551c4feca7c4c882e123e66091dfb90 + languageName: node + linkType: hard + "zod-validation-error@npm:^3.4.0": version: 3.4.0 resolution: "zod-validation-error@npm:3.4.0" @@ -16038,7 +16461,7 @@ __metadata: languageName: node linkType: hard -"zod@npm:^3.22.4, zod@npm:^3.23.8": +"zod@npm:^3.22.3, zod@npm:^3.22.4, zod@npm:^3.23.8": version: 3.24.2 resolution: "zod@npm:3.24.2" checksum: 10c0/c638c7220150847f13ad90635b3e7d0321b36cce36f3fc6050ed960689594c949c326dfe2c6fa87c14b126ee5d370ccdebd6efb304f41ef5557a4aaca2824565