mirror of
https://github.com/router-for-me/CLIProxyAPI.git
synced 2026-02-03 13:00:52 +08:00
Introduce formatProxyURL helper to sanitize proxy addresses before logging, stripping credentials and path components while preserving host information. Rework model hash computation to sort and deduplicate name/alias pairs with case normalization, ensuring consistent output regardless of input ordering. Add signature-based identification for anonymous OpenAI-compatible provider entries to maintain stable keys across configuration reloads. Replace direct stdout prints with structured logger calls for file change notifications.
103 lines
2.7 KiB
Go
103 lines
2.7 KiB
Go
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[:])
|
|
}
|