# Görev Yaşam Döngüsü

Tripo API'deki tüm nesil API'ler eşzamansız bir görev modeli kullanır. Siz bir istek gönderdikten sonra API, bir `task_id` döndürür. Daha sonra görev durumunu ve sonucunu yoklayabilirsiniz.

## Durum Makinesi

```
queued -> running -> success
                 -> failed
                 -> cancelled
```

## Durum Açıklamaları

| Durum | Açıklama | ilerleme |
| :-: | :-: | :-: |
| `queued` | Görev oluşturuldu ve kuyrukta bekliyor | 0 |
| `running` | Görev işleniyor | 0-100 |
| `success` | Görev tamamlandı ve `output` alanı mevcut | 100 |
| `failed` | Görev genellikle sunucu tarafındaki bir sorun nedeniyle başarısız oldu. Desteğe başvurun | - |
| `banned` | Giriş içeriği içerik politikasını ihlal ediyor | - |
| `expired` | Görevin süresi doldu ve çıktı dosyaları artık kullanılamıyor | - |
| `cancelled` | Görev iptal edildi | - |

## Görev Akışı

```
1. Create a task (POST /v3/generation/*)
   |
   v
2. Return task_id
   |
   v
3. Poll status (GET /v3/tasks/{task_id})
   |
   v
4a. status=success -> Get download links from output
4b. status=failed  -> Check error details and contact support
4c. status=banned  -> Modify the input content and submit again
```

## Kredi Dondurma Modeli

Tripo, kullanıcılardan başarısız görevler için ücret alınmamasını sağlamak için kredi "dondur sonra düş" modelini kullanır:

| Sahne | Kredi Değişikliği | Açıklama |
| :-: | :-: | :-: |
| Görev oluşturma | Gerekli kredileri dondurun | Krediler mevcut bakiyeden ön yetkilendirilir ve dondurulur. |
| Görev başarılı oldu | Dondurulan krediler tüketilen kredilere dönüşüyor | Krediler resmen kesildi |
| Görev başarısız oluyor | Dondurulan krediler serbest bırakıldı | Krediler mevcut bakiyeye iade edilir |
| Görev iptal edildi | Dondurulan krediler serbest bırakıldı | Krediler mevcut bakiyeye iade edilir |

Mevcut bakiyeyi ve dondurulmuş kredileri sorgulayın:

```bash
curl -X GET https://openapi.tripo3d.ai/v3/account/balance \
  -H "Authorization: Bearer {api_key}"
```

```json
{
  "code": 0,
  "data": {
    "balance": 10000,
    "frozen": 200
  }
}
```

## Anket Önerileri

- **Yoklama aralığı**: Her 1-2 saniyede bir sorgulama
- **İlerlemeyi görüntülemek için `progress` alanını kullanın**: Değer, 0 ile 100 arasında bir tam sayıdır
- **Zaman aşımı ayarlayın**: 5 dakika gibi bir maksimum yoklama süresi ayarlamanızı öneririz. Zaman aşımına uğrarsa kullanıcıya daha sonra tekrar kontrol etmesini söyleyin
- **Toplu görevler için `POST /v3/tasks/list` kullanın**: İstek sayısını azaltın

### Python Yoklama Örneği

```python
import time
import requests

def wait_for_task(task_id, api_key, interval=2, timeout=300):
    url = f"https://openapi.tripo3d.ai/v3/tasks/{task_id}"
    headers = {"Authorization": f"Bearer {api_key}"}
    start = time.time()

    while time.time() - start < timeout:
        response = requests.get(url, headers=headers)
        task = response.json()["data"]
        status = task["status"]
        progress = task.get("progress", 0)

        print(f"[{task_id}] {status} ({progress}%)")

        if status == "success":
            return task["output"]
        if status in ("failed", "cancelled", "banned"):
            raise Exception(f"Task terminated: {status}")

        time.sleep(interval)

    raise TimeoutError(f"Task {task_id} timed out")
```

### JavaScript Yoklama Örneği

```javascript
async function waitForTask(taskId, apiKey, interval = 2000, timeout = 300000) {
  const url = `https://openapi.tripo3d.ai/v3/tasks/${taskId}`;
  const headers = { "Authorization": `Bearer ${apiKey}` };
  const start = Date.now();

  while (Date.now() - start < timeout) {
    const response = await fetch(url, { headers });
    const { data: task } = await response.json();
    const { status, progress = 0 } = task;

    console.log(`[${taskId}] ${status} (${progress}%)`);

    if (status === "success") return task.output;
    if (["failed", "cancelled", "banned"].includes(status)) {
      throw new Error(`Task terminated: ${status}`);
    }

    await new Promise(resolve => setTimeout(resolve, interval));
  }

  throw new Error(`Task ${taskId} timed out`);
}
```
