Video::Prompt::Brief

Model, validate, and render structured video generation briefs.

Video::Prompt::Brief

Video::Prompt::Brief is a small, dependency-free Raku module for modeling, checking, and rendering structured briefs used in video generation workflows. It keeps the creative decisions that matter for a shot in named fields instead of hiding them inside one long prompt string.

The module is useful when a command-line tool, web service, job queue, or test suite needs to reject incomplete video instructions before work reaches a generator. It does not call a model or make assumptions about a specific API.

Why use a structured brief?

A video prompt often mixes the subject, action, camera, environment, timing, sound, exclusions, and reference assets in one paragraph. That format is easy to write but difficult for software to inspect. A missing camera instruction or an impossible duration can reach the generation stage without being noticed.

This module separates those concerns:

  • subject describes the visible subject and its identifying details.

  • action states what changes during the shot.

  • camera records framing, movement, or point of view.

  • setting captures environment, time, and lighting.

  • audio optionally records sound direction.

  • duration-seconds gives the requested shot length.

  • constraints keeps must-have and must-avoid requirements.

  • reference-assets stores stable IDs used by a surrounding asset system.

Installation

After the distribution is indexed by the Zef ecosystem:

zef install Video::Prompt::Brief

Create and validate a brief

use Video::Prompt::Brief;

my $brief = Video::Prompt::Brief.new(
    subject => 'A compact electric bicycle with a matte black frame',
    action => 'The bicycle rolls slowly through a shallow puddle',
    camera => 'Low tracking shot moving parallel to the bicycle',
    setting => 'Rainy city street at blue hour with reflected lights',
    audio => 'Soft tire noise, light rain, and distant traffic',
    duration-seconds => 8,
    constraints => [
        'Keep the frame geometry consistent',
        'No visible brand logos',
    ],
    reference-assets => ['bike-side', 'street-lighting'],
);

if $brief.is-valid {
    say $brief.to-prompt;
} else {
    .say for $brief.issues;
}

issues returns plain strings so callers can log them, display them in a form, or map them to their own error type. The current checks reject underspecified core fields, non-positive durations, durations above 300 seconds, and duplicate reference IDs.

Build from a hash

from-hash is convenient when data comes from decoded JSON or another configuration source:

my $brief = Video::Prompt::Brief.from-hash({
    subject => 'A folded jacket on a wood table beside a window',
    action => 'A breeze moves the loose sleeve and curtain',
    camera => 'Locked medium shot with a slow focus pull',
    setting => 'Quiet daylight studio with soft window shadows',
    duration-seconds => 6,
    constraints => ['Preserve the garment color'],
});

Missing keys receive conservative defaults and will be reported by validation. This allows ingestion code to collect several problems in one pass instead of failing at the first absent value.

Rendering

to-prompt renders a stable, readable block with one decision per line. The result can be stored for review, attached to a generation job, or adapted by a provider-specific integration. Optional audio, constraints, and references are only emitted when present.

The structure also works as a preflight step for browser-based creative tools. For example, a team preparing text-to-video or image-to-video concepts with Kling 3.0 AI Video Generator can validate the internal brief first, then copy or transform the rendered result for its chosen workflow. That link is an example integration context; this module remains independent and does not claim access to, endorsement by, or API compatibility with the service.

Design boundaries

The linter deliberately avoids guessing whether a prompt is tasteful, safe, or likely to produce a good result. Those decisions depend on the target service and the surrounding application. It only checks deterministic structure that a caller can understand and test.

The module also does not verify that reference asset IDs exist. Asset lookup is owned by the calling system because IDs may refer to local files, object storage, a database, or a provider-specific upload.

Development

Run the test suite from the distribution root:

zef test .

Issues and focused pull requests are welcome at the source repository. Please include tests for any new validation rule and keep provider-specific behavior outside the core module.

Video::Prompt::Brief v0.1.0

Model, validate, and render structured video generation briefs.

Authors

  • Martyn Foster

License

Artistic-2.0

Dependencies

Test Dependencies

Provides

  • Video::Prompt::Brief

Documentation

The Camelia image is copyright 2009 by Larry Wall. "Raku" is trademark of the Yet Another Society. All rights reserved.

Built with Podlite — the markup and publishing tools behind this site.