package diff import ( "crypto/sha256" "encoding/hex" "sort" "strings" "github.com/router-for-me/CLIProxyAPI/v6/internal/config" ) type GeminiModelsSummary struct { hash string count int } type ClaudeModelsSummary struct { hash string count int } type CodexModelsSummary struct { hash string count int } type VertexModelsSummary struct { hash string count int } // SummarizeGeminiModels hashes Gemini model aliases for change detection. func SummarizeGeminiModels(models []config.GeminiModel) GeminiModelsSummary { if len(models) == 0 { return GeminiModelsSummary{} } 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 GeminiModelsSummary{ hash: hashJoined(keys), count: len(keys), } } // SummarizeClaudeModels hashes Claude model aliases for change detection. func SummarizeClaudeModels(models []config.ClaudeModel) ClaudeModelsSummary { if len(models) == 0 { return ClaudeModelsSummary{} } 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 ClaudeModelsSummary{ hash: hashJoined(keys), count: len(keys), } } // SummarizeCodexModels hashes Codex model aliases for change detection. func SummarizeCodexModels(models []config.CodexModel) CodexModelsSummary { if len(models) == 0 { return CodexModelsSummary{} } 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 CodexModelsSummary{ hash: hashJoined(keys), count: len(keys), } } // SummarizeVertexModels hashes Vertex-compatible model aliases for change detection. func SummarizeVertexModels(models []config.VertexCompatModel) VertexModelsSummary { if len(models) == 0 { return VertexModelsSummary{} } names := make([]string, 0, len(models)) for _, model := range models { name := strings.TrimSpace(model.Name) alias := strings.TrimSpace(model.Alias) if name == "" && alias == "" { continue } if alias != "" { name = alias } names = append(names, name) } if len(names) == 0 { return VertexModelsSummary{} } sort.Strings(names) sum := sha256.Sum256([]byte(strings.Join(names, "|"))) return VertexModelsSummary{ hash: hex.EncodeToString(sum[:]), count: len(names), } }