diff --git a/README.md b/README.md index 57078fd04b..757897e681 100644 --- a/README.md +++ b/README.md @@ -8,9 +8,7 @@

Lobe Chat

-Lobe Chat is an open-source chatbot client using LangChain - -Typescript and Next.js +Lobe Chat is an open-source chatbot client using OpenAI and Next.js [Changelog](./CHANGELOG.md) · [Report Bug][issues-url] · [Request Feature][issues-url] diff --git a/package.json b/package.json index 38ad0c61d9..3c2a823f7b 100644 --- a/package.json +++ b/package.json @@ -76,7 +76,6 @@ "gpt-tokenizer": "^2", "i18next": "^23", "immer": "^10", - "langchain": "latest", "lodash-es": "^4", "lucide-react": "latest", "nanoid": "^4", diff --git a/src/pages/api/LangChainStream.ts b/src/pages/api/LangChainStream.ts deleted file mode 100644 index 69f0c19d1a..0000000000 --- a/src/pages/api/LangChainStream.ts +++ /dev/null @@ -1,95 +0,0 @@ -import { LLMChain } from 'langchain/chains'; -import { ChatOpenAI } from 'langchain/chat_models/openai'; -import { - AIMessagePromptTemplate, - ChatPromptTemplate, - HumanMessagePromptTemplate, - SystemMessagePromptTemplate, -} from 'langchain/prompts'; - -import { LangChainParams } from '@/types/langchain'; - -const isDev = process.env.NODE_ENV === 'development'; -const OPENAI_PROXY_URL = process.env.OPENAI_PROXY_URL; - -export function LangChainStream(payload: LangChainParams) { - const { prompts, vars, llm } = payload; - - // 将 payload 中的消息转换为 ChatOpenAI 所需的 HumanChatMessage、SystemChatMessage 和 AIChatMessage 类型 - const chatPrompt = ChatPromptTemplate.fromPromptMessages( - prompts.map((m) => { - switch (m.role) { - default: - case 'user': { - return HumanMessagePromptTemplate.fromTemplate(m.content); - } - case 'system': { - return SystemMessagePromptTemplate.fromTemplate(m.content); - } - - case 'assistant': { - return AIMessagePromptTemplate.fromTemplate(m.content); - } - } - }), - ); - - // 使用 TextEncoder 将字符串转换为字节数组,以便在 ReadableStream 中发送 - const encoder = new TextEncoder(); - - // 初始化换行符计数器 - - return new ReadableStream({ - async start(controller) { - let newlineCounter = 0; - - const chat = new ChatOpenAI( - { - streaming: true, - ...llm, - - callbacks: [ - { - handleLLMNewToken(token) { - // 如果 message 是换行符,且 newlineCounter 小于 2,那么跳过该换行符 - if (newlineCounter < 2 && token === '\n') { - return; - } - - // 将 message 编码为字节并添加到流中 - const queue = encoder.encode(token); - controller.enqueue(queue); - newlineCounter++; - }, - }, - ], - // 暂时设定不重试 ,后续看是否需要支持重试 - maxRetries: 0, - }, - isDev && OPENAI_PROXY_URL ? { basePath: OPENAI_PROXY_URL } : undefined, - ); - - const chain = new LLMChain({ - callbacks: [ - { - handleChainError(err: Error): Promise | void { - console.log(err.message); - }, - }, - ], - llm: chat, - prompt: chatPrompt, - verbose: true, - }); - try { - // 使用转换后的聊天消息作为输入开始聊天 - await chain.call(vars); - // 完成后,关闭流 - controller.close(); - } catch (error) { - // 如果在执行过程中发生错误,向流发送错误 - controller.error(error); - } - }, - }); -} diff --git a/src/pages/api/chain.api.ts b/src/pages/api/chain.api.ts deleted file mode 100644 index e9a74f4bc6..0000000000 --- a/src/pages/api/chain.api.ts +++ /dev/null @@ -1,17 +0,0 @@ -import { LangChainParams } from '@/types/langchain'; - -import { LangChainStream } from './LangChainStream'; - -if (!process.env.OPENAI_API_KEY) { - throw new Error('Missing env var from OpenAI'); -} - -export const config = { - runtime: 'edge', -}; - -export default async function handler(request: Request) { - const payload = (await request.json()) as LangChainParams; - - return new Response(LangChainStream(payload)); -} diff --git a/src/services/langChain.ts b/src/services/langChain.ts deleted file mode 100644 index fdc0f379fc..0000000000 --- a/src/services/langChain.ts +++ /dev/null @@ -1,18 +0,0 @@ -import { URLS } from '@/services/url'; -import { LangChainParams } from '@/types/langchain'; -import { fetchAIFactory } from '@/utils/fetch'; - -/** - * 专门用于 FlowChain 的 fetch - */ -export const fetchLangChain = fetchAIFactory( - (params: LangChainParams, signal?: AbortSignal | undefined) => - fetch(URLS.chain, { - body: JSON.stringify(params), - headers: { - 'Content-Type': 'application/json', - }, - method: 'POST', - signal, - }), -); diff --git a/src/services/url.ts b/src/services/url.ts index 0bcc7de46c..cb3477cbcc 100644 --- a/src/services/url.ts +++ b/src/services/url.ts @@ -3,6 +3,5 @@ const isDev = process.env.NODE_ENV === 'development'; const prefix = isDev ? '-dev' : ''; export const URLS = { - chain: '/api/chain' + prefix, openai: '/api/openai' + prefix, }; diff --git a/src/types/langchain.ts b/src/types/langchain.ts deleted file mode 100644 index 2f29bdf441..0000000000 --- a/src/types/langchain.ts +++ /dev/null @@ -1,34 +0,0 @@ -import { ChatMessage } from '@lobehub/ui'; - -export interface LangChainParams { - llm: { - /** - * 控制生成文本中的惩罚系数,用于减少重复性 - */ - frequency_penalty?: number; - /** - * 生成文本的最大长度 - */ - max_tokens?: number; - model: string; - /** - * 控制生成文本中的惩罚系数,用于减少主题的变化 - */ - presence_penalty?: number; - /** - * 生成文本的随机度量,用于控制文本的创造性和多样性 - * @default 0.6 - */ - temperature: number; - /** - * 控制生成文本中最高概率的单个令牌 - */ - top_p?: number; - }; - - /** - * 聊天信息列表 - */ - prompts: ChatMessage[]; - vars: Record; -}