GNL
Dokümanlar menüsü
Core · Ücretsiz@gnldev/durable

Maliyet & fiyatlandırma gözlemlenebilirliği

Journal'dan run başına token/maliyet/trace hesaplar; fiyat tablosunu journal'dan (__pricing__) versiyonlu okur.

Ne işe yarar / ne zaman kullanılır#

GNL, model çağrılarının usage bilgisini (input/output/cached token) journal'a yazar. getRunCost bu journal'ı POST-HOC tarayarak run başına tam ve deterministik bir maliyet hesabı çıkarır — canlı/tahmini bir "cost guard" değil, gerçekten olan biteni birebir toplar. Bir run bittikten sonra "bu konuşma bana kaça mal oldu, hangi model ne kadar tüketti" sorusuna cevap gerektiğinde, fatura/kullanım raporu üretirken ya da OTel uyumlu bir gözlemlenebilirlik zincirine (trace exporter) beslemek istediğinizde kullanılır.

Kurulum / import#

Ayrı bir alt-paket gerekmez; @gnldev/durable kök export'undan gelir.

import { getRunCost, toTraceSpans } from '@gnldev/durable';

Adım adım kullanım#

getRunCost, bir JournalReader ve runId alır; run'daki tüm model girdilerinin usage'ını toplar, fiyat tablosundan (varsayılan DEFAULT_PRICING) maliyeti hesaplar:

const cost = await getRunCost(reader, runId);
// { runId, inputTokens, outputTokens, cachedTokens, totalTokens,
//   modelCalls, toolCalls, costUsd, byModel: { 'claude-sonnet-5': { calls, tokens, costUsd }, ... } }

Kendi fiyat tablonuzu geçmek isterseniz opts.pricing ile override edebilirsiniz; journal'da model id'si yoksa (mock model vb.) opts.modelId ile varsayılan atarsınız:

const cost = await getRunCost(reader, runId, { modelId: 'claude-sonnet-5' });

Bir OTel exporter'a beslemek veya waterfall görselleştirmesi için journal'ı gen_ai.* semantik-uyumlu span listesine çevirin:

const spans = await toTraceSpans(reader, runId);
// [{ name: 'llm.generate' | 'tool.execute', kind: 'model' | 'tool', runId, seq, attributes }, ...]

Fiyat tablosunu deploy gerektirmeden güncellemek isterseniz journal'daki __pricing__ dokümanını okuyup etkin tabloyu alabilirsiniz (journal'da kayıt yoksa DEFAULT_PRICING'e düşer):

import { effectivePricingTable } from '@gnldev/durable';
const table = await effectivePricingTable(journal); // __pricing__ (varsa) > DEFAULT_PRICING

Studio, aynı hesaplamayı REST üzerinden sunar — kendi backend'inizde tekrar implemente etmeniz gerekmez:

Studio REST
GET /runs/:id/cost   → getRunCost(reader, id)
GET /runs/:id/trace  → journal'dan waterfall span'leri (maliyet dahil)

API referansı#

fngetRunCost

Journal'dan run için toplam/model-bazlı token ve USD maliyeti hesaplar (async).

fntoTraceSpans

Journal girdilerini OTel gen_ai semantiğiyle uyumlu TraceSpan listesine çevirir (async).

typeRunCost

getRunCost dönüş tipi: inputTokens/outputTokens/cachedTokens/totalTokens/modelCalls/toolCalls/costUsd/byModel.

typeTraceSpan

name/kind/runId/seq/attributes alanlarına sahip tekil span kaydı.

constDEFAULT_PRICING

Güncel Anthropic ve OpenAI aileleri için yaklaşık model fiyat tablosu ($/1M token). Eşleşme en uzun önekle yapılır, yani tek bir girdi bütün bir aileyi fiyatlar; journal’daki fiyat dokümanı da bunun üstüne biner (effectivePricingTable).

fnpriceFor

modelId için fiyatı çözer: önce tam eşleşme, yoksa en uzun (en spesifik) prefix eşleşmesi.

fncostOf

Bir usage kaydından USD maliyeti hesaplar; cached token ayrı fiyatlanır.

fnreadPricing

Journal'daki __pricing__ PricingDoc'unu canlı okur (yoksa undefined).

fneffectivePricingTable

Etkin fiyat tablosu: journal __pricing__ (varsa) > DEFAULT_PRICING.

constPRICING_KEY

Fiyat dokümanının journal anahtarı: '__pricing__'.

typeModelPricing

inputPer1M / outputPer1M / cachedInputPer1M (opsiyonel) alanlarına sahip fiyat kaydı.

Not
DEFAULT_PRICING tablosundaki rakamlar yaklaşıktır — kendi anlaşmanıza göre __pricing__ dokümanını journal'a yazarak (Studio üzerinden veya doğrudan) canlı, versiyonlu bir fiyat tablosuna geçebilirsiniz; her güncelleme PricingDoc.version'ı artırır ve audit ile tam geçmişi tutulur.
İlişkili
Kota/limit uygulamak isterseniz budget-quota sayfasına, bu maliyet/trace verisini Studio'nun timeline'ında görsel olarak incelemek için studio-inspector sayfasına bakın.