createya-batch-5b6ce7 — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited createya-batch-5b6ce7 (Agent Skill) and scored it 100/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 0 flagged
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
Этот skill — рабочая обёртка над createya:* MCP-тулзами для случая «нужно сгенерировать несколько результатов». Делает три вещи которые агент сам по себе делать криво:
limit, ждёт complete, fire next.creative/output/<task>/ с manifest.Требует установленного createya skill (low-level MCP wrapper). Если его нет — выполни одной командой из README этого репо.
creative-director подготовил бриф и эталон, время делать вариацииПеред первой генерацией создай structure (если не существует):
creative/
├── refs/ # пользовательские референсы / source images
├── etalon/ # locked "perfect" frames для consistency
└── output/
└── YYYY-MM-DD-<task-slug>/ # один таск = одна папка
├── manifest.json # что сгенерировано: prompt, model, credits, run_id, file
├── 01-<variant-slug>.png # пронумерованные результаты
├── 02-<variant-slug>.png
└── ...<task-slug> — короткий kebab-case, выводи из брифа: cat-on-moon, summer-lookbook, product-hero-shots. <variant-slug> — описание конкретной вариации: cinematic-portrait, pastel-wide, front-angle.
Если у пользователя в проекте уже есть creative/ — продолжай в той же структуре. Если нет — создай папки через Bash mkdir -p creative/{refs,etalon,output}.
createya:get_balance() → {
credits_balance: 16399,
concurrency: { limit: 4, in_use: 0 } ← ЭТО ВАЖНО
}concurrency.limit — сколько runs одновременно можно держать. Это лимит тарифа (Start=1, Creator=2, Pro=3, Enterprise=4). Не обходи его — получишь 429 concurrent_limit_exceeded.
concurrency.in_use — сколько уже занято (может быть >0 если пользователь параллельно что-то генерит в боте или другом MCP-клиенте). Эффективная емкость очереди = `limit - in_use`.
createya:list_models() → найди family, посмотри endpoint в нёмДля каждой задуманной вариации:
credits_per_request — типичная цена при дефолтном конфигеcredits_max — потолок (high quality + max size)Суммируй и сравни с credits_balance. Если total_cost_estimate > balance:
TASK="2026-05-12-cat-on-moon"
mkdir -p "creative/output/$TASK"Сразу создай пустой manifest.json:
{
"task": "cat-on-moon",
"date": "2026-05-12",
"concurrency_limit": 4,
"total_requested": 5,
"items": []
}Эффективная емкость = limit - in_use. Если in_use=0, limit=4 — fire 4 одновременно, потом 5-я после освобождения слота.
Псевдокод:
queue = [variant_1, variant_2, ..., variant_N]
in_flight = {} // run_id → variant
completed = []
capacity = balance.concurrency.limit - balance.concurrency.in_use
while queue or in_flight:
# Fire while we have capacity
while len(in_flight) < capacity and queue:
v = queue.pop(0)
resp = createya:run_model(model=v.family, input=v.input)
if resp.status == "completed": // sync model returned immediately
save_result(v, resp.output.urls)
completed.append(v)
elif resp.run_id: // async
in_flight[resp.run_id] = v
else:
log_failure(v, resp.error)
# Poll in-flight
if in_flight:
sleep(2 if image_only else 8)
for run_id, v in list(in_flight.items()):
status = createya:get_run_status(run_id)
if status.status == "completed":
save_result(v, status.output.urls)
completed.append(v)
del in_flight[run_id]
elif status.status == "failed":
log_failure(v, status.error)
del in_flight[run_id]
# else "processing" / "queued" — keep pollingНюансы:
Retry-After секунд из header, перезапусти.После completed:
# Скачать с CDN — output.urls[0] (or output.url)
NN=$(printf '%02d' "$index")
EXT="${OUTPUT_URL##*.}" # png/jpg/webp/mp4
curl -fsSL "$OUTPUT_URL" -o "creative/output/$TASK/${NN}-${VARIANT_SLUG}.${EXT}"Обнови manifest.json (атомарно — read → modify → write):
{
"task": "cat-on-moon",
"date": "2026-05-12",
"concurrency_limit": 4,
"total_requested": 5,
"items": [
{
"file": "01-cinematic-wide.png",
"variant": "cinematic-wide",
"model": "nano-banana-pro",
"endpoint": "nano-banana-pro-t2i",
"input": { "prompt": "...", "aspect_ratio": "16:9" },
"credits_spent": 18,
"run_id": "abc123",
"output_url": "https://cdn-new.createya.ai/...",
"created_at": "2026-05-12T15:30:00Z",
"status": "completed"
}
],
"summary": {
"total_credits_spent": 90,
"successful": 5,
"failed": 0,
"duration_seconds": 47
}
}✓ 5/5 готово · 90 кредитов потрачено · 47 сек
Результаты в creative/output/2026-05-12-cat-on-moon/:
01-cinematic-wide.png
02-pastel-portrait.png
03-noir-closeup.png
...
Баланс: 16309 кредитовПокажи 2-3 результата как markdown-image previews (агент сам берёт пути из manifest).
Очень большая пачка (N > 20). Раздели на под-пачки по 10-20:
manifest.json после каждогоitems[] и пропусти уже status === "completed"Concurrency=1 (Start план). Очередь становится последовательной — это нормально, не оптимизируй. Просто покажи пользователю прогресс «3/5».
Long-running video runs. kling-video-v3-pro / veo-3.1 могут занимать 30-120 секунд:
429 concurrent_limit_exceeded в середине. Если получил — in_use поменялся (юзер запустил параллельно где-то ещё):
Retry-After секунд (header)get_balance, обнови capacity402 Insufficient credits. Если кончились в середине:
get_balancecredits_max может в 5× превысить typical. Всегда estimate.createya — base MCP wrapper (low-level run_model / list_models / get_balance / get_run_status / request_upload_url)creative-director — высокий уровень «эталон + вариации», подготовка брифа. Для серий вариаций creative-director может звать createya-batch для исполнения.~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.