设置页AI Tab:网关设置入库、保险丝改维度与grok工具注入
CI / test (push) Successful in 33s

This commit is contained in:
2026-07-16 12:31:36 +08:00
parent 99b551401e
commit da7b29d2e3
11 changed files with 600 additions and 38 deletions
+66
View File
@@ -2,6 +2,7 @@ package service
import (
"encoding/json"
"fmt"
"slices"
"strings"
"testing"
@@ -329,6 +330,71 @@ func TestRespStreamCompletedUsage(t *testing.T) {
}
}
// TestRespGuardBytes 断言保险丝计量:instructions+tools 原始字节和,缺字段计 0,
// 解析失败返回 0 放行。
func TestRespGuardBytes(t *testing.T) {
for _, tc := range []struct {
name, body string
want int
}{
{"双字段", `{"instructions":"abcd","tools":[{"type":"web_search"}],"input":"xxxxxxxx"}`,
len(`"abcd"`) + len(`[{"type":"web_search"}]`)},
{"仅 instructions", `{"instructions":"abcd"}`, len(`"abcd"`)},
{"均缺失 input 不计", `{"input":"xxxxxxxxxxxxxxxx"}`, 0},
{"解析失败放行", `not-json`, 0},
} {
t.Run(tc.name, func(t *testing.T) {
if got := RespGuardBytes([]byte(tc.body)); got != tc.want {
t.Fatalf("RespGuardBytes() = %d, want %d", got, tc.want)
}
})
}
}
// TestRespInjectGrokTools 断言 grok 搜索工具默认注入:仅 xai. 模型、开关可控、
// 已带同名工具不覆盖、注入清单正确。
func TestRespInjectGrokTools(t *testing.T) {
for _, tc := range []struct {
name, body, model string
web, x bool
wantInjected []string
wantContains []string
}{
{"非 xai 不注入", `{"tools":[]}`, "meta.llama-3.3", true, true, nil, nil},
{"双开无 tools 字段注入两个", `{"model":"xai.grok-4.3"}`, "xai.grok-4.3", true, true,
[]string{"web_search", "x_search"}, []string{`"web_search"`, `"x_search"`}},
{"已带 web_search 只注入 x_search", `{"tools":[{"type":"web_search","filters":{"x":1}}]}`,
"xai.grok-4.3", true, true, []string{"x_search"}, []string{`"filters"`}},
{"开关全关不注入", `{"tools":[]}`, "xai.grok-4.3", false, false, nil, nil},
{"仅开 x_search", `{"tools":[]}`, "xai.grok-4.3", false, true, []string{"x_search"}, nil},
{"解析失败原样", `not-json`, "xai.grok-4.3", true, true, nil, nil},
} {
t.Run(tc.name, func(t *testing.T) {
out, injected := RespInjectGrokTools([]byte(tc.body), tc.model, tc.web, tc.x)
if fmt.Sprint(injected) != fmt.Sprint(tc.wantInjected) {
t.Fatalf("injected = %v, want %v", injected, tc.wantInjected)
}
if len(injected) == 0 && string(out) != tc.body {
t.Fatalf("未注入时应原样返回: %s", out)
}
for _, sub := range append(tc.wantContains, toolTypes(injected)...) {
if !strings.Contains(string(out), sub) {
t.Fatalf("输出缺少 %s: %s", sub, out)
}
}
})
}
}
// toolTypes 把注入清单转为输出应包含的片段断言。
func toolTypes(injected []string) []string {
var out []string
for _, typ := range injected {
out = append(out, `{"type":"`+typ+`"}`)
}
return out
}
// TestRespDisableStream 断言流式升级回退把 stream 置 false 且其余字段保留。
func TestRespDisableStream(t *testing.T) {
out, err := RespDisableStream([]byte(`{"model":"m","stream":true,"max_output_tokens":64}`))