import { defineAgentIntent } from './types' import { SONNET_MODEL } from '@/lib/agent/composer/client' // kpi.explain — "Förklara siffran" on a KPI card / nyckeltal. // // The user sees a number ("rörelsemarginal 12 %") and wants to know what // drove it, how it compares to last period, and whether it's healthy for // their type of business. The agent reads the trial balance / income // statement, surfaces the underlying accounts, and contextualizes. // // Light-touch intent — captures only what the user looked at. The agent // fetches the rest via tools. interface KpiExplainArgs { kpi_key: string value?: number | null period_label?: string | null trend?: string | null } interface CapturedKpiExplain { kpi_key: string value: number | null period_label: string | null trend: string | null } export const kpiExplain = defineAgentIntent({ id: 'kpi.explain', buttonLabel: 'Förklara denna siffra', sheetTitle: 'Förklara nyckeltalet', atoms: { mode: 'declarative', horizontal: ['swedish-financial-reporting'], includeCompanyVertical: true, includeCompanyModifiers: false, }, tools: [ 'gnubok_get_kpi_report', 'gnubok_get_income_statement', 'gnubok_get_balance_sheet', 'gnubok_get_general_ledger', 'gnubok_query_journal', 'gnubok_load_skill', 'gnubok_search_tools', 'gnubok_remember_fact', 'gnubok_forget_fact', ], model: SONNET_MODEL, capture: async ({ kpi_key, value, period_label, trend }) => ({ kpi_key, value: value ?? null, period_label: period_label ?? null, trend: trend ?? null, }), promptTemplate: ({ captured, profileSummary }) => { const lines: string[] = [] if (profileSummary) lines.push(`Företagets profil: ${profileSummary}`, '') lines.push(`Användaren tittar på nyckeltalet "${captured.kpi_key}".`) if (captured.value != null) { lines.push(`Visat värde: ${captured.value.toLocaleString('sv-SE')}`) } if (captured.period_label) lines.push(`Period: ${captured.period_label}`) if (captured.trend) lines.push(`Trend: ${captured.trend}`) lines.push('') lines.push('Arbetssätt:') lines.push('1. Förklara KORT vad nyckeltalet mäter och hur det räknas ut (formel + ingående konton).') lines.push('2. Hämta gnubok_get_kpi_report / gnubok_get_income_statement för att se vad som driver siffran just nu.') lines.push('3. Peka på vad användaren kan göra om siffran är låg eller hög — utan att moralisera.') lines.push('4. Om det är ovanligt för deras bransch eller jämförelseperiod, säg det.') lines.push('') lines.push('Svara på svenska, max 4–5 korta stycken. Ditt första svar är det första användaren ser.') return lines.join('\n') }, })