diff --git a/controller/relay.go b/controller/relay.go index e7b20d50..ad9323be 100644 --- a/controller/relay.go +++ b/controller/relay.go @@ -39,6 +39,26 @@ func relayHandler(c *gin.Context, relayMode int) *dto.OpenAIErrorWithStatusCode default: err = relay.TextHelper(c) } + + if err != nil { + // 保存错误日志到mysql中 + userId := c.GetInt("id") + tokenName := c.GetString("token_name") + modelName := c.GetString("original_model") + tokenId := c.GetInt("token_id") + userGroup := c.GetString("group") + channelId := c.GetInt("channel_id") + other := make(map[string]interface{}) + other["error_type"] = err.Error.Type + other["error_code"] = err.Error.Code + other["status_code"] = err.StatusCode + other["channel_id"] = channelId + other["channel_name"] = c.GetString("channel_name") + other["channel_type"] = c.GetInt("channel_type") + + model.RecordErrorLog(c, userId, channelId, modelName, tokenName, err.Error.Message, tokenId, 0, false, userGroup, other) + } + return err } diff --git a/model/log.go b/model/log.go index 86850a55..fbae4528 100644 --- a/model/log.go +++ b/model/log.go @@ -40,6 +40,7 @@ const ( LogTypeConsume LogTypeManage LogTypeSystem + LogTypeError ) func formatUserLogs(logs []*Log) { @@ -88,6 +89,35 @@ func RecordLog(userId int, logType int, content string) { } } +func RecordErrorLog(c *gin.Context, userId int, channelId int, modelName string, tokenName string, content string, tokenId int, useTimeSeconds int, + isStream bool, group string, other map[string]interface{}) { + common.LogInfo(c, fmt.Sprintf("record error log: userId=%d, channelId=%d, modelName=%s, tokenName=%s, content=%s", userId, channelId, modelName, tokenName, content)) + username := c.GetString("username") + otherStr := common.MapToJsonStr(other) + log := &Log{ + UserId: userId, + Username: username, + CreatedAt: common.GetTimestamp(), + Type: LogTypeError, + Content: content, + PromptTokens: 0, + CompletionTokens: 0, + TokenName: tokenName, + ModelName: modelName, + Quota: 0, + ChannelId: channelId, + TokenId: tokenId, + UseTime: useTimeSeconds, + IsStream: isStream, + Group: group, + Other: otherStr, + } + err := LOG_DB.Create(log).Error + if err != nil { + common.LogError(c, "failed to record log: "+err.Error()) + } +} + func RecordConsumeLog(c *gin.Context, userId int, channelId int, promptTokens int, completionTokens int, modelName string, tokenName string, quota int, content string, tokenId int, userQuota int, useTimeSeconds int, isStream bool, group string, other map[string]interface{}) { diff --git a/web/src/components/LogsTable.js b/web/src/components/LogsTable.js index a71cde60..903677eb 100644 --- a/web/src/components/LogsTable.js +++ b/web/src/components/LogsTable.js @@ -103,9 +103,15 @@ const LogsTable = () => { {t('系统')} ); + case 5: + return ( + + {t('错误')} + + ); default: return ( - + {t('未知')} ); @@ -373,7 +379,7 @@ const LogsTable = () => { className: isAdmin() ? 'tableShow' : 'tableHiddle', render: (text, record, index) => { return isAdminUser ? ( - record.type === 0 || record.type === 2 ? ( + record.type === 0 || record.type === 2 || record.type === 5 ? (
{ @@ -426,7 +432,7 @@ const LogsTable = () => { title: t('令牌'), dataIndex: 'token_name', render: (text, record, index) => { - return record.type === 0 || record.type === 2 ? ( + return record.type === 0 || record.type === 2 || record.type === 5 ? (
{ title: t('分组'), dataIndex: 'group', render: (text, record, index) => { - if (record.type === 0 || record.type === 2) { + if (record.type === 0 || record.type === 2 || record.type === 5) { if (record.group) { return <>{renderGroup(record.group)}; } else { @@ -490,7 +496,7 @@ const LogsTable = () => { title: t('模型'), dataIndex: 'model_name', render: (text, record, index) => { - return record.type === 0 || record.type === 2 ? ( + return record.type === 0 || record.type === 2 || record.type === 5 ? ( <>{renderModelName(record)} ) : ( <> @@ -530,7 +536,7 @@ const LogsTable = () => { title: t('提示'), dataIndex: 'prompt_tokens', render: (text, record, index) => { - return record.type === 0 || record.type === 2 ? ( + return record.type === 0 || record.type === 2 || record.type === 5 ? ( <>{ {text} } ) : ( <> @@ -543,7 +549,7 @@ const LogsTable = () => { dataIndex: 'completion_tokens', render: (text, record, index) => { return parseInt(text) > 0 && - (record.type === 0 || record.type === 2) ? ( + (record.type === 0 || record.type === 2 || record.type === 5) ? ( <>{ {text} } ) : ( <> @@ -555,7 +561,7 @@ const LogsTable = () => { title: t('花费'), dataIndex: 'quota', render: (text, record, index) => { - return record.type === 0 || record.type === 2 ? ( + return record.type === 0 || record.type === 2 || record.type === 5 ? ( <>{renderQuota(text, 6)} ) : ( <> @@ -986,9 +992,10 @@ const LogsTable = () => { other?.group_ratio, other?.cache_tokens || 0, other?.cache_ratio || 1.0, - other?.image || false, - other?.image_ratio || 0, - other?.image_output || 0,); + other?.image || false, + other?.image_ratio || 0, + other?.image_output || 0, + ); } expandDataLocal.push({ key: t('计费过程'), @@ -1247,6 +1254,7 @@ const LogsTable = () => { {t('消费')} {t('管理')} {t('系统')} + {t('错误')}