Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
22 commits
Select commit Hold shift + click to select a range
7f25c63
feat(codex): clear a role's reasoning effort with a null effort
LilMGenius Oct 11, 2026
34ca235
docs(codex): describe the null effort that returns a role to its mode…
LilMGenius Oct 11, 2026
5a6d078
docs(codex): say a null role effort only clears the role override
LilMGenius Oct 11, 2026
504b599
docs(codex): name the null effort in the omo.jsonc role mirror contract
LilMGenius Oct 11, 2026
48bc063
test(codex): assert a null role effort keeps the role's other omo.jso…
LilMGenius Oct 11, 2026
e6b6fe4
feat(codex): propose a reasoning effort for every sized role
LilMGenius Oct 11, 2026
a067e9a
docs(codex): say role auto-assign proposes an effort wherever the mod…
LilMGenius Oct 11, 2026
e6c9130
feat(gui): pick each LazyCodex role's reasoning effort next to its model
LilMGenius Oct 11, 2026
7fbd896
fix(gui): keep the role row's pickers and Save in one wrapping cell
LilMGenius Oct 11, 2026
6d693e3
docs(gui): say the role row saves a reasoning effort too
LilMGenius Oct 11, 2026
2e58d2d
test(gui): seed the omo-tab placement test with the role list's effor…
LilMGenius Oct 11, 2026
ad6c389
fix(gui): say the role section's Save writes the effort line too
LilMGenius Oct 11, 2026
0db815e
test(gui): pin that an effort-only change saves with the current model
LilMGenius Oct 11, 2026
f6bc0c8
fix(gui): keep the role table when the effort list fails to load
LilMGenius Oct 11, 2026
ececa1e
fix(gui): retry a failed omo.jsonc mirror with the effort that was saved
LilMGenius Oct 11, 2026
73a063f
fix(gui): leave an unchanged effort out of a model-only role save
LilMGenius Oct 11, 2026
fdb617a
docs(gui): say a role save mirrors a changed effort into omo.jsonc too
LilMGenius Oct 11, 2026
ff4aa89
fix(codex): refuse to clear a multiline role effort and keep a leadin…
lidge-jun Oct 11, 2026
4b3ec34
fix(gui): clear a role's effort from the role table and keep confirme…
lidge-jun Oct 11, 2026
55198d0
docs(codex): describe clearing, refusal and auto-assign effort for roles
lidge-jun Oct 11, 2026
602d04c
fix(codex): keep the previous line's terminator when clearing a final…
lidge-jun Oct 11, 2026
55bde3d
fix(gui): resend a pending mirror effort from every save path
lidge-jun Oct 11, 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: 23 additions & 13 deletions docs-site/src/content/docs/guides/integrations.md
Original file line number Diff line number Diff line change
Expand Up @@ -683,14 +683,16 @@ role's model is actually decided. LazyCodex counts as installed when the `omo@si
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
section is hidden and the command line reports it as not installed. Pick a model and a reasoning
effort on a row and press Save:

- opencodex updates only the root `model = "..."` and `model_reasoning_effort = "..."` keys of that role's file.
Missing pins are inserted near the top. Choosing **Inherit effort**, available on every row,
sends `"effort": null` to clear the effort pin, removing its line and trailing comment.
The role's instructions, other comments, and other keys are left exactly as they were.
- The model is written to `[codex].agents.<role>.model` in `~/.omo/omo.jsonc`, which
LazyCodex 5.1.1 and later reads, and a changed effort LazyCodex supports goes to
`[codex].agents.<role>.reasoning` in the same entry. 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. Symlinks and non-regular files are rejected; on macOS and Linux,
a FIFO is rejected without waiting for a writer. A skipped mirror does not undo the role-file save.
Expand All @@ -704,9 +706,15 @@ ocx agent roles set explorer xai/grok-4.5
```

`ocx agent roles set <role> <model> --effort <level>` also sets the role's reasoning effort: it
rewrites the role file's `model_reasoning_effort` line and writes `[codex].agents.<role>.reasoning`
inserts or replaces the role file's `model_reasoning_effort` value and writes `[codex].agents.<role>.reasoning`
in omo.jsonc when LazyCodex has that level (`ultra` stays in the role file only, and an older
`reasoning` is removed). A Save that changes only the model leaves both effort values as they were.
`reasoning` is removed). On `PUT /api/codex-agent-roles/{role}`, omitting `effort` keeps the pin,
a level sets it, and `null` removes the role file's `model_reasoning_effort` line, its trailing
comment, and the omo.jsonc `reasoning`. A Save that changes only the model leaves both effort values as they were.
Only an existing one-line string value can be removed; a multiline or non-string value is refused
with 409 `unsupported_model_value`, leaving both files unchanged. Clearing removes only the
role's own override: Codex then resolves the effort as it does for any role without one (an explicit
spawn value, the `[agents]` default, or the parent session), not a fixed model default.

### Auto-assign

Expand All @@ -729,9 +737,11 @@ picks a model. opencodex then picks the cheapest model from your picker list tha
Each proposal shows the model, the tier, the reasoning effort, a one-line reason, and what would move
it up or down. A role the model could not size clearly is shown as not sized, with the reason, and
cannot be applied. Nothing is written until you press Apply on a row or Apply all. Applying uses the
same save as picking by hand, and also rewrites the role's `model_reasoning_effort` when the file already has
one. The effort is placed on the chosen model's own levels: its lowest, its default, one above the
default, or its highest.
same save as picking by hand. Every sized role whose chosen model has a non-empty effort ladder gets
an effort proposal, and Apply or `--apply` inserts or replaces its `model_reasoning_effort` value.
The effort is placed on the chosen model's own levels: its lowest, its default, one above the
default, or its highest. An empty ladder gives no effort proposal (`proposedEffort: null`);
Apply omits `effort` and leaves any existing effort pin as it was. A null proposal never clears a pin.

```bash
ocx agent roles suggest
Expand Down
5 changes: 4 additions & 1 deletion gui/src/i18n/de.ts
Original file line number Diff line number Diff line change
Expand Up @@ -1761,11 +1761,14 @@ export const de: Record<TKey, string> = {
"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.hint": "Wählen Sie Modell und Reasoning-Aufwand, mit denen Codex jede Agentenrolle ausführt. Beim Speichern ändern sich nur die model- und effort-Zeilen 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.effort": "Reasoning-Aufwand",
"integrations.lazycodexRoles.effortFor": "Reasoning-Aufwand ({role})",
"integrations.lazycodexRoles.effortDefault": "Aufwand erben",
"integrations.lazycodexRoles.none": "Kein Modell festgelegt",
"integrations.lazycodexRoles.choose": "Modell wählen",
"integrations.lazycodexRoles.empty": "Keine Codex-Agentenrollen gefunden.",
Expand Down
5 changes: 4 additions & 1 deletion gui/src/i18n/en.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2372,11 +2372,14 @@ export const en = {
"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.hint": "Pick the model and reasoning effort Codex runs for each agent role. Saving changes only the model and effort lines 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.effort": "Reasoning effort",
"integrations.lazycodexRoles.effortFor": "Reasoning effort ({role})",
"integrations.lazycodexRoles.effortDefault": "Inherit effort",
"integrations.lazycodexRoles.none": "No model pin",
"integrations.lazycodexRoles.choose": "Choose a model",
"integrations.lazycodexRoles.empty": "No Codex agent roles were found.",
Expand Down
5 changes: 4 additions & 1 deletion gui/src/i18n/fr.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2299,11 +2299,14 @@ export const fr: Record<TKey, string> = {
"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.hint": "Choisissez le modèle et l’effort de raisonnement que Codex utilise pour chaque rôle d’agent. L’enregistrement ne modifie que les lignes model et effort 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.effort": "Effort de raisonnement",
"integrations.lazycodexRoles.effortFor": "Effort de raisonnement ({role})",
"integrations.lazycodexRoles.effortDefault": "Hériter de l’effort",
"integrations.lazycodexRoles.none": "Aucun modèle épinglé",
"integrations.lazycodexRoles.choose": "Choisir un modèle",
"integrations.lazycodexRoles.empty": "Aucun rôle d’agent Codex trouvé.",
Expand Down
5 changes: 4 additions & 1 deletion gui/src/i18n/ja.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2194,11 +2194,14 @@ export const ja: Record<TKey, string> = {
"integrations.semantics.raycast": "Raycast の providers.yaml に OpenCodex のプロバイダーエントリを追加し、ルーティングされたすべてのモデルを Raycast AI のモデル選択に表示します。Raycast Pro が必要です。",
"integrations.semantics.omo": "omo の models.json にある providers.opencodex のみを管理します。場所は ~/.omo/agent で、OMO_CODING_AGENT_DIR・SENPI_CODING_AGENT_DIR・PI_CODING_AGENT_DIR のいずれかが設定されている場合はそちらが優先されます。他のプロバイダーは変更しません。新しいセッションから適用されます。",
"integrations.lazycodexRoles.title": "omo (Codex / LazyCodex) · Codex エージェントロールのモデル",
"integrations.lazycodexRoles.hint": "Codex が各エージェントロールで使うモデルを選びます。保存すると $CODEX_HOME/agents にあるそのロールのファイルの model 行だけが変わり、omo.jsonc を安全に書き換えられる場合に限り LazyCodex 用に同じ値を反映します。",
"integrations.lazycodexRoles.hint": "Codex が各エージェントロールで使うモデルと推論負荷を選びます。保存すると $CODEX_HOME/agents にあるそのロールのファイルの model 行と effort 行だけが変わり、omo.jsonc を安全に書き換えられる場合に限り LazyCodex 用に同じ値を反映します。",
"integrations.lazycodexRoles.role": "ロール",
"integrations.lazycodexRoles.current": "現在のモデル",
"integrations.lazycodexRoles.model": "新しいモデル",
"integrations.lazycodexRoles.modelFor": "{role} のモデル",
"integrations.lazycodexRoles.effort": "推論負荷",
"integrations.lazycodexRoles.effortFor": "推論負荷 ({role})",
"integrations.lazycodexRoles.effortDefault": "推論エフォートを継承",
"integrations.lazycodexRoles.none": "モデル指定なし",
"integrations.lazycodexRoles.choose": "モデルを選択",
"integrations.lazycodexRoles.empty": "Codex エージェントロールが見つかりません。",
Expand Down
5 changes: 4 additions & 1 deletion gui/src/i18n/ko.ts
Original file line number Diff line number Diff line change
Expand Up @@ -1805,11 +1805,14 @@ export const ko: Record<TKey, string> = {
"integrations.semantics.raycast": "Raycast의 providers.yaml에 OpenCodex 프로바이더 항목을 추가해 라우팅된 모든 모델이 Raycast AI 모델 선택기에 표시되도록 합니다. Raycast Pro가 필요합니다.",
"integrations.semantics.omo": "omo의 models.json에서 providers.opencodex만 관리합니다. 위치는 ~/.omo/agent이며 OMO_CODING_AGENT_DIR, SENPI_CODING_AGENT_DIR, PI_CODING_AGENT_DIR 중 설정된 값이 있으면 그쪽이 우선합니다. 다른 프로바이더는 그대로 유지됩니다. 새 세션부터 적용됩니다.",
"integrations.lazycodexRoles.title": "omo (Codex / LazyCodex) · Codex 에이전트 역할 모델",
"integrations.lazycodexRoles.hint": "Codex가 에이전트 역할마다 쓰는 모델을 고릅니다. 저장하면 $CODEX_HOME/agents에 있는 그 역할 파일의 model 줄만 바뀌고, omo.jsonc를 안전하게 다시 쓸 수 있을 때만 LazyCodex용으로 같은 값을 반영합니다.",
"integrations.lazycodexRoles.hint": "Codex가 에이전트 역할마다 쓰는 모델과 추론 강도를 고릅니다. 저장하면 $CODEX_HOME/agents에 있는 그 역할 파일의 model 줄과 effort 줄만 바뀌고, omo.jsonc를 안전하게 다시 쓸 수 있을 때만 LazyCodex용으로 같은 값을 반영합니다.",
"integrations.lazycodexRoles.role": "역할",
"integrations.lazycodexRoles.current": "현재 모델",
"integrations.lazycodexRoles.model": "새 모델",
"integrations.lazycodexRoles.modelFor": "{role} 모델",
"integrations.lazycodexRoles.effort": "추론 강도",
"integrations.lazycodexRoles.effortFor": "추론 강도 ({role})",
"integrations.lazycodexRoles.effortDefault": "추론 강도 상속",
"integrations.lazycodexRoles.none": "지정된 모델 없음",
"integrations.lazycodexRoles.choose": "모델 선택",
"integrations.lazycodexRoles.empty": "Codex 에이전트 역할을 찾지 못했습니다.",
Expand Down
5 changes: 4 additions & 1 deletion gui/src/i18n/pt.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2345,11 +2345,14 @@ export const pt: Record<TKey, string> = {
"integrations.semantics.raycast": "Adiciona uma entrada de provedor OpenCodex ao providers.yaml do Raycast, para que todos os modelos roteados apareçam no seletor de modelos do Raycast AI. Requer Raycast Pro.",
"integrations.semantics.omo": "Gerencia apenas providers.opencodex no models.json do omo — ~/.omo/agent, a menos que OMO_CODING_AGENT_DIR, SENPI_CODING_AGENT_DIR ou PI_CODING_AGENT_DIR o redirecione. Seus outros provedores permanecem inalterados. Vale para novas sessões.",
"integrations.lazycodexRoles.title": "omo (Codex / LazyCodex) · Modelos das funções de agente do Codex",
"integrations.lazycodexRoles.hint": "Escolha o modelo que o Codex executa em cada função de agente. Ao salvar, só a linha do modelo no arquivo da função em $CODEX_HOME/agents é alterada, e a escolha é espelhada em omo.jsonc para o LazyCodex apenas quando esse arquivo puder ser reescrito com segurança.",
"integrations.lazycodexRoles.hint": "Escolha o modelo e o esforço de raciocínio que o Codex usa em cada função de agente. Ao salvar, só as linhas de modelo e esforço no arquivo da função em $CODEX_HOME/agents são alteradas, e a escolha é espelhada em omo.jsonc para o LazyCodex apenas quando esse arquivo puder ser reescrito com segurança.",
"integrations.lazycodexRoles.role": "Função",
"integrations.lazycodexRoles.current": "Modelo atual",
"integrations.lazycodexRoles.model": "Novo modelo",
"integrations.lazycodexRoles.modelFor": "Modelo para {role}",
"integrations.lazycodexRoles.effort": "Esforço de raciocínio",
"integrations.lazycodexRoles.effortFor": "Esforço de raciocínio ({role})",
"integrations.lazycodexRoles.effortDefault": "Herdar esforço",
"integrations.lazycodexRoles.none": "Nenhum modelo fixado",
"integrations.lazycodexRoles.choose": "Escolha um modelo",
"integrations.lazycodexRoles.empty": "Nenhuma função de agente do Codex foi encontrada.",
Expand Down
5 changes: 4 additions & 1 deletion gui/src/i18n/ru.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2285,11 +2285,14 @@ export const ru: Record<TKey, string> = {
"integrations.semantics.raycast": "Добавляет запись провайдера OpenCodex в providers.yaml Raycast, чтобы каждая маршрутизируемая модель появилась в выборе моделей Raycast AI. Требуется Raycast Pro.",
"integrations.semantics.omo": "Управляет только providers.opencodex в models.json omo — ~/.omo/agent, если только OMO_CODING_AGENT_DIR, SENPI_CODING_AGENT_DIR или PI_CODING_AGENT_DIR не перенаправляет путь. Остальные провайдеры остаются без изменений. Применяется к новым сессиям.",
"integrations.lazycodexRoles.title": "omo (Codex / LazyCodex) · Модели ролей агентов Codex",
"integrations.lazycodexRoles.hint": "Выберите модель, на которой Codex запускает каждую роль агента. При сохранении меняется только строка model в файле этой роли в $CODEX_HOME/agents, а в omo.jsonc для LazyCodex выбор копируется, только если этот файл можно безопасно перезаписать.",
"integrations.lazycodexRoles.hint": "Выберите модель и уровень рассуждений, с которыми Codex запускает каждую роль агента. При сохранении меняются только строки model и effort в файле этой роли в $CODEX_HOME/agents, а в omo.jsonc для LazyCodex выбор копируется, только если этот файл можно безопасно перезаписать.",
"integrations.lazycodexRoles.role": "Роль",
"integrations.lazycodexRoles.current": "Текущая модель",
"integrations.lazycodexRoles.model": "Новая модель",
"integrations.lazycodexRoles.modelFor": "Модель для {role}",
"integrations.lazycodexRoles.effort": "Уровень рассуждений",
"integrations.lazycodexRoles.effortFor": "Уровень рассуждений ({role})",
"integrations.lazycodexRoles.effortDefault": "Наследовать усилие",
"integrations.lazycodexRoles.none": "Модель не закреплена",
"integrations.lazycodexRoles.choose": "Выберите модель",
"integrations.lazycodexRoles.empty": "Роли агентов Codex не найдены.",
Expand Down
Loading
Loading