diff options
| author | Dmitry Vyukov <dvyukov@google.com> | 2026-01-14 15:48:51 +0100 |
|---|---|---|
| committer | Dmitry Vyukov <dvyukov@google.com> | 2026-01-15 10:08:05 +0000 |
| commit | 82a2649e8d7d7a5cc81051c0a3520368a98cfbb2 (patch) | |
| tree | 92e1ff210804f948e3e0140f0a96d00a127e35f0 /dashboard/app/ai.go | |
| parent | 3b7a3359989abfb9ee0c821fdc0a8be33f7e996d (diff) | |
dashboard/app: improve AI UI
A bag of minor assorted improvements to data formatting.
+ show job results in the jobs table
Diffstat (limited to 'dashboard/app/ai.go')
| -rw-r--r-- | dashboard/app/ai.go | 44 |
1 files changed, 28 insertions, 16 deletions
diff --git a/dashboard/app/ai.go b/dashboard/app/ai.go index 2912addea..511865da3 100644 --- a/dashboard/app/ai.go +++ b/dashboard/app/ai.go @@ -34,17 +34,15 @@ type uiAIJobPage struct { Job *uiAIJob // The slice contains the same single Job, just for HTML templates convenience. Jobs []*uiAIJob - Results []*uiAIResult Trajectory []*uiAITrajectorySpan } type uiAIJob struct { - ID string - Link string - Workflow string - Description string - DescriptionLink string - + ID string + Link string + Workflow string + Description string + DescriptionLink string Created time.Time Started time.Time Finished time.Time @@ -53,11 +51,13 @@ type uiAIJob struct { CodeRevisionLink string Error string Correct string + Results []*uiAIResult } type uiAIResult struct { - Name string - Value any + Name string + IsBool bool + Value any } type uiAITrajectorySpan struct { @@ -138,21 +138,32 @@ func handleAIJobPage(ctx context.Context, w http.ResponseWriter, r *http.Request Jobs: []*uiAIJob{uiJob}, Trajectory: makeUIAITrajectory(trajectory), } + return serveTemplate(w, "ai_job.html", page) +} + +func makeUIAIJob(job *aidb.Job) *uiAIJob { + var results []*uiAIResult if m, ok := job.Results.Value.(map[string]any); ok && job.Results.Valid { for name, value := range m { - page.Results = append(page.Results, &uiAIResult{ - Name: name, - Value: value, + _, isBool := value.(bool) + results = append(results, &uiAIResult{ + Name: name, + IsBool: isBool, + Value: value, }) } } - slices.SortFunc(page.Results, func(a, b *uiAIResult) int { + slices.SortFunc(results, func(a, b *uiAIResult) int { + // Pop up bool flags to the top. + if a.IsBool != b.IsBool { + if a.IsBool { + return -1 + } + return 1 + } return strings.Compare(a.Name, b.Name) }) - return serveTemplate(w, "ai_job.html", page) -} -func makeUIAIJob(job *aidb.Job) *uiAIJob { correct := aiCorrectnessIncorrect if !job.Finished.Valid { correct = aiCorrectnessPending @@ -177,6 +188,7 @@ func makeUIAIJob(job *aidb.Job) *uiAIJob { CodeRevisionLink: vcs.LogLink(vcs.SyzkallerRepo, job.CodeRevision), Error: job.Error, Correct: correct, + Results: results, } } |
