diff --git a/.github/workflows/dockerToHub-dev.yml b/.github/workflows/dockerToHub-dev.yml index 852f71a0c..bfbc8021a 100644 --- a/.github/workflows/dockerToHub-dev.yml +++ b/.github/workflows/dockerToHub-dev.yml @@ -48,15 +48,16 @@ jobs: - name: Sync repository to tx run: | yes | docker image prune - ssh -o StrictHostKeyChecking=no root@tx.xiaosi.cc '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 + 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 -p${{ secrets.SSH_PORT }}' --delete $GITHUB_WORKSPACE/ root@tx.xiaosi.cc:/data/test/ChatGPT-Next-Web - name: deploy-to-tx uses: appleboy/ssh-action@master env: SERVER_WORKDIR: ${{ secrets.SERVER_WORKDIR }} #传递工作目录变量 with: - host: tx.xiaosi.cc #服务器地址 + host: ${{ secrets.TX_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: | @@ -68,7 +69,41 @@ jobs: 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/* + + + - 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/* + + diff --git a/.github/workflows/dockerToHub.yml b/.github/workflows/dockerToHub.yml index ba6dba2ea..6cc4a3599 100644 --- a/.github/workflows/dockerToHub.yml +++ b/.github/workflows/dockerToHub.yml @@ -50,48 +50,52 @@ jobs: - name: Sync repository to ty run: | 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/ - name: deploy-to-ty uses: appleboy/ssh-action@master env: SERVER_WORKDIR: ${{ secrets.SERVER_WORKDIR }} #传递工作目录变量 with: - host: ty.xiaosi.cc #服务器地址 + host: ${{ secrets.TY_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 $SERVER_WORKDIR #进入到工作目录 echo "${{ secrets.DOCKER_ENV }}" > .env 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 yes | docker image prune rm -rf /www/server/nginx/proxy_cache_dir/* rm -rf /www/server/nginx/proxy_temp_dir/* 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 run: | yes | docker image prune - ssh -o StrictHostKeyChecking=no root@tx.xiaosi.cc 'mkdir -p /data/ChatGPT-Next-Web' - rsync -az -e 'ssh -o StrictHostKeyChecking=no' --delete $GITHUB_WORKSPACE/ root@tx.xiaosi.cc:/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 -p${{ secrets.SSH_PORT }}' --delete $GITHUB_WORKSPACE/ root@tx.xiaosi.cc:/data/ChatGPT-Next-Web - name: deploy-to-tx uses: appleboy/ssh-action@master env: SERVER_WORKDIR: ${{ secrets.SERVER_WORKDIR }} #传递工作目录变量 with: - host: tx.xiaosi.cc #服务器地址 + host: ${{ secrets.TX_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 $SERVER_WORKDIR #进入到工作目录 echo "${{ secrets.DOCKER_ENV }}" > .env 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 yes | docker image prune rm -rf /www/server/nginx/proxy_cache_dir/* rm -rf /www/server/nginx/proxy_temp_dir/* 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 diff --git a/app/components/exporter.tsx b/app/components/exporter.tsx index f3f085721..20e240d93 100644 --- a/app/components/exporter.tsx +++ b/app/components/exporter.tsx @@ -40,6 +40,7 @@ import { EXPORT_MESSAGE_CLASS_NAME, ModelProvider } from "../constant"; import { getClientConfig } from "../config/client"; import { ClientApi } from "../client/api"; import { getMessageTextContent } from "../utils"; +import { identifyDefaultClaudeModel } from "../utils/checkers"; const Markdown = dynamic(async () => (await import("./markdown")).Markdown, { loading: () => , @@ -315,7 +316,7 @@ export function PreviewActions(props: { var api: ClientApi; if (config.modelConfig.model.startsWith("gemini")) { api = new ClientApi(ModelProvider.GeminiPro); - } else if (config.modelConfig.model.startsWith("claude")) { + } else if (identifyDefaultClaudeModel(config.modelConfig.model)) { api = new ClientApi(ModelProvider.Claude); } else { api = new ClientApi(ModelProvider.GPT); diff --git a/app/components/home.tsx b/app/components/home.tsx index a405bb787..b48408997 100644 --- a/app/components/home.tsx +++ b/app/components/home.tsx @@ -29,6 +29,7 @@ import { AuthPage } from "./auth"; import { getClientConfig } from "../config/client"; import { ClientApi } from "../client/api"; import { useAccessStore } from "../store"; +import { identifyDefaultClaudeModel } from "../utils/checkers"; export function Loading(props: { noLogo?: boolean }) { return ( @@ -176,7 +177,7 @@ export function useLoadData() { var api: ClientApi; if (config.modelConfig.model.startsWith("gemini")) { api = new ClientApi(ModelProvider.GeminiPro); - } else if (config.modelConfig.model.startsWith("claude")) { + } else if (identifyDefaultClaudeModel(config.modelConfig.model)) { api = new ClientApi(ModelProvider.Claude); } else { api = new ClientApi(ModelProvider.GPT); diff --git a/app/constant.ts b/app/constant.ts index d65f8b892..08774c616 100644 --- a/app/constant.ts +++ b/app/constant.ts @@ -280,4 +280,14 @@ export const DISABLE_MODELS = DEFAULT_MODELS.filter( export const CHAT_PAGE_SIZE = 15; 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", +]; diff --git a/app/layout.tsx b/app/layout.tsx index dd9b5d69b..1fe264d84 100644 --- a/app/layout.tsx +++ b/app/layout.tsx @@ -39,6 +39,10 @@ export default function RootLayout({ + diff --git a/app/store/chat.ts b/app/store/chat.ts index e90d48229..92929daf3 100644 --- a/app/store/chat.ts +++ b/app/store/chat.ts @@ -26,6 +26,7 @@ import { prettyObject } from "../utils/format"; import { estimateTokenLength } from "../utils/token"; import { nanoid } from "nanoid"; import { createPersistStore } from "../utils/store"; +import { identifyDefaultClaudeModel } from "../utils/checkers"; export type ChatMessage = RequestMessage & { date: string; @@ -660,7 +661,7 @@ export const useChatStore = createPersistStore( var api: ClientApi; if (modelConfig.model.startsWith("gemini")) { api = new ClientApi(ModelProvider.GeminiPro); - } else if (modelConfig.model.startsWith("claude")) { + } else if (identifyDefaultClaudeModel(modelConfig.model)) { api = new ClientApi(ModelProvider.Claude); } else { api = new ClientApi(ModelProvider.GPT); @@ -847,7 +848,7 @@ export const useChatStore = createPersistStore( var api: ClientApi; if (modelConfig.model.startsWith("gemini")) { api = new ClientApi(ModelProvider.GeminiPro); - } else if (modelConfig.model.startsWith("claude")) { + } else if (identifyDefaultClaudeModel(modelConfig.model)) { api = new ClientApi(ModelProvider.Claude); } else { api = new ClientApi(ModelProvider.GPT); diff --git a/app/utils/checkers.ts b/app/utils/checkers.ts new file mode 100644 index 000000000..4496e1039 --- /dev/null +++ b/app/utils/checkers.ts @@ -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" + ); +} diff --git a/app/utils/model.ts b/app/utils/model.ts index 9d2d81e50..7dc0e23da 100644 --- a/app/utils/model.ts +++ b/app/utils/model.ts @@ -23,6 +23,12 @@ export function collectModelTable( }; }); + const customProvider = (modelName: string) => ({ + id: modelName, + providerName: "", + providerType: "custom", + }); + // server custom models customModels .split(",") @@ -44,7 +50,7 @@ export function collectModelTable( displayName: displayName || name, available, describe: "", - provider: modelTable[name]?.provider, // Use optional chaining + provider: modelTable[name]?.provider ?? customProvider(name), // Use optional chaining }; } });