TR ▾
https://api.unrestrictedaiapi.com/v1uncensored2026-10-06
API anahtarı al

Unrestricted AI API hızlı başlangıç: Python, JavaScript, Go, PHP ve Ruby

Unrestricted AI API'i kullanmak için bir SDK'ya ihtiyacınız yoktur. Sadece HTTP ve JSON kullanır, bu nedenle HTTP istemcisi olan herhangi bir dilde çalışır. Bu sayfa Python, JavaScript, Go, PHP ve Ruby için birer test edilmiş istek ve betiklerin çökmesini önleyen yeniden deneme kuralı ile elemeniz gereken durum kodlarını içerir.

Güncellendi

Temel noktalar

  1. Tek bir uç nokta, tek bir model kimliği (sansürsüz), tek bir taşıyıcı jetonu: aynı istek gövdesi her dilde çalışır.
  2. Açık zaman aşımı değerleri belirleyin. Uzun üretimler çoğu varsayılan istemci zaman aşımını aşar.
  3. Ayrıştırmadan önce durum kodunu kontrol edin; 402 ve 403 yanıt gövdeleri, choices dizisi içermeyen geçerli JSON'dur.
  4. Yalnızca 429 ve 503 hatalarını kısa üstel geri çekilme ile yeniden deneyin.

Tek bir curl'da tüm API

SDK'yı bir anlığına unutun. Aşağıdaki her örnek aynı şeyi gönderir: POST /v1/chat/completions uç noktasına bir JSON gövdesi ve bir taşıyıcı jetonu ile. Bunu gönderebiliyorsanız işiniz biter. kayıt sayfasından bir anahtar alın (deneme kredisi için ödeme bilgisi gerekmez), onu API_KEY olarak dışa aktarın ve bunu çalıştırın.

curl https://api.unrestrictedaiapi.com/v1/chat/completions \
  -H "Authorization: Bearer $API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "uncensored",
    "messages": [{"role": "user", "content": "Write a two-line noir opening set in a laundromat."}],
    "max_tokens": 120
  }'

Yanıt bir OpenAI tarzı nesnedir. Metin choices[0].message.content adresinde bulunur ve bir usage bloğu çağrının token cinsinden maliyetini söyler. Tek bir model, uncensored vardır, bu nedenle model alanı hiç değişmez. Bunu GET /v1/models ile doğrulayabilirsiniz.

curl https://api.unrestrictedaiapi.com/v1/models -H "Authorization: Bearer $API_KEY"

Kod yazmadan önce ezberlemeniz gereken iki sınır vardır: bağlam penceresi istem ve tamamlama arasında paylaşılan 100.000 tokenlik bir sınıra sahiptir ve max_tokens varsayılan olarak 2048'dir, siz artırmadıkça (32.000'e kadar). Çıktınız cümlenin ortasında sürekli kesiliyorsa, bu varsayılan değer genellikle sorunun kaynağıdır.

Python ile httpx

httpx size makul zaman aşımı süreleri olan eşzamanlı bir istemci ve gerektiğinde bir eşzamansız ikiz sunar. Zaman aşımını açıkça ayarlayın. Uzun metin üretimi biraz zaman alabilir ve beş saniyelik varsayılan değer bunları keser.

import os
import httpx

resp = httpx.post(
    "https://api.unrestrictedaiapi.com/v1/chat/completions",
    headers={"Authorization": f"Bearer {os.environ['API_KEY']}"},
    json={
        "model": "uncensored",
        "messages": [
            {"role": "system", "content": "You are a blunt, vivid fiction writer."},
            {"role": "user", "content": "Pitch a heist where the vault is a night market."},
        ],
        "temperature": 0.9,
        "max_tokens": 300,
    },
    timeout=60.0,
)
resp.raise_for_status()
print(resp.json()["choices"][0]["message"]["content"])

raise_for_status(), 4xx veya 5xx hatalarını bir istisnaya dönüştürür; bu bir betik için uygundur. Uzun süren işler için çağrıyı sarmalayın, böylece iki durum başka bir şans elde eder: 429 (dakikada 300 isteklik anahtar başı limite ulaştınız) ve 503 (upstream_busy, birkaç saniye içinde düzelir). 401, 402 ve 403 dahil diğer tüm hatalar yeniden deneme ile kendiliğinden düzelmez.

import os
import time
import httpx

def chat(messages, retries=3):
    for attempt in range(retries + 1):
        r = httpx.post(
            "https://api.unrestrictedaiapi.com/v1/chat/completions",
            headers={"Authorization": f"Bearer {os.environ['API_KEY']}"},
            json={"model": "uncensored", "messages": messages, "max_tokens": 400},
            timeout=60.0,
        )
        if r.status_code in (429, 503) and attempt < retries:
            time.sleep(2 ** attempt)
            continue
        r.raise_for_status()
        return r.json()["choices"][0]["message"]["content"]

print(chat([{"role": "user", "content": "Name five cursed objects found in a thrift store."}]))

httpx.post'i bir async def içindeki httpx.AsyncClient().post ile değiştirin ve aynı yük ile asenkron sürüme sahip olursunuz.

JavaScript ile fetch

Node 18 ve üzeri fetch ile gelir, bu nedenle kurulum yapmanıza gerek yoktur. Dosyayı .mjs olarak kaydedin (veya "type": "module" ayarını yapın) böylece üst düzey await çalışsın. Tarayıcılar aynı API'ye sahiptir, ancak anahtarı ön uç kodunda kullanmayın. Çağrıyı kendi arka ucunuz üzerinden proxy'leyin.

const res = await fetch("https://api.unrestrictedaiapi.com/v1/chat/completions", {
  method: "POST",
  headers: {
    Authorization: `Bearer ${process.env.API_KEY}`,
    "Content-Type": "application/json",
  },
  body: JSON.stringify({
    model: "uncensored",
    messages: [{ role: "user", content: "Describe a villain's morning routine in four bullets." }],
    max_tokens: 250,
  }),
});

if (!res.ok) {
  const err = await res.json().catch(() => ({}));
  throw new Error(`HTTP ${res.status}: ${err?.error?.message ?? "unknown error"}`);
}

const data = await res.json();
console.log(data.choices[0].message.content);

Kontrol sırasına dikkat edin. fetch yalnızca ağ hatasında reddeder, bu nedenle 402 veya 403 normal bir yanıt olarak gelir. res.ok'i kendiniz test edin ve hata JSON'unu okuyun; bu her zaman {"error":{"code":...,"message":...}} yapısına sahiptir.

Go ile net/http

Go birkaç satır daha gerektirir ancak bağımlılık gerektirmez. Yalnızca okuduğunuz struct alanlarını tanımlayın; encoding/json geri kalanını yok sayar. Bir şeyler ters gittiğinde sunucunun hata mesajını yazdırabilmek için gövdeyi durum kodunu kontrol etmeden önce baytlara okuyun.

package main

import (
	"bytes"
	"encoding/json"
	"fmt"
	"io"
	"net/http"
	"os"
)

type reply struct {
	Choices []struct {
		Message struct {
			Content string `json:"content"`
		} `json:"message"`
	} `json:"choices"`
}

func main() {
	payload, _ := json.Marshal(map[string]any{
		"model": "uncensored",
		"messages": []map[string]string{
			{"role": "user", "content": "Give me a ghost story in exactly three sentences."},
		},
		"max_tokens": 200,
	})

	req, _ := http.NewRequest("POST", "https://api.unrestrictedaiapi.com/v1/chat/completions", bytes.NewReader(payload))
	req.Header.Set("Authorization", "Bearer "+os.Getenv("API_KEY"))
	req.Header.Set("Content-Type", "application/json")

	resp, err := http.DefaultClient.Do(req)
	if err != nil {
		panic(err)
	}
	defer resp.Body.Close()

	body, _ := io.ReadAll(resp.Body)
	if resp.StatusCode != http.StatusOK {
		panic(fmt.Sprintf("HTTP %d: %s", resp.StatusCode, body))
	}

	var out reply
	if err := json.Unmarshal(body, &out); err != nil {
		panic(err)
	}
	fmt.Println(out.Choices[0].Message.Content)
}

Canlı ortam için http.Client{Timeout: 60 * time.Second} oluşturun ve bunu yeniden kullanın. Varsayılan istemcinin hiç zaman aşımı yoktur; bu da sıkışan bir isteğin sıkışan bir goroutine'ye dönüşmesinin nedenidir.

PHP ile cURL ve Ruby ile Net::HTTP

PHP'nin cURL uzantısı çoğu barındırma servislerinde zaten mevcuttur. Gövdeyi json_encode ile oluşturun, transferi bir dize olarak döndürün, ardından durumu curl_getinfo ile okuyun. Durum kontrolünü atlamak klasik bir hatadır: 402 yanıt gövdesi JSON olarak sorunsuz çözünür ve kodunuz daha sonra eksik choices anahtarında başarısız olur.

<?php
$payload = json_encode([
    "model" => "uncensored",
    "messages" => [
        ["role" => "user", "content" => "Write a villanelle opening about a broken vending machine."],
    ],
    "max_tokens" => 200,
]);

$ch = curl_init("https://api.unrestrictedaiapi.com/v1/chat/completions");
curl_setopt_array($ch, [
    CURLOPT_POST => true,
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_TIMEOUT => 60,
    CURLOPT_HTTPHEADER => [
        "Authorization: Bearer " . getenv("API_KEY"),
        "Content-Type: application/json",
    ],
    CURLOPT_POSTFIELDS => $payload,
]);

$body = curl_exec($ch);
$status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);

if ($body === false || $status !== 200) {
    fwrite(STDERR, "HTTP $status: $body\n");
    exit(1);
}

$data = json_decode($body, true);
echo $data["choices"][0]["message"]["content"], "\n";

Düşük bir max_execution_time olan paylaşımlı bir sunucuda, max_tokens'i makul tutun veya çağrıyı bir kuyruk işçisine taşıyın.

Burada da standart kütüphane yeterlidir. ENV.fetch değişken eksikse hemen hata fırlatır; bu, boş bir taşıyıcı jetonu gönderip on dakika boyunca 401 hatasını halletmekten daha iyidir.

require "net/http"
require "json"
require "uri"

uri = URI("https://api.unrestrictedaiapi.com/v1/chat/completions")
req = Net::HTTP::Post.new(uri)
req["Authorization"] = "Bearer #{ENV.fetch('API_KEY')}"
req["Content-Type"] = "application/json"
req.body = JSON.generate(
  model: "uncensored",
  messages: [{ role: "user", content: "Invent a tavern rumor that sounds too specific to be fake." }],
  max_tokens: 200
)

res = Net::HTTP.start(uri.host, uri.port, use_ssl: true, read_timeout: 60) { |http| http.request(req) }
abort("HTTP #{res.code}: #{res.body}") unless res.is_a?(Net::HTTPSuccess)

puts JSON.parse(res.body).dig("choices", 0, "message", "content")

Daha sonra Rails'e geçerseniz, aynı gövde bir arka plan işinden de çalışır. Çağrıyı istek döngüsünün dışında tutun; metin üretimi bir veritabanı sorgusundan daha yavaştır.

Her iki kod parçası da Python'dakine tam olarak aynı gövdeyi gönderir; asıl nokta budur: Bir dil çalışırken diğeri çalışmazsa, istemciyi değil JSON'u karşılaştırın. Ham istek gövdesini bir kez yazdırın ve bayt bayt karşılaştırın. Dokuz kere on kere sorun, eksik bir İçerik-Türü üst bilgisi veya büyük harfle yazılmış bir model adından kaynaklanır.

Kütüphane olmadan streaming

Akış, düz HTTP'nin sizden biraz daha fazla şey istediği tek yerdir. stream: true ile sunucu Sunucu Gönderimli Olaylar ile yanıt verir: her satır data: ile başlar, bir JSON parçası taşır ve akış data: [DONE] ile sona erer. Otomatik olarak eklenen son kullanım parçası sayesinde, akış sırasında bile token sayılarına sahip olursunuz. Bu parçada choices girdileri bulunmaz; bu nedenle aşağıdaki döngü indekslemeden önce kontrol eder.

import json
import os
import httpx

body = {
    "model": "uncensored",
    "messages": [{"role": "user", "content": "Tell a campfire story about a lighthouse keeper."}],
    "stream": True,
    "max_tokens": 400,
}
headers = {"Authorization": f"Bearer {os.environ['API_KEY']}"}

with httpx.stream("POST", "https://api.unrestrictedaiapi.com/v1/chat/completions",
                  headers=headers, json=body, timeout=60.0) as r:
    r.raise_for_status()
    for line in r.iter_lines():
        if not line.startswith("data: "):
            continue
        data = line[6:]
        if data == "[DONE]":
            break
        chunk = json.loads(data)
        if chunk.get("choices"):
            print(chunk["choices"][0]["delta"].get("content") or "", end="", flush=True)
print()

Aynı desen doğrudan taşınır. JavaScript'te, res.body'i bir okuyucu ile okuyun ve yeni satırlara göre bölün. Go'da, resp.Body'i bir bufio.Scanner ile sarın. Ruby'de, http.request'e bir blok verin ve read_body kullanın. PHP'de, bir CURLOPT_WRITEFUNCTION geri çağırma işlevi ayarlayın. Mantık hiç değişmez: ön eki kaldırın, sentinelde durun, JSON'u ayrıştırın, delta'yı yazdırın.

Beş dakikalık duman testi ve bütçe kontrolü

Bu snippet'lerden herhangi birinin üzerine inşa etmeden önce hızlı bir doğrulama yapın. İlk olarak, anahtarınızla /v1/models adresini çağırın; 200, anahtarın ve ağ yolunun doğru olduğunu kanıtlar. İkinci olarak, max_tokens'i 20 olarak ayarlayarak yapabileceğiniz en küçük sohbet isteğini gönderin. Üçüncü olarak, kasıtlı olarak bir şeyi bozun, örneğin boş bir bearer token ve kodunuzun eksik bir alan nedeniyle çökmeden 401'i açıkça sunduğunu onaylayın.

Ardından, sizi şaşırtmayacak şekilde aritmetiği bir kez yapın. Fiyatlar milyon girdi token başına $0.25 ve milyon çıktı token başına $1.00'dır. Görselleştirme için bir varsayım olarak, bir istek 600 prompt token gönderir ve 400 token alır diyelim. Bu, 600 x $0.25 / 1.000.000 = $0.00015 giriş, artı 400 x $1.00 / 1.000.000 = $0.0004 çıkış, çağrı başına yaklaşık $0.00055 demektir. $0.50'lik ücretsiz deneme kredisi bu boyuttaki yaklaşık 900 çağrıyı karşılayacaktır. Gerçek promptlarınız farklı olacaktır, bu nedenle birkaç yanıtta usage bloğunu okuyun ve oradan çarpın.

Ücretsiz deneme kredisi yedi gün sürer ve ödeme bilgisi gerektirmez, bu da beş dili de test etmek için fazlasıyla yeterlidir. Hedeflemek istediğiniz bir kullanım alanınız varsa, NSFW içerik kılavuzu tam bir örnek gösterir. Unutmayın ki bir anahtar bir hesaba aittir; onu yeniden oluşturursanız, eski anahtar hemen geçersiz olduğu için tüm betiklerinizi aynı anda güncelleyin.

Her dilde aynı görünen hatalar

API düz HTTP olduğu için, hata işleme seçtiğiniz dilden bağımsız olarak özdeştir. Bu tabloyu ezberleyin ve yukarıdaki herhangi bir snippet'i taşıyabilirsiniz.

DurumAnlamEylem
400Geçersiz istek, örneğin istem ve max_tokens toplamının 100k'ı aşmasıPrompt'u kısaltın veya max_tokens'i düşürün
401Eksik veya geçersiz anahtarAPI_KEY değerini kontrol edin; yenilenen anahtar, eskisini anında geçersiz kılar
402no_credit: bakiye yok veya deneme süresi dolduÖn ödemeli bakiyeyi yükleyin
403content_blockedYenileme yapmayın; reşit olmayanlarla ilgili cinsel içerik her zaman engellenir
429Dakikada 300'ün üzerinde istekGeri çekilin ve yeniden deneyin
503upstream_busyBirkaç saniye sonra yeniden deneyin

Temel işlevler çalıştıktan sonra, token bazlı çıktı için stream: true ayarını yapın ve sunucu tarafından gönderilen olayları satır satır okuyun. istem rehberi ile daha iyi istemler oluşturun veya bot rehberi ile aynı çağrıyı bir sohbet platformuna bağlayın. Fiyatlandırma fiyatlandırma sayfasında yer almaktadır.

Sorular ve cevaplar

Bu API'yi çağırmak için OpenAI SDK'sına ihtiyacım var mı?

Hayır. Bu örneklerde yalnızca her dilin standart HTTP araçları kullanılır. Base URL'yi https://api.unrestrictedaiapi.com/v1. adresine yönlendirirseniz OpenAI SDK'ları da çalışır.

Hangi model kimliğini göndermeliyim?

Her zaman "sansürsüz". Tek bir model vardır ve GET /v1/models bunu listeler.

Neden yanıtım bir cümlenin ortasında kesildi?

Varsayılan max_tokens değeri 2048'dir. İstek başına artırın, ancak istem ve tamamlama toplamı 100.000 tokenlık bağlam penceresi içinde kalmak kaydıyla 32.000'e kadar çıkarın.

Kodum hangi hataları yeniden denemeli?

Kısa bir gecikmeden sonra 429 (hız limiti) ve 503 (upstream_busy) hatalarını yeniden deneyin. 400, 401, 402 ve 403 hataları tarafınızda bir değişiklik gerektirir, bu nedenle bunları yeniden denemek çağrıları boşa harcar.

Anahtarınız tek bir formun uzağında

Bir hesap oluşturun, anahtarı kopyalayın ve base URL'yi değiştirin. Kurulum bu kadar basit.

API anahtarı al