DEV Community

Cover image for كيفية تتبع تكلفة استخدام API أوبن إيه آي (OpenAI) لكل ميزة: دليل لتحديد مصادر التكلفة
Yusuf Khalidd
Yusuf Khalidd

Posted on • Originally published at apidog.com

كيفية تتبع تكلفة استخدام API أوبن إيه آي (OpenAI) لكل ميزة: دليل لتحديد مصادر التكلفة

فاتورة OpenAI تقول إنك أنفقت 4,237 دولارًا الشهر الماضي. لكنها لا تقول إن 3,100 دولار جاءت من نقطة نهاية تلخيص خرجت عن السيطرة، و700 دولار من عميل يدفع 50 دولارًا شهريًا، و437 دولارًا من ميزة لا يستخدمها أحد. إذا كنت تشحن ميزات تعتمد على نماذج اللغة الكبيرة، فأنت تحتاج إلى إسناد التكلفة لكل طلب، لا إلى رقم إجمالي في لوحة الفوترة.

جرّب Apidog اليوم

يوضح هذا الدليل طريقة عملية لإسناد تكلفة OpenAI API: وسم كل طلب ببيانات وصفية، تسجيل التوكنات والتكلفة، التجميع حسب الميزة والمسار والعميل، تعيين حدود ميزانية، واختبار الغلاف قبل الإنتاج.

💡 يمنحك Apidog رؤية على مستوى الطلب واختبار السيناريوهات للتحقق من أن غلاف تتبع التكلفة يعمل قبل نشره. استخدمه لإعادة تشغيل الطلبات الموسومة، تأكيد شكل السجل، والتحقق من أن كل استدعاء يحمل البيانات الوصفية التي يتوقعها مستودع البيانات.

باختصار

نفّذ الآتي:

  1. وسّم كل استدعاء OpenAI بـ feature وroute وcustomer_id وenvironment.
  2. سجّل حدث JSON لكل طلب يحتوي على التوكنات، النموذج، زمن الاستجابة، والتكلفة المحسوبة.
  3. خزّن الأحداث في BigQuery أو ClickHouse أو Snowflake أو Postgres.
  4. اجمع الإنفاق حسب الميزة، العميل، والمسار.
  5. عيّن حدودًا لكل مفتاح مشروع في OpenAI.
  6. أضف تنبيهات مبنية على مستودع البيانات.
  7. اختبر الغلاف باستخدام 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)
Enter fullscreen mode Exit fullscreen mode

ملاحظة مهمة: توكنات الاستدلال 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,
        }))
Enter fullscreen mode Exit fullscreen mode

استخدم الغلاف من موقع الاستدعاء:

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},
    ],
)
Enter fullscreen mode Exit fullscreen mode

لا تجعل 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,
    }));
  }
}
Enter fullscreen mode Exit fullscreen mode

إذا كنت تستخدم 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;
Enter fullscreen mode Exit fullscreen mode

الإنفاق حسب العميل

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;
Enter fullscreen mode Exit fullscreen mode

أكثر المسارات تكلفة

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;
Enter fullscreen mode Exit fullscreen mode

اربط هذه الاستعلامات بـ Grafana أو Metabase أو Looker أو Superset. أنشئ ثلاث لوحات أساسية:

  • الإنفاق لكل ميزة بمرور الوقت.
  • الإنفاق لكل عميل بمرور الوقت.
  • أعلى 20 مسارًا حسب إنفاق آخر 24 ساعة.

اختبار الغلاف باستخدام Apidog

لا تنتظر الإنتاج لاكتشاف أن customer_id فارغ أو أن cost_usd لا يُسجل عند بعض المسارات. اختبر الغلاف كما تختبر أي عقد API.

استخدم Apidog بهذا التسلسل:

  1. أنشئ سيناريو يرسل طلبًا إلى نقطة نهاية الذكاء الاصطناعي في خدمتك.
  2. مرّر customer_id وfeature معروفين.
  3. نفّذ الطلب.
  4. التقط سجل JSON من stdout أو OTLP أو نقطة نهاية السجلات الداخلية.
  5. أضف تأكيدات للتأكد من وجود الحقول التالية:
    • feature
    • route
    • customer_id
    • environment
    • model
    • prompt_tokens > 0
    • cost_usd > 0
  6. شغّل السيناريو عبر بيئات التطوير والإنتاج باستخدام متغيرات بيئة Apidog.
  7. أعد تشغيل الطلبات الموسومة وتأكد من أن إعادة المحاولة لا تضاعف التكلفة إذا كانت تستخدم 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);
Enter fullscreen mode Exit fullscreen mode

للاطلاع على مقاربات أوسع لاختبار واجهات برمجة التطبيقات، راجع أدوات اختبار واجهات برمجة التطبيقات لمهندسي ضمان الجودة. ولنهج "العقد أولًا"، راجع تطوير واجهة برمجة التطبيقات العقد أولًا.

حدود الميزانية والتنبيهات

استخدم طبقتين من الحماية.

1. حدود OpenAI الأصلية

أنشئ مفاتيح مشروع منفصلة حسب البيئة أو الميزة، مثل:

  • prod-support-chat
  • prod-summarization
  • prod-agent-workflows
  • staging-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;
Enter fullscreen mode Exit fullscreen mode

الحدود الأصلية تحميك من الكوارث. التنبيهات المبنية على البيانات تلتقط الانحراف البطيء قبل أن يتحول إلى فاتورة كبيرة.

تحسينات متقدمة لتقليل التكلفة

التخزين المؤقت للمطالبات

إذا كان جزء كبير من المطالبة ثابتًا، اجعله في البداية وضع المتغيرات في النهاية. هذا يزيد فرصة الاستفادة من 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;
Enter fullscreen mode Exit fullscreen mode

راجع وثائق التخزين المؤقت للمطالبات من OpenAI لمعرفة قواعد الأهلية.

استخدام Batch API للأعمال غير المتزامنة

أي مهمة لا تحتاج استجابة فورية يمكن تشغيلها عبر Batch API:

  • تلخيص ليلي.
  • تقييمات.
  • إعادة معالجة مستندات.
  • تعبئة embeddings.

استمر في الوسم، وأضف batch_job_id إلى الحدث حتى تستطيع إسناد التكلفة إلى عبء العمل الأصلي.

ضبط جهد الاستدلال

إذا كنت تستخدم وضع التفكير، راجع reasoning.effort. المستويات الأعلى قد ترفع توكنات الإخراج. اختبر الجودة مقابل التكلفة:

  1. شغّل نفس السيناريو على low.
  2. شغّله على medium.
  3. قارن الجودة والتكلفة.
  4. استخدم الخيار الأقل تكلفة إذا كانت الجودة مقبولة.

للتفاصيل العملية، راجع كيفية استخدام 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;
Enter fullscreen mode Exit fullscreen mode

إذا ارتفع 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,
    }))
Enter fullscreen mode Exit fullscreen mode

راجع منشور تسعير 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(
            "تم تجاوز حصة الذكاء الاصطناعي الشهرية"
        )
Enter fullscreen mode Exit fullscreen mode

ثم استخدمه قبل الغلاف:

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,
)
Enter fullscreen mode Exit fullscreen mode

عند تجاوز الحد، أعد 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
Enter fullscreen mode Exit fullscreen mode

أضفها إلى completion_tokens عند حساب التكلفة. راجع تفاصيل تسعير GPT-5.5.

ما مدى دقة response.usage مقارنة بلوحة OpenAI؟

أعداد التوكنات في response.usage هي المصدر المناسب للحساب على مستوى الطلب. قد يحدث انحراف في التكلفة إذا استخدمت جدول أسعار قديمًا، لذلك ثبّت الأسعار في الكود وحدّثها عند تغيير التسعير.

هل تكفي مفاتيح مشروع OpenAI للإسناد؟

لا. مفاتيح المشروع تعطيك إسنادًا على مستوى المشروع أو البيئة. لا تعطيك إسنادًا لكل ميزة أو عميل أو مسار. استخدمها للحدود والفصل، واستخدم البيانات الوصفية داخل التطبيق للإسناد التفصيلي.

ماذا عن إعادة المحاولات؟

إذا فشل الطلب قبل تشغيل النموذج، فلن تحصل عادةً على usage ولن تسجل تكلفة. إذا نجح الطلب ثم أعدته طبقة التطبيق، قد تسجل التكلفة مرتين. مرّر request_id نفسه في إعادة المحاولة واجعل طبقة التخزين تزيل التكرار.

هل يجب أخذ عينات من الطلبات لتقليل حجم السجلات؟

لا. سجل JSON واحد لكل طلب ليس عبئًا كبيرًا، وأخذ العينات يفسد إسناد التكلفة لكل عميل ومسار.

هل يعمل هذا مع مزودي LLM آخرين؟

نعم. أضف عمود provider مثل:

openai
anthropic
google
deepseek
Enter fullscreen mode Exit fullscreen mode

ثم استخدم جدول تسعير مختلفًا لكل مزود. المخطط ولوحات التحكم تبقى نفسها. كنقطة مقارنة، راجع تسعير DeepSeek V4 API.

هل ينطبق على embeddings والصور؟

نعم، لكن مع حساب تكلفة مختلف. embeddings تُحسب عادةً حسب توكنات الإدخال. الصور تُحسب حسب عدد الصور والدقة. أضف عمودًا مثل endpoint:

chat
embeddings
image
Enter fullscreen mode Exit fullscreen mode

ثم فرّع دالة حساب التكلفة حسب نوع الاستدعاء.

Top comments (0)