Files
hack/tools/scripts/llm-key-hunter/results/_cache/content/apale7_opencode-provider-switch.json
T
OpenCode 68a9071cf1 feat: reconcile local master with origin (exa/hot-platform hunters, leaks ledger, latest results)
Local branch had diverged from origin/master (sibling commits on the same base). Rewrote local history linearly on top of origin/master, folding in all local content: exa/hot-platform discovery hunters, leaks ledger, nightly sweep orchestrator, updated .gitignore and skill docs, plus the latest hunt output and vault state. Remote-only files (vault keys, channel scripts) were restored rather than dropped, so the resulting tree is a full union of both sides.
2026-08-07 12:53:47 +08:00

1 line
8.6 KiB
JSON

{"repo": "apale7/opencode-provider-switch", "files": {"internal/opencode/model_capability_test.go": {"20cb8b6f2598663e4bb7daed7ed75e8a7847d2b1": {"t": 1786068453.9880033, "n": 7844, "h": "bcb5d771bc927675", "c": "package opencode\n\nimport (\n\t\"context\"\n\t\"io\"\n\t\"net/http\"\n\t\"net/http/httptest\"\n\t\"strings\"\n\t\"testing\"\n)\n\nfunc TestModelCapabilityProbeUsesUpstreamModels(t *testing.T) {\n\tt.Parallel()\n\n\tvar auth string\n\tvar custom string\n\tvar method string\n\tvar path string\n\tsrv := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {\n\t\tmethod = r.Method\n\t\tpath = r.URL.Path\n\t\tauth = r.Header.Get(\"Authorization\")\n\t\tcustom = r.Header.Get(\"X-Test\")\n\t\tw.Header().Set(\"Content-Type\", \"application/json\")\n\t\t_, _ = io.WriteString(w, `{\"data\":[{\"id\":\"gpt-4o\"},{\"id\":\"gpt-4.1\"}]}`)\n\t}))\n\tdefer srv.Close()\n\n\tprobe := ProbeModelCapability(context.Background(), ProviderModelProbeTarget{\n\t\tProviderID: \"openai\",\n\t\tGroupID: \"premium\",\n\t\tProtocol: \"openai-responses\",\n\t\tBaseURLs: []string{srv.URL + \"/v1\"},\n\t\tAPIKeys: []string{\"sk-test\"},\n\t\tHeaders: map[string]string{\"X-Test\": \"1\"},\n\t}, \"gpt-4o\")\n\n\tif method != http.MethodGet {\n\t\tt.Fatalf(\"method = %q, want %q\", method, http.MethodGet)\n\t}\n\tif path != \"/v1/models\" {\n\t\tt.Fatalf(\"path = %q, want /v1/models\", path)\n\t}\n\tif auth != \"Bearer sk-test\" {\n\t\tt.Fatalf(\"Authorization = %q, want Bearer sk-test\", auth)\n\t}\n\tif custom != \"1\" {\n\t\tt.Fatalf(\"X-Test = %q, want 1\", custom)\n\t}\n\tassertModelCapability(t, probe, \"gpt-4o\", \"openai\", \"openai-responses\", \"upstream\", false)\n\tif probe.GroupID != \"premium\" {\n\t\tt.Fatalf(\"GroupID = %q, want premium\", probe.GroupID)\n\t}\n\tif probe.ContextLimit <= 0 {\n\t\tt.Fatalf(\"ContextLimit = %d, want positive\", probe.ContextLimit)\n\t}\n\tif probe.OutputLimit <= 0 {\n\t\tt.Fatalf(\"OutputLimit = %d, want positive\", probe.OutputLimit)\n\t}\n\tif !containsString(probe.InputModalities, \"text\") {\n\t\tt.Fatalf(\"InputModalities = %#v, want text\", probe.InputModalities)\n\t}\n\tif !containsString(probe.OutputModalities, \"text\") {\n\t\tt.Fatalf(\"OutputModalities = %#v, want text\", probe.OutputModalities)\n\t}\n}\n\nfunc TestModelCapabilityProbeRejectsEmptyGroupID(t *testing.T) {\n\tt.Parallel()\n\n\tvar auths []string\n\tsrv := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {\n\t\tauths = append(auths, r.Header.Get(\"Authorization\"))\n\t\tif r.Header.Get(\"Authorization\") != \"Bearer sk-default-only\" {\n\t\t\tw.WriteHeader(http.StatusUnauthorized)\n\t\t\t_, _ = io.WriteString(w, `{\"error\":\"wrong key\"}`)\n\t\t\treturn\n\t\t}\n\t\t_, _ = io.WriteString(w, `{\"data\":[{\"id\":\"gpt-4o\"}]}`)\n\t}))\n\tdefer srv.Close()\n\n\tprobe := ProbeModelCapability(context.Background(), ProviderModelProbeTarget{\n\t\tProviderID: \"vendor-a\",\n\t\tProtocol: \"openai-responses\",\n\t\tBaseURLs: []string{srv.URL + \"/v1\"},\n\t\tAPIKeys: []string{\"sk-default-only\"},\n\t}, \"gpt-4o\")\n\tif probe.GroupID != \"\" || !strings.Contains(probe.ProbeError, \"groupID\") {\n\t\tt.Fatalf(\"probe = %#v, want missing groupID\", probe)\n\t}\n\tif len(auths) != 0 {\n\t\tt.Fatalf(\"auths = %#v, want no upstream request\", auths)\n\t}\n}\n\nfunc TestModelCapabilityProbeFallsBackToKnownDB(t *testing.T) {\n\tt.Parallel()\n\n\tsrv := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {\n\t\tw.WriteHeader(http.StatusUnauthorized)\n\t\t_, _ = io.WriteString(w, `{\"error\":\"bad key\"}`)\n\t}))\n\tdefer srv.Close()\n\n\tprobe := ProbeModelCapability(context.Background(), ProviderModelProbeTarget{\n\t\tProviderID: \"deepseek\",\n\t\tGroupID: \"default\",\n\t\tProtocol: \"openai-responses\",\n\t\tBaseURLs: []string{srv.URL + \"/v1\"},\n\t\tAPIKeys: []string{\"sk-bad\"},\n\t}, \"deepseek-reasoner\")\n\n\tassertModelCapability(t, probe, \"deepseek-reasoner\", \"deepseek\", \"openai-responses\", \"known_db\", false)\n\tif probe.ContextLimit <= 0 {\n\t\tt.Fatalf(\"ContextLimit = %d, want known_db positive\", probe.ContextLimit)\n\t}\n\tif !containsString(probe.InputModalities, \"text\") {\n\t\tt.Fatalf(\"InputModalities = %#v, want text\", probe.InputModalities)\n\t}\n}\n\nfunc TestModelCapabilityProbeFallsBackToDefault(t *testing.T) {\n\tt.Parallel()\n\n\tsrv := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {\n\t\tw.WriteHeader(http.StatusBadGateway)\n\t\t_, _ = io.WriteString(w, `{\"error\":\"bad gateway\"}`)\n\t}))\n\tdefer srv.Close()\n\n\tprobe := ProbeModelCapability(context.Background(), ProviderModelProbeTarget{\n\t\tProviderID: \"unknown-provider\",\n\t\tGroupID: \"default\",\n\t\tProtocol: \"openai-responses\",\n\t\tBaseURLs: []string{srv.URL + \"/v1\"},\n\t\tAPIKeys: []string{\"sk-bad\"},\n\t}, \"unknown-model-for-capability-test\")\n\n\tassertModelCapability(t, probe, \"unknown-model-for-capability-test\", \"unknown-provider\", \"openai-responses\", \"fallback\", true)\n\tassertDefaultModelCapability(t, probe)\n}\n\nfunc TestModelCapabilityProbeUnknownProtocolReturnsDefaultAndError(t *testing.T) {\n\tt.Parallel()\n\n\tprobe := ProbeModelCapability(context.Background(), ProviderModelProbeTarget{\n\t\tProviderID: \"custom\",\n\t\tGroupID: \"default\",\n\t\tProtocol: \"unknown-protocol\",\n\t\tBaseURLs: []string{\"http://127.0.0.1:1/v1\"},\n\t\tAPIKeys: []string{\"sk-test\"},\n\t}, \"gpt-5\")\n\n\tassertModelCapability(t, probe, \"gpt-5\", \"custom\", \"unknown-protocol\", \"fallback\", true)\n\tassertDefaultModelCapability(t, probe)\n\tif !strings.Contains(strings.ToLower(probe.ProbeError), \"protocol\") {\n\t\tt.Fatalf(\"ProbeError = %q, want protocol error\", probe.ProbeError)\n\t}\n}\n\nfunc TestModelCapabilityProbeEmptyModelIDReturnsError(t *testing.T) {\n\tt.Parallel()\n\n\tprobe := ProbeModelCapability(context.Background(), ProviderModelProbeTarget{\n\t\tProviderID: \"openai\",\n\t\tGroupID: \"default\",\n\t\tProtocol: \"openai-responses\",\n\t\tBaseURLs: []string{\"http://127.0.0.1:1/v1\"},\n\t\tAPIKeys: []string{\"sk-test\"},\n\t}, \"\")\n\n\tif strings.TrimSpace(probe.ProbeError) == \"\" {\n\t\tt.Fatalf(\"ProbeError = %q, want non-empty error\", probe.ProbeError)\n\t}\n\tif !strings.Contains(strings.ToLower(probe.ProbeError), \"model\") {\n\t\tt.Fatalf(\"ProbeError = %q, want model error\", probe.ProbeError)\n\t}\n}\n\nfunc TestModelConfigFromCapabilityProbeMapsCapabilityFields(t *testing.T) {\n\tt.Parallel()\n\n\tprobe, ok := KnownModelCapability(\"gpt-5\")\n\tif !ok {\n\t\tt.Fatal(\"KnownModelCapability(gpt-5) not found\")\n\t}\n\tprobe.ModelID = \"gpt-5\"\n\n\tconfig := ModelConfigFromCapabilityProbe(probe)\n\tif config[\"reasoning\"] != true {\n\t\tt.Fatalf(\"reasoning = %#v, want true\", config[\"reasoning\"])\n\t}\n\tif config[\"toolCall\"] != true {\n\t\tt.Fatalf(\"toolCall = %#v, want true\", config[\"toolCall\"])\n\t}\n\tif config[\"attachment\"] != true {\n\t\tt.Fatalf(\"attachment = %#v, want true\", config[\"attachment\"])\n\t}\n}\n\nfunc assertModelCapability(t *testing.T, probe ModelCapabilityProbe, modelID, providerID, protocol, source string, wantError bool) {\n\tt.Helper()\n\tif probe.ModelID != modelID {\n\t\tt.Fatalf(\"ModelID = %q, want %q\", probe.ModelID, modelID)\n\t}\n\tif probe.ProviderID != providerID {\n\t\tt.Fatalf(\"ProviderID = %q, want %q\", probe.ProviderID, providerID)\n\t}\n\tif probe.Protocol != protocol {\n\t\tt.Fatalf(\"Protocol = %q, want %q\", probe.Protocol, protocol)\n\t}\n\tif probe.ProbeSource != source {\n\t\tt.Fatalf(\"ProbeSource = %q, want %q\", probe.ProbeSource, source)\n\t}\n\tif wantError && strings.TrimSpace(probe.ProbeError) == \"\" {\n\t\tt.Fatalf(\"ProbeError = %q, want non-empty error\", probe.ProbeError)\n\t}\n\tif !wantError && strings.TrimSpace(probe.ProbeError) != \"\" {\n\t\tt.Fatalf(\"ProbeError = %q, want empty\", probe.ProbeError)\n\t}\n}\n\nfunc assertDefaultModelCapability(t *testing.T, probe ModelCapabilityProbe) {\n\tt.Helper()\n\tif probe.ContextLimit != 128000 {\n\t\tt.Fatalf(\"ContextLimit = %d, want 128000\", probe.ContextLimit)\n\t}\n\tif probe.OutputLimit != 4096 {\n\t\tt.Fatalf(\"OutputLimit = %d, want 4096\", probe.OutputLimit)\n\t}\n\tif len(probe.InputModalities) != 1 || probe.InputModalities[0] != \"text\" {\n\t\tt.Fatalf(\"InputModalities = %#v, want [text]\", probe.InputModalities)\n\t}\n\tif len(probe.OutputModalities) != 1 || probe.OutputModalities[0] != \"text\" {\n\t\tt.Fatalf(\"OutputModalities = %#v, want [text]\", probe.OutputModalities)\n\t}\n}\n\nfunc containsString(items []string, want string) bool {\n\tfor _, item := range items {\n\t\tif item == want {\n\t\t\treturn true\n\t\t}\n\t}\n\treturn false\n}\n"}}}}