| package diff |
|
|
| import ( |
| "crypto/sha256" |
| "encoding/hex" |
| "encoding/json" |
| "sort" |
| "strings" |
|
|
| "github.com/router-for-me/CLIProxyAPI/v6/internal/config" |
| ) |
|
|
| |
| |
| func ComputeOpenAICompatModelsHash(models []config.OpenAICompatibilityModel) string { |
| keys := normalizeModelPairs(func(out func(key string)) { |
| for _, model := range models { |
| name := strings.TrimSpace(model.Name) |
| alias := strings.TrimSpace(model.Alias) |
| if name == "" && alias == "" { |
| continue |
| } |
| out(strings.ToLower(name) + "|" + strings.ToLower(alias)) |
| } |
| }) |
| return hashJoined(keys) |
| } |
|
|
| |
| func ComputeVertexCompatModelsHash(models []config.VertexCompatModel) string { |
| keys := normalizeModelPairs(func(out func(key string)) { |
| for _, model := range models { |
| name := strings.TrimSpace(model.Name) |
| alias := strings.TrimSpace(model.Alias) |
| if name == "" && alias == "" { |
| continue |
| } |
| out(strings.ToLower(name) + "|" + strings.ToLower(alias)) |
| } |
| }) |
| return hashJoined(keys) |
| } |
|
|
| |
| func ComputeClaudeModelsHash(models []config.ClaudeModel) string { |
| keys := normalizeModelPairs(func(out func(key string)) { |
| for _, model := range models { |
| name := strings.TrimSpace(model.Name) |
| alias := strings.TrimSpace(model.Alias) |
| if name == "" && alias == "" { |
| continue |
| } |
| out(strings.ToLower(name) + "|" + strings.ToLower(alias)) |
| } |
| }) |
| return hashJoined(keys) |
| } |
|
|
| |
| func ComputeCodexModelsHash(models []config.CodexModel) string { |
| keys := normalizeModelPairs(func(out func(key string)) { |
| for _, model := range models { |
| name := strings.TrimSpace(model.Name) |
| alias := strings.TrimSpace(model.Alias) |
| if name == "" && alias == "" { |
| continue |
| } |
| out(strings.ToLower(name) + "|" + strings.ToLower(alias)) |
| } |
| }) |
| return hashJoined(keys) |
| } |
|
|
| |
| func ComputeGeminiModelsHash(models []config.GeminiModel) string { |
| keys := normalizeModelPairs(func(out func(key string)) { |
| for _, model := range models { |
| name := strings.TrimSpace(model.Name) |
| alias := strings.TrimSpace(model.Alias) |
| if name == "" && alias == "" { |
| continue |
| } |
| out(strings.ToLower(name) + "|" + strings.ToLower(alias)) |
| } |
| }) |
| return hashJoined(keys) |
| } |
|
|
| |
| func ComputeExcludedModelsHash(excluded []string) string { |
| if len(excluded) == 0 { |
| return "" |
| } |
| normalized := make([]string, 0, len(excluded)) |
| for _, entry := range excluded { |
| if trimmed := strings.TrimSpace(entry); trimmed != "" { |
| normalized = append(normalized, strings.ToLower(trimmed)) |
| } |
| } |
| if len(normalized) == 0 { |
| return "" |
| } |
| sort.Strings(normalized) |
| data, _ := json.Marshal(normalized) |
| sum := sha256.Sum256(data) |
| return hex.EncodeToString(sum[:]) |
| } |
|
|
| func normalizeModelPairs(collect func(out func(key string))) []string { |
| seen := make(map[string]struct{}) |
| keys := make([]string, 0) |
| collect(func(key string) { |
| if _, exists := seen[key]; exists { |
| return |
| } |
| seen[key] = struct{}{} |
| keys = append(keys, key) |
| }) |
| if len(keys) == 0 { |
| return nil |
| } |
| sort.Strings(keys) |
| return keys |
| } |
|
|
| func hashJoined(keys []string) string { |
| if len(keys) == 0 { |
| return "" |
| } |
| sum := sha256.Sum256([]byte(strings.Join(keys, "\n"))) |
| return hex.EncodeToString(sum[:]) |
| } |
|
|