import gradio as gr import json import os AGENT_PROFILES = { "general": {"title": "Investigador General", "instruction": "Realiza una síntesis integral y EXTENSA cubriendo todos los aspectos del tema. Cada párrafo debe ser denso en información técnica. Analiza la convergencia y divergencia de los estudios citados con profundidad doctoral.\n\nCITAS OBLIGATORIAS: Toda afirmación debe citar su fuente usando el formato [[n]] {{BIB:ID}}.\n\nADAPTABILIDAD: Si la consulta es una tesis, sigue una estructura académica estricta."}, "auto": {"title": "Agente Autónomo (Red Dinámica)", "instruction": "ERES UN AGENTE AUTÓNOMO DE ALTA CAPACIDAD.\nTU OBJETIVO PRINCIPAL: Organizar y sintetizar la TOTALIDAD de los documentos encontrados en una estructura lógica y coherente creada por ti mismo.\n\nINSTRUCCIONES CRÍTICAS:\n1. NO USES ESTRUCTURAS PREFABRICADAS. Crea tus propias secciones.\n2. COBERTURA TOTAL: Debes incluir y citar CADA UNO de los documentos relevantes.\n3. ORGANIZACIÓN INTELIGENTE: Agrupa los estudios por similitud temática.\n4. REFERENCIAS: Cada afirmación con [[n]] {{BIB:ID}}.\n5. FORMATO PRO: Reporte denso, académico y detallado."}, "antecedentes": {"title": "Arquitecto de Antecedentes de Tesis", "instruction": "GENERA LA SECCIÓN 'ANTECEDENTES' PARA UNA TESIS DE GRADO.\n\nESTRUCTURA OBLIGATORIA:\n\\subsection{Antecedentes Internacionales}\nMÍNIMO 3 estudios de países distintos al detectado.\n\\subsection{Antecedentes Nacionales}\nMÍNIMO 3 estudios del PAÍS detectado.\n\\subsection{Antecedentes Locales}\nMÍNIMO 3 estudios de la REGIÓN o CIUDAD detectada.\n\nFORMATO: '[Apellido] ([Año]), en su tesis titulada '[Título]' de la [Universidad], tuvo como objetivo [objetivo]. Los resultados indicaron [hallazgos]. Concluyó que [conclusión]. [[n]] {{BIB:ID}}'"}, "teorico": {"title": "Teórico Científico", "instruction": "Enfócate en bases epistemológicas, definiciones fundamentales y marcos conceptuales de forma MUY DETALLADA.\nExplica los mecanismos subyacentes con precisión doctrinal absoluta.\n\nCITAS OBLIGATORIAS: Toda afirmación debe citar su fuente usando [[n]] {{BIB:ID}}."}, "metodologo": {"title": "Arquitecto de Metodología de Tesis", "instruction": "Genera la sección de METODOLOGÍA completa para una tesis de grado.\n\nESTRUCTURA OBLIGATORIA:\n\\subsection{Diseño de la Investigación}\n\\subsection{Población y Muestra}\n\\subsection{Variables de Investigación}\n\\subsection{Técnicas e Instrumentos}\n\nREGLAS: Citar metodólogos con [[n]] {{BIB:ID}}. Extensión mínima: 2-3 párrafos por subsección."}, "hipotesis": {"title": "Estratega de Hipótesis Científicas", "instruction": "Genera la sección de HIPÓTESIS.\n\nESTRUCTURA:\n\\subsection{Hipótesis General}\n\\subsection{Hipótesis Específicas}\n\nREGLAS: Hipótesis contrastables. Basadas en evidencia. Citas [[n]] {{BIB:ID}}."}, "objetivos": {"title": "Arquitecto de Objetivos de Investigación", "instruction": "Genera los OBJETIVOS.\n\nESTRUCTURA:\n\\subsection{Objetivo General}\n\\subsection{Objetivos Específicos}\n\nREGLAS: Verbos en infinitivo. Coherencia con planteamiento."}, "resultados": {"title": "Analista de Resultados", "instruction": "Sintetiza hallazgos cuantitativos y cualitativos de forma EXHAUSTIVA.\n\nENFOQUE: Discusión, qué dicen los datos, qué falta por investigar.\nCITAS: Toda cifra con [[n]] {{BIB:ID}}."}, "problema": {"title": "Arquitecto de Planteamiento del Problema", "instruction": "Genera PLANTEAMIENTO DEL PROBLEMA.\n\nESTRUCTURA:\n\\subsection{Realidad Problemática}\n\\subsection{Formulación del Problema}\n\nREGLAS: Contexto global/nacional/local. Citas [[n]] {{BIB:ID}}. Mínimo 4-5 párrafos."}, "justificacion": {"title": "Arquitecto de Justificación e Importancia", "instruction": "Genera JUSTIFICACIÓN E IMPORTANCIA.\n\nESTRUCTURA:\n\\subsection{Importancia}\n\\subsection{Justificación (Teórica, Práctica, Social, Metodológica)}\n\nREGLAS: Mínimo 2 párrafos por tipo. Citas [[n]] {{BIB:ID}}."}, "marco_teorico": {"title": "Arquitecto de Marco Teórico para Tesis", "instruction": "Genera MARCO TEÓRICO completo.\n\nESTRUCTURA:\n1. ANTECEDENTES\n2. BASES TEÓRICAS DE LAS VARIABLES\n3. ANÁLISIS DE DIMENSIONES\n4. DEFINICIÓN DE TÉRMINOS BÁSICOS\n\nREGLAS: \\subsection{} y \\subsubsection{}. Citas [[n]] {{BIB:ID}}. Mínimo 3-4 párrafos por subsección."}, "comunicacion": {"title": "Estratega de Comunicación Digital", "instruction": "Especialista en análisis de audiencias, engagement y marketing.\n\nENFOQUE: Conectar teoría de comunicación con métricas.\nCITAS: [[n]] {{BIB:ID}}."}, } PROMPT_KEYS_FOR_UI = [ {"key": "researchQueryOptimizerPrompt", "label": "Query Optimizer", "description": "Genera queries booleanos y semánticos para búsqueda académica"}, {"key": "researchPlanningPrompt", "label": "Planning", "description": "Genera plan de investigación estructurado en JSON"}, {"key": "researchMasterPrompt", "label": "Master Prompt", "description": "Prompt maestro de síntesis doctoral"}, {"key": "researchWritingPrompt", "label": "Writing", "description": "Redacción de secciones individuales"}, {"key": "researchGradePrompt", "label": "GRADE", "description": "Clasificación de evidencia según protocolo GRADE"}, {"key": "researchAuditPrompt", "label": "Audit", "description": "Auditoría técnica de calidad académica"}, {"key": "researchAraPrompt", "label": "ARA+ Refinement", "description": "Refinamiento académico avanzado"}, {"key": "researchStandardValidationPrompt", "label": "Validación", "description": "Validación de citas bibliográficas"}, {"key": "researchGapDetectionPrompt", "label": "Gap Detection", "description": "Detección de vacíos de información"}, {"key": "researchRescuePrompt", "label": "Query Rescate", "description": "Queries de rescate para vacíos"}, {"key": "researchSearchContextPrompt", "label": "Contexto Búsqueda", "description": "Contexto para evitar redundancia"}, {"key": "researchHierarchicalDistillationPrompt", "label": "Destilación Jerárquica", "description": "Destilación de hallazgos (Map-Reduce)"}, {"key": "researchHierarchicalSynthesisPrompt", "label": "Síntesis Jerárquica", "description": "Síntesis de evidencia destilada"}, {"key": "researchTranslationPrompt", "label": "Traducción", "description": "Traducción académica estricta"}, {"key": "researchFinalReportPrompt", "label": "Reporte Final", "description": "Formato de reporte final"}, ] def create_agents_tab(): with gr.Tab("👥 Agentes", id="agents"): gr.Markdown("## 👥 Configuración de Agentes") gr.Markdown("Personaliza el rol, perfil doctoral y preset del agente investigador") with gr.Row(): with gr.Column(scale=2): agent_role = gr.Dropdown( choices=list(AGENT_PROFILES.keys()), value="general", label="Perfil del Agente" ) agent_title = gr.Textbox( value="Investigador General", label="Título del Agente", interactive=False ) agent_instruction = gr.Textbox( value=AGENT_PROFILES["general"]["instruction"], label="Instrucción del Agente", lines=15 ) with gr.Row(): restore_btn = gr.Button("🔄 Restaurar Perfil", variant="secondary") structure_mode = gr.Radio( choices=["LIBRE", "ESTRICTO"], value="LIBRE", label="Modo Estructura" ) def update_profile(role): profile = AGENT_PROFILES.get(role, AGENT_PROFILES["general"]) return profile["title"], profile["instruction"] agent_role.change(fn=update_profile, inputs=[agent_role], outputs=[agent_title, agent_instruction]) restore_btn.click(fn=update_profile, inputs=[agent_role], outputs=[agent_title, agent_instruction]) with gr.Column(scale=3): gr.Markdown("### Modo Estructura") gr.Markdown(""" **LIBRE:** La IA crea libremente las secciones según el contenido y variables detectadas. **ESTRICTO:** Solo se pueden usar las secciones de una plantilla predefinida. El contenido se adapta pero la estructura es fija. """) gr.Markdown("### Perfiles Disponibles") for key, profile in AGENT_PROFILES.items(): gr.Markdown(f"- **{key}**: {profile['title']}") return agent_role, agent_instruction, structure_mode