决定了,将ChatGPTer开源!主打一个大模型人人可用。

一个快速上手且极易部署的类ChatGPT开源应用,可接入 OPENAI API通义千问API

开源地址: https://github.com/isnl/EsChat

大声(偷偷)告诉你:通义千问有免费API额度可白嫖!!!

版本特性

  • OPENAI 和 通义千问双模型可选
  • 支持暗黑主题 🌙
  • 完美的移动端兼容 📱
  • 打字机回复效果 ⌨️
  • 上下文对话支持,可创建多轮对话记录
  • 整段生成内容支持复制、代码复制、代码高亮
  • 双登录模式:
    • 1.关联公众号登录(个人订阅号即可) - 可实现公众号引流
    • 2.普通的授权码登录模式(手动分发授权码)
  • Lowdb 本地JSON数据库
  • 自定义调用次数及文本输入上限

关于使用个人订阅号实现网站授权登录的具体技术方案可参考如下文章,非常详细
https://juejin.cn/post/7234394174274158650


目录

  • 前置要求
    • Node
    • .env 配置文件
      • 1.通义千问配置
        • TY_API_KEY
        • TY_MODEL
      • 2.OPENAI相关配置
        • GPT3_BASE_URL
        • GPT3_API_KEY
        • GPT3_MODEL
      • 3.用户配置及公众号相关
        • WECHAT_TOKEN
        • JWT_SECRET_KEY
        • MAX_LENGTH
        • DAILY_LIMIT
        • 网站登录 - 公众号二维码存放路径
  • 截图展示
    • 🏠 首页
    • 内容生成
    • 保存为图片
    • 昵称头像修改
    • 移动端兼容
  • 技术栈
    • 客户端
    • 服务端
  • 目录结构
    • 客户端
    • 服务端
  • 安装部署
    • 本地开发
  • 本地构建
    • Docker
  • 常见问题

前置要求

Node

node 需要 ^16 || ^18 || ^19 版本(node >= 14 需要安装 fetch polyfill),使用 nvm 可管理本地多个 node 版本

node -v

.env 配置文件

请参考 server/.env.example 文件,将配置项替换为实际值,并在相同目录下保存为 .env 文件

以下 通义千问OPENAI 二选一,默认优先取通义千问配置

1.通义千问配置
TY_API_KEY
  • 必须: true
  • 描述: 用于访问通义千问平台的 apiKey。
TY_MODEL
  • 必须: false
  • 默认值: qw-max
  • 描述: 指定要调用的通义千问大语言模型。若不设置,将使用默认值 qw-plus
2.OPENAI相关配置
GPT3_BASE_URL
  • 必须: false
  • 默认值: https://api.openai.com/v1
  • 描述: gpt3服务的基础URL。如无特殊需求,建议使用默认值。
GPT3_API_KEY
  • 必须: true
  • 描述: openai平台提供的 API 密钥,用于访问 gpt3 服务。
GPT3_MODEL
  • 必须: false
  • 默认值: gpt-3.5-turbo
  • 描述: 指定使用的 gpt3 模型。如果不指定,系统将使用默认模型 gpt-3.5-turbo
3.用户配置及公众号相关
WECHAT_TOKEN
  • 必须: true
  • 描述: 对应微信公众号后台设置的 token,可按需自定义。
JWT_SECRET_KEY
  • 必须: true
  • 描述: 设置用于 jwt 鉴权的 secret key。
MAX_LENGTH
  • 必须: true
  • 默认值: 2000
  • 描述: 用户允许的最大输入字符长度。默认限制为 2000 字符。
DAILY_LIMIT
  • 必须: true
  • 默认值: 20
  • 描述: 每日调用接口的额度上限。默认设定为每日最多调用 20 次。
网站登录 - 公众号二维码存放路径

client/static/imgs/mp_qrcode.jpg

请注意,如果是 Docker 部署,则路径如下

server/clientDist/static/imgs/mp_qrcode.jpg

截图展示

🏠 首页

空对话-浅色主题

空对话-深色主题

内容生成

深色模式下的内容生成

保存为图片

对话记录保存为图片

导出的图片内容

昵称头像修改

修改头像

昵称修改

移动端兼容

移动端对话管理 移动端内容生成
## 技术栈

客户端

Vue3 + Element Plus + Pinia + Unocss

服务端

Express + Lowdb

目录结构

客户端

/src/assets 静态资源

/src/components 公共组件

/src/hooks 公共hooks

/src/router 路由配置

/src/service 接口请求、响应拦截器

/src/stores 状态管理

/src/utils 全局工具类

/src/views 页面

服务端

/src/constant 常量

/src/lowdb Lowdb本地数据库及配置

  • user.ts 用户数据库配置
  • users.json 用户数据库文件
  • userServiceCall.ts 用户调用记录数据库配置
  • userServiceCall.json 用户调用记录数据库文件

/src/routes 路由

  • wechat.ts 公众号验证、获取验证码、登录校验
  • home.ts status 状态校验
  • chat.ts 大模型对话
  • user.ts 用户信息相关

/src/store node-cache配置,主要用于验证码的生成及校验

/src/utils 工具类

.env.example 配置文件示例,请务必创建自己的 .env 文件

app.ts 应用入口,可配置端口、跨域等

安装部署

本地开发

克隆项目

git clone git@github.com:isnl/EsChat.git

服务端

进入服务端根目录

cd server

安装依赖

npm install  

参考 .env.example ,在服务端根目录下新建 .env 文件,并配置环境变量

启动服务端

npm run dev

客户端

进入客户端根目录

cd client

安装依赖

npm install  

启动客户端

npm run dev

本地构建

客户端构建

进入客户端根目录

cd client

执行构建命令

npm run build

此时会在服务端根目录生成客户端的构建产物 clientDist


服务端构建

进入服务端根目录

cd server

执行构建命令

npm run build

此时会在服务端根目录产生两个构建产物 app.mjsapp.mjs.map

接下来使用如下命令启动服务即可

npm start

当然,你也可以使用 pm2 来守护进程,防止进程被杀死

pm2 start npm --name ai -- start

Docker

docker pull webpeanut/eschatdocker run -d --name eschat \-p 3100:3100  \-e TY_API_KEY=YOUR_TY_API_KEY \-e TY_MODEL=qwen-turbo  \-e WECHAT_TOKEN=YOUR_WECHAT_TOKEN  \-e JWT_SECRET_KEY=YOUR_JWT_SECRET_KEY  \-e MAX_LENGTH=2000  \-e DAILY_LIMIT=20  \webpeanut/eschat

如果你需要指定其他环境变量,请自行在上述命令中增加 -e 环境变量=环境变量值 来指定。

常见问题

Q: 部署后为啥不是流式响应

A: 检查 nginx 配置

proxy_buffering off;
chunked_transfer_encoding on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 65;

Q: 授权码登录方式,授权码在哪创建?

A/server/db/user.jsonopenId 为授权码字段,自行生成即可,长度和内容随机,确保唯一性即可

{"openId": "nf71b7-nsh167-7n21b1","id": "poRElv1koxGkvYriOlM61","avatar": "E053","name": "GFN1E-ChatGPTer","createdAt": "2024-04-05 15:38:15"
}

Q: 除了微信公众号和授权码登录方式外,能不能让用户自己注册账号自行使用?

A: 用户相关模块逻辑很清晰,自行开发注册相关功能即可


Q: 能不能给指定的用户单独设置每日调用次数和文本长度限制?

A: 需要写点代码,将调用次数和文本长度字段存入数据库中的用户表里。在你使用的模型 chat 路由模块(server/src/routes/chat/xxx),先根据id获取到用户信息,再将调用次数和文本长度限制改为从用户信息中获取的方式即可

  • process.env.MAX_LENGTH -> 用户信息中的 MAX_LENGTH
  • process.env.DAILY_LIMIT -> 用户信息中的 DAILY_LIMIT

Q: Docker部署,如何查看镜像文件夹中的内容,例如查看数据库?

A: 要查看 Docker 镜像中的内容,你可以通过以下步骤操作:

首先,使用以下命令列出本地的 Docker 镜像:

docker images

找到你想要查看的镜像的 REPOSITORY 和 TAG。

使用以下命令创建并启动一个临时容器,使得你能够在其中查看镜像中的文件内容:

docker run -it --rm webpeanut/eschat sh

这将创建并启动一个新的容器,并进入容器的 shell 命令行界面。

在容器的命令行界面中,你可以使用标准的 Linux 命令来查看镜像中的文件内容,例如 ls 命令来列出目录中的文件。

通过以上步骤,你可以在容器中查看 Docker 镜像中的文件内容。


Q: 没有服务器和域名怎么办?

A: 买!阿里云现在服务器价格新老用户都很便宜
2核4G,5M固定带宽,80G ESSD Entry盘一年只需要199(企业用户),2核2G,3M固定带宽,40G ESSD Entry盘只需 99(个人企业同享)
不是哥们,这价格你敢信!!! 最重要的是 续费同价,这你受得了吗!

当然,新用户更优惠,.com域名 + 2核2G ECS包年 只需 9999 你买不了吃亏,买不了上当

阿里云-即刻上车

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/15787.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

点云AABB、OBB包围盒计算显示

目录 一、简介 1)AABB包围盒 2)OBB包围盒 二、计算代码 三、加载计算结果

什么是Promise

Promise 是 JavaScript 中的一个对象,用于处理异步操作。它代表了一个最终可能完成(也可能被拒绝)的异步操作及其结果值。Promise 对象用于更复杂的异步编程模式,包括使用 .then() 和 .catch() 链式调用来处理异步操作的结果。 P…

算法提高之区间最大公约数

算法提高之区间最大公约数 核心思想&#xff1a;线段树 1.在区间上加一个数 差分 2.求一段区间的最gcd 求[l,r]的gcd 可以拆解为求**[1,l].sum(差分数组 求出来时l点的值)和[l1,r]**做gcd #include <iostream>#include <cstring>#include <algorithm>usi…

1738. 找出第 K 大的异或坐标值

1738. 找出第 K 大的异或坐标值 题目链接&#xff1a;1738. 找出第 K 大的异或坐标值 代码如下&#xff1a; //列前缀异或和 //参考链接:https://leetcode.cn/problems/find-kth-largest-xor-coordinate-value/solutions/2790359/liang-chong-fang-fa-er-wei-qian-zhui-yi-68…

Docker数据卷(volume)

数据卷 数据卷是一个虚拟目录&#xff0c;是容器内目录与宿主机目录之间映射的桥梁。&#xff08;容器内目录与宿主机目录对应的桥梁&#xff0c;修改宿主机对应的目录&#xff0c;docker会映射到容器内部&#xff0c;相当于修改了容器内的&#xff0c;反之也一样&#xff09;数…

利用英特尔 Gaudi 2 和至强 CPU 构建经济高效的企业级 RAG 应用

检索增强生成 (Retrieval Augmented Generation&#xff0c;RAG) 可将存储在外部数据库中的新鲜领域知识纳入大语言模型以增强其文本生成能力。其提供了一种将公司数据与训练期间语言模型学到的知识分开的方式&#xff0c;有助于我们在性能、准确性及安全隐私之间进行有效折衷。…

任推邦:实力强劲的APP推广拉新平台,号称不扣量

任推邦简介 任推邦是国内数一数二的项目分发平台&#xff0c;也是一个不扣量的项目APP推广拉新平台&#xff0c;隶属于聚名科技集团股份有限公司。聚名科技成立时间在2012年&#xff0c;是安徽省老牌互联网企业&#xff0c;历经11年的飞速发展&#xff0c;聚名科技成功布局打造…

小程序的这些知识你知道吗?

一:导航传参 无论是编程式还是声明式导肮传参都是在url?keyvalue&key1value1,无论是否是tabbar页面. 对于回退页面,没办法传参. 这个参数是,跳转到页面的时候,跳转到另一个页面,这个页面就是刚开始执行,等数据执行之后,触发onload,传递的参数放在内存中,跳转是内部底层触…

云端力量:利用移动云服务器高效部署Spring Boot Web应用

文章目录 一、移动云介绍二、移动云产品选择三、体验云主机ECS四、使用移动云服务器部署SpringBoot Web应用4.1移动云ECS安装JDK4.2移动云ECS安装MySQL4.3移动云ECS数据库插入数据4.4移动云ECS部署Spring Boot Web应用 总结 一、移动云介绍 移动云是中国移动基于自研的先进技术…

Linux中常见的基本指令(上)

目录 一、ls指令 1. ls 2. ls -l 3. ls -a 4.ls -F 二、qwd指令 三、cd指令 1. cd .. 2. cd / / / 3. cd ../ / / 4. cd ~ 5. cd - 五、mkdir指令 六、rmdir指令和rm指令 一、ls指令 语法 &#xff1a; ls [ 选项 ][ 目录或文件 ] 。 功能 &#xff1a;对于目录…

桶排序和基数排序

前言&#xff1a; 这篇文章&#xff0c;我们就来了解一些鲜为人知的排序&#xff0c;桶排序和基数排序。 桶排序&#xff1a; 桶排序的思想&#xff1a; 桶排序的思想就是把待排序的数尽量均匀地放到各个桶中&#xff0c;再对各个桶进行局部的排序&#xff0c;最后再按序将各…

AI Agent: Agent框架+7个实例

何谓Agent Agent 作为一种新兴的人工智能技术&#xff0c;正在受到越来越多的关注。要说清楚什么是 Agent&#xff0c;先得看看人工智能的本质是什么。 人工智能这个名称来自它试图通过计算机程序或机器来模拟、扩展和增强人类智能的 一些方面。在这个定义中&#xff0c;“人…

C# WPF入门学习(四)—— 按钮控件

上期介绍了WPF的实现架构和原理&#xff0c;之后我们开始来使用WPF来学习各种控件。 一、尝试插入一个按钮&#xff08;方法一&#xff09; 1. VS2019 在界面中&#xff0c;点击工具栏中的视图&#xff0c;在下拉菜单中选择工具箱。 至于编译器中的视图怎么舒服怎么来布置&am…

Cocos Creator 帧动画播放组件制作详解

Cocos Creator 是一个强大的游戏开发工具&#xff0c;提供了丰富的功能和组件&#xff0c;其中帧动画播放组件是游戏开发中常用的组件之一&#xff0c;通过帧动画播放组件可以实现角色动画、特效动画等效果。本文将详细介绍如何使用 Cocos Creator 制作帧动画播放组件&#xff…

infoq学习笔记-云原生网关当道,三大主流厂商如何“竞 技”?

注基础组件的质量&#xff0c;这些基础组件是用户看不到的。这些组件包括代码质量、自动化的CI/CD、端对端测试、混沌测试等。在APISIX中&#xff0c;我们内置了大 量的测试案例代码&#xff0c;包括单元测试、E2E测试、混沌测试&#xff0c;以及一些基准测试等&#xff0c;从而…

沈阳师范大学文学院副教授傅赢

女&#xff0c;生于1971年6月&#xff0c;辽宁辽阳人&#xff0c;1995年6月毕业于沈阳师范学院中文系汉语言文学教育专业&#xff0c;2000年6月于东北师范大学获中国现当代文学专业文学硕士学位&#xff0c;现为文学院汉语国际教育专业教师&#xff0c;副教授。 主要从事对外汉…

蓝桥杯练习系统(算法训练)ALGO-934 序列

资源限制 内存限制&#xff1a;256.0MB C/C时间限制&#xff1a;1.0s Java时间限制&#xff1a;3.0s Python时间限制&#xff1a;5.0s 问题描述 王神想要知道n的所有排列的逆序对数和&#xff0c;但是他觉得太水了&#xff0c;于是让你算。 输入格式 一行一个整数n 输…

random和range

含义&#xff1a; random(1&#xff0c;10) 不包含10&#xff0c;用于生成随机数。它可以生成浮点数或整数&#xff0c;取决于具体的使用方式。 range(0&#xff0c;1) 不包含1&#xff0c;用于生成一个整数序列。它可以生成一个指定范围内的连续整数序列。 区别在于&#x…

Linux:Linux系统项目配置

linux高级 软件安装 rpm(redhat package manager)安装 软件已经按照redhat的包管理规范进行打包,使用rpm命令进行安装,但包之间可能有依赖关系,因此不能自行解决库依赖问题,比较麻烦 yum安装 一种在线软件安装方式,本质上还是rpm安装,自动下载安装包并安装,安装过程中自动…

【MySQL精通之路】SQL优化(1)-查询优化(23)-避免全表扫描

当MySQL使用全表扫描来解析查询时&#xff0c;EXPLAIN的输出在type列中显示ALL。 这种情况通常发生在以下情况下&#xff1a; 该表非常小&#xff0c;因此执行全表扫描比查找关键字更快。这对于少于10行且行长较短的表来说很常见。 对于索引列&#xff0c;ON或WHERE子句中没有…