新增openrouter的支持

This commit is contained in:
Wenjie Zhang 2025-04-10 11:42:20 +08:00
parent 2bfe284dd1
commit aa50f24c4f
6 changed files with 44 additions and 26 deletions

View File

@ -1,5 +1,5 @@
import os import os
import traceback
from src import config from src import config
from src.utils.logging_config import logger from src.utils.logging_config import logger
from src.models.chat_model import OpenAIBase from src.models.chat_model import OpenAIBase
@ -14,33 +14,23 @@ def select_model(model_provider=None, model_name=None):
logger.info(f"Selecting model from `{model_provider}` with `{model_name}`") logger.info(f"Selecting model from `{model_provider}` with `{model_name}`")
if model_provider in [
"deepseek",
"ark",
"siliconflow",
"zhipu",
"lingyiwanwu",
"together.ai",
]:
return OpenAIBase(
api_key=os.getenv(model_info["env"][0]),
base_url=model_info["base_url"],
model_name=model_name,
)
elif model_provider == "qianfan": if model_provider is None:
raise ValueError("Model provider not specified, please modify `model_provider` in `src/config/base.yaml`")
if model_provider == "qianfan":
from src.models.chat_model import Qianfan from src.models.chat_model import Qianfan
return Qianfan(model_name) return Qianfan(model_name)
elif model_provider == "dashscope": if model_provider == "dashscope":
from src.models.chat_model import DashScope from src.models.chat_model import DashScope
return DashScope(model_name) return DashScope(model_name)
elif model_provider == "openai": if model_provider == "openai":
from src.models.chat_model import OpenModel from src.models.chat_model import OpenModel
return OpenModel(model_name) return OpenModel(model_name)
elif model_provider == "custom": if model_provider == "custom":
model_info = next((x for x in config.custom_models if x["custom_id"] == model_name), None) model_info = next((x for x in config.custom_models if x["custom_id"] == model_name), None)
if model_info is None: if model_info is None:
raise ValueError(f"Model {model_name} not found in custom models") raise ValueError(f"Model {model_name} not found in custom models")
@ -48,7 +38,13 @@ def select_model(model_provider=None, model_name=None):
from src.models.chat_model import CustomModel from src.models.chat_model import CustomModel
return CustomModel(model_info) return CustomModel(model_info)
elif model_provider is None: # 其他模型默认使用OpenAIBase
raise ValueError("Model provider not specified, please modify `model_provider` in `src/config/base.yaml`") try:
else: model = OpenAIBase(
raise ValueError(f"Model provider {model_provider} not supported") api_key=os.getenv(model_info["env"][0]),
base_url=model_info["base_url"],
model_name=model_name,
)
return model
except Exception as e:
raise ValueError(f"Model provider {model_provider} load failed, {e} \n {traceback.format_exc()}")

View File

@ -99,6 +99,7 @@ MODEL_NAMES:
- doubao-1-5-pro-32k-250115 - doubao-1-5-pro-32k-250115
- doubao-1-5-lite-32k-250115 - doubao-1-5-lite-32k-250115
- deepseek-r1-250120 - deepseek-r1-250120
lingyiwanwu: lingyiwanwu:
name: 零一万物 name: 零一万物
url: https://platform.lingyiwanwu.com/docs#%E6%A8%A1%E5%9E%8B%E4%B8%8E%E8%AE%A1%E8%B4%B9 url: https://platform.lingyiwanwu.com/docs#%E6%A8%A1%E5%9E%8B%E4%B8%8E%E8%AE%A1%E8%B4%B9
@ -109,6 +110,24 @@ MODEL_NAMES:
models: models:
- yi-lightning - yi-lightning
openrouter:
name: OpenRouter
url: https://openrouter.ai/models
base_url: https://openrouter.ai/api/v1
default: openai/gpt-4o
env:
- OPENROUTER_API_KEY
models:
- openai/gpt-4o
- openai/gpt-4o-mini
- google/gemini-2.5-pro-exp-03-25:free
- x-ai/grok-3-beta
- meta-llama/llama-4-maverick
- meta-llama/llama-4-maverick:free
- anthropic/claude-3.7-sonnet
- anthropic/claude-3.7-sonnet:thinking
EMBED_MODEL_INFO: EMBED_MODEL_INFO:
local/BAAI/bge-m3: local/BAAI/bge-m3:
name: BAAI/bge-m3 name: BAAI/bge-m3

Binary file not shown.

After

Width:  |  Height:  |  Size: 17 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.9 KiB

View File

@ -7,7 +7,8 @@ import zhipuIcon from '@/assets/providers/zhipuai.png'
import siliconflowIcon from '@/assets/providers/siliconflow.png' import siliconflowIcon from '@/assets/providers/siliconflow.png'
import arkIcon from '@/assets/providers/ark.png' import arkIcon from '@/assets/providers/ark.png'
import lingyiwanwuIcon from '@/assets/providers/lingyiwanwu.png' import lingyiwanwuIcon from '@/assets/providers/lingyiwanwu.png'
import openrouterIcon from '@/assets/providers/openrouterai.png'
import defaultIcon from '@/assets/providers/default.png'
export const modelIcons = { export const modelIcons = {
openai: openaiIcon, openai: openaiIcon,
@ -19,5 +20,7 @@ export const modelIcons = {
siliconflow: siliconflowIcon, siliconflow: siliconflowIcon,
ark: arkIcon, ark: arkIcon,
'together.ai': togetherIcon, 'together.ai': togetherIcon,
lingyiwanwu: lingyiwanwuIcon lingyiwanwu: lingyiwanwuIcon,
openrouter: openrouterIcon,
default: defaultIcon // 添加默认图标
} }

View File

@ -162,7 +162,7 @@
<div class="card-header" @click="toggleExpand(item)"> <div class="card-header" @click="toggleExpand(item)">
<!-- <div v-if="modelStatus[item]" class="success"></div> --> <!-- <div v-if="modelStatus[item]" class="success"></div> -->
<div :class="{'model-icon': true, 'available': modelStatus[item]}"> <div :class="{'model-icon': true, 'available': modelStatus[item]}">
<img :src="modelIcons[item]" alt="模型图标"> <img :src="modelIcons[item] || modelIcons.default" alt="模型图标">
</div> </div>
<div class="model-title-container"> <div class="model-title-container">
<h3>{{ modelNames[item].name }}</h3> <h3>{{ modelNames[item].name }}</h3>
@ -203,7 +203,7 @@
<div class="model-provider-card" v-for="(item, key) in notModelKeys" :key="key"> <div class="model-provider-card" v-for="(item, key) in notModelKeys" :key="key">
<div class="card-header"> <div class="card-header">
<div class="model-icon"> <div class="model-icon">
<img :src="modelIcons[item]" alt="模型图标"> <img :src="modelIcons[item] || modelIcons.default" alt="模型图标">
</div> </div>
<div class="model-title-container"> <div class="model-title-container">
<h3 style="font-weight: 400">{{ modelNames[item].name }}</h3> <h3 style="font-weight: 400">{{ modelNames[item].name }}</h3>