package handler import ( "encoding/base64" "net/http" "gen2d/internal/model" "gen2d/internal/service" "github.com/gin-gonic/gin" ) // GenerateRequest 素材生成请求。 type GenerateRequest struct { Prompt string `json:"prompt"` AssetType string `json:"assetType" binding:"required"` Tags []string `json:"tags"` UserNote string `json:"userNote"` ProjectStyle map[string]string `json:"projectStyle"` TaskStyle map[string]string `json:"taskStyle"` Resolution int `json:"resolution"` Directions int `json:"directions"` FramesPerDir int `json:"framesPerDir"` Format string `json:"format"` } // GenerateResponse 素材生成响应体。 type GenerateResponse struct { Assets []AssetResponse `json:"assets"` Metadata service.AssetMetadata `json:"metadata"` } // AssetResponse 单个素材响应(二进制 Data 转 base64)。 type AssetResponse struct { Data string `json:"data"` Format string `json:"format"` URL string `json:"url"` } // Generate 素材生成接口,调用完整生成管线(PromptOptimizer → AssetGenerator → QualitySupervisor → FormatAdapter)。 func Generate(c *gin.Context) { var req GenerateRequest if err := c.ShouldBindJSON(&req); err != nil { c.JSON(http.StatusBadRequest, model.Fail(http.StatusBadRequest, "参数错误: "+err.Error())) return } in := service.PipelineInput{ Prompt: req.Prompt, AssetType: req.AssetType, Tags: req.Tags, UserNote: req.UserNote, ProjectStyle: req.ProjectStyle, TaskStyle: req.TaskStyle, Params: service.AssetParams{ Resolution: req.Resolution, Frames: service.FrameParams{ Directions: req.Directions, FramesPerDirection: req.FramesPerDir, }, Format: req.Format, }, } output, err := service.RunPipeline(c.Request.Context(), in) if err != nil { c.JSON(http.StatusInternalServerError, model.Fail(http.StatusInternalServerError, "素材生成失败: "+err.Error())) return } assets := make([]AssetResponse, len(output.Assets)) for i, a := range output.Assets { assets[i] = AssetResponse{ Data: base64.StdEncoding.EncodeToString(a.Data), Format: a.Format, URL: a.URL, } } c.JSON(http.StatusOK, model.OK(GenerateResponse{ Assets: assets, Metadata: output.Metadata, })) }