{"id":"03070098-31a4-4c47-8794-65b0d652d1fd","slug":"levyxdev-litevision","kind":"skill","name":"litevision","summary":"Give AI agents image and video generation models, using your own API keys.","owner":"levyxdev","repoUrl":"https://github.com/levyxdev/litevision","license":"Apache-2.0","licenseTier":"permissive","trust":"community","stars":0,"match":null,"fewStars":true,"format":"skill","createdAt":"2026-10-25T16:01:31.000Z","addedAt":"2026-11-08T04:34:39.553Z","logoUrl":"https://avatars.githubusercontent.com/u/128299479?u=9a858bdc5fdc94a35f705547d3d2effd0804c250&v=4","linkOnly":false,"collection":null,"skillPath":null,"categories":["design-media"],"tags":[],"runtime":"node","local":true,"cloudCapable":false,"cloudCapability":"unknown","cloudReadyOnPlatform":false,"needsApiKey":false,"reviewed":false,"syncedAt":"2026-11-08T04:35:45.917Z","sample":false,"url":"https://conduits.dev/tools/levyxdev-litevision","language":"TypeScript","transports":["stdio"],"install":{"npm":"litevision"},"requirements":{"env":[],"upstreamMayCharge":false},"tools":null,"readme":"# litevision\n\nLet an AI agent generate images and videos through models you already pay for.\n\nlitevision is a local [MCP](https://modelcontextprotocol.io) server. You configure your own Providers (OpenAI, Gemini, Venice, APIMart, Together AI, or any compatible relay) once, in a settings page on your own machine. Your Agent (Claude Code, Codex, …) then generates images and videos with them and gets back file paths. Your API keys never pass through the conversation.\n\n## Install\n\nRequires Node.js 22 or later.\n\nClaude Code:\n\n```bash\nclaude mcp add litevision -- npx -y litevision\n```\n\nAny other MCP client: run `npx -y litevision` as a stdio server, for example:\n\n```json\n{\n  \"mcpServers\": {\n    \"litevision\": { \"command\": \"npx\", \"args\": [\"-y\", \"litevision\"] }\n  }\n}\n```\n\n### The litevision Skill\n\nThe server tells your Agent the rules it must keep. How to get good results (writing prompts, checking each result against your request, when to suggest a Comparison or new Model Notes) is in the litevision Skill, [`skills/litevision/SKILL.md`](skills/litevision/SKILL.md), drafted from the Model makers' own prompting guides. Install it with [`skills`](https://github.com/vercel-labs/skills):\n\n```bash\nnpx skills add levyxdev/litevision\n```\n\nAdd `-g` to install it for your user instead of the current project, and `-a` to choose which Agents get it. The Skill changes only with a litevision release: run `npx skills update` after upgrading litevision. Without it, your Agent still keeps the rules, but writes prompts its own way.\n\n## Set up\n\nAsk your Agent to generate an image. While nothing is configured, it calls `open_settings`, which opens the settings page in your browser. You can also ask your Agent to open litevision's settings, or open the page yourself from a terminal:\n\n```bash\nnpx -y litevision settings\n```\n\nThe page listens on `127.0.0.1` only, behind a one-time token, and shuts down after a few idle minutes. On it you:\n\n1. **Add a Provider**: a name, a base URL, and its API key (the Credential). \"Test connection\" checks the key.\n2. **Add Models**: an Alias your Agent will use (e.g. `gpt-image-cheap`; suggested from the Provider id and model id, such as `together-google-flash-image-3.1`), the Provider's model id, the Protocol it speaks, and whether it makes images or videos (filled in for you when the Provider's model list says):\n\n   | Protocol | For |\n   | --- | --- |\n   | `openai-images` | OpenAI's Images API, and relays that copy it |\n   | `gemini` | Google's Gemini API (Interactions API) |\n   | `venice` | Venice |\n   | `apimart` | APIMart |\n   | `together` | Together AI, images and videos. Models Together passes through to their makers (FLUX, Google, Qwen, …) work only once you turn on \"Passthrough models\" in Together's organization settings, which sends your prompts for them to those makers. |\n\n3. **Pick a default image Model** (and a default video Model) and, optionally, write Model Notes (\"photoreal, cheap, bad at Chinese text\") so the Agent knows when to choose each one.\n4. **Optionally, set Standing Options** on a Model: a JSON object of the Provider's own request fields, such as `{ \"quality\": \"high\" }`, that every Job on it sends. The Agent's `provider_options` override them for one Job.\n\nThe page also shows the Job history, with the images and videos and any Ratings you gave, and lets you rate a Job or one of its results. Each Model shows its Option Statuses read-only: what litevision has learned about the `provider_options` values sent to it.\n\n## Tools\n\n| Tool | What it does |\n| --- | --- |\n| `generate_image` | Generates `n` images from a prompt, optionally with reference images. Size, quality and every other setting are the Model's own fields in `provider_options`, passed to the Provider as they are; without them the Provider's defaults apply. Saves the images, named after the optional `name`, and returns the file paths, with the size the request asked for and the size each image actually came out at. With `wait: false` it returns the Job's id at once and the Job runs in the background, so several Jobs run at the same time and `get_job` collects each. |\n| `generate_video` | Generates a video from a prompt, optionally with a first and last frame and reference images. Shape, resolution and length are the Model's own fields in `provider_options`. Saves it, named after the optional `name`, and returns the file path, with what the request asked for and the video's actual size and length. Takes `wait: false` like `generate_image`. |\n| `generate_comparison` | Starts 2 to 4 Jobs of one Modality together, differing in prompt, Model or both, each with its own `provider_options` and `name`, so you can choose among the results. The Agent starts one only when you ask for it or agree to it. |\n| `get_job` | Waits for, or reports on, a Job that was still running when `generate_image`, `generate_video` or `generate_comparison` returned, as one started with `wait: false` always is. Also shows the Job's Source Jobs: the earlier Jobs whose results it was given as reference images. |\n| `list_models` | Lists the configured Models with their Modality, Model Notes, Standing Options, a summary of their Parameter Guide, docs link and the Option Status of each `provider_options` value sent to it; for one Model, also its full Parameter Guide (each parameter's values, default and price effect, with sources and the date they were checked) or the Provider's own parameter schema where it publishes one, each Option Status with its values, date and Job, its five most recent Ratings with each Job's Source Jobs, and the Picks of up to five Comparisons it took part in (most recently picked first). |\n| `pick_result` | Records your Pick when you choose among a Comparison's results; choosing again replaces it. A Pick says which you prefer, not that it is good, so it changes no Option Status. You can also pick in the settings page's Job history, which shows a Comparison's Jobs together. |\n| `rate_job` | Records your verdict on a Job or on one of its results (good or bad, plus a reason) when you state one. A Rating judges the result, never the options that produced it, so it changes no Option Status. |\n| `update_model_notes` | Replaces a Model's Notes, only with text you agreed to. You can undo it in the settings page. |\n| `open_settings` | Opens the settings page. |\n\n## Option Status\n\nFor each `provider_options` value sent to a Model, litevision keeps an Option Status from facts alone, never from your Ratings:\n\n- **Honoured**: the result was checked against the request (its shape; its pixel size, where the request names exact dimensions or a tier the Parameter Guide sizes; its file format; a video's length) and matched.\n- **Ignored**: the result was checked and did not match, so the Provider may have ignored the value.\n- **Rejected**: the Provider's error named it; its message is kept.\n- **Accepted**: the Provider did not reject it, but nothing can check its effect (`quality`, `seed`, …).\n\nFields checked together, such as `width` and `height`, share one; a nested field a check reads, such as Gemini's `response_format.image_size`, has its own. The latest evidence wins and is shown with its date and Job, so the Agent can tell when to read the docs again.\n\n## Where things are kept\n\n| What | Where |\n| --- | --- |\n| Providers, Models (`config.json`) and Credentials (`credentials.json`, mode 600) | `~/.config/litevision/` |\n| Job history (`jobs.jsonl`) and the cached parameter descriptions Providers give (`capabilities.json`) | `~/.local/share/litevision/` |\n| Generated images and videos, unless the Agent passes `output_path` | `~/litevision/outputs/<date>/` |\n\nA saved file is named after the `name` the Agent passes, in any language, with only the characters a path cannot hold removed, and any image or video extension it ends in (the file gets its own): `张三.png`, or `张三-1.png`, `张三-2.png` for a Job with several results. Without `name` it is named after the time the Job started, e.g. `140500.png`. A name already taken in the folder gets the next free number, `张三-2.png`, `张三-3.png`. The Job history records which files each Job saved, with a hash of each file's content. When a later Job is given one of them, or a copy of it anywhere, as a reference image or video frame, litevision finds the earlier Job by that hash and records it as a Source Job, so a chain of edits and its Ratings can be read in order. It never reads old files again: delete the ones you don't want, and a deleted one is shown as deleted.\n\n## Develop\n\nlitevision is developed with [Bun](https://bun.sh) and ships plain JavaScript for Node (see `docs/adr/`).\n\n```bash\nbun install\n```\n\n```bash\nbun test\n```\n\n```bash\nbun run build\n```\n\n## License\n\nApache-2.0\n"}