@sogni-ai/sogni-creative-agent-skill
Version:
Sogni Creative Agent Skill: agent skill and CLI for Sogni AI image, video, and music generation.
221 lines (189 loc) • 12.5 kB
Markdown
# Hosted Sogni Intelligence API Modes
Read this when a request should be planned, multi-step, resumable, or
server-orchestrated: `--api-chat`, `--durable-chat`, `--api-workflow`,
workflow templates, replay records, and the hosted tool surfaces.
All hosted modes require `SOGNI_API_KEY`.
## When to prefer the hosted path
The thing calling this API is usually a frontier LLM that is **more capable
than Sogni's hosted planning model**. So the default split is: *you* do the
planning and tool selection, and the hosted endpoints do what only the server
can — run on the GPU network, persist assets/manifests, orchestrate durable
multi-step runs with replay, and apply Structured Contracts v1 (gating
policies, repair recipes, prompt contracts). Routing a request through
`--api-chat` so a weaker model re-plans it is usually a downgrade; reach for the
hosted *planner* deliberately, not by default.
- **You already know the single tool + args** → direct-to-SDK flags. Lowest
latency/cost, no LLM round-trip.
- **Multi-step, durable, resumable** → `--api-workflow` with an explicit
`--workflow-input` step graph that *you* author (`steps[]` with `toolName`,
`arguments`, and `dependsOn` bindings). The server executes and repairs it
deterministically with replay/resumability and **no hosted-LLM re-planning**.
This is the best fit when a frontier client drives the work.
- **You want the hosted model to own a long loop** → `--api-chat` /
`--durable-chat`. Worth it when offloading a long async tool loop server-side
saves client round-trips, when structured-contract repair should govern, or
when several local files must be uploaded for one turn (only supported here).
```bash
# You author the exact durable plan; the server executes it (no hosted re-planning)
sogni-agent --api-workflow --workflow-input @plan.json
# Storyboard → GPT Image 2 sheet → Seedance, all server-side (preset plan)
sogni-agent --api-workflow storyboard-video --storyboard-frames 6 -Q hq \
"Create a 9:16 bakery launch video with a neon street-window reveal"
# Deliberately hand planning to the hosted model (long async job / multi local-file upload)
sogni-agent --api-chat "Turn the attached product photo into a launch poster" --ref product.jpg
# Durable hosted chat run (persisted event log + SSE stream)
SOGNI_SKILL_USE_SDK_TRANSPORT=1 sogni-agent --durable-chat \
"Create a four-shot launch campaign, generate the key art, and animate the hero clip"
```
The direct-to-SDK flags remain the right call for explicit one-shot generation
when you already know the exact model, dimensions, and prompt — use them
whenever latency or cost rules out an LLM round-trip.
## --api-chat (`POST /v1/chat/completions`)
Text-first natural-language workflows through Sogni API's OpenAI-compatible
loop. The public REST body uses snake_case controls such as `tool_choice`,
`response_format`, `task_profile`, `token_type`, `app_source`,
`media_references`, `chat_template_kwargs`, `sogni_tools`, and
`sogni_tool_execution`. The endpoint normalizes OpenAI `developer` messages to
`system`; when a developer message is present and no explicit `task_profile`
is supplied, the server treats the task as `coding`. The CLI sanitizes
prompt-injection markers before forwarding messages and sends API-key auth so
hosted Sogni tools can execute server-side.
Tune with `--api-tools creative-agent|creative-tools|none`,
`--no-api-tool-execution`, `--llm-model <id>`, `--system <text>`,
`--task-profile general|coding|reasoning`, `--max-tokens <n>`, and
`--thinking` / `--no-thinking` (forwarded as
`chat_template_kwargs.enable_thinking`; hosted Qwen may normalize thinking
server-side, so do not rely on `--no-thinking` as a hard suppression switch).
### Hosted tool surfaces (`sogni_tools`)
- `creative-tools` — the public API default when `sogni_tools` is omitted or
true. Generation/editing tools (`generate_image`, `generate_video`,
`generate_music`, `edit_image`, `apply_style`, `restore_photo`,
`refine_result`, `animate_photo`, `change_angle`, `video_to_video`,
`stitch_video`, `orbit_video`, `dance_montage`, `sound_to_video`,
`extend_video`, `replace_video_segment`, `overlay_video`, `add_subtitles`),
media-analysis tools (`analyze_image`, `analyze_video`, `extract_metadata`),
and lightweight composition tools (`enhance_prompt`, `compose_lyrics`,
`compose_instrumental`, `compose_script`).
- `creative-agent` — this CLI's default for `--api-chat`. Includes
`creative-tools` plus session-control tools (`ask_clarifying_question`,
`finalize_response`), asset-manifest tools (`create_asset_manifest`,
`inspect_asset`, `label_asset`, `map_assets_for_model`,
`validate_asset_references`), and durable planning tools
(`compose_workflow`, `compose_workflow_template`). Use this surface when the
model should design one-shot workflow plans, draft savable workflow
templates, or maintain stable asset references across a multi-step turn.
- `none` — disables Sogni tool injection, leaving only caller-supplied OpenAI
tools on raw API/SDK requests. In the CLI, combine with
`--no-api-tool-execution` for text-only planning.
## --durable-chat (`POST /v1/chat/runs`)
Long-running, LLM-in-the-loop turns persisted as chat-run records instead of a
single completion request. Chat runs keep an event log, stream via
`/v1/chat/runs/:id/events/stream`, support cancellation, and can pause for
persisted cost approval (`/v1/chat/runs/:id/confirm-cost`) in first-party
clients. Requires `SOGNI_SKILL_USE_SDK_TRANSPORT=1`. The CLI streams assistant
deltas plus de-duplicated per-job progress / ETA / result lines from hosted
run events. The SDK exposes `sogni.chat.runs.{create, get, cancel,
streamEvents}`.
## --api-workflow (`POST /v1/creative-agent/workflows`)
Durable, async workflow records with event streaming and cancellation. The
API accepts either an inline durable plan (`input.steps`) or a saved workflow
template invocation (`workflow_id` plus `inputs`) and rejects requests that
provide both. The CLI's generated-keyframe and `storyboard-video` presets
submit inline `input.steps`; `--workflow-input <json|@path>` supplies the
`input` object directly (use `@path` to load from a file).
- Saved template CRUD lives at `/v1/creative-agent/workflows/templates`; run a
saved template later with `workflow_id + inputs`. Draft savable templates
with `compose_workflow_template` through `--api-chat` — the caller persists
the returned `template_draft`.
- Exact multi-step plans should use explicit step dependencies, including
`replace_video_segment` steps with bounded `replacementStartSeconds` /
`replacementEndSeconds` when interleaving existing video slices. Workflow
JSON can bind request media into step arguments with
`sourceStepId: "$input_media"`.
- `--api-workflow storyboard-video` generates a storyline, creates one GPT
Image 2 storyboard sheet, then feeds that artifact into Seedance as the
video reference. `-Q fast|hq|pro` maps to GPT Image 2 low|medium|high
quality for the storyboard sheet.
- Cost controls: `--workflow-max-cost <n>` rejects workflow starts above a
capacity-unit ceiling; `--confirm-cost` / `--no-confirm-cost` forward
explicit billing confirmation. Use `--workflow-idempotency-key <key>` when
retrying a start request.
- Manage runs with `--watch-workflow`, `--list-workflows`,
`--get-workflow <id>`, `--workflow-events <id>`, `--stream-workflow <id>`,
`--cancel-workflow <id>`, `--resume-workflow <id>`. In `--json` mode, SSE
progress frames stream to stderr so stdout stays a single JSON object.
```bash
# Durable workflow with a media reference and a cost ceiling
sogni-agent --api-workflow --ref https://cdn.example.com/sketch.png \
--workflow-max-cost 25 --confirm-cost \
--video-prompt "The camera slowly pushes in as the sketch comes alive" \
"Animate the referenced sketch"
# Exact durable workflow input
sogni-agent --api-workflow --workflow-input @workflow.json \
--workflow-idempotency-key product-teaser-v1
```
## Media references in hosted modes
Hosted API requests forward media references from `-c`, `--ref`, `--ref-end`,
`--ref-audio`, `--reference-audio-identity`, and `--ref-video` as
`media_references` metadata. `--ref-audio` and `--ref-video` are repeatable in
api-chat / durable-chat mode — each entry uploads independently and is exposed
to the hosted LLM as `@Audio1` / `@Audio2` / `@Video1` etc. API chat also
attaches image refs as vision inputs. Local file references are uploaded to
Sogni media storage first, then forwarded as retrievable URLs so durable
executors do not depend on `data:` URI support. **Use direct CLI mode for
private media that must not leave the local machine.**
## Seedance reference modes (mutually exclusive)
When `--video -m seedance2` or `-m seedance2-fast` is selected, pick one mode
per video request:
- **Dedicated frame mode — `--ref` and/or `--ref-end`.** First-class
first-frame / last-frame anchoring; the Seedance worker pins them as
parameter-mode firstFrame / lastFrame. Max 2 images.
- **Loose reference mode — `-c/--context` plus optional `--ref-audio` and
`--ref-video` extras.** Anchor frame intent in the prompt with `@Image1` /
`@Video1` / `@Audio1` etc. (e.g. *"Use @Image1 as the opening shot
reference"*). Each `-c/--context` image may be a **local file or an HTTPS
URL** (PNG, JPEG, WebP, or GIF) — local files are uploaded to Sogni media
storage automatically, so you do **not** need `--api-chat` / `--durable-chat`
just to attach a local loose-reference image. Supports up to 9 image refs, 3 video refs, 3 audio
refs, and 12 total reference assets per request (canonical caps come from
`SEEDANCE_REFERENCE_LIMITS` / `validateSeedanceReferenceCounts()` in
`@sogni-ai/sogni-intelligence-client/tools`).
Combining `--ref` / `--ref-end` with `-c/--context` on Seedance is rejected
client-side with an error pointing at the correct mode. In CLI direct-gen mode,
local `-c/--context` images and the primary `--ref-audio` / `--ref-video` are
uploaded to Sogni media storage automatically and forwarded as HTTPS URLs; only
*additional* `--ref-audio` / `--ref-video` entries beyond the first must already
be HTTPS URLs (use `--api-chat` / `--durable-chat` when you need to attach
several local audio or video files in one request). Seedance accepts public
HTTPS image, video, and audio references that pass the CLI URL safety checks;
localhost and private-network URLs are rejected before forwarding. Audio
references must be paired with an image or video reference.
## Models, replays, and contract debugging
- `--list-api-models` / `--get-api-model <id>` inspect `/v1/models`.
- `--list-replays [n]`, `--get-replay <id>`, `--ingest-replay <json|@path>`
manage `/v1/replay/records` RunRecords for replay/debug viewers. List/get
output is run through `redactRunRecord` before printing, so signed URLs,
bearer tokens, JWTs, and PEM blocks cannot leak via the CLI.
`--skip-redact` / `--no-redact` bypass redaction (debug-only).
- `--turn-classify`, `--compile-tools`, `--dispatch-tool <name>` (+
`--tool-args <json>`) print the public-skill Structured Contracts v1
verdicts (turn policy, compiled tool surface, dispatch verdict) the default
contract runtime would produce.
- `--storyboard-plan` builds a storyboard project locally
(`buildStoryboardProject` + `compileForModel`) and prints the plan as JSON
without network calls. It expects scene-structured prompt input
(`SCENE NN - Title` / `VISUAL:` / `ACTION:` / `CAMERA:` / `AUDIO/SFX:`
blocks) — for casual prompts use `--api-workflow storyboard-video`, which
runs an LLM storyline expansion first. Pair with
`--storyboard-plan-frames`, `--storyboard-plan-model` (seedance, seedance2,
gpt-image-2, ltx23, wan), `--storyboard-plan-stage` (storyboard_image,
scene_clip).
## Endpoint safety
Override the API origin with `--api-base-url`, `SOGNI_API_BASE_URL`, or
`SOGNI_REST_ENDPOINT`. Hosted API credentials are only sent to
`https://api.sogni.ai` by default. Add trusted custom hosts with
`SOGNI_API_ALLOWED_HOSTS`; loopback or non-HTTPS local testing requires
`SOGNI_ALLOW_UNSAFE_API_BASE_URL=1`. With `SOGNI_SKILL_USE_SDK_TRANSPORT=1`,
hosted workflow + chat operations route through the SDK transport; the skill's
`sogni-hosted-client.mjs` factory still validates `restEndpoint` /
`socketEndpoint` against the SSRF guard before constructing the SDK client.