703 lines
18 KiB
TypeScript
703 lines
18 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 MCP_PRIMITIVES_TEMPLATE = `
|
|
[clientId]
|
|
{{ clientId }}
|
|
[primitives]
|
|
{{ primitives }}
|
|
`;
|
|
|
|
// String and scalar parameters should be specified as is, while lists and objects should use JSON format. Note that spaces for string values are not stripped. The output is not expected to be valid XML and is parsed with regular expressions.
|
|
// Here are the functions available in JSONSchema format:
|
|
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. TOOLS AVAILABLE:
|
|
{{ MCP_PRIMITIVES }}
|
|
|
|
2. WHEN TO USE TOOLS:
|
|
- When users ask any questions that can be answered by available tools, you should use the tools to answer the user's question.
|
|
|
|
3. HOW TO USE TOOLS:
|
|
A. Tool Call Format:
|
|
- Use markdown code blocks with format: \`\`\`json:mcp:{clientId}\`\`\`
|
|
- Always include:
|
|
* method: "tools/call"
|
|
* 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 ONE tool call per message
|
|
- Always use the exact primitive name from available tools
|
|
- Include the correct clientId in code block language tag
|
|
- Verify arguments match the primitive's requirements
|
|
|
|
4. INTERACTION FLOW:
|
|
A. Understand user's request
|
|
B. If tools are needed:
|
|
- Explain what you plan to do
|
|
- Make the appropriate tool call
|
|
- Wait for the response
|
|
- Explain the results in user-friendly terms
|
|
C. If tools fail:
|
|
- Explain the error clearly
|
|
- Suggest alternatives or ask for clarification
|
|
|
|
5. EXAMPLE INTERACTION:
|
|
User: "What files do I have on my desktop?"
|
|
Assistant: "I'll first check which directories I have access to.
|
|
\`\`\`json:mcp:filesystem
|
|
{
|
|
"method": "tools/call",
|
|
"params": {
|
|
"name": "list_allowed_directories",
|
|
"arguments": {}
|
|
}
|
|
}
|
|
\`\`\`"
|
|
|
|
User: "\`\`\`json:mcp-response:filesystem
|
|
{
|
|
"directories": ["/path/to/desktop"]
|
|
}
|
|
\`\`\`"
|
|
|
|
Assistant: "I can see that I have access to your desktop directory. Let me list its contents for you.
|
|
\`\`\`json:mcp:filesystem
|
|
{
|
|
"method": "tools/call",
|
|
"params": {
|
|
"name": "list_directory",
|
|
"arguments": {
|
|
"path": "/path/to/desktop"
|
|
}
|
|
}
|
|
}
|
|
\`\`\`"
|
|
|
|
User: "\`\`\`json:mcp-response:filesystem
|
|
{
|
|
"content": [
|
|
{
|
|
"type": "text",
|
|
"text": "[FILE] document.txt\n[DIR] folder1\n[DIR] folder2\n[FILE] image.png\n[FILE] notes.md"
|
|
}
|
|
]
|
|
}
|
|
\`\`\`"
|
|
|
|
Assistant: "I've found the contents of your desktop. Here's what you have:
|
|
|
|
Files:
|
|
- document.txt
|
|
- image.png
|
|
- notes.md
|
|
|
|
Directories:
|
|
- folder1
|
|
- folder2
|
|
|
|
Would you like to explore any of these directories or perform other operations with these files?"
|
|
`;
|
|
|
|
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",
|
|
];
|
|
|
|
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"
|
|
];
|
|
|
|
export const EXCLUDE_VISION_MODEL_REGEXES = [/claude-3-5-haiku-20241022/];
|
|
|
|
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", // 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-exp",
|
|
"gemini-2.0-flash-thinking-exp-1219",
|
|
];
|
|
|
|
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";
|