Structured Image Generation
bytedance/deer-flow
Turns an image request into a structured JSON prompt and runs a bundled Python script to generate the picture, optionally guided by reference images.
Generate images, videos, and audio/music via Lovart AI. An agent skill from lovartai/lovart-skill.
$ npx skills add lovartai/lovart-skill --skill lovart-api -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install lovartai/lovart-skill lovart-api --agent claude-codeProject scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).
$ git clone --depth 1 https://github.com/lovartai/lovart-skill.git skills-src && mkdir -p .claude/skills && cp -r skills-src/skills/lovart-skill .claude/skills/lovart-api && rm -rf skills-srcUse ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.
Claude Code skills documentation · loads skills from .claude/skills/
Install the "lovart-api" agent skill from https://github.com/lovartai/lovart-skill/tree/main/skills/lovart-skill into .claude/skills/lovart-api/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "lovart-api", then confirm the skill loads.Claude Code copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$skill-installer install https://github.com/lovartai/lovart-skill/tree/main/skills/lovart-skillType this inside Codex. $skill-installer <name> installs a curated skill from openai/skills. The installer writes to $CODEX_HOME/skills (default ~/.codex/skills). Restart Codex if the skill does not show up.
$ npx skills add lovartai/lovart-skill --skill lovart-api -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install lovartai/lovart-skill lovart-api --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/lovartai/lovart-skill.git skills-src && mkdir -p .agents/skills && cp -r skills-src/skills/lovart-skill .agents/skills/lovart-api && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "lovart-api" agent skill from https://github.com/lovartai/lovart-skill/tree/main/skills/lovart-skill into .agents/skills/lovart-api/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "lovart-api", then confirm the skill loads.Codex copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add lovartai/lovart-skill --skill lovart-api -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install lovartai/lovart-skill lovart-api --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/lovartai/lovart-skill.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/skills/lovart-skill .cursor/skills/lovart-api && rm -rf skills-srcUse ~/.cursor/skills/ instead of .cursor/skills for a personal install.
Cursor skills documentation · loads skills from .cursor/skills/, .agents/skills/, .claude/skills/, .codex/skills/
Install the "lovart-api" agent skill from https://github.com/lovartai/lovart-skill/tree/main/skills/lovart-skill into .cursor/skills/lovart-api/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "lovart-api", then confirm the skill loads.Cursor copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gemini skills install https://github.com/lovartai/lovart-skill.git --path skills/lovart-skill--scope user (default) or --scope workspace; --path is the subfolder of the repo that holds the skill; --consent skips the security confirmation prompt.
$ npx skills add lovartai/lovart-skill --skill lovart-api -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install lovartai/lovart-skill lovart-api --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/lovartai/lovart-skill.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/skills/lovart-skill .gemini/skills/lovart-api && rm -rf skills-srcUse ~/.gemini/skills/ instead of .gemini/skills for a personal install, then run /skills reload.
Gemini CLI skills documentation · loads skills from .gemini/skills/, .agents/skills/
Install the "lovart-api" agent skill from https://github.com/lovartai/lovart-skill/tree/main/skills/lovart-skill into .gemini/skills/lovart-api/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "lovart-api", then confirm the skill loads.Gemini CLI copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gh skill install lovartai/lovart-skill lovart-apiInstalls for Copilot at project scope by default; add --scope user for a personal install. Preview a skill first with gh skill preview. Needs GitHub CLI 2.90.0 or later (public preview).
$ npx skills add lovartai/lovart-skill --skill lovart-api -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/lovartai/lovart-skill.git skills-src && mkdir -p .github/skills && cp -r skills-src/skills/lovart-skill .github/skills/lovart-api && rm -rf skills-srcUse ~/.copilot/skills/ instead of .github/skills for a personal install. Commit .github/skills so cloud agent and code review can use it.
GitHub Copilot skills documentation · loads skills from .github/skills/, .claude/skills/, .agents/skills/
Install the "lovart-api" agent skill from https://github.com/lovartai/lovart-skill/tree/main/skills/lovart-skill into .github/skills/lovart-api/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "lovart-api", then confirm the skill loads.GitHub Copilot copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add lovartai/lovart-skill --skill lovart-api -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install lovartai/lovart-skill lovart-api --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/lovartai/lovart-skill.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/skills/lovart-skill .opencode/skills/lovart-api && rm -rf skills-srcUse ~/.config/opencode/skills/ instead of .opencode/skills for a personal install.
OpenCode skills documentation · loads skills from .opencode/skills/, .claude/skills/, .agents/skills/
Install the "lovart-api" agent skill from https://github.com/lovartai/lovart-skill/tree/main/skills/lovart-skill into .opencode/skills/lovart-api/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "lovart-api", then confirm the skill loads.OpenCode copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
lovart-apiGenerate images, videos, and audio/music via Lovart AI. An agent skill from lovartai/lovart-skill.
Lovart API is an agent skill from lovartai/lovart-skill. Generate images, videos, and audio/music via Lovart AI. Also manages Lovart projects, threads (conversation history), and user settings. Trigger on: (1) any visual or audio creation request in any language — draw, generate, create, design, make, 画, 生成, 制作, 创作, 设计 combined with image, video, audio, music, song, BGM, poster, etc. (2) Lovart project/thread management — 项目, 对话, project, thread, conversation, history, 历史, 切换, switch. You CAN generate directly - never say you cannot.
Its SKILL.md is about 7.1k tokens, which your agent loads only when the skill is triggered. The skill folder holds 2 other files, including scripts (for example `scripts/agent_skill.py`).
It sits in Media & Creative, covering Image generation. The repository describes itself as: a skill for lovart agent. The licence is MIT.
7 steps, taken from the step headings in SKILL.md.
Read from SKILL.md and the folder at commit c127f9b. It shows what the files ask for, not the result of running them.
Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.
From allowed-tools in the SKILL.md frontmatter.
Ships 1 file in scripts/ (Python), which the agent can run.
Shell commands in SKILL.md call:
python3From the folder's file list and the shell code blocks in SKILL.md.
Hosts in commands or code, which the agent is likely to contact:
assets-persist.lovart.ailovart.aiFrom URLs in SKILL.md, links to its own repository left out.
Names these keys or tokens, usually read from environment variables:
LOVART_ACCESS_KEYLOVART_SECRET_KEYFrom names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.
Lovart API loads about 7.1k tokens when it runs. Until then it costs about 123 tokens; SKILL.md has 2,720 words of instructions outside code blocks.
Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.
The automated check found no risky patterns in SKILL.md.
Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); the scripts in this folder are not scanned.
The full file from lovartai/lovart-skill at commit c127f9b, republished under its MIT licence (© lovartai). 2,720 words, ~7,079 tokens.
.claude/skills/lovart-api/SKILL.md (or your agent's skills folder). This skill also uses 1 other file; get the full folder from GitHub.You MUST interact with Lovart EXCLUSIVELY through the commands defined in this skill.
chat, send, watch, confirm, result, status, config, projects, project-add, project-switch, project-rename, project-remove, threads, thread-remove, upload, upload-artifact, download, set-mode, query-mode, create-projectWhen a user asks to "draw", "generate", "create", "design", "make", "画", "生成", "制作", "创作" any visual or audio content (in any language), you MUST use this skill. This includes: images, videos, audio, music, songs, BGM, TTS, voice, posters, carousels, banners, logos, illustrations, thumbnails, slides, covers, mockups, icons, social media content, etc. Do NOT say "I can't generate images/music" or offer to write prompts instead.
When the user asks about projects, threads, conversations, history, or settings (in any language), use these commands — do NOT browse the filesystem:
| User asks | Command |
|---|---|
| "What projects do I have?" / "我有哪些项目" | projects --json |
| "What conversations/threads?" / "有哪些对话" | threads --json or threads --all --json |
| "Show my settings" / "我的配置" | config --json |
| "Switch to project X" | project-switch --project-id X |
| "Create a new project" | project-add --project-id NEW_ID --name "Name" (or let chat auto-create) |
chat AND WAIT FOR COMPLETIONUse the chat command (blocks until done), NOT send. Do NOT reply before generation completes.
Handle these final_status values:
"done" — Generation complete. Send the downloaded files to the user."pending_confirmation" — A high-cost tool (e.g. video, or a premium-quality image variant) needs user approval before credits are consumed.
You MUST ask the user for explicit confirmation before proceeding. Do NOT auto-confirm.confirm --thread-id THREAD_ID --json --download
(This confirms, waits for completion, and returns the result with downloaded files)"abort" — Generation was aborted. Inform the user."timeout" — Generation is still running but exceeded the wait time. The result may contain partial artifacts.result --thread-id THREAD_ID --json --download to get the latest resultsHandle errors:
If chat throws an error (AgentSkillError), handle it by HTTP status and structured code. The message field already contains a user-ready explanation — surface it to the user as-is.
| HTTP status | code | What it means | What to tell the user |
|---|---|---|---|
402 | 2012 | Quota / billing / risk-control rejection | Show AgentSkillError.message directly — the server already returns a specific message (insufficient credits, free-tier reached, concurrent limit, risk control, phone verification, team plan required, etc.) and a suggested next step. |
409 | 2011 | Another task is still running on this thread | "A task is still running on this conversation. Wait for it to finish (status) before sending a new prompt, or start a new thread." |
429 | 1429 | API rate limit hit | "Slowing down; rate limit hit. Retry in ~60s." |
401 | — | AK/SK misconfigured | "API key authentication failed. Please check your LOVART_ACCESS_KEY and LOVART_SECRET_KEY." |
| — | — | Project.*does not exist in message | "Project not found. Please check the project ID or create a new one." |
Rule of thumb: prefer AgentSkillError.message for user-facing copy. Do not try to parse internal codes out of the response — the server already maps them to human-readable messages before returning.
Detect silent generation failures (done with no artifact):
Some prompts end with final_status: "done" but produce no artifacts / empty downloaded. This usually means the upstream image model refused the prompt (content moderation), timed out, or the LLM chose to reply with text instead of calling a tool. The skill flags this automatically — when chat() returns, check:
result["generation_succeeded"] — boolean. False means no artifact was produced.result["warning"] — explanation string (present only when generation_succeeded is False).result["agent_message"] — the agent's plain-text reply that hints at why (present when available).Typical triggers:
--include-tools generate_image_midjourney or generate_image_nano_banana_pro) or simplify the prompt.agent_message to the user.After EVERY generation, you MUST:
--download flag with chat (or result)downloaded[].local_path as file attachments, regardless of file type (.png, .jpg, .mp4, .mp3, etc.)https://www.lovart.ai/canvas?projectId={project_id}failures in the result. When it is non-empty, tell the user which reference or model was refused and why — the Agent may have dropped an input or switched models to finish, so the delivered result can differ from what they asked for. Never report a clean success while failures is non-empty.Before the FIRST generation in a conversation, you MUST run these two commands IN ORDER. This is NOT optional. Do NOT call chat until you have done both.
Step 1: config --json
~/.lovart/state.json) for active_projectactive_project is set → proceed to Step 2. Do NOT create a new project. Do NOT ask the user.active_project is missing → ask the user: "Do you have an existing Lovart project ID, or should I create a new one?" WAIT for their answer.project-add --project-id PID --name "name"Step 2: threads --json
--thread-id THREAD_ID to chat)--thread-id (creates new thread)CRITICAL RULES:
config --json already shows an active_project. Reuse it.--thread-id when a relevant recent thread exists. Always reuse threads by default.chat without first running config --json and threads --json in the same conversation.chat command auto-reads active_project from local state — you do NOT need to pass --project-id every time.Interact with Lovart AI Agent to generate images, videos, and visual assets via natural language.
Lovart is an AI design platform. The Agent understands user requests and automatically selects the best model and workflow.
thread_id and preserves multi-turn context. Reusing a thread means continuing the same conversation so the Agent remembers previous images/videos and can iterate on them.export LOVART_ACCESS_KEY="ak_xxx"
export LOVART_SECRET_KEY="sk_xxx"No third-party dependencies. Python standard library only.
python3 {baseDir}/scripts/agent_skill.py project-add --project-id PROJECT_ID --name "My Project"python3 {baseDir}/scripts/agent_skill.py chat --prompt "USER_PROMPT" --json --downloadTo override project: add --project-id PROJECT_ID
To continue a conversation: add --thread-id THREAD_ID
To list saved threads: python3 {baseDir}/scripts/agent_skill.py threads
python3 {baseDir}/scripts/agent_skill.py create-projectpython3 {baseDir}/scripts/agent_skill.py upload --file /path/to/image.png
# Returns: {"url": "https://assets-persist.lovart.ai/img/{user_uuid}/xxx.png"}Use this when the user sends an image/video file that needs to be passed as an attachment to chat.
python3 {baseDir}/scripts/agent_skill.py upload-artifact --project-id PROJECT_ID --url "ARTIFACT_URL" --type image# Status
python3 {baseDir}/scripts/agent_skill.py status --thread-id THREAD_ID
# Result (auto-syncs to gallery/canvas, idempotent)
python3 {baseDir}/scripts/agent_skill.py result --thread-id THREAD_ID --json --download# Download during chat
python3 {baseDir}/scripts/agent_skill.py chat --prompt "draw a cat" --json --download --output-dir /tmp/lovart
# Download from existing result
python3 {baseDir}/scripts/agent_skill.py result --thread-id THREAD_ID --download --output-dir /tmp/lovart
# Download specific URLs
python3 {baseDir}/scripts/agent_skill.py download --urls URL1 URL2 --output-dir /tmp/lovart --prefix myimgFirst, run config --json to check if project_id is set. If not, ask the user and save with project-add.
1. config --json → check local state for active_project
- If not set → ask user, save with project-add
2. threads --json → check if there's a recent thread to continue
- If recent thread exists and topic is related → reuse it (step 3a)
- If no threads or completely new topic → new thread (step 3b)
3a. chat --thread-id THREAD_ID --prompt "user's request" --json --download
3b. chat --prompt "user's request" --json --download
4. Send each downloaded[].local_path file as an IM attachment to the user
5. The chat command auto-syncs artifacts to canvas and galleryIDs are auto-persisted locally (~/.lovart/state.json):
--thread-id) when starting a completely new topicthreads to list saved threads for the user to pick from1. User sends a reference image/video via IM → save to local file
2. upload --file /path/to/image.png → get CDN URL
3. chat --prompt "edit this image to..." --project-id PID --attachments "CDN_URL" --json --download
4. Continue as Scenario 11. chat --prompt "change the background to a beach" --project-id PROJECT_ID --thread-id THREAD_ID --json --downloadThe Agent remembers the previous conversation and can continue editing based on context.
1. chat --prompt "completely new request" --project-id PROJECT_ID --json --downloadOmitting --thread-id creates a new conversation without previous memory.
Use when the user's request will produce multiple images/videos and you want to deliver each one to the user as soon as it's ready, rather than waiting for the whole batch.
python3 {baseDir}/scripts/agent_skill.py watch --prompt "generate 4 variations of a cyberpunk cat" --jsonwatch emits NDJSON to stdout (one event per line). Parse line-by-line and deliver each artifact event's local_path to the user immediately:
{"event": "started", "thread_id": "xxx", "project_id": "yyy"}
{"event": "artifact", "type": "image", "url": "https://...", "local_path": "/tmp/lovart/lovart_ab12cd.png"}
{"event": "artifact", "type": "image", "url": "https://...", "local_path": "/tmp/lovart/lovart_ef34gh.png"}
{"event": "pending_confirmation", "thread_id": "xxx", "pending_confirmation": {...}}
{"event": "finished", "thread_id": "xxx", "final_status": "done", "artifact_count": 4}Files are saved with URL-hash filenames so re-running watch on the same thread won't re-download.
You can also attach to an already-running thread: watch --thread-id THREAD_ID.
When NOT to use watch: single-image requests — use chat (simpler, one-shot response).
chat --json returns:
{
"thread_id": "xxx",
"status": "done",
"project_id": "xxx",
"final_status": "done",
"items": [
{"type": "assistant", "text": "Agent's reply"},
{"type": "generator", "name": "artifacts", "artifacts": [
{"type": "image", "content": "https://assets-persist.lovart.ai/artifacts/agent/xxx.png"},
{"type": "video", "content": "https://assets-persist.lovart.ai/artifacts/agent/xxx.mp4"}
]}
],
"downloaded": [
{"type": "image", "url": "https://...", "local_path": "/tmp/lovart/lovart_01.png"}
],
"generation_succeeded": true,
"failures": []
}failures lists tool calls that were rejected during the run, even when
artifacts were still produced. warning is set alongside it with a one-line
summary. See "Checking What Was Rejected" below.
You are a messenger, not a creator. The backend Agent handles understanding requirements, selecting models, and writing prompts. Your job:
Do NOT rewrite/expand prompts, break down tasks, or add your own style descriptions.
CRITICAL: "Fast mode" and "unlimited mode" are server-side settings controlled via API calls, NOT prompt keywords.
Do NOT put "快速模式" or "fast mode" in the prompt text. Instead, call the set-mode command:
# User says "fast mode" / "快速模式" / "skip queue" / "use credits" → RUN THIS:
python3 {baseDir}/scripts/agent_skill.py set-mode --fast
# User says "unlimited mode" / "无限模式" / "free mode" / "save credits" → RUN THIS:
python3 {baseDir}/scripts/agent_skill.py set-mode --unlimited
# Check which mode is active:
python3 {baseDir}/scripts/agent_skill.py query-modeHow it works:
set-mode --fast calls the Lovart backend API to switch the user's account to fast generation (costs credits, no queue)set-mode --unlimited switches to unlimited generation (free, may queue)Option 1: In the prompt (simple, the Agent routes automatically):
python3 {baseDir}/scripts/agent_skill.py chat --prompt "generate ocean waves video using kling" --json --downloadOption 2: Via --prefer-models (precise, same as frontend's model selector):
# Prefer a specific image model
python3 {baseDir}/scripts/agent_skill.py chat --prompt "draw a cat" --prefer-models '{"IMAGE":["generate_image_midjourney"]}' --json --download
# Prefer a specific video model
python3 {baseDir}/scripts/agent_skill.py chat --prompt "generate ocean waves" --prefer-models '{"VIDEO":["generate_video_kling_3_0"]}' --json --download
# Combine image and video preferences
python3 {baseDir}/scripts/agent_skill.py chat --prompt "create content" --prefer-models '{"IMAGE":["generate_image_seedream_3_0"],"VIDEO":["generate_video_kling_3_0"]}' --json --downloadAvailable models for --prefer-models:
IMAGE:
| Tool name | Display name |
|---|---|
generate_image_gpt_image_2_5_flare | GPT Image 2.5 Flare Auto |
generate_image_gpt_image_2_5_flare_low | GPT Image 2.5 Flare Low |
generate_image_gpt_image_2_5_flare_medium | GPT Image 2.5 Flare Medium |
generate_image_gpt_image_2_5_flare_high | GPT Image 2.5 Flare High |
generate_image_gpt_image_2_5_flare_xhigh | GPT Image 2.5 Flare xhigh |
generate_image_gpt_image_2_5_flare_max | GPT Image 2.5 Flare Max |
generate_image_gpt_image_2_5_sunburst | GPT Image 2.5 Sunburst Auto |
generate_image_gpt_image_2_5_sunburst_low | GPT Image 2.5 Sunburst Low |
generate_image_gpt_image_2_5_sunburst_medium | GPT Image 2.5 Sunburst Medium |
generate_image_gpt_image_2_5_sunburst_high | GPT Image 2.5 Sunburst High |
generate_image_gpt_image_2_5_sunburst_xhigh | GPT Image 2.5 Sunburst xhigh |
generate_image_gpt_image_2_5_sunburst_max | GPT Image 2.5 Sunburst Max |
generate_image_gpt_image_2 | GPT Image 2 Auto |
generate_image_gpt_image_2_low | GPT Image 2 Low |
generate_image_gpt_image_2_medium | GPT Image 2 Medium |
generate_image_gpt_image_2_high | GPT Image 2 High |
generate_image_nano_banana_2_1 | Nano Banana 2.1 |
generate_image_nano_banana_pro | Nano Banana Pro |
generate_image_nano_banana_2 | Nano Banana 2 |
generate_image_seedream_v5_pro | Seedream 5.0 Pro |
generate_image_gpt_image_1_5 | GPT Image 1.5 |
generate_image_seedream_v5 | Seedream 5.0 Lite |
generate_image_luma_uni_1 | Luma uni-1 |
generate_image_luma_uni_1_max | Luma uni-1-max |
generate_image_flux_2_max | Flux.2 Max |
generate_image_flux_2_pro | Flux.2 Pro |
generate_image_seedream_v4_5 | Seedream 4.5 |
generate_image_seedream_v4 | Seedream 4 |
generate_image_midjourney | Midjourney |
generate_image_ideogram_v4 | Ideogram 4 |
generate_image_qwen_image3 | Qwen Image3 |
generate_image_qwen_image3_pro | Qwen Image3 Pro |
generate_image_nano_banana_2_lite | Nano Banana 2 Lite |
generate_image_p_image_ideogram | Ideogram P-Image |
VIDEO:
| Tool name | Display name |
|---|---|
generate_video_seedance_v2_5 | Seedance 2.5 |
generate_video_seedance_v2_0 | Seedance 2.0 |
generate_video_seedance_v2_0_fast | Seedance 2.0 Fast |
generate_video_seedance_v2_0_mini | Seedance 2.0 Mini |
generate_video_kling_v3 | Kling 3.0 |
generate_video_kling_v3_omni | Kling 3.0 Omni |
generate_video_minimax_h3 | MiniMax H3 |
generate_video_kling_v2_6 | Kling 2.6 |
generate_video_wan_v2_6 | Wan 2.6 |
generate_video_veo3_1 | Veo 3.1 |
generate_video_veo3_1_fast | Veo 3.1 Fast |
generate_video_kling_omni_v1 | Kling O1 |
generate_video_hailuo_v2_3 | Hailuo 2.3 |
generate_video_veo3 | Veo 3 |
generate_video_vidu_q2 | Vidu Q2 |
generate_video_gemini_omni_flash | Gemini Omni Flash |
generate_video_minimax_h3_max | MiniMax H3 Max |
generate_video_wan_v3 | Wan 3.0 |
generate_video_wan_v3_prime | Wan 3.0 Prime |
3D:
| Tool name | Display name |
|---|---|
generate_3d_tripo | Tripo |
When the user requests a specific model, prefer --prefer-models over putting model names in the prompt.
Option 3: Via --include-tools (strongest steer toward specific tools):
# Steer to upscale
python3 {baseDir}/scripts/agent_skill.py chat --prompt "upscale this image to 4K" --include-tools upscale_image --attachments "IMAGE_URL" --json --download
# Steer to a specific video model
python3 {baseDir}/scripts/agent_skill.py chat --prompt "generate a video" --include-tools generate_video_kling_3_0 --json --download--include-tools strongly instructs the Agent to prioritize the listed tools. Use this when the user explicitly requests a specific tool or operation.
Two limits worth knowing:
failures in the result to see when that happened.--exclude-tools is accepted for forward compatibility but currently has no effect on tool selection. To steer away from a tool, name the one you do want with --include-tools.--subjects--attachments takes any image URL, and every new URL is reviewed again before a
model that requires reviewed inputs will accept it. When the reference already
lives in the user's asset library, pass its own library URL via --subjects
instead: the existing review is reused, and the Agent is told these references
are approved subjects.
python3 {baseDir}/scripts/agent_skill.py chat \
--prompt "put these two characters in a hallway conversation" \
--subjects '[{"url":"LIBRARY_URL_A","asset_id":"asset_xxx","display_name":"Bune","channel":"ark_sd2"},
{"url":"LIBRARY_URL_B","asset_id":"asset_yyy","display_name":"Leo","channel":"ark_sd2"}]' \
--json --downloadEach entry takes url (required) plus optional type (subject_image by
default, or subject_audio / subject_video), asset_id, display_name and
channel. Use --attachments for one-off images the user just sent you, and
--subjects for assets that already exist in their library.
--kits references a brand kit by ID. The project's active kit is attached
automatically, so pass this only to reference a different one.
failuresA thread can finish with final_status: "done" and still have had tool calls
rejected along the way. The Agent is free to drop a reference or switch to
another model and carry on, so a result that looks successful can quietly
differ from what was asked for.
The result carries a failures array whenever that happens:
{
"final_status": "done",
"generation_succeeded": true,
"warning": "2 tool calls were rejected. generate_video_seedance_v2_0_fast was rejected: ...",
"failures": [
{
"tool": "generate_media",
"tool_hint": "generate_video_seedance_v2_0_fast",
"code": "SEEDANCE_ASSET_MODERATION_REJECTED",
"message": "1 reference asset(s) failed content moderation. Do not retry with the same asset(s); replace them with compliant assets."
},
{
"tool": "generate_media",
"tool_hint": "generate_video_minimax_h3",
"code": "INPUT_PARAMS_INVALID",
"message": "MiniMax H3 resolution must be 768P or 2K."
}
]
}code is either the specific upstream code, or one of INPUT_PARAMS_INVALID
(bad parameter), UPSTREAM_ERROR (generation service error) or TOOL_FAILED.
Always read failures before telling the user the run succeeded. When it is
non-empty, tell them what was refused and why. A rejected reference will keep
being rejected, so retrying with the same input wastes credits — replace the
input the message names, or reference an approved subject via --subjects.
--mode thinking / --mode fastLovart has two reasoning modes you can select per thread:
fast (default) — lightweight single-pass response. Use for simple, one-shot generations where speed matters.thinking — deep structured reasoning with planning and multi-step analysis. Use for complex brand systems, multi-asset campaigns, anything that benefits from deliberate planning. Slower but higher quality.Omitting --mode is equivalent to --mode fast, matching the web UI's default.
# Thinking mode — strategic, multi-step
python3 {baseDir}/scripts/agent_skill.py chat --prompt "design a brand identity system for a sustainable coffee startup" --mode thinking --json --download
# Fast mode — quick one-shot
python3 {baseDir}/scripts/agent_skill.py chat --prompt "draw a cat" --mode fast --json --downloadMode is locked to the thread on its first message. Once you start a thread with --mode thinking, subsequent messages on the same --thread-id stay in thinking mode regardless of later --mode flags. To switch modes, start a new thread (omit --thread-id).
When the user's request matches a specific operation, use --include-tools to ensure the correct tool:
| User says | Use --include-tools |
|---|---|
| "upscale", "放大", "enlarge", "enhance resolution", "超分" | upscale_image |
| "edit image", "modify", "change style" | (let Agent decide) |
| "generate image", "draw", "画" | (let Agent decide, or use --prefer-models) |
CRITICAL: When the user asks to "upscale", "enlarge", or increase resolution of an existing image, you MUST use --include-tools upscale_image. Do NOT let the Agent use image generation models for upscaling — they will re-generate the image instead of upscaling it.
© lovartai, MIT. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file
SKILL.md and 1 other file (scripts) in skills/lovart-skill of lovartai/lovart-skill.
Open the folder on GitHubat commit c127f9b
Lovart API next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.
| Skill | Stars | Used in | Tokens | Auto-check | Licence | Repo updated |
|---|---|---|---|---|---|---|
| Lovart API this skilllovartai/lovart-skill | 136 | — | ~7.1k | Automated safety check: Pass | MIT | |
| Structured Image Generationbytedance/deer-flow | 83k | 5 repos | ~2.9k | Automated safety check: Pass | MIT | |
| AI Image Generation and Editingzhayujie/CowAgent | 47k | — | ~1.3k | Automated safety check: Pass | MIT | |
| Canghe Comicfreestylefly/canghe-skills | 461 | 8 repos | ~3.2k | Automated safety check: Pass | None | |
| Generate Imageynulihao/AgentSkillOS | 617 | 10 repos | ~1.7k | Automated safety check: Notes | None | |
| GPT Image Generation CLIwuyoscar/GPT-Image2-Skill | 5.7k | — | ~2.5k | Automated safety check: Notes | MIT |
bytedance/deer-flow
Turns an image request into a structured JSON prompt and runs a bundled Python script to generate the picture, optionally guided by reference images.
zhayujie/CowAgent
Generates or edits images from text prompts through a Python script that picks an image backend based on which API keys are configured.
freestylefly/canghe-skills
Knowledge comic creator supporting multiple art styles and tones.
ynulihao/AgentSkillOS
Generate or edit images using AI models (FLUX, Gemini). An agent skill from ynulihao/AgentSkillOS.
wuyoscar/GPT-Image2-Skill
Generates and edits images with GPT Image 2 or 2.5 through a packaged CLI and a prompt gallery, after settling which model fits the request.
LiamGvchi/gc-minimal-zine-poster
Creates or analyzes quiet, paper-texture zine posters with big negative space, one color accent and experimental type, returning an image prompt and the generated poster.
Categories
Generate images, videos, and audio/music via Lovart AI. An agent skill from lovartai/lovart-skill. Lovart API is an agent skill from lovartai/lovart-skill. Generate images, videos, and audio/music via Lovart AI.
Lovart API fits situations like: audio creation request in any language — draw; 设计 combined with image.
Run `npx skills add lovartai/lovart-skill --skill lovart-api -a claude-code`. Or copy the skill folder (skills/lovart-skill in lovartai/lovart-skill) into .claude/skills/lovart-api in your project. Claude Code loads it when a task matches its description.
Run `npx skills add lovartai/lovart-skill --skill lovart-api -a codex`. Or copy the skill folder (skills/lovart-skill in lovartai/lovart-skill) into .agents/skills/lovart-api in your project. Codex loads it when a task matches its description.
Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add lovartai/lovart-skill --skill lovart-api -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/lovart-api, .gemini/skills/lovart-api, .github/skills/lovart-api and .opencode/skills/lovart-api in your project.
Going by SKILL.md and its folder, Lovart API needs Python for the scripts in its folder, the command-line tools its instructions call (python3) and credentials named LOVART_ACCESS_KEY and LOVART_SECRET_KEY. Our summary lists: Python 3; A credential in LOVART_ACCESS_KEY; A credential in LOVART_SECRET_KEY.
SKILL.md names 2 domains. In commands or code: assets-persist.lovart.ai and lovart.ai; the agent is likely to contact these when it follows the instructions. This is read from the text; nothing was executed.
Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. The check reads SKILL.md only: the scripts in the folder are not scanned, so read them before running anything.
Lovart API is published under the MIT licence (declared in SKILL.md). It allows redistribution, so the full SKILL.md is shown on this page.
About 7.1k tokens (SKILL.md is roughly 28k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.
Skills that share tags, products or a category with Lovart API: Structured Image Generation (bytedance/deer-flow, 83k stars), AI Image Generation and Editing (zhayujie/CowAgent, 47k stars), Canghe Comic (freestylefly/canghe-skills, 461 stars) and Generate Image (ynulihao/AgentSkillOS, 617 stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
lovartai (a GitHub organization) maintains it in lovartai/lovart-skill, which has 136 GitHub stars. The repository was last updated on October 7, 2026.
Source: lovartai/lovart-skill on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.