l-ai-agent-kaya/cmd/kaya/main.go
alex 7758c097af
All checks were successful
ci/woodpecker/push/woodpecker Pipeline was successful
Expose stamped /healthz JSON next to Prometheus metrics.
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-10-01 16:28:20 +03:00

82 lines
1.9 KiB
Go

package main
import (
"context"
"errors"
"log/slog"
"net/http"
"os"
"os/signal"
"syscall"
"github.com/prometheus/client_golang/prometheus/promhttp"
"l-ai-agent-kaya/internal/buildinfo"
"l-ai-agent-kaya/internal/config"
"l-ai-agent-kaya/internal/inference"
"l-ai-agent-kaya/internal/profile"
"l-ai-agent-kaya/internal/tasksboard"
)
func main() {
if err := run(); err != nil {
slog.Error("kaya stopped", "error", err)
os.Exit(1)
}
}
func run() error {
cfg, err := config.Load()
if err != nil {
return err
}
prof, err := profile.Load(cfg.ProfilePath)
if err != nil {
return err
}
ctx, stop := signal.NotifyContext(context.Background(), syscall.SIGINT, syscall.SIGTERM)
defer stop()
core, err := inference.DialCore(cfg.CoreEndpoint, cfg.CoreToken, cfg.CoreInsecure)
if err != nil {
return err
}
defer core.Close()
ops := http.NewServeMux()
ops.Handle("/metrics", promhttp.Handler())
ops.Handle("/healthz", buildinfo.Handler())
go serveHTTP(cfg.MetricsListenAddr, ops)
go serveHTTP(cfg.HealthListenAddr, buildinfo.Handler())
loop := &tasksboard.Loop{
WSURL: cfg.TasksWSURL,
Token: cfg.TasksAgentToken,
REST: &tasksboard.Client{BaseURL: cfg.TasksAPIURL, Token: cfg.TasksAgentToken},
Core: core,
Profile: prof,
Model: cfg.Model,
ResponseTimeout: cfg.ResponseTimeout,
Log: slog.Default(),
}
go loop.Run(ctx)
<-ctx.Done()
shutdown, cancel := context.WithTimeout(context.Background(), cfg.ShutdownTimeout)
defer cancel()
<-shutdown.Done()
if errors.Is(ctx.Err(), context.Canceled) {
return nil
}
return ctx.Err()
}
func serveHTTP(addr string, h http.Handler) {
if addr == "" {
return
}
if err := http.ListenAndServe(addr, h); err != nil && !errors.Is(err, http.ErrServerClosed) {
slog.Error("http server stopped", "addr", addr, "error", err)
}
}