Skip to content

Commit 0db9813

Browse files
committed
Fix NoSuchMethodError for requestMetadata with older AWS SDK versions
- Add graceful fallback when requestMetadata() method is not available - Catch NoSuchMethodError and log debug message instead of crashing - Support both ConverseRequest and ConverseStreamRequest builders - Add documentation about AWS SDK version requirements (2.32.x+) Fixes #5063
1 parent 556391b commit 0db9813

File tree

2 files changed

+70
-8
lines changed

2 files changed

+70
-8
lines changed

models/spring-ai-bedrock-converse/src/main/java/org/springframework/ai/bedrock/converse/BedrockProxyChatModel.java

Lines changed: 55 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -526,15 +526,59 @@ else if (message.getMessageType() == MessageType.TOOL) {
526526
Map<String, String> requestMetadata = ConverseApiUtils
527527
.getRequestMetadata(prompt.getUserMessage().getMetadata());
528528

529-
return ConverseRequest.builder()
529+
ConverseRequest.Builder requestBuilder = ConverseRequest.builder()
530530
.modelId(updatedRuntimeOptions.getModel())
531531
.inferenceConfig(inferenceConfiguration)
532532
.messages(instructionMessages)
533533
.system(systemMessages)
534534
.additionalModelRequestFields(additionalModelRequestFields)
535-
.toolConfig(toolConfiguration)
536-
.requestMetadata(requestMetadata)
537-
.build();
535+
.toolConfig(toolConfiguration);
536+
537+
// Apply requestMetadata if the SDK supports it (AWS SDK >= 2.32.x)
538+
applyRequestMetadataIfSupported(requestBuilder, requestMetadata);
539+
540+
return requestBuilder.build();
541+
}
542+
543+
/**
544+
* Applies requestMetadata to the ConverseRequest.Builder if the AWS SDK version
545+
* supports it. The requestMetadata method was added in AWS SDK 2.32.x. For older SDK
546+
* versions, this method will log a debug message and skip setting the metadata.
547+
* @param builder the ConverseRequest.Builder to apply metadata to
548+
* @param requestMetadata the metadata map to apply
549+
*/
550+
private void applyRequestMetadataIfSupported(ConverseRequest.Builder builder, Map<String, String> requestMetadata) {
551+
if (requestMetadata == null || requestMetadata.isEmpty()) {
552+
return;
553+
}
554+
try {
555+
builder.requestMetadata(requestMetadata);
556+
}
557+
catch (NoSuchMethodError e) {
558+
logger.debug("requestMetadata is not supported by the current AWS SDK version. "
559+
+ "Upgrade to AWS SDK 2.32.x or later to use this feature. Metadata will be ignored.");
560+
}
561+
}
562+
563+
/**
564+
* Applies requestMetadata to the ConverseStreamRequest.Builder if the AWS SDK version
565+
* supports it. The requestMetadata method was added in AWS SDK 2.32.x. For older SDK
566+
* versions, this method will log a debug message and skip setting the metadata.
567+
* @param builder the ConverseStreamRequest.Builder to apply metadata to
568+
* @param requestMetadata the metadata map to apply
569+
*/
570+
private void applyRequestMetadataIfSupported(ConverseStreamRequest.Builder builder,
571+
Map<String, String> requestMetadata) {
572+
if (requestMetadata == null || requestMetadata.isEmpty()) {
573+
return;
574+
}
575+
try {
576+
builder.requestMetadata(requestMetadata);
577+
}
578+
catch (NoSuchMethodError e) {
579+
logger.debug("requestMetadata is not supported by the current AWS SDK version. "
580+
+ "Upgrade to AWS SDK 2.32.x or later to use this feature. Metadata will be ignored.");
581+
}
538582
}
539583

540584
private ContentBlock mapMediaToContentBlock(Media media) {
@@ -782,15 +826,18 @@ private Flux<ChatResponse> internalStream(Prompt prompt, ChatResponse perviousCh
782826

783827
observation.parentObservation(contextView.getOrDefault(ObservationThreadLocalAccessor.KEY, null)).start();
784828

785-
ConverseStreamRequest converseStreamRequest = ConverseStreamRequest.builder()
829+
ConverseStreamRequest.Builder streamRequestBuilder = ConverseStreamRequest.builder()
786830
.modelId(converseRequest.modelId())
787831
.inferenceConfig(converseRequest.inferenceConfig())
788832
.messages(converseRequest.messages())
789833
.system(converseRequest.system())
790834
.additionalModelRequestFields(converseRequest.additionalModelRequestFields())
791-
.toolConfig(converseRequest.toolConfig())
792-
.requestMetadata(converseRequest.requestMetadata())
793-
.build();
835+
.toolConfig(converseRequest.toolConfig());
836+
837+
// Apply requestMetadata if the SDK supports it (AWS SDK >= 2.32.x)
838+
applyRequestMetadataIfSupported(streamRequestBuilder, converseRequest.requestMetadata());
839+
840+
ConverseStreamRequest converseStreamRequest = streamRequestBuilder.build();
794841

795842
Usage accumulatedUsage = null;
796843
if (perviousChatResponse != null && perviousChatResponse.getMetadata() != null) {

spring-ai-docs/src/main/antora/modules/ROOT/pages/api/chat/bedrock-converse.adoc

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,21 @@ Refer to https://docs.aws.amazon.com/bedrock/latest/userguide/getting-started.ht
2929

3030
* Enable the Models to use: Go to link:https://us-east-1.console.aws.amazon.com/bedrock/home[Amazon Bedrock] and from the link:https://us-east-1.console.aws.amazon.com/bedrock/home?region=us-east-1#/modelaccess[Model Access] menu on the left, configure access to the models you are going to use.
3131

32+
=== AWS SDK Version Requirements
33+
34+
[IMPORTANT]
35+
====
36+
If your project manages its own AWS SDK dependencies (e.g., via AWS BOM or explicit version overrides), ensure you are using **AWS SDK for Java version 2.32.x or later** for full feature support.
37+
38+
Some features like `requestMetadata` (used for filtering invocation logs) require AWS SDK 2.32.x+.
39+
If you are using an older SDK version, these features will be gracefully disabled with a debug log message, but your application will continue to work.
40+
41+
If you encounter a `NoSuchMethodError` related to `requestMetadata`, check your dependency tree for conflicting AWS SDK versions:
42+
[source,bash]
43+
----
44+
mvn dependency:tree -Dincludes=software.amazon.awssdk
45+
----
46+
====
3247

3348
== Auto-configuration
3449

0 commit comments

Comments
 (0)