ChatGPT-Next-Web/app/constant.ts

571 lines
14 KiB
TypeScript

export const OWNER = 'ChatGPTNextWeb';
export const REPO = 'ChatGPT-Next-Web';
export const REPO_URL = `https://github.com/${OWNER}/${REPO}`;
export const PLUGINS_REPO_URL = `https://github.com/${OWNER}/NextChat-Awesome-Plugins`;
export const ISSUE_URL = `https://github.com/${OWNER}/${REPO}/issues`;
export const UPDATE_URL = `${REPO_URL}#keep-updated`;
export const RELEASE_URL = `${REPO_URL}/releases`;
export const FETCH_COMMIT_URL = `https://api.github.com/repos/${OWNER}/${REPO}/commits?per_page=1`;
export const FETCH_TAG_URL = `https://api.github.com/repos/${OWNER}/${REPO}/tags?per_page=1`;
export const RUNTIME_CONFIG_DOM = 'danger-runtime-config';
export const STABILITY_BASE_URL = 'https://api.stability.ai';
export const OPENAI_BASE_URL = 'https://api.openai.com';
export const ANTHROPIC_BASE_URL = 'https://api.anthropic.com';
export const GEMINI_BASE_URL = 'https://generativelanguage.googleapis.com/';
export const BAIDU_BASE_URL = 'https://aip.baidubce.com';
export const BAIDU_OATUH_URL = `${BAIDU_BASE_URL}/oauth/2.0/token`;
export const BYTEDANCE_BASE_URL = 'https://ark.cn-beijing.volces.com';
export const ALIBABA_BASE_URL = 'https://dashscope.aliyuncs.com/api/';
export const TENCENT_BASE_URL = 'https://hunyuan.tencentcloudapi.com';
export const MOONSHOT_BASE_URL = 'https://api.moonshot.cn';
export const IFLYTEK_BASE_URL = 'https://spark-api-open.xf-yun.com';
export const XAI_BASE_URL = 'https://api.x.ai';
export const CHATGLM_BASE_URL = 'https://open.bigmodel.cn';
export const CACHE_URL_PREFIX = '/api/cache';
export const UPLOAD_URL = `${CACHE_URL_PREFIX}/upload`;
export enum Path {
Home = '/',
Chat = '/chat',
Settings = '/settings',
NewChat = '/new-chat',
Masks = '/masks',
Plugins = '/plugins',
Auth = '/auth',
Sd = '/sd',
SdNew = '/sd-new',
Artifacts = '/artifacts',
SearchChat = '/search-chat',
}
export enum ApiPath {
Cors = '',
Azure = '/api/azure',
OpenAI = '/api/openai',
Anthropic = '/api/anthropic',
Google = '/api/google',
Baidu = '/api/baidu',
ByteDance = '/api/bytedance',
Alibaba = '/api/alibaba',
Tencent = '/api/tencent',
Moonshot = '/api/moonshot',
Iflytek = '/api/iflytek',
Stability = '/api/stability',
Artifacts = '/api/artifacts',
XAI = '/api/xai',
ChatGLM = '/api/chatglm',
}
export enum SlotID {
AppBody = 'app-body',
CustomModel = 'custom-model',
}
export enum FileName {
Masks = 'masks.json',
Prompts = 'prompts.json',
}
export enum StoreKey {
Chat = 'chat-next-web-store',
Plugin = 'chat-next-web-plugin',
Access = 'access-control',
Config = 'app-config',
Mask = 'mask-store',
Prompt = 'prompt-store',
Update = 'chat-update',
Sync = 'sync',
SdList = 'sd-list',
}
export const DEFAULT_SIDEBAR_WIDTH = 300;
export const MAX_SIDEBAR_WIDTH = 500;
export const MIN_SIDEBAR_WIDTH = 230;
export const NARROW_SIDEBAR_WIDTH = 100;
export const ACCESS_CODE_PREFIX = 'nk-';
export const LAST_INPUT_KEY = 'last-input';
export const UNFINISHED_INPUT = (id: string) => `unfinished-input-${id}`;
export const STORAGE_KEY = 'chatgpt-next-web';
export const REQUEST_TIMEOUT_MS = 60000;
export const EXPORT_MESSAGE_CLASS_NAME = 'export-markdown';
export enum ServiceProvider {
OpenAI = 'OpenAI',
Azure = 'Azure',
Google = 'Google',
Anthropic = 'Anthropic',
Baidu = 'Baidu',
ByteDance = 'ByteDance',
Alibaba = 'Alibaba',
Tencent = 'Tencent',
Moonshot = 'Moonshot',
Stability = 'Stability',
Iflytek = 'Iflytek',
XAI = 'XAI',
ChatGLM = 'ChatGLM',
}
// Google API safety settings, see https://ai.google.dev/gemini-api/docs/safety-settings
// BLOCK_NONE will not block any content, and BLOCK_ONLY_HIGH will block only high-risk content.
export enum GoogleSafetySettingsThreshold {
BLOCK_NONE = 'BLOCK_NONE',
BLOCK_ONLY_HIGH = 'BLOCK_ONLY_HIGH',
BLOCK_MEDIUM_AND_ABOVE = 'BLOCK_MEDIUM_AND_ABOVE',
BLOCK_LOW_AND_ABOVE = 'BLOCK_LOW_AND_ABOVE',
}
export enum ModelProvider {
Stability = 'Stability',
GPT = 'GPT',
GeminiPro = 'GeminiPro',
Claude = 'Claude',
Ernie = 'Ernie',
Doubao = 'Doubao',
Qwen = 'Qwen',
Hunyuan = 'Hunyuan',
Moonshot = 'Moonshot',
Iflytek = 'Iflytek',
XAI = 'XAI',
ChatGLM = 'ChatGLM',
}
export const Stability = {
GeneratePath: 'v2beta/stable-image/generate',
ExampleEndpoint: 'https://api.stability.ai',
};
export const Anthropic = {
ChatPath: 'v1/messages',
ChatPath1: 'v1/complete',
ExampleEndpoint: 'https://api.anthropic.com',
Vision: '2023-06-01',
};
export const OpenaiPath = {
ChatPath: 'v1/chat/completions',
SpeechPath: 'v1/audio/speech',
ImagePath: 'v1/images/generations',
UsagePath: 'dashboard/billing/usage',
SubsPath: 'dashboard/billing/subscription',
ListModelPath: 'v1/models',
};
export const Azure = {
ChatPath: (deployName: string, apiVersion: string) =>
`deployments/${deployName}/chat/completions?api-version=${apiVersion}`,
// https://<your_resource_name>.openai.azure.com/openai/deployments/<your_deployment_name>/images/generations?api-version=<api_version>
ImagePath: (deployName: string, apiVersion: string) =>
`deployments/${deployName}/images/generations?api-version=${apiVersion}`,
ExampleEndpoint: 'https://{resource-url}/openai',
};
export const Google = {
ExampleEndpoint: 'https://generativelanguage.googleapis.com/',
ChatPath: (modelName: string) =>
`v1beta/models/${modelName}:streamGenerateContent`,
};
export const Baidu = {
ExampleEndpoint: BAIDU_BASE_URL,
ChatPath: (modelName: string) => {
let endpoint = modelName;
if (modelName === 'ernie-4.0-8k') {
endpoint = 'completions_pro';
}
if (modelName === 'ernie-4.0-8k-preview-0518') {
endpoint = 'completions_adv_pro';
}
if (modelName === 'ernie-3.5-8k') {
endpoint = 'completions';
}
if (modelName === 'ernie-speed-8k') {
endpoint = 'ernie_speed';
}
return `rpc/2.0/ai_custom/v1/wenxinworkshop/chat/${endpoint}`;
},
};
export const ByteDance = {
ExampleEndpoint: 'https://ark.cn-beijing.volces.com/api/',
ChatPath: 'api/v3/chat/completions',
};
export const Alibaba = {
ExampleEndpoint: ALIBABA_BASE_URL,
ChatPath: 'v1/services/aigc/text-generation/generation',
};
export const Tencent = {
ExampleEndpoint: TENCENT_BASE_URL,
};
export const Moonshot = {
ExampleEndpoint: MOONSHOT_BASE_URL,
ChatPath: 'v1/chat/completions',
};
export const Iflytek = {
ExampleEndpoint: IFLYTEK_BASE_URL,
ChatPath: 'v1/chat/completions',
};
export const XAI = {
ExampleEndpoint: XAI_BASE_URL,
ChatPath: 'v1/chat/completions',
};
export const ChatGLM = {
ExampleEndpoint: CHATGLM_BASE_URL,
ChatPath: 'api/paas/v4/chat/completions',
};
export const DEFAULT_INPUT_TEMPLATE = `{{input}}`; // input / time / model / lang
// export const DEFAULT_SYSTEM_TEMPLATE = `
// You are ChatGPT, a large language model trained by {{ServiceProvider}}.
// Knowledge cutoff: {{cutoff}}
// Current model: {{model}}
// Current time: {{time}}
// Latex inline: $x^2$
// Latex block: $$e=mc^2$$
// `;
export const DEFAULT_SYSTEM_TEMPLATE = `
You are ChatGPT, a large language model trained by {{ServiceProvider}}.
Knowledge cutoff: {{cutoff}}
Current model: {{model}}
Current time: {{time}}
Latex inline: \\(x^2\\)
Latex block: $$e=mc^2$$
`;
export const SUMMARIZE_MODEL = 'gpt-4o-mini';
export const GEMINI_SUMMARIZE_MODEL = 'gemini-pro';
export const KnowledgeCutOffDate: Record<string, string> = {
'default': '2021-09',
'gpt-4-turbo': '2023-12',
'gpt-4-turbo-2024-04-09': '2023-12',
'gpt-4-turbo-preview': '2023-12',
'gpt-4o': '2023-10',
'gpt-4o-2024-05-13': '2023-10',
'gpt-4o-2024-08-06': '2023-10',
'gpt-4o-2024-11-20': '2023-10',
'chatgpt-4o-latest': '2023-10',
'gpt-4o-mini': '2023-10',
'gpt-4o-mini-2024-07-18': '2023-10',
'gpt-4-vision-preview': '2023-04',
'o1-mini': '2023-10',
'o1-preview': '2023-10',
// After improvements,
// it's now easier to add "KnowledgeCutOffDate" instead of stupid hardcoding it, as was done previously.
'gemini-pro': '2023-12',
'gemini-pro-vision': '2023-12',
};
export const DEFAULT_TTS_ENGINE = 'OpenAI-TTS';
export const DEFAULT_TTS_ENGINES = ['OpenAI-TTS', 'Edge-TTS'];
export const DEFAULT_TTS_MODEL = 'tts-1';
export const DEFAULT_TTS_VOICE = 'alloy';
export const DEFAULT_TTS_MODELS = ['tts-1', 'tts-1-hd'];
export const DEFAULT_TTS_VOICES = [
'alloy',
'echo',
'fable',
'onyx',
'nova',
'shimmer',
];
const openaiModels = [
'gpt-3.5-turbo',
'gpt-3.5-turbo-1106',
'gpt-3.5-turbo-0125',
'gpt-4',
'gpt-4-0613',
'gpt-4-32k',
'gpt-4-32k-0613',
'gpt-4-turbo',
'gpt-4-turbo-preview',
'gpt-4o',
'gpt-4o-2024-05-13',
'gpt-4o-2024-08-06',
'gpt-4o-2024-11-20',
'chatgpt-4o-latest',
'gpt-4o-mini',
'gpt-4o-mini-2024-07-18',
'gpt-4-vision-preview',
'gpt-4-turbo-2024-04-09',
'gpt-4-1106-preview',
'dall-e-3',
'o1-mini',
'o1-preview',
];
const googleModels = [
'gemini-1.0-pro',
'gemini-1.5-pro-latest',
'gemini-1.5-flash-latest',
'gemini-exp-1114',
'gemini-exp-1121',
'learnlm-1.5-pro-experimental',
'gemini-pro-vision',
];
const anthropicModels = [
'claude-instant-1.2',
'claude-2.0',
'claude-2.1',
'claude-3-sonnet-20240229',
'claude-3-opus-20240229',
'claude-3-opus-latest',
'claude-3-haiku-20240307',
'claude-3-5-haiku-20241022',
'claude-3-5-haiku-latest',
'claude-3-5-sonnet-20240620',
'claude-3-5-sonnet-20241022',
'claude-3-5-sonnet-latest',
];
const baiduModels = [
'ernie-4.0-turbo-8k',
'ernie-4.0-8k',
'ernie-4.0-8k-preview',
'ernie-4.0-8k-preview-0518',
'ernie-4.0-8k-latest',
'ernie-3.5-8k',
'ernie-3.5-8k-0205',
'ernie-speed-128k',
'ernie-speed-8k',
'ernie-lite-8k',
'ernie-tiny-8k',
];
const bytedanceModels = [
'Doubao-lite-4k',
'Doubao-lite-32k',
'Doubao-lite-128k',
'Doubao-pro-4k',
'Doubao-pro-32k',
'Doubao-pro-128k',
];
const alibabaModes = [
'qwen-turbo',
'qwen-plus',
'qwen-max',
'qwen-max-0428',
'qwen-max-0403',
'qwen-max-0107',
'qwen-max-longcontext',
];
const tencentModels = [
'hunyuan-pro',
'hunyuan-standard',
'hunyuan-lite',
'hunyuan-role',
'hunyuan-functioncall',
'hunyuan-code',
'hunyuan-vision',
];
const moonshotModes = ['moonshot-v1-8k', 'moonshot-v1-32k', 'moonshot-v1-128k'];
const iflytekModels = [
'general',
'generalv3',
'pro-128k',
'generalv3.5',
'4.0Ultra',
];
const xAIModes = ['grok-beta'];
const chatglmModels = [
'glm-4-plus',
'glm-4-0520',
'glm-4',
'glm-4-air',
'glm-4-airx',
'glm-4-long',
'glm-4-flashx',
'glm-4-flash',
];
let seq = 1000; // 内置的模型序号生成器从1000开始
export const DEFAULT_MODELS = [
...openaiModels.map(name => ({
name,
available: true,
sorted: seq++, // Global sequence sort(index)
provider: {
id: 'openai',
providerName: 'OpenAI',
providerType: 'openai',
sorted: 1, // 这里是固定的,确保顺序与之前内置的版本一致
},
})),
...openaiModels.map(name => ({
name,
available: true,
sorted: seq++,
provider: {
id: 'azure',
providerName: 'Azure',
providerType: 'azure',
sorted: 2,
},
})),
...googleModels.map(name => ({
name,
available: true,
sorted: seq++,
provider: {
id: 'google',
providerName: 'Google',
providerType: 'google',
sorted: 3,
},
})),
...anthropicModels.map(name => ({
name,
available: true,
sorted: seq++,
provider: {
id: 'anthropic',
providerName: 'Anthropic',
providerType: 'anthropic',
sorted: 4,
},
})),
...baiduModels.map(name => ({
name,
available: true,
sorted: seq++,
provider: {
id: 'baidu',
providerName: 'Baidu',
providerType: 'baidu',
sorted: 5,
},
})),
...bytedanceModels.map(name => ({
name,
available: true,
sorted: seq++,
provider: {
id: 'bytedance',
providerName: 'ByteDance',
providerType: 'bytedance',
sorted: 6,
},
})),
...alibabaModes.map(name => ({
name,
available: true,
sorted: seq++,
provider: {
id: 'alibaba',
providerName: 'Alibaba',
providerType: 'alibaba',
sorted: 7,
},
})),
...tencentModels.map(name => ({
name,
available: true,
sorted: seq++,
provider: {
id: 'tencent',
providerName: 'Tencent',
providerType: 'tencent',
sorted: 8,
},
})),
...moonshotModes.map(name => ({
name,
available: true,
sorted: seq++,
provider: {
id: 'moonshot',
providerName: 'Moonshot',
providerType: 'moonshot',
sorted: 9,
},
})),
...iflytekModels.map(name => ({
name,
available: true,
sorted: seq++,
provider: {
id: 'iflytek',
providerName: 'Iflytek',
providerType: 'iflytek',
sorted: 10,
},
})),
...xAIModes.map(name => ({
name,
available: true,
sorted: seq++,
provider: {
id: 'xai',
providerName: 'XAI',
providerType: 'xai',
sorted: 11,
},
})),
...chatglmModels.map(name => ({
name,
available: true,
sorted: seq++,
provider: {
id: 'chatglm',
providerName: 'ChatGLM',
providerType: 'chatglm',
sorted: 12,
},
})),
] as const;
export const CHAT_PAGE_SIZE = 15;
export const MAX_RENDER_MSG_COUNT = 45;
// some famous webdav endpoints
export const internalAllowedWebDavEndpoints = [
'https://dav.jianguoyun.com/dav/',
'https://dav.dropdav.com/',
'https://dav.box.com/dav',
'https://nanao.teracloud.jp/dav/',
'https://bora.teracloud.jp/dav/',
'https://webdav.4shared.com/',
'https://dav.idrivesync.com',
'https://webdav.yandex.com',
'https://app.koofr.net/dav/Koofr',
];
export const DEFAULT_GA_ID = 'G-89WN60ZK2E';
export const PLUGINS = [
{ name: 'Plugins', path: Path.Plugins },
{ name: 'Stable Diffusion', path: Path.Sd },
{ name: 'Search Chat', path: Path.SearchChat },
];
export const SAAS_CHAT_URL = 'https://nextchat.dev/chat';
export const SAAS_CHAT_UTM_URL = 'https://nextchat.dev/chat?utm=github';