feat(config): support excluded vertex models in config
This commit is contained in:
@@ -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
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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))
|
||||||
|
|||||||
@@ -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))
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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":
|
||||||
|
|||||||
Reference in New Issue
Block a user