@@ -134,7 +134,43 @@ func (fh *FallbackHandler) WrapHandler(handler gin.HandlerFunc) gin.HandlerFunc
134134 }
135135
136136 // Normalize model (handles dynamic thinking suffixes)
137- normalizedModel , _ := util .NormalizeThinkingModel (modelName )
137+ normalizedModel , thinkingMetadata := util .NormalizeThinkingModel (modelName )
138+ thinkingSuffix := ""
139+ if thinkingMetadata != nil && strings .HasPrefix (modelName , normalizedModel ) {
140+ thinkingSuffix = modelName [len (normalizedModel ):]
141+ }
142+
143+ resolveMappedModel := func () (string , []string ) {
144+ if fh .modelMapper == nil {
145+ return "" , nil
146+ }
147+
148+ mappedModel := fh .modelMapper .MapModel (modelName )
149+ if mappedModel == "" {
150+ mappedModel = fh .modelMapper .MapModel (normalizedModel )
151+ }
152+ mappedModel = strings .TrimSpace (mappedModel )
153+ if mappedModel == "" {
154+ return "" , nil
155+ }
156+
157+ // Preserve dynamic thinking suffix (e.g. "(xhigh)") when mapping applies, unless the target
158+ // already specifies its own thinking suffix.
159+ if thinkingSuffix != "" {
160+ _ , mappedThinkingMetadata := util .NormalizeThinkingModel (mappedModel )
161+ if mappedThinkingMetadata == nil {
162+ mappedModel += thinkingSuffix
163+ }
164+ }
165+
166+ mappedBaseModel , _ := util .NormalizeThinkingModel (mappedModel )
167+ mappedProviders := util .GetProviderName (mappedBaseModel )
168+ if len (mappedProviders ) == 0 {
169+ return "" , nil
170+ }
171+
172+ return mappedModel , mappedProviders
173+ }
138174
139175 // Track resolved model for logging (may change if mapping is applied)
140176 resolvedModel := normalizedModel
@@ -147,21 +183,15 @@ func (fh *FallbackHandler) WrapHandler(handler gin.HandlerFunc) gin.HandlerFunc
147183 if forceMappings {
148184 // FORCE MODE: Check model mappings FIRST (takes precedence over local API keys)
149185 // This allows users to route Amp requests to their preferred OAuth providers
150- if fh .modelMapper != nil {
151- if mappedModel := fh .modelMapper .MapModel (normalizedModel ); mappedModel != "" {
152- // Mapping found - check if we have a provider for the mapped model
153- mappedProviders := util .GetProviderName (mappedModel )
154- if len (mappedProviders ) > 0 {
155- // Mapping found and provider available - rewrite the model in request body
156- bodyBytes = rewriteModelInRequest (bodyBytes , mappedModel )
157- c .Request .Body = io .NopCloser (bytes .NewReader (bodyBytes ))
158- // Store mapped model in context for handlers that check it (like gemini bridge)
159- c .Set (MappedModelContextKey , mappedModel )
160- resolvedModel = mappedModel
161- usedMapping = true
162- providers = mappedProviders
163- }
164- }
186+ if mappedModel , mappedProviders := resolveMappedModel (); mappedModel != "" {
187+ // Mapping found and provider available - rewrite the model in request body
188+ bodyBytes = rewriteModelInRequest (bodyBytes , mappedModel )
189+ c .Request .Body = io .NopCloser (bytes .NewReader (bodyBytes ))
190+ // Store mapped model in context for handlers that check it (like gemini bridge)
191+ c .Set (MappedModelContextKey , mappedModel )
192+ resolvedModel = mappedModel
193+ usedMapping = true
194+ providers = mappedProviders
165195 }
166196
167197 // If no mapping applied, check for local providers
@@ -174,21 +204,15 @@ func (fh *FallbackHandler) WrapHandler(handler gin.HandlerFunc) gin.HandlerFunc
174204
175205 if len (providers ) == 0 {
176206 // No providers configured - check if we have a model mapping
177- if fh .modelMapper != nil {
178- if mappedModel := fh .modelMapper .MapModel (normalizedModel ); mappedModel != "" {
179- // Mapping found - check if we have a provider for the mapped model
180- mappedProviders := util .GetProviderName (mappedModel )
181- if len (mappedProviders ) > 0 {
182- // Mapping found and provider available - rewrite the model in request body
183- bodyBytes = rewriteModelInRequest (bodyBytes , mappedModel )
184- c .Request .Body = io .NopCloser (bytes .NewReader (bodyBytes ))
185- // Store mapped model in context for handlers that check it (like gemini bridge)
186- c .Set (MappedModelContextKey , mappedModel )
187- resolvedModel = mappedModel
188- usedMapping = true
189- providers = mappedProviders
190- }
191- }
207+ if mappedModel , mappedProviders := resolveMappedModel (); mappedModel != "" {
208+ // Mapping found and provider available - rewrite the model in request body
209+ bodyBytes = rewriteModelInRequest (bodyBytes , mappedModel )
210+ c .Request .Body = io .NopCloser (bytes .NewReader (bodyBytes ))
211+ // Store mapped model in context for handlers that check it (like gemini bridge)
212+ c .Set (MappedModelContextKey , mappedModel )
213+ resolvedModel = mappedModel
214+ usedMapping = true
215+ providers = mappedProviders
192216 }
193217 }
194218 }
@@ -222,14 +246,14 @@ func (fh *FallbackHandler) WrapHandler(handler gin.HandlerFunc) gin.HandlerFunc
222246 // Log: Model was mapped to another model
223247 log .Debugf ("amp model mapping: request %s -> %s" , normalizedModel , resolvedModel )
224248 logAmpRouting (RouteTypeModelMapping , modelName , resolvedModel , providerName , requestPath )
225- rewriter := NewResponseRewriter (c .Writer , normalizedModel )
249+ rewriter := NewResponseRewriter (c .Writer , modelName )
226250 c .Writer = rewriter
227251 // Filter Anthropic-Beta header only for local handling paths
228252 filterAntropicBetaHeader (c )
229253 c .Request .Body = io .NopCloser (bytes .NewReader (bodyBytes ))
230254 handler (c )
231255 rewriter .Flush ()
232- log .Debugf ("amp model mapping: response %s -> %s" , resolvedModel , normalizedModel )
256+ log .Debugf ("amp model mapping: response %s -> %s" , resolvedModel , modelName )
233257 } else if len (providers ) > 0 {
234258 // Log: Using local provider (free)
235259 logAmpRouting (RouteTypeLocalProvider , modelName , resolvedModel , providerName , requestPath )
0 commit comments