News

Laravel AI SDK 1.1 Adds Agent Skills and Cohere Chat

Published
Laravel AI SDK 1.1 Adds Agent Skills and Cohere Chat image

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-policy
description: 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.

PRs: #1054, #1102

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.

PRs: #1098, #1099

Other Changes

  • MoveFile tool: 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-5 and Gemini to gemini-3.8-flash. If you rely on the defaults instead of setting models in config/ai.php, your app will use the newer models after you upgrade (#1095).
  • Fixes: Stateless OpenAI file search replay (#1089), an edited useChat user 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/boost 2.10.0 or later, and that the SDK conflicts with laravel/mcp below 1.0 (#1087).

Upgrading

To upgrade an existing app, require the new version with Composer:

composer require laravel/ai:^1.1

References

Yannick Lyn Fatt photo

Staff Writer at Laravel News and Full stack web developer.

Filed in

Sponsored

acquaintsoft logo
Acquaint Softtech

Hire Laravel developers with AI expertise at $20/hr. Get started in 48 hours.

Visit Acquaint Softtech

The latest

View all →
Route::query() and Model defaults() in Laravel 13.35 image

Route::query() and Model defaults() in Laravel 13.35

Read article
VMPal: Give Your AI Agent a Whole Computer image

VMPal: Give Your AI Agent a Whole Computer

Read article
Synapse: A Dev Dashboard for Laravel AI SDK Agents image

Synapse: A Dev Dashboard for Laravel AI SDK Agents

Read article
Decide with Jev: Three Questions in One Request with the Laravel AI SDK image

Decide with Jev: Three Questions in One Request with the Laravel AI SDK

Read article
Grant: Enum-Based Roles and Permissions for Laravel image

Grant: Enum-Based Roles and Permissions for Laravel

Read article
Securing Filament plugins with Plumb image

Securing Filament plugins with Plumb

Read article