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(), "")))
|
own = say(group(p, options(catalog.Codex(), "")))
|
||||||
} else {
|
} else {
|
||||||
own = say(group("OpenAI", options(ownCodex(), "")))
|
own = say(group("OpenAI", options(ownCodex(), "")))
|
||||||
// on magpie API, Codex's own models are reached through magpie,
|
// with magpie Codex's provider (magpie API, or a magpie model
|
||||||
// on its ChatGPT account there: picked so, set so (#701)
|
// picked with no ChatGPT sign-in beside it), Codex's own models
|
||||||
if api() {
|
// 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 {
|
for i, o := range own {
|
||||||
if id := codexOwnViaMagpie(o.Value); id != "" {
|
if id := codexOwnViaMagpie(o.Value); id != "" {
|
||||||
own[i].Label, own[i].Value, own[i].Ref = o.Value, id, 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