| package models |
|
|
| import "strings" |
|
|
| |
| const ThinkingModelSuffix = "-thinking" |
|
|
| |
| type ModelCapability struct { |
| RequestedModel string |
| BaseModel string |
| ThinkingEnabled bool |
| ToolCapable bool |
| } |
|
|
| |
| func ResolveModelCapability(modelID string) ModelCapability { |
| return ModelCapability{ |
| RequestedModel: modelID, |
| BaseModel: TrimThinkingModel(modelID), |
| ThinkingEnabled: IsThinkingModel(modelID), |
| ToolCapable: true, |
| } |
| } |
|
|
| |
| func ExpandModelList(baseModels []string) []string { |
| seen := make(map[string]struct{}, len(baseModels)*2) |
| result := make([]string, 0, len(baseModels)*2) |
|
|
| add := func(model string) { |
| if model == "" { |
| return |
| } |
| if _, exists := seen[model]; exists { |
| return |
| } |
| seen[model] = struct{}{} |
| result = append(result, model) |
| } |
|
|
| for _, model := range baseModels { |
| model = strings.TrimSpace(model) |
| if model == "" { |
| continue |
| } |
|
|
| add(model) |
| if !IsThinkingModel(model) { |
| add(ThinkingModelID(model)) |
| } |
| } |
|
|
| return result |
| } |
|
|
| |
| func IsThinkingModel(modelID string) bool { |
| return strings.HasSuffix(strings.TrimSpace(modelID), ThinkingModelSuffix) |
| } |
|
|
| |
| func TrimThinkingModel(modelID string) string { |
| modelID = strings.TrimSpace(modelID) |
| if IsThinkingModel(modelID) { |
| return strings.TrimSuffix(modelID, ThinkingModelSuffix) |
| } |
| return modelID |
| } |
|
|
| |
| func ThinkingModelID(baseModel string) string { |
| baseModel = strings.TrimSpace(baseModel) |
| if baseModel == "" || IsThinkingModel(baseModel) { |
| return baseModel |
| } |
| return baseModel + ThinkingModelSuffix |
| } |
|
|