15 KiB
DEV TASK: Скилл image-gen — генерация изображений
Статус: Ready for dev
Проект: image-gen
BRD: tasks/image-gen/BRD.md
Цель
Создать AgentSkill image-gen в ~/.openclaw/skills/image-gen/ — скилл генерации изображений через Recraft (OpenRouter) и A2E.ai, доступный всем агентам OpenClaw.
Архитектура
Агент читает шаблоны из params/, составляет английский промпт, вызывает scripts/generate.py. Скрипт делает API-запрос, сохраняет картинку на диск, отправляет в Telegram через OpenClaw CLI. Агент тратит токены только на трансформацию запроса → промпт.
Стек / Зависимости
- Python 3.x (доступен в контейнере)
requests(pip install requests)python-dotenv(pip install python-dotenv)- OpenRouter API (image generation endpoint)
- A2E.ai API (text-to-image endpoint)
- OpenClaw CLI (
openclaw message send)
Инфраструктура
| Параметр | Значение |
|---|---|
| Расположение скилла | ~/.openclaw/skills/image-gen/ |
| Env-файл | ~/.openclaw/.env |
| Папка для картинок | ~/images/image-gen/YYYY-MM-DD/ |
| Упаковка скилла | /app/skills/skill-creator/scripts/package_skill.py |
Файловая карта
| Действие | Файл | Ответственность |
|---|---|---|
| Создать | ~/.openclaw/skills/image-gen/SKILL.md |
Метаданные + инструкции для агента |
| Создать | ~/.openclaw/skills/image-gen/params/models.md |
Модели, дефолты, negative prompt |
| Создать | ~/.openclaw/skills/image-gen/params/templates.md |
Шаблоны объектов |
| Создать | ~/.openclaw/skills/image-gen/params/styles.md |
Фотостили |
| Создать | ~/.openclaw/skills/image-gen/params/favorites.md |
Избранные промпты (пустой) |
| Создать | ~/.openclaw/skills/image-gen/scripts/generate.py |
Скрипт генерации |
| Создать | ~/.openclaw/skills/image-gen/references/recraft_api.md |
OpenRouter image gen API |
| Создать | ~/.openclaw/skills/image-gen/references/recraft_prompting.md |
Промптинг для Recraft |
| Создать | ~/.openclaw/skills/image-gen/references/a2e_api.md |
A2E.ai API (text-to-image) |
| Создать | ~/.openclaw/skills/image-gen/references/a2e_prompting.md |
Промптинг для A2E |
Задачи
Task 1: Изучить API и написать references
Шаги:
-
1.1 Изучить OpenRouter image generation API:
- Доку:
https://openrouter.ai/docs/guides/overview/multimodal/image-generation.md - Модели Recraft:
https://openrouter.ai/recraft/recraft-v4.1-proи соседние - Написать
references/recraft_api.md— endpoint, параметры запроса, формат ответа (base64),image_config(aspect_ratio, image_size), negative prompt
- Доку:
-
1.2 Изучить A2E.ai text-to-image API:
- Сайт:
https://video.a2e.ai/dev(может требовать браузер — попробоватьcurl -L) - Поискать OpenAPI spec или Swagger:
https://video.a2e.ai/api/schema/или/openapi.json - Ключ:
A2E_API_TOKENв~/.openclaw/.env - Написать
references/a2e_api.md— endpoint, параметры, формат ответа
- Сайт:
-
1.3 Написать
references/recraft_prompting.md:- Структура промпта для recraft (subject, style, lighting, camera, quality)
- Примеры хороших промптов
- Что работает хорошо / плохо
- Источник:
https://www.recraft.ai/docs/api-reference/getting-started+ практические примеры
-
1.4 Написать
references/a2e_prompting.md:- Аналогично для A2E моделей
Критерий готовности: 4 reference файла созданы, содержат рабочие примеры запросов.
Task 2: Создать params/ файлы
Шаги:
- 2.1 Создать
params/models.md:
## Recraft (OpenRouter)
default_model: recraft/recraft-v4.1-pro
default_aspect_ratio: 9:16
default_count: 1
default_image_size: 2K
negative_prompt: deformed limbs, distorted hands, extra fingers, bad anatomy, blurry, low quality, watermark, signature, text overlay
### Доступные модели
- recraft/recraft-v4.1-pro ← дефолт
- recraft/recraft-v4.1-utility-pro
- recraft/recraft-v4.1-utility
- recraft/recraft-v4.1
- recraft/recraft-v4-pro
- recraft/recraft-v4
- recraft/recraft-v3
### Группы (для мульти-генерации)
- group:all_v4.1 = recraft/recraft-v4.1-pro, recraft/recraft-v4.1-utility-pro, recraft/recraft-v4.1-utility, recraft/recraft-v4.1
- group:all_v4 = recraft/recraft-v4.1-pro, recraft/recraft-v4.1-utility-pro, recraft/recraft-v4.1-utility, recraft/recraft-v4.1, recraft/recraft-v4-pro, recraft/recraft-v4
- group:all = все выше + recraft/recraft-v3
## A2E.ai
default_model: (заполнить из API доки)
api_url: https://video.a2e.ai/api/
- 2.2 Создать
params/templates.mdсо стартовыми шаблонами:
# Шаблоны объектов для image-gen
# Формат: triggers (слова для матчинга, через запятую) + base (описание на английском)
# Quality enhancers включены прямо в base каждого шаблона
## blonde_woman
Triggers: блондинка, blonde, блондинки
Base: A beautiful blonde woman, 25 years old, long wavy golden hair, blue eyes, natural makeup, slim athletic figure, photorealistic, sharp focus, 8K resolution, masterpiece quality, professional photography
## brunette_woman
Triggers: брюнетка, brunette, брюнетки
Base: A beautiful brunette woman, 25 years old, long dark wavy hair, green eyes, natural makeup, slim figure, photorealistic, sharp focus, 8K resolution, masterpiece quality, professional photography
## park
Triggers: парк, park, садик
Base: lush green urban park, sunny afternoon, tall trees, soft bokeh background, natural daylight, fresh grass
## forest
Triggers: лес, forest, лесу
Base: dense green forest, dappled sunlight through trees, misty atmosphere, natural lighting, photorealistic environment
## beach
Triggers: пляж, beach, море, sea
Base: sunny tropical beach, clear turquoise water, white sand, palm trees, golden hour lighting
## city
Triggers: город, city, улица, street
Base: modern city street, urban environment, evening golden hour, bokeh city lights background
## cafe
Triggers: кафе, cafe, кофейня, coffee shop
Base: cozy modern cafe interior, warm lighting, wooden tables, coffee cups, soft bokeh background
- 2.3 Создать
params/styles.md:
# Фотографические стили для image-gen
## portrait
Triggers: портрет, portrait
Style: 85mm lens portrait photography, shallow depth of field f/1.8, studio lighting, sharp focus on face, professional headshot quality
## cinematic
Triggers: кинематограф, cinematic, кино, film
Style: cinematic shot, movie still, dramatic lighting, widescreen 2.35:1 composition, film grain, color grading
## street
Triggers: стрит, уличное, street photography, репортаж
Style: candid street photography, natural available light, urban setting, Leica style, documentary feel
## fashion
Triggers: фэшн, fashion, модный, editorial
Style: high fashion editorial photography, Vogue style, dramatic studio lighting, fashion magazine composition
## artistic
Triggers: арт, художественное, artistic, art photo
Style: fine art photography, creative composition, dramatic shadows, high contrast, artistic vision
- 2.4 Создать пустой
params/favorites.md:
# Избранные промпты image-gen
# Формат: дата — описание | Model | Prompt | Negative
Критерий готовности: 4 params файла созданы, templates содержат минимум 5 объектов.
Task 3: Написать scripts/generate.py
Шаги:
- 3.1 Реализовать скрипт со следующим CLI-интерфейсом:
python generate.py \
--prompt "A beautiful blonde woman in a park..." \
--negative "deformed limbs, bad anatomy..." \
--model "recraft/recraft-v4.1-pro" \
--ratio "9:16" \
--count 1 \
--provider "openrouter" \
--save-dir "/root/images/image-gen/2026-05-24/" \
--tg-chat-id "126472752"
-
3.2 Логика скрипта:
- Загрузить
.envиз~/.openclaw/.env - Если
--modelначинается сgroup:— развернуть в список моделей изparams/models.md(парсить файл) - Для каждой модели × count итераций:
- Сделать API запрос (OpenRouter или A2E в зависимости от
--provider) - Сохранить как
YYYY-MM-DD_HH-MM-SS_<model_short>.jpg
- Сделать API запрос (OpenRouter или A2E в зависимости от
- Каждую картинку отправить в TG:
openclaw message send --channel telegram --target <tg-chat-id> \ --media <path> \ --message "🎨 Model: <model>\n📝 <caption>"
- Загрузить
-
3.3 OpenRouter API вызов:
POST https://openrouter.ai/api/v1/chat/completions Authorization: Bearer $OPENROUTER_API_KEY { "model": "recraft/recraft-v4.1-pro", "messages": [{"role": "user", "content": prompt}], "modalities": ["image"], "image_config": { "aspect_ratio": ratio, "image_size": "2K" } } # Ответ: choices[0].message.images[0].image_url.url → base64 # Декодировать base64 и сохранить как .jpg -
3.4 A2E API вызов — реализовать согласно
references/a2e_api.md(изучить в Task 1) -
3.5 Протестировать:
cd ~/.openclaw/skills/image-gen/ python scripts/generate.py \ --prompt "A beautiful blonde woman in a sunny park, portrait, 8K, photorealistic" \ --negative "deformed limbs, distorted hands" \ --model "recraft/recraft-v4.1-pro" \ --ratio "9:16" \ --count 1 \ --provider "openrouter" \ --save-dir "/tmp/test-images/" \ --tg-chat-id "126472752"Ожидаемый результат: картинка сохранена в
/tmp/test-images/, пришла в Telegram с подписью.
Критерий готовности: тест успешен, картинка в Telegram.
Task 4: Написать SKILL.md
- 4.1 Создать
SKILL.mdс фронтматтером и инструкциями:
---
name: image-gen
description: Generate images via Recraft (OpenRouter) and A2E.ai models.
Use when user asks to generate, draw, or create an image/photo.
Triggers: "сгенерируй фото", "нарисуй изображение", "generate image",
"сгенерируй картинку", "create a photo", "draw me".
---
Тело SKILL.md должно содержать:
-
Как читать
params/templates.mdи матчить объекты из запроса -
Как читать
params/styles.mdи применять стиль -
Формула промпта:
base_template + location/context + style + user_unique_details -
Как вызывать
scripts/generate.py -
Как обрабатывать мульти-модель запросы (
group:all_v4) -
После генерации: спросить "Сохранить в избранное?" → если да, добавить в
params/favorites.md -
Ссылки на references: читать перед работой с новой моделью или если нужны детали API
-
4.2 Убедиться что SKILL.md ≤ 500 строк (детали → в references)
Критерий готовности: SKILL.md проходит валидацию package_skill.py.
Task 5: Упаковать скилл
- 5.1 Запустить упаковку:
Ожидаемый результат:
python /app/skills/skill-creator/scripts/package_skill.py \ ~/.openclaw/skills/image-gen/ \ ~/.openclaw/skills/~/.openclaw/skills/image-gen.skillсоздан без ошибок.
Критерий готовности: файл image-gen.skill создан, валидация прошла без ошибок.
Проверка (Acceptance)
| # | Проверка | Команда | Ожидаемый результат |
|---|---|---|---|
| 1 | Структура скилла | ls ~/.openclaw/skills/image-gen/ |
Все папки и файлы созданы |
| 2 | Тест генерации Recraft | python generate.py --prompt "test girl in park" --model recraft/recraft-v4.1-pro ... |
Картинка в TG |
| 3 | Тест группы моделей | --model group:all_v4.1 --count 1 |
4 картинки в TG |
| 4 | Упаковка | package_skill.py ~/.openclaw/skills/image-gen/ |
Нет ошибок валидации |
Ограничения и контекст
- ⚠️ API ключи только из
~/.openclaw/.env— не хардкодить в скрипт - ⚠️ A2E API может требовать браузерного рендеринга для доки — попробовать
curl -H "Authorization: Bearer $A2E_API_TOKEN" https://video.a2e.ai/api/для autodiscovery - ⚠️ OpenRouter возвращает изображение как base64 data URL в
choices[0].message.images[0].image_url.url— нужно декодировать и сохранить - ⚠️
openclaw message send --media— таймаут 30+ секунд - ⚠️
params/models.md— парсить нужно только секциюgroups:для разворачивания групп; простой text parsing достаточен - 🚫 Не использовать
MEDIA:директиву в ответах агента — толькоopenclaw message send - ℹ️ Скилл устанавливается в
~/.openclaw/skills/— общая папка для всех агентов
Создано: 2026-05-24 | Автор ТЗ: Стрим | Исполнитель: Dev-агент