import { query } from "@anthropic-ai/claude-agent-sdk";
class CostTracker {
private processedMessageIds = new Set<string>();
private stepUsages: Array<any> = [];
async trackConversation(prompt: string) {
const result = await query({
prompt,
options: {
onMessage: (message) => {
this.processMessage(message);
}
}
});
return {
result,
stepUsages: this.stepUsages,
totalCost: result.usage?.total_cost_usd || 0
};
}
private processMessage(message: any) {
// 使用量を持つアシスタントメッセージのみを処理
if (message.type !== 'assistant' || !message.usage) {
return;
}
// このメッセージIDを既に処理している場合はスキップ
if (this.processedMessageIds.has(message.id)) {
return;
}
// 処理済みとしてマークし、使用量を記録
this.processedMessageIds.add(message.id);
this.stepUsages.push({
messageId: message.id,
timestamp: new Date().toISOString(),
usage: message.usage,
costUSD: this.calculateCost(message.usage)
});
}
private calculateCost(usage: any): number {
// ここで価格計算を実装
// これは簡略化された例です
const inputCost = usage.input_tokens * 0.00003;
const outputCost = usage.output_tokens * 0.00015;
const cacheReadCost = (usage.cache_read_input_tokens || 0) * 0.0000075;
return inputCost + outputCost + cacheReadCost;
}
}
// 使用方法
const tracker = new CostTracker();
const { result, stepUsages, totalCost } = await tracker.trackConversation(
"このコードを分析してリファクタリングしてください"
);
console.log(`処理されたステップ: ${stepUsages.length}`);
console.log(`合計コスト: $${totalCost.toFixed(4)}`);