From b59c53ad07e113c7723f5b0963063d54f1fbf5a6 Mon Sep 17 00:00:00 2001 From: dimitrievgs Date: Wed, 17 Sep 2025 02:23:19 +0300 Subject: [PATCH] add posibility to choose model --- app/api.py | 8 +++++++- app/llm_client.py | 15 +++++++++------ app/models.py | 3 ++- app/nodes.py | 4 +++- app/workflows.py | 12 +++++++++--- 5 files changed, 30 insertions(+), 12 deletions(-) diff --git a/app/api.py b/app/api.py index b309392..15865ea 100644 --- a/app/api.py +++ b/app/api.py @@ -7,6 +7,7 @@ from flask import Flask, request, jsonify from flask_cors import CORS from workflows import run_agent, graph_history_manager +from llm_client import MODELS # Добавляем импорт списка моделей api = Flask(__name__) CORS( @@ -23,12 +24,13 @@ def chat(): parent_node_id = data.get( "parent_node_id") # Получаем parent_node_id из запроса system_prompt = data.get("system_prompt") + model = data.get("model") if not message: return jsonify({"error": "Сообщение не может быть пустым."}, 400) result = run_agent(message, graph_id, - parent_node_id, system_prompt) # Передаем parent_node_id в run_agent + parent_node_id, system_prompt, model) # Передаем parent_node_id в run_agent return jsonify(result) @@ -79,3 +81,7 @@ def get_messages_from_root_to_node(graph_id, node_id): graph_data, target_node_id) return jsonify(messages) +@api.route('/api/models', methods=['GET']) +def get_available_models(): + """API endpoint для получения списка доступных моделей.""" + return jsonify(list(MODELS.keys())) \ No newline at end of file diff --git a/app/llm_client.py b/app/llm_client.py index c3230df..f223deb 100644 --- a/app/llm_client.py +++ b/app/llm_client.py @@ -31,13 +31,12 @@ MODELS: Dict[str, Dict[str, Any]] = { "stream": True, "capabilities": ["vision"], }, - "gemini-2.5-flash-preview-05-20": { - "name": "gemini-2.5-flash-preview-05-20", + "gemini-2.5-flash-bh": { + "name": "gemini-2.5-flash", "provider": "openai", # Изменено на "openai" - "model_name": - "gemini-2.5-flash-preview-05-20", # Добавлено имя модели для LangChain - "apiBase": "https://render-service-gsu7.onrender.com/g/v1beta", - "apiKey": "AIzaSyDpueKFWVqknVKlQn6TdasLmJ2lvAUiBik", + "model_name": "gemini-2.5-flash", # Добавлено имя модели для LangChain + "apiBase": "https://bothub.chat/api/v2/openai/v1", + "apiKey": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6ImQ3MTMwYTk0LTJiNmMtNDgzZi04Y2NiLWM5MjgwNzlmNDFlZSIsImlzRGV2ZWxvcGVyIjp0cnVlLCJpYXQiOjE3NTQ0NzYwMDcsImV4cCI6MjA3MDA1MjAwN30._64_DXNZatdd4-4VbXp8dOXdDhIlNWMQt9A_Nn6mu3g", "stream": True, "capabilities": ["vision"], }, @@ -204,3 +203,7 @@ def get_llm(name: str) -> CustomLLM: if not config: raise ValueError(f"Модель '{name}' не сконфигурирована.") return CustomLLM(config) + +def get_available_models(): + """Возвращает список доступных моделей.""" + return list(MODELS.keys()) \ No newline at end of file diff --git a/app/models.py b/app/models.py index fb00a35..e662b8c 100644 --- a/app/models.py +++ b/app/models.py @@ -37,4 +37,5 @@ class AgentState(BaseModel): temporary_chat_history: List[Dict[str, Any]] = Field( [], description="Временная история чата, не сохраняемая в БД.") system_prompt: Optional[str] = Field(None, - description="Системный промпт.") \ No newline at end of file + description="Системный промпт.") + selected_model: str = Field(None, description="Модель llm.") \ No newline at end of file diff --git a/app/nodes.py b/app/nodes.py index 820ce36..a744514 100644 --- a/app/nodes.py +++ b/app/nodes.py @@ -163,7 +163,9 @@ def call_llm_node(state: AgentState) -> AgentState: elif msg["role"] == "assistant": messages_for_llm.append(AIMessage(content=msg["content"])) - response = main_llm.invoke(messages_for_llm) + model_name = state.selected_model + llm = get_llm(model_name) + response = llm.invoke(messages_for_llm) llm_node_id = str(uuid.uuid4()) diff --git a/app/workflows.py b/app/workflows.py index b839e28..04e8547 100644 --- a/app/workflows.py +++ b/app/workflows.py @@ -93,7 +93,8 @@ app = workflow.compile() def run_agent(user_input: str, existing_graph_id: Optional[str] = None, parent_node_id: Optional[str] = None, - system_prompt: Optional[str] = None) -> Dict[str, Any]: + system_prompt: Optional[str] = None, + model: Optional[str] = None) -> Dict[str, Any]: """ Запускает агента с заданным пользовательским вводом. Может продолжить существующий граф по graph_id. @@ -101,8 +102,13 @@ def run_agent(user_input: str, """ # ---------------------------------------------------- Initial State Setup ---------------------------------------------------------------- - initial_state = AgentState(input=user_input, parent_node_id=parent_node_id, system_prompt=system_prompt) - + initial_state = AgentState( + input=user_input, + parent_node_id=parent_node_id, + system_prompt=system_prompt, + selected_model=model or "gemini-2.5-flash" + ) + # Сохраняем исходные ID узлов и ребер для определения новых после выполнения графа original_node_ids: Set[str] = set() original_edge_ids: Set[str] = set()