diff --git a/src/logic/cache.ts b/src/logic/cache.ts index cee17f5..d19d25c 100644 --- a/src/logic/cache.ts +++ b/src/logic/cache.ts @@ -22,7 +22,8 @@ export class Cache { private ttlMs: number; constructor(ttlSeconds?: number) { - this.ttlMs = (ttlSeconds ?? Number(process.env.CACHE_TTL_SECONDS) ?? 300) * 1000; + const envTtl = Number(process.env.CACHE_TTL_SECONDS); + this.ttlMs = (ttlSeconds ?? (Number.isFinite(envTtl) ? envTtl : 300)) * 1000; } /** diff --git a/src/logic/synth.ts b/src/logic/synth.ts index 63e006f..d8e9b14 100644 --- a/src/logic/synth.ts +++ b/src/logic/synth.ts @@ -106,13 +106,14 @@ export async function synthesise( const choice = body.choices?.[0]; const usage = body.usage ?? {}; + const answerText = choice?.message?.content; + if (!answerText) { + throw new Error("OpenAI returned an empty response"); + } return { - answer: choice?.message?.content ?? "No answer generated.", + answer: answerText, confidence: scoreConfidence(sources), - tokens: { - in: usage.prompt_tokens ?? 0, - out: usage.completion_tokens ?? 0, - }, + tokens: { in: usage.prompt_tokens ?? 0, out: usage.completion_tokens ?? 0 }, model, }; } diff --git a/tests/logic/cache.test.ts b/tests/logic/cache.test.ts index d598a86..e36aa35 100644 --- a/tests/logic/cache.test.ts +++ b/tests/logic/cache.test.ts @@ -58,6 +58,25 @@ describe("Cache", () => { test("hitRate is 0 when no operations", () => { expect(cache.stats().hitRate).toBe(0); }); + + test("defaults to 300s TTL when no args and env var unset", () => { + const saved = process.env.CACHE_TTL_SECONDS; + delete process.env.CACHE_TTL_SECONDS; + const c = new Cache(); + c.set("k", "v"); + // Should be retrievable immediately (not expired) + expect(c.get("k")).not.toBeNull(); + expect(c.stats().size).toBe(1); + if (saved !== undefined) process.env.CACHE_TTL_SECONDS = saved; + }); + + test("respects CACHE_TTL_SECONDS env var", () => { + process.env.CACHE_TTL_SECONDS = "1"; + const c = new Cache(); + c.set("k", "v"); + expect(c.get("k")).not.toBeNull(); + delete process.env.CACHE_TTL_SECONDS; + }); }); describe("Cache.normalizeKey", () => { diff --git a/tests/logic/synth.test.ts b/tests/logic/synth.test.ts index da3edbf..37e2bcd 100644 --- a/tests/logic/synth.test.ts +++ b/tests/logic/synth.test.ts @@ -76,4 +76,10 @@ describe("scoreConfidence", () => { expect(scoreAgree).toBeGreaterThan(scoreDisagree); }); + + test("single source scores lower than multiple sources", () => { + const one = [makeSource()]; + const three = [makeSource(), makeSource(), makeSource()]; + expect(scoreConfidence(three)).toBeGreaterThan(scoreConfidence(one)); + }); });