in bedrock/bedrock.go [191:245]
func bedrockMiddleware(signer *v4.Signer, cfg aws.Config) option.Middleware {
return func(r *http.Request, next option.MiddlewareNext) (res *http.Response, err error) {
var body []byte
if r.Body != nil {
body, err = io.ReadAll(r.Body)
if err != nil {
return nil, err
}
r.Body.Close()
if !gjson.GetBytes(body, "anthropic_version").Exists() {
body, _ = sjson.SetBytes(body, "anthropic_version", DefaultVersion)
}
if r.Method == http.MethodPost && DefaultEndpoints[r.URL.Path] {
model := gjson.GetBytes(body, "model").String()
stream := gjson.GetBytes(body, "stream").Bool()
body, _ = sjson.DeleteBytes(body, "model")
body, _ = sjson.DeleteBytes(body, "stream")
var path string
if stream {
path = fmt.Sprintf("/model/%s/invoke-with-response-stream", model)
} else {
path = fmt.Sprintf("/model/%s/invoke", model)
}
r.URL.Path = path
}
reader := bytes.NewReader(body)
r.Body = io.NopCloser(reader)
r.GetBody = func() (io.ReadCloser, error) {
_, err := reader.Seek(0, 0)
return io.NopCloser(reader), err
}
r.ContentLength = int64(len(body))
}
ctx := r.Context()
credentials, err := cfg.Credentials.Retrieve(ctx)
if err != nil {
return nil, err
}
hash := sha256.Sum256(body)
err = signer.SignHTTP(ctx, credentials, r, hex.EncodeToString(hash[:]), "bedrock", cfg.Region, time.Now())
if err != nil {
return nil, err
}
return next(r)
}
}