OpenAI API モデルおよび機能別のコスト追跡
OpenAI API のコストを追跡するには、トークンの使用状況、モデル、レイテンシ、再試行、および推定リクエスト コストを、製品の機能と呼び出しの原因となった顧客とともに記録します。これにより、説明のないプロバイダーの請求書が、モデル、機能、チーム、結果ごとにクエリできる支出に変わります。
リクエストレベルのテレメトリは、コストの傾向をモデルとその原因となったワークロードに結び付けます。
最も有用なイベントは、プロバイダーの使用状況と製品コンテキストを組み合わせたものです。トークン数は消費量を説明します。などのフィールド feature, team_id, status、そして accepted リクエストが値を生成したかどうかを説明します。
OpenAI コスト ダッシュボードを 1 分以内に確認できます
無料サンプル 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 価格ページ 使用するレートを設定に保存します。
この例では、100 万トークンあたり USD を使用します。
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 は、レスポンス API を公開します。 client.responses.create。完了した応答には以下が含まれます 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 2 回目はトークンの合計を見積もるときです。
コスト、レイテンシ、または遅延の変化を説明できるため、別のフィールドを保持します。
行動。
4. 再試行をコストに含める
アプリケーションレベルの再試行は、ユーザーが
1 つの製品アクション。馬小屋を運ぶ 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. 機能およびモデルごとに 1 日あたりのコストをクエリする
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;
請求書の合計を財務が管理する別のデータセットに保存し、比較します 似たような期間。差異は価格変更によって生じる可能性があり、不完全です イベント、クレジット、バッチまたは優先処理、非トークン ツール、画像、音声、 通貨換算、またはプロバイダー プロジェクトがアプリケーション テレメトリに含まれていません。 合意を強制するためだけにイベント履歴を「修正」しないでください。和解を記録する 説明。
何を注意すべきか
役立つアラートには次のようなものがあります。
- 1 日の推定支出が予想予算を上回っている。
- テスト済みのしきい値を超える、受け入れられた出力あたりのコスト。
- 1 つのモデルまたは機能での再試行または失敗の増加。
- プロンプトまたはツールスキーマの変更後にキャッシュされた入力共有が低下する。
- キャッシュ書き込みの増加は、それに対応する将来のキャッシュ読み取りの利点を伴わない。
- 1 つのプロンプト バージョンまたはワークフローに対して変更される推論トークンの共有。
- 受け入れられる出力レートが横ばいまたは低下する一方で、p95 レイテンシが増加します。
- 認識されずに到着する使用状況イベント
pricing_version.
次のステップ
完全なものを使用する 機能ごとの LLM コスト SQL レシピ 結果の例とダッシュボードのデザインを確認します。次に、 1 ドルあたりの AI 出力レシピが受け入れられる 製品の価値と推定支出額を比較します。
完全な実装パスについては、次の手順に進んでください。 OpenAI エージェントの統合、 LLM コスト トラッカー テンプレート、そして AI エージェント テレメトリ製品ガイド。これらのページは、リクエスト レベルのコスト データをエージェントの実行、ツールの呼び出し、ダッシュボード、および保持された製品の成果と結び付けます。
基礎となる API 形状については、 OpenAI 開発者クイックスタート そして 応答 API リファレンス.