The Laravel AI SDK v1.1.0 is the first minor release since 1.0 and adds support for the Agent Skills standard. It also adds Cohere as a text provider and lets you require approval on the SDK's built-in tools. Failover between providers also no longer stops when the next provider does not support one of the agent's provider tools.
What's New
Agent Skills
The SDK now supports Agent Skills, the folder format that coding agents use to load instructions only when a task needs them. Pushpak Chhajed notes in the PR that the team turned down skills support twice before, but the format is now a standard that many tools use.
Each skill is a folder under resources/skills with a SKILL.md file. The frontmatter needs a description. The name is optional and defaults to the folder name:
resources/skills/└── refund-policy/ ├── SKILL.md └── references/EDGE-CASES.md
---name: refund-policydescription: Use when a customer asks for a refund or a partial credit.--- Check the order date first. Orders older than 30 days...
To give an agent its skills, implement the new HasSkills contract. The agent gets a single LoadSkill tool that lists each skill's name and description. The model calls the tool to read a skill's full instructions, and calls it again with a path to read one of the files bundled with that skill:
use Laravel\Ai\Contracts\Agent;use Laravel\Ai\Contracts\HasSkills;use Laravel\Ai\Promptable;use Laravel\Ai\Skills\Skill; class SupportAgent implements Agent, HasSkills{ use Promptable; public function instructions(): string { return 'You are a support agent.'; } public function skills(): iterable { return [ resource_path('skills'), base_path('.agents/skills'), new Skill( name: 'house-style', description: 'Use when you write copy for a customer.', instructions: view('skills.house-style', ['brand' => $this->brand]), ), fn () => $this->user->team->skills->map->toSkill(), ]; }}
A source can be a directory, a Skill object built in PHP, or a closure. The SDK runs the closure the first time the tool reads its skills, so you can load skills from the database for each user. Pointing at .agents/skills lets your app's agents use the same skills as your coding agent.
You can also add new LoadSkill([...]) to an agent's tools() directly. If an agent has both, the SDK merges the skills into the one tool and logs a warning, because providers reject duplicate tool names. The tool reads bundled files only from inside the skill's folder, and it rejects files larger than 256 KB and binary files.
Cohere Text Generation
Cohere was already available for embeddings and reranking. Mojtaba Sayari added text generation through Cohere's v2 Chat API, with support for streaming, tool calls, structured output, and reasoning:
$response = (new SupportAgent)->prompt('Hello', provider: 'cohere');
The default model is command-a-03-2025. Cohere cannot force a specific tool, so ToolChoice::tool('X') sends only tool X and marks a tool call as required. Document attachments and citations are not supported yet, but you can pass Cohere options such as documents and safety_mode through provider options.
PR: #1078
Approval for Built-In Tools
The MCP, agent, similarity search, and filesystem tools now implement the Approvable contract, so you can call requireApproval() on them. Before this release, you had to subclass a tool to gate it. This example requires approval for every GitHub MCP tool that is not marked read-only:
use Laravel\Ai\Tools\McpTool; $github->tools() ->mapInto(McpTool::class) ->map(fn (McpTool $tool) => ($tool->annotations()['readOnlyHint'] ?? false) ? $tool : $tool->requireApproval());
Approval is off by default, so existing agents behave the same. See our earlier post on human-in-the-loop tool approval for how approvals work.
PR: #1097
Failover Skips Unsupported Provider Tools
Before this release, a provider tool that the next provider did not support could end a failover run. For example, an agent with WebFetch and WebSearch on ['anthropic', 'openai'] failed when a rate-limited Anthropic request moved to OpenAI, because OpenAI threw on WebFetch:
RuntimeException: Provider [openai] does not support the [WebFetch] tool.
The text generation loop now removes the provider tools that the current provider does not support before each attempt, so the run continues with WebSearch only. On a provider without hosted tool search, the SDK unwraps ToolSearch and sends its tools as regular tools. More than one ToolSearch wrapper still throws on every provider.
PR: #1080
Self-Hosted Laya Classification
You can now run classification against a self-hosted Laya server with the existing typesafe driver. Add a connection with a local url:
'laya' => [ 'driver' => 'typesafe', 'key' => env('LAYA_API_KEY', ''), 'url' => env('LAYA_URL', 'http://localhost:8000/v1'), 'models' => ['classification' => ['default' => 'auto']],],
Classification::of($ticket)->questions($questions)->classify(provider: 'laya');
The response metadata reports the Laya checkpoint that answered the request. We covered Laya and a standalone PHP client in our LayaPHP post.
PR: #1081
More Provider Tools
ToolSearch now works on Azure OpenAI. On Groq, WebSearch maps to Groq's browser_search and CodeExecution maps to code_interpreter. Groq offers both on its GPT-OSS models only, and ignores the max(), allow(), and location() options on WebSearch. WebSearch also sends its location to OpenRouter now.
Other Changes
MoveFiletool: Agents can rename or move a file in one tool call instead of copying it and then deleting the original (#1092).- Default models: The fallback models are updated for most providers. For example, Anthropic now defaults to
claude-sonnet-5-5and Gemini togemini-3.8-flash. If you rely on the defaults instead of setting models inconfig/ai.php, your app will use the newer models after you upgrade (#1095). - Fixes: Stateless OpenAI file search replay (#1089), an edited
useChatuser message that the assistant reply replaced (#1076), and ElevenLabs query parameters that were sent in the wrong place (#1103). - Upgrade guide: The 1.0 upgrade guide now states that the Boost upgrade command needs
laravel/boost2.10.0 or later, and that the SDK conflicts withlaravel/mcpbelow 1.0 (#1087).
Upgrading
To upgrade an existing app, require the new version with Composer:
composer require laravel/ai:^1.1