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 DEEPSEEK_BASE_URL = "https://api.deepseek.com"; export const XAI_BASE_URL = "https://api.x.ai"; export const CHATGLM_BASE_URL = "https://open.bigmodel.cn"; export const SILICONFLOW_BASE_URL = "https://api.siliconflow.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", McpMarket = "/mcp-market", } 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", DeepSeek = "/api/deepseek", SiliconFlow = "/api/siliconflow", } 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", Mcp = "mcp-store", } 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 REQUEST_TIMEOUT_MS_FOR_THINKING = REQUEST_TIMEOUT_MS * 5; 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", DeepSeek = "DeepSeek", SiliconFlow = "SiliconFlow", } // 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", DeepSeek = "DeepSeek", SiliconFlow = "SiliconFlow", } 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://.openai.azure.com/openai/deployments//images/generations?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 DeepSeek = { ExampleEndpoint: DEEPSEEK_BASE_URL, ChatPath: "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", ImagePath: "api/paas/v4/images/generations", VideoPath: "api/paas/v4/videos/generations", }; export const SiliconFlow = { ExampleEndpoint: SILICONFLOW_BASE_URL, ChatPath: "v1/chat/completions", ListModelPath: "v1/models?&sub_type=chat", }; 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 MCP_TOOLS_TEMPLATE = ` [clientId] {{ clientId }} [tools] {{ tools }} `; export const MCP_SYSTEM_TEMPLATE = ` You are an AI assistant with access to system tools. Your role is to help users by combining natural language understanding with tool operations when needed. 1. AVAILABLE TOOLS: {{ MCP_TOOLS }} 2. WHEN TO USE TOOLS: - ALWAYS USE TOOLS when they can help answer user questions - DO NOT just describe what you could do - TAKE ACTION immediately - If you're not sure whether to use a tool, USE IT - Common triggers for tool use: * Questions about files or directories * Requests to check, list, or manipulate system resources * Any query that can be answered with available tools 3. HOW TO USE TOOLS: A. Tool Call Format: - Use markdown code blocks with format: \`\`\`json:mcp:{clientId}\`\`\` - Always include: * method: "tools/call"(Only this method is supported) * params: - name: must match an available primitive name - arguments: required parameters for the primitive B. Response Format: - Tool responses will come as user messages - Format: \`\`\`json:mcp-response:{clientId}\`\`\` - Wait for response before making another tool call C. Important Rules: - Only use tools/call method - Only ONE tool call per message - ALWAYS TAKE ACTION instead of just describing what you could do - Include the correct clientId in code block language tag - Verify arguments match the primitive's requirements 4. INTERACTION FLOW: A. When user makes a request: - IMMEDIATELY use appropriate tool if available - DO NOT ask if user wants you to use the tool - DO NOT just describe what you could do B. After receiving tool response: - Explain results clearly - Take next appropriate action if needed C. If tools fail: - Explain the error - Try alternative approach immediately 5. EXAMPLE INTERACTION: good example: \`\`\`json:mcp:filesystem { "method": "tools/call", "params": { "name": "list_allowed_directories", "arguments": {} } } \`\`\`" \`\`\`json:mcp-response:filesystem { "method": "tools/call", "params": { "name": "write_file", "arguments": { "path": "/Users/river/dev/nextchat/test/joke.txt", "content": "为什么数学书总是感到忧伤?因为它有太多的问题。" } } } \`\`\` follwing is the wrong! mcp json example: \`\`\`json:mcp:filesystem { "method": "write_file", "params": { "path": "NextChat_Information.txt", "content": "1" } } \`\`\` This is wrong because the method is not tools/call. \`\`\`{ "method": "search_repositories", "params": { "query": "2oeee" } } \`\`\` This is wrong because the method is not tools/call.!!!!!!!!!!! the right format is: \`\`\`json:mcp:filesystem { "method": "tools/call", "params": { "name": "search_repositories", "arguments": { "query": "2oeee" } } } \`\`\` please follow the format strictly ONLY use tools/call method!!!!!!!!!!! `; export const SUMMARIZE_MODEL = "gpt-4o-mini"; export const GEMINI_SUMMARIZE_MODEL = "gemini-pro"; export const DEEPSEEK_SUMMARIZE_MODEL = "deepseek-chat"; export const KnowledgeCutOffDate: Record = { 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-2024-09-12": "2023-10", "o1-mini": "2023-10", "o1-preview-2024-09-12": "2023-10", "o1-preview": "2023-10", "o1-2024-12-17": "2023-10", o1: "2023-10", "o3-mini-2025-01-31": "2023-10", "o3-mini": "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", "deepseek-chat": "2024-07", "deepseek-coder": "2024-07", }; 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", ]; export const VISION_MODEL_REGEXES = [ /vision/, /gpt-4o/, /claude-3/, /gemini-1\.5/, /gemini-exp/, /gemini-2\.0/, /learnlm/, /qwen-vl/, /qwen2-vl/, /gpt-4-turbo(?!.*preview)/, // Matches "gpt-4-turbo" but not "gpt-4-turbo-preview" /^dall-e-3$/, // Matches exactly "dall-e-3" /glm-4v/, /vl/i, ]; export const EXCLUDE_VISION_MODEL_REGEXES = [/claude-3-5-haiku-20241022/]; const openaiModels = [ // As of July 2024, gpt-4o-mini should be used in place of gpt-3.5-turbo, // as it is cheaper, more capable, multimodal, and just as fast. gpt-3.5-turbo is still available for use in the API. "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", "o3-mini", ]; const googleModels = [ "gemini-1.0-pro", // Deprecated on 2/15/2025 "gemini-1.5-pro-latest", "gemini-1.5-pro", "gemini-1.5-pro-002", "gemini-1.5-pro-exp-0827", "gemini-1.5-flash-latest", "gemini-1.5-flash-8b-latest", "gemini-1.5-flash", "gemini-1.5-flash-8b", "gemini-1.5-flash-002", "gemini-1.5-flash-exp-0827", "learnlm-1.5-pro-experimental", "gemini-exp-1114", "gemini-exp-1121", "gemini-exp-1206", "gemini-2.0-flash", "gemini-2.0-flash-exp", "gemini-2.0-flash-lite-preview-02-05", "gemini-2.0-flash-thinking-exp", "gemini-2.0-flash-thinking-exp-1219", "gemini-2.0-flash-thinking-exp-01-21", "gemini-2.0-pro-exp", "gemini-2.0-pro-exp-02-05", ]; 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 deepseekModels = ["deepseek-chat", "deepseek-coder", "deepseek-reasoner"]; const xAIModes = [ "grok-beta", "grok-2", "grok-2-1212", "grok-2-latest", "grok-vision-beta", "grok-2-vision-1212", "grok-2-vision", "grok-2-vision-latest", ]; 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", "glm-4v-plus", "glm-4v", "glm-4v-flash", // free "cogview-3-plus", "cogview-3", "cogview-3-flash", // free // 目前无法适配轮询任务 // "cogvideox", // "cogvideox-flash", // free ]; const siliconflowModels = [ "Qwen/Qwen2.5-7B-Instruct", "Qwen/Qwen2.5-72B-Instruct", "deepseek-ai/DeepSeek-R1", "deepseek-ai/DeepSeek-R1-Distill-Llama-70B", "deepseek-ai/DeepSeek-R1-Distill-Llama-8B", "deepseek-ai/DeepSeek-R1-Distill-Qwen-1.5B", "deepseek-ai/DeepSeek-R1-Distill-Qwen-14B", "deepseek-ai/DeepSeek-R1-Distill-Qwen-32B", "deepseek-ai/DeepSeek-R1-Distill-Qwen-7B", "deepseek-ai/DeepSeek-V3", "meta-llama/Llama-3.3-70B-Instruct", "THUDM/glm-4-9b-chat", "Pro/deepseek-ai/DeepSeek-R1", "Pro/deepseek-ai/DeepSeek-V3", ]; 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, }, })), ...deepseekModels.map((name) => ({ name, available: true, sorted: seq++, provider: { id: "deepseek", providerName: "DeepSeek", providerType: "deepseek", sorted: 13, }, })), ...siliconflowModels.map((name) => ({ name, available: true, sorted: seq++, provider: { id: "siliconflow", providerName: "SiliconFlow", providerType: "siliconflow", sorted: 14, }, })), ] 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 SAAS_CHAT_URL = "https://nextchat.dev/chat"; export const SAAS_CHAT_UTM_URL = "https://nextchat.dev/chat?utm=github";