Repository navigation
Releases
v0.8.2
Changed
- The Linux binary is about half the size: the release build now strips debug info from the
libraries it packs (0.8.0 was 28.5 MB on Linux against 14.3 MB on macOS).
Fixed
- Native now recommends Kimi K3.1 Pro on
kimi-code-plan-cnandkimi-coding, whose catalog id
isk3.1-pro; selecting it saves that provider-specific id unchanged.
v0.8.1
Changed
- Bundled suggestions now follow omo 5.1.57, adding Kimi K3.1 Pro on the providers that serve
it while keeping Kimi K3 fallbacks for the others.
Fixed
- The weekly suggestion refresh accepts omo 5.1.57's
kimi-k3.1-pro@maxrecommendation and
keeps Native main-model recommendations instead of dropping them from the generated data.
v0.8.0
omodel can now set models for OmO Native (the standalone omo command) as well: --harness native.
Added
- OmO Native support.
--harness native(on the TUI,--print,--check,--refresh-models
and every JSON subcommand) edits the[native]block that the standaloneomocommand reads,
instead of[opencode]. You get native's own agents and categories, its suggested models, and
the models you are logged into in omo. Native presets are a separate list. In the TUI,t
switches between opencode and native when nothing is unsaved. Without the flag your config is
edited as before (apart from the first fix below). - Native's main model: a
maintarget sets the modelomostarts a new session on, and its
reasoning level. It is stored in omo's~/.omo/agent/settings.jsonandstate.json(only those
keys change, and both files are backed up first), not inomo.jsonc. Presets can hold it.
omodel checkwarns when omo'senabledModelssetting would override it.
Changed
- The TUI's top line now starts with the harness you are editing:
oModel [opencode]:(it used
to beoModel:) oroModel [native]:. - JSON payloads carry a new
harnessfield.
Fixed
- On a
~/.omo/omo.jsoncwith no[opencode]section but an OmO Native section ([native], or
its old name[senpi]) or omo's Codex section ([codex]), plainomodeltook the file for the
pre-4.19.3 format: it wrote your picks at the top level, which those harnesses read too, and
showed a "pre-4.19.3 config path" notice. It now writes them into[opencode](adding that
section and keeping the file's comments), andshow --jsonreportsconfig_scope: "opencode"
for that file. Picks an earlier omodel wrote at the top level stay there and still apply to
every harness unless its own section sets the same agent; move them under[opencode]by hand. - The first save into an
omo.jsoncwhose[opencode]section had no agents or categories yet
(or that had no[opencode]section) rewrote the whole file and dropped its comments. It now
adds them in place. omodel showprinted a model-list problem twice (a[note]and a[warn]), and when
opencodefailed it ran it a second time.
v0.7.3
Bundled suggestions now follow oh-my-openagent 5.1.48.
Changed
- Bundled suggestions now come from omo 5.1.48. The unspecified-low category now tries
glm-5.3(reasoninghigh) aftergrok-4.7and beforegpt-6.1-sol.
v0.7.2
Bundled suggestions now follow oh-my-openagent 5.1.35.
Changed
- Bundled suggestions now come from omo 5.1.35. It adds
gemini-4-argonto four lists: oracle
and momus try it (reasoninghigh) just beforegemini-3.1-pro, and the visual-engineering
and writing categories now try it first (reasoninglow), ahead of Claude.
v0.7.1
Bundled suggestions now follow oh-my-openagent 5.1.30.
Changed
- Bundled suggestions now come from omo 5.1.30. Explore, librarian and the quick category now
suggestclaude-haiku-5-5(reasoningmedium) in place ofclaude-haiku-4-5, and try it
earlier in their lists. The unspecified-low category now suggestsgpt-6.1-soland
gpt-5.6-sol(bothmedium) in place ofgpt-5.6-terra(high).
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.
v0.6.2
Bundled suggestions now follow oh-my-openagent 5.1.7, plus two fixes.
Changed
- Bundled suggestions now come from omo 5.1.7. The model suggestions are the same as 5.1.5.
omo 5.1.7 now stops with an error when Hephaestus is given a non-GPT model, where it used to
switch to Sisyphus quietly. omodel already blocked that pick, so nothing changes in use.
Fixed
omodel --updatefrom the standalone binary failed on macOS withCERTIFICATE_VERIFY_FAILED
(unable to get local issuer certificate). The binary couldn't find any CA certificates; it
now falls back to the system's own bundle (/etc/ssl/cert.pemon macOS).- The cursor in the candidate list could vanish when a model's detail line finished loading
right after you moved it, andvthen did nothing, with no message. The cursor now stays
where you put it.
v0.6.1
Bundled suggestions now follow oh-my-openagent 5.1.5.
Changed
- Bundled suggestions now come from omo 5.1.5.
deep-lownow suggestsgpt-6.1-soland
gpt-6.1-sol-fastfirst,quickaddsglm-5.3-flashandmimo-v2.6-flash, and
unspecified-lownow suggestsclaude-sonnet-5-5first.gpt-6.1-solis known as its own
model family, so its variant list (lowtomax, nominimal) is checked correctly.
v0.6.0
Support for oh-my-openagent 5.0.x. omo 5.0 split the deep category into deep-low and
deep-high, and the bundled suggestions now follow omo 5.0.1. If you are still on omo 4.19,
stay on omodel 0.5.1 — a 4.19 omo does not read deep-low.
Upgrading is omodel --update for the standalone binary, or the command it prints for a
pipx/uv/pip install.
Added
show,candidatesandcheck(--json) carrydegraded_reason: why availability is
unknown —opencode is not on PATH, or whatopencode modelsdid instead of answering
(exited non-zero, printed nothing, timed out).degraded: truealone read the same for a
missing opencode and a broken one, and only the first is fixed by installing it. Every verb
now also says so on stderr.
Changed
- Bundled suggestions now come from omo 5.0.1. omo split the
deepcategory intodeep-low
anddeep-high, so there are 9 categories now, not 8. The fallback chains follow omo's new
models (gpt-6-astra,gpt-6-luna-fast,claude-fable-5-1,claude-opus-5-5, …), and the
vercelandquotio-openaiproviders are no longer suggested (chatgpt-subscriptionis new). - A
deepcategory in your config or in a saved preset now shows up asdeep-low, the same way
omo 5.0 reads it (ifdeep-lowis also set, the olddeepis dropped, as omo does). The new
name is written with your next save.omodel set cat:deepis refused with a message that
points tocat:deep-low.
Fixed
- A provider's
-thinking,-free,-base,-instruct,-chator-draftbuild no longer
stands in for the bare model omo named as if it were that model.glm-5.2-thinkingfilled a
glm-5.2slot as an exact match — no≈, no warning — the same holeminifell through in
0.5.1, one suffix family over. Such a build now shows as a marked≈substitute when it is
the same family as the model omo named, and is not offered at all when it is not (omo files
kimi-*-thinkingas its own family;big-picklehas none) — never as the model itself. - Saving no longer changes what kind of file your config is. A save used to reset its permission
bits to 0600, replace a symlinked config (a dotfile manager pointing~/.omo/omo.jsoncat a
repo file) with a detached copy, turn every CRLF line ending into LF, and — for a file with a
UTF-8 byte-order mark — drop every comment in the document. Bits, link, endings and comments
all survive now (a file that mixes endings keeps each line's own), and the preview diff
compares exactly what the save compares, listing only the lines that change. --jsonalways answers with JSON. A config that could not be parsed — or could not be opened
at all:--config ~/.omo, one component short of the file, or a file you cannot read — made
every verb exit 1 with an empty stdout (the unreadable case as a raw traceback). Both now
return the standard failure payload witherror: bad_config.omodel preset use +-1(any preset referenceint()refuses) is anunknown_presetrefusal
instead of a traceback.--dry-runreportschanged: truewhenever the real run would write. It looked at the config
diff alone, so a write that only adopts a foreign config into the active preset (a sync
conflict) previewed as a no-op and then wrote.apply --jsonreports the reasoning level it actually wrote: asked fornone, it echoed
noneback for a file that now saidoff.omodel --checkcounts the targets omo actually defines (31), not anultraworksub-target
on every agent (41) — ten of which every other verb refuses.omodel --restoreno longer burns a backup slot when asked for a backup that does not exist.
Notes
A deep already in your config or presets keeps working — omo 5.0 reads it as deep-low, and
omodel shows it that way. It is written as deep-low the next time you save.
Full history: CHANGELOG.md