on main help sign in
fix: bring back metrics on fantasy
f7b78dfAndrey Nering
internal/agent/agent.go+9
@@ -172,6 +172,9 @@ func (a *sessionAgent) Run(ctx context.Context, call SessionAgentCall) (*fantasy
172
172
173 history, files := a.preparePrompt(msgs, call.Attachments...)
173 history, files := a.preparePrompt(msgs, call.Attachments...)
174
174
175+ startTime := time.Now()
176+ a.eventPromptSent(call.SessionID)
177+
175 var currentAssistant *message.Message
178 var currentAssistant *message.Message
176 var shouldSummarize bool
179 var shouldSummarize bool
177 result, err := agent.Stream(genCtx, fantasy.AgentStreamCall{
180 result, err := agent.Stream(genCtx, fantasy.AgentStreamCall{
@@ -354,6 +357,9 @@ func (a *sessionAgent) Run(ctx context.Context, call SessionAgentCall) (*fantasy
354 },
357 },
355 },
358 },
356 })
359 })
360+
361+ a.eventPromptResponded(call.SessionID, time.Since(startTime).Truncate(time.Second))
362+
357 if err != nil {
363 if err != nil {
358 isCancelErr := errors.Is(err, context.Canceled)
364 isCancelErr := errors.Is(err, context.Canceled)
359 isPermissionErr := errors.Is(err, permission.ErrorPermissionDenied)
365 isPermissionErr := errors.Is(err, permission.ErrorPermissionDenied)
@@ -684,6 +690,9 @@ func (a *sessionAgent) updateSessionUsage(model Model, session *session.Session,
684 modelConfig.CostPer1MOutCached/1e6*float64(usage.CacheReadTokens) +
690 modelConfig.CostPer1MOutCached/1e6*float64(usage.CacheReadTokens) +
685 modelConfig.CostPer1MIn/1e6*float64(usage.InputTokens) +
691 modelConfig.CostPer1MIn/1e6*float64(usage.InputTokens) +
686 modelConfig.CostPer1MOut/1e6*float64(usage.OutputTokens)
692 modelConfig.CostPer1MOut/1e6*float64(usage.OutputTokens)
693+
694+ a.eventTokensUsed(session.ID, model, usage, cost)
695+
687 session.Cost += cost
696 session.Cost += cost
688 session.CompletionTokens = usage.OutputTokens + usage.CacheReadTokens
697 session.CompletionTokens = usage.OutputTokens + usage.CacheReadTokens
689 session.PromptTokens = usage.InputTokens + usage.CacheCreationTokens
698 session.PromptTokens = usage.InputTokens + usage.CacheCreationTokens
internal/agent/event.gonew file+50
@@ -0,0 +1,50 @@
1+package agent
2+
3+import (
4+ "time"
5+
6+ "charm.land/fantasy"
7+ "github.com/charmbracelet/crush/internal/event"
8+)
9+
10+func (a sessionAgent) eventPromptSent(sessionID string) {
11+ event.PromptSent(
12+ a.eventCommon(sessionID, a.largeModel)...,
13+ )
14+}
15+
16+func (a sessionAgent) eventPromptResponded(sessionID string, duration time.Duration) {
17+ event.PromptResponded(
18+ append(
19+ a.eventCommon(sessionID, a.largeModel),
20+ "prompt duration pretty", duration.String(),
21+ "prompt duration in seconds", int64(duration.Seconds()),
22+ )...,
23+ )
24+}
25+
26+func (a sessionAgent) eventTokensUsed(sessionID string, model Model, usage fantasy.Usage, cost float64) {
27+ event.TokensUsed(
28+ append(
29+ a.eventCommon(sessionID, model),
30+ "input tokens", usage.InputTokens,
31+ "output tokens", usage.OutputTokens,
32+ "cache read tokens", usage.CacheReadTokens,
33+ "cache creation tokens", usage.CacheCreationTokens,
34+ "total tokens", usage.InputTokens+usage.OutputTokens+usage.CacheReadTokens+usage.CacheCreationTokens,
35+ "cost", cost,
36+ )...,
37+ )
38+}
39+
40+func (a sessionAgent) eventCommon(sessionID string, model Model) []any {
41+ m := model.ModelCfg
42+
43+ return []any{
44+ "session id", sessionID,
45+ "provider", m.Provider,
46+ "model", m.Model,
47+ "reasoning effort", m.ReasoningEffort,
48+ "thinking mode", m.Think,
49+ }
50+}