Skip to content

Commit ab61e2b

Browse files
committed
fix: compaction fallback to lowest model context limit
1 parent 9f3d6d2 commit ab61e2b

File tree

2 files changed

+36
-7
lines changed

2 files changed

+36
-7
lines changed

pkg/modelsdev/store.go

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package modelsdev
33
import (
44
"context"
55
"encoding/json"
6+
"errors"
67
"fmt"
78
"io"
89
"log/slog"
@@ -23,6 +24,9 @@ const (
2324
refreshInterval = 24 * time.Hour
2425
)
2526

27+
// ErrProviderNotFound is returned when a requested provider is not found in the database.
28+
var ErrProviderNotFound = errors.New("provider not found")
29+
2630
// Store manages access to the models.dev data.
2731
// All methods are safe for concurrent use.
2832
//
@@ -91,7 +95,7 @@ func (s *Store) getProvider(ctx context.Context, providerID string) (*Provider,
9195

9296
provider, exists := db.Providers[providerID]
9397
if !exists {
94-
return nil, fmt.Errorf("provider %q not found", providerID)
98+
return nil, fmt.Errorf("%w: %q", ErrProviderNotFound, providerID)
9599
}
96100

97101
return &provider, nil

pkg/runtime/session_compaction.go

Lines changed: 31 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import (
1111
"github.com/docker/docker-agent/pkg/compaction"
1212
"github.com/docker/docker-agent/pkg/model/provider"
1313
"github.com/docker/docker-agent/pkg/model/provider/options"
14+
"github.com/docker/docker-agent/pkg/modelsdev"
1415
"github.com/docker/docker-agent/pkg/session"
1516
"github.com/docker/docker-agent/pkg/team"
1617
)
@@ -26,7 +27,9 @@ const maxKeepTokens = 20_000
2627
// persistence, token count updates). The agent is used to extract the
2728
// conversation from the session and to obtain the model for summarization.
2829
func (r *LocalRuntime) doCompact(ctx context.Context, sess *session.Session, a *agent.Agent, additionalPrompt string, events chan Event) {
29-
slog.Debug("Generating summary for session", "session_id", sess.ID)
30+
lg := slog.With("session_id", sess.ID, "agent", a.Name(), "action", "compaction")
31+
32+
lg.Debug("Generating summary for session")
3033
events <- SessionCompaction(sess.ID, "started", a.Name())
3134
defer func() {
3235
events <- SessionCompaction(sess.ID, "completed", a.Name())
@@ -37,10 +40,32 @@ func (r *LocalRuntime) doCompact(ctx context.Context, sess *session.Session, a *
3740
options.WithStructuredOutput(nil),
3841
options.WithMaxTokens(maxSummaryTokens),
3942
)
43+
4044
m, err := r.modelsStore.GetModel(ctx, summaryModel.ID())
45+
if err != nil && errors.Is(err, modelsdev.ErrProviderNotFound) {
46+
lg.Debug("Provider not found; attempting to find by model name", "error", err)
47+
48+
db, dberr := r.modelsStore.GetDatabase(ctx)
49+
if dberr != nil {
50+
lg.Error("Provider not found and failed to find by model name", "error", dberr)
51+
events <- Error("Failed to get db to find model definition: " + dberr.Error())
52+
return
53+
}
54+
55+
// Find the lowest context limit for this model, regardless of the provider.
56+
for _, provider := range db.Providers {
57+
if v, ok := provider.Models[summaryModel.BaseConfig().ModelConfig.Model]; ok {
58+
if m == nil || v.Limit.Context < m.Limit.Context {
59+
m = &v
60+
err = nil
61+
}
62+
}
63+
}
64+
}
65+
4166
if err != nil {
42-
slog.Error("Failed to generate session summary", "error", errors.New("failed to get model definition"))
43-
events <- Error("Failed to get model definition")
67+
lg.Error("Failed to get model definition to generate session summary", "error", err)
68+
events <- Error("Failed to get model definition: " + err.Error())
4469
return
4570
}
4671

@@ -58,12 +83,12 @@ func (r *LocalRuntime) doCompact(ctx context.Context, sess *session.Session, a *
5883
t := team.New(team.WithAgents(compactionAgent))
5984
rt, err := New(t, WithSessionCompaction(false))
6085
if err != nil {
61-
slog.Error("Failed to generate session summary", "error", err)
86+
lg.Error("Failed to generate session summary", "error", err)
6287
events <- Error(err.Error())
6388
return
6489
}
6590
if _, err = rt.Run(ctx, compactionSession); err != nil {
66-
slog.Error("Failed to generate session summary", "error", err)
91+
lg.Error("Failed to generate session summary", "error", err)
6792
events <- Error(err.Error())
6893
return
6994
}
@@ -83,7 +108,7 @@ func (r *LocalRuntime) doCompact(ctx context.Context, sess *session.Session, a *
83108
})
84109
_ = r.sessionStore.UpdateSession(ctx, sess)
85110

86-
slog.Debug("Generated session summary", "session_id", sess.ID, "summary_length", len(summary))
111+
lg.Debug("Generated session summary", "summary_length", len(summary))
87112
events <- SessionSummary(sess.ID, summary, a.Name(), firstKeptEntry)
88113
}
89114

0 commit comments

Comments
 (0)