Skip to main content
LLM judges can evaluate spans that contain images alongside text. This is useful for browser agents, UI testing, visual QA, and any workflow where you need to assess visual output.

How it works

  1. Attach images to spans using SDK methods or structured output data
  2. Images are uploaded during span ingestion (image data is stripped from the span and stored separately)
  3. Judges fetch images when evaluating the span and send them to a vision-capable LLM
  4. Evaluation results appear in the dashboard like any other judge evaluation
The LLM sees both the span’s text data (input/output) and any attached images, giving it full context for evaluation. Images can be provided as base64-encoded strings, presigned S3 URLs, or CDN image URLs. In all cases, ZeroEval copies the image into its own storage during ingestion, so the source URL only needs to remain valid long enough for the ingest request to complete.

Attaching images to spans

There are two ways to attach images to spans, depending on your workflow.

Option 1: SDK helper methods

The SDK provides add_screenshot() and add_image() methods for attaching images with metadata. Screenshots with viewport context For browser agents or responsive testing, use add_screenshot() to capture different viewports:
Generic images For charts, diagrams, or UI component states, use add_image():

Option 2: Image URLs (S3 presigned or CDN)

If your images are already hosted externally, you can pass an HTTPS URL instead of base64 data. ZeroEval will download the image, validate it, and copy it into its own storage. Attach URLs via attributes.attachments using a url key instead of base64: Presigned S3 URL
CDN URL
The URL only needs to stay valid long enough for ZeroEval to download the image during ingestion (typically a few seconds). After that, ZeroEval serves the image from its own storage. CDN URLs must be from a trusted domain configured in the backend.

Option 3: Structured output_data

If your workflow already produces screenshot data as structured output (common with browser automation agents), you can include images directly in the span’s output_data. ZeroEval automatically detects and extracts images from JSON arrays containing base64 or url fields.
You can also use URLs (presigned S3 or CDN) in output_data by replacing the base64 key with url:
When ZeroEval ingests this span, it:
  1. Extracts each object with a base64 or url field as an attachment
  2. Downloads (for URLs) and uploads the images to storage
  3. Strips the image data from output_data to keep the database lean
  4. Preserves the metadata (viewport, width, height) for display
This approach works well when your browser agent or automation tool already produces structured screenshot output.
All methods produce the same result: images stored and available for multimodal judge evaluation. Choose whichever fits your workflow better.

Creating a multimodal judge

Multimodal judges work like regular judges, but with criteria that reference attached images. The judge prompt should describe what to look for in the visual content.

Example: UI consistency judge

Example: Brand compliance judge

Example: Accessibility judge

Filtering spans for multimodal evaluation

Use tags to identify which spans should be evaluated by your multimodal judge:
Then configure your judge to only evaluate spans matching that tag. This prevents the judge from running on text-only spans where multimodal evaluation doesn’t apply.

Supported image formats

  • JPEG
  • PNG
  • WebP
  • GIF
Images can be provided as base64-encoded strings, presigned S3 URLs, or CDN image URLs from trusted domains. In all cases, images are validated by magic bytes during ingestion. The maximum size is 10MB per image, with up to 5 images per span.

Viewing images in the dashboard

Screenshots appear in two places:
  1. Span details view - Images show in the Data tab with viewport labels and dimensions
  2. Judge evaluation modal - When reviewing an evaluation, you’ll see the images the judge analyzed
Images display with their labels, viewport type (for screenshots), and dimensions when available.

Model support

Multimodal evaluation currently uses Gemini models, which support image inputs. When you create a judge, ZeroEval automatically handles the image formatting for the model.
Multimodal evaluation works best with specific, measurable criteria. Vague prompts like “does this look good?” will produce inconsistent results. Be explicit about what visual properties to check.