Skip to content

Releases

v0.8.2

Choose a tag to compare

@github-actions github-actions released this 11 Nov 14:27

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-cn and kimi-coding, whose catalog id
    is k3.1-pro; selecting it saves that provider-specific id unchanged.

v0.8.1

Choose a tag to compare

@github-actions github-actions released this 02 Nov 06:55

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@max recommendation and
    keeps Native main-model recommendations instead of dropping them from the generated data.

v0.8.0

Choose a tag to compare

@github-actions github-actions released this 27 Oct 02:21

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 standalone omo command 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 main target sets the model omo starts a new session on, and its
    reasoning level. It is stored in omo's ~/.omo/agent/settings.json and state.json (only those
    keys change, and both files are backed up first), not in omo.jsonc. Presets can hold it.
    omodel check warns when omo's enabledModels setting would override it.

Changed

  • The TUI's top line now starts with the harness you are editing: oModel [opencode]: (it used
    to be oModel:) or oModel [native]:.
  • JSON payloads carry a new harness field.

Fixed

  • On a ~/.omo/omo.jsonc with no [opencode] section but an OmO Native section ([native], or
    its old name [senpi]) or omo's Codex section ([codex]), plain omodel took 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), and show --json reports config_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.jsonc whose [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 show printed a model-list problem twice (a [note] and a [warn]), and when
    opencode failed it ran it a second time.

v0.7.3

Choose a tag to compare

@github-actions github-actions released this 26 Oct 06:41

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 (reasoning high) after grok-4.7 and before gpt-6.1-sol.

v0.7.2

Choose a tag to compare

@github-actions github-actions released this 19 Oct 07:17

Bundled suggestions now follow oh-my-openagent 5.1.35.

Changed

  • Bundled suggestions now come from omo 5.1.35. It adds gemini-4-argon to four lists: oracle
    and momus try it (reasoning high) just before gemini-3.1-pro, and the visual-engineering
    and writing categories now try it first (reasoning low), ahead of Claude.

v0.7.1

Choose a tag to compare

@github-actions github-actions released this 12 Oct 08:28

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
    suggest claude-haiku-5-5 (reasoning medium) in place of claude-haiku-4-5, and try it
    earlier in their lists. The unspecified-low category now suggests gpt-6.1-sol and
    gpt-5.6-sol (both medium) in place of gpt-5.6-terra (high).

v0.7.0

Choose a tag to compare

@github-actions github-actions released this 05 Oct 09:25

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 after esc.
  • 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, like omodel 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, and s would 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 --check exited 1 with a traceback, the --json commands printed
    nothing, and pressing r closed the app. omodel now treats it like an opencode that 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 made omodel show, check and candidates fail with no
    output. It now reads as unset, and omodel check reports it as malformed_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 set with the value already set (or an empty omodel 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 new opencode each time. It now tries again only when you move
    to another agent and back, or press r.
  • 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 s closed 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 check passed a model written without its provider ("gpt-5.5" instead of
    "openai/gpt-5.5"), which omodel set refuses. When opencode was available it blamed the
    providers instead ("no connected provider serves"). It now reports bad_value.
  • omodel apply ignored keys it didn't know, so {"model": …, "reasoning": "high"} (the config's
    own spelling) answered ok and set no reasoning level. It now refuses the entry and says the
    level goes under "variant". A wrongly typed variant now exits 2 like every other bad input
    (it was 3).
  • A suggestions file saved by omodel --refresh-omo that omodel could not read stopped every
    command, including omodel --check, until you deleted it. omodel now falls back to its built-in
    suggestions, and --refresh-omo checks the new data before it saves it.
  • omodel show, check, candidates, --print and any --dry-run created a starter config file
    (and its folders) when the config didn't exist yet, so a mistyped --config path 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.5 instead of
    claude-haiku-4-5, or a dated build like claude-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 preset replies and every error reply were missing sync_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 use switched 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), like omodel 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 a bad_input JSON reply too, still with exit code 2.
  • omodel candidates labelled 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 as blocked_by.
  • Adding the same model twice with + add model… listed it twice, and x on one of the two
    cleared the model but left the other row showing. It now keeps one row.
  • Closing the variant picker with esc could 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 from opencode models that contained a / (a warning that
    named a file path, a URL) was read as a provider. Both are fixed.
  • omodel --update reported 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 --restore copied 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.json was 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 .corrupt when 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.sh and omodel --update installed a release anyway when its checksum file was
    missing, empty, or (for install.sh) failed to download for any reason. They now stop with
    nothing installed. Every release since 0.2.0 has a checksum. For install.sh,
    OMODEL_SKIP_VERIFY=1 skips the check on purpose.
  • install.sh now 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
    through opencode now suggests reasoning high instead of xhigh.
  • 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+backspace now deletes the word before the cursor
    and super+backspace deletes back to the start of the line.

v0.6.2

Choose a tag to compare

@github-actions github-actions released this 01 Oct 00:18

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 --update from the standalone binary failed on macOS with CERTIFICATE_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.pem on macOS).
  • The cursor in the candidate list could vanish when a model's detail line finished loading
    right after you moved it, and v then did nothing, with no message. The cursor now stays
    where you put it.

v0.6.1

Choose a tag to compare

@github-actions github-actions released this 30 Sep 15:19

Bundled suggestions now follow oh-my-openagent 5.1.5.

Changed

  • Bundled suggestions now come from omo 5.1.5. deep-low now suggests gpt-6.1-sol and
    gpt-6.1-sol-fast first, quick adds glm-5.3-flash and mimo-v2.6-flash, and
    unspecified-low now suggests claude-sonnet-5-5 first. gpt-6.1-sol is known as its own
    model family, so its variant list (low to max, no minimal) is checked correctly.

v0.6.0

Choose a tag to compare

@github-actions github-actions released this 28 Sep 09:31

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, candidates and check (--json) carry degraded_reason: why availability is
    unknown — opencode is not on PATH, or what opencode models did instead of answering
    (exited non-zero, printed nothing, timed out). degraded: true alone 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 deep category into deep-low
    and deep-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
    vercel and quotio-openai providers are no longer suggested (chatgpt-subscription is new).
  • A deep category in your config or in a saved preset now shows up as deep-low, the same way
    omo 5.0 reads it (if deep-low is also set, the old deep is dropped, as omo does). The new
    name is written with your next save. omodel set cat:deep is refused with a message that
    points to cat:deep-low.

Fixed

  • A provider's -thinking, -free, -base, -instruct, -chat or -draft build no longer
    stands in for the bare model omo named as if it were that model. glm-5.2-thinking filled a
    glm-5.2 slot as an exact match — no ≈, no warning — the same hole mini fell 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-*-thinking as its own family; big-pickle has 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.jsonc at 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.
  • --json always 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 with error: bad_config.
  • omodel preset use +-1 (any preset reference int() refuses) is an unknown_preset refusal
    instead of a traceback.
  • --dry-run reports changed: true whenever 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 --json reports the reasoning level it actually wrote: asked for none, it echoed
    none back for a file that now said off.
  • omodel --check counts the targets omo actually defines (31), not an ultrawork sub-target
    on every agent (41) — ten of which every other verb refuses.
  • omodel --restore no 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