Feat: Agregar agente Groq con integración RAG
- Nuevo módulo groq_agent.py para consultas a la API de Groq - Panel de administración en /groq para configurar API key, modelo y prompt - Comando /rag en Discord y Telegram para consultar el RAG - Sistema de prompt personalizable guardado en base de datos - Soporte para variables de entorno en Docker - Fix: starlette version para evitar bug con Jinja2
This commit is contained in:
172
panel/templates/groq.html
Normal file
172
panel/templates/groq.html
Normal file
@@ -0,0 +1,172 @@
|
||||
{% set lang = request.cookies.get('panel_lang', 'es') %}
|
||||
<!DOCTYPE html>
|
||||
<html lang="{{ lang }}">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>{{ "Configuración de Groq - Agente RAG" | translate(lang) }}</title>
|
||||
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css" rel="stylesheet">
|
||||
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap-icons@1.11.0/font/bootstrap-icons.css">
|
||||
</head>
|
||||
<body>
|
||||
<nav class="navbar navbar-expand-lg navbar-dark bg-dark">
|
||||
<div class="container-fluid">
|
||||
<a class="navbar-brand" href="/dashboard">
|
||||
<i class="bi bi-translate"></i> {{ "Bots de Traducción" | translate(lang) }}
|
||||
</a>
|
||||
<div class="d-flex align-items-center">
|
||||
<div class="dropdown me-3">
|
||||
<button class="btn btn-outline-light btn-sm dropdown-toggle" type="button" data-bs-toggle="dropdown">
|
||||
<i class="bi bi-translate"></i>
|
||||
</button>
|
||||
<ul class="dropdown-menu dropdown-menu-end">
|
||||
<li><a class="dropdown-item {{ 'active' if lang == 'es' }}" href="/set-lang/es">Español</a></li>
|
||||
<li><a class="dropdown-item {{ 'active' if lang == 'en' }}" href="/set-lang/en">English</a></li>
|
||||
<li><a class="dropdown-item {{ 'active' if lang == 'pt' }}" href="/set-lang/pt">Português</a></li>
|
||||
</ul>
|
||||
</div>
|
||||
<a href="/dashboard" class="btn btn-outline-light btn-sm me-2">{{ "Dashboard" | translate(lang) }}</a>
|
||||
<a href="/logout" class="btn btn-outline-light btn-sm">{{ "Cerrar Sesión" | translate(lang) }}</a>
|
||||
</div>
|
||||
</div>
|
||||
</nav>
|
||||
|
||||
<div class="container mt-5">
|
||||
<h2 class="mb-4">🤖 {{ "Configuración de Groq - Agente RAG" | translate(lang) }}</h2>
|
||||
|
||||
{% if request.query_params.get('saved') == '1' %}
|
||||
<div class="alert alert-success">
|
||||
<i class="bi bi-check-circle"></i> {{ "Configuración guardada correctamente" | translate(lang) }}
|
||||
</div>
|
||||
{% endif %}
|
||||
|
||||
{% if test_error %}
|
||||
<div class="alert alert-danger">
|
||||
<i class="bi bi-exclamation-triangle"></i> {{ "Error al probar el agente:" | translate(lang) }} {{ test_error }}
|
||||
</div>
|
||||
{% endif %}
|
||||
|
||||
<div class="row">
|
||||
<div class="col-md-6">
|
||||
<div class="card mb-4">
|
||||
<div class="card-header">
|
||||
<h5 class="mb-0"><i class="bi bi-key"></i> {{ "Configuración de API" | translate(lang) }}</h5>
|
||||
</div>
|
||||
<div class="card-body">
|
||||
<form method="post" action="/groq/save">
|
||||
<div class="mb-3">
|
||||
<label class="form-label">{{ "API Key de Groq" | translate(lang) }}</label>
|
||||
<input type="password" class="form-control" name="api_key"
|
||||
value="{{ groq_config.api_key if is_admin else '********************************' }}"
|
||||
placeholder="sk-..." required>
|
||||
<div class="form-text">{{ "Obtén tu API key en" | translate(lang) }} <a href="https://console.groq.com" target="_blank">console.groq.com</a></div>
|
||||
</div>
|
||||
<div class="mb-3">
|
||||
<label class="form-label">{{ "Modelo" | translate(lang) }}</label>
|
||||
<select class="form-select" name="model">
|
||||
{% for model in groq_models %}
|
||||
<option value="{{ model.id }}" {% if groq_config.model == model.id %}selected{% endif %}>
|
||||
{{ model.name }}
|
||||
</option>
|
||||
{% endfor %}
|
||||
</select>
|
||||
</div>
|
||||
<div class="mb-3">
|
||||
<label class="form-label">{{ "URL del API RAG" | translate(lang) }}</label>
|
||||
<input type="text" class="form-control" name="rag_url"
|
||||
value="{{ groq_config.rag_url }}"
|
||||
placeholder="http://localhost:8004">
|
||||
<div class="form-text">{{ "URL donde corre el servidor RAG (puerto 8004)" | translate(lang) }}</div>
|
||||
</div>
|
||||
<div class="mb-3">
|
||||
<label class="form-label">{{ "System Prompt" | translate(lang) }}</label>
|
||||
<textarea class="form-control" name="system_prompt" rows="6">{{ groq_config.system_prompt }}</textarea>
|
||||
<div class="form-text">{{ "Instrucciones del sistema para el agente Groq" | translate(lang) }}</div>
|
||||
{% if groq_config.has_custom_prompt %}
|
||||
<div class="mt-2">
|
||||
<form method="post" action="/groq/reset-prompt" style="display:inline;">
|
||||
<button type="submit" class="btn btn-warning btn-sm">
|
||||
<i class="bi bi-arrow-counterclockwise"></i> {{ "Restablecer Prompt Default" | translate(lang) }}
|
||||
</button>
|
||||
</form>
|
||||
</div>
|
||||
{% endif %}
|
||||
</div>
|
||||
<button type="submit" class="btn btn-primary">
|
||||
<i class="bi bi-save"></i> {{ "Guardar Configuración" | translate(lang) }}
|
||||
</button>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="col-md-6">
|
||||
<div class="card mb-4">
|
||||
<div class="card-header">
|
||||
<h5 class="mb-0"><i class="bi bi-chat-dots"></i> {{ "Probar Agente" | translate(lang) }}</h5>
|
||||
</div>
|
||||
<div class="card-body">
|
||||
<form method="post" action="/groq/test">
|
||||
<div class="mb-3">
|
||||
<label class="form-label">{{ "Pregunta de prueba" | translate(lang) }}</label>
|
||||
<textarea class="form-control" name="test_question" rows="3"
|
||||
placeholder="How to get heroes in Last War?">{{ test_result.question if test_result else '' }}</textarea>
|
||||
</div>
|
||||
<button type="submit" class="btn btn-success">
|
||||
<i class="bi bi-send"></i> {{ "Enviar Pregunta" | translate(lang) }}
|
||||
</button>
|
||||
</form>
|
||||
|
||||
{% if test_result %}
|
||||
<hr>
|
||||
<div class="mt-3">
|
||||
<h6>{{ "Respuesta del Agente:" | translate(lang) }}</h6>
|
||||
<div class="bg-light p-3 rounded" style="max-height: 300px; overflow-y: auto;">
|
||||
{{ test_result.response }}
|
||||
</div>
|
||||
|
||||
{% if test_result.rag_answer %}
|
||||
<h6 class="mt-3">{{ "Respuesta del RAG:" | translate(lang) }}</h6>
|
||||
<div class="bg-info bg-opacity-10 p-3 rounded" style="max-height: 150px; overflow-y: auto;">
|
||||
{{ test_result.rag_answer }}
|
||||
</div>
|
||||
{% endif %}
|
||||
|
||||
{% if test_result.sources %}
|
||||
<h6 class="mt-3">{{ "Fuentes:" | translate(lang) }}</h6>
|
||||
<ul class="list-group">
|
||||
{% for source in test_result.sources[:5] %}
|
||||
<li class="list-group-item">
|
||||
<small>{{ source.title }}</small>
|
||||
</li>
|
||||
{% endfor %}
|
||||
</ul>
|
||||
{% endif %}
|
||||
</div>
|
||||
{% endif %}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="card mb-4">
|
||||
<div class="card-header">
|
||||
<h5 class="mb-0"><i class="bi bi-info-circle"></i> {{ "Información" | translate(lang) }}</h5>
|
||||
</div>
|
||||
<div class="card-body">
|
||||
<p><strong>{{ "Modelos gratuitos de Groq:" | translate(lang) }}</strong></p>
|
||||
<ul>
|
||||
<li><code>llama-3.3-70b-versatile</code> - {{ "Recomendado" | translate(lang) }}</li>
|
||||
<li><code>llama-3.1-70b-versatile</code></li>
|
||||
<li><code>llama-3.1-8b-instant</code> - {{ "Más rápido" | translate(lang) }}</li>
|
||||
<li><code>mixtral-8x7b-32768</code></li>
|
||||
<li><code>gemma2-9b-it</code></li>
|
||||
</ul>
|
||||
<p class="text-muted"><small>{{ "Los modelos se seleccionan desde la API de Groq y pueden cambiar" | translate(lang) }}</small></p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/js/bootstrap.bundle.min.js"></script>
|
||||
</body>
|
||||
</html>
|
||||
Reference in New Issue
Block a user