Skip to content

Commit dc14fee

Browse files
authored
Merge pull request #608 from rumpl/eval-command
Add "Eval" command to the command palette
2 parents fc40233 + 9c1dcae commit dc14fee

7 files changed

Lines changed: 35 additions & 12 deletions

File tree

cmd/root/run.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -618,9 +618,9 @@ func runUserCommand(userInput string, sess *session.Session, rt runtime.Runtime,
618618
case "/exit":
619619
os.Exit(0)
620620
case "/eval":
621-
err := evaluation.Save(sess)
621+
evalFile, err := evaluation.Save(sess)
622622
if err == nil {
623-
fmt.Printf("%s\n", yellow("Evaluation saved"))
623+
fmt.Printf("%s\n", yellow("Evaluation saved to file %s", evalFile))
624624
return true, err
625625
}
626626
return true, nil

pkg/app/app.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -98,6 +98,10 @@ func (a *App) NewSession() {
9898
a.session = session.New()
9999
}
100100

101+
func (a *App) Session() *session.Session {
102+
return a.session
103+
}
104+
101105
func (a *App) CompactSession() {
102106
if a.runtime != nil && a.session != nil {
103107
events := make(chan runtime.Event, 100)

pkg/evaluation/evaluation.go

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -165,9 +165,9 @@ func toolTrajectoryScore(expectedToolMessages, actualToolMessages []session.Mess
165165
return score / float64(len(expectedToolMessages))
166166
}
167167

168-
func Save(sess *session.Session) error {
168+
func Save(sess *session.Session) (string, error) {
169169
if err := os.MkdirAll("evals", 0o755); err != nil {
170-
return err
170+
return "", err
171171
}
172172

173173
fileName := sess.ID + ".json"
@@ -182,11 +182,12 @@ func Save(sess *session.Session) error {
182182
}
183183
}
184184

185-
file, err := os.Create(filepath.Join("evals", fileName))
185+
evalFile := filepath.Join("evals", fileName)
186+
file, err := os.Create(evalFile)
186187
if err != nil {
187-
return err
188+
return "", err
188189
}
189190
defer file.Close()
190191

191-
return json.NewEncoder(file).Encode(sess)
192+
return evalFile, json.NewEncoder(file).Encode(sess)
192193
}

pkg/tui/components/messages/messages.go

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,10 @@ type StreamCancelledMsg struct {
2525
ShowMessage bool // Whether to show a cancellation message after cleanup
2626
}
2727

28+
type EvalSavedMsg struct {
29+
File string
30+
}
31+
2832
// Model represents a chat message list component
2933
type Model interface {
3034
layout.Model
@@ -104,7 +108,10 @@ func (m *model) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
104108
m.removeSpinner()
105109
m.cancelPendingToolCalls()
106110
return m, nil
107-
111+
case EvalSavedMsg:
112+
m.AddSystemMessage(fmt.Sprintf("Eval saved to file %s", msg.File))
113+
cmd := m.ScrollToBottom()
114+
return m, cmd
108115
case tea.WindowSizeMsg:
109116
cmd := m.SetSize(msg.Width, msg.Height)
110117
if cmd != nil {

pkg/tui/dialog/command_palette.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -133,7 +133,7 @@ func (d *commandPaletteDialog) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
133133
if selectedCmd.Execute != nil {
134134
cmds = append(cmds, selectedCmd.Execute())
135135
}
136-
return d, tea.Batch(cmds...)
136+
return d, tea.Sequence(cmds...)
137137
}
138138
return d, nil
139139

pkg/tui/page/chat/chat.go

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -187,9 +187,8 @@ func (p *chatPage) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
187187
p.messages = model.(messages.Model)
188188

189189
var cmds []tea.Cmd
190-
if cmd != nil {
191-
cmds = append(cmds, cmd)
192-
}
190+
cmds = append(cmds, cmd)
191+
193192
if msg.ShowMessage {
194193
cmds = append(cmds, p.messages.AddCancelledMessage())
195194
}

pkg/tui/tui.go

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,9 @@ import (
99
"github.com/charmbracelet/lipgloss/v2"
1010

1111
"github.com/docker/cagent/pkg/app"
12+
"github.com/docker/cagent/pkg/evaluation"
1213
"github.com/docker/cagent/pkg/runtime"
14+
"github.com/docker/cagent/pkg/tui/components/messages"
1315
"github.com/docker/cagent/pkg/tui/components/statusbar"
1416
"github.com/docker/cagent/pkg/tui/core"
1517
"github.com/docker/cagent/pkg/tui/dialog"
@@ -327,6 +329,16 @@ func (a *appModel) buildCommandCategories() []dialog.CommandCategory {
327329
return a.chatPage.CopySessionToClipboard()
328330
},
329331
},
332+
{
333+
ID: "session.eval",
334+
Label: "Eval",
335+
Description: "Create an evaluation report for the current conversation",
336+
Category: "Session",
337+
Execute: func() tea.Cmd {
338+
evalFile, _ := evaluation.Save(a.application.Session())
339+
return core.CmdHandler(messages.EvalSavedMsg{File: evalFile})
340+
},
341+
},
330342
},
331343
},
332344
}

0 commit comments

Comments
 (0)