무검열 채팅봇 API: 5분 만에 첫 요청
Python이 이미 설치되어 있다면 무검열 채팅봇 API를 5분 만에 시도해 볼 수 있습니다. 키, OpenAI SDK의 두 가지 설정 변경, 그리고 하나의 요청이 필요합니다. 그 후 시스템 프롬프트와 스트리밍을 추가하면 채팅봇이 됩니다.

주요 내용
- 당사의 무검열 LLM은 주제를 덜 거부하므로 예기치 않은 콘텐츠 차단 없이 역할극 및 창작 글쓰기에 이상적입니다.
- 가격은 100만 입력 토큰당 $0.15, 100만 출력 토큰당 $0.50의 선사용 후결제 방식이며, 월 기본 요금이 없습니다.
- API가 표준 OpenAI 엔드포인트를 사용하므로 Base URL 변경만으로 원활하게 통합할 수 있습니다.
- USDT 또는 USDC를 통한 암호화폐 충전에는 보너스 크레딧이 포함되며, 프롬프트는 학습 데이터로 절대 사용되지 않습니다.
1~2분: 키 받기
API 키 페이지로 이동하여 Google 또는 이메일과 비밀번호로 회원가입하세요. 회원가입 후 키 페이지에 무료 체험 크레딧 청구 버튼이 표시됩니다: $0.50, 인원당 1회, 7일 유효, 카드 불필요.
키를 복사하여 환경 변수에 넣으세요. 실수로 커밋하는 파일 안에 키가 있으면 크레딧을 잃을 가능성이 가장 큽니다.
# model ID for later requests: uncensored
export UF_API_KEY="paste-your-key-here"
pip install openai체험 키는 동시 요청 2개와 분당 60개의 요청을 허용합니다. 이 튜토리얼에는 이러한 제한이 충분합니다.
3분: 첫 번째 요청
서비스는 OpenAI 호환이므로 base_url과 키를 변경하면 공식 SDK가 작동합니다. 모델 ID는 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)python first.py로 실행하세요. 이름 목록과 토큰 수가 표시되면 모든 것이 정상입니다. 인증 오류가 발생하면 변수를 확인하세요. 연결이 실패하면 Base URL이 /v1로 끝나는지 확인하세요.
응답은 OpenAI 채팅 형식을 따릅니다: 메시지 목록인 choices, 토큰 수가 포함된 usage 블록, 그리고 생성이 중단된 이유를 알려주는 종료 사유가 포함됩니다. 잘린 답변은 보통 max_tokens이 낮음을 의미합니다. 비용 측면에서 입력 토큰 500개와 출력 토큰 300개로 이루어진 요청의 비용은 $0.000075 + $0.00015 = $0.000225입니다. 이 튜토리얼의 5개 요청 총 비용은 10분의 1센트 정도이므로 체험 크레딧은 거의 소모되지 않습니다.
4분: 시스템 프롬프트 및 설정 추가
기본 요청은 기본 어시스턴트 음성을 제공합니다. 채팅봇을 위해서는 캐릭터를 정의하는 시스템 메시지를 추가하고, 그에 맞는 샘플링 설정을 전달하세요.
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과top_p은 다양성을 제어합니다. 높은 값은 더 생동감 있고 예측하기 어려운 텍스트를 제공합니다.seed은 테스트를 더 쉽게 반복할 수 있게 합니다. 전달되므로 프롬프트 수정을 비교하는 데 사용하세요.max_tokens은 선택 사항입니다. 이 설정이 없으면 완성 텍스트는 100,000토큰 창의 남은 부분을 사용할 수 있습니다.- 잔액 헤더는 각 호출 후 남은 크레딧을 알려줍니다.
프롬프트가 핵심 제품입니다. 간결하고 구체적으로 작성하세요. 캐릭터의 정체, 말투, 스토리, 길이를 명시하세요. API는 호출 간에 아무것도 기억하지 않으므로 이 모든 내용을 시스템 메시지에 한 번에 넣고 모든 요청에서 다시 보내야 합니다.
5분: 스트리밍
스트리밍은 생성되는 텍스트를 출력합니다. 요청에서 한 단어 변경과 청크를 읽기 위한 루프만 추가하면 됩니다.
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()스트리밍 요청은 스트림이 끝날 때까지 동시 요청 슬롯 중 하나를 점유합니다. 체험 키의 경우 열린 스트림 2개만으로도 모든 슬롯이 사용되며, 세 번째 요청은 HTTP 429와 함께 코드 concurrency을 반환합니다. 기다렸다가 다시 시도하세요.
스트림 이후 사용량을 확인하려면 마지막 청크에 usage 블록이 포함됩니다.
계획에 따라 샘플링 값 선택
샘플링 설정은 대부분의 사람들이 예상하는 것보다 봇의 느낌을 더 크게 바꿉니다. 아래 값을 시작점으로 사용하고 한 번에 하나씩 변경하세요.
| 목표 | 설정 | 이유 |
|---|---|---|
| 생동감 있는 스토리텔링 | temperature 0.9~1.0, top_p 0.95 | 실행 간 더 많은 다양성 |
| 일관된 캐릭터 | temperature 0.6~0.7 | 예상치 못한 결과 감소 |
| 반복 가능한 테스트 | seed 고정, temperature 0 | 동일한 프롬프트는 동일한 유형의 답변을 생성합니다. |
| 반복 감소 | 빈도 또는 존재 페널티 약 0.3 | 루프 방지 |
| 표시로 응답 잘라내기 | 문자열이 포함된 stop | 출력이 나타나면 출력 종료 |
temperature과 top_p는 다양성을 조절하고 패널티는 모델에 전달됩니다. 하나의 값을 변경한 후 동일한 프롬프트를 다섯 번 실행하고, 다음 값을 변경하기 전에 다섯 가지 답변을 읽어보세요.
대화로 전환하기
API는 기록을 유지하지 않습니다. Rook이 기억하도록 하려면 목록을 유지하고 모든 턴 후에 양쪽을 모두 추가하세요.
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?"))두 번째 질문은 첫 번째 교환이 목록에 있기 때문에만 작동합니다. 이것이 채팅 비용이 길이에 따라 증가하는 이유이기도 합니다: 각 턴마다 모든 것이 다시 전송됩니다. 비용 및 트레이드오프 분석이 효과를 자세히 설명하며, 가격 페이지에서는 토큰 1M당 $0.15 및 $0.50의 요금을 보여줍니다.
목록이 길어질 때 두 가지 주의사항이 있습니다. 첫 번째는 비용입니다. 긴 대화 내역은 모든 턴의 가격을 높입니다. 두 번째는 창입니다. 프롬프트와 응답에 100,000개의 토큰을 할당하는 것은 넉넉하지만, 수주 동안 이어지는 역할극은 이 한도에 도달할 수 있습니다. 목록이 길어지면 시스템 메시지를 유지한 채 가장 오래된 턴들을 삭제하거나, 짧은 요약으로 대체하세요.
일반적인 문제 및 다음 단계
| 문제 | 잠재적 원인 | 해결 방법 |
|---|---|---|
| 인증 오류 | 잘못되었거나 빈 키 | 변수 길이를 출력하고 공백 제거 |
| 찾을 수 없음 | Base URL에 /v1 누락 | 이 페이지의 정확한 Base URL 사용 |
429 rate_limited | 분당 60개 이상의 요청 (체험) | 속도를 줄이거나 전체 키 사용 (분당 300개) |
429 및 Retry-After: 5 | 일시적 과부하 | 5초 대기 후 재시도 |
| 이상하거나 평평한 응답 | 약한 시스템 프롬프트 | 말투, 설정, 길이 제한 추가 |
실패하거나 거부된 요청에는 요금이 부과되지 않습니다. 다음 단계로 API 문서를 읽고 도구 및 JSON 모드에 대해 알아보세요. 이 모델은 텍스트 전용이므로 이미지, 오디오 또는 임베딩이 없습니다. 충전은 암호화폐(USDT on TRC20 또는 USDC on Base)로 $20부터 $500까지 가능하며 크레딧은 만료되지 않습니다. 귀하가 구축하는 모든 것에 대한 성인 전용 접근 및 모더레이션에 대해 책임을 집니다.
테이블에 없는 문제가 있는 경우, 요청을 가장 작은 작동 사례로 줄이세요: 사용자 메시지 하나, 시스템 프롬프트 없음, 추가 매개변수 없음. 그런 다음 고장 날 때까지 조각을 다시 추가하세요. 첫 통합의 거의 모든 문제는 URL의 오타, 뒤에 공백이 있는 키 복사 또는 잘못된 모양의 messages 목록에서 비롯됩니다.
코드에서 오류 처리
한 번 작동하는 스크립트는 봇이 아닙니다. API가 대기하라고 지시하는 경우에 대해 재시도를 추가하세요.
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")SDK는 HTTP 429에서 RateLimitError을 발생시킵니다. 일시적인 과부하 시 API는 Retry-After: 5을 보내므로 5초 기다리는 것이 올바른 첫 단계입니다. 반복되는 concurrency 오류의 경우 더 빠르게 재시도하기보다 클라이언트 측에서 요청을 큐에 넣으세요.
더 많은 가이드
자주 묻는 질문
무검열 채팅봇 API는 OpenAI API와 동일한가요?
프로토콜은 동일하므로 OpenAI SDK가 작동합니다. 모델은 다릅니다: 독립적인 제공업체의 오픈 웨이트 모델로, 합법적인 성인 사용에 대한 콘텐츠 거부 없이 답변하도록 조정되었습니다.
어떤 Base URL과 모델을 사용해야 하나요?
Base URL https://api.chatbotunfiltered.com/v1 및 모델 ID uncensored.
시도하려면 비용을 지불해야 하나요?
아니요. $0.50 체험 크레딧에는 결제 정보가 필요하지 않습니다. 유료 충전은 암호화폐로만 가능합니다.
응답을 스트리밍할 수 있나요?
네. stream을 true로 설정하세요. 스트리밍 요청은 스트림이 끝날 때까지 동시 요청 슬롯을 점유합니다.
잔액을 어떻게 확인하나요?
모든 응답에서 X-Balance-USD 헤더를 읽거나 GET /v1/balance를 호출하세요.
API 키를 즉시 얻으세요
등록하고, 키를 복사한 후 Base URL을 업데이트하세요. 설정이 완료되었습니다.