The Daily Commit · Edición de sección Portada PHP AI Dev EN DE FR ES

The Php Times

Lecturas — Ecosistema

Laravel AI 0.11.0 difiere las definiciones de herramientas con ToolSearch


Laravel AI v0.11.0 incorpora ToolSearch, un wrapper que difiere las definiciones de herramientas hasta que el proveedor las carga.

LARAVEL NEWS, 26 de agosto de 2026 seleccionado por Sönke

La función se apoya en la búsqueda de herramientas alojada de OpenAI y Anthropic y ahorra tokens en agentes con catálogos grandes. Los demás proveedores lanzan una excepción.

Laravel AI v0.11.0 añade ToolSearch, una contribución de behzadsp en el pull request #697. Hasta ahora, cada definición de herramienta que un agente exponía se enviaba al proveedor en cada petición, un coste fijo que se vuelve pesado con decenas de herramientas y reduce la precisión del modelo al elegir herramientas. El wrapper se apoya en la búsqueda de herramientas alojada que OpenAI y Anthropic ya ofrecen: el proveedor recibe una entrada de búsqueda más las definiciones diferidas, y solo carga la definición completa de una herramienta cuando decide usarla.

app/Ai/SupportAgent.php
use Laravel\Ai\Providers\Tools\ToolSearch;

public function tools(): iterable
{
    return [
        new LookupAccount,
        new ToolSearch(tools: [
            new IssueRefund,
            new ChangePlan,
            new ResendInvoice,
            new TransferSeat,
        ]),
    ];
}

ToolSearch recibe las herramientas a diferir como primer argumento del constructor. Todo lo que queda fuera del wrapper se envía como antes, y las clases de herramientas no necesitan cambios: ni interfaz ni opción por herramienta. La misma clase puede diferirse en un agente y enviarse directamente en otro. Un segundo argumento elige la estrategia de búsqueda de Anthropic, regex (por defecto) o bm25, validada en la construcción con una InvalidArgumentException para cualquier otro valor. Campos adicionales del proveedor como cache_control pasan por withProviderOptions(); en Anthropic el wrapper es el único lugar para un punto de corte de caché, porque su API rechaza herramientas con defer_loading: true y cache_control a la vez.

En OpenAI el wrapper se convierte en una entrada {"type": "tool_search"}; en Anthropic, en un tipo versionado como tool_search_tool_regex_20251119. Las herramientas diferidas siguen como definiciones ordinarias marcadas con defer_loading: true. Cuando el modelo llama a una herramienta diferida, la pasarela la resuelve por nombre desde dentro del wrapper, por lo que la ejecución es idéntica a la de una herramienta de primer nivel. Anthropic informa la búsqueda con bloques server_tool_use y tool_search_tool_result (a los que no se debe responder con un tool_result), OpenAI con ítems tool_search_call y tool_search_output; el SDK solo cubre el lado de la petición y no analiza ninguna de las dos formas.

Solo OpenAiProvider y AnthropicProvider implementan el marcador SupportsToolSearch. Todos los demás proveedores, incluidos Azure, Groq, DeepSeek, Mistral, OpenRouter, Gemini, xAI, Bedrock y Ollama, lanzan una LogicException antes de que salga cualquier petición. Se aplican tres reglas más: la comprobación de soporte se ejecuta incluso con un wrapper vacío, solo se permite un ToolSearch por petición, y en OpenAI el paquete rechaza ToolSearch combinado con store=false, porque la búsqueda alojada requiere respuestas almacenadas. Un wrapper vacío en un proveedor compatible no emite nada.

ToolSearch::budget() expande cada wrapper a su número de herramientas diferidas al derivar el presupuesto maxSteps por defecto, de modo que envolver veinte herramientas no reduce el presupuesto de pasos. Las herramientas diferidas nunca añaden pasos propios, porque el proveedor las carga dentro de su propia llamada. Para probarlo basta simular la llamada HTTP y verificar que las definiciones diferidas llevan defer_loading: true; los nombres los resuelve ToolNameResolver a partir del nombre corto de la clase, salvo que esta defina un método name().

El consejo del artículo: diferir solo merece la pena con catálogos grandes. Cuatro herramientas no lo justifican, ya que el modelo debe buscar antes de llamar. Las cadenas de failover lanzan una excepción al llegar a un proveedor no compatible, y las aplicaciones que usan store=false no pueden emplear la búsqueda alojada de OpenAI. Un enfoque de clasificación en el cliente, válido para todos los proveedores, se propuso en el PR #805 pero se cerró sin fusionar. ToolSearch se publicó en la v0.11.0 junto a los eventos de ciclo de vida de ejecuciones, un failover más amplio y la reproducción stateless de salidas para OpenAI.

Leer la fuente original (en inglés) ↗

Valora este artículo: 0

Tribuna de lectores

Aún no hay aportaciones — abre el debate.

← Ecosistema — Page B1

"All the Code That's Fit to Ship" · The Daily Commit · Edición de pantalla · Información legal · Política de privacidad