forked from ChatGPTNextWeb/NextChat
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- 新增 ChatGLM API 处理逻辑 - 更新相关组件以支持 ChatGLM - 在 README 中添加 ChatGLM 相关配置说明 - 新增宝塔面板部署说明文档
- Loading branch information
Showing
76 changed files
with
2,916 additions
and
875 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -31,7 +31,7 @@ One-Click to get a well-designed cross-platform ChatGPT web UI, with GPT3, GPT4 | |
[MacOS-image]: https://img.shields.io/badge/-MacOS-black?logo=apple | ||
[Linux-image]: https://img.shields.io/badge/-Linux-333?logo=ubuntu | ||
|
||
[<img src="https://vercel.com/button" alt="Deploy on Zeabur" height="30">](https://vercel.com/new/clone?repository-url=https%3A%2F%2Fgithub.com%2FChatGPTNextWeb%2FChatGPT-Next-Web&env=OPENAI_API_KEY&env=CODE&project-name=nextchat&repository-name=NextChat) [<img src="https://zeabur.com/button.svg" alt="Deploy on Zeabur" height="30">](https://zeabur.com/templates/ZBUEFA) [<img src="https://gitpod.io/button/open-in-gitpod.svg" alt="Open in Gitpod" height="30">](https://gitpod.io/#https://github.com/Yidadaa/ChatGPT-Next-Web) | ||
[<img src="https://vercel.com/button" alt="Deploy on Vercel" height="30">](https://vercel.com/new/clone?repository-url=https%3A%2F%2Fgithub.com%2FChatGPTNextWeb%2FChatGPT-Next-Web&env=OPENAI_API_KEY&env=CODE&project-name=nextchat&repository-name=NextChat) [<img src="https://zeabur.com/button.svg" alt="Deploy on Zeabur" height="30">](https://zeabur.com/templates/ZBUEFA) [<img src="https://gitpod.io/button/open-in-gitpod.svg" alt="Open in Gitpod" height="30">](https://gitpod.io/#https://github.com/Yidadaa/ChatGPT-Next-Web) [<img src="https://img.shields.io/badge/BT_Deploy-Install-20a53a" alt="BT Deply Install" height="30">](https://www.bt.cn/new/download.html) [<img src="https://svgshare.com/i/1AVg.svg" alt="Deploy to Alibaba Cloud" height="30">](https://computenest.aliyun.com/market/service-f1c9b75e59814dc49d52) | ||
|
||
[<img src="https://github.com/user-attachments/assets/903482d4-3e87-4134-9af1-f2588fa90659" height="60" width="288" >](https://monica.im/?utm=nxcrp) | ||
|
||
|
@@ -96,10 +96,11 @@ For enterprise inquiries, please contact: **[email protected]** | |
- [x] Artifacts: Easily preview, copy and share generated content/webpages through a separate window [#5092](https://github.com/ChatGPTNextWeb/ChatGPT-Next-Web/pull/5092) | ||
- [x] Plugins: support network search, calculator, any other apis etc. [#165](https://github.com/Yidadaa/ChatGPT-Next-Web/issues/165) [#5353](https://github.com/ChatGPTNextWeb/ChatGPT-Next-Web/issues/5353) | ||
- [x] network search, calculator, any other apis etc. [#165](https://github.com/Yidadaa/ChatGPT-Next-Web/issues/165) [#5353](https://github.com/ChatGPTNextWeb/ChatGPT-Next-Web/issues/5353) | ||
- [x] Supports Realtime Chat [#5672](https://github.com/ChatGPTNextWeb/ChatGPT-Next-Web/issues/5672) | ||
- [ ] local knowledge base | ||
|
||
## What's New | ||
|
||
- 🚀 v2.15.8 Now supports Realtime Chat [#5672](https://github.com/ChatGPTNextWeb/ChatGPT-Next-Web/issues/5672) | ||
- 🚀 v2.15.4 The Application supports using Tauri fetch LLM API, MORE SECURITY! [#5379](https://github.com/ChatGPTNextWeb/ChatGPT-Next-Web/issues/5379) | ||
- 🚀 v2.15.0 Now supports Plugins! Read this: [NextChat-Awesome-Plugins](https://github.com/ChatGPTNextWeb/NextChat-Awesome-Plugins) | ||
- 🚀 v2.14.0 Now supports Artifacts & SD | ||
|
@@ -134,10 +135,11 @@ For enterprise inquiries, please contact: **[email protected]** | |
- [x] Artifacts: 通过独立窗口,轻松预览、复制和分享生成的内容/可交互网页 [#5092](https://github.com/ChatGPTNextWeb/ChatGPT-Next-Web/pull/5092) | ||
- [x] 插件机制,支持`联网搜索`、`计算器`、调用其他平台 api [#165](https://github.com/Yidadaa/ChatGPT-Next-Web/issues/165) [#5353](https://github.com/ChatGPTNextWeb/ChatGPT-Next-Web/issues/5353) | ||
- [x] 支持联网搜索、计算器、调用其他平台 api [#165](https://github.com/Yidadaa/ChatGPT-Next-Web/issues/165) [#5353](https://github.com/ChatGPTNextWeb/ChatGPT-Next-Web/issues/5353) | ||
- [x] 支持 Realtime Chat [#5672](https://github.com/ChatGPTNextWeb/ChatGPT-Next-Web/issues/5672) | ||
- [ ] 本地知识库 | ||
|
||
## 最新动态 | ||
|
||
- 🚀 v2.15.8 现在支持Realtime Chat [#5672](https://github.com/ChatGPTNextWeb/ChatGPT-Next-Web/issues/5672) | ||
- 🚀 v2.15.4 客户端支持Tauri本地直接调用大模型API,更安全![#5379](https://github.com/ChatGPTNextWeb/ChatGPT-Next-Web/issues/5379) | ||
- 🚀 v2.15.0 现在支持插件功能了!了解更多:[NextChat-Awesome-Plugins](https://github.com/ChatGPTNextWeb/NextChat-Awesome-Plugins) | ||
- 🚀 v2.14.0 现在支持 Artifacts & SD 了。 | ||
|
@@ -301,6 +303,14 @@ iflytek Api Key. | |
|
||
iflytek Api Secret. | ||
|
||
### `CHATGLM_API_KEY` (optional) | ||
|
||
ChatGLM Api Key. | ||
|
||
### `CHATGLM_URL` (optional) | ||
|
||
ChatGLM Api Url. | ||
|
||
### `HIDE_USER_API_KEY` (optional) | ||
|
||
> Default: Empty | ||
|
@@ -397,6 +407,9 @@ yarn dev | |
|
||
> [简体中文 > 如何部署到私人服务器](./README_CN.md#部署) | ||
### BT Install | ||
> [简体中文 > 如何通过宝塔一键部署](./docs/bt-cn.md) | ||
### Docker (Recommended) | ||
|
||
```shell | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,129 @@ | ||
import { getServerSideConfig } from "@/app/config/server"; | ||
import { | ||
CHATGLM_BASE_URL, | ||
ApiPath, | ||
ModelProvider, | ||
ServiceProvider, | ||
} from "@/app/constant"; | ||
import { prettyObject } from "@/app/utils/format"; | ||
import { NextRequest, NextResponse } from "next/server"; | ||
import { auth } from "@/app/api/auth"; | ||
import { isModelAvailableInServer } from "@/app/utils/model"; | ||
|
||
const serverConfig = getServerSideConfig(); | ||
|
||
export async function handle( | ||
req: NextRequest, | ||
{ params }: { params: { path: string[] } }, | ||
) { | ||
console.log("[GLM Route] params ", params); | ||
|
||
if (req.method === "OPTIONS") { | ||
return NextResponse.json({ body: "OK" }, { status: 200 }); | ||
} | ||
|
||
const authResult = auth(req, ModelProvider.ChatGLM); | ||
if (authResult.error) { | ||
return NextResponse.json(authResult, { | ||
status: 401, | ||
}); | ||
} | ||
|
||
try { | ||
const response = await request(req); | ||
return response; | ||
} catch (e) { | ||
console.error("[GLM] ", e); | ||
return NextResponse.json(prettyObject(e)); | ||
} | ||
} | ||
|
||
async function request(req: NextRequest) { | ||
const controller = new AbortController(); | ||
|
||
// alibaba use base url or just remove the path | ||
let path = `${req.nextUrl.pathname}`.replaceAll(ApiPath.ChatGLM, ""); | ||
|
||
let baseUrl = serverConfig.chatglmUrl || CHATGLM_BASE_URL; | ||
|
||
if (!baseUrl.startsWith("http")) { | ||
baseUrl = `https://${baseUrl}`; | ||
} | ||
|
||
if (baseUrl.endsWith("/")) { | ||
baseUrl = baseUrl.slice(0, -1); | ||
} | ||
|
||
console.log("[Proxy] ", path); | ||
console.log("[Base Url]", baseUrl); | ||
|
||
const timeoutId = setTimeout( | ||
() => { | ||
controller.abort(); | ||
}, | ||
10 * 60 * 1000, | ||
); | ||
|
||
const fetchUrl = `${baseUrl}${path}`; | ||
console.log("[Fetch Url] ", fetchUrl); | ||
const fetchOptions: RequestInit = { | ||
headers: { | ||
"Content-Type": "application/json", | ||
Authorization: req.headers.get("Authorization") ?? "", | ||
}, | ||
method: req.method, | ||
body: req.body, | ||
redirect: "manual", | ||
// @ts-ignore | ||
duplex: "half", | ||
signal: controller.signal, | ||
}; | ||
|
||
// #1815 try to refuse some request to some models | ||
if (serverConfig.customModels && req.body) { | ||
try { | ||
const clonedBody = await req.text(); | ||
fetchOptions.body = clonedBody; | ||
|
||
const jsonBody = JSON.parse(clonedBody) as { model?: string }; | ||
|
||
// not undefined and is false | ||
if ( | ||
isModelAvailableInServer( | ||
serverConfig.customModels, | ||
jsonBody?.model as string, | ||
ServiceProvider.ChatGLM as string, | ||
) | ||
) { | ||
return NextResponse.json( | ||
{ | ||
error: true, | ||
message: `you are not allowed to use ${jsonBody?.model} model`, | ||
}, | ||
{ | ||
status: 403, | ||
}, | ||
); | ||
} | ||
} catch (e) { | ||
console.error(`[GLM] filter`, e); | ||
} | ||
} | ||
try { | ||
const res = await fetch(fetchUrl, fetchOptions); | ||
|
||
// to prevent browser prompt for credentials | ||
const newHeaders = new Headers(res.headers); | ||
newHeaders.delete("www-authenticate"); | ||
// to disable nginx buffering | ||
newHeaders.set("X-Accel-Buffering", "no"); | ||
|
||
return new Response(res.body, { | ||
status: res.status, | ||
statusText: res.statusText, | ||
headers: newHeaders, | ||
}); | ||
} finally { | ||
clearTimeout(timeoutId); | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.