Add totalTokens field to Usage type

- Added totalTokens field to Usage interface in pi-ai
- Anthropic: computed as input + output + cacheRead + cacheWrite
- OpenAI/Google: uses native total_tokens/totalTokenCount
- Fixed openai-completions to compute totalTokens when reasoning tokens present
- Updated calculateContextTokens() to use totalTokens field
- Added comprehensive test covering 13 providers

fixes #130
This commit is contained in:
Mario Zechner 2025-12-06 22:46:02 +01:00
parent 52f1a8cb31
commit 86e5a70ec4
22 changed files with 552 additions and 70 deletions

View file

@ -56,11 +56,13 @@ export const simpleHtml = {
output: 375,
cacheRead: 0,
cacheWrite: 0,
totalTokens: 0,
cost: {
input: 0.0030632000000000003,
output: 0.0015,
cacheRead: 0,
cacheWrite: 0,
totalTokens: 0,
total: 0.0045632,
},
},
@ -89,11 +91,13 @@ export const simpleHtml = {
output: 162,
cacheRead: 0,
cacheWrite: 0,
totalTokens: 0,
cost: {
input: 0.003376,
output: 0.0006479999999999999,
cacheRead: 0,
cacheWrite: 0,
totalTokens: 0,
total: 0.004024,
},
},
@ -159,11 +163,13 @@ export const longSession = {
output: 455,
cacheRead: 0,
cacheWrite: 0,
totalTokens: 0,
cost: {
input: 0.0030632000000000003,
output: 0.00182,
cacheRead: 0,
cacheWrite: 0,
totalTokens: 0,
total: 0.004883200000000001,
},
},
@ -192,11 +198,13 @@ export const longSession = {
output: 147,
cacheRead: 0,
cacheWrite: 0,
totalTokens: 0,
cost: {
input: 0.0034384000000000003,
output: 0.000588,
cacheRead: 0,
cacheWrite: 0,
totalTokens: 0,
total: 0.0040264,
},
},
@ -235,11 +243,13 @@ export const longSession = {
output: 96,
cacheRead: 0,
cacheWrite: 0,
totalTokens: 0,
cost: {
input: 0.0035656000000000004,
output: 0.000384,
cacheRead: 0,
cacheWrite: 0,
totalTokens: 0,
total: 0.0039496,
},
},
@ -267,11 +277,13 @@ export const longSession = {
output: 0,
cacheRead: 0,
cacheWrite: 0,
totalTokens: 0,
cost: {
input: 0,
output: 0,
cacheRead: 0,
cacheWrite: 0,
totalTokens: 0,
total: 0,
},
},
@ -312,11 +324,13 @@ export const longSession = {
output: 115,
cacheRead: 0,
cacheWrite: 0,
totalTokens: 0,
cost: {
input: 0.0049456000000000005,
output: 0.00045999999999999996,
cacheRead: 0,
cacheWrite: 0,
totalTokens: 0,
total: 0.005405600000000001,
},
},
@ -348,11 +362,13 @@ export const longSession = {
output: 86,
cacheRead: 0,
cacheWrite: 0,
totalTokens: 0,
cost: {
input: 0.0050696000000000005,
output: 0.00034399999999999996,
cacheRead: 0,
cacheWrite: 0,
totalTokens: 0,
total: 0.0054136,
},
},
@ -391,11 +407,13 @@ export const longSession = {
output: 294,
cacheRead: 0,
cacheWrite: 0,
totalTokens: 0,
cost: {
input: 0.005151200000000001,
output: 0.001176,
cacheRead: 0,
cacheWrite: 0,
totalTokens: 0,
total: 0.006327200000000001,
},
},
@ -428,11 +446,13 @@ export const longSession = {
output: 159,
cacheRead: 0,
cacheWrite: 0,
totalTokens: 0,
cost: {
input: 0.0054152,
output: 0.000636,
cacheRead: 0,
cacheWrite: 0,
totalTokens: 0,
total: 0.0060512000000000005,
},
},
@ -471,11 +491,13 @@ export const longSession = {
output: 379,
cacheRead: 0,
cacheWrite: 0,
totalTokens: 0,
cost: {
input: 0.005566400000000001,
output: 0.001516,
cacheRead: 0,
cacheWrite: 0,
totalTokens: 0,
total: 0.007082400000000001,
},
},
@ -516,11 +538,13 @@ export const longSession = {
output: 537,
cacheRead: 0,
cacheWrite: 0,
totalTokens: 0,
cost: {
input: 0.005900000000000001,
output: 0.0021479999999999997,
cacheRead: 0,
cacheWrite: 0,
totalTokens: 0,
total: 0.008048,
},
},
@ -547,11 +571,13 @@ export const longSession = {
output: 0,
cacheRead: 0,
cacheWrite: 0,
totalTokens: 0,
cost: {
input: 0,
output: 0,
cacheRead: 0,
cacheWrite: 0,
totalTokens: 0,
total: 0,
},
},
@ -583,11 +609,13 @@ export const longSession = {
output: 0,
cacheRead: 0,
cacheWrite: 0,
totalTokens: 0,
cost: {
input: 0,
output: 0,
cacheRead: 0,
cacheWrite: 0,
totalTokens: 0,
total: 0,
},
},
@ -627,11 +655,13 @@ export const longSession = {
output: 492,
cacheRead: 0,
cacheWrite: 0,
totalTokens: 0,
cost: {
input: 0.024597,
output: 0.00738,
cacheRead: 0,
cacheWrite: 0,
totalTokens: 0,
total: 0.031977,
},
},
@ -672,11 +702,13 @@ export const longSession = {
output: 213,
cacheRead: 0,
cacheWrite: 0,
totalTokens: 0,
cost: {
input: 0.026211,
output: 0.003195,
cacheRead: 0,
cacheWrite: 0,
totalTokens: 0,
total: 0.029406,
},
},
@ -709,11 +741,13 @@ export const longSession = {
output: 134,
cacheRead: 0,
cacheWrite: 0,
totalTokens: 0,
cost: {
input: 0.026958,
output: 0.00201,
cacheRead: 0,
cacheWrite: 0,
totalTokens: 0,
total: 0.028968,
},
},
@ -752,11 +786,13 @@ export const longSession = {
output: 331,
cacheRead: 0,
cacheWrite: 0,
totalTokens: 0,
cost: {
input: 0.02739,
output: 0.004965,
cacheRead: 0,
cacheWrite: 0,
totalTokens: 0,
total: 0.032355,
},
},
@ -788,11 +824,13 @@ export const longSession = {
output: 53,
cacheRead: 0,
cacheWrite: 0,
totalTokens: 0,
cost: {
input: 0.028443,
output: 0.000795,
cacheRead: 0,
cacheWrite: 0,
totalTokens: 0,
total: 0.029238,
},
},
@ -831,11 +869,13 @@ export const longSession = {
output: 329,
cacheRead: 0,
cacheWrite: 0,
totalTokens: 0,
cost: {
input: 0.028623,
output: 0.004935,
cacheRead: 0,
cacheWrite: 0,
totalTokens: 0,
total: 0.033558,
},
},
@ -867,11 +907,13 @@ export const longSession = {
output: 46,
cacheRead: 0,
cacheWrite: 0,
totalTokens: 0,
cost: {
input: 0.029670000000000002,
output: 0.00069,
cacheRead: 0,
cacheWrite: 0,
totalTokens: 0,
total: 0.03036,
},
},
@ -897,11 +939,13 @@ export const longSession = {
output: 0,
cacheRead: 0,
cacheWrite: 0,
totalTokens: 0,
cost: {
input: 0,
output: 0,
cacheRead: 0,
cacheWrite: 0,
totalTokens: 0,
total: 0,
},
},
@ -937,11 +981,13 @@ export const longSession = {
output: 285,
cacheRead: 0,
cacheWrite: 0,
totalTokens: 0,
cost: {
input: 0.029856,
output: 0.004275,
cacheRead: 0,
cacheWrite: 0,
totalTokens: 0,
total: 0.034131,
},
},
@ -974,11 +1020,13 @@ export const longSession = {
output: 39,
cacheRead: 0,
cacheWrite: 0,
totalTokens: 0,
cost: {
input: 0.030831,
output: 0.000585,
cacheRead: 0,
cacheWrite: 0,
totalTokens: 0,
total: 0.031416,
},
},
@ -1017,11 +1065,13 @@ export const longSession = {
output: 473,
cacheRead: 0,
cacheWrite: 0,
totalTokens: 0,
cost: {
input: 0.030993,
output: 0.007095000000000001,
cacheRead: 0,
cacheWrite: 0,
totalTokens: 0,
total: 0.038088,
},
},
@ -1048,11 +1098,13 @@ export const longSession = {
output: 0,
cacheRead: 0,
cacheWrite: 0,
totalTokens: 0,
cost: {
input: 0,
output: 0,
cacheRead: 0,
cacheWrite: 0,
totalTokens: 0,
total: 0,
},
},
@ -1088,11 +1140,13 @@ export const longSession = {
output: 348,
cacheRead: 0,
cacheWrite: 0,
totalTokens: 0,
cost: {
input: 0.032556,
output: 0.00522,
cacheRead: 0,
cacheWrite: 0,
totalTokens: 0,
total: 0.037776000000000004,
},
},
@ -1133,11 +1187,13 @@ export const longSession = {
output: 310,
cacheRead: 0,
cacheWrite: 0,
totalTokens: 0,
cost: {
input: 0.033942,
output: 0.0046500000000000005,
cacheRead: 0,
cacheWrite: 0,
totalTokens: 0,
total: 0.038592,
},
},
@ -1170,11 +1226,13 @@ export const longSession = {
output: 53,
cacheRead: 0,
cacheWrite: 0,
totalTokens: 0,
cost: {
input: 0.034977,
output: 0.000795,
cacheRead: 0,
cacheWrite: 0,
totalTokens: 0,
total: 0.035772,
},
},
@ -1213,11 +1271,13 @@ export const longSession = {
output: 423,
cacheRead: 0,
cacheWrite: 0,
totalTokens: 0,
cost: {
input: 0.035160000000000004,
output: 0.006345,
cacheRead: 0,
cacheWrite: 0,
totalTokens: 0,
total: 0.041505,
},
},
@ -1258,11 +1318,13 @@ export const longSession = {
output: 193,
cacheRead: 0,
cacheWrite: 0,
totalTokens: 0,
cost: {
input: 0.036651,
output: 0.002895,
cacheRead: 0,
cacheWrite: 0,
totalTokens: 0,
total: 0.039546000000000005,
},
},
@ -1295,11 +1357,13 @@ export const longSession = {
output: 104,
cacheRead: 0,
cacheWrite: 0,
totalTokens: 0,
cost: {
input: 0.037557,
output: 0.00156,
cacheRead: 0,
cacheWrite: 0,
totalTokens: 0,
total: 0.039117,
},
},
@ -1334,11 +1398,13 @@ export const longSession = {
output: 146,
cacheRead: 0,
cacheWrite: 0,
totalTokens: 0,
cost: {
input: 0.037911,
output: 0.00219,
cacheRead: 0,
cacheWrite: 0,
totalTokens: 0,
total: 0.040101,
},
},
@ -1371,11 +1437,13 @@ export const longSession = {
output: 63,
cacheRead: 0,
cacheWrite: 0,
totalTokens: 0,
cost: {
input: 0.038535,
output: 0.000945,
cacheRead: 0,
cacheWrite: 0,
totalTokens: 0,
total: 0.03948,
},
},
@ -1401,11 +1469,13 @@ export const longSession = {
output: 0,
cacheRead: 0,
cacheWrite: 0,
totalTokens: 0,
cost: {
input: 0,
output: 0,
cacheRead: 0,
cacheWrite: 0,
totalTokens: 0,
total: 0,
},
},
@ -1445,11 +1515,13 @@ export const longSession = {
output: 324,
cacheRead: 0,
cacheWrite: 0,
totalTokens: 0,
cost: {
input: 0.038823,
output: 0.00486,
cacheRead: 0,
cacheWrite: 0,
totalTokens: 0,
total: 0.043683,
},
},
@ -1490,11 +1562,13 @@ export const longSession = {
output: 385,
cacheRead: 0,
cacheWrite: 0,
totalTokens: 0,
cost: {
input: 0.040605,
output: 0.005775,
cacheRead: 0,
cacheWrite: 0,
totalTokens: 0,
total: 0.046380000000000005,
},
},
@ -1531,11 +1605,13 @@ export const longSession = {
output: 436,
cacheRead: 0,
cacheWrite: 0,
totalTokens: 0,
cost: {
input: 0.043749,
output: 0.00654,
cacheRead: 0,
cacheWrite: 0,
totalTokens: 0,
total: 0.050289,
},
},
@ -1571,11 +1647,13 @@ export const longSession = {
output: 685,
cacheRead: 0,
cacheWrite: 0,
totalTokens: 0,
cost: {
input: 0.045105,
output: 0.010275,
cacheRead: 0,
cacheWrite: 0,
totalTokens: 0,
total: 0.05538,
},
},
@ -1615,11 +1693,13 @@ export const longSession = {
output: 683,
cacheRead: 0,
cacheWrite: 0,
totalTokens: 0,
cost: {
input: 0.047214,
output: 0.010245,
cacheRead: 0,
cacheWrite: 0,
totalTokens: 0,
total: 0.057458999999999996,
},
},
@ -1664,11 +1744,13 @@ export const longSession = {
output: 3462,
cacheRead: 0,
cacheWrite: 0,
totalTokens: 0,
cost: {
input: 0.058758000000000005,
output: 0.051930000000000004,
cacheRead: 0,
cacheWrite: 0,
totalTokens: 0,
total: 0.11068800000000001,
},
},
@ -1697,11 +1779,13 @@ export const longSession = {
output: 223,
cacheRead: 0,
cacheWrite: 0,
totalTokens: 0,
cost: {
input: 0.069195,
output: 0.003345,
cacheRead: 0,
cacheWrite: 0,
totalTokens: 0,
total: 0.07254000000000001,
},
},
@ -1740,11 +1824,13 @@ export const longSession = {
output: 335,
cacheRead: 0,
cacheWrite: 0,
totalTokens: 0,
cost: {
input: 0.06991800000000001,
output: 0.005025,
cacheRead: 0,
cacheWrite: 0,
totalTokens: 0,
total: 0.07494300000000001,
},
},
@ -1785,11 +1871,13 @@ export const longSession = {
output: 499,
cacheRead: 0,
cacheWrite: 0,
totalTokens: 0,
cost: {
input: 0.075036,
output: 0.007485,
cacheRead: 0,
cacheWrite: 0,
totalTokens: 0,
total: 0.08252100000000001,
},
},
@ -1830,11 +1918,13 @@ export const longSession = {
output: 462,
cacheRead: 0,
cacheWrite: 0,
totalTokens: 0,
cost: {
input: 0.078387,
output: 0.00693,
cacheRead: 0,
cacheWrite: 0,
totalTokens: 0,
total: 0.085317,
},
},
@ -1875,11 +1965,13 @@ export const longSession = {
output: 431,
cacheRead: 0,
cacheWrite: 0,
totalTokens: 0,
cost: {
input: 0.079914,
output: 0.006465,
cacheRead: 0,
cacheWrite: 0,
totalTokens: 0,
total: 0.086379,
},
},
@ -1920,11 +2012,13 @@ export const longSession = {
output: 335,
cacheRead: 0,
cacheWrite: 0,
totalTokens: 0,
cost: {
input: 0.083382,
output: 0.005025,
cacheRead: 0,
cacheWrite: 0,
totalTokens: 0,
total: 0.088407,
},
},
@ -1969,11 +2063,13 @@ export const longSession = {
output: 1209,
cacheRead: 0,
cacheWrite: 0,
totalTokens: 0,
cost: {
input: 0.08655600000000001,
output: 0.018135000000000002,
cacheRead: 0,
cacheWrite: 0,
totalTokens: 0,
total: 0.104691,
},
},
@ -2002,11 +2098,13 @@ export const longSession = {
output: 249,
cacheRead: 0,
cacheWrite: 0,
totalTokens: 0,
cost: {
input: 0.09024,
output: 0.003735,
cacheRead: 0,
cacheWrite: 0,
totalTokens: 0,
total: 0.093975,
},
},
@ -2045,11 +2143,13 @@ export const longSession = {
output: 279,
cacheRead: 0,
cacheWrite: 0,
totalTokens: 0,
cost: {
input: 0.091008,
output: 0.004185,
cacheRead: 0,
cacheWrite: 0,
totalTokens: 0,
total: 0.095193,
},
},
@ -2078,11 +2178,13 @@ export const longSession = {
output: 54,
cacheRead: 0,
cacheWrite: 0,
totalTokens: 0,
cost: {
input: 0.091893,
output: 0.0008100000000000001,
cacheRead: 0,
cacheWrite: 0,
totalTokens: 0,
total: 0.09270300000000001,
},
},
@ -2121,11 +2223,13 @@ export const longSession = {
output: 162,
cacheRead: 0,
cacheWrite: 0,
totalTokens: 0,
cost: {
input: 0.092097,
output: 0.00243,
cacheRead: 0,
cacheWrite: 0,
totalTokens: 0,
total: 0.094527,
},
},
@ -2155,11 +2259,13 @@ export const longSession = {
output: 67,
cacheRead: 0,
cacheWrite: 0,
totalTokens: 0,
cost: {
input: 0.09271800000000001,
output: 0.001005,
cacheRead: 0,
cacheWrite: 0,
totalTokens: 0,
total: 0.09372300000000001,
},
},
@ -2199,11 +2305,13 @@ export const longSession = {
output: 182,
cacheRead: 0,
cacheWrite: 0,
totalTokens: 0,
cost: {
input: 0.092937,
output: 0.0027300000000000002,
cacheRead: 0,
cacheWrite: 0,
totalTokens: 0,
total: 0.095667,
},
},
@ -2233,11 +2341,13 @@ export const longSession = {
output: 33,
cacheRead: 0,
cacheWrite: 0,
totalTokens: 0,
cost: {
input: 0.093642,
output: 0.000495,
cacheRead: 0,
cacheWrite: 0,
totalTokens: 0,
total: 0.094137,
},
},