feat(config): add per-key model blacklist for providers

This commit is contained in:
hkfires
2025-11-27 21:57:07 +08:00
parent 72c7ef7647
commit f8cebb9343
4 changed files with 138 additions and 2 deletions

View File

@@ -157,6 +157,9 @@ type ClaudeKey struct {
// Headers optionally adds extra HTTP headers for requests sent with this key.
Headers map[string]string `yaml:"headers,omitempty" json:"headers,omitempty"`
// ModelBlacklist lists model IDs that should be excluded for this provider.
ModelBlacklist []string `yaml:"model-blacklist,omitempty" json:"model-blacklist,omitempty"`
}
// ClaudeModel describes a mapping between an alias and the actual upstream model name.
@@ -183,6 +186,9 @@ type CodexKey struct {
// Headers optionally adds extra HTTP headers for requests sent with this key.
Headers map[string]string `yaml:"headers,omitempty" json:"headers,omitempty"`
// ModelBlacklist lists model IDs that should be excluded for this provider.
ModelBlacklist []string `yaml:"model-blacklist,omitempty" json:"model-blacklist,omitempty"`
}
// GeminiKey represents the configuration for a Gemini API key,
@@ -199,6 +205,9 @@ type GeminiKey struct {
// Headers optionally adds extra HTTP headers for requests sent with this key.
Headers map[string]string `yaml:"headers,omitempty" json:"headers,omitempty"`
// ModelBlacklist lists model IDs that should be excluded for this provider.
ModelBlacklist []string `yaml:"model-blacklist,omitempty" json:"model-blacklist,omitempty"`
}
// OpenAICompatibility represents the configuration for OpenAI API compatibility

View File

@@ -450,6 +450,28 @@ func computeClaudeModelsHash(models []config.ClaudeModel) string {
return hex.EncodeToString(sum[:])
}
func computeModelBlacklistHash(blacklist []string) string {
if len(blacklist) == 0 {
return ""
}
normalized := make([]string, 0, len(blacklist))
for _, entry := range blacklist {
if trimmed := strings.TrimSpace(entry); trimmed != "" {
normalized = append(normalized, strings.ToLower(trimmed))
}
}
if len(normalized) == 0 {
return ""
}
sort.Strings(normalized)
data, err := json.Marshal(normalized)
if err != nil || len(data) == 0 {
return ""
}
sum := sha256.Sum256(data)
return hex.EncodeToString(sum[:])
}
// SetClients sets the file-based clients.
// SetClients removed
// SetAPIKeyClients removed
@@ -838,6 +860,9 @@ func (w *Watcher) SnapshotCoreAuths() []*coreauth.Auth {
if base != "" {
attrs["base_url"] = base
}
if hash := computeModelBlacklistHash(entry.ModelBlacklist); hash != "" {
attrs["model_blacklist_hash"] = hash
}
addConfigHeadersToAttrs(entry.Headers, attrs)
a := &coreauth.Auth{
ID: id,
@@ -870,6 +895,9 @@ func (w *Watcher) SnapshotCoreAuths() []*coreauth.Auth {
if hash := computeClaudeModelsHash(ck.Models); hash != "" {
attrs["models_hash"] = hash
}
if hash := computeModelBlacklistHash(ck.ModelBlacklist); hash != "" {
attrs["model_blacklist_hash"] = hash
}
addConfigHeadersToAttrs(ck.Headers, attrs)
proxyURL := strings.TrimSpace(ck.ProxyURL)
a := &coreauth.Auth{
@@ -899,6 +927,9 @@ func (w *Watcher) SnapshotCoreAuths() []*coreauth.Auth {
if ck.BaseURL != "" {
attrs["base_url"] = ck.BaseURL
}
if hash := computeModelBlacklistHash(ck.ModelBlacklist); hash != "" {
attrs["model_blacklist_hash"] = hash
}
addConfigHeadersToAttrs(ck.Headers, attrs)
proxyURL := strings.TrimSpace(ck.ProxyURL)
a := &coreauth.Auth{