import type { FastifyInstance } from 'fastify'; import type { Sql } from '../db.js'; export interface ToolCostStat { tool_name: string; mean_prompt_tokens: number; mean_completion_tokens: number; n_calls: number; updated_at: string; } // v1.13.10: per-tool token cost rolling window read endpoint. Backed by the // tool_cost_stats view in schema.sql (last 100 calls per tool, equal-split // attribution across multi-tool turns, sentinel/failed-turn excluded). // Consumed by AgentPicker for at-a-glance per-agent cost hints. export function registerToolsRoutes(app: FastifyInstance, sql: Sql): void { app.get('/api/tools/cost_stats', async () => { const rows = await sql< { tool_name: string; prompt_tokens_sum: number; completion_tokens_sum: number; n_calls: number; updated_at: string; }[] >` SELECT tool_name, prompt_tokens_sum, completion_tokens_sum, n_calls, updated_at FROM tool_cost_stats ORDER BY tool_name ASC `; const stats: ToolCostStat[] = rows.map((r) => ({ tool_name: r.tool_name, mean_prompt_tokens: Math.round(r.prompt_tokens_sum / r.n_calls), mean_completion_tokens: Math.round(r.completion_tokens_sum / r.n_calls), n_calls: r.n_calls, updated_at: r.updated_at, })); return { stats }; }); }