Files
gen2d/backend/internal/handler/generate.go
T

85 lines
2.4 KiB
Go
Raw Normal View History

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,
}))
}