將程式開發工作階段的每個步驟都發送給同一個模型是最簡單的路由策略,通常也是最昂貴的。本教學展示如何在 TokenLab 上使用 DeepSeek V4 API 進行程式開發,並透過在 deepseek-v4-pro 與 deepseek-v4-flash 之間分配工作來優化成本。我們於 2026-10-03 從即時 API 讀取了兩個模型的記錄,以下所有內容均來自這些記錄與 TokenLab 文件。你將獲得比較表、成本估算範例、工具呼叫請求、重試與備援程式碼,以及預檢檢查。
重點摘要
- 兩個模型均列出 1,000,000 token 的輸入限制、384,000 token 的輸出限制,以及相同的三種請求格式。價格是兩者之間的主要差異。
- 以牌價計算,
deepseek-v4-pro的每個輸入 token 成本是deepseek-v4-flash的 4.4 倍,每個輸出 token 則是 3.3 倍。 - 在我們的 20 次呼叫範例中,將 4 次呼叫路由至 pro、16 次路由至 flash,離峰成本約為 $0.18。若 20 次全部發送至 pro,成本則約為 $0.46。
- 針對
429錯誤,請在Retry-After指定的時間後重試。僅在retryable為true時重試500–504錯誤。切勿重試400、401、402、403、404或413。 - 目錄顯示
deepseek-v4.1-flash為啟用狀態。deepseek-v4-pro與deepseek-v4-flash皆未指定替代模型。 - 在進行路由前,請先從
GET /v1/models/:model讀取限制、格式與價格。請勿硬編碼複製來的表格。
DeepSeek V4 API 程式開發:目錄說明
我們於 2026-10-03 獲取了兩份記錄。下表對兩者進行了並排比較。價格為每 100 萬 token 的美元金額,目錄定價最後更新於 2026-10-02T16:53:30.068Z。
| 項目 | deepseek-v4-pro |
deepseek-v4-flash |
來源,觀察於 2026-10-03 |
|---|---|---|---|
| 上下文限制 (最大輸入 token) | 1,000,000 | 1,000,000 | pro, flash |
| 輸出限制 (最大輸出 token) | 384,000 | 384,000 | pro, flash |
| 接受的請求格式 | anthropic_messages, openai_chat_completions, openai_responses |
anthropic_messages, openai_chat_completions, openai_responses |
pro, flash |
| 功能 | json-mode, prompt-cache, tool-use |
json-mode, prompt-cache, tool-use |
pro, flash |
| 離峰輸入 | $0.66 | $0.15 | pro, flash |
| 離峰輸出 | $1.98 | $0.60 | pro, flash |
| 離峰快取讀取 | $0.022 | $0.003 | pro, flash |
| 離峰快取寫入 | $0.66 | 未列出 | pro, flash |
| 尖峰輸入 | $1.32 | $0.30 | pro, flash |
| 尖峰輸出 | $3.96 | $1.20 | pro, flash |
| 尖峰快取讀取 | $0.044 | $0.006 | pro, flash |
| 生命週期階段 | active, 發布於 2026-04-24 | active, 發布於 2026-04-24 | pro, flash |
每份記錄中的預設價格區塊皆與離峰項目相符。尖峰時段因記錄而異。對於 deepseek-v4-pro,尖峰價格適用於北京時間 09:00-12:00 與 14:00-18:00。對於 deepseek-v4-flash,記錄顯示尖峰時段適用於工作日,不含中國公眾假期。它指出離峰時段包含週末與這些假期,但未提供具體時間。在圍繞 flash 時段進行預算規劃前,請務必檢查定價端點。
生命週期與較新的 DeepSeek 模型
兩份記錄皆顯示 lifecycle stage active,且 replacement model、deprecated_at 與 retired_at 均為空。因此,目錄中並未安排移除任何模型,也沒有為兩者指定後繼者。
目錄中也列出了 deepseek-v4.1-flash。其記錄(觀察於 2026-10-03)顯示為啟用狀態,無發布日期且無替代模型。它與 deepseek-v4-flash 具有相同的限制、格式與牌價。它在功能列表中增加了 reasoning 與 vision,並顯示離峰快取寫入價格為 $0.15。
由於這是不同的模型 ID,本文將維持原主題。我們建議在將 deepseek-v4.1-flash 替換進你的任務前,先進行測試。目錄中也列出了 deepseek-v4-flash-vision-exp,但我們未讀取其記錄。若有需要,請在 Models 頁面進行驗證。
依任務路由 deepseek-v4-pro 與 deepseek-v4-flash
想像一個代理程式工作階段,規劃跨五個模組的變更、編寫編輯內容,然後產生一打測試存根(test stubs)。第一個步驟需要最多的上下文與謹慎度。最後一個步驟則是重複性高且重做成本低廉的。目錄無法告訴你品質界線在哪裡。觀察於 2026-10-03 的 TokenLab 程式開發代理模型指南指出,排行榜結果無法預測模型遵循你個人指令與工具的能力。
我們的啟發式起點假設較昂貴的模型在跨檔案工作上能發揮其價值。請將此視為待驗證的假設,而非結論:
+-------------------------------------------------------------+
| 傳入任務 |
+-------------------------------------------------------------+
|
[任務是否涉及多檔案上下文、
向後相容性或安全性審查?]
|
+---------------+---------------+
| |
[是] [否]
| |
v v
deepseek-v4-pro deepseek-v4-flash
將步驟推向 deepseek-v4-pro 的準則:
- 修改跨多個匯入檔案的邏輯。
- 安全性或漏洞評估。
- 對公開介面的嚴格向後相容性。
- 準確性比處理速度更重要的多輪工作。
獨立的測試腳手架、結構格式化、文件字串(docstrings)與語法補全則交給 deepseek-v4-flash。
若要測試此啟發式方法,請遵循同一指南。為每個模型提供相同的儲存庫狀態、指令、工具與時間限制。然後比較正確性、測試通過率、不必要的變更、總 token 數、最終成本,以及人工介入的頻率。依任務類型保留結果,因為某個模型可能審查表現良好,但實作表現不佳。
估算程式開發代理迴圈成本
代理程式會在每次呼叫時重新發送指令、歷史記錄、程式碼與工具結果。觀察於 2026-10-03 的 成本指南指出,長工作階段的成本可能遠高於單次聊天請求。我們根據牌價進行了以下算術運算。結果僅為估算值,非實際帳單。
假設(我們設定的,非實際測量): 一個包含 20 次模型呼叫的迴圈,每次包含 30,000 個輸入 token 與 1,500 個輸出 token。總計為 600,000 個輸入 token 與 30,000 個輸出 token。
公式為 input_tokens / 1M × 輸入價格 + output_tokens / 1M × 輸出價格。價格來自上表。
20 次呼叫皆使用 deepseek-v4-pro:
- 離峰:0.6 × $0.66 = $0.396 輸入,加上 0.03 × $1.98 = $0.0594 輸出,總計 $0.4554。
- 尖峰:0.6 × $1.32 = $0.792,加上 0.03 × $3.96 = $0.1188,總計 $0.9108。
20 次呼叫皆使用 deepseek-v4-flash:
- 離峰:0.6 × $0.15 = $0.09,加上 0.03 × $0.60 = $0.018,總計 $0.108。
- 尖峰:0.6 × $0.30 = $0.18,加上 0.03 × $1.20 = $0.036,總計 $0.216。
混合:4 次呼叫使用 pro,16 次使用 flash。 Pro 承載 120,000 個輸入與 6,000 個輸出 token。Flash 承載 480,000 個輸入與 24,000 個輸出 token。
- 離峰:pro 為 0.12 × $0.66 + 0.006 × $1.98 = $0.0792 + $0.01188 = $0.09108。Flash 為 0.48 × $0.15 + 0.024 × $0.60 = $0.072 + $0.0144 = $0.0864。總計為 $0.17748。
- 尖峰:pro 為 0.12 × $1.32 + 0.006 × $3.96 = $0.1584 + $0.02376 = $0.18216。Flash 為 0.48 × $0.30 + 0.024 × $1.20 = $0.144 + $0.0288 = $0.1728。總計為 $0.35496。
| 情境 | 離峰估算 | 尖峰估算 |
|---|---|---|
20 次呼叫使用 deepseek-v4-pro |
$0.4554 | $0.9108 |
20 次呼叫使用 deepseek-v4-flash |
$0.1080 | $0.2160 |
| 4 pro + 16 flash | $0.1775 | $0.3550 |
估算值基於 2026-10-03 觀察到的牌價 (pro, flash)。
快取變體(離峰,假設:80% 的輸入 token 為快取讀取)。 這意味著每個迴圈有 480,000 個快取讀取 token 與 120,000 個未快取 token。
- Pro:0.48 × $0.022 = $0.01056,加上 0.12 × $0.66 = $0.0792,加上 $0.0594 輸出,總計 $0.14916。
- Flash:0.48 × $0.003 = $0.00144,加上 0.12 × $0.15 = $0.018,加上 $0.018 輸出,總計 $0.03744。
此變體以一般輸入價格計算未快取 token,並忽略 flash 的快取寫入費用(記錄中未列出)。在依賴此折扣前,請確認回應中或 Usage 中的快取 token 數量。計費指南亦警告,每個 token 的最低價格並不總是代表每個完成任務的最低成本,因為重試會增加成本。
程式開發代理的工具呼叫請求
兩份記錄皆列出 tool-use,且皆接受 openai_chat_completions。以下請求僅使用 工具呼叫指南(觀察於 2026-10-03)中的欄位:model、messages 與包含 type: "function" 的 tools。我們加入了 max_tokens,計費指南將其列為限制回應長度的方式。我們省略了 tool_choice,因為該指南僅針對 Responses 格式記錄了此欄位。
curl https://api.tokenlab.sh/v1/chat/completions \
-H "Authorization: Bearer $TOKENLAB_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "deepseek-v4-pro",
"max_tokens": 2000,
"messages": [
{"role": "system", "content": "You are a software engineering assistant."},
{"role": "user", "content": "The pagination test in tests/test_api.py fails. Find the cause."}
],
"tools": [
{
"type": "function",
"function": {
"name": "read_file",
"description": "Read a file from the repository",
"parameters": {
"type": "object",
"properties": {"path": {"type": "string"}},
"required": ["path"]
}
}
},
{
"type": "function",
"function": {
"name": "run_tests",
"description": "Run the test suite for one path",
"parameters": {
"type": "object",
"properties": {"path": {"type": "string"}},
"required": ["path"]
}
}
}
]
}'
模型會在 tool_calls 中傳回函式名稱與參數。你的後端執行該工具。迴圈接著分五個步驟執行:
- 發送訊息與工具定義。
- 讀取回應以取得
tool_calls。 - 在你的後端執行工具。
- 以相同的 API 格式附加工具結果。
- 持續進行直到模型傳回最終答案。
指南未顯示工具結果訊息的內聯形狀。請參考 Create Chat Completion 參考文件 (/api-reference/chat/create-completion) 而非自行猜測。
在執行任何呼叫前,請驗證參數並套用你自己的權限檢查。確保執行具有冪等性(idempotent),因為客戶端重試可能會重複相同的工具呼叫。在整個交換過程中保持一種 API 格式,因為不同格式對工具狀態的表示方式不同。
兩模型間的重試、退避與備援
錯誤處理指南與速率限制指南(皆觀察於 2026-10-03)設定了此策略。請根據 HTTP 狀態碼與 code 進行分支,切勿根據 message。
| 狀態碼 | 重複相同請求? | 動作 |
|---|---|---|
400, 401, 402, 403, 404, 413 |
否 | 修正請求、金鑰、餘額、權限或輸入 |
429 |
是 | 等待 Retry-After;若不存在,使用帶有抖動(jitter)的指數退避 |
500–504 |
僅在 retryable 為 true 時 |
遵守 retry_after 並限制嘗試次數 |
| 回應前連線中斷 | 有時 | 若工具呼叫可能重複副作用,請謹慎重試 |
| 輸出到達後串流中斷 | 否 | 視為不完整;重複請求可能會產生不同輸出或二次收費 |
兩種情況需要額外注意。503 all_channels_failed 或 503 delivery_tier_unavailable 並非總是暫時性的。當 retryable 為 false 且 retry_after 遺失時,請勿重複請求。在選擇另一個模型前,請檢查 GET /v1/models。此外,context_length_exceeded 無法透過切換這兩個模型來解決,因為兩者皆列出相同的 1,000,000 token 輸入限制。
以下程式碼套用了該策略。它將 max_retries=0,以確保 SDK 不會在背後自動重試。每個模型有四次嘗試機會,備援機制僅在第一個模型耗盡所有可重試錯誤後才會執行。
import os
import random
import time
from openai import OpenAI, APIStatusError, APIConnectionError
client = OpenAI(
api_key=os.environ["TOKENLAB_API_KEY"],
base_url="https://api.tokenlab.sh/v1",
timeout=30.0,
max_retries=0,
)
FALLBACK = {
"deepseek-v4-pro": "deepseek-v4-flash",
"deepseek-v4-flash": "deepseek-v4-pro",
}
def error_fields(exc):
body = getattr(exc, "body", None)
if isinstance(body, dict):
return body.get("error", body)
return {}
def backoff(attempt):
return min(30, 2 ** attempt + random.random())
def retry_delay(exc, attempt):
"""等待秒數,若請求不得重複則傳回 None。"""
if isinstance(exc, APIConnectionError):
return backoff(attempt)
fields = error_fields(exc)
header = exc.response.headers.get("Retry-After")
if exc.status_code == 429:
return float(header) if header else backoff(attempt)
if exc.status_code >= 500 and fields.get("retryable") is True:
wait = fields.get("retry_after") or header
return float(wait) if wait else backoff(attempt)
return None
def chat_with_fallback(model, messages, tools=None, attempts=4):
last_exc = None
for candidate in (model, FALLBACK[model]):
kwargs = {"model": candidate, "messages": messages}
if tools:
kwargs["tools"] = tools
for attempt in range(attempts):
try:
return candidate, client.chat.completions.create(**kwargs)
except (APIStatusError, APIConnectionError) as exc:
delay = retry_delay(exc, attempt)
if delay is None:
raise # 4xx 或不可重試的 5xx:請勿重複或備援
last_exc = exc
if attempt < attempts - 1:
time.sleep(delay)
print(f"{candidate} 耗盡重試次數,嘗試 {FALLBACK[candidate]}")
raise last_exc
def pick_model(is_complex):
return "deepseek-v4-pro" if is_complex else "deepseek-v4-flash"
used, response = chat_with_fallback(
pick_model(is_complex=False),
[{"role": "user", "content": "Write a pytest case: an empty list returns 0 for sum_items()."}],
)
print(used, response.choices[0].message.content)
務必記錄哪個模型回應了請求。程式開發代理指南警告,備援可能會改變價格、上下文限制、工具格式或輸出風格,因此當模型變更時請告知使用者。以牌價計算,從 flash 備援至 pro 大約會使輸入成本增加四倍,因此請對此發出警示。每次呼叫時請儲存回應標頭中的 Request ID,以便支援團隊追蹤失敗原因。
路由前讀取限制、格式與價格
取得模型參考文件(觀察於 2026-10-03)描述了 GET /v1/models/:model。回應包含一個 tokenlab 物件,其中有 capabilities、pricing、max_input_tokens、max_output_tokens、accepted_request_formats 與 lifecycle。未知模型會傳回 404 model_not_found。計費指南亦指出可透過 GET /v1/models/:model/pricing 取得當前價格。
import json
import urllib.request
def read_model(model_id):
url = f"https://api.tokenlab.sh/v1/models/{model_id}"
with urllib.request.urlopen(url, timeout=10) as resp:
meta = json.load(resp)["tokenlab"]
return {
"max_input_tokens": meta.get("max_input_tokens"),
"max_output_tokens": meta.get("max_output_tokens"),
"formats": meta.get("accepted_request_formats"),
"capabilities": meta.get("capabilities"),
"lifecycle": meta.get("lifecycle"),
"pricing": meta.get("pricing"),
}
def preflight(model_id, input_tokens):
info = read_model(model_id)
problems = []
if "openai_chat_completions" not in (info["formats"] or []):
problems.append("chat completions not accepted")
if "tool-use" not in (info["capabilities"] or []):
problems.append("no tool-use capability")
if info["max_input_tokens"] and input_tokens > info["max_input_tokens"]:
problems.append("input exceeds max_input_tokens")
return info, problems
for model_id in ("deepseek-v4-pro", "deepseek-v4-flash"):
info, problems = preflight(model_id, input_tokens=30_000)
print(model_id, json.dumps(info, indent=2), problems)
我們將 lifecycle 與 pricing 原樣列印,因為本文證據未顯示其在回應中的確切 JSON 配置。請檢查一次輸出,然後解析你需要的欄位。文件建議不要硬編碼複製來的價格表,因此請在啟動時或按排程執行檢查。公開發現端點(如 GET /v1/models)有其自身的速率限制,因此請快取結果,而非每次請求都呼叫。
關於速率限制,標準 User 層級允許每個 API 金鑰每分鐘 1,000 次請求(觀察於 2026-10-03)。指南指出實際配置可能有所不同。遇到 429 時,請信任傳回的 X-RateLimit-Limit 與 Retry-After 值,而非任何複製來的數字。
常見問題 (FAQ)
我可以透過 Anthropic Messages 格式呼叫 deepseek-v4-pro 嗎?
可以。兩份記錄皆列出 anthropic_messages 為接受格式(觀察於 2026-10-03)。程式開發代理指南將 Anthropic Messages 的基礎 URL 給定為 https://api.tokenlab.sh,不帶 Chat Completions 使用的 /v1 後綴。工具架構因格式而異,因此請在整個對話中保持使用同一種格式。
我應該重試來自 deepseek-v4-pro 或 deepseek-v4-flash 的 503 錯誤嗎?
僅在錯誤主體顯示 retryable 為 true 時才重試,並等待 retry_after。帶有 retryable: false 的 503 all_channels_failed 意味著所選 Delivery 層級無供應量。重複請求無濟於事。在選擇另一個模型前,請檢查 GET /v1/models,如錯誤處理指南所述。
deepseek-v4.1-flash 會取代 deepseek-v4-flash 嗎?
目錄並未說明。於 2026-10-03,deepseek-v4-flash 記錄顯示無替代模型,且 deepseek-v4.1-flash 顯示啟用狀態。兩者共享限制與牌價,較新的版本增加了 reasoning 與 vision 功能。請在你的任務上進行測試,並透過模型 ID 有意識地切換。
快取 token 會讓 deepseek-v4-flash 在代理迴圈中更便宜嗎?
有可能。記錄列出離峰快取讀取價格為每 100 萬 token $0.003,而一般輸入為 $0.15。成本指南建議在依賴折扣前,先確認回應中或 Usage 中的快取 token 使用量。快取行為與價格因模型而異。
路由至 deepseek-v4-flash 會提高我的速率限制嗎?
不會。速率限制指南指出,較快的模型不會提高你帳戶的請求限制。模型速度、token 限制與帳戶速率限制是獨立的約束,且限制適用於每個 API 金鑰。
在連接你的路由器前,請檢查 TokenLab 模型頁面上當前的 deepseek-v4-pro 與 deepseek-v4-flash 項目。
來源
價格觀測於 2026-10-03
- TokenLab Docs: Quickstart觀測於 2026-10-03
- TokenLab Docs: Choose a model for coding agents觀測於 2026-10-03
- TokenLab Docs: Control coding agent costs觀測於 2026-10-03
- TokenLab Docs: Structured Outputs & Tool Calling觀測於 2026-10-03
- TokenLab Docs: Handle API errors觀測於 2026-10-03
- TokenLab Docs: Rate limits觀測於 2026-10-03
- TokenLab Docs: Get a Model觀測於 2026-10-03
- TokenLab Docs: Billing and pricing觀測於 2026-10-03



