on main help sign in
chore: change how summarize sessions gets triggered
f3f4d9dKujtim Hoxha
internal/config/config.go+38
@@ -860,6 +860,44 @@ func GetAgentModel(agentID AgentID) Model {
860 return Model{}
860 return Model{}
861}
861}
862
862
863+// GetAgentEffectiveMaxTokens returns the effective max tokens for an agent,
864+// considering any overrides from the preferred model configuration
865+func GetAgentEffectiveMaxTokens(agentID AgentID) int64 {
866+ cfg := Get()
867+ agent, ok := cfg.Agents[agentID]
868+ if !ok {
869+ logging.Error("Agent not found", "agent_id", agentID)
870+ return 0
871+ }
872+
873+ var preferredModel PreferredModel
874+ switch agent.Model {
875+ case LargeModel:
876+ preferredModel = cfg.Models.Large
877+ case SmallModel:
878+ preferredModel = cfg.Models.Small
879+ default:
880+ logging.Warn("Unknown model type for agent", "agent_id", agentID, "model_type", agent.Model)
881+ preferredModel = cfg.Models.Large // Fallback to large model
882+ }
883+
884+ // Get the base model configuration
885+ baseModel := GetAgentModel(agentID)
886+ if baseModel.ID == "" {
887+ return 0
888+ }
889+
890+ // Start with the default max tokens from the base model
891+ maxTokens := baseModel.DefaultMaxTokens
892+
893+ // Override with preferred model max tokens if set
894+ if preferredModel.MaxTokens > 0 {
895+ maxTokens = preferredModel.MaxTokens
896+ }
897+
898+ return maxTokens
899+}
900+
863func GetAgentProvider(agentID AgentID) ProviderConfig {
901func GetAgentProvider(agentID AgentID) ProviderConfig {
864 cfg := Get()
902 cfg := Get()
865 agent, ok := cfg.Agents[agentID]
903 agent, ok := cfg.Agents[agentID]
internal/llm/agent/agent.go+5
@@ -50,6 +50,7 @@ type AgentEvent struct {
50type Service interface {
50type Service interface {
51 pubsub.Suscriber[AgentEvent]
51 pubsub.Suscriber[AgentEvent]
52 Model() config.Model
52 Model() config.Model
53+ EffectiveMaxTokens() int64
53 Run(ctx context.Context, sessionID string, content string, attachments ...message.Attachment) (<-chan AgentEvent, error)
54 Run(ctx context.Context, sessionID string, content string, attachments ...message.Attachment) (<-chan AgentEvent, error)
54 Cancel(sessionID string)
55 Cancel(sessionID string)
55 CancelAll()
56 CancelAll()
@@ -229,6 +230,10 @@ func (a *agent) Model() config.Model {
229 return config.GetAgentModel(a.agentCfg.ID)
230 return config.GetAgentModel(a.agentCfg.ID)
230}
231}
231
232
233+func (a *agent) EffectiveMaxTokens() int64 {
234+ return config.GetAgentEffectiveMaxTokens(a.agentCfg.ID)
235+}
236+
232func (a *agent) Cancel(sessionID string) {
237func (a *agent) Cancel(sessionID string) {
233 // Cancel regular requests
238 // Cancel regular requests
234 if cancelFunc, exists := a.activeRequests.LoadAndDelete(sessionID); exists {
239 if cancelFunc, exists := a.activeRequests.LoadAndDelete(sessionID); exists {
internal/tui/tui.go+17−2
@@ -228,8 +228,23 @@ func (a *appModel) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
228 if err == nil {
228 if err == nil {
229 model := a.app.CoderAgent.Model()
229 model := a.app.CoderAgent.Model()
230 contextWindow := model.ContextWindow
230 contextWindow := model.ContextWindow
231− tokens := session.CompletionTokens + session.PromptTokens
231+ usedTokens := session.CompletionTokens + session.PromptTokens
232+ remainingTokens := contextWindow - usedTokens
233+
234+ // Get effective max tokens for this agent (considering overrides)
235+ maxTokens := a.app.CoderAgent.EffectiveMaxTokens()
236+
237+ // Apply 10% margin to max tokens
238+ maxTokensWithMargin := int64(float64(maxTokens) * 1.1)
239+
240+ // Trigger auto-summarize if remaining tokens < max tokens + 10% margin
241+ // Also ensure we have a reasonable minimum threshold to avoid too-frequent summaries
242+ minThreshold := int64(1000) // Minimum 1000 tokens remaining before triggering
243+ if maxTokensWithMargin < minThreshold {
244+ maxTokensWithMargin = minThreshold
245+ }
246+
232− if (tokens >= int64(float64(contextWindow)*0.95)) && !config.Get().Options.DisableAutoSummarize {
247+ if remainingTokens < maxTokensWithMargin && !config.Get().Options.DisableAutoSummarize {
233 // Show compact confirmation dialog
248 // Show compact confirmation dialog
234 cmds = append(cmds, util.CmdHandler(dialogs.OpenDialogMsg{
249 cmds = append(cmds, util.CmdHandler(dialogs.OpenDialogMsg{
235 Model: compact.NewCompactDialogCmp(a.app.CoderAgent, a.selectedSessionID, false),
250 Model: compact.NewCompactDialogCmp(a.app.CoderAgent, a.selectedSessionID, false),