refactor(config): rename prioritize-model-mappings to force-model-mappings

This commit is contained in:
hkfires
2025-12-08 10:44:39 +08:00
parent 42e818ce05
commit 56ed0d8d90
7 changed files with 32 additions and 30 deletions

View File

@@ -134,6 +134,8 @@ ws-auth: false
# upstream-api-key: "" # upstream-api-key: ""
# # Restrict Amp management routes (/api/auth, /api/user, etc.) to localhost only (recommended) # # Restrict Amp management routes (/api/auth, /api/user, etc.) to localhost only (recommended)
# restrict-management-to-localhost: true # restrict-management-to-localhost: true
# # Force model mappings to run before checking local API keys (default: false)
# force-model-mappings: false
# # Amp Model Mappings # # Amp Model Mappings
# # Route unavailable Amp models to alternative models available in your local proxy. # # Route unavailable Amp models to alternative models available in your local proxy.
# # Useful when Amp CLI requests models you don't have access to (e.g., Claude Opus 4.5) # # Useful when Amp CLI requests models you don't have access to (e.g., Claude Opus 4.5)

View File

@@ -242,10 +242,10 @@ func (h *Handler) DeleteProxyURL(c *gin.Context) {
h.persist(c) h.persist(c)
} }
// Prioritize Model Mappings (for Amp CLI) // Force Model Mappings (for Amp CLI)
func (h *Handler) GetPrioritizeModelMappings(c *gin.Context) { func (h *Handler) GetForceModelMappings(c *gin.Context) {
c.JSON(200, gin.H{"prioritize-model-mappings": h.cfg.AmpCode.PrioritizeModelMappings}) c.JSON(200, gin.H{"force-model-mappings": h.cfg.AmpCode.ForceModelMappings})
} }
func (h *Handler) PutPrioritizeModelMappings(c *gin.Context) { func (h *Handler) PutForceModelMappings(c *gin.Context) {
h.updateBoolField(c, func(v bool) { h.cfg.AmpCode.PrioritizeModelMappings = v }) h.updateBoolField(c, func(v bool) { h.cfg.AmpCode.ForceModelMappings = v })
} }

View File

@@ -100,14 +100,14 @@ func (m *AmpModule) Name() string {
return "amp-routing" return "amp-routing"
} }
// getPrioritizeModelMappings returns whether model mappings should take precedence over local API keys // forceModelMappings returns whether model mappings should take precedence over local API keys
func (m *AmpModule) getPrioritizeModelMappings() bool { func (m *AmpModule) forceModelMappings() bool {
m.configMu.RLock() m.configMu.RLock()
defer m.configMu.RUnlock() defer m.configMu.RUnlock()
if m.lastConfig == nil { if m.lastConfig == nil {
return false return false
} }
return m.lastConfig.PrioritizeModelMappings return m.lastConfig.ForceModelMappings
} }
// Register sets up Amp routes if configured. // Register sets up Amp routes if configured.

View File

@@ -79,7 +79,7 @@ func logAmpRouting(routeType AmpRouteType, requestedModel, resolvedModel, provid
type FallbackHandler struct { type FallbackHandler struct {
getProxy func() *httputil.ReverseProxy getProxy func() *httputil.ReverseProxy
modelMapper ModelMapper modelMapper ModelMapper
getPrioritizeModelMappings func() bool forceModelMappings func() bool
} }
// NewFallbackHandler creates a new fallback handler wrapper // NewFallbackHandler creates a new fallback handler wrapper
@@ -87,19 +87,19 @@ type FallbackHandler struct {
func NewFallbackHandler(getProxy func() *httputil.ReverseProxy) *FallbackHandler { func NewFallbackHandler(getProxy func() *httputil.ReverseProxy) *FallbackHandler {
return &FallbackHandler{ return &FallbackHandler{
getProxy: getProxy, getProxy: getProxy,
getPrioritizeModelMappings: func() bool { return false }, forceModelMappings: func() bool { return false },
} }
} }
// NewFallbackHandlerWithMapper creates a new fallback handler with model mapping support // NewFallbackHandlerWithMapper creates a new fallback handler with model mapping support
func NewFallbackHandlerWithMapper(getProxy func() *httputil.ReverseProxy, mapper ModelMapper, getPrioritize func() bool) *FallbackHandler { func NewFallbackHandlerWithMapper(getProxy func() *httputil.ReverseProxy, mapper ModelMapper, forceModelMappings func() bool) *FallbackHandler {
if getPrioritize == nil { if forceModelMappings == nil {
getPrioritize = func() bool { return false } forceModelMappings = func() bool { return false }
} }
return &FallbackHandler{ return &FallbackHandler{
getProxy: getProxy, getProxy: getProxy,
modelMapper: mapper, modelMapper: mapper,
getPrioritizeModelMappings: getPrioritize, forceModelMappings: forceModelMappings,
} }
} }
@@ -141,11 +141,11 @@ func (fh *FallbackHandler) WrapHandler(handler gin.HandlerFunc) gin.HandlerFunc
usedMapping := false usedMapping := false
var providers []string var providers []string
// Check if model mappings should take priority over local API keys // Check if model mappings should be forced ahead of local API keys
prioritizeMappings := fh.getPrioritizeModelMappings != nil && fh.getPrioritizeModelMappings() forceMappings := fh.forceModelMappings != nil && fh.forceModelMappings()
if prioritizeMappings { if forceMappings {
// PRIORITY MODE: Check model mappings FIRST (takes precedence over local API keys) // FORCE MODE: Check model mappings FIRST (takes precedence over local API keys)
// This allows users to route Amp requests to their preferred OAuth providers // This allows users to route Amp requests to their preferred OAuth providers
if fh.modelMapper != nil { if fh.modelMapper != nil {
if mappedModel := fh.modelMapper.MapModel(normalizedModel); mappedModel != "" { if mappedModel := fh.modelMapper.MapModel(normalizedModel); mappedModel != "" {

View File

@@ -171,7 +171,7 @@ func (m *AmpModule) registerManagementRoutes(engine *gin.Engine, baseHandler *ha
geminiBridge := createGeminiBridgeHandler(geminiHandlers.GeminiHandler) geminiBridge := createGeminiBridgeHandler(geminiHandlers.GeminiHandler)
geminiV1Beta1Fallback := NewFallbackHandlerWithMapper(func() *httputil.ReverseProxy { geminiV1Beta1Fallback := NewFallbackHandlerWithMapper(func() *httputil.ReverseProxy {
return m.getProxy() return m.getProxy()
}, m.modelMapper, m.getPrioritizeModelMappings) }, m.modelMapper, m.forceModelMappings)
geminiV1Beta1Handler := geminiV1Beta1Fallback.WrapHandler(geminiBridge) geminiV1Beta1Handler := geminiV1Beta1Fallback.WrapHandler(geminiBridge)
// Route POST model calls through Gemini bridge with FallbackHandler. // Route POST model calls through Gemini bridge with FallbackHandler.
@@ -209,7 +209,7 @@ func (m *AmpModule) registerProviderAliases(engine *gin.Engine, baseHandler *han
// Also includes model mapping support for routing unavailable models to alternatives // Also includes model mapping support for routing unavailable models to alternatives
fallbackHandler := NewFallbackHandlerWithMapper(func() *httputil.ReverseProxy { fallbackHandler := NewFallbackHandlerWithMapper(func() *httputil.ReverseProxy {
return m.getProxy() return m.getProxy()
}, m.modelMapper, m.getPrioritizeModelMappings) }, m.modelMapper, m.forceModelMappings)
// Provider-specific routes under /api/provider/:provider // Provider-specific routes under /api/provider/:provider
ampProviders := engine.Group("/api/provider") ampProviders := engine.Group("/api/provider")

View File

@@ -520,9 +520,9 @@ func (s *Server) registerManagementRoutes() {
mgmt.PUT("/ws-auth", s.mgmt.PutWebsocketAuth) mgmt.PUT("/ws-auth", s.mgmt.PutWebsocketAuth)
mgmt.PATCH("/ws-auth", s.mgmt.PutWebsocketAuth) mgmt.PATCH("/ws-auth", s.mgmt.PutWebsocketAuth)
mgmt.GET("/prioritize-model-mappings", s.mgmt.GetPrioritizeModelMappings) mgmt.GET("/force-model-mappings", s.mgmt.GetForceModelMappings)
mgmt.PUT("/prioritize-model-mappings", s.mgmt.PutPrioritizeModelMappings) mgmt.PUT("/force-model-mappings", s.mgmt.PutForceModelMappings)
mgmt.PATCH("/prioritize-model-mappings", s.mgmt.PutPrioritizeModelMappings) mgmt.PATCH("/force-model-mappings", s.mgmt.PutForceModelMappings)
mgmt.GET("/request-retry", s.mgmt.GetRequestRetry) mgmt.GET("/request-retry", s.mgmt.GetRequestRetry)
mgmt.PUT("/request-retry", s.mgmt.PutRequestRetry) mgmt.PUT("/request-retry", s.mgmt.PutRequestRetry)

View File

@@ -144,9 +144,9 @@ type AmpCode struct {
// allow routing to an alternative model that IS available. // allow routing to an alternative model that IS available.
ModelMappings []AmpModelMapping `yaml:"model-mappings" json:"model-mappings"` ModelMappings []AmpModelMapping `yaml:"model-mappings" json:"model-mappings"`
// PrioritizeModelMappings when true, model mappings take precedence over local API keys. // ForceModelMappings when true, model mappings take precedence over local API keys.
// When false (default), local API keys are used first if available. // When false (default), local API keys are used first if available.
PrioritizeModelMappings bool `yaml:"prioritize-model-mappings" json:"prioritize-model-mappings"` ForceModelMappings bool `yaml:"force-model-mappings" json:"force-model-mappings"`
} }
// PayloadConfig defines default and override parameter rules applied to provider payloads. // PayloadConfig defines default and override parameter rules applied to provider payloads.