DeepSeek: tanie API, wagi na MIT i pułapka nazw
DeepSeek wydaje modele językowe w dwóch postaciach naraz: jako płatne API zgodne z formatem OpenAI i jako wagi do pobrania z Hugging Face na licencji MIT. Te dwie drogi mają inne koszty, inne limity i inne konsekwencje prawne, więc opłaca się je rozdzielić już na starcie, zanim ktoś w zespole powie "przecież to jest open source".
Co dokładnie oferuje DeepSeek
Dokumentacja API wymienia obecnie trzy nazwy modeli. Wszystkie trzy obsługują kontekst miliona tokenów, maksymalne wyjście 384 tysięcy tokenów oraz tryb myślenia włączony domyślnie. Aliasy są stabilne: deepseek-v4-flash wskazuje dziś na wydanie DeepSeek-V4-Flash-0731, a deepseek-v4-pro na DeepSeek-V4-Pro-0813, więc kod nie wymaga zmian przy podmianie wersji przez dostawcę. To wygodne, ale ma drugą stronę: nie da się przypiąć konkretnego wydania przez nazwę modelu, a zachowanie potrafi się zmienić bez zmian po twojej stronie.
| Nazwa modelu | Wydanie | Kontekst | Maksymalne wyjście | Limit współbieżności |
|---|---|---|---|---|
deepseek-v4-flash | DeepSeek-V4-Flash-0731 | 1M tokenów | 384K tokenów | 2500 |
deepseek-v4-pro | DeepSeek-V4-Pro-0813 | 1M tokenów | 384K tokenów | 500 |
deepseek-v4-flash-vision-exp | DeepSeek-V4-Flash-Vision-Exp | 1M tokenów | 384K tokenów | 2500 |
Trzeci model przyjmuje dodatkowo obrazy i jest oznaczony jako eksperymentalny. Wydano go 21 sierpnia 2026 roku, czyli dzień przed powstaniem tego tekstu, więc traktuj go jak wersję zapoznawczą, a nie fundament produkcji. Obrazy są przeliczane na tokeny według wymiarów i rozliczane razem z tekstem po stawce wejścia.
Dostawca wystawia dwa adresy bazowe: https://api.deepseek.com dla formatu OpenAI i https://api.deepseek.com/anthropic dla formatu Anthropic. Od 13 sierpnia 2026 roku API obsługuje natywnie także format Responses. Limit współbieżności liczy się na konto, a nie na klucz, i jest to jedyny twardy limit opisany w dokumentacji: nie ma tam osobnego limitu zapytań na minutę ani tokenów na minutę. Przekroczenie współbieżności zwraca HTTP 429. Rozszerzenie limitu odbywa się przez wniosek i według dokumentacji nie wiąże się z dodatkową opłatą.
Osobna sprawa to parametr user_id. Podajesz go w extra_body przy SDK OpenAI albo w metadata przy SDK Anthropic. Służy do trzech rzeczy naraz: izolacji bufora kontekstu między użytkownikami twojej aplikacji, izolacji szeregowania i rozdzielenia moderacji treści. Musi pasować do wyrażenia [a-zA-Z0-9\-_]+ i mieć najwyżej 512 znaków. Dokumentacja wprost prosi, żeby nie wkładać tam danych osobowych, co przy identyfikatorach użytkowników jest łatwe do przeoczenia.
Pułapka nazw: pakiet deepseek to nie DeepSeek
Najczęstszy błąd przy starcie polega na wpisaniu pip install deepseek i założeniu, że to oficjalny klient. Nie jest. Pakiet deepseek w wersji 1.0.0 na PyPI wydaje Deskpai.com, adres kontaktowy to dev@deskpai.com, a strona projektu prowadzi do github.com/deskpai/deepseek. Ostatnie wydanie pochodzi z 3 stycznia 2025 roku. To nakładka osoby trzeciej, nie produkt DeepSeeka.
Sprawdzenie licencji z trzech źródeł daje trzy różne odpowiedzi, i to jest sedno problemu z tym pakietem. Metadane w PyPI deklarują Apache-2.0. Zawartość opublikowanego koła to 4542 bajty i dokładnie siedem plików: deepseek/__init__.py, deepseek/api.py, deepseek/const.py oraz cztery pliki w katalogu dist-info, wśród których nie ma żadnego pliku z tekstem licencji. Repozytorium na GitHubie nie ma pliku LICENSE w korzeniu, a plik README.md nosi znaczek "DOSL-1.0" i odsyła do licencji leżącej w zupełnie innym repozytorium tego samego wydawcy. Trzy źródła, trzy stany: deklaracja Apache 2.0, brak jakiegokolwiek tekstu w paczce i informacja o licencji własnej w opisie.
Kod w środku też się zestarzał. Plik const.py zaszywa trzy adresy: https://api.deepseek.com/chat/completions, https://api.deepseek.com/beta/completions i https://api.deepseek.com/user/balance. Metoda chat_completion ma domyślny model deepseek-chat, którego bieżąca dokumentacja już nie wymienia, i wysyła stały ładunek z max_tokens równym 2048, temperature równym 1 oraz tool_choice ustawionym na none. Pakiet powstał przed wprowadzeniem trybu myślenia i parametru reasoning_effort, więc nie zna żadnego z nich. Jedyną zależnością jest requests.
Po stronie npm jest podobnie, tylko jeszcze mniej. Pakiet deepseek ma tam wersję 0.0.2 z 22 stycznia 2025 roku, opis brzmi "Coming soon...", paczka zawiera trzy pliki o łącznej rozmiarze 311 bajtów po rozpakowaniu, a pole license w manifeście nie istnieje. To zajęta nazwa, nie biblioteka.
DeepSeek nie publikuje własnego SDK i nie udaje, że publikuje. Dokumentacja startowa mówi wprost, że API jest zgodne z formatem OpenAI oraz Anthropic i że wystarczy podmienić konfigurację w istniejącym SDK. Wszystkie przykłady w dokumentacji korzystają z bibliotek openai i anthropic. Tę drogę pokazuję niżej.
Jak łączyć się zgodnie z zaleceniem dostawcy
Wersja pythonowa to zwykły klient OpenAI z podmienionym base_url. Biblioteka openai w chwili pisania ma wersję 3.3.1 na PyPI, na licencji Apache 2.0.
import os
from openai import OpenAI
client = OpenAI(
api_key=os.environ.get("DEEPSEEK_API_KEY"),
base_url="https://api.deepseek.com",
)
response = client.chat.completions.create(
model="deepseek-v4-pro",
messages=[
{"role": "system", "content": "You are a helpful assistant"},
{"role": "user", "content": "Hello"},
],
stream=False,
reasoning_effort="high",
extra_body={"thinking": {"type": "enabled"}, "user_id": "tenant-42"},
)
print(response.choices[0].message.reasoning_content)
print(response.choices[0].message.content)W Node jest to samo, tylko przez baseURL. Pakiet openai w npm ma obecnie wersję 7.5.0, również na Apache 2.0.
import OpenAI from "openai";
const openai = new OpenAI({
baseURL: "https://api.deepseek.com",
apiKey: process.env.DEEPSEEK_API_KEY,
});
const completion = await openai.chat.completions.create({
messages: [{ role: "system", content: "You are a helpful assistant." }],
model: "deepseek-v4-pro",
thinking: { type: "enabled" },
reasoning_effort: "high",
stream: false,
});
console.log(completion.choices[0].message.content);Jeśli wolisz format Anthropic, adres bazowy to https://api.deepseek.com/anthropic, tryb myślenia sterujesz polem reasoning.effort, a identyfikator klienta wkładasz w metadata.user_id. Wybór formatu zależy od tego, co już masz w kodzie. Jeżeli budujesz na SDK od OpenAI, zostań przy formacie OpenAI. Jeżeli twój kod mówi już formatem Claude, użyj drugiego adresu i nie przepisuj warstwy klienta.
Tryb myślenia i parametry, które przestają działać
Tryb myślenia jest włączony domyślnie, a domyślny poziom wysiłku to high. Sterowanie ma dwa piętra: przełącznik thinking i poziom reasoning_effort. Mapowanie deklarowane przez dokumentację jest identyczne dla obu modeli tekstowych i nie jest liniowe.
Żądany reasoning_effort | Rzeczywisty wysiłek modelu |
|---|---|
low | low |
medium | high |
high | high |
xhigh | high |
max | max |
Z tej tabeli wynika rzecz, która potrafi zaskoczyć przy strojeniu kosztów: medium i xhigh nie są osobnymi poziomami, tylko aliasami high. Realne stopnie są trzy.
Drugi zestaw niespodzianek dotyczy parametrów, które w trybie myślenia po prostu nic nie robią. Dokumentacja wymienia temperature, top_p, presence_penalty i frequency_penalty. Ustawienie ich nie zwraca błędu, bo API zachowuje zgodność ze starszym oprogramowaniem, ale nie ma żadnego efektu. Jeżeli masz warstwę, która stroi temperaturę na podstawie typu zadania, w trybie myślenia strojenie jest martwe.
Trzecia rzecz jest twardsza i łatwo o niej zapomnieć przy budowie agenta. Treść rozumowania wraca w polu reasoning_content, obok content. Gdy w zapytaniu nie ma parametru tools, wcześniejsze reasoning_content można pominąć przy sklejaniu kontekstu, bo API i tak je zignoruje. Gdy zapytanie zawiera tools, reasoning_content musi wrócić do API we wszystkich kolejnych turach rozmowy z użytkownikiem, nawet w turach bez wywołania narzędzia. Pominięcie go kończy się odpowiedzią 400. To realna różnica względem większości implementacji zgodnych z formatem OpenAI, więc własna warstwa historii rozmowy wymaga poprawki.
Cennik, bufor kontekstu i godziny szczytu
Nowy cennik obowiązuje od 16:00 czasu UTC 16 sierpnia 2026 roku i wprowadza podział na godziny szczytu i poza szczytem. Stawki podaję za milion tokenów, w dolarach.
| Pozycja | flash poza szczytem | flash w szczycie | pro poza szczytem | pro w szczycie |
|---|---|---|---|---|
| Wejście, trafienie w bufor | 0,007 | 0,014 | 0,022 | 0,044 |
| Wejście, chybienie w buforze | 0,22 | 0,44 | 0,66 | 1,32 |
| Wyjście | 0,66 | 1,32 | 1,98 | 3,96 |
Godziny szczytu to 01:00 do 04:00 oraz 06:00 do 10:00 czasu UTC. Razem daje to siedem godzin szczytu na dobę i siedemnaście godzin poza szczytem, więc niższa stawka jest w praktyce ceną domyślną, a nie promocją. Dla zadań wsadowych z Europy oznacza to, że wieczorne uruchomienie kolejki wypada w taniej strefie bez żadnego kombinowania.
Arytmetyka tej tabeli ma dwa miejsca, w których nie wychodzi okrągło. Po pierwsze, model pro kosztuje dokładnie trzy razy tyle co flash w wierszu chybienia i w wierszu wyjścia, ale w wierszu trafienia w bufor jest to 0,022 zamiast 0,021, czyli nieco ponad trzykrotność. Po drugie, stosunek chybienia do trafienia różni się między modelami: dla pro wynosi równo 30 do 1, dla flash około 31,4 do 1. Jeżeli budujesz kalkulator kosztów, nie zakładaj jednego mnożnika dla obu modeli.
Bufor kontekstu jest włączony domyślnie dla wszystkich i nie wymaga zmian w kodzie, ale zasady trafienia są ostrzejsze niż zwykłe dopasowanie prefiksu. Każde zapytanie tworzy jednostki bufora na końcu wejścia użytkownika i na końcu wyjścia modelu. Kolejne zapytanie trafia w bufor tylko wtedy, gdy w całości pokrywa się z taką jednostką. Gdy dwa zapytania mają wspólny początek, ale różne końcówki, żadne z nich nie trafi w bufor, natomiast system wykryje wspólny prefiks i zapisze go jako osobną jednostkę, z której skorzysta dopiero trzecie zapytanie. Dla długich wejść i wyjść jednostki powstają też w stałych odstępach tokenowych. Stan sprawdzasz w odpowiedzi, w polach prompt_cache_hit_tokens i prompt_cache_miss_tokens w sekcji usage.
usage = response.usage
hit = usage.prompt_cache_hit_tokens
miss = usage.prompt_cache_miss_tokens
# stawki flash poza szczytem, USD za milion tokenow
cost_input = hit / 1_000_000 * 0.007 + miss / 1_000_000 * 0.22
cost_output = usage.completion_tokens / 1_000_000 * 0.66
print(round(cost_input + cost_output, 6))Dokumentacja zaznacza, że bufor działa w trybie najlepszej staranności i nie gwarantuje stuprocentowej skuteczności, budowa wpisu trwa sekundy, a nieużywany wpis znika zwykle po kilku godzinach do kilku dni. Planowanie budżetu wyłącznie na stawce trafienia jest więc ryzykowne.
Wagi z Hugging Face kontra API dostawcy
Modele o otwartych wagach i API to dwa różne produkty i mają różne licencje. Organizacja deepseek-ai na Hugging Face publikuje wagi, które można pobrać i uruchomić u siebie. Karta modelu DeepSeek-V4-Pro-0813 mówi wprost, że repozytorium i wagi są objęte licencją MIT, tak samo oznaczone są DeepSeek-V4-Flash-0731, DeepSeek-V3.2-Exp, DeepSeek-V3.1 oraz DeepSeek-R1.
Nie zawsze tak było i dlatego licencję trzeba sprawdzać per model. Pierwsze repozytorium DeepSeek-V3 z grudnia 2024 roku ma dwa osobne pliki: LICENSE-CODE z tekstem MIT oraz LICENSE-MODEL z dokumentem "DEEPSEEK LICENSE AGREEMENT Version 1.0" z 23 października 2023 roku. Ta druga licencja zawiera ograniczenia użycia i wymaga, żeby pochodne wydania przenosiły te same ograniczenia dalej. Dopiero od DeepSeek-V3-0324 repozytoria niosą pojedynczy plik LICENSE z tekstem MIT. Jeżeli ktoś w zespole odziedziczył starszy checkpoint, licencja nie jest ta sama co w nowych wydaniach.
Skala tych wag bywa niedoceniana. Indeks tensorów podawany przez Hugging Face daje dla DeepSeek-V4-Pro-0813 około 1,65 biliona parametrów, a dla DeepSeek-V4-Flash-0731 około 304 miliardów. Konfiguracja Pro to 61 warstw, 384 eksperty rutowane plus jeden współdzielony, sześć ekspertów na token i kwantyzacja fp8 w formacie e4m3. Przy mniej więcej jednym bajcie na parametr pliki wag Pro zajmują rząd wielkości 1,6 terabajta, a Flash rząd 300 gigabajtów. Karta modelu podaje przykładową komendę serwowania na pojedynczym węźle z czterema kartami GB300.
vllm serve deepseek-ai/DeepSeek-V4-Pro-0813 \
--trust-remote-code --kv-cache-dtype fp8 --block-size 256 \
--data-parallel-size 4 --enable-expert-parallel \
--moe-backend deep_gemm_mega_moe \
--attention-config '{"use_fp4_indexer_cache": true}' \
--speculative-config '{"method":"dspark","num_speculative_tokens":7,"draft_sample_method":"greedy"}'To jest sprzęt centrum danych, nie laptop. Sensowne ścieżki lokalne prowadzą przez vLLM albo SGLang na wynajętych kartach, a nie przez Ollama, które nadaje się do mniejszych modeli i destylatów. Dochodzi jeszcze szczegół, który psuje wiele gotowych integracji: wydanie DeepSeek-V4-Pro-0813 nie zawiera szablonu rozmowy w formacie Jinja. Zamiast tego repozytorium ma katalog encoding z funkcjami encode_messages i parse_message_from_completion_text, których trzeba użyć samodzielnie do złożenia promptu i rozbioru odpowiedzi.
| Kryterium | API DeepSeek | Wagi z Hugging Face |
|---|---|---|
| Licencja | regulamin platformy, brak licencji open source | MIT dla wydań od V3-0324 wzwyż |
| Koszt startowy | doładowanie salda | karty GPU lub najem |
| Miejsce przetwarzania | serwery dostawcy | twoja infrastruktura |
| Przypięcie wersji | alias wskazuje na bieżące wydanie | konkretny commit repozytorium |
| Bufor kontekstu | wbudowany, rozliczany osobno | konfigurujesz sam |
Dane, zgodność i ryzyko dostawcy spoza Unii
Polityka prywatności jest wystawiona przez Hangzhou DeepSeek Artificial Intelligence Co., Ltd. z adresem rejestrowym w Chinach, a adres kontaktowy do spraw danych to privacy@deepseek.com. Dokument stwierdza wprost, że dane osobowe mogą być przechowywane na serwerze poza krajem zamieszkania użytkownika. Okres retencji jest opisany celowo szeroko: dane trzymane są tak długo, jak istnieje konto, oraz dodatkowo tam, gdzie wymagają tego obowiązki umowne i prawne albo uzasadniony interes gospodarczy, w tym rozwój i ulepszanie usług. To znaczy, że nie ma podanego twardego terminu usunięcia treści zapytań.
Dla zespołu w Unii Europejskiej wynikają z tego konkretne zadania, a nie ogólne obawy. Transfer do państwa trzeciego wymaga podstawy prawnej i oceny skutków. W dokumentacji platformy nie znalazłem oferty przetwarzania w regionie unijnym ani gotowego wzoru umowy powierzenia przetwarzania, więc przed wpuszczeniem danych osobowych do tego API sprawdź to bezpośrednio u dostawcy. Jeżeli odpowiedź nie przyjdzie na piśmie, to samo w sobie jest odpowiedzią.
Regulamin platformy deweloperskiej ma za to fragment korzystniejszy niż u części konkurencji. Punkt o wejściach i wyjściach mówi, że zachowujesz prawa do wejść, DeepSeek przenosi na ciebie prawa do wyjść, a wyjść wolno używać szeroko, w tym do trenowania innych modeli, na przykład przez destylację. Kto buduje własny mniejszy model na syntetycznych danych, powinien ten punkt przeczytać w całości, bo wprost dopuszcza scenariusz zakazany w niejednym konkurencyjnym regulaminie.
Ryzyko operacyjne jest trzecim wymiarem. Zdarzały się okresy, w których dostawca ograniczał rejestrację nowych kont przy przeciążeniu. Dokumentacja techniczna takich zdarzeń nie odnotowuje, więc nie podam dat, ale sam mechanizm warto uwzględnić w planie: konto i klucz zakładaj wcześniej, niż będą potrzebne, i miej przygotowaną drogę zapasową. Praktyczne rozwiązanie to warstwa pośrednia, na przykład LiteLLM albo OpenRouter, która pozwala przełączyć ruch na innego dostawcę bez zmian w kodzie aplikacji.
Przy okazji katalogu OpenRouter widać dwie liczby, które nie zgadzają się z materiałami dostawcy. Wpis deepseek/deepseek-v4-pro-0813 wyceniony jest na 1,188 dolara za milion tokenów wejścia i 3,564 za milion wyjścia, czyli dokładnie dziewięćdziesiąt procent stawki szczytowej DeepSeeka. Wpis deepseek/deepseek-v4-flash-0731 deklaruje długość kontekstu 1 310 720 tokenów, podczas gdy plik config.json tego samego modelu podaje max_position_embeddings równe 1 048 576. Katalogi pośredników opisują też oferty hostów zewnętrznych, więc różnice są wytłumaczalne, ale nie należy ich przepisywać do własnej dokumentacji bez sprawdzenia u źródła.
Drugim chińskim dostawcą wartym porównania jest Qwen od Alibaby, który daje szerszy wachlarz rozmiarów modeli i osobne warianty do kodowania oraz do zadań wielomodalnych. Różnica najważniejsza prawnie leży w licencjach wag: DeepSeek wydał rodzinę V4 jednolicie na MIT, a u Qwena licencja jest polem osobnym dla każdego modelu i potrafi się różnić między sąsiednimi wariantami tej samej serii. Największy model rodziny ma własną licencję z progami przychodowymi, a jeden z modeli do kodowania jest na licencji dopuszczającej wyłącznie użytek niekomercyjny, więc sprawdzenie pojedynczego pliku licencji przed pobraniem wag nie jest tu ostrożnością, tylko koniecznością.
Typowe błędy
Instalacja pakietu deepseek zamiast openai to błąd numer jeden i jego skutek nie jest oczywisty od razu, bo pakiet działa. Wysyła poprawne zapytanie na poprawny adres, tylko z domyślnym modelem, którego bieżąca dokumentacja nie wymienia, i bez żadnego wsparcia dla trybu myślenia.
Drugi błąd to potraktowanie licencji MIT wag jako licencji API. Wagi wolno pobrać, zmodyfikować i wdrożyć komercyjnie. Dostęp do api.deepseek.com reguluje umowa z dostawcą i nic z licencji MIT z tej umowy nie wynika.
Trzeci błąd polega na pomijaniu reasoning_content przy sklejaniu historii w agencie z narzędziami. Kod działa poprawnie na pierwszej turze i przewraca się na 400 w drugiej, kiedy pojawia się tools, co prowadzi do godzin szukania błędu w złym miejscu.
Czwarty błąd to strojenie temperature w trybie myślenia. Nie ma błędu, nie ma efektu, jest za to fałszywe poczucie kontroli. Jeżeli potrzebujesz sterować losowością, wyłącz tryb myślenia jawnie przez {"thinking": {"type": "disabled"}}.
Piąty błąd dotyczy budżetu. Prognoza kosztu policzona na stawce trafienia w bufor bywa dziesięciokrotnie zaniżona, bo bufor działa w trybie najlepszej staranności, a wpisy wygasają. Licz górną granicę po stawce chybienia i po stawce szczytu, a oszczędność traktuj jako premię.
Szósty błąd to pisanie identyfikatora użytkownika końcowego w user_id w postaci adresu e-mail albo numeru dokumentu. Dokumentacja prosi o brak danych osobowych w tym polu, a wyrażenie [a-zA-Z0-9\-_]+ i tak odrzuci większość adresów. Użyj nieodwracalnego skrótu.
FAQ
Czy pakiet z komendy pip install deepseek pochodzi od DeepSeeka?
Nie. Wersja 1.0.0 na PyPI pochodzi od Deskpai.com, a repozytorium to github.com/deskpai/deepseek. Ostatnie wydanie ma datę 3 stycznia 2025 roku, koło waży 4542 bajty, nie zawiera pliku licencji i nie zna trybu myślenia. Dostawca zaleca bibliotekę openai albo anthropic z podmienionym adresem bazowym.
Czy mogę uruchomić DeepSeek-V4 na własnym sprzęcie?
Tak, wagi są na Hugging Face na licencji MIT, ale skala jest poważna: około 1,65 biliona parametrów dla wersji Pro i około 304 miliardów dla Flash. Przykład z karty modelu zakłada węzeł z czterema kartami GB300. Do zabawy na jednej karcie lepiej nadają się destylaty i mniejsze modele.
Jak DeepSeek rozlicza bufor kontekstu?
Osobnymi stawkami za tokeny wejścia, które trafiły w bufor, i te, które chybiły. Trafienie kosztuje 0,007 dolara za milion dla flash poza szczytem i 0,022 dla pro. Odpowiedź zwraca prompt_cache_hit_tokens i prompt_cache_miss_tokens, więc rzeczywistą skuteczność da się zmierzyć, zamiast ją zakładać.
Czy DeepSeek nadaje się do danych osobowych z Unii Europejskiej?
Bez dodatkowych ustaleń nie. Operatorem jest spółka z siedzibą w Chinach, polityka prywatności dopuszcza przechowywanie danych poza krajem użytkownika, a terminu usunięcia treści zapytań nie podano. W dokumentacji platformy nie ma oferty przetwarzania w regionie unijnym. Do danych osobowych rozważ samodzielny hosting wag albo dostawcę w Unii.
Ile pracy kosztuje przełączenie istniejącego kodu na DeepSeek?
Przy formacie OpenAI zwykle dwie linie: base_url i nazwa modelu. Prawdziwa praca zaczyna się dalej, przy obsłudze reasoning_content w agentach z narzędziami, przy parametrach próbkowania, które w trybie myślenia nie działają, oraz przy testach regresji, bo alias modelu wskazuje na bieżące wydanie.
Źródła: cennik i lista modeli w dokumentacji API, karta modelu DeepSeek-V4-Pro-0813, wpis pakietu deepseek w PyPI.