# 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)
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.
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 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.
go get github.com/VAST-AI-Research/tripo-go-sdk@v0.0.0-20260713072120-2c8c8d4e6a9e
[dependencies]
tripo3d-sdk = { git = "https://github.com/VAST-AI-Research/tripo-rust-sdk.git", rev = "f992f6a7cf7a28c10781f9fa28e4630c7802291c"}
tokio = { version = "1", features = ["full"] }
anyhow = "1"
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.
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 = awaitfetch(modelUrl);
if (!response.ok) throw new Error(`Download failed: HTTP ${response.status}`);
await writeFile(`tripo-${taskId}.glb`, Buffer.from(await response.arrayBuffer()));
import asyncio
importosimport 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)
asyncdefmain():
api_key = os.environ["TRIPO_API_KEY"]
os.makedirs("./output", exist_ok=True)
asyncwith 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
ifnot 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())
packagemainimport (
"context""fmt""log""os""time"
tripo3d "github.com/VAST-AI-Research/tripo-go-sdk"
)
funcmain() {
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)
}
}
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(())
}
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.
Região incorreta: selecione o endpoint global ou da China correspondente ao SDK e à versão da API em uso.
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.