Реализация AI-генерации изображений (DALL-E) в мобильном приложении
DALL-E 3 через OpenAI API — самый простой в интеграции провайдер генерации изображений. Один POST-запрос, URL в ответе, загрузка картинки. Сложность не в самом API, а в UX: генерация занимает 5–15 секунд, и это время нужно грамотно заполнить. Плюс — prompt engineering, который напрямую влияет на качество результата.
API: базовая интеграция
struct DALLERequest: Codable {
let model: String
let prompt: String
let n: Int
let size: String
let quality: String
let style: String
let responseFormat: String
enum CodingKeys: String, CodingKey {
case model, prompt, n, size, quality, style
case responseFormat = "response_format"
}
}
func generate(prompt: String) async throws -> URL {
let request = DALLERequest(
model: "dall-e-3",
prompt: prompt,
n: 1,
size: "1024x1024",
quality: "standard",
style: "vivid",
responseFormat: "url"
)
var urlRequest = URLRequest(url: URL(string: "https://api.openai.com/v1/images/generations")!)
urlRequest.httpMethod = "POST"
urlRequest.setValue("Bearer \(apiKey)", forHTTPHeaderField: "Authorization")
urlRequest.setValue("application/json", forHTTPHeaderField: "Content-Type")
urlRequest.httpBody = try JSONEncoder().encode(request)
let (data, _) = try await URLSession.shared.data(for: urlRequest)
let response = try JSONDecoder().decode(ImageGenerationResponse.self, from: data)
return URL(string: response.data[0].url)!
}
Параметры DALL-E 3:
-
size:1024x1024,1792x1024(landscape),1024x1792(portrait) -
quality:standard(быстрее, дешевле) илиhd(детализированнее) -
style:vivid(насыщенный, контрастный) илиnatural(фотореалистичный) -
response_format:url(ссылка на 60 минут) илиb64_json(base64 сразу)
DALL-E 3 не поддерживает n > 1 — только одно изображение за запрос.
UX во время генерации
5–15 секунд ожидания без фидбека — плохой UX. Варианты:
Animated placeholder — skeleton или анимированный градиент на месте будущего изображения. Пользователь понимает, что что-то происходит.
Прогресс-бар с шагами — нельзя показать реальный прогресс (API не стримит), но можно показать анимированный псевдо-прогресс: «Анализируем запрос → Генерируем → Финализируем». Визуально работает.
Prompt preview — пока идёт генерация, показывать переработанный промпт от DALL-E. API возвращает revised_prompt — реальное описание, которое модель использовала. Это интересно для пользователя и заполняет время.
// revised_prompt приходит в ответе
let revisedPrompt = response.data[0].revisedPrompt
// Показываем его в UI, пока изображение загружается
promptLabel.text = revisedPrompt
Кэширование и хранение
Сгенерированные изображения нужно сохранять. URL из ответа живёт 60 минут — после этого 404. Загружай и кэшируй сразу после генерации.
// Android: загрузка и сохранение через Coil
suspend fun downloadAndCache(imageUrl: String, localKey: String): File {
val request = ImageRequest.Builder(context)
.data(imageUrl)
.diskCacheKey(localKey)
.build()
val result = imageLoader.execute(request)
// Coil автоматически сохраняет в disk cache
return File(context.cacheDir, "dalle_${localKey}.jpg")
}
Для долгосрочного хранения — сохраняй в MediaStore (Android) или Photos (iOS) по запросу пользователя. Автосохранение без явного действия — нарушение App Store guidelines.
Prompt engineering для мобильного UI
Качество DALL-E 3 сильно зависит от промпта. Для пользовательских приложений:
System prompt-обёртка — перед отправкой в API дополняй пользовательский текст стандартными инструкциями:
let enhancedPrompt = """
\(userPrompt)
Style: high quality, detailed, professional photography or illustration.
Avoid text, watermarks, blurry elements.
"""
DALL-E 3 сам переписывает промпт (revised_prompt), но задание стиля помогает избежать случайных вариаций.
Content policy. DALL-E 3 отклоняет промпты с насилием, обнажённостью, реальными людьми по имени. Ответ — 400 с code: content_policy_violation. На клиенте — показывай понятное сообщение пользователю, не технический error code.
Вариации и редактирование
DALL-E 2 (не 3) поддерживает:
-
/v1/images/variations— вариации существующего изображения -
/v1/images/edits— редактирование с маской (inpainting)
DALL-E 3 этих эндпоинтов не имеет. Если нужно редактирование — либо DALL-E 2, либо Stable Diffusion через Replicate/FAL.
Сроки
Генерация с базовым UI (текстовое поле + кнопка + отображение результата) — 2–3 дня. Полноценная галерея с историей, сохранением, sharing, вариациями — 8–12 дней.







