diff --git a/backend/internal/http/handler/admin_read.go b/backend/internal/http/handler/admin_read.go index 830ef81..09716da 100644 --- a/backend/internal/http/handler/admin_read.go +++ b/backend/internal/http/handler/admin_read.go @@ -130,6 +130,7 @@ func (h *AdminReadHandler) Logs(c *gin.Context) { "resolution": item.Resolution, "duration": item.Duration, "refs": item.Refs, + "deai": item.DeAI, "source": item.Source, "user_id": emptyStringNil(item.UserID), "user_name": userName, diff --git a/backend/internal/http/handler/user_generation.go b/backend/internal/http/handler/user_generation.go index 45d4a4f..4d6bc42 100644 --- a/backend/internal/http/handler/user_generation.go +++ b/backend/internal/http/handler/user_generation.go @@ -310,6 +310,7 @@ func (h *UserGenerationHandler) Logs(c *gin.Context) { "resolution": item.Resolution, "duration": item.Duration, "refs": item.Refs, + "deai": item.DeAI, "source": emptyStringNil(item.Source), "user_id": emptyStringNil(item.UserID), "user_name": userName, diff --git a/backend/internal/model/models.go b/backend/internal/model/models.go index 1acbccf..8b4e3be 100644 --- a/backend/internal/model/models.go +++ b/backend/internal/model/models.go @@ -93,6 +93,7 @@ type EventLog struct { Resolution string `gorm:"size:32"` Duration string `gorm:"size:32"` Refs int `gorm:"not null;default:0"` + DeAI bool `gorm:"not null;default:false"` // 去AI特征 was applied (image only) RefFiles datatypes.JSON `gorm:"type:jsonb"` // relative paths of saved reference images, for回显 on reload Source string `gorm:"size:32;index"` // AccountID is the provider token/account chosen to fulfil this generation, diff --git a/backend/internal/service/admin_read.go b/backend/internal/service/admin_read.go index 1528c7e..8d60db9 100644 --- a/backend/internal/service/admin_read.go +++ b/backend/internal/service/admin_read.go @@ -546,6 +546,7 @@ func (s *AdminReadService) Images(ctx context.Context, limit, offset int, kind s "resolution": "", "ratio": "", "duration": "", + "deai": false, } if event, ok := index[item.Name]; ok { row["prompt"] = event.Prompt @@ -557,6 +558,7 @@ func (s *AdminReadService) Images(ctx context.Context, limit, offset int, kind s row["resolution"] = event.Resolution row["ratio"] = event.Ratio row["duration"] = event.Duration + row["deai"] = event.DeAI } out = append(out, row) } diff --git a/backend/internal/service/user_generation.go b/backend/internal/service/user_generation.go index 7d2a745..86934cb 100644 --- a/backend/internal/service/user_generation.go +++ b/backend/internal/service/user_generation.go @@ -171,6 +171,7 @@ func shapeJobEvent(item *model.EventLog, modelNames map[string]string) map[strin "ratio": item.Ratio, "resolution": item.Resolution, "duration": item.Duration, + "deai": item.DeAI, "status": status, "file": emptyOrNil(item.File), "url": emptyOrNil(url), diff --git a/backend/internal/service/v1.go b/backend/internal/service/v1.go index 1e8f065..a307af1 100644 --- a/backend/internal/service/v1.go +++ b/backend/internal/service/v1.go @@ -453,7 +453,7 @@ func (s *V1Service) prepareImageExecution(ctx context.Context, principal *APIPri if !noStore { fileURL, relativePath = s.allocateOutput(principal, "png", in.BaseURL) } - eventID, err := s.logPendingEvent(ctx, "image", modelItem, principal, in.Prompt, aspectRatio, resolution, "", refCount, price, relativePath, source, refFiles) + eventID, err := s.logPendingEvent(ctx, "image", modelItem, principal, in.Prompt, aspectRatio, resolution, "", refCount, price, relativePath, source, refFiles, in.DeAI) if err != nil { s.cleanupReferenceImages(ctx, "", refFiles) return nil, err @@ -703,7 +703,7 @@ func (s *V1Service) prepareVideoExecution(ctx context.Context, principal *APIPri if !noStore { fileURL, relativePath = s.allocateOutput(principal, "mp4", in.BaseURL) } - eventID, err := s.logPendingEvent(ctx, "video", modelItem, principal, in.Prompt, aspectRatio, resolution, duration, refCount, price, relativePath, source, refFiles) + eventID, err := s.logPendingEvent(ctx, "video", modelItem, principal, in.Prompt, aspectRatio, resolution, duration, refCount, price, relativePath, source, refFiles, false) if err != nil { s.cleanupReferenceImages(ctx, "", refFiles) return nil, err @@ -825,7 +825,7 @@ func (s *V1Service) StartVideoJob(ctx context.Context, principal *APIPrincipal, refFiles := s.saveReferenceImages(ctx, principal, in.ReferenceImages) // Source "v1": no output file is allocated — the result is the upstream URL, // stored on the event when the render completes. - eventID, err := s.logPendingEvent(ctx, "video", modelItem, principal, in.Prompt, aspectRatio, resolution, duration, len(in.ReferenceImages), price, "", "v1", refFiles) + eventID, err := s.logPendingEvent(ctx, "video", modelItem, principal, in.Prompt, aspectRatio, resolution, duration, len(in.ReferenceImages), price, "", "v1", refFiles, false) if err != nil { s.cleanupReferenceImages(ctx, "", refFiles) return nil, err @@ -1343,7 +1343,7 @@ func (s *V1Service) allocateOutput(principal *APIPrincipal, ext, baseURL string) return "/images/" + relativePath, relativePath } -func (s *V1Service) logPendingEvent(ctx context.Context, kind string, modelItem *model.ModelConfig, principal *APIPrincipal, prompt, ratio, resolution, duration string, refs int, cost float64, file, source string, refFiles []string) (string, error) { +func (s *V1Service) logPendingEvent(ctx context.Context, kind string, modelItem *model.ModelConfig, principal *APIPrincipal, prompt, ratio, resolution, duration string, refs int, cost float64, file, source string, refFiles []string, deai bool) (string, error) { event := &model.EventLog{ ID: "evt-" + randomUpper(12), TS: time.Now(), @@ -1356,6 +1356,7 @@ func (s *V1Service) logPendingEvent(ctx context.Context, kind string, modelItem Resolution: resolution, Duration: duration, Refs: refs, + DeAI: deai, Source: source, Cost: cost, File: file, diff --git a/frontend/src/views/ImagesView.vue b/frontend/src/views/ImagesView.vue index 2232afd..e4b227c 100644 --- a/frontend/src/views/ImagesView.vue +++ b/frontend/src/views/ImagesView.vue @@ -328,6 +328,7 @@ onUnmounted(() => window.removeEventListener('keydown', onKey)) {{ f.resolution }} {{ f.ratio }} {{ f.duration }} + 去AI