parallelize queries

This commit is contained in:
Chandler Swift 2025-12-28 20:02:17 -06:00
parent 40223a12b5
commit 9086afcf12

View file

@ -6,8 +6,10 @@ import (
"encoding/json"
"fmt"
"html/template"
"log"
"regexp"
"strings"
"sync"
"time"
"git.chandlerswift.com/chandlerswift/svs-services-server/completion"
@ -82,7 +84,9 @@ func GetSiteData(subdomain string, cp completion.CompletionProvider) (site *Site
func GenerateSiteData(rawservice string, cp completion.CompletionProvider) (site *Site, err error) {
site = &Site{}
prompt := norm(`
ctx := context.TODO()
occupationPrompt := norm(`
Parse this subdomain for a company providing services into English words, if possible.
For example, the subdomain "webdesign" should be parsed into the string "Web Design".
If the string can't be parsed, just return the original string.
@ -90,25 +94,13 @@ func GenerateSiteData(rawservice string, cp completion.CompletionProvider) (site
The string is "%s".
The parsed string is:
`)
prompt = strings.TrimSpace(prompt)
prompt = whitespace.ReplaceAllString(prompt, " ")
site.Occupation, err = cp.Complete(context.TODO(), fmt.Sprintf(prompt, rawservice), nil)
log.Printf("Parsing service %s…", rawservice)
site.Occupation, err = cp.Complete(ctx, fmt.Sprintf(occupationPrompt, rawservice), nil)
if err != nil {
return nil, fmt.Errorf("parsing service: %w", err)
}
prompt = norm(`
Generate a short, catchy tagline for a %v company.
The tagline should be no more than 7 words long, and should be slightly silly;
e.g. for a web design company, something like "Custom websites cooked to order".
Do not include quotes.
`)
site.Tagline, err = cp.Complete(context.TODO(), fmt.Sprintf(prompt, site.Occupation), nil)
if err != nil {
return nil, fmt.Errorf("generating tagline: %w", err)
}
log.Printf("Done parsing service %s.", site.Occupation)
site.Theme = Theme{ // TODO
AccentColor: Color{
Hex: "#FF5733",
@ -122,20 +114,20 @@ func GenerateSiteData(rawservice string, cp completion.CompletionProvider) (site
},
}
prompt = norm(`
taglinePrompt := norm(`
Generate a short, catchy tagline for a %v company.
The tagline should be no more than 7 words long, and should be slightly silly;
e.g. for a web design company, something like "Custom websites cooked to order".
Do not include quotes.
`)
whatWeDoPrompt := norm(`
Generate a few short paragraphs (3-4 sentences each) describing what the offices of Swift, Villnow & Swift
(colloquially \"SVS\"), a %v company, has to offer, in an over-the-top, slightly irreverent tone.
The paragraphs will go on the company's homesite to inform visitors about their services.
Markup should be in HTML, including paragraph breaks.
Do not wrap in any additional markup.
`)
whatWeDo, err := cp.Complete(context.TODO(), fmt.Sprintf(prompt, site.Occupation), nil)
site.WhatWeDo = template.HTML(whatWeDo)
if err != nil {
return nil, fmt.Errorf("generating what we do: %w", err)
}
prompt = norm(`
chandlerPrompt := norm(`
Generate a short bio (2-4 sentences) for Chandler Swift, a co-founder of SVS, a %v company.
Chandler went to high school in Glencoe, Minnesota with Eric Villnow and Isaac Swift, the other two co-founders.
Chandler has always enjoyed tinkering with projects.
@ -150,13 +142,7 @@ func GenerateSiteData(rawservice string, cp completion.CompletionProvider) (site
Emphasize the relevance of all the above information to SVS's line of work.
Do not shoehorn all the above information; only include each piece if relevant.
`)
bio, err := cp.Complete(context.TODO(), fmt.Sprintf(prompt, site.Occupation), nil)
if err != nil {
return nil, fmt.Errorf("generating Chandler bio: %w", err)
}
site.ChandlerBio = template.HTML(bio)
prompt = norm(`
ericPrompt := norm(`
Generate a short, satirical/irreverent bio (2-4 sentences) for Eric Villnow, a co-founder of SVS, a %v company.
Eric went to high school in Glencoe, Minnesota with Isaac Swift and Chandler Swift, the other two co-founders.
Eric has a degree in Computer Science from Bemidji State University with a minor in Business Administration.
@ -171,13 +157,7 @@ func GenerateSiteData(rawservice string, cp completion.CompletionProvider) (site
Emphasize the relevance of all the above information to SVS's line of work.
Do not include all the above information; only mention each piece if relevant.
`)
bio, err = cp.Complete(context.TODO(), fmt.Sprintf(prompt, site.Occupation), nil)
if err != nil {
return nil, fmt.Errorf("generating Eric bio: %w", err)
}
site.EricBio = template.HTML(bio)
prompt = norm(`
isaacPrompt := norm(`
Generate a short, satirical/irreverent bio (2-4 sentences) for Isaac Swift, a co-founder of SVS, a %v company.
Isaac went to high school in Glencoe, Minnesota with Eric Villnow and Chandler Swift, the other two co-founders.
Isaac studied Computer Science for a year at North Dakota State University.
@ -195,13 +175,7 @@ func GenerateSiteData(rawservice string, cp completion.CompletionProvider) (site
Emphasize the relevance of all the above information to SVS's line of work.
Do not include all the above information; only mention each piece if relevant.
`)
bio, err = cp.Complete(context.TODO(), fmt.Sprintf(prompt, site.Occupation), nil)
if err != nil {
return nil, fmt.Errorf("generating Isaac bio: %w", err)
}
site.IsaacBio = template.HTML(bio)
prompt = norm(`
testimonialsPrompt := norm(`
Generate three satirical testimonials from satisfied clients of SVS, a %v company.
Testimonials should be from well-known figures, possibly historical (say, a former US President).
When possible, the person quoted should have some tenuous connection to the services provided by SVS.
@ -242,12 +216,102 @@ func GenerateSiteData(rawservice string, cp completion.CompletionProvider) (site
},
},
}
raw_testimonials, err := cp.Complete(context.TODO(), fmt.Sprintf(prompt, site.Occupation), schema)
if err != nil {
return nil, fmt.Errorf("generating testimonials: %w", err)
var (
taglineResult string
whatWeDoResult string
chandlerBioResult string
ericBioResult string
isaacBioResult string
rawTestimonials string
)
errCh := make(chan error, 6)
var wg sync.WaitGroup
wg.Add(6)
go func(p string) {
defer wg.Done()
var e error
log.Println("Generating tagline...")
taglineResult, e = cp.Complete(ctx, fmt.Sprintf(p, site.Occupation), nil)
if e != nil {
errCh <- fmt.Errorf("generating tagline: %w", e)
}
fmt.Println("Raw testimonials: %s\n", raw_testimonials)
err = json.Unmarshal([]byte(raw_testimonials), &site.Testimonials)
log.Printf("Generated tagline: %s", taglineResult)
}(taglinePrompt)
go func(p string) {
defer wg.Done()
var e error
log.Println("Generating what we do...")
whatWeDoResult, e = cp.Complete(ctx, fmt.Sprintf(p, site.Occupation), nil)
if e != nil {
errCh <- fmt.Errorf("generating what we do: %w", e)
}
}(whatWeDoPrompt)
go func(p string) {
defer wg.Done()
var e error
log.Println("Generating Chandler bio...")
chandlerBioResult, e = cp.Complete(ctx, fmt.Sprintf(p, site.Occupation), nil)
if e != nil {
errCh <- fmt.Errorf("generating Chandler bio: %w", e)
}
}(chandlerPrompt)
go func(p string) {
defer wg.Done()
var e error
log.Println("Generating Eric bio...")
ericBioResult, e = cp.Complete(ctx, fmt.Sprintf(p, site.Occupation), nil)
if e != nil {
errCh <- fmt.Errorf("generating Eric bio: %w", e)
}
}(ericPrompt)
go func(p string) {
defer wg.Done()
var e error
log.Println("Generating Isaac bio...")
isaacBioResult, e = cp.Complete(ctx, fmt.Sprintf(p, site.Occupation), nil)
if e != nil {
errCh <- fmt.Errorf("generating Isaac bio: %w", e)
}
}(isaacPrompt)
go func(p string) {
defer wg.Done()
var e error
log.Println("Generating testimonials...")
rawTestimonials, e = cp.Complete(ctx, fmt.Sprintf(p, site.Occupation), schema)
if e != nil {
errCh <- fmt.Errorf("generating testimonials: %w", e)
}
}(testimonialsPrompt)
wg.Wait()
close(errCh)
var firstErr error
for e := range errCh {
if firstErr == nil && e != nil {
firstErr = e
}
}
if firstErr != nil {
return nil, firstErr
}
site.Tagline = taglineResult
site.WhatWeDo = template.HTML(whatWeDoResult)
site.ChandlerBio = template.HTML(chandlerBioResult)
site.EricBio = template.HTML(ericBioResult)
site.IsaacBio = template.HTML(isaacBioResult)
fmt.Println("Raw testimonials: %s\n", rawTestimonials)
err = json.Unmarshal([]byte(rawTestimonials), &site.Testimonials)
if err != nil {
return nil, fmt.Errorf("unmarshaling testimonials: %w", err)
}