Converts attached videos into a sequence of image frames with ffmpeg before they reach the model, so any vision-capable LLM can "watch" them.
user-files cache with stable names, so frame references stay valid across turns and app restarts; a per-chat registry (video-registry.json) tracks which files belong to which video./video chat commands: list, on <name> (re-attach a video's frames), off [name] (tell the model to ignore them), purge <name|all> (delete stored frame files).ffmpeg before they reach the model (fixed-FPS or fixed-frame-count sampling, resolution cap), so any vision-capable LLM can "watch" them. Frames were uploaded through the SDK's temporary upload API only.Plugins cannot add UI menu items, so there is no dedicated "Attach Video" button:
Progress is visible in the chat as status steps (analyzing → extracting → storing N/M frames).
By default (persistent storage), extracted frames are copied into LM Studio's user-files cache with stable names, so follow-up questions about the same video keep working — the SDK's normal upload API only keeps images until you disconnect. A small registry (video-registry.json) is kept in the chat's working directory to track which files belong to which video.
Per-chat settings (gear icon on the plugin):
| Setting | Default | Description |
|---|---|---|
| Sampling mode | Fixed FPS | Fixed FPS or Fixed frame count (whole video) |
| FPS | 1 | Frames per second in fixed-FPS mode (0.1–30) |
| Frame count | 16 | Total frames across the whole video in fixed-count mode (1–1000) |
| Resolution | ~1 Mpx | Max pixels per frame: ~300k / ~600k / ~1 Mpx / ~2 Mpx / native. Downscale only, aspect ratio preserved |
| Max frames per video | 100 | Safety cap (1–1000); sampling is slowed down to stay under it |
| Frame storage | Persistent | Persistent keeps frames in LM Studio's user-files cache across turns (recommended). Temporary uses the SDK upload, which LM Studio deletes after a while — follow-ups on the same video will then fail. |
Global settings (application-wide): ffmpeg path and ffprobe path — defaults to ffmpeg/ffprobe on PATH. Set full paths if your binaries are not on PATH.
/video)Type these as a message in the chat:
| Command | Effect |
|---|---|
/video list | List videos whose frames are stored by the plugin |
/video on <name> | Re-attach a video's frames to this message (e.g. after /video off) |
/video off [name] | Instruct the model to ignore previously attached video frames |
/video purge <name|all> | Delete stored frame files from disk (chats that reference them will need to be restarted) |
Any text on lines below the command is still sent as the message.
To publish to LM Studio Hub: set your username as owner in manifest.json, then lms push.
user-files cache until you remove them with . They are plain files named , so they can also be deleted manually (the registry entry then becomes stale).Converts attached videos into a sequence of image frames with ffmpeg before they reach the model, so any vision-capable LLM can "watch" them.
user-files cache with stable names, so frame references stay valid across turns and app restarts; a per-chat registry (video-registry.json) tracks which files belong to which video./video chat commands: list, on <name> (re-attach a video's frames), off [name] (tell the model to ignore them), purge <name|all> (delete stored frame files).ffmpeg before they reach the model (fixed-FPS or fixed-frame-count sampling, resolution cap), so any vision-capable LLM can "watch" them. Frames were uploaded through the SDK's temporary upload API only.Plugins cannot add UI menu items, so there is no dedicated "Attach Video" button:
Progress is visible in the chat as status steps (analyzing → extracting → storing N/M frames).
By default (persistent storage), extracted frames are copied into LM Studio's user-files cache with stable names, so follow-up questions about the same video keep working — the SDK's normal upload API only keeps images until you disconnect. A small registry (video-registry.json) is kept in the chat's working directory to track which files belong to which video.
Per-chat settings (gear icon on the plugin):
| Setting | Default | Description |
|---|---|---|
| Sampling mode | Fixed FPS | Fixed FPS or Fixed frame count (whole video) |
| FPS | 1 | Frames per second in fixed-FPS mode (0.1–30) |
| Frame count | 16 | Total frames across the whole video in fixed-count mode (1–1000) |
| Resolution | ~1 Mpx | Max pixels per frame: ~300k / ~600k / ~1 Mpx / ~2 Mpx / native. Downscale only, aspect ratio preserved |
| Max frames per video | 100 | Safety cap (1–1000); sampling is slowed down to stay under it |
| Frame storage | Persistent | Persistent keeps frames in LM Studio's user-files cache across turns (recommended). Temporary uses the SDK upload, which LM Studio deletes after a while — follow-ups on the same video will then fail. |
Global settings (application-wide): ffmpeg path and ffprobe path — defaults to ffmpeg/ffprobe on PATH. Set full paths if your binaries are not on PATH.
/video)Type these as a message in the chat:
| Command | Effect |
|---|---|
/video list | List videos whose frames are stored by the plugin |
/video on <name> | Re-attach a video's frames to this message (e.g. after /video off) |
/video off [name] | Instruct the model to ignore previously attached video frames |
/video purge <name|all> | Delete stored frame files from disk (chats that reference them will need to be restarted) |
Any text on lines below the command is still sent as the message.
To publish to LM Studio Hub: set your username as owner in manifest.json, then lms push.
user-files cache until you remove them with . They are plain files named , so they can also be deleted manually (the registry entry then becomes stale)./video purgeplugin-video__<name>__frame_NNNN.jpgnpm install
npm run build # tsc → dist/
lms dev # start the plugin dev server (live reload) in this folder
/video purgeplugin-video__<name>__frame_NNNN.jpgnpm install
npm run build # tsc → dist/
lms dev # start the plugin dev server (live reload) in this folder