按模型和功能追蹤 OpenAI API 成本
要追蹤 OpenAI API 成本,記錄權杖使用情況、型號、延遲、重試和估計請求成本以及引發呼叫的產品功能和客戶。這會將無法解釋的提供商發票轉換為您可以按模型、功能、團隊和結果查詢的支出。
請求級遙測將成本趨勢與導致成本趨勢的模型和工作負載聯絡起來。
最有用的事件將提供商的使用情況與產品上下文結合起來。代幣數量解釋了消費情況; feature、team_id、status 和 accepted 等欄位說明請求是否產生值。
一分鐘內即可檢視 OpenAI 成本儀表板
從免費樣品 OpenAI 使用活動開始。該快速入門會建立一個明確標記的事件,開啟一個準備執行的成本查詢,並將結果保留在您的入門儀表板上。您可以在更改應用程式程式碼之前檢查工作流程。
生成的樣本使用最小有用成本形狀:
{
"provider": "openai",
"model": "gpt-5",
"input_tokens": 1250,
"output_tokens": 340,
"cost_usd": 0.0184,
"latency_ms": 842,
"status": "ok",
"sample": true
}
立即針對生成的 telemetry_quickstart 資料表執行此命令:
SELECT
model,
COUNT(*) AS requests,
SUM(input_tokens) AS input_tokens,
SUM(output_tokens) AS output_tokens,
ROUND(SUM(cost_usd), 4) AS total_cost_usd,
ROUND(AVG(latency_ms), 0) AS average_latency_ms
FROM telemetry_quickstart
WHERE provider = 'openai'
GROUP BY model
ORDER BY total_cost_usd DESC;
先決條件
- Telemetry API 鑰匙
- OpenAI API 鑰匙
- Node.js 和官方的 OpenAI JavaScript SDK
1. 安裝並初始化SDK
npm install openai telemetry-sh
import OpenAI from "openai";
import telemetry from "telemetry-sh";
const openai = new OpenAI();
telemetry.init(process.env.TELEMETRY_API_KEY);
將兩個 API 金鑰保留在伺服器端環境變數中。不要將它們放入原始碼管理或瀏覽器程式碼中。
2. 將定價置於儀器之外
OpenAI 定價和型號可用性可能會發生變化。從 OpenAI 官方定價頁面 讀取當前費率並儲存您在設定中使用的費率。
此範例使用每百萬代幣的美元:
OPENAI_MODEL="YOUR_MODEL"
OPENAI_INPUT_USD_PER_MILLION="YOUR_CURRENT_INPUT_RATE"
OPENAI_CACHED_INPUT_USD_PER_MILLION="YOUR_CURRENT_CACHED_INPUT_RATE"
OPENAI_CACHE_WRITE_USD_PER_MILLION="YOUR_CURRENT_CACHE_WRITE_RATE"
OPENAI_OUTPUT_USD_PER_MILLION="YOUR_CURRENT_OUTPUT_RATE"
OPENAI_PRICING_VERSION="provider-price-sheet-reviewed-YYYY-MM-DD"
const pricing = {
inputUsdPerMillion: Number(process.env.OPENAI_INPUT_USD_PER_MILLION),
cachedInputUsdPerMillion: Number(
process.env.OPENAI_CACHED_INPUT_USD_PER_MILLION
),
cacheWriteUsdPerMillion: Number(
process.env.OPENAI_CACHE_WRITE_USD_PER_MILLION
),
outputUsdPerMillion: Number(process.env.OPENAI_OUTPUT_USD_PER_MILLION),
};
function estimateCostUsd({
inputTokens,
cachedInputTokens,
cacheWriteTokens,
outputTokens,
}) {
const uncachedInputTokens = Math.max(
0,
inputTokens - cachedInputTokens - cacheWriteTokens
);
return (
(uncachedInputTokens * pricing.inputUsdPerMillion +
cachedInputTokens * pricing.cachedInputUsdPerMillion +
cacheWriteTokens * pricing.cacheWriteUsdPerMillion +
outputTokens * pricing.outputUsdPerMillion) /
1_000_000
);
}
使用您的提供商發票作為計費的真實來源。快取輸入、推理權杖、批次處理、工具、影象、音訊或其他模型功能可能需要額外的欄位和定價規則。
當快取讀取或 快取寫入速率未知。將估計標記為不完整,直到當前 供應商價格資料表已經過審查。提供商的關鍵定價設定, 模型、服務層級和有效時間,而不是就地覆蓋它。
3. 檢測回應 API 請求
當前的 OpenAI JavaScript SDK 透過 client.responses.create 公開回應 API。完整的回應包括 usage 物件以及 input_tokens、output_tokens 和 total_tokens。
async function createDraftReply({ input, teamId, userId, attempt = 1 }) {
const model = process.env.OPENAI_MODEL;
const startedAt = Date.now();
try {
const response = await openai.responses.create({
model,
input,
});
const inputTokens = response.usage?.input_tokens ?? 0;
const outputTokens = response.usage?.output_tokens ?? 0;
const cachedInputTokens =
response.usage?.input_tokens_details?.cached_tokens ?? 0;
const cacheWriteTokens =
response.usage?.input_tokens_details?.cache_write_tokens ?? 0;
const reasoningTokens =
response.usage?.output_tokens_details?.reasoning_tokens ?? 0;
const estimatedCostUsd = estimateCostUsd({
inputTokens,
cachedInputTokens,
cacheWriteTokens,
outputTokens,
});
await telemetry.log("llm_request_completed", {
response_id: response.id,
provider: "openai",
model: response.model ?? model,
feature: "draft_reply",
team_id: teamId,
user_id: userId,
status: "success",
attempt,
input_tokens: inputTokens,
cached_input_tokens: cachedInputTokens,
cache_write_tokens: cacheWriteTokens,
output_tokens: outputTokens,
reasoning_tokens: reasoningTokens,
total_tokens: response.usage?.total_tokens ?? inputTokens + outputTokens,
estimated_cost_usd: estimatedCostUsd,
latency_ms: Date.now() - startedAt,
service_tier: response.service_tier ?? "not_reported",
pricing_version: process.env.OPENAI_PRICING_VERSION,
});
return response.output_text;
} catch (error) {
await telemetry.log("llm_request_failed", {
provider: "openai",
model,
feature: "draft_reply",
team_id: teamId,
user_id: userId,
status: "error",
attempt,
error_type: error?.constructor?.name ?? "unknown_error",
latency_ms: Date.now() - startedAt,
});
throw error;
}
}
預設情況下,不記錄原始提示、完成情況、工具參數、憑據或私人客戶內容。優先選擇安全類別,例如 feature、workflow、input_category、output_category 和 error_type。
OpenAI當前提示快取指導文件cached_tokens下
usage.input_tokens_details 用於回覆 API 結果和文件
cache_write_tokens 適用於報告快取寫入的模型系列。它還顯示
輸出權杖詳細資訊下的 reasoning_tokens。參見官方提示快取
要求。
推理權杖是回應的輸出權杖會計中的詳細資訊;做
在估算代幣總數時,不要再次將它們新增到 output_tokens 中。
保留單獨的欄位,因為它可以解釋成本、延遲或
行為。
4. 將重試計入成本
即使使用者看到,應用程式級重試也是一個新的計費請求
一項產品行動。在嘗試和增量中攜帶穩定的 operation_id
attempt。單獨記錄終端應用程式結果。
await telemetry.log("ai_operation_completed", {
operation_id: operationId,
response_id: response.id,
team_id: teamId,
feature: "draft_reply",
attempts: attempt,
outcome: "accepted",
accepted: true,
});
這支援每個邏輯操作的成本、每個接受的輸出的成本以及重試
放大。不要僅僅因為請求成本事件共享而對它們進行重複資料刪除
operation_id;每個提供商的請求都會產生成本。
5. 將支出與成果聯絡起來
每個請求的成本並不能告訴您輸出是否有用。當使用者接受、複製、儲存、重新生成或丟棄結果時記錄單獨的結果事件。
await telemetry.log("ai_output_reviewed", {
response_id: responseId,
team_id: teamId,
user_id: userId,
feature: "draft_reply",
outcome: "accepted",
accepted: true,
});
穩定的 response_id 可讓您將使用情況和結果結合起來,而無需儲存模型輸出本身。
6.按功能、型號查詢每日費用
Telemetry 自動新增 timestamp_utc,因此應用程式不需要傳送自己的時間戳欄位。
SELECT
date_trunc('day', timestamp_utc) AS day,
feature,
model,
COUNT(*) AS requests,
SUM(input_tokens) AS input_tokens,
SUM(cached_input_tokens) AS cached_input_tokens,
SUM(cache_write_tokens) AS cache_write_tokens,
SUM(output_tokens) AS output_tokens,
SUM(reasoning_tokens) AS reasoning_tokens,
ROUND(SUM(estimated_cost_usd), 4) AS estimated_cost_usd,
ROUND(AVG(latency_ms), 0) AS avg_latency_ms
FROM llm_request_completed
WHERE timestamp_utc >= now() - INTERVAL '30 days'
GROUP BY day, feature, model
ORDER BY day ASC, estimated_cost_usd DESC;
將 estimated_cost_usd 視覺化為由 feature 或 model 分割的堆積折線圖或面積圖。將其與請求量和接受輸出率配對,以便可以根據上下文解釋成本增加。
7. 將估算與發票進行核對
請求遙測答案支出來自何處。提供商發票答案 計費內容是什麼。在共享粒度(例如提供商專案)上協調兩者, 型號、服務等級、貨幣和 UTC 計費日。
SELECT
date_trunc('day', timestamp_utc) AS day,
model,
service_tier,
pricing_version,
COUNT(*) AS requests,
ROUND(SUM(estimated_cost_usd), 4) AS estimated_cost_usd
FROM llm_request_completed
WHERE timestamp_utc >= now() - INTERVAL '30 days'
GROUP BY
date_trunc('day', timestamp_utc),
model,
service_tier,
pricing_version
ORDER BY day ASC, model ASC, service_tier ASC;
將發票總額儲存在單獨的財務控制資料集中,然後進行比較 類似的時期。差異可能來自價格變化,不完整 事件、積分、批次或優先處理、非代幣工具、影象、音訊、 貨幣轉換,或應用程式遙測中缺少提供商專案。 不要僅僅為了強迫達成一致而“修復”事件歷史;記錄對賬 解釋。
需要警惕什麼
有用的警示包括:
- 每日預計支出高於預期預算;
- 高於測試閾值的每個接受輸出的成本;
- 一種模型或功能的重試或失敗次數增加;
- 提示或工具模式更改後快取輸入份額下降;
- 快取寫入增加,但沒有相應的未來快取讀取優勢;
- 一個提示版本或工作流程的推理權杖份額髮生變化;
- p95 延遲增加,而接受輸出率保持平穩或下降;
- 使用事件到達時未識別
pricing_version。
後續步驟
使用完整的 按功能劃分的 LLM 成本 SQL 配方 檢查範例結果和儀表板設計。然後新增 接受的人工智慧產出每美元配方 將產品價值與預計支出進行比較。
如需完整的實施路徑,請繼續瞭解 OpenAI 代理整合、LLM 成本追蹤範本 和 AI代理遙測產品指南。這些頁面將請求級成本資料與代理執行、工具呼叫、儀表板和保留的產品結果連線起來。
對於基礎 API 形狀,請參閱 OpenAI 開發者快速入門 和 回覆 API 參考。