From 0ed594f6bab045dd8894d2bf975164e4d05d5f7a Mon Sep 17 00:00:00 2001 From: david Date: Fri, 28 Aug 2026 12:06:43 +0200 Subject: [PATCH] fix: tolerate omitted cache_read_tokens in live Surplus sales --- supplier/src/surplus/client.ts | 2 +- tests/unit/surplus-client.test.ts | 20 +++++++++++++++++++- 2 files changed, 20 insertions(+), 2 deletions(-) diff --git a/supplier/src/surplus/client.ts b/supplier/src/surplus/client.ts index 2e18ca7..2cbb4af 100644 --- a/supplier/src/surplus/client.ts +++ b/supplier/src/surplus/client.ts @@ -582,7 +582,7 @@ function parseSale(value: unknown, index: number): SurplusSale { inputTokens: nonNegativeSafeInteger(item.input_tokens, `Surplus sale ${index}.input_tokens`), outputTokens: nonNegativeSafeInteger(item.output_tokens, `Surplus sale ${index}.output_tokens`), cacheReadTokens: nonNegativeSafeInteger( - item.cache_read_tokens, + item.cache_read_tokens ?? 0, `Surplus sale ${index}.cache_read_tokens`, ), effectiveInputUsdPer1m: nonNegativeNumber( diff --git a/tests/unit/surplus-client.test.ts b/tests/unit/surplus-client.test.ts index ab238e5..abf83e3 100644 --- a/tests/unit/surplus-client.test.ts +++ b/tests/unit/surplus-client.test.ts @@ -334,6 +334,25 @@ describe("SurplusClient", () => { ); expect(earnings.recentSales[0].createdAtMs).toBe(1787831146968); }); + it("defaults omitted cache_read_tokens to zero as the live API sends", async () => { + const sparse = saleRow("sale-sparse"); + delete sparse.cache_read_tokens; + delete sparse.tx_hash; + const client = new SurplusClient({ + apiBaseUrl: "https://api.surplusintelligence.ai", + sellerApiKey: "si_seller_test", + timeoutMs: 1_000, + fetchFn: async () => Response.json(earningsEnvelope([sparse])), + }); + + const earnings = await client.getEarnings(); + + expect(earnings.recentSales[0]).toMatchObject({ + id: "sale-sparse", + cacheReadTokens: 0, + transactionHash: null, + }); + }); it("returns the deduplicated observed sale window in deterministic sale-id order", async () => { const duplicate = saleRow("sale-a", { @@ -384,7 +403,6 @@ describe("SurplusClient", () => { "seller_cost_usdc", "input_tokens", "output_tokens", - "cache_read_tokens", "effective_input_per_1m", "effective_output_per_1m", ];