mirror of
				https://github.com/songquanpeng/one-api.git
				synced 2025-10-31 22:03:41 +08:00 
			
		
		
		
	Compare commits
	
		
			6 Commits
		
	
	
		
			v0.6.2-alp
			...
			v0.6.2-alp
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
|  | 969042b001 | ||
|  | 7e7369dbc4 | ||
|  | e54e647170 | ||
|  | 358920c858 | ||
|  | 1ea598c773 | ||
|  | 796be42487 | 
| @@ -19,9 +19,6 @@ const ( | ||||
| 	loggerError = "ERR" | ||||
| ) | ||||
|  | ||||
| const maxLogCount = 1000000 | ||||
|  | ||||
| var logCount int | ||||
| var setupLogLock sync.Mutex | ||||
| var setupLogWorking bool | ||||
|  | ||||
| @@ -96,9 +93,7 @@ func logHelper(ctx context.Context, level string, msg string) { | ||||
| 	id := ctx.Value(RequestIdKey) | ||||
| 	now := time.Now() | ||||
| 	_, _ = fmt.Fprintf(writer, "[%s] %v | %s | %s \n", level, now.Format("2006/01/02 - 15:04:05"), id, msg) | ||||
| 	logCount++ // we don't need accurate count, so no lock here | ||||
| 	if logCount > maxLogCount && !setupLogWorking { | ||||
| 		logCount = 0 | ||||
| 	if !setupLogWorking { | ||||
| 		setupLogWorking = true | ||||
| 		go func() { | ||||
| 			SetupLogger() | ||||
|   | ||||
| @@ -148,6 +148,26 @@ func init() { | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func AddNewMissingRatio(oldRatio string) string { | ||||
| 	newRatio := make(map[string]float64) | ||||
| 	err := json.Unmarshal([]byte(oldRatio), &newRatio) | ||||
| 	if err != nil { | ||||
| 		logger.SysError("error unmarshalling old ratio: " + err.Error()) | ||||
| 		return oldRatio | ||||
| 	} | ||||
| 	for k, v := range DefaultModelRatio { | ||||
| 		if _, ok := newRatio[k]; !ok { | ||||
| 			newRatio[k] = v | ||||
| 		} | ||||
| 	} | ||||
| 	jsonBytes, err := json.Marshal(newRatio) | ||||
| 	if err != nil { | ||||
| 		logger.SysError("error marshalling new ratio: " + err.Error()) | ||||
| 		return oldRatio | ||||
| 	} | ||||
| 	return string(jsonBytes) | ||||
| } | ||||
|  | ||||
| func ModelRatio2JSONString() string { | ||||
| 	jsonBytes, err := json.Marshal(ModelRatio) | ||||
| 	if err != nil { | ||||
|   | ||||
| @@ -323,15 +323,14 @@ func updateAllChannelsBalance() error { | ||||
| } | ||||
|  | ||||
| func UpdateAllChannelsBalance(c *gin.Context) { | ||||
| 	// TODO: make it async | ||||
| 	err := updateAllChannelsBalance() | ||||
| 	if err != nil { | ||||
| 		c.JSON(http.StatusOK, gin.H{ | ||||
| 			"success": false, | ||||
| 			"message": err.Error(), | ||||
| 		}) | ||||
| 		return | ||||
| 	} | ||||
| 	//err := updateAllChannelsBalance() | ||||
| 	//if err != nil { | ||||
| 	//	c.JSON(http.StatusOK, gin.H{ | ||||
| 	//		"success": false, | ||||
| 	//		"message": err.Error(), | ||||
| 	//	}) | ||||
| 	//	return | ||||
| 	//} | ||||
| 	c.JSON(http.StatusOK, gin.H{ | ||||
| 		"success": true, | ||||
| 		"message": "", | ||||
|   | ||||
| @@ -178,7 +178,11 @@ func testChannels(notify bool, scope string) error { | ||||
| 			milliseconds := tok.Sub(tik).Milliseconds() | ||||
| 			if isChannelEnabled && milliseconds > disableThreshold { | ||||
| 				err = errors.New(fmt.Sprintf("响应时间 %.2fs 超过阈值 %.2fs", float64(milliseconds)/1000.0, float64(disableThreshold)/1000.0)) | ||||
| 				monitor.DisableChannel(channel.Id, channel.Name, err.Error()) | ||||
| 				if config.AutomaticDisableChannelEnabled { | ||||
| 					monitor.DisableChannel(channel.Id, channel.Name, err.Error()) | ||||
| 				} else { | ||||
| 					_ = message.Notify(message.ByAll, fmt.Sprintf("渠道 %s (%d)测试超时", channel.Name, channel.Id), "", err.Error()) | ||||
| 				} | ||||
| 			} | ||||
| 			if isChannelEnabled && util.ShouldDisableChannel(openaiErr, -1) { | ||||
| 				monitor.DisableChannel(channel.Id, channel.Name, err.Error()) | ||||
|   | ||||
							
								
								
									
										9
									
								
								main.go
									
									
									
									
									
								
							
							
						
						
									
										9
									
								
								main.go
									
									
									
									
									
								
							| @@ -9,7 +9,6 @@ import ( | ||||
| 	"github.com/songquanpeng/one-api/common" | ||||
| 	"github.com/songquanpeng/one-api/common/config" | ||||
| 	"github.com/songquanpeng/one-api/common/logger" | ||||
| 	"github.com/songquanpeng/one-api/common/message" | ||||
| 	"github.com/songquanpeng/one-api/controller" | ||||
| 	"github.com/songquanpeng/one-api/middleware" | ||||
| 	"github.com/songquanpeng/one-api/model" | ||||
| @@ -65,13 +64,6 @@ func main() { | ||||
| 		go model.SyncOptions(config.SyncFrequency) | ||||
| 		go model.SyncChannelCache(config.SyncFrequency) | ||||
| 	} | ||||
| 	if os.Getenv("CHANNEL_UPDATE_FREQUENCY") != "" { | ||||
| 		frequency, err := strconv.Atoi(os.Getenv("CHANNEL_UPDATE_FREQUENCY")) | ||||
| 		if err != nil { | ||||
| 			logger.FatalLog("failed to parse CHANNEL_UPDATE_FREQUENCY: " + err.Error()) | ||||
| 		} | ||||
| 		go controller.AutomaticallyUpdateChannels(frequency) | ||||
| 	} | ||||
| 	if os.Getenv("CHANNEL_TEST_FREQUENCY") != "" { | ||||
| 		frequency, err := strconv.Atoi(os.Getenv("CHANNEL_TEST_FREQUENCY")) | ||||
| 		if err != nil { | ||||
| @@ -88,7 +80,6 @@ func main() { | ||||
| 		logger.SysLog("metric enabled, will disable channel if too much request failed") | ||||
| 	} | ||||
| 	openai.InitTokenEncoders() | ||||
| 	_ = message.SendMessage("One API", "", fmt.Sprintf("One API %s started", common.Version)) | ||||
|  | ||||
| 	// Initialize HTTP server | ||||
| 	server := gin.New() | ||||
|   | ||||
| @@ -13,7 +13,7 @@ import ( | ||||
| type Channel struct { | ||||
| 	Id                 int     `json:"id"` | ||||
| 	Type               int     `json:"type" gorm:"default:0"` | ||||
| 	Key                string  `json:"key" gorm:"not null;index"` | ||||
| 	Key                string  `json:"key" gorm:"type:text"` | ||||
| 	Status             int     `json:"status" gorm:"default:1"` | ||||
| 	Name               string  `json:"name" gorm:"index"` | ||||
| 	Weight             *uint   `json:"weight" gorm:"default:0"` | ||||
| @@ -47,11 +47,7 @@ func GetAllChannels(startIdx int, num int, scope string) ([]*Channel, error) { | ||||
| } | ||||
|  | ||||
| func SearchChannels(keyword string) (channels []*Channel, err error) { | ||||
| 	keyCol := "`key`" | ||||
| 	if common.UsingPostgreSQL { | ||||
| 		keyCol = `"key"` | ||||
| 	} | ||||
| 	err = DB.Omit("key").Where("id = ? or name LIKE ? or "+keyCol+" = ?", helper.String2Int(keyword), keyword+"%", keyword).Find(&channels).Error | ||||
| 	err = DB.Omit("key").Where("id = ? or name LIKE ?", helper.String2Int(keyword), keyword+"%").Find(&channels).Error | ||||
| 	return channels, err | ||||
| } | ||||
|  | ||||
|   | ||||
| @@ -81,6 +81,9 @@ func InitOptionMap() { | ||||
| func loadOptionsFromDatabase() { | ||||
| 	options, _ := AllOption() | ||||
| 	for _, option := range options { | ||||
| 		if option.Key == "ModelRatio" { | ||||
| 			option.Value = common.AddNewMissingRatio(option.Value) | ||||
| 		} | ||||
| 		err := updateOptionMap(option.Key, option.Value) | ||||
| 		if err != nil { | ||||
| 			logger.SysError("failed to update option map: " + err.Error()) | ||||
|   | ||||
| @@ -27,7 +27,16 @@ func ShouldDisableChannel(err *relaymodel.Error, statusCode int) bool { | ||||
| 	if statusCode == http.StatusUnauthorized { | ||||
| 		return true | ||||
| 	} | ||||
| 	if err.Type == "insufficient_quota" || err.Code == "invalid_api_key" || err.Code == "account_deactivated" { | ||||
| 	switch err.Type { | ||||
| 	case "insufficient_quota": | ||||
| 		return true | ||||
| 	// https://docs.anthropic.com/claude/reference/errors | ||||
| 	case "authentication_error": | ||||
| 		return true | ||||
| 	case "permission_error": | ||||
| 		return true | ||||
| 	} | ||||
| 	if err.Code == "invalid_api_key" || err.Code == "account_deactivated" { | ||||
| 		return true | ||||
| 	} | ||||
| 	return false | ||||
| @@ -101,6 +110,9 @@ func RelayErrorHandler(resp *http.Response) (ErrorWithStatusCode *relaymodel.Err | ||||
| 	if err != nil { | ||||
| 		return | ||||
| 	} | ||||
| 	if config.DebugEnabled { | ||||
| 		logger.SysLog(fmt.Sprintf("error happened, status code: %d, response: \n%s", resp.StatusCode, string(responseBody))) | ||||
| 	} | ||||
| 	err = resp.Body.Close() | ||||
| 	if err != nil { | ||||
| 		return | ||||
|   | ||||
		Reference in New Issue
	
	Block a user