From 285323d765b285c4c4fc05531e5295c45d456dd1 Mon Sep 17 00:00:00 2001 From: fengsilin Date: Wed, 17 Jun 2026 18:37:01 +0800 Subject: [PATCH] feat(task-pricing): expose model pricing rules api --- controller/model_pricing_controller.go | 56 ++++++++++++++++++++++++++ router/api-router.go | 4 ++ 2 files changed, 60 insertions(+) create mode 100644 controller/model_pricing_controller.go diff --git a/controller/model_pricing_controller.go b/controller/model_pricing_controller.go new file mode 100644 index 0000000..27fe2f6 --- /dev/null +++ b/controller/model_pricing_controller.go @@ -0,0 +1,56 @@ +package controller + +import ( + "net/http" + + "github.com/QuantumNous/new-api/common" + "github.com/QuantumNous/new-api/model" + "github.com/QuantumNous/new-api/setting/ratio_setting" + "github.com/QuantumNous/new-api/types" + "github.com/gin-gonic/gin" +) + +func GetModelPricingRules(c *gin.Context) { + common.ApiSuccess(c, ratio_setting.GetPricingConfigCopy()) +} + +func GetModelPricingRule(c *gin.Context) { + modelName := c.Param("model") + cfg := ratio_setting.GetPricingConfig(modelName) + if cfg == nil { + c.JSON(http.StatusNotFound, gin.H{"success": false, "message": "model pricing rule not found"}) + return + } + common.ApiSuccess(c, cfg) +} + +func UpdateModelPricingRule(c *gin.Context) { + modelName := c.Param("model") + var cfg types.PricingConfig + if err := common.DecodeJson(c.Request.Body, &cfg); err != nil { + c.JSON(http.StatusBadRequest, gin.H{"success": false, "message": err.Error()}) + return + } + if err := ratio_setting.SetPricingConfig(modelName, &cfg); err != nil { + c.JSON(http.StatusBadRequest, gin.H{"success": false, "message": err.Error()}) + return + } + if err := model.UpdateOption(ratio_setting.ModelPricingRulesOptionKey, ratio_setting.ModelPricingRules2JSONString()); err != nil { + c.JSON(http.StatusInternalServerError, gin.H{"success": false, "message": err.Error()}) + return + } + common.ApiSuccess(c, ratio_setting.GetPricingConfig(modelName)) +} + +func DeleteModelPricingRule(c *gin.Context) { + modelName := c.Param("model") + if err := ratio_setting.DeletePricingConfig(modelName); err != nil { + c.JSON(http.StatusBadRequest, gin.H{"success": false, "message": err.Error()}) + return + } + if err := model.UpdateOption(ratio_setting.ModelPricingRulesOptionKey, ratio_setting.ModelPricingRules2JSONString()); err != nil { + c.JSON(http.StatusInternalServerError, gin.H{"success": false, "message": err.Error()}) + return + } + common.ApiSuccess(c, nil) +} diff --git a/router/api-router.go b/router/api-router.go index be15355..7edc158 100644 --- a/router/api-router.go +++ b/router/api-router.go @@ -185,6 +185,10 @@ func SetApiRouter(router *gin.Engine) { { optionRoute.GET("/", controller.GetOptions) optionRoute.PUT("/", controller.UpdateOption) + optionRoute.GET("/model_pricing", controller.GetModelPricingRules) + optionRoute.GET("/model_pricing/:model", controller.GetModelPricingRule) + optionRoute.PUT("/model_pricing/:model", controller.UpdateModelPricingRule) + optionRoute.DELETE("/model_pricing/:model", controller.DeleteModelPricingRule) optionRoute.GET("/channel_affinity_cache", controller.GetChannelAffinityCacheStats) optionRoute.DELETE("/channel_affinity_cache", controller.ClearChannelAffinityCache) optionRoute.POST("/rest_model_ratio", controller.ResetModelRatio)