feat(aihr): add siliconflow embedding provider
This commit is contained in:
+4
-2
@@ -59,7 +59,8 @@ public class AihrModelSeedService {
|
|||||||
new ProviderResponse(-2L, "DeepSeek", "deepseek", "DeepSeek 官方 API", "https://api.deepseek.com", "0", 1, "ruoyi-ai", false),
|
new ProviderResponse(-2L, "DeepSeek", "deepseek", "DeepSeek 官方 API", "https://api.deepseek.com", "0", 1, "ruoyi-ai", false),
|
||||||
new ProviderResponse(-3L, "智谱 AI", "zhipu", "智谱 AI 大模型服务", "https://open.bigmodel.cn", "0", 2, "ruoyi-ai", false),
|
new ProviderResponse(-3L, "智谱 AI", "zhipu", "智谱 AI 大模型服务", "https://open.bigmodel.cn", "0", 2, "ruoyi-ai", false),
|
||||||
new ProviderResponse(-4L, "阿里云百炼", "qianwen", "阿里云百炼大模型服务", "https://dashscope.aliyuncs.com/compatible-mode/v1", "0", 3, "ruoyi-ai", false),
|
new ProviderResponse(-4L, "阿里云百炼", "qianwen", "阿里云百炼大模型服务", "https://dashscope.aliyuncs.com/compatible-mode/v1", "0", 3, "ruoyi-ai", false),
|
||||||
new ProviderResponse(-5L, "Ollama", "ollama", "本地 Ollama 服务", "http://127.0.0.1:11434/v1", "0", 4, "ruoyi-ai", false)
|
new ProviderResponse(-5L, "Ollama", "ollama", "本地 Ollama 服务", "http://127.0.0.1:11434/v1", "0", 4, "ruoyi-ai", false),
|
||||||
|
new ProviderResponse(-6L, "硅基流动", "siliconflow", "硅基流动 OpenAI 兼容接口", "https://api.siliconflow.cn/v1", "0", 5, "seed", false)
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -67,7 +68,8 @@ public class AihrModelSeedService {
|
|||||||
return List.of(
|
return List.of(
|
||||||
new ConfigResponse(-1L, "chat", DEFAULT_MODEL, DEFAULT_PROVIDER, "Demo 对话与 RAG 生成模型", null, "Y", null, true, false, false),
|
new ConfigResponse(-1L, "chat", DEFAULT_MODEL, DEFAULT_PROVIDER, "Demo 对话与 RAG 生成模型", null, "Y", null, true, false, false),
|
||||||
new ConfigResponse(-2L, "vector", "embedding-3", "zhipu", "后续用于知识片段向量化", 2048, "N", null, false, false, false),
|
new ConfigResponse(-2L, "vector", "embedding-3", "zhipu", "后续用于知识片段向量化", 2048, "N", null, false, false, false),
|
||||||
new ConfigResponse(-3L, "rerank", "rerank", "zhipu", "后续用于召回片段重排序", null, "N", null, false, false, false)
|
new ConfigResponse(-3L, "rerank", "rerank", "zhipu", "后续用于召回片段重排序", null, "N", null, false, false, false),
|
||||||
|
new ConfigResponse(-4L, "vector", "BAAI/bge-m3", "siliconflow", "硅基流动 bge-m3,用于知识片段向量化", 1024, "N", null, false, false, false)
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -298,6 +298,18 @@ const seedProviders: ProviderView[] = [
|
|||||||
source: 'seed',
|
source: 'seed',
|
||||||
configured: false,
|
configured: false,
|
||||||
logo: 'OL'
|
logo: 'OL'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: -6,
|
||||||
|
providerName: '硅基流动',
|
||||||
|
providerCode: 'siliconflow',
|
||||||
|
providerDesc: '硅基流动 OpenAI 兼容接口',
|
||||||
|
apiHost: 'https://api.siliconflow.cn/v1',
|
||||||
|
status: '0',
|
||||||
|
sortOrder: 5,
|
||||||
|
source: 'seed',
|
||||||
|
configured: false,
|
||||||
|
logo: 'SF'
|
||||||
}
|
}
|
||||||
];
|
];
|
||||||
|
|
||||||
@@ -350,6 +362,19 @@ const seedModels: ModelConfig[] = [
|
|||||||
enabled: false,
|
enabled: false,
|
||||||
apiKeyConfigured: false,
|
apiKeyConfigured: false,
|
||||||
configured: false
|
configured: false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: -5,
|
||||||
|
category: 'vector',
|
||||||
|
modelName: 'BAAI/bge-m3',
|
||||||
|
providerCode: 'siliconflow',
|
||||||
|
modelDescribe: '硅基流动 bge-m3,用于知识片段向量化',
|
||||||
|
modelDimension: 1024,
|
||||||
|
modelShow: 'N',
|
||||||
|
apiHost: '',
|
||||||
|
enabled: false,
|
||||||
|
apiKeyConfigured: false,
|
||||||
|
configured: false
|
||||||
}
|
}
|
||||||
];
|
];
|
||||||
|
|
||||||
@@ -421,13 +446,23 @@ const providerTag = (provider: ProviderView) => {
|
|||||||
const normalizeProviders = (items: ModelProvider[]): ProviderView[] => {
|
const normalizeProviders = (items: ModelProvider[]): ProviderView[] => {
|
||||||
if (!items.length) return seedProviders;
|
if (!items.length) return seedProviders;
|
||||||
const seedMap = new Map(seedProviders.map((item) => [item.providerCode, item]));
|
const seedMap = new Map(seedProviders.map((item) => [item.providerCode, item]));
|
||||||
return items.map((item) => {
|
const rows = items.map((item) => {
|
||||||
const seed = seedMap.get(item.providerCode);
|
const seed = seedMap.get(item.providerCode);
|
||||||
return {
|
return {
|
||||||
...item,
|
...item,
|
||||||
logo: seed?.logo ?? item.providerName.slice(0, 2).toUpperCase()
|
logo: seed?.logo ?? item.providerName.slice(0, 2).toUpperCase()
|
||||||
};
|
};
|
||||||
});
|
});
|
||||||
|
const existingCodes = new Set(rows.map((item) => item.providerCode));
|
||||||
|
return [...rows, ...seedProviders.filter((item) => !existingCodes.has(item.providerCode))];
|
||||||
|
};
|
||||||
|
|
||||||
|
const modelKey = (item: ModelConfig) => `${item.category}:${item.providerCode}:${item.modelName}`;
|
||||||
|
|
||||||
|
const normalizeModels = (items: ModelConfig[]): ModelConfig[] => {
|
||||||
|
if (!items.length) return seedModels;
|
||||||
|
const existingKeys = new Set(items.map(modelKey));
|
||||||
|
return [...items, ...seedModels.filter((item) => !existingKeys.has(modelKey(item)))];
|
||||||
};
|
};
|
||||||
|
|
||||||
const loadData = async (preferredProviderCode = selectedProviderCode.value) => {
|
const loadData = async (preferredProviderCode = selectedProviderCode.value) => {
|
||||||
@@ -435,7 +470,7 @@ const loadData = async (preferredProviderCode = selectedProviderCode.value) => {
|
|||||||
try {
|
try {
|
||||||
const [providerResult, configResult] = await Promise.all([getModelProviders(), getModelConfigs()]);
|
const [providerResult, configResult] = await Promise.all([getModelProviders(), getModelConfigs()]);
|
||||||
providers.value = normalizeProviders(providerResult.data ?? []);
|
providers.value = normalizeProviders(providerResult.data ?? []);
|
||||||
modelRows.value = configResult.data?.length ? configResult.data : seedModels;
|
modelRows.value = normalizeModels(configResult.data ?? []);
|
||||||
selectedProviderCode.value =
|
selectedProviderCode.value =
|
||||||
providers.value.find((item) => item.providerCode === preferredProviderCode)?.providerCode ?? providers.value[0]?.providerCode ?? 'deepseek';
|
providers.value.find((item) => item.providerCode === preferredProviderCode)?.providerCode ?? providers.value[0]?.providerCode ?? 'deepseek';
|
||||||
} catch {
|
} catch {
|
||||||
@@ -751,6 +786,11 @@ onMounted(loadData);
|
|||||||
color: #334155;
|
color: #334155;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.logo-siliconflow {
|
||||||
|
background: #f3e8ff;
|
||||||
|
color: #6d28d9;
|
||||||
|
}
|
||||||
|
|
||||||
.provider-text {
|
.provider-text {
|
||||||
min-width: 0;
|
min-width: 0;
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user