Kevin Schoon 1 month ago
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
package main
import (
"context"
"flag"
"fmt"
"github.com/charmbracelet/huh"
"github.com/charmbracelet/huh/spinner"
"go.uber.org/zap"
"go.uber.org/zap/zapcore"
)
var log *zap.SugaredLogger
func setupLogging(debug bool) {
config := zap.NewDevelopmentConfig()
config.EncoderConfig.EncodeLevel = zapcore.CapitalColorLevelEncoder
if debug {
config.Level = zap.NewAtomicLevelAt(zapcore.DebugLevel)
} else {
config.Level = zap.NewAtomicLevelAt(zapcore.InfoLevel)
}
logger, _ := config.Build()
log = logger.Sugar()
}
func main() {
cfgPath := flag.String("config", "", "Configuration File")
nArticles := flag.Int("n", 5, "Number of articles to translate")
debug := flag.Bool("debug", false, "Show debugging information")
flag.Parse()
setupLogging(*debug)
configFile := *cfgPath
if configFile == "" {
configFile = defaultConfigPath()
}
cfg, err := load_config(configFile)
if err != nil {
log.Fatal(err)
}
localLanguage := cfg.Language
fmt.Println(Introduction[localLanguage])
client, err := NewClient(cfg.Model, *debug)
if err != nil {
log.Fatal(err)
}
var sourceName string
sources := []huh.Option[string]{}
for i := range cfg.Sources {
sourceName := cfg.Sources[i].Name()
sources = append(sources, huh.NewOption(sourceName, sourceName))
}
form := huh.NewForm(
huh.NewGroup(
huh.NewSelect[string]().Title(SelectNewsSource[localLanguage]).
Options(sources...).Value(&sourceName),
),
).WithTheme(huh.ThemeBase16())
if err := form.Run(); err != nil {
log.Fatal(err)
}
source := cfg.ByName(sourceName)
ctx := context.Background()
var nArticlesRemote int
task := spinner.New().Title("Downloading Article Source...").Action(func() {
n, err := source.Len(ctx)
if err != nil {
log.Fatal(err)
}
nArticlesRemote = n
})
if err := task.Run(); err != nil {
log.Fatal(err)
}
count := min(*nArticles, nArticlesRemote)
for i := range count {
article, err := source.Get(ctx, i)
if err != nil {
log.Fatal(err)
}
for _, chunk := range article.Chunks() {
var inputText string
form = huh.NewForm(
huh.NewGroup(
huh.NewText().Title(chunk).
Description(
fmt.Sprintf(
SummarizeText[localLanguage],
localLanguage)).Value(&inputText),
),
).WithTheme(huh.ThemeBase16())
if err := form.Run(); err != nil {
log.Fatal(err)
}
sourceText := chunk
if localLanguage != source.Language() {
// translate the remote language to the local language before doing
// the comparision.
translated, err := client.Translate(ctx, chunk, localLanguage, source.Language())
if err != nil {
log.Fatal(err)
}
log.Debugf("Translated source:\n%s\nInto:\n%s", sourceText, translated)
sourceText = translated
}
var score int
task := spinner.New().Title("Comparing text").Action(func() {
n, err := client.Compare(ctx, sourceText, inputText)
if err != nil {
log.Fatal(err)
}
score = n
})
if err := task.Run(); err != nil {
log.Fatal(err)
}
log.Infof("Accuracy: %d", score)
}
}
}