تولید تصویر — Image generation
آشا یک endpoint سازگار با OpenAI برای تولید تصویر از متن (و تصویر مرجع) دارد: POST /v1/images/generations . فهرست مدلها و تعرفهها در صفحهٔ مدلها در دسترس است.
کشف مدلها
مدلهای تولید تصویر از طریق endpoint سازگار با OpenAI یعنی
GET /v1/models در دسترساند. هر مدل فیلد
architecture.output_modalities دارد که حالتهای
خروجیِ پشتیبانیشده (مثل image) را فهرست میکند:
curl "https://app.asha-ai.ir/v1/models"
مدلهایی که "image" را در
architecture.output_modalities دارند، مدلهای تولید
تصویرند. فهرست کامل و قیمت به تومان در صفحهٔ مدلها هم نمایش داده میشود.
استفاده از API
درخواست POST به
/v1/images/generations با مدل و prompt بفرستید:
import os
import requests
url = "https://app.asha-ai.ir/v1/images/generations"
headers = {
"Authorization": f"Bearer {os.environ['ASHA_API_KEY']}",
"Content-Type": "application/json",
}
payload = {
"model": "~bytedance-seed/seedream-4.5",
"prompt": "a red panda astronaut floating in space, studio lighting",
}
response = requests.post(url, headers=headers, json=payload)
result = response.json()
for image in result["data"]:
# image["b64_json"] contains the base64-encoded image
print(f"Generated image ({len(image['b64_json'])} chars)")
package main
import (
"bytes"
"encoding/base64"
"encoding/json"
"fmt"
"net/http"
"os"
)
func main() {
payload := map[string]any{
"model": "~bytedance-seed/seedream-4.5",
"prompt": "a red panda astronaut floating in space, studio lighting",
}
body, _ := json.Marshal(payload)
req, _ := http.NewRequest("POST", "https://app.asha-ai.ir/v1/images/generations", bytes.NewReader(body))
req.Header.Set("Authorization", "Bearer "+os.Getenv("ASHA_API_KEY"))
req.Header.Set("Content-Type", "application/json")
resp, err := http.DefaultClient.Do(req)
if err != nil {
panic(err)
}
defer resp.Body.Close()
var result struct {
Data []struct {
B64JSON string `json:"b64_json"`
} `json:"data"`
}
_ = json.NewDecoder(resp.Body).Decode(&result)
for _, image := range result.Data {
raw, _ := base64.StdEncoding.DecodeString(image.B64JSON)
fmt.Printf("Generated image (%d bytes)n", len(raw))
}
}
const response = await fetch("https://app.asha-ai.ir/v1/images/generations", {
method: "POST",
headers: {
Authorization: `Bearer ${process.env.ASHA_API_KEY}`,
"Content-Type": "application/json",
},
body: JSON.stringify({
model: "~bytedance-seed/seedream-4.5",
prompt: "a red panda astronaut floating in space, studio lighting",
}),
});
const result = await response.json();
for (const image of result.data) {
// image.b64_json contains the base64-encoded image
console.log(`Generated image (${image.b64_json.length} chars)`);
}
const response = await fetch("https://app.asha-ai.ir/v1/images/generations", {
method: "POST",
headers: {
Authorization: `Bearer ${process.env.ASHA_API_KEY}`,
"Content-Type": "application/json",
},
body: JSON.stringify({
model: "~bytedance-seed/seedream-4.5",
prompt: "a red panda astronaut floating in space, studio lighting",
}),
});
const result = await response.json();
for (const image of result.data) {
// image.b64_json contains the base64-encoded image
console.log(`Generated image (${image.b64_json.length} chars)`);
}
curl -X POST "https://app.asha-ai.ir/v1/images/generations"
-H "Authorization: Bearer $ASHA_API_KEY"
-H "Content-Type: application/json"
-d '{
"model": "~bytedance-seed/seedream-4.5",
"prompt": "a red panda astronaut floating in space, studio lighting"
}'
قالب پاسخ
خروجیها بهصورت بایتهای base64 برگردانده میشوند. فیلد
usage تعداد توکنها و هزینه را — هر وقت در دسترس بود —
گزارش میدهد. فیلد media_type وقتی حاضر است که فرمت قابل
شناسایی باشد (از جمله image/png) و فقط وقتی حذف میشود که
نتوان آن را تعیین کرد:
{
"created": 1748372400,
"data": [
{
"b64_json": "<base64-encoded-image>",
"media_type": "image/png"
}
],
"usage": {
"prompt_tokens": 0,
"completion_tokens": 4175,
"total_tokens": 4175,
"cost": 750
}
}
برای خروجیهای غیر-PNG (مثل JPEG، WebP یا SVG در مدلهای وکتوری Recraft)،
media_type فرمت واقعی را نشان میدهد:
{
"created": 1748372400,
"data": [
{
"b64_json": "<base64-encoded-image>",
"media_type": "image/svg+xml"
}
],
"usage": {
"prompt_tokens": 0,
"completion_tokens": 4175,
"total_tokens": 4175,
"cost": 750
}
}
گزینههای پیکربندی تصویر
رزولوشن و نسبت تصویر
ابعاد خروجی را با resolution،
aspect_ratio یا میانبرِ راحتترِ
size کنترل کنید:
{
"model": "~bytedance-seed/seedream-4.5",
"prompt": "a landscape photo",
"resolution": "2K",
"aspect_ratio": "16:9"
}
resolution— سطح نرمالشده (512،1K،2K،4K)؛ پیکسلهای دقیق بسته به ارائهدهنده استخراج میشوند.aspect_ratio— نسبت نرمالشده؛autoیعنی خودِ ارائهدهنده انتخاب کند. مقادیر رایج:1:1،16:9،9:16،4:3،3:4،3:2،2:3،4:5،5:4و نسبتهای کشیده مانند1:2،2:1،1:4،4:1،1:8،8:1،9:21،21:9. ارائهدهنده به زیرمجموعهٔ پشتیبانیشدهٔ خودش مقیاس میدهد.size— میانبر؛ یک سطح ("2K") یا پیکسل صریح ("2048x2048") بدهید تا برای ارائهدهنده نرمال شود. سطح، معادل تنظیمresolutionاست و باaspect_ratioترکیب میشود. پیکسل صریح، مرجعِ حاکم است و همراهیِresolution/aspect_ratioنامتناسب با آن، خطای 400 میدهد.
بسته به مدل، فقط برخی از این گزینهها پشتیبانی میشوند؛ گزینههای ناپشتیبانی نادیده گرفته میشوند یا خطای 400 میدهند.
کیفیت و فرمت خروجی
{
"model": "~openai/gpt-image-1",
"prompt": "a product photo",
"quality": "high",
"output_format": "png",
"background": "transparent"
}
quality—auto،low،mediumیاhigh. ارائهدهندههای بدون دستگیرهٔ کیفیت، آن را نادیده میگیرند.output_format—png،jpeg،webpیاsvg(فقط مدلهای وکتوریسازی؛ مارکآپ SVG داخلb64_jsonکد میشود).background—auto،transparentیاopaque.transparentبه فرمتِ دارای آلفا (png یا webp) نیاز دارد.output_compression— 0 تا 100 برای webp/jpeg؛ برای png نادیده گرفته میشود.
چند تصویر
با n تا ۱۰ تصویر در یک درخواست بخواهید:
{
"model": "~openai/gpt-image-1",
"prompt": "a cute cat",
"n": 4
}
همهٔ ارائهدهندهها از n > 1 پشتیبانی نمیکنند؛ در صورت نبود پشتیبانی، خطای 400 برمیگردد.
تبدیل تصویر به تصویر (تصویر مرجع)
تصویر مرجع را با input_references بفرستید تا ساختوساز را هدایت کند:
{
"model": "~openai/gpt-image-1",
"prompt": "make this scene look like a watercolor painting",
"input_references": [
{
"type": "image_url",
"image_url": {
"url": "https://example.com/photo.jpg"
}
}
]
}
تصویر مرجع میتواند URL (HTTP/S) یا Data URL base64 باشد. تعداد مراجع پذیرفتهشده بسته به ارائهدهنده متفاوت است.
مسیریابی انتخاب ارائهدهنده
وقتی مدلی چند ارائهدهنده دارد، با شیءِ provider مشخص کنید
کدام endpointها میتوانند درخواست را پاسخ بدهند:
{
"model": "~google/gemini-2.5-flash-image",
"prompt": "a red panda astronaut floating in space",
"provider": {
"only": ["google-ai-studio"],
"allow_fallbacks": false
}
}
Image API این فیلدهای مسیریابی را پشتیبانی میکند:
only— فقط ارائهدهندههای لیستشده.order— ارائهدهندهها را به همین ترتیب امتحان کن.ignore— ارائهدهندههای لیستشده را کنار بگذار.sort— endpointهای واجدشرایط را بر اساسprice،throughputیاlatencyمرتب کن.allow_fallbacks— وقتیfalseباشد، پس از ارائهدهندهٔ اصلی متوقف شود.
گزینههای مختص ارائهدهنده
پارامترهای مشخصِ هر ارائهدهنده را از طریق provider.options — با کلیدِ ارائهدهنده از endpoint API — بفرستید:
{
"model": "~black-forest-labs/flux.2-pro",
"prompt": "a dramatic portrait",
"provider": {
"options": {
"black-forest-labs": {
"steps": 40,
"guidance": 3
}
}
}
}
فیلد provider.options با کلیدِ نام ارائهدهنده، پارامترهای مختص همان ارائهدهنده را منتقل میکند.
صورتحساب و لغو
صورتحساب تولید تصویر همه یا هیچ است: یا تولید کامل میشود و کل مبلغ کسر میشود، یا شکست میخورد و مبلغی کسر نمیشود. این با chat completions فرق دارد، جایی که جریانِ لغوشده، برای توکنهای تولیدشدهٔ پیش از لغو حساب میشود.
- تولیدهای تکمیلشده بر اساس قیمتگذاری endpoint، برای کل خروجی تصویر صورتحساب میشوند.
- تولیدهای شکستخورده یا لغوشده صورتحساب نمیشوند. وقتی تولید کامل نشود، درخواست با
502 Bad Gatewayبرمیگردد و هیچ هزینهای ثبت نمیشود.
اگر کلاینت وسطِ تولید قطع شود، ممکن است ارائهدهندهٔ بالادستی همچنان تصویر را کامل کند. اما در هر صورت کلاینت فقط یکی از دو نتیجه را میبیند: نتیجهای که کامل صورتحساب شده یا خطا. آشا برای کاری که کاربر تحویل نگرفته، صورتحساب صادر نمیکند.
پارامترهای درخواست
| پارامتر | نوع | الزامی | شرح |
|---|---|---|---|
model | string | بله | نام مدل (مثل ~bytedance-seed/seedream-4.5) |
prompt | string | بله | توصیف متنی تصویر موردنظر |
n | integer | خیر | تعداد تصاویر (۱ تا ۱۰) |
resolution | string | خیر | سطح رزولوشن (512، 1K، 2K، 4K) |
aspect_ratio | string | خیر | نسبت تصویر (1:1، 16:9، 9:16، 4:3، 3:4، 1:4، 4:1 و…) با پشتیبانی auto |
size | string | خیر | میانبر — یک سطح یا پیکسل صریح ("2048x2048") |
quality | string | خیر | auto، low، medium یا high |
output_format | string | خیر | png، jpeg، webp یا svg |
background | string | خیر | auto، transparent یا opaque |
output_compression | integer | خیر | سطح فشردهسازی (۰ تا ۱۰۰) برای webp/jpeg |
seed | integer | خیر | Seed برای تولید قطعی (در صورت پشتیبانی) |
input_references | array | خیر | تصاویر مرجع برای تبدیل تصویر به تصویر |
provider.only | string[] | خیر | فقط این ارائهدهندهها |
provider.order | string[] | خیر | ارائهدهندهها را به این ترتیب امتحان کن |
provider.ignore | string[] | خیر | این ارائهدهندهها را کنار بگذار |
provider.sort | string/object | خیر | مرتبسازی بر اساس price، throughput یا latency |
provider.allow_fallbacks | boolean | خیر | در صورت شکست ارائهدهندهٔ اصلی، ارائهدهندهٔ دیگر |
provider.options | object | خیر | پارامترهای مختص ارائهدهنده با کلید ارائهدهنده |
برای اینکه بدانید هر مدل کدام پارامترها را پشتیبانی میکند، دادهٔ مدل را در GET /v1/models ببینید.
سؤالات متداول
چطور تصویر تولیدشده را دانلود کنم؟
خروجی در data[].b64_json بهصورت base64 میآید؛ آن را decode کنید و در فایل با فرمتِ media_type ذخیره کنید.
هزینهٔ تولید تصویر چقدر است؟
بسته به مدل و ابعاد (resolution)؛ قیمت هر مدل در صفحهٔ مدلها به تومان نمایش داده میشود.
آیا میتوانم با تصویر مرجع کار کنم؟
بله؛ با input_references میتوانید URL یا base64 تصویر مرجع بفرستید. تعداد مراجع هر مدل متفاوت است.
چه فرمتهایی تحویل میگیرم؟
png، jpeg، webp و برای مدلهای وکتوری svg. فرمت نهایی با output_format قابل انتخاب است.
اگر تولید وسط کار قطع شود، پولم کسر میشود؟
خیر. صورتحساب همه یا هیچ است؛ فقط تولیدهای کامل مبلغ میگیرند و درخواستهای ناموفق کسر نمیشوند.