MiniMax Code 3.1.0 checks a SubAgent's model against /^[^/\s]+\/[^/\s]+$/ (uQn in @minimax-ai/code's chunk-2XPMNZVR.js), and magpie wrote its models under custom_provider.magpie by catalog id, so custom_provider:magpie/bb-codex/gpt-6.1-sol was refused (AGENT_CONFIG_INVALID). - The writer keys each model by its catalog id with "~" for each slash (bb-codex~gpt-6.1-sol, provider.FlatID), when exactly one served id spells that way (provider.Flattened); else it keeps the slashed id. - The gateway takes such an id back to that one provider's model or group in validateModel and unprefixed (unflat / provider.Unflat): only an id with "~", no slash, that resolves as nothing else; two ids spelled alike are neither. Never a bare-name first hit. Key limits, middleware and usage see the catalog id, so a key held to bb-codex/* is refused other~gpt-6.1-sol on every route, count_tokens too. - A config an older magpie wrote moves on the next sync: the user's keys on a model go to its new key, defaultModel, defaultLightModel and memory.captureModel/consolidationModel follow, and the slashed key stays with enabled: false, so a session begun on it still resumes (checked with mcode exec --continue). Get still reads magpie/<catalog id>, and Disconnect still puts back the stashed default and variant. Other agents: no installed agent bundle here (cline, command-code, qwen-code, deepseek, pi, omp, codebuff, openclaw) has this regex; native agents were not checked. Verified: - go test -tags nogui ./internal/agent ./internal/gateway ./internal/provider (temp HOME), gofmt -l, go vet darwin/linux/windows. - New TestMiniMaxCodeOneSlash uses the reporter's regex and ids; TestFlatModelIDsReachTheirProvider has two providers serving gpt-6.1-sol. Breaking unflat, mcodeKey, the key carry-over, the legacy enabled:false and the ref rewrite each turned the tests red. - Real run: built magpie serve in a temp HOME on 47812, two fake upstreams; `magpie mcode magpie/other/gpt-6.1-sol` wrote other~gpt-6.1-sol; real mcode 0.6.5 exec reached other's upstream with gpt-6.1-sol (usage: other/gpt-6.1-sol); its agent loader accepted an agent.md with custom_provider:magpie/other~gpt-6.1-sol and refused the two-slash one; `magpie mcode default` put minimax/MiniMax-M2.7 back.
29 lines
1.1 KiB
Go
29 lines
1.1 KiB
Go
package provider
|
|
|
|
import "testing"
|
|
|
|
// #1387: a flat id is taken back only to the one id that flattens to it;
|
|
// two that flatten alike are neither, and an id with a slash, or with no
|
|
// tilde, is never flat.
|
|
func TestUnflat(t *testing.T) {
|
|
es := []Entry{{ID: "bb-codex/gpt-6.1-sol"}, {ID: "openrouter/~anthropic/claude-opus-latest"}, {ID: "group/auto-gpt-6-1-sol"},
|
|
{ID: "p/a/b"}, {ID: "p/a~b"}}
|
|
for in, want := range map[string]string{
|
|
"bb-codex~gpt-6.1-sol": "bb-codex/gpt-6.1-sol",
|
|
"openrouter~~anthropic~claude-opus-latest": "openrouter/~anthropic/claude-opus-latest",
|
|
"group~auto-gpt-6-1-sol": "group/auto-gpt-6-1-sol",
|
|
"p~a~b": "",
|
|
"gpt-6.1-sol": "",
|
|
} {
|
|
if got, ok := unflatIn(es, in); got != want || ok != (want != "") {
|
|
t.Errorf("%s: %q %v, want %q", in, got, ok, want)
|
|
}
|
|
}
|
|
if FlatID("bb-codex/gpt-6.1-sol") != "bb-codex~gpt-6.1-sol" {
|
|
t.Fatal(FlatID("bb-codex/gpt-6.1-sol"))
|
|
}
|
|
if _, ok := Unflat("bb-codex/gpt~6"); ok {
|
|
t.Fatal("an id with a slash was taken as flat")
|
|
}
|
|
}
|