Fellowi

API генерації відвертих зображень для розробників

Автор: Команда Fellowi · · 7 хв читання

Темна градієнтна композиція від фіолетового до індиго, що символізує API для генерації зображень.

Більшість API для генерації зображень відмовляються від відвертого контенту як від політики, ще до будь-якого технічного обмеження. Для універсальної платформи це розумне рішення, але для розробника, якому справді потрібен програмний доступ до генератора, що допускає контент для дорослих, майже нічого не лишається. Публічний API Fellowi існує саме для цього випадку. Він дозволяє генерацію відвертого контенту для зареєстрованих повнолітніх акаунтів, за жорстких обмежень, які ніколи не змінюються: жодного контенту за участю неповнолітніх, жодного контенту, що зображує дії без згоди. Це не налаштування, які можна перемкнути, - такі запити відхиляються без винятків.

Усе інше - звичайний REST API: ключ, POST, що ставить завдання в чергу, опитування, завантаження. Якщо ви працювали з будь-яким іншим асинхронним API генерації, це здасться знайомим.

Отримайте ключ

Зареєструйтеся, потім створіть API-ключ на сторінці API Console. Ключ виглядає як fk_live_<випадковий рядок> і показується повністю лише один раз, під час створення. Після цього на нашому боці зберігається лише хеш і короткий превʼю - якщо ви його загубите, відкличте і створіть новий, як із будь-яким іншим API-ключем, з яким ви працювали раніше. Збережіть його в надійному місці, перш ніж закрити вкладку.

Кожен запит авторизується стандартним bearer-заголовком:

Authorization: Bearer fk_live_your_key_here

Поставте генерацію в чергу

POST /v1/api/images із промптом і вашими параметрами. Запит повертається одразу з кодом HTTP 202 - він не блокується на час рендеру:

POST /v1/api/images
Content-Type: application/json
Authorization: Bearer fk_live_your_key_here
Idempotency-Key: a-key-you-generate-per-attempt

{
  "prompt": "a neon-lit rooftop at night, wide shot, cinematic lighting",
  "quality": "standard",
  "format": "png",
  "aspectRatio": "16:9"
}

У відповіді - id завдання, оцінка часу etaMs і залишок монет на вашому рахунку після списання. Необовʼязковий заголовок Idempotency-Key робить повторний запит безпечним - надішліть той самий ключ при повторі, і повторного списання за ту саму спробу не станеться.

Саме завдання лежить усередині image, а поруч із ним - баланс гаманця:

{
  "image": { "id": "0f9c...", "status": "queued", "etaMs": 42000, "coinsCharged": 40 },
  "coins": 360
}

Опитування, потім завантаження

Опитуйте GET /v1/api/images/:id, поки status не стане "succeeded" або "failed". У разі успіху завантажте самі байти через GET /v1/api/images/:id/content. Якщо генерація не вдалася, витрачені монети автоматично повертаються, а failureCode завжди дорівнює одному з рівно чотирьох значень: TIMEOUT, MODERATION_REJECTED, VENDOR_ERROR або UNKNOWN. Пʼятий код обробляти не потрібно, і часткове списання звіряти теж не потрібно - детальніше про те, чому саме так, у статті про ціноутворення API і про те, що відбувається під час збою генерації.

curl, від початку до кінця

API_KEY="fk_live_your_key_here"

# 1. поставити завдання в чергу
JOB=$(curl -s https://fellowi.com/api/v1/api/images \
  -H "Authorization: Bearer $API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"prompt":"a neon-lit rooftop at night","quality":"standard","format":"png","aspectRatio":"16:9"}')
ID=$(echo "$JOB" | jq -r .image.id)

# 2. опитувати до завершення
while true; do
  STATUS=$(curl -s https://fellowi.com/api/v1/api/images/$ID \
    -H "Authorization: Bearer $API_KEY" | jq -r .image.status)
  [ "$STATUS" = "succeeded" ] && break
  [ "$STATUS" = "failed" ] && { echo "generation failed"; exit 1; }
  sleep 3
done

# 3. завантажити зображення
curl -s https://fellowi.com/api/v1/api/images/$ID/content \
  -H "Authorization: Bearer $API_KEY" -o output.png

Node

const API_KEY = process.env.FELLOWI_API_KEY;
const base = "https://fellowi.com/api/v1/api";
const headers = { Authorization: `Bearer ${API_KEY}` };

const create = await fetch(`${base}/images`, {
  method: "POST",
  headers: { ...headers, "Content-Type": "application/json" },
  body: JSON.stringify({ prompt: "a neon-lit rooftop at night", quality: "standard", format: "png", aspectRatio: "16:9" }),
});
const { image } = await create.json();
const id = image.id;

let job;
do {
  await new Promise((r) => setTimeout(r, 3000));
  job = await fetch(`${base}/images/${id}`, { headers }).then((r) => r.json());
} while (job.image.status !== "succeeded" && job.image.status !== "failed");

if (job.image.status === "failed") throw new Error(job.image.failureCode);

const bytes = await fetch(`${base}/images/${id}/content`, { headers }).then((r) => r.arrayBuffer());
await Bun.write("output.png", bytes);

Python

import os, time, requests

API_KEY = os.environ["FELLOWI_API_KEY"]
base = "https://fellowi.com/api/v1/api"
headers = {"Authorization": f"Bearer {API_KEY}"}

job = requests.post(f"{base}/images", headers=headers, json={
    "prompt": "a neon-lit rooftop at night",
    "quality": "standard",
    "format": "png",
    "aspectRatio": "16:9",
}).json()

while True:
    time.sleep(3)
    status = requests.get(f"{base}/images/{job['image']['id']}", headers=headers).json()
    if status["image"]["status"] in ("succeeded", "failed"):
        break

if status["image"]["status"] == "failed":
    raise RuntimeError(status["image"]["failureCode"])

content = requests.get(f"{base}/images/{job['image']['id']}/content", headers=headers)
open("output.png", "wb").write(content.content)

Модель, ціна та ліміти

Кожна відповідь вказує модель як fellowi-nsfw-image-1. Це єдина назва, яку ви побачите, - це той самий генератор, що стоїть за вебзастосунком Fellowi Images, і списання йдуть із того самого гаманця Fellowi Coins за тією самою ціною: 40 монет за Standard (1,5K), 60 - за High quality (2K). Окремого прайс-листа для API, який довелося б звіряти з вебзастосунком, не існує.

Ліміти запитів - це захист від зловживань, а не реальна стеля: за замовчуванням 20 запитів на хвилину для генерації, 120 на хвилину для читання. GET /v1/api/me повертає поточний баланс монет, ліміт вашого ключа і скільки зображень у вас лишилося на сьогодні за денним обмеженням - перевіряйте його перед постановкою пакета завдань, а не після того, як упретеся в межу.

Повна документація, актуальні ціни та керування ключами - все на сторінці API Console.

Спробуйте самі

Теплий приватний ші-компаньйон: 7 днів безкоштовно і 30 повідомлень, без картки.

Ціни та ліміти

Читати далі