Skip to content

Releases: nolgiainc/nolgia-cli

v0.2.18

Choose a tag to compare

@github-actions github-actions released this 02 Aug 20:10
b9cfcca
  • A job the server accepted is never lost again — and a wait timeout no
    longer reads as a failure.
    These were the two behaviours that made a human
    re-run a generation and pay for it twice (NOL-344 cost 84 credits exactly
    this way).

    Previously, if anything went wrong after a submission had already succeeded,
    the CLI printed a transport error and no job id — so the command looked
    like it had failed before submitting, and re-running was the natural
    response. And a 408 from GET /jobs/{id}/wait, which only means the
    server's long-poll window closed while the job kept running, surfaced as:

    Error: waiting for generation job
    
    Caused by:
        Unexpected Response: Response { url: "…/wait?timeout_seconds=300", status: 408, … }
    

    Nothing had failed, but the word Error: is the strongest possible prompt to
    try again.

    Four endings now deliver the same fact — work is live under this id, follow
    it, do not re-submit
    :

    still running after 300s — job 60893909-3123-42bd-b04f-ed946b136c0f
      Nothing failed. The server's long-poll window closed while the job was
      still running — the job was not cancelled and is still being worked on.
      It will be billed once, whether or not you keep waiting. Re-running this
      command would start a second job.
        nolgia wait 60893909-…    # keep waiting for it
        nolgia status 60893909-…  # check it once
    
    • gen now prints the job id on stderr the moment the server accepts it,
      before any waiting begins. This is the robust half: an error path can only
      speak if the process lives long enough to reach it, and in the incident it
      did not. The line is already in the operator's scrollback even if the CLI
      is killed outright or the pipe is torn down.
    • Ctrl-C after submission, and any other post-submission failure, report the
      job id and how to follow it instead of a bare error.
    • A duplicate submission — refused by the API with 409 since NOL-344 — is
      rendered as the job that already exists, restating the API's advice as
      commands a shell can actually run (the server says "check it with
      GET /jobs/{id}", which is true and unusable at a prompt).
    • gen audio refusals go through the RFC 7807 handler like image and
      video already did; they previously surfaced as raw Unexpected Response
      debug dumps. nolgia status likewise no longer dumps a raw response on a
      404.

    New exit code 75 (sysexits EX_TEMPFAIL) means "a job is live; do not
    re-run" and is used for all four cases above. It replaces exit 1 only
    there; every other failure still exits 1 with the same Error: text as
    before. This also makes the situation machine-readable for the first time:
    a 408 was previously indistinguishable from a genuine failure, which is
    why nolgia-agent's CLI backend could not implement the "keep polling"
    contract its SDK backend has always had. Under --json, stdout carries a
    document (job_id, outcome, billed_twice, follow_up) while the human
    block goes to stderr, so a program's stdout stays parseable.

  • --idempotency-key (also NOLGIA_IDEMPOTENCY_KEY). The API's duplicate
    guard fingerprints the request body, so a deliberate second take of an
    identical prompt is refused too; the documented escape hatch is an
    Idempotency-Key header, which the CLI previously had no way to send — the
    header is accepted by the API but is not declared in the OpenAPI spec, so the
    generated client emits no parameter for it. Passing a fresh key runs an
    identical request again on purpose; reusing one collapses a client's own
    retries into a single job.

v0.2.17

Choose a tag to compare

@github-actions github-actions released this 02 Aug 19:46
8422d71
  • The model catalog no longer fails to parse because the API added a value
    this CLI has never heard of.
    Generated response types treated every
    OpenAPI enum as a closed set, so a single unrecognised value failed the
    whole payload:

    unknown variant `3:1`, expected one of `16:9`, `9:16`, `1:1`, …
    

    models list, models get, gen video --cost-only and every capability
    precheck fetch GET /models before doing anything else, so one unknown
    aspect ratio took out jobs that never mentioned an aspect ratio — a startup
    failure rather than a submission failure. This is the third occurrence of
    the same shape (NOL-48, NOL-69, NOL-351); the first two were fixed by
    re-vendoring the spec, which repairs only binaries built afterwards and has
    never prevented the next one.

    Enums the client only ever receives are now generated as plain strings, so
    an unknown value parses and is preserved verbatim — a ratio this build
    cannot offer is still a ratio it can list. Enums the client sends are
    unchanged and still validated client-side, so --aspect-ratio still names
    every accepted value on a miss.

    Behaviour change: nolgia models get <id> prints modality: video rather
    than modality: Video, matching models list and the --json output. JSON
    output is otherwise unchanged — the same wire strings, at the same keys.

v0.2.16

Choose a tag to compare

@github-actions github-actions released this 02 Aug 19:15
2ff4de0
  • --shot no longer submits a contradictory duration_seconds, which was
    400-ing every multi-shot job.
    duration_seconds is declared default: 5
    in the OpenAPI spec — a description of what the server does when the field
    is absent. The generated client materialized that default into a
    non-Option field with no skip_serializing_if, so every request carried
    duration_seconds: 5 whether or not the caller asked for it, and the CLI had
    no way to express "absent" at all. Any job whose --shot durations summed to
    something other than 5 was rejected:

    400 duration_seconds (5) must equal the sum of shot durations (10) — or omit it
    

    That is every multi-shot job at the film pipeline's default 12s batch, so the
    short-film preset — featured on the landing rail — could not run and had
    never once completed. --cost-only was unaffected (it sums the shots
    locally), which is why the defect never surfaced during estimation.

    The client now omits duration_seconds entirely unless the caller passed
    --duration-seconds, letting the server derive the length: the shot sum when
    shots are given, its own 5s default when they are not. Passing
    --duration-seconds alongside --shot is still allowed when it equals the
    shot sum (the API accepts that, and the nolgia-agent film pipeline relies on
    it); a value that contradicts the shots is now refused client-side, naming
    both numbers, before any asset upload or API call happens (NOL-342).

  • nolgia gen image can now request an aspect ratio. gen video has had
    --aspect-ratio all along; gen image had no way to ask for anything but
    the model's native default, and putting "vertical 9:16" in the prompt does
    not work (flux-pro returned 512x512, gpt-image-2 returned 1024x1024). The
    three vertical UGC presets therefore had to generate square and crop in
    ffmpeg, discarding ~44% of the frame, handing the composition to whoever
    wrote the crop, and — on a 512x512 source — yielding a 288x512 image that
    Kling rejects outright with Image pixel is invalid.

    --aspect-ratio maps to the API's aspect_ratio field, whose vocabulary is
    ratios (9:16, 16:9, 1:1, …), not the image_size aliases
    (portrait_16_9). The two are different knobs; the API prefers
    aspect_ratio and validates it per-model, while image_size only expresses
    the 16:9/4:3/1:1 families.

    Bad values fail fast with a useful message instead of a server 400. A value
    outside the enum lists every real ratio and points out the alias confusion; a
    ratio the selected model does not publish is caught before the request is
    sent and lists that model's actual options, taken from image.aspect_ratios
    on GET /models — the same list the API validates against. nolgia models get <model> and models list now show that list, which they previously
    rendered nothing of for image models (NOL-345).

v0.2.15

Choose a tag to compare

@github-actions github-actions released this 02 Aug 03:12
05b8c5a
  • Security: --help no longer prints the values of the environment
    variables it reads.
    clap's default rendering for an env-backed argument
    shows the resolved value of the variable, so on any machine with
    NOLGIA_TOKEN exported, nolgia --help printed the token inline in its
    options block (--token <TOKEN> [env: NOLGIA_TOKEN=...]). Help output is
    the least-guarded text in a system — it lands in terminal scrollback, CI
    logs, agent transcripts, screenshots and bug reports — so this defeated the
    rest of the CLI's secret handling. Both env-backed globals (--token /
    NOLGIA_TOKEN and --api-url / NOLGIA_API_URL) now carry
    hide_env_values: help still names the variable, so the flag stays
    discoverable, but never shows what it holds (NOL-317).

    Two regression guards ship with the fix. A structural test walks the entire
    clap command tree and fails if any env-backed argument — including ones
    added in future, anywhere in the tree — is missing hide_env_values. A
    black-box test renders the real binary's help with both variables set to
    sentinel values and asserts neither value appears.

    Anyone who ran nolgia --help with a real token exported on a released
    build up to and including v0.2.14 should treat that token as disclosed and
    rotate it.

  • Housekeeping: version metadata now matches the tag. The v0.2.13 and
    v0.2.14 tags were cut on trees whose manifests still read 0.2.12, so their
    npm publish step failed the tag/version check and neither crates.io nor npm
    ever received them; the binaries attached to those two GitHub releases also
    self-report 0.2.12. This release carries the correct version in every
    manifest, so it is the first publish since v0.2.12 to reach crates.io and
    npm — and it includes the vendored-spec work that was intended for v0.2.13
    and v0.2.14 (MiniMax models, model-specific image aspect ratios, color
    presets, start_frame_required).

v0.2.14

Choose a tag to compare

@github-actions github-actions released this 31 Jul 10:01
2dfc05c

See CHANGELOG.md for details.

v0.2.13

Choose a tag to compare

@github-actions github-actions released this 31 Jul 09:54
4c11c57

See CHANGELOG.md for details.

v0.2.12

Choose a tag to compare

@github-actions github-actions released this 29 Jul 04:45
2d08d99
  • nolgia assets upload now accepts video and audio, not just images.
    Previously the command only handled png/jpeg/webp via the base64
    POST /assets path, so an agent or preset workflow could never deliver its
    final stitched master — the finished MP4 stayed pod-local while only the
    component clips reached the Library (NOL-109). Video (mp4/mov/webm) and
    audio (mp3/wav/ogg/m4a) now upload through the signed-upload flow
    (POST /assets/uploads → direct PUT to storage → POST /assets/uploads/{id}/complete), so the bytes stream straight to storage
    without the base64 JSON size limit. Images keep their existing base64 path
    unchanged; unknown extensions fail fast with the supported list.

v0.2.11

Choose a tag to compare

@github-actions github-actions released this 27 Jul 17:39
5fab8fa
  • Fix: models list / models get against the live API. nolgia-api#158
    added an image capabilities field to GET /models; released CLIs rejected
    the whole catalog with unknown field 'image' because their vendored spec
    predated it. This release ships the current spec (including the new
    image.aspect_ratios capability surface).
  • Hardening: unknown response fields no longer break the CLI. The
    generated client used to compile additionalProperties: false into
    deny_unknown_fields, so every additive API field broke released binaries.
    Codegen now strips that strictness from response deserialization — future
    additive fields are ignored instead of fatal. Covered by a regression test
    that parses a catalog payload carrying unknown fields at every level.

v0.2.10

Choose a tag to compare

@github-actions github-actions released this 26 Jul 22:59
a0b9f10
  • nolgia color-presets — the built-in color-grade preset looks for
    Studio compositions. list prints the catalog (slug, name, description;
    --json includes the manifest version), and cube <slug> [-o FILE]
    downloads a preset's 33-point .cube LUT (stdout by default, so it pipes
    straight into grading tools). Both endpoints are public — no login needed —
    and unknown slugs surface the server's 404 detail verbatim.
  • Re-vendored the OpenAPI spec with the nolgia-api color-grade contract
    (/color-presets, /color-presets/{slug}/cube, ColorPreset* schemas).

v0.2.9

Choose a tag to compare

@github-actions github-actions released this 15 Jul 15:09
de263e9

See CHANGELOG.md for details.