Saltar al contenido principal

Descripción general

revolution/laravel-amazon-bedrock es un driver para usar Amazon Bedrock con Laravel AI SDK. Permite manejar múltiples modelos de Bedrock a través de la API unificada del Laravel AI SDK.
FunciónUtilizable solo con API key de BedrockModelos / servicios compatibles
Generación de texto / streamingAnthropic Claude, Amazon Nova y casi todos los demás modelos de Bedrock (todos vía Converse API)
Uso de herramientas (Function Calling)
Salida estructurada
Adjuntar archivosAdjunta imágenes, documentos, audio y vídeo vía Converse API (los formatos admitidos varían según el modelo)
Generación de imágenesStability AI (por defecto), Amazon Nova Canvas (obsoleto)
Audio (TTS)⚠️Amazon Polly (motores generative / neural / long-form / standard)
Transcripción (STT)No compatible
EmbeddingsAmazon Titan Embeddings V2 (por defecto), Cohere Embed English/Multilingual V3, Cohere Embed V4 (con soporte de lote)
Reranking⚠️Cohere Rerank 3.5, Amazon Rerank 1.0
ArchivosAdmite adjuntar archivos locales en la generación de texto. No admite subidas al servidor ni fromId()
El símbolo ⚠️ en la tabla no significa que la función no esté soportada, sino que no se puede usar únicamente con la API key de Bedrock.
Con Laravel AI SDK v0.6.3 se añadió soporte oficial para Text, Image y Embeddings utilizando la API key de Bedrock. Este paquete sigue publicándose porque además admite funciones como audio (TTS) con Amazon Polly y reranking, que no están disponibles en la integración oficial.
Sus principales características son:
  • Autenticación: puedes elegir entre API key de Bedrock, credenciales IAM de AWS (SigV4) o la cadena de credenciales por defecto de AWS (roles IAM, perfiles de instancia, etc.).
  • Failover: compatible con el failover multiproveedor del AI SDK. Los errores de límite de tasa (429), sobrecarga (503, 529) y errores relacionados con créditos se mapean a excepciones aptas para failover.
  • Control de caché: la caché ephemeral está siempre activada en los prompts de sistema de la Converse API de Bedrock.
  • API unificada: Anthropic Claude, Amazon Nova, Meta Llama, Mistral y cualquier otro modelo se manejan con una interfaz unificada a través de la Converse API de Bedrock.

Requisitos

  • PHP >= 8.3
  • Laravel >= 12.x

Instalación

1

Instala el paquete

composer require revolution/laravel-amazon-bedrock
2

Publica la configuración de AI SDK

php artisan vendor:publish --provider="Laravel\Ai\AiServiceProvider"

Configuración

Añade el proveedor amazon-bedrock en config/ai.php. Si es necesario, cambia también el proveedor por defecto a Bedrock.
'default' => 'amazon-bedrock',
'default_for_images' => 'amazon-bedrock',
'default_for_audio' => 'amazon-bedrock',
'default_for_embeddings' => 'amazon-bedrock',
'default_for_reranking' => 'amazon-bedrock',

Opción 1: API key de Bedrock

'providers' => [
    'amazon-bedrock' => [
        'driver' => 'amazon-bedrock',
        'key'    => env('AWS_BEDROCK_API_KEY', ''),
        'region' => env('AWS_DEFAULT_REGION', 'us-east-1'),
    ],
],
AWS_BEDROCK_API_KEY=your_api_key
AWS_DEFAULT_REGION=us-east-1
La API key de Bedrock se obtiene desde la consola de AWS.
La API key de Bedrock es exclusiva de la Bedrock Runtime API. No se puede usar con reranking (bedrock-agent-runtime) ni con Amazon Polly (TTS). Para esos servicios utiliza SigV4 o la cadena de credenciales por defecto de AWS.

Opción 2: credenciales IAM de AWS (SigV4)

Utiliza una access key y una secret key de AWS que se firman con Signature Version 4.
'providers' => [
    'amazon-bedrock' => [
        'driver' => 'amazon-bedrock',
        'key'    => env('AWS_ACCESS_KEY_ID'),
        'secret' => env('AWS_SECRET_ACCESS_KEY'),
        'token'  => env('AWS_SESSION_TOKEN'),
        'region' => env('AWS_DEFAULT_REGION', 'us-east-1'),
    ],
],
AWS_ACCESS_KEY_ID=AKIA...
AWS_SECRET_ACCESS_KEY=wJalr...
AWS_SESSION_TOKEN= # opcional (para credenciales temporales de STS)
AWS_DEFAULT_REGION=us-east-1
AWS_SESSION_TOKEN solo se configura cuando se usan credenciales temporales (STS).

Opción 3: cadena de credenciales por defecto de AWS (roles IAM)

En entornos con rol IAM como EC2 / ECS / Lambda, puedes omitir key y secret y utilizar la cadena de proveedores de credenciales por defecto de AWS.
'providers' => [
    'amazon-bedrock' => [
        'driver' => 'amazon-bedrock',
        'region' => env('AWS_DEFAULT_REGION', 'us-east-1'),
    ],
],
AWS_DEFAULT_REGION=us-east-1
La cadena de credenciales por defecto resuelve automáticamente desde variables de entorno, el archivo de credenciales compartido (~/.aws/credentials), roles de tareas de ECS, perfiles de instancia EC2, etc.

Claves de configuración opcionales

ClaveDescripciónValor por defecto
secretAWS secret access key (SigV4)
tokenAWS session token (SigV4)
timeoutTimeout de peticiones HTTP (segundos)30
max_tokensMax tokens por defecto por petición8096
models.text.defaultModelo de texto por defectoglobal.anthropic.claude-sonnet-4-6
models.text.cheapestModelo de texto más económicoglobal.anthropic.claude-haiku-4-5-20251001-v1:0
models.text.smartestModelo de texto de mayor rendimientoglobal.anthropic.claude-opus-4-7
models.embeddings.defaultModelo de embeddings por defectoamazon.titan-embed-text-v2:0
models.embeddings.dimensionsDimensiones de embeddings por defecto1024
models.image.defaultModelo de imagen por defectostability.stable-image-core-v1:1
models.audio.defaultMotor de audio (TTS) por defectogenerative
models.reranking.defaultModelo de reranking por defectocohere.rerank-v3-5:0

Generación de texto

Clase Agent

Crea una clase Agent con un comando Artisan.
php artisan make:agent BedrockAgent
<?php

namespace App\Ai\Agents;

use Laravel\Ai\Contracts\Agent;
use Laravel\Ai\Promptable;

class BedrockAgent implements Agent
{
    use Promptable;

    public function instructions(): string
    {
        return 'Eres un experto en desarrollo de software.';
    }
}
use App\Ai\Agents\BedrockAgent;

$response = (new BedrockAgent)->prompt('Cuéntame sobre Laravel.');

echo $response->text;

Anonymous Agent

Si quieres usarlo rápidamente sin crear una clase, utiliza el helper agent().
use function Laravel\Ai\agent;

$response = agent(
    instructions: 'Eres un experto en desarrollo de software.',
)->prompt('Cuéntame sobre Laravel.');

echo $response->text;

Streaming

use App\Ai\Agents\BedrockAgent;
use Illuminate\Support\Facades\Route;

Route::get('/stream', function () {
    return (new BedrockAgent)->stream('Cuéntame sobre Laravel.');
});
También puedes manejar los eventos manualmente.
use Laravel\Ai\Streaming\Events\TextDelta;

use function Laravel\Ai\agent;

$stream = agent(
    instructions: 'Eres un experto en desarrollo de software.',
)->stream('Cuéntame sobre Laravel.');

foreach ($stream as $event) {
    if ($event instanceof TextDelta) {
        echo $event->delta;
    }
}

Uso de herramientas (Function Calling)

Define las herramientas que se invocarán durante la generación.
use Illuminate\Contracts\JsonSchema\JsonSchema;
use Laravel\Ai\Contracts\Tool;
use Laravel\Ai\Tools\Request;

class GetWeather implements Tool
{
    public function description(): string
    {
        return 'Devuelve el tiempo actual de una ciudad.';
    }

    public function schema(JsonSchema $schema): array
    {
        return [
            'city' => $schema->string()->required()->description('Nombre de la ciudad'),
        ];
    }

    public function handle(Request $request): string
    {
        // Llama aquí a la API del tiempo
        return json_encode(['temperature' => 22, 'condition' => 'sunny']);
    }
}
Se usa desde el Agent.
use App\Ai\Tools\GetWeather;
use Laravel\Ai\Attributes\MaxSteps;
use Laravel\Ai\Contracts\Agent;
use Laravel\Ai\Contracts\HasTools;
use Laravel\Ai\Promptable;

#[MaxSteps(5)]
class WeatherAgent implements Agent, HasTools
{
    use Promptable;

    public function tools(): array
    {
        return [new GetWeather];
    }

    public function instructions(): string
    {
        return 'Eres un asistente meteorológico.';
    }
}

$response = (new WeatherAgent)->prompt('¿Qué tiempo hace en Tokio?');
echo $response->text;
También funciona con Anonymous Agent.
use function Laravel\Ai\agent;

$response = agent(
    instructions: 'Eres un asistente meteorológico.',
    tools: [new GetWeather],
    maxSteps: 5,
)->prompt('¿Qué tiempo hace en Tokio?');
Las llamadas a herramientas también funcionan en streaming. El SDK ejecuta las herramientas automáticamente y continúa la conversación hasta obtener la respuesta de texto final.

Adjuntar archivos

Con el parámetro attachments puedes adjuntar imágenes, documentos, audio y vídeo al prompt. La Converse API de Bedrock procesa los bloques adjuntos, aunque los formatos realmente utilizables dependen del modelo (por ejemplo, Anthropic Claude solo admite imágenes y documentos).
use Laravel\Ai\Files\Document;
use Laravel\Ai\Files\Image;

use function Laravel\Ai\agent;

// Adjuntar una imagen de una ruta local
$response = agent(
    instructions: 'Eres un asistente útil.',
)->prompt('Describe esta imagen.', attachments: [
    Image::fromPath('/path/to/photo.jpg'),
]);

// Adjuntar un documento desde una URL
$response = agent(
    instructions: 'Eres un asistente útil.',
)->prompt('Resume este documento.', attachments: [
    Document::fromUrl('https://example.com/report.pdf'),
]);

// Adjuntar desde una cadena (especificando el formato explícitamente)
$response = agent(
    instructions: 'Eres un asistente útil.',
)->prompt('Analiza este texto.', attachments: [
    Document::fromString($csvContent, 'text/csv')->as('data.csv'),
]);
Los tipos de adjunto compatibles son Image, Document y Audio dentro de Laravel\Ai\Files\*. El vídeo puede adjuntarse mediante Illuminate\Http\UploadedFile.
La subida de archivos al servidor (Document::fromPath()->put()) y la reutilización mediante ID (Document::fromId()) no son compatibles con Bedrock.

Historial de conversaciones

Para mantener una conversación de varios turnos, implementa la interfaz Conversational en la clase Agent. Los mensajes que devuelve messages() se incluirán automáticamente en cada prompt.
<?php

namespace App\Ai\Agents;

use App\Models\ChatHistory;
use Laravel\Ai\Contracts\Agent;
use Laravel\Ai\Contracts\Conversational;
use Laravel\Ai\Messages\Message;
use Laravel\Ai\Promptable;

class ChatAgent implements Agent, Conversational
{
    use Promptable;

    public function __construct(public int $userId) {}

    public function instructions(): string
    {
        return 'Eres un asistente útil.';
    }

    public function messages(): iterable
    {
        return ChatHistory::where('user_id', $this->userId)
            ->latest()
            ->limit(20)
            ->get()
            ->reverse()
            ->map(fn ($m) => new Message($m->role, $m->content))
            ->all();
    }
}
$response = (new ChatAgent(auth()->id()))->prompt('¿De qué estábamos hablando la última vez?');

Guardado automático con RemembersConversations

Si no quieres implementar messages() por tu cuenta, puedes utilizar el trait RemembersConversations para guardar automáticamente la conversación. Necesitas las tablas de base de datos del AI SDK, así que ejecuta antes php artisan vendor:publish --provider="Laravel\Ai\AiServiceProvider" && php artisan migrate.
<?php

namespace App\Ai\Agents;

use Laravel\Ai\Concerns\RemembersConversations;
use Laravel\Ai\Contracts\Agent;
use Laravel\Ai\Contracts\Conversational;
use Laravel\Ai\Promptable;

class ChatAgent implements Agent, Conversational
{
    use Promptable, RemembersConversations;

    public function instructions(): string
    {
        return 'Eres un asistente útil.';
    }
}
Inicia una nueva conversación.
$response = (new ChatAgent)->forUser($user)->prompt('¡Hola!');

$conversationId = $response->conversationId;
Continúa una conversación existente.
$response = (new ChatAgent)
    ->continue($conversationId, as: $user)
    ->prompt('Cuéntame más detalles.');
El driver de Bedrock incluye automáticamente el historial de conversaciones en las peticiones a la Converse API, por lo que puedes usar el contexto de conversaciones multiturno en todos los modelos compatibles.

Salida estructurada

Si implementas la interfaz HasStructuredOutput, obtendrás respuestas tipadas.
use Illuminate\Contracts\JsonSchema\JsonSchema;
use Laravel\Ai\Contracts\Agent;
use Laravel\Ai\Contracts\HasStructuredOutput;
use Laravel\Ai\Promptable;

class ExtractPerson implements Agent, HasStructuredOutput
{
    use Promptable;

    public function instructions(): string
    {
        return 'Extrae información de la persona del texto proporcionado.';
    }

    public function schema(JsonSchema $schema): array
    {
        return [
            'name' => $schema->string()->description('Nombre completo de la persona'),
            'age' => $schema->integer()->description('Edad'),
            'occupation' => $schema->string()->description('Ocupación'),
        ];
    }
}

$response = (new ExtractPerson)->prompt('John tiene 30 años y es ingeniero de software.');

echo $response['name'];       // "John"
echo $response['age'];        // 30
echo $response['occupation']; // "software engineer"
La salida estructurada también funciona con Anonymous Agent.
use function Laravel\Ai\agent;

$response = agent(
    instructions: 'Extrae información de la persona del texto proporcionado.',
    schema: fn (JsonSchema $schema) => [
        'name' => $schema->string()->description('Nombre completo de la persona'),
        'age' => $schema->integer()->description('Edad'),
    ],
)->prompt('Alice is 25 years old.');

echo $response['name']; // "Alice"
echo $response['age'];  // 25
Internamente se crea una herramienta sintética (output_structured_data) que obliga a devolver un valor que se ajuste al esquema. Este mecanismo es compatible con todos los modelos de Bedrock a través de la Converse API.

Converse API (todos los modelos)

Toda la generación de texto y el streaming se ejecutan a través de la Converse API de Bedrock. El acceso está unificado incluso para Anthropic Claude, y puedes utilizar los distintos modelos disponibles en Bedrock como Amazon Nova, Meta Llama, Mistral, Cohere o DeepSeek con la misma interfaz.
use function Laravel\Ai\agent;

// Anthropic Claude (vía Converse API)
$response = agent(
    instructions: 'Eres un experto en desarrollo de software.',
    model: 'global.anthropic.claude-sonnet-4-6',
)->prompt('Cuéntame sobre Laravel.');

// Amazon Nova
$response = agent(
    instructions: 'Eres un asistente útil.',
    model: 'amazon.nova-pro-v1:0',
)->prompt('Cuéntame sobre AWS.');

// Meta Llama
$response = agent(
    instructions: 'Eres un asistente útil.',
    model: 'meta.llama3-1-70b-instruct-v1:0',
)->prompt('Explica la computación cuántica.');

// Mistral
$response = agent(
    instructions: 'Eres un asistente útil.',
    model: 'mistral.mistral-large-2402-v1:0',
)->prompt('Escribe un haiku sobre programar.');

// Cohere Command R+
$response = agent(
    instructions: 'Eres un asistente útil.',
    model: 'cohere.command-r-plus-v1:0',
)->prompt('Resume este texto.');

// DeepSeek R1
$response = agent(
    instructions: 'Eres un asistente útil.',
    model: 'deepseek.r1-v1:0',
)->prompt('Resuelve este problema matemático.');
El streaming, el uso de herramientas, la salida estructurada y los adjuntos de archivos funcionan con los modelos que los admitan. Consulta el detalle en la lista de modelos compatibles de Bedrock.

Provider Options

Para pasar opciones específicas de Bedrock como anthropic_version, implementa HasProviderOptions.
<?php

namespace App\Ai\Agents;

use Laravel\Ai\Contracts\Agent;
use Laravel\Ai\Contracts\HasProviderOptions;
use Laravel\Ai\Enums\Lab;
use Laravel\Ai\Promptable;

class BedrockAgent implements Agent, HasProviderOptions
{
    use Promptable;

    public function instructions(): string
    {
        return 'Eres un experto en desarrollo de software.';
    }

    public function providerOptions(Lab|string $provider): array
    {
        return [
            'top_p' => 0.9,
        ];
    }
}
Provider Options admitidas:
OpciónDescripciónValor por defecto
top_kParámetro de sampling Top-K
top_pParámetro de sampling Top-P (nucleus)
additionalModelRequestFieldsParámetros adicionales por modelo de Converse API

Atributos de configuración del Agent

Puedes configurar las opciones de generación de texto mediante atributos de PHP.
use Laravel\Ai\Attributes\MaxTokens;
use Laravel\Ai\Attributes\Temperature;
use Laravel\Ai\Attributes\Timeout;
use Laravel\Ai\Contracts\Agent;
use Laravel\Ai\Promptable;

#[MaxTokens(4096)]
#[Temperature(0.7)]
#[Timeout(120)]
class BedrockAgent implements Agent
{
    use Promptable;

    // ...
}

Generación de imágenes

Genera imágenes con modelos de Stability AI (por defecto) o con Amazon Nova Canvas.
use Laravel\Ai\Image;
use Revolution\Amazon\Bedrock\Bedrock;

// Por defecto usa Stability AI Stable Image Core
$response = Image::of('un lindo robot steampunk')->generate(provider: Bedrock::KEY);

// Obtén la primera imagen
$image = $response->firstImage();

// Guarda en disco
$response->store('images', 's3');

// Genera una etiqueta HTML <img>
echo $response->toHtml('robot steampunk');
Modelos de Stability AI disponibles (todos requieren la región us-west-2):
// Stable Image Core — rápido y económico (por defecto)
$response = Image::of('paisaje')
    ->generate(provider: Bedrock::KEY, model: 'stability.stable-image-core-v1:1');

// Stable Diffusion 3.5 Large — alta calidad, generación en volumen
$response = Image::of('retrato')
    ->generate(provider: Bedrock::KEY, model: 'stability.sd3-5-large-v1:0');

// Stable Image Ultra — ultrarrealista, máxima calidad
$response = Image::of('producto de lujo')
    ->generate(provider: Bedrock::KEY, model: 'stability.stable-image-ultra-v1:1');
Los modelos de imagen de Stability AI solo están disponibles en us-west-2. Configura AWS_DEFAULT_REGION=us-west-2 cuando los uses.

Edición de imágenes con Stability AI

También puedes usar los modelos de edición de Stability AI Image Services mediante el método attachments(). Se pasa una imagen de entrada y el modelo de edición la transforma.
use Laravel\Ai\Files\Image as ImageFile;
use Laravel\Ai\Image;
use Revolution\Amazon\Bedrock\Bedrock;

$inputImage = ImageFile::fromPath('/path/to/photo.jpg');

// Inpaint — sustituye una zona con máscara o canal alfa
$response = Image::of('Sustituye el fondo por un bosque')
    ->attachments([$inputImage])
    ->generate(provider: Bedrock::KEY, model: 'stability.stable-image-inpaint-v1:0');

// Erase — elimina elementos no deseados
$response = Image::of('')
    ->attachments([$inputImage])
    ->generate(provider: Bedrock::KEY, model: 'stability.stable-image-erase-object-v1:0');

// Quita el fondo y recorta solo el sujeto
$response = Image::of('')
    ->attachments([$inputImage])
    ->generate(provider: Bedrock::KEY, model: 'stability.stable-image-remove-background-v1:0');

// Search and Replace — reemplaza el objeto indicado en el prompt
$response = Image::of('gato')
    ->attachments([$inputImage])
    ->generate(provider: Bedrock::KEY, model: 'stability.stable-image-search-replace-v1:0');

// Style Transfer — aplica el estilo indicado en el prompt
$response = Image::of('estilo pintura al óleo')
    ->attachments([$inputImage])
    ->generate(provider: Bedrock::KEY, model: 'stability.stable-style-transfer-v1:0');
Modelos de edición de Stability AI disponibles (todos en us-east-1, us-east-2 y us-west-2):
Model IDDescripción
stability.stable-image-inpaint-v1:0Inpaint — sustitución del área seleccionada
stability.stable-outpaint-v1:0Outpaint — amplía la imagen más allá de los bordes
stability.stable-image-erase-object-v1:0Erase — elimina objetos
stability.stable-image-remove-background-v1:0Elimina el fondo
stability.stable-image-search-replace-v1:0Search and Replace — sustitución de objetos
stability.stable-image-search-recolor-v1:0Search and Recolor — cambio de color de objetos
stability.stable-image-style-guide-v1:0Style Guide — aplica el estilo de una referencia
stability.stable-style-transfer-v1:0Style Transfer — transferencia de estilo
stability.stable-image-control-sketch-v1:0Control Sketch — genera a partir de un boceto
stability.stable-image-control-structure-v1:0Control Structure — genera siguiendo una estructura
stability.stable-creative-upscale-v1:0Creative Upscale — reescala rellenando detalles
stability.stable-conservative-upscale-v1:0Conservative Upscale — conserva los detalles
stability.stable-fast-upscale-v1:0Fast Upscale — reescalado ligero 4x
También se admite Amazon Nova Canvas, aunque AWS está avanzando en su desaprobación.
// Nova Canvas (obsoleto. Disponible en us-east-1, ap-northeast-1, eu-west-1)
$response = Image::of('atardecer')
    ->size('3:2')           // '1:1', '3:2', '2:3'
    ->quality('high')       // 'low', 'medium', 'high' (solo Nova Canvas)
    ->generate(provider: Bedrock::KEY, model: 'amazon.nova-canvas-v1:0');

Audio (TTS)

Genera audio a partir de texto usando Amazon Polly.
use Laravel\Ai\Audio;
use Revolution\Amazon\Bedrock\Bedrock;

$response = Audio::of('Me encanta programar con Laravel.')->generate(provider: Bedrock::KEY);

$rawContent = (string) $response;
Puedes indicar voz masculina o femenina.
$response = Audio::of('Me encanta programar con Laravel.')
    ->female()
    ->generate(provider: 'bedrock');

$response = Audio::of('Me encanta programar con Laravel.')
    ->male()
    ->generate(provider: Bedrock::KEY);
Especifica una voz de Polly concreta.
$response = Audio::of('Me encanta programar con Laravel.')
    ->voice('Joanna')
    ->generate(provider: Bedrock::KEY);
Guarda el audio generado.
$response = Audio::of('Me encanta programar con Laravel.')->generate(provider: Bedrock::KEY);

$path = $response->store();
$path = $response->storeAs('audio.mp3');
También puedes indicar el motor (modelo).
// generative (por defecto), neural, long-form, standard
$response = Audio::of('Me encanta programar con Laravel.')
    ->generate(provider: Bedrock::KEY, model: 'neural');
Voces por defecto: default-female → Ruth, default-male → Matthew (ambas compatibles con el motor generative).
Amazon Polly es un servicio de AWS distinto de Bedrock. La API key de Bedrock (bearer token) no es válida para Polly. Utiliza credenciales IAM de AWS (SigV4) o la cadena de credenciales por defecto de AWS.

Embeddings

Genera embeddings vectoriales con Amazon Titan Embeddings V2.
use Laravel\Ai\Embeddings;
use Revolution\Amazon\Bedrock\Bedrock;

$response = Embeddings::for(['Hello world', 'Foo bar'])->generate(provider: Bedrock::KEY);

// Primer vector de embedding
$vector = $response->first();

// Itera todos los embeddings
foreach ($response as $embedding) {
    // $embedding es un array de floats
}

echo $response->tokens; // Número total de tokens
Puedes indicar las dimensiones (Titan Embeddings V2 admite 256, 512 y 1024).
$response = Embeddings::for(['Hello world'])->dimensions(512)->generate(provider: Bedrock::KEY);
Ejemplo indicando un modelo personalizado.
$response = Embeddings::for(['Hello world'])
    ->dimensions(1024)
    ->generate(provider: Bedrock::KEY, model: 'amazon.titan-embed-text-v2:0');

Modelos Cohere Embed

Los modelos Cohere Embed se detectan automáticamente y utilizan la API de lote. Mientras que Titan envía una petición HTTP por cada entrada, Cohere agrupa todas las entradas en una única petición, por lo que resulta más eficiente cuando procesas varios textos.
// Cohere Embed English V3
$response = Embeddings::for(['Hello world', 'Foo bar'])
    ->dimensions(1024)
    ->generate(provider: Bedrock::KEY, model: 'cohere.embed-english-v3');

// Cohere Embed Multilingual V3
$response = Embeddings::for(['Hello', 'こんにちは'])
    ->dimensions(1024)
    ->generate(provider: Bedrock::KEY, model: 'cohere.embed-multilingual-v3');

// Cohere Embed V4 (permite configurar dimensiones de salida entre 256 y 1536)
$response = Embeddings::for(['Hello world'])
    ->dimensions(512)
    ->generate(provider: Bedrock::KEY, model: 'cohere.embed-v4');
Los modelos Cohere Embed no devuelven el número de tokens, por lo que $response->tokens siempre es 0.

Reranking

Reordena los documentos por relevancia respecto a la consulta usando Cohere Rerank 3.5 o Amazon Rerank 1.0.
use Laravel\Ai\Reranking;
use Revolution\Amazon\Bedrock\Bedrock;

$response = Reranking::of([
    'Laravel es un framework web de PHP.',
    'Python es un lenguaje de programación.',
    'Laravel ofrece una sintaxis elegante para el desarrollo web.',
])->rerank(query: '¿Qué es Laravel?', provider: Bedrock::KEY);

// Documento con mayor relevancia
echo $response->first()->document;
echo $response->first()->score;

// Obtén todos los resultados en orden
foreach ($response as $result) {
    echo "{$result->index}: {$result->document} ({$result->score})\n";
}

// Limita el número de resultados
$response = Reranking::of([...])
    ->limit(2)
    ->rerank(query: '¿Qué es Laravel?', provider: Bedrock::KEY);
Ejemplo indicando un modelo personalizado.
$response = Reranking::of([...])
    ->rerank(query: 'consulta de búsqueda', provider: Bedrock::KEY, model: 'amazon.rerank-v1:0');
La API de reranking utiliza el endpoint bedrock-agent-runtime (no bedrock-runtime). Amazon Rerank 1.0 no está disponible en us-east-1, así que en esa región usa Cohere Rerank 3.5.

Pruebas

Puedes usar directamente las funciones de testing estándar del AI SDK. Aunque no está documentado oficialmente, los Anonymous Agent creados con el helper agent() se pueden mockear con AnonymousAgent::fake(), y la versión de salida estructurada con StructuredAnonymousAgent::fake().
use Laravel\Ai\AnonymousAgent;
use Laravel\Ai\Prompts\AgentPrompt;

use function Laravel\Ai\agent;

it('can generate text', function () {
    AnonymousAgent::fake();

    $response = agent(
        instructions: 'Eres un experto en desarrollo de software.',
    )->prompt('Cuéntame sobre Laravel.');

    AnonymousAgent::assertPrompted(function (AgentPrompt $prompt) {
        return $prompt->contains('Laravel');
    });
});
Consulta la información más actualizada en el repositorio de GitHub.
Última modificación el 13 de julio de 2026