# Integração de SDK

Use os SDKs oficiais da Tripo para enviar uma tarefa de texto para modelo, aguardar a conclusão, verificar o status final e baixar o modelo gerado. As fontes de instalação abaixo estão fixadas nas versões usadas para verificar esta página.

## SDKs compatíveis

| Linguagem | API | Versão fixada | Fonte de instalação |
| --- | --- | --- | --- |
| JavaScript / TypeScript | V3 | [`e351348`](https://github.com/VAST-AI-Research/tripo-js-sdk/tree/e35134801b339caac0b84f36fe02d08e73e217b2) | Commit Git oficial |
| Python | V2 + limited V3 | [`v0.4.2`](https://github.com/VAST-AI-Research/tripo-python-sdk/tree/v0.4.2) | PyPI `tripo3d==0.4.2` |
| Go | V3 | [`2c8c8d4`](https://github.com/VAST-AI-Research/tripo-go-sdk/tree/2c8c8d4e6a9e1fc9e49699fc055140eca689ee79) | Pseudo-versão do Go `v0.0.0-20260713072120-2c8c8d4e6a9e` |
| Rust | V3 | [`f992f6a`](https://github.com/VAST-AI-Research/tripo-rust-sdk/tree/f992f6a7cf7a28c10781f9fa28e4630c7802291c) | Dependência Git do Cargo |
| Java | V3 | [`7b6a68d`](https://github.com/VAST-AI-Research/tripo-java-sdk/tree/7b6a68d855e01a0b098775b1ee14ce7f3c8ac7d9) | Compilação do código-fonte; Maven local `0.1.0-SNAPSHOT` |

## 1. Configurar uma chave de API e a região

Crie uma chave no [console da Tripo](https://platform.tripo3d.ai/) e exponha-a somente ao processo do servidor. Não coloque uma chave de API no código do navegador nem a envie ao controle de versão.

```bash
export TRIPO_API_KEY="tsk_..."
```

JavaScript, Go e Rust usam `https://openapi.tripo3d.ai/v3` globalmente e `https://openapi.tripo3d.com/v3` na China. Java seleciona `TripoRegion.GLOBAL` ou `TripoRegion.CN`; o SDK parte da origem `.ai` ou `.com` correspondente e acrescenta `/v3`. O cliente V2 principal do Python 0.4.2 usa `https://api.tripo3d.ai/v2/openapi` globalmente e `https://api.tripo3d.com/v2/openapi` na China; o fluxo limitado de segmentação V3 também usa a origem correspondente `https://openapi.tripo3d.ai` ou `.com`.

## 2. Instalar o SDK

Instale cada SDK a partir da fonte de produção fixada.

### JavaScript

```bash
npm install github:VAST-AI-Research/tripo-js-sdk#e35134801b339caac0b84f36fe02d08e73e217b2
```

### Python

```bash
python -m pip install tripo3d==0.4.2
```

### Go

```bash
go get github.com/VAST-AI-Research/tripo-go-sdk@v0.0.0-20260713072120-2c8c8d4e6a9e
```

### Rust

```toml
[dependencies]
tripo3d-sdk = { git = "https://github.com/VAST-AI-Research/tripo-rust-sdk.git", rev = "f992f6a7cf7a28c10781f9fa28e4630c7802291c" }
tokio = { version = "1", features = ["full"] }
anyhow = "1"
```

### Java

```bash
git clone https://github.com/VAST-AI-Research/tripo-java-sdk.git
cd tripo-java-sdk
git checkout 7b6a68d855e01a0b098775b1ee14ce7f3c8ac7d9
./mvnw install
```

A compilação Java instala `ai.tripo3d:tripo-sdk:0.1.0-SNAPSHOT` no repositório Maven local. Adicione essas coordenadas ao aplicativo após a conclusão da compilação do código-fonte.

## 3. Enviar, aguardar e baixar

Cada exemplo no servidor lê `TRIPO_API_KEY`, envia uma tarefa de texto para modelo, aguarda um resultado final, verifica se houve sucesso e salva imediatamente o modelo principal. As URLs dos modelos gerados são temporárias.

### JavaScript

```javascript
import { writeFile } from 'node:fs/promises';
import { TripoClient, ModelVersion, TaskStatus } from 'tripo3d-sdk-js';

const apiKey = process.env.TRIPO_API_KEY;
if (!apiKey) throw new Error('TRIPO_API_KEY is required');

const client = new TripoClient({
  apiKey,
  baseUrl: 'https://openapi.tripo3d.ai/v3',
});

const taskId = await client.textToModel({
  prompt: 'a cute red panda holding bamboo',
  model: ModelVersion.H3_1,
  texture: true,
  pbr: true,
  texture_quality: 'detailed',
});

const task = await client.waitForTask(taskId, {
  pollingIntervalMs: 2000,
  onProgress: (value) => console.log(`${value.status} — ${value.progress ?? 0}%`),
});

if (task.status !== TaskStatus.SUCCESS) {
  throw new Error(`Task did not succeed: ${task.status}`);
}

const modelUrl = task.output.model_url ?? task.output.model;
if (!modelUrl) throw new Error('Task returned no model URL');

const response = await fetch(modelUrl);
if (!response.ok) throw new Error(`Download failed: HTTP ${response.status}`);

await writeFile(`tripo-${taskId}.glb`, Buffer.from(await response.arrayBuffer()));
```

### Python

```python
import asyncio
import os
import shutil
from urllib.request import urlopen

from tripo3d import TripoClient
from tripo3d.models import TaskStatus


def download_file(url, path):
    with urlopen(url) as response, open(path, "wb") as output:
        shutil.copyfileobj(response, output)


async def main():
    api_key = os.environ["TRIPO_API_KEY"]
    os.makedirs("./output", exist_ok=True)

    async with TripoClient(api_key=api_key) as client:
        task_id = await client.text_to_model(
            prompt="a cute red panda holding bamboo",
            model_version="v2.5-20250123",
        )
        task = await client.wait_for_task(task_id, verbose=True)

        if task.status != TaskStatus.SUCCESS:
            raise RuntimeError(f"Task did not succeed: {task.status}")

        model_url = task.output.model
        if not model_url:
            raise RuntimeError("Task returned no model URL")

        output_path = "./output/model.glb"
        await asyncio.to_thread(download_file, model_url, output_path)
        print(f"Downloaded model: {output_path}")


asyncio.run(main())
```

### Go

```go
package main

import (
	"context"
	"fmt"
	"log"
	"os"
	"time"

	tripo3d "github.com/VAST-AI-Research/tripo-go-sdk"
)

func main() {
	apiKey := os.Getenv("TRIPO_API_KEY")
	if apiKey == "" {
		log.Fatal("TRIPO_API_KEY is required")
	}

	client, err := tripo3d.NewClient(tripo3d.ClientOptions{
		APIKey:  apiKey,
		BaseURL: "https://openapi.tripo3d.ai/v3",
	})
	if err != nil {
		log.Fatal(err)
	}

	ctx := context.Background()
	taskID, err := client.TextToModel(ctx, tripo3d.TextToModelParams{
		Prompt:         "a cute red panda holding bamboo",
		Model:          tripo3d.String(tripo3d.ModelVersionH31),
		Texture:        tripo3d.Bool(true),
		PBR:            tripo3d.Bool(true),
		TextureQuality: tripo3d.String("detailed"),
	})
	if err != nil {
		log.Fatal(err)
	}

	task, err := client.WaitForTask(ctx, taskID, tripo3d.WaitOptions{
		PollInterval: 2 * time.Second,
	})
	if err != nil {
		log.Fatal(err)
	}
	if task.Status != tripo3d.TaskStatusSuccess {
		log.Fatalf("Task did not succeed: %s", task.Status)
	}

	downloaded, err := client.DownloadModel(ctx, task)
	if err != nil {
		log.Fatal(err)
	}
	if downloaded == nil {
		log.Fatal("Task returned no model URL")
	}

	filename := fmt.Sprintf("tripo-%s.glb", taskID)
	if err := os.WriteFile(filename, downloaded.Data, 0o644); err != nil {
		log.Fatal(err)
	}
}
```

### Rust

```rust
use tokio::fs;
use tripo3d_sdk::{
    constants::model_version,
    params::TextToModelParams,
    ClientOptions,
    TaskStatus,
    TripoClient,
    WaitOptions,
};

#[tokio::main]
async fn main() -> anyhow::Result<()> {
    let api_key = std::env::var("TRIPO_API_KEY")?;
    let client = TripoClient::new(ClientOptions {
        api_key: Some(api_key),
        base_url: Some("https://openapi.tripo3d.ai/v3".into()),
        ..Default::default()
    })?;

    let task_id = client
        .text_to_model(TextToModelParams {
            prompt: "a cute red panda holding bamboo".into(),
            model: Some(model_version::H3_1.to_string()),
            texture: Some(true),
            pbr: Some(true),
            texture_quality: Some("detailed".into()),
            ..Default::default()
        })
        .await?;

    let task = client
        .wait_for_task(&task_id, WaitOptions::default())
        .await?;
    if task.status != TaskStatus::Success {
        anyhow::bail!("Task did not succeed: {}", task.status);
    }

    let downloaded = client
        .download_model(&task)
        .await?
        .ok_or_else(|| anyhow::anyhow!("Task returned no model URL"))?;

    fs::write(format!("tripo-{task_id}.glb"), downloaded.data).await?;
    Ok(())
}
```

### Java

```java
import ai.tripo3d.sdk.api.TripoClient;
import ai.tripo3d.sdk.api.TripoClientConfig;
import ai.tripo3d.sdk.api.TripoRegion;
import ai.tripo3d.sdk.model.request.TaskRequestPayload;
import ai.tripo3d.sdk.model.response.TaskDetail;

import java.io.InputStream;
import java.net.URL;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.nio.file.StandardCopyOption;
import java.util.Map;

public final class TripoQuickStart {
    public static void main(String[] args) throws Exception {
        String apiKey = System.getenv("TRIPO_API_KEY");
        if (apiKey == null || apiKey.trim().isEmpty()) {
            throw new IllegalStateException("TRIPO_API_KEY is required");
        }

        try (TripoClient client = TripoClient.create(
                TripoClientConfig.builder(apiKey)
                        .region(TripoRegion.GLOBAL)
                        .build())) {
            TaskDetail created = client.textToModel(TaskRequestPayload.builder()
                    .prompt("a wooden chair")
                    .model("v3.1-20260211")
                    .build());

            TaskDetail done = client.pollUntilTerminal(created.taskId());
            if (!"success".equalsIgnoreCase(done.status())) {
                throw new IllegalStateException(
                        "Task failed: status=" + done.status()
                                + ", message=" + done.errorMsg());
            }

            Map<String, Object> output = done.output();
            Object modelUrl = output == null ? null : output.get("model_url");
            if (!(modelUrl instanceof String)) {
                throw new IllegalStateException(
                        "Task output does not contain model_url");
            }

            try (InputStream input =
                         new URL((String) modelUrl).openStream()) {
                Files.copy(
                        input,
                        Paths.get("model.glb"),
                        StandardCopyOption.REPLACE_EXISTING);
            }
        }
    }
}
```

JavaScript, Python e Java usam deliberadamente clientes HTTP nativos para a URL assinada do modelo e não incluem um cabeçalho `Authorization`. Os métodos de download dos SDKs Go e Rust também buscam a URL assinada sem a chave de API.

## 4. Suporte às rotas V3

A matriz reúne as cinco implementações de SDK nas versões fixadas acima. Uma marca de seleção indica que um fluxo público do SDK alcança a rota HTTP V3 final, diretamente ou por uma etapa interna; constantes de rota não utilizadas não são contadas.

| Rota HTTP | Finalidade | JavaScript | Python | Go | Rust | Java |
| --- | --- | :---: | :---: | :---: | :---: | :---: |
| `POST /v3/generation/text-to-model` | Gerar um modelo a partir de texto | ✓ | — | ✓ | ✓ | ✓ |
| `POST /v3/generation/image-to-model` | Gerar um modelo a partir de uma imagem | ✓ | — | ✓ | ✓ | ✓ |
| `POST /v3/generation/multiview-to-model` | Gerar um modelo a partir de várias vistas | ✓ | — | ✓ | ✓ | ✓ |
| `POST /v3/generation/text-to-image` | Gerar uma imagem a partir de texto | ✓ | — | ✓ | ✓ | — |
| `POST /v3/generation/image-to-image` | Transformar uma imagem | ✓ | — | ✓ | ✓ | — |
| `POST /v3/generation/image-to-multiview` | Gerar imagens multivista | ✓ | — | ✓ | ✓ | ✓ |
| `POST /v3/generation/edit-multiview` | Editar a saída multivista | ✓ | — | ✓ | ✓ | — |
| `POST /v3/generation/image-to-splat` | Gerar um splat gaussiano | — | — | — | — | ✓ |
| `POST /v3/models/refine` | Refinar um modelo preliminar | — | — | — | — | ✓ |
| `POST /v3/models/texture` | Aplicar ou regenerar texturas | ✓ | — | ✓ | ✓ | ✓ |
| `POST /v3/models/stylize` | Estilizar um modelo | — | — | — | — | ✓ |
| `POST /v3/models/convert` | Converter o formato do modelo | ✓ | — | ✓ | ✓ | ✓ |
| `POST /v3/models/import` | Importar um modelo externo | — | — | — | — | ✓ |
| `POST /v3/mesh/segment` | Segmentar uma malha | ✓ | ✓ | ✓ | ✓ | ✓ |
| `POST /v3/mesh/complete` | Completar ou reparar uma malha | ✓ | — | ✓ | ✓ | ✓ |
| `POST /v3/mesh/decimate` | Reduzir o número de faces | ✓ | — | ✓ | ✓ | ✓ |
| `POST /v3/animations/rig-check` | Verificar se um modelo pode receber rigging | ✓ | — | ✓ | ✓ | ✓ |
| `POST /v3/animations/rig` | Anexar um esqueleto | ✓ | — | ✓ | ✓ | ✓ |
| `POST /v3/animations/retarget` | Aplicar uma animação predefinida | ✓ | — | ✓ | ✓ | ✓ |
| `GET /v3/tasks/{task_id}` | Obter uma tarefa | ✓ | ✓ | ✓ | ✓ | ✓ |
| `POST /v3/tasks/list` | Obter várias tarefas | ✓ | — | ✓ | ✓ | ✓ |
| `POST /v3/files` | Enviar um arquivo | ✓ | ✓ | ✓ | ✓ | ✓ |
| `POST /v3/files/presign` | Criar um upload pré-assinado | — | — | — | — | ✓ |
| `GET /v3/account/balance` | Obter o saldo da conta | ✓ | — | ✓ | ✓ | ✓ |
| `GET /v3/account/usage` | Obter o histórico de uso | — | — | — | — | ✓ |

Nesta versão fixada, somente Java expõe image-to-splat, refine, stylize, import, presign e usage. Java não expõe text-to-image, image-to-image nem edit-multiview. O descritor interno de `/v3/files/upload-credentials` não tem serviço nem método público do cliente, portanto não é contado como compatível.

Python continua sendo principalmente um SDK V2. O ramo `mesh_segmentation(..., model_version="v2.0-20260430")` também usa `POST /v3/mesh/segment`, `GET /v3/tasks/{task_id}` e `POST /v3/files` quando é necessário enviar um `ref_image` local.

### Suporte às rotas Python V2

Python 0.4.2 expõe cinco rotas HTTP V2 finais. `POST /v2/openapi/task` é compartilhada pelos métodos de geração, processamento de modelos, malha e animação; não se limita a texto para modelo.

| Rota HTTP | Finalidade |
| --- | --- |
| `POST /v2/openapi/task` | Enviar qualquer tarefa V2 compatível |
| `GET /v2/openapi/task/{task_id}` | Consultar o status e a saída da tarefa |
| `GET /v2/openapi/user/balance` | Obter o saldo da conta |
| `POST /v2/openapi/upload/sts/token` | Obter credenciais de upload STS quando `boto3` estiver disponível |
| `POST /v2/openapi/upload` | Enviar um arquivo pelo fallback multipart legado do SDK |

Java e os outros SDKs V3 enviam a seleção do modelo por meio de seus modelos de parâmetros V3 oficiais. No formato de transmissão do Java, o campo se chama `model`.

## 5. Solução de problemas

- **Chave ausente:** defina `TRIPO_API_KEY` no processo do servidor. Consulte [Autenticação](./authentication).
- **Região incorreta:** selecione o endpoint global ou da China correspondente ao SDK e à versão da API em uso.
- **Falha ou tempo esgotado na tarefa:** mantenha o `task_id`, verifique o status final e consulte [Ciclo de vida da tarefa](./task-lifecycle) e [Tratamento de erros](./error-handling).
- **URL do modelo expirada:** consulte a tarefa novamente quando o SDK oferecer suporte e baixe o modelo imediatamente. Não armazene uma URL assinada temporária como recurso permanente.

## Repositórios oficiais

- [SDK JavaScript](https://github.com/VAST-AI-Research/tripo-js-sdk)
- [SDK Python](https://github.com/VAST-AI-Research/tripo-python-sdk)
- [SDK Go](https://github.com/VAST-AI-Research/tripo-go-sdk)
- [SDK Rust](https://github.com/VAST-AI-Research/tripo-rust-sdk)
- [SDK Java](https://github.com/VAST-AI-Research/tripo-java-sdk)
