Files
geo/server/internal/tenant/domain/workspace.go
T
root e307a048d1 feat(server): meter AI point usage across tenant AI features
Adds an ai_point_usage_logs ledger and a reserve/refund/complete pipeline
that charges AI points for article selection optimize, template analyze
/title/outline, and KOL prompt generate/optimize. Pending reservations
are reconciled when the kol-assist worker and template-assist tasks
finish or fail, so points refund automatically on errors. Workspace now
exposes the AI quota status and a paginated usage ledger.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-28 11:33:47 +08:00

72 lines
2.6 KiB
Go

package domain
import "time"
type WorkspaceOverview struct {
ArticleCount int64 `json:"article_count"`
PublishedCount int64 `json:"published_count"`
BrandCount int64 `json:"brand_count"`
SupportedPlatformCount int `json:"supported_platform_count"`
}
type RecentArticle struct {
ID int64 `json:"id"`
Title *string `json:"title"`
TemplateName *string `json:"template_name"`
GenerateStatus string `json:"generate_status"`
PublishStatus string `json:"publish_status"`
SourceType string `json:"source_type"`
GenerationMode *string `json:"generation_mode"`
WordCount int `json:"word_count"`
SourceLabel *string `json:"source_label"`
CreatedAt time.Time `json:"created_at"`
}
type QuotaSummary struct {
PlanCode string `json:"plan_code"`
PlanName string `json:"plan_name"`
TotalQuota int `json:"total_quota"`
UsedQuota int `json:"used_quota"`
Balance int `json:"balance"`
ResetAt *time.Time `json:"reset_at"`
AIPointsTotal int `json:"ai_points_total"`
AIPointsUsed int `json:"ai_points_used"`
AIPointsBalance int `json:"ai_points_balance"`
AIPointBaseChars int `json:"ai_point_base_chars"`
AIPointsResetAt *time.Time `json:"ai_points_reset_at"`
}
type KolWorkspaceCard struct {
SubscriptionPromptID int64 `json:"subscription_prompt_id"`
GrantedAt time.Time `json:"granted_at"`
UpdatedAt time.Time `json:"updated_at"`
PromptName string `json:"prompt_name"`
PlatformHint *string `json:"platform_hint"`
PackageName string `json:"package_name"`
PackageCover *string `json:"package_cover"`
KolDisplayName string `json:"kol_display_name"`
}
type AIPointUsageLog struct {
ID int64 `json:"id"`
UsageType string `json:"usage_type"`
ResourceType *string `json:"resource_type"`
ResourceID *int64 `json:"resource_id"`
ResourceUID *string `json:"resource_uid"`
RequestChars int `json:"request_chars"`
BaseChars int `json:"base_chars"`
Points int `json:"points"`
Status string `json:"status"`
Model *string `json:"model"`
ErrorMessage *string `json:"error_message"`
CompletedAt *time.Time `json:"completed_at"`
CreatedAt time.Time `json:"created_at"`
}
type AIPointUsageListResponse struct {
Items []AIPointUsageLog `json:"items"`
Total int64 `json:"total"`
Page int `json:"page"`
PageSize int `json:"page_size"`
}