Contoh API DeepSeek Python: Chat, Streaming, Alat
Pengaturan API Python DeepSeek hanya memerlukan paket openai resmi, URL dasar, kunci, dan ID model. Contoh di bawah ini mencakup permintaan biasa, streaming, mode JSON, pemanggilan fungsi, dan percobaan ulang, semuanya terhadap endpoint yang kompatibel dengan OpenAI.

Poin utama
- Instal openai, lalu atur base_url ke https://api.deepseekapi.top/v1 dan model ke uncensored.
- Streaming, mode JSON dan pemanggilan alat bekerja melalui parameter SDK normal.
- Tangani HTTP 429 dengan membaca Retry-After dan mencoba lagi.
- Harga adalah $0,15 per 1 juta token input dan $0,50 per 1 juta token output.
Instal dan kirim permintaan pertama
Layanan ini bukan API resmi DeepSeek. Ini adalah endpoint yang kompatibel dengan OpenAI yang menjalankan satu model open-weight, ID uncensored, dioperasikan oleh penyedia independen. Karena mengikuti format OpenAI, SDK Python standar berfungsi tanpa perubahan selain URL dan kunci.
pip install openai
Dapatkan kunci dari halaman kunci API. Setelah mendaftar, Anda dapat mengklaim $0,50 kredit uji coba gratis dengan satu klik, tanpa kartu, berlaku selama 7 hari. Simpan kunci dalam variabel lingkungan, bukan dalam file sumber:
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)
Dua angka penggunaan adalah dasar penagihan Anda. Kalikan angka tersebut dengan harga untuk melihat biaya setiap permintaan: token input dikali $0,15 dan token output dikali $0,50, masing-masing dibagi 1.000.000.
Menggunakan klien asinkron
Untuk server web dan aplikasi yang menangani banyak pengguna, gunakan klien asinkron. Klien ini memiliki parameter yang sama dengan klien sinkron dan merupakan penggantian langsung dalam sebagian besar kode.
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())
Semaphore diatur ke 8 karena itu adalah concurrency kunci penuh. Pada kunci uji coba gunakan 2. Tanpa batas, lonjakan tugas akan menghasilkan error concurrency meskipun setiap permintaan valid.
Respons streaming
Atur stream=True dan endpoint mengirim event yang dikirim server. Setiap bagian membawa potongan kecil teks di delta.content. Meminta penggunaan berarti bagian terakhir melaporkan jumlah token.
# 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)
Dua hal sering membuat bingung. Potongan penggunaan terakhir dapat memiliki daftar choices kosong, itulah sebabnya loop memeriksa chunk.choices terlebih dahulu. Dan permintaan streaming mempertahankan slot konkurensinya hingga aliran berakhir, jadi keluar dari loop dengan bersih dan tutup aliran yang Anda abaikan. Kunci penuh mengizinkan 8 permintaan paralel; kunci uji coba mengizinkan 2.
Mode JSON
Untuk output yang akan diparsing program, gunakan response_format dengan json_object. Sertakan juga kata JSON dalam prompt dan jelaskan bentuk yang Anda inginkan. Model membutuhkan instruksi itu; flag saja tidak menyediakan skema.
# 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"])
Bungkus try/except di sekitar json.loads. Jika balasan terpotong oleh batas token, itu tidak akan diproses, jadi hindari max_tokens kecil dengan JSON. Mengatur temperature ke 0 dan seed membuat eksekusi ulang lebih konsisten, karena keduanya diteruskan.
Pemanggilan alat
API menerima tools dan tool_choice, dan mengembalikan tool_calls pada pesan asisten. Anda menjalankan fungsi sendiri dan mengirim hasilnya kembali sebagai pesan dengan role: "tool".
# 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)
Selalu uraikan arguments secara defensif. Itu adalah string JSON yang dihasilkan oleh model, dan string yang rusak dimungkinkan. Validasi sebelum Anda bertindak berdasarkan itu, terutama jika fungsi menyentuh file atau basis data.
Error, batas dan percobaan ulang
Permintaan yang melebihi batas mengembalikan HTTP 429. Kode kesalahan memberi tahu Anda batas mana: rate_limited untuk permintaan per menit (300 pada kunci penuh, 60 pada kunci uji coba) dan concurrency untuk terlalu banyak sekaligus. Saat kelebihan beban sementara Anda juga mendapatkan 429 dengan Retry-After: 5. SDK melemparkan openai.RateLimitError.
# 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."))
Jika Anda mengirim banyak permintaan, batasi paralelisme Anda sendiri dengan semaphore atau kumpulan utas dengan 8 pekerja, atau 2 pada kunci uji coba. Itu menghindari kesalahan concurrency daripada mencoba ulang melalui kesalahan tersebut.
Membaca header
Setiap respons membawa X-Request-Id, X-Balance-USD, X-RateLimit-Limit-Requests dan X-RateLimit-Limit-Concurrency. SDK mengeksposnya melalui respons mentah:
# 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()
Mencatat ID permintaan dengan setiap kegagalan membuat pertanyaan dukungan jauh lebih mudah dijawab. Permintaan yang gagal atau ditolak tidak dikenakan biaya.
Melanjutkan percakapan
API bersifat stateless. Ini tidak mengingat permintaan sebelumnya, sehingga chat multi-turn berarti Anda mengirim seluruh riwayat setiap kali. Simpan daftar dan tambahkan ke dalamnya:
# 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."))
Setiap langkah mengirim ulang semuanya, sehingga token input tumbuh per langkah. Potong pesan lama saat daftar menjadi panjang, atau minta model untuk meringkas bagian awal dan menggantinya. Dengan jendela 100.000 token, Anda memiliki banyak ruang, tetapi tagihan tumbuh seiring riwayat, sehingga daftar yang dipotong lebih murah.
Memilih nilai sampling
Gunakan temperature 0 hingga 0,3 untuk kode dan ekstraksi, sekitar 0,7 untuk chat umum, dan lebih tinggi untuk fiksi. top_p, stop, seed dan penalti frekuensi dan kehadiran diteruskan, sehingga mereka berperilaku seperti yang dijelaskan dokumentasi OpenAI. Ubah satu per satu dan bandingkan.
Perencanaan biaya dan konteks
Jendela konteks adalah 100.000 token, prompt ditambah completion, dan batas body request adalah 8 MB. Completion dapat menggunakan apa pun yang tersisa dari jendela, dan max_tokens adalah opsional. Mengatur itu masih praktik yang baik untuk pekerjaan batch.
Contoh yang dikerjakan: batch 1.000 ringkasan, masing-masing dengan 1.500 token input dan 200 token output.
- Input: 1.000 × 1.500 = 1.500.000 token, yang merupakan 1,5 × $0,15 = $0,225
- Output: 1.000 × 200 = 200.000 token, yang merupakan 0,2 × $0,50 = $0,10
- Total: $0,325
Harga adalah bayar sesuai penggunaan dari saldo prabayar, tanpa langganan, dan saldo tidak pernah kedaluwarsa. Pengisian ulang berjalan dari $20 hingga $500 dalam jumlah utuh, dengan +5% dari $50, +10% dari $100 dan +15% dari $200, dapat dibayar dengan kartu atau kripto. Lihat halaman harga, dan dokumen panduan awal untuk contoh curl dan Node. Jika Anda hanya perlu menemukan kunci Anda, ikhtisar kunci API membahasnya.
Prompt tidak digunakan untuk pelatihan. Layanan ini hanya teks: tidak ada gambar, audio, embedding atau penyetelan halus, jadi jangan merencanakan di sekitar endpoint itu.
Panduan lainnya
Tanya jawab
Apakah Anda perlu pustaka DeepSeek khusus?
Tidak. Instal paket openai, atur base_url ke https://api.deepseekapi.top/v1 dan gunakan ID model uncensored. Ini bukan API resmi DeepSeek.
Apakah SDK Python mendukung streaming di sini?
Ya. Teruskan stream=True, dan tambahkan stream_options dengan include_usage untuk mendapatkan hitungan token di potongan terakhir.
Bagaimana cara menangani error 429?
Tangkap openai.RateLimitError, baca header Retry-After dan tunggu sebelum mencoba lagi. Kode error memberi tahu apakah itu rate_limited atau concurrency.
Bisakah saya menguji tanpa membayar?
Ya. Setelah mendaftar, satu klik di halaman kunci API menambahkan $0,50 kredit uji coba gratis, berlaku selama 7 hari, tanpa memerlukan kartu.
Kunci Anda hanya selangkah lagi dari satu formulir
Buat akun, salin kunci, ubah URL dasar. Itu saja seluruh proses pengaturannya.