docs blog library
github

Turn incident evidence into a visual briefing with companion models

This tutorial builds an incident agent whose everyday reasoning stays on an inexpensive text model. Specialists inspect screenshots, recordings, and screen captures; an image-generation companion turns the verified timeline into a briefing card.

1. Configure the providers

Configure the primary provider and every provider used by a companion:

jazz config

Jazz discovers current model capabilities from its catalog. Provider and key options are in Model providers.

2. Create the orchestrating agent

jazz agent create

Name it incident-media-analyst. Choose a fast, tool-capable model and the coder persona. Keep file management and perception delegation available; remove capabilities this job does not need.

Agent files live in ~/.jazz/agents/. Add the companion map to the new file, choosing model ids from providers you configured:

{
  "id": "incident-media-analyst",
  "name": "incident-media-analyst",
  "config": {
    "persona": "coder",
    "llm": {
      "provider": "openrouter",
      "model": "z-ai/glm-5.3-flash"
    },
    "companions": {
      "analyze:image": "openrouter/inclusionai/ling-3.0-flash-vl",
      "analyze:audio": "alibaba/qwen3.6-27b",
      "analyze:video": "openrouter/inclusionai/ling-3.0-flash-vl",
      "generate:image": "openrouter/google/gemini-3.1-flash-image"
    }
  }
}

Choose models that support each assigned input or output. Run jazz agent list --can image to list models available through your configured providers. A binding uses Jazz’s provider name followed by the model id: direct Google models use gemini/..., while Google models through OpenRouter use openrouter/google/....

Configure credentials for every provider named in the companion map.

3. Give it an end-to-end cross-media job

jazz agent chat incident-media-analyst

Replace the example paths with files you have: a dashboard screenshot, an audio note, and a reproduction video. Then send:

Correlate @/tmp/latency-dashboard.png, @/tmp/on-call-note.m4a, and
@/tmp/reproduction.mp4. Build one timeline, distinguish observed facts from
inference, and tell me which hypothesis to test first. Then generate a 16:9
incident briefing card with the confirmed timeline, impact, and next action.

The parent agent breaks the problem into precise media-analysis tasks. Each companion sees only its assigned files and task; the parent reconciles the returned evidence, then sends only the approved visual brief to the image-generation companion. This avoids putting the full conversation and every attachment into every model call.

You should receive a timeline citing the supplied evidence and a generated briefing image. Check the timeline before sharing the image; model analysis can be wrong.

4. Run the same analyst in CI

Add the agent JSON to your repository at .github/jazz/agents/incident-media-analyst.json. In a job where Jazz is installed and your tests have written artifacts/expected.png and artifacts/actual.png, add this step:

- name: Explain visual regression failure
  env:
    OPENROUTER_API_KEY: ${{ secrets.OPENROUTER_API_KEY }}
    ALIBABA_API_KEY: ${{ secrets.ALIBABA_API_KEY }}
  run: |
    mkdir -p ~/.jazz/agents
    cp .github/jazz/agents/incident-media-analyst.json ~/.jazz/agents/
    jazz run --json --agent incident-media-analyst --approval-policy read-only \
      "Compare @${GITHUB_WORKSPACE}/artifacts/expected.png and @${GITHUB_WORKSPACE}/artifacts/actual.png. Explain the first meaningful divergence, then generate an annotated image that makes the regression obvious to the owning team." \
      > media-review.json

Adjust the keys if you chose different providers. No picker appears in CI: the saved analyze:image binding is the decision. Parse media-review.json only after checking .ok and .costKnown.

Companion behavior

  • The primary model remains the agent’s identity and orchestrator.
  • Companions have isolated context, no tools, and bounded execution.
  • Analysis and generation can use different providers and models for the same medium.
  • Unattended runs require a saved companion binding.
  • Companion spend is included in the parent run’s cost accounting.

machine-readable: /docs/guides/media-companions.md · /llms.txt · /llms-full.txt