Skip to content

Commit 32063f4

Browse files
committed
feat(config): add preferred_model configuration option
Add support for highlighting and sorting a preferred model to the top of the provider list. Users can now set preferred_model in config to specify their preferred provider/model combination (e.g., 'github-copilot/claude-sonnet-4'), which will be visually marked and sorted to the top of the model selection list.
1 parent f52a22d commit 32063f4

File tree

4 files changed

+47
-22
lines changed

4 files changed

+47
-22
lines changed

README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -109,6 +109,7 @@ Install the plugin with your favorite package manager. See the [Configuration](#
109109
require('opencode').setup({
110110
preferred_picker = nil, -- 'telescope', 'fzf', 'mini.pick', 'snacks', 'select', if nil, it will use the best available picker. Note mini.pick does not support multiple selections
111111
preferred_completion = nil, -- 'blink', 'nvim-cmp','vim_complete' if nil, it will use the best available completion
112+
preferred_model = nil, -- 'provider/model' (e.g., 'github-copilot/claude-sonnet-4') to highlight and sort to top of provider list
112113
default_global_keymaps = true, -- If false, disables all default global keymaps
113114
default_mode = 'build', -- 'build' or 'plan' or any custom configured. @see [OpenCode Agents](https://opencode.ai/docs/modes/)
114115
keymap_prefix = '<leader>o', -- Default keymap prefix for global keymaps change to your preferred prefix and it will be applied to all keymaps starting with <leader>o

lua/opencode/config.lua

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ local M = {}
88
M.defaults = {
99
preferred_picker = nil,
1010
preferred_completion = nil,
11+
preferred_model = nil,
1112
default_global_keymaps = true,
1213
default_mode = 'build',
1314
legacy_commands = true,

lua/opencode/provider.lua

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,16 +8,37 @@ function M._get_models()
88
return {}
99
end
1010

11+
local config = require('opencode.config')
12+
local icons = require('opencode.ui.icons')
13+
local preferred_model = config.values.preferred_model
14+
local preferred_icon = icons.get('preferred')
15+
1116
local models = {}
1217
for _, provider in ipairs(response.providers) do
1318
for _, model in pairs(provider.models) do
19+
local model_id = provider.id .. '/' .. model.id
20+
local is_preferred = preferred_model and model_id == preferred_model
21+
1422
table.insert(models, {
1523
provider = provider.id,
1624
model = model.id,
17-
display = provider.name .. ': ' .. model.name,
25+
display = (is_preferred and preferred_icon or '') .. provider.name .. ': ' .. model.name,
26+
is_preferred = is_preferred,
1827
})
1928
end
2029
end
30+
31+
-- Sort models: preferred first, then alphabetically
32+
table.sort(models, function(a, b)
33+
if a.is_preferred and not b.is_preferred then
34+
return true
35+
elseif not a.is_preferred and b.is_preferred then
36+
return false
37+
else
38+
return a.display < b.display
39+
end
40+
end)
41+
2142
return models
2243
end
2344

lua/opencode/ui/icons.lua

Lines changed: 23 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -7,41 +7,42 @@ local presets = {
77
nerdfonts = {
88
-- headers
99
header_user = '▌󰭻 ',
10-
header_assistant = ' ',
10+
header_assistant = ' ',
1111
-- actions/tools
12-
run = ' ',
13-
task = ' ',
14-
read = ' ',
15-
edit = ' ',
16-
write = ' ',
12+
run = ' ',
13+
task = ' ',
14+
read = ' ',
15+
edit = ' ',
16+
write = ' ',
1717
plan = '󰝖 ',
18-
search = ' ',
18+
search = ' ',
1919
web = '󰖟 ',
20-
list = ' ',
21-
tool = ' ',
20+
list = ' ',
21+
tool = ' ',
2222
snapshot = '󰻛 ',
2323
restore_point = '󱗚 ',
24-
file = ' ',
25-
folder = ' ',
24+
file = ' ',
25+
folder = ' ',
2626
attached_file = '󰌷 ',
2727
agent = '󰚩 ',
28-
reference = ' ',
28+
reference = ' ',
2929
reasoning = '󰧑 ',
30-
question = '',
30+
question = '',
31+
preferred = ' ',
3132
-- statuses
32-
status_on = ' ',
33-
status_off = ' ',
34-
guard_on = ' ',
33+
status_on = ' ',
34+
status_off = ' ',
35+
guard_on = ' ',
3536
-- borders and misc
3637
border = '',
3738
-- context bar
3839
cursor_data = '󰗧 ',
39-
error = ' ',
40-
warning = ' ',
41-
info = ' ',
42-
filter = '/',
40+
error = ' ',
41+
warning = ' ',
42+
info = ' ',
43+
filter = '/',
4344
selection = '󰫙 ',
44-
command = ' ',
45+
command = ' ',
4546
},
4647
text = {
4748
-- headers
@@ -66,6 +67,7 @@ local presets = {
6667
agent = '@',
6768
reference = '@',
6869
question = '?',
70+
preferred = '*',
6971
-- statuses
7072
status_on = 'ON',
7173
status_off = 'OFF',

0 commit comments

Comments
 (0)