GDPR · Datos en UE
Mistral AI GDPR Compliant Python · TypeScript Apache-2.0

Mistral AI API
Referencia de Integración

Guía completa para integrar Mistral AI en CultivaCRM. Proveedor europeo con residencia de datos en la UE — la alternativa GDPR-compliant a OpenAI para clientes enterprise españoles.

Nivel
Intermedio
Tiempo estimado
~2 horas setup
Coste estimado
~150–200€/mes
SDK
mistralai 1.x
Instalación & Configuración
Setup en < 5 min
Python pip install mistralai | Node / TypeScript npm install @mistralai/mistralai | API Key export MISTRAL_API_KEY=sk-...
💡
Compatibilidad con OpenAI SDK

Mistral sigue las convenciones de la API de OpenAI. Si CultivaCRM ya usa OpenAI, la migración es casi directa: cambia el cliente y el model name, el resto del código permanece igual.

🤖
Modelos disponibles
Junio 2026
Modelo Contexto Uso recomendado en CultivaCRM Badge
mistral-large-latest 128k tokens Propuestas comerciales largas, análisis de clientes, reasoning complejo ★ Mejor calidad
mistral-small-latest 128k tokens Clasificación de leads en volumen, respuestas rápidas en chat CRM ⚡ Económico
codestral-latest 256k tokens Autocompletado de código para el equipo dev interno, scripts de automatización 💻 Código
mistral-embed 8k tokens Búsqueda semántica de clientes similares, clustering de campañas 🔢 Embeddings
open-mistral-nemo 128k tokens Despliegue on-premise para clientes con datos ultra-sensibles 🌐 Open weight
🎯
Casos de uso CultivaCRM
✍️

Asistente de redacción

Genera borradores de emails de seguimiento y propuestas personalizadas desde el historial del cliente en el CRM.

Modelo: mistral-large-latest
📊

Clasificador de leads (JSON Mode)

Extrae datos estructurados de formularios en lenguaje natural: sector, presupuesto, urgencia, servicio solicitado.

Modelo: mistral-small-latest
🔍

Búsqueda semántica de clientes

Encuentra clientes similares al nuevo prospecto usando embeddings, para personalizar la propuesta con casos de éxito relevantes.

Modelo: mistral-embed
💻

Autocompletado FIM (Codestral)

Fill-in-the-middle para el equipo dev: completa funciones Python/TypeScript en el IDE o en el editor interno del CRM.

Modelo: codestral-latest
✍️
1. Asistente de redacción (Chat Completion)
Python cultivacrm/ai/writing_assistant.py
from mistralai import Mistral
import os

client = Mistral(api_key=os.getenv("MISTRAL_API_KEY"))

def generar_email_seguimiento(
    nombre_cliente: str,
    empresa: str,
    ultima_reunion: str,
    servicio_propuesto: str
) -> str:
    """Genera un email de seguimiento personalizado para CultivaCRM."""

    response = client.chat.complete(
        model="mistral-large-latest",
        messages=[
            {
                "role": "system",
                "content": (
                    "Eres el asistente comercial de CultivaCRM. "
                    "Redactas emails profesionales en español, "
                    "cálidos y orientados a resultados. Sin clichés."
                )
            },
            {
                "role": "user",
                "content": f"Escribe un email de seguimiento para {nombre_cliente} "
                           f"de {empresa}. Última reunión: {ultima_reunion}. "
                           f"Servicio discutido: {servicio_propuesto}."
            }
        ],
    )

    return response.choices[0].message.content


# --- Uso en CultivaCRM ---
email = generar_email_seguimiento(
    nombre_cliente="Ana García",
    empresa="Agencia Momentum Madrid",
    ultima_reunion="14 jun 2026 — demo de automatización de campañas",
    servicio_propuesto="Plan Growth: automatización + IA de leads (890€/mes)"
)

print(email)
# → Asunto: Siguientes pasos tras nuestra demo de ayer, Ana
# → Hola Ana, ha sido un placer mostrarte cómo Cultiva...
📊
2. Clasificador de leads (JSON Mode)
💡
JSON Mode

Pasa response_format={"type": "json_object"} y el modelo garantiza una respuesta JSON parseable. Ideal para extraer datos estructurados de formularios de texto libre.

Python cultivacrm/ai/lead_classifier.py
from mistralai import Mistral
import json

client = Mistral()

def clasificar_lead(mensaje_formulario: str) -> dict:
    """
    Extrae datos estructurados de un formulario de contacto en lenguaje libre.
    Devuelve JSON con sector, presupuesto, urgencia y servicio.
    """
    response = client.chat.complete(
        model="mistral-small-latest",  # económico para alto volumen
        messages=[
            {
                "role": "user",
                "content": (
                    "Analiza este mensaje de contacto y devuelve JSON con los campos: "
                    "sector (string), presupuesto_eur (number o null), urgencia (alta/media/baja), "
                    "servicio_solicitado (string), tamanyo_empresa (string). "
                    f"Mensaje: {mensaje_formulario}"
                )
            }
        ],
        response_format={"type": "json_object"},
    )

    return json.loads(response.choices[0].message.content)


# --- Formulario de contacto recibido en CultivaCRM ---
formulario = """
Hola, somos una clínica dental con 3 centros en Barcelona.
Llevamos tiempo queriendo mejorar nuestra presencia digital
y automatizar el seguimiento de pacientes. Tenemos unos
800 pacientes activos. Presupuesto orientativo unos 600€ al mes,
aunque podemos llegar a 1000 si el ROI lo justifica.
Necesitamos empezar antes de septiembre si es posible.
"""

lead = clasificar_lead(formulario)
print(json.dumps(lead, indent=2, ensure_ascii=False))
"""
{
  "sector": "Salud / Clínica dental",
  "presupuesto_eur": 800,
  "urgencia": "alta",
  "servicio_solicitado": "Presencia digital + automatización CRM",
  "tamanyo_empresa": "Mediana (3 centros, ~800 pacientes)"
}
"""
🔍
3. Búsqueda semántica de clientes (Embeddings)
Python cultivacrm/ai/semantic_search.py
from mistralai import Mistral
import numpy as np
from typing import List, Dict

client = Mistral()

def get_embedding(texto: str) -> List[float]:
    """Genera embedding de 1024 dimensiones con mistral-embed."""
    response = client.embeddings.create(
        model="mistral-embed",
        inputs=[texto]
    )
    return response.data[0].embedding

def cosine_similarity(a, b) -> float:
    return np.dot(a, b) / (np.linalg.norm(a) * np.linalg.norm(b))

def buscar_clientes_similares(
    nuevo_prospecto: str,
    base_clientes: List[Dict],
    top_k: int = 3
) -> List[Dict]:
    """
    Encuentra los top_k clientes más similares al nuevo prospecto.
    Útil para incluir casos de éxito relevantes en la propuesta.
    """
    embedding_prospecto = get_embedding(nuevo_prospecto)

    resultados = []
    for cliente in base_clientes:
        emb = get_embedding(cliente["descripcion"])
        score = cosine_similarity(embedding_prospecto, emb)
        resultados.append({**cliente, "similitud": round(score, 3)})

    return sorted(resultados, key=lambda x: x["similitud"], reverse=True)[:top_k]


# --- Base de clientes de CultivaCRM (ejemplo) ---
base = [
    {"nombre": "Clínica DentalPro", "descripcion": "Clínica dental 2 centros Madrid, automatización citas"},
    {"nombre": "E-commerce ModaKid", "descripcion": "Tienda online moda infantil, email marketing"},
    {"nombre": "Consultora Nexum", "descripcion": "Consultoría estratégica B2B, generación de leads"},
    {"nombre": "FisioBalance", "descripcion": "Centro fisioterapia 4 sedes, CRM pacientes, WhatsApp"},
]

prospecto = "Clínica dental 3 centros Barcelona, quieren automatizar seguimiento de pacientes"
similares = buscar_clientes_similares(prospecto, base, top_k=2)
print(similares)
# → [{"nombre": "Clínica DentalPro", "similitud": 0.941, ...},
#     {"nombre": "FisioBalance", "similitud": 0.873, ...}]
💻
4. Autocompletado FIM con Codestral
Fill-in-the-Middle (FIM)

Codestral puede completar el código entre un prefijo (prompt) y un sufijo conocido. Es la funcionalidad estrella para IDEs y editores integrados: el modelo sabe exactamente qué función hay que implementar.

Python cultivacrm/ai/code_assistant.py
from mistralai import Mistral

client = Mistral()

# Fill-in-the-middle: el dev escribe prefijo y sufijo,
# Codestral genera el cuerpo de la función.
response = client.fim.complete(
    model="codestral-latest",
    prompt="""
def calcular_score_lead(lead: dict) -> float:
    \"\"\"
    Calcula un score de 0-100 para priorizar leads en CultivaCRM.
    Factores: presupuesto, urgencia, tamaño empresa, sector.
    \"\"\"
""",
    suffix="""

# Tests básicos
assert calcular_score_lead({"presupuesto_eur": 2000, "urgencia": "alta"}) > 70
assert calcular_score_lead({"presupuesto_eur": 100, "urgencia": "baja"}) < 30
""",
    max_tokens=512,
)

codigo_generado = response.choices[0].message.content
print(codigo_generado)
"""
    score = 0.0
    if lead.get("presupuesto_eur"):
        score += min(lead["presupuesto_eur"] / 50, 40)  # max 40pts
    urgencia_pts = {"alta": 30, "media": 15, "baja": 5}
    score += urgencia_pts.get(lead.get("urgencia", "baja"), 0)
    ...
    return min(score, 100.0)
"""


# --- TypeScript: streaming en el editor web del CRM ---
TypeScript cultivacrm/frontend/hooks/useCodeStream.ts
import Mistral from "@mistralai/mistralai";

const client = new Mistral({ apiKey: process.env.MISTRAL_API_KEY });

/** Genera sugerencia de código en streaming para el editor del CRM */
export async function* streamCodeSuggestion(
  prompt: string,
  onChunk: (chunk: string) => void
): AsyncGenerator<string> {
  const stream = await client.chat.stream({
    model: "codestral-latest",
    messages: [
      { role: "user", content: prompt }
    ],
  });

  for await (const event of stream) {
    const chunk = event.data.choices[0]?.delta?.content ?? "";
    if (chunk) {
      onChunk(chunk);
      yield chunk;
    }
  }
}

// Uso en componente React del editor CRM:
// for await (const chunk of streamCodeSuggestion(prompt, setCode)) {}
💰
Estimación de costes — CultivaCRM
~200 USD/mes volumen medio
mistral-large-latest
$3
por millón de tokens (input)
mistral-small-latest
$0.10
por millón de tokens (input)
codestral-latest
$0.30
por millón de tokens (input)
Caso de uso Modelo Vol. mensual estimado Coste estimado
Emails de seguimiento mistral-large ~500 emails × 800 tokens ~$1.20
Clasificación leads (volumen) mistral-small ~5.000 leads × 400 tokens ~$0.20
Embeddings búsqueda semántica mistral-embed ~50.000 vectores/mes ~$0.05
Autocompletado dev (Codestral) codestral ~20.000 completions × 200 tokens ~$1.20
Total estimado ~$3–5/mes
⚠️
Nota de presupuesto

A escala enterprise (50.000+ emails/mes con mistral-large), el coste sube a ~$120/mes. Sigue siendo significativamente más barato que GPT-4o. Usa mistral-small para clasificación en volumen y reserva large para propuestas complejas.

🇪🇺
GDPR & Compliance
Residencia de datos en la UE por defecto

Mistral AI está fundada en París y procesa todos los datos en centros de datos europeos. Es la alternativa GDPR-compliant nativa para clientes enterprise españoles que no pueden enviar datos a EE.UU. sin BCR o SCCs. No hay necesidad de Privacy Shield ni evaluación de transferencias internacionales.

Requisito GDPR Mistral AI Notas
Residencia de datos en UE ✅ Sí (default) Data centers Francia/UE
DPA (Data Processing Agreement) ✅ Disponible Solicitar en console.mistral.ai
Sin entrenamiento con datos usuario ✅ Por defecto Verificar en plan DPA
Despliegue on-premise ✅ Vía Azure/GCP EU o open-mistral-nemo local
Transferencias internacionales ✅ No aplica Datos no salen de la UE