diff --git a/plugins/wasm-go/extensions/ai-proxy/provider/bedrock.go b/plugins/wasm-go/extensions/ai-proxy/provider/bedrock.go index 1e4ceaddf..588a13659 100644 --- a/plugins/wasm-go/extensions/ai-proxy/provider/bedrock.go +++ b/plugins/wasm-go/extensions/ai-proxy/provider/bedrock.go @@ -13,6 +13,7 @@ import ( "hash/crc32" "io" "net/http" + "net/url" "strconv" "strings" "time" @@ -22,6 +23,8 @@ import ( "github.com/alibaba/higress/plugins/wasm-go/pkg/wrapper" "github.com/higress-group/proxy-wasm-go-sdk/proxywasm" "github.com/higress-group/proxy-wasm-go-sdk/proxywasm/types" + "github.com/tidwall/gjson" + "github.com/tidwall/sjson" ) const ( @@ -607,6 +610,11 @@ func (b *bedrockProvider) insertHttpContextMessage(body []byte, content string, } func (b *bedrockProvider) TransformRequestBodyHeaders(ctx wrapper.HttpContext, apiName ApiName, body []byte, headers http.Header) ([]byte, error) { + if gjson.GetBytes(body, "model").Exists() { + rawModel := gjson.GetBytes(body, "model").String() + encodedModel := url.QueryEscape(rawModel) + body, _ = sjson.SetBytes(body, "model", encodedModel) + } switch apiName { case ApiNameChatCompletion: return b.onChatCompletionRequestBody(ctx, body, headers) @@ -901,7 +909,6 @@ func (b *bedrockProvider) setAuthHeaders(body []byte, headers http.Header) { func (b *bedrockProvider) generateSignature(path, amzDate, dateStamp string, body []byte) string { hashedPayload := sha256Hex(body) - path = urlEncoding(path) endpoint := fmt.Sprintf(bedrockDefaultDomain, b.config.awsRegion) canonicalHeaders := fmt.Sprintf("host:%s\nx-amz-date:%s\n", endpoint, amzDate) @@ -918,16 +925,6 @@ func (b *bedrockProvider) generateSignature(path, amzDate, dateStamp string, bod return signature } -func urlEncoding(rawStr string) string { - encodedStr := strings.ReplaceAll(rawStr, ":", "%3A") - encodedStr = strings.ReplaceAll(encodedStr, "+", "%2B") - encodedStr = strings.ReplaceAll(encodedStr, "=", "%3D") - encodedStr = strings.ReplaceAll(encodedStr, "&", "%26") - encodedStr = strings.ReplaceAll(encodedStr, "$", "%24") - encodedStr = strings.ReplaceAll(encodedStr, "@", "%40") - return encodedStr -} - func getSignatureKey(key, dateStamp, region, service string) []byte { kDate := hmacSha256([]byte("AWS4"+key), dateStamp) kRegion := hmacSha256(kDate, region)