diff --git a/main.go b/main.go index f5c5f5c..81c9d22 100644 --- a/main.go +++ b/main.go @@ -114,7 +114,37 @@ func newHandlerGetAPIV1RPCAIEvent(cfg Config) http.HandlerFunc { return } - http.Error(w, "not impl", http.StatusNotImplemented) + event := r.URL.Query().Get("id") + threadSummaries := []string{} + if err := func(ctx context.Context) error { + threads, err := cfg.storage.GetEventThreads(ctx, event) + if err != nil { + return err + } + + prompt := fmt.Sprintf("Summarize the Slack thread in 1 sentence. List any suggested follow ups.\n\n---\n\n") + for _, thread := range threads { + messages, err := cfg.storage.GetThreadMessages(ctx, thread.ID) + if err != nil { + return err + } + for _, message := range messages { + prompt += fmt.Sprintf("%s\n%s\n\n", message.Author, message.Plaintext) + } + } + + summary, err := cfg.ai.Do(ctx, prompt) + if err != nil { + return err + } + threadSummaries = append(threadSummaries, summary) + return nil + }(r.Context()); err != nil { + http.Error(w, err.Error(), http.StatusInternalServerError) + return + } + + json.NewEncoder(w).Encode(map[string]any{"threads": threadSummaries}) } } diff --git a/main_test.go b/main_test.go index 5d9abcc..6fba337 100644 --- a/main_test.go +++ b/main_test.go @@ -49,6 +49,7 @@ func TestRun(t *testing.T) { cfg.slackToModelPipeline, _ = NewSlackToModelPipeline(ctx, cfg) cfg.slackScrapePipeline, _ = NewSlackScrapePipeline(ctx, cfg) cfg.modelToPersistencePipeline, _ = NewModelToPersistencePipeline(ctx, cfg) + cfg.ai = NewAINoop() go func() { if err := run(ctx, cfg); err != nil && ctx.Err() == nil { @@ -84,4 +85,34 @@ func TestRun(t *testing.T) { t.Fatalf("(%d) %s", resp.StatusCode, b) } }) + + t.Run("GET /api/v1/rpc/aievent", func(t *testing.T) { + b, err := os.ReadFile(path.Join("testdata", "slack_events", "opsgenie_alert_3.json")) + if err != nil { + t.Fatal(err) + } + resp, err := http.Post(fmt.Sprintf("%s/api/v1/events/slack", u), "application/json", bytes.NewReader(b)) + if err != nil { + t.Fatal(err) + } + defer resp.Body.Close() + + if resp.StatusCode != http.StatusOK { + b, _ := io.ReadAll(resp.Body) + t.Fatalf("(%d) %s", resp.StatusCode, b) + } + + resp, err = http.Get(fmt.Sprintf("%s/api/v1/rpc/aievent?id=%s", u, "11067")) + if err != nil { + t.Fatal(err) + } + defer resp.Body.Close() + + b, _ = io.ReadAll(resp.Body) + if resp.StatusCode != http.StatusOK { + t.Fatalf("(%d) %s", resp.StatusCode, b) + } + + t.Logf("%s", b) + }) } diff --git a/storage.go b/storage.go index 1343407..7fe2c28 100644 --- a/storage.go +++ b/storage.go @@ -92,6 +92,7 @@ func (s Storage) selectThreadsWhere(ctx context.Context, clause string, args ... q := fmt.Sprintf(` SELECT %s FROM threads WHERE %s + ORDER BY TS ASC `, strings.Join(keys, ", "), clause) rows, err := s.driver.QueryContext(ctx, q, args2...) if err != nil { @@ -138,6 +139,7 @@ func (s Storage) selectMessagesWhere(ctx context.Context, clause string, args .. q := fmt.Sprintf(` SELECT %s FROM messages WHERE %s + ORDER BY TS ASC `, strings.Join(keys, ", "), clause) rows, err := s.driver.QueryContext(ctx, q, args2...) if err != nil {