Skip to main content
This guide covers how to send Google AI usage data to Fenra.

Gemini API

import { GoogleGenerativeAI } from '@google/generative-ai';

const genAI = new GoogleGenerativeAI(process.env.GOOGLE_API_KEY);

async function chat(prompt) {
  const model = genAI.getGenerativeModel({ model: 'gemini-1.5-pro' });
  const result = await model.generateContent(prompt);
  const usage = result.response.usageMetadata;

  // Send to Fenra
  await fetch('https://ingest.fenra.io/usage/transactions', {
    method: 'POST',
    headers: {
      'Content-Type': 'application/json',
      'X-Api-Key': process.env.FENRA_API_KEY
    },
    body: JSON.stringify({
      provider: 'gemini',
      model: 'gemini-1.5-pro',
      usage: [{
        type: 'tokens',
        metrics: {
          input_tokens: usage.promptTokenCount,
          output_tokens: usage.candidatesTokenCount,
          total_tokens: usage.totalTokenCount
        }
      }],
      context: {
        billable_customer_id: process.env.BILLABLE_CUSTOMER_ID
      }
    })
  });

  return result.response;
}

Context Caching

When using context caching, include cached tokens:
usage: [{
  type: 'tokens',
  metrics: {
    input_tokens: usage.promptTokenCount,
    output_tokens: usage.candidatesTokenCount,
    total_tokens: usage.totalTokenCount,
    cached_tokens: usage.cachedContentTokenCount || 0
  }
}]

Multimodal Inputs

Gemini handles images, video, and audio natively. Token counts include all modalities, so no separate tracking is needed.

Thinking Tokens

For Gemini 2.5 models with thinking enabled, include thinking tokens:
usage: [{
  type: 'tokens',
  metrics: {
    input_tokens: usage.promptTokenCount,
    output_tokens: usage.candidatesTokenCount,
    total_tokens: usage.totalTokenCount,
    thinking_tokens: usage.thoughtsTokenCount || 0
  }
}]
When using Google Search grounding, track the tool invocations:
const result = await model.generateContent({
  contents: prompt,
  tools: [{ functionDeclarations: [searchTool] }]
});

// Check if grounding was used
const groundingMetadata = result.response.groundingMetadata;
const searchQueries = groundingMetadata?.webSearchQueries || [];

await fetch('https://ingest.fenra.io/usage/transactions', {
  method: 'POST',
  headers: {
    'Content-Type': 'application/json',
    'X-Api-Key': process.env.FENRA_API_KEY
  },
  body: JSON.stringify({
    provider: 'gemini',
    model: 'gemini-1.5-pro',
    usage: [
      {
        type: 'tokens',
        metrics: {
          input_tokens: usage.promptTokenCount,
          output_tokens: usage.candidatesTokenCount,
          total_tokens: usage.totalTokenCount
        }
      },
      {
        type: 'requests',
        metrics: {
          count: searchQueries.length,
          request_type: 'google_grounding'
        }
      }
    ],
    context: {
      billable_customer_id: process.env.BILLABLE_CUSTOMER_ID
    }
  })
});

Supported Models

Fenra supports all Google Gemini models. Common models include:
ModelContext Window
gemini-2.0-flash1M tokens
gemini-1.5-pro2M tokens
gemini-1.5-flash1M tokens
gemini-1.5-flash-8b1M tokens

Next Steps