@@ -31,8 +31,10 @@ type (
3131 routerFilter struct {
3232 fc * routerFilterConfig
3333 endpoint endpoint
34+ originalHeaders map [string ]string
3435 originalRequestBody interface {}
3536 originalRequestBodyRaw []byte
37+ attemptCount int
3638 }
3739)
3840
@@ -118,17 +120,17 @@ func (f *routerFilter) RequestBody(e sdk.EnvoyHTTPFilter, endOfStream bool) sdk.
118120 var modelName string
119121 switch f .endpoint {
120122 case chatCompletionsEndpoint :
121- parsed , modelName , err = modelBodyParser (raw , func (req * openai.ChatCompletionRequest ) string { return req .Model })
123+ parsed , modelName , err = parseBodyWithModel (raw , func (req * openai.ChatCompletionRequest ) string { return req .Model })
122124 case completionsEndpoint :
123- parsed , modelName , err = modelBodyParser (raw , func (req * openai.CompletionRequest ) string { return req .Model })
125+ parsed , modelName , err = parseBodyWithModel (raw , func (req * openai.CompletionRequest ) string { return req .Model })
124126 case embeddingsEndpoint :
125- parsed , modelName , err = modelBodyParser (raw , func (req * openai.EmbeddingRequest ) string { return req .Model })
127+ parsed , modelName , err = parseBodyWithModel (raw , func (req * openai.EmbeddingRequest ) string { return req .Model })
126128 case imagesGenerationsEndpoint :
127- parsed , modelName , err = modelBodyParser (raw , func (req * openaisdk.ImageGenerateParams ) string { return req .Model })
129+ parsed , modelName , err = parseBodyWithModel (raw , func (req * openaisdk.ImageGenerateParams ) string { return req .Model })
128130 case rerankEndpoint :
129- parsed , modelName , err = modelBodyParser (raw , func (req * cohereschema.RerankV2Request ) string { return req .Model })
131+ parsed , modelName , err = parseBodyWithModel (raw , func (req * cohereschema.RerankV2Request ) string { return req .Model })
130132 case messagesEndpoint :
131- parsed , modelName , err = modelBodyParser (raw , func (req * anthropic.MessagesRequest ) string { return req .GetModel () })
133+ parsed , modelName , err = parseBodyWithModel (raw , func (req * anthropic.MessagesRequest ) string { return req .GetModel () })
132134 default :
133135 e .SendLocalReply (500 , nil , []byte ("BUG: unsupported endpoint at body parsing: " + fmt .Sprintf ("%d" , f .endpoint )))
134136 }
@@ -144,6 +146,8 @@ func (f *routerFilter) RequestBody(e sdk.EnvoyHTTPFilter, endOfStream bool) sdk.
144146 // Store the pointer to the filter in dynamic metadata for later retrieval in the upstream filter.
145147 e .SetDynamicMetadataString (internalapi .AIGatewayFilterMetadataNamespace , routerFilterPointerDynamicMetadataKey ,
146148 fmt .Sprintf ("%d" , uintptr (unsafe .Pointer (f ))))
149+
150+ f .originalHeaders = multiValueHeadersToSingleValue (e .GetRequestHeaders ())
147151 return sdk .RequestBodyStatusContinue
148152}
149153
@@ -168,10 +172,21 @@ func (f *routerFilter) handleModelsEndpoint(e sdk.EnvoyHTTPFilter) sdk.RequestHe
168172 return sdk .RequestHeadersStatusStopIteration
169173}
170174
171- func modelBodyParser [T any ](body []byte , modelExtractFn func (req * T ) string ) (interface {}, string , error ) {
175+ func parseBodyWithModel [T any ](body []byte , modelExtractFn func (req * T ) string ) (interface {}, string , error ) {
172176 var req T
173177 if err := json .Unmarshal (body , & req ); err != nil {
174178 return nil , "" , fmt .Errorf ("failed to unmarshal body: %w" , err )
175179 }
176180 return req , modelExtractFn (& req ), nil
177181}
182+
183+ // multiValueHeadersToSingleValue converts a map of headers with multiple values to a map of headers with single values by taking the first value for each header.
184+ //
185+ // TODO: this is purely for feature parity with the old filter where we ignore the case of multiple header values.
186+ func multiValueHeadersToSingleValue (headers map [string ][]string ) map [string ]string {
187+ singleValueHeaders := make (map [string ]string , len (headers ))
188+ for k , v := range headers {
189+ singleValueHeaders [k ] = v [0 ]
190+ }
191+ return singleValueHeaders
192+ }
0 commit comments