Configurando a API de roteamento nos principais frameworks: de SDK a Dify
A integração exige apenas três valores: endpoint, chave e nome do modelo. A dificuldade está nos nomes diferentes: alguns chamam de base_url, outros de api_base, e no Dify é um formulário. Esta página lista as equivalências com código pronto e um checklist de depuração.
Pontos-chave
- Armazene o endpoint e a chave em variáveis de ambiente (API_BASE e API_KEY) para evitar expor dados sensíveis no código.
- O endpoint deve incluir o sufixo /v1 e o nome do modelo deve ser fixo em uncensored.
- LangChain usa base_url; LlamaIndex usa api_base. Nomes diferentes, mesma função.
- No Dify, selecione o provedor "OpenAI-API-compatible" e preencha manualmente o nome do modelo, o endpoint e o tamanho da janela de contexto.
Reúna os três valores necessários
Antes de configurar qualquer framework, certifique-se de ter esses três valores. O restante da configuração consiste apenas em preenchê-los.
- Endpoint:
https://api.llmzhongzhuan.com/v1. Mantenha o/v1, mas não adicione/chat/completions; o SDK faz isso. - Chave: Disponível imediatamente após o registro na página de obtenção de chave. Cada conta possui uma chave, que pode ser redefinida, invalidando a anterior instantaneamente.
- Modelo: apenas
uncensored. Confirme comGET /v1/models.
Atenção aos limites: janela de contexto de 100.000 tokens, max_tokens padrão 2.048 e máximo 32.000, e 300 requisições por minuto por chave. Esses valores serão usados nas configurações de parâmetros.
Formato das variáveis de ambiente
Hardcode é erro comum. Use variáveis de ambiente. Usaremos API_KEY e API_BASE nos exemplos.
# Linux / macOS:写进 ~/.zshrc 或 .env 加载脚本
export API_KEY="替换为你的密钥"
export API_BASE="https://api.llmzhongzhuan.com/v1"
# Windows PowerShell(仅当前会话)
$env:API_KEY = "替换为你的密钥"
$env:API_BASE = "https://api.llmzhongzhuan.com/v1"
Adicione .env ao .gitignore. O SDK Python lê OPENAI_API_KEY e OPENAI_BASE_URL. Você pode passar explicitamente para evitar conflitos.
SDK Python e SDK Node.js da OpenAI
O Python precisa da versão 1 ou superior do openai, e o Node precisa da versão 4 ou superior. A diferença entre eles é apenas a sintaxe; ao criar o cliente, basta passar o endereço e a chave. Vamos começar com a chamada não streaming em Python, imprimindo o usage para facilitar a conferência dos custos:
import os
from openai import OpenAI
client = OpenAI(
base_url=os.environ.get("API_BASE", "https://api.llmzhongzhuan.com/v1"),
api_key=os.environ["API_KEY"],
)
resp = client.chat.completions.create(
model="uncensored",
messages=[{"role": "user", "content": "写一条 20 字以内的发布公告标题。"}],
max_tokens=100,
)
print(resp.choices[0].message.content)
print(resp.usage)
O exemplo Node.js usa streaming, ideal para efeitos de digitação. O servidor envia automaticamente um fragmento com usage no final; não são necessários parâmetros extras:
import OpenAI from "openai";
const client = new OpenAI({
baseURL: process.env.API_BASE ?? "https://api.llmzhongzhuan.com/v1",
apiKey: process.env.API_KEY,
});
const stream = await client.chat.completions.create({
model: "uncensored",
messages: [{ role: "user", content: "列出三个命名服务端日志字段的好习惯。" }],
stream: true,
max_tokens: 300,
});
for await (const chunk of stream) {
process.stdout.write(chunk.choices[0]?.delta?.content ?? "");
}
process.stdout.write("\n");
O exemplo em Node usa await no nível superior, o que requer um arquivo .mjs ou a configuração "type": "module" no package.json. Se o seu ambiente de execução não suportar, envolva o código em uma função async.
LangChain: base_url no ChatOpenAI
LangChain usa langchain_openai. Instancie ChatOpenAI e defina base_url.
import os
from langchain_openai import ChatOpenAI
llm = ChatOpenAI(
model="uncensored",
base_url=os.environ.get("API_BASE", "https://api.llmzhongzhuan.com/v1"),
api_key=os.environ["API_KEY"],
temperature=0.7,
max_tokens=500,
timeout=60,
)
print(llm.invoke("把“服务已降级”改写成对用户友好的一句话。").content)
Defina max_tokens e timeout explicitamente. Para tools, use bind_tools; consuma em stream().
LlamaIndex: OpenAILike
A classe OpenAI padrão falha com modelos customizados. Use llama-index-llms-openai-like e OpenAILike com api_base.
import os
from llama_index.llms.openai_like import OpenAILike
llm = OpenAILike(
model="uncensored",
api_base=os.environ.get("API_BASE", "https://api.llmzhongzhuan.com/v1"),
api_key=os.environ["API_KEY"],
is_chat_model=True,
context_window=100000,
max_tokens=500,
)
print(llm.complete("用一句话解释什么是幂等请求。"))
Use is_chat_model=True para usar o endpoint de chat. context_window=100000 evita truncamento.
Dify: Provedor OpenAI-API-compatible
Plataformas visuais como o Dify usam formulários. O processo é consistente entre versões:
- Vá para "Configurações" > "Provedores de Modelo", selecione "OpenAI-API-compatible" e clique em "Adicionar Modelo".
- Tipo: LLM. Modelo:
uncensored. - Chave: sua API Key. Endpoint:
https://api.llmzhongzhuan.com/v1. - Comprimento do contexto do modelo: 100000. Limite máximo de tokens: 32000.
- Ative a opção de suporte a chamada de funções se for usar ferramentas no fluxo de trabalho. Mantenha o streaming habilitado.
- Salve, crie um app de chat simples, selecione o modelo e envie uma mensagem para testar a resposta.
O Dify pode enviar uma requisição de teste ao salvar. Se falhar, verifique se há caminhos extras no endpoint ou espaços na chave. Se o Dify está em container, garanta que ele tenha acesso à internet.
Parâmetros e configuração para produção
Fazer o framework rodar é apenas o primeiro passo. Verifique estes parâmetros antes de ir para produção para controlar custos e falhas.
- max_tokens: Padrão 2048. Aumente explicitamente para textos longos, até 32.000. O total (input + output) não deve exceder 100.000 tokens, ou você receberá erro 400.
- timeout: Saídas longas demoram mais. Para streaming, defina read_timeout para 60s+. Para não-streaming, estime pelo tempo máximo de saída.
- temperature / top_p / stop: parâmetros de amostragem padrão são passados diretamente. Valores definidos no framework são aplicados sem necessidade de chave extra.
- Concorrência: limite de 300 requisições por minuto por chave. Se múltiplas instâncias usam a mesma chave, o limite é compartilhado; não planeje 300 requisições para cada instância.
- Retentativa: Retentativas padrão podem não cobrir 429 e 503. Adicione lógica de backoff conforme descrito no guia de estabilidade.
Em containers, a lógica é a mesma: não inclua chaves na imagem. Injete-as na inicialização. Exemplo mínimo em compose:
# docker-compose.yml 片段
services:
app:
image: your-app:latest
environment:
API_BASE: https://api.llmzhongzhuan.com/v1
API_KEY: ${API_KEY} # 从宿主机环境或 .env 读取,不写进镜像
No Kubernetes, use Secret References. Separe contas/chaves por ambiente (dev, staging, prod) para evitar que vazamentos ou esgotamento de saldo em um ambiente afetem a produção. Como cada conta tem uma chave, use contas separadas e pré-carregue saldos.
Logs: em modo debug, cabeçalhos completos (incluindo Authorization) são impressos. Desative logs de debug em produção ou filtre a chave. Registre o campo usage para conferência de fatura e detecção de prompts longos.
Ordem de resolução de erros
90% dos problemas de integração ocorrem em poucos pontos. Verifique na seguinte ordem:
- 401: a chave está vazia, há espaços ao copiar ou você ainda está usando a chave antiga após a redefinição.
- 404: o endereço está como o caminho raiz sem
/v1ou você adicionou extra/chat/completions. - 402: o código de erro é no_credit, o que significa que o saldo acabou ou o teste expirou; é necessário recarregar o crédito pré-pago.
- 400: a causa comum é que o input com
max_tokensexcedeu 100,000 ou o corpo da requisição ultrapassou 8 MB. - 429 / 503: o primeiro é o limite de 300 requisições por minuto; o segundo é upstream_busy. Aguarde alguns segundos e tente novamente. Veja a prática de estabilidade para mais detalhes.
Outro problema frequentemente negligenciado é o ambiente de rede. A rede interna da empresa, software de proxy ou regras de grupo de segurança podem permitir a resolução do nome de domínio, mas impedir a conexão HTTPS, resultando em longos tempos de espera seguidos de timeout, em vez de um código de erro explícito. Ao encontrar isso, acesse /v1/models com curl na mesma máquina. Se funcionar, o problema está na camada de aplicação; se não funcionar, verifique o proxy e o firewall. Registre o processo de solução de problemas na documentação da equipe para que novos colegas evitem esse problema na próxima vez.
Se os três valores estão corretos e ainda falha, faça uma solicitação direta com curl primeiro para excluir problemas da própria estrutura. Se quiser entender o que exatamente o proxy faz, consulte o princípio do proxy.
Perguntas frequentes
base_url deve ou não incluir /v1?
Sim. Use https://api.llmzhongzhuan.com/v1; o SDK adicionará automaticamente /chat/completions. Não repita o caminho.
Por que o LlamaIndex usa OpenAILike em vez de OpenAI?
A classe OpenAI verifica se o nome do modelo está na lista oficial; modelos personalizados geram erro. O OpenAILike não faz essa verificação, sendo mais adequado para interfaces compatíveis.
Posso nomear o modelo no Dify arbitrariamente?
Não. O nome do modelo deve ser uncensored, pois esse id é enviado exatamente como está. O nome de exibição pode ser outro, mas o campo do modelo deve corresponder.
Por que as alterações nas variáveis de ambiente não surtem efeito?
Geralmente, o terminal ou o processo não foi reiniciado. Recomendamos passar explicitamente base_url e api_key no código e imprimir o endereço real usado para confirmar.
Preencha o formulário para obter a chave
Crie uma conta, copie a chave e altere o Base URL. A configuração é simples assim.