Bir görsel oluşturma isteğinin kabul edilmesi, görselin hazır olduğu anlamına gelmez. Uygulamanızın görev kimliğini saklaması, aynı görevi sorgulaması ve başarısız olan ya da kesintiye uğrayan bir isteği yanlışlıkla başka bir iş başlatmadan ele alması gerekir.
Bu eğitimde, bu süreci yöneten küçük bir sunucu tarafı Node.js istemcisi geliştireceğiz. İstemcinin ayrı submit ve resume komutları var: biri görev oluştururken diğeri yalnızca mevcut bir görevi sorgular. Ana sayfadaki bir tanıtım görselinden kopyaladığınız model adıyla değil, API'nin desteklediği model kimlikleriyle başlayın.
Eğitim, metinden görsel oluşturmayı kapsar. Referans dosyası yüklemez, tarayıcı arayüzü geliştirmez ve model kalitesini ölçmez. Doğrulama, yerelde sahte yanıtlarla yürütülen 29 test ile 4 Eylül 2026 tarihinde üretim ortamında kontrollü olarak çalıştırılan tek bir görsel görevine dayanır. Bu görev bir görsel döndürmüş ve 120 puanlık API ücreti kaydedilmiştir. Bu, belirli bir tarihte yapılan tek bir entegrasyon kontrolüdür; hız karşılaştırması, herkes için geçerli bir fiyat veya başka bir hesapta kullanılabilirlik garantisi değildir.
Kapak görseli, 4 Eylül 2026 tarihinde alınmış bir model kataloğu ekran görüntüsüdür. Bunu güncel bir fiyat teklifi veya kullanılabilirlik garantisi olarak değil, belirli bir tarihe ait bir örnek olarak değerlendirin.
Önemli noktalar
- API anahtarını sunucunuzda tutun; tarayıcıya gönderilen kod paketlerine veya herkese açık depolara eklemeyin.
- Bir görsel görevi için kabul yanıtındaki sayısal
data.taskIddeğerini okuyun ve sonraki sorgular için saklayın.- Kaydettiğiniz görevin durumu
readyveyafailedolana kadar durum sorgulaması yapın. Görsel URL'lerinidata.imagesalanından yalnızca işlem başarıyla tamamlandıktan sonra okuyun.- İstemcide oluşan bir zaman aşımı, uzak görevin başarısız olduğunu veya iptal edildiğini kanıtlamaz. Elinizde görev kimliği varsa sorgulamaya devam edin; oluşturma isteğini sonucu öğrenmeden tekrarlamayın.
Bu rehberde
- Başlamadan önce
- Model seçimi ve API anahtarını yapılandırma
- cURL ile istek gönderme
- Durum sorgulama ve görsel URL'lerini okuma
- Eksiksiz Node.js örneği
- Hataları yönetme
- Video ve sohbet için farklılıklar
- Entegrasyonu doğrulama
Başlamadan önce
Node.js, bir API anahtarı ve API faturalandırması yapılandırılmış bir hesapla, özel bir terminal veya sunucu ortamı kullanın. Ekteki örnek, yerleşik fetch işlevini ve JavaScript modüllerini kullanır; üçüncü taraf paket kurulumu gerektirmez. Node'un genel API belgeleri, istemcinin tek bir isteğin süresini sınırlamak için kullandığı fetch ve AbortSignal.timeout özelliklerini açıklar. Yerel doğrulama ortamı, Node.js v22.22.1 çalıştıran Windows'tur; bu bilgi test ortamını kayda geçirir, diğer tüm sürümlerin test edildiği anlamına gelmez.
Dosya düzenleme, ortam değişkeni tanımlama ve JSON okuma konularına aşina olmalısınız. Devam etmeden önce yüklü çalışma zamanı sürümünüzü kontrol edin:
node --version
Komut, yüklü sürümünüzü göstermelidir. Görsel oluşturma API'sine bağlanmaz. İlerleyen bölümdeki eksiksiz istemciyi bir çalışma klasörünün içinde examples/pixmind-image.mjs adıyla kaydedin ve komutlarını o klasörden çalıştırın.
Müşteri verisi veya gizli bilgi içermeyen, zararsız bir test istemi seçin. Bu eğitimde stüdyo arka planında bir seramik kahve fincanı kullanıldığından referans yüklemek gerekmez. Göndermeden önce seçtiğiniz modelin güncel API fiyatını inceleyin. Studio kredileri, abonelikler ve API faturalandırmasının birbirinin yerine kullanılabildiğini varsaymayın; model kataloğu, geçerli API teklifini açıklar.
Yalnızca etkileşimli olarak bir görsel oluşturmak istiyorsanız Image Agent rehberi bu iş akışını anlatır. Buradaki istemci, model kimliğini açıkça belirten ve yanıtı kendisi işleyen bir uygulama içindir.
Modelinizi seçin ve API anahtarını yapılandırın
API'nin desteklediği bir model kimliği ve o modelin desteklediği parametreleri kullanın. Örnekte, API hızlı başlangıç rehberindeki görsel isteğiyle eşleşen nano-banana-pro modeli, aspectRatio: "1:1" ve resolution: "1K" parametreleri seçilmiştir. Kimlik doğrulamalı bir GET /models isteği ve üretim ortamı testi, bu birleşimin 4 Eylül 2026 tarihinde test hesabında çalıştığını doğruladı. Gerçek bir çalıştırmadan önce kendi hesabınız için kullanılabilirliği ve parametre desteğini yeniden kontrol edin. Yalnızca model dizesini değiştirmek, isteğin geri kalanının geçerliliğini koruyacağını garanti etmez.
API konsolunda bir anahtar oluşturun, ardından bunu sunucu sürecine PIXMIND_API_KEY olarak iletin. Varsa özel gizli bilgi yönetimi mekanizmanızı kullanın. Aşağıdaki örnekler, çalışan bir kimlik bilgisi değil, yer tutucuyla ortam değişkeni sözdizimini gösterir.
PowerShell için:
$env:PIXMIND_API_KEY = "REPLACE_WITH_YOUR_PRIVATE_API_KEY"
$env:PIXMIND_MODEL = "nano-banana-pro"
$env:PIXMIND_PROMPT = "A ceramic coffee cup on a plain studio background, soft side lighting, no text"
Bash için:
export PIXMIND_API_KEY="REPLACE_WITH_YOUR_PRIVATE_API_KEY"
export PIXMIND_MODEL="nano-banana-pro"
export PIXMIND_PROMPT="A ceramic coffee cup on a plain studio background, soft side lighting, no text"
Bu atamalar, mevcut kabuğu ve bu kabuktan başlatılan süreçleri yapılandırır. Görev oluşturmaz. Gerçek bir gizli değer girerken kabuk geçmişini ve kayıtları koruyun; bu değeri asla sürüm kontrolüne eklemeyin. Geliştirme ve üretim için ayrı anahtarlar kullanma ve ifşa durumunda anahtarları yenileme konusunda kimlik doğrulama rehberini izleyin.
Bu eğitimde kullanılan temel URL:
https://aihub-admin.aimix.pro/api-platform/v1
Bu adresin sonuna /generations veya /tasks/{taskId} ekleyin. İkinci bir /v1 eklemeyin. Modeller GET /models üzerinden keşfedilebilir; parametre seçmeden önce modele özgü yetenekleri incelemek için katalog daha kullanışlıdır.
İlk görsel oluşturma isteğinizi cURL ile gönderin
cURL isteği, Node.js submit komutuna bir alternatiftir; önceden çalıştırmanız gereken bir kurulum adımı değildir. İkisi de oluşturma isteği gönderir. Her ikisini de çalıştırmak, ücretlendirilebilir iki görev oluşturabilir. cURL ile gönderim yaparsanız ardından döndürülen görev kimliğiyle Node.js resume komutunu kullanın.
Bu örnek Bash sözdizimini kullanır. PowerShell'de Bash satır devamı karakterlerini terminale yapıştırmak yerine aşağıdaki Node.js istemcisini kullanın.
curl --connect-timeout 10 --max-time 30 \
--request POST \
'https://aihub-admin.aimix.pro/api-platform/v1/generations' \
--header "Authorization: Bearer $PIXMIND_API_KEY" \
--header 'Content-Type: application/json' \
--data '{
"model": "nano-banana-pro",
"type": "image",
"prompt": "A ceramic coffee cup on a plain studio background, soft side lighting, no text",
"aspectRatio": "1:1",
"resolution": "1K"
}'
Bu cURL gövdesindeki istem ve parametreler sabit değerlerdir. PIXMIND_PROMPT değerini değiştirmek bu JSON'u değiştirmez; söz konusu ortam değişkenini Node.js istemcisi okur. Bu ayrım, göndermek istediğiniz isteği çevresindeki kabuk yapılandırmasından ayrı tutmanıza yardımcı olur.
Aşağıda, kabul edilmiş bir yanıtın kısaltılmış temsili örneği yer alır. Buradaki kimlik bir yer tutucudur, üretim ortamı testinin kimliği değildir; 12345, sorgulamanız gereken bir görev değildir.
{
"code": 1000,
"message": "success",
"data": {
"id": "img_12345",
"taskId": 12345
}
}
Üretim ortamında test edilen medya yanıtlarında başarılı veriler, code, message, data ve timestamp alanlarını içeren bir nesneyle sunuldu; temsili örnekte zaman damgası ve diğer alanlar gösterilmemiştir. Bu iş akışında başarı için hem başarılı bir HTTP yanıtı hem de geçerli bir uygulama yanıtı gerekir. data.taskId değerini okuyun, data.id değerini değil: ikincisi img_12345 gibi ön ekli bir dize içerebilirken görev sorgulama yolu sayısal kimliği kullanır.
Sayısal kimliği hemen kaydedin. İstek, kimliği almadan önce zaman aşımına uğrarsa durun ve gönderimin sonucunu hesabınızın görev kayıtları veya destek üzerinden netleştirin. POST isteğini tekrarlamak, ne olduğunu öğrenmenin güvenli bir alternatifi değildir.
Görev durumu sorgulama ve görsel URL'lerini okuma
Mevcut görevi son duruma ulaşana kadar sorgulayın. Eşzamansız görev belgelerinde pending, processing, ready ve failed durumları açıklanır. Bu durum sorgulama akışını yalnızca son ikisi bitirir.
Submit once
|
Save numeric taskId
|
GET /tasks/{taskId} <--- wait, then query again
| ^
+--- pending / processing ---+
|
+--- ready ---> read images, stop
|
+--- failed ---> report failure, stop
Bash'te elle sorgulama yapmak için yer tutucu kimliği kendi kimliğinizle değiştirin:
TASK_ID="REPLACE_WITH_YOUR_NUMERIC_TASK_ID"
curl --connect-timeout 10 --max-time 30 \
"https://aihub-admin.aimix.pro/api-platform/v1/tasks/$TASK_ID" \
--header "Authorization: Bearer $PIXMIND_API_KEY"
Geçerli medya yanıtı yapısında ihtiyaç duyduğunuz alanların farklı görevleri vardır:
| Alan | Bu istemci için anlamı |
|---|---|
data.taskId |
Mevcut görevi sorgulamak için kullanılan sayısal kimlik |
data.status |
Beklemeye devam edilmesi, sonucun okunması veya başarısızlık nedeniyle durulması gerektiğini belirtir |
data.images |
ready durumundan sonra kullanılan görsel çıktısı URL'leri dizisi |
data.videoUrl |
Video çıktısı alanıdır; görsel sonuç dizisi değildir |
Kullanılabilir görsel URL'si içermeyen bir ready yanıtı, uygulamanız için başarılı bir görsel sonucu değildir. İncelenebilmesi için bu tutarsızlığı görev kimliğiyle birlikte bildirin. Yerine örnek bir URL koymayın veya görselin indirildiğini bildirmeyin.
İstemci, döndürülen görsel URL'lerini yazdırır; görsel dosyalarını indirmez veya arşivlemez. Uygulamanızın kalıcı depolamaya ihtiyacı varsa bunu ayrı bir adım olarak tasarlayın ve ilgili dosya saklama ve kullanım koşullarını doğrulayın. Bir URL'nin bulunmasını kalıcı depolama garantisi olarak yorumlamayın.
Eksiksiz Node.js örneğini çalıştırın
Yeni bir görev için submit, mevcut bir görev için resume kullanın. Betiği argüman vermeden çalıştırmak kullanım bilgisini gösterir ve API çağrısı yapmaz. Bu varsayılan davranış, sıradan bir yeniden başlatmanın veya komut satırı arayüzünü hızlıca incelemenin yeni bir iş oluşturmasını önler.
Aşağıdaki kaynak kodun tamamını examples/pixmind-image.mjs adıyla kaydedin:
Eksiksiz Node.js kaynak kodu: pixmind-image.mjs
import { pathToFileURL } from 'node:url';
const BASE_URL = 'https://aihub-admin.aimix.pro/api-platform/v1';
const sleep = ms => new Promise(resolve => setTimeout(resolve, ms));
export class ApiError extends Error {
constructor(message, { status = 0, transient = false, retryAfterMs = 0 } = {}) {
super(message);
Object.assign(this, { status, transient, retryAfterMs });
}
}
export function parseTaskId(value) {
if (!/^\d+$/.test(String(value))) throw new Error('Use a numeric taskId, not img_...');
const id = Number(value);
if (!Number.isSafeInteger(id) || id <= 0) throw new Error('Invalid taskId');
return id;
}
export function retryAfter(value, now) {
if (!value) return 0;
if (/^\d+(\.\d+)?$/.test(value)) return Number(value) * 1000;
const date = Date.parse(value);
return Number.isFinite(date) ? Math.max(0, date - now) : 0;
}
export function createClient({
apiKey,
fetchImpl = fetch,
now = Date.now,
wait = sleep,
random = Math.random,
requestTimeoutMs = 30_000,
pollTimeoutMs = 300_000,
maxConsecutiveErrors = 5,
} = {}) {
if (typeof apiKey !== 'string' || !apiKey.trim()) throw new Error('Set PIXMIND_API_KEY');
async function request(path, method, payload, timeoutMs = requestTimeoutMs) {
let response;
let body;
try {
response = await fetchImpl(`${BASE_URL}${path}`, {
method,
redirect: 'error',
headers: {
Authorization: `Bearer ${apiKey}`,
...(payload ? { 'Content-Type': 'application/json' } : {}),
},
...(payload ? { body: JSON.stringify(payload) } : {}),
signal: AbortSignal.timeout(Math.max(1, Math.ceil(timeoutMs))),
});
// Read the body inside the timeout/network error boundary as well.
body = await response.text();
} catch {
throw new ApiError('Network error or request timeout', { transient: true });
}
let envelope;
try { envelope = JSON.parse(body); } catch { /* handle below */ }
const transient = response.status === 429 || response.status >= 500;
if (!response.ok) {
// Do not echo arbitrary server bodies, prompts, credentials, or output URLs.
throw new ApiError(`HTTP ${response.status}; inspect the account and request`, {
status: response.status,
transient,
retryAfterMs: retryAfter(response.headers.get('retry-after'), now()),
});
}
if (!envelope || typeof envelope !== 'object') {
throw new ApiError('Expected a JSON API response');
}
if (envelope.code !== 1000 || !envelope.data) {
throw new ApiError('API returned an unsuccessful or incomplete envelope');
}
return envelope.data;
}
async function submit({ model = 'nano-banana-pro', prompt } = {}) {
if (typeof model !== 'string' || !model.trim()) throw new Error('A model is required');
if (typeof prompt !== 'string' || !prompt.trim()) throw new Error('A prompt is required');
try {
const data = await request('/generations', 'POST', {
model, type: 'image', prompt, aspectRatio: '1:1', resolution: '1K',
});
// The public media contract returns a number, not the prefixed display ID.
if (typeof data.taskId !== 'number') throw new Error('Missing numeric taskId');
return parseTaskId(data.taskId);
} catch (error) {
// A timeout or malformed response does not prove that creation failed.
throw new Error(`Submission not confirmed: ${error.message}. No automatic retry was made. Check task records before submitting again.`);
}
}
async function poll(taskId) {
const id = parseTaskId(taskId);
const deadline = now() + pollTimeoutMs;
let attempts = 0;
let errors = 0;
const timedOut = () => new Error(`Stopped waiting for task ${id}; it may still be running. Resume this ID later.`);
while (now() < deadline) {
let retryFloor = 0;
let task;
try {
task = await request(`/tasks/${id}`, 'GET', undefined,
Math.min(requestTimeoutMs, deadline - now()));
errors = 0;
} catch (error) {
if (now() >= deadline) throw timedOut();
if (!(error instanceof ApiError) || !error.transient) throw error;
errors += 1;
if (errors >= maxConsecutiveErrors) {
throw new Error(`Stopped after ${errors} consecutive query errors for task ${id}; resume this ID later.`);
}
retryFloor = error.retryAfterMs;
}
if (now() >= deadline) throw timedOut();
if (task) {
if (task.taskId !== id) throw new Error('Task response ID does not match the requested task');
if (task.status === 'failed') throw new Error(`Task ${id} failed; inspect its record before creating another task.`);
if (task.status === 'ready') {
if (!Array.isArray(task.images) || task.images.length === 0 ||
!task.images.every(url => {
try { return ['https:', 'http:'].includes(new URL(url).protocol); }
catch { return false; }
})) throw new Error(`Task ${id} is ready but has no valid image URLs`);
return task.images;
}
if (!['pending', 'processing'].includes(task.status)) {
throw new Error(`Task ${id} returned an unrecognized status; inspect its record.`);
}
}
// Client policy, not a PixMind latency guarantee or server-side retry feature.
const ceiling = Math.min(10_000, 1_000 * 2 ** Math.min(attempts++, 4));
const delay = Math.max(retryFloor, ceiling * (0.5 + 0.5 * random()));
const remaining = deadline - now();
if (delay >= remaining) {
// Never poll earlier than Retry-After just to fit the local deadline.
await wait(Math.max(0, remaining));
throw timedOut();
}
await wait(delay);
}
throw timedOut();
}
return { submit, poll };
}
export async function main(args = process.argv.slice(2), env = process.env, deps = {}) {
const log = deps.log ?? console.log;
const [mode, rawId] = args;
if (!mode) {
log('Usage: node examples/pixmind-image.mjs submit | resume TASK_ID');
return;
}
if (!((mode === 'submit' && args.length === 1) || (mode === 'resume' && args.length === 2))) {
throw new Error('Use submit, or resume followed by a numeric taskId');
}
const resumeId = mode === 'resume' ? parseTaskId(rawId) : undefined;
const client = createClient({ ...deps, apiKey: env.PIXMIND_API_KEY });
const id = resumeId ?? await client.submit({
model: env.PIXMIND_MODEL || 'nano-banana-pro',
prompt: env.PIXMIND_PROMPT || 'A studio photograph of an unbranded ceramic coffee cup on a plain background',
});
// Save this line in your application record before relying on the polling process.
log(`TASK_ID=${id}`);
log(`Resume without a new generation: node examples/pixmind-image.mjs resume ${id}`);
const images = await client.poll(id);
log(JSON.stringify({ taskId: id, images }, null, 2));
}
if (process.argv[1] && import.meta.url === pathToFileURL(process.argv[1]).href) {
main().catch(error => { console.error(error.message); process.exitCode = 1; });
}
Önce hiçbir istek göndermeden komut arayüzünü inceleyin:
node examples/pixmind-image.mjs
Anahtarı, model parametrelerini ve beklenen ücreti kontrol ettikten sonra bir görev oluşturun:
node examples/pixmind-image.mjs submit
Oluşturma başarılı olduğunda istemci, görseli beklemeye başlamadan önce TASK_ID değerini hemen yazdırır. Gerçek değeri güvenli bir yere kopyalayın. Bu örnek, değeri dosyaya veya veritabanına kalıcı olarak kaydetmez; çıktıyı saklamadıysanız terminali kapatmak, işlemi sürdürmenizi sağlayan bu bilgiyi kaybetmenize yol açabilir.
Bir görevi sorgulamaya devam etmek için 12345 yerine kaydettiğiniz değeri yazın:
node examples/pixmind-image.mjs resume 12345
Bu komut yalnızca görev GET istekleri yapar. Yeni bir istem okuyup başka bir görsel oluşturmaz. Başarılı bir son durum, kendi görevinize ait çıktı URL'lerini üretmelidir; burada karşılaştırma ölçütü olarak uydurma bir üretim ortamı çıktısı verilmemektedir.
Örnekte her HTTP isteği için 30 saniyelik sınır ve durum sorgulaması için toplam beş dakikalık süre sınırı kullanılır. GET yeniden denemelerinde rastgele sapma eklenmiş üstel bekleme artışı, yerel olarak 10 saniyeyle sınırlanmış bekleme süresi ve uygun olduğunda geçerli bir Retry-After yanıt başlığı kullanılır. Sunucunun istediği daha uzun bekleme süresi önceliklidir; bu süre yerel zaman sınırını aşacaksa istemci erken sorgulama yapmak yerine durur. Art arda gelen beşinci geçici GET hatası işlemi sonlandırır; böylece bu hata dizisinde dört yeniden denemeye izin verilir. Bunlar istemci ayarlarıdır, hizmet düzeyi anlaşması veya her görselin beş dakika içinde tamamlanacağına ilişkin bir taahhüt değildir.
Uygulamanıza uygun bir toplam bekleme politikası seçin. Uzun süren bir iş, terminal oturumundan veya web isteğinden daha uzun sürebilir. Yayındaki bir hizmette görev kimliğini kendi iş kaydınızla birlikte saklayın ve kullanıcıyı tek bir bağlantıyı açık tutmaya zorlamak yerine tarayıcıya ayrı bir durum uç noktası sunun.
Ücretli işleri tekrarlamadan hataları yönetin
Oluşturma sonucunun belirsiz olmasını, başarısız bir durum sorgusundan farklı ele alın. Görev sorgulayan bir GET isteği, yeni bir oluşturma işlemi başlatmadan tekrarlanabilir. Yanıtı kaybolan bir oluşturma POST isteği ise işi çoktan başlatmış olabilir; bu nedenle örnek, bu isteği asla otomatik olarak yeniden göndermez.
| Gözlem | Sonraki adım |
|---|---|
HTTP 400 |
Bilinçli olarak yeniden denemeden önce istek yapısını, model kimliğini ve desteklenen parametreleri kontrol edin. |
HTTP 401 veya 403 |
Kimlik doğrulamayı ve erişimi kontrol edin. Hata ayıklarken anahtarı günlüklere yazmayın. |
Görev sorgusunda HTTP 404 |
Kaydettiğiniz sayısal kimliği ve görevin ait olduğu hesabı kontrol edin. Başka birinin görev kimliğini kullanmayın. |
Görev GET isteğinde HTTP 429 |
Geçerli bir Retry-After başlığına ve istemcinin sınırlı yeniden deneme politikasına uygun şekilde bekleyin. |
| Görev GET isteğinde ağ hatası veya geçici sunucu hatası | Yapılandırılmış sınırlarda duracak şekilde, aralıklı bekleyerek aynı sorguyu yeniden deneyin. |
Görev durumu failed |
Sorgulamayı durdurun ve görevin başarısız olduğunu bildirin. Yeni bir oluşturma işlemi ayrı bir karar gerektirir. |
Oluşturma sırasında zaman aşımı, geçersiz JSON veya eksik taskId |
Oluşturma sonucunu bilinmiyor olarak değerlendirin. Yeniden göndermeden önce görev kayıtlarını kontrol edin. |
Tüm hataların aynı yanıt yapısını kullandığını varsaymayın. 4 Eylül'deki üretim ortamı kontrolünde, kimlik doğrulaması yapılmadan gönderilen GET /models isteği HTTP 401 döndürdü ve yalnızca code ve message alanlarını içeriyordu; kimlik doğrulamalı başarılı medya yanıtları ise ayrıca data ve timestamp alanlarını içeriyordu. Bu nedenle eğitim, her yanıtta bir requestId, retryable işareti veya fiyat alanı bulunacağını taahhüt etmez. Yukarıdaki diğer hata durumları, istemcinin bunları nasıl ele aldığını açıklar; her birinin üretim ortamında yeniden oluşturulduğu iddiasını taşımaz. HTTP durumunu ve varsa hassas bilgilerden arındırılmış uygulama mesajını saklayın; biçimi bozuk gövdeleri JSON.parse içinde çökmek yerine hata olarak ele alın.
Durum sorgulamasında zaman aşımı, uzak görevin iptal edildiği değil, istemcinin beklemeyi bıraktığı anlamına gelir. Kimliği saklayın ve daha sonra devam edin. Tanınmayan bir durum da başarı kanıtı değildir: bu istemci durur ve inceleme için o durumu bildirir. Bir değer switch ifadesinde yer almıyor diye akışın “tamamlandı” sonucuna geçmesine asla izin vermeyin.
Sorun giderme için görev kimliğini, model kimliğini, işlemi, HTTP durumunu ve yaklaşık zamanı saklayın. Yetkilendirme başlıklarını veya özel istemler içeren tam istek gövdelerini kaydetmekten kaçının. Paylaşmadan önce tanılama yanıt gövdelerinin veya çıktı URL'lerinin hassas bilgi içerip içermediğini kontrol edin.
Yaklaşımı video ve sohbet için uyarlayın
Video için de aynı gönderme ve durum sorgulama yaklaşımı kullanılabilir; ancak kendi istek doğrulamasına ve sonuç okuyucusuna ihtiyaç vardır. Görsel isteği gövdesinin alanlarını varsayımlarla yeniden kullanmak yerine, seçtiğiniz video modelinin gerekli girdi medyasını, süre, çözünürlük ve ses seçeneklerini kontrol edin. Tamamlanmış bir video, data.videoUrl kullanır; data.images kullanmaz.
Video Agent rehberi, etkileşimli bir yaratıcı iş akışını açıklar. Oluşturma işlemini otomatikleştirmeden önce hedeflediğiniz çekimi tanımlamanıza yardımcı olabilir; ancak bir Agent özelliğinin bulunması, aynı adlı bir API parametresinin varlığını kanıtlamaz.
Sohbet, ayrı bir entegrasyon yoludur. Belgelerdeki /chat/completions yolu OpenAI uyumludur ve bir sohbet yanıtı veya akış istendiğinde akış döndürür. Bu yanıtı görsel istemcisinin data.taskId ayrıştırıcısına vermeyin. Aynı temel URL'nin kullanılması, her uç noktanın aynı yanıt yapısına sahip olduğu anlamına gelmez.
Görsel akışı doğrulanana kadar istemcinin kapsamını dar tutun. Video bağdaştırıcısını veya sohbet istemcisini, kendi yanıt yapısını test eden testlerle ayrı olarak ekleyin. Bu ayrım, döndürülen nesnenin görsel görevi, video görevi veya sohbet mesajı olduğunu tahmin etmeye çalışan tek bir işlevden daha kolay anlaşılır.
Entegrasyonunuzu doğrulayın ve sonraki adımı seçin
Yerel sahte yanıt testleri, API bakiyesi harcamadan istemci davranışını kontrol eder. Ekteki test takımı, belirtilen Windows ve Node.js ortamında 29 testi geçti. Bunlar arasında tek POST ile gönderim akışı, yalnızca GET ile sürdürme, biçimi bozuk yanıtlar, son durum olarak başarısızlık, süre sınırları ve yeniden deneme limitleri yer alır. Ekteki test dosyasını istemci kaynak kodunun yanına kaydedin, ardından test takımını eğitim klasöründen çalıştırın:
node --test examples/pixmind-image.test.mjs
Sahte yanıt testleri, üretim ortamındaki kullanılabilirliği veya faturalandırmayı doğrulamaz. 4 Eylül 2026 tarihinde yapılan ayrı bir kontrollü kontrolde aynı istemci kullanıldı ve aşağıdaki kapsam kaydedildi:
| Test öğesi | Gözlemlenen sonuç |
|---|---|
| İstek | Tek bir POST /generations isteği; kullanılan model ve parametreler: nano-banana-pro, type: "image", aspectRatio: "1:1" ve resolution: "1K" |
| İstem | A studio photograph of an unbranded ceramic coffee cup on a plain background |
| İşlemi sürdürmek için saklanan bilgi | Durum sorgulamasından önce saklanan sayısal görev kimliği 64114; bu, okuyucuların sorgulayacağı bir kimlik değil, kanıt kaydına ait bir referanstır |
| Tamamlanma | Aynı göreve yönelik sekiz GET sorgusu; son durum ready, data.images içinde tek bir URL |
| Çıktı incelemesi | Döndürülen görsel 1024 × 1024 piksel boyutunda yüklendi ve düz bir arka plan üzerinde seramik bir fincan gösterdiği görüldü |
| Faturalandırma | API fiyatlandırma yanıtı bu yapılandırma için 120 puan belirtti; görevle ilişkilendirilen API hesap hareketlerinde 120 puanlık düşüm kaydedildi |
Kontrolde, projede mevcut tek bir API anahtarı ve hassas bilgi içermeyen bir istem kullanıldı; referans dosyası yüklenmedi ve oluşturma isteği otomatik olarak yeniden denenmedi. Hesap hareketi, Studio bakiye ekranından çıkarım yapmak yerine görev kimliğiyle eşleştirildi. Gerçek ortamda yalnızca bu tek yapılandırma ve başarılı görsel akışı test edildi; video, sohbet, başarısızlık durumundaki faturalandırma, iadeler ve tekrarlanan çalıştırmalardaki güvenilirlik test edilmedi. Geçmişte kaydedilmiş bu ücreti sürekli geçerli bir fiyat teklifi saymak yerine, kendi gönderiminizden önce fiyatı yeniden kontrol edin.
Örneği gerçek bir kullanıcı iş akışına bağlamadan önce şunları kontrol edin:
- Anahtar sunucuda kalmalı; istemci kod paketlerinde, ekran görüntülerinde ve herkese açık günlüklerde bulunmamalıdır.
- Seçilen model ve her bir parametre güncel API hizmeti tarafından desteklenmelidir.
- Kabul edilen gönderimden sonra elinizde yeniden erişebileceğiniz sayısal bir görev kimliği kalmalıdır.
resume, geçici sorgu hatalarından sonra da dahil olmak üzere, oluşturma POST isteği yapmamalıdır.- Görev başarısızlığı, boş sonuç ve yerel zaman aşımı, tanılamada farklı sonuçlar üretmelidir.
- Kaybolan bir oluşturma yanıtı, otomatik olarak ikinci bir gönderimi tetiklememelidir.
Kendi kontrollü gerçek ortam denemenizde hesabı, modeli, onaylanan maliyet kapsamını, hassas bilgilerden arındırılmış isteği, görev kimliğini, son durum yanıtını ve gerçek hesap hareketini kaydedin. URL'nin varlığını kontrol etmenin yanı sıra çıktıyı ayrıca inceleyin. Her yeni gönderimin ücretli bir iş oluşturabileceğini hesaba katmadan temel işleyiş kontrollerini tekrar tekrar çalıştırmayın.
Hazır olduğunuzda bir API anahtarı oluşturun ve tek bir gönderim yöntemi seçin. Kuyruk, yükleme veya toplu işleme eklemeden önce, kaydedilmiş görev üzerinden ilerleyen iş akışını temel alın. Sonraki adımınız oluşturulan dosyaları yaratıcı inceleme sürecine dahil etmekse Canvas ürün reklamı iş akışı, insan yönlendirmesine dayalı ayrı bir örnek sunar; bu, Canvas projelerinin bu API üzerinden çalıştırılabileceğine dair bir taahhüt değildir.
Editoryal sorumluluk: PixMind Editorial Team, bu eğitimin kurumsal yazar adıdır. Eğitimin dayandığı kanıtlar; resmi belgeler, projenin medya denetleyicisi uygulaması, 29 yerel sahte yanıt testi ve yukarıda açıklanan tek üretim ortamı kontrolüdür. Bunların tümü 4 Eylül 2026 tarihinde incelenmiştir. Hassas bilgilerden arındırılmış görev ve faturalandırma kayıtları editoryal doğrulama için saklanır. Herhangi bir mühendisin kişisel uzmanlık veya yeterliliği, karşılaştırmalı model kalitesi sonucu ya da performans ölçütü iddia edilmez.
Wan 3.0 Video: Girdiler, Ses, Fiyatlar ve API İçin Eksiksiz Rehber



