diff --git a/server/internal/logic/agent_websocket_logic.go b/server/internal/logic/agent_websocket_logic.go index f11127a..6553f1e 100644 --- a/server/internal/logic/agent_websocket_logic.go +++ b/server/internal/logic/agent_websocket_logic.go @@ -57,6 +57,8 @@ type socketStartData struct { EnableWebSearch bool `json:"enable_web_search"` ImageModel string `json:"image_model"` ImageSize string `json:"image_size"` + ImageQuality string `json:"image_quality"` + ImageCount int `json:"image_count"` Mode string `json:"mode"` } @@ -177,6 +179,8 @@ func (data socketStartData) toDomainChat(projectID string) design.AgentChatReque EnableWebSearch: data.EnableWebSearch || hasSocketPreferredToolCategory(data.ToolConfig.PreferToolCategories, "SEARCH"), ImageModel: data.ImageModel, ImageSize: data.ImageSize, + ImageQuality: data.ImageQuality, + ImageCount: data.ImageCount, Mode: data.Mode, } } diff --git a/server/internal/logic/create_project_async_logic.go b/server/internal/logic/create_project_async_logic.go index e803f89..c2c2a0a 100644 --- a/server/internal/logic/create_project_async_logic.go +++ b/server/internal/logic/create_project_async_logic.go @@ -31,7 +31,7 @@ func (l *CreateProjectAsyncLogic) CreateProjectAsync(req *types.CreateProjectReq return nil, err } - project, err := l.svcCtx.DesignService.CreateProjectAsync(l.ctx, req.Title, req.Prompt, req.ImageModel, req.ImageSize, req.EnableWebSearch) + project, err := l.svcCtx.DesignService.CreateProjectAsync(l.ctx, req.Title, req.Prompt, req.ImageModel, req.ImageSize, req.ImageQuality, int(req.ImageCount), req.EnableWebSearch) if err != nil { return nil, err } diff --git a/server/internal/logic/create_project_logic.go b/server/internal/logic/create_project_logic.go index 99d8080..96f6728 100644 --- a/server/internal/logic/create_project_logic.go +++ b/server/internal/logic/create_project_logic.go @@ -31,7 +31,7 @@ func (l *CreateProjectLogic) CreateProject(req *types.CreateProjectRequest) (res return nil, err } - project, err := l.svcCtx.DesignService.CreateProject(l.ctx, req.Title, req.Prompt, req.ImageModel, req.ImageSize, req.EnableWebSearch) + project, err := l.svcCtx.DesignService.CreateProject(l.ctx, req.Title, req.Prompt, req.ImageModel, req.ImageSize, req.ImageQuality, int(req.ImageCount), req.EnableWebSearch) if err != nil { return nil, err } diff --git a/server/internal/logic/generate_project_async_logic.go b/server/internal/logic/generate_project_async_logic.go index 45632aa..6ecbf91 100644 --- a/server/internal/logic/generate_project_async_logic.go +++ b/server/internal/logic/generate_project_async_logic.go @@ -31,7 +31,7 @@ func (l *GenerateProjectAsyncLogic) GenerateProjectAsync(req *types.GenerateRequ return nil, err } - project, err := l.svcCtx.DesignService.GenerateAsync(l.ctx, req.Id, req.Prompt, req.Mode, req.ImageModel, req.ImageSize) + project, err := l.svcCtx.DesignService.GenerateAsync(l.ctx, req.Id, req.Prompt, req.Mode, req.ImageModel, req.ImageSize, req.ImageQuality, int(req.ImageCount)) if err != nil { return nil, err } diff --git a/server/internal/logic/generate_project_logic.go b/server/internal/logic/generate_project_logic.go index 55cb6e6..cad98a3 100644 --- a/server/internal/logic/generate_project_logic.go +++ b/server/internal/logic/generate_project_logic.go @@ -31,7 +31,7 @@ func (l *GenerateProjectLogic) GenerateProject(req *types.GenerateRequest) (resp return nil, err } - result, err := l.svcCtx.DesignService.Generate(l.ctx, req.Id, req.Prompt, req.Mode, req.ImageModel, req.ImageSize) + result, err := l.svcCtx.DesignService.Generate(l.ctx, req.Id, req.Prompt, req.Mode, req.ImageModel, req.ImageSize, req.ImageQuality, int(req.ImageCount)) if err != nil { return nil, err } diff --git a/server/internal/logic/mapper.go b/server/internal/logic/mapper.go index caabbc6..2af7297 100644 --- a/server/internal/logic/mapper.go +++ b/server/internal/logic/mapper.go @@ -33,25 +33,27 @@ func toGeneratorTaskResponse(task design.GeneratorTask) *types.GeneratorTaskResp func toAPIGeneratorTaskInputArgs(input design.GeneratorTaskInputArgs) types.GeneratorTaskInputArgs { return types.GeneratorTaskInputArgs{ - AspectRatio: input.AspectRatio, - Image: append([]string(nil), input.Image...), - ImageUrl: input.ImageURL, - Prompt: input.Prompt, - Resolution: input.Resolution, - SrcBox: toAPINormalizedBoxPtr(input.SrcBox), - DstBox: toAPINormalizedBoxPtr(input.DstBox), + AspectRatio: input.AspectRatio, + Image: append([]string(nil), input.Image...), + ImageUrl: input.ImageURL, + OutputFormat: input.OutputFormat, + Prompt: input.Prompt, + Resolution: input.Resolution, + SrcBox: toAPINormalizedBoxPtr(input.SrcBox), + DstBox: toAPINormalizedBoxPtr(input.DstBox), } } func toDomainGeneratorTaskInputArgs(input types.GeneratorTaskInputArgs) design.GeneratorTaskInputArgs { return design.GeneratorTaskInputArgs{ - AspectRatio: input.AspectRatio, - Image: append([]string(nil), input.Image...), - ImageURL: input.ImageUrl, - Prompt: input.Prompt, - Resolution: input.Resolution, - SrcBox: toDomainNormalizedBoxPtr(input.SrcBox), - DstBox: toDomainNormalizedBoxPtr(input.DstBox), + AspectRatio: input.AspectRatio, + Image: append([]string(nil), input.Image...), + ImageURL: input.ImageUrl, + OutputFormat: input.OutputFormat, + Prompt: input.Prompt, + Resolution: input.Resolution, + SrcBox: toDomainNormalizedBoxPtr(input.SrcBox), + DstBox: toDomainNormalizedBoxPtr(input.DstBox), } } @@ -546,6 +548,8 @@ func toDomainAgentChat(req *types.AgentChatRequest) design.AgentChatRequest { EnableWebSearch: req.EnableWebSearch || hasPreferredToolCategory(req.ToolConfig.PreferToolCategories.Search), ImageModel: req.ImageModel, ImageSize: req.ImageSize, + ImageQuality: req.ImageQuality, + ImageCount: int(req.ImageCount), Mode: req.Mode, } } diff --git a/server/internal/svc/service_context.go b/server/internal/svc/service_context.go index ae53b5b..c1fb68e 100644 --- a/server/internal/svc/service_context.go +++ b/server/internal/svc/service_context.go @@ -59,6 +59,7 @@ func NewServiceContext(c config.Config) *ServiceContext { textExtractor := newTextExtractor(c) service := application.NewDesignService(repo, agentRunner, assets, researcher, textExtractor, creativeAgent) service.SetBackgroundRemover(newBackgroundRemover(c)) + service.SetLayeredDocumentGenerator(newLayeredDocumentGenerator(c)) service.SetObjectRecognizer(newObjectRecognizer(c)) if mockupAnalyzer, ok := creativeAgent.(design.MockupModelAnalyzer); ok { service.SetMockupModelAnalyzer(mockupAnalyzer) @@ -317,6 +318,22 @@ func newImageGenerator(c config.Config) piagent.ImageGenerator { return client } +func newLayeredDocumentGenerator(c config.Config) design.LayeredDocumentGenerator { + opts := c.Agent.Image + apiKey := resolveImageAPIKey(opts) + client := piagent.NewImageClient(piagent.ImageClientOptions{ + BaseURL: opts.BaseURL, + APIKey: apiKey, + InputImageTransport: opts.InputImageTransport, + TimeoutSeconds: opts.TimeoutSeconds, + ResponseHeaderTimeoutSeconds: opts.ResponseHeaderTimeoutSeconds, + }) + if client == nil { + return nil + } + return client +} + func newTextExtractor(c config.Config) design.TextExtractor { opts := c.Agent.Text switch opts.Driver {