Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
18 commits
Select commit Hold shift + click to select a range
652f21b
feat(codex): write a role's root model pin without touching the rest …
LilMGenius Sep 29, 2026
52e0f26
feat(clients): set a Codex role model in omo.jsonc for LazyCodex
LilMGenius Sep 29, 2026
5600d83
feat(server): read and set Codex agent role models over the managemen…
LilMGenius Sep 29, 2026
4c72281
feat(gui): pick a model per Codex agent role on the omo integration tab
LilMGenius Sep 29, 2026
4ba1c12
docs: document per-role Codex model pins and the omo.jsonc mirror
LilMGenius Sep 29, 2026
ec21ac4
fix(cli): accept --json before or after the ocx agent roles action
LilMGenius Sep 29, 2026
fa03ac9
test(cli): map the codex-agent-roles dashboard endpoint to ocx agent …
LilMGenius Sep 29, 2026
6b574ca
fix(gui): fit the omo role model table on narrow screens
LilMGenius Sep 29, 2026
32c2e18
fix(clients): keep an unreadable or null-shaped omo.jsonc from breaki…
LilMGenius Sep 29, 2026
1ebe146
fix(codex): keep a role model write from duplicating or truncating th…
LilMGenius Sep 29, 2026
2c3e67e
fix(gui): let a failed omo.jsonc mirror be retried and localize save …
LilMGenius Sep 29, 2026
94aa963
fix(gui): qualify the omo.jsonc mirror in every locale
LilMGenius Sep 29, 2026
48f0344
feat(clients): detect Codex-based omo (LazyCodex) from its Codex plug…
LilMGenius Sep 30, 2026
63dfc0c
feat(server): scope Codex role models and the omo.jsonc mirror to omo…
LilMGenius Sep 30, 2026
6f7dc53
feat(gui): move the role model table to an omo (Codex / LazyCodex) se…
LilMGenius Sep 30, 2026
47a2f9c
docs: name the three omo variants and scope role models to omo (Codex…
LilMGenius Sep 30, 2026
64b3466
fix(gui): show the role load failure with a retry instead of an empty…
LilMGenius Sep 30, 2026
ada7ec1
docs(codex): say the model pin read ignores the root-table flag on pu…
LilMGenius Sep 30, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
36 changes: 35 additions & 1 deletion docs-site/src/content/docs/guides/integrations.md
Original file line number Diff line number Diff line change
Expand Up @@ -21,11 +21,17 @@ file, and removes it again. Seventeen clients work this way, each with a switch:
| ZCode | `~/.zcode/v2/config.json` | JSON | on restart | loopback placeholder |
| Aside | `~/.aside/u/<account>/models.json` | JSON | after fully quitting and reopening Aside | loopback placeholder |
| Raycast | `~/.config/raycast/ai/providers.yaml` | YAML | immediately on save — Raycast watches the file | none — loopback only |
| omo | `~/.omo/agent/models.json` | JSON | new sessions | loopback placeholder |
| omo (Pi / senpi) | `~/.omo/agent/models.json` | JSON | new sessions | loopback placeholder |
| Cline CLI | `~/.cline/data/settings/providers.json` and sibling `models.json` | JSON pair | after stopping and restarting Cline | loopback placeholder |
| Kilo | first existing `kilo.jsonc`, `kilo.json`, `opencode.jsonc`, `opencode.json`, or `config.json` under `~/.config/kilo` | JSONC | new sessions | `OPENCODEX_KILO_API_KEY` |
| Factory Droid | `~/.factory/settings.json` (`%USERPROFILE%\.factory\settings.json` on Windows) | JSON | immediately via file watching | none — keyless loopback |

"omo" names three products that share the `~/.omo` folder. The **omo** tab manages Pi-based omo
(the senpi engine) through `~/.omo/agent/models.json`, as in the table above. Codex-based omo
(LazyCodex) gets its own controls on the Codex tab, described in
[omo (Codex / LazyCodex) role models](#omo-codex--lazycodex-role-models). OpenCode-based omo
(oh-my-opencode) keeps its own config under OpenCode; opencodex does not read or write it.

Generated catalogs include only enabled models from each provider selection. This applies to both
downloads and managed integrations, including Pi and Aside. The management model list still shows
the full roster so you can enable additional models.
Expand Down Expand Up @@ -521,6 +527,34 @@ key) in the app's API key field. The app sends it as `Authorization: Bearer`, wh
`/v1/chat/completions` accepts as proxy admission and never forwards upstream; see the
[authentication matrix](/reference/proxy-formats/#authentication-matrix).

## omo (Codex / LazyCodex) role models

When LazyCodex is installed, the Codex tab shows an **omo (Codex / LazyCodex)** section listing
every Codex agent role found in `$CODEX_HOME/agents/*.toml`, with the model each one is pinned
to. Codex runs a role on that pin no matter which model the parent asks for, so this is where a
role's model is actually decided. LazyCodex counts as installed when the `omo@sisyphuslabs`
Codex plugin is enabled in `$CODEX_HOME/config.toml` and an installed copy under
`$CODEX_HOME/plugins/cache/sisyphuslabs/omo/` carries its `lazycodex-install.json`. A `~/.omo`
folder on its own does not count, because Pi-based omo creates it too. Without LazyCodex the
section is hidden and the command line reports it as not installed. Pick a model on a row and
press Save:

- opencodex rewrites only the root `model = "..."` line of that role's file. The role's
instructions, comments, and other keys are left exactly as they were. A role with no pin gets
one added near the top of the file.
- The same value is written to `codex.agents.<role>.model` in `~/.omo/omo.jsonc`, which
LazyCodex 5.1.1 and later reads. If that file does not exist it is not created. If it contains
comments it is left untouched, because saving would remove them; the tab says so, and you can
set the value there by hand.

Nothing happens until you press Save; syncing or restarting opencodex never changes a role file.
New Codex sessions pick up the change. The same controls exist on the command line:

```bash
ocx agent roles
ocx agent roles set explorer xai/grok-4.5
```

## Kilo

Kilo CLI, VS Code, and JetBrains share one global config. This integration writes
Expand Down
13 changes: 12 additions & 1 deletion docs-site/src/content/docs/reference/cli/agents.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ These commands control agent policy and routing, inspect the live proxy, and con

## Agent policy

### `ocx agent <status|injection|effort|subagents|fallback|sidecar> ...`
### `ocx agent <status|injection|effort|subagents|fallback|roles|sidecar> ...`

Manage the headless multi-agent roster, effort caps, prompt injection, fallback, and sidecar settings.
Use `status` for the current policy. See [Sub-agent surfaces](/guides/sub-agent-surface/) for how
Expand All @@ -17,6 +17,17 @@ surface modes, delegation, effort, and fallback behavior fit together.
ocx agent subagents set ark/model-a,openai/gpt-5.5
```

`ocx agent roles` is for omo (Codex / LazyCodex). It lists each Codex agent role in
`$CODEX_HOME/agents` with its model pin and whether `~/.omo/omo.jsonc` can be updated, or says
LazyCodex is not installed, in which case `set` is refused. `ocx agent roles set <role> <model>` rewrites only
that role's root `model` line and mirrors the value into omo.jsonc at
`codex.agents.<role>.model`. A missing omo.jsonc, or one containing comments, is left unchanged
and the command says so. See [omo (Codex / LazyCodex) role models](/guides/integrations/#omo-codex--lazycodex-role-models).

```bash
ocx agent roles set explorer xai/grok-4.5
```

`ocx agent sidecar web --list` and `ocx agent sidecar vision --list` print the models the
server currently offers for each sidecar — the exact filtered set the dashboard picker shows
(picker-visible rows plus the login-entitled Luna/Haiku auth slots, intersected with executor
Expand Down
18 changes: 18 additions & 0 deletions gui/src/i18n/de.ts
Original file line number Diff line number Diff line change
Expand Up @@ -1666,6 +1666,24 @@ export const de: Record<TKey, string> = {
"integrations.semantics.aside": "Verwaltet nur providers.opencodex in der ~/.aside/u/<id>/models.json dieses Profils. Andere Provider bleiben unverändert. Beende Aside nach dem Anwenden vollständig und öffne es erneut.",
"integrations.semantics.raycast": "Fügt einen OpenCodex-Provider-Eintrag in die providers.yaml von Raycast ein, damit jedes geroutete Modell in der Modellauswahl von Raycast AI erscheint. Raycast Pro erforderlich.",
"integrations.semantics.omo": "Verwaltet ausschließlich providers.opencodex in der models.json von omo — ~/.omo/agent, sofern nicht OMO_CODING_AGENT_DIR, SENPI_CODING_AGENT_DIR oder PI_CODING_AGENT_DIR sie umleitet. Ihre übrigen Provider bleiben unverändert. Gilt ab neuen Sitzungen.",
"integrations.lazycodexRoles.title": "omo (Codex / LazyCodex) · Modelle der Codex-Agentenrollen",
"integrations.lazycodexRoles.hint": "Wählen Sie das Modell, mit dem Codex jede Agentenrolle ausführt. Beim Speichern ändert sich nur die model-Zeile in der Datei dieser Rolle unter $CODEX_HOME/agents. In omo.jsonc wird die Auswahl für LazyCodex nur übernommen, wenn sich die Datei sicher neu schreiben lässt.",
"integrations.lazycodexRoles.role": "Rolle",
"integrations.lazycodexRoles.current": "Aktuelles Modell",
"integrations.lazycodexRoles.model": "Neues Modell",
"integrations.lazycodexRoles.modelFor": "Modell für {role}",
"integrations.lazycodexRoles.none": "Kein Modell festgelegt",
"integrations.lazycodexRoles.choose": "Modell wählen",
"integrations.lazycodexRoles.empty": "Keine Codex-Agentenrollen gefunden.",
"integrations.lazycodexRoles.loadFailed": "Codex-Agentenrollen konnten nicht geladen werden.",
"integrations.lazycodexRoles.saveFailed": "Das Modell für {role} konnte nicht gespeichert werden.",
"integrations.lazycodexRoles.saved": "{role} läuft jetzt mit {model}.",
"integrations.lazycodexRoles.omoAbsent": "{role} läuft jetzt mit {model}. omo.jsonc wurde nicht gefunden, daher wurde nur die Rollendatei geändert.",
"integrations.lazycodexRoles.omoComments": "{role} läuft laut Rollendatei jetzt mit {model}. omo.jsonc blieb unverändert, weil das Speichern seine Kommentare entfernen würde; setzen Sie codex.agents.{role}.model dort von Hand.",
"integrations.lazycodexRoles.omoInvalid": "{role} läuft laut Rollendatei jetzt mit {model}. omo.jsonc blieb unverändert, weil es kein JSON-Objekt mit einem codex.agents-Objekt ist.",
"integrations.lazycodexRoles.omoFailed": "{role} läuft laut Rollendatei jetzt mit {model}, aber omo.jsonc konnte nicht geschrieben werden.",
"integrations.lazycodexRoles.retryMirror": "omo.jsonc erneut versuchen",
"integrations.lazycodexRoles.omoCommentsState": "omo.jsonc enthält Kommentare, daher ändert Speichern hier nur die Rollendateien. Passen Sie codex.agents in omo.jsonc von Hand an, damit beide übereinstimmen.",
"integrations.semantics.cline": "Verwaltet OpenCodex in providers.json und models.json der Cline CLI. Beenden Sie Cline vor Änderungen oder Synchronisierung und starten Sie es danach neu. Rückgängig stellt beide Originaldateien wieder her. Ihr Standardanbieter bleibt unverändert; wählen Sie OpenCodex in Cline.",
"integrations.semantics.kilo": "Verwaltet nur provider.opencodex in Kilos globaler Konfiguration — die erste vorhandene Datei unter kilo.jsonc, kilo.json, opencode.jsonc, opencode.json oder config.json in ~/.config/kilo (XDG_CONFIG_HOME verschiebt dieses Verzeichnis; ist keine vorhanden, wird kilo.jsonc erstellt). Andere Schlüssel bleiben unverändert. Anwenden schreibt die ganze Datei neu, daher bleiben Kommentare und nachgestellte Kommas nicht erhalten. Wählen Sie opencodex/<Modell> in Kilo.",
"integrations.semantics.droid": "Fügt Factory Droid in settings.json OpenCodex-Modelle hinzu. Deaktivieren entfernt nur verwaltete Einträge; Rückgängig stellt die gespeicherte Datei wieder her.",
Expand Down
18 changes: 18 additions & 0 deletions gui/src/i18n/en.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2269,6 +2269,24 @@ export const en = {
"integrations.semantics.aside": "Manages only providers.opencodex in this profile’s ~/.aside/u/<id>/models.json. Your other providers stay unchanged. Fully quit and reopen Aside after applying.",
"integrations.semantics.raycast": "Adds an OpenCodex provider entry to Raycast's providers.yaml so every routed model appears in the Raycast AI model picker. Raycast Pro required.",
"integrations.semantics.omo": "Manages only providers.opencodex in omo's models.json — ~/.omo/agent unless OMO_CODING_AGENT_DIR, SENPI_CODING_AGENT_DIR or PI_CODING_AGENT_DIR redirects it. Your other providers stay unchanged. Applies to new sessions.",
"integrations.lazycodexRoles.title": "omo (Codex / LazyCodex) · Codex agent role models",
"integrations.lazycodexRoles.hint": "Pick the model Codex runs for each agent role. Saving changes only the model line in that role's file under $CODEX_HOME/agents, and mirrors the choice into omo.jsonc for LazyCodex only when that file can be safely rewritten.",
"integrations.lazycodexRoles.role": "Role",
"integrations.lazycodexRoles.current": "Current model",
"integrations.lazycodexRoles.model": "New model",
"integrations.lazycodexRoles.modelFor": "Model for {role}",
"integrations.lazycodexRoles.none": "No model pin",
"integrations.lazycodexRoles.choose": "Choose a model",
"integrations.lazycodexRoles.empty": "No Codex agent roles were found.",
"integrations.lazycodexRoles.loadFailed": "Could not load Codex agent roles.",
"integrations.lazycodexRoles.saveFailed": "Could not save the model for {role}.",
"integrations.lazycodexRoles.saved": "{role} now runs on {model}.",
"integrations.lazycodexRoles.omoAbsent": "{role} now runs on {model}. omo.jsonc was not found, so only the role file changed.",
"integrations.lazycodexRoles.omoComments": "{role} now runs on {model} in its role file. omo.jsonc was left unchanged because saving would remove its comments; set codex.agents.{role}.model there by hand.",
"integrations.lazycodexRoles.omoInvalid": "{role} now runs on {model} in its role file. omo.jsonc was left unchanged because it is not a JSON object with a codex.agents object.",
"integrations.lazycodexRoles.omoFailed": "{role} now runs on {model} in its role file, but omo.jsonc could not be written.",
"integrations.lazycodexRoles.retryMirror": "Retry omo.jsonc",
"integrations.lazycodexRoles.omoCommentsState": "omo.jsonc contains comments, so saving here changes only the role files. Edit codex.agents in omo.jsonc by hand to keep it in step.",
"integrations.semantics.cline": "Manages OpenCodex in Cline CLI providers.json and models.json. Stop Cline before changing or syncing these files, then restart. Undo restores both originals. Your default provider stays unchanged; select OpenCodex in Cline.",
"integrations.semantics.kilo": "Manages only provider.opencodex in Kilo's global config — the first existing file among kilo.jsonc, kilo.json, opencode.jsonc, opencode.json, or config.json under ~/.config/kilo (XDG_CONFIG_HOME relocates that directory; kilo.jsonc is created when none exist). Other keys stay unchanged. Apply rewrites the whole file, so comments and trailing commas are not preserved. Select opencodex/<model> in Kilo.",
"integrations.semantics.droid": "Adds OpenCodex custom models to Factory Droid settings.json. Disable removes only managed rows; undo restores the saved file.",
Expand Down
18 changes: 18 additions & 0 deletions gui/src/i18n/fr.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2196,6 +2196,24 @@ export const fr: Record<TKey, string> = {
"integrations.semantics.aside": "Gère uniquement providers.opencodex dans le fichier ~/.aside/u/<id>/models.json de ce profil. Vos autres fournisseurs restent inchangés. Quittez complètement Aside et relancez-le après application.",
"integrations.semantics.raycast": "Ajoute une entrée de fournisseur OpenCodex dans le providers.yaml de Raycast afin que chaque modèle routé apparaisse dans le sélecteur de modèles de Raycast AI. Raycast Pro requis.",
"integrations.semantics.omo": "Gère uniquement providers.opencodex dans le models.json d'omo — ~/.omo/agent, sauf redirection par OMO_CODING_AGENT_DIR, SENPI_CODING_AGENT_DIR ou PI_CODING_AGENT_DIR. Vos autres fournisseurs restent inchangés. S'applique aux nouvelles sessions.",
"integrations.lazycodexRoles.title": "omo (Codex / LazyCodex) · Modèles des rôles d’agent Codex",
"integrations.lazycodexRoles.hint": "Choisissez le modèle que Codex utilise pour chaque rôle d’agent. L’enregistrement ne modifie que la ligne model du fichier de ce rôle dans $CODEX_HOME/agents, et ne reporte le choix dans omo.jsonc pour LazyCodex que si ce fichier peut être réécrit sans risque.",
"integrations.lazycodexRoles.role": "Rôle",
"integrations.lazycodexRoles.current": "Modèle actuel",
"integrations.lazycodexRoles.model": "Nouveau modèle",
"integrations.lazycodexRoles.modelFor": "Modèle pour {role}",
"integrations.lazycodexRoles.none": "Aucun modèle épinglé",
"integrations.lazycodexRoles.choose": "Choisir un modèle",
"integrations.lazycodexRoles.empty": "Aucun rôle d’agent Codex trouvé.",
"integrations.lazycodexRoles.loadFailed": "Impossible de charger les rôles d’agent Codex.",
"integrations.lazycodexRoles.saveFailed": "Impossible d’enregistrer le modèle de {role}.",
"integrations.lazycodexRoles.saved": "{role} utilise désormais {model}.",
"integrations.lazycodexRoles.omoAbsent": "{role} utilise désormais {model}. omo.jsonc est introuvable, seul le fichier du rôle a donc été modifié.",
"integrations.lazycodexRoles.omoComments": "{role} utilise désormais {model} dans son fichier de rôle. omo.jsonc n’a pas été modifié, car l’enregistrement supprimerait ses commentaires ; définissez codex.agents.{role}.model à la main.",
"integrations.lazycodexRoles.omoInvalid": "{role} utilise désormais {model} dans son fichier de rôle. omo.jsonc n’a pas été modifié, car ce n’est pas un objet JSON contenant un objet codex.agents.",
"integrations.lazycodexRoles.omoFailed": "{role} utilise désormais {model} dans son fichier de rôle, mais omo.jsonc n’a pas pu être écrit.",
"integrations.lazycodexRoles.retryMirror": "Réessayer omo.jsonc",
"integrations.lazycodexRoles.omoCommentsState": "omo.jsonc contient des commentaires : l’enregistrement ici ne modifie donc que les fichiers de rôle. Modifiez codex.agents dans omo.jsonc à la main pour rester synchronisé.",
"integrations.semantics.cline": "Gère OpenCodex dans providers.json et models.json de Cline CLI. Quittez Cline avant toute modification ou synchronisation, puis redémarrez-le. Annuler restaure les deux fichiers originaux. Votre fournisseur par défaut reste inchangé ; sélectionnez OpenCodex dans Cline.",
"integrations.semantics.kilo": "Gère uniquement provider.opencodex dans la configuration globale de Kilo — le premier fichier existant parmi kilo.jsonc, kilo.json, opencode.jsonc, opencode.json ou config.json sous ~/.config/kilo (XDG_CONFIG_HOME déplace ce répertoire ; kilo.jsonc est créé si aucun n'existe). Les autres clés restent inchangées. Appliquer réécrit tout le fichier : commentaires et virgules finales ne sont pas conservés. Sélectionnez opencodex/<modèle> dans Kilo.",
"integrations.semantics.droid": "Ajoute les modèles personnalisés OpenCodex au settings.json de Factory Droid. Désactiver retire seulement les entrées gérées ; Annuler restaure le fichier sauvegardé.",
Expand Down
Loading
Loading