impl GET /api/v1/rpc/aievent?id=123

main
Bel LaPointe 2024-04-19 12:34:49 -06:00
parent 81fe8070ca
commit 12de99da57
3 changed files with 64 additions and 1 deletions

32
main.go
View File

@ -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})
}
}

View File

@ -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)
})
}

View File

@ -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 {