From 16410270a1068da64e682272fa5dec35c17985ef Mon Sep 17 00:00:00 2001 From: chenchen Date: Sun, 17 May 2026 23:17:17 +0800 Subject: [PATCH] fix: AWS Nova empty content panic + DTO Rule 6 pointer types MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - relay/channel/aws/relay-aws.go: add bounds check before accessing Content[0] — empty response array caused index-out-of-range panic - dto/embedding.go: convert Seed, TopK, NumPredict, NumCtx from int to *int so explicit zero values survive omitempty marshaling (Rule 6) - dto/video.go: convert Fps, Seed, N from int to *int (Rule 6) - dto/suno.go: convert ContinueAt from float64 to *float64 (Rule 6) Co-Authored-By: Claude Opus 4.6 --- heicode/dto/embedding.go | 8 ++++---- heicode/dto/suno.go | 2 +- heicode/dto/video.go | 6 +++--- heicode/relay/channel/aws/relay-aws.go | 8 +++++++- 4 files changed, 15 insertions(+), 9 deletions(-) diff --git a/heicode/dto/embedding.go b/heicode/dto/embedding.go index 45828f0..31189fe 100644 --- a/heicode/dto/embedding.go +++ b/heicode/dto/embedding.go @@ -9,14 +9,14 @@ import ( ) type EmbeddingOptions struct { - Seed int `json:"seed,omitempty"` + Seed *int `json:"seed,omitempty"` Temperature *float64 `json:"temperature,omitempty"` - TopK int `json:"top_k,omitempty"` + TopK *int `json:"top_k,omitempty"` TopP *float64 `json:"top_p,omitempty"` FrequencyPenalty *float64 `json:"frequency_penalty,omitempty"` PresencePenalty *float64 `json:"presence_penalty,omitempty"` - NumPredict int `json:"num_predict,omitempty"` - NumCtx int `json:"num_ctx,omitempty"` + NumPredict *int `json:"num_predict,omitempty"` + NumCtx *int `json:"num_ctx,omitempty"` } type EmbeddingRequest struct { diff --git a/heicode/dto/suno.go b/heicode/dto/suno.go index 90e11b8..b8a7886 100644 --- a/heicode/dto/suno.go +++ b/heicode/dto/suno.go @@ -10,7 +10,7 @@ type SunoSubmitReq struct { Mv string `json:"mv,omitempty"` Title string `json:"title,omitempty"` Tags string `json:"tags,omitempty"` - ContinueAt float64 `json:"continue_at,omitempty"` + ContinueAt *float64 `json:"continue_at,omitempty"` TaskID string `json:"task_id,omitempty"` ContinueClipId string `json:"continue_clip_id,omitempty"` MakeInstrumental bool `json:"make_instrumental"` diff --git a/heicode/dto/video.go b/heicode/dto/video.go index 5b48146..7f2ff22 100644 --- a/heicode/dto/video.go +++ b/heicode/dto/video.go @@ -7,9 +7,9 @@ type VideoRequest struct { Duration float64 `json:"duration" example:"5.0"` // Video duration (seconds) Width int `json:"width" example:"512"` // Video width Height int `json:"height" example:"512"` // Video height - Fps int `json:"fps,omitempty" example:"30"` // Video frame rate - Seed int `json:"seed,omitempty" example:"20231234"` // Random seed - N int `json:"n,omitempty" example:"1"` // Number of videos to generate + Fps *int `json:"fps,omitempty" example:"30"` // Video frame rate + Seed *int `json:"seed,omitempty" example:"20231234"` // Random seed + N *int `json:"n,omitempty" example:"1"` // Number of videos to generate ResponseFormat string `json:"response_format,omitempty" example:"url"` // Response format User string `json:"user,omitempty" example:"user-1234"` // User identifier Metadata map[string]any `json:"metadata,omitempty"` // Vendor-specific/custom params (e.g. negative_prompt, style, quality_level, etc.) diff --git a/heicode/relay/channel/aws/relay-aws.go b/heicode/relay/channel/aws/relay-aws.go index 0a87a21..6ce2fac 100644 --- a/heicode/relay/channel/aws/relay-aws.go +++ b/heicode/relay/channel/aws/relay-aws.go @@ -326,6 +326,12 @@ func handleNovaRequest(c *gin.Context, info *relaycommon.RelayInfo, a *Adaptor) } // 构造OpenAI格式响应 + var contentText any + if len(novaResp.Output.Message.Content) > 0 { + contentText = novaResp.Output.Message.Content[0].Text + } else { + contentText = "" + } response := dto.OpenAITextResponse{ Id: helper.GetResponseID(c), Object: "chat.completion", @@ -335,7 +341,7 @@ func handleNovaRequest(c *gin.Context, info *relaycommon.RelayInfo, a *Adaptor) Index: 0, Message: dto.Message{ Role: "assistant", - Content: novaResp.Output.Message.Content[0].Text, + Content: contentText, }, FinishReason: "stop", }},