# Sample post: "Drupal AI 1.5: guardrails that watch the stream, and search that reranks itself"

Seed content for the first Canvas post. Each `##` block below is one component placed in the
Canvas tree, top to bottom. Facts come from the drupal/ai 1.5.0 release page
(https://www.drupal.org/project/ai/releases/1.5.0) and were checked against the module code in
`web/modules/contrib/ai`. Anything invented for the demo is marked **[placeholder]**.

**Page fields**

| Field | Value |
|---|---|
| Title | Drupal AI 1.5: guardrails that watch the stream, and search that reranks itself |
| Path | `/blog/drupal-ai-1-5` |
| Page kind | post |
| Categories | Drupal AI, Release notes |
| Authors | Marcus **[placeholder author profile]** |
| Description | What's new in the AI module 1.5.0: reranking, extractive Q&A, two new guardrails, chat memory, and what got deprecated. |
| Reading time | computed on save (about 6 min) |

---

## editorial/article-header

- category: `Release notes`
- title: `Drupal AI 1.5: guardrails that watch the stream, and search that reranks itself`
- subtitle: `51 issues, 52 contributors, 31 organizations, and a release that makes AI on Drupal safer to ship.`
- byline: Marcus · 9 October 2026 · reading time

## chapter-marker — "The short version"

## editorial/rich-text

AI 1.5.0 landed on 25 September 2026. It is a minor release, so nothing you rely on
should break, but it adds two new operation types, two new guardrails, a Search API
reranker, and a proper home for chatbot memory. It also starts tidying up: AI Search
and AI CKEditor are now deprecated.

If you only read one section, read **Guardrails** (the one that changes what you can
safely put in front of users) and **Deprecations** (the one that changes your next upgrade).

## layout/split-view (70-30)

- **start pane: video/video-player-youtube**
  - video_id: `aqz-KE-bpKQ` **[placeholder: swap for the real release walkthrough]**
  - width: contained · autoplay: off · muted: off
  - sync_id: `ai-15`
- **end pane: video/video-chapters (text)**, sync_id `ai-15`

  ```
  0:00 Why 1.5 matters
  1:10 Reranking search results
  3:05 Extractive question answering
  4:40 Guardrails on streams
  6:20 Chat memory
  7:30 What's deprecated
  ```

## video/video-transcript (text), sync_id `ai-15` **[placeholder transcript]**

```
0:00 Hi, this is a quick tour of the AI module 1.5 release.
0:12 There are fifty-one issues in this one, so let's focus on the ones you will actually feel.
1:10 First: search. There's a new AI Reranker processor for Search API.
1:24 Your normal search still finds the candidates. The reranker then re-orders them by meaning.
3:05 Next, a new operation type: extractive question answering.
3:18 Instead of generating an answer, it points at the span of your text that answers the question.
4:40 Guardrails can now look at a response while it streams, not only after it finishes.
6:20 Chatbots get a ChatMemory plugin type, so history can live somewhere you choose.
7:30 Finally, AI Search and AI CKEditor are deprecated. Plan your migration now.
```

## chapter-marker — "Search that reranks itself"

## editorial/rich-text

Keyword and vector search are good at finding *candidates*. They're less good at putting the
best one first. 1.5 adds an **AI Reranker** processor to Search API (`ai_reranker`): your index
still does the retrieval, then a reranking model re-orders the results by how well they answer
the query.

Two details worth knowing from the settings form: the "top N" value controls how many results the
model ranks, but it never truncates your result set or changes the pager count. Set it to 0
to rank everything on the page. And a fix in this release means you can now save the processors
form with the reranker disabled and no model picked.

There's a matching `rerank` operation type if you want it outside Search API:

## ai/code-block-ai (language: php)

```php
use Drupal\ai\OperationType\Rerank\ReRankInput;

$manager = \Drupal::service('ai.provider');
$default = $manager->getDefaultProviderForOperationType('rerank');
$provider = $manager->createInstance($default['provider_id']);

$input = new ReRankInput(
  'How do I limit what an AI agent can see?',
  $candidate_texts,
  5,
);
$ranked = $provider->rerank($input, $default['model_id'])->getNormalized();
```

## editorial/rich-text

Indexing got faster too: embeddings are now sent in **batches**, so reindexing a large vector
index is no longer one request per chunk.

## chapter-marker — "Answers you can point at"

## editorial/rich-text

The other new operation type is **extractive question answering**
(`extractive_question_answering`). A generative model writes a new answer. An extractive model
returns a *span of your own text*, with a score and start/end offsets. That makes it the right
tool when "the answer must be quotable from our docs" is a requirement, not a preference.

## ai/code-block-ai (language: php)

```php
use Drupal\ai\OperationType\ExtractiveQuestionAnswering\ExtractiveQuestionAnsweringInput;

$input = new ExtractiveQuestionAnsweringInput(
  'When was AI 1.5.0 released?',
  $release_notes_text,
);
$output = $provider->extractiveQuestionAnswering($input, $model_id);

foreach ($output->getNormalized() as $item) {
  printf("%s (%s)\n", $item->getAnswer(), $item->getScorePercentage());
}
```

## editorial/pull-quote

- quote: `Generative answers sound right. Extractive answers can be checked.`

## chapter-marker — "Guardrails that watch the stream"

## editorial/rich-text

Guardrails are where 1.5 matters most if you put AI in front of real users.

- **Moderation guardrail** (`moderation`): pick any moderation-capable provider and model, and
  use it as a guardrail. No more hand-wiring a moderation call before every chat.
- **Sensitive Content Stream Filter** (`sensitive_content_stream`): a *streamable* guardrail.
  It buffers and checks a response **while it streams**, so you don't have to choose between
  streaming UX and safety.
- **Input length limit** now scans user messages consistently.
- **Rename to note:** the "RegExp guardrail" is now just **"RegEx"**. Update any docs or
  screenshots that refer to it by the old name.

## chapter-marker — "Chatbots that remember"

## editorial/rich-text

The DeepChat chatbot block now runs on the **ChatProcessor** plugin system, and chat history
gets a real interface: **ChatMemory**. A memory plugin creates threads and loads, saves,
appends and clears messages, so where history lives (session, database, something external)
becomes a plugin choice instead of a fork. If you configured a DeepChat block before 1.5,
upgrade to 1.5.0 itself: an early 1.5.x regression that broke old block configuration is fixed
in this release.

Field Widget Actions also gets **interactive refinement**: you can now go back and forth on
a suggestion instead of accepting or rejecting it in one shot. The Suggest Tags automator
works with Tagify.

## chapter-marker — "Deprecations and upgrade notes"

## editorial/rich-text

- **AI Search** is deprecated. **AI CKEditor** is deprecated.
- Submodules that were down to skeleton code are now hidden.
- Automators process **one queue item per cron run**. If you relied on bulk cron
  processing, check your throughput.
- `SetupVdbServer` / `SetupVdbIndex` config actions are now idempotent, so recipes that set
  up a vector database can be re-applied.
- AI Logging is now pinned to a stable release (no more `@alpha`).

Upgrade with:

## ai/code-block-ai (language: bash)

```bash
composer require 'drupal/ai:^1.5'
drush updatedb -y && drush cache:rebuild
```

## editorial/newsletter-inline

- title: `Get the next release write-up in your inbox`
- placeholder: `you@example.com`

---

Rendered by the theme after the tree: one `editorial/author-bio` per referenced author.
The fixed table of contents collects the six chapter markers above.
