Voltar ao blog

API e SDKGuia

LangChain ChatOpenAI com base_url personalizado: CheapTokens em Python

Aponte o ChatOpenAI do LangChain para o CheapTokens: base_url, chave e id de modelo em Python, depois invoke, streaming e uso de tokens por chamada.

Por CheapTokens TeamPublicado em Atualizado em 5 min de leitura

Código Python: ChatOpenAI com base_url definido para a API do CheapTokens
Nesta página
  1. Qual id de modelo vai em model
  2. Definindo base_url pelo ambiente
  3. Fazendo streaming da resposta
  4. Lendo o uso de tokens por chamada
  5. Quanto custa por dia um pipeline LangChain
  6. O que este guia cobre

Você já tem uma chain do LangChain que conversa com ChatOpenAI e quer que ela rode em outro endpoint sem reescrevê-la. Você pode: passar três argumentos, base_url, api_key e model, e o resto da chain permanece como está. O CheapTokens fala o protocolo OpenAI Chat Completions em https://api.cheaptokens.dev/v1, então ChatOpenAI funciona com ele diretamente.

Os passos abaixo seguem a documentação do LangChain ChatOpenAI conforme verificada em 27 de outubro de 2026. A página não mostra data nem versão, então não fixo uma release do langchain-openai aqui: instale a mais recente.

Passo a passo

Conecte o LangChain em três passos

Instalar

bash
pip install -U langchain-openai

Definir a chave

Mantenha a chave em uma variável de ambiente, não no arquivo:

bash
export CHEAPTOKENS_API_KEY="your-key"

Chamar o modelo

python
import os
from langchain_openai import ChatOpenAI

llm = ChatOpenAI(
    model="deepseek-ai/DeepSeek-V4-Flash-0731",
    base_url="https://api.cheaptokens.dev/v1",
    api_key=os.environ["CHEAPTOKENS_API_KEY"],
)

msg = llm.invoke("Explain what a token is in one sentence.")
print(msg.content)

invoke() retorna uma mensagem; .content é o texto da resposta. Essa é toda a conexão. Obtenha uma chave e recarregue o saldo na documentação do CheapTokens.

Quatro passos: definir base_url, definir api_key, usar o id completo do modelo, ler usage_metadata
Quatro coisas para definir: base_url, api_key, o id completo do modelo, depois ler usage

Qual id de modelo vai em model#

Use o id completo, com o prefixo do desenvolvedor. Um nome curto como deepseek-v4-flash é o que você vê nas tabelas de preço; a API aceita deepseek-ai/DeepSeek-V4-Flash-0731. Os ids da lista de modelos do CheapTokens:

  • deepseek-ai/DeepSeek-V4-Flash-0731: contexto de 380K, até 32.768 tokens de saída por resposta. Um bom padrão para chains com documentos longos e respostas longas.
  • zai-org/GLM-5.3-Flash: contexto de 390K, até 8.192 tokens de saída.
  • MiniMaxAI/MiniMax-M2.7: contexto de 180K, até 8.192 tokens de saída.

Trocar é uma mudança de uma linha, porque o modelo é só uma string:

python
llm = ChatOpenAI(
    model="zai-org/GLM-5.3-Flash",
    base_url="https://api.cheaptokens.dev/v1",
    api_key=os.environ["CHEAPTOKENS_API_KEY"],
)

Os três compartilham um único saldo, então você pode testar cada um na mesma chain sem abrir nada novo. Os preços atuais estão na página de preços; para o MiniMax-M2.7 a entrada é $0.05 e a saída $0.15 por 1M de tokens.

Definindo base_url pelo ambiente#

Sua chain chama ChatOpenAI, que envia requisições para api.cheaptokens.dev/v1
Para onde vai a requisição: chain, ChatOpenAI, API do CheapTokens

Se você preferir não mexer no código, o LangChain lê o endereço do ambiente. A documentação dá a ordem de precedência:

  1. o argumento base_url (ou openai_api_base) que você passa no código;
  2. OPENAI_API_BASE, que o LangChain lê;
  3. OPENAI_BASE_URL, que o SDK openai lê.

Verificação rápida

Você define base_url no código e também exporta OPENAI_BASE_URL com outro endereço. Qual o ChatOpenAI usa?

Mostrar resposta

Resposta: O argumento base_url no código

O argumento explícito tem a maior prioridade, depois OPENAI_API_BASE, depois OPENAI_BASE_URL. Uma variável esquecida no seu shell não vai redirecionar uma chamada que define base_url explicitamente.

Um efeito colateral da mesma página da documentação: quando OPENAI_BASE_URL está definido, o LangChain deixa stream_usage desligado por padrão. Isso importa nas próximas duas seções.

Fazendo streaming da resposta#

Para uma UI você quer o texto conforme ele chega. stream() gera chunks, e cada chunk tem um trecho em .content:

python
for chunk in llm.stream("Write a three-line summary of how HTTP works."):
    print(chunk.content, end="", flush=True)

Isso basta para uma janela de chat. Se você também quer a contagem de tokens no fim de um stream, passe stream_usage=True: ChatOpenAI(..., stream_usage=True). Este guia conta tokens a partir de invoke(), como na próxima seção. Streaming no SDK OpenAI puro é abordado em Streaming de respostas em Python.

Lendo o uso de tokens por chamada#

Toda mensagem retornada por invoke() carrega usage_metadata com os tokens que a chamada usou:

python
msg = llm.invoke("Summarize this ticket in one line: my invoice shows the wrong VAT number.")
print(msg.usage_metadata)
# {'input_tokens': ..., 'output_tokens': ..., 'total_tokens': ...}

Some isso ao longo de um pipeline e você tem um orçamento por execução:

python
total_in = total_out = 0
for ticket in tickets:
    msg = llm.invoke(ticket)
    total_in += msg.usage_metadata["input_tokens"]
    total_out += msg.usage_metadata["output_tokens"]

Entrada e saída têm preços separados, então guarde os dois números. Por que essa divisão existe está em Tokens de entrada vs saída, e um rastreador completo com guarda de parada no orçamento está em Rastrear o custo de tokens de agentes de IA em Python.

Quanto custa por dia um pipeline LangChain#

Digamos que você rode um bot de suporte com 2.000 tickets por dia. Cada chamada envia o ticket mais um prompt, cerca de 3.000 tokens, e a resposta tem cerca de 500 tokens. No MiniMax-M2.7 uma chamada dessas custa $0.00023. Mova os sliders para os seus próprios números; o site soma com os preços atuais:

Calculadora de custos

Um dia do bot de suporte

Tokens de entrada por solicitação: 3.000 · Tokens de saída por solicitação: 500 · Solicitações por dia: 2.000

ModeloPor diaPor mês
GLM-5.3-Flash$0.16$4.80
DeepSeek-V4-Flash$0.19$5.70
MiniMax-M2.7$0.45$13.50

A calculadora mostra a soma diária: nesse tipo de chamada, a entrada é a maior parte dos tokens e a saída a menor. Com o CheapTokens o total, entrada e saída somadas, fica abaixo do OpenRouter, e o preço é o mesmo em qualquer horário: não há tarifas de horário de pico para planejar.

O que este guia cobre#

O exemplo usa chat completions simples: invoke, stream e usage_metadata. ChatOpenAI segue a especificação da OpenAI, então o texto da resposta está em .content. Segundo a documentação do LangChain, ele muda para a Responses API quando você usa ferramentas embutidas ou o parâmetro reasoning.

Se uma chamada falhar, a causa costuma ser uma de três coisas: /v1 ausente em base_url, um id de modelo curto em vez do completo, ou a variável da chave não exportada no shell que executa o Python. A lista de erros comuns de conexão mostra como cada um aparece.

Próximo passo: rode o bloco de três passos acima com a sua própria chain, depois teste a mesma chain em endpoints compatíveis com OpenAI com um id de modelo diferente.