mirror of
https://github.com/coaidev/coai.git
synced 2025-05-21 14:00:13 +09:00
fix service worker
This commit is contained in:
parent
a22f14a123
commit
47da8009aa
@ -8,7 +8,7 @@ import {
|
|||||||
} from "@/utils/env.ts";
|
} from "@/utils/env.ts";
|
||||||
import { getMemory } from "@/utils/memory.ts";
|
import { getMemory } from "@/utils/memory.ts";
|
||||||
|
|
||||||
export const version = "3.6.9rc";
|
export const version = "3.6.10";
|
||||||
export const dev: boolean = getDev();
|
export const dev: boolean = getDev();
|
||||||
export const deploy: boolean = true;
|
export const deploy: boolean = true;
|
||||||
export let rest_api: string = getRestApi(deploy);
|
export let rest_api: string = getRestApi(deploy);
|
||||||
@ -25,7 +25,7 @@ export const supportModels: Model[] = [
|
|||||||
{ id: "gpt-4-dalle", name: "DALLE3", free: false, auth: true },
|
{ id: "gpt-4-dalle", name: "DALLE3", free: false, auth: true },
|
||||||
|
|
||||||
// anthropic models
|
// anthropic models
|
||||||
{ id: "claude-2", name: "Claude-2", free: true, auth: false },
|
{ id: "claude-2", name: "Claude-2", free: true, auth: true },
|
||||||
{ id: "claude-2-100k", name: "Claude-2-100k", free: false, auth: true },
|
{ id: "claude-2-100k", name: "Claude-2-100k", free: false, auth: true },
|
||||||
|
|
||||||
// spark desk
|
// spark desk
|
||||||
|
@ -19,8 +19,7 @@ const resources = {
|
|||||||
"invalid-token": "Invalid token",
|
"invalid-token": "Invalid token",
|
||||||
"invalid-token-prompt": "Please try again.",
|
"invalid-token-prompt": "Please try again.",
|
||||||
"login-failed": "Login failed",
|
"login-failed": "Login failed",
|
||||||
"login-failed-prompt":
|
"login-failed-prompt": "Login failed! Reason: {{reason}}",
|
||||||
"Login failed! Please check your token expiration and try again.",
|
|
||||||
"login-success": "Login successful",
|
"login-success": "Login successful",
|
||||||
"login-success-prompt": "You have been logged in successfully.",
|
"login-success-prompt": "You have been logged in successfully.",
|
||||||
"server-error": "Server error",
|
"server-error": "Server error",
|
||||||
@ -271,7 +270,7 @@ const resources = {
|
|||||||
"invalid-token": "无效的令牌",
|
"invalid-token": "无效的令牌",
|
||||||
"invalid-token-prompt": "请重试。",
|
"invalid-token-prompt": "请重试。",
|
||||||
"login-failed": "登录失败",
|
"login-failed": "登录失败",
|
||||||
"login-failed-prompt": "登录失败!请检查您的令牌过期时间并重试。",
|
"login-failed-prompt": "登录失败!原因: {{reason}}",
|
||||||
"login-success": "登录成功",
|
"login-success": "登录成功",
|
||||||
"login-success-prompt": "您已成功登录。",
|
"login-success-prompt": "您已成功登录。",
|
||||||
"server-error": "服务器错误",
|
"server-error": "服务器错误",
|
||||||
@ -507,8 +506,7 @@ const resources = {
|
|||||||
"invalid-token": "Неверный токен",
|
"invalid-token": "Неверный токен",
|
||||||
"invalid-token-prompt": "Пожалуйста, попробуйте еще раз.",
|
"invalid-token-prompt": "Пожалуйста, попробуйте еще раз.",
|
||||||
"login-failed": "Ошибка входа",
|
"login-failed": "Ошибка входа",
|
||||||
"login-failed-prompt":
|
"login-failed-prompt": "Ошибка входа! Причина: {{reason}}",
|
||||||
"Ошибка входа! Пожалуйста, проверьте срок действия вашего токена и попробуйте еще раз.",
|
|
||||||
"login-success": "Успешный вход",
|
"login-success": "Успешный вход",
|
||||||
"login-success-prompt": "Вы успешно вошли в систему.",
|
"login-success-prompt": "Вы успешно вошли в систему.",
|
||||||
"server-error": "Ошибка сервера",
|
"server-error": "Ошибка сервера",
|
||||||
|
@ -42,7 +42,7 @@ function Auth() {
|
|||||||
if (!data.status) {
|
if (!data.status) {
|
||||||
toast({
|
toast({
|
||||||
title: t("login-failed"),
|
title: t("login-failed"),
|
||||||
description: t("login-failed-prompt"),
|
description: t("login-failed-prompt", { reason: data.error }),
|
||||||
action: (
|
action: (
|
||||||
<ToastAction altText={t("try-again")} onClick={login}>
|
<ToastAction altText={t("try-again")} onClick={login}>
|
||||||
{t("try-again")}
|
{t("try-again")}
|
||||||
|
@ -2,7 +2,7 @@ import { defineConfig } from 'vite'
|
|||||||
import react from '@vitejs/plugin-react-swc'
|
import react from '@vitejs/plugin-react-swc'
|
||||||
import path from "path"
|
import path from "path"
|
||||||
import { createHtmlPlugin } from 'vite-plugin-html'
|
import { createHtmlPlugin } from 'vite-plugin-html'
|
||||||
import {VitePWA} from "vite-plugin-pwa";
|
import { VitePWA } from "vite-plugin-pwa";
|
||||||
|
|
||||||
// https://vitejs.dev/config/
|
// https://vitejs.dev/config/
|
||||||
export default defineConfig({
|
export default defineConfig({
|
||||||
@ -26,41 +26,6 @@ export default defineConfig({
|
|||||||
}],
|
}],
|
||||||
start_url: "/",
|
start_url: "/",
|
||||||
},
|
},
|
||||||
devOptions: {
|
|
||||||
enabled: true,
|
|
||||||
},
|
|
||||||
workbox: {
|
|
||||||
globPatterns: [
|
|
||||||
// except for sw.js, which is precached by workbox itself
|
|
||||||
'**/*.{js,css,html,png,svg,ico,webp}',
|
|
||||||
],
|
|
||||||
globDirectory: 'dist',
|
|
||||||
swDest: 'dist/sw.js',
|
|
||||||
skipWaiting: true,
|
|
||||||
clientsClaim: true,
|
|
||||||
runtimeCaching: [
|
|
||||||
{
|
|
||||||
urlPattern: /\.(?:png|gif|jpg|jpeg|svg|webp)$/,
|
|
||||||
handler: 'CacheFirst',
|
|
||||||
options: {
|
|
||||||
cacheName: 'images',
|
|
||||||
expiration: {
|
|
||||||
maxEntries: 7200,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}, {
|
|
||||||
urlPattern: new RegExp('^https://open.lightxi.com/'),
|
|
||||||
handler: 'CacheFirst',
|
|
||||||
options: {
|
|
||||||
cacheName: 'lightxi-cdn',
|
|
||||||
expiration: {
|
|
||||||
maxEntries: 7200,
|
|
||||||
maxAgeSeconds: 60 * 60 * 24 * 30,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
],
|
|
||||||
}
|
|
||||||
}),
|
}),
|
||||||
],
|
],
|
||||||
resolve: {
|
resolve: {
|
||||||
|
@ -9,8 +9,7 @@ import (
|
|||||||
// CanEnableModel returns whether the model can be enabled (without subscription)
|
// CanEnableModel returns whether the model can be enabled (without subscription)
|
||||||
func CanEnableModel(db *sql.DB, user *User, model string) bool {
|
func CanEnableModel(db *sql.DB, user *User, model string) bool {
|
||||||
switch model {
|
switch model {
|
||||||
case globals.GPT3Turbo, globals.GPT3TurboInstruct, globals.GPT3Turbo0301, globals.GPT3Turbo0613,
|
case globals.GPT3Turbo, globals.GPT3TurboInstruct, globals.GPT3Turbo0301, globals.GPT3Turbo0613:
|
||||||
globals.Claude2:
|
|
||||||
return true
|
return true
|
||||||
case globals.GPT4, globals.GPT40613, globals.GPT40314:
|
case globals.GPT4, globals.GPT40613, globals.GPT40314:
|
||||||
return user != nil && user.GetQuota(db) >= 5
|
return user != nil && user.GetQuota(db) >= 5
|
||||||
|
24
auth/user.go
24
auth/user.go
@ -4,6 +4,7 @@ import (
|
|||||||
"chat/globals"
|
"chat/globals"
|
||||||
"chat/utils"
|
"chat/utils"
|
||||||
"database/sql"
|
"database/sql"
|
||||||
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
"github.com/dgrijalva/jwt-go"
|
"github.com/dgrijalva/jwt-go"
|
||||||
"github.com/gin-gonic/gin"
|
"github.com/gin-gonic/gin"
|
||||||
@ -63,7 +64,7 @@ func (u *User) Validate(c *gin.Context) bool {
|
|||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
|
|
||||||
func (u *User) GenerateToken() string {
|
func (u *User) GenerateToken() (string, error) {
|
||||||
instance := jwt.NewWithClaims(jwt.SigningMethodHS256, jwt.MapClaims{
|
instance := jwt.NewWithClaims(jwt.SigningMethodHS256, jwt.MapClaims{
|
||||||
"username": u.Username,
|
"username": u.Username,
|
||||||
"password": u.Password,
|
"password": u.Password,
|
||||||
@ -71,9 +72,9 @@ func (u *User) GenerateToken() string {
|
|||||||
})
|
})
|
||||||
token, err := instance.SignedString([]byte(viper.GetString("secret")))
|
token, err := instance.SignedString([]byte(viper.GetString("secret")))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return ""
|
return "", err
|
||||||
}
|
}
|
||||||
return token
|
return token, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (u *User) GetID(db *sql.DB) int64 {
|
func (u *User) GetID(db *sql.DB) int64 {
|
||||||
@ -273,11 +274,11 @@ func ParseApiKey(c *gin.Context, key string) *User {
|
|||||||
return &user
|
return &user
|
||||||
}
|
}
|
||||||
|
|
||||||
func Login(c *gin.Context, token string) (bool, string) {
|
func Login(c *gin.Context, token string) (string, error) {
|
||||||
// DeepTrain Token Validation
|
// DeepTrain Token Validation
|
||||||
user := Validate(token)
|
user := Validate(token)
|
||||||
if user == nil {
|
if user == nil {
|
||||||
return false, ""
|
return "", errors.New("cannot validate access token")
|
||||||
}
|
}
|
||||||
|
|
||||||
db := utils.GetDBFromContext(c)
|
db := utils.GetDBFromContext(c)
|
||||||
@ -290,7 +291,7 @@ func Login(c *gin.Context, token string) (bool, string) {
|
|||||||
Username: user.Username,
|
Username: user.Username,
|
||||||
Password: password,
|
Password: password,
|
||||||
}
|
}
|
||||||
return true, u.GenerateToken()
|
return u.GenerateToken()
|
||||||
}
|
}
|
||||||
|
|
||||||
// login
|
// login
|
||||||
@ -298,13 +299,13 @@ func Login(c *gin.Context, token string) (bool, string) {
|
|||||||
var password string
|
var password string
|
||||||
err := db.QueryRow("SELECT password FROM auth WHERE username = ?", user.Username).Scan(&password)
|
err := db.QueryRow("SELECT password FROM auth WHERE username = ?", user.Username).Scan(&password)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return false, ""
|
return "", err
|
||||||
}
|
}
|
||||||
u := &User{
|
u := &User{
|
||||||
Username: user.Username,
|
Username: user.Username,
|
||||||
Password: password,
|
Password: password,
|
||||||
}
|
}
|
||||||
return true, u.GenerateToken()
|
return u.GenerateToken()
|
||||||
}
|
}
|
||||||
|
|
||||||
func LoginAPI(c *gin.Context) {
|
func LoginAPI(c *gin.Context) {
|
||||||
@ -317,14 +318,15 @@ func LoginAPI(c *gin.Context) {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
state, token := Login(c, form.Token)
|
token, err := Login(c, form.Token)
|
||||||
if !state {
|
if err != nil {
|
||||||
c.JSON(http.StatusOK, gin.H{
|
c.JSON(http.StatusOK, gin.H{
|
||||||
"status": false,
|
"status": false,
|
||||||
"error": "user not found",
|
"error": err.Error(),
|
||||||
})
|
})
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
c.JSON(http.StatusOK, gin.H{
|
c.JSON(http.StatusOK, gin.H{
|
||||||
"status": true,
|
"status": true,
|
||||||
"token": token,
|
"token": token,
|
||||||
|
@ -13,7 +13,7 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
const defaultMessage = "Sorry, I don't understand. Please try again."
|
const defaultMessage = "Sorry, I don't understand. Please try again."
|
||||||
const defaultQuotaMessage = "You don't have enough quota to use this model. please [buy](/buy) or [subscribe](/subscribe) to get more."
|
const defaultQuotaMessage = "You don't have enough quota to use this model. please [buy](/buy) or [subscribe](/subscribe) to get more. (or please check if you are logged in)"
|
||||||
|
|
||||||
func GetErrorQuota(model string) float32 {
|
func GetErrorQuota(model string) float32 {
|
||||||
return utils.Multi[float32](globals.IsGPT4Model(model), -0xe, 0) // special value for error
|
return utils.Multi[float32](globals.IsGPT4Model(model), -0xe, 0) // special value for error
|
||||||
|
@ -27,7 +27,7 @@ func (l *Limiter) RateLimit(ctx *gin.Context, rds *redis.Client, ip string, path
|
|||||||
}
|
}
|
||||||
|
|
||||||
var limits = map[string]Limiter{
|
var limits = map[string]Limiter{
|
||||||
"/login": {Duration: 10, Count: 5},
|
"/login": {Duration: 10, Count: 20},
|
||||||
"/apikey": {Duration: 1, Count: 2},
|
"/apikey": {Duration: 1, Count: 2},
|
||||||
"/package": {Duration: 1, Count: 2},
|
"/package": {Duration: 1, Count: 2},
|
||||||
"/quota": {Duration: 1, Count: 2},
|
"/quota": {Duration: 1, Count: 2},
|
||||||
|
Loading…
Reference in New Issue
Block a user