PT ▾
Abrir conta

API de chatbot sem filtros: primeiro pedido em cinco minutos

Uma API de chatbot sem filtros leva cinco minutos para experimentar se você já tem Python. Você precisa de uma chave, duas configurações alteradas no SDK OpenAI e um pedido. Depois disso, um prompt de sistema e streaming o transformam em um chatbot.

Última atualização

Avião de papel de vidro transportando um balão de chat de uma plataforma de lançamento em forma de chave em direção a um farol

Principais conclusões

Minuto 1 a 2: obter uma chave

Acesse a página da chave de API e entre com Google, ou com e-mail e senha. Após o cadastro, a página da chave mostra um botão para resgatar o crédito de teste: $0,50, um por pessoa, válido por 7 dias, sem necessidade de cartão.

Copie a chave e coloque-a em uma variável de ambiente. Uma chave em um arquivo que você confirma por engano é a maneira mais comum de perder crédito.

# model ID for later requests: uncensored
export UF_API_KEY="paste-your-key-here"
pip install openai

Uma chave de teste permite 2 requisições simultâneas e 60 requisições por minuto. Esses limites são mais que suficientes para este tutorial.

Minuto 3: o primeiro pedido

O serviço é compatível com OpenAI, então o SDK oficial funciona assim que você altera base_url e a chave. O ID do modelo é uncensored.

import os
from openai import OpenAI

client = OpenAI(
    base_url="https://api.chatbotunfiltered.com/v1",
    api_key=os.environ["UF_API_KEY"],
)

resp = client.chat.completions.create(
    model="uncensored",
    messages=[{"role": "user", "content": "Give me three names for a cyberpunk bar."}],
)

print(resp.choices[0].message.content)
print("tokens in/out:", resp.usage.prompt_tokens, resp.usage.completion_tokens)

Execute com python first.py. Uma lista de nomes e uma contagem de tokens significam que tudo funciona. Se você vir um erro de autenticação, verifique a variável. Se a conexão falhar, verifique se a Base URL termina em /v1.

A resposta segue o formato de chat da OpenAI: uma lista choices com a mensagem, um bloco usage com contagens de tokens e, nesse formato, um motivo de finalização indicando por que a geração parou. Uma resposta truncada geralmente indica um max_tokens baixo. Quanto ao custo, uma requisição com 500 tokens de entrada e 300 tokens de saída custa $0,000075 + $0,00015 = $0,000225. As cinco requisições deste tutorial custam cerca de um décimo de centavo no total, então o crédito de teste é pouco utilizado.

Minuto 4: adicionar um prompt de sistema e configurações

Um pedido básico oferece uma voz de assistente padrão. Para um chatbot, adicione uma mensagem de sistema que defina um personagem e passe configurações de amostragem adequadas a ele.

import os
from openai import OpenAI

client = OpenAI(
    base_url="https://api.chatbotunfiltered.com/v1",
    api_key=os.environ["UF_API_KEY"],
)

raw = client.chat.completions.with_raw_response.create(
    model="uncensored",
    messages=[
        {"role": "system", "content": "You are Rook, a smuggler with a dry sense of humor. Stay in character. Keep replies under 80 words."},
        {"role": "user", "content": "Can you get me across the border tonight?"},
    ],
    temperature=0.9,
    top_p=0.95,
    max_tokens=200,
    seed=7,
)

resp = raw.parse()
print(resp.choices[0].message.content)
print("balance:", raw.headers.get("x-balance-usd"))
print("request id:", raw.headers.get("x-request-id"))
  • temperature e top_p controlam a variedade. Valores mais altos dão texto mais animado e menos previsível.
  • seed torna os testes mais fáceis de repetir. Ele é passado através, então use-o para comparar edições de prompt.
  • max_tokens é opcional. Sem ele, a conclusão pode usar o resto da janela de 100.000 tokens.
  • O cabeçalho de saldo informa seu crédito restante após cada chamada.

O prompt é o produto aqui. Mantenha-o curto e específico. Diga quem é o personagem, como ele fala, qual é a história e qual deve ser o comprimento. Tudo isso vai para a mensagem de sistema uma vez, e você o envia novamente com cada pedido, já que a API não lembra nada entre as chamadas.

Minuto 5: streaming

O streaming imprime texto conforme é gerado. É uma alteração de uma palavra no pedido, mais um loop para ler chunks.

import os
from openai import OpenAI

client = OpenAI(
    base_url="https://api.chatbotunfiltered.com/v1",
    api_key=os.environ["UF_API_KEY"],
)

stream = client.chat.completions.create(
    model="uncensored",
    stream=True,
    messages=[
        {"role": "system", "content": "You are Rook, a smuggler with a dry sense of humor."},
        {"role": "user", "content": "Tell me about the worst job you ever took."},
    ],
)

for chunk in stream:
    if chunk.choices and chunk.choices[0].delta.content:
        print(chunk.choices[0].delta.content, end="", flush=True)
print()

Uma solicitação de streaming ocupa um dos seus slots de concorrência até o fim do stream. Com uma chave de teste, dois streams abertos já usam todos eles, e um terceiro pedido retorna HTTP 429 com código concurrency. Aguarde e tente novamente.

Se você quiser confirmar o uso após um stream, o último chunk inclui um bloco de uso.

Escolher valores de amostragem com um plano

As configurações de amostragem mudam a sensação do bot mais do que a maioria das pessoas espera. Comece com os valores abaixo e mova um de cada vez.

ObjetivoConfiguraçãoPor quê
Contação de histórias animadatemperature 0,9 a 1,0, top_p 0,95Mais variedade entre execuções
Personagem consistentetemperature 0,6 a 0,7Menos surpresas
Testes repetíveisseed fixo, temperature 0O mesmo prompt dá o mesmo tipo de resposta
Menos repetiçãoPenalidade de frequência ou presença em torno de 0,3Desencoraja loops
Cortar uma resposta em um marcadorstop com uma stringEncerra a saída quando ela aparece

Os controles de temperatura e top_p ajustam a variedade, e as penalidades são repassadas ao modelo. Altere um valor, execute o mesmo prompt cinco vezes e leia as cinco respostas antes de alterar o próximo.

Transforme em uma conversa

A API não mantém o histórico. Para fazer o Rook lembrar, mantenha uma lista e adicione ambos os lados após cada turno.

import os
from openai import OpenAI

client = OpenAI(
    base_url="https://api.chatbotunfiltered.com/v1",
    api_key=os.environ["UF_API_KEY"],
)

messages = [{"role": "system", "content": "You are Rook, a smuggler with a dry sense of humor."}]

def talk(text):
    messages.append({"role": "user", "content": text})
    r = client.chat.completions.create(model="uncensored", messages=messages)
    answer = r.choices[0].message.content
    messages.append({"role": "assistant", "content": answer})
    return answer

print(talk("Where are we headed?"))
print(talk("And what did I just ask you?"))

A segunda pergunta funciona apenas porque o primeiro turno está na lista. É também por isso que o custo do chat cresce com o tamanho: cada turno reenvia tudo. A análise de custo e compensação aborda esse efeito em profundidade, e a página de preços mostra as taxas de $0,15 e $0,50 por 1M de tokens.

Duas advertências à medida que a lista cresce. A primeira é o custo, já que históricos longos aumentam o preço de cada turno. A segunda é a janela: 100.000 tokens para prompt mais resposta é generoso, mas um roleplay que dure semanas atingirá esse limite. Remova os turnos mais antigos, mantendo a mensagem do sistema, quando a lista estiver longa, ou substitua-os por um resumo curto.

Problemas comuns e próximos passos

ProblemaCausa provávelCorreção
Erro de autenticaçãoChave errada ou vaziaImprima o comprimento da variável, remova espaços
Não encontradoURL base faltando /v1Use a URL base exata desta página
429 rate_limitedMais de 60 requisições por minuto (teste)Reduza a velocidade ou use uma chave completa (300 por minuto)
429 com Retry-After: 5Sobrecarga temporáriaEspere 5 segundos e tente novamente
Respostas estranhas ou planasPrompt do sistema fracoAdicione voz, configuração, limite de tamanho

Requisições falhas ou recusadas não são cobradas. Para os próximos passos, leia a documentação da API para ferramentas e modo JSON. O modelo é apenas de texto, então não há imagens, áudio ou embeddings. Recargas são de $20 a $500 em cripto (USDT na TRC20 ou USDC na Base), e o crédito nunca expira. Você é responsável pelo acesso e moderação apenas para adultos em qualquer coisa que construir sobre ele.

Se um problema não estiver na tabela, reduza a requisição ao menor caso funcional: uma mensagem do usuário, sem prompt do sistema, sem parâmetros extras. Depois, adicione as peças de volta até que falhe. Quase todos os problemas em uma primeira integração vêm de um erro de digitação na URL, uma chave copiada com um espaço no final ou uma lista de mensagens com formato incorreto.

Trate erros no código

Um script que funciona uma vez não é um bot. Adicione uma nova tentativa para os casos em que a API informa para aguardar.

import os, time
from openai import OpenAI, RateLimitError

client = OpenAI(
    base_url="https://api.chatbotunfiltered.com/v1",
    api_key=os.environ["UF_API_KEY"],
    max_retries=0,
)

def ask(messages, tries=4):
    for i in range(tries):
        try:
            r = client.chat.completions.create(model="uncensored", messages=messages)
            return r.choices[0].message.content
        except RateLimitError:
            time.sleep(5 * (i + 1))
    raise RuntimeError("still rate limited after retries")

O SDK lança RateLimitError no HTTP 429. Para sobrecarga temporária, a API envia Retry-After: 5, então aguardar cinco segundos é o primeiro passo adequado. Para erros repetidos de concurrency, faça fila de requisições do seu lado em vez de tentar novamente mais rápido.

Perguntas frequentes

Uma API de chatbot sem filtros é igual à API da OpenAI?

O protocolo é o mesmo, então o SDK da OpenAI funciona. O modelo é diferente: um modelo de pesos abertos de um provedor independente, ajustado para responder sem recusas de conteúdo para uso adulto legal.

Qual URL base e modelo devo usar?

URL base https://api.chatbotunfiltered.com/v1 e o ID do modelo uncensored.

Preciso pagar para experimentá-lo?

Não. O crédito de teste de $0,50 não precisa de detalhes de pagamento. Recargas pagas são apenas por cripto.

Posso fazer streaming das respostas?

Sim. Defina stream como true. Uma requisição em streaming ocupa uma vaga de concorrência até que o streaming termine.

Como vejo meu saldo?

Leia o cabeçalho X-Balance-USD em qualquer resposta ou chame GET /v1/balance.

Obtenha sua chave de API instantaneamente

Registre-se, copie sua chave, atualize sua URL base. A configuração está completa.