add posibility to choose model

This commit is contained in:
dimitrievgs 2025-09-17 02:23:19 +03:00
parent d5a32a534f
commit b59c53ad07
5 changed files with 30 additions and 12 deletions

View File

@ -7,6 +7,7 @@
from flask import Flask, request, jsonify from flask import Flask, request, jsonify
from flask_cors import CORS from flask_cors import CORS
from workflows import run_agent, graph_history_manager from workflows import run_agent, graph_history_manager
from llm_client import MODELS # Добавляем импорт списка моделей
api = Flask(__name__) api = Flask(__name__)
CORS( CORS(
@ -23,12 +24,13 @@ def chat():
parent_node_id = data.get( parent_node_id = data.get(
"parent_node_id") # Получаем parent_node_id из запроса "parent_node_id") # Получаем parent_node_id из запроса
system_prompt = data.get("system_prompt") system_prompt = data.get("system_prompt")
model = data.get("model")
if not message: if not message:
return jsonify({"error": "Сообщение не может быть пустым."}, 400) return jsonify({"error": "Сообщение не может быть пустым."}, 400)
result = run_agent(message, graph_id, 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) return jsonify(result)
@ -79,3 +81,7 @@ def get_messages_from_root_to_node(graph_id, node_id):
graph_data, target_node_id) graph_data, target_node_id)
return jsonify(messages) return jsonify(messages)
@api.route('/api/models', methods=['GET'])
def get_available_models():
"""API endpoint для получения списка доступных моделей."""
return jsonify(list(MODELS.keys()))

View File

@ -31,13 +31,12 @@ MODELS: Dict[str, Dict[str, Any]] = {
"stream": True, "stream": True,
"capabilities": ["vision"], "capabilities": ["vision"],
}, },
"gemini-2.5-flash-preview-05-20": { "gemini-2.5-flash-bh": {
"name": "gemini-2.5-flash-preview-05-20", "name": "gemini-2.5-flash",
"provider": "openai", # Изменено на "openai" "provider": "openai", # Изменено на "openai"
"model_name": "model_name": "gemini-2.5-flash", # Добавлено имя модели для LangChain
"gemini-2.5-flash-preview-05-20", # Добавлено имя модели для LangChain "apiBase": "https://bothub.chat/api/v2/openai/v1",
"apiBase": "https://render-service-gsu7.onrender.com/g/v1beta", "apiKey": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6ImQ3MTMwYTk0LTJiNmMtNDgzZi04Y2NiLWM5MjgwNzlmNDFlZSIsImlzRGV2ZWxvcGVyIjp0cnVlLCJpYXQiOjE3NTQ0NzYwMDcsImV4cCI6MjA3MDA1MjAwN30._64_DXNZatdd4-4VbXp8dOXdDhIlNWMQt9A_Nn6mu3g",
"apiKey": "AIzaSyDpueKFWVqknVKlQn6TdasLmJ2lvAUiBik",
"stream": True, "stream": True,
"capabilities": ["vision"], "capabilities": ["vision"],
}, },
@ -204,3 +203,7 @@ def get_llm(name: str) -> CustomLLM:
if not config: if not config:
raise ValueError(f"Модель '{name}' не сконфигурирована.") raise ValueError(f"Модель '{name}' не сконфигурирована.")
return CustomLLM(config) return CustomLLM(config)
def get_available_models():
"""Возвращает список доступных моделей."""
return list(MODELS.keys())

View File

@ -38,3 +38,4 @@ class AgentState(BaseModel):
[], description="Временная история чата, не сохраняемая в БД.") [], description="Временная история чата, не сохраняемая в БД.")
system_prompt: Optional[str] = Field(None, system_prompt: Optional[str] = Field(None,
description="Системный промпт.") description="Системный промпт.")
selected_model: str = Field(None, description="Модель llm.")

View File

@ -163,7 +163,9 @@ def call_llm_node(state: AgentState) -> AgentState:
elif msg["role"] == "assistant": elif msg["role"] == "assistant":
messages_for_llm.append(AIMessage(content=msg["content"])) 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()) llm_node_id = str(uuid.uuid4())

View File

@ -93,7 +93,8 @@ app = workflow.compile()
def run_agent(user_input: str, def run_agent(user_input: str,
existing_graph_id: Optional[str] = None, existing_graph_id: Optional[str] = None,
parent_node_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. Может продолжить существующий граф по graph_id.
@ -101,7 +102,12 @@ def run_agent(user_input: str,
""" """
# ---------------------------------------------------- Initial State Setup ---------------------------------------------------------------- # ---------------------------------------------------- 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 узлов и ребер для определения новых после выполнения графа # Сохраняем исходные ID узлов и ребер для определения новых после выполнения графа
original_node_ids: Set[str] = set() original_node_ids: Set[str] = set()