> ## Documentation Index
> Fetch the complete documentation index at: https://docs.dodopayments.com/llms.txt
> Use this file to discover all available pages before exploring further.

# مخطط LLM

> تتبع استخدام رموز LLM بسهولة لفوترة قائمة على الاستخدام مع الإدخال التلقائي إلى مدفوعات Dodo. يعمل مع AI SDK و OpenAI و Anthropic و OpenRouter و Groq و Google Gemini.

<CardGroup cols={2}>
  <Card title="Quick Start" icon="rocket" href="#quick-start">
    ابدأ في دقيقتين مع تتبع الرموز تلقائيًا.
  </Card>

  <Card title="API Reference - Events Ingestion" icon="code" href="/api-reference/usage-events/ingest-events">
    توثيق API الكامل لالتقاط أحداث الاستخدام.
  </Card>

  <Card title="API Reference - Meters" icon="gauge" href="/api-reference/meters/create-meter">
    تعرف على كيفية إنشاء المقاييس وتكوينها للفوترة.
  </Card>

  <Card title="Usage-Based Billing Guide" icon="arrow-trend-up" href="/developer-resources/usage-based-billing-guide">
    دليل شامل للفوترة القائمة على الاستخدام باستخدام المقاييس.
  </Card>
</CardGroup>

<Info>
  مثالي لتطبيقات SaaS، وروبوتات الدردشة الذكية، وأدوات توليد المحتوى، وأي تطبيق يعتمد على LLM يحتاج إلى فوترة قائمة على الاستخدام.
</Info>

## بدء سريع

ابدأ مع تتبع رموز LLM التلقائي في دقيقتين فقط:

<Steps>
  <Step title="Install the SDK">
    قم بتثبيت المخططات الأساسية لالتقاط بيانات Dodo Payments:

    ```bash theme={null}
    npm install @dodopayments/ingestion-blueprints
    ```
  </Step>

  <Step title="Get Your API Keys">
    ستحتاج إلى مفتاحي واجهة برمجة تطبيقات:

    * **مفتاح API لمدفوعات Dodo**: احصل عليه من [لوحة معلومات مدفوعات Dodo](https://app.dodopayments.com/developer/api-keys)
    * **مفتاح API لمزود LLM**: من AI SDK و OpenAI و Anthropic و Groq، إلخ.

    <Tip>
      احفظ مفاتيح API بأمان في متغيرات البيئة. لا تقم بإدراجها في نظام التحكم في الإصدارات.
    </Tip>
  </Step>

  <Step title="Create a Meter in Dodo Payments">
    قبل تتبع الاستخدام، أنشئ مقياسًا في لوحة Dodo Payments:

    1. **تسجيل الدخول** إلى [لوحة Dodo Payments](https://app.dodopayments.com/)
    2. **انتقل إلى** Products → Meters
    3. **انقر** على "Create Meter"
    4. **قم بتكوين المقياس الخاص بك**:
       * **اسم المقياس**: اختر اسمًا وصفيًا (مثل "LLM Token Usage")
       * **اسم الحدث**: حدد معرف حدث فريد (مثل `llm.chat_completion`)
       * **نوع التجميع**: اختر `sum` لجمع عدد الرموز
       * **خاصية التجميع**: اختر ما تريد تتبعه:
         * `inputTokens` - تتبع رموز الإدخال/الموجه
         * `outputTokens` - تتبع رموز الإخراج/الإكمال (تتضمن رموز الاستدلال عند الاقتضاء)
         * `totalTokens` - تتبع مجموع رموز الإدخال + الإخراج

    <Info>
      يجب أن يتطابق **اسم الحدث** الذي تحدده هنا تمامًا مع الاسم الذي تمرره إلى SDK (مع مراعاة حالة الأحرف).
    </Info>

    لمزيد من التعليمات التفصيلية، راجع [دليل الفوترة القائمة على الاستخدام](/developer-resources/usage-based-billing-guide).
  </Step>

  <Step title="Track Token Usage">
    قم بتغليف عميل LLM الخاص بك وابدأ التتبع تلقائيًا:

    <CodeGroup>
      ```javascript AI SDK theme={null}
      import { createLLMTracker } from '@dodopayments/ingestion-blueprints';
      import { generateText } from 'ai';
      import { google } from '@ai-sdk/google';

      const llmTracker = createLLMTracker({
        apiKey: process.env.DODO_PAYMENTS_API_KEY,
        environment: 'test_mode',
        eventName: 'aisdk.usage',
      });

      const client = llmTracker.wrap({
        client: { generateText },
        customerId: 'customer_123'
      });

      const response = await client.generateText({
        model: google('gemini-2.0-flash'),
        prompt: 'Hello!',
        maxOutputTokens: 500
      });

      console.log('Usage:', response.usage);
      ```

      ```javascript OpenRouter theme={null}
      import { createLLMTracker } from '@dodopayments/ingestion-blueprints';
      import OpenAI from 'openai';

      const openrouter = new OpenAI({
        baseURL: 'https://openrouter.ai/api/v1',
        apiKey: process.env.OPENROUTER_API_KEY
      });

      const llmTracker = createLLMTracker({
        apiKey: process.env.DODO_PAYMENTS_API_KEY,
        environment: 'test_mode',
        eventName: 'openrouter.usage'
      });

      const client = llmTracker.wrap({
        client: openrouter,
        customerId: 'customer_123'
      });

      const response = await client.chat.completions.create({
        model: 'qwen/qwen3-max',
        messages: [{ role: 'user', content: 'Hello!' }],
        max_tokens: 500
      });

      console.log('Response:', response.choices[0].message.content);
      console.log('Usage:', response.usage);
      ```

      ```javascript OpenAI theme={null}
      import { createLLMTracker } from '@dodopayments/ingestion-blueprints';
      import OpenAI from 'openai';

      // 1. Create your LLM client (normal way)
      const openai = new OpenAI({ 
        apiKey: process.env.OPENAI_API_KEY 
      });

      // 2. Create tracker ONCE at startup
      const tracker = createLLMTracker({
        apiKey: process.env.DODO_PAYMENTS_API_KEY,
        environment: 'test_mode', // Use 'live_mode' for production
        eventName: 'llm.chat_completion' // Match your meter's event name
      });

      // 3. Wrap & use - automatic tracking!
      const client = tracker.wrap({ 
        client: openai, 
        customerId: 'customer_123' 
      });

      // Every API call is now automatically tracked
      const response = await client.chat.completions.create({
        model: 'gpt-4',
        messages: [{ role: 'user', content: 'Hello!' }]
      });

      // ✨ Usage automatically sent to Dodo Payments!
      console.log('Tokens used:', response.usage);
      ```

      ```javascript Anthropic theme={null}
      import { createLLMTracker } from '@dodopayments/ingestion-blueprints';
      import Anthropic from '@anthropic-ai/sdk';

      const anthropic = new Anthropic({ 
        apiKey: process.env.ANTHROPIC_API_KEY 
      });

      const tracker = createLLMTracker({
        apiKey: process.env.DODO_PAYMENTS_API_KEY,
        environment: 'test_mode',
        eventName: 'anthropic.usage'
      });

      const client = tracker.wrap({ 
        client: anthropic, 
        customerId: 'customer_123' 
      });

      const response = await client.messages.create({
        model: 'claude-sonnet-4-0',
        max_tokens: 1024,
        messages: [{ role: 'user', content: 'Hello Claude!' }]
      });

      console.log('Tokens used:', response.usage);
      ```

      ```javascript Groq theme={null}
      import { createLLMTracker } from '@dodopayments/ingestion-blueprints';
      import Groq from 'groq-sdk';

      const groq = new Groq({ 
        apiKey: process.env.GROQ_API_KEY 
      });

      const tracker = createLLMTracker({
        apiKey: process.env.DODO_PAYMENTS_API_KEY,
        environment: 'test_mode',
        eventName: 'groq.usage'
      });

      const client = tracker.wrap({ 
        client: groq, 
        customerId: 'customer_123' 
      });

      const response = await client.chat.completions.create({
        model: 'llama-3.1-8b-instant',
        messages: [{ role: 'user', content: 'Hello!' }]
      });

      console.log('Tokens:', response.usage);
      ```

      ```javascript Google Gemini theme={null}
      import { createLLMTracker } from '@dodopayments/ingestion-blueprints';
      import { GoogleGenAI } from '@google/genai';

      const googleGenai = new GoogleGenAI({
        apiKey: process.env.GOOGLE_GENERATIVE_AI_API_KEY
      });

      const llmTracker = createLLMTracker({
        apiKey: process.env.DODO_PAYMENTS_API_KEY,
        environment: 'test_mode',
        eventName: 'gemini.usage'
      });

      const client = llmTracker.wrap({
        client: googleGenai,
        customerId: 'customer_123'
      });

      const response = await client.models.generateContent({
        model: 'gemini-2.5-flash',
        contents: 'Why is the sky blue?'
      });

      console.log('Response:', response.text);
      console.log('Usage:', response.usageMetadata);
      ```
    </CodeGroup>

    <Check>
      هذا كل شيء! الآن كل استدعاء API يتتبع تلقائيًا استخدام الرموز ويرسل الأحداث إلى Dodo Payments للفوترة.
    </Check>
  </Step>
</Steps>

***

## التكوين

### تكوين المتتبع

قم بإنشاء متتبع مرة واحدة عند بدء التطبيق مع هذه المعلمات المطلوبة:

<ParamField path="apiKey" type="string" required>
  مفتاح API الخاص بـ Dodo Payments. احصل عليه من صفحة [مفاتيح API](https://app.dodopayments.com/developer/api-keys).

  ```javascript theme={null}
  apiKey: process.env.DODO_PAYMENTS_API_KEY
  ```
</ParamField>

<ParamField path="environment" type="string" required>
  وضع البيئة لبرتوكول التتبع.

  * `test_mode` - استخدمه للتطوير والاختبار
  * `live_mode` - استخدمه للإنتاج

  ```javascript theme={null}
  environment: 'test_mode' // or 'live_mode'
  ```

  <Warning>
    استخدم دائمًا `test_mode` أثناء التطوير لتجنب التأثير على مقاييس الإنتاج.
  </Warning>
</ParamField>

<ParamField path="eventName" type="string" required>
  اسم الحدث الذي يُشغّل المقياس. يجب أن يتطابق تمامًا مع ما قمت بتكوينه في مقياس Dodo Payments الخاص بك (حساس لحالة الأحرف).

  ```javascript theme={null}
  eventName: 'llm.chat_completion'
  ```

  <Info>
    يربط اسم الحدث هذا الاستخدام المتتبع بالمقياس الصحيح لحسابات الفوترة.
  </Info>
</ParamField>

### تكوين الغلاف

عند لف عميل LLM الخاص بك، قدم هذه المعلمات:

<ParamField path="client" type="object" required>
  مثيل عميل LLM الخاص بك (OpenAI، Anthropic، Groq، إلخ).

  ```javascript theme={null}
  client: openai
  ```
</ParamField>

<ParamField path="customerId" type="string" required>
  المعرف الفريد للعميل للفوترة. يجب أن يتطابق مع معرف العميل في Dodo Payments.

  ```javascript theme={null}
  customerId: 'customer_123'
  ```

  <Tip>
    استخدم معرف مستخدم التطبيق أو معرف العميل لضمان فوترة دقيقة لكل عميل.
  </Tip>
</ParamField>

<ParamField path="metadata" type="object">
  بيانات إضافية اختيارية لإرفاقها بحدث التتبع. مفيدة للتصفية والتحليل.

  ```javascript theme={null}
  metadata: {
    feature: 'chat',
    userTier: 'premium',
    sessionId: 'session_123',
    modelVersion: 'gpt-4'
  }
  ```
</ParamField>

### مثال كامل على التكوين

<CodeGroup>
  ```javascript Full Configuration theme={null}
  import { createLLMTracker } from "@dodopayments/ingestion-blueprints";
  import { generateText } from "ai";
  import { google } from "@ai-sdk/google";
  import "dotenv/config";

  async function aiSdkExample() {
    console.log("🤖 AI SDK Simple Usage Example\n");

    try {
      // 1. Create tracker
      const llmTracker = createLLMTracker({
        apiKey: process.env.DODO_PAYMENTS_API_KEY!,
        environment: "test_mode",
        eventName: "your_meter_event_name",
      });

      // 2. Wrap the ai-sdk methods
      const client = llmTracker.wrap({
        client: { generateText },
        customerId: "customer_123",
        metadata: {
          provider: "ai-sdk",
        },
      });

      // 3. Use the wrapped function
      const response = await client.generateText({
        model: google("gemini-2.5-flash"),
        prompt: "Hello, I am a cool guy! Tell me a fun fact.",
        maxOutputTokens: 500,
      });

      console.log(response);
      console.log(response.usage);
      console.log("✅ Automatically tracked for customer\n");
    } catch (error) {
      console.error(error);
    }
  }

  aiSdkExample().catch(console.error);
  ```
</CodeGroup>

<Info>
  **التتبع التلقائي:** يقوم SDK بتتبع استخدام الرموز تلقائيًا في الخلفية دون تعديل الاستجابة. يظل الكود نظيفًا ومطابقًا لاستخدام SDK الخاص بالمزود الأصلي.
</Info>

***

## المزودون المدعومون

يعمل مخطط LLM بسلاسة مع جميع مزودي LLM الرئيسيين والمجمعين:

<AccordionGroup>
  <Accordion title="AI SDK (Vercel)" icon="code">
    تتبع الاستخدام باستخدام Vercel AI SDK لدعم LLM شامل.

    <CodeGroup>
      ```javascript AI SDK Integration theme={null}
      import { createLLMTracker } from '@dodopayments/ingestion-blueprints';
      import { generateText } from 'ai';
      import { google } from '@ai-sdk/google';

      const llmTracker = createLLMTracker({
        apiKey: process.env.DODO_PAYMENTS_API_KEY,
        environment: 'test_mode',
        eventName: 'aisdk.usage',
      });

      const client = llmTracker.wrap({
        client: { generateText },
        customerId: 'customer_123',
        metadata: {
          model: 'gemini-2.0-flash',
          feature: 'chat'
        }
      });

      const response = await client.generateText({
        model: google('gemini-2.0-flash'),
        prompt: 'Explain neural networks',
        maxOutputTokens: 500
      });

      console.log('Usage:', response.usage);
      ```
    </CodeGroup>

    **القياسات المتعقبة:**

    * `inputTokens` → `inputTokens`
    * `outputTokens` + `reasoningTokens` → `outputTokens`
    * `totalTokens` → `totalTokens`
    * اسم النموذج

    <Note>
      عند استخدام نماذج تدعم الاستدلال عبر AI SDK (مثل Gemini 2.5 Flash من Google مع وضع التفكير)، يتم تضمين رموز الاستدلال تلقائيًا في `outputTokens` لضمان فوترة دقيقة.
    </Note>
  </Accordion>

  <Accordion title="OpenRouter" icon="route">
    تتبع استخدام الرموز من أكثر من 200 نموذج عبر واجهة OpenRouter الموحدة.

    <CodeGroup>
      ```javascript OpenRouter Integration theme={null}
      import { createLLMTracker } from '@dodopayments/ingestion-blueprints';
      import OpenAI from 'openai';

      // OpenRouter uses OpenAI-compatible API
      const openrouter = new OpenAI({
        baseURL: 'https://openrouter.ai/api/v1',
        apiKey: process.env.OPENROUTER_API_KEY
      });

      const tracker = createLLMTracker({
        apiKey: process.env.DODO_PAYMENTS_API_KEY,
        environment: 'test_mode',
        eventName: 'openrouter.usage'
      });

      const client = tracker.wrap({ 
        client: openrouter, 
        customerId: 'user_123',
        metadata: { provider: 'openrouter' }
      });

      const response = await client.chat.completions.create({
        model: 'qwen/qwen3-max',
        messages: [{ role: 'user', content: 'What is machine learning?' }],
        max_tokens: 500
      });

      console.log('Response:', response.choices[0].message.content);
      console.log('Usage:', response.usage);
      ```
    </CodeGroup>

    **القياسات المتعقبة:**

    * `prompt_tokens` → `inputTokens`
    * `completion_tokens` → `outputTokens`
    * `total_tokens` → `totalTokens`
    * اسم النموذج

    <Tip>
      يوفر OpenRouter الوصول إلى نماذج من OpenAI وAnthropic وGoogle وMeta والعديد من المزودين الآخرين عبر واجهة API واحدة.
    </Tip>
  </Accordion>

  <Accordion title="OpenAI" icon="robot">
    تتبع استخدام الرموز من نماذج GPT التابعة لـ OpenAI تلقائيًا.

    <CodeGroup>
      ```javascript OpenAI Integration theme={null}
      import { createLLMTracker } from '@dodopayments/ingestion-blueprints';
      import OpenAI from 'openai';

      const openai = new OpenAI({ apiKey: process.env.OPENAI_API_KEY });

      const tracker = createLLMTracker({
        apiKey: process.env.DODO_PAYMENTS_API_KEY,
        environment: 'test_mode',
        eventName: 'openai.usage'
      });

      const client = tracker.wrap({ 
        client: openai, 
        customerId: 'user_123' 
      });

      // All OpenAI methods work automatically
      const response = await client.chat.completions.create({
        model: 'gpt-4',
        messages: [{ role: 'user', content: 'Explain quantum computing' }]
      });

      console.log('Total tokens:', response.usage.total_tokens);
      ```
    </CodeGroup>

    **القياسات المتعقبة:**

    * `prompt_tokens` → `inputTokens`
    * `completion_tokens` → `outputTokens`
    * `total_tokens` → `totalTokens`
    * اسم النموذج
  </Accordion>

  <Accordion title="Anthropic Claude" icon="robot">
    تتبع استخدام الرموز من نماذج Claude التابعة لـ Anthropic.

    <CodeGroup>
      ```javascript Anthropic Integration theme={null}
      import { createLLMTracker } from '@dodopayments/ingestion-blueprints';
      import Anthropic from '@anthropic-ai/sdk';

      const anthropic = new Anthropic({ apiKey: process.env.ANTHROPIC_API_KEY });

      const tracker = createLLMTracker({
        apiKey: process.env.DODO_PAYMENTS_API_KEY,
        environment: 'test_mode',
        eventName: 'anthropic.usage'
      });

      const client = tracker.wrap({ 
        client: anthropic, 
        customerId: 'user_123' 
      });

      const response = await client.messages.create({
        model: 'claude-sonnet-4-0',
        max_tokens: 1024,
        messages: [{ role: 'user', content: 'Explain machine learning' }]
      });

      console.log('Input tokens:', response.usage.input_tokens);
      console.log('Output tokens:', response.usage.output_tokens);
      ```
    </CodeGroup>

    **القياسات المتعقبة:**

    * `input_tokens` → `inputTokens`
    * `output_tokens` → `outputTokens`
    * `totalTokens` المحسوب
    * اسم النموذج
  </Accordion>

  <Accordion title="Groq" icon="gauge-high">
    تتبع الاستدلال عالي السرعة لنماذج LLM مع Groq.

    <CodeGroup>
      ```javascript Groq Integration theme={null}
      import { createLLMTracker } from '@dodopayments/ingestion-blueprints';
      import Groq from 'groq-sdk';

      const groq = new Groq({ apiKey: process.env.GROQ_API_KEY });

      const tracker = createLLMTracker({
        apiKey: process.env.DODO_PAYMENTS_API_KEY,
        environment: 'test_mode',
        eventName: 'groq.usage'
      });

      const client = tracker.wrap({ 
        client: groq, 
        customerId: 'user_123' 
      });

      const response = await client.chat.completions.create({
        model: 'llama-3.1-8b-instant',
        messages: [{ role: 'user', content: 'What is AI?' }]
      });

      console.log('Tokens:', response.usage);
      ```
    </CodeGroup>

    **القياسات المتعقبة:**

    * `prompt_tokens` → `inputTokens`
    * `completion_tokens` → `outputTokens`
    * `total_tokens` → `totalTokens`
    * اسم النموذج
  </Accordion>

  <Accordion title="Google Gemini" icon="sparkles">
    تتبع استخدام الرموز من نماذج Gemini التابعة لـ Google عبر Google GenAI SDK.

    <CodeGroup>
      ```javascript Google Gemini Integration theme={null}
      import { createLLMTracker } from '@dodopayments/ingestion-blueprints';
      import { GoogleGenAI } from '@google/genai';

      const googleGenai = new GoogleGenAI({ 
        apiKey: process.env.GOOGLE_GENERATIVE_AI_API_KEY 
      });

      const tracker = createLLMTracker({
        apiKey: process.env.DODO_PAYMENTS_API_KEY,
        environment: 'test_mode',
        eventName: 'gemini.usage'
      });

      const client = tracker.wrap({ 
        client: googleGenai, 
        customerId: 'user_123' 
      });

      const response = await client.models.generateContent({
        model: 'gemini-2.5-flash',
        contents: 'Explain quantum computing'
      });

      console.log('Response:', response.text);
      console.log('Usage:', response.usageMetadata);
      ```
    </CodeGroup>

    **القياسات المتعقبة:**

    * `promptTokenCount` → `inputTokens`
    * `candidatesTokenCount` + `thoughtsTokenCount` → `outputTokens`
    * `totalTokenCount` → `totalTokens`
    * إصدار النموذج

    <Note>
      **وضع التفكير في Gemini:** عند استخدام نماذج Gemini التي تدعم التفكير/الاستدلال (مثل Gemini 2.5 Pro)، يقوم SDK تلقائيًا بإضافة `thoughtsTokenCount` (رموز الاستدلال) إلى `outputTokens` لتعكس التكلفة الحسابية الكاملة بدقة.
    </Note>
  </Accordion>
</AccordionGroup>

***

## الاستخدام المتقدم

### مزودون متعددون

تتبع الاستخدام عبر مزودي LLM مختلفين مع متتبعين منفصلين:

<CodeGroup>
  ```javascript Multiple Provider Setup theme={null}
  import { createLLMTracker } from '@dodopayments/ingestion-blueprints';
  import OpenAI from 'openai';
  import Groq from 'groq-sdk';
  import Anthropic from '@anthropic-ai/sdk';
  import { GoogleGenAI } from '@google/genai';

  // Create separate trackers for different providers
  const openaiTracker = createLLMTracker({
    apiKey: process.env.DODO_PAYMENTS_API_KEY,
    environment: 'live_mode',
    eventName: 'openai.usage'
  });

  const groqTracker = createLLMTracker({
    apiKey: process.env.DODO_PAYMENTS_API_KEY,
    environment: 'live_mode',
    eventName: 'groq.usage'
  });

  const anthropicTracker = createLLMTracker({
    apiKey: process.env.DODO_PAYMENTS_API_KEY,
    environment: 'live_mode',
    eventName: 'anthropic.usage'
  });

  const geminiTracker = createLLMTracker({
    apiKey: process.env.DODO_PAYMENTS_API_KEY,
    environment: 'live_mode',
    eventName: 'gemini.usage'
  });

  const openrouterTracker = createLLMTracker({
    apiKey: process.env.DODO_PAYMENTS_API_KEY,
    environment: 'live_mode',
    eventName: 'openrouter.usage'
  });

  // Initialize clients
  const openai = new OpenAI({ apiKey: process.env.OPENAI_API_KEY });
  const groq = new Groq({ apiKey: process.env.GROQ_API_KEY });
  const anthropic = new Anthropic({ apiKey: process.env.ANTHROPIC_API_KEY });
  const googleGenai = new GoogleGenAI({ apiKey: process.env.GOOGLE_GENERATIVE_AI_API_KEY });
  const openrouter = new OpenAI({ 
    baseURL: 'https://openrouter.ai/api/v1',
    apiKey: process.env.OPENROUTER_API_KEY 
  });

  // Wrap clients
  const trackedOpenAI = openaiTracker.wrap({ client: openai, customerId: 'user_123' });
  const trackedGroq = groqTracker.wrap({ client: groq, customerId: 'user_123' });
  const trackedAnthropic = anthropicTracker.wrap({ client: anthropic, customerId: 'user_123' });
  const trackedGemini = geminiTracker.wrap({ client: googleGenai, customerId: 'user_123' });
  const trackedOpenRouter = openrouterTracker.wrap({ client: openrouter, customerId: 'user_123' });

  // Use whichever provider you need
  const response = await trackedOpenAI.chat.completions.create({...});
  // or
  const geminiResponse = await trackedGemini.models.generateContent({...});
  // or
  const openrouterResponse = await trackedOpenRouter.chat.completions.create({...});
  ```
</CodeGroup>

<Tip>
  استخدم أسماء أحداث مختلفة لمزودين مختلفين لتتبع الاستخدام بشكل منفصل في مقاييسك.
</Tip>

### تكامل API مع Express.js

مثال كامل على دمج تتبع LLM في API Express.js:

<CodeGroup>
  ```javascript Express.js Server theme={null}
  import express from 'express';
  import { createLLMTracker } from '@dodopayments/ingestion-blueprints';
  import OpenAI from 'openai';

  const app = express();
  app.use(express.json());

  // Initialize OpenAI client
  const openai = new OpenAI({ apiKey: process.env.OPENAI_API_KEY });

  // Create tracker once at startup
  const tracker = createLLMTracker({
    apiKey: process.env.DODO_PAYMENTS_API_KEY,
    environment: process.env.NODE_ENV === 'production' ? 'live_mode' : 'test_mode',
    eventName: 'api.chat_completion'
  });

  // Chat endpoint with automatic tracking
  app.post('/api/chat', async (req, res) => {
    try {
      const { message, userId } = req.body;
      
      // Validate input
      if (!message || !userId) {
        return res.status(400).json({ error: 'Missing message or userId' });
      }
      
      // Wrap client for this specific user
      const trackedClient = tracker.wrap({
        client: openai,
        customerId: userId,
        metadata: { 
          endpoint: '/api/chat',
          timestamp: new Date().toISOString()
        }
      });
      
      // Make LLM request - automatically tracked
      const response = await trackedClient.chat.completions.create({
        model: 'gpt-4',
        messages: [{ role: 'user', content: message }],
        temperature: 0.7
      });
      
      const completion = response.choices[0].message.content;
      
      res.json({ 
        message: completion,
        usage: response.usage
      });
    } catch (error) {
      console.error('Chat error:', error);
      res.status(500).json({ error: 'Internal server error' });
    }
  });

  app.listen(3000, () => {
    console.log('Server running on port 3000');
  });
  ```
</CodeGroup>

***

## ما الذي يتم تتبعه

كل استدعاء API لـ LLM يرسل تلقائيًا حدث استخدام إلى مدفوعات Dodo بالهيكل التالي:

<CodeGroup>
  ```json Event Structure theme={null}
  {
    "event_id": "llm_1673123456_abc123",
    "customer_id": "customer_123",
    "event_name": "llm.chat_completion",
    "timestamp": "2024-01-08T10:30:00Z",
    "metadata": {
      "inputTokens": 10,
      "outputTokens": 25,
      "totalTokens": 35,
      "model": "gpt-4",
    }
  }
  ```
</CodeGroup>

### حقول الحدث

<ParamField path="event_id" type="string">
  المعرف الفريد لهذا الحدث المحدد. يتم إنشاؤه تلقائيًا بواسطة SDK.

  التنسيق: `llm_[timestamp]_[random]`
</ParamField>

<ParamField path="customer_id" type="string">
  معرف العميل الذي قدمته عند تغليف العميل. يُستخدم للفوترة.
</ParamField>

<ParamField path="event_name" type="string">
  اسم الحدث الذي يُشغّل المقياس. يتطابق مع تكوين المتتبع الخاص بك.
</ParamField>

<ParamField path="timestamp" type="string">
  الطابع الزمني بصيغة ISO 8601 عندما وقع الحدث.
</ParamField>

<ParamField path="metadata" type="object">
  استخدام الرموز وبيانات التتبع الإضافية:

  * `inputTokens` - عدد رموز الإدخال/الموجه المستخدمة

  * `outputTokens` - عدد رموز المخرجات/الإكمال المستخدمة (يشمل رموز الاستدلال عند الاقتضاء)

  * `totalTokens` - إجمالي الرموز (إدخال + إخراج)

  * `model` - نموذج LLM المستخدم (مثل "gpt-4")

  * `provider` - مزود LLM (إذا كان مدرجًا في بيانات الغلاف التعريفية)

  * أي بيانات تعريف مخصصة قدمتها عند تغليف العميل

  * `inputTokens` - عدد رموز الإدخال/المطالبة المستخدمة

  * `outputTokens` - عدد رموز الإخراج/الإنجاز المستخدمة (تشمل رموز التفكير عند الاقتضاء)

  * `totalTokens` - إجمالي الرموز (الإدخال + الإخراج)

  * `model` - نموذج LLM المستخدم (مثل "gpt-4")

  * `provider` - مزود LLM (إذا تم تضمينه في بيانات التعريف الخاصة بالملف)

  * أي بيانات تعريف مخصصة قدمتها عند تغليف العميل

  <Note>
    **رموز الاستدلال:** بالنسبة للنماذج التي تدعم الاستدلال، يتضمن `outputTokens` تلقائيًا كلًا من رموز الإكمال ورموز الاستدلال.
  </Note>
</ParamField>

<Info>
  يستخدم مقياس Dodo Payments الخاص بك الحقول `metadata` (خاصة `inputTokens`، `outputTokens` أو `totalTokens`) لحساب الاستخدام والفوترة.
</Info>
