You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

80 lines
2.0 KiB

package comm
import (
"os"
"strconv"
"strings"
)
// 测试服锁:AI 能力只许走科大讯飞 SparkChain 这一套,不许再去调微软、阿里、字节、谷歌、灵犀。
//
// 开关只认环境变量 AI_ONLY_IFLYTEK=1。正式服不设这个变量,解析和调用都跟原来一样。
// 存储、短信、实名、支付、MCP、应用参数不在这把锁里。
//
// 允许的服务 id 只有 SparkChain 这一族。同是讯飞的 AIUI、老的 ntrans 听写不在里面。
const (
svcCatSTT int32 = 1
svcCatTTS int32 = 2
svcCatLLM int32 = 5
svcCatSTS int32 = 7
svcCatASRFile int32 = 8
svcCatLLMVision int32 = 9
)
var aiVendorCats = map[int32]bool{
svcCatSTT: true,
svcCatTTS: true,
SvcCatMT: true,
SvcCatAST: true,
svcCatLLM: true,
svcCatSTS: true,
svcCatASRFile: true,
svcCatLLMVision: true,
}
var iflytekAiSvcIDs = map[string]bool{
"sparkchain": true,
"mt_iflytek": true,
"asrfile_iflytek": true,
"llm_iflytek": true,
}
// AiOnlyIflytek 当前进程是不是「AI 只许讯飞」的测试服。
func AiOnlyIflytek() bool {
switch strings.ToLower(strings.TrimSpace(os.Getenv("AI_ONLY_IFLYTEK"))) {
case "1", "true", "yes", "on":
return true
default:
return false
}
}
// IflytekAiSvc 是不是这次允许的科大讯飞服务。
func IflytekAiSvc(id, provider string) bool {
if strings.ToLower(strings.TrimSpace(provider)) != "iflytek" {
return false
}
return iflytekAiSvcIDs[strings.TrimSpace(id)]
}
// AiVendorBlocked 锁开着、而且这是一家别的 AI 服务时返回 true。调用方应整条跳过,不要发请求。
func AiVendorBlocked(id, provider, categories string) bool {
if !AiOnlyIflytek() || !categoriesHaveAI(categories) {
return false
}
return !IflytekAiSvc(id, provider)
}
func categoriesHaveAI(categories string) bool {
for _, p := range strings.Split(categories, ",") {
v, err := strconv.Atoi(strings.TrimSpace(p))
if err != nil {
continue
}
if aiVendorCats[int32(v)] {
return true
}
}
return false
}