Save a default model per user, set from Settings

This commit is contained in:
Ian Gulliver
2026-10-18 00:57:51 -07:00
parent 17f09ecb7c
commit 10c6c84f74
10 changed files with 395 additions and 257 deletions
+25 -1
View File
@@ -44,6 +44,23 @@ paths:
schema: { $ref: "#/components/schemas/User" } schema: { $ref: "#/components/schemas/User" }
"400": { $ref: "#/components/responses/Error" } "400": { $ref: "#/components/responses/Error" }
/api/me/default-model:
put:
operationId: updateDefaultModel
description: Sets the model the calling user's app starts new tasks on.
requestBody:
required: true
content:
application/json:
schema: { $ref: "#/components/schemas/DefaultModel" }
responses:
"200":
description: The updated user.
content:
application/json:
schema: { $ref: "#/components/schemas/User" }
"400": { $ref: "#/components/responses/Error" }
/api/me/lead/sessions: /api/me/lead/sessions:
get: get:
operationId: listLeadSessions operationId: listLeadSessions
@@ -1072,13 +1089,20 @@ components:
User: User:
type: object type: object
required: [login, display_name, git_name, git_email, notification_prefs] required: [login, display_name, git_name, git_email, notification_prefs, default_model]
properties: properties:
login: { type: string } login: { type: string }
display_name: { type: string } display_name: { type: string }
git_name: { type: string } git_name: { type: string }
git_email: { type: string } git_email: { type: string }
notification_prefs: { $ref: "#/components/schemas/NotificationPrefs" } notification_prefs: { $ref: "#/components/schemas/NotificationPrefs" }
default_model: { type: string, description: The model the app starts new tasks on. }
DefaultModel:
type: object
required: [model]
properties:
model: { type: string }
NotificationPrefs: NotificationPrefs:
type: object type: object
+5 -3
View File
File diff suppressed because one or more lines are too long
+273 -244
View File
@@ -736,6 +736,11 @@ type ConnectedClient struct {
Login string `json:"login"` Login string `json:"login"`
} }
// DefaultModel defines model for DefaultModel.
type DefaultModel struct {
Model string `json:"model"`
}
// DirEntry defines model for DirEntry. // DirEntry defines model for DirEntry.
type DirEntry struct { type DirEntry struct {
// Ignored git ignores the entry: .gitignore and the other exclude files match it or a directory above it. // Ignored git ignores the entry: .gitignore and the other exclude files match it or a directory above it.
@@ -1343,10 +1348,12 @@ type Unmerged struct {
// User defines model for User. // User defines model for User.
type User struct { type User struct {
DisplayName string `json:"display_name"` // DefaultModel The model the app starts new tasks on.
GitEmail string `json:"git_email"` DefaultModel string `json:"default_model"`
GitName string `json:"git_name"` DisplayName string `json:"display_name"`
Login string `json:"login"` GitEmail string `json:"git_email"`
GitName string `json:"git_name"`
Login string `json:"login"`
// NotificationPrefs Which new inbox items and finished turns notify this user in their open byre pages. // NotificationPrefs Which new inbox items and finished turns notify this user in their open byre pages.
NotificationPrefs NotificationPrefs `json:"notification_prefs"` NotificationPrefs NotificationPrefs `json:"notification_prefs"`
@@ -1509,6 +1516,9 @@ type RespondInboxJSONRequestBody = InboxRespond
// UpdateMeJSONRequestBody defines body for UpdateMe for application/json ContentType. // UpdateMeJSONRequestBody defines body for UpdateMe for application/json ContentType.
type UpdateMeJSONRequestBody = UserUpdate type UpdateMeJSONRequestBody = UserUpdate
// UpdateDefaultModelJSONRequestBody defines body for UpdateDefaultModel for application/json ContentType.
type UpdateDefaultModelJSONRequestBody = DefaultModel
// SetFocusJSONRequestBody defines body for SetFocus for application/json ContentType. // SetFocusJSONRequestBody defines body for SetFocus for application/json ContentType.
type SetFocusJSONRequestBody = Focus type SetFocusJSONRequestBody = Focus
@@ -1587,6 +1597,9 @@ type ServerInterface interface {
// (PUT /api/me) // (PUT /api/me)
UpdateMe(w http.ResponseWriter, r *http.Request) UpdateMe(w http.ResponseWriter, r *http.Request)
// (PUT /api/me/default-model)
UpdateDefaultModel(w http.ResponseWriter, r *http.Request)
// (GET /api/me/focus) // (GET /api/me/focus)
GetFocus(w http.ResponseWriter, r *http.Request) GetFocus(w http.ResponseWriter, r *http.Request)
@@ -2077,6 +2090,20 @@ func (siw *ServerInterfaceWrapper) UpdateMe(w http.ResponseWriter, r *http.Reque
handler.ServeHTTP(w, r) handler.ServeHTTP(w, r)
} }
// UpdateDefaultModel operation middleware
func (siw *ServerInterfaceWrapper) UpdateDefaultModel(w http.ResponseWriter, r *http.Request) {
handler := http.Handler(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
siw.Handler.UpdateDefaultModel(w, r)
}))
for _, middleware := range siw.HandlerMiddlewares {
handler = middleware(handler)
}
handler.ServeHTTP(w, r)
}
// GetFocus operation middleware // GetFocus operation middleware
func (siw *ServerInterfaceWrapper) GetFocus(w http.ResponseWriter, r *http.Request) { func (siw *ServerInterfaceWrapper) GetFocus(w http.ResponseWriter, r *http.Request) {
@@ -3644,6 +3671,7 @@ func HandlerWithOptions(si ServerInterface, options StdHTTPServerOptions) http.H
m.HandleFunc(http.MethodGet+" "+options.BaseURL+"/api/me", wrapper.GetMe) m.HandleFunc(http.MethodGet+" "+options.BaseURL+"/api/me", wrapper.GetMe)
m.HandleFunc(http.MethodPut+" "+options.BaseURL+"/api/me", wrapper.UpdateMe) m.HandleFunc(http.MethodPut+" "+options.BaseURL+"/api/me", wrapper.UpdateMe)
m.HandleFunc(http.MethodPut+" "+options.BaseURL+"/api/me/notifications", wrapper.UpdateNotificationPrefs) m.HandleFunc(http.MethodPut+" "+options.BaseURL+"/api/me/notifications", wrapper.UpdateNotificationPrefs)
m.HandleFunc(http.MethodPut+" "+options.BaseURL+"/api/me/default-model", wrapper.UpdateDefaultModel)
m.HandleFunc(http.MethodGet+" "+options.BaseURL+"/api/me/lead/sessions", wrapper.ListLeadSessions) m.HandleFunc(http.MethodGet+" "+options.BaseURL+"/api/me/lead/sessions", wrapper.ListLeadSessions)
m.HandleFunc(http.MethodGet+" "+options.BaseURL+"/api/me/lead/events", wrapper.ListLeadEvents) m.HandleFunc(http.MethodGet+" "+options.BaseURL+"/api/me/lead/events", wrapper.ListLeadEvents)
m.HandleFunc(http.MethodPost+" "+options.BaseURL+"/api/me/lead/messages", wrapper.MessageLead) m.HandleFunc(http.MethodPost+" "+options.BaseURL+"/api/me/lead/messages", wrapper.MessageLead)
@@ -3713,246 +3741,247 @@ func HandlerWithOptions(si ServerInterface, options StdHTTPServerOptions) http.H
// const string: with thousands of chunks the chained `+` fold is several // const string: with thousands of chunks the chained `+` fold is several
// times slower for the Go compiler than parsing a slice literal. // times slower for the Go compiler than parsing a slice literal.
var swaggerSpec = []string{ var swaggerSpec = []string{
"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",
} }
// decodeSpec returns the embedded OpenAPI spec as raw JSON bytes, // decodeSpec returns the embedded OpenAPI spec as raw JSON bytes,
+21
View File
@@ -1,7 +1,9 @@
package server package server
import ( import (
"errors"
"net/http" "net/http"
"strings"
"g.fc.run/misc/byre/internal/api" "g.fc.run/misc/byre/internal/api"
) )
@@ -19,3 +21,22 @@ func (s *Server) UpdateNotificationPrefs(w http.ResponseWriter, r *http.Request)
} }
writeJSON(w, http.StatusOK, u) writeJSON(w, http.StatusOK, u)
} }
func (s *Server) UpdateDefaultModel(w http.ResponseWriter, r *http.Request) {
req := api.DefaultModel{}
if !readJSON(w, r, &req) {
return
}
if strings.TrimSpace(req.Model) == "" {
writeError(w, http.StatusBadRequest, errors.New("model is required"))
return
}
u, err := s.store.UpdateDefaultModel(r.Context(), actor(r), req.Model)
if err != nil {
writeStoreError(w, err)
return
}
writeJSON(w, http.StatusOK, u)
}
+14
View File
@@ -25,3 +25,17 @@ func (s *Store) UpdateNotificationPrefs(ctx context.Context, login string, prefs
} }
return s.GetUser(ctx, login) return s.GetUser(ctx, login)
} }
func (s *Store) UpdateDefaultModel(ctx context.Context, login, model string) (api.User, error) {
err := s.write(ctx, func(tx *sql.Tx, emit emitFunc) error {
_, err := tx.ExecContext(ctx, `UPDATE users SET default_model = ? WHERE login = ?`, model, login)
if err != nil {
return err
}
return emit(api.Event{Kind: "user.updated", Actor: login, Payload: map[string]any{"login": login}})
})
if err != nil {
return api.User{}, err
}
return s.GetUser(ctx, login)
}
+4 -2
View File
@@ -474,6 +474,8 @@ DELETE FROM inbox_responses WHERE item_id IN (SELECT id FROM inbox_items WHERE k
DELETE FROM inbox_items WHERE kind = 'client_run'; DELETE FROM inbox_items WHERE kind = 'client_run';
ALTER TABLE inbox_responses DROP COLUMN client; ALTER TABLE inbox_responses DROP COLUMN client;
ALTER TABLE inbox_responses DROP COLUMN exit_code; ALTER TABLE inbox_responses DROP COLUMN exit_code;
`}, {"add-user-default-model", `
ALTER TABLE users ADD COLUMN default_model TEXT NOT NULL DEFAULT 'claude-opus-5-5';
`}} `}}
const ( const (
@@ -674,8 +676,8 @@ func (s *Store) EnsureUser(ctx context.Context, login, displayName string) (api.
func (s *Store) GetUser(ctx context.Context, login string) (api.User, error) { func (s *Store) GetUser(ctx context.Context, login string) (api.User, error) {
u := api.User{} u := api.User{}
prefs := "" prefs := ""
err := s.db.QueryRowContext(ctx, `SELECT login, display_name, git_name, git_email, notification_prefs FROM users WHERE login = ?`, login). err := s.db.QueryRowContext(ctx, `SELECT login, display_name, git_name, git_email, notification_prefs, default_model FROM users WHERE login = ?`, login).
Scan(&u.Login, &u.DisplayName, &u.GitName, &u.GitEmail, &prefs) Scan(&u.Login, &u.DisplayName, &u.GitName, &u.GitEmail, &prefs, &u.DefaultModel)
if errors.Is(err, sql.ErrNoRows) { if errors.Is(err, sql.ErrNoRows) {
return u, ErrNotFound return u, ErrNotFound
} }
+2 -1
View File
@@ -291,7 +291,8 @@ struct ComposerView: View {
let offered = live.map { s in models.filter { vendorOf($0) == s.vendor.rawValue } } ?? models let offered = live.map { s in models.filter { vendorOf($0) == s.vendor.rawValue } } ?? models
let options = !current.isEmpty && !offered.contains(current) ? [current] + offered : offered let options = !current.isEmpty && !offered.contains(current) ? [current] + offered : offered
let modelKey = "message:\(live?.id ?? key)" let modelKey = "message:\(live?.id ?? key)"
return ModelState(live: live, current: current, options: options, modelKey: modelKey, selected: pick ?? modelChoices[modelKey] ?? (current.isEmpty ? options[0] : current)) let fresh = live == nil ? store.defaultModel : options[0]
return ModelState(live: live, current: current, options: options, modelKey: modelKey, selected: pick ?? modelChoices[modelKey] ?? (current.isEmpty ? fresh : current))
} }
var body: some View { var body: some View {
+41
View File
@@ -25,6 +25,11 @@ struct SettingsView: View {
heading("Notifications") heading("Notifications")
DeviceNotifications() DeviceNotifications()
PrefsBox() PrefsBox()
heading("Default model")
Text("New tasks you start from byre run on this model.")
.foregroundStyle(Palette.muted)
.fixedSize(horizontal: false, vertical: true)
DefaultModelMenu()
heading("What your lead has learned") heading("What your lead has learned")
Text("Your lead notes your priorities and preferences as it works with you, and starts every session with them.") Text("Your lead notes your priorities and preferences as it works with you, and starts every session with them.")
.foregroundStyle(Palette.muted) .foregroundStyle(Palette.muted)
@@ -132,6 +137,42 @@ private struct PrefsBox: View {
} }
} }
private struct DefaultModelMenu: View {
@Environment(Store.self) private var store
@Environment(Overlays.self) private var overlays
var body: some View {
Menu {
ForEach(models, id: \.self) { m in
Button(m) {
Task {
do {
store.me = try await store.api.client.updateDefaultModel(body: .json(.init(model: m))).ok.body.json
} catch {
overlays.showAlert(errorText(error))
}
}
}
}
} label: {
HStack(spacing: 8) {
Text(store.defaultModel)
Image(systemName: "chevron.up.chevron.down")
.font(.system(size: 9, weight: .semibold))
}
.foregroundStyle(Palette.text)
.modifier(FieldStyle())
.contentShape(Rectangle())
}
.menuStyle(.button)
.buttonStyle(.plain)
.menuIndicator(.hidden)
.fixedSize()
.help("Model for new tasks")
.padding(.top, 8)
}
}
private struct LeadNotes: View { private struct LeadNotes: View {
@Environment(Store.self) private var store @Environment(Store.self) private var store
@Environment(Overlays.self) private var overlays @Environment(Overlays.self) private var overlays
+7 -3
View File
@@ -92,7 +92,7 @@ final class Store {
todoBusy[key] = discuss ? "discuss" : "start" todoBusy[key] = discuss ? "discuss" : "start"
Task { Task {
do { do {
_ = try await api.client.startTodoItem(path: .init(projectId: projectId), body: .json(.init(title: title, model: models[0], discuss: discuss))).created _ = try await api.client.startTodoItem(path: .init(projectId: projectId), body: .json(.init(title: title, model: defaultModel, discuss: discuss))).created
} catch { } catch {
overlays.showAlert(errorText(error)) overlays.showAlert(errorText(error))
} }
@@ -108,7 +108,7 @@ final class Store {
todoBusy[key] = "start" todoBusy[key] = "start"
Task { Task {
do { do {
_ = try await api.client.createTask(path: .init(projectId: projectId), body: .json(.init(title: title, prompt: brief, model: models[0]))).created _ = try await api.client.createTask(path: .init(projectId: projectId), body: .json(.init(title: title, prompt: brief, model: defaultModel))).created
} catch { } catch {
overlays.showAlert(errorText(error)) overlays.showAlert(errorText(error))
} }
@@ -126,7 +126,7 @@ final class Store {
let live = lead != nil && lead!.state != .completed let live = lead != nil && lead!.state != .completed
Task { Task {
do { do {
_ = try await api.client.messageLead(body: .json(.init(text: "Let's discuss your suggestion \"\(title)\" before starting it:\n\n\(brief)", model: live ? nil : models[0]))).accepted _ = try await api.client.messageLead(body: .json(.init(text: "Let's discuss your suggestion \"\(title)\" before starting it:\n\n\(brief)", model: live ? nil : defaultModel))).accepted
} catch { } catch {
overlays.showAlert(errorText(error)) overlays.showAlert(errorText(error))
} }
@@ -208,6 +208,10 @@ final class Store {
focusTab(.reviews) focusTab(.reviews)
} }
var defaultModel: String {
me!.defaultModel
}
func loadMe() async throws { func loadMe() async throws {
me = try await api.client.getMe().ok.body.json me = try await api.client.getMe().ok.body.json
} }
+3 -3
View File
@@ -234,7 +234,7 @@ final class SwitcherModel {
case .newTask(let p, let title): case .newTask(let p, let title):
create(p.id, .init(title: title)) create(p.id, .init(title: title))
case .startTask(let p, let title): case .startTask(let p, let title):
create(p.id, .init(title: title, prompt: title, model: models[0])) create(p.id, .init(title: title, prompt: title, model: store.defaultModel))
case .startWorkflow(let p, let title): case .startWorkflow(let p, let title):
pickWorkflow(p, title) pickWorkflow(p, title)
case .workflow(let p, let title, let w): case .workflow(let p, let title, let w):
@@ -442,7 +442,7 @@ private struct SwitcherRowView: View {
.lineLimit(1) .lineLimit(1)
.truncationMode(.tail) .truncationMode(.tail)
.frame(maxWidth: .infinity, alignment: .leading) .frame(maxWidth: .infinity, alignment: .leading)
state(models[0]) state(store.defaultModel)
.help("Model for the first message") .help("Model for the first message")
case .startTask(let p, let title): case .startTask(let p, let title):
Text(created([("Start in ", nil), (p.name, Palette.muted), (": \(title)", nil)])) Text(created([("Start in ", nil), (p.name, Palette.muted), (": \(title)", nil)]))
@@ -450,7 +450,7 @@ private struct SwitcherRowView: View {
.lineLimit(1) .lineLimit(1)
.truncationMode(.tail) .truncationMode(.tail)
.frame(maxWidth: .infinity, alignment: .leading) .frame(maxWidth: .infinity, alignment: .leading)
state(models[0]) state(store.defaultModel)
.help("The title is the agent's first message") .help("The title is the agent's first message")
case .startWorkflow(let p, let title): case .startWorkflow(let p, let title):
Text(created([("Start workflow… in ", nil), (p.name, Palette.muted), (": \(title)", nil)])) Text(created([("Start workflow… in ", nil), (p.name, Palette.muted), (": \(title)", nil)]))