Repository navigation
v0.7.0
Installs with pipx, uv or pip now need Python 3.11 or newer. Bundled suggestions now follow
oh-my-openagent 5.1.19, and this release fixes many bugs.
Fixed
- When omodel starts and your config matches no preset, it asks whether to keep the config or
go back to the preset. Your answer was lost on the next preset switch: after "keep", the
preset went back to its old models, and after "go back", any edit you made next was dropped.
Both answers now stick, and so does saving afteresc. - Under that same prompt,
a(add preset) also overwrote the preset you were on with the
changed config. It now puts the config into the new preset only, likeomodel preset new. - Undo could leave an undone edit in another preset. After editing preset B and switching back,
undoing all of it left the edit in B: it came back the next time you opened B, the app said
there were unsaved changes, andswould have saved it. Undo now takes it out of B too. - A broken
opencode(one that is on your PATH but can't run, for example built for another CPU)
made omodel crash:omodel --checkexited 1 with a traceback, the--jsoncommands printed
nothing, and pressingrclosed the app. omodel now treats it like anopencodethat can't
read models: it shows the "couldn't read models" banner and keeps working. - A
"model"that isn't text in a hand-edited config ("model": 5, or a list) crashed the app
when you moved onto that agent, and madeomodel show,checkandcandidatesfail with no
output. It now reads as unset, andomodel checkreports it asmalformed_model. - A save that failed (for example, the config's folder was read-only) still used up a backup
slot, pushing out your oldest real backup each time; 20 failed tries left none. A failed save
now leaves the backups as they were. - If your config had the same key twice (two
"agents"blocks, or two"[opencode]"blocks),
saving changed the first copy, but omo reads the last one. omodel reported success and omo
kept the old models. Saves now go into the copy omo reads. omodel preset use <name>did nothing when<name>was already the active preset, even when
something outside omodel had changed the config. That is the documented way to throw such a
change away, and with a single preset it was the only one. It now restores the preset.omodel setwith the value already set (or an emptyomodel apply) still rewrote the config
when it had comments or its own formatting inside"agents"or"categories": it took a
backup and deleted those comments. It now leaves the file alone.- When fetching a model's details from opencode kept failing, the app retried about five times a
second on its own, starting a newopencodeeach time. It now tries again only when you move
to another agent and back, or pressr. - A model whose opencode details had an unexpected shape (for example the context size as text)
could close the app when you moved onto it. Those details are now shown as unknown. - Pressing
sclosed the app, losing your unsaved changes, if the config file had become
unreadable since launch. It now says the save failed and keeps your changes. omodel checkpassed a model written without its provider ("gpt-5.5"instead of
"openai/gpt-5.5"), whichomodel setrefuses. When opencode was available it blamed the
providers instead ("no connected provider serves"). It now reportsbad_value.omodel applyignored keys it didn't know, so{"model": …, "reasoning": "high"}(the config's
own spelling) answeredokand set no reasoning level. It now refuses the entry and says the
level goes under"variant". A wrongly typedvariantnow exits 2 like every other bad input
(it was 3).- A suggestions file saved by
omodel --refresh-omothat omodel could not read stopped every
command, includingomodel --check, until you deleted it. omodel now falls back to its built-in
suggestions, and--refresh-omochecks the new data before it saves it. omodel show,check,candidates,--printand any--dry-runcreated a starter config file
(and its folders) when the config didn't exist yet, so a mistyped--configpath quietly became
a new empty config. They now create nothing; the file is written on the first real save.- A provider that spells a model differently from the others (
claude-haiku-4.5instead of
claude-haiku-4-5, or a dated build likeclaude-haiku-4-5-20251001) was missing from the
model list. Every provider now shows, each with its own spelling, and the model's own provider
still comes first. - omo's own suggestions with reasoning
off(librarian, explore, quick) were marked⚠as an
unsupported variant until opencode's model details had been fetched once. They no longer are. - The
omodel presetreplies and every error reply were missingsync_conflict, which is meant
to be on every reply, so an agent refused while the config had changed outside omodel never
found out. They now carry it. - If
omodel preset useswitched the config but then failed to save the presets file, it only
said "could not write", so an agent couldn't tell the config had already changed. It now says
so (config_written: true), likeomodel set, and reports the backup it took. - A mistyped command (an unknown subcommand or flag, a missing argument) printed nothing on
stdout even with--json. It now prints abad_inputJSON reply too, still with exit code 2. omodel candidateslabelled every model you couldn't pick as "GPT-only agent", even when the
real reason was that no connected provider serves it. It now gives the real reason, and the
JSON rows carry it asblocked_by.- Adding the same model twice with
+ add model…listed it twice, andxon one of the two
cleared the model but left the other row showing. It now keeps one row. - Closing the variant picker with
esccould leave the model list's⚠marks out of date for
the rest of the session, if the model's details had arrived while the picker was open. - A provider whose name has capitals or a dot (
lm.studio,MyGateway) never got a model detail
line or a variant picker. Any line fromopencode modelsthat contained a/(a warning that
named a file path, a URL) was read as a provider. Both are fixed. omodel --updatereported a connection that dropped during the download as "could not write"
the file, pointing you at your disk. It now reports it as a network error.- A cached model list with a time in the future (after the clock was set back) was used forever
instead of for 24 hours. It is now treated as expired. - A config with a single-quoted string (
'…', which omodel can read but omo can't) holding a"
or a brace inside"agents"could be saved as a broken file. Every save is now checked to read
back as intended, and falls back to a clean rewrite if it doesn't. - When your config had
"agents"but no"categories"(or the other way round), the first
category you set made omodel rewrite the whole file and drop all its comments. The missing
block is now added next to the other one, and the comments stay. omodel --restorecopied the backup straight over your config, so a full disk part-way could
leave it cut short, and the backups could grow past 20. It now writes the way a save does, in
one step, and keeps 20. Saves also flush the file to disk before replacing the old one.- If
.omodel-presets.jsonwas a symlink (a dotfile manager), saving replaced it with a plain
file, so the managed copy stopped updating. It now writes through the link. - A presets file omodel couldn't use was only kept as
.corruptwhen it wasn't valid JSON; one
with the right version but the wrong shape was overwritten without a copy, and a second broken
file replaced the first one's copy. Both are now kept (.corrupt,.corrupt.1, …). install.shandomodel --updateinstalled a release anyway when its checksum file was
missing, empty, or (forinstall.sh) failed to download for any reason. They now stop with
nothing installed. Every release since 0.2.0 has a checksum. Forinstall.sh,
OMODEL_SKIP_VERIFY=1skips the check on purpose.install.shnow runs the downloaded binary before installing it, so on a system whose glibc is
too old it stops and points you to pipx instead of installing a binary that can't start. It also
installs in one atomic step, and a partly downloaded copy of the script runs nothing.
Changed
- Bundled suggestions now come from omo 5.1.19. The only change: for momus,
gpt-6-astra
throughopencodenow suggests reasoninghighinstead ofxhigh. - Installing with pipx, uv or pip now needs Python 3.11 or newer (it was 3.9). Python 3.9 is no
longer supported upstream and 3.10 stops this month. The prebuilt binaries are not affected.
If your pipx uses an older Python, reinstall with
pipx install --force --python python3.12 git+https://github.com/zhoufanscut/oModel. - Updated Textual to 8.2.8. It fixes a crash when clicking the screen's padding. In the
add-model and preset-name text fields,alt+backspacenow deletes the word before the cursor
andsuper+backspacedeletes back to the start of the line.