Tutorial de visión de Kimi K3: imágenes, vídeo y del diseño al código
Kimi K3 admite imágenes y vídeo de forma nativa. Aprende a construir messages multimodales bien: base64 para imágenes locales, vídeo con la files API y ms://, y por qué fallan las URL públicas.
Una de las mejoras más prácticas de Kimi K3 es que la visión pasa a ser una capacidad nativa: sin OCR adosado ni una segunda modelo de visión. Metes imágenes y vídeo directamente en messages y dejas que el modelo «mire la imagen» para escribir código, leer gráficos y entender interfaces. Pero al construir una petición multimodal hay unos cuantos detalles que debes acertar con exactitud, o falla sin más. Esta guía deja claro el enfoque correcto.
Primero, dos reglas de oro
La entrada de visión de Kimi K3 tiene dos requisitos estrictos; grábatelos antes que nada:
- El contenido de imagen y texto debe ser un «array de objetos», nunca aplanado en una cadena serializada. Es decir,
contentse escribe como una lista del tipo[{type:"text",...}, {type:"image_url",...}]. - No se admiten URL públicas de imagen. Inserta las imágenes locales en línea como base64, y para el vídeo súbelo con la files API y refiérete a él como
ms://<file-id>. Pasarhttps://example.com/a.pngdirectamente fallará.
Ten claras estas dos y esquivarás la mayoría de los «errores de petición de visión».
Entrada de imagen: base64 en línea
import base64, os
from openai import OpenAI
client = OpenAI(
api_key=os.environ["MOONSHOT_API_KEY"],
base_url="https://api.moonshot.cn/v1",
)
with open("design.png", "rb") as f:
b64 = base64.b64encode(f.read()).decode()
resp = client.chat.completions.create(
model="kimi-k3",
messages=[{
"role": "user",
"content": [
{"type": "text", "text": "¿Qué componentes de UI hay en esta imagen? Hazme una lista."},
{"type": "image_url",
"image_url": {"url": f"data:image/png;base64,{b64}"}},
],
}],
)
print(resp.choices[0].message.content)
Fíjate en que image_url.url usa un data URI (data:image/png;base64,...). Esto es «base64 en línea», no un «enlace público»: y lo que K3 admite es precisamente esto.
Entrada de vídeo: files API + referencia ms://
Sube primero el archivo de vídeo con la files API y, una vez tengas el file id, refiérete a él en el mensaje con ms://<file-id>:
# 1) Sube el vídeo y obtén un file id
f = client.files.create(file=open("demo.mp4", "rb"), purpose="assistants")
# 2) Refiérete a él en el mensaje con ms://<file-id>
resp = client.chat.completions.create(
model="kimi-k3",
messages=[{
"role": "user",
"content": [
{"type": "text", "text": "En esta grabación de pantalla, ¿qué pasos completó el usuario?"},
{"type": "image_url", "image_url": {"url": f"ms://{f.id}"}},
],
}],
)
Los parámetros del endpoint de subida, como
purpose, se rigen por la documentación oficial; comprueba la versión vigente antes de integrar.
En la práctica: convertir un diseño en un frontend
K3 está pensado para escenarios que «combinan ingeniería de software y análisis visual», y el más típico es escribir el frontend directamente a partir de un diseño:
with open("mockup.png", "rb") as f:
b64 = base64.b64encode(f.read()).decode()
resp = client.chat.completions.create(
model="kimi-k3",
messages=[{
"role": "user",
"content": [
{"type": "text", "text":
"Escribe estrictamente a partir de este diseño el HTML + Tailwind CSS correspondiente. "
"Reproduce la maquetación, el espaciado y los colores lo más fielmente posible y devuelve un único archivo completo y ejecutable."},
{"type": "image_url", "image_url": {"url": f"data:image/png;base64,{b64}"}},
],
}],
)
print(resp.choices[0].message.content)
El mismo planteamiento sirve para leer los datos de un gráfico y analizarlos, localizar un problema a partir de una captura de error o editar código según una captura de un juego o de CAD. Como K3 tiene un contexto de 1M, incluso puedes meter juntos «el diseño + tu base de código existente» y que edite dentro del contexto completo del proyecto en lugar de generar desde cero (para el uso de contexto largo, consulta la guía del contexto de 1M).
Errores frecuentes
- La petición de visión falla sin más: casi siempre pasaste una URL pública o aplanaste
contenten una cadena. Cambia a base64 /ms://más un array de objetos. - Imagen demasiado grande / fuera de presupuesto: tanto las imágenes como el vídeo cuentan como tokens, y una imagen grande o un vídeo largo se comen mucho contexto. Comprime las dimensiones o extrae fotogramas cuando haga falta.
- Se pierde el estado entre turnos: en una conversación multiturno con imágenes, acuérdate de reenviar el mensaje completo de assistant tal cual; no dejes solo
content.
Conclusión
La visión nativa de K3 convierte «mirar una imagen + escribir código» en algo que una sola modelo resuelve en una sola petición. Ten presentes las dos reglas de oro (array de objetos, nada de URL públicas) y prácticamente no tropezarás. Para la integración completa, los precios y la migración, consulta el tutorial de la API de Kimi K3. Para llamar a K3 junto a otras modelos multimodales con una sola clave y comparar resultados por tarea, consigue una clave en el panel de GetModel y empieza.