Skip to content

v0.7.0

Choose a tag to compare

@github-actions github-actions released this 05 Oct 09:25
· 24 commits to main since this release

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.