feat(config): support excluded vertex models in config

This commit is contained in:
hkfires
2026-03-04 18:47:42 +08:00
parent 5c84d69d42
commit 48ffc4dee7
6 changed files with 29 additions and 9 deletions
+3
View File
@@ -201,6 +201,9 @@ nonstream-keepalive-interval: 0
# alias: "vertex-flash" # client-visible alias # alias: "vertex-flash" # client-visible alias
# - name: "gemini-2.5-pro" # - name: "gemini-2.5-pro"
# alias: "vertex-pro" # alias: "vertex-pro"
# excluded-models: # optional: models to exclude from listing
# - "imagen-3.0-generate-002"
# - "imagen-*"
# Amp Integration # Amp Integration
# ampcode: # ampcode:
@@ -516,12 +516,13 @@ func (h *Handler) PutVertexCompatKeys(c *gin.Context) {
} }
func (h *Handler) PatchVertexCompatKey(c *gin.Context) { func (h *Handler) PatchVertexCompatKey(c *gin.Context) {
type vertexCompatPatch struct { type vertexCompatPatch struct {
APIKey *string `json:"api-key"` APIKey *string `json:"api-key"`
Prefix *string `json:"prefix"` Prefix *string `json:"prefix"`
BaseURL *string `json:"base-url"` BaseURL *string `json:"base-url"`
ProxyURL *string `json:"proxy-url"` ProxyURL *string `json:"proxy-url"`
Headers *map[string]string `json:"headers"` Headers *map[string]string `json:"headers"`
Models *[]config.VertexCompatModel `json:"models"` Models *[]config.VertexCompatModel `json:"models"`
ExcludedModels *[]string `json:"excluded-models"`
} }
var body struct { var body struct {
Index *int `json:"index"` Index *int `json:"index"`
@@ -585,6 +586,9 @@ func (h *Handler) PatchVertexCompatKey(c *gin.Context) {
if body.Value.Models != nil { if body.Value.Models != nil {
entry.Models = append([]config.VertexCompatModel(nil), (*body.Value.Models)...) entry.Models = append([]config.VertexCompatModel(nil), (*body.Value.Models)...)
} }
if body.Value.ExcludedModels != nil {
entry.ExcludedModels = config.NormalizeExcludedModels(*body.Value.ExcludedModels)
}
normalizeVertexCompatKey(&entry) normalizeVertexCompatKey(&entry)
h.cfg.VertexCompatAPIKey[targetIndex] = entry h.cfg.VertexCompatAPIKey[targetIndex] = entry
h.cfg.SanitizeVertexCompatKeys() h.cfg.SanitizeVertexCompatKeys()
@@ -1025,6 +1029,7 @@ func normalizeVertexCompatKey(entry *config.VertexCompatKey) {
entry.BaseURL = strings.TrimSpace(entry.BaseURL) entry.BaseURL = strings.TrimSpace(entry.BaseURL)
entry.ProxyURL = strings.TrimSpace(entry.ProxyURL) entry.ProxyURL = strings.TrimSpace(entry.ProxyURL)
entry.Headers = config.NormalizeHeaders(entry.Headers) entry.Headers = config.NormalizeHeaders(entry.Headers)
entry.ExcludedModels = config.NormalizeExcludedModels(entry.ExcludedModels)
if len(entry.Models) == 0 { if len(entry.Models) == 0 {
return return
} }
+4
View File
@@ -34,6 +34,9 @@ type VertexCompatKey struct {
// Models defines the model configurations including aliases for routing. // Models defines the model configurations including aliases for routing.
Models []VertexCompatModel `yaml:"models,omitempty" json:"models,omitempty"` Models []VertexCompatModel `yaml:"models,omitempty" json:"models,omitempty"`
// ExcludedModels lists model IDs that should be excluded for this provider.
ExcludedModels []string `yaml:"excluded-models,omitempty" json:"excluded-models,omitempty"`
} }
func (k VertexCompatKey) GetAPIKey() string { return k.APIKey } func (k VertexCompatKey) GetAPIKey() string { return k.APIKey }
@@ -74,6 +77,7 @@ func (cfg *Config) SanitizeVertexCompatKeys() {
} }
entry.ProxyURL = strings.TrimSpace(entry.ProxyURL) entry.ProxyURL = strings.TrimSpace(entry.ProxyURL)
entry.Headers = NormalizeHeaders(entry.Headers) entry.Headers = NormalizeHeaders(entry.Headers)
entry.ExcludedModels = NormalizeExcludedModels(entry.ExcludedModels)
// Sanitize models: remove entries without valid alias // Sanitize models: remove entries without valid alias
sanitizedModels := make([]VertexCompatModel, 0, len(entry.Models)) sanitizedModels := make([]VertexCompatModel, 0, len(entry.Models))
+5
View File
@@ -304,6 +304,11 @@ func BuildConfigChangeDetails(oldCfg, newCfg *config.Config) []string {
if oldModels.hash != newModels.hash { if oldModels.hash != newModels.hash {
changes = append(changes, fmt.Sprintf("vertex[%d].models: updated (%d -> %d entries)", i, oldModels.count, newModels.count)) changes = append(changes, fmt.Sprintf("vertex[%d].models: updated (%d -> %d entries)", i, oldModels.count, newModels.count))
} }
oldExcluded := SummarizeExcludedModels(o.ExcludedModels)
newExcluded := SummarizeExcludedModels(n.ExcludedModels)
if oldExcluded.hash != newExcluded.hash {
changes = append(changes, fmt.Sprintf("vertex[%d].excluded-models: updated (%d -> %d entries)", i, oldExcluded.count, newExcluded.count))
}
if !equalStringMap(o.Headers, n.Headers) { if !equalStringMap(o.Headers, n.Headers) {
changes = append(changes, fmt.Sprintf("vertex[%d].headers: updated", i)) changes = append(changes, fmt.Sprintf("vertex[%d].headers: updated", i))
} }
+1 -1
View File
@@ -315,7 +315,7 @@ func (s *ConfigSynthesizer) synthesizeVertexCompat(ctx *SynthesisContext) []*cor
CreatedAt: now, CreatedAt: now,
UpdatedAt: now, UpdatedAt: now,
} }
ApplyAuthExcludedModelsMeta(a, cfg, nil, "apikey") ApplyAuthExcludedModelsMeta(a, cfg, compat.ExcludedModels, "apikey")
out = append(out, a) out = append(out, a)
} }
return out return out
+5 -2
View File
@@ -791,10 +791,13 @@ func (s *Service) registerModelsForAuth(a *coreauth.Auth) {
case "vertex": case "vertex":
// Vertex AI Gemini supports the same model identifiers as Gemini. // Vertex AI Gemini supports the same model identifiers as Gemini.
models = registry.GetGeminiVertexModels() models = registry.GetGeminiVertexModels()
if authKind == "apikey" { if entry := s.resolveConfigVertexCompatKey(a); entry != nil {
if entry := s.resolveConfigVertexCompatKey(a); entry != nil && len(entry.Models) > 0 { if len(entry.Models) > 0 {
models = buildVertexCompatConfigModels(entry) models = buildVertexCompatConfigModels(entry)
} }
if authKind == "apikey" {
excluded = entry.ExcludedModels
}
} }
models = applyExcludedModels(models, excluded) models = applyExcludedModels(models, excluded)
case "gemini-cli": case "gemini-cli":