OpenAI API 모델 및 기능별 비용 추적
OpenAI API 비용을 추적하려면 통화를 발생시킨 고객 및 제품 기능과 함께 토큰 사용량, 모델, 대기 시간, 재시도 및 예상 요청 비용을 기록하세요. 이를 통해 설명할 수 없는 제공업체 송장을 모델, 기능, 팀 및 결과별로 쿼리할 수 있는 지출로 전환합니다.
요청 수준 원격 분석은 비용 추세를 이를 유발한 모델 및 워크로드에 연결합니다.
가장 유용한 이벤트는 공급자 사용과 제품 컨텍스트를 결합합니다. 토큰 수는 소비를 설명합니다. feature, team_id, status 및 accepted와 같은 필드는 요청이 값을 생성했는지 여부를 설명합니다.
1분 안에 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 가격 페이지에서 현재 요금을 읽고 구성에 사용하는 요금을 저장하세요.
이 예에서는 백만 토큰당 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는 client.responses.create를 통해 응답 API를 노출합니다. 완성된 응답에는 input_tokens, output_tokens 및 total_tokens가 포함된 usage 개체가 포함됩니다.
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는 아래에 있습니다.
응답 API 결과 및 문서에 대한 usage.input_tokens_details
캐시 쓰기를 보고하는 모델 제품군의 경우 cache_write_tokens입니다. 그것은 또한 보여줍니다
출력 토큰 세부 정보 아래 reasoning_tokens. 공식 [프롬프트 캐싱]을 참조하세요.
요구 사항](https://developers.openai.com/api/docs/guides/prompt-caching#requirements).
추론 토큰은 응답의 출력 토큰 계정 내의 세부 정보입니다. 하다
토큰 총계를 추정할 때 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 레시피를 사용하여 예시 결과와 대시보드 디자인을 검사하세요. 그런 다음 달러당 허용되는 AI 출력 레시피를 추가하여 제품 가치와 예상 지출을 비교합니다.
전체 구현 경로를 보려면 OpenAI 에이전트 통합, LLM 비용 추적기 템플릿 및 AI 에이전트 텔레메트리 제품 가이드를 계속 진행하세요. 이 페이지는 요청 수준 비용 데이터를 에이전트 실행, 도구 호출, 대시보드 및 유지된 제품 결과와 연결합니다.
기본 API 형태에 대해서는 OpenAI 개발자 빠른 시작 및 응답 API 참조를 참조하세요.