TR ▾
API anahtarı al

DeepSeek API Python Örneği: Sohbet, Akış, Araçlar

Bir deepseek api python kurulumu için yalnızca resmi openai paketi, bir base URL, bir anahtar ve bir model kimliği gerekir. Aşağıdaki örnekler düz bir istek, akış, JSON modu, araç çağırma ve yeniden denemeleri kapsar; hepsi OpenAI uyumlu bir uç noktaya yöneliktir.

güncellendi

Bir sunucu bloğuna akan veri tokenlarını gösteren terminal slab akışı, Python API çağrılarını betimler

Temel noktalar

  • openai paketini kurun, base_url'yi https://api.deepseekapi.top/v1 olarak ayarlayın ve modeli uncensored olarak ayarlayın.
  • Akış, JSON modu ve araç çağırma normal SDK parametreleri üzerinden çalışır.
  • Retry-After'ı okuyarak HTTP 429 hatasını yönetin ve tekrar deneyin.
  • Fiyat 1M giriş tokenı başı $0,15 ve 1M çıktı tokenı başı $0,50'dir.

Kurulum ve ilk isteği gönderme

Bu hizmet resmi DeepSeek API'si değildir. Bağımsız bir sağlayıcı tarafından işletilen, ID'si uncensored olan açık ağırlıklı bir modeli çalıştıran, OpenAI uyumlu bir uç noktadır. OpenAI formatını takip ettiği için, URL ve anahtar dışında standart Python SDK'sı değişiklik yapmadan çalışır.

pip install openai

Bir anahtar edinin API anahtarı sayfasından. Kayıttan sonra, tek bir tıklamayla 7 gün geçerli, kart gerekmeden $0,50 deneme kredisi talep edebilirsiniz. Anahtarı kaynak dosyasında değil, bir ortam değişkeninde saklayın:

export API_KEY="YOUR_KEY"
import os
from openai import OpenAI

client = OpenAI(
    base_url="https://api.deepseekapi.top/v1",
    api_key=os.environ["API_KEY"],
)

resp = client.chat.completions.create(
    model="uncensored",
    messages=[
        {"role": "system", "content": "You are a concise assistant."},
        {"role": "user", "content": "Explain list comprehensions in two sentences."},
    ],
    temperature=0.7,
)

print(resp.choices[0].message.content)
print(resp.usage.prompt_tokens, resp.usage.completion_tokens)

Faturalandırma, iki kullanım sayısına dayanır. Her çağrının maliyetini görmek için bunları fiyatlarla çarpın: girdi tokenları × $0,15 ve çıktı tokenları × $0,50, her ikisi de 1.000.000'a bölünür.

Asenkron istemciyi kullanma

Web sunucuları ve çok sayıda kullanıcıyı işleyen her şey için asenkron istemciyi kullanın. Senkron olanla aynı parametrelere sahiptir ve çoğu kodda doğrudan değiştirilebilir bir değişikliktir.

import asyncio
import os
from openai import AsyncOpenAI

client = AsyncOpenAI(
    base_url="https://api.deepseekapi.top/v1",
    api_key=os.environ["API_KEY"],
)

sem = asyncio.Semaphore(8)

async def ask(prompt):
    async with sem:
        r = await client.chat.completions.create(
            model="uncensored",
            messages=[{"role": "user", "content": prompt}],
        )
        return r.choices[0].message.content

async def main():
    prompts = ["Define idempotent.", "Define monotonic.", "Define pure function."]
    answers = await asyncio.gather(*(ask(p) for p in prompts))
    for a in answers:
        print(a)

asyncio.run(main())

Semafor, tam bir anahtar için eşzamanlılık olan 8'e ayarlanmıştır. Bir deneme anahtarı için 2 kullanın. Bir üst sınır olmadan, bir görev patlaması her istek geçerli olsa bile concurrency hatalarına neden olur.

Akış yanıtları

stream=True ayarlayın ve uç nokta sunucu gönderilen olayları gönderir. Her parça, delta.content içinde küçük bir metin parçası taşır. Kullanım istemek, son parçanın token sayılarını bildirmesi anlamına gelir.

# client = OpenAI(base_url="https://api.deepseekapi.top/v1", ...) as above
stream = client.chat.completions.create(
    model="uncensored",
    messages=[{"role": "user", "content": "Write a haiku about debugging."}],
    stream=True,
    stream_options={"include_usage": True},
)

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

İki detay kafa karıştırıcı olabilir. Son kullanım parçasında boş bir choices listesi olabilir; bu nedenle döngü chunk.choices'i önce kontrol eder. Akışlı bir istek, akış bitene kadar eşzamanlılık yuvasını korur; bu nedenle döngülerden temiz bir şekilde çıkın ve terk ettiğiniz akışları kapatın. Tam anahtar 8 eşzamanlı isteğe; deneme anahtarı 2 eşzamanlı isteğe izin verir.

JSON modu

Bir programın ayrıştıracacağı çıktı için response_format ile json_object kullanın. Ayrıca istemde JSON kelimesini belirtin ve istediğiniz şekli tanımlayın. Modelin bu talimata ihtiyacı vardır; bayrak tek başına bir şema sağlamaz.

# client = OpenAI(base_url="https://api.deepseekapi.top/v1", ...) as above
import json

resp = client.chat.completions.create(
    model="uncensored",
    messages=[
        {"role": "system", "content": "Reply with JSON only: {\"title\": str, \"tags\": [str]}"},
        {"role": "user", "content": "Summarize: a guide to caching HTTP responses."},
    ],
    response_format={"type": "json_object"},
    temperature=0,
)

data = json.loads(resp.choices[0].message.content)
print(data["title"], data["tags"])

json.loads çağrısını try/except içine alın. Yanıt bir token limiti tarafından kesilirse ayrıştırılamaz, bu nedenle JSON ile küçük bir max_tokens kullanmaktan kaçının. temperature'i 0'a ve bir seed ayarlamak, her ikisi de geçirildiğinden yeniden çalıştırmaları daha tekrarlanabilir kılar.

Araç çağırma

API tools ve tool_choice kabul eder ve asistan mesajında tool_calls döndürür. Fonksiyonu kendiniz çalıştırın ve sonucu role: "tool" ile bir mesaj olarak gönderin.

# client = OpenAI(base_url="https://api.deepseekapi.top/v1", ...) as above
import json

tools = [{
    "type": "function",
    "function": {
        "name": "add",
        "description": "Add two numbers.",
        "parameters": {
            "type": "object",
            "properties": {"a": {"type": "number"}, "b": {"type": "number"}},
            "required": ["a", "b"],
        },
    },
}]

messages = [{"role": "user", "content": "What is 17.5 plus 24.25?"}]
first = client.chat.completions.create(
    model="uncensored", messages=messages, tools=tools, tool_choice="auto"
)

msg = first.choices[0].message
if msg.tool_calls:
    messages.append(msg)
    for call in msg.tool_calls:
        args = json.loads(call.function.arguments)
        result = args["a"] + args["b"]
        messages.append({
            "role": "tool",
            "tool_call_id": call.id,
            "content": str(result),
        })
    final = client.chat.completions.create(
        model="uncensored", messages=messages, tools=tools
    )
    print(final.choices[0].message.content)
else:
    print(msg.content)

Her zaman arguments'i savunmacı bir şekilde ayrıştırın. Model tarafından üretilen bir JSON dizesidir ve bozuk bir dize mümkündür. Üzerine eylem yapmadan önce doğrulayın, özellikle fonksiyon dosyalara veya bir veritabanına dokunuyorsa.

Hatalar, limitler ve yeniden denemeler

Bir limiti aşan bir istek HTTP 429 döndürür. Hata kodu hangi limiti aştığınızı söyler: dakikada istekler için rate_limited (tam anahtarda 300, deneme anahtarında 60) ve aynı anda çok fazla için concurrency. Geçici aşırı yük altında ayrıca Retry-After: 5 ile 429 alırsınız. SDK openai.RateLimitError fırlatır.

# client = OpenAI(base_url="https://api.deepseekapi.top/v1", ...) as above
import time
import openai

def ask(prompt, tries=4):
    for attempt in range(tries):
        try:
            r = client.chat.completions.create(
                model="uncensored",
                messages=[{"role": "user", "content": prompt}],
            )
            return r.choices[0].message.content
        except openai.RateLimitError as e:
            wait = int(e.response.headers.get("Retry-After", 5))
            time.sleep(wait * (attempt + 1))
    raise RuntimeError("still rate limited")

print(ask("Name three Python web frameworks."))

Çok sayıda istek gönderirseniz, semafor veya 8 worker'lı bir iş parçacığı havuzu ile kendi eşzamanlılığınızı sınırlayın, veya deneme anahtarı için 2. Bu, concurrency hatalarını yeniden denemeyle aşmaya çalışmak yerine baştan önler.

Başlıkları okuma

Her yanıt X-Request-Id, X-Balance-USD, X-RateLimit-Limit-Requests ve X-RateLimit-Limit-Concurrency taşır. SDK bunları ham yanıt üzerinden ortaya çıkarır:

# client = OpenAI(base_url="https://api.deepseekapi.top/v1", ...) as above
raw = client.chat.completions.with_raw_response.create(
    model="uncensored",
    messages=[{"role": "user", "content": "ping"}],
)
print(raw.headers.get("X-Balance-USD"), raw.headers.get("X-Request-Id"))
completion = raw.parse()

Her başarısızlıkla istek kimliğini günlüğe kaydetmek destek sorularını çok daha kolay yanıtlamayı sağlar. Başarısız veya reddedilen istekler için ücret alınmaz.

Bir konuşmayı sürdürme

API durum bilgisi taşımaz. Önceki istekleri hatırlamaz, bu yüzden çoklu tur bir sohbet her seferinde tüm geçmişi göndermek demektir. Bir liste tutun ve ona ekleyin:

# client = OpenAI(base_url="https://api.deepseekapi.top/v1", ...) as above
history = [{"role": "system", "content": "You are a helpful tutor."}]

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

print(chat("What is a closure?"))
print(chat("Show me one in Python."))

Her dönüş her şeyi yeniden gönderir, bu nedenle girdi tokenları dönüş başına büyür. Liste uzunlaştığında eski mesajları temizleyin veya modelden erken kısmı özetlemesini isteyin ve onu değiştirin. 100.000 tokenlık bir pencereniz varsa bolca alanınız vardır, ancak fatura geçmişle birlikte büyür, bu nedenle kırpılmış bir liste daha ucuzdur.

Örneklem değerleri seçme

Kod ve çıkarma için temperature 0 ile 0,3 arasında, genel sohbet için yaklaşık 0,7 ve kurgu için daha yüksek değerler kullanın. top_p, stop, seed ve frekans ve varlık cezaları geçirilir, bu nedenle OpenAI belgelerinin açıkladığı gibi davranırlar. Tek tek değiştirin ve karşılaştırın.

Maliyet ve bağlam planlama

Bağlam penceresi 100.000 token, istem ve tamamlama olmak üzere, istek gövdesi limiti ise 8 MB'dir. Tamamlama pencerenin kalanını kullanabilir ve max_tokens isteğe bağlıdır. Onu ayarlamak toplu işler için hala iyi bir uygulamadır.

Bir çalışma örneği: her biri 1.500 giriş tokenı ve 200 çıktı tokenı ile 1.000 özetlik bir toplu iş.

  • Girdi: 1.000 × 1.500 = 1.500.000 token, bu da 1,5 × $0,15 = $0,225
  • Çıktı: 1.000 × 200 = 200.000 token, bu da 0,2 × $0,50 = $0,10
  • Toplam: $0,325

Fiyatlandırma, ön ödemeli krediden kullandıkça öde şeklindedir, abonelik yoktur ve kredi asla sona ermez. Yüklemeler $20 ile $500 arasında tam miktarlarda yapılır, $50'den +5%, $100'den +10% ve $200'den +15% ile, kart veya kripto ile ödenir. fiyatlandırma sayfasına bakın ve curl ve Node örnekleri için hızlı başlangıç dokümanlarına bakın. Sadece anahtarınızı bulmanız gerekiyorsa, API anahtarı genel bakışı bunu kapsar.

İstemler eğitim için kullanılmaz. Hizmet yalnızca metindir: resim, ses, gömme veya ince ayar yok, bu yüzden bu uç noktalar etrafında plan yapmayın.

Sorular ve cevaplar

Özel bir DeepSeek kütüphanesine mi ihtiyacım var?

Hayır. openai paketini kurun, base_url'yi https://api.deepseekapi.top/v1 olarak ayarlayın ve uncensored model kimliğini kullanın. Bu resmi DeepSeek API'si değildir.

Python SDK burada akış desteği sağlıyor mu?

Evet. stream=True geçirin ve son parçada token sayıları almak için include_usage ile stream_options ekleyin.

429 hatasını nasıl yönetirim?

openai.RateLimitError'ı yakalayın, Retry-After başlığını okuyun ve yeniden denemeden önce bekleyin. Hata kodu bunun rate_limited mi yoksa concurrency mi olduğunu söyler.

Ödeme yapmadan test edebilir miyim?

Evet. Kayıttan sonra, API anahtarı sayfasındaki tek bir tıklama 7 gün geçerli, kart gerekmeden $0,50 deneme kredisi ekler.

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