| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394 |
- package service
- import (
- "errors"
- "fmt"
- "one-api/dto"
- "one-api/setting"
- "strings"
- )
- func CheckSensitiveMessages(messages []dto.Message) ([]string, error) {
- if len(messages) == 0 {
- return nil, nil
- }
- for _, message := range messages {
- arrayContent := message.ParseContent()
- for _, m := range arrayContent {
- if m.Type == "image_url" {
- // TODO: check image url
- continue
- }
- // 检查 text 是否为空
- if m.Text == "" {
- continue
- }
- if ok, words := SensitiveWordContains(m.Text); ok {
- return words, errors.New("sensitive words detected")
- }
- }
- }
- return nil, nil
- }
- func CheckSensitiveText(text string) ([]string, error) {
- if ok, words := SensitiveWordContains(text); ok {
- return words, errors.New("sensitive words detected")
- }
- return nil, nil
- }
- func CheckSensitiveInput(input any) ([]string, error) {
- switch v := input.(type) {
- case string:
- return CheckSensitiveText(v)
- case []string:
- var builder strings.Builder
- for _, s := range v {
- builder.WriteString(s)
- }
- return CheckSensitiveText(builder.String())
- }
- return CheckSensitiveText(fmt.Sprintf("%v", input))
- }
- // SensitiveWordContains 是否包含敏感词,返回是否包含敏感词和敏感词列表
- func SensitiveWordContains(text string) (bool, []string) {
- if len(setting.SensitiveWords) == 0 {
- return false, nil
- }
- if len(text) == 0 {
- return false, nil
- }
- checkText := strings.ToLower(text)
- return AcSearch(checkText, setting.SensitiveWords, true)
- }
- // SensitiveWordReplace 敏感词替换,返回是否包含敏感词和替换后的文本
- func SensitiveWordReplace(text string, returnImmediately bool) (bool, []string, string) {
- if len(setting.SensitiveWords) == 0 {
- return false, nil, text
- }
- checkText := strings.ToLower(text)
- m := InitAc(setting.SensitiveWords)
- hits := m.MultiPatternSearch([]rune(checkText), returnImmediately)
- if len(hits) > 0 {
- words := make([]string, 0, len(hits))
- var builder strings.Builder
- builder.Grow(len(text))
- lastPos := 0
- for _, hit := range hits {
- pos := hit.Pos
- word := string(hit.Word)
- builder.WriteString(text[lastPos:pos])
- builder.WriteString("**###**")
- lastPos = pos + len(word)
- words = append(words, word)
- }
- builder.WriteString(text[lastPos:])
- return true, words, builder.String()
- }
- return false, nil, text
- }
|