Blog
跳至主要內容

事件報告:vLLM Embeddings 因 encoding_format 參數失效

Sameer Kankute
SWE @ LiteLLM (LLM Translation)
Krrish Dholakia
CEO, LiteLLM
Ishaan Jaffer
CTO, LiteLLM

日期: 2026 年 2 月 16 日 持續時間: 約 3 小時 嚴重性: 高(針對 vLLM embeddings 使用者) 狀態: 已解決

摘要

一個原本用來修正 OpenAI SDK 行為的提交(dbcae4a)因為在 API 請求中明確傳入 encoding_format=None,導致 vLLM embeddings 失效。vLLM 會拒絕此項並顯示錯誤:"unknown variant \`, expected float or base64"`。

  • vLLM embedding 呼叫: 完全失敗 - 所有請求都被拒絕
  • 其他提供者: 無影響 - OpenAI 與其他提供者皆正常運作
  • 其他 vLLM 功能: 無影響 - 只有 embeddings 受影響

背景

embeddings 的 encoding_format 參數會指定向量應以 float 陣列或 base64 編碼字串回傳。不同提供者的預期不同:

  • OpenAI SDK: 若省略 encoding_format,SDK 會加入預設值 "float"
  • vLLM: 嚴格驗證 encoding_format - 只接受 "float""base64",或完全省略。會拒絕 None 或空字串值。

根本原因

一個出於好意、用來修正 OpenAI SDK 行為的修補,無意間破壞了 vLLM embeddings:

破壞性變更(dbcae4a):

litellm/main.py 中,程式碼被改為明確設定 encoding_format=None,而不是省略它:

# Added in dbcae4a
if encoding_format is not None:
optional_params["encoding_format"] = encoding_format
else:
# Omitting causes openai sdk to add default value of "float"
optional_params["encoding_format"] = None

這個修正對 OpenAI 運作正常——明確傳入 None 可防止 SDK 加入其預設值。然而,vLLM 嚴格的參數驗證會拒絕 None 值,導致所有 embedding 請求失敗。


修正

修正已部署(55348dd)。此解法會在將請求送往 OpenAI 類提供者(包括 vLLM)之前,從 optional_params 中過濾掉 None 和空字串值。

litellm/llms/openai_like/embedding/handler.py 中:

# Before (broken)
data = {"model": model, "input": input, **optional_params}

# After (fixed)
filtered_optional_params = {k: v for k, v in optional_params.items() if v not in (None, '')}
data = {"model": model, "input": input, **filtered_optional_params}

這可確保:

  • 保留並傳送有效值("float""base64"
  • 過濾掉 None 和空字串值(完全省略參數)
  • OpenAI SDK 不再加入預設值,因為 liteLLM 已在上游處理此參數

修復措施

#動作狀態程式碼
1在 OpenAI 類 embedding handler 中過濾 None 和空字串值✅ 完成handler.py#L108
2參數過濾的單元測試(None、空字串、有效值)✅ 完成test_openai_like_embedding.py
3hosted_vllm embedding 組態的轉換測試✅ 完成test_hosted_vllm_embedding_transformation.py
4使用實際 vLLM 端點的 E2E 測試✅ 完成test_hosted_vllm_embedding_e2e.py
5驗證 JSON payload 結構符合 vLLM 預期✅ 完成測試會驗證傳送至端點的 JSON 完全一致

🚅
LiteLLM Enterprise
為正式環境打造的 SSO/SAML、稽核記錄、支出追蹤、多團隊管理與防護欄。
深入瞭解 →