diff --git a/server/routers/chat_router.py b/server/routers/chat_router.py index b10945c4..0d8058a3 100644 --- a/server/routers/chat_router.py +++ b/server/routers/chat_router.py @@ -118,6 +118,7 @@ def chat_post( @chat.post("/call") async def call(query: str = Body(...), meta: dict = Body(None)): + meta = meta or {} model = select_model(model_provider=meta.get("model_provider"), model_name=meta.get("model_name")) async def predict_async(query): loop = asyncio.get_event_loop() @@ -129,7 +130,7 @@ async def call(query: str = Body(...), meta: dict = Body(None)): return {"response": response.content} @chat.post("/call_lite") -async def call(query: str = Body(...), meta: dict = Body(None)): +async def call_lite(query: str = Body(...), meta: dict = Body(None)): meta = meta or {} async def predict_async(query): loop = asyncio.get_event_loop() diff --git a/src/config/__init__.py b/src/config/__init__.py index da6bcac8..764778d9 100644 --- a/src/config/__init__.py +++ b/src/config/__init__.py @@ -99,11 +99,12 @@ class Config(SimpleConfig): except FileNotFoundError: _models_private = {} - _models = {**_models, **_models_private} + # 修改为按照子元素合并 + # _models = {**_models, **_models_private} - self.model_names = _models["MODEL_NAMES"] - self.embed_model_names = _models["EMBED_MODEL_INFO"] - self.reranker_names = _models["RERANKER_LIST"] + self.model_names = {**_models["MODEL_NAMES"], **_models_private["MODEL_NAMES"]} + self.embed_model_names = {**_models["EMBED_MODEL_INFO"], **_models_private["EMBED_MODEL_INFO"]} + self.reranker_names = {**_models["RERANKER_LIST"], **_models_private["RERANKER_LIST"]} def _save_models_to_file(self): _models = { diff --git a/src/models/__init__.py b/src/models/__init__.py index b796a52b..19867377 100644 --- a/src/models/__init__.py +++ b/src/models/__init__.py @@ -1,5 +1,5 @@ import os - +import traceback from src import config from src.utils.logging_config import logger 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}`") - 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 return Qianfan(model_name) - elif model_provider == "dashscope": + if model_provider == "dashscope": from src.models.chat_model import DashScope return DashScope(model_name) - elif model_provider == "openai": + if model_provider == "openai": from src.models.chat_model import OpenModel 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) if model_info is None: 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 return CustomModel(model_info) - elif model_provider is None: - raise ValueError("Model provider not specified, please modify `model_provider` in `src/config/base.yaml`") - else: - raise ValueError(f"Model provider {model_provider} not supported") + # 其他模型,默认使用OpenAIBase + try: + model = OpenAIBase( + 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()}") diff --git a/src/static/models.yaml b/src/static/models.yaml index 9a41c7a9..037c6d46 100644 --- a/src/static/models.yaml +++ b/src/static/models.yaml @@ -99,6 +99,7 @@ MODEL_NAMES: - doubao-1-5-pro-32k-250115 - doubao-1-5-lite-32k-250115 - deepseek-r1-250120 + lingyiwanwu: name: 零一万物 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: - 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: local/BAAI/bge-m3: name: BAAI/bge-m3 diff --git a/web/src/assets/pics/guides/how-to-add-models.png b/web/src/assets/pics/guides/how-to-add-models.png new file mode 100644 index 00000000..26060f29 Binary files /dev/null and b/web/src/assets/pics/guides/how-to-add-models.png differ diff --git a/web/src/assets/providers/default.png b/web/src/assets/providers/default.png new file mode 100644 index 00000000..289f0d16 Binary files /dev/null and b/web/src/assets/providers/default.png differ diff --git a/web/src/assets/providers/openrouterai.png b/web/src/assets/providers/openrouterai.png new file mode 100644 index 00000000..6138661c Binary files /dev/null and b/web/src/assets/providers/openrouterai.png differ diff --git a/web/src/utils/modelIcon.js b/web/src/utils/modelIcon.js index b0b0e35f..f9aea808 100644 --- a/web/src/utils/modelIcon.js +++ b/web/src/utils/modelIcon.js @@ -7,7 +7,8 @@ import zhipuIcon from '@/assets/providers/zhipuai.png' import siliconflowIcon from '@/assets/providers/siliconflow.png' import arkIcon from '@/assets/providers/ark.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 = { openai: openaiIcon, @@ -19,5 +20,7 @@ export const modelIcons = { siliconflow: siliconflowIcon, ark: arkIcon, 'together.ai': togetherIcon, - lingyiwanwu: lingyiwanwuIcon + lingyiwanwu: lingyiwanwuIcon, + openrouter: openrouterIcon, + default: defaultIcon // 添加默认图标 } diff --git a/web/src/views/SettingView.vue b/web/src/views/SettingView.vue index c8ba40df..bec90fc9 100644 --- a/web/src/views/SettingView.vue +++ b/web/src/views/SettingView.vue @@ -162,7 +162,7 @@
+