Models
Capra speaks the OpenAI protocol and nothing else, which is why almost anything works: LM Studio, Ollama, llama.cpp's server, vLLM, Google, OpenAI, OpenRouter, a company gateway. If it answers POST /chat/completions, it will do.
The four roles
Settings shows which model is filling each, and what happens when nothing is.
| Role | What it does | Without one |
|---|---|---|
| Vision | Describes individual frames — who is in them, what they are doing, what is in the room. | Capra still finds shots, scenes, dialogue and sound, but cannot say what is in the picture. This is the one that matters. |
| Text | Reconstructs scenes and writes the screenplay. | Capra assembles the script from what it measured. Readable, and noticeably plainer than a model writing it. |
| Audio | Transcribes speech when you have no subtitle file. | Bring an .srt. Subtitles are better than transcription anyway: they carry the writer's own words. |
| Embedding | Search, and matching characters across shots. | Search falls back to a substring scan. Character matching leans harder on faces. |
Local
Free, private, and slower. Load a model, then press Find local servers in Settings — Capra probes localhost for the usual ports and asks each one what it has.
| Model | VRAM | Notes |
|---|---|---|
qwen2.5-vl-7b | ~6 GB | What this project was developed against. Good at people and posture. |
gemma-3-12b-it | ~9 GB | Better at text inside the frame — signs, screens, subtitles burned into the picture. |
internvl3-8b | ~7 GB | Strong on objects and layout. |
The one thing worth knowing before you start: a 7B vision model and a 27B text model will not both fit on a 12 GB card. Loading the second evicts the first and the analysis stops mid-pass. Either load the vision model and let it take both roles — it is worse at prose and it works — or point the text role at a cloud provider. The two are configured independently for exactly this reason.
Capra probes each model when you add it and records what it actually supports rather than what it claims: whether it accepts images, whether it honours a JSON schema, and how long it took. A model that fails the probe is still usable — the requests simply degrade to plain JSON and then to a prompt instruction.
Cloud
Settings offers three by name, with the URL filled in:
| Provider | Base URL |
|---|---|
| Google Gemini | https://generativelanguage.googleapis.com/v1beta/openai |
| OpenAI | https://api.openai.com/v1 |
| OpenRouter | https://openrouter.ai/api/v1 |
Anything else: Add provider, and paste the URL yourself. If it already carries a path, Capra leaves it exactly as you typed it; only a bare host gets /v1 appended.
About the key
It is encrypted with the operating system's own keystore — DPAPI on Windows, Keychain on macOS, libsecret where there is one — and never leaves the main process. The renderer is given a reference, never the key itself, and nothing about a request is cached except the model's answer.
If you move a project to another machine the key does not travel with it. Keys live in the application's preferences, never in the project directory, so copying a project folder never carries a credential.
Speed
Two thirds of an analysis is vision calls. On the test film that was 319 of them at a mean of 6.4 seconds — about 34 minutes of model time on one local GPU.
Against a cloud provider those calls are latency rather than compute, so they overlap almost perfectly. The presets ask for six at a time, which is inside the free-tier limits of all three and turns that forty-minute pass into a few minutes. Local providers stay at one, where the GPU is the constraint and more requests only add queueing.
You can change the number per provider in Settings.