# RF-MGN-018-001: Configuración de Agentes IA

**Módulo:** MGN-018 - AI Agents & Chatbots
**Prioridad:** P1
**Story Points:** 13
**Estado:** Definido
**Fecha:** 2025-12-05

## Descripción

El sistema debe permitir a los tenants crear y configurar agentes de IA personalizados. Cada agente tiene un propósito específico, instrucciones de comportamiento, modelo de IA a usar, y canales donde está disponible.

## Actores

- **Actor Principal:** Tenant Admin
- **Actores Secundarios:**
  - Sistema (despliega agente)
  - LLM Provider (procesa mensajes)

## Precondiciones

1. Tenant debe tener suscripción con feature `ai_agents_enabled`
2. Créditos de IA disponibles
3. Al menos un canal de comunicación configurado (opcional)

## Flujo Principal - Crear Agente

1. Admin accede a "AI Agents > Mis Agentes"
2. Admin selecciona "Crear nuevo agente"
3. Sistema muestra wizard de configuración
4. Admin completa configuración básica:
   - Nombre del agente
   - Descripción
   - Avatar (opcional)
5. Admin define comportamiento:
   - System prompt / Instrucciones
   - Personalidad y tono
   - Idioma(s)
6. Admin selecciona modelo de IA:
   - Proveedor (OpenAI, Anthropic)
   - Modelo específico
   - Parámetros (temperature, max_tokens)
7. Admin configura capacidades:
   - Bases de conocimiento a usar
   - Herramientas habilitadas
   - Acciones permitidas
8. Admin define escalación:
   - Condiciones de escalación
   - Equipo/agente humano destino
9. Admin guarda y activa agente
10. Sistema despliega agente en canales seleccionados

## Flujo Alternativo - Usar Template

1. Admin selecciona "Crear desde template"
2. Sistema muestra templates disponibles:
   - Atención al Cliente
   - Asistente de Ventas
   - Soporte Técnico
   - FAQ Bot
3. Admin selecciona template
4. Sistema pre-llena configuración
5. Admin personaliza según necesidad
6. Continúa desde paso 9 del flujo principal

## Configuración del Agente

### Información Básica

```typescript
interface AgentBasicInfo {
  name: string;           // "Asistente de Ventas"
  description: string;    // "Ayuda a clientes con consultas de productos"
  avatar_url?: string;    // URL del avatar
  language: string[];     // ["es", "en"]
  timezone: string;       // "America/Mexico_City"
}
```

### Comportamiento (System Prompt)

```typescript
interface AgentBehavior {
  system_prompt: string;
  personality: 'professional' | 'friendly' | 'casual' | 'custom';
  tone_guidelines: string;

  // Restricciones
  do_not_discuss: string[];      // Temas prohibidos
  required_disclaimers: string[]; // Avisos obligatorios

  // Respuestas predefinidas
  greeting_message: string;
  fallback_message: string;
  escalation_message: string;
  goodbye_message: string;
}
```

### Modelo de IA

```typescript
interface AgentModelConfig {
  provider: 'openai' | 'anthropic';
  model_id: string;              // "gpt-4o-mini", "claude-3-haiku"

  // Parámetros del modelo
  temperature: number;           // 0.0 - 1.0
  max_tokens: number;            // Máximo de tokens en respuesta
  top_p?: number;
  frequency_penalty?: number;
  presence_penalty?: number;

  // Fallback
  fallback_model?: string;       // Modelo alternativo si falla
}
```

### Capacidades

```typescript
interface AgentCapabilities {
  // Bases de conocimiento
  knowledge_base_ids: string[];
  rag_enabled: boolean;

  // Herramientas
  tools_enabled: string[];      // ["check_order", "create_lead", "schedule_call"]
  custom_tools: boolean;

  // Acciones del sistema
  can_create_leads: boolean;
  can_update_contacts: boolean;
  can_query_orders: boolean;
  can_create_tickets: boolean;

  // Integraciones
  whatsapp_enabled: boolean;
  webchat_enabled: boolean;
  email_enabled: boolean;
}
```

### Escalación

```typescript
interface AgentEscalation {
  enabled: boolean;

  triggers: Array<{
    type: 'keyword' | 'sentiment' | 'intent' | 'timeout' | 'user_request';
    condition: string;
    priority: 'low' | 'medium' | 'high';
  }>;

  // Destino
  target_team_id?: string;
  target_agent_id?: string;

  // Contexto a pasar
  include_conversation_history: boolean;
  include_extracted_data: boolean;
  custom_fields_to_pass: string[];
}
```

## Reglas de Negocio

- **RN-1:** Máximo de agentes según plan del tenant
- **RN-2:** System prompt tiene límite de 4,000 caracteres
- **RN-3:** Un agente puede estar en múltiples canales
- **RN-4:** Cambios de configuración se aplican a nuevas conversaciones
- **RN-5:** Agentes inactivos no consumen recursos
- **RN-6:** Modelos premium requieren plan Enterprise
- **RN-7:** API keys propias del tenant tienen prioridad sobre las del sistema

## Criterios de Aceptación

- [ ] Admin puede crear nuevo agente con wizard
- [ ] Templates pre-configurados disponibles
- [ ] System prompt editable con preview
- [ ] Selección de modelo con descripción de costos
- [ ] Configuración de capacidades granular
- [ ] Reglas de escalación configurables
- [ ] Preview de conversación antes de activar
- [ ] Activar/desactivar agente sin eliminar
- [ ] Duplicar agente existente
- [ ] Historial de cambios de configuración

## Entidades Involucradas

### ai_agents.agents

```sql
CREATE TABLE ai_agents.agents (
    id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
    tenant_id UUID NOT NULL REFERENCES core_tenants.tenants(id),

    -- Información básica
    name VARCHAR(100) NOT NULL,
    description TEXT,
    avatar_url VARCHAR(500),
    languages TEXT[] DEFAULT '{es}',
    timezone VARCHAR(50) DEFAULT 'America/Mexico_City',

    -- Estado
    status VARCHAR(20) NOT NULL DEFAULT 'draft', -- draft, active, paused, archived

    -- Comportamiento
    system_prompt TEXT NOT NULL,
    personality VARCHAR(20) DEFAULT 'professional',
    tone_guidelines TEXT,
    do_not_discuss TEXT[] DEFAULT '{}',

    -- Mensajes predefinidos
    greeting_message TEXT,
    fallback_message TEXT DEFAULT 'Lo siento, no pude entender tu consulta. ¿Podrías reformularla?',
    escalation_message TEXT DEFAULT 'Te estoy transfiriendo con un agente humano...',

    -- Modelo
    provider VARCHAR(50) NOT NULL DEFAULT 'openai',
    model_id VARCHAR(100) NOT NULL DEFAULT 'gpt-4o-mini',
    model_config JSONB DEFAULT '{"temperature": 0.7, "max_tokens": 1000}',
    fallback_model VARCHAR(100),

    -- Capacidades
    capabilities JSONB DEFAULT '{}',
    -- {
    --   "knowledge_base_ids": [],
    --   "tools_enabled": [],
    --   "can_create_leads": false,
    --   "can_query_orders": true
    -- }

    -- Escalación
    escalation_config JSONB DEFAULT '{"enabled": true}',
    -- {
    --   "enabled": true,
    --   "triggers": [{"type": "keyword", "condition": "humano|agente"}],
    --   "target_team_id": "uuid"
    -- }

    -- Canales
    channels JSONB DEFAULT '[]',
    -- ["whatsapp", "webchat"]

    -- Stats
    total_conversations INT DEFAULT 0,
    total_messages INT DEFAULT 0,
    avg_satisfaction DECIMAL(3,2),

    -- Template
    template_id VARCHAR(50), -- Si fue creado desde template

    -- Timestamps
    created_at TIMESTAMPTZ DEFAULT CURRENT_TIMESTAMP,
    updated_at TIMESTAMPTZ DEFAULT CURRENT_TIMESTAMP,
    activated_at TIMESTAMPTZ,
    created_by UUID,

    CONSTRAINT chk_status CHECK (status IN ('draft', 'active', 'paused', 'archived')),
    CONSTRAINT chk_provider CHECK (provider IN ('openai', 'anthropic', 'custom'))
);

CREATE INDEX idx_agents_tenant ON ai_agents.agents(tenant_id);
CREATE INDEX idx_agents_status ON ai_agents.agents(status);
```

### ai_agents.agent_versions

```sql
CREATE TABLE ai_agents.agent_versions (
    id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
    agent_id UUID NOT NULL REFERENCES ai_agents.agents(id),
    version INT NOT NULL,

    -- Snapshot de configuración
    config_snapshot JSONB NOT NULL,

    -- Metadata
    change_description TEXT,
    created_at TIMESTAMPTZ DEFAULT CURRENT_TIMESTAMP,
    created_by UUID,

    CONSTRAINT uq_agent_version UNIQUE (agent_id, version)
);
```

### ai_agents.agent_templates

```sql
CREATE TABLE ai_agents.agent_templates (
    id VARCHAR(50) PRIMARY KEY,
    name VARCHAR(100) NOT NULL,
    description TEXT,
    category VARCHAR(50), -- customer_service, sales, support, general

    -- Configuración base
    default_config JSONB NOT NULL,

    -- Preview
    sample_conversation JSONB,

    is_system BOOLEAN DEFAULT true, -- Templates del sistema vs tenant
    tenant_id UUID, -- NULL para templates del sistema

    created_at TIMESTAMPTZ DEFAULT CURRENT_TIMESTAMP
);

-- Templates del sistema
INSERT INTO ai_agents.agent_templates (id, name, description, category, default_config) VALUES
('customer_service', 'Atención al Cliente', 'Agente para responder consultas generales de clientes', 'customer_service', '{
  "system_prompt": "Eres un asistente de atención al cliente amable y profesional. Tu objetivo es ayudar a los clientes con sus consultas de manera eficiente.",
  "personality": "friendly",
  "capabilities": {"can_query_orders": true, "can_create_tickets": true}
}'),
('sales_assistant', 'Asistente de Ventas', 'Agente para calificar leads y responder sobre productos', 'sales', '{
  "system_prompt": "Eres un asistente de ventas experto. Ayudas a los clientes a encontrar los productos adecuados y respondes sus dudas.",
  "personality": "professional",
  "capabilities": {"can_create_leads": true, "can_query_products": true}
}'),
('tech_support', 'Soporte Técnico', 'Agente para resolver problemas técnicos comunes', 'support', '{
  "system_prompt": "Eres un agente de soporte técnico. Ayudas a resolver problemas paso a paso de manera clara.",
  "personality": "professional",
  "capabilities": {"can_create_tickets": true}
}'),
('faq_bot', 'FAQ Bot', 'Agente simple para responder preguntas frecuentes', 'general', '{
  "system_prompt": "Responde preguntas frecuentes de manera concisa. Si no sabes algo, indica que no tienes esa información.",
  "personality": "casual",
  "model_id": "gpt-4o-mini"
}');
```

## API Keys del Tenant

```sql
CREATE TABLE ai_agents.tenant_api_keys (
    id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
    tenant_id UUID NOT NULL REFERENCES core_tenants.tenants(id),

    provider VARCHAR(50) NOT NULL, -- openai, anthropic
    api_key_encrypted BYTEA NOT NULL,

    is_active BOOLEAN DEFAULT true,

    -- Límites personalizados
    monthly_budget_usd DECIMAL(10,2),

    created_at TIMESTAMPTZ DEFAULT CURRENT_TIMESTAMP,
    created_by UUID,

    CONSTRAINT uq_tenant_provider UNIQUE (tenant_id, provider)
);
```

## Endpoints API

### Crear Agente

```typescript
// POST /api/v1/ai-agents
interface CreateAgentRequest {
  name: string;
  description?: string;
  template_id?: string;  // Si usa template

  system_prompt: string;
  personality?: string;

  provider: string;
  model_id: string;
  model_config?: object;

  capabilities?: object;
  escalation_config?: object;
  channels?: string[];
}

// Response
interface CreateAgentResponse {
  id: string;
  name: string;
  status: 'draft';
  // ... resto de campos
}
```

### Activar/Desactivar Agente

```typescript
// POST /api/v1/ai-agents/{id}/activate
// POST /api/v1/ai-agents/{id}/deactivate

interface ActivateResponse {
  id: string;
  status: 'active' | 'paused';
  activated_at?: string;
}
```

### Preview de Conversación

```typescript
// POST /api/v1/ai-agents/{id}/preview
interface PreviewRequest {
  messages: Array<{
    role: 'user' | 'assistant';
    content: string;
  }>;
  mock_context?: object; // Variables de contexto simuladas
}

interface PreviewResponse {
  response: string;
  tokens_used: number;
  tools_called?: string[];
  would_escalate?: boolean;
}
```

## Interfaz de Usuario

### Wizard de Creación

```
┌─────────────────────────────────────────────────────────────────┐
│  Crear Nuevo Agente                                    [1/5]    │
├─────────────────────────────────────────────────────────────────┤
│                                                                  │
│  ○ Crear desde cero                                             │
│  ● Usar template                                                │
│                                                                  │
│  ┌─────────────────┐  ┌─────────────────┐  ┌─────────────────┐ │
│  │  🎧 Atención    │  │  💼 Ventas      │  │  🔧 Soporte     │ │
│  │  al Cliente     │  │                 │  │  Técnico        │ │
│  │                 │  │  Califica leads │  │                 │ │
│  │  Consultas      │  │  y responde     │  │  Resuelve       │ │
│  │  generales      │  │  sobre productos│  │  problemas      │ │
│  └─────────────────┘  └─────────────────┘  └─────────────────┘ │
│                                                                  │
│                                    [Cancelar]  [Siguiente →]    │
└─────────────────────────────────────────────────────────────────┘
```

### Editor de System Prompt

```
┌─────────────────────────────────────────────────────────────────┐
│  Comportamiento del Agente                             [3/5]    │
├─────────────────────────────────────────────────────────────────┤
│                                                                  │
│  Instrucciones (System Prompt):                                 │
│  ┌─────────────────────────────────────────────────────────┐   │
│  │ Eres un asistente de ventas de {{company_name}}.        │   │
│  │                                                          │   │
│  │ Tu objetivo es:                                          │   │
│  │ - Responder consultas sobre productos                    │   │
│  │ - Ayudar a los clientes a tomar decisiones              │   │
│  │ - Capturar información de contacto cuando sea apropiado │   │
│  │                                                          │   │
│  │ Siempre sé amable y profesional.                        │   │
│  └─────────────────────────────────────────────────────────┘   │
│                                                 2,340 / 4,000   │
│                                                                  │
│  Variables disponibles: {{company_name}}, {{agent_name}},       │
│                         {{current_date}}, {{customer_name}}     │
│                                                                  │
│  Personalidad: [Profesional ▼]                                  │
│                                                                  │
│                                   [← Anterior]  [Siguiente →]   │
└─────────────────────────────────────────────────────────────────┘
```

## Referencias

- [OpenAI Chat Completions](https://platform.openai.com/docs/guides/chat-completions)
- [Anthropic Messages API](https://docs.anthropic.com/en/api/messages)
- [Best Practices for Prompt Engineering](https://platform.openai.com/docs/guides/prompt-engineering)

## Dependencias

- **RF Requeridos:** Ninguno (RF base del módulo)
- **Bloqueante para:** RF-002 (Bases de Conocimiento), RF-003 (Procesamiento)
