agent: with magpie Codex's provider, Codex's own models on the Agents page say what picking them does: one magpie serves on a ChatGPT account is picked as magpie serves it and Codex stays on magpie; any other reads "direct, not via magpie" and asks before taking Codex off magpie (#1269, shenghsi)
Picking Codex's own gpt-5.5 tagged "via magpie" while magpie was Codex's provider took Codex off magpie at once, with no question: the tag came from routed(), but set() unroutes for a model of Codex's own unless it is joined beside a ChatGPT sign-in or on magpie API. Verified: TestCodexProviderOwnModelSaysItsPath fails without the change (gpt-a reads Via:true with no ChatGPT account; Value gpt-a, not codex/gpt-a, with one), passes with it. Reproduced and checked in a sandbox HOME with Playwright against `magpie web`, on macOS and on Linux (WSL2 Ubuntu 24.04, codex-cli 0.161.0): before, picking gpt-5.5 left Codex "Not connected"; after, it reads direct and opens "Take Codex off magpie?". go test -tags nogui ./... green; go vet for darwin, linux, windows on internal/agent.
This commit is contained in:
1 parent
8bbc03ac78
commit
d7bdb0765f
2 files changed
+77
-3
No files matched your search
@@ -472,12 +472,18 @@ func codexIn(at place) *Agent {
|
||||
own = say(group(p, options(catalog.Codex(), "")))
|
||||
} else {
|
||||
own = say(group("OpenAI", options(ownCodex(), "")))
|
||||
// on magpie API, Codex's own models are reached through magpie,
|
||||
// on its ChatGPT account there: picked so, set so (#701)
|
||||
if api() {
|
||||
// with magpie Codex's provider (magpie API, or a magpie model
|
||||
// picked with no ChatGPT sign-in beside it), Codex's own models
|
||||
// are reached through magpie on a ChatGPT account there: picked
|
||||
// so, set so (#701). One magpie doesn't serve is picked off
|
||||
// magpie, straight to OpenAI, and says so: it said via magpie,
|
||||
// and picking it took Codex off magpie at once (#1269)
|
||||
if api() || asProvider() {
|
||||
for i, o := range own {
|
||||
if id := codexOwnViaMagpie(o.Value); id != "" {
|
||||
own[i].Label, own[i].Value, own[i].Ref = o.Value, id, id
|
||||
} else if !api() {
|
||||
own[i].Via, own[i].Direct = false, "OpenAI"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,68 @@
|
||||
package agent
|
||||
|
||||
import (
|
||||
"os"
|
||||
"path/filepath"
|
||||
"strings"
|
||||
"testing"
|
||||
)
|
||||
|
||||
// With magpie Codex's provider, a model of Codex's own on the Agents page
|
||||
// says what picking it does (#1269, shenghsi: "gpt-5.5 经 magpie", and
|
||||
// Codex was taken off magpie the moment it was picked). With no ChatGPT
|
||||
// account in magpie to serve it, it goes straight to OpenAI and says so;
|
||||
// with one, it is picked as magpie serves it and Codex stays on magpie.
|
||||
func TestCodexProviderOwnModelSaysItsPath(t *testing.T) {
|
||||
ownOf := func(a *Agent) []Option {
|
||||
var out []Option
|
||||
for _, o := range a.Fields[0].Options(nil) {
|
||||
if o.Group == "OpenAI" && (o.Label == "gpt-a" || o.Value == "gpt-a") {
|
||||
out = append(out, o)
|
||||
}
|
||||
}
|
||||
return out
|
||||
}
|
||||
cache := []byte(`{"models":[{"slug":"gpt-a","display_name":"A","priority":1}]}`)
|
||||
|
||||
t.Run("no ChatGPT account", func(t *testing.T) {
|
||||
home, read := codexHome(t, `{"OPENAI_API_KEY":"sk-x"}`, "")
|
||||
os.WriteFile(filepath.Join(home, ".codex", "models_cache.json"), cache, 0o644)
|
||||
cx := codex(home)
|
||||
if err := cx.Fields[0].Set("fake/m1"); err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
if cfg := read(); !strings.Contains(cfg, `model_provider = "magpie"`) {
|
||||
t.Fatalf("magpie isn't Codex's provider:\n%s", cfg)
|
||||
}
|
||||
own := ownOf(codex(home))
|
||||
if len(own) != 1 {
|
||||
t.Fatalf("Codex's own gpt-a: %+v", own)
|
||||
}
|
||||
if o := own[0]; o.Via || o.Direct != "OpenAI" || o.Value != "gpt-a" {
|
||||
t.Fatalf("picking gpt-a takes Codex off magpie, yet it reads %+v", o)
|
||||
}
|
||||
})
|
||||
|
||||
t.Run("ChatGPT account out of allowance", func(t *testing.T) {
|
||||
home, read := codexHome(t, `{"tokens":{"access_token":"x","id_token":"x.e30.x"}}`, "")
|
||||
os.WriteFile(filepath.Join(home, ".codex", "models_cache.json"), cache, 0o644)
|
||||
codexUsedUp = func() bool { return true }
|
||||
cx := codex(home)
|
||||
if err := cx.Fields[0].Set("fake/m1"); err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
if cfg := read(); !strings.Contains(cfg, `model_provider = "magpie"`) {
|
||||
t.Fatalf("magpie isn't Codex's provider:\n%s", cfg)
|
||||
}
|
||||
own := ownOf(codex(home))
|
||||
if len(own) != 1 || own[0].Value != "codex/gpt-a" || !own[0].Via {
|
||||
t.Fatalf("Codex's own gpt-a, served by magpie: %+v", own)
|
||||
}
|
||||
if err := codex(home).Fields[0].Set(own[0].Value); err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
if cfg := read(); !strings.Contains(cfg, `model_provider = "magpie"`) || !strings.Contains(cfg, `model = "codex/gpt-a"`) {
|
||||
t.Fatalf("picking it took Codex off magpie:\n%s", cfg)
|
||||
}
|
||||
})
|
||||
}
|
||||
Reference in new issue
Block a user