Antes e depois
Aqui está um cliente OpenAI típico em Python:
import os
from openai import OpenAI
client = OpenAI(api_key=os.environ["OPENAI_API_KEY"])
r = client.chat.completions.create(
model="your-current-model",
messages=[{"role": "user", "content": "Draft a tense dialogue between two rivals."}],
)
E o mesmo cliente apontado para a alternativa sem filtros:
import os
from openai import OpenAI
client = OpenAI(
base_url="https://api.chatgptunfiltered.com/v1",
api_key=os.environ["UNFILTERED_API_KEY"],
)
r = client.chat.completions.create(
model="uncensored",
messages=[{"role": "user", "content": "Draft a tense dialogue between two rivals."}],
)
Duas linhas alteradas no construtor, e a string do modelo alterada na chamada. O formato da mensagem, o objeto de resposta e a maneira de ler r.choices[0].message.content permanecem como eram. A alternativa é um modelo diferente executado por um provedor independente. Não é ChatGPT e não é uma API oficial da OpenAI ou de qualquer outro.
Mudando apenas com variáveis de ambiente
As versões mais recentes dos SDKs oficiais de Python e Node.js leem OPENAI_BASE_URL e OPENAI_API_KEY quando você cria um cliente sem argumentos. Isso significa que o código da aplicação pode permanecer inalterado:
export OPENAI_BASE_URL="https://api.chatgptunfiltered.com/v1"
export OPENAI_API_KEY="YOUR_KEY"
python app.py
Você ainda precisa garantir que o código passe model="uncensored". Se o nome do modelo estiver codificado em vários lugares, extraia-o para um único valor de configuração primeiro. Essa pequena refatoração torna qualquer troca futura igualmente barata, em qualquer direção.
A mesma ideia funciona em Node:
import OpenAI from "openai";
const client = new OpenAI({
baseURL: "https://api.chatgptunfiltered.com/v1",
apiKey: process.env.UNFILTERED_API_KEY,
});
const r = await client.chat.completions.create({
model: "uncensored",
messages: [{ role: "user", content: "Give me five villain names." }],
});
console.log(r.choices[0].message.content);Frameworks e o formato Responses
Bibliotecas que envolvem o cliente OpenAI geralmente expõem uma configuração de URL base. No wrapper de chat OpenAI do LangChain, parece assim:
from langchain_openai import ChatOpenAI
llm = ChatOpenAI(
model="uncensored",
base_url="https://api.chatgptunfiltered.com/v1",
api_key="YOUR_KEY",
)
print(llm.invoke("Name three moods for a chase scene.").content)
Se você usar o formato Responses mais recente, POST /v1/responses é suportado assim como POST /v1/chat/completions. GET /v1/models lista o modelo, que é uma verificação rápida de que sua chave e URL estão corretas.
Diferenças a esperar
| Área | O que você notará |
|---|---|
| Disposição para responder | Ele responde sem recusas de conteúdo para uso adulto legal. Prompts que um modelo com filtro recusaria geralmente obterão uma resposta. |
| Palavras e estilo | Modelo diferente, voz diferente. Tom, comprimento e hábitos de formatação não corresponderão ao seu modelo anterior. |
| Escolha de modelo | Um modelo, ID uncensored. Sem planos para escolher. |
| Escopo | Apenas texto: sem geração de imagem, áudio ou vídeo, sem embeddings, sem fine-tuning. |
| Contexto | 100.000 tokens, prompt mais completion. max_tokens é opcional. |
| Limites | Chave completa: 8 simultâneas, 300 por minuto. Chave de teste: 2 simultâneas, 60 por minuto. Corpo até 8 MB. |
| Erros | HTTP 429 com código rate_limited ou concurrency; sobrecarga temporária retorna 429 com Retry-After: 5. |
Streaming, chamada de funções e modo JSON são suportados, assim como temperature, top_p, stop, seed e as penalidades. Os cabeçalhos de resposta incluem X-Request-Id, X-Balance-USD, X-RateLimit-Limit-Requests e X-RateLimit-Limit-Concurrency. A documentação tem os detalhes.
Duas diferenças adicionais merecem uma linha. Primeiro, um modelo diferente pode contar tokens de forma diferente, então as contagens para o mesmo texto podem diferir do que seu antigo provedor relata; use os números de uso nas respostas, não suas próprias estimativas. Segundo, recursos que dependem de ferramentas hospedadas pelo fornecedor, como busca na web integrada ou armazenamento de arquivos no lado do fornecedor, não fazem parte deste serviço. Chamada de funções: você define funções, e seu código as executa.
Um script de paridade para seus próprios prompts
Em vez de analisar visualmente algumas saídas, execute seu conjunto de prompts pelo novo endpoint em loop e salve tudo o que precisar revisar.
import csv, json
with open("prompts.json", encoding="utf-8") as f:
prompts = json.load(f) # a list of strings
with open("results.csv", "w", newline="", encoding="utf-8") as out:
w = csv.writer(out)
w.writerow(["prompt", "reply", "in_tokens", "out_tokens"])
for p in prompts:
r = client.chat.completions.create(
model="uncensored",
temperature=0.7,
messages=[{"role": "user", "content": p}],
)
w.writerow([p, r.choices[0].message.content, r.usage.prompt_tokens, r.usage.completion_tokens])
Abra o CSV e revise uma coluna por vez. As colunas de tokens dão a você uma previsão de custo para o mesmo tráfego: multiplique as somas por $0,15 e $0,50 por 1M. Uma chave de teste permite 60 requisições por minuto e 2 ao mesmo tempo, então um conjunto de algumas centenas de prompts termina em minutos se você mantiver o loop sequencial.
Uma lista de verificação rápida de migração
- Obtenha uma chave. Na página da chave de API, entre com Google ou e-mail e resgate o crédito de teste de $0,50. Ele dura 7 dias e não precisa de cartão.
- Mova o nome do modelo e URL para a configuração. Um lugar, lido do ambiente.
- Reproduza seus prompts de teste. Use de 20 a 50 exemplos reais, incluindo aqueles que seu modelo anterior recusou, e leia os resultados.
- Ajuste o prompt do sistema. Remova o texto que existia apenas para fazer um modelo com filtros responder. Mantenha o que descreve papel, público-alvo e formato.
- Adicione um manipulador de 429. Aguarde 5 segundos e tente novamente. Limite a concorrência para corresponder à sua chave.
- Verifique o uso. Monitore
X-Balance-USDnas respostas enquanto executa tráfego real.
Um auxiliar de retry que cobre o passo 5:
import time
from openai import RateLimitError
def create_with_retry(**kwargs):
for _ in range(4):
try:
return client.chat.completions.create(**kwargs)
except RateLimitError:
time.sleep(5)
raise RuntimeError("rate limited after 4 tries")
Mantenha as saídas salvas do modelo antigo por algumas semanas. Se um usuário reclamar que algo parece estranho após a mudança, você pode comparar com o que o modelo antigo teria dito e ver se a diferença é o prompt, o modelo ou a entrada.
Lançando sem risco
Não altere tudo de uma vez. Coloque a escolha do provedor atrás de configuração para que você possa mover uma porcentagem do tráfego e reverter em segundos.
import os, random
from openai import OpenAI
old = OpenAI(api_key=os.environ["OPENAI_API_KEY"])
new = OpenAI(base_url="https://api.chatgptunfiltered.com/v1", api_key=os.environ["UNFILTERED_API_KEY"])
SHARE = float(os.environ.get("NEW_SHARE", "0.05"))
def pick():
if random.random() < SHARE:
return new, "uncensored"
return old, os.environ["OLD_MODEL"]
Comece com 5%, monitore sua taxa de erro, contagens de 429 e feedback do usuário por alguns dias, depois aumente. Defina NEW_SHARE como 0 para reverter. Escolher por usuário ou por recurso é melhor do que escolher por requisição quando as conversas devem permanecer em um único modelo, pois trocar de modelo no meio do chat altera a voz.
Quanto custa, e quando manter o provedor atual
O preço é $0,15 por 1M de tokens de entrada e $0,50 por 1M de tokens de saída, a partir de crédito pré-pago. Uma requisição com 1.500 tokens de entrada e 400 de saída custa 1.500 x $0,15 / 1M = $0,000225, mais 400 x $0,50 / 1M = $0,0002, totalizando $0,000425, ou $0,425 por 1.000 requisições. Para outros fornecedores, verifique suas páginas de preços atuais; as taxas mudam e uma comparação de memória fica desatualizada rapidamente. Recargas são valores inteiros de $20 a $500, pagos em cripto, com bônus a partir de $50. Detalhes em preços.
Permanecer com seu provedor atual é a escolha certa se você precisar de imagens ou embeddings, se seu público precisar de moderação rigorosa ou se um modelo específico do fornecedor for um requisito obrigatório. Para entender melhor o que é essa classe de modelos, leia entendendo modelos ChatGPT sem censura. O limite rígido nunca muda: é proibido conteúdo sexual envolvendo menores de idade.
Também é perfeitamente válido executar ambos os provedores lado a lado. Muitas equipes direcionam requisições comuns para um modelo e as requisições que continuam sendo recusadas para outro. Como ambos falam o mesmo formato, esse roteamento consiste em algumas linhas de código e uma regra para quando usar cada um.
