| package llmcost |
|
|
| import ( |
| "regexp" |
| "strings" |
| ) |
|
|
| |
| |
| |
| var versionSuffix = regexp.MustCompile(`(-\d{8}|-\d{4}-\d{2}-\d{2})$`) |
|
|
| |
| var bedrockVersionSuffix = regexp.MustCompile(`-v\d+:\d+$`) |
|
|
| |
| var bedrockRegionPrefix = regexp.MustCompile(`^(us|eu|ap)\.`) |
|
|
| |
| |
| var dotVersion = regexp.MustCompile(`(\d)\.(\d)`) |
|
|
| |
| |
| var modelAliases = map[string]string{ |
| |
| "deepseek-chat": "deepseek-v3", |
| "deepseek-reasoner": "deepseek-r1", |
| } |
|
|
| |
| |
| |
| func NormalizeModelID(provider string, modelID string) (canonicalProvider string, canonicalModelID string) { |
| provider = strings.ToLower(strings.TrimSpace(provider)) |
| modelID = strings.ToLower(strings.TrimSpace(modelID)) |
|
|
| |
| |
| modelID = bedrockVersionSuffix.ReplaceAllString(modelID, "") |
|
|
| |
| modelID = versionSuffix.ReplaceAllString(modelID, "") |
|
|
| |
| modelID = bedrockRegionPrefix.ReplaceAllString(modelID, "") |
|
|
| |
| modelID = dotVersion.ReplaceAllString(modelID, "${1}-${2}") |
|
|
| |
| if canonical, ok := modelAliases[modelID]; ok { |
| modelID = canonical |
| } |
|
|
| |
| provider = NormalizeProvider(provider) |
|
|
| return provider, modelID |
| } |
|
|
| |
| |
| func NormalizeProvider(provider string) string { |
| provider = strings.ToLower(strings.TrimSpace(provider)) |
|
|
| |
| if strings.HasPrefix(provider, "vertex_ai-") || strings.HasPrefix(provider, "vertex_ai_") { |
| return "vertex_ai" |
| } |
|
|
| switch provider { |
| |
| |
| case "openai": |
| return "openai" |
| case "azure", "azure_ai": |
| return "azure" |
| case "anthropic": |
| return "anthropic" |
| case "bedrock", "bedrock_converse", "amazon-bedrock": |
| return "bedrock" |
| case "google", "gemini": |
| return "google" |
| case "vertex_ai": |
| return "vertex_ai" |
| case "amazon", "aws": |
| return "amazon" |
| case "meta", "facebook": |
| return "meta" |
| case "deepseek": |
| return "deepseek" |
| case "mistral", "mistralai": |
| return "mistral" |
| case "cohere": |
| return "cohere" |
| case "xai", "x-ai": |
| return "xai" |
| case "minimax": |
| return "minimax" |
| case "nano-gpt", "nano_gpt", "nanogpt": |
| return "nanogpt" |
| default: |
| return provider |
| } |
| } |
|
|