From 16c28bf1ba783c8b8ee43b2b73b873907dc7ea5a Mon Sep 17 00:00:00 2001 From: Toddy <167494546+toddyoe@users.noreply.github.com> Date: Fri, 14 Mar 2025 02:55:29 +0000 Subject: [PATCH] combine multiple system instructions into one --- app/api/gemini_routes.py | 46 +++++++++++++++++++------- app/services/chat/message_converter.py | 12 +++++-- 2 files changed, 44 insertions(+), 14 deletions(-) diff --git a/app/api/gemini_routes.py b/app/api/gemini_routes.py index bc5bf15..9b939d1 100644 --- a/app/api/gemini_routes.py +++ b/app/api/gemini_routes.py @@ -36,18 +36,40 @@ async def list_models(_=Depends(security_service.verify_key), api_key = await key_manager.get_next_working_key() logger.info(f"Using API key: {api_key}") models_json = model_service.get_gemini_models(api_key) - models_json["models"].append({"name": "models/gemini-2.0-flash-exp-search", "version": "2.0", - "displayName": "Gemini 2.0 Flash Search Experimental", - "description": "Gemini 2.0 Flash Search Experimental", "inputTokenLimit": 32767, - "outputTokenLimit": 8192, - "supportedGenerationMethods": ["generateContent", "countTokens"], "temperature": 1, - "topP": 0.95, "topK": 64, "maxTemperature": 2}) - models_json["models"].append({"name": "models/gemini-2.0-flash-exp-image", "version": "2.0", - "displayName": "Gemini 2.0 Flash Image Experimental", - "description": "Gemini 2.0 Flash Image Experimental", "inputTokenLimit": 32767, - "outputTokenLimit": 8192, - "supportedGenerationMethods": ["generateContent", "countTokens"], "temperature": 1, - "topP": 0.95, "topK": 64, "maxTemperature": 2}) + + # 模型名称以及对应的详细信息 + model_mapping = {x.get("name", "").split("/", maxsplit=1)[1]: x for x in models_json["models"]} + + # 添加搜索模型 + if settings.MODEL_SEARCH: + for name in settings.MODEL_SEARCH: + model = model_mapping.get(name, None) + if not model: + continue + + item = deepcopy(model) + item["name"] = f"models/{name}-search" + display_name = f'{item.get("displayName")} For Search' + item["displayName"] = display_name + item["description"] = display_name + + models_json["models"].append(item) + + # 添加图像生成模型 + if settings.MODEL_IMAGE: + for name in settings.MODEL_IMAGE: + model = model_mapping.get(name, None) + if not model: + continue + + item = deepcopy(model) + item["name"] = f"models/{name}-image" + display_name = f'{item.get("displayName")} For Image' + item["displayName"] = display_name + item["description"] = display_name + + models_json["models"].append(item) + return models_json diff --git a/app/services/chat/message_converter.py b/app/services/chat/message_converter.py index ee99377..d5b7d64 100644 --- a/app/services/chat/message_converter.py +++ b/app/services/chat/message_converter.py @@ -34,7 +34,7 @@ class OpenAIMessageConverter(MessageConverter): def convert(self, messages: List[Dict[str, Any]]) -> tuple[List[Dict[str, Any]], Optional[Dict[str, Any]]]: converted_messages = [] - system_instruction = None + system_instruction_parts = [] for idx, msg in enumerate(messages): role = msg.get("role", "") @@ -64,8 +64,16 @@ class OpenAIMessageConverter(MessageConverter): if parts: if role == "system": - system_instruction = {"role": "system", "parts": parts} + system_instruction_parts.extend(parts) else: converted_messages.append({"role": role, "parts": parts}) + system_instruction = ( + None + if not system_instruction_parts + else { + "role": "system", + "parts": system_instruction_parts, + } + ) return converted_messages, system_instruction