Let Compact continue on another model or vendor

This commit is contained in:
Ian Gulliver
2026-10-18 00:43:00 -07:00
parent 0a1f58cafa
commit 17f09ecb7c
11 changed files with 314 additions and 236 deletions
+30 -6
View File
@@ -24,15 +24,38 @@ const leadHandoffPrompt = `Write a handoff for a fresh lead agent that will take
`questions you have surfaced or answered and why; what you last pointed the human's attention at; and anything you promised to do or check. ` +
`Be complete: the next agent sees nothing else. Your final message is the handoff, and nothing else.`
func (m *Manager) Compact(ctx context.Context, sessionID string) (api.AgentSession, error) {
func (m *Manager) Compact(ctx context.Context, sessionID, model string) (api.AgentSession, error) {
sess, err := m.store.GetSession(ctx, sessionID)
if err != nil {
return api.AgentSession{}, err
}
if sess.Owner != "" {
return m.Send(ctx, sessionID, "byre", leadHandoffPrompt, "")
task, err := m.taskFor(ctx, sess)
if err != nil {
return api.AgentSession{}, err
}
return m.Send(ctx, sessionID, "byre", handoffPrompt, "")
prompt := handoffPrompt
if sess.Owner != "" {
prompt = leadHandoffPrompt
}
err = transition(ctx, m.store, sess.Id, api.AgentSessionStateIdle, api.AgentSessionStateRunning, "byre")
if err != nil {
return api.AgentSession{}, err
}
m.mu.Lock()
m.handoffModel[sessionID] = model
m.mu.Unlock()
return m.launch(ctx, sess, task, "byre", prompt, nil)
}
func (m *Manager) continuationModel(sess api.AgentSession) string {
m.mu.Lock()
model := m.handoffModel[sess.Id]
delete(m.handoffModel, sess.Id)
m.mu.Unlock()
if model == "" {
return sess.Model
}
return model
}
func isHandoffPrompt(actor, text string) bool {
@@ -60,13 +83,14 @@ func (m *Manager) handoff(ctx context.Context, sessionID, handoff string) error
if err != nil {
return err
}
model := m.continuationModel(sess)
if sess.Owner != "" {
err = m.retire(ctx, sess, "byre")
if err != nil {
return err
}
_, err = m.createLead(ctx, creator, leadHandoffPreamble+handoff, sess.Model, "byre", nil)
_, err = m.createLead(ctx, creator, leadHandoffPreamble+handoff, model, "byre", nil)
return err
}
@@ -88,7 +112,7 @@ func (m *Manager) handoff(ctx context.Context, sessionID, handoff string) error
if err != nil {
return err
}
_, err = m.create(ctx, task, creator, handoffPreamble+handoff, sess.Model, "byre", nil)
_, err = m.create(ctx, task, creator, handoffPreamble+handoff, model, "byre", nil)
if errors.Is(err, ErrConflict) {
m.startDiscard(task.Id)
return nil