Add Daily prompt input preflight
This commit is contained in:
@@ -7,10 +7,12 @@ import (
|
||||
"path/filepath"
|
||||
"time"
|
||||
|
||||
"gitea.maximumdirect.net/eric/weatherreporter/internal/adapters/scriptorium"
|
||||
"gitea.maximumdirect.net/eric/weatherreporter/internal/adapters/weatherapi"
|
||||
"gitea.maximumdirect.net/eric/weatherreporter/internal/briefing"
|
||||
"gitea.maximumdirect.net/eric/weatherreporter/internal/config"
|
||||
"gitea.maximumdirect.net/eric/weatherreporter/internal/forecast"
|
||||
"gitea.maximumdirect.net/eric/weatherreporter/internal/promptinput"
|
||||
"gitea.maximumdirect.net/eric/weatherreporter/internal/report"
|
||||
"gitea.maximumdirect.net/eric/weatherreporter/internal/timeutil"
|
||||
)
|
||||
@@ -57,21 +59,41 @@ type DailyBriefingRequest struct {
|
||||
OutputPath string
|
||||
}
|
||||
|
||||
type DailyPreparationRequest struct {
|
||||
Config config.Config
|
||||
Resolved report.Resolved
|
||||
DataPackagePath string
|
||||
Renderer Renderer
|
||||
}
|
||||
|
||||
type DailyBriefingResult struct {
|
||||
Package briefing.Package
|
||||
OutputPath string
|
||||
}
|
||||
|
||||
type DailyPreparationResult struct {
|
||||
Briefing briefing.Package
|
||||
BriefingPath string
|
||||
DataPackage promptinput.Package
|
||||
DataPackagePath string
|
||||
PreflightPath string
|
||||
RenderResult *scriptorium.RenderResult
|
||||
}
|
||||
|
||||
type Renderer interface {
|
||||
Render(context.Context, scriptorium.RenderRequest) (*scriptorium.RenderResult, error)
|
||||
}
|
||||
|
||||
func Generate(ctx context.Context, req GenerateRequest) error {
|
||||
resolved, err := ResolveGenerate(req, time.Now())
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
if resolved.Definition.ID == report.DailyToday {
|
||||
_, err := GenerateDailyBriefing(ctx, DailyBriefingRequest{
|
||||
Config: req.Config,
|
||||
Resolved: resolved,
|
||||
OutputPath: req.OutputPath,
|
||||
_, err := PrepareDailyReport(ctx, DailyPreparationRequest{
|
||||
Config: req.Config,
|
||||
Resolved: resolved,
|
||||
DataPackagePath: req.OutputPath,
|
||||
})
|
||||
return err
|
||||
}
|
||||
@@ -192,6 +214,71 @@ func GenerateDailyBriefing(ctx context.Context, req DailyBriefingRequest) (*Dail
|
||||
return &DailyBriefingResult{Package: pkg, OutputPath: outputPath}, nil
|
||||
}
|
||||
|
||||
func PrepareDailyReport(ctx context.Context, req DailyPreparationRequest) (*DailyPreparationResult, error) {
|
||||
bundle, err := FetchBundle(ctx, FetchBundleRequest{Config: req.Config})
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
briefingPackage, err := BuildDailyBriefing(DailyBriefingRequest{
|
||||
Config: req.Config,
|
||||
Resolved: req.Resolved,
|
||||
}, bundle)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
briefingPath := defaultBriefingPath(req.Config, req.Resolved)
|
||||
if err := briefing.Save(briefingPath, briefingPackage); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
dataPackage, err := promptinput.Build(briefingPackage)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
dataPackagePath := req.DataPackagePath
|
||||
if dataPackagePath == "" {
|
||||
dataPackagePath = defaultDataPackagePath(req.Config, req.Resolved)
|
||||
}
|
||||
if err := promptinput.Save(dataPackagePath, dataPackage); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
renderer := req.Renderer
|
||||
if renderer == nil {
|
||||
renderer = scriptorium.Runner{
|
||||
Binary: req.Config.Scriptorium.Binary,
|
||||
ConfigPath: req.Config.Scriptorium.ConfigPath,
|
||||
Profile: req.Config.Scriptorium.Profile,
|
||||
Timeout: req.Config.Scriptorium.Timeout,
|
||||
ExtraArgs: req.Config.Scriptorium.ExtraArgs,
|
||||
}
|
||||
}
|
||||
renderResult, renderErr := renderer.Render(ctx, scriptorium.RenderRequest{
|
||||
PromptID: req.Resolved.Definition.PromptID,
|
||||
DataPackagePath: dataPackagePath,
|
||||
})
|
||||
|
||||
preflightPath := defaultPreflightPath(req.Config, req.Resolved)
|
||||
if renderResult != nil {
|
||||
if err := scriptorium.SaveRenderResult(preflightPath, renderResult); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
}
|
||||
if renderErr != nil {
|
||||
return nil, renderErr
|
||||
}
|
||||
|
||||
return &DailyPreparationResult{
|
||||
Briefing: briefingPackage,
|
||||
BriefingPath: briefingPath,
|
||||
DataPackage: dataPackage,
|
||||
DataPackagePath: dataPackagePath,
|
||||
PreflightPath: preflightPath,
|
||||
RenderResult: renderResult,
|
||||
}, nil
|
||||
}
|
||||
|
||||
func BuildDailyBriefing(req DailyBriefingRequest, bundle *forecast.Bundle) (briefing.Package, error) {
|
||||
location, err := timeutil.LoadLocation(req.Config.WeatherAPI.Timezone)
|
||||
if err != nil {
|
||||
@@ -222,3 +309,15 @@ func defaultBriefingPath(cfg config.Config, resolved report.Resolved) string {
|
||||
filename := validDate + "." + string(resolved.Definition.ID) + ".briefing.json"
|
||||
return filepath.Join(cfg.Workspace.Root, cfg.Workspace.SnapshotsDir, "daily", validDate, filename)
|
||||
}
|
||||
|
||||
func defaultDataPackagePath(cfg config.Config, resolved report.Resolved) string {
|
||||
validDate := resolved.ValidPeriod.Start.Format("2006-01-02")
|
||||
filename := resolved.Metadata().RunID + ".data_package.json"
|
||||
return filepath.Join(cfg.Workspace.Root, cfg.Workspace.DataPackagesDir, "daily", validDate, filename)
|
||||
}
|
||||
|
||||
func defaultPreflightPath(cfg config.Config, resolved report.Resolved) string {
|
||||
validDate := resolved.ValidPeriod.Start.Format("2006-01-02")
|
||||
filename := resolved.Metadata().RunID + ".render.json"
|
||||
return filepath.Join(cfg.Workspace.Root, cfg.Workspace.PreflightDir, "daily", validDate, filename)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user