پرش به محتوا
هوشی

API یکپارچه

Embedding، تصویر و صدا

چهار endpoint دیگر API یکپارچه همان قرارداد OpenAI را دارند؛ پس با client.embeddings، client.images و client.audio در SDK رسمی OpenAI به مدل‌های OpenAI، Google، FLUX، Stability و ElevenLabs دسترسی داری.

Embeddings (بردار معنایی)

POSThttps://api.hooshi.ai/v1/embeddings

متن را به بردار عددی تبدیل می‌کند؛ پایهٔ جستجوی معنایی، RAG، خوشه‌بندی و پیشنهاددهی. مدل‌های فعلی: openai/text-embedding-3-small، openai/text-embedding-3-large و gemini/gemini-embedding-2.

پارامترنوعتوضیح
modelالزامیstringشناسهٔ یک مدل از نوع embedding.
inputالزامیstring | string[]یک متن یا آرایه‌ای از متن‌ها (برای کارایی بهتر، چند متن را در یک درخواست بفرست).
dimensionsاختیاریintegerکوتاه‌کردن طول بردار (در مدل‌هایی که پشتیبانی می‌کنند، مثل text-embedding-3).
encoding_formatاختیاریstringfloat (پیش‌فرض) یا base64.
resp = client.embeddings.create(
    model="openai/text-embedding-3-small",
    input=["هوش مصنوعی چیست؟", "یادگیری ماشین شاخه‌ای از هوش مصنوعی است."],
)
vectors = [d.embedding for d in resp.data]
print(len(vectors), len(vectors[0]))  # 2 1536

پاسخ همان قالب OpenAI است:

JSON
{
  "object": "list",
  "data": [{ "object": "embedding", "index": 0, "embedding": [0.0123, -0.0456, ...] }],
  "model": "openai/text-embedding-3-small",
  "usage": { "prompt_tokens": 9, "total_tokens": 9 }
}

نمونهٔ کامل جستجوی معنایی و RAG را در نمونه‌ها ببین.

ساخت تصویر

POSThttps://api.hooshi.ai/v1/images/generations

یک endpoint برای همهٔ مدل‌های تصویری: GPT Image (OpenAI)، Gemini Flash Image، Grok Imagine، FLUX (BFL و Together) و Stable Image. خروجی همیشه به‌صورت b64_json (PNG) برمی‌گردد؛ پس لینک موقتی نداری که منقضی شود.

پارامترنوعتوضیح
promptالزامیstringتوضیح تصویر؛ حداکثر ۳۲٬۰۰۰ کاراکتر. پرامپت انگلیسی معمولاً نتیجهٔ دقیق‌تری می‌دهد.
modelاختیاریstringپیش‌فرض openai/gpt-image-2. هر مدل از نوع image.
nاختیاریintegerتعداد تصویر، ۱ تا ۴. پیش‌فرض ۱.
sizeاختیاریstringمثلاً 1024x1024، 1536x1024 یا auto. برای Stability به نسبت تصویر تبدیل می‌شود.
qualityاختیاریstringبرای مدل‌های OpenAI: low، medium، high یا auto.
backgroundاختیاریstringبرای مدل‌های OpenAI: transparent برای پس‌زمینهٔ شفاف (در مدل‌های دارای این قابلیت).
aspect_ratioاختیاریstringبرای Stability و مدل‌های سازگار مثل Grok: 16:9، 1:1، 9:16 و… .
import base64

resp = client.images.generate(
    model="openai/gpt-image-2",
    prompt="A fluffy cream Persian robot cat with a teal headset, soft 3D, studio light",
    size="1536x1024",
    quality="high",
)
open("cat.png", "wb").write(base64.b64decode(resp.data[0].b64_json))
JSON
{
  "created": 1791590400,
  "data": [{ "b64_json": "iVBORw0KGgoAAAANSUhEUgAA...", "revised_prompt": "..." }],
  "usage": { "prompt_tokens": 38, "completion_tokens": 4160, "total_tokens": 4198, "prompt_tokens_details": { "cached_tokens": 0 } }
}

هزینهٔ تصویر

مدل‌های GPT Image بر اساس توکن ورودی و خروجی (که به اندازه و کیفیت بستگی دارد) و بقیهٔ مدل‌ها بر اساس تعداد تصویر قیمت‌گذاری می‌شوند. قیمت دقیق هر مدل در فهرست مدل‌ها است. برای ویرایش تصویر با OpenAI از API بومی و مسیر /images/edits استفاده کن.

تبدیل متن به صدا (TTS)

POSThttps://api.hooshi.ai/v1/audio/speech

متن را به فایل صوتی MP3 تبدیل می‌کند. با مدل‌های OpenAI (مثل openai/gpt-4o-mini-tts) یا ElevenLabs (مثل elevenlabs/eleven_v4 با بهترین کیفیت فارسی). پاسخ مستقیماً بایت‌های صوتی با Content-Type: audio/mpeg است.

پارامترنوعتوضیح
inputالزامیstringمتنی که خوانده می‌شود؛ حداکثر ۱۰٬۰۰۰ کاراکتر.
voiceالزامیstringبرای OpenAI نام صدا (مثلاً alloy، nova، coral)؛ برای ElevenLabs شناسهٔ صدا (voice_id).
modelاختیاریstringپیش‌فرض openai/gpt-4o-mini-tts. هر مدل از نوع tts.
instructionsاختیاریstringبرای gpt-4o-mini-tts: لحن و سبک خواندن، مثلاً «گرم و آرام، مثل گوینده رادیو».
speedاختیاریnumberسرعت خواندن (مثلاً 0.9 تا 1.2).
with client.audio.speech.with_streaming_response.create(
    model="openai/gpt-4o-mini-tts",
    voice="coral",
    input="سلام! به هوشی خوش اومدی. امروز چطور می‌تونم کمکت کنم؟",
    instructions="گرم، صمیمی و با سرعت متوسط",
) as resp:
    resp.stream_to_file("welcome.mp3")

هزینهٔ TTS بر اساس هر ۱۰۰۰ کاراکتر متن ورودی محاسبه می‌شود. برای قابلیت‌های پیشرفتهٔ ElevenLabs (استریم، timestamp، دیالوگ چندگوینده، تغییر صدا، افکت و موسیقی) از API بومی ElevenLabs استفاده کن.

تبدیل صدا به متن (STT)

POSThttps://api.hooshi.ai/v1/audio/transcriptions
multipart/form-data

فایل صوتی (mp3، wav، m4a، webm، ogg و…) تا ۵۰ مگابایت را به متن تبدیل می‌کند. مدل‌ها: openai/gpt-transcribe (پیش‌فرض)، openai/gpt-4o-transcribe، groq/whisper-large-v3 (سریع و ارزان) و elevenlabs/scribe_v2 (با زمان‌بندی کلمه‌به‌کلمه).

پارامترنوعتوضیح
fileالزامیfileفایل صوتی، حداکثر ۵۰ مگابایت.
modelاختیاریstringپیش‌فرض openai/gpt-transcribe. هر مدل از نوع stt.
languageاختیاریstringکد زبان ISO-639-1، مثلاً fa؛ دقت و سرعت را بالا می‌برد.
promptاختیاریstringمتن راهنما (اسامی خاص، اصطلاحات) برای مدل‌های OpenAI.
with open("meeting.m4a", "rb") as f:
    tr = client.audio.transcriptions.create(model="openai/gpt-transcribe", file=f, language="fa")
print(tr.text)
JSON
{
  "text": "سلام، جلسهٔ امروز دربارهٔ برنامهٔ فصل بعد است...",
  "language": "fa",
  "duration": 312.4,
  "words": [{ "text": "سلام", "start": 0.12, "end": 0.48 }, ...]
}
فیلدتوضیح
textمتن کامل.
durationطول فایل به ثانیه؛ مبنای محاسبهٔ هزینه (قیمت به ازای هر دقیقه).
languageزبان تشخیص‌داده‌شده (در صورت ارائه توسط مدل).
wordsزمان‌بندی کلمه‌ها؛ فقط برای مدل‌هایی که ارائه می‌کنند (مثل scribe_v2).

ساخت ویدیو (ناهمگام)

POSThttps://api.hooshi.ai/v1/videos

ساخت ویدیو از متن با gemini/veo-3.1-generate-preview (ویدیو با صدای هم‌زمان) و xai/grok-imagine-video-1.5. ساخت ویدیو چند دقیقه طول می‌کشد؛ برای همین پاسخ فوراً با وضعیت in_progress برمی‌گردد و باید با GET /v1/videos/{id} وضعیت را هر ۵ تا ۱۰ ثانیه بررسی کنی. هزینه (به ازای هر ثانیه ویدیو) فقط وقتی کسر می‌شود که ویدیو تحویل شود؛ اگر ساخت ناموفق باشد، چیزی کسر نمی‌شود.

پارامترنوعتوضیح
modelالزامیstringیک مدل از نوع video.
promptالزامیstringتوصیف صحنه، حرکت دوربین، حال‌وهوا و صدا؛ تا ۴۰۰۰ کاراکتر.
durationاختیاریintegerطول ویدیو به ثانیه؛ پیش‌فرض ۸. Veo فقط ۴، ۶ یا ۸ ثانیه را می‌پذیرد.
aspect_ratioاختیاریstring16:9 (پیش‌فرض)، 9:16 یا 1:1 (فقط Grok).
resolutionاختیاریstring720p یا 1080p.
import time, requests

H = {"Authorization": f"Bearer {HOOSHI_API_KEY}"}
job = requests.post("https://api.hooshi.ai/v1/videos", headers=H, json={
    "model": "xai/grok-imagine-video-1.5",
    "prompt": "نمای هوایی آرام از کوه دماوند هنگام طلوع",
    "duration": 8,
}).json()

while job["status"] == "in_progress":
    time.sleep(8)
    job = requests.get(f"https://api.hooshi.ai/v1/videos/{job['id']}", headers=H).json()

if job["status"] == "completed":
    open("video.mp4", "wb").write(requests.get(job["url"], headers=H).content)
GET /v1/videos/{id}
{
  "id": "9f1c6f0e-...",
  "object": "video",
  "model": "xai/grok-imagine-video-1.5",
  "status": "completed",
  "seconds": 8,
  "aspect_ratio": "16:9",
  "url": "https://api.hooshi.ai/v1/videos/9f1c6f0e-.../content",
  "hooshi": { "cost": 104328, "currency": "IRT" }
}

مقادیر status: in_progress، completed و failed (همراه error.message). فایل ویدیو با همان کلید API از آدرس url دانلود می‌شود.

خطاهای اعتبارسنجی

اگر فیلد الزامی (مثل prompt، input، voice یا file) را نفرستی یا از سقف مجاز بیشتر باشد، پاسخ 422 با قالب اعتبارسنجی برمی‌گردد:

422 Unprocessable Content
{
  "message": "The voice field is required.",
  "errors": { "voice": ["The voice field is required."] }
}