fix(bot): scale llm purchase confidence values

This commit is contained in:
2026-03-11 03:00:12 +04:00
parent 3c0a53981a
commit 5d83309a9e
3 changed files with 56 additions and 2 deletions

View File

@@ -19,6 +19,11 @@ function asBigInt(value: string): bigint | null {
return parsed > 0n ? parsed : null return parsed > 0n ? parsed : null
} }
function normalizeConfidence(value: number): number {
const scaled = value >= 0 && value <= 1 ? value * 100 : value
return Math.max(0, Math.min(100, Math.round(scaled)))
}
export function createOpenAiParserFallback( export function createOpenAiParserFallback(
apiKey: string | undefined, apiKey: string | undefined,
model: string model: string
@@ -116,7 +121,7 @@ export function createOpenAiParserFallback(
amountMinor, amountMinor,
currency: parsedJson.currency, currency: parsedJson.currency,
itemDescription: parsedJson.itemDescription, itemDescription: parsedJson.itemDescription,
confidence: Math.max(0, Math.min(100, Math.round(parsedJson.confidence))), confidence: normalizeConfidence(parsedJson.confidence),
parserMode: 'llm', parserMode: 'llm',
needsReview: parsedJson.needsReview needsReview: parsedJson.needsReview
} }

View File

@@ -95,4 +95,48 @@ describe('createOpenAiPurchaseInterpreter', () => {
globalThis.fetch = originalFetch globalThis.fetch = originalFetch
} }
}) })
test('scales 0-1 confidence values into 0-100', async () => {
const interpreter = createOpenAiPurchaseInterpreter('test-key', 'gpt-5-mini')
expect(interpreter).toBeDefined()
const originalFetch = globalThis.fetch
globalThis.fetch = (async () =>
successfulResponse({
output: [
{
content: [
{
text: JSON.stringify({
decision: 'purchase',
amountMinor: '5000',
currency: 'GEL',
itemDescription: 'шампунь',
confidence: 0.92,
clarificationQuestion: null
})
}
]
}
]
})) as unknown as typeof fetch
try {
const result = await interpreter!('Купил шампунь на 50 лари', {
defaultCurrency: 'GEL'
})
expect(result).toEqual<PurchaseInterpretation>({
decision: 'purchase',
amountMinor: 5000n,
currency: 'GEL',
itemDescription: 'шампунь',
confidence: 92,
parserMode: 'llm',
clarificationQuestion: null
})
} finally {
globalThis.fetch = originalFetch
}
})
}) })

View File

@@ -46,6 +46,11 @@ function normalizeCurrency(value: string | null): 'GEL' | 'USD' | null {
return value === 'GEL' || value === 'USD' ? value : null return value === 'GEL' || value === 'USD' ? value : null
} }
function normalizeConfidence(value: number): number {
const scaled = value >= 0 && value <= 1 ? value * 100 : value
return Math.max(0, Math.min(100, Math.round(scaled)))
}
export function createOpenAiPurchaseInterpreter( export function createOpenAiPurchaseInterpreter(
apiKey: string | undefined, apiKey: string | undefined,
model: string model: string
@@ -170,7 +175,7 @@ export function createOpenAiPurchaseInterpreter(
amountMinor: asOptionalBigInt(parsedJson.amountMinor), amountMinor: asOptionalBigInt(parsedJson.amountMinor),
currency: normalizeCurrency(parsedJson.currency), currency: normalizeCurrency(parsedJson.currency),
itemDescription: normalizeOptionalText(parsedJson.itemDescription), itemDescription: normalizeOptionalText(parsedJson.itemDescription),
confidence: Math.max(0, Math.min(100, Math.round(parsedJson.confidence))), confidence: normalizeConfidence(parsedJson.confidence),
parserMode: 'llm', parserMode: 'llm',
clarificationQuestion clarificationQuestion
} }