---
url: 'http://workflows-of-ai.com/blog/drupal-ai-1-5'
title: 'Drupal AI 1.5.0 is out'
author:
  name: 'Marcus Johansson'
  url: 'http://workflows-of-ai.com/about/marcus-johansson'
date: '2026-10-09T08:59:38+02:00'
updated: '2026-10-11T14:36:59+02:00'
type: article
summary: 'Drupal AI 1.5.0: ChatProcessor and ChatMemory, batch embeddings, streaming guardrails, an AI reranker, and the deprecations to act on before 1.6.0.'
tags:
  - 'Marcus Johansson'
  - 'Release notes'
  - 'Drupal AI'
image: 'http://workflows-of-ai.com/sites/default/files/previews/ee3d282ee5a30539.png'
files:
  - 'http://workflows-of-ai.com/sites/default/files/podcast/19702f327931ca77.mp3'
  - 'http://workflows-of-ai.com/sites/default/files/slides/b80f82e527f83964.mp4'
  - 'http://workflows-of-ai.com/sites/default/files/spoken/b3cd1efa39abd64e.mp3'
published: true
og:
  site_name: 'Workflows of AI'
  'image:width': '1200'
  'image:height': '630'
  'image:alt': 'Pixel-art developer opening a wooden crate labelled AI 1.5.0; a chat bubble, a shield with a check mark, a magnifying glass with an up arrow and a stack of cards with a lightning bolt fly out, while three small boxes with wings fly away.'
---
Release notes

# Drupal AI 1.5.0 is out

A ChatProcessor layer between chatbots and the backends that answer them, guardrails that work on a stream, a reranker for Search API and a smaller core. 51 issues, 52 contributors, 31 organizations.

  Marcus Johansson

October 9, 2026 · 11 min read

 [Drupal AI 1.5.0](https://www.drupal.org/project/ai/releases/1.5.0) came out on 25 September 2026. It is a minor release, so it is backwards compatible: update, run the database updates, and everything keeps working.

51 issues went into it, from 52 contributors and 31 organizations. And the module keeps growing: it has passed 20,000 installs, and it is growing faster than ever.

More and more of the work now goes into making the AI module a lean core engine, instead of a module filled with feature submodules, and that continues until 2.0.0 is out. The framework, developer and logging submodules will still be there. So in these release posts we will talk as much about what moves out as about what is added. In 1.5, five submodules became their own projects, and AI Search and AI CKEditor are on their way out: if you use either of them, read the warning further down before you update to 1.6.0.

## Watch the walkthrough (or scroll down to read)

[Watch on YouTube: A tour of the Drupal AI 1.5 release](https://www.youtube.com/watch?v=aqz-KE-bpKQ)

## Chat

### ChatProcessor: a layer between chatbot and backend

Until now the DeepChat chatbot talked straight to an AI Assistant. In 1.5 it talks to a **ChatProcessor** plugin instead: a middle layer between the chat window and whatever does the thinking. The plugin type was already in 1.4, but 1.5 is the first release where the chatbot uses it.

1.5 ships one processor, the AI Assistant API processor, so your existing assistants keep working. A post-update moves your chatbot blocks over, and old block configuration still works.

The interesting part is what can plug in next. The chat window does not need to know if the answer comes from an assistant, an agent, a workflow engine or your own service. Scroll through three chatbots with three different backends:

- Full screen admin assistant: "Make the title of the About page shorter" goes through ChatProcessor to Drupal CMS assistant (AI Assistants API), which answers "Done. The title is now "About us", and I updated the menu link as well.".
- Support center bot: "I want a refund for order #1042" goes through ChatProcessor to Refund workflow (FlowDrop), which answers "I checked the order, the return policy and the payment. Your refund of €49 is approved and will be back on your card in 3 to 5 days.".
- Bot with widgets: "Will it rain at the Vienna office tomorrow?" goes through ChatProcessor to Weather agent (AI Agents), which answers "Yes, light rain after lunch. Bring an umbrella." with a card: Vienna, tomorrow, 14°C, Light rain, Rain from 13:00 to 17:00, Hourly forecast, Next 7 days.

1. Full screen admin assistant → ChatProcessor → **Drupal CMS assistant** AI Assistants API

    Full screen admin assistant

    Make the title of the About page shorter

    Done. The title is now "About us", and I updated the menu link as well.
2. Support center bot → ChatProcessor → **Refund workflow** FlowDrop

     Support center bot

    I want a refund for order #1042

    I checked the order, the return policy and the payment. Your refund of €49 is approved and will be back on your card in 3 to 5 days.

     ?
3. Bot with widgets → ChatProcessor → **Weather agent** AI Agents

    Bot with widgets

    Will it rain at the Vienna office tomorrow?

    Yes, light rain after lunch. Bring an umbrella.

    Vienna, tomorrow

    14°C

    Light rain

    Rain from 13:00 to 17:00

    Hourly forecastNext 7 days

An illustration of what the layer allows. 1.5 ships the AI Assistant API processor; AI Agents and FlowDrop are examples of backends that can plug in.

### ChatMemory: chat history, stored one way

Chatbots used to forget. 1.5 adds a **ChatMemory** plugin type that normalizes how chat history is stored. The history lives on the server and survives a page reload, and every thread belongs to its user or session, so nobody sees someone else's conversation.

Two plugins ship:

- `private_tempstore` keeps one ongoing thread per user or session.
- `private_tempstore_pool` keeps several threads, so a new conversation can start fresh.

You pick the memory on the AI Assistant form. A post-update converts the old "allow history" setting for you, and the new `/api/deepchat/reset` endpoint resets a thread. Because it is a plugin type, keeping history in your own table or an external service means writing one plugin, and the developer docs have a guide for it.

ChatMemory follows the work in [Symfony AI](https://symfony.com/doc/current/ai/index.html), which the AI module will update to in AI 2.0.

## Batch embeddings

Embedding content for search used to mean one request per text. 1.5 adds `EmbeddingsCollectionInput` and `EmbeddingsCollectionOutput`, so you can send many texts in one call. Providers that cannot batch get a fallback, so the same code works everywhere.

For short texts, most of the time in an embeddings call is the round trip, not the model. So 30 texts sent as three batches of ten finish long before 30 single requests:

 30 texts embedded one request at a time take 9.00 s; the same texts in 3 batch requests of 10 take 1.35 s.

 30 requests, one per text 9.00 s

1. 1.2.0-alpha1 is out
2. AI 1.3.0 is released
3. AI Agent Debugger
4. AI Agents 1.1.0
5. AI module #1
6. AI Module #2
7. API First
8. Article text from Image
9. Auto-Tagging
10. Automagical Metatags
11. Automatic Podcast
12. Automatic video editor
13. Automize Fact Checking
14. Categorize Content
15. Chrome Browser as your AI
16. Compare News Sources
17. Consistent Tags
18. Content Create Agent
19. Contextualize using files
20. Create a meta review site
21. Custom Complex Fields
22. Deep Crawling
23. Dialogue from PDF
24. Mockingbird
25. FAQ
26. Find your images
27. Finetune Stable Diffusion
28. Foster Inclusive Language
29. Free Translation
30. Generate Newsletter Draft

 3 requests of 10 1.35 s

1. 1.2.0-alpha1 is out
2. AI 1.3.0 is released
3. AI Agent Debugger
4. AI Agents 1.1.0
5. AI module #1
6. AI Module #2
7. API First
8. Article text from Image
9. Auto-Tagging
10. Automagical Metatags
11. Automatic Podcast
12. Automatic video editor
13. Automize Fact Checking
14. Categorize Content
15. Chrome Browser as your AI
16. Compare News Sources
17. Consistent Tags
18. Content Create Agent
19. Contextualize using files
20. Create a meta review site
21. Custom Complex Fields
22. Deep Crawling
23. Dialogue from PDF
24. Mockingbird
25. FAQ
26. Find your images
27. Finetune Stable Diffusion
28. Foster Inclusive Language
29. Free Translation
30. Generate Newsletter Draft

An illustration with a 300 ms round trip per single request and 450 ms per batch of ten. Real numbers depend on the provider, the model and your network.

## Guardrails

### Sensitive Content Stream Filter

Guardrails could already check the input and the finished answer. Now they can also work on a response *while it streams*. The first streaming guardrail is the Sensitive Content Stream Filter: tell the model to wrap anything sensitive in `[SENSITIVE]` and `[/SENSITIVE]`, and the guardrail drops everything between the markers before it reaches the browser. The markers and the replacement text are configurable.

In this case a model writes a patient summary. The sensitive part never leaves the server, and the rest streams out as normal:

 The model streams: "Here is the summary you asked for. \[SENSITIVE\]Patient: Marcus Johansson. Diagnosis: chronic funny bone. Current medicine: Bitter Drops, three times a day.\[/SENSITIVE\] The next check-up is on Thursday at 10:00 at the main clinic. Please bring your insurance card and arrive ten minutes early.". The browser receives: "Here is the summary you asked for. \[Content removed.\] The next check-up is on Thursday at 10:00 at the main clinic. Please bring your insurance card and arrive ten minutes early."

What the model streams

Here is the summary you asked for. \[SENSITIVE\]Patient: Marcus Johansson. Diagnosis: chronic funny bone. Current medicine: Bitter Drops, three times a day.\[/SENSITIVE\] The next check-up is on Thursday at 10:00 at the main clinic. Please bring your insurance card and arrive ten minutes early.

What reaches the browser

Here is the summary you asked for. \[Content removed.\] The next check-up is on Thursday at 10:00 at the main clinic. Please bring your insurance card and arrive ten minutes early.

Made-up data. No funny bones were harmed.

### Moderation guardrail

The new Moderation guardrail sends user input to a provider's moderation endpoint, instead of asking an LLM to judge it with a classification prompt. That is cheaper and faster. You choose the provider and model per guardrail, and you can have it scan all user messages, not only the last one. If no provider is usable, it **fails closed**: it blocks, instead of letting everything through.

### Restrict to Topic: semantic mode

Restrict to Topic has a new *Semantic* matching mode. It hardens the prompt and fuzzy-matches the topic the model reports back to your configured list, with a similarity threshold (0.75 by default). So "bananas", "Banane" and "banana fruit" all count as "banana". Topics that do not match are recorded in the metadata, so you can see what people actually ask about.

## AI Automators

### Interactive refinement in Field Widget Actions

Automator buttons in Field Widget Actions used to be one shot: click, get a value, take it or leave it. Now a text automator can open a refine dialog. You look at the result, ask for a change ("shorter", "more formal"), and it tries again. The field's original automator prompt goes along with every refinement, so the result stays on track. When you are happy, you accept it.

1. Suggest a name: The Golden Fork Bistro
2. Make it sound Swedish: Den Gyllene Gaffeln
3. Shorter, one word: Gaffeln
4. Accepted: Gaffeln

Restaurant name

 Gaffeln ✦ Suggest a name

Refine the result

1. AI: **The Golden Fork Bistro**
2. You: Make it sound Swedish

    AI: **Den Gyllene Gaffeln**
3. You: Shorter, one word

    AI: **Gaffeln**

 Accept Refine

### Rich text image descriptions

Text automators can now see the images inside a formatted text field. When a body field has embedded images, the automator describes them with your default vision model and puts the descriptions into `{{ context }}`, next to the text. So a summary or a meta description can mention what is in the pictures, not only what is in the words. If you use content moderation, you can require a human review when the image analysis could not be completed.

## Search

### AI Reranker for Search API

Keyword search and vector search are good at finding candidates. They are less good at putting the best one first. The new **AI Reranker** processor for Search API takes the results your index found and re-orders them by how well they answer the query, with any rerank-capable provider. It works on any backend: the database, Solr or a vector database. You set the provider and model, how many results to rerank (Top N) and which fields to send.

In this case the answer is in the index, but the search only puts it at #8. Keep scrolling to turn the reranker on:

  ⌕ Why does my chatbot forget what I said? After the AI reranker

1. \#1  Keeping chat history between messages ChatMemory stores the thread, so the bot remembers what you said.  was #8
2. \#2  Your first chatbot in five minutes Install, configure a provider, place the block.  was #6
3. \#3  Chatbot block settings Place the chatbot block and choose who can see it.  was #1
4. \#4  Debugging chatbot errors Read the logs when the chatbot does not answer.  was #5
5. \#5  Chatbot API endpoints The DeepChat API and what each endpoint does.  was #7
6. \#6  Chatbot permissions Which roles can use the chatbot and its API.  was #4
7. \#7  What is a chatbot? An introduction to chatbots on a Drupal site.  was #2
8. \#8  Styling the chatbot Change the colours, the avatar and the greeting.  was #3
9. \#9  Translating the chatbot Use the chatbot on a multilingual site.
10. \#10  Chatbot accessibility Keyboard use and screen reader support.

An illustration with made-up documentation pages.

### Extractive question answering

A new operation type: extractive question answering. Instead of writing a new answer, the model points at the part of your text that answers the question, and returns that span, its position in the text and a score. That makes it easy to check, because the answer is always a quote. You can try it on its own page in the API Explorer.

## AI CKEditor uses the Prompt Library

The AI CKEditor actions Modify, Reformat, Spellfix, Summarize, Tone and Translate now get their prompts from the Prompt Library, as `ai_prompt` config entities. So you can change how "Summarize" behaves on your site without touching code. A post-update converts your existing editor configuration, and Tone and Translate got the language and tone improvements from the 2.0.x branch.

## A smaller AI module

### Submodules that moved out

AI Content Suggestions, AI Logging, AI Translate, AI Validations and Field Widget Actions are now their own projects. You do not need to do anything: the AI module's `composer.json` pulls them in, so `composer update drupal/ai` gets them, and `drush updb` does the rest.

Why move them? When the AI module first came out, it was a different era. We needed to make sure everyone understood what is possible with AI in Drupal, so a lot went into one module. That is not needed anymore. Some of these modules are not necessarily the number one solution for what they do, and as their own projects they can move at their own speed, while the AI module stays focused.

### Deprecated: AI Search and AI CKEditor

 !Act before you update to 1.6.0

AI Search and AI CKEditor are deprecated in 1.5.0 and **will be removed from the AI module in 1.6.0**. Both live on as standalone projects. If you use either of them, require the standalone project with Composer **before** you update the AI module to 1.6.0, or the feature stops working.

```bash
# AI Search
composer require 'drupal/ai_search:^1.3@alpha'

# AI CKEditor
composer require 'drupal/ai_ckeditor:^1.4'
```

The standalone AI CKEditor is a one-to-one copy of the submodule. The standalone AI Search is still an alpha. The change records have the details: [AI Search](https://www.drupal.org/node/3570322) and [AI CKEditor](https://www.drupal.org/node/3612175).

## For developers

### Observability

AI calls now follow the OpenTelemetry `gen_ai.*` semantic conventions: the operation, the provider, the model and the token usage are standard span attributes. Streaming spans are closed when the stream ends, so their timing is right, and sending the prompt and response payloads is now opt-in.

Because it is plain OpenTelemetry, the traces are not tied to one tool. Point the exporter somewhere else and the same spans show up there:

 Drupal AI sends spans with gen\_ai.operation.name: chat, gen\_ai.provider.name: openai, gen\_ai.request.model: gpt-4.1-mini, gen\_ai.usage.input\_tokens: 412, gen\_ai.usage.output\_tokens: 128 through OpenTelemetry (OTLP) to Datadog (LLM calls next to the rest of your APM traces.), Grafana (Traces in Tempo, with latency and token panels on your dashboards.), Honeycomb (Slice slow calls by model, operation and token count.).

Drupal AI

- gen\_ai.operation.name: chat
- gen\_ai.provider.name: openai
- gen\_ai.request.model: gpt-4.1-mini
- gen\_ai.usage.input\_tokens: 412
- gen\_ai.usage.output\_tokens: 128

 OpenTelemetry (OTLP)

1. Datadog

    LLM calls next to the rest of your APM traces.
2. Grafana

    Traces in Tempo, with latency and token panels on your dashboards.
3. Honeycomb

    Slice slow calls by model, operation and token count.

 DatadogGrafanaHoneycomb

Example attributes. Any backend that accepts OTLP works the same way.

### Token usage in the API Explorer

The chat generator in the API Explorer now shows the token usage of every call: input, output, reasoning and cached tokens. It also shows the provider's rate limits: how many requests you have left and when they reset.

### HTML to Markdown

The `ai.html_to_markdown_converter` service turns HTML into Markdown, which is handy when you send content to a model. It has a settings page at `/admin/config/ai/html-to-markdown`, and when the [Markdownify](https://www.drupal.org/project/markdownify) module is installed it uses Markdownify's converter and settings. The other direction, Markdown to HTML, goes through `CommonMarkConverterFactory`.

## Thank you

A huge thank you to everyone who worked on this release: 52 contributors from 31 organizations. The full list is on the [1.5.0 release page](https://www.drupal.org/project/ai/releases/1.5.0).

**Contributors:** breidert, robloach, joshua1234511, b\_sharpe, ahmad khader, marcus\_johansson, a.dmitriiev, manandearth, sgavilan, jorgik, ajv009, harivansh, abhisekmazumdar, adhariwal, jucs7, jessehs, kristen pol, akhil babu, ahmad-khalil-imagex, paulsheldrake, scott\_euser, abarrio, nikro, scott falconer, fago, lbesenyei, merilainen, gxleano, farse, csakiistvan, violaniko, annmarysruthy, prabha1997, ezeedub, fizcs3, cobadger, mandclu, kotekirkitadze, ajabhinavjha30, aivazashvilit, cadence96, d34dman, ultimike, ishani patel, shivamsen\_12579, rduterte, tbalog, loopduplicate, m4olivei, murz, tazo\_vekua and ro-no-lo.

**Organizations:** 1xINTERNET, Kalamuna, Axelerant, ImageX, Vardot, FreelyGive, OpenSense Labs, Dropsolid, DrupalFit, esinergia., Itty Bitty Byte, Salsa Digital, QED42, Soapbox, Acquia, drunomics, Brainsum, Mearra (formerly known as Wunder), Factorial.io, Integral Vision Ltd, Phase2, Conference Catalysts, Pare &amp; Co, Omedia, Pantheon, SeeD EM, Digitwings, DrupalEasy, Cambridge University Press &amp; Assessment, Lullabot and EPAM.

  Filed under [Release notes](/blog?category=3) [Drupal AI](/blog?category=2)

This content was produced by AI and edited by a person.

  How was AI used?AI takes my rambling notes, structures them and writes a first draft. I then prompt it to use interactive components, and at the end I read through it and rewrite it until it says what I want it to say.

   Marcus Johansson

Tinkers with AI and Drupal

 [About Marcus](/about/marcus-johansson)[Drupal.org profile](https://www.drupal.org/u/marcus_johansson)[Drupal AI](https://www.drupal.org/project/ai)

## Podcast: Drupal AI 1.5.0 is out

[Listen: Podcast episode (4:46)](/sites/default/files/podcast/19702f327931ca77.mp3)

Listen in your podcast app

- [Overcast (iPhone)](overcast://x-callback-url/add?url=http%3A%2F%2Fworkflows-of-ai.com%2Fpodcast.xml)
- [AntennaPod](https://antennapod.org/deeplink/subscribe?url=http%3A%2F%2Fworkflows-of-ai.com%2Fpodcast.xml&title=Workflows%20of%20AI%20Podcast)
-

Transcript

  AI disclosure This podcast episode is created and spoken by AI based on articles written on workflows-of-ai.com.

 Kwame Kwilson Welcome to the Workflows of AI podcast. Today it's Drupal AI one point five. Erin, the post calls it a smaller core with smarter chat. Do you believe the headline?

 Erin Milleu Mostly, yes. Though I'd say the smaller part is the bigger story, if that makes sense.

 Jane Olson It does. 5 submodules moved out into their own projects in this release. Content Suggestions, Logging, Translate, Validations and Field Widget Actions.

 Kwame Kwilson And people have to do something about that?

 Jane Olson Not for those five. The AI module's composer file pulls them in, so a normal update gets them. Run the database updates and you're done.

 Erin Milleu And it's deliberate. The plan is a lean core engine up to two point oh. The framework, developer and logging parts stay, the feature modules go.

 Jane Olson Which makes sense to me. When the module started, we had to show people what AI could even do in Drupal. That job's done.

 Erin Milleu Quite. And a feature that isn't the best at what it does shouldn't hold the core back.

 Kwame Kwilson Let's talk chat. The chatbot now goes through something called a ChatProcessor. But the release ships exactly one processor, for the AI Assistants API.

 Jane Olson One today. But that's the point of a layer. An agent, a FlowDrop workflow, your own service, they can all plug in behind the same chatbot.

 Erin Milleu Can. I'd push back a little there. The post shows a weather agent and a refund workflow, and it says clearly that's an illustration. What actually ships is one processor that keeps old assistants working.

 Jane Olson Sure, but you don't get the second processor without building the layer first.

 Erin Milleu Agreed in principle. I'd just rather we celebrate the plugins when they exist.

 Kwame Kwilson I'll leave that one open. ChatMemory came in too, so chatbots remember the conversation after a reload.

 Jane Olson And it follows Symfony AI, which the module moves to in two point oh.

 Kwame Kwilson Guardrails. The post's favourite demo is a stream filter. A patient summary streams out, and the sensitive part is replaced before it reaches the browser.

 Jane Olson Marcus Johansson, chronic funny bone, Bitter Drops three times a day. Gone. The rest of the summary keeps streaming.

 Erin Milleu I like it. It's the first guardrail that works on a stream instead of the finished answer. But it only removes what the model wraps in the markers. If the model forgets to tag something, nothing is removed.

 Jane Olson That's fair. You still need a good prompt. Speaking of hidden things, Erin, in all these episodes I've never seen your funny bone. I assume the guardrail removed it.

 Erin Milleu It's classified. You'd need a moderation endpoint to look at it.

 Kwame Kwilson Which is the other new guardrail. It sends input to the provider's moderation endpoint, and if no provider works, it fails closed. And the topic guardrail has a semantic mode with a similarity threshold of 0.75.

 Erin Milleu So bananas and Banane both count as banana. Good.

 Kwame Kwilson Search next.

 Jane Olson Two things. Batch embeddings first. The post races 30 texts. One request per text takes about 9 seconds. Three batches of ten take about 1.35 seconds.

 Erin Milleu With the caveat that those numbers are an illustration. 300 milliseconds per request is an assumption. Your provider and your network decide the real figure.

 Jane Olson True, the post says so. But the shape holds. For short texts most of the time is the round trip.

 Erin Milleu The shape I'll accept.

 Jane Olson And the reranker. The right answer was in the index, but keyword search put it at number 8. The reranker moves it to number 1, on any Search API backend.

 Kwame Kwilson Last topic, and it's the warning box. AI Search and AI CKEditor are deprecated, and they're removed in one point six.

 Erin Milleu This is the one people should act on. Require the standalone projects with Composer before you update, or the feature stops working.

 Jane Olson The CKEditor one is a straight copy, so that's painless.

 Erin Milleu Yes, but the standalone AI Search is still an alpha. I'd test that on a staging site first.

 Jane Olson Fair. Test it, then update.

 Kwame Kwilson That's the episode. The number I keep coming back to is 52 contributors from 31 organizations, on a module that has passed 20,000 installs. The full post, with the commands, is on Workflows of AI. Thanks for listening.

## Narrated slides: Drupal AI 1.5.0 is out

[Watch: Narrated slides (5:00)](/sites/default/files/slides/b80f82e527f83964.mp4)

 [Present the slides yourself](?presentation=true)

## The post in three sentences

Drupal AI 1.5.0 puts a ChatProcessor layer between the chatbot and whatever answers it, and adds ChatMemory, batch embeddings, a streaming guardrail and an AI reranker for Search API. Five submodules moved out to their own projects, and AI Search and AI CKEditor are deprecated: require their standalone projects before you update to 1.6.0. 51 issues from 52 contributors and 31 organizations.