image component shows an image on the canvas, with an optional caption. It is display-only.
Images come from two sources, both under your control:
- Your Knowledge Base: you curate the exact set of images the PAL may show, and it picks one by id.
- Websites you allowlist: the PAL passes an image URL it received during the conversation (typically from a tool result), and Tavus renders it only if the URL clears a safety floor and its host matches your allowlist.
web with at least one allowlisted domain.
Configuration
Attaching the skill alone does not activateimage. It stays inactive (no action is compiled, no error) until at least one image is curated in the skill config or web is enabled with at least one domain.
Curated Knowledge Base images
1
Add the images to your Knowledge Base
Upload each image with Create Document and wait for it to finish processing. Curating a document that is still processing is rejected, so poll Get Document (or use the callback) first.
2
Curate them on the PAL
Save the document ids you want the PAL to be able to show, each with an optional caption and an optional “when to show this” hint.
Which documents can be curated
When you save the config, everydocument_id must:
- Be accessible to the account that owns the PAL. Otherwise:
400,One or more document_ids are not accessible. - Have finished processing. Documents still being ingested are rejected with
400,One or more document_ids are not ready for display; curate them once processing completes.
Web images
Theweb object lets the PAL show images it finds mid-conversation, typically URLs returned by a tool you built: a product search, a listing lookup. You allowlist the websites those URLs may come from; a URL from anywhere else is dropped before the card renders.
Domain entries are validated when you save the config:
- Each entry is an exact host (
photos.example.com) or a leading wildcard (*.cdn.example.com). An exact host matches only itself. A wildcard matches any depth of subdomain and never the bare domain:*.example.commatchesa.example.comanda.b.example.combut notexample.com; list the apex separately if you want it too. - Hostname only, max 253 characters: no scheme, port, path, or userinfo. International domains go in as punycode (
xn--...). - Entries are normalized on save (lowercased, trailing root dot stripped, duplicates removed), so the list you read back is the canonical form.
- IP addresses (in any spelling),
localhost, and internal-network names (.local,.internal,.corp, …) are rejected: the allowlist can only name public websites. - Wildcards over shared platforms and public suffixes (
*.github.io,*.co.uk, …) are rejected, because they would allowlist every site anyone can register there. Wildcard your own subtree (*.photos.example.com) or list exact hosts instead.
The allowlist is for URLs the PAL receives during the conversation. It is
instructed to pass only image URLs that appeared in a tool result, copied
exactly, and never to construct or recall one from memory: an invented URL
won’t load even on an allowed website. Pair
web with a tool that returns
image URLs.If none of the curated documents resolve and
web is not enabled, the
canvas_show_image action is not compiled for that conversation at all. The
PAL is never offered an image it cannot show.When the PAL shows images
You can curate up to 50 Knowledge Base images on the PAL. Eachcanvas_show_image call can display 1 to 8 of them at once (and, with a live web allowlist, web image URLs as well). The PAL identifies each entry by curated id or by URL.
Multiple images on one card show as a carousel: one image at a time, with
prev/next to step through them.
Arguments
* Each entry carries exactly one of
id or url; an entry with both is dropped. No other arguments are accepted.
Example invocation
How an id becomes an image
At conversation create, Tavus resolves each curated document to a signed URL that is valid for the length of the conversation. When the PAL callscanvas_show_image, Tavus substitutes the id for that URL before the card reaches the browser, so the card your client renders (or your own renderer, if you bring one) receives a URL-shaped payload:
- Caption precedence: the PAL’s caption, then your curated caption, then the description Tavus generated for the image (or the document name). Truncated to 280 characters.
- Alt text for a curated image always comes from your config or Tavus, never from the PAL. Truncated to 240 characters.
titleis truncated to 120 characters.- The resolved URLs are short-lived and specific to that conversation. Treat them as expiring; don’t store or share them.
How a URL becomes an image
Aurl entry is validated at the moment the PAL calls the action, in two layers:
- A fixed safety floor. The URL must be
httpswith a publicly routable hostname. Loopback, private-network, and link-local addresses, IP-literal hosts in any spelling, and internal names likelocalhostare rejected. The floor is not configurable: allowlisting a domain cannot re-admit anhttp://or private-network URL. - Your allowlist. The URL’s host must match one of your
web.domainsentries, exact or wildcard.
{url, alt, caption} shape as a curated image, with the PAL’s alt and caption. The participant’s browser fetches it directly, so the image must be publicly reachable.
Whichever way an entry identifies its image, an entry that fails to resolve is dropped and the rest of the call still renders. If nothing survives, the card is not shown at all rather than rendering broken.
Interaction Types
image is lifecycle-only. Supported interaction types:
When to Use
Useimage when seeing the thing is faster than describing it: a product, a floor plan, a chart you already have as a file, a screenshot of a step. Give each curated image a prompt that says when it applies, and the PAL will pick the right one.
Use web when the right image isn’t known until mid-conversation: pair it with a tool that returns image URLs (a product search, an inventory lookup) and the PAL can show the participant what it just found.
For walking a participant through a multi-page deck, use the presentation skill instead; it shares your screen with the deck rather than showing a card.
Related
- Canvas components overview: component table and shared behavior
- Canvas configuration: the full
magic_canvasskill config - Knowledge Base: uploading and managing documents

