PL ▾
Pobierz klucz API

DeepSeek API SDK: Użyj SDK OpenAI i zamieniaj endpointy

Nie musisz instalować specjalnego klienta do konfiguracji DeepSeek API SDK: API w stylu DeepSeek są zgodne z formatem OpenAI, więc SDK OpenAI działa z innym base URL. Ta sama cecha pozwala na zmianę endpointu poprzez zmianę trzech wartości.

Zaktualizowano

Jeden blok łączący kilka wież serwerowych, ilustrujący zamianę endpointów jednym SDK

Kluczowe punkty

  • SDK Pythona i Node.js OpenAI działają z dowolnym endpointem zgodnym z OpenAI; zmieniasz Base URL, klucz i nazwę modelu.
  • Przechowuj te trzy wartości w zmiennych środowiskowych, aby zmiana endpointu nie wymagała edycji kodu.
  • Zamiana jest bezpieczna dla prostego czatu, strumieniowania i wywołań narzędzi, ale przetestuj funkcje specyficzne dla modelu przed ich wykorzystaniem.
  • Dla tego endpointu użyj https://api.deepseekapi.top/v1 i identyfikatora modelu uncensored.

Dlaczego SDK OpenAI jest SDK DeepSeek API

Gdy użytkownicy szukają SDK DeepSeek API, oczekują pakietu z nazwą dostawcy. W praktyce dokumentacja DeepSeek opisuje wywoływanie API za pomocą SDK OpenAI z innym base URL, ponieważ API jest zgodne z formatem żądań i odpowiedzi OpenAI. Sprawdź ich aktualną dokumentację, aby uzyskać dokładny base URL i nazwy modeli; są oni autorytetem w sprawie swojej usługi.

Konsekwencją jest użyteczność. Każdy kod napisany dla biblioteki klienta OpenAI może komunikować się z dowolnym serwerem implementującym te same endpointy, czyli POST /v1/chat/completions, POST /v1/responses i GET /v1/models. Przejście między dostawcami staje się zmianą konfiguracji, a nie przepisywaniem kodu. W dalszej części artykułu pokazujemy ten wzorzec w Pythonie, Node i curl, a następnie strukturę, która ułatwia zamianę.

Konfiguracja Pythona

Zainstaluj oficjalny pakiet i wskaż go na endpoint:

pip install openai
from openai import OpenAI

client = OpenAI(
    base_url="https://api.deepseekapi.top/v1",
    api_key="YOUR_KEY",
)

resp = client.chat.completions.create(
    model="uncensored",
    messages=[
        {"role": "system", "content": "You are a concise technical assistant."},
        {"role": "user", "content": "Explain idempotency in two sentences."},
    ],
)
print(resp.choices[0].message.content)
print(resp.usage)

Pobierz klucz na stronie kluczy API. Nowi użytkownicy mogą jednorazowo odebrać $0,50 kredytu próbnego bez karty. Artykuł DeepSeek API Python omawia ten język głębiej, w tym obsługę błędów.

Konfiguracja Node.js

npm install openai
import OpenAI from "openai";

const client = new OpenAI({
  baseURL: "https://api.deepseekapi.top/v1",
  apiKey: process.env.API_KEY,
});

const stream = await client.chat.completions.create({
  model: "uncensored",
  stream: true,
  messages: [{ role: "user", content: "List four uses of a message queue." }],
});

for await (const chunk of stream) {
  process.stdout.write(chunk.choices[0]?.delta?.content ?? "");
}

Wzorzec jest identyczny: podstawowy URL, klucz, model. Strumieniowanie zwraca zdarzenia wysyłane przez serwer (SSE), a biblioteka przekształca je w iterator asynchroniczny. Wywoływanie narzędzi opiera się na tym samym schemacie co w innych API kompatybilnych z OpenAI: przekaż tools, odczytaj strumieniowane tool_calls i zwróć wyniki jako komunikaty role: "tool".

Uczyń endpoint wymiennym

Nie koduj na sztywno trzech wartości. Odczytuj je ze zmiennych środowiskowych i opakuj tworzenie klienta w jedną funkcję. Dzięki temu przejście z jednego endpointu na inny oznacza edycję pliku .env, a nie kodu źródłowego.

import os
from openai import OpenAI

def make_client():
    return OpenAI(
        base_url=os.environ.get("LLM_BASE_URL", "https://api.deepseekapi.top/v1"),
        api_key=os.environ["LLM_API_KEY"],
    )

MODEL = os.environ.get("LLM_MODEL", "uncensored")

def ask(prompt: str) -> str:
    r = make_client().chat.completions.create(
        model=MODEL,
        messages=[{"role": "user", "content": prompt}],
        temperature=0.7,
    )
    return r.choices[0].message.content

Teraz inny dostawca wymaga tylko trzech zmiennych środowiskowych. Oficjalne SDK odczytują również OPENAI_API_BASE i OPENAI_API_KEY w niektórych wersjach, ale jawne zmienne są bardziej przejrzyste i zapobiegają niespodziankom przy uruchamianiu wielu dostawców jednocześnie.

Jeśli używasz TypeScripta lub innego języka, zasada jest taka sama: jedna funkcja fabryczna, trzy zmienne, bez nazw dostawców rozrzuconych po kodzie. Typowym błędem jest pozwalanie na wyciekanie nazwy dostawcy do nazw funkcji, komunikatów logowania i zmiennych, co utrudnia późniejszą zamianę. Nazwij rzeczy zgodnie z ich przeznaczeniem (ask, summarise), a nie według dostawcy.

Zachowaj mały test wysyłający jeden stały prompt przez ask() i sprawdzający, czy odpowiedź nie jest pusta. Uruchamiaj go po każdej zmianie endpointu; wyłapie błędne URL i klucze w kilka sekund.

Co pozostaje bez zmian, a co się zmienia przy zamianie

PozycjaPozostaje bez zmianMoże się zmienić
Kształt zapytaniakomunikaty, role, temperatura, top_p, stopParametry opcjonalne, których dostawca nie obsługuje
StrumieniowanieSSE z porcjami danychMiejsce, w którym pojawia się zużycie w strumieniu
Wywoływanie narzędzitools, tool_choice, tool_callsDokładność przestrzegania schematu przez model
Nazwa modeluPole wymaganeWartość sama w sobie: tutaj jest uncensored
Okno kontekstuPrompt plus uzupełnienieRozmiar: 100 000 tokenów tutaj
ZachowanieFormat czatuStyl, mocne strony, zachowanie przy odmowie

Ostatni wiersz to ten, który często myli użytkowników. Endpoint jest kompatybilny na poziomie protokołu, a nie zachowania. Dwa dostawcy mogą przyjąć identyczne żądania i zwrócić bardzo różne odpowiedzi. Model to pojedynczy model o otwartych wagach od niezależnego dostawcy, dostrojony do odpowiadania bez odmów treści dla użytkowników pełnoletnich, i nie jest to oficjalne API DeepSeek ani żadnej innej firmy. Przetestuj ponownie prompty, które dostosowałeś do innego modelu.

Funkcje, które ten endpoint ma i których nie ma

  • Wsparcie: uzupełnienia czatu, format Responses, listowanie modeli, strumieniowanie, wywoływanie funkcji, tryb JSON (response_format z json_object) oraz przekazywanie temperatury, top_p, stop, seed i kar.
  • Nie oferowane: generowanie obrazów, audio lub wideo, embeddingi, dostrajanie.
  • Limity: okno 100 000 tokenów, maksymalne ciało 8 MB, 8 równoległych zapytań i 300 na minutę przy pełnym kluczu (2 i 60 przy kluczu próbnym).
  • Błędy: HTTP 429 z kodem rate_limited lub concurrency oraz nagłówek Retry-After: 5 przy tymczasowym przeciążeniu.

Jeśli Twój kod wywołuje endpoint embeddingów, będziesz potrzebował innego dostawcy do tej części i możesz zachować czat tutaj. Podział według zadań jest częstym powodem stosowania powyższego wzorca z zmiennymi środowiskowymi.

Lista kontrolna migracji

Gdy zamieniasz jeden endpoint na inny w istniejącym projekcie, przejdź przez krótką listę, a nie zmieniaj wszystkiego naraz.

  1. Przetestuj endpoint. Wyślij jedno zapytanie za pomocą curl i upewnij się, że otrzymasz tekst. Wywołaj GET /v1/models i sprawdź, czy identyfikator uncensored jest wymieniony.
  2. Zmień trzy wartości. Base URL, klucz, nazwa modelu, nic więcej. Nie dotykaj jeszcze promptów.
  3. Uruchom istniejące testy. Jeśli masz testy regresji promptów, uruchom je i odnotuj, które zawiodą. Niepowodzenia są zwykle behawioralne, np. inny format wyjściowy, a nie błędy protokołu.
  4. Sprawdź parametry. Usuń opcje, których endpoint nie wymaga. Zachowaj temperature, top_p, stop i seed, jeśli ich używasz.
  5. Przetestuj strumieniowanie i narzędzia osobno. Błędy strumieniowania często ukrywają się w kodzie klienta, który zakłada konkretny układ porcji. Wywołania narzędzi wymagają schematu, który model dobrze rozumie, więc przetestuj je na swoich rzeczywistych funkcjach.
  6. Zmierz koszt i opóźnienie na rzeczywistym ruchu. Porównaj dzień zapytań, a nie jeden prompt.

Zrób to w gałęzi lub z flagą funkcjonalności, która kieruje małą część ruchu na nowy endpoint. Ponieważ kod klienta jest wspólny, wycofanie polega na zmianie zmiennej środowiskowej.

Obsłuż ponowne próby i odczytaj zużycie

SDK automatycznie ponawiają niektóre błędy, ale nadal powinieneś sam obsłużyć 429, ponieważ limity współbieżności w produkcji są realne. Przechwyć wyjątek limitu zapytań, odczekaj liczbę sekund podaną w Retry-After (5 przy przeciążeniu) i ponów próbę. Nieudane zapytania nie są rozliczane, więc ponowienia są bezpieczne dla twojego salda.

Loguj usage.prompt_tokens i usage.completion_tokens przy każdym wywołaniu. Ceny to $0.15 za 1M tokenów wejściowych i $0.50 za 1M tokenów wyjściowych, więc wywołanie z 2000 tokenami wejściowymi i 600 wyjściowymi kosztuje 2000 × $0.15 / 1M + 600 × $0.50 / 1M = $0.0003 + $0.0003 = $0.0006. Nagłówki odpowiedzi zawierają również X-Balance-USD dla pozostałego kredytu. Zobacz stronę cen, aby doładować środki i uzyskać bonusy, oraz dokumentację, aby uzyskać pełną listę parametrów.

Edytory i inne narzędzia

Trzy wartości przenoszą się do dowolnego narzędzia z ustawieniem dostawcy kompatybilnego z OpenAI. Artykuł o używaniu API w stylu DeepSeek w Cursor omawia jeden z takich edytorów. W każdym narzędziu pola są oznaczone nieco inaczej, ale zawsze wpisujesz podstawowy URL kończący się na /v1, klucz i nazwę modelu.

Pytania i odpowiedzi

Czy muszę zainstalować oficjalne SDK DeepSeek?

Nie potrzebujesz pakietu specyficznego dla dostawcy. Dokumentacja DeepSeek opisuje użycie SDK OpenAI z innym podstawowym URL; sprawdź ich dokumentację, aby uzyskać aktualne szczegóły.

Jakie trzy wartości muszę zmienić, aby użyć tego endpointu?

Base URL (https://api.deepseekapi.top/v1), Twój klucz API i identyfikator modelu uncensored.

Czy mój istniejący kod OpenAI zadziała bez zmian?

Czat, strumieniowanie, tryb JSON i wywoływanie narzędzi mają ten sam format, więc w większości przypadków tak. Embeddingi, obrazy i audio nie są oferowane, a odpowiedzi różnią się, ponieważ model jest inny.

Czy SDK poprawnie wysyła klucz?

Tak, automatycznie wysyła nagłówek Authorization: Bearer z Twoim kluczem.

Twój klucz jest o jeden formularz stąd

Utwórz konto, skopiuj klucz, zmień bazowy URL. To cała konfiguracja.

Pobierz klucz API