فاتورة OpenAI تقول إنك أنفقت 4,237 دولارًا الشهر الماضي. لكنها لا تقول إن 3,100 دولار جاءت من نقطة نهاية تلخيص خرجت عن السيطرة، و700 دولار من عميل يدفع 50 دولارًا شهريًا، و437 دولارًا من ميزة لا يستخدمها أحد. إذا كنت تشحن ميزات تعتمد على نماذج اللغة الكبيرة، فأنت تحتاج إلى إسناد التكلفة لكل طلب، لا إلى رقم إجمالي في لوحة الفوترة.
يوضح هذا الدليل طريقة عملية لإسناد تكلفة OpenAI API: وسم كل طلب ببيانات وصفية، تسجيل التوكنات والتكلفة، التجميع حسب الميزة والمسار والعميل، تعيين حدود ميزانية، واختبار الغلاف قبل الإنتاج.
💡 يمنحك Apidog رؤية على مستوى الطلب واختبار السيناريوهات للتحقق من أن غلاف تتبع التكلفة يعمل قبل نشره. استخدمه لإعادة تشغيل الطلبات الموسومة، تأكيد شكل السجل، والتحقق من أن كل استدعاء يحمل البيانات الوصفية التي يتوقعها مستودع البيانات.
باختصار
نفّذ الآتي:
- وسّم كل استدعاء OpenAI بـ
featureوrouteوcustomer_idوenvironment. - سجّل حدث JSON لكل طلب يحتوي على التوكنات، النموذج، زمن الاستجابة، والتكلفة المحسوبة.
- خزّن الأحداث في BigQuery أو ClickHouse أو Snowflake أو Postgres.
- اجمع الإنفاق حسب الميزة، العميل، والمسار.
- عيّن حدودًا لكل مفتاح مشروع في OpenAI.
- أضف تنبيهات مبنية على مستودع البيانات.
- اختبر الغلاف باستخدام Apidog قبل الاعتماد على الأرقام.
لماذا لا تكفي لوحة تحكم فواتير OpenAI
لوحة تحكم OpenAI تعرض إجمالي الإنفاق، تفصيلًا حسب النموذج، وحدود الاستخدام. هذا مفيد للفوترة، لكنه غير كافٍ لاتخاذ قرارات هندسية أو منتجية.
المشكلات العملية:
- لا يوجد سياق للإنفاق: ترى أنك أنفقت 312 دولارًا أمس، لكن لا تعرف هل السبب عميل واحد، ميزة جديدة، أم وظيفة خلفية.
-
لا يوجد تفصيل لكل ميزة: OpenAI تميّز الطلبات حسب مفتاح API والنموذج، لا حسب
featureأوrouteأوcustomer_id. - تأخر في بيانات الاستخدام: بيانات لوحة التحكم قد تتأخر عشرات الدقائق أو ساعات.
- تنبيهات محدودة: لا يوجد تنبيه أصلي مثل: "أرسل تنبيهًا إذا تجاوزت ميزة الدردشة 50 دولارًا في الساعة".
- لا يوجد إسناد للعملاء: لا يمكنك حساب تكلفة العميل X أو هامش الربح لكل عميل من لوحة التحكم وحدها.
- مفاتيح المشاريع تساعد جزئيًا فقط: تعطيك بُعدًا واحدًا للإسناد، لكنها لا تحل إسناد الميزة أو العميل أو المسار.
تستطيع استخدام واجهة استخدام OpenAI للمصالحة والتجميع، لكنها لا تعطيك حدثًا تفصيليًا لكل طلب. لذلك تحتاج إلى طبقة إسناد داخل التطبيق.
للسياق حول التسعير، راجع تفاصيل تسعير GPT-5.5. ولمشكلة مشابهة في أدوات المطورين، راجع فاتورة استخدام GitHub Copilot لفرق واجهات برمجة التطبيقات. ولأساسيات OpenAI API، راجع المرجع الرسمي لـ OpenAI API.
نموذج بيانات إسناد التكلفة
اجعل كل طلب OpenAI ينتج حدثًا واحدًا منظّمًا. هذا الحدث هو مصدر الحقيقة للوحات التحكم والتنبيهات والتقارير.
| العمود | النوع | مثال | لماذا هو مهم |
|---|---|---|---|
request_id |
uuid | 7a91... |
الثبات، إزالة التكرار، إعادة المحاولات |
timestamp |
timestamptz | 2026-05-06T14:23:01Z |
السلاسل الزمنية والتنبيهات |
feature |
text | support-chat |
الميزة التي أطلقت الاستدعاء |
route |
text | /api/v1/chat/answer |
مسار HTTP أو وظيفة الخلفية |
customer_id |
text | cust_4291 |
الإنفاق لكل عميل |
environment |
text | prod |
فصل الإنتاج عن التطوير |
model |
text | gpt-5.5 |
التسعير يختلف حسب النموذج |
prompt_tokens |
int | 15234 |
توكنات الإدخال |
completion_tokens |
int | 812 |
توكنات الإخراج |
reasoning_tokens |
int | 4500 |
توكنات الاستدلال، وتُحاسب كمخرجات |
cached_tokens |
int | 12000 |
توكنات التخزين المؤقت |
latency_ms |
int | 2341 |
ربط التكلفة بتجربة المستخدم |
cost_usd |
numeric | 0.045672 |
التكلفة المحسوبة وقت الطلب |
prompt_cache_key |
text | system-v3 |
تتبع فعالية التخزين المؤقت |
error_code |
text |
429 أو null
|
تحليل الأخطاء وإعادة المحاولات |
احسب التكلفة وقت الكتابة، لا وقت الاستعلام. بهذه الطريقة تبقى البيانات التاريخية مرتبطة بالسعر الذي كان معمولًا به عند تنفيذ الطلب.
PRICING = { # USD per 1M tokens, as of May 2026
"gpt-5.5": {"input": 5.00, "cached": 2.50, "output": 30.00},
"gpt-5.5-pro": {"input": 30.00, "cached": 15.00, "output": 180.00},
"gpt-5.4": {"input": 2.50, "cached": 1.25, "output": 15.00},
"gpt-5.4-mini": {"input": 0.25, "cached": 0.125, "output": 2.00},
}
def compute_cost_usd(model, prompt_tokens, cached_tokens, completion_tokens, reasoning_tokens):
rates = PRICING[model]
uncached = max(0, prompt_tokens - cached_tokens)
input_cost = (uncached * rates["input"]) / 1_000_000
cache_cost = (cached_tokens * rates["cached"]) / 1_000_000
output_cost = ((completion_tokens + reasoning_tokens) * rates["output"]) / 1_000_000
return round(input_cost + cache_cost + output_cost, 6)
ملاحظة مهمة: توكنات الاستدلال
reasoning_tokensتُحاسب كسعر مخرجات. تعيدها OpenAI فيusage.completion_tokens_details.reasoning_tokens. إذا تجاهلت ذلك، ستقلل التكلفة الفعلية لطلبات التفكير.
تنفيذ غلاف OpenAI في Python
اجعل كل استدعاء للنموذج يمر عبر دالة واحدة. هذه الدالة تستقبل البيانات الوصفية، تنفذ الطلب، تستخرج usage، تحسب التكلفة، وتكتب سجل JSON.
import time
import uuid
import json
import logging
from openai import OpenAI
client = OpenAI()
logger = logging.getLogger("llm.cost")
def call_with_attribution(
*,
feature,
route,
customer_id,
environment,
model,
messages,
request_id=None,
**openai_kwargs
):
if not feature or not route or not customer_id or not environment:
raise ValueError("feature, route, customer_id, and environment are required")
request_id = request_id or str(uuid.uuid4())
started = time.time()
error_code = None
response = None
try:
response = client.chat.completions.create(
model=model,
messages=messages,
**openai_kwargs
)
return response
except Exception as e:
error_code = getattr(e, "code", "unknown_error")
raise
finally:
latency_ms = int((time.time() - started) * 1000)
u = response.usage if response else None
prompt_tokens = getattr(u, "prompt_tokens", 0) if u else 0
completion_tokens = getattr(u, "completion_tokens", 0) if u else 0
cached_tokens = (
getattr(getattr(u, "prompt_tokens_details", None), "cached_tokens", 0)
if u else 0
) or 0
reasoning_tokens = (
getattr(getattr(u, "completion_tokens_details", None), "reasoning_tokens", 0)
if u else 0
) or 0
cost_usd = compute_cost_usd(
model,
prompt_tokens,
cached_tokens,
completion_tokens,
reasoning_tokens
)
logger.info(json.dumps({
"event": "openai.request",
"request_id": request_id,
"timestamp": time.strftime("%Y-%m-%dT%H:%M:%SZ", time.gmtime()),
"feature": feature,
"route": route,
"customer_id": customer_id,
"environment": environment,
"model": model,
"prompt_tokens": prompt_tokens,
"completion_tokens": completion_tokens,
"reasoning_tokens": reasoning_tokens,
"cached_tokens": cached_tokens,
"latency_ms": latency_ms,
"cost_usd": cost_usd,
"error_code": error_code,
}))
استخدم الغلاف من موقع الاستدعاء:
response = call_with_attribution(
feature="support-chat",
route="/api/v1/chat/answer",
customer_id=current_user.account_id,
environment="prod",
model="gpt-5.5",
messages=[
{"role": "system", "content": "أجب كمساعد دعم فني."},
{"role": "user", "content": user_question},
],
)
لا تجعل feature أو customer_id قيمًا اختيارية. إذا غابت، ارفع خطأ. الوسم الناقص يعني إسنادًا خاطئًا.
تنفيذ الفكرة في Node.js
الفكرة نفسها تنطبق على Node.js: غلّف SDK، استخرج response.usage، احسب التكلفة، واكتب سجل JSON.
import OpenAI from "openai";
const client = new OpenAI();
const PRICING = {
"gpt-5.5": { input: 5.00, cached: 2.50, output: 30.00 },
"gpt-5.5-pro": { input: 30.00, cached: 15.00, output: 180.00 },
"gpt-5.4": { input: 2.50, cached: 1.25, output: 15.00 },
"gpt-5.4-mini": { input: 0.25, cached: 0.125, output: 2.00 },
};
function computeCostUsd(model, promptTokens, cachedTokens, completionTokens, reasoningTokens) {
const rates = PRICING[model];
const uncached = Math.max(0, promptTokens - cachedTokens);
const inputCost = (uncached * rates.input) / 1_000_000;
const cacheCost = (cachedTokens * rates.cached) / 1_000_000;
const outputCost = ((completionTokens + reasoningTokens) * rates.output) / 1_000_000;
return Number((inputCost + cacheCost + outputCost).toFixed(6));
}
export async function callWithAttribution({
feature,
route,
customerId,
environment,
model,
messages,
requestId = crypto.randomUUID(),
...openaiArgs
}) {
if (!feature || !route || !customerId || !environment) {
throw new Error("feature, route, customerId, and environment are required");
}
const started = Date.now();
let response;
let errorCode = null;
try {
response = await client.chat.completions.create({
model,
messages,
...openaiArgs,
});
return response;
} catch (err) {
errorCode = err.code || "unknown_error";
throw err;
} finally {
const usage = response?.usage;
const promptTokens = usage?.prompt_tokens ?? 0;
const completionTokens = usage?.completion_tokens ?? 0;
const cachedTokens = usage?.prompt_tokens_details?.cached_tokens ?? 0;
const reasoningTokens = usage?.completion_tokens_details?.reasoning_tokens ?? 0;
const costUsd = computeCostUsd(
model,
promptTokens,
cachedTokens,
completionTokens,
reasoningTokens
);
console.log(JSON.stringify({
event: "openai.request",
request_id: requestId,
timestamp: new Date().toISOString(),
feature,
route,
customer_id: customerId,
environment,
model,
prompt_tokens: promptTokens,
completion_tokens: completionTokens,
reasoning_tokens: reasoningTokens,
cached_tokens: cachedTokens,
latency_ms: Date.now() - started,
cost_usd: costUsd,
error_code: errorCode,
}));
}
}
إذا كنت تستخدم Kafka أو Pub/Sub أو NATS، انشر الحدث هناك بدلًا من stdout. المهم أن يصل الحدث نفسه إلى مستودع البيانات ونظام التنبيه.
تخزين الأحداث والاستعلام عنها
اشحن السجلات إلى مستودع البيانات عبر المسار الموجود لديك: Vector، Fluent Bit، Logstash، OTLP collector، أو أي ناقل سجلات آخر.
بعدها يصبح التحليل SQL عاديًا.
الإنفاق حسب الميزة
SELECT
feature,
DATE_TRUNC(timestamp, DAY) AS day,
COUNT(*) AS requests,
SUM(cost_usd) AS spend_usd,
SUM(prompt_tokens + completion_tokens + reasoning_tokens) AS tokens,
AVG(latency_ms) AS avg_latency_ms,
SUM(cached_tokens) / NULLIF(SUM(prompt_tokens), 0) AS cache_hit_rate
FROM openai_events
WHERE environment = 'prod'
AND timestamp >= TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 30 DAY)
GROUP BY feature, day
ORDER BY day DESC, spend_usd DESC;
الإنفاق حسب العميل
SELECT
customer_id,
SUM(cost_usd) AS spend_usd,
COUNT(*) AS requests,
AVG(cost_usd) AS avg_cost_per_request
FROM openai_events
WHERE environment = 'prod'
AND timestamp >= TIMESTAMP_TRUNC(CURRENT_TIMESTAMP(), MONTH)
GROUP BY customer_id
ORDER BY spend_usd DESC
LIMIT 50;
أكثر المسارات تكلفة
SELECT
route,
feature,
SUM(cost_usd) AS spend_usd,
COUNT(*) AS requests,
AVG(prompt_tokens) AS avg_prompt_tokens,
AVG(completion_tokens + reasoning_tokens) AS avg_output_tokens
FROM openai_events
WHERE environment = 'prod'
AND timestamp >= TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 1 DAY)
GROUP BY route, feature
ORDER BY spend_usd DESC
LIMIT 20;
اربط هذه الاستعلامات بـ Grafana أو Metabase أو Looker أو Superset. أنشئ ثلاث لوحات أساسية:
- الإنفاق لكل ميزة بمرور الوقت.
- الإنفاق لكل عميل بمرور الوقت.
- أعلى 20 مسارًا حسب إنفاق آخر 24 ساعة.
اختبار الغلاف باستخدام Apidog
لا تنتظر الإنتاج لاكتشاف أن customer_id فارغ أو أن cost_usd لا يُسجل عند بعض المسارات. اختبر الغلاف كما تختبر أي عقد API.
استخدم Apidog بهذا التسلسل:
- أنشئ سيناريو يرسل طلبًا إلى نقطة نهاية الذكاء الاصطناعي في خدمتك.
- مرّر
customer_idوfeatureمعروفين. - نفّذ الطلب.
- التقط سجل JSON من
stdoutأو OTLP أو نقطة نهاية السجلات الداخلية. - أضف تأكيدات للتأكد من وجود الحقول التالية:
featureroutecustomer_idenvironmentmodelprompt_tokens > 0cost_usd > 0
- شغّل السيناريو عبر بيئات التطوير والإنتاج باستخدام متغيرات بيئة Apidog.
- أعد تشغيل الطلبات الموسومة وتأكد من أن إعادة المحاولة لا تضاعف التكلفة إذا كانت تستخدم
request_idنفسه.
مثال على تأكيد منطقي تريد تطبيقه في الاختبار:
pm.expect(log.event).to.eql("openai.request");
pm.expect(log.feature).to.eql("support-chat");
pm.expect(log.customer_id).to.eql("cust_test_001");
pm.expect(log.cost_usd).to.be.above(0);
pm.expect(log.prompt_tokens).to.be.above(0);
للاطلاع على مقاربات أوسع لاختبار واجهات برمجة التطبيقات، راجع أدوات اختبار واجهات برمجة التطبيقات لمهندسي ضمان الجودة. ولنهج "العقد أولًا"، راجع تطوير واجهة برمجة التطبيقات العقد أولًا.
حدود الميزانية والتنبيهات
استخدم طبقتين من الحماية.
1. حدود OpenAI الأصلية
أنشئ مفاتيح مشروع منفصلة حسب البيئة أو الميزة، مثل:
prod-support-chatprod-summarizationprod-agent-workflowsstaging-all
ثم عيّن حدًا صارمًا لكل مفتاح في لوحة OpenAI. هذا يمنع ميزة واحدة من استنزاف ميزانية المؤسسة كلها.
2. تنبيهات من مستودع البيانات
شغّل استعلامًا كل 10 دقائق. إذا تجاوزت ميزة ما 3 أضعاف متوسط إنفاقها الساعي خلال آخر 7 أيام، أرسل تنبيهًا إلى Slack أو PagerDuty أو Opsgenie.
مثال مبسط:
WITH hourly AS (
SELECT
feature,
TIMESTAMP_TRUNC(timestamp, HOUR) AS hour,
SUM(cost_usd) AS spend_usd
FROM openai_events
WHERE environment = 'prod'
AND timestamp >= TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 7 DAY)
GROUP BY feature, hour
),
baseline AS (
SELECT
feature,
AVG(spend_usd) AS avg_hourly_spend
FROM hourly
WHERE hour < TIMESTAMP_TRUNC(CURRENT_TIMESTAMP(), HOUR)
GROUP BY feature
),
current_hour AS (
SELECT
feature,
SUM(cost_usd) AS current_spend
FROM openai_events
WHERE environment = 'prod'
AND timestamp >= TIMESTAMP_TRUNC(CURRENT_TIMESTAMP(), HOUR)
GROUP BY feature
)
SELECT
c.feature,
c.current_spend,
b.avg_hourly_spend
FROM current_hour c
JOIN baseline b USING (feature)
WHERE c.current_spend > b.avg_hourly_spend * 3;
الحدود الأصلية تحميك من الكوارث. التنبيهات المبنية على البيانات تلتقط الانحراف البطيء قبل أن يتحول إلى فاتورة كبيرة.
تحسينات متقدمة لتقليل التكلفة
التخزين المؤقت للمطالبات
إذا كان جزء كبير من المطالبة ثابتًا، اجعله في البداية وضع المتغيرات في النهاية. هذا يزيد فرصة الاستفادة من prompt caching.
تتبع هذا المؤشر لكل ميزة:
SELECT
feature,
SUM(cached_tokens) / NULLIF(SUM(prompt_tokens), 0) AS cache_hit_rate
FROM openai_events
WHERE environment = 'prod'
GROUP BY feature
ORDER BY cache_hit_rate ASC;
راجع وثائق التخزين المؤقت للمطالبات من OpenAI لمعرفة قواعد الأهلية.
استخدام Batch API للأعمال غير المتزامنة
أي مهمة لا تحتاج استجابة فورية يمكن تشغيلها عبر Batch API:
- تلخيص ليلي.
- تقييمات.
- إعادة معالجة مستندات.
- تعبئة embeddings.
استمر في الوسم، وأضف batch_job_id إلى الحدث حتى تستطيع إسناد التكلفة إلى عبء العمل الأصلي.
ضبط جهد الاستدلال
إذا كنت تستخدم وضع التفكير، راجع reasoning.effort. المستويات الأعلى قد ترفع توكنات الإخراج. اختبر الجودة مقابل التكلفة:
- شغّل نفس السيناريو على
low. - شغّله على
medium. - قارن الجودة والتكلفة.
- استخدم الخيار الأقل تكلفة إذا كانت الجودة مقبولة.
للتفاصيل العملية، راجع كيفية استخدام GPT-5.5 API.
ضبط حجم السياق
المطالبات الطويلة مكلفة. بدلًا من إدخال قاعدة المعرفة كاملة في السياق، استخدم RAG بميزانية استرجاع واضحة.
راقب تضخم المطالبة:
SELECT
feature,
DATE_TRUNC(timestamp, WEEK) AS week,
AVG(prompt_tokens) AS avg_prompt_tokens
FROM openai_events
WHERE environment = 'prod'
GROUP BY feature, week
ORDER BY week DESC;
إذا ارتفع avg_prompt_tokens أسبوعًا بعد أسبوع بدون تغيير منتجي واضح، فالمطالبة تتضخم.
مراقبة الطلبات القريبة من الحدود الكبيرة
إذا كانت هناك مضاعفات سعرية عند تجاوز حد معين من التوكنات، أضف تحذيرًا داخل الغلاف:
if prompt_tokens > 250000:
logger.warning(json.dumps({
"event": "openai.large_prompt_warning",
"request_id": request_id,
"feature": feature,
"route": route,
"customer_id": customer_id,
"prompt_tokens": prompt_tokens,
}))
راجع منشور تسعير GPT-5.5 لتفاصيل التسعير.
حدود إنفاق لكل عميل
إذا كان منتجك B2B SaaS، أضف حدًا شهريًا لكل customer_id.
مثال تحقق قبل استدعاء OpenAI:
def assert_customer_ai_budget(customer_id, monthly_limit_usd):
current_spend = get_month_to_date_ai_spend(customer_id)
if current_spend >= monthly_limit_usd:
raise AiQuotaExceeded(
"تم تجاوز حصة الذكاء الاصطناعي الشهرية"
)
ثم استخدمه قبل الغلاف:
assert_customer_ai_budget(
customer_id=current_user.account_id,
monthly_limit_usd=current_user.plan.ai_budget_usd
)
response = call_with_attribution(
feature="support-chat",
route="/api/v1/chat/answer",
customer_id=current_user.account_id,
environment="prod",
model="gpt-5.5",
messages=messages,
)
عند تجاوز الحد، أعد 429 أو رسالة واضحة داخل المنتج. هذا يحوّل ميزات الذكاء الاصطناعي من خطر على الهامش إلى منتج يمكن تسعيره.
أخطاء شائعة يجب تجنبها
- حساب
reasoning_tokensكسعر إدخال. الصحيح أنها تُحاسب كمخرجات. - الاعتماد على لوحة OpenAI للتنبيهات الفورية. استخدم مستودع البيانات.
- وضع الوسوم داخل SDK بدل موقع الاستدعاء. الوسم يجب أن يأتي من الميزة.
- نسيان وظائف الخلفية مثل Cron وworkers وwebhooks.
- أخذ عينات من الطلبات. لا تفعل ذلك؛ سجّل كل طلب.
- ترك
customer_idفارغًا. استخدمinternalأوsystemإذا لم يوجد عميل. - حساب التكلفة وقت الاستعلام فقط. خزّن
cost_usdمع الحدث. - عدم اختبار شكل السجل قبل الإنتاج.
البدائل والأدوات
| النهج | ما يبرع فيه | تكلفته | متى تستخدمه |
|---|---|---|---|
| OpenAI usage API | أصلي، لا يتطلب إعدادًا | مجاني | مشروع واحد أو احتياجات بسيطة |
| Helicone | وكيل مباشر، لوحات تحكم، تخزين مؤقت، تكلفة لكل مستخدم | طبقة مجانية؛ مدفوع يبدأ من 20 دولارًا شهريًا | تريد لوحة مستضافة بسرعة وتقبل وكيلًا في المسار |
| Langfuse | مفتوح المصدر، تتبع وتكلفة | استضافة ذاتية مجانية؛ سحابة تبدأ من 29 دولارًا شهريًا | تريد تتبعًا وتكلفة في أداة واحدة |
| LangSmith | تكامل مع LangChain، تقييم وتكلفة | يبدأ من 39 دولارًا لكل مستخدم شهريًا | تستخدم LangChain بالفعل |
| مستودع بيانات مخصص | تحكم كامل، لا يوجد وكيل، أبعاد مخصصة | وقت هندسي | فرق كبيرة أو متطلبات بيانات صارمة |
الوكيل مثل Helicone يضيف قفزة في المسار الحرج. Langfuse يعطيك تحكمًا أكبر لكنك تدير جزءًا من المكدس. المسار المخصص يناسب الفرق التي لديها مستودع بيانات ومراقبة جاهزة. OpenAI usage API جيد للمصالحة، لكنه لا يكفي لإسناد تكلفة المنتج.
للمزيد حول مراقبة تكاليف LLM، راجع دليل Helicone حول تتبع تكاليف LLM ووثائق Langfuse حول تتبع التكلفة.
إذا كنت تدير هذا على مستوى منصة API، راجع منصات واجهات برمجة التطبيقات لهندسة الخدمات المصغرة.
حالات استخدام واقعية
B2B SaaS مع إنفاق LLM لكل عميل
شركة تبيع منتجًا لذكاء المبيعات. كل عميل يشغّل استدعاءات GPT-5.5 عند طلب موجز. بدون إسناد، تعرف الشركة أنها تنفق 80 ألف دولار شهريًا على OpenAI. مع الإسناد لكل عميل، تكتشف أن 12٪ من العملاء يسببون 71٪ من الإنفاق. النتيجة: تسعير متدرج، حصص مرنة، ورسوم تجاوز.
أدوات مطورين داخلية
منظمة هندسية تمنح المطورين مساعد دردشة داخليًا. باستخدام customer_id = dev_email، يرى فريق المنصة أن ثلاثة مطورين يمثلون 50٪ من الإنفاق الداخلي. اثنان منهم يشغلان حلقات وكلاء آلية لم يتم إيقافها. إيقافها يوفر 1,800 دولار شهريًا.
توقع تكلفة ميزة جديدة
فريق منتج يريد شحن ميزة تلخيص. باستخدام بيانات تاريخية لكل ميزة، يحسب:
- متوسط توكنات الإدخال لكل طلب.
- متوسط توكنات الإخراج.
- عدد الطلبات لكل مستخدم نشط.
- عدد المستخدمين المتوقع.
الناتج: 0.04 دولار لكل مستخدم نشط يوميًا، أو 1.20 دولار شهريًا. يمكن عندها تسعير الميزة بوضوح بدل التخمين.
الخلاصة
لوحة فواتير OpenAI تجيب على سؤال: "كم دفعنا؟".
إسناد التكلفة يجيب على سؤال: "من تسبب في التكلفة، ولماذا؟".
نفّذ الحد الأدنى التالي:
- وسّم كل طلب بـ
featureوrouteوcustomer_idوenvironment. - احسب
cost_usdوقت الطلب. - سجّل حدث JSON واحدًا لكل استدعاء.
- خزّن الأحداث في مستودع البيانات.
- ابنِ لوحات للإنفاق حسب الميزة والعميل والمسار.
- عيّن حدودًا لكل مفتاح مشروع.
- اختبر الغلاف باستخدام Apidog قبل الإنتاج.
قم بتنزيل Apidog واستخدمه للتحقق من غلاف إسناد التكلفة بشكل شامل: شغّل نقاط نهاية الذكاء الاصطناعي بطلبات موسومة، تأكد من حمولة السجل، وأعد تشغيل السيناريوهات عبر البيئات.
لقراءة ذات صلة بإدارة التكاليف، راجع تفاصيل تسعير GPT-5.5 وفاتورة استخدام GitHub Copilot لفرق واجهات برمجة التطبيقات.
الأسئلة الشائعة
هل تحسب توكنات الاستدلال كمدخلات أم مخرجات؟
كمخرجات. تعيد OpenAI هذه التوكنات تحت:
usage.completion_tokens_details.reasoning_tokens
أضفها إلى completion_tokens عند حساب التكلفة. راجع تفاصيل تسعير GPT-5.5.
ما مدى دقة response.usage مقارنة بلوحة OpenAI؟
أعداد التوكنات في response.usage هي المصدر المناسب للحساب على مستوى الطلب. قد يحدث انحراف في التكلفة إذا استخدمت جدول أسعار قديمًا، لذلك ثبّت الأسعار في الكود وحدّثها عند تغيير التسعير.
هل تكفي مفاتيح مشروع OpenAI للإسناد؟
لا. مفاتيح المشروع تعطيك إسنادًا على مستوى المشروع أو البيئة. لا تعطيك إسنادًا لكل ميزة أو عميل أو مسار. استخدمها للحدود والفصل، واستخدم البيانات الوصفية داخل التطبيق للإسناد التفصيلي.
ماذا عن إعادة المحاولات؟
إذا فشل الطلب قبل تشغيل النموذج، فلن تحصل عادةً على usage ولن تسجل تكلفة. إذا نجح الطلب ثم أعدته طبقة التطبيق، قد تسجل التكلفة مرتين. مرّر request_id نفسه في إعادة المحاولة واجعل طبقة التخزين تزيل التكرار.
هل يجب أخذ عينات من الطلبات لتقليل حجم السجلات؟
لا. سجل JSON واحد لكل طلب ليس عبئًا كبيرًا، وأخذ العينات يفسد إسناد التكلفة لكل عميل ومسار.
هل يعمل هذا مع مزودي LLM آخرين؟
نعم. أضف عمود provider مثل:
openai
anthropic
google
deepseek
ثم استخدم جدول تسعير مختلفًا لكل مزود. المخطط ولوحات التحكم تبقى نفسها. كنقطة مقارنة، راجع تسعير DeepSeek V4 API.
هل ينطبق على embeddings والصور؟
نعم، لكن مع حساب تكلفة مختلف. embeddings تُحسب عادةً حسب توكنات الإدخال. الصور تُحسب حسب عدد الصور والدقة. أضف عمودًا مثل endpoint:
chat
embeddings
image
ثم فرّع دالة حساب التكلفة حسب نوع الاستدعاء.
Top comments (0)