Grok API 文字浮水印:用 x-watermark 確認回應,讓快取保留來源
本文目錄
如果你的服務只從 Grok API 取出文字再存進資料庫,日後就少了一個可追溯的訊號:原始回應的 x-watermark。應在 API 用戶端讀取它,並與該次請求的產物一起保存。日後從快取取出的文字,要沿用產生當下的紀錄。
依 xAI 官方文件,自 2026 年 11 月 7 日起,grok-4.7、4.6、4.5、4.3 與 grok-4.20 的 reasoning、non-reasoning、multi-agent 版本預設啟用文字浮水印。Responses 與 Chat Completions 都涵蓋一般文字、結構化輸出與工具呼叫參數。浮水印是在生成時影響 token 選擇,回應中沒有額外的隱藏字元可搜尋。
在 HTTP 邊界讀取 x-watermark
下例需要 Node.js 22 以上、可呼叫 grok-4.7 的 API 金鑰,以及連往官方端點的網路。它以固定的非敏感文字發出一筆請求,只印出觀測結果;呼叫真實端點會使用 API 額度。本文以本機假回應驗證標頭處理,未呼叫付費端點。
const apiKey = process.env.XAI_API_KEY;if (!apiKey) throw new Error("Set XAI_API_KEY first");
const model = "grok-4.7";const response = await fetch("https://api.x.ai/v1/responses", { method: "POST", headers: { Authorization: `Bearer ${apiKey}`, "Content-Type": "application/json", }, body: JSON.stringify({ model, input: "Name one tide pool animal." }),});
if (!response.ok) throw new Error(`Grok API HTTP ${response.status}`);
const rawWatermark = response.headers.get("x-watermark");console.log({ model, upstreamObserved: true, watermarkAtGeneration: rawWatermark === "true",});await response.json();對直接取得的官方成功回應,true 表示該次生成有浮水印;其他值或沒有標頭都表示沒有。若應用程式只看得到代理重組後的 JSON,缺值的意義不同:它無法得知代理是否保留了上游標頭。這時應把觀測值記為 null,等代理在接收上游回應時補記。
讓快取保留生成時的觀測值
在寫入快取時,把布林值或 null 跟產物放在一起,另外記錄請求模型、生成時間與內部請求 ID。快取命中只回傳已保存的值;歷史快取沒有紀錄就維持未知。當回應被摘要、翻譯或合併,欄位仍只描述原始生成事件,無法用來判定改寫後的文字。xAI 的文字偵測是另一項須申請的服務。
驗收可以用三筆假回應:上游有 x-watermark: true、上游成功但沒有標頭、只有代理重組的內容。三筆應分別存成 true、false、null;再從快取讀回,確認三種狀態沒有被合併。若同時要處理上游錯誤,可參考 API 事故的請求與回應分界。
團隊設定變更後,送一筆跳過快取的新請求
官方 Console 的 Model output watermarking 由 team admin 依模型管理,同一團隊的 API 金鑰都受影響。文件說明部分模型可能鎖定;關閉時 Console 會要求確認適用的法律例外。設定變更在五分鐘內套用到新請求,並寫進團隊 Audit Log。
已核准變更時,記錄團隊與模型,等生效後在相同上游端點送一筆跳過應用快取的新請求。比對直接取得的標頭、應用程式存的欄位與 Audit Log。這能將團隊設定、代理轉送和舊快取三個問題分開。
參考資料: