PHP

Aimeos Prisma: una API de PHP para los LLM que trabajan con imagen, audio y vídeo

Autorangel cruz
Publicado
Lectura7 min de lectura
Aimeos Prisma: una API de PHP para los LLM que trabajan con imagen, audio y vídeo

Prisma (aimeos/prisma) es un paquete PHP que pone 39 proveedores de LLM detrás de una sola interfaz, y su diferencia está en lo multimedia: OCR, inpainting, borrar fondos, separar las pistas de un audio o generar vídeo. Con el AI SDK de Laravel se solapa en texto y embeddings, y a partir de ahí cubre operaciones que el SDK oficial ni intenta.

Si tu problema es un agente conversacional con herramientas, memoria y colas, el AI SDK de Laravel es la respuesta correcta y este artículo no va contigo. Si tu problema es "necesito leer el texto de 4.000 facturas escaneadas" o "hay que quitar el fondo de las fotos de producto", entonces el SDK oficial no tiene ese método y Prisma sí.

Qué es y de dónde sale

Prisma lo publica Aimeos, la gente detrás del paquete de ecommerce del mismo nombre. Es una librería MIT y el repositorio se creó el 28 de octubre de 2025. Al escribir esto lleva 227 estrellas en GitHub.

Va rápido: la primera versión, 0.1.0, se publicó el 13 de noviembre de 2025, y la 0.7.0 el 8 de septiembre de 2026, doce versiones en menos de un año. Sigue en el rango 0.x, así que la API todavía puede moverse entre versiones menores.

Sus dependencias son cortas: PHP 8.2 o superior, Guzzle 7, y las extensiones curl, gd y fileinfo. Esa ext-gd está ahí porque el paquete manipula imágenes en tu propia máquina, no solo pasa cadenas de texto a una API.

Y no trae service provider de Laravel. No hay bloque extra.laravel en su composer.json, ni facade, ni fichero de configuración publicable. Es una librería PHP normal, y en Laravel la usas como usarías cualquier otra: resolviéndola desde el contenedor o instanciándola donde la necesites.

Instalación

composer req aimeos/prisma

Y el patrón básico, tal cual aparece en su README:

use Aimeos\Prisma\Prisma;
 
$image = Prisma::image()
    ->using( '<provider>', ['api_key' => 'xxx'] )
    ->model( '<modelname>' )
    ->ensure( 'imagine' )
    ->imagine( 'a grumpy cat' )
    ->binary();

La cadena se lee sola: eliges modalidad (image, text, audio, video), eliges proveedor con sus credenciales, opcionalmente el modelo, y llamas a la operación.

El eslabón interesante es ensure(). Como cada proveedor implementa un subconjunto distinto de operaciones, ensure('imagine') falla de forma explícita si el proveedor elegido no implementa ese método, antes de gastar una llamada de red. Su hermano has() hace la misma comprobación devolviendo un booleano, que es lo que quieres si vas a elegir proveedor en tiempo de ejecución.

Las cuatro APIs

Las operaciones, por modalidad:

Imagen, 13 operaciones: imagine genera desde un prompt, describe describe el contenido, recognize hace OCR, inpaint edita una zona concreta según un prompt, erase borra partes, isolate quita el fondo, background lo reemplaza según un prompt, relocate coloca el objeto en primer plano sobre otro fondo, repaint repinta la imagen entera, detext elimina todo el texto, uncrop extiende el encuadre, upscale escala y vectorize genera embeddings de la imagen.

Audio, 6: speak (texto a voz), transcribe (voz a texto), describe, revoice cambia la voz de un audio, denoise quita ruido y demix separa un audio en sus pistas individuales.

Vídeo, 6: imagine, describe, extend continúa un vídeo según un prompt, repaint, uncrop y upscale.

Texto, 5: write, stream, structure para salida estructurada con un esquema, translate y vectorize para embeddings.

Un ejemplo real, OCR sobre una imagen remota:

use Aimeos\Prisma\Prisma;
use Aimeos\Prisma\Files\Image;
 
$image = Image::fromUrl( 'https://example.com/image.png' );
 
$textResponse = Prisma::image()
    ->using( '<provider>', ['api_key' => 'xxx'] )
    ->recognize( $image );
 
$text = $textResponse->text();

Y embeddings de un lote de textos, con el tamaño del vector como segundo argumento:

$vectorResponse = Prisma::text()
    ->using( 'openai', ['api_key' => 'xxx'] )
    ->ensure( 'vectorize' )
    ->vectorize( ['The quick brown fox', 'jumps over the lazy dog'], 256 );
 
$vectors = $vectorResponse->vectors();

Esos vectores son los que acabas guardando en una columna vectorial para hacer búsqueda semántica en Laravel con MariaDB.

La tabla de proveedores

39 proveedores no significa 39 proveedores para todo. El README trae una matriz por modalidad, marcando cada celda como yes, beta o vacía, y es lo primero que hay que mirar antes de decidir nada:

  • OCR (recognize) solo lo implementan Mistral y OpenRouter.
  • Separar pistas de audio (demix) y quitar ruido (denoise), solo AudioPod.
  • Quitar el fondo de una imagen (isolate) lo tienen Bedrock Titan, Clipdrop, Ideogram, Photoroom, Recraft, RemoveBG y StabilityAI.
  • Casi todo el vídeo está en beta.

Es la realidad del mercado, donde nadie hace bien las veinte cosas. Lo que aporta Prisma es que cambiar de proveedor para una operación concreta sea cambiar una cadena de texto, y que ensure() te avise si te equivocas.

Tools y esquemas

Prisma también hace bucles de herramientas, y ahí sí solapa con el SDK de Laravel, aunque con una vuelta de tuerca:

$tool = Tools::laravel( new MyLaravelTool() );
$tool = Tools::laravel( MyLaravelTool::class );

Tools::laravel() acepta herramientas que extienden \Laravel\Mcp\Server\Tool o implementan \Laravel\Ai\Contracts\Tool. Si le pasas el nombre de la clase, la instancia se resuelve por el contenedor de Laravel, con sus dependencias inyectadas. O sea: las herramientas que ya escribiste para tu servidor MCP o para el AI SDK se reutilizan sin reescribirlas. Hay un equivalente para Symfony, Tools::symfony(), con clases anotadas con #[AsTool].

Para herramientas propias, el esquema se declara con un builder:

use Aimeos\Prisma\Schema\Schema;
use Aimeos\Prisma\Tools;
 
$tool = Tools::make( 'weather', 'Get current weather', Schema::for( 'weather', [
    'city' => Schema::string()->description( 'City name' )->required(),
] ), fn( $args ) => json_encode( ['temp' => '22°C', 'city' => $args['city']] ) );
 
$response = Prisma::text()
    ->using( 'openai', ['api_key' => 'xxx'] )
    ->withTools( [$tool] )
    ->withMaxSteps( 5 )
    ->write( 'What is the weather in Berlin?' );

withMaxSteps() limita los pasos del bucle de herramientas, y su valor por defecto es 25. Bajarlo es la forma directa de poner un techo al gasto de una petición que se puede ir de las manos. Cada herramienta individual admite además su propio límite con ->max(3).

Prisma o el AI SDK de Laravel: cómo decidir

La tabla de soporte del AI SDK de Laravel 13 cubre siete áreas: texto, imágenes, TTS, STT, embeddings, reranking y ficheros. Genera imágenes con Image::of(...)->generate() sobre OpenAI, Gemini o xAI, y ahí se acaba lo que hace con una imagen.

Quédate solo en laravel/ai si lo que construyes son agentes: conversaciones persistidas en base de datos, subagentes, middleware, aprobación humana de herramientas, streaming a la vista, encolado de trabajos, herramientas MCP, failover entre proveedores y helpers de testing. Nada de eso está en Prisma, y reimplementarlo sería un error.

Suma Prisma cuando el requisito sea una operación multimedia que el SDK no tiene: OCR, edición de imagen por zonas, quitar o cambiar fondos, escalar, extender el encuadre, separar pistas de audio, cambiar una voz, o cualquier cosa con vídeo. Es el hueco que el SDK deja abierto.

Lo que sí evitaría es meter Prisma solo para hacer llamadas de texto en un proyecto Laravel que ya tiene el AI SDK configurado. Serían dos configuraciones de credenciales, dos formas de testear y dos sitios donde mirar cuando algo falle, a cambio de nada.

Y como es un 0.x, fija la versión en tu composer.json y lee el diff antes de subir de menor.

Preguntas frecuentes

¿Qué es Aimeos Prisma?

Un paquete PHP con licencia MIT que integra modelos de lenguaje de texto y multimedia bajo una interfaz unificada. Cubre cuatro modalidades (texto, imagen, audio y vídeo) sobre 39 proveedores, y se instala con composer req aimeos/prisma.

¿Prisma funciona con Laravel?

Sí, como cualquier librería PHP. No trae service provider ni auto-discovery, así que no hay configuración que publicar: lo instancias donde lo necesites o lo registras tú en el contenedor. Sus herramientas sí saben aceptar clases de laravel/ai y de laravel/mcp a través de Tools::laravel().

¿Prisma reemplaza al AI SDK de Laravel?

No. El AI SDK cubre agentes, conversaciones persistidas, subagentes, colas, MCP, aprobación humana de herramientas y testing, y nada de eso está en Prisma. Prisma cubre operaciones multimedia que el SDK no tiene: OCR, inpainting, quitar fondos, escalar imágenes, separar audio o generar vídeo. Conviven bien.

¿Qué necesito para instalarlo?

PHP 8.2 o superior, Guzzle 7 y las extensiones curl, gd y fileinfo. La extensión gd es obligatoria porque el paquete manipula imágenes localmente.

¿Puedo hacer OCR en PHP con Prisma?

Sí, con el método recognize() de la API de imagen. Según la matriz de proveedores de su README, esa operación la implementan Mistral y OpenRouter.

¿Cómo evito llamar a un proveedor que no soporta la operación?

Con ensure('metodo'), que falla de forma explícita antes de la llamada de red, o con has('metodo'), que devuelve un booleano y sirve para elegir proveedor en tiempo de ejecución.

Fuentes

¿Tienes un proyecto en mente?

Trabajo con Laravel, WordPress, SEO técnico y servidores MCP. El primer paso es una llamada de descubrimiento, sin costo ni compromiso, donde me cuentas qué necesitas y te digo con honestidad si puedo ayudarte.

Hablemos