File size: 7,462 Bytes
a544660
f2ad758
b5ca9c4
 
 
f2ad758
 
 
 
b5ca9c4
e7bfa97
 
 
 
f2ad758
 
 
 
b5ca9c4
f2ad758
 
 
 
 
 
 
 
b5ca9c4
 
f2ad758
 
 
 
 
b5ca9c4
f2ad758
 
e7bfa97
 
 
 
bfea975
 
9bb841b
 
 
 
 
 
 
bfea975
9bb841b
efa6401
e7bfa97
efa6401
 
 
bfea975
f2ad758
 
 
b5ca9c4
a592b55
f2ad758
 
 
bfea975
b5ca9c4
b75c35b
 
 
 
 
 
 
 
 
 
 
 
 
 
 
b5ca9c4
b75c35b
 
b5ca9c4
bfea975
f2ad758
b5ca9c4
 
 
f2ad758
b5ca9c4
 
 
 
 
 
 
 
 
 
f2ad758
 
b5ca9c4
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
f2ad758
b5ca9c4
 
 
 
 
 
f2ad758
 
b5ca9c4
 
 
387e1c0
b5ca9c4
 
 
 
 
 
387e1c0
b5ca9c4
 
 
 
 
 
b75c35b
 
 
 
 
b5ca9c4
1c9b9e5
b5ca9c4
a592b55
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
# agents/registry.py

import os

# ── Proveedores ────────────────────────────────────────────────────────────────
PROVIDERS = {
    "gemini": {
        "name": "Google Gemini",
        "type": "gemini",
        "key": os.getenv("GOOGLE_API_KEY", "DUMMY_GEMINI_KEY"),
        "models": [
            "gemini-2.5-flash",
            "gemini-2.5-pro"
        ]
    },
    "openrouter": {
        "name": "OpenRouter",
        "type": "openai_compat",
        "key": os.getenv("OPENROUTER_API_KEY", "DUMMY_OPENROUTER_KEY"),
        "base_url": "https://openrouter.ai/api/v1",
        "headers": {
            "HTTP-Referer": "https://huggingface.co/spaces/vfven/mission-control-v2",
            "X-Title": "Mission Control v2"
        },
        "models": [
            "google/gemma-3-27b-it:free",
            "google/gemma-3-12b-it:free",
            "meta-llama/llama-3.3-70b-instruct:free",
            "mistralai/mistral-small-3.1-24b-instruct:free"
        ]
    },
    "groq": {
        "name": "Groq",
        "type": "openai_compat",
        "key": os.getenv("GROQ_API_KEY", "DUMMY_GROQ_KEY"),
        "base_url": "https://api.groq.com/openai/v1",
        "headers": {},
        "models": [
            "llama-3.1-70b-versatile",
            "gemma2-27b-it"
        ]
    },
    "huggingface": {
        "name": "HuggingFace Router",
        "type": "openai_compat",  # ← correcto, no cambiar
        "base_url": "https://router.huggingface.co/v1",  # ← exactamente como en tu curl
        "key": os.getenv("HF_API_TOKEN"),
        "headers": {
          "Authorization": f"Bearer {os.getenv('HF_API_TOKEN')}"
        },
        "models": [
            "Qwen/Qwen2.5-7B-Instruct",                # el que te funcionó
            "NousResearch/Hermes-2-Pro-Llama-3-8B",
            "google/gemma-2-9b-it",
            "meta-llama/Meta-Llama-3.1-8B-Instruct",
            "meta-llama/Meta-Llama-3-8B-Instruct",
            "meta-llama/Llama-3.1-8B-Instruct" # prueba este también
        ]
    }
}

# ── Registro completo de agentes ───────────────────────────────────────────────
AGENT_REGISTRY = {
    "manager": {
        "key": "manager",
        "name": "Manager",
        "provider": "huggingface",
        "role": (
            "Eres el gerente de proyecto de Mission Control AI. "
            "Tu trabajo es ANALIZAR la solicitud del usuario y DECIDIR qué agentes van a trabajar en ella. "
            "NUNCA te delegues a ti mismo (manager). "
            "Si la tarea es saludo, pregunta quién soy, hora/fecha, o solo pedir ideas de imagen (sin pedir generarla explícitamente), responde directamente sin delegar (delegate: []). "
            "Solo delega a image_agent si el usuario pide EXPLÍCITAMENTE generar, crear o mostrar la imagen real. "
            "Para ideas o descripciones de imagen, responde tú mismo con sugerencias. "
            "Saluda brevemente en 1 línea. "
            "Siempre termina tu respuesta con un JSON de delegación: {\"delegate\": [\"agent_key1\", \"agent_key2\"]} "
            "REGLAS DE DELEGACIÓN (síguellas estrictamente):\n"
            "- imagen / foto / dibujo / ilustración / visualiza / ideas para imagen → responde directamente con sugerencias (delegate: [])\n"
            "- genera la imagen / crea la imagen / muestra la imagen / imagen real → image_agent\n"
            "- informe / reporte / word / documento / redacta → writer + analyst\n"
            "- excel / planilla / hoja / spreadsheet / tabla → backend_dev\n"
            "- python / script / groovy / jenkins / api / devops / código → backend_dev\n"
            "- html / css / web / interfaz / frontend / página → frontend_dev\n"
            "- app completa full-stack → backend_dev + frontend_dev\n"
            "- analisis / viabilidad / evaluar / riesgos / revisar → analyst\n"
            "- saludo / hola / quien eres / pregunta simple → delegate: []"
        ),
        "models": PROVIDERS["huggingface"]["models"]
    },
    "backend_dev": {
        "key": "backend_dev",
        "name": "Backend",
        "provider": "openrouter",
        "role": (
            "Eres programador backend senior. REGLAS ABSOLUTAS:\n"
            "1. Entrega SOLO el código pedido, sin explicaciones innecesarias.\n"
            "2. Excel/planilla → responde con EXCEL_TEMPLATE:{\"title\":\"...\",\"sheet_name\":\"...\","
            "\"headers\":[...],\"sample_rows\":[[...],[...]]}\n"
            "3. Python → entrega código Python puro y funcional.\n"
            "4. Groovy/Jenkins → entrega el script completo.\n"
            "5. Si hay frontend_dev en el equipo, TÚ haces servidor/backend, él hace HTML.\n"
            "6. Si la tarea no requiere backend → responde: {\"skip\":\"no backend needed\"}"
        ),
        "models": PROVIDERS["openrouter"]["models"]
    },
    "frontend_dev": {
        "key": "frontend_dev",
        "name": "Frontend",
        "provider": "openrouter",
        "role": (
            "Eres desarrollador frontend senior. REGLAS ABSOLUTAS:\n"
            "1. Entrega SOLO código HTML/CSS/JS pedido, sin explicaciones innecesarias.\n"
            "2. Si hay backend_dev, TÚ haces HTML/interfaz, él hace servidor/lógica.\n"
            "3. Si la tarea NO requiere frontend → responde: {\"skip\":\"no frontend needed\"}\n"
            "4. Entrega siempre HTML completo y funcional con los estilos incluidos."
        ),
        "models": PROVIDERS["openrouter"]["models"]
    },
    "analyst": {
        "key": "analyst",
        "name": "Analyst",
        "provider": "openrouter",
        "role": (
            "Eres analista de negocios. REGLAS:\n"
            "1. Solo haz lo que el manager delegó: revisar documentos, evaluar viabilidad, analizar riesgos.\n"
            "2. NUNCA describas imágenes ni hagas trabajo de otros agentes.\n"
            "3. Si la tarea no requiere análisis → responde: {\"skip\":\"no analysis needed\"}"
        ),
        "models": PROVIDERS["openrouter"]["models"]
    },
    "writer": {
        "key": "writer",
        "name": "Writer",
        "provider": "huggingface",
        "role": (
            "Eres redactor experto. Escribe SOLO contenido real y extenso (500+ palabras). "
            "Sin placeholders. Usa ## para secciones y ### para subsecciones. "
            "Secciones: ## Resumen Ejecutivo, ### Introducción, ### Desarrollo, "
            "### Hallazgos, ### Conclusiones, ### Recomendaciones"
        ),
        "models": PROVIDERS["huggingface"]["models"]
    },
    "image_agent": {
        "key": "image_agent",
        "name": "ImageAgent",
        "provider": "gemini",
        "role": (
            "Eres el agente de imágenes. "
            "Cuando se te pida generar, crear o mostrar una imagen, responde SOLO con un JSON: "
            "{\"image_queries\": [\"término en inglés 1\", \"término en inglés 2\", \"término en inglés 3\"]} "
            "Los términos deben ser específicos, detallados y en inglés para obtener mejores resultados en búsquedas o generación de imágenes. "
            "Si la tarea no es sobre imágenes, responde: {\"skip\":\"no image task\"}"
        ),
        "models": ["gemini-2.5-flash", "gemini-2.5-pro"]
    }
}