Uma API de LLM é um endpoint HTTP para um modelo de linguagem hospedado: você envia um prompt, recebe texto gerado de volta e paga por token. Ela é uma API comum com três propriedades incomuns — é stateless (você reenvia a conversa inteira a cada chamada), medida em tokens (entrada e saída precificadas separadamente) e não determinística (o mesmo prompt pode retornar textos diferentes). Domine essas três e o resto é a disciplina operacional que as páginas bem ranqueadas pulam: onde a chamada pertence, quanto ela custa e como ela falha.
Principais pontos
| Pergunta | Resposta |
|---|---|
| O que é | POST de um array messages → resposta do assistente + contagem de tokens |
| A cobrança | Por token, entrada e saída precificadas separadamente; a saída custa mais |
| A pegadinha stateless | Memória é você reenviando os turnos anteriores — toda chamada, todo token pago |
| A regra de ferro | Nunca chame do cliente — a chave vaza; faça proxy pelo backend |
| A ponte para agentes | Tool calling — o modelo solicita uma função, seu código a executa |
Uma chamada real, no servidor
// JavaScript — Cloud Code (cloud/main.js)
// The LLM call belongs server-side — the key never reaches the client
Parse.Cloud.define('summarize', async (req) => {
const res = await Parse.Cloud.httpRequest({
method: 'POST',
url: 'https://api.llm-provider.example/v1/chat/completions',
headers: {
Authorization: `Bearer ${process.env.LLM_KEY}`, // server-side secret
'Content-Type': 'application/json',
},
body: {
model: 'default-chat',
messages: [
{ role: 'system', content: 'Summarize in one sentence.' },
{ role: 'user', content: req.params.text },
],
max_tokens: 80, // cost + latency guardrail, enforced by YOU
},
});
return res.data.choices[0].message.content;
}); // Flutter / Dart — Back4app Flutter SDK
// The client calls YOUR function, never the LLM API directly
final summary = await ParseCloudFunction('summarize')
.execute(parameters: {'text': longArticle});
print(summary.result);
// The model key stays on the server. If this app called the LLM API
// itself, the key would ship in the binary — one decompile from theft. // iOS / Swift — Back4app Swift SDK
// The client calls YOUR function, never the LLM API directly
let summary: String = try await Cloud.run(
name: "summarize", parameters: ["text": longArticle])
print(summary)
// The model key stays on the server. If this app called the LLM API
// itself, the key would ship in the IPA — one decompile from theft. // Android / Kotlin — Back4app Android SDK
// The client calls YOUR function, never the LLM API directly
val summary = ParseCloud.callFunction<String>(
"summarize", mapOf("text" to longArticle))
println(summary)
// The model key stays on the server. If this app called the LLM API
// itself, the key would ship in the APK — one decompile from theft. O formato é portátil — a maioria dos provedores aceita o mesmo formato de chat completions, então a requisição e a resposta abaixo se leem igual, qualquer que seja o modelo apontado:
POST /v1/chat/completions Authorization: Bearer <chave>
{ "model": "default-chat",
"messages": [
{ "role": "system", "content": "Seja conciso." }, ← define o comportamento
{ "role": "user", "content": "Explique tokens." } ], ← a instrução
"max_tokens": 200, "temperature": 0.7, "stream": false }
→ { "choices": [ { "message": { "role": "assistant",
"content": "Um token é…" },
"finish_reason": "stop" } ],
"usage": { "prompt_tokens": 24, "completion_tokens": 118,
"total_tokens": 142 } } ← o que você paga
Tokens são a moeda
Um token é um pedaço de texto — cerca de quatro caracteres, ou três quartos de uma palavra em inglês. Todo o custo de uma API de LLM se reduz a contá-los, e dois fatos surpreendem. A saída custa mais que a entrada — muitas vezes várias vezes mais — porque ler o seu prompt é barato, enquanto gerar cada token da resposta é intensivo em computação, uma predição de cada vez sobre o vocabulário inteiro. E o contexto é pago a cada chamada: o modelo é stateless, então “memória” é você reenviando os turnos anteriores, e um histórico longo ou um trecho recuperado grande é cobrado de novo em cada requisição. A fórmula mensal aproximada que vale internalizar:
custo mensal ≈ ( requisições/dia
× (média_tokens_entrada × preço_entrada_por_M / 1_000_000
+ média_tokens_saída × preço_saída_por_M / 1_000_000) )
× 30
As alavancas que mexem nele: limite max_tokens, apare o contexto reenviado,
use um modelo menor para tarefas fáceis e faça cache de prefixos de prompt reutilizados.
Os parâmetros que importam
| Parâmetro | Controla | Orientação prática |
|---|---|---|
temperature | Aleatoriedade (0–2) | 0 para extração/classificação; ~0.7 para prosa |
top_p | Nucleus sampling | Ajuste este ou temperature — não os dois |
max_tokens | Teto do tamanho da saída | Quase sempre defina — limita custo e latência |
stop | Sequências de parada | Encerre a geração num delimitador que você controla |
Streaming: por que as UIs de chat parecem rápidas
Ative a flag stream e a resposta chega de forma incremental como Server-Sent Events — linhas data:, um bloco de tokens por vez, terminando num marcador [DONE] — em vez de um blob único depois de vários segundos. A razão é perceptual: o tempo até o primeiro token é uma fração do tempo até a resposta completa, então o usuário vê palavras aparecendo em vez de um spinner girando. É texto unidirecional do servidor para o cliente sobre HTTP puro, que é exatamente o formato do SSE e precisamente por isso o streaming de LLM o usa em vez de WebSockets. A consequência no backend: seu proxy precisa fazer o stream atravessar — lendo o event stream do provedor e repassando-o — em vez de bufferizar a resposta inteira e anular o propósito.
Tool calling e saída estruturada
Duas funcionalidades transformam “texto entra, texto sai” em algo programável. Tool calling: você descreve as funções disponíveis (nome + schema JSON) na requisição e o modelo — em vez de prosa — retorna uma chamada JSON estruturada nomeando uma tool e seus argumentos; seu código a executa e devolve o resultado (o passo a passo do Fowler é a referência clara). O modelo nunca executa a função; ele apenas pede. Saída estruturada, distinta de tool calling e frequentemente confundida com ele, são três coisas que valem separar:
| Mecanismo | Garantia | Use para |
|---|---|---|
| Modo JSON | JSON válido — mas de qualquer formato | Necessidades soltas de “me dê JSON” |
| Structured Outputs | Corresponde exatamente ao seu schema | Extração, classificação, dados tipados |
| Tool calling | Uma chamada à sua função | Fazer coisas, não só formatar |
Tool calling é o mecanismo que torna um agente de IA possível — a mesma requisição/resposta, rodada em loop até o modelo parar de pedir tools.
API de LLM vs. auto-hospedar um modelo aberto
| API de LLM hospedada | Modelo aberto auto-hospedado | |
|---|---|---|
| Infraestrutura | Nenhuma — o provedor a opera | GPUs, stack de serving, ops |
| Cobrança | Por token, pague pelo uso | Capacidade fixa, sua para preencher |
| Tempo para lançar | Minutos | Dias a semanas |
| Residência de dados | Os termos do provedor | Totalmente sua |
| Custo em volume baixo/com picos | O mais barato | GPUs ociosas queimam dinheiro |
| Custo em volume extremo e sustentado | Pode exceder o self-hosting | Vence depois do break-even |
A leitura honesta: a API vence para quase todo mundo quase sempre — zero infraestrutura, início instantâneo e mais barata até o volume ser genuinamente grande e constante. Auto-hospedar um modelo aberto (com Ollama, vLLM ou llama.cpp) só paga seu custo operacional depois de um break-even alto, ou quando residência de dados é requisito rígido. A maioria dos produtos começa na API e revisita a pergunta se a escala um dia obrigar.
Confiabilidade: endpoints de LLM são instáveis
Trate a API de LLM como uma dependência remota lenta, limitada por taxa e que falha de vez em quando, porque é isso que ela é. Os limites chegam como requisições por minuto e tokens por minuto; exceda qualquer um e você recebe um 429. A disciplina é a mesma que toda API com rate limit exige: num 429 ou num 5xx, faça retry com backoff exponencial mais jitter e honre o Retry-After; num 4xx — autenticação ruim, requisição malformada, recusa por política de conteúdo — não faça retry, porque vai falhar de forma idêntica. Some timeouts por requisição (a geração pode travar) e lembre que uma chamada não idempotente repetida custa tokens duas vezes. Nada disso é específico de LLM; tudo isso é pulado pelos tutoriais que param no curl do caminho feliz.
A regra que os tutoriais enterram: nunca chame do cliente
O fato operacional mais importante, e o que as páginas de glossário omitem: a chamada à API de LLM pertence ao seu servidor, nunca ao browser ou ao app. Uma chave de API de modelo embarcada no cliente está a uma olhada na aba de rede ou a um decompile de binário de ser roubada — e, ao contrário de uma chave publicável vazada, uma chave de modelo roubada é um estranho com o seu orçamento de tokens e nenhum limite além da sua fatura. O padrão é a mesma disciplina de proxy que todo serviço com chave secreta precisa: o cliente chama o seu endpoint, seu backend guarda a chave na configuração do servidor e chama o modelo, e a resposta volta através de você. Esse proxy também é onde vive todo outro controle deste artigo — tetos de custo, retries, streaming, poda de prompt — e é por isso que “para onde vai a chamada?” tem uma resposta só.
Casos de uso comuns
- Resumo e extração — transforme texto longo em dados curtos e estruturados,
temperature: 0. - Chat e assistentes — respostas em streaming sobre um histórico de conversa reenviado.
- Classificação e tagging — Structured Outputs impondo o seu schema de rótulos.
- Respostas com RAG — geração ancorada em contexto recuperado, com custo administrado aparando esse contexto.
- Ações agênticas — tool calling em loop, cada tool uma função de backend com permissões.
Você deveria usar uma API de LLM? Matriz de decisão
| Situação | Escolha |
|---|---|
| Lançar uma funcionalidade de IA agora | Uma API de LLM — zero infraestrutura |
| Qualquer app voltado ao cliente | A API, chamada no servidor — nunca do dispositivo |
| Volume extremo e sustentado | Avalie self-hosting (Ollama, vLLM) depois do break-even |
| Residência de dados estrita | Auto-hospede, ou um provedor com as garantias certas |
| Tarefa determinística, baseada em regras | Talvez nenhum LLM — código comum é mais barato e confiável |
| O modelo precisa fazer coisas | Tool calling → um agente |
Limitações e trade-offs
- Não-determinismo é o padrão. O mesmo prompt varia entre execuções; qualquer coisa que exija repetibilidade exata precisa de
temperature: 0e, com frequência, validação da saída. - O custo escala com os tokens, silenciosamente. Um contexto generoso ou um
max_tokenssem teto torna cara em volume uma funcionalidade barata — meça o uso, não o presuma. - A latência é de segundos, não de milissegundos. Chamadas de LLM são lentas para os padrões da web; projete para isso com streaming, padrões assíncronos e estados de loading honestos.
- A dependência é externa e limitada por taxa. Outages e throttling do provedor são os seus outages; retries, fallbacks e cache são resiliência, não polimento.
- As saídas podem estar erradas com confiança. A API retorna texto fluente independentemente da verdade; ancoragem (RAG) e validação são como você passa a confiar nela.
APIs de LLM no Back4app
O Back4app é uma plataforma open-source de Backend as a Service (BaaS) que combina banco de dados gerenciado, APIs REST e GraphQL geradas automaticamente, autenticação, armazenamento de arquivos e funções serverless com Cloud Code. A pergunta “onde a chamada pertence” se responde sozinha aqui: dentro de uma Cloud Function, exatamente como mostram as abas de código — o cliente chama o seu summarize, a função guarda a chave do modelo na configuração do servidor e chama a API de LLM, e a chave nunca toca o dispositivo. Esse único posicionamento resolve a lista de lacunas inteira de uma vez: tetos de custo (a função define max_tokens e escolhe o modelo), retries e backoff (na função, contra o endpoint instável) e entrega de dois jeitos — retorne a resposta de forma síncrona para uma resposta única, ou grave-a no banco e deixe os clientes assistirem a ela se preencher via Live Queries, que é streaming sem um socket que você precisou construir. A API de LLM deixa de ser um risco de integração e vira mais uma chamada server-side que o seu backend já sabe fazer com segurança.
Perguntas frequentes
O que é uma API de LLM?
Um endpoint HTTP que permite ao seu código enviar um prompt a um grande modelo de linguagem hospedado e receber texto gerado de volta — sem rodar o modelo, as GPUs ou a infraestrutura de inferência por conta própria. Você faz POST de um corpo JSON, recebe uma mensagem do assistente mais a contagem de tokens usados, e paga por token.
O que é um token e como o preço é calculado?
Um token é um pedaço de texto — cerca de quatro caracteres ou três quartos de uma palavra em inglês. Você paga por milhão de tokens, com tarifas separadas para entrada (seu prompt) e saída (a resposta gerada). A saída tipicamente custa várias vezes mais que a entrada, porque gerar cada token exige mais computação do que ler um.
O que é a janela de contexto?
O número máximo de tokens — entrada mais saída — que um modelo consegue considerar numa requisição. Ela limita quanto histórico de conversa ou documento você pode incluir e é um vetor direto de custo: cada chamada paga por todo o contexto enviado, então um histórico longo ou um trecho recuperado grande é dinheiro gasto a cada requisição.
O que é streaming e por que as UIs de chat o usam?
Ativar a flag de stream faz a resposta chegar de forma incremental, como Server-Sent Events, em vez de um bloco final único, e a UI renderiza os tokens conforme são gerados. Ele existe pela latência percebida: o tempo até o primeiro token é uma fração do tempo até a resposta completa, então o usuário vê palavras imediatamente em vez de um spinner por vários segundos.
O que é function calling ou tool calling?
Você descreve as tools disponíveis — um nome e um schema JSON — na requisição; o modelo, em vez de responder em prosa, retorna uma chamada JSON estruturada nomeando uma tool e seus argumentos. Seu código a executa e devolve o resultado. O modelo nunca executa a função; apenas a solicita. Esse é o mecanismo que transforma uma API de LLM num agente.
A API de LLM deve ser chamada do cliente ou do servidor?
Do servidor, sempre. Uma chave de API embarcada num bundle de browser ou binário mobile está a uma inspeção da aba de rede ou a um decompile de ser roubada — e uma chave de modelo roubada é um estranho gastando o seu orçamento de tokens. Toda chamada de LLM passa pelo seu backend, com a chave na configuração do servidor.
API de LLM ou auto-hospedar um modelo aberto?
Uma API significa zero infraestrutura, cobrança por chamada e lançar hoje; auto-hospedar um modelo aberto (com ferramentas como Ollama, vLLM ou llama.cpp) compra controle total e residência de dados, mas só vence em custo com volume muito alto e sustentado, depois de contar GPUs e operação. A maioria dos produtos começa na API e revisita a conta na escala.
Como lidar com rate limits e falhas?
Os limites vêm como requisições por minuto e tokens por minuto; num 429 ou num 5xx, faça retry com backoff exponencial mais jitter e honre o header Retry-After, se houver. Não faça retry de erros 4xx — autenticação ruim, requisição malformada e recusas por política de conteúdo vão falhar de forma idêntica na segunda vez.