vioott commited on
Commit
2046451
·
1 Parent(s): fd5e9cf

feat(gemini): implement dynamic model selection in chat interface

Browse files
Files changed (3) hide show
  1. routes/chat.py +18 -4
  2. services/genai_service.py +31 -4
  3. templates/chat.html +12 -1
routes/chat.py CHANGED
@@ -3,7 +3,7 @@ import sys
3
  import logging
4
  import traceback
5
  from flask import Blueprint, render_template, request
6
- from services.genai_service import configure_genai
7
  from logs import get_user_history, save_log
8
 
9
  # Configurar logger
@@ -23,13 +23,25 @@ def chat(user_id):
23
  if not history:
24
  return render_template('error_redirect.html')
25
 
 
 
 
 
 
 
 
 
 
 
26
  response = None
27
 
28
  if request.method == 'POST':
29
  question = request.form.get('question')
 
 
30
 
31
  try:
32
- model = configure_genai()
33
  session = model.start_chat(enable_automatic_function_calling=True)
34
 
35
  prompt = (
@@ -51,7 +63,7 @@ def chat(user_id):
51
  save_log(user_id, history, response)
52
 
53
  except Exception as e:
54
- logger.error(f"Erro CRÍTICO ao usar a IA: {e}")
55
  logger.error(traceback.format_exc())
56
  print(f"Erro ao usar a IA (stdout): {e}", flush=True)
57
  print(traceback.format_exc(), flush=True)
@@ -72,5 +84,7 @@ def chat(user_id):
72
  'chat.html',
73
  user_id=user_id,
74
  response=formatted_response,
75
- history=history
 
 
76
  )
 
3
  import logging
4
  import traceback
5
  from flask import Blueprint, render_template, request
6
+ from services.genai_service import configure_genai, list_available_models
7
  from logs import get_user_history, save_log
8
 
9
  # Configurar logger
 
23
  if not history:
24
  return render_template('error_redirect.html')
25
 
26
+ # Busca modelos disponíveis dinamicamente
27
+ available_models = list_available_models()
28
+
29
+ # Fallback se a API falhar: garante que pelo menos o padrão funcione
30
+ if not available_models:
31
+ available_models = [{"id": "gemini-2.5-flash", "name": "Gemini 2.5 Flash (Padrão)"}]
32
+
33
+ # Define o modelo atual (o primeiro da lista ou o padrão)
34
+ current_model = available_models[0]['id']
35
+
36
  response = None
37
 
38
  if request.method == 'POST':
39
  question = request.form.get('question')
40
+ # Atualiza com a escolha do usuário
41
+ current_model = request.form.get('model_name', current_model)
42
 
43
  try:
44
+ model = configure_genai(current_model)
45
  session = model.start_chat(enable_automatic_function_calling=True)
46
 
47
  prompt = (
 
63
  save_log(user_id, history, response)
64
 
65
  except Exception as e:
66
+ logger.error(f"Erro CRÍTICO ao usar a IA ({current_model}): {e}")
67
  logger.error(traceback.format_exc())
68
  print(f"Erro ao usar a IA (stdout): {e}", flush=True)
69
  print(traceback.format_exc(), flush=True)
 
84
  'chat.html',
85
  user_id=user_id,
86
  response=formatted_response,
87
+ history=history,
88
+ models=available_models,
89
+ current_model=current_model
90
  )
services/genai_service.py CHANGED
@@ -5,9 +5,9 @@ from dotenv import load_dotenv
5
  load_dotenv()
6
 
7
 
8
- def configure_genai():
9
  """
10
- Configura a chave de API e inicializa o modelo Gemini.
11
  """
12
  api_key = os.getenv("GOOGLE_API_KEY")
13
 
@@ -18,10 +18,37 @@ def configure_genai():
18
 
19
  try:
20
  genai.configure(api_key=api_key)
21
- model = genai.GenerativeModel("gemini-2.5-flash")
22
- print("✅ Chave da API configurada com sucesso.")
 
23
  return model
24
 
25
  except Exception as e:
26
  print(f"❌ Falha ao configurar a chave da API: {e}")
27
  return None
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
5
  load_dotenv()
6
 
7
 
8
+ def configure_genai(model_name="gemini-2.5-flash"):
9
  """
10
+ Configura a chave de API e inicializa o modelo Gemini escolhido.
11
  """
12
  api_key = os.getenv("GOOGLE_API_KEY")
13
 
 
18
 
19
  try:
20
  genai.configure(api_key=api_key)
21
+ model = genai.GenerativeModel(model_name)
22
+ # Log para debug, útil para saber qual modelo está sendo usado
23
+ print(f"✅ Modelo configurado: {model_name}")
24
  return model
25
 
26
  except Exception as e:
27
  print(f"❌ Falha ao configurar a chave da API: {e}")
28
  return None
29
+
30
+
31
+ def list_available_models():
32
+ """
33
+ Lista os modelos disponíveis na API dinamicamente.
34
+ Retorna uma lista de dicionários {'id': name, 'name': display_name}.
35
+ """
36
+ api_key = os.getenv("GOOGLE_API_KEY")
37
+ if not api_key:
38
+ return []
39
+
40
+ try:
41
+ genai.configure(api_key=api_key)
42
+ models = []
43
+ for m in genai.list_models():
44
+ if 'generateContent' in m.supported_generation_methods:
45
+ # Filtra apenas modelos 'gemini' para evitar poluição visual
46
+ if 'gemini' in m.name.lower():
47
+ models.append({"id": m.name, "name": m.display_name})
48
+
49
+ # Ordena inversamente pelo nome para tentar mostrar versões mais novas (2.5 > 1.5) primeiro
50
+ models.sort(key=lambda x: x['name'], reverse=True)
51
+ return models
52
+ except Exception as e:
53
+ print(f"⚠️ Erro ao listar modelos: {e}")
54
+ return []
templates/chat.html CHANGED
@@ -10,7 +10,18 @@
10
 
11
  <form method="post">
12
  <h1>Chat com a IA</h1>
13
- <p class="info-modelo"> (Você está conversando com um modelo gemini-1.5-flash)</p>
 
 
 
 
 
 
 
 
 
 
 
14
  <p>Oi, {{ history.name }}, espero que esteja tendo um ótimo dia!<br>
15
  Eu sei tudo sobre livros e estou aqui para te ajudar.<br>
16
  O que você deseja saber?</p>
 
10
 
11
  <form method="post">
12
  <h1>Chat com a IA</h1>
13
+
14
+ <div class="model-selector" style="margin-bottom: 15px;">
15
+ <label for="model_name" style="font-size: 0.9em; color: #555;">Escolha o Modelo:</label>
16
+ <select name="model_name" id="model_name" style="padding: 5px; border-radius: 5px; border: 1px solid #ccc; max-width: 100%;">
17
+ {% for model in models %}
18
+ <option value="{{ model.id }}" {% if model.id == current_model %}selected{% endif %}>
19
+ {{ model.name }}
20
+ </option>
21
+ {% endfor %}
22
+ </select>
23
+ </div>
24
+
25
  <p>Oi, {{ history.name }}, espero que esteja tendo um ótimo dia!<br>
26
  Eu sei tudo sobre livros e estou aqui para te ajudar.<br>
27
  O que você deseja saber?</p>