feat: implement AI integration with backend configuration and rule-based enrichment actions
This commit is contained in:
+3
-67
@@ -5,11 +5,10 @@ import (
|
||||
"net/http"
|
||||
"os"
|
||||
"os/signal"
|
||||
"strings"
|
||||
"syscall"
|
||||
"time"
|
||||
|
||||
"git.pengzhan.dev/haopengzhan/rsspipe/internal/actions/readability"
|
||||
"git.pengzhan.dev/haopengzhan/rsspipe/internal/actions"
|
||||
"git.pengzhan.dev/haopengzhan/rsspipe/internal/api"
|
||||
"git.pengzhan.dev/haopengzhan/rsspipe/internal/auth"
|
||||
"git.pengzhan.dev/haopengzhan/rsspipe/internal/config"
|
||||
@@ -17,7 +16,6 @@ import (
|
||||
"git.pengzhan.dev/haopengzhan/rsspipe/internal/db"
|
||||
"git.pengzhan.dev/haopengzhan/rsspipe/internal/events"
|
||||
"git.pengzhan.dev/haopengzhan/rsspipe/internal/logger"
|
||||
"git.pengzhan.dev/haopengzhan/rsspipe/internal/models"
|
||||
"git.pengzhan.dev/haopengzhan/rsspipe/internal/rules"
|
||||
"git.pengzhan.dev/haopengzhan/rsspipe/internal/worker"
|
||||
"go.uber.org/zap"
|
||||
@@ -52,70 +50,8 @@ func main() {
|
||||
bus := events.NewEventBus()
|
||||
pool := worker.NewPool(database, bus, 5, 1000)
|
||||
|
||||
// Register Core Action Handlers
|
||||
scraper := readability.NewScraper(15 * time.Second)
|
||||
pool.RegisterHandler("readability_scrape", scraper.Handler())
|
||||
|
||||
pool.RegisterHandler("set_variant", func(ctx context.Context, entry models.FeedEntry, params map[string]interface{}) (*worker.ActionResult, error) {
|
||||
key, _ := params["variant_key"].(string)
|
||||
if key == "" {
|
||||
key, _ = params["key"].(string)
|
||||
}
|
||||
if key == "" {
|
||||
return nil, nil
|
||||
}
|
||||
val, _ := params["value"].(string)
|
||||
contentType, _ := params["content_type"].(string)
|
||||
if contentType == "" {
|
||||
contentType = "text"
|
||||
}
|
||||
|
||||
// If key == "tags", merge with existing tags so multiple rules append tags
|
||||
if key == "tags" {
|
||||
existingVariant, err := database.GetVariant(entry.ID, "tags")
|
||||
if err == nil && existingVariant != nil && existingVariant.TextValue != "" {
|
||||
existingTags := strings.Split(existingVariant.TextValue, ",")
|
||||
newTags := strings.Split(val, ",")
|
||||
tagSet := make(map[string]bool)
|
||||
var merged []string
|
||||
for _, t := range append(existingTags, newTags...) {
|
||||
trimmed := strings.TrimSpace(t)
|
||||
if trimmed != "" && !tagSet[strings.ToLower(trimmed)] {
|
||||
tagSet[strings.ToLower(trimmed)] = true
|
||||
merged = append(merged, trimmed)
|
||||
}
|
||||
}
|
||||
val = strings.Join(merged, ", ")
|
||||
}
|
||||
}
|
||||
|
||||
variant := models.EntryVariant{
|
||||
EntryID: entry.ID,
|
||||
VariantKey: key,
|
||||
ContentType: contentType,
|
||||
TextValue: val,
|
||||
CreatedAt: time.Now(),
|
||||
UpdatedAt: time.Now(),
|
||||
}
|
||||
return &worker.ActionResult{
|
||||
ResultVariant: &variant,
|
||||
}, nil
|
||||
})
|
||||
|
||||
pool.RegisterHandler("mark_read", func(ctx context.Context, entry models.FeedEntry, params map[string]interface{}) (*worker.ActionResult, error) {
|
||||
trueVal := true
|
||||
return &worker.ActionResult{
|
||||
MarkRead: &trueVal,
|
||||
}, nil
|
||||
})
|
||||
|
||||
pool.RegisterHandler("mark_starred", func(ctx context.Context, entry models.FeedEntry, params map[string]interface{}) (*worker.ActionResult, error) {
|
||||
trueVal := true
|
||||
return &worker.ActionResult{
|
||||
MarkStarred: &trueVal,
|
||||
}, nil
|
||||
})
|
||||
|
||||
// Register Core Action Handlers (readability, status, variants, AI enrich & triage)
|
||||
actions.RegisterDefaultHandlers(pool, database, log)
|
||||
pool.Start(ctx)
|
||||
|
||||
// 4. Initialize Rules Engine
|
||||
|
||||
Reference in New Issue
Block a user