Agent skill

Lovart API

by lovartai in lovartai/lovart-skill

Generate images, videos, and audio/music via Lovart AI. An agent skill from lovartai/lovart-skill.

MITAuto-check passedMedia & Creative

Install Lovart API

skills CLI
$ npx skills add lovartai/lovart-skill --skill lovart-api -a claude-code

Project install by default; add -g for ~/.claude/skills/.

GitHub CLI
$ gh skill install lovartai/lovart-skill lovart-api --agent claude-code

Project scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).

Manual copy
$ 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-src

Use ~/.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/

Facts

Skill name
lovart-api
GitHub stars
136
Token cost
~7.1k tokens
SKILL.md length
2,720 words
Files
2 (incl. scripts)
Skills in repo
1
Repo updated
First seen
Licence
MIT

At a glance

Generate images, videos, and audio/music via Lovart AI. An agent skill from lovartai/lovart-skill.

  • Works in 7 steps: First-time setup (saves to… → Send a message (reads project_id from… → Create a project → …
  • Audio creation request in any language — draw
  • SKILL.md covers Terminology, Prerequisites, Features and Usage, plus 7 more sections
  • Runs Python scripts from its folder; calls python3; reaches assets-persist.lovart.ai and lovart.ai; needs LOVART_ACCESS_KEY and LOVART_SECRET_KEY

What it does

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.

When your agent uses it

  • Audio creation request in any language — draw
  • 设计 combined with image

Example prompts

  • “/lovart-api”

Requirements

  • Python 3
  • A credential in LOVART_ACCESS_KEY
  • A credential in LOVART_SECRET_KEY

Workflow steps

7 steps, taken from the step headings in SKILL.md.

  1. First-time setup (saves to ~/.lovart/state.json)
  2. Send a message (reads project_id from local state)
  3. Create a project
  4. Upload a file (local image/video → CDN URL)
  5. Upload an artifact
  6. Check status / get result
  7. Download artifacts

What it can do on your machine

Read from SKILL.md and the folder at commit c127f9b. It shows what the files ask for, not the result of running them.

  • Tool permissions

    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.

  • Runs code

    Ships 1 file in scripts/ (Python), which the agent can run.

    Shell commands in SKILL.md call:

    • python3

    From the folder's file list and the shell code blocks in SKILL.md.

  • Network

    Hosts in commands or code, which the agent is likely to contact:

    • assets-persist.lovart.ai
    • lovart.ai

    From URLs in SKILL.md, links to its own repository left out.

  • Credentials

    Names these keys or tokens, usually read from environment variables:

    • LOVART_ACCESS_KEY
    • LOVART_SECRET_KEY

    From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.

Context cost

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.

Always · name and description, kept in context so the agent knows when to use it
~123
When it runs · the whole SKILL.md, loaded when a task matches
~7.1k

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.

Safety

Auto-check passed

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.

SKILL.md

The full file from lovartai/lovart-skill at commit c127f9b, republished under its MIT licence (© lovartai). 2,720 words, ~7,079 tokens.

Download SKILL.mdSave it as .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.
name
lovart-api
description
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.
user-invocable
true
version
1.1.0
author
Lovart (lovartai)
license
MIT
homepage
https://github.com/lovartai/lovart-skill
platforms
linux, macos, windows
prerequisites.commands
python3
prerequisites.env
LOVART_ACCESS_KEY, LOVART_SECRET_KEY

⚠️ RULE #0: ONLY USE SKILL COMMANDS — NO DIRECT API CALLS

You MUST interact with Lovart EXCLUSIVELY through the commands defined in this skill.

  • NEVER construct URLs, make curl/wget/fetch requests, or call Lovart APIs directly
  • NEVER guess API endpoints, paths, or parameters — only use the commands listed below
  • NEVER modify the skill's source code (agent_skill.py) during execution to "debug" issues (users may freely read the source to verify it)
  • If a command fails, retry it or report the error to the user — do NOT try to work around it
  • ALL Lovart operations go through: 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-project

⚠️ RULE #1: YOU CAN AND MUST GENERATE IMAGES/VIDEOS/AUDIO

When 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.

⚠️ RULE #1.5: PROJECT & THREAD QUERIES USE THIS SKILL

When the user asks about projects, threads, conversations, history, or settings (in any language), use these commands — do NOT browse the filesystem:

User asksCommand
"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)

⚠️ RULE #2: ALWAYS USE chat AND WAIT FOR COMPLETION

Use 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.
    1. Show the user: "This will cost approximately {estimated_cost} credits. Shall I proceed? (yes/no)"
    2. WAIT for user response. Only if user explicitly says yes/confirm/proceed, run: confirm --thread-id THREAD_ID --json --download (This confirms, waits for completion, and returns the result with downloaded files)
    3. If user declines, do NOT confirm. Just inform them the operation was cancelled.
  • "abort" — Generation was aborted. Inform the user.
  • "timeout" — Generation is still running but exceeded the wait time. The result may contain partial artifacts.
    1. Send any downloaded files that are already available
    2. Tell the user: "Generation is still in progress. Checking again..."
    3. Run: result --thread-id THREAD_ID --json --download to get the latest results
    4. If status is still "running", wait and retry. If "done", send remaining files.

Handle 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 statuscodeWhat it meansWhat to tell the user
4022012Quota / billing / risk-control rejectionShow 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.
4092011Another 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."
4291429API 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:

  • GPT Image 2 with very long/complex prompts involving weapons, specific bodies, or policy-sensitive wording — retry with a different model (--include-tools generate_image_midjourney or generate_image_nano_banana_pro) or simplify the prompt.
  • Prompt that describes a task the agent can't fulfill — show agent_message to the user.

After EVERY generation, you MUST:

  1. Use --download flag with chat (or result)
  2. Send each downloaded file to the user as a file attachment (images, videos, audio/mp3 — ALL file types):
    • ALWAYS send downloaded[].local_path as file attachments, regardless of file type (.png, .jpg, .mp4, .mp3, etc.)
    • NEVER just paste the URL when a local file has been downloaded — send the actual file
    • Only fall back to displaying URLs if no files were downloaded
  3. Append the project canvas link: https://www.lovart.ai/canvas?projectId={project_id}
  4. Check 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.

⚠️ RULE #4: CHECK LOCAL STATE ON FIRST USE (MANDATORY — DO NOT SKIP)

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

  • Check local state (~/.lovart/state.json) for active_project
  • If active_project is set → proceed to Step 2. Do NOT create a new project. Do NOT ask the user.
  • If 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.
  • Save with: project-add --project-id PID --name "name"

Step 2: threads --json

  • Check if there's a recent thread to continue
  • If recent thread exists and topic is related → REUSE it (pass --thread-id THREAD_ID to chat)
  • If no threads or completely different topic → omit --thread-id (creates new thread)

CRITICAL RULES:

  • NEVER create a new project if config --json already shows an active_project. Reuse it.
  • NEVER omit --thread-id when a relevant recent thread exists. Always reuse threads by default.
  • NEVER call chat without first running config --json and threads --json in the same conversation.
  • The chat command auto-reads active_project from local state — you do NOT need to pass --project-id every time.
  • Only create a new project if the user explicitly asks for one.
  • Only create a new thread if the topic is completely unrelated to the most recent thread.
  • When in doubt, REUSE both the existing project and the existing thread.

Lovart Agent OpenAPI Skill

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.

Terminology

  • Thread — A conversation flow (chat session) with the Lovart AI Agent, NOT a programming thread. Each thread has a unique 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.
  • Project — A workspace/canvas that groups threads and generated artifacts together. One project can contain multiple threads.

Prerequisites

bash
export LOVART_ACCESS_KEY="ak_xxx"
export LOVART_SECRET_KEY="sk_xxx"

No third-party dependencies. Python standard library only.

Features

  1. Chat - Send a message to the AI Agent, get text replies and generated images/videos
  2. Confirm - Confirm and wait for high-cost operations (e.g. video generation)
  3. Create Project - Create a new project
  4. Upload File - Upload a local image/video file, get back a CDN URL
  5. Upload Artifact - Upload a link artifact to a project
  6. Status/Result - Check thread status and retrieve results
  7. Set/Query Mode - Switch between fast (credits) and unlimited (queue) mode

Usage

0. First-time setup (saves to ~/.lovart/state.json)
bash
python3 {baseDir}/scripts/agent_skill.py project-add --project-id PROJECT_ID --name "My Project"
1. Send a message (reads project_id from local state)
bash
python3 {baseDir}/scripts/agent_skill.py chat --prompt "USER_PROMPT" --json --download

To 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

2. Create a project
bash
python3 {baseDir}/scripts/agent_skill.py create-project
3. Upload a file (local image/video → CDN URL)
bash
python3 {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.

4. Upload an artifact
bash
python3 {baseDir}/scripts/agent_skill.py upload-artifact --project-id PROJECT_ID --url "ARTIFACT_URL" --type image
5. Check status / get result
bash
# 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
6. Download artifacts
bash
# 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 myimg

Typical Workflows

Scenario 1: Generate images/videos/audio (most common)

First, 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 gallery

IDs are auto-persisted locally (~/.lovart/state.json):

  • project_id is saved after first chat, reused automatically
  • thread_id + topic are saved after each chat for thread switching
  • Only create a new project if the user explicitly asks for one
  • Only create a new thread (omit --thread-id) when starting a completely new topic
  • Run threads to list saved threads for the user to pick from
Scenario 2: Edit with attachments
1. 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 1
Scenario 3: Follow-up on same topic (continue context)
1. chat --prompt "change the background to a beach" --project-id PROJECT_ID --thread-id THREAD_ID --json --download

The Agent remembers the previous conversation and can continue editing based on context.

Scenario 4: New topic (new thread)
1. chat --prompt "completely new request" --project-id PROJECT_ID --json --download

Omitting --thread-id creates a new conversation without previous memory.

Scenario 5: Streaming / incremental delivery (multiple artifacts)

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.

bash
python3 {baseDir}/scripts/agent_skill.py watch --prompt "generate 4 variations of a cyberpunk cat" --json

watch emits NDJSON to stdout (one event per line). Parse line-by-line and deliver each artifact event's local_path to the user immediately:

json
{"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).

Show full SKILL.md (1,082 more words)Show less

Output Format

chat --json returns:

json
{
  "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.

Core Principle

You are a messenger, not a creator. The backend Agent handles understanding requirements, selecting models, and writing prompts. Your job:

  1. Relay: Pass the user's original description verbatim to chat
  2. Wait: Poll until generation completes
  3. Deliver: Send result files to the user

Do NOT rewrite/expand prompts, break down tasks, or add your own style descriptions.

Lovart Generation Mode (MUST use API, not prompt)

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:

bash
# 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-mode

How 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)
  • This is a persistent server-side setting — it stays until changed again
  • It affects ALL subsequent image/video generations, not just one request
  • It has nothing to do with your (the assistant's) response style or behavior

Specifying Models

Option 1: In the prompt (simple, the Agent routes automatically):

bash
python3 {baseDir}/scripts/agent_skill.py chat --prompt "generate ocean waves video using kling" --json --download

Option 2: Via --prefer-models (precise, same as frontend's model selector):

bash
# 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 --download

Available models for --prefer-models:

IMAGE:

Tool nameDisplay name
generate_image_gpt_image_2_5_flareGPT Image 2.5 Flare Auto
generate_image_gpt_image_2_5_flare_lowGPT Image 2.5 Flare Low
generate_image_gpt_image_2_5_flare_mediumGPT Image 2.5 Flare Medium
generate_image_gpt_image_2_5_flare_highGPT Image 2.5 Flare High
generate_image_gpt_image_2_5_flare_xhighGPT Image 2.5 Flare xhigh
generate_image_gpt_image_2_5_flare_maxGPT Image 2.5 Flare Max
generate_image_gpt_image_2_5_sunburstGPT Image 2.5 Sunburst Auto
generate_image_gpt_image_2_5_sunburst_lowGPT Image 2.5 Sunburst Low
generate_image_gpt_image_2_5_sunburst_mediumGPT Image 2.5 Sunburst Medium
generate_image_gpt_image_2_5_sunburst_highGPT Image 2.5 Sunburst High
generate_image_gpt_image_2_5_sunburst_xhighGPT Image 2.5 Sunburst xhigh
generate_image_gpt_image_2_5_sunburst_maxGPT Image 2.5 Sunburst Max
generate_image_gpt_image_2GPT Image 2 Auto
generate_image_gpt_image_2_lowGPT Image 2 Low
generate_image_gpt_image_2_mediumGPT Image 2 Medium
generate_image_gpt_image_2_highGPT Image 2 High
generate_image_nano_banana_2_1Nano Banana 2.1
generate_image_nano_banana_proNano Banana Pro
generate_image_nano_banana_2Nano Banana 2
generate_image_seedream_v5_proSeedream 5.0 Pro
generate_image_gpt_image_1_5GPT Image 1.5
generate_image_seedream_v5Seedream 5.0 Lite
generate_image_luma_uni_1Luma uni-1
generate_image_luma_uni_1_maxLuma uni-1-max
generate_image_flux_2_maxFlux.2 Max
generate_image_flux_2_proFlux.2 Pro
generate_image_seedream_v4_5Seedream 4.5
generate_image_seedream_v4Seedream 4
generate_image_midjourneyMidjourney
generate_image_ideogram_v4Ideogram 4
generate_image_qwen_image3Qwen Image3
generate_image_qwen_image3_proQwen Image3 Pro
generate_image_nano_banana_2_liteNano Banana 2 Lite
generate_image_p_image_ideogramIdeogram P-Image

VIDEO:

Tool nameDisplay name
generate_video_seedance_v2_5Seedance 2.5
generate_video_seedance_v2_0Seedance 2.0
generate_video_seedance_v2_0_fastSeedance 2.0 Fast
generate_video_seedance_v2_0_miniSeedance 2.0 Mini
generate_video_kling_v3Kling 3.0
generate_video_kling_v3_omniKling 3.0 Omni
generate_video_minimax_h3MiniMax H3
generate_video_kling_v2_6Kling 2.6
generate_video_wan_v2_6Wan 2.6
generate_video_veo3_1Veo 3.1
generate_video_veo3_1_fastVeo 3.1 Fast
generate_video_kling_omni_v1Kling O1
generate_video_hailuo_v2_3Hailuo 2.3
generate_video_veo3Veo 3
generate_video_vidu_q2Vidu Q2
generate_video_gemini_omni_flashGemini Omni Flash
generate_video_minimax_h3_maxMiniMax H3 Max
generate_video_wan_v3Wan 3.0
generate_video_wan_v3_primeWan 3.0 Prime

3D:

Tool nameDisplay name
generate_3d_tripoTripo

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):

bash
# 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:

  • It is a strong instruction, not an enforced whitelist. The Agent normally follows it, but may pick another tool — for example after the requested one rejects the input. Check 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.

Reference Subjects from the Asset Library — --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.

bash
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 --download

Each 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.

Checking What Was Rejected — failures

A 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:

json
{
  "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.

Reasoning Mode — --mode thinking / --mode fast

Lovart 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.

bash
# 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 --download

Mode 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).

Task-Specific Tool Selection (IMPORTANT)

When the user's request matches a specific operation, use --include-tools to ensure the correct tool:

User saysUse --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.

Notes

  • All APIs use AK/SK HMAC-SHA256 signature authentication
  • Video generation takes several minutes; the chat command auto-polls until complete
  • Gallery and canvas sync is idempotent — safe to call result multiple times without duplicates
  • Connection failures auto-retry 3 times with SSL fallback
  • After status becomes "done", waits 5 seconds to re-confirm (guards against sub-agent startup race)

© lovartai, MIT. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file

Files

SKILL.md and 1 other file (scripts) in skills/lovart-skill of lovartai/lovart-skill.

  • SKILL.md
  • scripts/agent_skill.py

Open the folder on GitHubat commit c127f9b

Compare with similar skills

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.

Lovart API compared with similar skills
SkillStarsUsed inTokensAuto-checkLicenceRepo updated
Lovart API this skilllovartai/lovart-skill136—~7.1kAutomated safety check: PassMIT
Structured Image Generationbytedance/deer-flow83k5 repos~2.9kAutomated safety check: PassMIT
AI Image Generation and Editingzhayujie/CowAgent47k—~1.3kAutomated safety check: PassMIT
Canghe Comicfreestylefly/canghe-skills4618 repos~3.2kAutomated safety check: PassNone
Generate Imageynulihao/AgentSkillOS61710 repos~1.7kAutomated safety check: NotesNone
GPT Image Generation CLIwuyoscar/GPT-Image2-Skill5.7k—~2.5kAutomated safety check: NotesMIT

Similar skills

  • 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.

    83k GitHub starsUsed in 5 repos~2.9k tokens
    Media & CreativeAuto-check passed
  • Generates or edits images from text prompts through a Python script that picks an image backend based on which API keys are configured.

    47k GitHub stars~1.3k tokensUpdated today
    Media & CreativeAuto-check passed
  • Canghe Comic

    freestylefly/canghe-skills

    Knowledge comic creator supporting multiple art styles and tones.

    461 GitHub starsUsed in 8 repos~3.2k tokens
    Media & CreativeAuto-check passed
  • Generate Image

    ynulihao/AgentSkillOS

    Generate or edit images using AI models (FLUX, Gemini). An agent skill from ynulihao/AgentSkillOS.

    617 GitHub starsUsed in 10 repos~1.7k tokens
    Media & CreativeAuto-check: notes
  • GPT Image Generation CLI

    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.

    5.7k GitHub stars~2.5k tokensUpdated 8 days ago
    Media & CreativeAuto-check: notes
  • Minimal Zine Poster Generator

    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.

    7.3k GitHub stars~2.9k tokensUpdated 1 mo ago
    Media & CreativeAuto-check passed

Questions about Lovart API

What does Lovart API do?

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.

When should I use Lovart API?

Lovart API fits situations like: audio creation request in any language — draw; 设计 combined with image.

How do I install Lovart API in Claude Code?

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.

How do I install Lovart API in Codex?

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.

Can I use Lovart API in Cursor, Gemini CLI or GitHub Copilot?

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.

What does Lovart API need to run?

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.

Does Lovart API access the network?

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.

Is Lovart API safe to install?

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.

What licence does Lovart API use?

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.

How many tokens does Lovart API use?

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.

What are the alternatives to Lovart API?

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.

Who maintains Lovart API?

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.