Ao chamar a API Nano Banana Pro para gerar imagens, qual é a diferença entre chamadas síncronas e assíncronas? Atualmente, tanto a APIYI quanto a Gemini oficial suportam apenas o modo de chamada síncrona, mas a APIYI melhora significativamente a experiência do usuário ao fornecer a saída da imagem via URL OSS. Este artigo analisará sistematicamente as principais diferenças entre chamadas síncronas e assíncronas, bem como as soluções de otimização da plataforma APIYI para formatos de saída de imagem.
Valor central: Ao ler este artigo, você entenderá a diferença essencial entre chamadas síncronas e assíncronas no design de APIs, as vantagens da saída por URL OSS da plataforma APIYI em comparação com a codificação base64 e como escolher a melhor solução de obtenção de imagens de acordo com o seu cenário de negócio.

Comparação Central dos Modos de Chamada da API Nano Banana Pro
| Característica | Chamada Síncrona (Synchronous) | Chamada Assíncrona (Asynchronous) | Suporte Atual APIYI |
|---|---|---|---|
| Modo de conexão | Mantém conexão HTTP, aguarda conclusão | Retorna ID da tarefa imediatamente, fecha conexão | ✅ Chamada Síncrona |
| Forma de espera | Espera bloqueante (30-170 seg) | Não bloqueante, Polling ou Webhook | ✅ Síncrona (Espera bloqueante) |
| Risco de Timeout | Alto (requer configurar 300-600 seg) | Baixo (apenas a submissão precisa de timeout curto) | ⚠️ Requer configuração adequada |
| Complexidade | Baixa (concluída em uma única requisição) | Média (requer polling ou Webhook) | ✅ Simples de usar |
| Cenários Ideais | Geração em tempo real, exibição imediata | Processamento em lote, tarefas de fundo | ✅ Geração em tempo real |
| Otimização de Custo | Preço padrão | Google Batch API pode economizar 50% | – |
Como Funciona a Chamada Síncrona
A Chamada Síncrona (Synchronous Call) adota o modelo Requisição-Espera-Resposta:
- Cliente inicia a requisição: Envia o pedido de geração de imagem para o servidor.
- Mantém a conexão HTTP: O cliente mantém a conexão TCP aberta, aguardando o servidor completar o processamento.
- Espera bloqueante: Durante o tempo de processamento de 30-170 segundos, o cliente não consegue realizar outras operações nesta linha.
- Recebe a resposta completa: O servidor retorna os dados da imagem gerada (base64 ou URL).
- Fecha a conexão: A conexão HTTP é encerrada após a conclusão.
Característica chave: A chamada síncrona é bloqueante (Blocking); o cliente deve esperar pela resposta do servidor antes de continuar com as operações subsequentes. Isso exige a configuração de um tempo de timeout suficientemente longo (recomendado 300 segundos para 1K/2K e 600 segundos para 4K) para evitar que a conexão caia antes do término da geração.
Como Funciona a Chamada Assíncrona
A Chamada Assíncrona (Asynchronous Call) adota o modelo Requisição-Aceite-Notificação:
- Cliente submete a tarefa: Envia o pedido de geração de imagem para o servidor.
- Retorna ID da tarefa imediatamente: O servidor aceita a requisição, retorna um ID (como
task_abc123) e fecha a conexão imediatamente. - Processamento em segundo plano: O servidor gera a imagem em background, enquanto o cliente pode processar outras operações.
- Obtenção de resultados: O cliente obtém o resultado de uma das duas formas:
- Polling (Consulta): Requisita periodicamente
/tasks/task_abc123/statuspara verificar o status. - Webhook: Após a conclusão, o servidor chama ativamente uma URL de retorno fornecida pelo cliente.
- Polling (Consulta): Requisita periodicamente
- Download da imagem: Assim que concluída, a imagem é baixada através da URL retornada.
Característica chave: A chamada assíncrona é não bloqueante (Non-blocking); o cliente pode lidar com outras requisições logo após submeter a tarefa, sem precisar manter a conexão aberta por muito tempo. É ideal para processamento em lote e cenários onde a resposta imediata não é crítica.
💡 Sugestão Técnica: A plataforma APIYI atualmente suporta apenas o modo de chamada síncrona, mas ao otimizar as configurações de timeout e fornecer saída via URL OSS, melhorou significativamente a experiência do usuário. Para cenários que exigem geração em lote, recomenda-se usar a plataforma APIYI (apiyi.com), que oferece interfaces de porta HTTP estáveis, timeouts razoáveis configurados por padrão e suporte a chamadas síncronas de alta concorrência.

Diferença Fundamental 1: Tempo de Manutenção de Conexão e Configuração de Timeout
Requisitos de Manutenção de Conexão em Chamadas Síncronas
Chamadas síncronas exigem que o cliente mantenha a conexão HTTP aberta durante todo o processo de geração da imagem, o que traz os seguintes desafios técnicos:
| Desafio | Impacto | Solução |
|---|---|---|
| Conexões inativas prolongadas | Equipamentos de rede intermediários (NAT, firewalls) podem encerrar a conexão | Configurar TCP Keep-Alive |
| Configuração de timeout complexa | Precisa configurar o timeout precisamente de acordo com a resolução | 1K/2K: 300 segundos, 4K: 600 segundos |
| Sensível a oscilações de rede | Ambientes de rede instável desconectam facilmente | Implementar mecanismos de tentativa (retry) |
| Limite de conexões simultâneas | O navegador permite no máximo 6 conexões simultâneas por padrão | Usar chamadas via servidor ou aumentar o pool de conexões |
Exemplo de chamada síncrona em Python:
import requests
import time
def generate_image_sync(prompt: str, size: str = "4096x4096") -> dict:
"""
Chamada síncrona para a API APIYI Nano Banana Pro para gerar imagens
Args:
prompt: comando da imagem
size: tamanho da imagem
Returns:
Resultado da resposta da API
"""
start_time = time.time()
# Chamada síncrona: mantém a conexão até a conclusão da geração
response = requests.post(
"http://api.apiyi.com:16888/v1/images/generations",
json={
"prompt": prompt,
"size": size,
"model": "nano-banana-pro",
"n": 1,
"response_format": "url" # APIYI suporta saída via URL
},
headers={"Authorization": "Bearer YOUR_API_KEY"},
timeout=(10, 600) # Timeout de conexão 10s, timeout de leitura 600s
)
elapsed = time.time() - start_time
print(f"⏱️ Tempo gasto na chamada síncrona: {elapsed:.2f} segundos")
print(f"🔗 Status da conexão: mantida aberta por {elapsed:.2f} segundos")
return response.json()
# Exemplo de uso
result = generate_image_sync(
prompt="A futuristic cityscape at sunset",
size="4096x4096"
)
print(f"✅ URL da imagem: {result['data'][0]['url']}")
Observações Importantes:
- O cliente fica totalmente bloqueado durante o tempo de inferência (100-170 segundos).
- A conexão HTTP permanece aberta continuamente, consumindo recursos do sistema.
- Se o timeout for configurado incorretamente (como 60 segundos), a conexão cairá antes do término da inferência.
Vantagens da Conexão Curta em Chamadas Assíncronas
As chamadas assíncronas estabelecem conexões curtas apenas no envio da tarefa e na consulta de status, reduzindo drasticamente o tempo de manutenção da conexão:
| Fase | Tempo de Conexão | Configuração de Timeout |
|---|---|---|
| Envio da tarefa | 1-3 segundos | 30 segundos são suficientes |
| Consulta de status | 1-2 segundos por vez | 10 segundos são suficientes |
| Download da imagem | 5-10 segundos | 60 segundos são suficientes |
| Total | 10-20 segundos (disperso) | Muito inferior à chamada síncrona |
Exemplo de chamada assíncrona em Python (simulação de suporte futuro da APIYI):
import requests
import time
def generate_image_async(prompt: str, size: str = "4096x4096") -> str:
"""
Chamada assíncrona para a API Nano Banana Pro (funcionalidade futura)
Args:
prompt: comando da imagem
size: tamanho da imagem
Returns:
ID da tarefa
"""
# Passo 1: Envio da tarefa (conexão curta)
response = requests.post(
"http://api.apiyi.com:16888/v1/images/generations/async", # Endpoint futuro
json={
"prompt": prompt,
"size": size,
"model": "nano-banana-pro",
"n": 1,
"response_format": "url"
},
headers={"Authorization": "Bearer YOUR_API_KEY"},
timeout=(10, 30) # Apenas 30 segundos de timeout para envio
)
task_data = response.json()
task_id = task_data["task_id"]
print(f"✅ Tarefa enviada: {task_id}")
print(f"🔓 Conexão encerrada, pronto para processar outras tarefas")
return task_id
def poll_task_status(task_id: str, max_wait: int = 300) -> dict:
"""
Consulta o status da tarefa até a conclusão (polling)
Args:
task_id: ID da tarefa
max_wait: tempo máximo de espera (segundos)
Returns:
Resultado gerado
"""
start_time = time.time()
poll_interval = 5 # Consulta a cada 5 segundos
while time.time() - start_time < max_wait:
# Consulta o status da tarefa (conexão curta)
response = requests.get(
f"http://api.apiyi.com:16888/v1/tasks/{task_id}", # Endpoint futuro
headers={"Authorization": "Bearer YOUR_API_KEY"},
timeout=(10, 10) # Apenas 10 segundos de timeout para consulta
)
status_data = response.json()
status = status_data["status"]
if status == "completed":
elapsed = time.time() - start_time
print(f"✅ Tarefa concluída! Tempo total: {elapsed:.2f} segundos")
return status_data["result"]
elif status == "failed":
raise Exception(f"Falha na tarefa: {status_data.get('error')}")
else:
print(f"⏳ Status da tarefa: {status}, aguardando {poll_interval} segundos para tentar novamente...")
time.sleep(poll_interval)
raise TimeoutError(f"Timeout da tarefa: {task_id}")
# Exemplo de uso
task_id = generate_image_async(
prompt="A serene mountain landscape",
size="4096x4096"
)
# Durante a consulta, outras tarefas podem ser processadas
print("🚀 Pode processar outras requisições simultaneamente...")
# Consulta o status da tarefa
result = poll_task_status(task_id, max_wait=600)
print(f"✅ URL da imagem: {result['data'][0]['url']}")
Ver exemplo de padrão de callback Webhook (funcionalidade futura)
from flask import Flask, request, jsonify
import requests
app = Flask(__name__)
# Dicionário global para armazenar resultados das tarefas
task_results = {}
@app.route('/webhook/image_completed', methods=['POST'])
def handle_webhook():
"""Recebe o callback Webhook da conclusão da tarefa assíncrona da APIYI"""
data = request.json
task_id = data['task_id']
status = data['status']
result = data.get('result')
if status == 'completed':
task_results[task_id] = result
print(f"✅ Tarefa {task_id} concluída: {result['data'][0]['url']}")
else:
print(f"❌ Tarefa {task_id} falhou: {data.get('error')}")
return jsonify({"received": True}), 200
def generate_image_with_webhook(prompt: str, size: str = "4096x4096") -> str:
"""
Uso de Webhook para geração assíncrona de imagem
Args:
prompt: comando da imagem
size: tamanho da imagem
Returns:
ID da tarefa
"""
response = requests.post(
"http://api.apiyi.com:16888/v1/images/generations/async",
json={
"prompt": prompt,
"size": size,
"model": "nano-banana-pro",
"n": 1,
"response_format": "url",
"webhook_url": "https://seu-dominio.com/webhook/image_completed" # URL de callback
},
headers={"Authorization": "Bearer YOUR_API_KEY"},
timeout=(10, 30)
)
task_id = response.json()["task_id"]
print(f"✅ Tarefa enviada: {task_id}")
print(f"📞 Webhook enviará retorno para: https://seu-dominio.com/webhook/image_completed")
return task_id
# Inicia o servidor Flask para escutar o Webhook
if __name__ == '__main__':
app.run(host='0.0.0.0', port=5000)
🎯 Limitações Atuais: Tanto a APIYI quanto a Gemini oficial suportam atualmente apenas o modo de chamada síncrona; a funcionalidade de chamada assíncrona está planejada para versões futuras. Para cenários que exigem alta simultaneidade na geração de imagens, recomenda-se usar multi-threading ou multi-processing através da plataforma APIYI (apiyi.com) para chamar interfaces síncronas simultaneamente, configurando tempos de timeout razoáveis.
Diferença Fundamental 2: Capacidade de Processamento Simultâneo e Consumo de Recursos
Limites de Simultaneidade em Chamadas Síncronas
As chamadas síncronas enfrentam problemas significativos de ocupação de recursos em cenários de alta demanda:
Problema de Bloqueio em Thread Única:
import time
# ❌ Errado: Chamada sequencial em thread única. Tempo total = tempo unitário × nº de tarefas
def generate_multiple_images_sequential(prompts: list) -> list:
results = []
start_time = time.time()
for prompt in prompts:
result = generate_image_sync(prompt, size="4096x4096")
results.append(result)
elapsed = time.time() - start_time
print(f"❌ Tempo para gerar {len(prompts)} imagens sequencialmente: {elapsed:.2f} segundos")
# Assumindo 120s por imagem, 10 imagens = 1200 segundos (20 minutos!)
return results
Otimização com Simultaneidade Multi-thread:
from concurrent.futures import ThreadPoolExecutor, as_completed
import time
# ✅ Correto: Chamada multi-thread simultânea, aproveitando ao máximo o tempo de espera de E/S
def generate_multiple_images_concurrent(prompts: list, max_workers: int = 5) -> list:
"""
Geração simultânea de múltiplas imagens usando multi-thread
Args:
prompts: lista de comandos
max_workers: número máximo de threads simultâneas
Returns:
Lista de resultados gerados
"""
results = []
start_time = time.time()
with ThreadPoolExecutor(max_workers=max_workers) as executor:
# Envia todas as tarefas
future_to_prompt = {
executor.submit(generate_image_sync, prompt, "4096x4096"): prompt
for prompt in prompts
}
# Aguarda todas as tarefas terminarem
for future in as_completed(future_to_prompt):
prompt = future_to_prompt[future]
try:
result = future.result()
results.append(result)
print(f"✅ Concluído: {prompt[:30]}...")
except Exception as e:
print(f"❌ Falhou: {prompt[:30]}... - {e}")
elapsed = time.time() - start_time
print(f"✅ Tempo para gerar {len(prompts)} imagens simultaneamente: {elapsed:.2f} segundos")
# Assumindo 120s por imagem, 10 imagens ≈ 120-150 segundos (2-2,5 minutos)
return results
# Exemplo de uso
prompts = [
"A cyberpunk city at night",
"A serene forest landscape",
"An abstract geometric pattern",
"A futuristic space station",
"A vintage car in the desert",
# ...mais comandos
]
results = generate_multiple_images_concurrent(prompts, max_workers=5)
print(f"🎉 Geradas {len(results)} imagens")
| Método de simultaneidade | Tempo para 10 imagens 4K | Consumo de recursos | Cenário aplicável |
|---|---|---|---|
| Chamada sequencial | 1200 segundos (20 min) | Baixo (conexão única) | Imagem única, geração em tempo real |
| Multi-thread (5 threads) | 250 segundos (4 min) | Médio (5 conexões) | Lotes pequenos/médios (10-50 fotos) |
| Multi-process (10 processos) | 150 segundos (2.5 min) | Alto (10 conexões) | Grandes lotes (50+ fotos) |
| Chamada assíncrona (futuro) | 120 seg + polling | Baixo (conexão curta) | Lotes massivos (100+ fotos) |
Vantagens da Simultaneidade em Chamadas Assíncronas
As chamadas assíncronas possuem vantagens marcantes em cenários de processamento em lote:
Envio em lote + Polling em lote:
def generate_batch_async(prompts: list) -> list:
"""
Geração assíncrona em lote (funcionalidade futura)
Args:
prompts: lista de comandos
Returns:
Lista de IDs das tarefas
"""
task_ids = []
# Passo 1: Envio rápido de todas as tarefas em lote (cada uma leva 1-3s)
for prompt in prompts:
task_id = generate_image_async(prompt, size="4096x4096")
task_ids.append(task_id)
print(f"✅ Enviados {len(task_ids)} tarefas em lote, tempo aprox. {len(prompts) * 2} segundos")
# Passo 2: Consulta em lote do status das tarefas
results = []
for task_id in task_ids:
result = poll_task_status(task_id, max_wait=600)
results.append(result)
return results
| Métrica | Chamada Síncrona (Multi-thread) | Chamada Assíncrona (Futuro) | Diferença |
|---|---|---|---|
| Tempo na fase de envio | 1200 seg (bloqueio total) | 20 seg (envio rápido) | Assíncrono 60x mais rápido |
| Tempo Total | 250 seg (5 threads) | 120 seg + polling | Assíncrono 2x mais rápido |
| Pico de conexões | 5 conexões longas | 1 conexão curta (no envio) | Assíncrono economiza 80% |
| Pode processar outras tarefas | ❌ Threads bloqueadas | ✅ Totalmente não bloqueante | Assíncrono mais flexível |

💰 Otimização de Custos: A API Google Gemini oferece o modo Batch API, que suporta processamento assíncrono com um desconto de 50% no preço (preço padrão $0.133-$0.24/imagem, Batch API $0.067-$0.12/imagem), embora seja necessário tolerar um tempo de entrega de até 24 horas. Para cenários que não exigem geração em tempo real, considere usar a Batch API para reduzir custos.
Diferença Principal 3: Vantagens da Saída URL OSS da Plataforma APIYI
Comparativo: Codificação base64 vs. Saída via URL
A API do Nano Banana Pro suporta dois formatos de saída de imagem:
| Característica | Codificação base64 | Saída URL OSS (Exclusivo APIYI) | Recomendado |
|---|---|---|---|
| Tamanho da Resposta | 6-8 MB (Imagem 4K) | 200 bytes (Apenas a URL) | URL ✅ |
| Tempo de Transmissão | 5-10 seg (Lento em redes instáveis) | < 1 segundo | URL ✅ |
| Cache do Navegador | ❌ Não permite cache | ✅ Cache HTTP padrão | URL ✅ |
| Aceleração CDN | ❌ Indisponível | ✅ Aceleração CDN Global | URL ✅ |
| Otimização de Imagem | ❌ Sem suporte a WebP, etc. | ✅ Suporte a conversão de formato | URL ✅ |
| Carga Progressiva | ❌ Download completo obrigatório | ✅ Suporte a carregamento progressivo | URL ✅ |
| Desempenho Mobile | ❌ Alto consumo de memória | ✅ Fluxo de download otimizado | URL ✅ |
Problemas de desempenho da codificação base64:
-
Inflação de 33% no corpo da resposta: A codificação base64 aumenta o volume de dados em cerca de 33%.
- Imagem 4K original: aprox. 6 MB
- Após codificação base64: aprox. 8 MB
-
Incapacidade de utilizar CDN: A string base64 fica embutida na resposta JSON, o que impede o cache via CDN.
-
Pressão na memória de dispositivos móveis: Decodificar strings base64 consome memória e recursos de CPU adicionais.
Vantagens da saída URL OSS da APIYI:
import requests
# ✅ Recomendado: Usar a saída URL OSS da APIYI
response = requests.post(
"http://api.apiyi.com:16888/v1/images/generations",
json={
"prompt": "A beautiful sunset over mountains",
"size": "4096x4096",
"model": "nano-banana-pro",
"n": 1,
"response_format": "url" # Especifica saída via URL
},
headers={"Authorization": "Bearer SEU_API_KEY"},
timeout=(10, 600)
)
result = response.json()
# O corpo da resposta contém apenas a URL, cerca de 200 bytes
print(f"Tamanho do corpo da resposta: {len(response.content)} bytes")
# Saída: Tamanho do corpo da resposta: 234 bytes
# Exemplo de URL OSS
image_url = result['data'][0]['url']
print(f"URL da imagem: {image_url}")
# Saída: https://apiyi-oss.oss-cn-beijing.aliyuncs.com/nano-banana/abc123.png
# O download posterior via HTTP padrão aproveita a aceleração da CDN
image_response = requests.get(image_url)
with open("saida.png", "wb") as f:
f.write(image_response.content)
Comparativo: Problemas de desempenho da saída base64:
# ❌ Não recomendado: Saída codificada em base64
response = requests.post(
"https://api.example.com/v1/images/generations",
json={
"prompt": "A beautiful sunset over mountains",
"size": "4096x4096",
"model": "nano-banana-pro",
"n": 1,
"response_format": "b64_json" # Codificação base64
},
headers={"Authorization": "Bearer SEU_API_KEY"},
timeout=(10, 600)
)
result = response.json()
# O corpo da resposta contém a string base64 completa, cerca de 8 MB
print(f"Tamanho do corpo da resposta: {len(response.content)} bytes")
# Saída: Tamanho do corpo da resposta: 8388608 bytes (8 MB!)
# É necessário decodificar a string base64
import base64
image_b64 = result['data'][0]['b64_json']
image_bytes = base64.b64decode(image_b64)
with open("saida.png", "wb") as f:
f.write(image_bytes)
| Métricas de Comparação | Codificação base64 | URL OSS APIYI | Ganho de Desempenho |
|---|---|---|---|
| Tamanho da Resposta API | 8 MB | 200 bytes | Redução de 99,998% |
| Tempo de Resposta API | 125s + 5-10s de transmissão | 125s + < 1s | Economia de 5-10 seg |
| Forma de Download | Embutido no JSON | Requisição HTTP independente | Download concorrente possível |
| Cache do Navegador | Não cacheável | Cache HTTP padrão | Acesso instantâneo em visitas repetidas |
| Aceleração CDN | Sem suporte | Nós de CDN globais | Aceleração em acessos internacionais |
🚀 Configuração Recomendada: Ao chamar a API Nano Banana Pro na plataforma APIYI, utilize sempre
response_format: "url"para obter a saída via URL OSS, em vez da codificação base64. Isso não apenas reduz drasticamente o tamanho da resposta e o tempo de transmissão, mas também aproveita ao máximo a aceleração por CDN e o cache do navegador, melhorando a experiência do usuário.
Diferença Principal 4: Cenários de Uso e Planejamento Futuro
Melhores Cenários para Chamadas Síncronas
Cenários Recomendados:
- Geração de imagens em tempo real: Exibir a imagem gerada imediatamente após o usuário enviar o comando.
- Processamento em pequenos lotes: Geração de 1 a 10 imagens, onde chamadas simultâneas são suficientes para atender aos requisitos de desempenho.
- Integração simplificada: Reduz a complexidade do desenvolvimento ao dispensar a implementação de polling (verificação constante) ou Webhooks.
- Aplicações interativas: Ferramentas de pintura com IA, editores de imagem e outros cenários que exigem feedback instantâneo.
Padrão de código típico:
from flask import Flask, request, jsonify
import requests
app = Flask(__name__)
@app.route('/generate', methods=['POST'])
def generate_image():
"""Interface de geração de imagens em tempo real"""
data = request.json
prompt = data['prompt']
size = data.get('size', '1024x1024')
# Chamada síncrona, o usuário aguarda a conclusão da geração
response = requests.post(
"http://api.apiyi.com:16888/v1/images/generations",
json={
"prompt": prompt,
"size": size,
"model": "nano-banana-pro",
"n": 1,
"response_format": "url"
},
headers={"Authorization": "Bearer SEU_API_KEY"},
timeout=(10, 300 if size != '4096x4096' else 600)
)
result = response.json()
return jsonify({
"success": True,
"image_url": result['data'][0]['url']
})
if __name__ == '__main__':
app.run(host='0.0.0.0', port=8000)
Cenários Futuros para Chamadas Assíncronas
Cenários Aplicáveis (Suporte Futuro):
- Geração massiva de imagens: Geração de mais de 100 imagens, como catálogos de e-commerce ou bancos de ativos de design.
- Tarefas agendadas em segundo plano: Geração automática diária de tipos específicos de imagens, sem necessidade de resposta em tempo real.
- Processamento de baixo custo: Uso da Google Batch API para obter descontos de até 50% no preço, aceitando um prazo de entrega de 24 horas.
- Cenários de alta concorrência: Centenas de usuários enviando solicitações simultâneas, evitando o esgotamento do pool de conexões.
Padrão de código típico (Futuro):
from flask import Flask, request, jsonify
from celery import Celery
import requests
app = Flask(__name__)
celery = Celery('tasks', broker='redis://localhost:6379/0')
@celery.task
def generate_image_task(prompt: str, size: str, user_id: str):
"""Tarefa assíncrona do Celery: gerar imagem"""
# Enviar tarefa assíncrona para a APIYI
response = requests.post(
"http://api.apiyi.com:16888/v1/images/generations/async", # Interface futura
json={
"prompt": prompt,
"size": size,
"model": "nano-banana-pro",
"n": 1,
"response_format": "url",
"webhook_url": f"https://seu-dominio.com/webhook/{user_id}"
},
headers={"Authorization": "Bearer SEU_API_KEY"},
timeout=(10, 30)
)
task_id = response.json()["task_id"]
return task_id
@app.route('/generate_async', methods=['POST'])
def generate_image_async():
"""Interface de geração de imagem assíncrona"""
data = request.json
prompt = data['prompt']
size = data.get('size', '1024x1024')
user_id = data['user_id']
# Submete a tarefa ao Celery e retorna imediatamente
task = generate_image_task.delay(prompt, size, user_id)
return jsonify({
"success": True,
"message": "Tarefa enviada. Você será notificado via Webhook quando estiver pronta.",
"task_id": task.id
})
@app.route('/webhook/<user_id>', methods=['POST'])
def handle_webhook(user_id: str):
"""Recebe o callback Webhook da tarefa assíncrona concluída na APIYI"""
data = request.json
task_id = data['task_id']
result = data['result']
# Notifica o usuário que a geração da imagem foi concluída (ex: e-mail, push notification)
notify_user(user_id, result['data'][0]['url'])
return jsonify({"received": True}), 200
Planejamento Futuro da Plataforma APIYI
| Recurso | Status Atual | Planejamento Futuro | Prazo Esperado |
|---|---|---|---|
| Chamada Síncrona | ✅ Suportado | Otimização contínua das configs de timeout | – |
| Saída URL OSS | ✅ Suportado | Adição de mais nós de CDN | Q2 2026 |
| Chamada Assíncrona (Polling) | ❌ Não suportado | Suporte a envio de tarefas + consulta de status | Q2 2026 |
| Chamada Assíncrona (Webhook) | ❌ Não suportado | Suporte a notificação de callback na conclusão | Q2 2026 |
| Integração Batch API | ❌ Não suportado | Integração com Google Batch API | Q4 2026 |
💡 Sugestão de Desenvolvimento: A APIYI planeja lançar a funcionalidade de chamadas assíncronas no terceiro trimestre de 2026, com suporte a submissão de tarefas, consulta de status e callbacks via Webhook. Para desenvolvedores que possuem demandas atuais de processamento em massa, recomenda-se o uso de chamadas síncronas multithreading em paralelo, utilizando a plataforma APIYI (apiyi.com) para obter interfaces de porta HTTP estáveis e configurações de timeout otimizadas.
Perguntas Frequentes
Q1: Por que o APIYI e o Gemini oficial não suportam chamadas assíncronas?
Razões técnicas:
-
Limitações da infraestrutura do Google: A infraestrutura subjacente da API do Google Gemini atualmente suporta apenas o modo de inferência síncrona. Chamadas assíncronas exigiriam filas de tarefas extras e sistemas de gerenciamento de estado.
-
Complexidade de desenvolvimento: As chamadas assíncronas exigem a implementação de:
- Gerenciamento de fila de tarefas
- Persistência do status da tarefa
- Mecanismo de callback via Webhook
- Lógica de tentativa de reenvio (retry) e compensação em caso de falha
-
Prioridade da demanda do usuário: A maioria dos usuários precisa gerar imagens em tempo real, e as chamadas síncronas já atendem a mais de 80% dos cenários.
Soluções:
- Atualmente: Use chamadas concorrentes com multithreading ou multiprocessamento para interfaces síncronas.
- Futuro: O APIYI planeja lançar a funcionalidade de chamada assíncrona no segundo trimestre de 2026 (2026 Q2).
Q2: As imagens das URLs OSS do APIYI serão salvas permanentemente?
Estratégia de armazenamento:
| Tempo de Armazenamento | Descrição | Cenário Aplicável |
|---|---|---|
| 7 dias | Salvo por padrão por 7 dias, excluído automaticamente depois | Pré-visualização temporária, testes de geração |
| 30 dias | Usuários pagantes podem estender para até 30 dias | Projetos de curto prazo, materiais de campanhas |
| Permanente | O usuário faz o download para seu próprio OSS | Uso de longo prazo, projetos comerciais |
Prática recomendada:
import requests
# Gerar imagem e obter a URL
result = generate_image_sync(prompt="Uma paisagem deslumbrante", size="4096x4096")
temp_url = result['data'][0]['url']
print(f"URL temporária: {temp_url}")
# Baixar a imagem localmente ou para o seu próprio OSS
image_response = requests.get(temp_url)
with open("imagem_permanente.png", "wb") as f:
f.write(image_response.content)
# Ou fazer upload para o seu próprio OSS (exemplo com Alibaba Cloud OSS)
import oss2
auth = oss2.Auth('SEU_ACCESS_KEY', 'SEU_SECRET_KEY')
bucket = oss2.Bucket(auth, 'oss-cn-beijing.aliyuncs.com', 'seu-bucket')
bucket.put_object('images/imagem_permanente.png', image_response.content)
Atenção: As URLs OSS fornecidas pelo APIYI são para armazenamento temporário, ideais para visualização rápida e testes. Para imagens que precisam ser usadas a longo prazo, faça o download para o seu ambiente local ou armazenamento em nuvem próprio a tempo.
Q2: Como evitar o timeout (tempo esgotado) em chamadas síncronas?
3 configurações fundamentais para evitar timeout:
-
Configurar o tempo de timeout corretamente:
# ✅ Correto: Configurar timeouts de conexão e leitura separadamente timeout=(10, 600) # (10s para conexão, 600s para leitura) # ❌ Incorreto: Definir apenas um valor único de timeout timeout=600 # Pode ser aplicado apenas ao timeout de conexão -
Usar a interface de porta HTTP:
# ✅ Recomendado: Usar a porta HTTP do APIYI para evitar o overhead do handshake HTTPS url = "http://api.apiyi.com:16888/v1/images/generations" # ⚠️ Opcional: Interface HTTPS, que aumenta o tempo de handshake TLS url = "https://api.apiyi.com/v1/images/generations" -
Implementar mecanismo de reenvio (retry):
from requests.adapters import HTTPAdapter from requests.packages.urllib3.util.retry import Retry # Configurar estratégia de reenvio retry_strategy = Retry( total=3, # Máximo de 3 tentativas status_forcelist=[429, 500, 502, 503, 504], # Tentar novamente apenas para estes códigos de status backoff_factor=2 # Recuo exponencial: 2s, 4s, 8s ) adapter = HTTPAdapter(max_retries=retry_strategy) session = requests.Session() session.mount("http://", adapter) # Usar a session para fazer a requisição response = session.post( "http://api.apiyi.com:16888/v1/images/generations", json={...}, timeout=(10, 600) )
Q4: Como chamar a API do Nano Banana Pro diretamente no front-end?
Por que não recomendamos chamadas diretas pelo front-end:
- Risco de vazamento da API Key: O código do front-end expõe sua API Key para todos os usuários.
- Limite de concorrência do navegador: Os navegadores limitam, por padrão, a no máximo 6 conexões simultâneas para o mesmo domínio.
- Limitação de timeout: O timeout padrão da API
fetchdo navegador é curto e pode não ser suficiente para completar a geração.
Arquitetura recomendada: Modo Proxy de Backend:
// Código Front-end (exemplo em React)
async function generateImage(prompt, size) {
// Chamar sua própria interface de backend
const response = await fetch('https://seu-backend.com/api/generate', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'Authorization': 'Bearer SEU_TOKEN_DE_USUARIO' // Token de autenticação do usuário
},
body: JSON.stringify({ prompt, size })
});
const result = await response.json();
return result.image_url; // Retorna a URL OSS do APIYI
}
// Uso
const imageUrl = await generateImage("Uma cidade futurista", "4096x4096");
document.getElementById('result-image').src = imageUrl;
# Código Backend (exemplo em Flask)
from flask import Flask, request, jsonify
import requests
app = Flask(__name__)
@app.route('/api/generate', methods=['POST'])
def generate():
# Verificar token do usuário
user_token = request.headers.get('Authorization')
if not verify_user_token(user_token):
return jsonify({"error": "Unauthorized"}), 401
data = request.json
# Chamada de backend para a API do APIYI (a API Key não é exposta ao front-end)
response = requests.post(
"http://api.apiyi.com:16888/v1/images/generations",
json={
"prompt": data['prompt'],
"size": data['size'],
"model": "nano-banana-pro",
"n": 1,
"response_format": "url"
},
headers={"Authorization": "Bearer SUA_API_KEY_DO_APIYI"}, # Armazenada com segurança no backend
timeout=(10, 600)
)
result = response.json()
return jsonify({"image_url": result['data'][0]['url']})
Resumo
Pontos principais das chamadas síncronas e assíncronas da API do Nano Banana Pro:
- Características da chamada síncrona: Mantém a conexão HTTP até que a geração seja concluída, aguardando de 30 a 170 segundos; exige configuração de timeout longo (300 a 600 segundos).
- Vantagens da chamada assíncrona: Retorna imediatamente um ID de tarefa, não é bloqueante e é ideal para processamento em lote e tarefas de segundo plano. No entanto, atualmente nem o APIYI nem o Gemini oficial oferecem suporte.
- Saída via URL OSS do APIYI: Comparado à codificação base64, reduz o corpo da resposta em 99,998%, suporta aceleração por CDN e cache do navegador, melhorando significativamente a performance.
- Melhores práticas atuais: Use chamadas síncronas + concorrência multithreading + saída via URL OSS, utilizando a interface de porta HTTP do APIYI para obter configurações de timeout otimizadas.
- Planejamento futuro: O APIYI planeja lançar a funcionalidade de chamada assíncrona no 2026 Q2, com suporte para submissão de tarefas, consulta de status e callbacks de Webhook.
Recomendamos a integração rápida da API do Nano Banana Pro através do APIYI (apiyi.com). A plataforma oferece interfaces de porta HTTP otimizadas (http://api.apiyi.com:16888/v1), saída exclusiva de imagens via URL OSS e configurações de timeout adequadas para cenários de geração de imagem em tempo real e processamento em lote.
Autor: Equipe Técnica APIYI | Em caso de dúvidas técnicas, visite o site do APIYI em apiyi.com para mais soluções de integração de Modelos de Linguagem Grande.
