Ten artykuł omawia uwagi dotyczące użycia i pułapki związane z deepseek-v4-pro-0813. W AIHubMix model jest dostępny przez API Chat Completions, Responses oraz Messages kompatybilne z Claude. Zobacz także: oficjalną dokumentację API DeepSeek.
Wnioski oznaczone jako „Verified” oraz przykładowe odpowiedzi w każdej sekcji pochodzą z rzeczywistych wywołań wykonanych 2026-08-13 przez API AIHubMix (Chat Completions / Responses / Messages). Pozycje specyfikacji, które nie są oznaczone jako „Verified”, pochodzą z oficjalnej dokumentacji DeepSeek.
1. Pozycjonowanie modelu i specyfikacja w skrócie
V4 Pro to wysoki poziom generacji DeepSeek V4 (lekki deepseek-v4-flash jest jego odpowiednikiem). Linia wydań sięga wersji DeepSeek-V4 Preview z 2026-04-24, a 0813 to etykieta WERSJI MODELU przypisana przez DeepSeek do bieżącej kompilacji. Poza surowymi parametrami wyróżniają go cztery cechy:
- Rzadki model z czołówki: 1.6T parametrów łącznie / 49B aktywowanych (architektura MoE, czyli mixture-of-experts: przy każdym przebiegu wnioskowania aktywowany jest tylko podzbiór sieci ekspertów; łączna liczba parametrów określa pojemność wiedzy, a aktywowane parametry koszt obliczeniowy pojedynczego wywołania). Karta modelu wymienia hybrydową uwagę CSA+HCA, mHC oraz optymalizator Muon.
- Wagi otwarte na licencji MIT:
deepseek-ai/DeepSeek-V4-Projest opublikowany na HuggingFace na licencji MIT (jednej z najbardziej permisywnych licencji open source: dozwolone jest zarówno użycie komercyjne, jak i redystrybucja w zamkniętym kodzie) i może być hostowany samodzielnie. Licencja MIT jest rzadkością przy modelu tej wielkości. Wskazówki dotyczące self-hostingu w karcie modelu sugerują także okno kontekstu ≥384K tokenów przy działaniu w Think Max (najwyższym poziomie myślenia). To wskazówka wdrożeniowa dla self-hostingu, a nie specyfikacja hostowanego API. - Wsparcie wielu protokołów jest pierwszej ręki, a nie tłumaczeniem przez strony trzecie: DeepSeek sam oferuje OpenAI Chat API, endpoint kompatybilny z Anthropic (
/anthropic, który mapujeclaude-opus*na ten model) oraz Responses API (DeepSeek opisuje natywne wsparcie tego formatu, z adaptacjami dla Codex). Oferuje też uzupełnianie FIM (fill-in-the-middle) jako funkcję Beta na osobnym endpoincie, który nie wchodzi w skład trzech API AIHubMix. - Ok. 120-krotna różnica między cenami cache-hit a cache-miss: opublikowany przez DeepSeek mechanizm cenowy to cache-hit $0.003625/M kontra cache-miss $0.435/M (wyjście $0.87/M), a cache'owanie działa automatycznie, bez parametru do ustawienia. Przy obciążeniach wielokrotnie wykorzystujących długie prefiksy (system prompty, długie dokumenty) to właśnie ta różnica dominuje w rachunku. Rzeczywista cena detaliczna to ta, którą pokazuje strona modelu.
| Pozycja | Wartość |
|---|---|
| Nazwa modelu w AIHubMix | deepseek-v4-pro-0813 |
| Okno kontekstu | 1M tokenów (1,000,000) |
| Maks. wyjście | Oficjalne sformułowanie to MAX OUTPUT MAXIMUM: 384K (dokładna liczba tokenów i wartość domyślna nie są publikowane) |
| Modalności wejściowe | Tylko tekst. Strona o zgodności z Responses wprost stwierdza, że wejścia w postaci obrazów i plików nie są obsługiwane; strona Messages oznacza bloki type="image" jako Not Supported; w Chat Completions treść wiadomości użytkownika content przyjmuje wyłącznie ciąg znaków, bez części multimodalnych |
| Tryb myślenia | Hybrydowy (myślenie / bez myślenia), myślenie domyślnie włączone |
| Poziomy myślenia | reasoning_effort przyjmuje low / high / max, domyślnie high; medium i xhigh są mapowane na high ze względu na zgodność |
| Dostępne API | Chat Completions, Responses, Messages (kompatybilne z Claude) |
Verified: przekroczeniemax_tokensjest odrzucane przez walidację, a nie cicho obcinane. Wysłaniemax_tokens=9999999zwraca HTTP 400, a treść błędu wskazuje pole i podaje limit393216.
# max_tokens=9999999 -> HTTP 400
"...max_tokens... 393216"
❗ Obrazy nie powodują błędu, ale są pomijane: oficjalne sformułowanie dla Responses API brzmi „Image and file inputs are not supported (input_image parts do not cause an error, but are replaced with a placeholder text)”. Częśćinput_imagenie powoduje niepowodzenia żądania, tylko zostaje zastąpiona tekstem zastępczym. W Chat Completions treśćcontentwiadomości użytkownika przyjmuje wyłącznie ciąg znaków, a blokitype="image"w Messages są oznaczone jako Not Supported. Budując routing multimodalny, nigdy nie traktuj braku błędu jako dowodu, że model faktycznie widział obraz.
2. Jak wyłączyć myślenie? Trzy API, trzy kształty pól
V4 Pro domyślnie myśli: nie wysyłaj żadnych parametrów, a odpowiedź zawiera treść myślenia. Wyłączenie wymaga innego kształtu pola w każdym z trzech API.
Chat Completions
Użyj obiektu thinking na najwyższym poziomie.
from openai import OpenAI
client = OpenAI(
base_url="https://aihubmix.com/v1",
api_key="<AIHUBMIX_API_KEY>",
)
completion = client.chat.completions.create(
model="deepseek-v4-pro-0813",
messages=[{"role": "user", "content": "What is 2 + 2?"}],
extra_body={"thinking": {"type": "disabled"}},
)
# Thinking on (default): message.reasoning_content present, reasoning_tokens = 43
# Thinking off (disabled): reasoning_content absent, reasoning_tokens absent
Verified: przythinking.type="disabled"jednocześnie znikająmessage.reasoning_contentorazusage.completion_tokens_details.reasoning_tokens, co potwierdza, że przełącznik zadziałał.
Responses
W Responses nie ma osobnego przełącznika; wyłączenie myślenia oznacza ustawienie poziomu na none.
response = client.responses.create(
model="deepseek-v4-pro-0813",
input="What is 2 + 2?",
reasoning={"effort": "none"},
)
# effort="none": usage.output_tokens_details.reasoning_tokens = 0
# output[0] is the message item directly (no reasoning item)
# effort unset : output always starts with a reasoning item
Verified:reasoning.effort="none"wyraźnie różni się od poziomu domyślnego (tokeny myślenia spadają do zera, element wyjściareasoningznika), co potwierdza, że zadziałało.
Messages
Ta sama nazwa i ten sam kształt co w Chat Completions: obiekt thinking na najwyższym poziomie.
from anthropic import Anthropic
client = Anthropic(
api_key="<AIHUBMIX_API_KEY>",
base_url="https://aihubmix.com",
)
response = client.messages.create(
model="deepseek-v4-pro-0813",
max_tokens=1024,
messages=[{"role": "user", "content": "What is 2 + 2?"}],
extra_body={"thinking": {"type": "disabled"}},
)
# Thinking on (default): content = [thinking block, text block]
# Thinking off (disabled): content = [text block]
Verified: po wyłączeniu blokthinkingznika całkowicie i pozostaje tylko bloktext.
O poziomach myślenia:lowimaxzwróciły 200 w Chat Completions podczas testów (highjest domyślny i obowiązuje, gdy pole jest pominięte), ale liczba tokenów myślenia nie wykazuje monotonicznej różnicy między poziomami dla tego samego pytania (łatwe pytanie: low=43 / max=27; trudne pytanie: low=114 / max=92), a w odpowiedzi nic nie jest zwracane: poziomy są akceptowane, ale z odpowiedzi nie da się zaobserwować żadnego wyróżnika. W Responses z perspektywy odpowiedzi można potwierdzić jedynie poziomnone(myślenie wyłączone).
3. Dlaczego wieloturowa rozmowa nagle zwraca 400? Historia myślenia musi być przekazywana dosłownie
To najczęstsza pułapka tego modelu: w trybie myślenia wieloturowa rozmowa musi przekazywać treść myślenia z poprzedniej tury dosłownie, inaczej żądanie zostanie odrzucone. Nie chodzi o obniżoną jakość ani gorszą odpowiedź, tylko o twardy błąd HTTP 400.
Trzy API niosą tę samą treść myślenia pod różnymi nazwami pól:
| API | Kształt przekazania | Treść błędu przy braku |
|---|---|---|
| Chat Completions | Pole reasoning_content w wiadomości asystenta |
The `reasoning_content` in the thinking mode must be passed back to the API. |
| Responses | Element wyjścia z type="reasoning" w tablicy input |
The `reasoning_text` in the thinking mode must be passed back to the API. |
| Messages | Blok thinking wewnątrz bloków treści asystenta |
The `content[].thinking` in the thinking mode must be passed back to the API. |
Verified (warunki wyzwalające): ta walidacja konsekwentnie uruchamia się przy wieloturowych żądaniach zawierających tools (model wykonuje wywołanie narzędzia, a następnie wynik narzędzia jest odsyłany). W zwykłych wieloturowych żądaniach bez narzędzi, gdzie model odpowiada bezpośrednio, walidacja w tej rundzie testów nie zadziałała i żądanie zwróciło 200. Innymi słowy, orkiestracja narzędzi (obciążenia agentowe i function calling) to miejsce, w którym najłatwiej na to trafić, dlatego traktuj treść myślenia jako część stanu rozmowy, który zapisujesz i odtwarzasz.Chat Completions
# Multi-turn: pass the previous assistant message back verbatim, including reasoning_content
messages = [
{"role": "user", "content": "What is 1 + 1? Remember the result."},
{
"role": "assistant",
"content": "2",
"reasoning_content": "<reasoning_content from the previous response>",
},
{"role": "user", "content": "Add 1 to the result."},
]
# Dropping reasoning_content -> HTTP 400 invalid_request_error
Verified: historyczna wiadomość asystenta bez reasoning_content zwraca 400; dodanie jej z powrotem sprawia, że identyczne żądanie zwraca 200 i poprawnie kontynuuje.Responses
# Multi-turn: input = previous input + response.output (reasoning item included) + new message
input = previous_input + response.output + [
{"role": "user", "content": "Add 1 to the result."}
]
# Filtering out the type="reasoning" item -> HTTP 400
Verified: wystarczy wstawićresponse.outputz powrotem bez zmian. Filtrowanie elementów wyjścia wedługtype == "message"przy składaniu historii usuwa elementreasoningi wywołuje 400. To najczęstszy sposób, by na tym polec.
Messages
# Multi-turn: pass response.content back verbatim as the assistant message
messages = [
{"role": "user", "content": "What's the weather in Paris?"},
{"role": "assistant", "content": response.content}, # thinking + tool_use blocks
{"role": "user", "content": [tool_result_block]},
]
# Stripping the thinking block -> HTTP 400
Verified: usunięcie blokuthinkingz tablicy content zwraca 400 (zerror.typeustawionym nainvalid_request_error).
4. Wywoływanie narzędzi
Każde API deklaruje narzędzia we własnym kształcie protokołu; kształty nie są wymienne.
Chat Completions
Kształt zagnieżdżony (obiekt function opakowujący name / parameters). Wymuszenie wywołania daje tool_choice z nazwaną funkcją.
completion = client.chat.completions.create(
model="deepseek-v4-pro-0813",
messages=[{"role": "user", "content": "What's the weather in Paris?"}],
tools=[{
"type": "function",
"function": {
"name": "get_weather",
"description": "Get weather for a city",
"parameters": {"type": "object", "properties": {"city": {"type": "string"}}, "required": ["city"]},
},
}],
tool_choice={"type": "function", "function": {"name": "get_weather"}},
)
# Observed: finish_reason "tool_calls", tool_calls[0].function.arguments = {"city": "Paris"}
❗ Verified:tool_choice: "required"nie może być używane, gdy myślenie jest włączone. Zwraca 400Thinking mode does not support this tool_choice; wyłączenie myślenia (thinking.type="disabled") sprawia, że identyczne żądanie zwraca 200. Gdy potrzebujesz semantyki „musi wywołać narzędzie”, użyj zamiast tego nazwanej funkcji wtool_choice(jak wyżej, działa przy włączonym myśleniu) albo najpierw wyłącz myślenie, a potem użyjrequired.
Responses
Kształt płaski (type / name / parameters na tym samym poziomie).
response = client.responses.create(
model="deepseek-v4-pro-0813",
input="What's the weather in Paris?",
tools=[{
"type": "function",
"name": "get_weather",
"description": "Get weather for a city",
"parameters": {"type": "object", "properties": {"city": {"type": "string"}}, "required": ["city"]},
}],
)
# Observed output items: ["reasoning", "function_call"]; arguments = {"city": "Paris"}
Verified: skopiowanie zagnieżdżonego kształtu z Chat Completions (function: {...}) do Responses zwraca 400, więc użyj płaskiego kształtu.tool_choice: "required"podlega temu samemu ograniczeniu trybu myślenia co w Chat.
Messages
Kształt natywny dla Anthropic (input_schema), z tool_choice: {"type": "any"} do wymuszenia wywołania.
response = client.messages.create(
model="deepseek-v4-pro-0813",
max_tokens=1024,
tools=[{
"name": "get_weather",
"description": "Get weather for a city",
"input_schema": {"type": "object", "properties": {"city": {"type": "string"}}, "required": ["city"]},
}],
tool_choice={"type": "any"},
messages=[{"role": "user", "content": "What's the weather in Paris?"}],
)
# Observed: content contains a tool_use block, name = get_weather, input = {"city": "Paris"}
❗ Równoległych wywołań narzędzi nie da się wyłączyć z natury projektu DeepSeek: oficjalna strona zgodności z Anthropic stwierdza w wierszutool_choice, żedisable_parallel_tool_use is ignored, a strona Responses podobnie podajeparallel_tool_calls | Ignored (parallel tool calling is always enabled). Testy to potwierdzają: pytanie o dwa miasta naraz zdisable_parallel_tool_use: truenadal zwraca dwa blokitool_use. Jeśli potrzebujesz wykonania szeregowego, weź pierwsze wywołanie albo ustaw kolejkowanie po stronie klienta.
Liczba narzędzi a koszt kontekstu: wysłanie 200 definicji funkcji w jednym żądaniu nadal zwróciło 200 z normalną odpowiedzią i nie wywołało żadnej walidacji liczby (zaobserwowano na tej ścieżce; wyższych liczb nie testowano). Jednak prompt_tokens dla tego żądania osiągnęło 6,105 — definicje narzędzi trafiają do kontekstu w całości i są rozliczane. Gdy masz wiele narzędzi, ogranicz zestaw narzędzi do konkretnego scenariusza, zamiast deklarować wszystkie bezwarunkowo.5. Wyjście o ustalonej strukturze (Structured Output)
Chat Completions
response_format obsługuje tryb JSON.
completion = client.chat.completions.create(
model="deepseek-v4-pro-0813",
messages=[{"role": "user", "content": "Return {\"a\": 1} as JSON."}],
response_format={"type": "json_object"},
)
# Observed response content: {"a":1}
Zweryfikowano: wynik jest poprawnym JSON-em.
Responses
Zadeklaruj JSON Schema przez text.format; obsługiwany jest tryb strict.
response = client.responses.create(
model="deepseek-v4-pro-0813",
input="Return the number 1 under key a.",
text={
"format": {
"type": "json_schema",
"name": "extract",
"strict": True,
"schema": {"type": "object", "properties": {"a": {"type": "integer"}}, "required": ["a"]},
}
},
)
# Observed output text: {"a":1}
Zweryfikowano: wynik ściśle odpowiada podanemu schematowi.
Messages
Protokół Messages (Anthropic) nie ma odpowiednika response_format / text.format. Typowe obejście polega na przeniesieniu schematu do narzędzia: zadeklaruj narzędzie, którego input_schema jest docelowym schematem, ustaw tool_choice: {"type": "any"} i odczytaj ustrukturyzowany wynik z input bloku tool_use. W tej rundzie testów nie zweryfikowano tego wzorca w szczególności; gdy potrzebujesz twardych gwarancji schematu, wybierz Chat Completions lub Responses.
6. Jak włączyć cache kontekstu? Nie włączasz go, działa automatycznie
Cache kontekstu (identyczne prefiksy są ponownie wykorzystywane, a zbuforowana część jest rozliczana po niższej stawce) jest domyślnie włączony i nie wymaga żadnych parametrów. Drugie żądanie z tym samym długim prefiksem raportuje trafienie w usage, pod nazwą pola, która różni się w zależności od API. Szczegóły dotyczące cache'u i aktualne ceny znajdziesz na stronie modelu; strategię cache'owania między modelami i techniki zwiększania liczby trafień — w praktykach cache'owania promptów.
Chat Completions
# usage of the second call with an identical long prefix
"prompt_tokens_details": {"cached_tokens": 640} # first call: 0
Zweryfikowano: dwa kolejne wywołania z tym samym długim prefiksem na tym samym kanale zmieniły cached_tokens z 0 na 640.Responses
# usage of the second call with identical long instructions
"input_tokens_details": {"cached_tokens": 896} # first call: 0
Messages
# usage of a call whose long system prefix was already warmed
"cache_read_input_tokens": 896
Zweryfikowano: prefiks powyżej został rozgrzany żądaniem Responses o identycznej treści, a pierwsze wywołanie Messages od razu trafiło 896 — zgodnie z tym, że cache jest kluczowany po prefiksie treści i współdzielony między powierzchniami protokołów.
7. logprobs: Chat zwraca dwa kanały
logprobs (prawdopodobieństwa logarytmiczne, czyli szczegółowa pewność modelu dla każdego kandydującego tokena) ma różne kształty w obu API, a kod parsujący musi je obsługiwać osobno.
Chat Completions
completion = client.chat.completions.create(
model="deepseek-v4-pro-0813",
messages=[{"role": "user", "content": "Say hi."}],
logprobs=True,
top_logprobs=2,
)
# Observed: choices[0].logprobs contains TWO arrays
# logprobs.content[] -> tokens of the final answer
# logprobs.reasoning_content[] -> tokens of the thinking text
❗ Zweryfikowano: Chat zwraca prawdopodobieństwa logarytmiczne zarówno dlacontent, jak ireasoning_content. Kod, który odczytuje tylkologprobs.contentzgodnie ze standardowym kształtem odpowiedzi OpenAI, nie zgłosi błędu, ale po cichu pominie kanał myślenia; jeśli Twój kod zakłada jedną tablicę podlogprobs, najpierw dodaj sprawdzenie kształtu.
Responses
response = client.responses.create(
model="deepseek-v4-pro-0813",
input="Say hi.",
top_logprobs=3,
)
# Observed: logprobs only on the final message item
# output[-1].content[0].logprobs[] with logprob + top_logprobs details
Zweryfikowano: Responses dołącza logprobs tylko do końcowego elementu tekstowego, bez dwukanałowego kształtu widocznego w Chat.
Messages
Protokół Messages (Anthropic) nie ma odpowiedniego pola. Szczegółowe dane prawdopodobieństw na poziomie tokenów uzyskasz przez Chat Completions lub Responses.
8. Które API potrafią przeszukiwać sieć?
Wyszukiwanie w sieci jest tutaj narzędziem po stronie serwera (wyszukiwanie wykonuje serwer; klient nigdy sam nie wysyła tego żądania), i w testach faktycznie działa zarówno w API Responses, jak i Messages.
Responses
response = client.responses.create(
model="deepseek-v4-pro-0813",
input="What is the latest stable version of Python?",
tools=[{"type": "web_search"}],
)
# Observed output item sequence:
# ["reasoning", "web_search_call", "reasoning", "message"]
Zweryfikowano: w sekwencji wyjściowej pojawia się element web_search_call, co oznacza, że serwer rzeczywiście wykonał wyszukiwanie.Messages
response = client.messages.create(
model="deepseek-v4-pro-0813",
max_tokens=1024,
tools=[{"type": "web_search_20250305", "name": "web_search"}],
messages=[{"role": "user", "content": "What is the latest stable version of Python?"}],
)
# Observed content block sequence:
# ["thinking", "server_tool_use", "web_search_tool_result", "thinking", "text"]
# usage.server_tool_use.web_search_requests = 1
Zweryfikowano: usage.server_tool_use.web_search_requests wynosi 1 — żądanie wyszukiwania rzeczywiście miało miejsce i zostało rozliczone.Chat Completions
Wyszukiwania w sieci nie da się uruchomić na Chat. Oficjalna dokumentacja API Chat DeepSeek nie zawiera w schemacie żądania żadnego pola narzędzia wyszukiwania (ten brak ustalono, przechodząc listę pól jedno po drugim; DeepSeek nie wydał wyraźnego oświadczenia o braku wsparcia). API z wyraźnym oficjalnym potwierdzeniem wyszukiwania po stronie serwera to Responses (web_search), a oficjalna strona zgodności Messages również wymienia bloki treści związane z wyszukiwaniem.
# Three control groups, same question requiring live information, all HTTP 200:
# A no search field -> "cannot retrieve", annotations = null
# B web_search_options -> "cannot retrieve", annotations = null, usage identical to A
# C enable_search -> "cannot retrieve", annotations = null, usage identical to A
Zweryfikowano: wysłanieweb_search_optionslubenable_searchnie zgłasza błędu, ale też niczego nie wyszukuje — odpowiedź nie zawieraannotations(listy cytowań dołączanej do odpowiedzi, gdy wyszukiwanie w sieci działa), a usage jest identyczne z grupą kontrolną pole po polu. Do dostępu do sieci użyj API Responses lub Messages.
9. Uwagi o użyciu: projekt DeepSeek a odstępstwa na naszej ścieżce
Wszystko poniżej zwraca HTTP 200, zachowując się wbrew intuicji. Przyczyny są różne, podobnie jak to, co z nimi zrobić, dlatego wymieniono je osobno: pierwsza grupa to sposób, w jaki DeepSeek zaprojektował model, i zmiana dostawcy tego nie zmieni; druga grupa to obecne zachowanie na ścieżce AIHubMix, nad którym pracujemy.
9.1 Zgodnie z projektem DeepSeek
| Zachowanie | Oficjalne sformułowanie | Co zrobić |
|---|---|---|
| Responses nie przechowuje stanu sesji ani metadanych | Oficjalna strona zgodności Responses stwierdza wiersz po wierszu: store | Not supported. The response always carries store: false, metadata | Not supported i safety_identifier | Not supported (spośród tych czterech pól obsługiwane jest tylko user). Testy to potwierdzają: żądanie zwraca 200, ale metadata ma wartość null, safety_identifier jest nieobecne, a store zawsze równa się false. |
Przechowuj dane korelacji żądań po stronie klienta; nie polegaj na przechowywaniu po stronie serwera. |
| Parametry próbkowania nie mają wpływu w trybie myślenia | DeepSeek wyraźnie stwierdza, że temperature i top_p są w trybie myślenia po cichu nieaktywne. W testach oba zwracają 200, nic nie są odsyłane i kształt odpowiedzi się nie zmienia |
Nie polegaj na parametrach próbkowania w zapewnieniu stabilności wyjścia w trybie myślenia; gdy potrzebujesz determinizmu, użyj structured output |
| Kontynuacja prefiksu / FIM jest dostępna tylko na oficjalnym endpoincie beta | Oficjalny opis prefix brzmi: "(Beta) … You must set base_url="https://api.deepseek.com/beta" to use this feature", a uzupełnianie FIM również jest funkcją Beta. Zweryfikowano na produkcji AIHubMix: wysłanie prefix: true na standardowym endpoincie zwraca 200, ale prefiks jest po cichu odrzucany, co zgadza się w kierunku z oficjalnym sformułowaniem |
Do kontrolowanego formatu wyjścia użyj structured output (sekcja 5) lub obcinania za pomocą stop |
| Równoległego wywoływania narzędzi nie można wyłączyć | Zobacz sekcję 4: DeepSeek stwierdza zarówno na stronie Responses, jak i Anthropic, że przełącznik jest ignorowany, a równoległe wywoływanie jest zawsze włączone | Gdy potrzebujesz szeregowego wykonywania, kolejkuj wywołania po stronie klienta |
9.2 Obecne zachowanie na ścieżce AIHubMix
| Zachowanie | Wyniki testów | Co zrobić |
|---|---|---|
Niestandardowe type w obiektach błędów Responses |
error.type w odpowiedziach 4xx to Aihubmix_api_error, podczas gdy ten sam rodzaj błędu w Messages zwraca kanoniczne invalid_request_error |
Rozgałęziaj logikę na podstawie kodu statusu HTTP, a nie ciągu error.type |
| Tokeny myślenia liczone jako 0 w Messages | Odpowiedź zawiera blok thinking, ale usage.output_tokens_details.thinking_tokens zawsze wynosi 0, co przeczy faktycznie wygenerowanej treści myślenia; zgodnie z kontraktem Anthropic, z którym się integrujemy, to pole jest wymagane i powinno być ≤ output_tokens |
Do rozliczania kosztu myślenia używaj completion_tokens_details.reasoning_tokens w Chat lub output_tokens_details.reasoning_tokens w Responses |
Messages zwraca model jako deepseek-v4-pro |
Żądanie wysyła deepseek-v4-pro-0813, a odpowiedź zwraca deepseek-v4-pro. Przyczyną jest nazewnictwo: jedyną oficjalną nazwą modelu API DeepSeek jest deepseek-v4-pro, a 0813 to jego etykieta wersji |
Nie opieraj sprawdzeń routingu modeli ani przypisywania zużycia wyłącznie na polu model w odpowiedzi |
9.3 Nieokreślone przez DeepSeek, więc brak werdyktu
Wysłanie wartości spoza enum dla reasoning_effort (np. bogus_xyz) zwraca 200 z normalną odpowiedzią, bez błędu i bez zauważalnego efektu. Fakt jest dość jasny: ta ścieżka obecnie nie waliduje enum reasoning_effort. Niejasne jest natomiast, czy powinna: DeepSeek publikuje dozwolony enum, ale nigdy nie stwierdza, czy niedozwolony poziom powinien zostać odrzucony, więc nie ma punktu odniesienia do oceny; dlatego nie traktujemy tego ani jako oficjalnego zachowania, ani jako defektu na naszej ścieżce. Bezpieczne podejście po stronie klienta: sam waliduj poziom i nie licz na to, że API to wychwyci.
10. Macierz wsparcia: możliwości × API
Poniższe komórki podają zapis parametru / pola dla każdego API. Poza miejscami oznaczonymi jako wyraźne sformułowanie DeepSeek, każdy wniosek pochodzi z rzeczywistych wywołań wykonanych 2026-08-13 na produkcyjnych API AIHubMix.
| Możliwość | Chat Completions | Responses | Messages |
|---|---|---|---|
| Podstawowy czat / instrukcje systemowe | ✅ messages |
✅ input + instructions |
✅ messages + system na najwyższym poziomie |
| Streaming | ✅ stream + stream_options |
✅ stream (response.created … response.completed) |
✅ stream (message_start … message_stop) |
| Limit wyjścia | ✅ max_tokens (400 po przekroczeniu, limit 393216) |
✅ max_output_tokens |
✅ max_tokens |
| Wyłączanie myślenia | ✅ thinking: {"type": "disabled"} |
✅ reasoning: {"effort": "none"} |
✅ thinking: {"type": "disabled"} |
| Poziom myślenia | 🟡 reasoning_effort przyjmowane, bez rozróżnialnego sygnału |
✅ reasoning.effort (potwierdzalne tylko none) |
🟡 output_config.effort przyjmowane, nic nie odsyłane |
| Zwracanie treści myślenia | ✅ pole reasoning_content |
✅ element wyjściowy reasoning |
✅ blok treści thinking |
| Obowiązkowe przekazywanie historii myślenia | ✅ brak reasoning_content → 400 |
✅ brak elementu reasoning → 400 |
✅ brak bloku thinking → 400 |
| Wywoływanie narzędzi | ✅ zagnieżdżone tools + nazwany tool_choice |
✅ płaskie tools |
✅ input_schema + tool_choice: {"type":"any"} |
Wymuszanie wywołania przez required |
❗ 400 przy włączonym myśleniu; najpierw wyłącz myślenie | ❗ tak samo jak po lewej | ✅ {"type": "any"} |
| Równoległe wywoływanie narzędzi (nie do wyłączenia) | ➖ brak takiego pola w oficjalnym API Chat | ❗ DeepSeek stwierdza, że parallel_tool_calls jest ignorowane, a równoległe wywoływanie jest zawsze włączone |
❗ DeepSeek stwierdza, że disable_parallel_tool_use jest ignorowane; testy nadal zwracają dwa bloki tool_use |
| Structured output | ✅ response_format (json_object) |
✅ text.format (json_schema + strict) |
➖ brak pola protocol; schemat należy przekazać w narzędziu |
| Automatyczne rozliczanie trafień w cache | ✅ usage.prompt_tokens_details.cached_tokens |
✅ usage.input_tokens_details.cached_tokens |
✅ usage.cache_read_input_tokens |
| logprobs | ❗ podwójny kanał: content + reasoning_content |
✅ top_logprobs tylko w ostatnim elemencie tekstowym |
➖ |
| Wyszukiwanie w sieci | ➖ w oficjalnym Chat API nie ma pola wyszukiwania; wysłanie go nie uruchamia wyszukiwania | ✅ tools: [{"type": "web_search"}] |
✅ web_search_20250305 |
| Sekwencje zatrzymania | ✅ stop |
➖ w protokole nie ma pola sekwencji zatrzymania (długość ogranicza wyłącznie max_output_tokens) |
✅ stop_sequences (stop_reason: "stop_sequence") |
Legenda: ✅ zweryfikowane jako działające · 🟡 zaakceptowane, ale nie można potwierdzić skuteczności · ❗ wymaga uwagi (zob. notatki powyżej) · ➖ brak takiego pojęcia w tym API
FAQ
Które API obsługuje deepseek-v4-pro-0813 w AIHubMix?
Chat Completions (/v1/chat/completions), Responses (/v1/responses) oraz kompatybilne z Claude Messages API (/v1/messages).
Dlaczego rozmowa wieloetapowa nagle zwraca 400?
Najczęstszą przyczyną jest brak przekazania historii myślenia. W trybie thinking treść myślenia z poprzedniej tury musi zostać odesłana dosłownie: reasoning_content w wiadomości asystenta dla Chat, element wyjścia type="reasoning" dla Responses oraz blok treści thinking dla Messages. Najbardziej problematyczne są rozmowy wieloetapowe z narzędziami — wiele frameworków filtruje elementy wyjścia według type == "message" podczas budowania historii, co usuwa element reasoning.
Czy można wyłączyć myślenie?
Tak. Wyślij thinking: {"type": "disabled"} w Chat lub Messages oraz reasoning: {"effort": "none"} w Responses. Po wyłączeniu znikają zarówno treść myślenia, jak i tokeny myślenia.
Czy trzy poziomy reasoning_effort różnią się między sobą?low / high / max są wszystkie akceptowane (domyślnie high; medium i xhigh są mapowane na high dla zgodności). W testach liczba tokenów myślenia dla tego samego pytania nie wykazuje monotonicznej różnicy między poziomami, a nic nie jest zwracane z powrotem, więc różnicy nie da się potwierdzić po stronie wywołującego. Tylko poziom none w Responses (wyłączone myślenie) daje wyraźnie zauważalną różnicę.
Dlaczego tool_choice: "required" zwraca 400?
Ta wartość nie jest akceptowana, gdy myślenie jest włączone (treść błędu brzmi Thinking mode does not support this tool_choice). Aby wymusić konkretne wywołanie przy włączonym myśleniu, użyj nazwanego tool_choice ({"type": "function", "function": {"name": "..."}}) albo najpierw wyłącz myślenie, a następnie użyj required.
Jak włączyć cache kontekstu?
Nie trzeba — działa automatycznie. Umieść stałą, niezmienną treść (prompty systemowe, fragmenty wiedzy, definicje narzędzi) na początku żądania, a liczbę trafień znajdziesz w usage: prompt_tokens_details.cached_tokens w Chat, input_tokens_details.cached_tokens w Responses oraz cache_read_input_tokens w Messages.
Ceny i aktualny status znajdziesz na stronie modelu deepseek-v4-pro-0813; więcej modeli znajdziesz w galerii modeli.
Powiązane przewodniki praktyczne: przewodnik po Kimi K3 (nowe parametry i macierz obsługi trzech API) oraz zmiany w cache promptów i rozliczaniu GPT-5.6.



