@@ -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+}