@@ -1822,6 +1863,7 @@ export function Settings() {
{XAIConfigComponent}
{chatglmConfigComponent}
{siliconflowConfigComponent}
+ {ai302ConfigComponent}
>
)}
>
diff --git a/app/config/server.ts b/app/config/server.ts
index 43d4ff833..14175eadc 100644
--- a/app/config/server.ts
+++ b/app/config/server.ts
@@ -88,6 +88,10 @@ declare global {
SILICONFLOW_URL?: string;
SILICONFLOW_API_KEY?: string;
+ // 302.AI only
+ AI302_URL?: string;
+ AI302_API_KEY?: string;
+
// custom template for preprocessing user input
DEFAULT_INPUT_TEMPLATE?: string;
@@ -163,6 +167,7 @@ export const getServerSideConfig = () => {
const isXAI = !!process.env.XAI_API_KEY;
const isChatGLM = !!process.env.CHATGLM_API_KEY;
const isSiliconFlow = !!process.env.SILICONFLOW_API_KEY;
+ const isAI302 = !!process.env.AI302_API_KEY;
// const apiKeyEnvVar = process.env.OPENAI_API_KEY ?? "";
// const apiKeys = apiKeyEnvVar.split(",").map((v) => v.trim());
// const randomIndex = Math.floor(Math.random() * apiKeys.length);
@@ -246,6 +251,10 @@ export const getServerSideConfig = () => {
siliconFlowUrl: process.env.SILICONFLOW_URL,
siliconFlowApiKey: getApiKey(process.env.SILICONFLOW_API_KEY),
+ isAI302,
+ ai302Url: process.env.AI302_URL,
+ ai302ApiKey: getApiKey(process.env.AI302_API_KEY),
+
gtmId: process.env.GTM_ID,
gaId: process.env.GA_ID || DEFAULT_GA_ID,
diff --git a/app/constant.ts b/app/constant.ts
index 9fcea1187..6bececb55 100644
--- a/app/constant.ts
+++ b/app/constant.ts
@@ -25,7 +25,7 @@ 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 MOONSHOT_BASE_URL = "https://api.moonshot.ai";
export const IFLYTEK_BASE_URL = "https://spark-api-open.xf-yun.com";
export const DEEPSEEK_BASE_URL = "https://api.deepseek.com";
@@ -36,6 +36,8 @@ export const CHATGLM_BASE_URL = "https://open.bigmodel.cn";
export const SILICONFLOW_BASE_URL = "https://api.siliconflow.cn";
+export const AI302_BASE_URL = "https://api.302.ai";
+
export const CACHE_URL_PREFIX = "/api/cache";
export const UPLOAD_URL = `${CACHE_URL_PREFIX}/upload`;
@@ -72,6 +74,7 @@ export enum ApiPath {
ChatGLM = "/api/chatglm",
DeepSeek = "/api/deepseek",
SiliconFlow = "/api/siliconflow",
+ "302.AI" = "/api/302ai",
}
export enum SlotID {
@@ -130,6 +133,7 @@ export enum ServiceProvider {
ChatGLM = "ChatGLM",
DeepSeek = "DeepSeek",
SiliconFlow = "SiliconFlow",
+ "302.AI" = "302.AI",
}
// Google API safety settings, see https://ai.google.dev/gemini-api/docs/safety-settings
@@ -156,6 +160,7 @@ export enum ModelProvider {
ChatGLM = "ChatGLM",
DeepSeek = "DeepSeek",
SiliconFlow = "SiliconFlow",
+ "302.AI" = "302.AI",
}
export const Stability = {
@@ -266,6 +271,13 @@ export const SiliconFlow = {
ListModelPath: "v1/models?&sub_type=chat",
};
+export const AI302 = {
+ ExampleEndpoint: AI302_BASE_URL,
+ ChatPath: "v1/chat/completions",
+ EmbeddingsPath: "jina/v1/embeddings",
+ ListModelPath: "v1/models?llm=1",
+};
+
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}}.
@@ -467,19 +479,20 @@ export const VISION_MODEL_REGEXES = [
/vision/,
/gpt-4o/,
/gpt-4\.1/,
- /claude-3/,
+ /claude.*[34]/,
/gemini-1\.5/,
/gemini-exp/,
- /gemini-2\.0/,
+ /gemini-2\.[05]/,
/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"
+ /gpt-4-turbo(?!.*preview)/,
+ /^dall-e-3$/,
/glm-4v/,
/vl/i,
/o3/,
/o4-mini/,
+ /grok-4/i,
];
export const EXCLUDE_VISION_MODEL_REGEXES = [/claude-3-5-haiku-20241022/];
@@ -523,20 +536,15 @@ const openaiModels = [
];
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",
@@ -546,6 +554,8 @@ const googleModels = [
"gemini-2.0-flash-thinking-exp-01-21",
"gemini-2.0-pro-exp",
"gemini-2.0-pro-exp-02-05",
+ "gemini-2.5-pro-preview-06-05",
+ "gemini-2.5-pro"
];
const anthropicModels = [
@@ -563,6 +573,8 @@ const anthropicModels = [
"claude-3-5-sonnet-latest",
"claude-3-7-sonnet-20250219",
"claude-3-7-sonnet-latest",
+ "claude-sonnet-4-20250514",
+ "claude-opus-4-20250514",
];
const baiduModels = [
@@ -611,7 +623,18 @@ const tencentModels = [
"hunyuan-vision",
];
-const moonshotModes = ["moonshot-v1-8k", "moonshot-v1-32k", "moonshot-v1-128k"];
+const moonshotModels = [
+ "moonshot-v1-auto",
+ "moonshot-v1-8k",
+ "moonshot-v1-32k",
+ "moonshot-v1-128k",
+ "moonshot-v1-8k-vision-preview",
+ "moonshot-v1-32k-vision-preview",
+ "moonshot-v1-128k-vision-preview",
+ "kimi-thinking-preview",
+ "kimi-k2-0711-preview",
+ "kimi-latest",
+];
const iflytekModels = [
"general",
@@ -632,6 +655,18 @@ const xAIModes = [
"grok-2-vision-1212",
"grok-2-vision",
"grok-2-vision-latest",
+ "grok-3-mini-fast-beta",
+ "grok-3-mini-fast",
+ "grok-3-mini-fast-latest",
+ "grok-3-mini-beta",
+ "grok-3-mini",
+ "grok-3-mini-latest",
+ "grok-3-fast-beta",
+ "grok-3-fast",
+ "grok-3-fast-latest",
+ "grok-3-beta",
+ "grok-3",
+ "grok-3-latest",
];
const chatglmModels = [
@@ -671,6 +706,31 @@ const siliconflowModels = [
"Pro/deepseek-ai/DeepSeek-V3",
];
+const ai302Models = [
+ "deepseek-chat",
+ "gpt-4o",
+ "chatgpt-4o-latest",
+ "llama3.3-70b",
+ "deepseek-reasoner",
+ "gemini-2.0-flash",
+ "claude-3-7-sonnet-20250219",
+ "claude-3-7-sonnet-latest",
+ "grok-3-beta",
+ "grok-3-mini-beta",
+ "gpt-4.1",
+ "gpt-4.1-mini",
+ "o3",
+ "o4-mini",
+ "qwen3-235b-a22b",
+ "qwen3-32b",
+ "gemini-2.5-pro-preview-05-06",
+ "llama-4-maverick",
+ "gemini-2.5-flash",
+ "claude-sonnet-4-20250514",
+ "claude-opus-4-20250514",
+ "gemini-2.5-pro",
+];
+
let seq = 1000; // 内置的模型序号生成器从1000开始
export const DEFAULT_MODELS = [
...openaiModels.map((name) => ({
@@ -761,7 +821,7 @@ export const DEFAULT_MODELS = [
sorted: 8,
},
})),
- ...moonshotModes.map((name) => ({
+ ...moonshotModels.map((name) => ({
name,
available: true,
sorted: seq++,
@@ -827,6 +887,17 @@ export const DEFAULT_MODELS = [
sorted: 14,
},
})),
+ ...ai302Models.map((name) => ({
+ name,
+ available: true,
+ sorted: seq++,
+ provider: {
+ id: "ai302",
+ providerName: "302.AI",
+ providerType: "ai302",
+ sorted: 15,
+ },
+ })),
] as const;
export const CHAT_PAGE_SIZE = 15;
diff --git a/app/locales/ar.ts b/app/locales/ar.ts
index e2fad3494..6237e11b3 100644
--- a/app/locales/ar.ts
+++ b/app/locales/ar.ts
@@ -416,6 +416,17 @@ const ar: PartialLocaleType = {
SubTitle: "مثال:",
},
},
+ AI302: {
+ ApiKey: {
+ Title: "مفتاح 302.AI API",
+ SubTitle: "استخدم مفتاح 302.AI API مخصص",
+ Placeholder: "مفتاح 302.AI API",
+ },
+ Endpoint: {
+ Title: "عنوان الواجهة",
+ SubTitle: "مثال:",
+ },
+ },
CustomModel: {
Title: "اسم النموذج المخصص",
SubTitle: "أضف خيارات نموذج مخصص، مفصولة بفواصل إنجليزية",
diff --git a/app/locales/bn.ts b/app/locales/bn.ts
index f52f101ce..6ec3606f3 100644
--- a/app/locales/bn.ts
+++ b/app/locales/bn.ts
@@ -423,6 +423,17 @@ const bn: PartialLocaleType = {
SubTitle: "উদাহরণ:",
},
},
+ AI302: {
+ ApiKey: {
+ Title: "ইন্টারফেস কী",
+ SubTitle: "স্বনির্ধারিত 302.AI API কী ব্যবহার করুন",
+ Placeholder: "302.AI API কী",
+ },
+ Endpoint: {
+ Title: "ইন্টারফেস ঠিকানা",
+ SubTitle: "উদাহরণ:",
+ },
+ },
CustomModel: {
Title: "স্বনির্ধারিত মডেল নাম",
SubTitle:
diff --git a/app/locales/cn.ts b/app/locales/cn.ts
index 81b609cde..2cb7dd1e5 100644
--- a/app/locales/cn.ts
+++ b/app/locales/cn.ts
@@ -538,6 +538,17 @@ const cn = {
Title: "自定义模型名",
SubTitle: "增加自定义模型可选项,使用英文逗号隔开",
},
+ AI302: {
+ ApiKey: {
+ Title: "接口密钥",
+ SubTitle: "使用自定义302.AI API Key",
+ Placeholder: "302.AI API Key",
+ },
+ Endpoint: {
+ Title: "接口地址",
+ SubTitle: "样例:",
+ },
+ },
},
Model: "模型 (model)",
diff --git a/app/locales/cs.ts b/app/locales/cs.ts
index d62a20367..c4ce2653a 100644
--- a/app/locales/cs.ts
+++ b/app/locales/cs.ts
@@ -423,6 +423,17 @@ const cs: PartialLocaleType = {
SubTitle: "Příklad:",
},
},
+ AI302: {
+ ApiKey: {
+ Title: "Rozhraní klíč",
+ SubTitle: "Použijte vlastní 302.AI API Key",
+ Placeholder: "302.AI API Key",
+ },
+ Endpoint: {
+ Title: "Adresa rozhraní",
+ SubTitle: "Příklad:",
+ },
+ },
CustomModel: {
Title: "Vlastní názvy modelů",
SubTitle: "Přidejte možnosti vlastních modelů, oddělené čárkami",
diff --git a/app/locales/da.ts b/app/locales/da.ts
index 7090b062b..7c976188a 100644
--- a/app/locales/da.ts
+++ b/app/locales/da.ts
@@ -517,6 +517,17 @@ const da: PartialLocaleType = {
SubTitle: "Vælg et niveau for indholdskontrol",
},
},
+ AI302: {
+ ApiKey: {
+ Title: "302.AI API Key",
+ SubTitle: "Brug en custom 302.AI API Key",
+ Placeholder: "302.AI API Key",
+ },
+ Endpoint: {
+ Title: "Endpoint-adresse",
+ SubTitle: "Eksempel: ",
+ },
+ },
},
Model: "Model",
CompressModel: {
diff --git a/app/locales/de.ts b/app/locales/de.ts
index 3490190a8..1e5c75985 100644
--- a/app/locales/de.ts
+++ b/app/locales/de.ts
@@ -434,6 +434,17 @@ const de: PartialLocaleType = {
SubTitle: "Beispiel:",
},
},
+ AI302: {
+ ApiKey: {
+ Title: "Schnittstellenschlüssel",
+ SubTitle: "Verwenden Sie einen benutzerdefinierten 302.AI API-Schlüssel",
+ Placeholder: "302.AI API-Schlüssel",
+ },
+ Endpoint: {
+ Title: "Endpunktadresse",
+ SubTitle: "Beispiel:",
+ },
+ },
CustomModel: {
Title: "Benutzerdefinierter Modellname",
SubTitle:
diff --git a/app/locales/en.ts b/app/locales/en.ts
index 8fecf8bf7..a6d191904 100644
--- a/app/locales/en.ts
+++ b/app/locales/en.ts
@@ -543,6 +543,17 @@ const en: LocaleType = {
SubTitle: "Select a safety filtering level",
},
},
+ AI302: {
+ ApiKey: {
+ Title: "302.AI API Key",
+ SubTitle: "Use a custom 302.AI API Key",
+ Placeholder: "302.AI API Key",
+ },
+ Endpoint: {
+ Title: "Endpoint Address",
+ SubTitle: "Example: ",
+ },
+ },
},
Model: "Model",
diff --git a/app/locales/es.ts b/app/locales/es.ts
index 03af9b439..be229c20c 100644
--- a/app/locales/es.ts
+++ b/app/locales/es.ts
@@ -436,6 +436,17 @@ const es: PartialLocaleType = {
SubTitle: "Ejemplo:",
},
},
+ AI302: {
+ ApiKey: {
+ Title: "Clave de interfaz",
+ SubTitle: "Usa una clave API de 302.AI personalizada",
+ Placeholder: "Clave API de 302.AI",
+ },
+ Endpoint: {
+ Title: "Dirección del endpoint",
+ SubTitle: "Ejemplo:",
+ },
+ },
CustomModel: {
Title: "Nombre del modelo personalizado",
SubTitle:
diff --git a/app/locales/fr.ts b/app/locales/fr.ts
index d25c60eb6..0675d925c 100644
--- a/app/locales/fr.ts
+++ b/app/locales/fr.ts
@@ -435,6 +435,17 @@ const fr: PartialLocaleType = {
SubTitle: "Exemple :",
},
},
+ AI302: {
+ ApiKey: {
+ Title: "Clé d'interface",
+ SubTitle: "Utiliser une clé API 302.AI personnalisée",
+ Placeholder: "Clé API 302.AI",
+ },
+ Endpoint: {
+ Title: "Adresse de l'endpoint",
+ SubTitle: "Exemple :",
+ },
+ },
CustomModel: {
Title: "Nom du modèle personnalisé",
SubTitle:
diff --git a/app/locales/id.ts b/app/locales/id.ts
index af96fd272..68cf43e30 100644
--- a/app/locales/id.ts
+++ b/app/locales/id.ts
@@ -424,6 +424,17 @@ const id: PartialLocaleType = {
SubTitle: "Contoh:",
},
},
+ AI302: {
+ ApiKey: {
+ Title: "Kunci Antarmuka",
+ SubTitle: "Gunakan 302.AI API Key kustom",
+ Placeholder: "302.AI API Key",
+ },
+ Endpoint: {
+ Title: "Alamat Antarmuka",
+ SubTitle: "Contoh:",
+ },
+ },
CustomModel: {
Title: "Nama Model Kustom",
SubTitle: "Tambahkan opsi model kustom, pisahkan dengan koma",
diff --git a/app/locales/it.ts b/app/locales/it.ts
index 59bc1eb15..c098f63d1 100644
--- a/app/locales/it.ts
+++ b/app/locales/it.ts
@@ -436,6 +436,17 @@ const it: PartialLocaleType = {
SubTitle: "Esempio:",
},
},
+ AI302: {
+ ApiKey: {
+ Title: "Chiave dell'interfaccia",
+ SubTitle: "Utilizza una chiave API 302.AI personalizzata",
+ Placeholder: "Chiave API 302.AI",
+ },
+ Endpoint: {
+ Title: "Indirizzo dell'interfaccia",
+ SubTitle: "Esempio:",
+ },
+ },
CustomModel: {
Title: "Nome del modello personalizzato",
SubTitle:
diff --git a/app/locales/jp.ts b/app/locales/jp.ts
index e7c81e186..d605b578f 100644
--- a/app/locales/jp.ts
+++ b/app/locales/jp.ts
@@ -420,6 +420,17 @@ const jp: PartialLocaleType = {
SubTitle: "例:",
},
},
+ AI302: {
+ ApiKey: {
+ Title: "APIキー",
+ SubTitle: "カスタム302.AI APIキーを使用",
+ Placeholder: "302.AI APIキー",
+ },
+ Endpoint: {
+ Title: "エンドポイント",
+ SubTitle: "例:",
+ },
+ },
CustomModel: {
Title: "カスタムモデル名",
SubTitle: "カスタムモデルの選択肢を追加、英語のカンマで区切る",
diff --git a/app/locales/ko.ts b/app/locales/ko.ts
index f2c433b76..023edca4a 100644
--- a/app/locales/ko.ts
+++ b/app/locales/ko.ts
@@ -9,10 +9,10 @@ const ko: PartialLocaleType = {
Error: {
Unauthorized: isApp
? `😆 대화 중 문제가 발생했습니다, 걱정하지 마세요:
- \\ 1️⃣ 제로 구성으로 시작하고 싶다면, [여기를 클릭하여 즉시 대화를 시작하세요 🚀](${SAAS_CHAT_UTM_URL})
+ \\ 1️⃣ 세팅 없이 시작하고 싶다면, [여기를 클릭하여 즉시 대화를 시작하세요 🚀](${SAAS_CHAT_UTM_URL})
\\ 2️⃣ 자신의 OpenAI 리소스를 사용하고 싶다면, [여기를 클릭하여](/#/settings) 설정을 수정하세요 ⚙️`
: `😆 대화 중 문제가 발생했습니다, 걱정하지 마세요:
- \ 1️⃣ 제로 구성으로 시작하고 싶다면, [여기를 클릭하여 즉시 대화를 시작하세요 🚀](${SAAS_CHAT_UTM_URL})
+ \ 1️⃣ 세팅 없이 시작하고 싶다면, [여기를 클릭하여 즉시 대화를 시작하세요 🚀](${SAAS_CHAT_UTM_URL})
\ 2️⃣ 개인 배포 버전을 사용하고 있다면, [여기를 클릭하여](/#/auth) 접근 키를 입력하세요 🔑
\ 3️⃣ 자신의 OpenAI 리소스를 사용하고 싶다면, [여기를 클릭하여](/#/settings) 설정을 수정하세요 ⚙️
`,
@@ -27,7 +27,7 @@ const ko: PartialLocaleType = {
Return: "돌아가기",
SaasTips: "설정이 너무 복잡합니다. 즉시 사용하고 싶습니다.",
TopTips:
- "🥳 NextChat AI 출시 기념 할인, 지금 OpenAI o1, GPT-4o, Claude-3.5 및 최신 대형 모델을 해제하세요",
+ "🥳 NextChat AI 출시 기념 할인: 지금 OpenAI o1, GPT-4o, Claude-3.5 및 최신 대형 모델을 사용해보세요!",
},
ChatItem: {
ChatItemCount: (count: number) => `${count} 개의 대화`,
@@ -53,8 +53,11 @@ const ko: PartialLocaleType = {
PinToastAction: "보기",
Delete: "삭제",
Edit: "편집",
+ FullScreen: "전체 화면",
RefreshTitle: "제목 새로고침",
RefreshToast: "제목 새로고침 요청이 전송되었습니다",
+ Speech: "재생",
+ StopSpeech: "정지",
},
Commands: {
new: "새 채팅",
@@ -62,6 +65,7 @@ const ko: PartialLocaleType = {
next: "다음 채팅",
prev: "이전 채팅",
clear: "컨텍스트 지우기",
+ fork: "채팅 복사",
del: "채팅 삭제",
},
InputActions: {
@@ -88,11 +92,22 @@ const ko: PartialLocaleType = {
return inputHints + ",/ 자동 완성,: 명령어 입력";
},
Send: "전송",
+ StartSpeak: "재생 시작",
+ StopSpeak: "재생 정지",
Config: {
Reset: "기억 지우기",
SaveAs: "마스크로 저장",
},
IsContext: "프롬프트 설정",
+ ShortcutKey: {
+ Title: "키보드 단축키",
+ newChat: "새 채팅 열기",
+ focusInput: "입력 필드 포커스",
+ copyLastMessage: "마지막 답변 복사",
+ copyLastCode: "마지막 코드 블록 복사",
+ showShortcutKey: "단축키 보기",
+ clearContext: "컨텍스트 지우기",
+ },
},
Export: {
Title: "채팅 기록 공유",
@@ -114,9 +129,13 @@ const ko: PartialLocaleType = {
Preview: "미리보기",
},
Image: {
- Toast: "스크린샷 생성 중",
+ Toast: "스크린샷 생성 중...",
Modal: "길게 누르거나 오른쪽 클릭하여 이미지를 저장하십시오.",
},
+ Artifacts: {
+ Title: "공유 아티팩트",
+ Error: "공유 오류",
+ },
},
Select: {
Search: "메시지 검색",
@@ -141,7 +160,7 @@ const ko: PartialLocaleType = {
Settings: {
Title: "설정",
SubTitle: "모든 설정 옵션",
-
+ ShowPassword: "비밀번호 보기",
Danger: {
Reset: {
Title: "모든 설정 초기화",
@@ -187,8 +206,10 @@ const ko: PartialLocaleType = {
IsChecking: "업데이트 확인 중...",
FoundUpdate: (x: string) => `새 버전 발견: ${x}`,
GoToUpdate: "업데이트로 이동",
+ Success: "업데이트 성공",
+ Failed: "업데이트 실패",
},
- SendKey: "전송 키",
+ SendKey: "키 전송",
Theme: "테마",
TightBorder: "테두리 없는 모드",
SendPreviewBubble: {
@@ -221,7 +242,7 @@ const ko: PartialLocaleType = {
},
ProxyUrl: {
Title: "프록시 주소",
- SubTitle: "이 프로젝트에서 제공하는 교차 출처 프록시만 해당",
+ SubTitle: "이 프로젝트에서 제공하는 CORS 프록시만 해당",
},
WebDav: {
@@ -295,7 +316,7 @@ const ko: PartialLocaleType = {
Title: "NextChat AI 사용하기",
Label: "(가장 비용 효율적인 솔루션)",
SubTitle:
- "NextChat에 의해 공식적으로 유지 관리되며, 제로 구성으로 즉시 사용할 수 있으며, OpenAI o1, GPT-4o, Claude-3.5와 같은 최신 대형 모델을 지원합니다",
+ "NextChat에 의해 공식적으로 유지 관리되며, 설정 없이 즉시 사용할 수 있으며, OpenAI o1, GPT-4o, Claude-3.5와 같은 최신 대형 모델을 지원합니다",
ChatNow: "지금 채팅하기",
},
@@ -395,6 +416,22 @@ const ko: PartialLocaleType = {
SubTitle: "커스터마이즈는 .env에서 설정",
},
},
+ Tencent: {
+ ApiKey: {
+ Title: "Tencent API 키",
+ SubTitle: "커스텀 Tencent API 키 사용",
+ Placeholder: "Tencent API 키",
+ },
+ SecretKey: {
+ Title: "Tencent Secret 키",
+ SubTitle: "커스텀 Tencent Secret 키 사용",
+ Placeholder: "Tencent Secret 키",
+ },
+ Endpoint: {
+ Title: "엔드포인트 주소",
+ SubTitle: "지원되지 않음, .env에서 설정",
+ },
+ },
ByteDance: {
ApiKey: {
Title: "엔드포인트 키",
@@ -417,10 +454,103 @@ const ko: PartialLocaleType = {
SubTitle: "예: ",
},
},
+ Moonshot: {
+ ApiKey: {
+ Title: "Moonshot API 키",
+ SubTitle: "커스텀 Moonshot API 키 사용",
+ Placeholder: "Moonshot API 키",
+ },
+ Endpoint: {
+ Title: "엔드포인트 주소",
+ SubTitle: "예: ",
+ },
+ },
+ DeepSeek: {
+ ApiKey: {
+ Title: "DeepSeek API 키",
+ SubTitle: "커스텀 DeepSeek API 키 사용",
+ Placeholder: "DeepSeek API 키",
+ },
+ Endpoint: {
+ Title: "엔드포인트 주소",
+ SubTitle: "예: ",
+ },
+ },
+ XAI: {
+ ApiKey: {
+ Title: "XAI API 키",
+ SubTitle: "커스텀 XAI API 키 사용",
+ Placeholder: "XAI API 키",
+ },
+ Endpoint: {
+ Title: "엔드포인트 주소",
+ SubTitle: "예: ",
+ },
+ },
+ ChatGLM: {
+ ApiKey: {
+ Title: "ChatGLM API 키",
+ SubTitle: "커스텀 ChatGLM API 키 사용",
+ Placeholder: "ChatGLM API 키",
+ },
+ Endpoint: {
+ Title: "엔드포인트 주소",
+ SubTitle: "예: ",
+ },
+ },
+ SiliconFlow: {
+ ApiKey: {
+ Title: "SiliconFlow API 키",
+ SubTitle: "커스텀 SiliconFlow API 키 사용",
+ Placeholder: "SiliconFlow API 키",
+ },
+ Endpoint: {
+ Title: "엔드포인트 주소",
+ SubTitle: "예: ",
+ },
+ },
+ Stability: {
+ ApiKey: {
+ Title: "Stability API 키",
+ SubTitle: "커스텀 Stability API 키 사용",
+ Placeholder: "Stability API 키",
+ },
+ Endpoint: {
+ Title: "엔드포인트 주소",
+ SubTitle: "예: ",
+ },
+ },
+ Iflytek: {
+ ApiKey: {
+ Title: "Iflytek API 키",
+ SubTitle: "커스텀 Iflytek API 키 사용",
+ Placeholder: "Iflytek API 키",
+ },
+ ApiSecret: {
+ Title: "Iflytek API Secret",
+ SubTitle: "커스텀 Iflytek API Secret 키 사용",
+ Placeholder: "Iflytek API Secret 키",
+ },
+ Endpoint: {
+ Title: "엔드포인트 주소",
+ SubTitle: "예: ",
+ },
+ },
CustomModel: {
Title: "커스텀 모델 이름",
SubTitle: "커스텀 모델 옵션 추가, 영어 쉼표로 구분",
},
+ AI302: {
+ ApiKey: {
+ Title: "엔드포인트 키",
+ SubTitle: "커스텀 302.AI API 키 사용",
+ Placeholder: "302.AI API 키",
+ },
+ Endpoint: {
+ Title: "엔드포인트 주소",
+ SubTitle: "예: ",
+ },
+ },
},
Model: "모델 (model)",
@@ -448,13 +578,67 @@ const ko: PartialLocaleType = {
Title: "빈도 벌점 (frequency_penalty)",
SubTitle: "값이 클수록 중복 단어 감소 가능성 높음",
},
+ TTS: {
+ Enable: {
+ Title: "TTS 활성화",
+ SubTitle: "TTS 서비스 활성화",
+ },
+ Autoplay: {
+ Title: "자동 재생 활성화",
+ SubTitle:
+ "자동으로 음성을 생성하고 재생, 먼저 TTS 스위치를 활성화해야 함",
+ },
+ Model: "모델",
+ Voice: {
+ Title: "음성",
+ SubTitle: "음성을 생성할 때 사용할 음성",
+ },
+ Speed: {
+ Title: "속도",
+ SubTitle: "생성된 음성의 속도",
+ },
+ Engine: "TTS Engine",
+ },
+ Realtime: {
+ Enable: {
+ Title: "실시간 채팅",
+ SubTitle: "실시간 채팅 기능 활성화",
+ },
+ Provider: {
+ Title: "모델 제공업체",
+ SubTitle: "다른 제공업체 간 전환",
+ },
+ Model: {
+ Title: "모델",
+ SubTitle: "모델 선택",
+ },
+ ApiKey: {
+ Title: "API 키",
+ SubTitle: "API 키",
+ Placeholder: "API 키",
+ },
+ Azure: {
+ Endpoint: {
+ Title: "엔드포인트",
+ SubTitle: "엔드포인트",
+ },
+ Deployment: {
+ Title: "배포 이름",
+ SubTitle: "배포 이름",
+ },
+ },
+ Temperature: {
+ Title: "무작위성 (temperature)",
+ SubTitle: "값이 클수록 응답이 더 무작위적",
+ },
+ },
},
Store: {
DefaultTopic: "새 채팅",
BotHello: "무엇을 도와드릴까요?",
Error: "오류가 발생했습니다. 나중에 다시 시도해 주세요.",
Prompt: {
- History: (content: string) => "이것은 이전 채팅 요약입니다: " + content,
+ History: (content: string) => "이전 채팅 요약: " + content,
Topic:
"네 글자에서 다섯 글자로 이 문장의 간략한 주제를 반환하세요. 설명이나 문장 부호, 어미, 불필요한 텍스트, 굵은 글씨는 필요 없습니다. 주제가 없다면 '잡담'이라고만 반환하세요.",
Summarize:
@@ -476,8 +660,11 @@ const ko: PartialLocaleType = {
Clear: "컨텍스트가 지워졌습니다.",
Revert: "컨텍스트 복원",
},
- Plugin: {
- Name: "플러그인",
+ Discovery: {
+ Name: "디스커버리",
+ },
+ Mcp: {
+ Name: "MCP 플러그인",
},
FineTuned: {
Sysmessage: "당신은 보조자입니다.",
@@ -489,7 +676,7 @@ const ko: PartialLocaleType = {
Search: "검색어 입력",
NoResult: "결과를 찾을 수 없습니다",
NoData: "데이터가 없습니다",
- Loading: "로딩 중",
+ Loading: "로딩 중...",
SubTitle: (count: number) => `${count}개의 결과를 찾았습니다`,
},
@@ -497,6 +684,47 @@ const ko: PartialLocaleType = {
View: "보기",
},
},
+ Plugin: {
+ Name: "플러그인",
+ Page: {
+ Title: "플러그인",
+ SubTitle: (count: number) => `${count} 개의 플러그인`,
+ Search: "플러그인 검색",
+ Create: "새로 만들기",
+ Find: "github에서 멋진 플러그인을 찾을 수 있습니다: ",
+ },
+ Item: {
+ Info: (count: number) => `${count} 개의 메서드`,
+ View: "보기",
+ Edit: "편집",
+ Delete: "삭제",
+ DeleteConfirm: "삭제하시겠습니까?",
+ },
+ Auth: {
+ None: "없음",
+ Basic: "기본",
+ Bearer: "Bearer",
+ Custom: "커스텀",
+ CustomHeader: "파라미터 이름",
+ Token: "토큰",
+ Proxy: "프록시 사용",
+ ProxyDescription: "CORS 오류 해결을 위해 프록시 사용",
+ Location: "위치",
+ LocationHeader: "헤더",
+ LocationQuery: "쿼리",
+ LocationBody: "바디",
+ },
+ EditModal: {
+ Title: (readonly: boolean) =>
+ `플러그인 편집 ${readonly ? "(읽기 전용)" : ""}`,
+ Download: "다운로드",
+ Auth: "인증 유형",
+ Content: "OpenAPI Schema",
+ Load: "URL에서 로드",
+ Method: "메서드",
+ Error: "OpenAPI Schema 오류",
+ },
+ },
Mask: {
Name: "마스크",
Page: {
@@ -576,6 +804,61 @@ const ko: PartialLocaleType = {
Topic: "주제",
Time: "시간",
},
+ SdPanel: {
+ Prompt: "프롬프트",
+ NegativePrompt: "부정적 프롬프트",
+ PleaseInput: (name: string) => `${name}을 입력하세요`,
+ AspectRatio: "비율",
+ ImageStyle: "이미지 스타일",
+ OutFormat: "출력 형식",
+ AIModel: "AI 모델",
+ ModelVersion: "모델 버전",
+ Submit: "제출",
+ ParamIsRequired: (name: string) => `${name}은 필수 입력 항목입니다`,
+ Styles: {
+ D3Model: "3d-model",
+ AnalogFilm: "analog-film",
+ Anime: "anime",
+ Cinematic: "cinematic",
+ ComicBook: "comic-book",
+ DigitalArt: "digital-art",
+ Enhance: "enhance",
+ FantasyArt: "fantasy-art",
+ Isometric: "isometric",
+ LineArt: "line-art",
+ LowPoly: "low-poly",
+ ModelingCompound: "modeling-compound",
+ NeonPunk: "neon-punk",
+ Origami: "origami",
+ Photographic: "photographic",
+ PixelArt: "pixel-art",
+ TileTexture: "tile-texture",
+ },
+ },
+ Sd: {
+ SubTitle: (count: number) => `${count} 개의 이미지`,
+ Actions: {
+ Params: "파라미터 보기",
+ Copy: "프롬프트 복사",
+ Delete: "삭제",
+ Retry: "다시 시도",
+ ReturnHome: "홈으로 돌아가기",
+ History: "기록",
+ },
+ EmptyRecord: "아직 이미지가 없습니다",
+ Status: {
+ Name: "상태",
+ Success: "성공",
+ Error: "오류",
+ Wait: "대기",
+ Running: "실행 중",
+ },
+ Danger: {
+ Delete: "삭제하시겠습니까?",
+ },
+ GenerateParams: "파라미터 생성",
+ Detail: "상세",
+ },
};
export default ko;
diff --git a/app/locales/no.ts b/app/locales/no.ts
index f056ef12f..e0556a853 100644
--- a/app/locales/no.ts
+++ b/app/locales/no.ts
@@ -433,6 +433,17 @@ const no: PartialLocaleType = {
Title: "Egendefinert modellnavn",
SubTitle: "Legg til egendefinerte modellalternativer, skill med komma",
},
+ AI302: {
+ ApiKey: {
+ Title: "API-nøkkel",
+ SubTitle: "Bruk egendefinert 302.AI API-nøkkel",
+ Placeholder: "302.AI API-nøkkel",
+ },
+ Endpoint: {
+ Title: "API-adresse",
+ SubTitle: "Eksempel:",
+ },
+ },
},
Model: "Modell",
diff --git a/app/locales/pt.ts b/app/locales/pt.ts
index 152f50228..6b80c2ec1 100644
--- a/app/locales/pt.ts
+++ b/app/locales/pt.ts
@@ -359,6 +359,17 @@ const pt: PartialLocaleType = {
SubTitle: "Verifique sua versão API do console Anthropic",
},
},
+ AI302: {
+ ApiKey: {
+ Title: "Chave API 302.AI",
+ SubTitle: "Use uma chave API 302.AI personalizada",
+ Placeholder: "302.AI API Key",
+ },
+ Endpoint: {
+ Title: "Endpoint Address",
+ SubTitle: "Exemplo: ",
+ },
+ },
CustomModel: {
Title: "Modelos Personalizados",
SubTitle: "Opções de modelo personalizado, separados por vírgula",
diff --git a/app/locales/ru.ts b/app/locales/ru.ts
index 4294a3b34..a4f0c949c 100644
--- a/app/locales/ru.ts
+++ b/app/locales/ru.ts
@@ -426,6 +426,17 @@ const ru: PartialLocaleType = {
SubTitle: "Пример:",
},
},
+ AI302: {
+ ApiKey: {
+ Title: "Ключ интерфейса",
+ SubTitle: "Использовать пользовательский 302.AI API-ключ",
+ Placeholder: "302.AI API-ключ",
+ },
+ Endpoint: {
+ Title: "Адрес интерфейса",
+ SubTitle: "Пример:",
+ },
+ },
CustomModel: {
Title: "Название пользовательской модели",
SubTitle:
diff --git a/app/locales/sk.ts b/app/locales/sk.ts
index 36454de75..6508f7f38 100644
--- a/app/locales/sk.ts
+++ b/app/locales/sk.ts
@@ -381,6 +381,17 @@ const sk: PartialLocaleType = {
SubTitle: "Vyberte špecifickú verziu časti",
},
},
+ AI302: {
+ ApiKey: {
+ Title: "API kľúč",
+ SubTitle: "Použiť vlastný API kľúč 302.AI",
+ Placeholder: "302.AI API kľúč",
+ },
+ Endpoint: {
+ Title: "Adresa koncového bodu",
+ SubTitle: "Príklad:",
+ },
+ },
},
Model: "Model",
diff --git a/app/locales/tr.ts b/app/locales/tr.ts
index 2082488a5..15d21fb7d 100644
--- a/app/locales/tr.ts
+++ b/app/locales/tr.ts
@@ -426,6 +426,17 @@ const tr: PartialLocaleType = {
SubTitle: "Örnek:",
},
},
+ AI302: {
+ ApiKey: {
+ Title: "API Anahtarı",
+ SubTitle: "Özelleştirilmiş 302.AI API Anahtarı kullanın",
+ Placeholder: "302.AI API Anahtarı",
+ },
+ Endpoint: {
+ Title: "API Adresi",
+ SubTitle: "Örnek:",
+ },
+ },
CustomModel: {
Title: "Özelleştirilmiş Model Adı",
SubTitle:
diff --git a/app/locales/tw.ts b/app/locales/tw.ts
index 83dd547b8..d09465d9e 100644
--- a/app/locales/tw.ts
+++ b/app/locales/tw.ts
@@ -382,6 +382,17 @@ const tw = {
SubTitle: "選擇一個特定的 API 版本",
},
},
+ AI302: {
+ ApiKey: {
+ Title: "API 金鑰",
+ SubTitle: "使用自訂 302.AI API 金鑰",
+ Placeholder: "302.AI API 金鑰",
+ },
+ Endpoint: {
+ Title: "端點位址",
+ SubTitle: "範例:",
+ },
+ },
CustomModel: {
Title: "自訂模型名稱",
SubTitle: "增加自訂模型可選擇項目,使用英文逗號隔開",
diff --git a/app/locales/vi.ts b/app/locales/vi.ts
index c53baf35d..7f6ed3f6f 100644
--- a/app/locales/vi.ts
+++ b/app/locales/vi.ts
@@ -422,6 +422,17 @@ const vi: PartialLocaleType = {
SubTitle: "Ví dụ:",
},
},
+ AI302: {
+ ApiKey: {
+ Title: "Khóa API 302.AI",
+ SubTitle: "Sử dụng khóa API 302.AI tùy chỉnh",
+ Placeholder: "302.AI API Key",
+ },
+ Endpoint: {
+ Title: "Địa chỉ giao diện",
+ SubTitle: "Ví dụ:",
+ },
+ },
CustomModel: {
Title: "Tên mô hình tùy chỉnh",
SubTitle:
diff --git a/app/store/access.ts b/app/store/access.ts
index 7025a1814..fd55fbdd3 100644
--- a/app/store/access.ts
+++ b/app/store/access.ts
@@ -17,6 +17,7 @@ import {
XAI_BASE_URL,
CHATGLM_BASE_URL,
SILICONFLOW_BASE_URL,
+ AI302_BASE_URL,
} from "../constant";
import { getHeaders } from "../client/api";
import { getClientConfig } from "../config/client";
@@ -59,6 +60,8 @@ const DEFAULT_SILICONFLOW_URL = isApp
? SILICONFLOW_BASE_URL
: ApiPath.SiliconFlow;
+const DEFAULT_AI302_URL = isApp ? AI302_BASE_URL : ApiPath["302.AI"];
+
const DEFAULT_ACCESS_STATE = {
accessCode: "",
useCustomConfig: false,
@@ -132,6 +135,10 @@ const DEFAULT_ACCESS_STATE = {
siliconflowUrl: DEFAULT_SILICONFLOW_URL,
siliconflowApiKey: "",
+ // 302.AI
+ ai302Url: DEFAULT_AI302_URL,
+ ai302ApiKey: "",
+
// server config
needCode: true,
hideUserApiKey: false,
diff --git a/docs/cloudflare-pages-ko.md b/docs/cloudflare-pages-ko.md
index 3b489a729..072402183 100644
--- a/docs/cloudflare-pages-ko.md
+++ b/docs/cloudflare-pages-ko.md
@@ -34,6 +34,6 @@
12. "저장 후 배포"를 클릭합니다.
13. 호환성 플래그를 입력해야 하므로 "배포 취소"를 클릭합니다.
14. "빌드 설정", "기능"으로 이동하여 "호환성 플래그"를 찾습니다.
-"프로덕션 호환성 플래그 구성" 및 "프리뷰 호환성 플래그 구성"에서 "nodejs_compat"를 입력합니다.
+15. "프로덕션 호환성 플래그 구성" 및 "프리뷰 호환성 플래그 구성"에서 "nodejs_compat"를 입력합니다.
16. "배포"로 이동하여 "배포 다시 시도"를 클릭합니다.
17. 즐기세요!
\ No newline at end of file
diff --git a/docs/vercel-ko.md b/docs/vercel-ko.md
index 725a827dc..b6ba71f58 100644
--- a/docs/vercel-ko.md
+++ b/docs/vercel-ko.md
@@ -9,7 +9,7 @@
3. 프로젝트를 선택합니다.

-1. Git 리포지토리 가져오기에서 chatgpt-next-web을 검색합니다. 2. 새 포크를 선택합니다;
+1. Git 리포지토리 가져오기에서 chatgpt-next-web을 검색합니다.
2. 새로 포크된 프로젝트를 선택하고 가져오기를 클릭합니다.

diff --git a/public/prompts.json b/public/prompts.json
index 24782690f..ae997b989 100644
--- a/public/prompts.json
+++ b/public/prompts.json
@@ -1,8 +1,7 @@
{
"cn": [
[
- " ",
- " "
+main
]
],
"tw": [
@@ -17,8 +16,6 @@
"Optimiere den Text und behalte die Struktur und Inhalt. Überprüfe nur die Rechtschreibung und Satzstellung:\n"
],
[
- "Optimize the text",
- "Optimize the text:\n"
- ]
+main
]
}
diff --git a/src-tauri/tauri.conf.json b/src-tauri/tauri.conf.json
index 8f5dd4ab3..bfa82b298 100644
--- a/src-tauri/tauri.conf.json
+++ b/src-tauri/tauri.conf.json
@@ -9,7 +9,7 @@
},
"package": {
"productName": "NextChat",
- "version": "2.15.8"
+ "version": "2.16.1"
},
"tauri": {
"allowlist": {
diff --git a/yarn.lock b/yarn.lock
index a99ff0804..af53517c4 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -3077,9 +3077,9 @@ camelcase@^6.2.0:
integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==
caniuse-lite@^1.0.30001449, caniuse-lite@^1.0.30001503, caniuse-lite@^1.0.30001579, caniuse-lite@^1.0.30001646:
- version "1.0.30001692"
- resolved "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001692.tgz"
- integrity sha512-A95VKan0kdtrsnMubMKxEKUKImOPSuCpYgxSQBo036P5YYgVIcOYJEgt/txJWqObiRQeISNCfef9nvlQ0vbV7A==
+ version "1.0.30001724"
+ resolved "https://mirrors.huaweicloud.com/repository/npm/caniuse-lite/-/caniuse-lite-1.0.30001724.tgz"
+ integrity sha512-WqJo7p0TbHDOythNTqYujmaJTvtYRZrjpP8TCvH6Vb9CYJerJNKamKzIWOM4BkQatWj9H2lYulpdAQNBe7QhNA==
ccount@^2.0.0:
version "2.0.1"
@@ -4334,14 +4334,14 @@ eslint-plugin-react@^7.31.7:
eslint-plugin-unused-imports@^3.2.0:
version "3.2.0"
- resolved "https://registry.yarnpkg.com/eslint-plugin-unused-imports/-/eslint-plugin-unused-imports-3.2.0.tgz#63a98c9ad5f622cd9f830f70bc77739f25ccfe0d"
+ resolved "https://mirrors.huaweicloud.com/repository/npm/eslint-plugin-unused-imports/-/eslint-plugin-unused-imports-3.2.0.tgz#63a98c9ad5f622cd9f830f70bc77739f25ccfe0d"
integrity sha512-6uXyn6xdINEpxE1MtDjxQsyXB37lfyO2yKGVVgtD7WEWQGORSOZjgrD6hBhvGv4/SO+TOlS+UnC6JppRqbuwGQ==
dependencies:
eslint-rule-composer "^0.3.0"
eslint-rule-composer@^0.3.0:
version "0.3.0"
- resolved "https://registry.yarnpkg.com/eslint-rule-composer/-/eslint-rule-composer-0.3.0.tgz#79320c927b0c5c0d3d3d2b76c8b4a488f25bbaf9"
+ resolved "https://mirrors.huaweicloud.com/repository/npm/eslint-rule-composer/-/eslint-rule-composer-0.3.0.tgz#79320c927b0c5c0d3d3d2b76c8b4a488f25bbaf9"
integrity sha512-bt+Sh8CtDmn2OajxvNO+BX7Wn4CIWMpTRm3MaiKPCQcnnlm0CS2mhui6QaoeQugs+3Kj2ESKEEGJUdVafwhiCg==
eslint-scope@5.1.1:
@@ -8156,7 +8156,7 @@ typed-array-length@^1.0.4:
typescript@5.2.2:
version "5.2.2"
- resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.2.2.tgz#5ebb5e5a5b75f085f22bc3f8460fba308310fa78"
+ resolved "https://mirrors.huaweicloud.com/repository/npm/typescript/-/typescript-5.2.2.tgz#5ebb5e5a5b75f085f22bc3f8460fba308310fa78"
integrity sha512-mI4WrpHsbCIcwT9cF4FZvr80QUeKvsUsUvKDoR+X/7XHQH98xYD8YHZg7ANtz2GtZt/CBq2QJ0thkGJMHfqc1w==
unbox-primitive@^1.0.2: