# Edição de 24 de setembro de 2026

Data: 2026-09-24

Laravel AI 1.0.0 saiu oficialmente. O Laravel MCP recebeu a 1.0.1 com um ajuste no OAuth. No Framework, entraram correções em Collection::mode(), PhpRedisLock e Number::parseInt(). Filament corrigiu um caso de agrupamento com filtros, e o Vet ganhou minimum-release-age.

## Laravel AI

### Laravel AI v1.0.0 é publicado [Released]

Released em 23/09/2026. O 1.0 fecha o ciclo de mudanças que vinha sendo preparado na branch 1.x: persistência por steps/status, middleware por generation step, novo modelo de usage, Gemini Interactions API, classificação/Decisions, OpenRouter e novos defaults. Quem persiste conversas ou estendeu stores/providers deve tratar a atualização como migração, não como um simples composer update.

## O que mudou

O Laravel AI 1.0 concentra várias mudanças que já estavam sendo preparadas na branch 1.x.

- Conversas passam a ser persistidas por steps e status.
- Middleware passa a rodar em cada generation step.
- Usage troca prompt/completion por input/output.
- Gemini migra para a Interactions API.
- Bedrock deixa de instalar o AWS SDK automaticamente.
- Os defaults de modelos também foram atualizados.

## Antes de atualizar

Se o projeto publicou migrations do pacote, persiste conversas ou implementa `ConversationStore`, providers ou middleware próprios, leia o upgrade guide antes.

O diff `v0.11.2...v1.0.0` é a referência mais útil para revisar o que precisa mudar no código.

Link: https://github.com/laravel/ai/compare/v0.11.2...v1.0.0

Fonte: laravel/ai


## Laravel MCP

### Laravel MCP v1.0.1 corrige validação de loopback redirect URIs [Released]

Released em 24/09/2026. Redirect URIs de loopback agora são validadas pelo scheme e host parseados, não por prefixo textual. O registro também rejeita URLs com username ou password.

## O que mudou

A validação de redirect URI deixou de depender de comparação por prefixo.

Agora o MCP:

- compara scheme e host já parseados;
- rejeita URLs com username ou password.

Isso aproxima a validação da forma como o navegador interpreta a URL e fecha casos em que uma string malformada podia passar pela checagem anterior.

Link: https://github.com/laravel/mcp/pull/349

Fonte: laravel/mcp


## Laravel Framework

### Collection::mode() deixa de retornar valores incorretos quando há null [Merged]

Merged em 13.x. Collection::mode() podia devolver valores que não eram moda quando havia null na coleção. O cálculo agora respeita a frequência real dos dados.

## O problema

Com `null` na coleção, `Collection::mode()` podia incluir valores que não eram realmente a moda.

Exemplo:

```php
collect([42, null, 43, 42])->mode();
```

O resultado correto é apenas `42`.

A correção alinha o método ao comportamento esperado quando o conjunto tem valores nulos.

Link: https://github.com/laravel/framework/pull/61686

Fonte: laravel/framework


### PhpRedisLock::refresh() funciona com serializers do phpredis [Merged]

Merged em 13.x. O TTL de PhpRedisLock::refresh() passava pelo mesmo pack() do owner. Com alguns serializers, o Lua recebia um valor não numérico e não renovava o lock. Agora só o owner é empacotado.

## O problema

O TTL enviado ao script Lua de refresh passava pelo mesmo `pack()` usado no owner do lock.

Com serializers como PHP, igbinary ou msgpack, esse TTL podia chegar ao Lua em formato não numérico. `tonumber()` falhava e o lock não era renovado.

## A correção

O owner continua serializado, porque precisa bater com o valor salvo no Redis. O TTL segue como inteiro puro.

Na prática, `refresh()` volta a funcionar com serialização habilitada no phpredis.

Link: https://github.com/laravel/framework/pull/61690

Fonte: laravel/framework


### Number::parseInt() passa a usar inteiros de 64 bits [Merged]

Merged em 13.x. Number::parseInt() usava TYPE_INT32 e retornava false acima de 2.147.483.647. Agora usa TYPE_INT64, o que evita falhas com IDs, byte counts e valores em centavos maiores.

## O problema

`Number::parseInt()` pedia ao ICU um inteiro de 32 bits. Por isso, valores acima de 2.147.483.647 retornavam `false`, mesmo em ambientes PHP de 64 bits.

Agora o método usa `NumberFormatter::TYPE_INT64`.

Isso afeta casos comuns como IDs grandes, tamanhos em bytes e valores monetários armazenados em centavos.

Link: https://github.com/laravel/framework/pull/61691

Fonte: laravel/framework


## Filament

### Agrupamentos nulos de relacionamento passam a respeitar filtros existentes [Merged]

Merged. Ao selecionar um grupo de relacionamento null, a condição podia escapar dos filtros já aplicados e trazer registros que deveriam continuar fora da tabela. O agrupamento foi corrigido.

## O problema

Em tabelas agrupadas por relacionamento, selecionar o grupo `null` podia combinar `orWhereDoesntHave()` fora das constraints já ativas.

O resultado era simples: registros filtrados apareciam de novo.

## A correção

`whereHas()` e `orWhereDoesntHave()` passam a ficar no mesmo agrupamento lógico.

Filtros e grouping agora trabalham sobre o mesmo conjunto de registros.

Link: https://github.com/filamentphp/filament/pull/20563

Fonte: filamentphp/filament


## Laravel Vet

### Vet adiciona minimum-release-age para segurar releases muito recentes [Merged]

Merged. O Vet ganhou minimum-release-age para impedir que releases recém-publicadas entrem imediatamente no projeto. O valor fica no vet.json e aceita exceções por pacote.

## Nova opção

O Vet pode esperar alguns dias antes de aceitar uma release nova:

```bash
./vendor/bin/vet --init --minimum-release-age=7
```

O valor fica salvo no `vet.json`. Também dá para excluir pacotes com `minimum-release-age-exclude`, inclusive usando `*` no nome.

A ideia é simples: uma release comprometida costuma ser detectada e removida cedo. Esse intervalo cria uma margem antes de ela entrar no projeto.

Link: https://github.com/laravel/vet/commit/ca451786b4c85b4b3d0bf2bfa4ebc1bed70bbf68

Fonte: laravel/vet


## Fontes

- [Laravel AI v1.0.0 changelog](https://github.com/laravel/ai/compare/v0.11.2...v1.0.0)
- [Laravel MCP v1.0.1](https://github.com/laravel/mcp/pull/349)
- [Laravel Framework — Collection::mode()](https://github.com/laravel/framework/pull/61686)
- [Laravel Framework — PhpRedisLock::refresh()](https://github.com/laravel/framework/pull/61690)
- [Laravel Framework — Number::parseInt()](https://github.com/laravel/framework/pull/61691)
- [Filament — relationship null group filtering](https://github.com/filamentphp/filament/pull/20563)
- [Laravel Vet — minimum release age](https://github.com/laravel/vet/commit/ca451786b4c85b4b3d0bf2bfa4ebc1bed70bbf68)
