571 lines
14 KiB
TypeScript
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';
|