diff --git a/chatgpt-web/metadata/app.json b/chatgpt-web/metadata/app.json new file mode 100644 index 00000000..b8eee7b7 --- /dev/null +++ b/chatgpt-web/metadata/app.json @@ -0,0 +1,14 @@ +{ + "key": "chatgpt-web", + "name": "chatgpt-web", + "tags": ["Tool"], + "versions": ["latest"], + "shortDescZh": "使用express和vue3搭建的支持ChatGPT双模型演示网页。", + "shortDescEn": "ChatGPT-enabled dual-model demo page built with express and vue3.", + "type": "tool", + "limit": 0, + "crossVersionUpdate": true, + "website": "https://github.com/Chanzhaoyu/chatgpt-web", + "github": "https://github.com/Chanzhaoyu/chatgpt-web", + "document": "https://github.com/Chanzhaoyu/chatgpt-web" +} diff --git a/chatgpt-web/metadata/logo.png b/chatgpt-web/metadata/logo.png new file mode 100644 index 00000000..75961719 Binary files /dev/null and b/chatgpt-web/metadata/logo.png differ diff --git a/chatgpt-web/versions/latest/.env.sample b/chatgpt-web/versions/latest/.env.sample new file mode 100644 index 00000000..2879a9b5 --- /dev/null +++ b/chatgpt-web/versions/latest/.env.sample @@ -0,0 +1,43 @@ +CONTAINER_NAME="chatgpt-web" +PANEL_APP_PORT_HTTP="40021" + +# change this to an `accessToken` extracted from the ChatGPT site's `https://chat.openai.com/api/auth/session` response +ACCESS_TOKEN="" + +# Reverse Proxy - Available on accessToken +# Default: https://bypass.churchless.tech/api/conversation +# More: https://github.com/transitive-bullshit/chatgpt-api#reverse-proxy +REVERSE_PROXY="https://bypass.duti.tech/api/conversation" + +# OpenAI API Key - https://platform.openai.com/overview +API_KEY="" + +# OpenAI API Model - https://platform.openai.com/docs/models +API_MODEL="gpt-3.5-turbo" + +# OpenAI API Base URL - https://api.openai.com +API_BASE_URL="https://api.openai.com" + +# Secret key +SECRET_KEY="" + +# Rate Limit +REQUEST_LIMIT="0" + +# timeout +TIMEOUT="60000" + +# Socks Proxy Host +PROXY_HOST="" + +# Socks Proxy Port +PROXY_PORT="" + +# Socks Proxy Username +PROXY_USERNAME="" + +# Socks Proxy Password +PROXY_PASSWORD="" + +# HTTPS PROXY +HTTPS_PROXY="" \ No newline at end of file diff --git a/chatgpt-web/versions/latest/README.md b/chatgpt-web/versions/latest/README.md new file mode 100644 index 00000000..06434370 --- /dev/null +++ b/chatgpt-web/versions/latest/README.md @@ -0,0 +1,338 @@ +# ChatGPT Web + +> 声明:此项目只发布于 GitHub,基于 MIT 协议,免费且作为开源学习使用。并且不会有任何形式的卖号、付费服务、讨论群、讨论组等行为。谨防受骗。 + +![cover](https://raw.githubusercontent.com/Chanzhaoyu/chatgpt-web/main/docs/c1.png) +![cover2](https://raw.githubusercontent.com/Chanzhaoyu/chatgpt-web/main/docs/c2.png) + +- [ChatGPT Web](#chatgpt-web) + - [介绍](#介绍) + - [待实现路线](#待实现路线) + - [前置要求](#前置要求) + - [Node](#node) + - [PNPM](#pnpm) + - [填写密钥](#填写密钥) + - [安装依赖](#安装依赖) + - [后端](#后端) + - [前端](#前端) + - [测试环境运行](#测试环境运行) + - [后端服务](#后端服务) + - [前端网页](#前端网页) + - [环境变量](#环境变量) + - [打包](#打包) + - [使用 Docker](#使用-docker) + - [Docker 参数示例](#docker-参数示例) + - [Docker build \& Run](#docker-build--run) + - [Docker compose](#docker-compose) + - [使用 Railway 部署](#使用-railway-部署) + - [Railway 环境变量](#railway-环境变量) + - [手动打包](#手动打包) + - [后端服务](#后端服务-1) + - [前端网页](#前端网页-1) + - [常见问题](#常见问题) + - [参与贡献](#参与贡献) + - [赞助](#赞助) + - [License](#license) +## 介绍 + +支持双模型,提供了两种非官方 `ChatGPT API` 方法 + +| 方式 | 免费? | 可靠性 | 质量 | +| --------------------------------------------- | ------ | ---------- | ---- | +| `ChatGPTAPI(gpt-3.5-turbo-0301)` | 否 | 可靠 | 相对较笨 | +| `ChatGPTUnofficialProxyAPI(网页 accessToken)` | 是 | 相对不可靠 | 聪明 | + +对比: +1. `ChatGPTAPI` 使用 `gpt-3.5-turbo` 通过 `OpenAI` 官方 `API` 调用 `ChatGPT` +2. `ChatGPTUnofficialProxyAPI` 使用非官方代理服务器访问 `ChatGPT` 的后端`API`,绕过`Cloudflare`(依赖于第三方服务器,并且有速率限制) + +警告: +1. 你应该首先使用 `API` 方式 +2. 使用 `API` 时,如果网络不通,那是国内被墙了,你需要自建代理,绝对不要使用别人的公开代理,那是危险的。 +3. 使用 `accessToken` 方式时反向代理将向第三方暴露您的访问令牌,这样做应该不会产生任何不良影响,但在使用这种方法之前请考虑风险。 +4. 使用 `accessToken` 时,不管你是国内还是国外的机器,都会使用代理。默认代理为 [acheong08](https://github.com/acheong08) 大佬的 `https://bypass.churchless.tech/api/conversation`,这不是后门也不是监听,除非你有能力自己翻过 `CF` 验证,用前请知悉。[社区代理](https://github.com/transitive-bullshit/chatgpt-api#reverse-proxy)(注意:只有这两个是推荐,其他第三方来源,请自行甄别) +5. 把项目发布到公共网络时,你应该设置 `AUTH_SECRET_KEY` 变量添加你的密码访问权限,你也应该修改 `index.html` 中的 `title`,防止被关键词搜索到。 + +切换方式: +1. 进入 `service/.env.example` 文件,复制内容到 `service/.env` 文件 +2. 使用 `OpenAI API Key` 请填写 `OPENAI_API_KEY` 字段 [(获取 apiKey)](https://platform.openai.com/overview) +3. 使用 `Web API` 请填写 `OPENAI_ACCESS_TOKEN` 字段 [(获取 accessToken)](https://chat.openai.com/api/auth/session) +4. 同时存在时以 `OpenAI API Key` 优先 + +环境变量: + +全部参数变量请查看或[这里](#环境变量) + +``` +/service/.env.example +``` + +## 待实现路线 +[✓] 双模型 + +[✓] 多会话储存和上下文逻辑 + +[✓] 对代码等消息类型的格式化美化处理 + +[✓] 访问权限控制 + +[✓] 数据导入、导出 + +[✓] 保存消息到本地图片 + +[✓] 界面多语言 + +[✓] 界面主题 + +[✗] More... + +## 前置要求 + +### Node + +`node` 需要 `^16 || ^18 || ^19` 版本(`node >= 14` 需要安装 [fetch polyfill](https://github.com/developit/unfetch#usage-as-a-polyfill)),使用 [nvm](https://github.com/nvm-sh/nvm) 可管理本地多个 `node` 版本 + +```shell +node -v +``` + +### PNPM +如果你没有安装过 `pnpm` +```shell +npm install pnpm -g +``` + +### 填写密钥 +获取 `Openai Api Key` 或 `accessToken` 并填写本地环境变量 [跳转](#介绍) + +``` +# service/.env 文件 + +# OpenAI API Key - https://platform.openai.com/overview +OPENAI_API_KEY= + +# change this to an `accessToken` extracted from the ChatGPT site's `https://chat.openai.com/api/auth/session` response +OPENAI_ACCESS_TOKEN= +``` + +## 安装依赖 + +> 为了简便 `后端开发人员` 的了解负担,所以并没有采用前端 `workspace` 模式,而是分文件夹存放。如果只需要前端页面做二次开发,删除 `service` 文件夹即可。 + +### 后端 + +进入文件夹 `/service` 运行以下命令 + +```shell +pnpm install +``` + +### 前端 +根目录下运行以下命令 +```shell +pnpm bootstrap +``` + +## 测试环境运行 +### 后端服务 + +进入文件夹 `/service` 运行以下命令 + +```shell +pnpm start +``` + +### 前端网页 +根目录下运行以下命令 +```shell +pnpm dev +``` + +## 环境变量 + +`API` 可用: + +- `OPENAI_API_KEY` 和 `OPENAI_ACCESS_TOKEN` 二选一 +- `OPENAI_API_MODEL` 设置模型,可选,默认:`gpt-3.5-turbo` +- `OPENAI_API_BASE_URL` 设置接口地址,可选,默认:`https://api.openai.com` +- `OPENAI_API_DISABLE_DEBUG` 设置接口关闭 debug 日志,可选,默认:empty 不关闭 + +`ACCESS_TOKEN` 可用: + +- `OPENAI_ACCESS_TOKEN` 和 `OPENAI_API_KEY` 二选一,同时存在时,`OPENAI_API_KEY` 优先 +- `API_REVERSE_PROXY` 设置反向代理,可选,默认:`https://bypass.churchless.tech/api/conversation`,[社区](https://github.com/transitive-bullshit/chatgpt-api#reverse-proxy)(注意:只有这两个是推荐,其他第三方来源,请自行甄别) + +通用: + +- `AUTH_SECRET_KEY` 访问权限密钥,可选 +- `MAX_REQUEST_PER_HOUR` 每小时最大请求次数,可选,默认无限 +- `TIMEOUT_MS` 超时,单位毫秒,可选 +- `SOCKS_PROXY_HOST` 和 `SOCKS_PROXY_PORT` 一起时生效,可选 +- `SOCKS_PROXY_PORT` 和 `SOCKS_PROXY_HOST` 一起时生效,可选 +- `HTTPS_PROXY` 支持 `http`,`https`, `socks5`,可选 +- `ALL_PROXY` 支持 `http`,`https`, `socks5`,可选 + +## 打包 + +### 使用 Docker + +#### Docker 参数示例 + +![docker](./docs/docker.png) + +#### Docker build & Run + +```bash +docker build -t chatgpt-web . + +# 前台运行 +docker run --name chatgpt-web --rm -it -p 127.0.0.1:3002:3002 --env OPENAI_API_KEY=your_api_key chatgpt-web + +# 后台运行 +docker run --name chatgpt-web -d -p 127.0.0.1:3002:3002 --env OPENAI_API_KEY=your_api_key chatgpt-web + +# 运行地址 +http://localhost:3002/ +``` + +#### Docker compose + +[Hub 地址](https://hub.docker.com/repository/docker/chenzhaoyu94/chatgpt-web/general) + +```yml +version: '3' + +services: + app: + image: chenzhaoyu94/chatgpt-web # 总是使用 latest ,更新时重新 pull 该 tag 镜像即可 + ports: + - 127.0.0.1:3002:3002 + environment: + # 二选一 + OPENAI_API_KEY: sk-xxx + # 二选一 + OPENAI_ACCESS_TOKEN: xxx + # API接口地址,可选,设置 OPENAI_API_KEY 时可用 + OPENAI_API_BASE_URL: xxx + # API模型,可选,设置 OPENAI_API_KEY 时可用,https://platform.openai.com/docs/models + # gpt-4, gpt-4-0314, gpt-4-32k, gpt-4-32k-0314, gpt-3.5-turbo, gpt-3.5-turbo-0301, text-davinci-003, text-davinci-002, code-davinci-002 + OPENAI_API_MODEL: xxx + # 反向代理,可选 + API_REVERSE_PROXY: xxx + # 访问权限密钥,可选 + AUTH_SECRET_KEY: xxx + # 每小时最大请求次数,可选,默认无限 + MAX_REQUEST_PER_HOUR: 0 + # 超时,单位毫秒,可选 + TIMEOUT_MS: 60000 + # Socks代理,可选,和 SOCKS_PROXY_PORT 一起时生效 + SOCKS_PROXY_HOST: xxx + # Socks代理端口,可选,和 SOCKS_PROXY_HOST 一起时生效 + SOCKS_PROXY_PORT: xxx + # HTTPS 代理,可选,支持 http,https,socks5 + HTTPS_PROXY: http://xxx:7890 +``` +- `OPENAI_API_BASE_URL` 可选,设置 `OPENAI_API_KEY` 时可用 +- `OPENAI_API_MODEL` 可选,设置 `OPENAI_API_KEY` 时可用 +### 使用 Railway 部署 + +[![Deploy on Railway](https://railway.app/button.svg)](https://railway.app/new/template/yytmgc) + +#### Railway 环境变量 + +| 环境变量名称 | 必填 | 备注 | +| --------------------- | ---------------------- | -------------------------------------------------------------------------------------------------- | +| `PORT` | 必填 | 默认 `3002` +| `AUTH_SECRET_KEY` | 可选 | 访问权限密钥 | +| `MAX_REQUEST_PER_HOUR` | 可选 | 每小时最大请求次数,可选,默认无限 | +| `TIMEOUT_MS` | 可选 | 超时时间,单位毫秒 | +| `OPENAI_API_KEY` | `OpenAI API` 二选一 | 使用 `OpenAI API` 所需的 `apiKey` [(获取 apiKey)](https://platform.openai.com/overview) | +| `OPENAI_ACCESS_TOKEN` | `Web API` 二选一 | 使用 `Web API` 所需的 `accessToken` [(获取 accessToken)](https://chat.openai.com/api/auth/session) | +| `OPENAI_API_BASE_URL` | 可选,`OpenAI API` 时可用 | `API`接口地址 | +| `OPENAI_API_MODEL` | 可选,`OpenAI API` 时可用 | `API`模型 | +| `API_REVERSE_PROXY` | 可选,`Web API` 时可用 | `Web API` 反向代理地址 [详情](https://github.com/transitive-bullshit/chatgpt-api#reverse-proxy) | +| `SOCKS_PROXY_HOST` | 可选,和 `SOCKS_PROXY_PORT` 一起时生效 | Socks代理 | +| `SOCKS_PROXY_PORT` | 可选,和 `SOCKS_PROXY_HOST` 一起时生效 | Socks代理端口 | +| `SOCKS_PROXY_USERNAME` | 可选,和 `SOCKS_PROXY_HOST` 一起时生效 | Socks代理用户名 | +| `SOCKS_PROXY_PASSWORD` | 可选,和 `SOCKS_PROXY_HOST` 一起时生效 | Socks代理密码 | +| `HTTPS_PROXY` | 可选 | HTTPS 代理,支持 http,https, socks5 | +| `ALL_PROXY` | 可选 | 所有代理 代理,支持 http,https, socks5 | + +> 注意: `Railway` 修改环境变量会重新 `Deploy` + +### 手动打包 +#### 后端服务 +> 如果你不需要本项目的 `node` 接口,可以省略如下操作 + +复制 `service` 文件夹到你有 `node` 服务环境的服务器上。 + +```shell +# 安装 +pnpm install + +# 打包 +pnpm build + +# 运行 +pnpm prod +``` + +PS: 不进行打包,直接在服务器上运行 `pnpm start` 也可 + +#### 前端网页 + +1、修改根目录下 `.env` 文件中的 `VITE_GLOB_API_URL` 为你的实际后端接口地址 + +2、根目录下运行以下命令,然后将 `dist` 文件夹内的文件复制到你网站服务的根目录下 + +[参考信息](https://cn.vitejs.dev/guide/static-deploy.html#building-the-app) + +```shell +pnpm build +``` + +## 常见问题 +Q: 为什么 `Git` 提交总是报错? + +A: 因为有提交信息验证,请遵循 [Commit 指南](./CONTRIBUTING.md) + +Q: 如果只使用前端页面,在哪里改请求接口? + +A: 根目录下 `.env` 文件中的 `VITE_GLOB_API_URL` 字段。 + +Q: 文件保存时全部爆红? + +A: `vscode` 请安装项目推荐插件,或手动安装 `Eslint` 插件。 + +Q: 前端没有打字机效果? + +A: 一种可能原因是经过 Nginx 反向代理,开启了 buffer,则 Nginx 会尝试从后端缓冲一定大小的数据再发送给浏览器。请尝试在反代参数后添加 `proxy_buffering off;`,然后重载 Nginx。其他 web server 配置同理。 + +## 参与贡献 + +贡献之前请先阅读 [贡献指南](./CONTRIBUTING.md) + +感谢所有做过贡献的人! + + + + + +## 赞助 + +如果你觉得这个项目对你有帮助,并且情况允许的话,可以给我一点点支持,总之非常感谢支持~ + +
+
+ 微信 +

WeChat Pay

+
+
+ 支付宝 +

Alipay

+
+
+ +## License +MIT © [ChenZhaoYu](./license) + diff --git a/chatgpt-web/versions/latest/config.json b/chatgpt-web/versions/latest/config.json new file mode 100644 index 00000000..017c5b14 --- /dev/null +++ b/chatgpt-web/versions/latest/config.json @@ -0,0 +1,140 @@ +{ + "formFields": [ + { + "type": "number", + "labelZh": "网页端口", + "labelEn": "WebUI Port", + "required": true, + "default": 40021, + "rule": "paramPort", + "envKey": "PANEL_APP_PORT_HTTP", + "edit": true + }, + { + "type": "text", + "labelZh": "OPENAI ACCESS TOKEN(与OPENAI API KEY至少填一个)", + "labelEn": "OPENAI ACCESS TOKEN (fill in at least one with OPENAI API KEY)", + "required": false, + "default": "", + "envKey": "ACCESS_TOKEN", + "edit": true + }, + { + "type": "text", + "labelZh": "API反向代理,可选(OPENAI ACCESS TOKEN时默认启用,需要注意可用性)", + "labelEn": "API reverse proxy, optional (enabled by default when OPENAI ACCESS TOKEN, need to pay attention to availability)", + "required": false, + "default": "https://bypass.duti.tech/api/conversation", + "envKey": "REVERSE_PROXY", + "edit": true + }, + { + "type": "text", + "labelZh": "OPENAI API KEY(与OPENAI ACCESS TOKEN至少填一个)", + "labelEn": "OPENAI API KEY (fill in at least one with OPENAI ACCESS TOKEN)", + "required": false, + "default": "", + "envKey": "API_KEY", + "edit": true + }, + { + "type": "text", + "labelZh": "API模型,可选,设置OPENAI API KEY时可用(https://platform.openai.com/docs/models)", + "labelEn": "API model, optional, available when setting OPENAI API KEY(https://platform.openai.com/docs/models)", + "required": false, + "default": "gpt-3.5-turbo", + "envKey": "API_MODEL", + "edit": true + }, + { + "type": "text", + "labelZh": "API接口地址,可选,设置OPENAI API KEY时可用", + "labelEn": "API interface address, optional, available when setting OPENAI API KEY", + "required": false, + "default": "https://api.openai.com", + "envKey": "API_BASE_URL", + "edit": true + }, + { + "type": "text", + "labelZh": "访问权限密钥,可选(强烈建议填写)", + "labelEn": "Access rights key, optional (recommended)", + "required": false, + "default": "", + "envKey": "SECRET_KEY", + "edit": true + }, + { + "type": "text", + "labelZh": "每小时最大请求次数,可选,默认无限", + "labelEn": "Maximum number of requests per hour, optional, default unlimited", + "required": false, + "default": "0", + "envKey": "REQUEST_LIMIT", + "edit": true + }, + { + "type": "text", + "labelZh": "超时,单位毫秒,可选", + "labelEn": "Timeout, in milliseconds, optional", + "required": false, + "default": "60000", + "envKey": "TIMEOUT", + "edit": true + }, + { + "type": "text", + "labelZh": "Socks代理地址,可选,和Socks代理端口一起时生效", + "labelEn": "Socks proxy address, optional, effective when combined with Socks proxy port", + "required": false, + "default": "", + "envKey": "PROXY_HOST", + "edit": true + }, + { + "type": "text", + "labelZh": "Socks代理端口,可选,和Socks代理地址一起时生效", + "labelEn": "Socks proxy port, optional, effective when combined with Socks proxy address", + "required": false, + "default": "", + "envKey": "PROXY_PORT", + "edit": true + }, + { + "type": "text", + "labelZh": "Socks代理用户名,可选,和Socks代理地址一起时生效", + "labelEn": "Socks proxy user name, optional, effective when combined with Socks proxy address", + "required": false, + "default": "", + "envKey": "PROXY_USERNAME", + "edit": true + }, + { + "type": "text", + "labelZh": "Socks代理密码,可选,和Socks代理地址一起时生效", + "labelEn": "Socks proxy password, optional, effective when combined with Socks proxy address", + "required": false, + "default": "", + "envKey": "PROXY_PASSWORD", + "edit": true + }, + { + "type": "text", + "labelZh": "HTTPS代理,可选,支持http,https,socks5", + "labelEn": "HTTPS proxy, optional, supports http, https, socks5", + "required": false, + "default": "", + "envKey": "HTTPS_PROXY", + "edit": true + }, + { + "type": "text", + "labelZh": "获取ACCESS_TOKEN:https://chat.openai.com/api/auth/session", + "labelEn": "Get ACCESS_TOKEN: https://chat.openai.com/api/auth/session", + "required": false, + "default": "这是一个提示/This is a tip", + "edit": false + } + ] +} + diff --git a/chatgpt-web/versions/latest/docker-compose.yml b/chatgpt-web/versions/latest/docker-compose.yml new file mode 100644 index 00000000..834917f6 --- /dev/null +++ b/chatgpt-web/versions/latest/docker-compose.yml @@ -0,0 +1,43 @@ +version: "3" +services: + chatgpt-web: + container_name: ${CONTAINER_NAME} + restart: unless-stopped + networks: + - 1panel-network + ports: + - "${PANEL_APP_PORT_HTTP}:3002" + environment: + # 二选一 + OPENAI_API_KEY: "${API_KEY}" + # 二选一 + OPENAI_ACCESS_TOKEN: "${ACCESS_TOKEN}" + # 获取ACCESS_TOKEN:https://chat.openai.com/api/auth/session + # API接口地址,可选,设置 OPENAI_API_KEY 时可用 + OPENAI_API_BASE_URL: "${API_BASE_URL}" + # API模型,可选,设置 OPENAI_API_KEY 时可用 + OPENAI_API_MODEL: "${API_MODEL}" + # 反向代理,可选 + API_REVERSE_PROXY: "${REVERSE_PROXY}" + # 访问权限密钥,可选 + AUTH_SECRET_KEY: "${SECRET_KEY}" + # 每小时最大请求次数,可选,默认无限 + MAX_REQUEST_PER_HOUR: "${REQUEST_LIMIT}" + # 超时,单位毫秒,可选 + TIMEOUT_MS: "${TIMEOUT}" + # Socks代理,可选,和 SOCKS_PROXY_PORT 一起时生效 + SOCKS_PROXY_HOST: "${PROXY_HOST}" + # Socks代理端口,可选,和 SOCKS_PROXY_HOST 一起时生效 + SOCKS_PROXY_PORT: "${PROXY_PORT}" + # Socks代理用户名,可选,和 SOCKS_PROXY_HOST 一起时生效 + SOCKS_PROXY_USERNAME: "${PROXY_USERNAME}" + # Socks代理密码,可选,和 SOCKS_PROXY_HOST 一起时生效 + SOCKS_PROXY_PASSWORD: "${PROXY_PASSWORD}" + # HTTPS 代理,可选,支持 http,https,socks5 + HTTPS_PROXY: "${HTTPS_PROXY}" + image: chenzhaoyu94/chatgpt-web:latest + labels: + createdBy: "Apps" +networks: + 1panel-network: + external: true diff --git a/list.json b/list.json index 99c9a2e4..06b514cb 100644 --- a/list.json +++ b/list.json @@ -111,6 +111,20 @@ "website": "https://flarum.org/", "github": "https://github.com/flarum/flarum", "document": "https://docs.flarum.org/" + }, + { + "key": "chatgpt-web", + "name": "chatgpt-web", + "tags": ["Tool"], + "versions": ["latest"], + "shortDescZh": "使用express和vue3搭建的支持ChatGPT双模型演示网页。", + "shortDescEn": "ChatGPT-enabled dual-model demo page built with express and vue3.", + "type": "tool", + "limit": 0, + "crossVersionUpdate": true, + "website": "https://github.com/Chanzhaoyu/chatgpt-web", + "github": "https://github.com/Chanzhaoyu/chatgpt-web", + "document": "https://github.com/Chanzhaoyu/chatgpt-web" } ] }