Files
magpie/model_price_tier_cli_test.go
yetone 3a30ac87c2 catalog, gui: a 1-hour cache write is 2× input for a Claude model only, any other's unset is its 5-minute price and isn't shown (PAMI on Discord)
v0.1.1032 counted a 1-hour cache write left out at 2× input for every
model, so gpt-6-astra priced 10,50,1,12.5 showed "$20 (1 hour) at 2×
input", a write OpenAI has no price for. OneHourFor gives a Claude model's
price, listed or given by the user, its 2× input; any other model's 1-hour
writes count at the 5-minute price, magpie model price shows only its cache
write, and the app shows the 1-hour box only for a Claude model or one
priced with one.
2026-10-05 22:55:30 +08:00

85 lines
3.3 KiB
Go
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
package main
import (
"strings"
"testing"
"github.com/yetone/magpie/internal/catalog"
"github.com/yetone/magpie/internal/provider"
)
// PAMI on Discord: magpie model price m 10,50,1,12.5 --tier 272k 20,75,2,25
// gives what the whole request costs over 272K input, as OpenAI bills
// gpt-6-astra, and a fifth part is the 1-hour cache write. Both are kept,
// counted and shown; a size that isn't one, or a tier short of a part, is
// refused.
func TestModelPriceTierCmd(t *testing.T) {
groupsHome(t)
if err := modelCmd([]string{"price", "a/m", "10,50,1,12.5", "--tier", "272k", "20,75,2,25", "--tier=1M", "40", "100", "4", "50"}); err != nil {
t.Fatal(err)
}
pr, ok := provider.EffectivePrice("a", "m")
want := catalog.Price{Input: 10, Output: 50, CacheRead: 1, CacheWrite: 12.5, Tiers: []catalog.Tier{
{Above: 272000, Input: 20, Output: 75, CacheRead: 2, CacheWrite: 25},
{Above: 1000000, Input: 40, Output: 100, CacheRead: 4, CacheWrite: 50}}}
if !ok || !pr.Same(want) {
t.Fatalf("price = %+v, want %+v", pr, want)
}
out, err := said(t, func() error { return modelCmd([]string{"price", "a/m"}) })
if err != nil {
t.Fatal(err)
}
if !strings.Contains(out, "over 272K input tokens") || !strings.Contains(out, "over 1M input tokens") || !strings.Contains(out, "$20/$75") {
t.Errorf("magpie model price a/m: %q; want its tiers", out)
}
out, _ = said(t, func() error { return modelCmd([]string{"prices"}) })
if !strings.Contains(out, "over 272K") {
t.Errorf("magpie model prices: %q; want its tier", out)
}
// PAMI on Discord: four parts give no 1-hour cache write but a Claude
// model's — gpt-6-astra was shown "$20 (1 hour) at 2× input", a write
// OpenAI has no price for
if strings.Contains(out, "1 hour") || strings.Contains(out, "2× input") {
t.Errorf("magpie model price a/m: %q; want no 1-hour cache write", out)
}
if pr.OneHour() != 12.5 {
t.Errorf("a/m 1h = %v, want the 5-minute 12.5", pr.OneHour())
}
if err := modelCmd([]string{"price", "a/claude-opus-5-5", "3,15,0.3,3.75"}); err != nil {
t.Fatal(err)
}
if pr, _ := provider.EffectivePrice("a", "claude-opus-5-5"); pr.OneHour() != 6 {
t.Errorf("claude 1h = %+v, want 2× input", pr)
}
out, _ = said(t, func() error { return modelCmd([]string{"price", "a/claude-opus-5-5"}) })
if !strings.Contains(out, "$6.00 (1 hour)") && !strings.Contains(out, "$6 (1 hour)") {
t.Errorf("magpie model price a/claude-opus-5-5: %q; want its 1-hour cache write", out)
}
if err := modelCmd([]string{"price", "a/only-a", "5,25,0.5,6.25,8"}); err != nil {
t.Fatal(err)
}
if pr, _ := provider.EffectivePrice("a", "only-a"); pr.CacheWrite1h != 8 || pr.OneHour() != 8 {
t.Fatalf("1h = %+v", pr)
}
out, _ = said(t, func() error { return modelCmd([]string{"price", "a/only-a"}) })
if !strings.Contains(out, "(1 hour)") {
t.Errorf("magpie model price a/only-a: %q; want its 1-hour cache write", out)
}
for _, args := range [][]string{
{"10,50,1,12.5", "--tier", "lots", "20,75,2,25"},
{"10,50,1,12.5", "--tier", "272k", "20,75"},
{"10,50,1,12.5", "--tier"},
{"10,50,1,12.5", "--tier", "272k", "20,75,2,25", "--tier", "272k", "20,75,2,25"},
} {
if err := modelCmd(append([]string{"price", "a/m"}, args...)); err == nil {
t.Errorf("%q was taken", args)
}
}
if pr, _ := provider.EffectivePrice("a", "m"); !pr.Same(want) {
t.Errorf("a refused price was written: %+v", pr)
}
}