102 lines · 2.7 KB · Go
RawDownload
package diff import (	"crypto/sha256"	"encoding/hex"	"encoding/json"	"sort"	"strings" 	"github.com/router-for-me/CLIProxyAPI/v6/internal/config") // ComputeOpenAICompatModelsHash returns a stable hash for OpenAI-compat models.// Used to detect model list changes during hot reload.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)} // ComputeVertexCompatModelsHash returns a stable hash for Vertex-compatible models.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)} // ComputeClaudeModelsHash returns a stable hash for Claude model aliases.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)} // ComputeExcludedModelsHash returns a normalized hash for excluded model lists.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[:])}