Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
49 changes: 39 additions & 10 deletions BitFun-Installer/scripts/sync-model-i18n.cjs
Original file line number Diff line number Diff line change
Expand Up @@ -78,8 +78,33 @@ function buildFormatsPatch(formats) {
};
}

/** Hardcoded installer-only strings that have no web-ui source key. */
const LITERALS = {
en: {
modelNoResults: 'No matching models',
baseUrlPlaceholder: 'e.g., https://open.bigmodel.cn/api/paas/v4/chat/completions',
testing: 'Testing...',
advancedShow: 'Show advanced settings',
advancedHide: 'Hide advanced settings',
},
zh: {
modelNoResults: '没有匹配的模型',
baseUrlPlaceholder: '示例:https://open.bigmodel.cn/api/paas/v4/chat/completions',
testing: '测试中...',
advancedShow: '显示高级设置',
advancedHide: '隐藏高级设置',
},
'zh-TW': {
modelNoResults: '沒有匹配的模型',
baseUrlPlaceholder: '範例:https://open.bigmodel.cn/api/paas/v4/chat/completions',
testing: '測試中...',
advancedShow: '顯示高級設定',
advancedHide: '隱藏高級設定',
},
};

function buildModelPatch(settingsAiModel, languageTag, components) {
const isZh = languageTag === 'zh';
const literals = LITERALS[languageTag] || LITERALS.en;
const form = get(settingsAiModel, 'form', {});
const formats = get(settingsAiModel, 'formats', {});
const input = get(components, 'input', {});
Expand Down Expand Up @@ -120,16 +145,14 @@ function buildModelPatch(settingsAiModel, languageTag, components) {
get(settingsAiModel, 'form.modelName', 'Enter model name...')
),
modelNameSelectPlaceholder: get(settingsAiModel, 'providerSelection.selectModel', 'Select a model...'),
modelNoResults: isZh ? '没有匹配的模型' : 'No matching models',
modelNoResults: literals.modelNoResults,
/** Installer: use addCustomModel (not useCustomModel / "Press Enter") for the extra dropdown option */
addCustomModel: get(settingsAiModel, 'providerSelection.addCustomModel', 'Add Custom Model'),
form: buildFormPatch(form),
formats: buildFormatsPatch(formats),
showSecret: get(input, 'show', 'Show'),
hideSecret: get(input, 'hide', 'Hide'),
baseUrlPlaceholder: isZh
? '示例:https://open.bigmodel.cn/api/paas/v4/chat/completions'
: 'e.g., https://open.bigmodel.cn/api/paas/v4/chat/completions',
baseUrlPlaceholder: literals.baseUrlPlaceholder,
customRequestBodyPlaceholder: get(
settingsAiModel,
'advancedSettings.customRequestBody.placeholder',
Expand Down Expand Up @@ -160,18 +183,23 @@ function buildModelPatch(settingsAiModel, languageTag, components) {
headerKey: get(settingsAiModel, 'advancedSettings.customHeaders.keyPlaceholder', 'key'),
headerValue: get(settingsAiModel, 'advancedSettings.customHeaders.valuePlaceholder', 'value'),
testConnection: get(settingsAiModel, 'actions.test', 'Test Connection'),
testing: isZh ? '测试中...' : 'Testing...',
testing: literals.testing,
testSuccess: get(settingsAiModel, 'messages.testSuccess', 'Connection successful'),
testFailed: get(settingsAiModel, 'messages.testFailed', 'Connection failed'),
advancedShow: 'Show advanced settings',
advancedHide: 'Hide advanced settings',
advancedShow: literals.advancedShow,
advancedHide: literals.advancedHide,
providers: buildProviderPatch(settingsAiModel),
};
}

const LOCALE_MAP = {
en: { localeDir: 'en-US', installerLocale: 'en.json' },
zh: { localeDir: 'zh-CN', installerLocale: 'zh.json' },
'zh-TW': { localeDir: 'zh-TW', installerLocale: 'zh-TW.json' },
};

function syncOne(languageTag) {
const localeDir = languageTag === 'zh' ? 'zh-CN' : 'en-US';
const installerLocale = languageTag === 'zh' ? 'zh.json' : 'en.json';
const { localeDir, installerLocale } = LOCALE_MAP[languageTag];

const sourceAiModelPath = path.join(
PROJECT_ROOT,
Expand Down Expand Up @@ -213,6 +241,7 @@ function syncOne(languageTag) {
function main() {
syncOne('en');
syncOne('zh');
syncOne('zh-TW');
console.log('[sync-model-i18n] Synced installer model i18n from web-ui locales.');
}

Expand Down
116 changes: 106 additions & 10 deletions BitFun-Installer/src/data/modelProviders.ts
Original file line number Diff line number Diff line change
Expand Up @@ -51,7 +51,7 @@ export const PROVIDER_TEMPLATES: Record<string, ProviderTemplate> = {
descriptionKey: 'model.providers.gemini.description',
baseUrl: 'https://generativelanguage.googleapis.com',
format: 'gemini',
models: ['gemini-3.1-pro-preview', 'gemini-3.1-flash-lite-preview'],
models: ['gemini-3.1-pro-preview', 'gemini-3.6-flash', 'gemini-3.5-flash-lite'],
helpUrl: 'https://aistudio.google.com/app/apikey',
},
anthropic: {
Expand All @@ -60,16 +60,16 @@ export const PROVIDER_TEMPLATES: Record<string, ProviderTemplate> = {
descriptionKey: 'model.providers.anthropic.description',
baseUrl: 'https://api.anthropic.com',
format: 'anthropic',
models: ['claude-opus-4-6', 'claude-sonnet-4-6'],
helpUrl: 'https://console.anthropic.com/',
models: ['claude-opus-5', 'claude-fable-5', 'claude-sonnet-5', 'claude-haiku-4-5'],
helpUrl: 'https://platform.claude.com/',
},
minimax: {
id: 'minimax',
nameKey: 'model.providers.minimax.name',
descriptionKey: 'model.providers.minimax.description',
baseUrl: 'https://api.minimaxi.com/anthropic',
format: 'anthropic',
models: ['MiniMax-M2.7-highspeed', 'MiniMax-M2.5-highspeed'],
models: ['MiniMax-M3', 'MiniMax-M2.7', 'MiniMax-M2.7-highspeed'],
helpUrl: 'https://platform.minimax.io/',
baseUrlOptions: [
{
Expand All @@ -82,6 +82,16 @@ export const PROVIDER_TEMPLATES: Record<string, ProviderTemplate> = {
format: 'openai',
noteKey: 'model.providers.minimax.urlOptions.openai',
},
{
url: 'https://api.minimax.io/anthropic',
format: 'anthropic',
noteKey: 'model.providers.minimax.urlOptions.intl',
},
{
url: 'https://api.minimax.io/v1',
format: 'openai',
noteKey: 'model.providers.minimax.urlOptions.intlOpenai',
},
],
},
moonshot: {
Expand All @@ -90,8 +100,35 @@ export const PROVIDER_TEMPLATES: Record<string, ProviderTemplate> = {
descriptionKey: 'model.providers.moonshot.description',
baseUrl: 'https://api.moonshot.cn/v1',
format: 'openai',
models: ['kimi-k2.5', 'kimi-k2', 'kimi-k2-thinking'],
helpUrl: 'https://platform.moonshot.ai/console',
models: ['kimi-k3', 'kimi-k2.7-code', 'kimi-k2.6'],
helpUrl: 'https://platform.kimi.ai/console',
baseUrlOptions: [
{
url: 'https://api.moonshot.cn/v1',
format: 'openai',
noteKey: 'model.providers.moonshot.urlOptions.default',
},
{
url: 'https://api.moonshot.cn/anthropic',
format: 'anthropic',
noteKey: 'model.providers.moonshot.urlOptions.anthropic',
},
{
url: 'https://api.moonshot.ai/v1',
format: 'openai',
noteKey: 'model.providers.moonshot.urlOptions.intl',
},
{
url: 'https://api.moonshot.ai/anthropic',
format: 'anthropic',
noteKey: 'model.providers.moonshot.urlOptions.intlAnthropic',
},
{
url: 'https://api.kimi.com/coding',
format: 'anthropic',
noteKey: 'model.providers.moonshot.urlOptions.kimiForCoding',
},
],
},
deepseek: {
id: 'deepseek',
Expand All @@ -101,14 +138,26 @@ export const PROVIDER_TEMPLATES: Record<string, ProviderTemplate> = {
format: 'openai',
models: ['deepseek-v4-flash', 'deepseek-v4-pro'],
helpUrl: 'https://platform.deepseek.com/api_keys',
baseUrlOptions: [
{
url: 'https://api.deepseek.com/v1',
format: 'openai',
noteKey: 'model.providers.deepseek.urlOptions.default',
},
{
url: 'https://api.deepseek.com/anthropic',
format: 'anthropic',
noteKey: 'model.providers.deepseek.urlOptions.anthropic',
},
],
},
zhipu: {
id: 'zhipu',
nameKey: 'model.providers.zhipu.name',
descriptionKey: 'model.providers.zhipu.description',
baseUrl: 'https://open.bigmodel.cn/api/paas/v4',
format: 'openai',
models: ['glm-5', 'glm-4.7'],
models: ['glm-5.2', 'glm-5.1', 'glm-5'],
helpUrl: 'https://open.bigmodel.cn/usercenter/apikeys',
baseUrlOptions: [
{
Expand All @@ -126,6 +175,21 @@ export const PROVIDER_TEMPLATES: Record<string, ProviderTemplate> = {
format: 'openai',
noteKey: 'model.providers.zhipu.urlOptions.codingPlan',
},
{
url: 'https://api.z.ai/api/paas/v4',
format: 'openai',
noteKey: 'model.providers.zhipu.urlOptions.intl',
},
{
url: 'https://api.z.ai/api/anthropic',
format: 'anthropic',
noteKey: 'model.providers.zhipu.urlOptions.intlAnthropic',
},
{
url: 'https://api.z.ai/api/coding/paas/v4',
format: 'openai',
noteKey: 'model.providers.zhipu.urlOptions.intlCodingPlan',
},
],
},
qwen: {
Expand All @@ -134,14 +198,19 @@ export const PROVIDER_TEMPLATES: Record<string, ProviderTemplate> = {
descriptionKey: 'model.providers.qwen.description',
baseUrl: 'https://dashscope.aliyuncs.com/compatible-mode/v1',
format: 'openai',
models: ['Qwen3.5-Plus', 'Qwen3.5-Flash'],
models: ['qwen3.7-plus', 'qwen3.7-max', 'qwen3.6-flash'],
helpUrl: 'https://dashscope.console.aliyun.com/apiKey',
baseUrlOptions: [
{
url: 'https://dashscope.aliyuncs.com/compatible-mode/v1',
format: 'openai',
noteKey: 'model.providers.qwen.urlOptions.default',
},
{
url: 'https://dashscope-intl.aliyuncs.com/compatible-mode/v1',
format: 'openai',
noteKey: 'model.providers.qwen.urlOptions.intl',
},
{
url: 'https://coding.dashscope.aliyuncs.com/v1',
format: 'openai',
Expand All @@ -152,6 +221,11 @@ export const PROVIDER_TEMPLATES: Record<string, ProviderTemplate> = {
format: 'anthropic',
noteKey: 'model.providers.qwen.urlOptions.codingPlanAnthropic',
},
{
url: 'https://coding-intl.dashscope.aliyuncs.com/v1',
format: 'openai',
noteKey: 'model.providers.qwen.urlOptions.intlCodingPlan',
},
],
},
volcengine: {
Expand All @@ -160,16 +234,33 @@ export const PROVIDER_TEMPLATES: Record<string, ProviderTemplate> = {
descriptionKey: 'model.providers.volcengine.description',
baseUrl: 'https://ark.cn-beijing.volces.com/api/v3',
format: 'openai',
models: ['doubao-seed-2-0-code-preview-260215', 'doubao-seed-2-0-pro-260215'],
models: ['doubao-seed-2-1-pro-260628', 'doubao-seed-2-0-code-preview-260215', 'doubao-seed-2-0-pro-260215'],
helpUrl: 'https://console.volcengine.com/ark/',
baseUrlOptions: [
{
url: 'https://ark.cn-beijing.volces.com/api/v3',
format: 'openai',
noteKey: 'model.providers.volcengine.urlOptions.default',
},
{
url: 'https://ark.cn-beijing.volces.com/api/coding/v3',
format: 'openai',
noteKey: 'model.providers.volcengine.urlOptions.codingPlan',
},
{
url: 'https://ark.ap-southeast.bytepluses.com/api/v3',
format: 'openai',
noteKey: 'model.providers.volcengine.urlOptions.intl',
},
],
},
siliconflow: {
id: 'siliconflow',
nameKey: 'model.providers.siliconflow.name',
descriptionKey: 'model.providers.siliconflow.description',
baseUrl: 'https://api.siliconflow.cn/v1',
format: 'openai',
models: [],
models: ['zai-org/GLM-5.2', 'deepseek-ai/DeepSeek-V4-Pro', 'deepseek-ai/DeepSeek-V4-Flash'],
helpUrl: 'https://cloud.siliconflow.cn/account/ak',
baseUrlOptions: [
{
Expand All @@ -182,6 +273,11 @@ export const PROVIDER_TEMPLATES: Record<string, ProviderTemplate> = {
format: 'anthropic',
noteKey: 'model.providers.siliconflow.urlOptions.anthropic',
},
{
url: 'https://api.siliconflow.com/v1',
format: 'openai',
noteKey: 'model.providers.siliconflow.urlOptions.intl',
},
],
},
nvidia: {
Expand Down
Loading