# Drop fabricated "example" models for codex/gemini

`724f579`→[main](/content/gh/entireio/cli/commits/main/index.html)·

dipree·1mo ago·3 files·+10 added/-44 removed

The codex/gemini model listers returned hardcoded "example" model ids
that looked pickable but weren't guaranteed valid (gpt-5-codex could fail
outright). Neither CLI has a model-enumeration command, so remove the
listers entirely. The model picker then offers just Default + Custom for
those agents (its existing no-models behavior), and `--models` shows
"(no advertised models; pass any value your CLI accepts via --model)".

Claude keeps its real, valid aliases (opus/sonnet/haiku). Tests updated.

## Sessions

ebcc924da0dfView transcript

## Changes

3

- cmd/entire/cli
  - agent
    - codex
      - Dmodels.go-20
    - geminicli
      - Dmodels.go-19
  - review
    - Mcmd_test.go+10/-5

```
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20

package codex

import (
	"context"

"github.com/entireio/cli/cmd/entire/cli/agent"
)

var _ agent.ModelLister = (*CodexAgent)(nil)

// ListModels returns example Codex model identifiers for `entire review
// --model`. Codex has no model-enumeration command, so these are advisory
// examples — `--model` forwards any value the codex CLI accepts.
func (c *CodexAgent) ListModels(_ context.Context) ([]agent.ModelInfo, error) {
	return []agent.ModelInfo{
		{ID: "gpt-5-codex", Note: "example — Codex-tuned"},
		{ID: "gpt-5", Note: "example"},
		{ID: "o3", Note: "example"},
	}, nil
}
```

Dcmd/entire/cli/agent/codex/models.go-20

```
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19

package geminicli

import (
	"context"

"github.com/entireio/cli/cmd/entire/cli/agent"
)

var _ agent.ModelLister = (*GeminiCLIAgent)(nil)

// ListModels returns example Gemini model identifiers for `entire review
// --model`. The Gemini CLI has no model-enumeration command, so these are
// advisory examples — `--model` forwards any value the gemini CLI accepts.
func (g *GeminiCLIAgent) ListModels(_ context.Context) ([]agent.ModelInfo, error) {
	return []agent.ModelInfo{
		{ID: "gemini-2.5-pro", Note: "example"},
		{ID: "gemini-2.5-flash", Note: "example — faster"},
	}, nil
}
```

Dcmd/entire/cli/agent/geminicli/models.go-19

```
135 unmodified lines

136
137
138
139
139
140
141
142
143
144
145
146
147
148
149
150
151
8 unmodified lines

160
161
162
158
159
163
164
165
161
162
166
167
168
169
170

135 unmodified lines

t.Fatalf("execute: %v", err)
}
out := buf.String()
for _, want := range []string{"claude-code", "opus", "sonnet", "codex", "gpt-5-codex", "gemini", "gemini-2.5-pro"} {
// claude-code advertises real aliases; codex/gemini have no enumeration
// command, so they list no models and point at Default/--model instead.
for _, want := range []string{"claude-code", "opus", "sonnet", "codex", "gemini", "no advertised models"} {
	if !strings.Contains(out, want) {
		t.Errorf("--models output missing %q:\n%s", want, out)
	}
}
if strings.Contains(out, "gpt-5-codex") {
	t.Errorf("--models should not invent example codex models:\n%s", out)
}
// TestReviewCmd_ListModelsFilteredByAgent verifies the --agent filter narrows
8 unmodified lines

t.Fatalf("execute: %v", err)
}
out := buf.String()
if !strings.Contains(out, "gpt-5-codex") {
	t.Errorf("expected codex models, got:\n%s", out)
if !strings.Contains(out, "codex") || !strings.Contains(out, "no advertised models") {
	t.Errorf("expected codex section with no-advertised-models note, got:\n%s", out)
}
if strings.Contains(out, "gemini-2.5-pro") {
	t.Errorf("--agent codex should not list gemini models:\n%s", out)
if strings.Contains(out, "gemini") {
	t.Errorf("--agent codex should not list gemini:\n%s", out)
}
}
```
