- The Access module is now followed. Items and media that Access keeps from anonymous visitors (an access level of reserved, protected or forbidden, or an embargo) were indexed and used in answers and search like any public record, so text from restricted or embargoed material could reach visitors. While Access is installed and active, they are no longer indexed, chat and search drop any chunk of theirs they retrieve, and Remove Non-Public Chunks deletes them. A media counts its own status and its item's. Without Access, or with it switched off, nothing changes. After upgrading on an installation where Access is active, the settings page asks you to run Remove Non-Public Chunks once.
- Free content under an embargo with an end date is handled like a blog post scheduled for later: it is indexed in advance and appears in answers and search once the end date has passed, with nothing to do. Restricting or opening an item or media in its own form takes effect at the save, as making it private does. Changes Access makes without saving each item (a level on an item set, a batch edit of levels, its daily embargo task lifting a level) are hidden from chat at once when they restrict; content they open up is indexed on its next save, or with Re-index selected.
- Run Test Search on the Diagnostics tab now shows what visitors would get. It listed every match, including chunks of private, unpublished, scheduled or restricted resources that chat and search never use. Those are now left out and counted on a Hidden, not public line, with a hint to run Remove Non-Public Chunks when every match was hidden.
- Changing an item's sites or item sets now updates the chunks of its media (and its own, when it is not re-indexed anyway) at once, in place and without re-embedding, whether or not auto-indexing is on. Media chunks kept the old sites, item sets and link until they were re-indexed, so a media's text could still answer on a site the item had left, or miss a site or a block restricted to an item set the item had joined. Batch edits are handled item by item. Items assigned on a site's Resources page change without item saves and still need a re-index.
- The Item set filter now follows item saves. With auto-indexing off, an item taken out of every selected set kept its chunks, and its media's, until a full re-index: they are now removed at the save, whatever the setting. An item put into a selected set is queued with its public media when auto-indexing is on; before, only the item was, and its media waited for a full re-index. With auto-indexing off it waits for a re-index (Re-index selected), since indexing costs embeddings.
- Re-index Now no longer sends Turso a delete request for each resource it skips (restricted by the Access module, for example) after clearing that content type, since nothing of it is left to delete.
- Only editors and above can use the Chatbot admin pages, as the documentation says. Any signed-in user could open them by their address: a Reviewer, Author or Researcher could read and export the chat logs, change the settings, re-index (which costs OpenAI embeddings), remove or purge the index and run the test search. Omeka never checked these pages, because their route names the controller by an alias its permissions do not know, and the menu entry was only hidden. They now get Omeka's Forbidden page with HTTP status 403 (the test search a JSON 403). Editors, Supervisors and Global Administrators keep every page.
- The Re-index selected and Re-index all batch actions on the items browse page are offered only to editors and above.
Chatbot Omeka S module
Releases
1.5.4
Oct 20, 2026
1.5.3
Oct 20, 2026
- Private content no longer reaches visitors. The module indexed every item and media record its jobs could read, private ones included, so their text could appear in public chat answers and search results; blog posts on private sites only were indexed too. Now only public content is indexed: public items, public media of public items, public pages of public sites, and published posts assigned to a public site.
- Making an item, media record, page or site private, unpublishing a post, or deleting any of them now removes its chunks at once, even with Auto-index items on save off. A private item takes its media with it; a private site takes its pages and the posts it alone shows. Batch edits are handled item by item. A site made public again has its public pages and posts queued for indexing.
- Chat and search now also check every retrieved passage against the database, in one query per question, and drop any whose resource is not public now (including a post scheduled for a later date), so chunks stored before a change are never shown.
- New Remove Non-Public Chunks button on the Diagnostics tab. It deletes the chunks of everything private, unpublished or deleted without re-embedding anything, so it makes no OpenAI calls. After upgrading from an earlier version the settings page asks you to run it once, since earlier versions stored private content.
- Media added, removed or hidden in an item's own edit form, and the media of a deleted item, are now indexed or removed when the item is saved or deleted. These changes fire no media events, so new media stayed out of the index and removed media stayed in it. Each resource is queued at most once per save.
- Indexing no longer drops and recreates the Turso vector index after every
saved item, page or blog post (and at the end of every re-index). libSQL
updates the index as chunks are written, so the rebuild was never needed,
and at 3072 dimensions each one rewrote about 640 KB per chunk. A rebuild
that failed on Turso's side could leave the index without its graph table
(
chunks_vec_idx_shadow), after which every search failed with "vector index(search): failed to select start node for search" and every save failed to index while still paying OpenAI for its embeddings. - The settings page now checks the index and shows Index needs
rebuilding when it is damaged, or when its vectors are a different size
from the Embedding dimensions setting (the setting was changed after
indexing). Until the index is purged and re-indexed, chat, search, indexing
and the diagnostics test search stop before calling OpenAI, and
Re-index Now ends with an error before deleting anything. The
diagnostics output and the log (
index.problem) give the reason. - When chat or search fails (HTTP 503), visitors now see "The chat service
is temporarily unavailable" or "Search is temporarily unavailable"
instead of the underlying Turso or OpenAI error. The detail is still
written to the Chatbot log (
chat.error,search.error). - The settings tabs show their section headings again (OpenAI, Turso Vector Store, Chunking & Retrieval, Re-index, Test Search, Log Purge and the rest). They were legends that Omeka's admin theme hides.
- The Auto-index items on save description now says site pages are indexed too.
- Two Chatbot blocks on one page no longer share element ids, so each block's labels select its own fields.
- View Logs gives the message column most of the width, and an expanded Context is indented and wrapped instead of one long line in a narrow scroll box.
- Removed an unused block settings form class, and declared optional factory arguments explicitly nullable for PHP 8.4.
- Re-index Now re-indexes media too: the Diagnostics tab has a new Media checkbox, ticked by default like the other content types. Media were never part of a bulk re-index, only indexed when a media record was saved on its own, so after a purge the index held no media, and media added in an item's own form were never indexed. Media are found through their items, and Re-index selected and Re-index all on the Items browse page now re-index the items' media as well.
- The Item set filter now applies to media: a media record whose item is in none of the selected sets is skipped and its chunks are removed, as for the item. Media of every item used to be indexed.
- Log times now show their time zone. They are stored in UTC, like Omeka's
own timestamps, but the log viewer, dashboard, diagnostics output, the
settings page's "last indexed" and the CSV export showed them without a
zone, so they looked hours off on an installation in another time zone.
They are now shown in the installation's time zone (Settings > Time
zone) with its abbreviation, such as
2026-10-20 08:36:44 MDT; the daily chart counts that zone's days; and the CSV'screated_atis in that zone, with a newtime_zonecolumn. Times are always written and compared in UTC from PHP's clock, never MySQL'sNOW(). Existing log entries were already UTC and need no conversion.
1.5.2
Oct 11, 2026
1.5.2 (2026-10-11)
- The Chatbot entry in the admin menu showed its text in a serif
fallback font: the link carried Font Awesome's
faclass, which sets the whole link in the icon font. It now carries only the icon class, like the other menu entries.
1.5.1 (2026-10-11)
Security fix for the chat API.
POST /chatbot/api/chatno longer accepts a system prompt from the browser. Any visitor could send their ownsystem_promptand use the site's OpenAI key for unrelated tasks or off-brand answers. The prompt is now chosen on the server: a Chatbot block's System prompt override, or the module's default prompt. Asystem_promptfield in the request is ignored.- A Chatbot block's chat panel now sends only the block's id. The server reads that block's prompt, item sets and site, so the prompt is no longer printed in the public page, and the browser cannot change the item set restriction.
- Allow anonymous users is now also enforced by the chat API: a block that requires a login refuses visitors who are not logged in (403), and a block on a page the visitor may not see is refused as if it did not exist. Requests that name no block are the floating widget's and are accepted only while the widget is enabled, so leaving out the block id no longer gets around a login-only block.
- Custom code that calls the chat API must send
block_id(the page block's id), or rely on the floating widget being enabled.
1.5.0
Sep 22, 2026
- Restrict to item sets on the Chatbot and Semantic Search blocks is now
applied. Item and media chunks record the parent item's item set ids in
their metadata, and the chat and search endpoints keep only chunks in at
least one of the requested sets, over-fetching from Turso to compensate.
Blog posts and site pages have no item sets and are excluded while a
restriction is set. Chunks indexed before this version carry no item set
ids, so run Re-index Now after upgrading if you use the option. The
search endpoint now reads
item_set_ids, andchat.completeandsemantic_searchlog entries record it. - Allow anonymous users on the Chatbot block is now enforced: when it is unchecked, visitors who are not logged in see a login link in place of the chat panel. The option defaults to checked for new blocks, and the upgrade ticks it on every existing Chatbot block, since it was never enforced before and those panels were effectively public. The chat API itself is unchanged and stays public.
- Run Test Search on the Diagnostics tab now works for editors and site
admins; the
diagnosticsaction was missing from the module's ACL rules, so only global admins could use it. - Fixed the module's unit tests, which no longer matched the indexing code and the HTML-escaped answer output.
1.4.0
No release notes.
1.3.1
No release notes.
1.3.0
No release notes.
1.2.1
No release notes.
1.2.0
No release notes.
1.0.7
No release notes.
1.0.6
No release notes.
1.0.5
No release notes.
1.0.4
No release notes.
1.0.3
No release notes.
1.0.2
No release notes.
1.0.1
No release notes.
1.0.0
No release notes.