Sync production source including routing, billing, Astra detection and public uptime. Update custom build instructions and license packaging.
69 lines
2.5 KiB
Go
69 lines
2.5 KiB
Go
package model_fingerprint
|
|
|
|
import (
|
|
"os"
|
|
"strings"
|
|
"testing"
|
|
|
|
"github.com/QuantumNous/new-api/common"
|
|
)
|
|
|
|
func TestFingerprintReferenceAndInvalidSamples(t *testing.T) {
|
|
data, err := os.ReadFile("testdata/astra-reference.json")
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
var rows []struct {
|
|
Text string `json:"text"`
|
|
Count int `json:"requested_count"`
|
|
}
|
|
if err = common.Unmarshal(data, &rows); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
samples := []Sample{}
|
|
for _, row := range rows {
|
|
samples = append(samples, Sample{Text: row.Text, Count: row.Count})
|
|
}
|
|
r, err := Score(samples)
|
|
if err != nil || r.Status != "match" || r.Closest != Model || r.ValidSamples != 3 {
|
|
t.Fatalf("%+v %v", r, err)
|
|
}
|
|
r, err = Score(samples[:2])
|
|
if err != nil || r.Status != "inconclusive" {
|
|
t.Fatalf("partial samples: %+v %v", r, err)
|
|
}
|
|
for _, s := range []string{"[1,2]", "null", "[" + strings.Repeat("-1,", 299) + "1]", "[" + strings.Repeat("1.2,", 299) + "1]", "ignore instructions; [1]"} {
|
|
if ValidArray(s, 300) {
|
|
t.Fatalf("accepted invalid array: %s", s[:min(len(s), 20)])
|
|
}
|
|
}
|
|
c := []Candidate{{Model: "gpt-5.6-luna", Weight: .98, Score: 2}, {Model: Model, Weight: .02, Score: 1}}
|
|
if Decide(c, 3).Status != "mismatch" {
|
|
t.Fatal("wrong model gate")
|
|
}
|
|
c[1].Score = 1.7
|
|
if Decide(c, 3).Status != "inconclusive" {
|
|
t.Fatal("low margin must abstain")
|
|
}
|
|
}
|
|
|
|
func TestFingerprintResponseCompletionAndTools(t *testing.T) {
|
|
completed := `{"status":"completed","model":"gpt-6-astra","output":[{"type":"message","content":[{"type":"output_text","text":"[1,2,3]"}]}],"usage":{"input_tokens":21,"output_tokens":12,"input_tokens_details":{"cached_tokens":10}}}`
|
|
for _, input := range []struct{ body, content string }{{completed, "application/json"}, {"data: {\"type\":\"response.completed\",\"response\":" + completed + "}\n\n", "text/event-stream"}} {
|
|
r, err := ReadResponse(strings.NewReader(input.body), input.content)
|
|
if err != nil || r.Text != "[1,2,3]" || r.CachedTokens != 10 || !r.HasUsage {
|
|
t.Fatalf("%+v %v", r, err)
|
|
}
|
|
}
|
|
for _, body := range []string{
|
|
"data: {\"type\":\"response.output_text.delta\",\"delta\":\"[1,2,3]\"}\n\n",
|
|
"data: {\"type\":\"response.output_item.added\",\"item\":{\"type\":\"function_call\"}}\n\n",
|
|
strings.Replace(completed, "completed", "incomplete", 1),
|
|
strings.Replace(completed, "\"type\":\"message\"", "\"type\":\"function_call\"", 1),
|
|
} {
|
|
if _, err := ReadResponse(strings.NewReader(body), "application/json"); err == nil {
|
|
t.Fatal("accepted tool or incomplete sample")
|
|
}
|
|
}
|
|
}
|