@@ -750,6 +750,92 @@ func TestGetModelPricing_OpenAICompactAliasUsesStaticFallback(t *testing.T) {
750750 require .InDelta (t , 1.5e-5 , got .OutputCostPerToken , 1e-12 )
751751}
752752
753+ func TestPricingService_Gemini4ArgonThinkingTiersUseBasePricing (t * testing.T ) {
754+ basePricing := & LiteLLMModelPricing {InputCostPerToken : 2e-6 , OutputCostPerToken : 10e-6 , CacheReadInputTokenCost : 0.1e-6 }
755+ cyberPricing := & LiteLLMModelPricing {InputCostPerToken : 4e-6 , OutputCostPerToken : 20e-6 , CacheReadInputTokenCost : 0.2e-6 }
756+ svc := & PricingService {pricingData : map [string ]* LiteLLMModelPricing {
757+ "gemini-4-argon" : basePricing ,
758+ "gemini-4-argon-cyber-permissive" : cyberPricing ,
759+ }}
760+
761+ for _ , model := range []string {
762+ "gemini-4-argon" ,
763+ "gemini-4-argon-high" ,
764+ "gemini-4-argon-low" ,
765+ "gemini-4-argon-medium" ,
766+ "models/gemini-4-argon-high" ,
767+ "projects/p/locations/global/publishers/google/models/gemini-4-argon" ,
768+ } {
769+ t .Run (model , func (t * testing.T ) {
770+ require .Same (t , basePricing , svc .GetModelPricing (model ))
771+ })
772+ }
773+ require .Same (t , cyberPricing , svc .GetModelPricing ("gemini-4-argon-cyber-permissive" ))
774+ }
775+
776+ func TestBillingService_Gemini4ArgonFallbacksAreBillable (t * testing.T ) {
777+ svc := NewBillingService (& config.Config {}, nil )
778+ tokens := UsageTokens {InputTokens : 1_000_000 , OutputTokens : 1_000_000 , CacheReadTokens : 1_000_000 }
779+
780+ for _ , tc := range []struct {
781+ model string
782+ input , output , read float64
783+ }{
784+ {"gemini-4-argon" , 2 , 10 , 0.1 },
785+ {"gemini-4-argon-high" , 2 , 10 , 0.1 },
786+ {"gemini-4-argon-low" , 2 , 10 , 0.1 },
787+ {"gemini-4-argon-medium" , 2 , 10 , 0.1 },
788+ {"models/gemini-4-argon" , 2 , 10 , 0.1 },
789+ {"gemini-4-argon-cyber-permissive" , 4 , 20 , 0.2 },
790+ {"gemini-4-argon-cyber" , 4 , 20 , 0.2 },
791+ {"publishers/google/models/gemini-4-argon-cyber-permissive" , 4 , 20 , 0.2 },
792+ } {
793+ t .Run (tc .model , func (t * testing.T ) {
794+ cost , err := svc .CalculateCost (tc .model , tokens , 1 )
795+ require .NoError (t , err )
796+ require .InDelta (t , tc .input , cost .InputCost , 1e-12 )
797+ require .InDelta (t , tc .output , cost .OutputCost , 1e-12 )
798+ require .InDelta (t , tc .read , cost .CacheReadCost , 1e-12 )
799+ require .InDelta (t , tc .input + tc .output + tc .read , cost .TotalCost , 1e-12 )
800+ })
801+ }
802+ }
803+
804+ func TestDefaultPricingIncludesGemini4ArgonRates (t * testing.T ) {
805+ data , err := os .ReadFile (filepath .Join (".." , ".." , "resources" , "model-pricing" , "model_prices_and_context_window.json" ))
806+ require .NoError (t , err )
807+
808+ pricingSvc := & PricingService {}
809+ pricingData , err := pricingSvc .parsePricingData (data )
810+ require .NoError (t , err )
811+ pricingSvc .pricingData = pricingData
812+
813+ for _ , tc := range []struct {
814+ model string
815+ provider string
816+ input , output , read float64
817+ }{
818+ {"gemini-4-argon" , "gemini" , 2e-6 , 10e-6 , 0.1e-6 },
819+ {"gemini-4-argon-high" , "gemini" , 2e-6 , 10e-6 , 0.1e-6 },
820+ {"gemini-4-argon-cyber-permissive" , "vertex_ai-language-models" , 4e-6 , 20e-6 , 0.2e-6 },
821+ } {
822+ t .Run (tc .model , func (t * testing.T ) {
823+ pricing := pricingSvc .GetModelPricing (tc .model )
824+ require .NotNil (t , pricing )
825+ require .Equal (t , tc .provider , pricing .LiteLLMProvider )
826+ require .InDelta (t , tc .input , pricing .InputCostPerToken , 1e-15 )
827+ require .InDelta (t , tc .output , pricing .OutputCostPerToken , 1e-15 )
828+ require .InDelta (t , tc .read , pricing .CacheReadInputTokenCost , 1e-15 )
829+ // Priority 档为标准价的 1.8 倍;单一价档不分提示词长度。
830+ require .InDelta (t , tc .input * 1.8 , pricing .InputCostPerTokenPriority , 1e-15 )
831+ require .InDelta (t , tc .output * 1.8 , pricing .OutputCostPerTokenPriority , 1e-15 )
832+ require .InDelta (t , tc .read * 1.8 , pricing .CacheReadInputTokenCostPriority , 1e-15 )
833+ require .Zero (t , pricing .LongContextInputTokenThreshold )
834+ })
835+ }
836+ require .Contains (t , pricingSvc .ListModelNamesByProvider ("gemini" ), "gemini-4-argon" )
837+ }
838+
753839func TestDefaultPricingIncludesCodexAutoReview (t * testing.T ) {
754840 data , err := os .ReadFile (filepath .Join (".." , ".." , "resources" , "model-pricing" , "model_prices_and_context_window.json" ))
755841 require .NoError (t , err )
0 commit comments