Dokümanlar menüsü
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_PRICINGStudio, aynı hesaplamayı REST üzerinden sunar — kendi backend'inizde tekrar implemente etmeniz gerekmez:
GET /runs/:id/cost → getRunCost(reader, id)
GET /runs/:id/trace → journal'dan waterfall span'leri (maliyet dahil)API referansı#
getRunCostJournal'dan run için toplam/model-bazlı token ve USD maliyeti hesaplar (async).
toTraceSpansJournal girdilerini OTel gen_ai semantiğiyle uyumlu TraceSpan listesine çevirir (async).
RunCostgetRunCost dönüş tipi: inputTokens/outputTokens/cachedTokens/totalTokens/modelCalls/toolCalls/costUsd/byModel.
TraceSpanname/kind/runId/seq/attributes alanlarına sahip tekil span kaydı.
DEFAULT_PRICINGGü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).
priceFormodelId için fiyatı çözer: önce tam eşleşme, yoksa en uzun (en spesifik) prefix eşleşmesi.
costOfBir usage kaydından USD maliyeti hesaplar; cached token ayrı fiyatlanır.
readPricingJournal'daki __pricing__ PricingDoc'unu canlı okur (yoksa undefined).
effectivePricingTableEtkin fiyat tablosu: journal __pricing__ (varsa) > DEFAULT_PRICING.
PRICING_KEYFiyat dokümanının journal anahtarı: '__pricing__'.
ModelPricinginputPer1M / outputPer1M / cachedInputPer1M (opsiyonel) alanlarına sahip fiyat kaydı.
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.budget-quota sayfasına, bu maliyet/trace verisini Studio'nun timeline'ında görsel olarak incelemek için studio-inspector sayfasına bakın.