Release v0.19
v0.19 Release: Pictures, Math and Lists That Scale
October 9, 2026 · The Smarter Project
v0.16 through v0.18 added new kinds of infrastructure: self-hosted models, proxies, budgets and vector databases. v0.19 is about what people see. Chatbots can now show real images, write equations and draw diagrams. The web console’s resource lists can finally reach past their first 25 rows.
| Feature | What it does |
|---|---|
| ImageSearchPlugin (experimental) | A new plugin kind that finds real, working image urls with the Brave Image Search API, so the LLM can show them. |
| Thesaurus plugin selection | A prompt that asks for a “picture” now selects a plugin whose search term is “image”. |
| Math and diagrams in chat | Smarter Chat typesets LaTeX with KaTeX and draws Mermaid diagrams, and the LLMs are told they can use both. |
| Log streaming by chat mode | Sandbox mode streams DEBUG logs. Production mode streams the platform’s normal log level. |
| Paging, search and sorting | Every resource list in the web console pages, searches and sorts on the server, across all of your resources. |
| Infrastructure inventory | Smarter discovers the cluster it runs on, and records its nodes, volumes, load balancers and certificates. |
Real images in chat answers: ImageSearchPlugin
Earlier releases told the LLM to embed images with Markdown, but gave it nowhere to find them. The only image urls it had were ones that happened to appear in pages its other tools had read. Asked for a picture of anything else, it showed nothing, or made up a url that didn’t work.
ImageSearchPlugin is a new plugin kind that fixes this. Its tool takes a search query and returns a list of https image urls from the Brave Image Search API. The LLM then shows the best one in its answer.
apiVersion: smarter.sh/v1
kind: ImageSearchPlugin
metadata:
name: safe_image_search
pluginClass: imagesearch
description: Finds kid-friendly, freely licensed images from Wikimedia Commons. Use it to illustrate answers for children.
version: 0.1.0
spec:
selector:
directive: search_terms
searchTerms:
- kid-friendly
- children
- educational
prompt:
provider: openai
systemRole: >
You are a friendly assistant for children. When a picture would help to
explain your answer, search for images, and include one or two of them in
your answer as Markdown images.
model: gpt-6-luna
imageSearchData:
apiKey: brave_search_api_key
searchParams:
count: 5
safesearch: strict
filters:
minWidth: 400
allowedDomains:
- wikimedia.org
validateUrls: true
timeout: 10
smarter apply -f safe-image-search.yaml
- Only images that load: the plugin returns original images, never Brave’s thumbnails. With
validateUrls, which is on by default, each url must answer with HTTP 200 and an image content type before the LLM sees it. - Filters: file type, minimum width and height, and allowed or blocked domains. The general-purpose example blocks stock photo sites, whose images are watermarked previews.
- The LLM can tune a search: with
llmSearchParams: true, the LLM can set the country, language, safe search and spell check for a single call. Invalid values fall back to the manifest’s defaults. - Cached: results are cached, keyed by the search parameters, so a repeated search doesn’t cost another API call.
- Five sample plugins:
image_search(general purpose),safe_image_search(kid-friendly, Wikimedia Commons only),bw_image_search(black and white photographs),diagram_image_searchandsvg_image_search. - Added to the example LLMClients:
image_searchis now part of eight example LLMClients (theopenaiexample gets all five), including the weather LLMClient, which shows an image that matches the forecast. Their system prompts still forbid invented urls.
Security
- The checks on each url only reach public hosts, never private or internal addresses.
- The Brave API key is stored as a Smarter Secret,
brave_search_api_key, and is never returned by the API. - A failed search never fails the chat. If the key is missing or Brave returns an error, the tool returns an empty list, and Smarter logs a warning that explains how to fix it.
ImageSearchPlugin is experimental. It needs a Brave Search plan that includes image search. Without a key, the plugins return empty lists.
Plugins that understand synonyms
Smarter selects a plugin when the prompt contains one of the plugin’s search terms, either exactly or with a typo. That missed the obvious cases. A prompt that asked for a “picture” never selected a plugin whose search term was “image”.
v0.19 adds a third step to plugin selection that uses the WordNet thesaurus. It runs only when the exact and typo-tolerant matches find nothing, so the cheaper and more precise matches still come first.
Synonyms that are too loose would select the wrong plugins, so the matching is deliberately conservative:
- Common meanings only: synonyms come from a word’s two most common senses. Rare senses would, for example, make “car” match “elevator”.
- Nouns stay nouns: a search term that is a noun only matches the synonyms of its noun senses, so “image” doesn’t match “let me see the code”.
- Short words match exactly: search term words shorter than three letters are never matched by synonym.
- You can see why: the logs record whether each plugin was selected by an exact, fuzzy or thesaurus match, and which text matched.
Thesaurus matching is on by default. Turn it off with the waffle switch enable_plugin_thesaurus_matching.
Math and diagrams in chat
Smarter Chat now typesets LaTeX math with KaTeX and draws mermaid code blocks as Mermaid diagrams. Until this release, the platform didn’t know that: the default system prompt told every LLM that the chat window couldn’t render LaTeX or Mermaid.
Now the default prompt tells the LLM how to use both. It writes inline math as ( ... ), and displayed equations as [ ... ] or $$ ... $$. A single dollar sign is never math, so prices aren’t typeset by mistake. It draws a Mermaid diagram when a diagram helps, and quotes labels that contain punctuation. HTML is still not rendered.
To show what this looks like, v0.19 adds a new example LLMClient, Euclid the Math Tutor:
apiVersion: smarter.sh/v1
kind: LLMClient
metadata:
name: math
description: >
A math tutor that showcases how Smarter Chat displays mathematics: equations typeset from
LaTeX, Mermaid diagrams and function plots, and images from the image search plugins.
version: 0.1.0
spec:
config:
appName: Euclid the Math Tutor
appExamplePrompts:
- Derive the quadratic formula, step by step.
- Draw a flowchart of the Euclidean algorithm, then use it to find gcd(1071, 462).
- Plot y = x² - 2x - 3 from x = -2 to x = 4, and find its roots and vertex.
defaultModel: gpt-6-luna
provider: openai
functions:
- calculator
plugins:
- image_search
- diagram_image_search
guardrails:
- moderation_input
- self_harm_input
- moderation_output
Euclid writes every equation in LaTeX, draws flowcharts for algorithms and line charts for functions, uses the calculator function for arithmetic instead of working it out in its head, and finds portraits of mathematicians and pictures of famous figures such as the Möbius strip.
Mermaid runs at its strict security level, and the diagrams it draws are sanitized again before they are shown. If you embed Smarter Chat in your own page, import katex/dist/katex.min.css. The Smarter Chat docs describe this and the import map that the UMD bundle needs for Mermaid.
Clearer tool calls and server logs
- Tool names you recognize: the chat’s progress messages used to name plugin tool calls by their internal function name, such as
smarter_plugin_0000000016. They now show the plugin’s name, or the MCP tool’s name. Progress events gain afunctionfield with the name the LLM called. - Server logs follow the chat mode: the Server Logs tab streamed the same records in Sandbox and Production mode, and DEBUG records never reached it. Now Sandbox mode streams DEBUG logs, and Production mode streams the platform’s normal log level. The log stream url accepts a
levelparameter, for example?level=DEBUG. Console logging doesn’t change.
Web console: lists that reach all of your resources
Every resource list in the web console (LLMClients, Plugins, Guardrails, Secrets, AuthTokens and ten more) showed only its first 25 resources, with no way to reach the rest. The API could page, but the console never asked for a second page.
Now all 15 list pages page, search and sort on the server:
- Paging: “Showing 26–50 of 61”, previous and next buttons, and a box to jump to a page. Each tab (for example, your resources and shared ones) keeps its own page.
- Search: a search box next to the list and card view toggle. It matches the name and description, ignoring case, across all your resources, not only the page you’re on. It waits until you pause typing before it searches.
- Sorting: click a column header to sort ascending, again for descending, and a third time to return to the default order (most recently updated first). The sort applies to the whole list, not only the rows on the page. Columns such as name, description, created and updated, and many resource-specific ones (a Guardrail’s stage, an LLMHostCompute’s price per hour, a Vectorstore’s vector count) can be sorted. Only columns the server can sort are clickable.
- For API users: each list API accepts
page,page_size(up to 100, default 25),searchandordering(for example-name), and its response has apaginationobject with the page, the count and the columns you can sort by.
📖 List pagination, search and sorting
Infrastructure inventory
The ledger of infrastructure resources, under Settings, Infrastructure Resources, recorded only what Smarter itself created: DNS records, certificates and the Kubernetes resources of deployed models. Most of what a platform costs, the cluster, its nodes and its load balancers, is created by Terraform, the cluster’s autoscaler or cert-manager, so the ledger never showed it.
Smarter now discovers these resources and keeps the ledger in step with them:
- What it records: the Kubernetes cluster, its add-ons, node groups and nodes, and, in the platform’s own namespace, persistent volumes, load balancers, ingresses and cert-manager certificates.
- What changed: a resource the ledger doesn’t know is recorded as created, and one that no longer exists is marked destroyed. If a type can’t be listed, for example because the cluster is unreachable, its rows are left as they are.
- Read-only: the inventory only reads from the cloud. It never creates or destroys anything.
- When it runs: every 15 minutes, once at the end of
initialize_platform, or on demand withpython manage.py sync_infrastructure_inventory. - Console: the Infrastructure Resources list now pages on the server, with a choice of rows per page, and can be filtered by resource type.
📖 Infrastructure documentation
Fixes and operations
- One command sets up a platform.
initialize_platformnow also loads the example plugins and the Stackademy example, which used to need two more commands. The Makefile and the Helm init job no longer call them separately. If either step fails,initialize_platformlogs the error and finishes the rest of the setup, where before the failure stopped the chain. - A new platform shows its infrastructure at once. The infrastructure ledger was empty for the first 15 minutes after a new install.
initialize_platformnow runs the inventory as its last step. On an install without a cluster or cloud credentials, the step logs an error and setup carries on. - LLMClient list: the Edit link and the URL details on the LLMClient list pointed nowhere, because the page read field names the API doesn’t return. They work now.
Upgrading
- Run the migrations. The plugin and journal apps each have one new migration for ImageSearchPlugin.
- Brave Search API key (recommended): set
SMARTER_BRAVE_SEARCH_API_KEYto use the image search plugins.initialize_providersstores it as the Secretbrave_search_api_key. Your Brave plan must include image search. Without a key, the plugins return empty lists and the chat still works. - Rebuild your Docker images to get the WordNet corpus that thesaurus matching needs. Until you do, thesaurus matching is turned off and a warning is logged once.
- Helm and Makefile: if you run your own init scripts, remove the separate
add_plugin_examplesandcreate_stackademycalls, becauseinitialize_platformnow runs them. - Embedding Smarter Chat: pages that embed Smarter Chat need to import
katex/dist/katex.min.cssfor math to display correctly. - The new list controls appear after the React apps are rebuilt.
What’s next
ImageSearchPlugin ships as experimental. We’ll use what we learn from the example LLMClients to settle its manifest before calling it stable. With paging, search and sorting in place, the web console is ready for accounts with hundreds of resources, and the infrastructure ledger is the first step toward showing what a platform’s cloud resources cost.
The full list of changes is in the v0.19 changelog. To try the release, start with the documentation, or browse the code on GitHub.
