feat(diff): add support for model prefix changes in config diff logic

Enhance the configuration diff logic to include detection and reporting of `prefix` changes for all model types. Update related struct naming for consistency across the watcher module.
This commit is contained in:
Luis Pater
2025-12-17 02:05:03 +08:00
parent 26a5f67df2
commit d02bf9c243
2 changed files with 28 additions and 16 deletions

View File

@@ -81,6 +81,9 @@ func BuildConfigChangeDetails(oldCfg, newCfg *config.Config) []string {
if strings.TrimSpace(o.ProxyURL) != strings.TrimSpace(n.ProxyURL) { if strings.TrimSpace(o.ProxyURL) != strings.TrimSpace(n.ProxyURL) {
changes = append(changes, fmt.Sprintf("gemini[%d].proxy-url: %s -> %s", i, formatProxyURL(o.ProxyURL), formatProxyURL(n.ProxyURL))) changes = append(changes, fmt.Sprintf("gemini[%d].proxy-url: %s -> %s", i, formatProxyURL(o.ProxyURL), formatProxyURL(n.ProxyURL)))
} }
if strings.TrimSpace(o.Prefix) != strings.TrimSpace(n.Prefix) {
changes = append(changes, fmt.Sprintf("gemini[%d].prefix: %s -> %s", i, formatProxyURL(o.Prefix), formatProxyURL(n.Prefix)))
}
if strings.TrimSpace(o.APIKey) != strings.TrimSpace(n.APIKey) { if strings.TrimSpace(o.APIKey) != strings.TrimSpace(n.APIKey) {
changes = append(changes, fmt.Sprintf("gemini[%d].api-key: updated", i)) changes = append(changes, fmt.Sprintf("gemini[%d].api-key: updated", i))
} }
@@ -108,6 +111,9 @@ func BuildConfigChangeDetails(oldCfg, newCfg *config.Config) []string {
if strings.TrimSpace(o.ProxyURL) != strings.TrimSpace(n.ProxyURL) { if strings.TrimSpace(o.ProxyURL) != strings.TrimSpace(n.ProxyURL) {
changes = append(changes, fmt.Sprintf("claude[%d].proxy-url: %s -> %s", i, formatProxyURL(o.ProxyURL), formatProxyURL(n.ProxyURL))) changes = append(changes, fmt.Sprintf("claude[%d].proxy-url: %s -> %s", i, formatProxyURL(o.ProxyURL), formatProxyURL(n.ProxyURL)))
} }
if strings.TrimSpace(o.Prefix) != strings.TrimSpace(n.Prefix) {
changes = append(changes, fmt.Sprintf("claude[%d].prefix: %s -> %s", i, formatProxyURL(o.Prefix), formatProxyURL(n.Prefix)))
}
if strings.TrimSpace(o.APIKey) != strings.TrimSpace(n.APIKey) { if strings.TrimSpace(o.APIKey) != strings.TrimSpace(n.APIKey) {
changes = append(changes, fmt.Sprintf("claude[%d].api-key: updated", i)) changes = append(changes, fmt.Sprintf("claude[%d].api-key: updated", i))
} }
@@ -135,6 +141,9 @@ func BuildConfigChangeDetails(oldCfg, newCfg *config.Config) []string {
if strings.TrimSpace(o.ProxyURL) != strings.TrimSpace(n.ProxyURL) { if strings.TrimSpace(o.ProxyURL) != strings.TrimSpace(n.ProxyURL) {
changes = append(changes, fmt.Sprintf("codex[%d].proxy-url: %s -> %s", i, formatProxyURL(o.ProxyURL), formatProxyURL(n.ProxyURL))) changes = append(changes, fmt.Sprintf("codex[%d].proxy-url: %s -> %s", i, formatProxyURL(o.ProxyURL), formatProxyURL(n.ProxyURL)))
} }
if strings.TrimSpace(o.Prefix) != strings.TrimSpace(n.Prefix) {
changes = append(changes, fmt.Sprintf("codex[%d].prefix: %s -> %s", i, formatProxyURL(o.Prefix), formatProxyURL(n.Prefix)))
}
if strings.TrimSpace(o.APIKey) != strings.TrimSpace(n.APIKey) { if strings.TrimSpace(o.APIKey) != strings.TrimSpace(n.APIKey) {
changes = append(changes, fmt.Sprintf("codex[%d].api-key: updated", i)) changes = append(changes, fmt.Sprintf("codex[%d].api-key: updated", i))
} }
@@ -225,6 +234,9 @@ func BuildConfigChangeDetails(oldCfg, newCfg *config.Config) []string {
if strings.TrimSpace(o.ProxyURL) != strings.TrimSpace(n.ProxyURL) { if strings.TrimSpace(o.ProxyURL) != strings.TrimSpace(n.ProxyURL) {
changes = append(changes, fmt.Sprintf("vertex[%d].proxy-url: %s -> %s", i, formatProxyURL(o.ProxyURL), formatProxyURL(n.ProxyURL))) changes = append(changes, fmt.Sprintf("vertex[%d].proxy-url: %s -> %s", i, formatProxyURL(o.ProxyURL), formatProxyURL(n.ProxyURL)))
} }
if strings.TrimSpace(o.Prefix) != strings.TrimSpace(n.Prefix) {
changes = append(changes, fmt.Sprintf("vertex[%d].prefix: %s -> %s", i, formatProxyURL(o.Prefix), formatProxyURL(n.Prefix)))
}
if strings.TrimSpace(o.APIKey) != strings.TrimSpace(n.APIKey) { if strings.TrimSpace(o.APIKey) != strings.TrimSpace(n.APIKey) {
changes = append(changes, fmt.Sprintf("vertex[%d].api-key: updated", i)) changes = append(changes, fmt.Sprintf("vertex[%d].api-key: updated", i))
} }

View File

@@ -10,15 +10,15 @@ import (
"github.com/router-for-me/CLIProxyAPI/v6/internal/config" "github.com/router-for-me/CLIProxyAPI/v6/internal/config"
) )
type excludedModelsSummary struct { type ExcludedModelsSummary struct {
hash string hash string
count int count int
} }
// SummarizeExcludedModels normalizes and hashes an excluded-model list. // SummarizeExcludedModels normalizes and hashes an excluded-model list.
func SummarizeExcludedModels(list []string) excludedModelsSummary { func SummarizeExcludedModels(list []string) ExcludedModelsSummary {
if len(list) == 0 { if len(list) == 0 {
return excludedModelsSummary{} return ExcludedModelsSummary{}
} }
seen := make(map[string]struct{}, len(list)) seen := make(map[string]struct{}, len(list))
normalized := make([]string, 0, len(list)) normalized := make([]string, 0, len(list))
@@ -32,18 +32,18 @@ func SummarizeExcludedModels(list []string) excludedModelsSummary {
} }
} }
sort.Strings(normalized) sort.Strings(normalized)
return excludedModelsSummary{ return ExcludedModelsSummary{
hash: ComputeExcludedModelsHash(normalized), hash: ComputeExcludedModelsHash(normalized),
count: len(normalized), count: len(normalized),
} }
} }
// SummarizeOAuthExcludedModels summarizes OAuth excluded models per provider. // SummarizeOAuthExcludedModels summarizes OAuth excluded models per provider.
func SummarizeOAuthExcludedModels(entries map[string][]string) map[string]excludedModelsSummary { func SummarizeOAuthExcludedModels(entries map[string][]string) map[string]ExcludedModelsSummary {
if len(entries) == 0 { if len(entries) == 0 {
return nil return nil
} }
out := make(map[string]excludedModelsSummary, len(entries)) out := make(map[string]ExcludedModelsSummary, len(entries))
for k, v := range entries { for k, v := range entries {
key := strings.ToLower(strings.TrimSpace(k)) key := strings.ToLower(strings.TrimSpace(k))
if key == "" { if key == "" {
@@ -87,15 +87,15 @@ func DiffOAuthExcludedModelChanges(oldMap, newMap map[string][]string) ([]string
return changes, affected return changes, affected
} }
type ampModelMappingsSummary struct { type AmpModelMappingsSummary struct {
hash string hash string
count int count int
} }
// SummarizeAmpModelMappings hashes Amp model mappings for change detection. // SummarizeAmpModelMappings hashes Amp model mappings for change detection.
func SummarizeAmpModelMappings(mappings []config.AmpModelMapping) ampModelMappingsSummary { func SummarizeAmpModelMappings(mappings []config.AmpModelMapping) AmpModelMappingsSummary {
if len(mappings) == 0 { if len(mappings) == 0 {
return ampModelMappingsSummary{} return AmpModelMappingsSummary{}
} }
entries := make([]string, 0, len(mappings)) entries := make([]string, 0, len(mappings))
for _, mapping := range mappings { for _, mapping := range mappings {
@@ -107,25 +107,25 @@ func SummarizeAmpModelMappings(mappings []config.AmpModelMapping) ampModelMappin
entries = append(entries, from+"->"+to) entries = append(entries, from+"->"+to)
} }
if len(entries) == 0 { if len(entries) == 0 {
return ampModelMappingsSummary{} return AmpModelMappingsSummary{}
} }
sort.Strings(entries) sort.Strings(entries)
sum := sha256.Sum256([]byte(strings.Join(entries, "|"))) sum := sha256.Sum256([]byte(strings.Join(entries, "|")))
return ampModelMappingsSummary{ return AmpModelMappingsSummary{
hash: hex.EncodeToString(sum[:]), hash: hex.EncodeToString(sum[:]),
count: len(entries), count: len(entries),
} }
} }
type vertexModelsSummary struct { type VertexModelsSummary struct {
hash string hash string
count int count int
} }
// SummarizeVertexModels hashes vertex-compatible models for change detection. // SummarizeVertexModels hashes vertex-compatible models for change detection.
func SummarizeVertexModels(models []config.VertexCompatModel) vertexModelsSummary { func SummarizeVertexModels(models []config.VertexCompatModel) VertexModelsSummary {
if len(models) == 0 { if len(models) == 0 {
return vertexModelsSummary{} return VertexModelsSummary{}
} }
names := make([]string, 0, len(models)) names := make([]string, 0, len(models))
for _, m := range models { for _, m := range models {
@@ -140,11 +140,11 @@ func SummarizeVertexModels(models []config.VertexCompatModel) vertexModelsSummar
names = append(names, name) names = append(names, name)
} }
if len(names) == 0 { if len(names) == 0 {
return vertexModelsSummary{} return VertexModelsSummary{}
} }
sort.Strings(names) sort.Strings(names)
sum := sha256.Sum256([]byte(strings.Join(names, "|"))) sum := sha256.Sum256([]byte(strings.Join(names, "|")))
return vertexModelsSummary{ return VertexModelsSummary{
hash: hex.EncodeToString(sum[:]), hash: hex.EncodeToString(sum[:]),
count: len(names), count: len(names),
} }