IA integrada
Modelos de lenguaje que vienen con el navegador: traducir, resumir y conversar sin servidor y sin enviar datos.
Chrome trae Gemini Nano y modelos de traducción propios, y la página los usa con APIs de alto nivel (Translator, LanguageDetector, Summarizer) o con la Prompt API (LanguageModel), que desde Chrome 148 acepta texto, imagen y audio y puede ceñir la respuesta a un esquema JSON.
Todo ocurre en el equipo: sin coste por petición y sin que los datos salgan. A cambio, solo funciona en Chrome de escritorio (Edge tiene parte), el modelo se descarga la primera vez y pide un equipo potente. Mozilla se ha posicionado en contra de la Prompt API.
Para qué sirve
- Traducir reseñas o comentarios al idioma del lector
- Resumir artículos, hilos o documentos largos
- Clasificar o extraer datos con salida JSON
Demo
Compatibilidad
Disponibilidad limitada| Función | Escritorio | Móvil | |||||
|---|---|---|---|---|---|---|---|
| Chrome | Edge | Firefox | Safari | Chrome Android | Firefox Android | Safari iOS | |
| Prompt API (LanguageModel) | 148Chrome: 148 | 138flag1Edge: 138 flag | —Firefox: No | —Safari: No | —Chrome: No | —Firefox: No | —Safari: No |
| Summarizer | 1382Chrome: 138 | 138preview3Edge: 138 preview | —Firefox: No | —Safari: No | —Chrome: No | —Firefox: No | —Safari: No |
| Translator | 1382Chrome: 138 | 148Edge: 148 | —Firefox: No | —Safari: No | —Chrome: No | —Firefox: No | —Safari: No |
| LanguageDetector | 1382Chrome: 138 | 148Edge: 148 | —Firefox: No | —Safari: No | —Chrome: No | —Firefox: No | —Safari: No |
| Writer y Rewriter | ✓flag4Chrome: flag | ✓flag5Edge: flag | —Firefox: No | —Safari: No | —Chrome: No | —Firefox: No | —Safari: No |
| Proofreader | ✓flag6Chrome: flag | 142flag5Edge: 142 flag | —Firefox: No | —Safari: No | —Chrome: No | —Firefox: No | —Safari: No |
- 1Canary y Dev, tras una flag, con Phi-4-mini; no activada en la versión estable.
- 2Availability may be subject to geographical restrictions.
- 3Activada en Canary y Dev (Phi-4-mini); no en la versión estable.
- 4La prueba de origen (137–148) terminó; ahora es una prueba para desarrolladores con flag.
- 5Canary y Dev, tras una flag.
- 6La prueba de origen (141–145) terminó; ahora es una prueba para desarrolladores con flag.
Compatibilidad generada en cada publicación desde MDN browser-compat-data 8.1.3 (24 sep 2026) · web-features 3.40.0 · revisión manual: 1 oct 2026
Código mínimo
<!doctype html>
<meta charset="utf-8">
<title>IA integrada · ejemplo mínimo</title>
<!-- Detecta el idioma, traduce, resume y pregunta al modelo del navegador. Chrome 138+ (Prompt API: 148+), escritorio. -->
<textarea id="text" rows="4" cols="60">La Casa Botines es un edificio modernista de Antoni Gaudí en León, terminado en 1892.</textarea>
<p>
<button id="translate">Detectar y traducir al inglés</button>
<button id="summarize">Resumir</button>
<button id="prompt">Preguntar</button>
<progress id="progress" max="1" value="0"></progress>
</p>
<pre id="out"></pre>
<script type="module">
const $ = (s) => document.querySelector(s);
const out = $('#out');
// Las descargas del modelo informan del progreso (0..1)
const monitor = (m) => m.addEventListener('downloadprogress', (e) => ($('#progress').value = e.loaded));
// create() necesita un gesto del usuario si el modelo aún no está descargado: llámalo desde un clic.
$('#translate').onclick = async () => {
if (!('LanguageDetector' in self && 'Translator' in self)) return (out.textContent = 'Translator / LanguageDetector no disponibles.');
const detector = await LanguageDetector.create({ monitor });
const [{ detectedLanguage: sourceLanguage, confidence }] = await detector.detect($('#text').value);
const options = { sourceLanguage, targetLanguage: 'en' };
if ((await Translator.availability(options)) === 'unavailable') return (out.textContent = `No se puede traducir desde «${sourceLanguage}».`);
const translator = await Translator.create({ ...options, monitor });
out.textContent = `${sourceLanguage} (${Math.round(confidence * 100)} %) → en\n${await translator.translate($('#text').value)}`;
};
$('#summarize').onclick = async () => {
if (!('Summarizer' in self)) return (out.textContent = 'Summarizer no disponible.');
const options = { type: 'tldr', format: 'plain-text', length: 'short', expectedInputLanguages: ['es'], outputLanguage: 'es' };
if ((await Summarizer.availability(options)) === 'unavailable') return (out.textContent = 'El modelo no está disponible en este equipo.');
const summarizer = await Summarizer.create({ ...options, monitor });
out.textContent = '';
for await (const chunk of summarizer.summarizeStreaming($('#text').value)) out.textContent += chunk;
};
$('#prompt').onclick = async () => {
if (!('LanguageModel' in self)) return (out.textContent = 'Prompt API (LanguageModel) no disponible.');
const io = { expectedInputs: [{ type: 'text', languages: ['es'] }], expectedOutputs: [{ type: 'text', languages: ['es'] }] };
if ((await LanguageModel.availability(io)) === 'unavailable') return (out.textContent = 'El modelo no está disponible en este equipo.');
const session = await LanguageModel.create({
...io, monitor,
initialPrompts: [{ role: 'system', content: 'Responde en español, en una sola frase.' }],
});
out.textContent = '';
for await (const chunk of session.promptStreaming(`¿Quién diseñó este edificio? ${$('#text').value}`)) out.textContent += chunk;
// Salida estructurada: await session.prompt(texto, { responseConstraint: { type: 'boolean' } })
};
</script><!doctype html>
<meta charset="utf-8">
<title>IA integrada · ejemplo mínimo</title>
<!-- Detecta el idioma, traduce, resume y pregunta al modelo del navegador. Chrome 138+ (Prompt API: 148+), escritorio. -->
<textarea id="text" rows="4" cols="60">La Casa Botines es un edificio modernista de Antoni Gaudí en León, terminado en 1892.</textarea>
<p>
<button id="translate">Detectar y traducir al inglés</button>
<button id="summarize">Resumir</button>
<button id="prompt">Preguntar</button>
<progress id="progress" max="1" value="0"></progress>
</p>
<pre id="out"></pre>
<script type="module">
const $ = (s) => document.querySelector(s);
const out = $('#out');
// Las descargas del modelo informan del progreso (0..1)
const monitor = (m) => m.addEventListener('downloadprogress', (e) => ($('#progress').value = e.loaded));
// create() necesita un gesto del usuario si el modelo aún no está descargado: llámalo desde un clic.
$('#translate').onclick = async () => {
if (!('LanguageDetector' in self && 'Translator' in self)) return (out.textContent = 'Translator / LanguageDetector no disponibles.');
const detector = await LanguageDetector.create({ monitor });
const [{ detectedLanguage: sourceLanguage, confidence }] = await detector.detect($('#text').value);
const options = { sourceLanguage, targetLanguage: 'en' };
if ((await Translator.availability(options)) === 'unavailable') return (out.textContent = `No se puede traducir desde «${sourceLanguage}».`);
const translator = await Translator.create({ ...options, monitor });
out.textContent = `${sourceLanguage} (${Math.round(confidence * 100)} %) → en\n${await translator.translate($('#text').value)}`;
};
$('#summarize').onclick = async () => {
if (!('Summarizer' in self)) return (out.textContent = 'Summarizer no disponible.');
const options = { type: 'tldr', format: 'plain-text', length: 'short', expectedInputLanguages: ['es'], outputLanguage: 'es' };
if ((await Summarizer.availability(options)) === 'unavailable') return (out.textContent = 'El modelo no está disponible en este equipo.');
const summarizer = await Summarizer.create({ ...options, monitor });
out.textContent = '';
for await (const chunk of summarizer.summarizeStreaming($('#text').value)) out.textContent += chunk;
};
$('#prompt').onclick = async () => {
if (!('LanguageModel' in self)) return (out.textContent = 'Prompt API (LanguageModel) no disponible.');
const io = { expectedInputs: [{ type: 'text', languages: ['es'] }], expectedOutputs: [{ type: 'text', languages: ['es'] }] };
if ((await LanguageModel.availability(io)) === 'unavailable') return (out.textContent = 'El modelo no está disponible en este equipo.');
const session = await LanguageModel.create({
...io, monitor,
initialPrompts: [{ role: 'system', content: 'Responde en español, en una sola frase.' }],
});
out.textContent = '';
for await (const chunk of session.promptStreaming(`¿Quién diseñó este edificio? ${$('#text').value}`)) out.textContent += chunk;
// Salida estructurada: await session.prompt(texto, { responseConstraint: { type: 'boolean' } })
};
</script>Novedades
- Chrome 151: el detector de idioma distingue chino simplificado y tradicional.
- Chrome 149: Gemini Nano admite alemán y francés, además de inglés, español y japonés.
- Edge publica sus modelos y APIs en el dispositivo; Translator y LanguageDetector, estables desde Edge 148.
- Chrome 148 activa la Prompt API para páginas web: entrada multimodal y responseConstraint.
- Chrome 149 ya no incluye la prueba de origen de Writer y Rewriter (137–148); como Proofreader (141–145), siguen como pruebas para desarrolladores.
Ten en cuenta
- Llama a create() desde un clic: si el modelo hay que descargarlo, exige un gesto del usuario.
- Requisitos de Gemini Nano: 22 GB libres y una GPU con más de 4 GB de VRAM, o una CPU con 16 GB de RAM y 4 núcleos. No hay versión para Android ni iOS.
- Translator.availability() responde «downloadable» para cada pareja de idiomas hasta que el sitio crea un traductor para ella, para no revelar qué idiomas tienes. Estas APIs no funcionan en workers.
Más información
Fuentes
- Chrome · Built-in AI APIs (estado)consultado el 1 oct 2026
- Chrome · Get started with built-in AI (requisitos)consultado el 1 oct 2026
- Chrome 148 release notes5 may 2026
- Prompt API (borrador)24 sep 2026
- Microsoft Edge · Prompt API2 jun 2026
- Mozilla standards-positions #1213consultado el 1 oct 2026