File size: 3,582 Bytes
48d903a
 
 
 
cbe30d3
48d903a
cbe30d3
 
 
 
 
 
 
 
48d903a
 
3a315de
 
cbe30d3
 
 
 
 
 
 
 
3a315de
 
 
 
cbe30d3
3a315de
cbe30d3
3a315de
 
 
cbe30d3
3a315de
 
 
 
 
 
 
 
 
 
 
cbe30d3
48d903a
f137b9c
 
 
 
 
 
 
 
0b327f4
 
 
 
 
7fa88ca
 
 
 
 
 
 
 
 
 
cbe30d3
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
48d903a
 
 
cbe30d3
5a55e77
48d903a
 
5a55e77
cbe30d3
48d903a
 
 
 
 
 
 
 
5a55e77
 
 
48d903a
 
 
 
 
5a55e77
48d903a
 
 
5a55e77
48d903a
 
 
 
5a55e77
48d903a
 
 
5a55e77
 
 
 
 
48d903a
5a55e77
48d903a
 
 
3a315de
48d903a
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
package model

import "strings"

// 基础模型映射(key 全部小写,不包含标签后缀)
var BaseModelMapping = map[string]string{
	"glm-4.5":      "0727-360B-API",
	"glm-4.6":      "GLM-4-6-API-V1",
	"glm-4.7":      "glm-4.7",
	"glm-5":        "glm-5",
	"glm-4.5-v":    "glm-4.5v",
	"glm-4.6-v":    "glm-4.6v",
	"glm-4.5-air":  "0727-106B-API",
	"0808-360b-dr": "0808-360B-DR",
}

// Claude 模型名到 GLM 基础模型名的映射
var ClaudeModelMapping = map[string]string{
	"claude-opus-4-6":            "glm-4.7",
	"claude-opus-4-5-20250514":   "glm-4.7",
	"claude-sonnet-4-6":          "glm-4.7",
	"claude-sonnet-4-5-20241022": "glm-4.7",
	"claude-haiku-4-5":           "glm-4.5-air",
	"claude-haiku-4-5-20251001":  "glm-4.5-air",
	"claude-3-5-sonnet-20241022": "glm-4.7",
	"claude-3-5-haiku-20241022":  "glm-4.5-air",
}

// ResolveClaudeModel maps a Claude model name to a GLM model name with appropriate tags.
func ResolveClaudeModel(model string, thinkingEnabled bool) (resolvedModel string, enableThinking bool) {
	base, ok := ClaudeModelMapping[strings.ToLower(model)]
	if !ok {
		base = "glm-4.7"
	}

	enableThinking = thinkingEnabled
	if strings.Contains(strings.ToLower(model), "opus") {
		enableThinking = true
	}

	resolvedModel = base
	if enableThinking {
		resolvedModel += "-thinking"
	}
	resolvedModel += "-tools"
	return resolvedModel, enableThinking
}

// v1/models 返回的模型列表(全部小写)
var ModelList = []string{
	// DEEPSEEK directo
	"deepseek",
	"deepseek-expert",
	"deepseek-r1",
	"deepseek-search",
	"deepseek-expert-r1",
	"deepseek-v4",
	"deepseek-v4-pro",
	// DEEPSEEK via OpenRouter
	"deepseek-r1",
	"deepseek-v3",
	"deepseek-r1-0528",
	"deepseek-v3-turbo",
// CLAUDE
"claude-sonnet-4-6",
"claude-sonnet-4-5-20241022",
"claude-haiku-4-5",
"claude-haiku-4-5-20251001",
"claude-opus-4-6",
"claude-opus-4-5-20250514",
"claude-3-5-sonnet-20241022",
"claude-3-5-haiku-20241022",
// GLM
	"glm-4.5",
	"glm-4.6",
	"glm-4.7",
	"glm-4.7-thinking",
	"glm-4.7-thinking-search",
	"glm-4.7-tools",
	"glm-4.7-tools-thinking",
	"glm-5",
	"glm-5-thinking",
	"glm-5-thinking-search",
	"glm-5-tools",
	"glm-5-tools-thinking",
	"glm-4.5-v",
	"glm-4.6-v",
	"glm-4.6-v-thinking",
	"glm-4.5-air",
}

// 解析模型名称,提取基础模型名和标签
// 输入大小写不敏感,输出的 baseModel 为小写
func ParseModelName(model string) (baseModel string, enableThinking bool, enableSearch bool, enableTools bool) {
	enableThinking = false
	enableSearch = false
	enableTools = false
	baseModel = strings.ToLower(model)

	for {
		if strings.HasSuffix(baseModel, "-thinking") {
			enableThinking = true
			baseModel = strings.TrimSuffix(baseModel, "-thinking")
		} else if strings.HasSuffix(baseModel, "-search") {
			enableSearch = true
			baseModel = strings.TrimSuffix(baseModel, "-search")
		} else if strings.HasSuffix(baseModel, "-tools") {
			enableTools = true
			baseModel = strings.TrimSuffix(baseModel, "-tools")
		} else {
			break
		}
	}

	return baseModel, enableThinking, enableSearch, enableTools
}

func IsThinkingModel(model string) bool {
	_, enableThinking, _, _ := ParseModelName(model)
	return enableThinking
}

func IsSearchModel(model string) bool {
	_, _, enableSearch, _ := ParseModelName(model)
	return enableSearch
}

func IsToolsModel(model string) bool {
	_, _, _, enableTools := ParseModelName(model)
	return enableTools
}

func GetTargetModel(model string) string {
	baseModel, _, _, _ := ParseModelName(model)
	if target, ok := BaseModelMapping[baseModel]; ok {
		return target
	}
	return "glm-4.7"
}