Преглед изворни кода

fix: incorrect sonnet price calculation

Frank пре 3 месеци
родитељ
комит
f5230d1f02
2 измењених фајлова са 18 додато и 5 уклоњено
  1. 8 0
      packages/opencode/src/provider/models.ts
  2. 10 5
      packages/opencode/src/session/index.ts

+ 8 - 0
packages/opencode/src/provider/models.ts

@@ -23,6 +23,14 @@ export namespace ModelsDev {
         output: z.number(),
         cache_read: z.number().optional(),
         cache_write: z.number().optional(),
+        context_over_200k: z
+          .object({
+            input: z.number(),
+            output: z.number(),
+            cache_read: z.number().optional(),
+            cache_write: z.number().optional(),
+          })
+          .optional(),
       }),
       limit: z.object({
         context: z.number(),

+ 10 - 5
packages/opencode/src/session/index.ts

@@ -396,15 +396,20 @@ export namespace Session {
           read: cachedInputTokens,
         },
       }
+
+      const costInfo =
+        input.model.cost?.context_over_200k && tokens.input + tokens.cache.read > 200_000
+          ? input.model.cost.context_over_200k
+          : input.model.cost
       return {
         cost: new Decimal(0)
-          .add(new Decimal(tokens.input).mul(input.model.cost?.input ?? 0).div(1_000_000))
-          .add(new Decimal(tokens.output).mul(input.model.cost?.output ?? 0).div(1_000_000))
-          .add(new Decimal(tokens.cache.read).mul(input.model.cost?.cache_read ?? 0).div(1_000_000))
-          .add(new Decimal(tokens.cache.write).mul(input.model.cost?.cache_write ?? 0).div(1_000_000))
+          .add(new Decimal(tokens.input).mul(costInfo?.input ?? 0).div(1_000_000))
+          .add(new Decimal(tokens.output).mul(costInfo?.output ?? 0).div(1_000_000))
+          .add(new Decimal(tokens.cache.read).mul(costInfo?.cache_read ?? 0).div(1_000_000))
+          .add(new Decimal(tokens.cache.write).mul(costInfo?.cache_write ?? 0).div(1_000_000))
           // TODO: update models.dev to have better pricing model, for now:
           // charge reasoning tokens at the same rate as output tokens
-          .add(new Decimal(tokens.reasoning).mul(input.model.cost?.output ?? 0).div(1_000_000))
+          .add(new Decimal(tokens.reasoning).mul(costInfo?.output ?? 0).div(1_000_000))
           .toNumber(),
         tokens,
       }