Files
sub2api/backend/internal/service/content_moderation_systemone_test.go
T
shaw 9eb394e3e9 fix(typesafe): 堵住校验解析差异与审计盲区,收紧模型列表口径
- System One 校验拒绝重复键与大小写/Unicode 折叠变体键(请求顶层、
  questions、问题对象):encoding/json 大小写不敏感且取最后一个重复键,
  而原始 body 原样转发,此前 {"model":"x","MODEL":"jev-latest"} 可绕过
  jev-latest 限制、模型白名单与流式限制。
- Prompt 审计与旧审核同时收集对象键名、问题 ID 与未知扩展字段(不含规范
  字段名与已校验的 type),此前把内容放进键名即可完全绕过审计。
- 上游成功响应的 usage/model 宽松解码(浮点、数字字符串),避免上游已
  计费而网关整体 502 不记账;解码失败记录 response_error ops 事件。
- 上游 413 与 400/422 同视为请求错误:透传状态码、不切换、不改账号状态。
- TypeSafe base_url 末尾的 /v1 自动剥离,避免拼出 /v1/v1/systemone;
  /v1/systemone 改挂文本请求体上限。
- Composite 静态兜底模型列表、管理端候选列表恢复为不含 jev-latest;
  Codex 清单永不列出 TypeSafe 模型;TypeSafe 分组候选默认 jev-latest。
- 创建账号从 Grok 切到 TypeSafe 时重置为白名单模式;错误透传平台列表补 typesafe。
2026-10-02 13:51:58 +08:00

35 lines
1.7 KiB
Go

package service
import (
"testing"
"github.com/stretchr/testify/require"
)
func TestExtractContentModerationInputTypeSafeSystemOne(t *testing.T) {
for _, tc := range []struct {
name string
body string
want string
}{
{"string", `{"state":"plain text"}`, "plain text"},
{"object", `{"state":{"title":"hello","nested":{"body":"world"}}}`, "title hello nested body world"},
{"array", `{"state":["first",{"text":"second"},3]}`, "first text second"},
{"questions", `{"state":"state text","questions":{"c":{"type":"choice","instructions":"pick one","criteria":{"label a":{"description":"desc a"},"label b":null}},"s":{"type":"score","criteria":["low",{"text":"high"}]},"n":{"type":"noul","instructions":["judge"],"criteria":{"true":"yes"},"ext":"extra"}},"top":{"k":"v"}}`, "c pick one label a description desc a label b s low text high n judge true yes ext extra top k v state text"},
{"key only payload", `{"state":{"hidden state key":1},"questions":{"hidden question id":{"type":"noul"}}}`, "hidden question id hidden state key"},
} {
t.Run(tc.name, func(t *testing.T) {
input := ExtractContentModerationInput(ContentModerationProtocolTypeSafeSystemOne, []byte(tc.body))
require.Equal(t, tc.want, input.Text)
require.Empty(t, input.Images)
})
}
}
func TestExtractContentModerationInputTypeSafeSystemOneKeepsReminderText(t *testing.T) {
body := `{"state":"<system-reminder>hidden payload</system-reminder>","questions":{"q":{"type":"noul","instructions":"<system-reminder>hidden instructions</system-reminder>"}}}`
input := ExtractContentModerationInput(ContentModerationProtocolTypeSafeSystemOne, []byte(body))
require.Contains(t, input.Text, "hidden payload")
require.Contains(t, input.Text, "hidden instructions")
}