Title: Migraci%C3%B3n %E2%80%94 LLM EU Canonical: https://llmeu.com/es/docs/migration/ Markdown mirror: https://llmeu.com/es/docs/migration.md Machine-readable: https://llmeu.com/llms.txt (index) - https://llmeu.com/llms-full.txt (full catalogue) - https://llmeu.com/llms-catalogue.json Empezar - [Inicio r%C3%A1pido](/es/docs/quickstart/) - [Consola](/es/docs/console/) - [Migraci%C3%B3n](/es/docs/migration/) - [Referencia de la API](/es/docs/api/) Referencia - [Autenticaci%C3%B3n](/es/docs/authentication/) - [Endpoints](/es/docs/endpoints/) - [Errores](/es/docs/errors/) - [L%C3%ADmites de tasa](/es/docs/rate-limits/) - [Streaming](/es/docs/streaming/) - [Pol%C3%ADticas](/es/docs/policies/) - [Enrutamiento y pol%C3%ADtica](/es/docs/routing/) - [Residencia y regiones](/es/docs/residency/) - [Evidencia y verificaci%C3%B3n](/es/docs/evidence/) - [Compatibilidad con OpenAI](/es/docs/openai-compat/) Operar - [Autoalojamiento](/es/docs/self-hosting/) # Migraci%C3%B3n Una URL base y una clave trasladan un cliente de OpenAI. Esta p%C3%A1gina tambi%C3%A9n indica lo que la API no hace, porque una migraci%C3%B3n que descubre eso en producci%C3%B3n no es una migraci%C3%B3n. ## La forma de sustituci%C3%B3n directa Apunta la URL base del cliente a https://api.llmeu.com/v1 y dale una clave de API de la consola. La forma de la solicitud no cambia. ``` from openai import OpenAI client = OpenAI(base_url="https://api.llmeu.com/v1", api_key="llmeu_live_xxxxxxxx.your-secret") resp = client.chat.completions.create( model="llmeu-auto", messages=[{"role": "user", "content": "Say hello from EU hosting."}], ) print(resp.choices[0].message.content) ``` ## Lo que acepta el endpoint de chat El validador de solicitudes en apps/api/src/app.mjs comprueba lo siguiente; lo que no comprueba se deja pasar o se ignora en lugar de rechazarse, de modo que un cliente m%C3%A1s reciente sigue funcionando. - model y messages son obligatorios; messages debe ser un array no vac%C3%ADo. - Cada mensaje necesita un rol (system, user, assistant, tool o developer) y content como una cadena o un array de partes. - stream debe ser un booleano cuando est%C3%A9 presente. - temperature, top_p, max_tokens, presence_penalty, frequency_penalty, seed y n deben ser n%C3%BAmeros cuando est%C3%A9n presentes. - max_tokens debe ser al menos 1. - n debe ser exactamente 1; cualquier otro valor se rechaza. - stop puede ser una cadena o un array de cadenas. - tools debe ser un array cuando est%C3%A9 presente. - llmeu debe ser un objeto; nunca es obligatorio. - tool_choice y response_format se reenv%C3%ADan al backend junto con los campos anteriores; un campo extra desconocido no se rechaza. ## Extras de solicitud en llmeu Un objeto llmeu con espacio de nombres en el cuerpo de la solicitud; un cliente que ignora campos desconocidos puede enviarlo sin problema. Las claves desconocidas dentro de llmeu se ignoran; una clave conocida con un valor no v%C3%A1lido se rechaza, porque un data_class incorrecto debe fallar de forma cerrada en lugar de significar silenciosamente ninguna clase de datos. ``` curl https://api.llmeu.com/v1/chat/completions \ -H "Authorization: Bearer $LLMEU_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "model": "llmeu-auto", "messages": [{"role": "user", "content": "Summarise this contract."}], "llmeu": {"residency": "eu-owned", "data_class": "confidential", "retention": "zero"} }' ``` ## Lo que no existe Estas respuestas son deliberadas, y un cliente que las espera ve el c%C3%B3digo de error en lugar de una sustituci%C3%B3n silenciosa. ## Extraer tus datos La exportaci%C3%B3n de cuenta me.json contiene campos de cuenta seleccionados, organizaciones, metadatos de claves de API sin secretos, pol%C3%ADticas actuales, las %C3%BAltimas 200 trazas por organizaci%C3%B3n y agregados de uso diario de 365 d%C3%ADas. No es una copia completa de todos los datos personales ni un registro hist%C3%B3rico de pol%C3%ADticas. La exportaci%C3%B3n de auditor%C3%ADa en NDJSON usa 7 d%C3%ADas por defecto, permite como m%C3%A1ximo 90 d%C3%ADas y limita las trazas a 5000; su manifiesto incluye counts.truncated, que marca una exportaci%C3%B3n que alcanz%C3%B3 el l%C3%ADmite. ``` GET /app/exports/me.json GET /app/exports/audit.ndjson?days=7 GET /app/exports/traces.json GET /app/exports/usage.json GET /app/exports/policies.json ``` La eliminaci%C3%B3n de la cuenta en s%C3%AD se realiza en la p%C3%A1gina de perfil y est%C3%A1 sujeta a la regla de propiedad de la p%C3%A1gina de la consola. ## Una cookie de sesi%C3%B3n no es una credencial de API Una sesi%C3%B3n de navegador autentica la consola, no la API. Un cliente de OpenAI que env%C3%ADe una recibe un rechazo con 403 api_key_required y tiene que usar una clave de API en su lugar. Un rechazo aqu%C3%AD nombra un c%C3%B3digo, de modo que una migraci%C3%B3n puede ramificar seg%C3%BAn %C3%A9l, y el bloque llmeu de cada respuesta indica qu%C3%A9 ocurri%C3%B3 realmente.