mirror of
https://github.com/ChatGPTNextWeb/ChatGPT-Next-Web.git
synced 2025-10-03 16:46:40 +08:00
commit
77b5b4951f
41
.github/workflows/dockerToHub-dev.yml
vendored
41
.github/workflows/dockerToHub-dev.yml
vendored
@ -48,15 +48,16 @@ jobs:
|
|||||||
- name: Sync repository to tx
|
- name: Sync repository to tx
|
||||||
run: |
|
run: |
|
||||||
yes | docker image prune
|
yes | docker image prune
|
||||||
ssh -o StrictHostKeyChecking=no root@tx.xiaosi.cc 'mkdir -p /data/test/ChatGPT-Next-Web'
|
ssh -o StrictHostKeyChecking=no -p${{ secrets.SSH_PORT }} root@${{ secrets.TX_SSH_IP }} 'mkdir -p /data/test/ChatGPT-Next-Web'
|
||||||
rsync -az -e 'ssh -o StrictHostKeyChecking=no' --delete $GITHUB_WORKSPACE/ root@tx.xiaosi.cc:/data/test/ChatGPT-Next-Web
|
rsync -az -e 'ssh -o StrictHostKeyChecking=no -p${{ secrets.SSH_PORT }}' --delete $GITHUB_WORKSPACE/ root@tx.xiaosi.cc:/data/test/ChatGPT-Next-Web
|
||||||
- name: deploy-to-tx
|
- name: deploy-to-tx
|
||||||
uses: appleboy/ssh-action@master
|
uses: appleboy/ssh-action@master
|
||||||
env:
|
env:
|
||||||
SERVER_WORKDIR: ${{ secrets.SERVER_WORKDIR }} #传递工作目录变量
|
SERVER_WORKDIR: ${{ secrets.SERVER_WORKDIR }} #传递工作目录变量
|
||||||
with:
|
with:
|
||||||
host: tx.xiaosi.cc #服务器地址
|
host: ${{ secrets.TX_SSH_IP }} #服务器地址
|
||||||
username: root #用户名
|
username: root #用户名
|
||||||
|
port: ${{ secrets.SSH_PORT }}
|
||||||
key: ${{ secrets.SSH_PRIVATE_KEY }} #私钥 安全问题一定都以变量的方式传递!!!
|
key: ${{ secrets.SSH_PRIVATE_KEY }} #私钥 安全问题一定都以变量的方式传递!!!
|
||||||
envs: SERVER_WORKDIR,ALY_DOCKER_PASSWORD,ALY_DOCKER_USERNAME,DOCKER_ENV #使用工作目录变量
|
envs: SERVER_WORKDIR,ALY_DOCKER_PASSWORD,ALY_DOCKER_USERNAME,DOCKER_ENV #使用工作目录变量
|
||||||
script: |
|
script: |
|
||||||
@ -68,7 +69,41 @@ jobs:
|
|||||||
echo ${{ secrets.ALY_DOCKER_PASSWORD }} | docker login registry.cn-hangzhou.aliyuncs.com -u ${{ secrets.ALY_DOCKER_USERNAME }} --password-stdin
|
echo ${{ secrets.ALY_DOCKER_PASSWORD }} | docker login registry.cn-hangzhou.aliyuncs.com -u ${{ secrets.ALY_DOCKER_USERNAME }} --password-stdin
|
||||||
sed -i 's|23000:|23001:|g' docker-compose.yml
|
sed -i 's|23000:|23001:|g' docker-compose.yml
|
||||||
sed -i 's|container_name:|#container_name:|g' docker-compose.yml
|
sed -i 's|container_name:|#container_name:|g' docker-compose.yml
|
||||||
|
docker network ls | grep -qw chatgpt-ns || docker network create chatgpt-ns
|
||||||
docker-compose pull && docker-compose up -d
|
docker-compose pull && docker-compose up -d
|
||||||
yes | docker image prune
|
yes | docker image prune
|
||||||
rm -rf /www/server/nginx/proxy_cache_dir/*
|
rm -rf /www/server/nginx/proxy_cache_dir/*
|
||||||
rm -rf /www/server/nginx/proxy_temp_dir/*
|
rm -rf /www/server/nginx/proxy_temp_dir/*
|
||||||
|
|
||||||
|
|
||||||
|
- name: Sync repository to xy-nm
|
||||||
|
run: |
|
||||||
|
yes | docker image prune
|
||||||
|
ssh -o StrictHostKeyChecking=no -p${{ secrets.SSH_PORT }} root@${{ secrets.NM_SSH_IP }} 'mkdir -p /data/test/ChatGPT-Next-Web'
|
||||||
|
rsync -az -e 'ssh -o StrictHostKeyChecking=no -p${{ secrets.SSH_PORT }}' --delete $GITHUB_WORKSPACE/ root@xy-nm.xiaosi.cc:/data/test/ChatGPT-Next-Web
|
||||||
|
- name: deploy-to-xy-nm
|
||||||
|
uses: appleboy/ssh-action@master
|
||||||
|
env:
|
||||||
|
SERVER_WORKDIR: ${{ secrets.SERVER_WORKDIR }} #传递工作目录变量
|
||||||
|
with:
|
||||||
|
host: ${{ secrets.NM_SSH_IP }} #服务器地址
|
||||||
|
username: root #用户名
|
||||||
|
port: ${{ secrets.SSH_PORT }}
|
||||||
|
key: ${{ secrets.SSH_PRIVATE_KEY }} #私钥 安全问题一定都以变量的方式传递!!!
|
||||||
|
envs: SERVER_WORKDIR,ALY_DOCKER_PASSWORD,ALY_DOCKER_USERNAME,DOCKER_ENV #使用工作目录变量
|
||||||
|
script: |
|
||||||
|
cd /data/test/ChatGPT-Next-Web
|
||||||
|
echo "${{ secrets.DOCKER_ENV }}" > .env
|
||||||
|
# 测试分支,
|
||||||
|
echo "COMPOSE_PROJECT_NAME=test-chatgpt-web" >> .env
|
||||||
|
sed -i 's@image: registry.cn-hangzhou.aliyuncs.com/si-private/chatgpt-next-web@image: registry.cn-hangzhou.aliyuncs.com/si-private/chatgpt-next-web:test@g' docker-compose.yml
|
||||||
|
echo ${{ secrets.ALY_DOCKER_PASSWORD }} | docker login registry.cn-hangzhou.aliyuncs.com -u ${{ secrets.ALY_DOCKER_USERNAME }} --password-stdin
|
||||||
|
sed -i 's|23000:|23001:|g' docker-compose.yml
|
||||||
|
sed -i 's|container_name:|#container_name:|g' docker-compose.yml
|
||||||
|
docker network ls | grep -qw chatgpt-ns || docker network create chatgpt-ns
|
||||||
|
docker-compose pull && docker-compose up -d
|
||||||
|
yes | docker image prune
|
||||||
|
rm -rf /www/server/nginx/proxy_cache_dir/*
|
||||||
|
rm -rf /www/server/nginx/proxy_temp_dir/*
|
||||||
|
|
||||||
|
|
||||||
|
18
.github/workflows/dockerToHub.yml
vendored
18
.github/workflows/dockerToHub.yml
vendored
@ -50,48 +50,52 @@ jobs:
|
|||||||
- name: Sync repository to ty
|
- name: Sync repository to ty
|
||||||
run: |
|
run: |
|
||||||
yes | docker image prune
|
yes | docker image prune
|
||||||
ssh -o StrictHostKeyChecking=no root@ty.xiaosi.cc 'mkdir -p /data/ChatGPT-Next-Web'
|
ssh -o StrictHostKeyChecking=no -p${{ secrets.SSH_PORT }} root@${{ secrets.TY_SSH_IP }} 'mkdir -p /data/ChatGPT-Next-Web'
|
||||||
rsync -az -e 'ssh -o StrictHostKeyChecking=no' --delete $GITHUB_WORKSPACE/ root@ty.xiaosi.cc:/data/ChatGPT-Next-Web/
|
rsync -az -e 'ssh -o StrictHostKeyChecking=no' --delete $GITHUB_WORKSPACE/ root@ty.xiaosi.cc:/data/ChatGPT-Next-Web/
|
||||||
- name: deploy-to-ty
|
- name: deploy-to-ty
|
||||||
uses: appleboy/ssh-action@master
|
uses: appleboy/ssh-action@master
|
||||||
env:
|
env:
|
||||||
SERVER_WORKDIR: ${{ secrets.SERVER_WORKDIR }} #传递工作目录变量
|
SERVER_WORKDIR: ${{ secrets.SERVER_WORKDIR }} #传递工作目录变量
|
||||||
with:
|
with:
|
||||||
host: ty.xiaosi.cc #服务器地址
|
host: ${{ secrets.TY_SSH_IP }} #服务器地址
|
||||||
username: root #用户名
|
username: root #用户名
|
||||||
|
port: ${{ secrets.SSH_PORT }}
|
||||||
key: ${{ secrets.SSH_PRIVATE_KEY }} #私钥 安全问题一定都以变量的方式传递!!!
|
key: ${{ secrets.SSH_PRIVATE_KEY }} #私钥 安全问题一定都以变量的方式传递!!!
|
||||||
envs: SERVER_WORKDIR,ALY_DOCKER_PASSWORD,ALY_DOCKER_USERNAME,DOCKER_ENV #使用工作目录变量
|
envs: SERVER_WORKDIR,ALY_DOCKER_PASSWORD,ALY_DOCKER_USERNAME,DOCKER_ENV #使用工作目录变量
|
||||||
script: |
|
script: |
|
||||||
cd $SERVER_WORKDIR #进入到工作目录
|
cd $SERVER_WORKDIR #进入到工作目录
|
||||||
echo "${{ secrets.DOCKER_ENV }}" > .env
|
echo "${{ secrets.DOCKER_ENV }}" > .env
|
||||||
echo ${{ secrets.ALY_DOCKER_PASSWORD }} | docker login registry.cn-hangzhou.aliyuncs.com -u ${{ secrets.ALY_DOCKER_USERNAME }} --password-stdin
|
echo ${{ secrets.ALY_DOCKER_PASSWORD }} | docker login registry.cn-hangzhou.aliyuncs.com -u ${{ secrets.ALY_DOCKER_USERNAME }} --password-stdin
|
||||||
|
docker network ls | grep -qw chatgpt-ns || docker network create chatgpt-ns
|
||||||
docker-compose pull && docker-compose up -d
|
docker-compose pull && docker-compose up -d
|
||||||
yes | docker image prune
|
yes | docker image prune
|
||||||
rm -rf /www/server/nginx/proxy_cache_dir/*
|
rm -rf /www/server/nginx/proxy_cache_dir/*
|
||||||
rm -rf /www/server/nginx/proxy_temp_dir/*
|
rm -rf /www/server/nginx/proxy_temp_dir/*
|
||||||
sleep 2
|
sleep 2
|
||||||
tccli cdn PurgePathCache --cli-unfold-argument --Paths 'https://chat.xiaosi.cc/' --FlushType delete
|
tccli cdn PurgePathCache --cli-unfold-argument --Paths '${{ secrets.WEB_URL }}' --FlushType delete
|
||||||
- name: Sync repository to tx
|
- name: Sync repository to tx
|
||||||
run: |
|
run: |
|
||||||
yes | docker image prune
|
yes | docker image prune
|
||||||
ssh -o StrictHostKeyChecking=no root@tx.xiaosi.cc 'mkdir -p /data/ChatGPT-Next-Web'
|
ssh -o StrictHostKeyChecking=no -p${{ secrets.SSH_PORT }} root@${{ secrets.TX_SSH_IP }} 'mkdir -p /data/ChatGPT-Next-Web'
|
||||||
rsync -az -e 'ssh -o StrictHostKeyChecking=no' --delete $GITHUB_WORKSPACE/ root@tx.xiaosi.cc:/data/ChatGPT-Next-Web
|
rsync -az -e 'ssh -o StrictHostKeyChecking=no -p${{ secrets.SSH_PORT }}' --delete $GITHUB_WORKSPACE/ root@tx.xiaosi.cc:/data/ChatGPT-Next-Web
|
||||||
- name: deploy-to-tx
|
- name: deploy-to-tx
|
||||||
uses: appleboy/ssh-action@master
|
uses: appleboy/ssh-action@master
|
||||||
env:
|
env:
|
||||||
SERVER_WORKDIR: ${{ secrets.SERVER_WORKDIR }} #传递工作目录变量
|
SERVER_WORKDIR: ${{ secrets.SERVER_WORKDIR }} #传递工作目录变量
|
||||||
with:
|
with:
|
||||||
host: tx.xiaosi.cc #服务器地址
|
host: ${{ secrets.TX_SSH_IP }} #服务器地址
|
||||||
username: root #用户名
|
username: root #用户名
|
||||||
|
port: ${{ secrets.SSH_PORT }}
|
||||||
key: ${{ secrets.SSH_PRIVATE_KEY }} #私钥 安全问题一定都以变量的方式传递!!!
|
key: ${{ secrets.SSH_PRIVATE_KEY }} #私钥 安全问题一定都以变量的方式传递!!!
|
||||||
envs: SERVER_WORKDIR,ALY_DOCKER_PASSWORD,ALY_DOCKER_USERNAME,DOCKER_ENV #使用工作目录变量
|
envs: SERVER_WORKDIR,ALY_DOCKER_PASSWORD,ALY_DOCKER_USERNAME,DOCKER_ENV #使用工作目录变量
|
||||||
script: |
|
script: |
|
||||||
cd $SERVER_WORKDIR #进入到工作目录
|
cd $SERVER_WORKDIR #进入到工作目录
|
||||||
echo "${{ secrets.DOCKER_ENV }}" > .env
|
echo "${{ secrets.DOCKER_ENV }}" > .env
|
||||||
echo ${{ secrets.ALY_DOCKER_PASSWORD }} | docker login registry.cn-hangzhou.aliyuncs.com -u ${{ secrets.ALY_DOCKER_USERNAME }} --password-stdin
|
echo ${{ secrets.ALY_DOCKER_PASSWORD }} | docker login registry.cn-hangzhou.aliyuncs.com -u ${{ secrets.ALY_DOCKER_USERNAME }} --password-stdin
|
||||||
|
docker network ls | grep -qw chatgpt-ns || docker network create chatgpt-ns
|
||||||
docker-compose pull && docker-compose up -d
|
docker-compose pull && docker-compose up -d
|
||||||
yes | docker image prune
|
yes | docker image prune
|
||||||
rm -rf /www/server/nginx/proxy_cache_dir/*
|
rm -rf /www/server/nginx/proxy_cache_dir/*
|
||||||
rm -rf /www/server/nginx/proxy_temp_dir/*
|
rm -rf /www/server/nginx/proxy_temp_dir/*
|
||||||
sleep 2
|
sleep 2
|
||||||
tccli cdn PurgePathCache --cli-unfold-argument --Paths 'https://chat.xiaosi.cc/' --FlushType delete
|
tccli cdn PurgePathCache --cli-unfold-argument --Paths '${{ secrets.WEB_URL }}' --FlushType delete
|
||||||
|
@ -40,6 +40,7 @@ import { EXPORT_MESSAGE_CLASS_NAME, ModelProvider } from "../constant";
|
|||||||
import { getClientConfig } from "../config/client";
|
import { getClientConfig } from "../config/client";
|
||||||
import { ClientApi } from "../client/api";
|
import { ClientApi } from "../client/api";
|
||||||
import { getMessageTextContent } from "../utils";
|
import { getMessageTextContent } from "../utils";
|
||||||
|
import { identifyDefaultClaudeModel } from "../utils/checkers";
|
||||||
|
|
||||||
const Markdown = dynamic(async () => (await import("./markdown")).Markdown, {
|
const Markdown = dynamic(async () => (await import("./markdown")).Markdown, {
|
||||||
loading: () => <LoadingIcon />,
|
loading: () => <LoadingIcon />,
|
||||||
@ -315,7 +316,7 @@ export function PreviewActions(props: {
|
|||||||
var api: ClientApi;
|
var api: ClientApi;
|
||||||
if (config.modelConfig.model.startsWith("gemini")) {
|
if (config.modelConfig.model.startsWith("gemini")) {
|
||||||
api = new ClientApi(ModelProvider.GeminiPro);
|
api = new ClientApi(ModelProvider.GeminiPro);
|
||||||
} else if (config.modelConfig.model.startsWith("claude")) {
|
} else if (identifyDefaultClaudeModel(config.modelConfig.model)) {
|
||||||
api = new ClientApi(ModelProvider.Claude);
|
api = new ClientApi(ModelProvider.Claude);
|
||||||
} else {
|
} else {
|
||||||
api = new ClientApi(ModelProvider.GPT);
|
api = new ClientApi(ModelProvider.GPT);
|
||||||
|
@ -29,6 +29,7 @@ import { AuthPage } from "./auth";
|
|||||||
import { getClientConfig } from "../config/client";
|
import { getClientConfig } from "../config/client";
|
||||||
import { ClientApi } from "../client/api";
|
import { ClientApi } from "../client/api";
|
||||||
import { useAccessStore } from "../store";
|
import { useAccessStore } from "../store";
|
||||||
|
import { identifyDefaultClaudeModel } from "../utils/checkers";
|
||||||
|
|
||||||
export function Loading(props: { noLogo?: boolean }) {
|
export function Loading(props: { noLogo?: boolean }) {
|
||||||
return (
|
return (
|
||||||
@ -176,7 +177,7 @@ export function useLoadData() {
|
|||||||
var api: ClientApi;
|
var api: ClientApi;
|
||||||
if (config.modelConfig.model.startsWith("gemini")) {
|
if (config.modelConfig.model.startsWith("gemini")) {
|
||||||
api = new ClientApi(ModelProvider.GeminiPro);
|
api = new ClientApi(ModelProvider.GeminiPro);
|
||||||
} else if (config.modelConfig.model.startsWith("claude")) {
|
} else if (identifyDefaultClaudeModel(config.modelConfig.model)) {
|
||||||
api = new ClientApi(ModelProvider.Claude);
|
api = new ClientApi(ModelProvider.Claude);
|
||||||
} else {
|
} else {
|
||||||
api = new ClientApi(ModelProvider.GPT);
|
api = new ClientApi(ModelProvider.GPT);
|
||||||
|
@ -280,4 +280,14 @@ export const DISABLE_MODELS = DEFAULT_MODELS.filter(
|
|||||||
export const CHAT_PAGE_SIZE = 15;
|
export const CHAT_PAGE_SIZE = 15;
|
||||||
export const MAX_RENDER_MSG_COUNT = 45;
|
export const MAX_RENDER_MSG_COUNT = 45;
|
||||||
|
|
||||||
export const internalWhiteWebDavEndpoints = [""];
|
// some famous webdav endpoints
|
||||||
|
export const internalWhiteWebDavEndpoints = [
|
||||||
|
"https://dav.jianguoyun.com/dav/",
|
||||||
|
"https://dav.dropdav.com/",
|
||||||
|
"https://dav.box.com/dav",
|
||||||
|
"https://nanao.teracloud.jp/dav/",
|
||||||
|
"https://webdav.4shared.com/",
|
||||||
|
"https://dav.idrivesync.com",
|
||||||
|
"https://webdav.yandex.com",
|
||||||
|
"https://app.koofr.net/dav/Koofr",
|
||||||
|
];
|
||||||
|
@ -39,6 +39,10 @@ export default function RootLayout({
|
|||||||
<html lang="en">
|
<html lang="en">
|
||||||
<head>
|
<head>
|
||||||
<meta name="config" content={JSON.stringify(getClientConfig())} />
|
<meta name="config" content={JSON.stringify(getClientConfig())} />
|
||||||
|
<meta
|
||||||
|
name="viewport"
|
||||||
|
content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no"
|
||||||
|
/>
|
||||||
<link rel="manifest" href="/site.webmanifest"></link>
|
<link rel="manifest" href="/site.webmanifest"></link>
|
||||||
<script src="/serviceWorkerRegister.js" defer></script>
|
<script src="/serviceWorkerRegister.js" defer></script>
|
||||||
</head>
|
</head>
|
||||||
|
@ -26,6 +26,7 @@ import { prettyObject } from "../utils/format";
|
|||||||
import { estimateTokenLength } from "../utils/token";
|
import { estimateTokenLength } from "../utils/token";
|
||||||
import { nanoid } from "nanoid";
|
import { nanoid } from "nanoid";
|
||||||
import { createPersistStore } from "../utils/store";
|
import { createPersistStore } from "../utils/store";
|
||||||
|
import { identifyDefaultClaudeModel } from "../utils/checkers";
|
||||||
|
|
||||||
export type ChatMessage = RequestMessage & {
|
export type ChatMessage = RequestMessage & {
|
||||||
date: string;
|
date: string;
|
||||||
@ -660,7 +661,7 @@ export const useChatStore = createPersistStore(
|
|||||||
var api: ClientApi;
|
var api: ClientApi;
|
||||||
if (modelConfig.model.startsWith("gemini")) {
|
if (modelConfig.model.startsWith("gemini")) {
|
||||||
api = new ClientApi(ModelProvider.GeminiPro);
|
api = new ClientApi(ModelProvider.GeminiPro);
|
||||||
} else if (modelConfig.model.startsWith("claude")) {
|
} else if (identifyDefaultClaudeModel(modelConfig.model)) {
|
||||||
api = new ClientApi(ModelProvider.Claude);
|
api = new ClientApi(ModelProvider.Claude);
|
||||||
} else {
|
} else {
|
||||||
api = new ClientApi(ModelProvider.GPT);
|
api = new ClientApi(ModelProvider.GPT);
|
||||||
@ -847,7 +848,7 @@ export const useChatStore = createPersistStore(
|
|||||||
var api: ClientApi;
|
var api: ClientApi;
|
||||||
if (modelConfig.model.startsWith("gemini")) {
|
if (modelConfig.model.startsWith("gemini")) {
|
||||||
api = new ClientApi(ModelProvider.GeminiPro);
|
api = new ClientApi(ModelProvider.GeminiPro);
|
||||||
} else if (modelConfig.model.startsWith("claude")) {
|
} else if (identifyDefaultClaudeModel(modelConfig.model)) {
|
||||||
api = new ClientApi(ModelProvider.Claude);
|
api = new ClientApi(ModelProvider.Claude);
|
||||||
} else {
|
} else {
|
||||||
api = new ClientApi(ModelProvider.GPT);
|
api = new ClientApi(ModelProvider.GPT);
|
||||||
|
21
app/utils/checkers.ts
Normal file
21
app/utils/checkers.ts
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
import { useAccessStore } from "../store/access";
|
||||||
|
import { useAppConfig } from "../store/config";
|
||||||
|
import { collectModels } from "./model";
|
||||||
|
|
||||||
|
export function identifyDefaultClaudeModel(modelName: string) {
|
||||||
|
const accessStore = useAccessStore.getState();
|
||||||
|
const configStore = useAppConfig.getState();
|
||||||
|
|
||||||
|
const allModals = collectModels(
|
||||||
|
configStore.models,
|
||||||
|
[configStore.customModels, accessStore.customModels].join(","),
|
||||||
|
);
|
||||||
|
|
||||||
|
const modelMeta = allModals.find((m) => m.name === modelName);
|
||||||
|
|
||||||
|
return (
|
||||||
|
modelName.startsWith("claude") &&
|
||||||
|
modelMeta &&
|
||||||
|
modelMeta.provider?.providerType === "anthropic"
|
||||||
|
);
|
||||||
|
}
|
@ -23,6 +23,12 @@ export function collectModelTable(
|
|||||||
};
|
};
|
||||||
});
|
});
|
||||||
|
|
||||||
|
const customProvider = (modelName: string) => ({
|
||||||
|
id: modelName,
|
||||||
|
providerName: "",
|
||||||
|
providerType: "custom",
|
||||||
|
});
|
||||||
|
|
||||||
// server custom models
|
// server custom models
|
||||||
customModels
|
customModels
|
||||||
.split(",")
|
.split(",")
|
||||||
@ -44,7 +50,7 @@ export function collectModelTable(
|
|||||||
displayName: displayName || name,
|
displayName: displayName || name,
|
||||||
available,
|
available,
|
||||||
describe: "",
|
describe: "",
|
||||||
provider: modelTable[name]?.provider, // Use optional chaining
|
provider: modelTable[name]?.provider ?? customProvider(name), // Use optional chaining
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
Loading…
Reference in New Issue
Block a user