harden article generation reliability
Deployment Config CI / Deployment Config (push) Successful in 24s
Backend CI / Backend (push) Successful in 14m12s

This commit is contained in:
2026-05-05 23:43:10 +08:00
parent 3c912949e4
commit 65e9b7e293
24 changed files with 1259 additions and 52 deletions
+38 -10
View File
@@ -332,16 +332,20 @@ type CacheConfig struct {
}
type GenerationConfig struct {
QueueSize int `mapstructure:"queue_size"`
WorkerConcurrency int `mapstructure:"worker_concurrency"`
StreamEnabled bool `mapstructure:"stream_enabled"`
ArticleTimeout time.Duration `mapstructure:"article_timeout"`
TaskLeaseTTL time.Duration `mapstructure:"task_lease_ttl"`
TaskRecoveryInterval time.Duration `mapstructure:"task_recovery_interval"`
TaskRecoveryTimeout time.Duration `mapstructure:"task_recovery_timeout"`
TaskRecoveryBatchSize int `mapstructure:"task_recovery_batch_size"`
TaskQueuedStaleAfter time.Duration `mapstructure:"task_queued_stale_after"`
TaskMaxAttempts int `mapstructure:"task_max_attempts"`
QueueSize int `mapstructure:"queue_size"`
WorkerConcurrency int `mapstructure:"worker_concurrency"`
StreamEnabled bool `mapstructure:"stream_enabled"`
ArticleTimeout time.Duration `mapstructure:"article_timeout"`
TaskLeaseTTL time.Duration `mapstructure:"task_lease_ttl"`
TaskRecoveryInterval time.Duration `mapstructure:"task_recovery_interval"`
TaskRecoveryTimeout time.Duration `mapstructure:"task_recovery_timeout"`
TaskRecoveryBatchSize int `mapstructure:"task_recovery_batch_size"`
TaskQueuedStaleAfter time.Duration `mapstructure:"task_queued_stale_after"`
TaskMaxAttempts int `mapstructure:"task_max_attempts"`
TaskStateCheckInterval time.Duration `mapstructure:"task_state_check_interval"`
TaskStateCheckTimeout time.Duration `mapstructure:"task_state_check_timeout"`
TaskStateCheckBatchSize int `mapstructure:"task_state_check_batch_size"`
TaskStateCheckLookback time.Duration `mapstructure:"task_state_check_lookback"`
}
func Load(configPath string) (*Config, error) {
@@ -625,6 +629,18 @@ func NormalizeGenerationConfig(cfg *GenerationConfig) {
if cfg.TaskMaxAttempts <= 0 {
cfg.TaskMaxAttempts = 3
}
if cfg.TaskStateCheckInterval <= 0 {
cfg.TaskStateCheckInterval = 5 * time.Minute
}
if cfg.TaskStateCheckTimeout <= 0 {
cfg.TaskStateCheckTimeout = 10 * time.Second
}
if cfg.TaskStateCheckBatchSize <= 0 {
cfg.TaskStateCheckBatchSize = 100
}
if cfg.TaskStateCheckLookback <= 0 {
cfg.TaskStateCheckLookback = 24 * time.Hour
}
}
func NormalizeComplianceConfig(cfg *ComplianceConfig) {
@@ -731,6 +747,18 @@ func applyEnvOverrides(cfg *Config) {
if n, ok := lookupIntEnv("COMPLIANCE_REVIEW_MAX_ATTEMPTS"); ok {
cfg.Compliance.ReviewMaxAttempts = n
}
if d, ok := lookupDurationEnv("GENERATION_TASK_STATE_CHECK_INTERVAL"); ok {
cfg.Generation.TaskStateCheckInterval = d
}
if d, ok := lookupDurationEnv("GENERATION_TASK_STATE_CHECK_TIMEOUT"); ok {
cfg.Generation.TaskStateCheckTimeout = d
}
if n, ok := lookupIntEnv("GENERATION_TASK_STATE_CHECK_BATCH_SIZE"); ok {
cfg.Generation.TaskStateCheckBatchSize = n
}
if d, ok := lookupDurationEnv("GENERATION_TASK_STATE_CHECK_LOOKBACK"); ok {
cfg.Generation.TaskStateCheckLookback = d
}
if apiKey, ok := lookupNonEmptyEnv("QDRANT_API_KEY"); ok {
cfg.Qdrant.APIKey = apiKey
}