stats: the day's event no longer names an omp profile or a model the user named; an omp profile goes as omp, and on a key's provider a model id models.dev doesn't list (an Ollama model, a fine-tune with the user's organisation in it) goes as <provider>/other
169c23c1cut only `@wsl:` from agent ids, and78d90571(four minutes earlier) made each omp profile an agent `omp#<name>`, so the profile name went to PostHog. modelLabel sent `<preset>/<model>` for any model on a preset's provider, and on Ollama, LM Studio or a fine-tune that id is the user's own text. docs/reference.md promised "No names". Model ids on subscriptions and plugins are the vendor's and are unchanged; known models on a key's provider still go by id (deepseek/deepseek-v4). Red before: with the old usage.go, TestAgentLabel fails ("omp#acme-secret", want "omp") and TestModelLabelKeepsTheUsersOwnModelIDs fails ("openai/ft:gpt-4o:acme-corp::abc123", want "openai/other"; "ollama/acme-internal-llm", want "ollama/other"); both pass with it. Run in docker golang:1.26.8 (this Mac's syspolicyd is pegged and new test binaries hang before start): gofmt -l, go vet -tags nogui on stats/agent/catalog, GOOS=windows go build, go build -tags nogui, and go test -tags nogui ./... — all pass except internal/agent's aside chmod-0500 tests, which root ignores; internal/agent passes as uid 1000.
This commit is contained in:
1 parent
0470411122
commit
2cdae80a10
3 files changed
+76
-5
No files matched your search
+6
-3
@@ -1845,13 +1845,16 @@ and architecture.
|
|||||||
With it goes what magpie is used with, so we know which agents, providers
|
With it goes what magpie is used with, so we know which agents, providers
|
||||||
and models to look after first, by magpie's own ids only:
|
and models to look after first, by magpie's own ids only:
|
||||||
|
|
||||||
- the agents connected to magpie (`claude`, `codex`);
|
- the agents connected to magpie (`claude`, `codex`); an omp profile is
|
||||||
|
only `omp`;
|
||||||
- the providers that are on: a preset's id (`deepseek`), a subscription's
|
- the providers that are on: a preset's id (`deepseek`), a subscription's
|
||||||
(`codex`, `copilot`), a community plugin's (`plugin:kiro`); a provider you
|
(`codex`, `copilot`), a community plugin's (`plugin:kiro`); a provider you
|
||||||
added yourself is only `custom`, another plugin only `plugin`;
|
added yourself is only `custom`, another plugin only `plugin`;
|
||||||
- the models the connected agents are set to, as the provider's id and the
|
- the models the connected agents are set to, as the provider's id and the
|
||||||
vendor's model id (`deepseek/deepseek-v4`); one on a provider of your own
|
vendor's model id (`deepseek/deepseek-v4`); on a key's provider, a model
|
||||||
is only `custom`, a routing group only `group`;
|
id that [models.dev](https://models.dev) doesn't list (a local model, a
|
||||||
|
fine-tune) is only `<provider>/other`; one on a provider of your own is
|
||||||
|
only `custom`, a routing group only `group`;
|
||||||
- how many of each, and how many routing groups you have.
|
- how many of each, and how many routing groups you have.
|
||||||
|
|
||||||
No names, base URLs, accounts, keys, prompts or usage go. Turn that part off
|
No names, base URLs, accounts, keys, prompts or usage go. Turn that part off
|
||||||
|
|||||||
@@ -5,10 +5,13 @@ import (
|
|||||||
"encoding/json"
|
"encoding/json"
|
||||||
"net/http"
|
"net/http"
|
||||||
"net/http/httptest"
|
"net/http/httptest"
|
||||||
|
"os"
|
||||||
|
"path/filepath"
|
||||||
"strings"
|
"strings"
|
||||||
"testing"
|
"testing"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
|
"github.com/yetone/magpie/internal/catalog"
|
||||||
"github.com/yetone/magpie/internal/provider"
|
"github.com/yetone/magpie/internal/provider"
|
||||||
"github.com/yetone/magpie/internal/settings"
|
"github.com/yetone/magpie/internal/settings"
|
||||||
)
|
)
|
||||||
@@ -102,3 +105,53 @@ func TestProviderLabel(t *testing.T) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Nothing the user named goes as an agent: an omp profile, a WSL distro.
|
||||||
|
func TestAgentLabel(t *testing.T) {
|
||||||
|
for id, want := range map[string]string{
|
||||||
|
"claude": "claude",
|
||||||
|
"claude@wsl:Ubuntu": "claude",
|
||||||
|
"omp#acme-secret": "omp",
|
||||||
|
"omp#acme-secret@wsl:Work": "omp",
|
||||||
|
} {
|
||||||
|
if got := agentLabel(id); got != want {
|
||||||
|
t.Errorf("%s: %q, want %q", id, got, want)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// A model on a key's provider goes by its id only when models.dev knows
|
||||||
|
// it: one the user named (an Ollama model, a fine-tune naming their
|
||||||
|
// organisation) is "other".
|
||||||
|
func TestModelLabelKeepsTheUsersOwnModelIDs(t *testing.T) {
|
||||||
|
cache := map[string]any{"deepseek": map[string]any{"id": "deepseek", "models": map[string]any{
|
||||||
|
"deepseek-v4": map[string]any{"id": "deepseek-v4", "limit": map[string]any{"context": 128000}},
|
||||||
|
}}}
|
||||||
|
b, _ := json.Marshal(cache)
|
||||||
|
if err := os.MkdirAll(filepath.Dir(catalog.CachePath()), 0o700); err != nil {
|
||||||
|
t.Fatal(err)
|
||||||
|
}
|
||||||
|
if err := os.WriteFile(catalog.CachePath(), b, 0o600); err != nil {
|
||||||
|
t.Fatal(err)
|
||||||
|
}
|
||||||
|
catalog.Reset()
|
||||||
|
t.Cleanup(func() { os.Remove(catalog.CachePath()); catalog.Reset() })
|
||||||
|
for _, p := range []provider.Provider{
|
||||||
|
{ID: "my-deepseek", Name: "DS", Preset: "deepseek", Chat: "https://api.deepseek.com/v1", Key: "sk-x", Models: []string{"deepseek-v4"}},
|
||||||
|
{ID: "my-openai", Name: "OA", Preset: "openai", Chat: "https://api.openai.com/v1", Key: "sk-y", Models: []string{"ft:gpt-4o:acme-corp::abc123"}},
|
||||||
|
{ID: "my-ollama", Name: "Local", Preset: "ollama", Chat: "http://127.0.0.1:11434/v1", Models: []string{"acme-internal-llm"}},
|
||||||
|
} {
|
||||||
|
if err := provider.Save(p); err != nil {
|
||||||
|
t.Fatal(err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
for ref, want := range map[string]string{
|
||||||
|
"my-deepseek/deepseek-v4": "deepseek/deepseek-v4",
|
||||||
|
"my-openai/ft:gpt-4o:acme-corp::abc123": "openai/other",
|
||||||
|
"my-ollama/acme-internal-llm": "ollama/other",
|
||||||
|
} {
|
||||||
|
if got := modelLabel(ref); got != want {
|
||||||
|
t.Errorf("%s: %q, want %q", ref, got, want)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
+17
-2
@@ -5,6 +5,7 @@ import (
|
|||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
"github.com/yetone/magpie/internal/agent"
|
"github.com/yetone/magpie/internal/agent"
|
||||||
|
"github.com/yetone/magpie/internal/catalog"
|
||||||
"github.com/yetone/magpie/internal/provider"
|
"github.com/yetone/magpie/internal/provider"
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -31,8 +32,7 @@ func readUsage() Usage {
|
|||||||
if !a.Wired() {
|
if !a.Wired() {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
id, _, _ := strings.Cut(a.ID, "@wsl:")
|
u.Agents = with(u.Agents, agentLabel(a.ID))
|
||||||
u.Agents = with(u.Agents, id)
|
|
||||||
for _, ref := range a.Models() {
|
for _, ref := range a.Models() {
|
||||||
u.Models = with(u.Models, modelLabel(ref))
|
u.Models = with(u.Models, modelLabel(ref))
|
||||||
}
|
}
|
||||||
@@ -75,9 +75,21 @@ func providerLabel(p provider.Provider) string {
|
|||||||
return "custom"
|
return "custom"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// agentLabel is an agent as stats name it: its built-in id, without the
|
||||||
|
// WSL distro or the omp profile (omp#<name>) the user named.
|
||||||
|
func agentLabel(id string) string {
|
||||||
|
id, _, _ = strings.Cut(id, "@wsl:")
|
||||||
|
id, _, _ = strings.Cut(id, "#")
|
||||||
|
return id
|
||||||
|
}
|
||||||
|
|
||||||
// modelLabel is an agent's model as stats name it: the provider's label
|
// modelLabel is an agent's model as stats name it: the provider's label
|
||||||
// and the vendor's model id, "group" for a routing group, and the label
|
// and the vendor's model id, "group" for a routing group, and the label
|
||||||
// alone for a provider of the user's own; "" for one magpie can't find.
|
// alone for a provider of the user's own; "" for one magpie can't find.
|
||||||
|
// On a key's provider the model id is the user's to type (an Ollama
|
||||||
|
// model they named, a fine-tune with their organisation in it), so it
|
||||||
|
// goes only when models.dev knows it, else as "other"; a subscription's
|
||||||
|
// or plugin's ids are its vendor's.
|
||||||
func modelLabel(ref string) string {
|
func modelLabel(ref string) string {
|
||||||
if strings.HasPrefix(ref, provider.GroupPrefix) {
|
if strings.HasPrefix(ref, provider.GroupPrefix) {
|
||||||
return "group"
|
return "group"
|
||||||
@@ -90,5 +102,8 @@ func modelLabel(ref string) string {
|
|||||||
if l == "custom" || l == "plugin" {
|
if l == "custom" || l == "plugin" {
|
||||||
return l
|
return l
|
||||||
}
|
}
|
||||||
|
if p.Account == nil && !p.IsPlugin() && !catalog.Knows(m) {
|
||||||
|
return l + "/other"
|
||||||
|
}
|
||||||
return l + "/" + m
|
return l + "/" + m
|
||||||
}
|
}
|
||||||
Reference in new issue
Block a user