159 lines
5.9 KiB
Go
159 lines
5.9 KiB
Go
package cli
|
|
|
|
import (
|
|
"time"
|
|
|
|
"gitea.maximumdirect.net/eric/weatherreporter/internal/app"
|
|
"gitea.maximumdirect.net/eric/weatherreporter/internal/report"
|
|
"gitea.maximumdirect.net/eric/weatherreporter/internal/timeutil"
|
|
"gitea.maximumdirect.net/eric/weatherreporter/internal/weatherdata"
|
|
)
|
|
|
|
const (
|
|
commandGenerate = "generate"
|
|
commandRun = "run"
|
|
|
|
summaryStatusSucceeded = "succeeded"
|
|
summaryStatusFailed = "failed"
|
|
)
|
|
|
|
type generateSummary struct {
|
|
Command string `json:"command"`
|
|
ReportID report.ID `json:"reportId"`
|
|
ReportName string `json:"reportName"`
|
|
PromptID string `json:"promptId"`
|
|
RunID string `json:"runId"`
|
|
Status string `json:"status"`
|
|
GeneratedAt time.Time `json:"generatedAt"`
|
|
ValidPeriod timeutil.Period `json:"validPeriod"`
|
|
OutputPath string `json:"outputPath,omitempty"`
|
|
LLMDebugPath string `json:"llmDebugPath,omitempty"`
|
|
PromptVersion string `json:"promptVersion"`
|
|
Timezone string `json:"timezone"`
|
|
ProfileID string `json:"profileId,omitempty"`
|
|
BackendID string `json:"backendId,omitempty"`
|
|
ModelName string `json:"modelName,omitempty"`
|
|
SourceWarnings []weatherdata.SourceWarning `json:"sourceWarnings,omitempty"`
|
|
ValidationStatus string `json:"validationStatus,omitempty"`
|
|
Notification *generateNotificationSummary `json:"notification,omitempty"`
|
|
Error string `json:"error,omitempty"`
|
|
}
|
|
|
|
type generateNotificationSummary struct {
|
|
Status string `json:"status,omitempty"`
|
|
UploadStatus string `json:"uploadStatus,omitempty"`
|
|
StatusError string `json:"statusError,omitempty"`
|
|
RunID string `json:"runId,omitempty"`
|
|
PipelineID string `json:"pipelineId,omitempty"`
|
|
BundleID string `json:"bundleId,omitempty"`
|
|
IdempotencyKey string `json:"idempotencyKey,omitempty"`
|
|
AcceptedAt *time.Time `json:"acceptedAt,omitempty"`
|
|
StartedAt *time.Time `json:"startedAt,omitempty"`
|
|
FinishedAt *time.Time `json:"finishedAt,omitempty"`
|
|
Error string `json:"error,omitempty"`
|
|
}
|
|
|
|
type batchSummary struct {
|
|
Command string `json:"command"`
|
|
Batch app.BatchKind `json:"batch"`
|
|
Status string `json:"status"`
|
|
StartedAt time.Time `json:"startedAt"`
|
|
FinishedAt time.Time `json:"finishedAt"`
|
|
Total int `json:"total"`
|
|
Succeeded int `json:"succeeded"`
|
|
Failed int `json:"failed"`
|
|
Notification *app.BatchNotificationResult `json:"notification,omitempty"`
|
|
Reports []app.BatchReportResult `json:"reports"`
|
|
Error string `json:"error,omitempty"`
|
|
}
|
|
|
|
func newGenerateSummary(result *app.ReportResult, err error) generateSummary {
|
|
summary := generateSummary{Command: commandGenerate}
|
|
if result == nil {
|
|
return summary
|
|
}
|
|
|
|
summary.ReportID = result.ReportID
|
|
summary.ReportName = result.ReportName
|
|
summary.PromptID = result.PromptID
|
|
summary.PromptVersion = result.PromptVersion
|
|
summary.RunID = result.RunID
|
|
summary.Status = summaryStatusSucceeded
|
|
summary.GeneratedAt = result.GeneratedAt
|
|
summary.ValidPeriod = result.ValidPeriod
|
|
summary.Timezone = result.Timezone
|
|
summary.ProfileID, summary.BackendID, summary.ModelName = result.ProfileID, result.BackendID, result.ModelName
|
|
summary.SourceWarnings = append([]weatherdata.SourceWarning(nil), result.SourceWarnings...)
|
|
summary.ValidationStatus = string(result.ValidationStatus)
|
|
summary.OutputPath = result.OutputPath
|
|
summary.LLMDebugPath = result.LLMDebugPath
|
|
summary.Notification = newGenerateNotificationSummary(result.Notification)
|
|
if err != nil {
|
|
summary.Status = summaryStatusFailed
|
|
summary.Error = err.Error()
|
|
}
|
|
return summary
|
|
}
|
|
|
|
func newGenerateNotificationSummary(result *app.NotificationResult) *generateNotificationSummary {
|
|
if result == nil {
|
|
return nil
|
|
}
|
|
summary := &generateNotificationSummary{
|
|
Status: result.Status,
|
|
UploadStatus: result.UploadStatus,
|
|
StatusError: result.StatusError,
|
|
RunID: result.RunID,
|
|
PipelineID: result.PipelineID,
|
|
BundleID: result.BundleID,
|
|
IdempotencyKey: result.IdempotencyKey,
|
|
StartedAt: result.StartedAt,
|
|
FinishedAt: result.FinishedAt,
|
|
Error: result.Error,
|
|
}
|
|
if !result.AcceptedAt.IsZero() {
|
|
acceptedAt := result.AcceptedAt
|
|
summary.AcceptedAt = &acceptedAt
|
|
}
|
|
return summary
|
|
}
|
|
|
|
func newBatchSummary(result *app.BatchResult) batchSummary {
|
|
summary := batchSummary{Command: commandRun}
|
|
if result == nil {
|
|
return summary
|
|
}
|
|
|
|
summary.Batch = result.Batch
|
|
summary.Status = batchSummaryStatus(result)
|
|
summary.StartedAt = result.StartedAt
|
|
summary.FinishedAt = result.FinishedAt
|
|
summary.Total = result.Total
|
|
summary.Succeeded = result.Succeeded
|
|
summary.Failed = result.Failed
|
|
summary.Notification = result.Notification
|
|
summary.Reports = append([]app.BatchReportResult(nil), result.Reports...)
|
|
if summary.Status == summaryStatusFailed {
|
|
summary.Error = app.BatchError{Result: result}.Error()
|
|
}
|
|
return summary
|
|
}
|
|
|
|
func batchSummaryStatus(result *app.BatchResult) string {
|
|
if result == nil {
|
|
return ""
|
|
}
|
|
if result.Failed > 0 || (result.Notification != nil && result.Notification.Status == summaryStatusFailed) {
|
|
return summaryStatusFailed
|
|
}
|
|
return summaryStatusSucceeded
|
|
}
|
|
|
|
func reportName(id report.ID) string {
|
|
definition, err := report.DefaultRegistry().Lookup(id)
|
|
if err != nil {
|
|
return string(id)
|
|
}
|
|
return definition.Name
|
|
}
|