diff --git a/backend/internal/handler/admin/channel_handler.go b/backend/internal/handler/admin/channel_handler.go index 67f2ae95..9c058aa6 100644 --- a/backend/internal/handler/admin/channel_handler.go +++ b/backend/internal/handler/admin/channel_handler.go @@ -230,7 +230,7 @@ func validatePricingBillingMode(pricing []service.ChannelModelPricing) error { for _, p := range pricing { if p.BillingMode == service.BillingModePerRequest || p.BillingMode == service.BillingModeImage { if p.PerRequestPrice == nil && len(p.Intervals) == 0 { - return errors.New("Per-request price or intervals required for per_request/image billing mode") + return errors.New("per-request price or intervals required for per_request/image billing mode") } } } diff --git a/backend/internal/pkg/apicompat/chatcompletions_to_responses.go b/backend/internal/pkg/apicompat/chatcompletions_to_responses.go index 6cdd012a..c9a61ecc 100644 --- a/backend/internal/pkg/apicompat/chatcompletions_to_responses.go +++ b/backend/internal/pkg/apicompat/chatcompletions_to_responses.go @@ -27,13 +27,14 @@ func ChatCompletionsToResponses(req *ChatCompletionsRequest) (*ResponsesRequest, } out := &ResponsesRequest{ - Model: req.Model, - Input: inputJSON, - Temperature: req.Temperature, - TopP: req.TopP, - Stream: true, // upstream always streams - Include: []string{"reasoning.encrypted_content"}, - ServiceTier: req.ServiceTier, + Model: req.Model, + Instructions: req.Instructions, + Input: inputJSON, + Temperature: req.Temperature, + TopP: req.TopP, + Stream: true, // upstream always streams + Include: []string{"reasoning.encrypted_content"}, + ServiceTier: req.ServiceTier, } storeFalse := false diff --git a/backend/internal/repository/channel_repo.go b/backend/internal/repository/channel_repo.go index 99b9e8a6..5c86cc2a 100644 --- a/backend/internal/repository/channel_repo.go +++ b/backend/internal/repository/channel_repo.go @@ -443,7 +443,7 @@ func (r *channelRepository) GetGroupPlatforms(ctx context.Context, groupIDs []in if err != nil { return nil, fmt.Errorf("get group platforms: %w", err) } - defer rows.Close() + defer rows.Close() //nolint:errcheck result := make(map[int64]string, len(groupIDs)) for rows.Next() { diff --git a/backend/internal/service/channel_service.go b/backend/internal/service/channel_service.go index 88db80e8..85184a20 100644 --- a/backend/internal/service/channel_service.go +++ b/backend/internal/service/channel_service.go @@ -176,7 +176,11 @@ func (s *ChannelService) loadCache(ctx context.Context) (*channelCache, error) { if err != nil { return nil, err } - return result.(*channelCache), nil + cache, ok := result.(*channelCache) + if !ok { + return nil, fmt.Errorf("unexpected cache type") + } + return cache, nil } // buildCache 从数据库构建渠道缓存。 diff --git a/backend/internal/service/openai_gateway_service.go b/backend/internal/service/openai_gateway_service.go index 61b779d4..5389eeff 100644 --- a/backend/internal/service/openai_gateway_service.go +++ b/backend/internal/service/openai_gateway_service.go @@ -4261,22 +4261,24 @@ func (s *OpenAIGatewayService) RecordUsage(ctx context.Context, input *OpenAIRec CacheCreationTokens: result.Usage.CacheCreationInputTokens, CacheReadTokens: result.Usage.CacheReadInputTokens, ImageOutputTokens: result.Usage.ImageOutputTokens, - InputCost: cost.InputCost, - OutputCost: cost.OutputCost, - ImageOutputCost: cost.ImageOutputCost, - CacheCreationCost: cost.CacheCreationCost, - CacheReadCost: cost.CacheReadCost, - TotalCost: cost.TotalCost, - ActualCost: cost.ActualCost, - RateMultiplier: multiplier, - AccountRateMultiplier: &accountRateMultiplier, - BillingType: billingType, - Stream: result.Stream, - OpenAIWSMode: result.OpenAIWSMode, - DurationMs: &durationMs, - FirstTokenMs: result.FirstTokenMs, - CreatedAt: time.Now(), } + if cost != nil { + usageLog.InputCost = cost.InputCost + usageLog.OutputCost = cost.OutputCost + usageLog.ImageOutputCost = cost.ImageOutputCost + usageLog.CacheCreationCost = cost.CacheCreationCost + usageLog.CacheReadCost = cost.CacheReadCost + usageLog.TotalCost = cost.TotalCost + usageLog.ActualCost = cost.ActualCost + } + usageLog.RateMultiplier = multiplier + usageLog.AccountRateMultiplier = &accountRateMultiplier + usageLog.BillingType = billingType + usageLog.Stream = result.Stream + usageLog.OpenAIWSMode = result.OpenAIWSMode + usageLog.DurationMs = &durationMs + usageLog.FirstTokenMs = result.FirstTokenMs + usageLog.CreatedAt = time.Now() // 设置渠道信息 usageLog.ChannelID = optionalInt64Ptr(input.ChannelID) usageLog.ModelMappingChain = optionalTrimmedStringPtr(input.ModelMappingChain)