Cách đặt mức độ suy luận của DeepSeek V4.1 Flash trên mọi API tương thích với OpenAI
Tác giả: Nicho
DeepSeek V4.1 Flash suy luận trước khi trả lời. Trừ khi bạn nói khác, mặc định là suy luận ở mức high. Bạn có thể đổi bằng một trường trong yêu cầu, reasoning_effort. Đây là một trường bình thường trong phần thân yêu cầu, nên bạn có thể đặt riêng cho từng yêu cầu qua bất kỳ endpoint nào truyền trường này đi, kể cả endpoint của chúng tôi. Bạn không cần model ID khác.
Bài viết này nói về bốn mức, mỗi mức tốn bao nhiêu trong một bài test chúng tôi chạy ngày 16 tháng 10 năm 2026, cách đặt trường này từ mã và từ các công cụ phổ biến, và cách kiểm tra xem một endpoint của bên thứ ba có thực sự truyền trường này đi không.
Bản ngắn gọn
Thêm reasoning_effort bên cạnh model:
curl https://api.cheapaimodel.ai/v1/chat/completions \
-H "Authorization: Bearer $CHEAPAIMODEL_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "deepseek-v4-1-flash",
"reasoning_effort": "low",
"messages": [{"role": "user", "content": "Summarize this changelog in three bullets: ..."}]
}'
| Giá trị | Tác dụng |
|---|---|
none |
Tắt suy luận. Mô hình trả lời ngay. |
low |
Suy luận ngắn. DeepSeek gợi ý cho các tác vụ đơn giản. |
high |
Mặc định. DeepSeek gợi ý cho công việc agent hằng ngày. |
max |
Suy luận dài nhất, cho các bài toán khó hơn. |
Bỏ trống trường này cũng giống như gửi high.
Mỗi mức tốn bao nhiêu
Chúng tôi gửi một câu hỏi toán có một đáp án đúng duy nhất tới https://api.cheapaimodel.ai/v1: có bao nhiêu cặp số nguyên dương (a, b) có thứ tự, cả hai đều không quá 100, sao cho a² + b² chia hết cho 13? (Đáp án là 1,491.) Mỗi mức chạy 8 lần, trừ none chạy 3 lần. Tất cả yêu cầu đều không streaming.
| Mức | Token suy luận trung bình | Khoảng | Thời gian trung bình | Đúng |
|---|---|---|---|---|
none |
0 | 0 | 14.0 s | 0 trên 3 |
low |
2,348 | 925–3,719 | 17.2 s | 7 trên 8 |
high |
3,081 | 2,232–3,629 | 20.4 s | 8 trên 8 |
max |
3,530 | 2,700–5,803 | 23.2 s | 7 trên 8 |
Token suy luận được tính như token đầu ra. Với giá V4.1 Flash của chúng tôi lúc chạy bài test, $0.84 mỗi triệu token đầu ra, một yêu cầu trung bình tốn khoảng $0.002 ở low và $0.003 ở max.
Điểm đáng chú ý:
- Tắt suy luận, mô hình sai mọi lần. Hai lần mô hình bỏ qua yêu cầu "chỉ trả lời bằng con số" và giải bài toán ngay trong câu trả lời hiển thị, tốn thời gian gần bằng lúc suy luận.
highvàmaxgần như ngang nhau ở câu hỏi này.maxchỉ tốn nhiều hơn rõ rệt một lần, khi mô hình chọn suy nghĩ lâu hơn hẳn (lần chạy 5,803 token).lowdùng ít hơnhighkhoảng một phần tư token và sai một lần.
Một câu hỏi không phải là một benchmark. Trước khi chọn mặc định, hãy chạy thử một mẫu prompt của bạn ở hai mức rồi so sánh usage.completion_tokens_details.reasoning_tokens và câu trả lời.
Đặt trường này từ mã
OpenAI Python SDK
import os
from openai import OpenAI
client = OpenAI(
base_url="https://api.cheapaimodel.ai/v1",
api_key=os.environ["CHEAPAIMODEL_API_KEY"],
)
completion = client.chat.completions.create(
model="deepseek-v4-1-flash",
reasoning_effort="low",
messages=[{"role": "user", "content": "Explain recursion in one sentence."}],
)
print(completion.choices[0].message.content)
print(completion.usage.completion_tokens_details.reasoning_tokens)
reasoning_effort là một đối số bình thường. Type hint của nó có none từ openai 2.8.0 và max từ 2.45.0, nên các phiên bản cũ hơn vẫn gửi được các giá trị đó nhưng trình kiểm tra kiểu sẽ báo lỗi. Nội dung suy luận nằm ở completion.choices[0].message.reasoning_content. Trường này không nằm trong kiểu của SDK, nhưng SDK giữ lại các trường thừa, nên thuộc tính vẫn dùng được.
OpenAI TypeScript SDK
import OpenAI from "openai";
const client = new OpenAI({
baseURL: "https://api.cheapaimodel.ai/v1",
apiKey: process.env.CHEAPAIMODEL_API_KEY,
});
const completion = await client.chat.completions.create({
model: "deepseek-v4-1-flash",
reasoning_effort: "max",
messages: [{ role: "user", content: "Explain recursion in one sentence." }],
});
'none' và 'max' kiểm tra kiểu được từ openai 6.46.0. reasoning_content cũng không nằm trong kiểu của SDK, nên để đọc trường này, hãy ép kiểu message sang kiểu ChatCompletionMessage của SDK giao với { reasoning_content?: string }.
Responses API
Responses API nhận cùng bốn giá trị bên trong một đối tượng reasoning:
response = client.responses.create(
model="deepseek-v4-1-flash",
reasoning={"effort": "low"},
input="Explain recursion in one sentence.",
)
print(response.output_text)
print(response.usage.output_tokens_details.reasoning_tokens)
Với "effort": "none", phản hồi không có mục suy luận nào và reasoning_tokens là 0.
Tắt suy luận
Có hai công tắc. reasoning_effort: "none" là công tắc dùng chung. DeepSeek cũng có object thinking riêng, được OpenAI Python SDK gửi qua extra_body:
completion = client.chat.completions.create(
model="deepseek-v4-1-flash",
messages=[{"role": "user", "content": "..."}],
extra_body={"thinking": {"type": "disabled"}},
)
Trong TypeScript SDK, thinking không có trong types. Thêm bằng comment // @ts-expect-error, đúng như README của SDK gợi ý cho các tham số chưa có tài liệu. Đừng dùng tùy chọn body theo từng yêu cầu cho việc này: tùy chọn đó thay thế toàn bộ body của yêu cầu thay vì thêm một trường.
Dùng một trong hai công tắc. Khi gửi cả hai, thinking thắng cả hai chiều: disabled với high không suy luận, còn enabled với none thì có.
Trong các framework
Chúng tôi trỏ từng thư viện vào một máy chủ nội bộ ghi lại yêu cầu và kiểm tra body thực tế được gửi đi. Mỗi thư viện đều có thể gửi trường này, nhưng nhiều thư viện có mặc định là không gửi.
LangChain (Python)
import os
from langchain_openai import ChatOpenAI
llm = ChatOpenAI(
model="deepseek-v4-1-flash",
base_url="https://api.cheapaimodel.ai/v1",
api_key=os.environ["CHEAPAIMODEL_API_KEY"],
reasoning_effort="low",
)
llm.invoke("Explain recursion in one sentence.", reasoning_effort="max") # per call
- Gửi
thinkingvớiextra_body={"thinking": {...}}. Đặt trongmodel_kwargssẽ báo lỗiTypeError. - Truyền
reasoning={"effort": ...}thay vìreasoning_effortsẽ âm thầm chuyểnChatOpenAIsang Responses API. ChatOpenAIloại bỏreasoning_content. Số token vẫn còn trongusage_metadata["output_token_details"]["reasoning"]. Nếu cần phần văn bản,ChatDeepSeektừlangchain-deepseektrả về trongadditional_kwargs["reasoning_content"].
LlamaIndex
import os
from llama_index.llms.openai_like import OpenAILike
llm = OpenAILike(
model="deepseek-v4-1-flash",
api_base="https://api.cheapaimodel.ai/v1",
api_key=os.environ["CHEAPAIMODEL_API_KEY"],
is_chat_model=True,
additional_kwargs={"reasoning_effort": "low"},
)
- Dùng
additional_kwargs. Hàm khởi tạo cũng có tham sốreasoning_effort=, nhưng tham số này chỉ được gửi cho các mô hình suy luận của chính OpenAI, nên với V4.1 Flash thì không có tác dụng gì. Nó cũng từ chối"max". thinkingđi xuống một cấp:additional_kwargs={"extra_body": {"thinking": {...}}}.
Vercel AI SDK
import { createOpenAICompatible } from "@ai-sdk/openai-compatible";
import { generateText } from "ai";
const cheapaimodel = createOpenAICompatible({
name: "cheapaimodel",
baseURL: "https://api.cheapaimodel.ai/v1",
apiKey: process.env.CHEAPAIMODEL_API_KEY,
});
const { text, reasoningText } = await generateText({
model: cheapaimodel("deepseek-v4-1-flash"),
prompt: "Explain recursion in one sentence.",
providerOptions: { cheapaimodel: { reasoningEffort: "low" } },
});
- Key trong
providerOptionslànamebạn đã đặt cho nhà cung cấp. ViếtreasoningEfforttheo camelCase:reasoning_effortở đó sẽ bị âm thầm bỏ qua. - AI SDK 7 cũng có tùy chọn
reasoning: "low"ở cấp cao nhất, gửi cùng trường đó. thinkinghoạt động dưới cùng key:providerOptions: { cheapaimodel: { thinking: { type: "disabled" } } }.
LiteLLM
import os
import litellm
response = litellm.completion(
model="openai/deepseek-v4-1-flash",
api_base="https://api.cheapaimodel.ai/v1",
api_key=os.environ["CHEAPAIMODEL_API_KEY"],
reasoning_effort="low",
messages=[{"role": "user", "content": "Explain recursion in one sentence."}],
)
- Giữ tiền tố
openai/. Vớideepseek/, LiteLLM biến effort thành công tắc bật/tắt của DeepSeek và bỏ mức, nênlowvàmaxđều thành "bật suy luận" như nhau. - Trên LiteLLM Proxy, đặt
reasoning_efforttronglitellm_paramscủa mô hình. Giá trị client gửi sẽ ghi đè giá trị đó.
Trong các công cụ lập trình và ứng dụng
Hầu hết công cụ chỉ gửi trường này nếu bạn yêu cầu. Nếu công cụ không gửi gì, DeepSeek chạy ở high.
| Công cụ | Đặt ở đâu | Các mức có thể đạt |
|---|---|---|
| Codex CLI | model_reasoning_effort trong config.toml |
cả bốn mức |
| Continue | requestOptions.extraBodyProperties trên mô hình |
cả bốn mức |
| Aider | --reasoning-effort, sau khi khai báo cài đặt (bên dưới) |
cả bốn mức |
| Open WebUI | Model → Advanced Params → Reasoning Effort, đặt thành Custom | cả bốn mức |
| Zed | reasoning_effort trên mô hình trong available_models |
cả bốn mức |
| OpenClaw | cài đặt compat của mô hình (bên dưới) |
cả bốn mức |
| n8n | OpenAI Chat Model → Options → Extra Body | cả bốn mức |
| Cline | Reasoning Effort trong cài đặt OpenAI Compatible, hoặc --thinking |
none, low, high |
| Dify | Reasoning effort, sau khi bật Thinking Mode Support (bên dưới) | none, low, high |
| Cursor | không khả dụng với Base URL tùy chỉnh | chỉ mặc định |
Đã thử nghiệm với Codex CLI 0.163.0, Continue CLI 1.5.47, Aider 0.86.2, Cline CLI 3.0.71 và OpenClaw 2026.10.4; đọc từ mã nguồn cho Open WebUI 0.12.2, Zed 1.24.2, plugin tương thích OpenAI API của Dify 0.0.68 và n8n 2.43.6.
Codex CLI chỉ nói chuyện với nhà cung cấp tùy chỉnh qua Responses API, nên gửi reasoning.effort. Cũng đặt model_reasoning_summary = "none". Nếu không, Codex thêm reasoning.summary, và V4.1 Flash trên cheapaimodel từ chối bằng 400.
model_reasoning_effort = "low"
model_reasoning_summary = "none"
Nếu bạn để model_reasoning_effort chưa đặt, banner của Codex ghi "reasoning effort: none", nhưng thực ra không gửi effort nào, nên mô hình chạy ở high.
Continue không có tùy chọn effort cho mô hình tương thích OpenAI, nhưng thêm mọi trường body bạn liệt kê:
models:
- name: DeepSeek V4.1 Flash
provider: openai
model: deepseek-v4-1-flash
apiBase: https://api.cheapaimodel.ai/v1
apiKey: YOUR_API_KEY
requestOptions:
extraBodyProperties:
reasoning_effort: low
Aider bỏ qua --reasoning-effort với những mô hình chưa biết và in cảnh báo. Khai báo cài đặt trong .aider.model.settings.yml:
- name: openai/deepseek-v4-1-flash
accepts_settings: ["reasoning_effort"]
Rồi chạy aider --model openai/deepseek-v4-1-flash --reasoning-effort low, hoặc gõ /reasoning-effort low trong chat. Đừng đặt trường đó trực tiếp trong extra_params: Aider sẽ bỏ nó ở đó.
OpenClaw coi mọi Base URL tùy chỉnh là proxy và không gửi effort trừ khi mục mô hình nói rằng có thể. Thêm các trường này vào mục từ hướng dẫn OpenClaw của chúng tôi:
{
id: "deepseek-v4-1-flash",
// ...the rest of the entry
reasoning: true,
compat: {
supportsUsageInStreaming: true,
supportsReasoningEffort: true,
supportedReasoningEfforts: ["none", "low", "high", "max"],
},
}
Rồi đặt mặc định trong agents.defaults.models["cheapaimodel/deepseek-v4-1-flash"].params.thinking, ví dụ "high". Không có thì phiên mới bắt đầu ở low, và OpenClaw làm tròn xuống các mức không có trong danh sách, nên medium thành low.
n8n chỉ hiện tùy chọn Reasoning Effort có sẵn cho tên mô hình OpenAI. Dùng Extra Body thay thế, và khớp trường với API mà node dùng. Khi bật Use Responses API, mặc định, ghi {"reasoning": {"effort": "low"}}. Khi tắt, ghi {"reasoning_effort": "low"}.
Dify là cái cần để ý. Với Thinking Mode Support mặc định, "Only Non-Thinking Mode", Dify không gửi effort và chỉ ẩn phần suy luận khỏi phản hồi. Mô hình vẫn suy luận ở high, và bạn vẫn trả tiền cho những token đó. Muốn thực sự tắt suy luận, chọn chế độ có thinking và đặt Reasoning effort thành none.
Cursor không gửi effort cho mô hình sau Base URL tùy chỉnh, nên chúng chạy ở high.
Trên các endpoint tương thích OpenAI khác
Mọi thứ ở trên áp dụng cho bất kỳ nhà cung cấp nào phục vụ V4.1 Flash sau Base URL tương thích OpenAI. Điều khác nhau là endpoint làm gì với trường đó. Trước khi bạn dựa vào nó:
- Kiểm tra xem có nhận được không. Gửi cùng một prompt với
nonevà vớimax. Vớinone,reasoning_tokensphải là 0 và tin nhắn không được córeasoning_content. Nếu cả hai yêu cầu trả về giống nhau, endpoint đang bỏ qua trường này và bạn đang nhận giá trị mặc định. - Kiểm tra danh sách mô hình. Một số gateway tách mỗi mức thành một model ID riêng, ví dụ có hậu tố
-maxhoặc-none. Nếu gateway của bạn làm vậy, hãy dùng các ID đó. cheapaimodel chỉ có một ID,deepseek-v4-1-flash, và trường này quyết định. - Kiểm tra xem gõ sai thì sao. Trên cheapaimodel,
"reasoning_effort": "turbo"trả về400kèm"code": "InvalidParameter", nên gõ sai sẽ báo lỗi rõ ràng. Một endpoint bỏ qua các giá trị không nhận ra sẽ âm thầm chạy ở mức mặc định. - Chỉ dùng
none,low,highvàmax. API của chính DeepSeek cũng chấp nhậnminimal,mediumvàxhighcủa OpenAI và ánh xạ sang mức gần nhất, nhưng không phải endpoint nào cũng ánh xạ giống nhau. Trong thử nghiệm của chúng tôi,minimalhành xử giốnghighhơn làlow. - Đừng cho rằng các quy tắc giống nhau. Các nhà cung cấp phục vụ cùng một mô hình vẫn khác nhau ở chi tiết. Tài liệu của DeepSeek nói API trả về
400chotool_choice: "required"ở chế độ tư duy và cho các cuộc trò chuyện dùng tool mà bỏreasoning_content. Trên cheapaimodel, cả hai yêu cầu đều chạy được trong thử nghiệm của chúng tôi. Hãy viết mã để chạy được theo quy tắc chặt hơn.
Ba điều khiến mọi người vấp
max_tokens bao gồm cả phần suy luận
Với reasoning_effort: "high" và max_tokens: 100, chúng tôi nhận được finish_reason: "length" và content rỗng. Cả 100 token đều dồn vào suy luận. Nếu bạn giới hạn output, hãy chừa chỗ cho phần này. Khi bạn không đặt max_tokens, API của DeepSeek mặc định là 64K ở chế độ tư duy và 128K ở max.
Giữ reasoning_content trong cuộc trò chuyện dùng tool
Khi mô hình gọi tool, tin nhắn của mô hình mang theo reasoning_content cùng với tool_calls. API của DeepSeek yêu cầu bạn gửi lại nguyên vẹn trong mọi yêu cầu sau đó của cuộc trò chuyện. Với OpenAI Python SDK, chỉ cần thêm đối tượng tin nhắn trả về là làm được:
messages.append(completion.choices[0].message)
Các thư viện khác nhau ở điểm này. OpenAI SDK, LiteLLM với tiền tố openai/, và Vercel AI SDK giữ reasoning_content khi bạn gửi lại tin nhắn trả về. ChatOpenAI và ChatDeepSeek của LangChain và OpenAILike của LlamaIndex bỏ phần này khỏi yêu cầu tiếp theo. Trên cheapaimodel, bỏ phần này không gây lỗi trong thử nghiệm của chúng tôi, nhưng trên một endpoint thực thi quy tắc của DeepSeek, yêu cầu sẽ báo lỗi 400.
Trong cuộc trò chuyện không dùng tool, bạn không cần gửi lại. DeepSeek bỏ qua phần này.
Temperature không điều khiển suy luận
Ở chế độ tư duy, temperature không có tác dụng, và top_p dưới 0.95 được coi là 0.95. Muốn câu trả lời nhanh hơn hoặc kỹ hơn, hãy đổi mức effort.
Kiểm tra trên cheapaimodel
Mở Nhật ký trong bảng điều khiển và nhấn vào một yêu cầu. Nếu bạn đã gửi reasoning_effort, phần chi tiết sẽ hiển thị dưới Reasoning effort. Nếu không có dòng đó, yêu cầu đã chạy ở mức mặc định, high.
Giá và giới hạn context nằm ở trang mô hình DeepSeek V4.1 Flash. Muốn lấy key và gọi lần đầu, xem Bắt đầu nhanh. Tài liệu tham khảo của chính DeepSeek là hướng dẫn chế độ tư duy.