frontend 兼容
25
README.md
@@ -8,30 +8,7 @@ protoc \
|
|||||||
```
|
```
|
||||||
|
|
||||||
```shell
|
```shell
|
||||||
# chatgpt-web-backend
|
# ai-chat-web
|
||||||
go mod tidy
|
|
||||||
go run cmd/main.go \
|
|
||||||
--frontend-path www \
|
|
||||||
--openapi-key $MOONSHOT_API_KEY \
|
|
||||||
--openapi-base-url https://api.moonshot.cn/v1 \
|
|
||||||
--openai-model kimi-k2.5 \
|
|
||||||
--openai-temperature 100 \
|
|
||||||
--openai-presence-penalty 0 \
|
|
||||||
--openai-frequency-penalty 0
|
|
||||||
|
|
||||||
docker build -t chatgpt-web-backend:1.0.0 .
|
|
||||||
|
|
||||||
docker run -d --name chatgpt-web-backend \
|
|
||||||
-p 7080:7080 \
|
|
||||||
chatgpt-web-backend:1.0.0 \
|
|
||||||
/app/server \
|
|
||||||
--frontend-path www \
|
|
||||||
--openapi-key "$MOONSHOT_API_KEY" \
|
|
||||||
--openapi-base-url https://api.moonshot.cn/v1 \
|
|
||||||
--openai-model kimi-k2.5 \
|
|
||||||
--openai-temperature 100 \
|
|
||||||
--openai-presence-penalty 0 \
|
|
||||||
--openai-frequency-penalty 0
|
|
||||||
|
|
||||||
# ai-chat-backend
|
# ai-chat-backend
|
||||||
docker build -t ai-chat-backend:1.0.0 .
|
docker build -t ai-chat-backend:1.0.0 .
|
||||||
|
|||||||
124
ai-chat-stack/compose.yaml
Normal file
@@ -0,0 +1,124 @@
|
|||||||
|
services:
|
||||||
|
mysql:
|
||||||
|
image: mysql:8.0
|
||||||
|
container_name: ai-chat-mysql
|
||||||
|
restart: unless-stopped
|
||||||
|
environment:
|
||||||
|
MYSQL_ROOT_PASSWORD: root
|
||||||
|
command:
|
||||||
|
- --default-authentication-plugin=mysql_native_password
|
||||||
|
volumes:
|
||||||
|
- /data/mysql:/var/lib/mysql
|
||||||
|
- /home/lian/share/aichat/init/create_db.sql:/docker-entrypoint-initdb.d/create_db.sql:ro
|
||||||
|
healthcheck:
|
||||||
|
test: ["CMD", "mysqladmin", "ping", "-h", "127.0.0.1", "-proot"]
|
||||||
|
interval: 15s
|
||||||
|
timeout: 5s
|
||||||
|
retries: 10
|
||||||
|
|
||||||
|
pgvector:
|
||||||
|
image: pgvector/pgvector:pg16
|
||||||
|
container_name: ai-chat-pgvector
|
||||||
|
restart: unless-stopped
|
||||||
|
environment:
|
||||||
|
POSTGRES_DB: ai_chat
|
||||||
|
POSTGRES_USER: postgres
|
||||||
|
POSTGRES_PASSWORD: postgres
|
||||||
|
ports:
|
||||||
|
- "15432:5432"
|
||||||
|
volumes:
|
||||||
|
- /data/pgvector:/var/lib/postgresql/data
|
||||||
|
- /home/lian/share/aichat/init/pgvector-init.sql:/docker-entrypoint-initdb.d/pgvector-init.sql:ro
|
||||||
|
|
||||||
|
tokenizer:
|
||||||
|
build:
|
||||||
|
context: ../tokenizer
|
||||||
|
image: tokenizer:1.0.0
|
||||||
|
container_name: tokenizer
|
||||||
|
ports:
|
||||||
|
- "3002:3002"
|
||||||
|
restart: unless-stopped
|
||||||
|
|
||||||
|
sensitive-filter:
|
||||||
|
build:
|
||||||
|
context: ../keywords-filter
|
||||||
|
image: keywords-filter:1.0.0
|
||||||
|
container_name: sensitive-filter
|
||||||
|
volumes:
|
||||||
|
- /home/lian/share/aichat/ai-chat-stack/configs/sensitive.yaml:/app/config.yaml:ro
|
||||||
|
- /home/lian/share/aichat/ai-chat-stack/configs/sensitive-dict.txt:/app/dict.txt:ro
|
||||||
|
command:
|
||||||
|
- --config=/app/config.yaml
|
||||||
|
- --dict=/app/dict.txt
|
||||||
|
ports:
|
||||||
|
- "50053:50053"
|
||||||
|
restart: unless-stopped
|
||||||
|
|
||||||
|
keywords-filter:
|
||||||
|
build:
|
||||||
|
context: ../keywords-filter
|
||||||
|
image: keywords-filter:1.0.0
|
||||||
|
container_name: keywords-filter
|
||||||
|
volumes:
|
||||||
|
- /home/lian/share/aichat/ai-chat-stack/configs/keywords.yaml:/app/config.yaml:ro
|
||||||
|
- /home/lian/share/aichat/ai-chat-stack/configs/keywords-dict.txt:/app/dict.txt:ro
|
||||||
|
command:
|
||||||
|
- --config=/app/config.yaml
|
||||||
|
- --dict=/app/dict.txt
|
||||||
|
ports:
|
||||||
|
- "50054:50054"
|
||||||
|
restart: unless-stopped
|
||||||
|
|
||||||
|
ai-chat-service:
|
||||||
|
build:
|
||||||
|
context: ../ai-chat-service
|
||||||
|
image: ai-chat-service:1.0.0
|
||||||
|
container_name: ai-chat-service
|
||||||
|
dns:
|
||||||
|
- 223.5.5.5
|
||||||
|
- 119.29.29.29
|
||||||
|
- 8.8.8.8
|
||||||
|
volumes:
|
||||||
|
- /home/lian/share/aichat/ai-chat-stack/configs/ai-chat-service.yaml:/app/config.yaml:ro
|
||||||
|
extra_hosts:
|
||||||
|
- "host.docker.internal:host-gateway"
|
||||||
|
ports:
|
||||||
|
- "50055:50055"
|
||||||
|
depends_on:
|
||||||
|
- mysql
|
||||||
|
- tokenizer
|
||||||
|
- sensitive-filter
|
||||||
|
- keywords-filter
|
||||||
|
- pgvector
|
||||||
|
healthcheck:
|
||||||
|
test: ["CMD", "grpc_health_probe", "-addr=:50055"]
|
||||||
|
interval: 15s
|
||||||
|
timeout: 5s
|
||||||
|
retries: 5
|
||||||
|
restart: unless-stopped
|
||||||
|
|
||||||
|
ai-chat-backend:
|
||||||
|
build:
|
||||||
|
context: ../ai-chat-backend
|
||||||
|
image: ai-chat-backend:1.0.0
|
||||||
|
container_name: ai-chat-backend
|
||||||
|
dns:
|
||||||
|
- 223.5.5.5
|
||||||
|
- 119.29.29.29
|
||||||
|
- 8.8.8.8
|
||||||
|
volumes:
|
||||||
|
- /home/lian/share/aichat/ai-chat-stack/configs/ai-chat-backend.yaml:/app/config.yaml:ro
|
||||||
|
depends_on:
|
||||||
|
- ai-chat-service
|
||||||
|
restart: unless-stopped
|
||||||
|
|
||||||
|
ai-chat-web:
|
||||||
|
build:
|
||||||
|
context: ../ai-chat-web
|
||||||
|
image: ai-chat-web:1.0.0
|
||||||
|
container_name: ai-chat-web
|
||||||
|
depends_on:
|
||||||
|
- ai-chat-backend
|
||||||
|
ports:
|
||||||
|
- "1025:80"
|
||||||
|
restart: unless-stopped
|
||||||
22
ai-chat-stack/configs/ai-chat-backend.yaml
Normal file
@@ -0,0 +1,22 @@
|
|||||||
|
http:
|
||||||
|
ip: 0.0.0.0
|
||||||
|
port: 7080
|
||||||
|
frontend_path: "www"
|
||||||
|
log:
|
||||||
|
level: "info"
|
||||||
|
logPath: "runtime/logs/app.log"
|
||||||
|
chat:
|
||||||
|
model: "kimi-k2.5"
|
||||||
|
max_tokens: 4096
|
||||||
|
temperature: 1
|
||||||
|
top_p: 1
|
||||||
|
presence_penalty: 0
|
||||||
|
frequency_penalty: 0
|
||||||
|
bot_desc: "你是一个AI助手,我需要你模拟一名资深的软件工程师来回答我的问题"
|
||||||
|
min_response_tokens: 600
|
||||||
|
context_ttl: 1800
|
||||||
|
context_len: 4
|
||||||
|
dependOn:
|
||||||
|
ai-chat-service:
|
||||||
|
address: "ai-chat-service:50055"
|
||||||
|
accessToken: "me256487ang1chubdpdialoud22sev1ozhoguumyqca"
|
||||||
54
ai-chat-stack/configs/ai-chat-service.yaml
Normal file
@@ -0,0 +1,54 @@
|
|||||||
|
server:
|
||||||
|
ip: 0.0.0.0
|
||||||
|
port: 50055
|
||||||
|
accessToken: "me256487ang1chubdpdialoud22sev1ozhoguumyqca"
|
||||||
|
log:
|
||||||
|
level: "info"
|
||||||
|
logPath: "runtime/logs/app.log"
|
||||||
|
chat:
|
||||||
|
api_key: "sk-8NMdsGbDAMpWdd6hrKHepr1tNVXTy2QppKAqJkoJcHd6TYLs"
|
||||||
|
base_url: "https://api.moonshot.cn/v1"
|
||||||
|
model: "kimi-k2.5"
|
||||||
|
max_tokens: 4096
|
||||||
|
temperature: 1
|
||||||
|
top_p: 0.95
|
||||||
|
presence_penalty: 0
|
||||||
|
frequency_penalty: 0
|
||||||
|
bot_desc: "你是一个AI助手,我需要你模拟一名资深的软件工程师来回答我的问题"
|
||||||
|
min_response_tokens: 600
|
||||||
|
context_ttl: 1800
|
||||||
|
context_len: 4
|
||||||
|
redis:
|
||||||
|
host: "host.docker.internal"
|
||||||
|
port: 8888
|
||||||
|
pwd: "123456"
|
||||||
|
mysql:
|
||||||
|
dsn: "root:root@tcp(mysql:3306)/ai_chat?collation=utf8mb4_unicode_ci&charset=utf8mb4"
|
||||||
|
maxLifeTime: 3600
|
||||||
|
maxOpenConn: 10
|
||||||
|
maxIdleConn: 10
|
||||||
|
dependOn:
|
||||||
|
sensitive:
|
||||||
|
address: "sensitive-filter:50053"
|
||||||
|
accessToken: "ang1chubdev1ozhome256487d22sapguuv1ozhom"
|
||||||
|
keywords:
|
||||||
|
address: "keywords-filter:50054"
|
||||||
|
accessToken: "ang1chubdev1ozhome256487d22sapguuv1ozhom"
|
||||||
|
tokenizer:
|
||||||
|
address: "http://tokenizer:3002"
|
||||||
|
vector:
|
||||||
|
provider: "pgvector"
|
||||||
|
threshold: 0.99
|
||||||
|
pgvector:
|
||||||
|
dsn: "postgres://postgres:postgres@pgvector:5432/ai_chat?sslmode=disable"
|
||||||
|
table: "chat_record_vectors"
|
||||||
|
dimensions: 1024
|
||||||
|
maxLifeTime: 3600
|
||||||
|
maxOpenConn: 10
|
||||||
|
maxIdleConn: 10
|
||||||
|
embedding:
|
||||||
|
provider: "openai-compatible"
|
||||||
|
base_url: "https://open.bigmodel.cn/api/paas/v4"
|
||||||
|
api_key: "d51b903546814cc9981d3649a4a899a3.NQOtz3ocRtQwimh9"
|
||||||
|
model: "embedding-2"
|
||||||
|
timeout: 10
|
||||||
192
ai-chat-stack/configs/keywords-dict.txt
Normal file
@@ -0,0 +1,192 @@
|
|||||||
|
golang
|
||||||
|
defer
|
||||||
|
recover
|
||||||
|
sync
|
||||||
|
Protobuf
|
||||||
|
gin
|
||||||
|
grpc-gateway
|
||||||
|
OpenTelemetry
|
||||||
|
OTel
|
||||||
|
otel
|
||||||
|
k8s
|
||||||
|
Kubernetes
|
||||||
|
kubernetes
|
||||||
|
Docker
|
||||||
|
docker
|
||||||
|
Istio
|
||||||
|
istio
|
||||||
|
Prometheus
|
||||||
|
prometheus
|
||||||
|
cadvisor
|
||||||
|
cAdvisor
|
||||||
|
Elastic
|
||||||
|
Kibana
|
||||||
|
Grafana
|
||||||
|
apiserver
|
||||||
|
CI/CD
|
||||||
|
ci/cd
|
||||||
|
ArgoCD
|
||||||
|
argo
|
||||||
|
Argo
|
||||||
|
kaniko
|
||||||
|
Mesh
|
||||||
|
Volume
|
||||||
|
volume
|
||||||
|
promQL
|
||||||
|
PromQL
|
||||||
|
kafka
|
||||||
|
ingress
|
||||||
|
StorageClass
|
||||||
|
VolumeClaim
|
||||||
|
gitlab
|
||||||
|
openflow
|
||||||
|
dpdk
|
||||||
|
vpp
|
||||||
|
ovs
|
||||||
|
spdk
|
||||||
|
virtio
|
||||||
|
vhost
|
||||||
|
qemu
|
||||||
|
vSwitch
|
||||||
|
bridge
|
||||||
|
hugepage
|
||||||
|
nvme
|
||||||
|
dpvs
|
||||||
|
iperf3
|
||||||
|
rfc2544
|
||||||
|
ioengine
|
||||||
|
PCI
|
||||||
|
vxlan
|
||||||
|
gre
|
||||||
|
kni
|
||||||
|
Kernel
|
||||||
|
内核
|
||||||
|
KernelThread
|
||||||
|
内核线程
|
||||||
|
Virtual
|
||||||
|
memory
|
||||||
|
虚拟内存
|
||||||
|
内存屏障
|
||||||
|
内存管理
|
||||||
|
Scheduler
|
||||||
|
调度器
|
||||||
|
File
|
||||||
|
文件系统
|
||||||
|
Device
|
||||||
|
driver
|
||||||
|
设备驱动程序
|
||||||
|
Syscall
|
||||||
|
系统调用
|
||||||
|
Process
|
||||||
|
scheduling
|
||||||
|
进程调度
|
||||||
|
Page
|
||||||
|
页表
|
||||||
|
Swap
|
||||||
|
交换空间
|
||||||
|
Mount
|
||||||
|
Inode
|
||||||
|
挂载
|
||||||
|
索引节点
|
||||||
|
Block
|
||||||
|
块设备
|
||||||
|
Character
|
||||||
|
字符设备
|
||||||
|
IRQ
|
||||||
|
Kconfig
|
||||||
|
内核配置
|
||||||
|
Perf
|
||||||
|
Ftrace
|
||||||
|
内核跟踪工具
|
||||||
|
Valgrind
|
||||||
|
内存调试工具
|
||||||
|
System
|
||||||
|
系统定时器
|
||||||
|
DMA
|
||||||
|
伙伴系统
|
||||||
|
信号与槽
|
||||||
|
Signals
|
||||||
|
Slots
|
||||||
|
事件处理程序
|
||||||
|
Event
|
||||||
|
QML
|
||||||
|
多线程编程
|
||||||
|
Multithreading
|
||||||
|
Programming
|
||||||
|
QThread
|
||||||
|
QtQuick
|
||||||
|
模型
|
||||||
|
视图架构
|
||||||
|
Model/View
|
||||||
|
QObject
|
||||||
|
QWidget
|
||||||
|
QRegularExpression
|
||||||
|
QDesktopWidget
|
||||||
|
QNetworkAccessManager
|
||||||
|
QTcpServer
|
||||||
|
QTcpSocket
|
||||||
|
QUdpSocket
|
||||||
|
QMutex
|
||||||
|
SQLite/MySQL
|
||||||
|
MySQL编程
|
||||||
|
SQLite编程
|
||||||
|
OpenCV
|
||||||
|
OpenGL
|
||||||
|
Qt数据库编程
|
||||||
|
Qt网络编程
|
||||||
|
Linux
|
||||||
|
tcp
|
||||||
|
redis
|
||||||
|
mysql
|
||||||
|
网络
|
||||||
|
nginx
|
||||||
|
协程
|
||||||
|
io_uring
|
||||||
|
内存泄漏
|
||||||
|
bpf
|
||||||
|
ebpf
|
||||||
|
skynet
|
||||||
|
openresty
|
||||||
|
RocksDB
|
||||||
|
TiDB
|
||||||
|
ceph
|
||||||
|
etcd
|
||||||
|
fuse
|
||||||
|
p2p
|
||||||
|
|
||||||
|
http
|
||||||
|
mqtt
|
||||||
|
cuda
|
||||||
|
mutex
|
||||||
|
spinlock
|
||||||
|
hash
|
||||||
|
rbtree
|
||||||
|
btree
|
||||||
|
Makefile
|
||||||
|
git
|
||||||
|
wrk
|
||||||
|
Cuda
|
||||||
|
CUDA
|
||||||
|
D3D
|
||||||
|
d3d
|
||||||
|
ffmpeg
|
||||||
|
RTSP
|
||||||
|
WebRTC
|
||||||
|
PCM
|
||||||
|
RGB
|
||||||
|
YUv
|
||||||
|
MP4
|
||||||
|
FLV
|
||||||
|
TS
|
||||||
|
VLC
|
||||||
|
EasylCE
|
||||||
|
flvAnalyser
|
||||||
|
mp4box
|
||||||
|
audacity
|
||||||
|
Elecard
|
||||||
|
AAC
|
||||||
|
h264
|
||||||
|
SDL
|
||||||
|
AVFormat
|
||||||
|
AVCodec
|
||||||
|
AVPacket
|
||||||
7
ai-chat-stack/configs/keywords.yaml
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
server:
|
||||||
|
ip: 0.0.0.0
|
||||||
|
port: 50054
|
||||||
|
accessToken: "ang1chubdev1ozhome256487d22sapguuv1ozhom"
|
||||||
|
log:
|
||||||
|
level: "info"
|
||||||
|
logPath: "runtime/logs/app.log"
|
||||||
13992
ai-chat-stack/configs/sensitive-dict.txt
Normal file
7
ai-chat-stack/configs/sensitive.yaml
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
server:
|
||||||
|
ip: 0.0.0.0
|
||||||
|
port: 50053
|
||||||
|
accessToken: "ang1chubdev1ozhome256487d22sapguuv1ozhom"
|
||||||
|
log:
|
||||||
|
level: "info"
|
||||||
|
logPath: "runtime/logs/app.log"
|
||||||
@@ -5,3 +5,4 @@ Dockerfile
|
|||||||
.*
|
.*
|
||||||
*/.*
|
*/.*
|
||||||
!.env
|
!.env
|
||||||
|
!.env.production
|
||||||
12
ai-chat-web/.env.develop
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
# Glob API URL
|
||||||
|
VITE_GLOB_API_URL=/api
|
||||||
|
|
||||||
|
VITE_APP_API_BASE_URL=http://localhost:7080/
|
||||||
|
|
||||||
|
# Whether long replies are supported, which may result in higher API fees
|
||||||
|
VITE_GLOB_OPEN_LONG_REPLY=false
|
||||||
|
|
||||||
|
# When you want to use PWA
|
||||||
|
VITE_GLOB_APP_PWA=false
|
||||||
|
|
||||||
|
VITE_USER_CENTER="http://localhost:8082?sys=ai"
|
||||||
@@ -1,10 +1,8 @@
|
|||||||
# Glob API URL
|
|
||||||
VITE_GLOB_API_URL=/api
|
VITE_GLOB_API_URL=/api
|
||||||
|
|
||||||
VITE_APP_API_BASE_URL=http://127.0.0.1:7080/
|
|
||||||
|
|
||||||
# Whether long replies are supported, which may result in higher API fees
|
# Whether long replies are supported, which may result in higher API fees
|
||||||
VITE_GLOB_OPEN_LONG_REPLY=false
|
VITE_GLOB_OPEN_LONG_REPLY=false
|
||||||
|
|
||||||
# When you want to use PWA
|
# When you want to use PWA
|
||||||
VITE_GLOB_APP_PWA=false
|
VITE_GLOB_APP_PWA=false
|
||||||
|
|
||||||
|
VITE_USER_CENTER="https://user.0voice.com?sys=ai"
|
||||||
41
ai-chat-web/.github/workflows/build_docker.yml
vendored
Normal file
@@ -0,0 +1,41 @@
|
|||||||
|
name: build_docker
|
||||||
|
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
branches: [main]
|
||||||
|
release:
|
||||||
|
types: [created] # 表示在创建新的 Release 时触发
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
build_docker:
|
||||||
|
name: Build docker
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- name: Checkout
|
||||||
|
uses: actions/checkout@v3
|
||||||
|
|
||||||
|
- run: |
|
||||||
|
echo "本次构建的版本为:${GITHUB_REF_NAME} (但是这个变量目前上下文中无法获取到)"
|
||||||
|
echo 本次构建的版本为:${{ github.ref_name }}
|
||||||
|
env
|
||||||
|
|
||||||
|
- name: Set up QEMU
|
||||||
|
uses: docker/setup-qemu-action@v2
|
||||||
|
- name: Set up Docker Buildx
|
||||||
|
uses: docker/setup-buildx-action@v2
|
||||||
|
- name: Login to DockerHub
|
||||||
|
uses: docker/login-action@v2
|
||||||
|
with:
|
||||||
|
username: ${{ secrets.DOCKERHUB_USERNAME }}
|
||||||
|
password: ${{ secrets.DOCKERHUB_TOKEN }}
|
||||||
|
- name: Build and push
|
||||||
|
id: docker_build
|
||||||
|
uses: docker/build-push-action@v4
|
||||||
|
with:
|
||||||
|
context: .
|
||||||
|
push: true
|
||||||
|
labels: ${{ steps.meta.outputs.labels }}
|
||||||
|
platforms: linux/amd64,linux/arm64
|
||||||
|
tags: |
|
||||||
|
${{ secrets.DOCKERHUB_USERNAME }}/chatgpt-web:${{ github.ref_name }}
|
||||||
|
${{ secrets.DOCKERHUB_USERNAME }}/chatgpt-web:latest
|
||||||
47
ai-chat-web/.github/workflows/ci.yml
vendored
Normal file
@@ -0,0 +1,47 @@
|
|||||||
|
name: CI
|
||||||
|
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
branches:
|
||||||
|
- main
|
||||||
|
|
||||||
|
pull_request:
|
||||||
|
branches:
|
||||||
|
- main
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
lint:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v3
|
||||||
|
- name: Set node
|
||||||
|
uses: actions/setup-node@v3
|
||||||
|
with:
|
||||||
|
node-version: 18.x
|
||||||
|
|
||||||
|
- name: Setup
|
||||||
|
run: npm i -g @antfu/ni
|
||||||
|
|
||||||
|
- name: Install
|
||||||
|
run: nci
|
||||||
|
|
||||||
|
- name: Lint
|
||||||
|
run: nr lint:fix
|
||||||
|
|
||||||
|
typecheck:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v3
|
||||||
|
- name: Set node
|
||||||
|
uses: actions/setup-node@v3
|
||||||
|
with:
|
||||||
|
node-version: 18.x
|
||||||
|
|
||||||
|
- name: Setup
|
||||||
|
run: npm i -g @antfu/ni
|
||||||
|
|
||||||
|
- name: Install
|
||||||
|
run: nci
|
||||||
|
|
||||||
|
- name: Typecheck
|
||||||
|
run: nr type-check
|
||||||
59
ai-chat-web/.gitlab-ci.yml
Normal file
@@ -0,0 +1,59 @@
|
|||||||
|
variables:
|
||||||
|
DEPLOY_ENV: ''
|
||||||
|
DEPLOY_IMG: ''
|
||||||
|
REPO: 'chatgpt-frontend'
|
||||||
|
SERVICE_NAME: 'chatgpt-stack_chatgpt-frontend'
|
||||||
|
|
||||||
|
workflow:
|
||||||
|
rules:
|
||||||
|
- if: $CI_COMMIT_BRANCH == "dev" && $CI_PIPELINE_SOURCE == "push"
|
||||||
|
variables:
|
||||||
|
DEPLOY_ENV: 'dev'
|
||||||
|
DEPLOY_IMG: "${REPO}:${CI_COMMIT_SHORT_SHA}"
|
||||||
|
- if: $CI_COMMIT_TAG
|
||||||
|
variables:
|
||||||
|
DEPLOY_ENV: 'prod'
|
||||||
|
DEPLOY_IMG: "${REPO}:${CI_COMMIT_TAG}"
|
||||||
|
- when: never
|
||||||
|
stages:
|
||||||
|
# 编译阶段
|
||||||
|
- build
|
||||||
|
# 部署阶段(部署到测试环境/部署到生产环境)
|
||||||
|
- deploy
|
||||||
|
build-job:
|
||||||
|
stage: build
|
||||||
|
tags:
|
||||||
|
- builder
|
||||||
|
before_script:
|
||||||
|
- docker login -u ${DOCKER_REGISTRY_USER} -p ${DOCKER_REGISTRY_PWD} ${DOCKER_REGISTRY}
|
||||||
|
script:
|
||||||
|
- docker build -t ${DOCKER_REGISTRY}/${DEPLOY_IMG} .
|
||||||
|
- docker push ${DOCKER_REGISTRY}/${DEPLOY_IMG}
|
||||||
|
|
||||||
|
deploy-dev-job:
|
||||||
|
only:
|
||||||
|
variables:
|
||||||
|
- $DEPLOY_ENV == "dev"
|
||||||
|
stage: deploy
|
||||||
|
tags:
|
||||||
|
- deployer
|
||||||
|
variables:
|
||||||
|
CONF_RM_STR: ""
|
||||||
|
before_script:
|
||||||
|
- docker login -u ${DOCKER_REGISTRY_USER} -p ${DOCKER_REGISTRY_PWD} ${DOCKER_REGISTRY}
|
||||||
|
script:
|
||||||
|
- docker service update ${SERVICE_NAME} --image ${DOCKER_REGISTRY}/${DEPLOY_IMG}
|
||||||
|
|
||||||
|
deploy-prod-job:
|
||||||
|
only:
|
||||||
|
variables:
|
||||||
|
- $DEPLOY_ENV == "prod"
|
||||||
|
stage: deploy
|
||||||
|
tags:
|
||||||
|
- deployer
|
||||||
|
variables:
|
||||||
|
CONF_RM_STR: ""
|
||||||
|
before_script:
|
||||||
|
- docker login -u ${DOCKER_REGISTRY_USER} -p ${DOCKER_REGISTRY_PWD} ${DOCKER_REGISTRY}
|
||||||
|
script:
|
||||||
|
- docker service update ${SERVICE_NAME} --image ${DOCKER_REGISTRY}/${DEPLOY_IMG}
|
||||||
4
ai-chat-web/.husky/commit-msg
Normal file
@@ -0,0 +1,4 @@
|
|||||||
|
#!/usr/bin/env sh
|
||||||
|
. "$(dirname -- "$0")/_/husky.sh"
|
||||||
|
|
||||||
|
npx --no -- commitlint --edit
|
||||||
4
ai-chat-web/.husky/pre-commit
Normal file
@@ -0,0 +1,4 @@
|
|||||||
|
#!/usr/bin/env sh
|
||||||
|
. "$(dirname -- "$0")/_/husky.sh"
|
||||||
|
|
||||||
|
npx lint-staged
|
||||||
3
ai-chat-web/.vscode/extensions.json
vendored
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
{
|
||||||
|
"recommendations": ["Vue.volar", "dbaeumer.vscode-eslint"]
|
||||||
|
}
|
||||||
65
ai-chat-web/.vscode/settings.json
vendored
Normal file
@@ -0,0 +1,65 @@
|
|||||||
|
{
|
||||||
|
"prettier.enable": false,
|
||||||
|
"editor.formatOnSave": false,
|
||||||
|
"editor.codeActionsOnSave": {
|
||||||
|
"source.fixAll.eslint": "explicit"
|
||||||
|
},
|
||||||
|
"eslint.validate": [
|
||||||
|
"javascript",
|
||||||
|
"javascriptreact",
|
||||||
|
"typescript",
|
||||||
|
"typescriptreact",
|
||||||
|
"vue",
|
||||||
|
"html",
|
||||||
|
"json",
|
||||||
|
"jsonc",
|
||||||
|
"json5",
|
||||||
|
"yaml",
|
||||||
|
"yml",
|
||||||
|
"markdown"
|
||||||
|
],
|
||||||
|
"cSpell.words": [
|
||||||
|
"antfu",
|
||||||
|
"axios",
|
||||||
|
"bumpp",
|
||||||
|
"chatgpt",
|
||||||
|
"chenzhaoyu",
|
||||||
|
"commitlint",
|
||||||
|
"davinci",
|
||||||
|
"dockerhub",
|
||||||
|
"esno",
|
||||||
|
"GPTAPI",
|
||||||
|
"highlightjs",
|
||||||
|
"hljs",
|
||||||
|
"iconify",
|
||||||
|
"katex",
|
||||||
|
"katexmath",
|
||||||
|
"linkify",
|
||||||
|
"logprobs",
|
||||||
|
"mdhljs",
|
||||||
|
"mila",
|
||||||
|
"nodata",
|
||||||
|
"OPENAI",
|
||||||
|
"pinia",
|
||||||
|
"Popconfirm",
|
||||||
|
"rushstack",
|
||||||
|
"Sider",
|
||||||
|
"tailwindcss",
|
||||||
|
"traptitech",
|
||||||
|
"tsup",
|
||||||
|
"Typecheck",
|
||||||
|
"unplugin",
|
||||||
|
"VITE",
|
||||||
|
"vueuse",
|
||||||
|
"Zhao"
|
||||||
|
],
|
||||||
|
"i18n-ally.enabledParsers": [
|
||||||
|
"ts"
|
||||||
|
],
|
||||||
|
"i18n-ally.sortKeys": true,
|
||||||
|
"i18n-ally.keepFulfilled": true,
|
||||||
|
"i18n-ally.localesPaths": [
|
||||||
|
"src/locales"
|
||||||
|
],
|
||||||
|
"i18n-ally.keystyle": "nested"
|
||||||
|
}
|
||||||
@@ -1,57 +1,3 @@
|
|||||||
## v2.11.0
|
|
||||||
|
|
||||||
`2023-04-26`
|
|
||||||
|
|
||||||
> [chatgpt-web-plus](https://github.com/Chanzhaoyu/chatgpt-web-plus) 新界面、完整用户管理
|
|
||||||
|
|
||||||
## Enhancement
|
|
||||||
- 更新默认 `accessToken` 反代地址为 [[pengzhile](https://github.com/pengzhile)] 的 `https://ai.fakeopen.com/api/conversation` [[24min](https://github.com/Chanzhaoyu/chatgpt-web/pull/1567/files)]
|
|
||||||
- 添加自定义 `temperature` 和 `top_p` [[quzard](https://github.com/Chanzhaoyu/chatgpt-web/pull/1260)]
|
|
||||||
- 优化代码 [[shunyue1320](https://github.com/Chanzhaoyu/chatgpt-web/pull/1328)]
|
|
||||||
- 优化复制代码反馈效果
|
|
||||||
|
|
||||||
## BugFix
|
|
||||||
- 修复余额查询和文案 [[luckywangxi](https://github.com/Chanzhaoyu/chatgpt-web/pull/1174)][[zuoning777](https://github.com/Chanzhaoyu/chatgpt-web/pull/1296)]
|
|
||||||
- 修复默认语言错误 [[idawnwon](https://github.com/Chanzhaoyu/chatgpt-web/pull/1352)]
|
|
||||||
- 修复 `onRegenerate` 下问题 [[leafsummer](https://github.com/Chanzhaoyu/chatgpt-web/pull/1188)]
|
|
||||||
|
|
||||||
## Other
|
|
||||||
- 引导用户触发提示词 [[RyanXinOne](https://github.com/Chanzhaoyu/chatgpt-web/pull/1183)]
|
|
||||||
- 添加韩语翻译 [[Kamilake](https://github.com/Chanzhaoyu/chatgpt-web/pull/1372)]
|
|
||||||
- 添加俄语翻译 [[aquaratixc](https://github.com/Chanzhaoyu/chatgpt-web/pull/1571)]
|
|
||||||
- 优化翻译和文本检查 [[PeterDaveHello](https://github.com/Chanzhaoyu/chatgpt-web/pull/1460)]
|
|
||||||
- 移除无用文件
|
|
||||||
|
|
||||||
## v2.10.9
|
|
||||||
|
|
||||||
`2023-04-03`
|
|
||||||
|
|
||||||
> 更新默认 `accessToken` 反代地址为 [[pengzhile](https://github.com/pengzhile)] 的 `https://ai.fakeopen.com/api/conversation`
|
|
||||||
|
|
||||||
## Enhancement
|
|
||||||
- 添加 `socks5` 代理认证 [[yimiaoxiehou](https://github.com/Chanzhaoyu/chatgpt-web/pull/999)]
|
|
||||||
- 添加 `socks` 代理用户名密码的配置 [[hank-cp](https://github.com/Chanzhaoyu/chatgpt-web/pull/890)]
|
|
||||||
- 添加可选日志打印 [[zcong1993](https://github.com/Chanzhaoyu/chatgpt-web/pull/1041)]
|
|
||||||
- 更新侧边栏按钮本地化[[simonwu53](https://github.com/Chanzhaoyu/chatgpt-web/pull/911)]
|
|
||||||
- 优化代码块滚动条高度 [[Fog3211](https://github.com/Chanzhaoyu/chatgpt-web/pull/1153)]
|
|
||||||
## BugFix
|
|
||||||
- 修复 `PWA` 问题 [[bingo235](https://github.com/Chanzhaoyu/chatgpt-web/pull/807)]
|
|
||||||
- 修复 `ESM` 错误 [[kidonng](https://github.com/Chanzhaoyu/chatgpt-web/pull/826)]
|
|
||||||
- 修复反向代理开启时限流失效的问题 [[gitgitgogogo](https://github.com/Chanzhaoyu/chatgpt-web/pull/863)]
|
|
||||||
- 修复 `docker` 构建时 `.env` 可能被忽略的问题 [[zaiMoe](https://github.com/Chanzhaoyu/chatgpt-web/pull/877)]
|
|
||||||
- 修复导出异常错误 [[KingTwinkle](https://github.com/Chanzhaoyu/chatgpt-web/pull/938)]
|
|
||||||
- 修复空值异常 [[vchenpeng](https://github.com/Chanzhaoyu/chatgpt-web/pull/1103)]
|
|
||||||
- 移动端上的体验问题
|
|
||||||
|
|
||||||
## Other
|
|
||||||
- `Docker` 容器名字名义 [[LOVECHEN](https://github.com/Chanzhaoyu/chatgpt-web/pull/1035)]
|
|
||||||
- `kubernetes` 部署配置 [[CaoYunzhou](https://github.com/Chanzhaoyu/chatgpt-web/pull/1001)]
|
|
||||||
- 感谢 [[assassinliujie](https://github.com/Chanzhaoyu/chatgpt-web/pull/962)] 和 [[puppywang](https://github.com/Chanzhaoyu/chatgpt-web/pull/1017)] 的某些贡献
|
|
||||||
- 更新 `kubernetes/deploy.yaml` [[idawnwon](https://github.com/Chanzhaoyu/chatgpt-web/pull/1085)]
|
|
||||||
- 文档更新 [[#yi-ge](https://github.com/Chanzhaoyu/chatgpt-web/pull/883)]
|
|
||||||
- 文档更新 [[weifeng12x](https://github.com/Chanzhaoyu/chatgpt-web/pull/880)]
|
|
||||||
- 依赖更新
|
|
||||||
|
|
||||||
## v2.10.8
|
## v2.10.8
|
||||||
|
|
||||||
`2023-03-23`
|
`2023-03-23`
|
||||||
@@ -125,7 +71,7 @@
|
|||||||
|
|
||||||
`2023-03-13`
|
`2023-03-13`
|
||||||
|
|
||||||
更新依赖,`access_token` 默认代理为 [pengzhile](https://github.com/pengzhile) 的 `https://bypass.duti.tech/api/conversation`
|
更新依赖,`access_token` 默认代理为 [acheong08](https://github.com/acheong08) 的 `https://bypass.duti.tech/api/conversation`
|
||||||
|
|
||||||
## Feature
|
## Feature
|
||||||
- `Prompt` 商店在线导入可以导入两种 `recommend.json`里提到的模板 [simonwu53](https://github.com/Chanzhaoyu/chatgpt-web/pull/521)
|
- `Prompt` 商店在线导入可以导入两种 `recommend.json`里提到的模板 [simonwu53](https://github.com/Chanzhaoyu/chatgpt-web/pull/521)
|
||||||
12
ai-chat-web/Dockerfile
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
FROM quay.io/0voice/node:lts-alpine AS frontend
|
||||||
|
RUN npm install pnpm -g
|
||||||
|
COPY . /app
|
||||||
|
WORKDIR /app
|
||||||
|
RUN pnpm bootstrap
|
||||||
|
RUN pnpm run build-only
|
||||||
|
|
||||||
|
FROM quay.io/0voice/nginx:1.25.4 AS web
|
||||||
|
COPY ./docker/nginx/default.conf /etc/nginx/conf.d/default.conf
|
||||||
|
COPY --from=frontend /app/dist/ /usr/share/nginx/html/
|
||||||
|
ENTRYPOINT ["/docker-entrypoint.sh"]
|
||||||
|
CMD ["nginx", "-g", "daemon off;"]
|
||||||
64
ai-chat-web/README_0voice.md
Normal file
@@ -0,0 +1,64 @@
|
|||||||
|
# ai-chat-web
|
||||||
|
|
||||||
|
## node 安装
|
||||||
|
### windows
|
||||||
|
1. 上[官网](https://nodejs.org/en)下载18.16.0 LTS版本
|
||||||
|
2. 查看node 是否安装成功
|
||||||
|
```
|
||||||
|
node -v
|
||||||
|
npm -v
|
||||||
|
```
|
||||||
|
3. 安装pnpm
|
||||||
|
```
|
||||||
|
npm install pnpm -g
|
||||||
|
```
|
||||||
|
|
||||||
|
### ubuntu
|
||||||
|
1. 设置 apt 源,设置后可查看/etc/apt/sources.list.d/nodesource.list 文件
|
||||||
|
```
|
||||||
|
curl -sL https://deb.nodesource.com/setup_18.x | sudo -E bash -
|
||||||
|
```
|
||||||
|
2. 安装nodejs
|
||||||
|
```
|
||||||
|
sudo apt-get install -y nodejs
|
||||||
|
```
|
||||||
|
3. 验证
|
||||||
|
```
|
||||||
|
node -v
|
||||||
|
npm -v
|
||||||
|
```
|
||||||
|
4. 安装pnpm
|
||||||
|
```
|
||||||
|
sudo npm install pnpm -g
|
||||||
|
```
|
||||||
|
|
||||||
|
## 编译运行
|
||||||
|
1. 依赖安装
|
||||||
|
```
|
||||||
|
pnpm bootstrap
|
||||||
|
```
|
||||||
|
2. 本地运行
|
||||||
|
```
|
||||||
|
pnpm dev
|
||||||
|
```
|
||||||
|
3. 打包发布版本
|
||||||
|
```
|
||||||
|
pnpm build-only
|
||||||
|
```
|
||||||
|
|
||||||
|
## 提交代码的规则
|
||||||
|
```
|
||||||
|
* commitlint 规则是指在提交代码时要遵循的规范,常见的 commitlint 规则如下:
|
||||||
|
|
||||||
|
* type:用于说明 commit 的类型,例如 feat(新功能)、fix(修复 bug)、docs(文档更新)、style(样式修改)、refactor(重构代码)等。
|
||||||
|
|
||||||
|
* scope:用于说明 commit 影响的范围,例如组件、模块、页面等。
|
||||||
|
|
||||||
|
* subject:用于简短地描述 commit 的内容,建议不超过 50 个字符。
|
||||||
|
|
||||||
|
* body:用于详细描述 commit 的改动内容,可以分成多行。
|
||||||
|
|
||||||
|
* footer:用于关闭 issue 或者添加相关链接等信息。
|
||||||
|
|
||||||
|
* 长度限制:commit message 不应该过长,一般不超过 72 个字符。
|
||||||
|
```
|
||||||
3
ai-chat-web/ai-chat-web/.commitlintrc.json
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
{
|
||||||
|
"extends": ["@commitlint/config-conventional"]
|
||||||
|
}
|
||||||
8
ai-chat-web/ai-chat-web/.dockerignore
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
**/node_modules
|
||||||
|
*/node_modules
|
||||||
|
node_modules
|
||||||
|
Dockerfile
|
||||||
|
.*
|
||||||
|
*/.*
|
||||||
|
!.env
|
||||||
|
!.env.production
|
||||||
11
ai-chat-web/ai-chat-web/.editorconfig
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
# Editor configuration, see http://editorconfig.org
|
||||||
|
|
||||||
|
root = true
|
||||||
|
|
||||||
|
[*]
|
||||||
|
charset = utf-8
|
||||||
|
indent_style = tab
|
||||||
|
indent_size = 2
|
||||||
|
end_of_line = lf
|
||||||
|
trim_trailing_whitespace = true
|
||||||
|
insert_final_newline = true
|
||||||
12
ai-chat-web/ai-chat-web/.env.develop
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
# Glob API URL
|
||||||
|
VITE_GLOB_API_URL=/api
|
||||||
|
|
||||||
|
VITE_APP_API_BASE_URL=http://localhost:7080/
|
||||||
|
|
||||||
|
# Whether long replies are supported, which may result in higher API fees
|
||||||
|
VITE_GLOB_OPEN_LONG_REPLY=false
|
||||||
|
|
||||||
|
# When you want to use PWA
|
||||||
|
VITE_GLOB_APP_PWA=false
|
||||||
|
|
||||||
|
VITE_USER_CENTER="http://localhost:8082?sys=ai"
|
||||||
8
ai-chat-web/ai-chat-web/.env.production
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
VITE_GLOB_API_URL=/api
|
||||||
|
# Whether long replies are supported, which may result in higher API fees
|
||||||
|
VITE_GLOB_OPEN_LONG_REPLY=false
|
||||||
|
|
||||||
|
# When you want to use PWA
|
||||||
|
VITE_GLOB_APP_PWA=false
|
||||||
|
|
||||||
|
VITE_USER_CENTER="https://user.0voice.com?sys=ai"
|
||||||
4
ai-chat-web/ai-chat-web/.eslintrc.cjs
Normal file
@@ -0,0 +1,4 @@
|
|||||||
|
module.exports = {
|
||||||
|
root: true,
|
||||||
|
extends: ['@antfu'],
|
||||||
|
}
|
||||||
17
ai-chat-web/ai-chat-web/.gitattributes
vendored
Normal file
@@ -0,0 +1,17 @@
|
|||||||
|
"*.vue" eol=lf
|
||||||
|
"*.js" eol=lf
|
||||||
|
"*.ts" eol=lf
|
||||||
|
"*.jsx" eol=lf
|
||||||
|
"*.tsx" eol=lf
|
||||||
|
"*.cjs" eol=lf
|
||||||
|
"*.cts" eol=lf
|
||||||
|
"*.mjs" eol=lf
|
||||||
|
"*.mts" eol=lf
|
||||||
|
"*.json" eol=lf
|
||||||
|
"*.html" eol=lf
|
||||||
|
"*.css" eol=lf
|
||||||
|
"*.less" eol=lf
|
||||||
|
"*.scss" eol=lf
|
||||||
|
"*.sass" eol=lf
|
||||||
|
"*.styl" eol=lf
|
||||||
|
"*.md" eol=lf
|
||||||
41
ai-chat-web/ai-chat-web/.github/workflows/build_docker.yml
vendored
Normal file
@@ -0,0 +1,41 @@
|
|||||||
|
name: build_docker
|
||||||
|
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
branches: [main]
|
||||||
|
release:
|
||||||
|
types: [created] # 表示在创建新的 Release 时触发
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
build_docker:
|
||||||
|
name: Build docker
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- name: Checkout
|
||||||
|
uses: actions/checkout@v3
|
||||||
|
|
||||||
|
- run: |
|
||||||
|
echo "本次构建的版本为:${GITHUB_REF_NAME} (但是这个变量目前上下文中无法获取到)"
|
||||||
|
echo 本次构建的版本为:${{ github.ref_name }}
|
||||||
|
env
|
||||||
|
|
||||||
|
- name: Set up QEMU
|
||||||
|
uses: docker/setup-qemu-action@v2
|
||||||
|
- name: Set up Docker Buildx
|
||||||
|
uses: docker/setup-buildx-action@v2
|
||||||
|
- name: Login to DockerHub
|
||||||
|
uses: docker/login-action@v2
|
||||||
|
with:
|
||||||
|
username: ${{ secrets.DOCKERHUB_USERNAME }}
|
||||||
|
password: ${{ secrets.DOCKERHUB_TOKEN }}
|
||||||
|
- name: Build and push
|
||||||
|
id: docker_build
|
||||||
|
uses: docker/build-push-action@v4
|
||||||
|
with:
|
||||||
|
context: .
|
||||||
|
push: true
|
||||||
|
labels: ${{ steps.meta.outputs.labels }}
|
||||||
|
platforms: linux/amd64,linux/arm64
|
||||||
|
tags: |
|
||||||
|
${{ secrets.DOCKERHUB_USERNAME }}/chatgpt-web:${{ github.ref_name }}
|
||||||
|
${{ secrets.DOCKERHUB_USERNAME }}/chatgpt-web:latest
|
||||||
47
ai-chat-web/ai-chat-web/.github/workflows/ci.yml
vendored
Normal file
@@ -0,0 +1,47 @@
|
|||||||
|
name: CI
|
||||||
|
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
branches:
|
||||||
|
- main
|
||||||
|
|
||||||
|
pull_request:
|
||||||
|
branches:
|
||||||
|
- main
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
lint:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v3
|
||||||
|
- name: Set node
|
||||||
|
uses: actions/setup-node@v3
|
||||||
|
with:
|
||||||
|
node-version: 18.x
|
||||||
|
|
||||||
|
- name: Setup
|
||||||
|
run: npm i -g @antfu/ni
|
||||||
|
|
||||||
|
- name: Install
|
||||||
|
run: nci
|
||||||
|
|
||||||
|
- name: Lint
|
||||||
|
run: nr lint:fix
|
||||||
|
|
||||||
|
typecheck:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v3
|
||||||
|
- name: Set node
|
||||||
|
uses: actions/setup-node@v3
|
||||||
|
with:
|
||||||
|
node-version: 18.x
|
||||||
|
|
||||||
|
- name: Setup
|
||||||
|
run: npm i -g @antfu/ni
|
||||||
|
|
||||||
|
- name: Install
|
||||||
|
run: nci
|
||||||
|
|
||||||
|
- name: Typecheck
|
||||||
|
run: nr type-check
|
||||||
@@ -28,4 +28,5 @@ coverage
|
|||||||
*.sln
|
*.sln
|
||||||
*.sw?
|
*.sw?
|
||||||
|
|
||||||
build
|
# Environment variables files
|
||||||
|
/service/.env
|
||||||
59
ai-chat-web/ai-chat-web/.gitlab-ci.yml
Normal file
@@ -0,0 +1,59 @@
|
|||||||
|
variables:
|
||||||
|
DEPLOY_ENV: ''
|
||||||
|
DEPLOY_IMG: ''
|
||||||
|
REPO: 'chatgpt-frontend'
|
||||||
|
SERVICE_NAME: 'chatgpt-stack_chatgpt-frontend'
|
||||||
|
|
||||||
|
workflow:
|
||||||
|
rules:
|
||||||
|
- if: $CI_COMMIT_BRANCH == "dev" && $CI_PIPELINE_SOURCE == "push"
|
||||||
|
variables:
|
||||||
|
DEPLOY_ENV: 'dev'
|
||||||
|
DEPLOY_IMG: "${REPO}:${CI_COMMIT_SHORT_SHA}"
|
||||||
|
- if: $CI_COMMIT_TAG
|
||||||
|
variables:
|
||||||
|
DEPLOY_ENV: 'prod'
|
||||||
|
DEPLOY_IMG: "${REPO}:${CI_COMMIT_TAG}"
|
||||||
|
- when: never
|
||||||
|
stages:
|
||||||
|
# 编译阶段
|
||||||
|
- build
|
||||||
|
# 部署阶段(部署到测试环境/部署到生产环境)
|
||||||
|
- deploy
|
||||||
|
build-job:
|
||||||
|
stage: build
|
||||||
|
tags:
|
||||||
|
- builder
|
||||||
|
before_script:
|
||||||
|
- docker login -u ${DOCKER_REGISTRY_USER} -p ${DOCKER_REGISTRY_PWD} ${DOCKER_REGISTRY}
|
||||||
|
script:
|
||||||
|
- docker build -t ${DOCKER_REGISTRY}/${DEPLOY_IMG} .
|
||||||
|
- docker push ${DOCKER_REGISTRY}/${DEPLOY_IMG}
|
||||||
|
|
||||||
|
deploy-dev-job:
|
||||||
|
only:
|
||||||
|
variables:
|
||||||
|
- $DEPLOY_ENV == "dev"
|
||||||
|
stage: deploy
|
||||||
|
tags:
|
||||||
|
- deployer
|
||||||
|
variables:
|
||||||
|
CONF_RM_STR: ""
|
||||||
|
before_script:
|
||||||
|
- docker login -u ${DOCKER_REGISTRY_USER} -p ${DOCKER_REGISTRY_PWD} ${DOCKER_REGISTRY}
|
||||||
|
script:
|
||||||
|
- docker service update ${SERVICE_NAME} --image ${DOCKER_REGISTRY}/${DEPLOY_IMG}
|
||||||
|
|
||||||
|
deploy-prod-job:
|
||||||
|
only:
|
||||||
|
variables:
|
||||||
|
- $DEPLOY_ENV == "prod"
|
||||||
|
stage: deploy
|
||||||
|
tags:
|
||||||
|
- deployer
|
||||||
|
variables:
|
||||||
|
CONF_RM_STR: ""
|
||||||
|
before_script:
|
||||||
|
- docker login -u ${DOCKER_REGISTRY_USER} -p ${DOCKER_REGISTRY_PWD} ${DOCKER_REGISTRY}
|
||||||
|
script:
|
||||||
|
- docker service update ${SERVICE_NAME} --image ${DOCKER_REGISTRY}/${DEPLOY_IMG}
|
||||||
4
ai-chat-web/ai-chat-web/.husky/commit-msg
Normal file
@@ -0,0 +1,4 @@
|
|||||||
|
#!/usr/bin/env sh
|
||||||
|
. "$(dirname -- "$0")/_/husky.sh"
|
||||||
|
|
||||||
|
npx --no -- commitlint --edit
|
||||||
4
ai-chat-web/ai-chat-web/.husky/pre-commit
Normal file
@@ -0,0 +1,4 @@
|
|||||||
|
#!/usr/bin/env sh
|
||||||
|
. "$(dirname -- "$0")/_/husky.sh"
|
||||||
|
|
||||||
|
npx lint-staged
|
||||||
1
ai-chat-web/ai-chat-web/.npmrc
Normal file
@@ -0,0 +1 @@
|
|||||||
|
strict-peer-dependencies=false
|
||||||
3
ai-chat-web/ai-chat-web/.vscode/extensions.json
vendored
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
{
|
||||||
|
"recommendations": ["Vue.volar", "dbaeumer.vscode-eslint"]
|
||||||
|
}
|
||||||
65
ai-chat-web/ai-chat-web/.vscode/settings.json
vendored
Normal file
@@ -0,0 +1,65 @@
|
|||||||
|
{
|
||||||
|
"prettier.enable": false,
|
||||||
|
"editor.formatOnSave": false,
|
||||||
|
"editor.codeActionsOnSave": {
|
||||||
|
"source.fixAll.eslint": "explicit"
|
||||||
|
},
|
||||||
|
"eslint.validate": [
|
||||||
|
"javascript",
|
||||||
|
"javascriptreact",
|
||||||
|
"typescript",
|
||||||
|
"typescriptreact",
|
||||||
|
"vue",
|
||||||
|
"html",
|
||||||
|
"json",
|
||||||
|
"jsonc",
|
||||||
|
"json5",
|
||||||
|
"yaml",
|
||||||
|
"yml",
|
||||||
|
"markdown"
|
||||||
|
],
|
||||||
|
"cSpell.words": [
|
||||||
|
"antfu",
|
||||||
|
"axios",
|
||||||
|
"bumpp",
|
||||||
|
"chatgpt",
|
||||||
|
"chenzhaoyu",
|
||||||
|
"commitlint",
|
||||||
|
"davinci",
|
||||||
|
"dockerhub",
|
||||||
|
"esno",
|
||||||
|
"GPTAPI",
|
||||||
|
"highlightjs",
|
||||||
|
"hljs",
|
||||||
|
"iconify",
|
||||||
|
"katex",
|
||||||
|
"katexmath",
|
||||||
|
"linkify",
|
||||||
|
"logprobs",
|
||||||
|
"mdhljs",
|
||||||
|
"mila",
|
||||||
|
"nodata",
|
||||||
|
"OPENAI",
|
||||||
|
"pinia",
|
||||||
|
"Popconfirm",
|
||||||
|
"rushstack",
|
||||||
|
"Sider",
|
||||||
|
"tailwindcss",
|
||||||
|
"traptitech",
|
||||||
|
"tsup",
|
||||||
|
"Typecheck",
|
||||||
|
"unplugin",
|
||||||
|
"VITE",
|
||||||
|
"vueuse",
|
||||||
|
"Zhao"
|
||||||
|
],
|
||||||
|
"i18n-ally.enabledParsers": [
|
||||||
|
"ts"
|
||||||
|
],
|
||||||
|
"i18n-ally.sortKeys": true,
|
||||||
|
"i18n-ally.keepFulfilled": true,
|
||||||
|
"i18n-ally.localesPaths": [
|
||||||
|
"src/locales"
|
||||||
|
],
|
||||||
|
"i18n-ally.keystyle": "nested"
|
||||||
|
}
|
||||||
548
ai-chat-web/ai-chat-web/CHANGELOG.md
Normal file
@@ -0,0 +1,548 @@
|
|||||||
|
## v2.10.8
|
||||||
|
|
||||||
|
`2023-03-23`
|
||||||
|
|
||||||
|
如遇问题,请删除 `node_modules` 重新安装依赖。
|
||||||
|
|
||||||
|
## Feature
|
||||||
|
- 显示回复消息原文的选项 [[yilozt](https://github.com/Chanzhaoyu/chatgpt-web/pull/672)]
|
||||||
|
- 添加单 `IP` 每小时请求限制。环境变量: `MAX_REQUEST_PER_HOUR` [[zhuxindong ](https://github.com/Chanzhaoyu/chatgpt-web/pull/718)]
|
||||||
|
- 前端添加角色设定,仅 `API` 方式可见 [[quzard](https://github.com/Chanzhaoyu/chatgpt-web/pull/768)]
|
||||||
|
- `OPENAI_API_MODEL` 变量现在对 `ChatGPTUnofficialProxyAPI` 也生效,注意:`Token` 和 `API` 的模型命名不一致,不能直接填入 `gpt-3.5` 或者 `gpt-4` [[hncboy](https://github.com/Chanzhaoyu/chatgpt-web/pull/632)]
|
||||||
|
- 添加繁体中文 `Prompts` [[PeterDaveHello](https://github.com/Chanzhaoyu/chatgpt-web/pull/796)]
|
||||||
|
|
||||||
|
## Enhancement
|
||||||
|
- 重置回答时滚动定位至该回答 [[shunyue1320](https://github.com/Chanzhaoyu/chatgpt-web/pull/781)]
|
||||||
|
- 当 `API` 是 `gpt-4` 时增加可用的 `Max Tokens` [[simonwu53](https://github.com/Chanzhaoyu/chatgpt-web/pull/729)]
|
||||||
|
- 判断和忽略回复字符 [[liut](https://github.com/Chanzhaoyu/chatgpt-web/pull/474)]
|
||||||
|
- 切换会话时,自动聚焦输入框 [[JS-an](https://github.com/Chanzhaoyu/chatgpt-web/pull/735)]
|
||||||
|
- 渲染的链接新窗口打开
|
||||||
|
- 查询余额可选 `API_BASE_URL` 代理地址
|
||||||
|
- `config` 接口添加验证防止被无限制调用
|
||||||
|
- `PWA` 默认不开启,现在需手动修改 `.env` 文件 `VITE_GLOB_APP_PWA` 变量
|
||||||
|
- 当网络连接时,刷新页面,`500` 错误页自动跳转到主页
|
||||||
|
|
||||||
|
## BugFix
|
||||||
|
- `scrollToBottom` 调回 `scrollToBottomIfAtBottom` [[shunyue1320](https://github.com/Chanzhaoyu/chatgpt-web/pull/771)]
|
||||||
|
- 重置异常的 `loading` 会话
|
||||||
|
|
||||||
|
## Common
|
||||||
|
- 创建 `start.cmd` 在 `windows` 下也可以运行 [vulgatecnn](https://github.com/Chanzhaoyu/chatgpt-web/pull/656)]
|
||||||
|
- 添加 `visual-studio-code` 中调试配置 [[ChandlerVer5](https://github.com/Chanzhaoyu/chatgpt-web/pull/296)]
|
||||||
|
- 修复文档中 `docker` 端口为本地 [[kilvn](https://github.com/Chanzhaoyu/chatgpt-web/pull/802)]
|
||||||
|
## Other
|
||||||
|
- 依赖更新
|
||||||
|
|
||||||
|
|
||||||
|
## v2.10.7
|
||||||
|
|
||||||
|
`2023-03-17`
|
||||||
|
|
||||||
|
## BugFix
|
||||||
|
- 回退 `chatgpt` 版本,原因:导致 `OPENAI_API_BASE_URL` 代理失效
|
||||||
|
- 修复缺省状态的 `usingContext` 默认值
|
||||||
|
|
||||||
|
## v2.10.6
|
||||||
|
|
||||||
|
`2023-03-17`
|
||||||
|
|
||||||
|
## Feature
|
||||||
|
- 显示 `API` 余额 [[pzcn](https://github.com/Chanzhaoyu/chatgpt-web/pull/582)]
|
||||||
|
|
||||||
|
## Enhancement
|
||||||
|
- 美化滚动条样式和 `UI` 保持一致 [[haydenull](https://github.com/Chanzhaoyu/chatgpt-web/pull/617)]
|
||||||
|
- 优化移动端 `Prompt` 样式 [[CornerSkyless](https://github.com/Chanzhaoyu/chatgpt-web/pull/608)]
|
||||||
|
- 上下文开关改为全局开关,现在记录在本地缓存中
|
||||||
|
- 配置信息按接口类型显示
|
||||||
|
|
||||||
|
## Perf
|
||||||
|
- 优化函数方法 [[kirklin](https://github.com/Chanzhaoyu/chatgpt-web/pull/583)]
|
||||||
|
- 字符错误 [[pdsuwwz](https://github.com/Chanzhaoyu/chatgpt-web/pull/585)]
|
||||||
|
- 文档描述错误 [[lizhongyuan3](https://github.com/Chanzhaoyu/chatgpt-web/pull/636)]
|
||||||
|
|
||||||
|
## BugFix
|
||||||
|
- 修复 `Prompt` 导入、导出兼容性错误
|
||||||
|
- 修复 `highlight.js` 控制台兼容性警告
|
||||||
|
|
||||||
|
## Other
|
||||||
|
- 依赖更新
|
||||||
|
|
||||||
|
## v2.10.5
|
||||||
|
|
||||||
|
`2023-03-13`
|
||||||
|
|
||||||
|
更新依赖,`access_token` 默认代理为 [acheong08](https://github.com/acheong08) 的 `https://bypass.duti.tech/api/conversation`
|
||||||
|
|
||||||
|
## Feature
|
||||||
|
- `Prompt` 商店在线导入可以导入两种 `recommend.json`里提到的模板 [simonwu53](https://github.com/Chanzhaoyu/chatgpt-web/pull/521)
|
||||||
|
- 支持 `HTTPS_PROXY` [whatwewant](https://github.com/Chanzhaoyu/chatgpt-web/pull/308)
|
||||||
|
- `Prompt` 添加查询筛选
|
||||||
|
|
||||||
|
## Enhancement
|
||||||
|
- 调整输入框最大行数 [yi-ge](https://github.com/Chanzhaoyu/chatgpt-web/pull/502)
|
||||||
|
- 优化 `docker` 打包 [whatwewant](https://github.com/Chanzhaoyu/chatgpt-web/pull/520)
|
||||||
|
- `Prompt` 添加翻译和优化布局
|
||||||
|
- 「繁体中文」补全和审阅 [PeterDaveHello](https://github.com/Chanzhaoyu/chatgpt-web/pull/542)
|
||||||
|
- 语言选择调整为下路框形式
|
||||||
|
- 权限输入框类型调整为密码形式
|
||||||
|
|
||||||
|
## BugFix
|
||||||
|
- `JSON` 导入检查 [Nothing1024](https://github.com/Chanzhaoyu/chatgpt-web/pull/523)
|
||||||
|
- 修复 `AUTH_SECRET_KEY` 模式下跨域异常并添加对 `node.js 19` 版本的支持 [yi-ge](https://github.com/Chanzhaoyu/chatgpt-web/pull/499)
|
||||||
|
- 确定清空上下文时不应该重置会话标题
|
||||||
|
|
||||||
|
## Other
|
||||||
|
- 调整文档
|
||||||
|
- 更新依赖
|
||||||
|
|
||||||
|
## v2.10.4
|
||||||
|
|
||||||
|
`2023-03-11`
|
||||||
|
|
||||||
|
## Feature
|
||||||
|
- 感谢 [Nothing1024](https://github.com/Chanzhaoyu/chatgpt-web/pull/268) 添加 `Prompt` 模板和 `Prompt` 商店支持
|
||||||
|
|
||||||
|
## Enhancement
|
||||||
|
- 设置添加关闭按钮[#495]
|
||||||
|
|
||||||
|
## Demo
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
## v2.10.3
|
||||||
|
|
||||||
|
`2023-03-10`
|
||||||
|
|
||||||
|
> 声明:除 `ChatGPTUnofficialProxyAPI` 使用的非官方代理外,本项目代码包括上游引用包均开源在 `GitHub`,如果你觉得本项目有监控后门或有问题导致你的账号、API被封,那我很抱歉。我可能`BUG`写的多,但我不缺德。此次主要为前端界面调整,周末愉快。
|
||||||
|
|
||||||
|
## Feature
|
||||||
|
- 支持长回复 [[yi-ge](https://github.com/Chanzhaoyu/chatgpt-web/pull/450)][[详情](https://github.com/Chanzhaoyu/chatgpt-web/pull/450)]
|
||||||
|
- 支持 `PWA` [[chenxch](https://github.com/Chanzhaoyu/chatgpt-web/pull/452)]
|
||||||
|
|
||||||
|
## Enhancement
|
||||||
|
- 调整移动端按钮和优化布局
|
||||||
|
- 调整 `iOS` 上安全距离
|
||||||
|
- 简化 `docker-compose` 部署 [[cloudGrin](https://github.com/Chanzhaoyu/chatgpt-web/pull/466)]
|
||||||
|
|
||||||
|
## BugFix
|
||||||
|
- 修复清空会话侧边栏标题不会重置的问题 [[RyanXinOne](https://github.com/Chanzhaoyu/chatgpt-web/pull/453)]
|
||||||
|
- 修复设置文字过长时导致的设置按钮消失的问题
|
||||||
|
|
||||||
|
## Other
|
||||||
|
- 更新依赖
|
||||||
|
|
||||||
|
## v2.10.2
|
||||||
|
|
||||||
|
`2023-03-09`
|
||||||
|
|
||||||
|
衔接 `2.10.1` 版本[详情](https://github.com/Chanzhaoyu/chatgpt-web/releases/tag/v2.10.1)
|
||||||
|
|
||||||
|
## Enhancement
|
||||||
|
- 移动端下输入框获得焦点时左侧按钮隐藏
|
||||||
|
|
||||||
|
## BugFix
|
||||||
|
- 修复 `2.10.1` 中添加 `OPENAI_API_MODEL` 变量的判断错误,会导致默认模型指定失效,抱歉
|
||||||
|
- 回退 `2.10.1` 中前端变量影响 `Docker` 打包
|
||||||
|
|
||||||
|
## v2.10.1
|
||||||
|
|
||||||
|
`2023-03-09`
|
||||||
|
|
||||||
|
注意:删除了 `.env` 文件改用 `.env.example` 代替,如果是手动部署的同学现在需要手动创建 `.env` 文件并从 `.env.example` 中复制需要的变量,并且 `.env` 文件现在会在 `Git` 提交中被忽略,原因如下:
|
||||||
|
|
||||||
|
- 在项目中添加 `.env` 从一开始就是个错误的示范
|
||||||
|
- 如果是 `Fork` 项目进行修改测试总是会被 `Git` 修改提示给打扰
|
||||||
|
- 感谢 [yi-ge](https://github.com/Chanzhaoyu/chatgpt-web/pull/395) 的提醒和修改
|
||||||
|
|
||||||
|
|
||||||
|
这两天开始,官方已经开始对第三方代理进行了拉闸, `accessToken` 即将或已经开始可能会不可使用。异常 `API` 使用也开始封号,封号缘由不明,如果出现使用 `API` 提示错误,请查看后端控制台信息,或留意邮箱。
|
||||||
|
|
||||||
|
## Feature
|
||||||
|
- 感谢 [CornerSkyless](https://github.com/Chanzhaoyu/chatgpt-web/pull/393) 添加是否发送上下文开关功能
|
||||||
|
|
||||||
|
## Enhancement
|
||||||
|
- 感谢 [nagaame](https://github.com/Chanzhaoyu/chatgpt-web/pull/415) 优化`docker`打包镜像文件过大的问题
|
||||||
|
- 感谢 [xieccc](https://github.com/Chanzhaoyu/chatgpt-web/pull/404) 新增 `API` 模型配置变量 `OPENAI_API_MODEL`
|
||||||
|
- 感谢 [acongee](https://github.com/Chanzhaoyu/chatgpt-web/pull/394) 优化输出时滚动条问题
|
||||||
|
|
||||||
|
## BugFix
|
||||||
|
- 感谢 [CornerSkyless](https://github.com/Chanzhaoyu/chatgpt-web/pull/392) 修复导出图片会丢失头像的问题
|
||||||
|
- 修复深色模式导出图片的样式问题
|
||||||
|
|
||||||
|
|
||||||
|
## v2.10.0
|
||||||
|
|
||||||
|
`2023-03-07`
|
||||||
|
|
||||||
|
- 老规矩,手动部署的同学需要删除 `node_modules` 安装包重新安装降低出错概率,其他部署不受影响,但是可能会有缓存问题。
|
||||||
|
- 虽然说了更新放缓,但是 `issues` 不看, `PR` 不改我睡不着,我的邮箱从每天早上`8`点到凌晨`12`永远在滴滴滴,所以求求各位,超时的`issues`自己关闭下哈,我真的需要缓冲一下。
|
||||||
|
- 演示图片请看最后
|
||||||
|
|
||||||
|
## Feature
|
||||||
|
- 添加权限功能,用法:`service/.env` 中的 `AUTH_SECRET_KEY` 变量添加密码
|
||||||
|
- 感谢 [PeterDaveHello](https://github.com/Chanzhaoyu/chatgpt-web/pull/348) 添加「繁体中文」翻译
|
||||||
|
- 感谢 [GermMC](https://github.com/Chanzhaoyu/chatgpt-web/pull/369) 添加聊天记录导入、导出、清空的功能
|
||||||
|
- 感谢 [CornerSkyless](https://github.com/Chanzhaoyu/chatgpt-web/pull/374) 添加会话保存为本地图片的功能
|
||||||
|
|
||||||
|
|
||||||
|
## Enhancement
|
||||||
|
- 感谢 [CornerSkyless](https://github.com/Chanzhaoyu/chatgpt-web/pull/363) 添加 `ctrl+enter` 发送消息
|
||||||
|
- 现在新消息只有在结束了之后才滚动到底部,而不是之前的强制性
|
||||||
|
- 优化部分代码
|
||||||
|
|
||||||
|
## BugFix
|
||||||
|
- 转义状态码前端显示,防止直接暴露 `key`(我可能需要更多的状态码补充)
|
||||||
|
|
||||||
|
## Other
|
||||||
|
- 更新依赖到最新
|
||||||
|
|
||||||
|
## 演示
|
||||||
|
> 不是界面最新效果,有美化改动
|
||||||
|
|
||||||
|
权限
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
聊天记录导出
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
保存图片到本地
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
## v2.9.3
|
||||||
|
|
||||||
|
`2023-03-06`
|
||||||
|
|
||||||
|
## Enhancement
|
||||||
|
- 感谢 [ChandlerVer5](https://github.com/Chanzhaoyu/chatgpt-web/pull/305) 使用 `markdown-it` 替换 `marked`,解决代码块闪烁的问题
|
||||||
|
- 感谢 [shansing](https://github.com/Chanzhaoyu/chatgpt-web/pull/277) 改善文档
|
||||||
|
- 感谢 [nalf3in](https://github.com/Chanzhaoyu/chatgpt-web/pull/293) 添加英文翻译
|
||||||
|
|
||||||
|
## BugFix
|
||||||
|
- 感谢[sepcnt ](https://github.com/Chanzhaoyu/chatgpt-web/pull/279) 修复切换记录时编辑状态未关闭的问题
|
||||||
|
- 修复复制代码的兼容性报错问题
|
||||||
|
- 修复部分优化小问题
|
||||||
|
|
||||||
|
## v2.9.2
|
||||||
|
|
||||||
|
`2023-03-04`
|
||||||
|
|
||||||
|
手动部署的同学,务必删除根目录和`service`中的`node_modules`重新安装依赖,降低出现问题的概率,自动部署的不需要做改动。
|
||||||
|
|
||||||
|
### Feature
|
||||||
|
- 感谢 [hyln9](https://github.com/Chanzhaoyu/chatgpt-web/pull/247) 添加对渲染 `LaTex` 数学公式的支持
|
||||||
|
- 感谢 [ottocsb](https://github.com/Chanzhaoyu/chatgpt-web/pull/227) 添加支持 `webAPP` (苹果添加到主页书签访问)支持
|
||||||
|
- 添加 `OPENAI_API_BASE_URL` 可选环境变量[#249]
|
||||||
|
## Enhancement
|
||||||
|
- 优化在高分屏上主题内容的最大宽度[#257]
|
||||||
|
- 现在文字按单词截断[#215][#225]
|
||||||
|
### BugFix
|
||||||
|
- 修复动态生成时代码块不能被复制的问题[#251][#260]
|
||||||
|
- 修复 `iOS` 移动端输入框不会被键盘顶起的问题[#256]
|
||||||
|
- 修复控制台渲染警告
|
||||||
|
## Other
|
||||||
|
- 更新依赖至最新
|
||||||
|
- 修改 `README` 内容
|
||||||
|
|
||||||
|
## v2.9.1
|
||||||
|
|
||||||
|
`2023-03-02`
|
||||||
|
|
||||||
|
### Feature
|
||||||
|
- 代码块添加当前代码语言显示和复制功能[#197][#196]
|
||||||
|
- 完善多语言,现在可以切换中英文显示
|
||||||
|
|
||||||
|
## Enhancement
|
||||||
|
- 由[Zo3i](https://github.com/Chanzhaoyu/chatgpt-web/pull/187) 完善 `docker-compose` 部署文档
|
||||||
|
|
||||||
|
### BugFix
|
||||||
|
- 由 [ottocsb](https://github.com/Chanzhaoyu/chatgpt-web/pull/200) 修复头像修改不同步的问题
|
||||||
|
## Other
|
||||||
|
- 更新依赖至最新
|
||||||
|
- 修改 `README` 内容
|
||||||
|
## v2.9.0
|
||||||
|
|
||||||
|
`2023-03-02`
|
||||||
|
|
||||||
|
### Feature
|
||||||
|
- 现在能复制带格式的消息文本
|
||||||
|
- 新设计的设定页面,可以自定义姓名、描述、头像(链接方式)
|
||||||
|
- 新增`403`和`404`页面以便扩展
|
||||||
|
|
||||||
|
## Enhancement
|
||||||
|
- 更新 `chatgpt` 使 `ChatGPTAPI` 支持 `gpt-3.5-turbo-0301`(默认)
|
||||||
|
- 取消了前端超时限制设定
|
||||||
|
|
||||||
|
## v2.8.3
|
||||||
|
|
||||||
|
`2023-03-01`
|
||||||
|
|
||||||
|
### Feature
|
||||||
|
- 消息已输出内容不会因为中断而消失[#167]
|
||||||
|
- 添加复制消息按钮[#133]
|
||||||
|
|
||||||
|
### Other
|
||||||
|
- `README` 添加声明内容
|
||||||
|
|
||||||
|
## v2.8.2
|
||||||
|
|
||||||
|
`2023-02-28`
|
||||||
|
### Enhancement
|
||||||
|
- 代码主题调整为 `One Dark - light|dark` 适配深色模式
|
||||||
|
### BugFix
|
||||||
|
- 修复普通文本代码渲染和深色模式下的问题[#139][#154]
|
||||||
|
|
||||||
|
## v2.8.1
|
||||||
|
|
||||||
|
`2023-02-27`
|
||||||
|
|
||||||
|
### BugFix
|
||||||
|
- 修复 `API` 版本不是 `Markdown` 时,普通 `HTML` 代码会被渲染的问题 [#146]
|
||||||
|
|
||||||
|
## v2.8.0
|
||||||
|
|
||||||
|
`2023-02-27`
|
||||||
|
|
||||||
|
- 感谢 [puppywang](https://github.com/Chanzhaoyu/chatgpt-web/commit/628187f5c3348bda0d0518f90699a86525d19018) 修复了 `2.7.0` 版本中关于流输出数据的问题(使用 `nginx` 需要自行配置 `octet-stream` 相关内容)
|
||||||
|
|
||||||
|
- 关于为什么使用 `octet-stream` 而不是 `sse`,是因为更好的兼容之前的模式。
|
||||||
|
|
||||||
|
- 建议更新到此版本获得比较完整的体验
|
||||||
|
|
||||||
|
### Enhancement
|
||||||
|
- 优化了部份代码和类型提示
|
||||||
|
- 输入框添加换行提示
|
||||||
|
- 移动端输入框现在回车为换行,而不是直接提交
|
||||||
|
- 移动端双击标题返回顶部,箭头返回底部
|
||||||
|
|
||||||
|
### BugFix
|
||||||
|
- 流输出数据下的问题[#122]
|
||||||
|
- 修复了 `API Key` 下部份代码不换行的问题
|
||||||
|
- 修复移动端深色模式部份样式问题[#123][#126]
|
||||||
|
- 修复主题模式图标不一致的问题[#126]
|
||||||
|
|
||||||
|
## v2.7.3
|
||||||
|
|
||||||
|
`2023-02-25`
|
||||||
|
|
||||||
|
### Feature
|
||||||
|
- 适配系统深色模式 [#118](https://github.com/Chanzhaoyu/chatgpt-web/issues/103)
|
||||||
|
### BugFix
|
||||||
|
- 修复用户消息能被渲染为 `HTML` 问题 [#117](https://github.com/Chanzhaoyu/chatgpt-web/issues/117)
|
||||||
|
|
||||||
|
## v2.7.2
|
||||||
|
|
||||||
|
`2023-02-24`
|
||||||
|
### Enhancement
|
||||||
|
- 消息使用 [github-markdown-css](https://www.npmjs.com/package/github-markdown-css) 进行美化,现在支持全语法
|
||||||
|
- 移除测试无用函数
|
||||||
|
|
||||||
|
## v2.7.1
|
||||||
|
|
||||||
|
`2023-02-23`
|
||||||
|
|
||||||
|
因为消息流在 `accessToken` 中存在解析失败和消息不完整等一系列的问题,调整回正常消息形式
|
||||||
|
|
||||||
|
### Feature
|
||||||
|
- 现在可以中断请求过长没有答复的消息
|
||||||
|
- 现在可以删除单条消息
|
||||||
|
- 设置中显示当前版本信息
|
||||||
|
|
||||||
|
### BugFix
|
||||||
|
- 回退 `2.7.0` 的消息不稳定的问题
|
||||||
|
|
||||||
|
## v2.7.0
|
||||||
|
|
||||||
|
`2023-02-23`
|
||||||
|
|
||||||
|
### Feature
|
||||||
|
- 使用消息流返回信息,反应更迅速
|
||||||
|
|
||||||
|
### Enhancement
|
||||||
|
- 样式的一点小改动
|
||||||
|
|
||||||
|
## v2.6.2
|
||||||
|
|
||||||
|
`2023-02-22`
|
||||||
|
### BugFix
|
||||||
|
- 还原修改代理导致的异常问题
|
||||||
|
|
||||||
|
## v2.6.1
|
||||||
|
|
||||||
|
`2023-02-22`
|
||||||
|
|
||||||
|
### Feature
|
||||||
|
- 新增 `Railway` 部署模版
|
||||||
|
|
||||||
|
### BugFix
|
||||||
|
- 手动打包 `Proxy` 问题
|
||||||
|
|
||||||
|
## v2.6.0
|
||||||
|
|
||||||
|
`2023-02-21`
|
||||||
|
### Feature
|
||||||
|
- 新增对 `网页 accessToken` 调用 `ChatGPT`,更智能不过不太稳定 [#51](https://github.com/Chanzhaoyu/chatgpt-web/issues/51)
|
||||||
|
- 前端页面设置按钮显示查看当前后端服务配置
|
||||||
|
|
||||||
|
### Enhancement
|
||||||
|
- 新增 `TIMEOUT_MS` 环境变量设定后端超时时常(单位:毫秒)[#62](https://github.com/Chanzhaoyu/chatgpt-web/issues/62)
|
||||||
|
|
||||||
|
## v2.5.2
|
||||||
|
|
||||||
|
`2023-02-21`
|
||||||
|
### Feature
|
||||||
|
- 增加对 `markdown` 格式的支持 [Demo](https://github.com/Chanzhaoyu/chatgpt-web/pull/77)
|
||||||
|
### BugFix
|
||||||
|
- 重载会话时滚动条保持
|
||||||
|
|
||||||
|
## v2.5.1
|
||||||
|
|
||||||
|
`2023-02-21`
|
||||||
|
|
||||||
|
### Enhancement
|
||||||
|
- 调整路由模式为 `hash`
|
||||||
|
- 调整新增会话添加到
|
||||||
|
- 调整移动端样式
|
||||||
|
|
||||||
|
|
||||||
|
## v2.5.0
|
||||||
|
|
||||||
|
`2023-02-20`
|
||||||
|
|
||||||
|
### Feature
|
||||||
|
- 会话 `loading` 现在显示为光标动画
|
||||||
|
- 会话现在可以再次生成回复
|
||||||
|
- 会话异常可以再次进行请求
|
||||||
|
- 所有删除选项添加确认操作
|
||||||
|
|
||||||
|
### Enhancement
|
||||||
|
- 调整 `chat` 为路由页面而不是组件形式
|
||||||
|
- 更新依赖至最新
|
||||||
|
- 调整移动端体验
|
||||||
|
|
||||||
|
### BugFix
|
||||||
|
- 修复移动端左侧菜单显示不完整的问题
|
||||||
|
|
||||||
|
## v2.4.1
|
||||||
|
|
||||||
|
`2023-02-18`
|
||||||
|
|
||||||
|
### Enhancement
|
||||||
|
- 调整部份移动端上的样式
|
||||||
|
- 输入框支持换行
|
||||||
|
|
||||||
|
## v2.4.0
|
||||||
|
|
||||||
|
`2023-02-17`
|
||||||
|
|
||||||
|
### Feature
|
||||||
|
- 响应式支持移动端
|
||||||
|
### Enhancement
|
||||||
|
- 修改部份描述错误
|
||||||
|
|
||||||
|
## v2.3.3
|
||||||
|
|
||||||
|
`2023-02-16`
|
||||||
|
|
||||||
|
### Feature
|
||||||
|
- 添加 `README` 部份说明和贡献列表
|
||||||
|
- 添加 `docker` 镜像
|
||||||
|
- 添加 `GitHub Action` 自动化构建
|
||||||
|
|
||||||
|
### BugFix
|
||||||
|
- 回退依赖更新导致的 [Eslint 报错](https://github.com/eslint/eslint/issues/16896)
|
||||||
|
|
||||||
|
## v2.3.2
|
||||||
|
|
||||||
|
`2023-02-16`
|
||||||
|
|
||||||
|
### Enhancement
|
||||||
|
- 更新依赖至最新
|
||||||
|
- 优化部份内容
|
||||||
|
|
||||||
|
## v2.3.1
|
||||||
|
|
||||||
|
`2023-02-15`
|
||||||
|
|
||||||
|
### BugFix
|
||||||
|
- 修复多会话状态下一些意想不到的问题
|
||||||
|
|
||||||
|
## v2.3.0
|
||||||
|
|
||||||
|
`2023-02-15`
|
||||||
|
### Feature
|
||||||
|
- 代码类型信息高亮显示
|
||||||
|
- 支持 `node ^16` 版本
|
||||||
|
- 移动端响应式初步支持
|
||||||
|
- `vite` 中 `proxy` 代理
|
||||||
|
|
||||||
|
### Enhancement
|
||||||
|
- 调整超时处理范围
|
||||||
|
|
||||||
|
### BugFix
|
||||||
|
- 修复取消请求错误提示会添加到信息中
|
||||||
|
- 修复部份情况下提交请求不可用
|
||||||
|
- 修复侧边栏宽度变化闪烁的问题
|
||||||
|
|
||||||
|
## v2.2.0
|
||||||
|
|
||||||
|
`2023-02-14`
|
||||||
|
### Feature
|
||||||
|
- 会话和上下文本地储存
|
||||||
|
- 侧边栏本地储存
|
||||||
|
|
||||||
|
## v2.1.0
|
||||||
|
|
||||||
|
`2023-02-14`
|
||||||
|
### Enhancement
|
||||||
|
- 更新依赖至最新
|
||||||
|
- 联想功能移动至前端提交,后端只做转发
|
||||||
|
|
||||||
|
### BugFix
|
||||||
|
- 修复部份项目检测有关 `Bug`
|
||||||
|
- 修复清除上下文按钮失效
|
||||||
|
|
||||||
|
## v2.0.0
|
||||||
|
|
||||||
|
`2023-02-13`
|
||||||
|
### Refactor
|
||||||
|
重构并优化大部分内容
|
||||||
|
|
||||||
|
## v1.0.5
|
||||||
|
|
||||||
|
`2023-02-12`
|
||||||
|
|
||||||
|
### Enhancement
|
||||||
|
- 输入框焦点,连续提交
|
||||||
|
|
||||||
|
### BugFix
|
||||||
|
- 修复信息框样式问题
|
||||||
|
- 修复中文输入法提交问题
|
||||||
|
|
||||||
|
## v1.0.4
|
||||||
|
|
||||||
|
`2023-02-11`
|
||||||
|
|
||||||
|
### Feature
|
||||||
|
- 支持上下文联想
|
||||||
|
|
||||||
|
## v1.0.3
|
||||||
|
|
||||||
|
`2023-02-11`
|
||||||
|
|
||||||
|
### Enhancement
|
||||||
|
- 拆分 `service` 文件以便扩展
|
||||||
|
- 调整 `Eslint` 相关验证
|
||||||
|
|
||||||
|
### BugFix
|
||||||
|
- 修复部份控制台报错
|
||||||
|
|
||||||
|
## v1.0.2
|
||||||
|
|
||||||
|
`2023-02-10`
|
||||||
|
|
||||||
|
### BugFix
|
||||||
|
- 修复新增信息容器不会自动滚动到问题
|
||||||
|
- 修复文本过长不换行到问题 [#1](https://github.com/Chanzhaoyu/chatgpt-web/issues/1)
|
||||||
49
ai-chat-web/ai-chat-web/CONTRIBUTING.en.md
Normal file
@@ -0,0 +1,49 @@
|
|||||||
|
# Contribution Guide
|
||||||
|
Thank you for your valuable time. Your contributions will make this project better! Before submitting a contribution, please take some time to read the getting started guide below.
|
||||||
|
|
||||||
|
## Semantic Versioning
|
||||||
|
This project follows semantic versioning. We release patch versions for important bug fixes, minor versions for new features or non-important changes, and major versions for significant and incompatible changes.
|
||||||
|
|
||||||
|
Each major change will be recorded in the `changelog`.
|
||||||
|
|
||||||
|
## Submitting Pull Request
|
||||||
|
1. Fork [this repository](https://github.com/Chanzhaoyu/chatgpt-web) and create a branch from `main`. For new feature implementations, submit a pull request to the `feature` branch. For other changes, submit to the `main` branch.
|
||||||
|
2. Install the `pnpm` tool using `npm install pnpm -g`.
|
||||||
|
3. Install the `Eslint` plugin for `VSCode`, or enable `eslint` functionality for other editors such as `WebStorm`.
|
||||||
|
4. Execute `pnpm bootstrap` in the root directory.
|
||||||
|
5. Execute `pnpm install` in the `/service/` directory.
|
||||||
|
6. Make changes to the codebase. If applicable, ensure that appropriate testing has been done.
|
||||||
|
7. Execute `pnpm lint:fix` in the root directory to perform a code formatting check.
|
||||||
|
8. Execute `pnpm type-check` in the root directory to perform a type check.
|
||||||
|
9. Submit a git commit, following the [Commit Guidelines](#commit-guidelines).
|
||||||
|
10. Submit a `pull request`. If there is a corresponding `issue`, please link it using the [linking-a-pull-request-to-an-issue keyword](https://docs.github.com/en/issues/tracking-your-work-with-issues/linking-a-pull-request-to-an-issue#linking-a-pull-request-to-an-issue-using-a-keyword).
|
||||||
|
|
||||||
|
## Commit Guidelines
|
||||||
|
|
||||||
|
Commit messages should follow the [conventional-changelog standard](https://www.conventionalcommits.org/en/v1.0.0/):
|
||||||
|
|
||||||
|
```bash
|
||||||
|
<type>[optional scope]: <description>
|
||||||
|
|
||||||
|
[optional body]
|
||||||
|
|
||||||
|
[optional footer]
|
||||||
|
```
|
||||||
|
|
||||||
|
### Commit Types
|
||||||
|
|
||||||
|
The following is a list of commit types:
|
||||||
|
|
||||||
|
- feat: New feature or functionality
|
||||||
|
- fix: Bug fix
|
||||||
|
- docs: Documentation update
|
||||||
|
- style: Code style or component style update
|
||||||
|
- refactor: Code refactoring, no new features or bug fixes introduced
|
||||||
|
- perf: Performance optimization
|
||||||
|
- test: Unit test
|
||||||
|
- chore: Other commits that do not modify src or test files
|
||||||
|
|
||||||
|
|
||||||
|
## License
|
||||||
|
|
||||||
|
[MIT](./license)
|
||||||
49
ai-chat-web/ai-chat-web/CONTRIBUTING.md
Normal file
@@ -0,0 +1,49 @@
|
|||||||
|
# 贡献指南
|
||||||
|
感谢你的宝贵时间。你的贡献将使这个项目变得更好!在提交贡献之前,请务必花点时间阅读下面的入门指南。
|
||||||
|
|
||||||
|
## 语义化版本
|
||||||
|
该项目遵循语义化版本。我们对重要的漏洞修复发布修订号,对新特性或不重要的变更发布次版本号,对重大且不兼容的变更发布主版本号。
|
||||||
|
|
||||||
|
每个重大更改都将记录在 `changelog` 中。
|
||||||
|
|
||||||
|
## 提交 Pull Request
|
||||||
|
1. Fork [此仓库](https://github.com/Chanzhaoyu/chatgpt-web),从 `main` 创建分支。新功能实现请发 pull request 到 `feature` 分支。其他更改发到 `main` 分支。
|
||||||
|
2. 使用 `npm install pnpm -g` 安装 `pnpm` 工具。
|
||||||
|
3. `vscode` 安装了 `Eslint` 插件,其它编辑器如 `webStorm` 打开了 `eslint` 功能。
|
||||||
|
4. 根目录下执行 `pnpm bootstrap`。
|
||||||
|
5. `/service/` 目录下执行 `pnpm install`。
|
||||||
|
6. 对代码库进行更改。如果适用的话,请确保进行了相应的测试。
|
||||||
|
7. 请在根目录下执行 `pnpm lint:fix` 进行代码格式检查。
|
||||||
|
8. 请在根目录下执行 `pnpm type-check` 进行类型检查。
|
||||||
|
9. 提交 git commit, 请同时遵守 [Commit 规范](#commit-指南)
|
||||||
|
10. 提交 `pull request`, 如果有对应的 `issue`,请进行[关联](https://docs.github.com/en/issues/tracking-your-work-with-issues/linking-a-pull-request-to-an-issue#linking-a-pull-request-to-an-issue-using-a-keyword)。
|
||||||
|
|
||||||
|
## Commit 指南
|
||||||
|
|
||||||
|
Commit messages 请遵循[conventional-changelog 标准](https://www.conventionalcommits.org/en/v1.0.0/):
|
||||||
|
|
||||||
|
```bash
|
||||||
|
<类型>[可选 范围]: <描述>
|
||||||
|
|
||||||
|
[可选 正文]
|
||||||
|
|
||||||
|
[可选 脚注]
|
||||||
|
```
|
||||||
|
|
||||||
|
### Commit 类型
|
||||||
|
|
||||||
|
以下是 commit 类型列表:
|
||||||
|
|
||||||
|
- feat: 新特性或功能
|
||||||
|
- fix: 缺陷修复
|
||||||
|
- docs: 文档更新
|
||||||
|
- style: 代码风格或者组件样式更新
|
||||||
|
- refactor: 代码重构,不引入新功能和缺陷修复
|
||||||
|
- perf: 性能优化
|
||||||
|
- test: 单元测试
|
||||||
|
- chore: 其他不修改 src 或测试文件的提交
|
||||||
|
|
||||||
|
|
||||||
|
## License
|
||||||
|
|
||||||
|
[MIT](./license)
|
||||||
14
ai-chat-web/ai-chat-web/Dockerfile
Normal file
@@ -0,0 +1,14 @@
|
|||||||
|
FROM quay.io/0voice/node:lts-alpine AS frontend
|
||||||
|
RUN npm install pnpm -g
|
||||||
|
COPY . /app
|
||||||
|
WORKDIR /app
|
||||||
|
RUN pnpm bootstrap
|
||||||
|
RUN pnpm run build-only
|
||||||
|
|
||||||
|
FROM quay.io/0voice/nginx:1.25.4 as web
|
||||||
|
COPY --from=frontend /app/dist/ /usr/share/nginx/html/
|
||||||
|
# 指定入口程序
|
||||||
|
ENTRYPOINT ["/docker-entrypoint.sh"]
|
||||||
|
# 指定容器的启动命令或者入口程序的参数
|
||||||
|
CMD ["nginx", "-g", "daemon off;"]
|
||||||
|
|
||||||
64
ai-chat-web/ai-chat-web/README_0voice.md
Normal file
@@ -0,0 +1,64 @@
|
|||||||
|
# ai-chat-web
|
||||||
|
|
||||||
|
## node 安装
|
||||||
|
### windows
|
||||||
|
1. 上[官网](https://nodejs.org/en)下载18.16.0 LTS版本
|
||||||
|
2. 查看node 是否安装成功
|
||||||
|
```
|
||||||
|
node -v
|
||||||
|
npm -v
|
||||||
|
```
|
||||||
|
3. 安装pnpm
|
||||||
|
```
|
||||||
|
npm install pnpm -g
|
||||||
|
```
|
||||||
|
|
||||||
|
### ubuntu
|
||||||
|
1. 设置 apt 源,设置后可查看/etc/apt/sources.list.d/nodesource.list 文件
|
||||||
|
```
|
||||||
|
curl -sL https://deb.nodesource.com/setup_18.x | sudo -E bash -
|
||||||
|
```
|
||||||
|
2. 安装nodejs
|
||||||
|
```
|
||||||
|
sudo apt-get install -y nodejs
|
||||||
|
```
|
||||||
|
3. 验证
|
||||||
|
```
|
||||||
|
node -v
|
||||||
|
npm -v
|
||||||
|
```
|
||||||
|
4. 安装pnpm
|
||||||
|
```
|
||||||
|
sudo npm install pnpm -g
|
||||||
|
```
|
||||||
|
|
||||||
|
## 编译运行
|
||||||
|
1. 依赖安装
|
||||||
|
```
|
||||||
|
pnpm bootstrap
|
||||||
|
```
|
||||||
|
2. 本地运行
|
||||||
|
```
|
||||||
|
pnpm dev
|
||||||
|
```
|
||||||
|
3. 打包发布版本
|
||||||
|
```
|
||||||
|
pnpm build-only
|
||||||
|
```
|
||||||
|
|
||||||
|
## 提交代码的规则
|
||||||
|
```
|
||||||
|
* commitlint 规则是指在提交代码时要遵循的规范,常见的 commitlint 规则如下:
|
||||||
|
|
||||||
|
* type:用于说明 commit 的类型,例如 feat(新功能)、fix(修复 bug)、docs(文档更新)、style(样式修改)、refactor(重构代码)等。
|
||||||
|
|
||||||
|
* scope:用于说明 commit 影响的范围,例如组件、模块、页面等。
|
||||||
|
|
||||||
|
* subject:用于简短地描述 commit 的内容,建议不超过 50 个字符。
|
||||||
|
|
||||||
|
* body:用于详细描述 commit 的改动内容,可以分成多行。
|
||||||
|
|
||||||
|
* footer:用于关闭 issue 或者添加相关链接等信息。
|
||||||
|
|
||||||
|
* 长度限制:commit message 不应该过长,一般不超过 72 个字符。
|
||||||
|
```
|
||||||
1
ai-chat-web/ai-chat-web/config/index.ts
Normal file
@@ -0,0 +1 @@
|
|||||||
|
export * from './proxy'
|
||||||
16
ai-chat-web/ai-chat-web/config/proxy.ts
Normal file
@@ -0,0 +1,16 @@
|
|||||||
|
import type { ProxyOptions } from 'vite'
|
||||||
|
|
||||||
|
export function createViteProxy(isOpenProxy: boolean, viteEnv: ImportMetaEnv) {
|
||||||
|
if (!isOpenProxy)
|
||||||
|
return
|
||||||
|
|
||||||
|
const proxy: Record<string, string | ProxyOptions> = {
|
||||||
|
'/api': {
|
||||||
|
target: viteEnv.VITE_APP_API_BASE_URL,
|
||||||
|
changeOrigin: true,
|
||||||
|
rewrite: path => path.replace('/api/', '/'),
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
return proxy
|
||||||
|
}
|
||||||
@@ -2,39 +2,33 @@ version: '3'
|
|||||||
|
|
||||||
services:
|
services:
|
||||||
app:
|
app:
|
||||||
container_name: chatgpt-web
|
|
||||||
image: chenzhaoyu94/chatgpt-web # 总是使用latest,更新时重新pull该tag镜像即可
|
image: chenzhaoyu94/chatgpt-web # 总是使用latest,更新时重新pull该tag镜像即可
|
||||||
ports:
|
ports:
|
||||||
- 3002:3002
|
- 3002:3002
|
||||||
environment:
|
environment:
|
||||||
# 二选一
|
# 二选一
|
||||||
OPENAI_API_KEY:
|
OPENAI_API_KEY: sk-xxx
|
||||||
# 二选一
|
# 二选一
|
||||||
OPENAI_ACCESS_TOKEN:
|
OPENAI_ACCESS_TOKEN: xxx
|
||||||
# API接口地址,可选,设置 OPENAI_API_KEY 时可用
|
# API接口地址,可选,设置 OPENAI_API_KEY 时可用
|
||||||
OPENAI_API_BASE_URL:
|
OPENAI_API_BASE_URL: xxx
|
||||||
# API模型,可选,设置 OPENAI_API_KEY 时可用
|
# API模型,可选,设置 OPENAI_API_KEY 时可用
|
||||||
OPENAI_API_MODEL:
|
OPENAI_API_MODEL: xxx
|
||||||
# 反向代理,可选
|
# 反向代理,可选
|
||||||
API_REVERSE_PROXY:
|
API_REVERSE_PROXY: xxx
|
||||||
# 访问权限密钥,可选
|
# 访问权限密钥,可选
|
||||||
AUTH_SECRET_KEY:
|
AUTH_SECRET_KEY: xxx
|
||||||
# 每小时最大请求次数,可选,默认无限
|
# 每小时最大请求次数,可选,默认无限
|
||||||
MAX_REQUEST_PER_HOUR: 0
|
MAX_REQUEST_PER_HOUR: 0
|
||||||
# 超时,单位毫秒,可选
|
# 超时,单位毫秒,可选
|
||||||
TIMEOUT_MS: 60000
|
TIMEOUT_MS: 60000
|
||||||
# Socks代理,可选,和 SOCKS_PROXY_PORT 一起时生效
|
# Socks代理,可选,和 SOCKS_PROXY_PORT 一起时生效
|
||||||
SOCKS_PROXY_HOST:
|
SOCKS_PROXY_HOST: xxx
|
||||||
# Socks代理端口,可选,和 SOCKS_PROXY_HOST 一起时生效
|
# Socks代理端口,可选,和 SOCKS_PROXY_HOST 一起时生效
|
||||||
SOCKS_PROXY_PORT:
|
SOCKS_PROXY_PORT: xxx
|
||||||
# Socks代理用户名,可选,和 SOCKS_PROXY_HOST & SOCKS_PROXY_PORT 一起时生效
|
|
||||||
SOCKS_PROXY_USERNAME:
|
|
||||||
# Socks代理密码,可选,和 SOCKS_PROXY_HOST & SOCKS_PROXY_PORT 一起时生效
|
|
||||||
SOCKS_PROXY_PASSWORD:
|
|
||||||
# HTTPS_PROXY 代理,可选
|
# HTTPS_PROXY 代理,可选
|
||||||
HTTPS_PROXY:
|
HTTPS_PROXY: http://xxx:7890
|
||||||
nginx:
|
nginx:
|
||||||
container_name: nginx
|
|
||||||
image: nginx:alpine
|
image: nginx:alpine
|
||||||
ports:
|
ports:
|
||||||
- '80:80'
|
- '80:80'
|
||||||
@@ -3,13 +3,6 @@ server {
|
|||||||
server_name localhost;
|
server_name localhost;
|
||||||
charset utf-8;
|
charset utf-8;
|
||||||
error_page 500 502 503 504 /50x.html;
|
error_page 500 502 503 504 /50x.html;
|
||||||
|
|
||||||
# 防止爬虫抓取
|
|
||||||
if ($http_user_agent ~* "360Spider|JikeSpider|Spider|spider|bot|Bot|2345Explorer|curl|wget|webZIP|qihoobot|Baiduspider|Googlebot|Googlebot-Mobile|Googlebot-Image|Mediapartners-Google|Adsbot-Google|Feedfetcher-Google|Yahoo! Slurp|Yahoo! Slurp China|YoudaoBot|Sosospider|Sogou spider|Sogou web spider|MSNBot|ia_archiver|Tomato Bot|NSPlayer|bingbot")
|
|
||||||
{
|
|
||||||
return 403;
|
|
||||||
}
|
|
||||||
|
|
||||||
location / {
|
location / {
|
||||||
root /usr/share/nginx/html;
|
root /usr/share/nginx/html;
|
||||||
try_files $uri /index.html;
|
try_files $uri /index.html;
|
||||||
@@ -2,12 +2,12 @@
|
|||||||
<html lang="zh-cmn-Hans">
|
<html lang="zh-cmn-Hans">
|
||||||
<head>
|
<head>
|
||||||
<meta charset="UTF-8">
|
<meta charset="UTF-8">
|
||||||
<link rel="icon" type="image/svg+xml" href="/favicon.svg">
|
<link rel="icon" type="image/svg+xml" href="/favicon.jpg">
|
||||||
<meta content="yes" name="apple-mobile-web-app-capable"/>
|
<meta content="yes" name="apple-mobile-web-app-capable"/>
|
||||||
<link rel="apple-touch-icon" href="/favicon.ico">
|
<link rel="apple-touch-icon" href="/favicon.ico">
|
||||||
<meta name="viewport"
|
<meta name="viewport"
|
||||||
content="width=device-width, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0, viewport-fit=cover" />
|
content="width=device-width, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0, viewport-fit=cover" />
|
||||||
<title>ChatGPT Web</title>
|
<title>零声教学AI助手(公测)</title>
|
||||||
</head>
|
</head>
|
||||||
|
|
||||||
<body class="dark:bg-black">
|
<body class="dark:bg-black">
|
||||||
@@ -79,5 +79,14 @@
|
|||||||
</div>
|
</div>
|
||||||
<script type="module" src="/src/main.ts"></script>
|
<script type="module" src="/src/main.ts"></script>
|
||||||
</body>
|
</body>
|
||||||
|
<script>
|
||||||
|
var _hmt = _hmt || [];
|
||||||
|
(function () {
|
||||||
|
const hm = document.createElement('script')
|
||||||
|
hm.src = 'https://hm.baidu.com/hm.js?29783f1f3a946661c3d41e96752536d6'
|
||||||
|
const s = document.getElementsByTagName('script')[0]
|
||||||
|
s.parentNode.insertBefore(hm, s)
|
||||||
|
})()
|
||||||
|
</script>
|
||||||
|
|
||||||
</html>
|
</html>
|
||||||
@@ -1,8 +1,8 @@
|
|||||||
{
|
{
|
||||||
"name": "chatgpt-web",
|
"name": "chatgpt-web",
|
||||||
"version": "2.11.0",
|
"version": "2.10.8",
|
||||||
"private": false,
|
"private": false,
|
||||||
"description": "ChatGPT Web",
|
"description": "零声教学AI助手",
|
||||||
"author": "ChenZhaoYu <chenzhaoyu1994@gmail.com>",
|
"author": "ChenZhaoYu <chenzhaoyu1994@gmail.com>",
|
||||||
"keywords": [
|
"keywords": [
|
||||||
"chatgpt-web",
|
"chatgpt-web",
|
||||||
@@ -11,10 +11,10 @@
|
|||||||
"vue"
|
"vue"
|
||||||
],
|
],
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"dev": "vite",
|
"dev": "vite --mode develop",
|
||||||
"build": "run-p type-check build-only",
|
"build": "run-p type-check build-only",
|
||||||
"preview": "vite preview",
|
"preview": "vite preview",
|
||||||
"build-only": "vite build",
|
"build-only": "vite build --mode production",
|
||||||
"type-check": "vue-tsc --noEmit",
|
"type-check": "vue-tsc --noEmit",
|
||||||
"lint": "eslint .",
|
"lint": "eslint .",
|
||||||
"lint:fix": "eslint . --fix",
|
"lint:fix": "eslint . --fix",
|
||||||
6903
ai-chat-web/ai-chat-web/pnpm-lock.yaml
generated
Normal file
BIN
ai-chat-web/ai-chat-web/public/favicon.ico
Normal file
|
After Width: | Height: | Size: 15 KiB |
BIN
ai-chat-web/ai-chat-web/public/favicon.jpg
Normal file
|
After Width: | Height: | Size: 518 KiB |
|
Before Width: | Height: | Size: 1.0 KiB After Width: | Height: | Size: 1.0 KiB |
BIN
ai-chat-web/ai-chat-web/public/pwa-192x192.png
Normal file
|
After Width: | Height: | Size: 22 KiB |
BIN
ai-chat-web/ai-chat-web/public/pwa-512x512.png
Normal file
|
After Width: | Height: | Size: 22 KiB |
@@ -1,6 +1,6 @@
|
|||||||
import type { AxiosProgressEvent, GenericAbortSignal } from 'axios'
|
import type { AxiosProgressEvent, GenericAbortSignal } from 'axios'
|
||||||
import { post } from '@/utils/request'
|
import { post } from '@/utils/request'
|
||||||
import { useAuthStore, useSettingStore } from '@/store'
|
import { useSettingStore } from '@/store'
|
||||||
|
|
||||||
export function fetchChatAPI<T = any>(
|
export function fetchChatAPI<T = any>(
|
||||||
prompt: string,
|
prompt: string,
|
||||||
@@ -28,25 +28,10 @@ export function fetchChatAPIProcess<T = any>(
|
|||||||
onDownloadProgress?: (progressEvent: AxiosProgressEvent) => void },
|
onDownloadProgress?: (progressEvent: AxiosProgressEvent) => void },
|
||||||
) {
|
) {
|
||||||
const settingStore = useSettingStore()
|
const settingStore = useSettingStore()
|
||||||
const authStore = useAuthStore()
|
|
||||||
|
|
||||||
let data: Record<string, any> = {
|
|
||||||
prompt: params.prompt,
|
|
||||||
options: params.options,
|
|
||||||
}
|
|
||||||
|
|
||||||
if (authStore.isChatGPTAPI) {
|
|
||||||
data = {
|
|
||||||
...data,
|
|
||||||
systemMessage: settingStore.systemMessage,
|
|
||||||
temperature: settingStore.temperature,
|
|
||||||
top_p: settingStore.top_p,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return post<T>({
|
return post<T>({
|
||||||
url: '/chat-process',
|
url: '/chat-process',
|
||||||
data,
|
data: { prompt: params.prompt, options: params.options, systemMessage: settingStore.systemMessage },
|
||||||
signal: params.signal,
|
signal: params.signal,
|
||||||
onDownloadProgress: params.onDownloadProgress,
|
onDownloadProgress: params.onDownloadProgress,
|
||||||
})
|
})
|
||||||
@@ -64,3 +49,17 @@ export function fetchVerify<T>(token: string) {
|
|||||||
data: { token },
|
data: { token },
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export function fetchCode<T>(phone: string) {
|
||||||
|
return post<T>({
|
||||||
|
url: '/v1/sms/send/code',
|
||||||
|
data: { phone },
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
export function login<T>(phone: string, code: string) {
|
||||||
|
return post<T>({
|
||||||
|
url: '/v1/user/login',
|
||||||
|
data: { user_name: phone, pwd: code, type: 1 },
|
||||||
|
})
|
||||||
|
}
|
||||||
BIN
ai-chat-web/ai-chat-web/src/assets/0voice-avatar.jpg
Normal file
|
After Width: | Height: | Size: 518 KiB |
|
Before Width: | Height: | Size: 5.0 KiB After Width: | Height: | Size: 5.0 KiB |
@@ -147,7 +147,7 @@ const clearPromptTemplate = () => {
|
|||||||
message.success(t('common.clearSuccess'))
|
message.success(t('common.clearSuccess'))
|
||||||
}
|
}
|
||||||
|
|
||||||
const importPromptTemplate = (from = 'online') => {
|
const importPromptTemplate = () => {
|
||||||
try {
|
try {
|
||||||
const jsonData = JSON.parse(tempPromptValue.value)
|
const jsonData = JSON.parse(tempPromptValue.value)
|
||||||
let key = ''
|
let key = ''
|
||||||
@@ -168,7 +168,7 @@ const importPromptTemplate = (from = 'online') => {
|
|||||||
}
|
}
|
||||||
|
|
||||||
for (const i of jsonData) {
|
for (const i of jsonData) {
|
||||||
if (!(key in i) || !(value in i))
|
if (!('key' in i) || !('value' in i))
|
||||||
throw new Error(t('store.importError'))
|
throw new Error(t('store.importError'))
|
||||||
let safe = true
|
let safe = true
|
||||||
for (const j of promptList.value) {
|
for (const j of promptList.value) {
|
||||||
@@ -191,8 +191,6 @@ const importPromptTemplate = (from = 'online') => {
|
|||||||
catch {
|
catch {
|
||||||
message.error('JSON 格式错误,请检查 JSON 格式')
|
message.error('JSON 格式错误,请检查 JSON 格式')
|
||||||
}
|
}
|
||||||
if (from === 'local')
|
|
||||||
showModal.value = !showModal.value
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// 模板导出
|
// 模板导出
|
||||||
@@ -471,7 +469,7 @@ const dataSource = computed(() => {
|
|||||||
block
|
block
|
||||||
type="primary"
|
type="primary"
|
||||||
:disabled="inputStatus"
|
:disabled="inputStatus"
|
||||||
@click="() => { importPromptTemplate('local') }"
|
@click="() => { importPromptTemplate() }"
|
||||||
>
|
>
|
||||||
{{ t('common.import') }}
|
{{ t('common.import') }}
|
||||||
</NButton>
|
</NButton>
|
||||||
@@ -11,7 +11,7 @@ interface ConfigState {
|
|||||||
apiModel?: string
|
apiModel?: string
|
||||||
socksProxy?: string
|
socksProxy?: string
|
||||||
httpsProxy?: string
|
httpsProxy?: string
|
||||||
usage?: string
|
balance?: string
|
||||||
}
|
}
|
||||||
|
|
||||||
const authStore = useAuthStore()
|
const authStore = useAuthStore()
|
||||||
@@ -52,17 +52,17 @@ onMounted(() => {
|
|||||||
href="https://github.com/Chanzhaoyu/chatgpt-web"
|
href="https://github.com/Chanzhaoyu/chatgpt-web"
|
||||||
target="_blank"
|
target="_blank"
|
||||||
>
|
>
|
||||||
GitHub
|
Github
|
||||||
</a>
|
</a>
|
||||||
,免费且基于 MIT 协议,没有任何形式的付费行为!
|
,免费且基于 MIT 协议,没有任何形式的付费行为!
|
||||||
</p>
|
</p>
|
||||||
<p>
|
<p>
|
||||||
如果你觉得此项目对你有帮助,请在 GitHub 帮我点个 Star 或者给予一点赞助,谢谢!
|
如果你觉得此项目对你有帮助,请在 Github 帮我点个 Star 或者给予一点赞助,谢谢!
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
<p>{{ $t("setting.api") }}:{{ config?.apiModel ?? '-' }}</p>
|
<p>{{ $t("setting.api") }}:{{ config?.apiModel ?? '-' }}</p>
|
||||||
<p v-if="isChatGPTAPI">
|
<p v-if="isChatGPTAPI">
|
||||||
{{ $t("setting.monthlyUsage") }}:{{ config?.usage ?? '-' }}
|
{{ $t("setting.balance") }}:{{ config?.balance ?? '-' }}
|
||||||
</p>
|
</p>
|
||||||
<p v-if="!isChatGPTAPI">
|
<p v-if="!isChatGPTAPI">
|
||||||
{{ $t("setting.reverseProxy") }}:{{ config?.reverseProxy ?? '-' }}
|
{{ $t("setting.reverseProxy") }}:{{ config?.reverseProxy ?? '-' }}
|
||||||
@@ -0,0 +1,46 @@
|
|||||||
|
<script lang="ts" setup>
|
||||||
|
import { ref } from 'vue'
|
||||||
|
import { NButton, NInput, useMessage } from 'naive-ui'
|
||||||
|
import { useSettingStore } from '@/store'
|
||||||
|
import type { SettingsState } from '@/store/modules/settings/helper'
|
||||||
|
import { t } from '@/locales'
|
||||||
|
|
||||||
|
const settingStore = useSettingStore()
|
||||||
|
|
||||||
|
const ms = useMessage()
|
||||||
|
|
||||||
|
const systemMessage = ref(settingStore.systemMessage ?? '')
|
||||||
|
|
||||||
|
function updateSettings(options: Partial<SettingsState>) {
|
||||||
|
settingStore.updateSetting(options)
|
||||||
|
ms.success(t('common.success'))
|
||||||
|
}
|
||||||
|
|
||||||
|
function handleReset() {
|
||||||
|
settingStore.resetSetting()
|
||||||
|
ms.success(t('common.success'))
|
||||||
|
window.location.reload()
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<template>
|
||||||
|
<div class="p-4 space-y-5 min-h-[200px]">
|
||||||
|
<div class="space-y-6">
|
||||||
|
<div class="flex items-center space-x-4">
|
||||||
|
<span class="flex-shrink-0 w-[100px]">{{ $t('setting.role') }}</span>
|
||||||
|
<div class="flex-1">
|
||||||
|
<NInput v-model:value="systemMessage" placeholder="" />
|
||||||
|
</div>
|
||||||
|
<NButton size="tiny" text type="primary" @click="updateSettings({ systemMessage })">
|
||||||
|
{{ $t('common.save') }}
|
||||||
|
</NButton>
|
||||||
|
</div>
|
||||||
|
<div class="flex items-center space-x-4">
|
||||||
|
<span class="flex-shrink-0 w-[100px]"> </span>
|
||||||
|
<NButton size="small" @click="handleReset">
|
||||||
|
{{ $t('common.reset') }}
|
||||||
|
</NButton>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
@@ -57,8 +57,6 @@ const languageOptions: { label: string; key: Language; value: Language }[] = [
|
|||||||
{ label: '简体中文', key: 'zh-CN', value: 'zh-CN' },
|
{ label: '简体中文', key: 'zh-CN', value: 'zh-CN' },
|
||||||
{ label: '繁體中文', key: 'zh-TW', value: 'zh-TW' },
|
{ label: '繁體中文', key: 'zh-TW', value: 'zh-TW' },
|
||||||
{ label: 'English', key: 'en-US', value: 'en-US' },
|
{ label: 'English', key: 'en-US', value: 'en-US' },
|
||||||
{ label: '한국어', key: 'ko-KR', value: 'ko-KR' },
|
|
||||||
{ label: 'Русский язык', key: 'ru-RU', value: 'ru-RU' },
|
|
||||||
]
|
]
|
||||||
|
|
||||||
function updateUserInfo(options: Partial<UserInfo>) {
|
function updateUserInfo(options: Partial<UserInfo>) {
|
||||||
@@ -1,13 +1,12 @@
|
|||||||
<script setup lang='ts'>
|
<script setup lang='ts'>
|
||||||
import { computed, useAttrs } from 'vue'
|
import { computed, useAttrs } from 'vue'
|
||||||
import { Icon } from '@iconify/vue'
|
import { Icon } from '@iconify/vue'
|
||||||
import type { IconifyIcon } from '@iconify/vue'
|
|
||||||
|
|
||||||
interface Props {
|
interface Props {
|
||||||
icon?: string | IconifyIcon
|
icon?: string
|
||||||
}
|
}
|
||||||
|
|
||||||
const props = defineProps<Props>()
|
defineProps<Props>()
|
||||||
|
|
||||||
const attrs = useAttrs()
|
const attrs = useAttrs()
|
||||||
|
|
||||||
@@ -18,5 +17,5 @@ const bindAttrs = computed<{ class: string; style: string }>(() => ({
|
|||||||
</script>
|
</script>
|
||||||
|
|
||||||
<template>
|
<template>
|
||||||
<Icon :icon="props.icon ?? ''" v-bind="bindAttrs" />
|
<Icon :icon="icon" v-bind="bindAttrs" />
|
||||||
</template>
|
</template>
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
import { computed } from 'vue'
|
import { computed } from 'vue'
|
||||||
import { enUS, koKR, zhCN, zhTW } from 'naive-ui'
|
import { enUS, zhCN, zhTW } from 'naive-ui'
|
||||||
import { useAppStore } from '@/store'
|
import { useAppStore } from '@/store'
|
||||||
import { setLocale } from '@/locales'
|
import { setLocale } from '@/locales'
|
||||||
|
|
||||||
@@ -11,12 +11,6 @@ export function useLanguage() {
|
|||||||
case 'en-US':
|
case 'en-US':
|
||||||
setLocale('en-US')
|
setLocale('en-US')
|
||||||
return enUS
|
return enUS
|
||||||
case 'ru-RU':
|
|
||||||
setLocale('ru-RU')
|
|
||||||
return enUS
|
|
||||||
case 'ko-KR':
|
|
||||||
setLocale('ko-KR')
|
|
||||||
return koKR
|
|
||||||
case 'zh-CN':
|
case 'zh-CN':
|
||||||
setLocale('zh-CN')
|
setLocale('zh-CN')
|
||||||
return zhCN
|
return zhCN
|
||||||
@@ -25,7 +19,7 @@ export function useLanguage() {
|
|||||||
return zhTW
|
return zhTW
|
||||||
default:
|
default:
|
||||||
setLocale('zh-CN')
|
setLocale('zh-CN')
|
||||||
return zhCN
|
return enUS
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
@@ -9,10 +9,11 @@ export function useTheme() {
|
|||||||
const OsTheme = useOsTheme()
|
const OsTheme = useOsTheme()
|
||||||
|
|
||||||
const isDark = computed(() => {
|
const isDark = computed(() => {
|
||||||
if (appStore.theme === 'auto')
|
return true
|
||||||
return OsTheme.value === 'dark'
|
// if (appStore.theme === 'auto')
|
||||||
else
|
// return OsTheme.value === 'dark'
|
||||||
return appStore.theme === 'dark'
|
// else
|
||||||
|
// return appStore.theme === 'dark'
|
||||||
})
|
})
|
||||||
|
|
||||||
const theme = computed(() => {
|
const theme = computed(() => {
|
||||||
|
Before Width: | Height: | Size: 28 KiB After Width: | Height: | Size: 28 KiB |
@@ -28,8 +28,7 @@ export default {
|
|||||||
unauthorizedTips: 'Unauthorized, please verify first.',
|
unauthorizedTips: 'Unauthorized, please verify first.',
|
||||||
},
|
},
|
||||||
chat: {
|
chat: {
|
||||||
newChatButton: 'New Chat',
|
placeholder: 'Ask me anything...(Shift + Enter = line break)',
|
||||||
placeholder: 'Ask me anything...(Shift + Enter = line break, "/" to trigger prompts)',
|
|
||||||
placeholderMobile: 'Ask me anything...',
|
placeholderMobile: 'Ask me anything...',
|
||||||
copy: 'Copy',
|
copy: 'Copy',
|
||||||
copied: 'Copied',
|
copied: 'Copied',
|
||||||
@@ -59,8 +58,6 @@ export default {
|
|||||||
name: 'Name',
|
name: 'Name',
|
||||||
description: 'Description',
|
description: 'Description',
|
||||||
role: 'Role',
|
role: 'Role',
|
||||||
temperature: 'Temperature',
|
|
||||||
top_p: 'Top_p',
|
|
||||||
resetUserInfo: 'Reset UserInfo',
|
resetUserInfo: 'Reset UserInfo',
|
||||||
chatHistory: 'ChatHistory',
|
chatHistory: 'ChatHistory',
|
||||||
theme: 'Theme',
|
theme: 'Theme',
|
||||||
@@ -71,10 +68,8 @@ export default {
|
|||||||
socks: 'Socks',
|
socks: 'Socks',
|
||||||
httpsProxy: 'HTTPS Proxy',
|
httpsProxy: 'HTTPS Proxy',
|
||||||
balance: 'API Balance',
|
balance: 'API Balance',
|
||||||
monthlyUsage: 'Monthly Usage',
|
|
||||||
},
|
},
|
||||||
store: {
|
store: {
|
||||||
siderButton: 'Prompt Store',
|
|
||||||
local: 'Local',
|
local: 'Local',
|
||||||
online: 'Online',
|
online: 'Online',
|
||||||
title: 'Title',
|
title: 'Title',
|
||||||
@@ -1,10 +1,8 @@
|
|||||||
import type { App } from 'vue'
|
import type { App } from 'vue'
|
||||||
import { createI18n } from 'vue-i18n'
|
import { createI18n } from 'vue-i18n'
|
||||||
import enUS from './en-US'
|
import enUS from './en-US'
|
||||||
import koKR from './ko-KR'
|
|
||||||
import zhCN from './zh-CN'
|
import zhCN from './zh-CN'
|
||||||
import zhTW from './zh-TW'
|
import zhTW from './zh-TW'
|
||||||
import ruRU from './ru-RU'
|
|
||||||
import { useAppStoreWithOut } from '@/store/modules/app'
|
import { useAppStoreWithOut } from '@/store/modules/app'
|
||||||
import type { Language } from '@/store/modules/app/helper'
|
import type { Language } from '@/store/modules/app/helper'
|
||||||
|
|
||||||
@@ -18,10 +16,8 @@ const i18n = createI18n({
|
|||||||
allowComposition: true,
|
allowComposition: true,
|
||||||
messages: {
|
messages: {
|
||||||
'en-US': enUS,
|
'en-US': enUS,
|
||||||
'ko-KR': koKR,
|
|
||||||
'zh-CN': zhCN,
|
'zh-CN': zhCN,
|
||||||
'zh-TW': zhTW,
|
'zh-TW': zhTW,
|
||||||
'ru-RU': ruRU,
|
|
||||||
},
|
},
|
||||||
})
|
})
|
||||||
|
|
||||||
@@ -24,12 +24,11 @@ export default {
|
|||||||
wrong: '好像出错了,请稍后再试。',
|
wrong: '好像出错了,请稍后再试。',
|
||||||
success: '操作成功',
|
success: '操作成功',
|
||||||
failed: '操作失败',
|
failed: '操作失败',
|
||||||
verify: '验证',
|
verify: '登录',
|
||||||
unauthorizedTips: '未经授权,请先进行验证。',
|
unauthorizedTips: '未经授权,请先进行验证。',
|
||||||
},
|
},
|
||||||
chat: {
|
chat: {
|
||||||
newChatButton: '新建聊天',
|
placeholder: '来说点什么吧...(Shift + Enter = 换行)',
|
||||||
placeholder: '来说点什么吧...(Shift + Enter = 换行,"/" 触发提示词)',
|
|
||||||
placeholderMobile: '来说点什么...',
|
placeholderMobile: '来说点什么...',
|
||||||
copy: '复制',
|
copy: '复制',
|
||||||
copied: '复制成功',
|
copied: '复制成功',
|
||||||
@@ -59,8 +58,6 @@ export default {
|
|||||||
name: '名称',
|
name: '名称',
|
||||||
description: '描述',
|
description: '描述',
|
||||||
role: '角色设定',
|
role: '角色设定',
|
||||||
temperature: 'Temperature',
|
|
||||||
top_p: 'Top_p',
|
|
||||||
resetUserInfo: '重置用户信息',
|
resetUserInfo: '重置用户信息',
|
||||||
chatHistory: '聊天记录',
|
chatHistory: '聊天记录',
|
||||||
theme: '主题',
|
theme: '主题',
|
||||||
@@ -71,10 +68,8 @@ export default {
|
|||||||
socks: 'Socks',
|
socks: 'Socks',
|
||||||
httpsProxy: 'HTTPS Proxy',
|
httpsProxy: 'HTTPS Proxy',
|
||||||
balance: 'API余额',
|
balance: 'API余额',
|
||||||
monthlyUsage: '本月使用量',
|
|
||||||
},
|
},
|
||||||
store: {
|
store: {
|
||||||
siderButton: '提示词商店',
|
|
||||||
local: '本地',
|
local: '本地',
|
||||||
online: '在线',
|
online: '在线',
|
||||||
title: '标题',
|
title: '标题',
|
||||||
@@ -28,8 +28,7 @@ export default {
|
|||||||
unauthorizedTips: '未經授權,請先進行驗證。',
|
unauthorizedTips: '未經授權,請先進行驗證。',
|
||||||
},
|
},
|
||||||
chat: {
|
chat: {
|
||||||
newChatButton: '新增對話',
|
placeholder: '來說點什麼...(Shift + Enter = 換行)',
|
||||||
placeholder: '來說點什麼...(Shift + Enter = 換行,"/" 觸發提示詞)',
|
|
||||||
placeholderMobile: '來說點什麼...',
|
placeholderMobile: '來說點什麼...',
|
||||||
copy: '複製',
|
copy: '複製',
|
||||||
copied: '複製成功',
|
copied: '複製成功',
|
||||||
@@ -53,14 +52,12 @@ export default {
|
|||||||
setting: {
|
setting: {
|
||||||
setting: '設定',
|
setting: '設定',
|
||||||
general: '總覽',
|
general: '總覽',
|
||||||
advanced: '進階',
|
advanced: '高級',
|
||||||
config: '設定',
|
config: '設定',
|
||||||
avatarLink: '頭貼連結',
|
avatarLink: '頭貼連結',
|
||||||
name: '名稱',
|
name: '名稱',
|
||||||
description: '描述',
|
description: '描述',
|
||||||
role: '角色設定',
|
role: '角色設定',
|
||||||
temperature: 'Temperature',
|
|
||||||
top_p: 'Top_p',
|
|
||||||
resetUserInfo: '重設使用者資訊',
|
resetUserInfo: '重設使用者資訊',
|
||||||
chatHistory: '紀錄',
|
chatHistory: '紀錄',
|
||||||
theme: '主題',
|
theme: '主題',
|
||||||
@@ -70,11 +67,9 @@ export default {
|
|||||||
timeout: '逾時',
|
timeout: '逾時',
|
||||||
socks: 'Socks',
|
socks: 'Socks',
|
||||||
httpsProxy: 'HTTPS Proxy',
|
httpsProxy: 'HTTPS Proxy',
|
||||||
balance: 'API Credit 餘額',
|
balance: 'API余額',
|
||||||
monthlyUsage: '本月使用量',
|
|
||||||
},
|
},
|
||||||
store: {
|
store: {
|
||||||
siderButton: '提示詞商店',
|
|
||||||
local: '本機',
|
local: '本機',
|
||||||
online: '線上',
|
online: '線上',
|
||||||
title: '標題',
|
title: '標題',
|
||||||
30
ai-chat-web/ai-chat-web/src/router/permission.ts
Normal file
@@ -0,0 +1,30 @@
|
|||||||
|
import type { Router } from 'vue-router'
|
||||||
|
import { useAuthStoreWithout } from '@/store/modules/auth'
|
||||||
|
|
||||||
|
export function setupPageGuard(router: Router) {
|
||||||
|
router.beforeEach(async (to, from, next) => {
|
||||||
|
const authStore = useAuthStoreWithout()
|
||||||
|
if (!authStore.session) {
|
||||||
|
// try {
|
||||||
|
// const data = await authStore.getSession()
|
||||||
|
// if (String(data.auth) === 'false' && authStore.token)
|
||||||
|
// authStore.removeToken()
|
||||||
|
// if (to.path === '/500')
|
||||||
|
// next({ name: 'Root' })
|
||||||
|
// else
|
||||||
|
// next()
|
||||||
|
// }
|
||||||
|
// catch (error) {
|
||||||
|
// if (to.path !== '/500')
|
||||||
|
// next({ name: '500' })
|
||||||
|
// else
|
||||||
|
// next()
|
||||||
|
// }
|
||||||
|
|
||||||
|
next()
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
next()
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||