AWS Bedrock - Examples

Producer Examples

  • invokeTextModel: this operation will invoke a model from Bedrock. This is an example for both Titan Express and Titan Lite.

  • Java

  • XML

  • YAML

from("direct:invoke")
    .to("aws-bedrock://test?bedrockRuntimeClient=#amazonBedrockRuntimeClient&operation=invokeTextModel&modelId=amazon.titan-text-express-v1");
<route>
  <from uri="direct:invoke"/>
  <to uri="aws-bedrock://test?bedrockRuntimeClient=#amazonBedrockRuntimeClient&amp;operation=invokeTextModel&amp;modelId=amazon.titan-text-express-v1"/>
</route>
- route:
    from:
      uri: direct:invoke
      steps:
        - to:
            uri: aws-bedrock://test
            parameters:
              bedrockRuntimeClient: "#amazonBedrockRuntimeClient"
              operation: invokeTextModel
              modelId: amazon.titan-text-express-v1

and you can then send to the direct endpoint something like

Java-only: uses ProducerTemplate test API with complex JSON construction
        final Exchange result = template.send("direct:invoke", exchange -> {
            ObjectMapper mapper = new ObjectMapper();
            ObjectNode rootNode = mapper.createObjectNode();
            rootNode.put("inputText",
                    "User: Generate synthetic data for daily product sales in various categories - include row number, product name, category, date of sale and price. Produce output in JSON format. Count records and ensure there are no more than 5.");

            ArrayNode stopSequences = mapper.createArrayNode();
            stopSequences.add("User:");
            ObjectNode childNode = mapper.createObjectNode();
            childNode.put("maxTokenCount", 1024);
            childNode.put("stopSequences", stopSequences);
            childNode.put("temperature", 0).put("topP", 1);

            rootNode.put("textGenerationConfig", childNode);
            exchange.getMessage().setBody(mapper.writer().writeValueAsString(rootNode));
            exchange.getMessage().setHeader("CamelAwsBedrockContentType", "application/json");
            exchange.getMessage().setHeader("CamelAwsBedrockAcceptContentType", "application/json");
        });

where template is a ProducerTemplate.

  • invokeImageModel: this operation will invoke a model from Bedrock. This is an example for Titan Image Generator.

Java-only: uses unmarshal().base64() method chain and simple() expression builder
from("direct:invoke")
    .to("aws-bedrock://test?bedrockRuntimeClient=#amazonBedrockRuntimeClient&operation=invokeImageModel&modelId=amazon.titan-image-generator-v1")
    .split(body())
        .unmarshal().base64()
        .setHeader("CamelFileName", simple("image-${random(128)}.png"))
        .to("file:target/generated_images");

and you can then send to the direct endpoint something like

Java-only: uses ProducerTemplate test API with complex JSON construction
        final Exchange result = template.send("direct:send_titan_image", exchange -> {
            ObjectMapper mapper = new ObjectMapper();
            ObjectNode rootNode = mapper.createObjectNode();
            ObjectNode textParameter = mapper.createObjectNode();
            textParameter.putIfAbsent("text",
                    new TextNode("A Sci-fi camel running in the desert"));
            rootNode.putIfAbsent("textToImageParams", textParameter);
            rootNode.putIfAbsent("taskType", new TextNode("TEXT_IMAGE"));
            ObjectNode childNode = mapper.createObjectNode();
            childNode.putIfAbsent("numberOfImages", new IntNode(3));
            childNode.putIfAbsent("quality", new TextNode("standard"));
            childNode.putIfAbsent("cfgScale", new IntNode(8));
            childNode.putIfAbsent("height", new IntNode(512));
            childNode.putIfAbsent("width", new IntNode(512));
            childNode.putIfAbsent("seed", new IntNode(0));

            rootNode.putIfAbsent("imageGenerationConfig", childNode);

            exchange.getMessage().setBody(mapper.writer().writeValueAsString(rootNode));
            exchange.getMessage().setHeader("CamelAwsBedrockContentType", "application/json");
            exchange.getMessage().setHeader("CamelAwsBedrockAcceptContentType", "application/json");
        });

where template is a ProducerTemplate.

  • invokeEmbeddingsModel: this operation will invoke an Embeddings model from Bedrock. This is an example for Titan Embeddings G1.

  • Java

  • XML

  • YAML

from("direct:send_titan_embeddings")
    .to("aws-bedrock:label?useDefaultCredentialsProvider=true&region=us-east-1&operation=invokeEmbeddingsModel&modelId=amazon.titan-embed-text-v1")
    .to("mock:result");
<route>
  <from uri="direct:send_titan_embeddings"/>
  <to uri="aws-bedrock:label?useDefaultCredentialsProvider=true&amp;region=us-east-1&amp;operation=invokeEmbeddingsModel&amp;modelId=amazon.titan-embed-text-v1"/>
  <to uri="mock:result"/>
</route>
- route:
    from:
      uri: direct:send_titan_embeddings
      steps:
        - to:
            uri: aws-bedrock:label
            parameters:
              useDefaultCredentialsProvider: true
              region: us-east-1
              operation: invokeEmbeddingsModel
              modelId: amazon.titan-embed-text-v1
        - to:
            uri: mock:result

and you can then send to the direct endpoint something like

Java-only: uses ProducerTemplate test API with complex JSON construction
        final Exchange result = template.send("direct:send_titan_embeddings", exchange -> {
            ObjectMapper mapper = new ObjectMapper();
            ObjectNode rootNode = mapper.createObjectNode();
            rootNode.putIfAbsent("inputText",
                    new TextNode("A Sci-fi camel running in the desert"));

            exchange.getMessage().setBody(mapper.writer().writeValueAsString(rootNode));
            exchange.getMessage().setHeader("CamelAwsBedrockContentType", "application/json");
            exchange.getMessage().setHeader("CamelAwsBedrockAcceptContentType", "*/*");
        });

where template is a ProducerTemplate.

  • invokeTextModelStreaming (Complete Mode): this operation will invoke a model from Bedrock with streaming, accumulating the complete response.

  • Java

  • XML

  • YAML

from("direct:stream_complete")
    .to("aws-bedrock://test?useDefaultCredentialsProvider=true&region=us-east-1&operation=invokeTextModelStreaming&modelId=amazon.titan-text-express-v1&streamOutputMode=complete")
    .to("log:response");
<route>
  <from uri="direct:stream_complete"/>
  <to uri="aws-bedrock://test?useDefaultCredentialsProvider=true&amp;region=us-east-1&amp;operation=invokeTextModelStreaming&amp;modelId=amazon.titan-text-express-v1&amp;streamOutputMode=complete"/>
  <to uri="log:response"/>
</route>
- route:
    from:
      uri: direct:stream_complete
      steps:
        - to:
            uri: aws-bedrock://test
            parameters:
              useDefaultCredentialsProvider: true
              region: us-east-1
              operation: invokeTextModelStreaming
              modelId: amazon.titan-text-express-v1
              streamOutputMode: complete
        - to:
            uri: log:response

and you can then send to the direct endpoint something like

Java-only: uses ProducerTemplate test API with complex JSON construction
        final Exchange result = template.send("direct:stream_complete", exchange -> {
            ObjectMapper mapper = new ObjectMapper();
            ObjectNode rootNode = mapper.createObjectNode();
            rootNode.put("inputText", "Write a short poem about Apache Camel.");

            ArrayNode stopSequences = mapper.createArrayNode();
            stopSequences.add("User:");
            ObjectNode childNode = mapper.createObjectNode();
            childNode.put("maxTokenCount", 512);
            childNode.put("stopSequences", stopSequences);
            childNode.put("temperature", 0).put("topP", 1);

            rootNode.put("textGenerationConfig", childNode);
            exchange.getMessage().setBody(mapper.writer().writeValueAsString(rootNode));
            exchange.getMessage().setHeader("CamelAwsBedrockContentType", "application/json");
            exchange.getMessage().setHeader("CamelAwsBedrockAcceptContentType", "application/json");
        });

        // Get the complete response
        String response = result.getMessage().getBody(String.class);

        // Get streaming metadata
        Integer tokenCount = result.getMessage().getHeader("CamelAwsBedrockTokenCount", Integer.class);
        String completionReason = result.getMessage().getHeader("CamelAwsBedrockCompletionReason", String.class);
        Integer chunkCount = result.getMessage().getHeader("CamelAwsBedrockChunkCount", Integer.class);
  • invokeTextModelStreaming (Chunks Mode): this operation will invoke a model from Bedrock with streaming, emitting individual chunks.

  • Java

  • XML

  • YAML

from("direct:stream_chunks")
    .to("aws-bedrock://test?useDefaultCredentialsProvider=true&region=us-east-1&operation=invokeTextModelStreaming&modelId=anthropic.claude-3-5-sonnet-20241022-v2:0&streamOutputMode=chunks")
    .split(body())
        .to("websocket:chat-output");
<route>
  <from uri="direct:stream_chunks"/>
  <to uri="aws-bedrock://test?useDefaultCredentialsProvider=true&amp;region=us-east-1&amp;operation=invokeTextModelStreaming&amp;modelId=anthropic.claude-3-5-sonnet-20241022-v2:0&amp;streamOutputMode=chunks"/>
  <split>
    <simple>${body}</simple>
    <to uri="websocket:chat-output"/>
  </split>
</route>
- route:
    from:
      uri: direct:stream_chunks
      steps:
        - to:
            uri: aws-bedrock://test
            parameters:
              useDefaultCredentialsProvider: true
              region: us-east-1
              operation: invokeTextModelStreaming
              modelId: "anthropic.claude-3-5-sonnet-20241022-v2:0"
              streamOutputMode: chunks
        - split:
            expression:
              simple: "${body}"
            steps:
              - to:
                  uri: websocket:chat-output

and you can then send to the direct endpoint something like

Java-only: uses ProducerTemplate test API with complex JSON construction
        final Exchange result = template.send("direct:stream_chunks", exchange -> {
            ObjectMapper mapper = new ObjectMapper();
            ObjectNode rootNode = mapper.createObjectNode();

            ArrayNode messages = mapper.createArrayNode();
            ObjectNode message = mapper.createObjectNode();
            message.put("role", "user");

            ArrayNode content = mapper.createArrayNode();
            ObjectNode contentBlock = mapper.createObjectNode();
            contentBlock.put("type", "text");
            contentBlock.put("text", "Explain Apache Camel in one sentence.");
            content.add(contentBlock);

            message.put("content", content);
            messages.add(message);

            rootNode.put("messages", messages);
            rootNode.put("max_tokens", 200);
            rootNode.put("anthropic_version", "bedrock-2023-05-31");

            exchange.getMessage().setBody(mapper.writer().writeValueAsString(rootNode));
            exchange.getMessage().setHeader("CamelAwsBedrockContentType", "application/json");
            exchange.getMessage().setHeader("CamelAwsBedrockAcceptContentType", "application/json");
        });

        // Get the list of chunks
        List<String> chunks = result.getMessage().getBody(List.class);

        // Process each chunk
        for (String chunk : chunks) {
            System.out.println("Chunk: " + chunk);
        }
  • converse: this operation uses the unified Converse API for model-agnostic conversations.

  • Java

  • XML

  • YAML

from("direct:converse")
    .to("aws-bedrock://test?useDefaultCredentialsProvider=true&region=us-east-1&operation=converse&modelId=anthropic.claude-3-sonnet-20240229-v1:0")
    .to("log:response");
<route>
  <from uri="direct:converse"/>
  <to uri="aws-bedrock://test?useDefaultCredentialsProvider=true&amp;region=us-east-1&amp;operation=converse&amp;modelId=anthropic.claude-3-sonnet-20240229-v1:0"/>
  <to uri="log:response"/>
</route>
- route:
    from:
      uri: direct:converse
      steps:
        - to:
            uri: aws-bedrock://test
            parameters:
              useDefaultCredentialsProvider: true
              region: us-east-1
              operation: converse
              modelId: "anthropic.claude-3-sonnet-20240229-v1:0"
        - to:
            uri: log:response

and you can then send to the direct endpoint something like

Java-only: uses ProducerTemplate test API with AWS SDK objects
        final Exchange result = template.send("direct:converse", exchange -> {
            // Create a conversation message
            List<software.amazon.awssdk.services.bedrockruntime.model.Message> messages = new ArrayList<>();
            messages.add(software.amazon.awssdk.services.bedrockruntime.model.Message.builder()
                    .role(software.amazon.awssdk.services.bedrockruntime.model.ConversationRole.USER)
                    .content(software.amazon.awssdk.services.bedrockruntime.model.ContentBlock
                            .fromText("What is Apache Camel and what are its main features?"))
                    .build());

            exchange.getMessage().setHeader("CamelAwsBedrockConverseMessages", messages);

            // Optional: Add inference configuration
            software.amazon.awssdk.services.bedrockruntime.model.InferenceConfiguration inferenceConfig
                    = software.amazon.awssdk.services.bedrockruntime.model.InferenceConfiguration.builder()
                            .maxTokens(500)
                            .temperature(0.7f)
                            .build();
            exchange.getMessage().setHeader("CamelAwsBedrockConverseInferenceConfig", inferenceConfig);

            // Optional: Add system prompt
            List<software.amazon.awssdk.services.bedrockruntime.model.SystemContentBlock> systemPrompt = new ArrayList<>();
            systemPrompt.add(software.amazon.awssdk.services.bedrockruntime.model.SystemContentBlock
                    .fromText("You are a helpful assistant that explains software concepts clearly and concisely."));
            exchange.getMessage().setHeader("CamelAwsBedrockConverseSystem", systemPrompt);
        });

        // Get the response text
        String response = result.getMessage().getBody(String.class);

        // Get metadata from headers
        String stopReason = result.getMessage().getHeader("CamelAwsBedrockConverseStopReason", String.class);
        software.amazon.awssdk.services.bedrockruntime.model.TokenUsage usage
                = result.getMessage().getHeader("CamelAwsBedrockConverseUsage",
                        software.amazon.awssdk.services.bedrockruntime.model.TokenUsage.class);

        System.out.println("Response: " + response);
        System.out.println("Stop reason: " + stopReason);
        System.out.println("Input tokens: " + usage.inputTokens());
        System.out.println("Output tokens: " + usage.outputTokens());
  • converseStream (Complete Mode): this operation uses the Converse API with streaming, accumulating the complete response.

  • Java

  • XML

  • YAML

from("direct:converse_stream")
    .to("aws-bedrock://test?useDefaultCredentialsProvider=true&region=us-east-1&operation=converseStream&modelId=anthropic.claude-3-sonnet-20240229-v1:0")
    .to("log:response");
<route>
  <from uri="direct:converse_stream"/>
  <to uri="aws-bedrock://test?useDefaultCredentialsProvider=true&amp;region=us-east-1&amp;operation=converseStream&amp;modelId=anthropic.claude-3-sonnet-20240229-v1:0"/>
  <to uri="log:response"/>
</route>
- route:
    from:
      uri: direct:converse_stream
      steps:
        - to:
            uri: aws-bedrock://test
            parameters:
              useDefaultCredentialsProvider: true
              region: us-east-1
              operation: converseStream
              modelId: "anthropic.claude-3-sonnet-20240229-v1:0"
        - to:
            uri: log:response

and you can then send to the direct endpoint something like

Java-only: uses ProducerTemplate test API with AWS SDK objects
        final Exchange result = template.send("direct:converse_stream", exchange -> {
            // Create a conversation message
            List<software.amazon.awssdk.services.bedrockruntime.model.Message> messages = new ArrayList<>();
            messages.add(software.amazon.awssdk.services.bedrockruntime.model.Message.builder()
                    .role(software.amazon.awssdk.services.bedrockruntime.model.ConversationRole.USER)
                    .content(software.amazon.awssdk.services.bedrockruntime.model.ContentBlock
                            .fromText("Explain the Enterprise Integration Patterns in three sentences."))
                    .build());

            exchange.getMessage().setHeader("CamelAwsBedrockConverseMessages", messages);
            exchange.getMessage().setHeader("CamelAwsBedrockStreamOutputMode", "complete");

            // Optional: Add inference configuration
            software.amazon.awssdk.services.bedrockruntime.model.InferenceConfiguration inferenceConfig
                    = software.amazon.awssdk.services.bedrockruntime.model.InferenceConfiguration.builder()
                            .maxTokens(300)
                            .temperature(0.5f)
                            .build();
            exchange.getMessage().setHeader("CamelAwsBedrockConverseInferenceConfig", inferenceConfig);
        });

        // Get the complete streamed response
        String response = result.getMessage().getBody(String.class);
        Integer chunkCount = result.getMessage().getHeader("CamelAwsBedrockChunkCount", Integer.class);

        System.out.println("Response: " + response);
        System.out.println("Received " + chunkCount + " chunks");
  • converseStream (Chunks Mode): this operation uses the Converse API with streaming, emitting individual chunks.

  • Java

  • XML

  • YAML

from("direct:converse_stream_chunks")
    .to("aws-bedrock://test?useDefaultCredentialsProvider=true&region=us-east-1&operation=converseStream&modelId=anthropic.claude-3-sonnet-20240229-v1:0")
    .split(body())
        .to("websocket:chat-output");
<route>
  <from uri="direct:converse_stream_chunks"/>
  <to uri="aws-bedrock://test?useDefaultCredentialsProvider=true&amp;region=us-east-1&amp;operation=converseStream&amp;modelId=anthropic.claude-3-sonnet-20240229-v1:0"/>
  <split>
    <simple>${body}</simple>
    <to uri="websocket:chat-output"/>
  </split>
</route>
- route:
    from:
      uri: direct:converse_stream_chunks
      steps:
        - to:
            uri: aws-bedrock://test
            parameters:
              useDefaultCredentialsProvider: true
              region: us-east-1
              operation: converseStream
              modelId: "anthropic.claude-3-sonnet-20240229-v1:0"
        - split:
            expression:
              simple: "${body}"
            steps:
              - to:
                  uri: websocket:chat-output

and you can then send to the direct endpoint something like

Java-only: uses ProducerTemplate test API with AWS SDK objects
        final Exchange result = template.send("direct:converse_stream_chunks", exchange -> {
            // Create a conversation message
            List<software.amazon.awssdk.services.bedrockruntime.model.Message> messages = new ArrayList<>();
            messages.add(software.amazon.awssdk.services.bedrockruntime.model.Message.builder()
                    .role(software.amazon.awssdk.services.bedrockruntime.model.ConversationRole.USER)
                    .content(software.amazon.awssdk.services.bedrockruntime.model.ContentBlock
                            .fromText("Write a haiku about software integration."))
                    .build());

            exchange.getMessage().setHeader("CamelAwsBedrockConverseMessages", messages);
            exchange.getMessage().setHeader("CamelAwsBedrockStreamOutputMode", "chunks");
        });

        // Get the list of chunks
        List<String> chunks = result.getMessage().getBody(List.class);

        // Process each chunk as it was received
        for (String chunk : chunks) {
            System.out.println("Chunk: " + chunk);
        }
  • Multi-turn Conversation with Converse API: demonstrates maintaining conversation history.

  • Java

  • XML

  • YAML

from("direct:conversation")
    .to("aws-bedrock://test?useDefaultCredentialsProvider=true&region=us-east-1&operation=converse&modelId=anthropic.claude-3-sonnet-20240229-v1:0")
    .to("log:response");
<route>
  <from uri="direct:conversation"/>
  <to uri="aws-bedrock://test?useDefaultCredentialsProvider=true&amp;region=us-east-1&amp;operation=converse&amp;modelId=anthropic.claude-3-sonnet-20240229-v1:0"/>
  <to uri="log:response"/>
</route>
- route:
    from:
      uri: direct:conversation
      steps:
        - to:
            uri: aws-bedrock://test
            parameters:
              useDefaultCredentialsProvider: true
              region: us-east-1
              operation: converse
              modelId: "anthropic.claude-3-sonnet-20240229-v1:0"
        - to:
            uri: log:response

and you can then send to the direct endpoint something like

Java-only: uses ProducerTemplate test API with multi-turn conversation history
        // Maintain conversation history
        List<software.amazon.awssdk.services.bedrockruntime.model.Message> conversationHistory = new ArrayList<>();

        // First turn
        conversationHistory.add(software.amazon.awssdk.services.bedrockruntime.model.Message.builder()
                .role(software.amazon.awssdk.services.bedrockruntime.model.ConversationRole.USER)
                .content(software.amazon.awssdk.services.bedrockruntime.model.ContentBlock
                        .fromText("What is Apache Camel?"))
                .build());

        Exchange result1 = template.send("direct:conversation", exchange -> {
            exchange.getMessage().setHeader("CamelAwsBedrockConverseMessages",
                    new ArrayList<>(conversationHistory));
        });

        // Add assistant's response to history
        software.amazon.awssdk.services.bedrockruntime.model.Message assistantMessage
                = result1.getMessage().getHeader("CamelAwsBedrockConverseOutputMessage",
                        software.amazon.awssdk.services.bedrockruntime.model.Message.class);
        conversationHistory.add(assistantMessage);

        // Second turn - follow-up question
        conversationHistory.add(software.amazon.awssdk.services.bedrockruntime.model.Message.builder()
                .role(software.amazon.awssdk.services.bedrockruntime.model.ConversationRole.USER)
                .content(software.amazon.awssdk.services.bedrockruntime.model.ContentBlock
                        .fromText("Can you give me a simple example?"))
                .build());

        Exchange result2 = template.send("direct:conversation", exchange -> {
            exchange.getMessage().setHeader("CamelAwsBedrockConverseMessages",
                    new ArrayList<>(conversationHistory));
        });

        String followUpResponse = result2.getMessage().getBody(String.class);
        System.out.println("Follow-up response: " + followUpResponse);

Guardrails Examples

  • Converse with Guardrails (Endpoint Configuration): Apply guardrails configured at the endpoint level.

  • Java

  • XML

  • YAML

from("direct:converse_with_guardrails")
    .to("aws-bedrock://test?useDefaultCredentialsProvider=true&region=us-east-1&operation=converse&modelId=anthropic.claude-3-sonnet-20240229-v1:0&guardrailIdentifier=abc123xyz&guardrailVersion=DRAFT&guardrailTrace=true")
    .to("log:response");
<route>
  <from uri="direct:converse_with_guardrails"/>
  <to uri="aws-bedrock://test?useDefaultCredentialsProvider=true&amp;region=us-east-1&amp;operation=converse&amp;modelId=anthropic.claude-3-sonnet-20240229-v1:0&amp;guardrailIdentifier=abc123xyz&amp;guardrailVersion=DRAFT&amp;guardrailTrace=true"/>
  <to uri="log:response"/>
</route>
- route:
    from:
      uri: direct:converse_with_guardrails
      steps:
        - to:
            uri: aws-bedrock://test
            parameters:
              useDefaultCredentialsProvider: true
              region: us-east-1
              operation: converse
              modelId: "anthropic.claude-3-sonnet-20240229-v1:0"
              guardrailIdentifier: abc123xyz
              guardrailVersion: DRAFT
              guardrailTrace: true
        - to:
            uri: log:response

and you can then send to the direct endpoint something like

Java-only: uses ProducerTemplate test API with AWS SDK objects
        final Exchange result = template.send("direct:converse_with_guardrails", exchange -> {
            // Create a conversation message
            List<software.amazon.awssdk.services.bedrockruntime.model.Message> messages = new ArrayList<>();
            messages.add(software.amazon.awssdk.services.bedrockruntime.model.Message.builder()
                    .role(software.amazon.awssdk.services.bedrockruntime.model.ConversationRole.USER)
                    .content(software.amazon.awssdk.services.bedrockruntime.model.ContentBlock
                            .fromText("Tell me about Paris"))
                    .build());

            exchange.getMessage().setHeader("CamelAwsBedrockConverseMessages", messages);

            // Optional: Add inference configuration
            software.amazon.awssdk.services.bedrockruntime.model.InferenceConfiguration inferenceConfig
                    = software.amazon.awssdk.services.bedrockruntime.model.InferenceConfiguration.builder()
                            .maxTokens(200)
                            .temperature(0.7f)
                            .build();
            exchange.getMessage().setHeader("CamelAwsBedrockConverseInferenceConfig", inferenceConfig);
        });

        // Get the response
        String response = result.getMessage().getBody(String.class);

        // Check if guardrail trace is available
        software.amazon.awssdk.services.bedrockruntime.model.GuardrailTrace trace
                = result.getMessage().getHeader("CamelAwsBedrockGuardrailTrace",
                        software.amazon.awssdk.services.bedrockruntime.model.GuardrailTrace.class);

        if (trace != null) {
            System.out.println("Guardrail evaluation: " + trace);
        }
  • Converse with Guardrails (Header Configuration): Apply guardrails configured per-message via headers.

  • Java

  • XML

  • YAML

from("direct:converse_dynamic_guardrails")
    .to("aws-bedrock://test?useDefaultCredentialsProvider=true&region=us-east-1&operation=converse&modelId=anthropic.claude-3-sonnet-20240229-v1:0")
    .to("log:response");
<route>
  <from uri="direct:converse_dynamic_guardrails"/>
  <to uri="aws-bedrock://test?useDefaultCredentialsProvider=true&amp;region=us-east-1&amp;operation=converse&amp;modelId=anthropic.claude-3-sonnet-20240229-v1:0"/>
  <to uri="log:response"/>
</route>
- route:
    from:
      uri: direct:converse_dynamic_guardrails
      steps:
        - to:
            uri: aws-bedrock://test
            parameters:
              useDefaultCredentialsProvider: true
              region: us-east-1
              operation: converse
              modelId: "anthropic.claude-3-sonnet-20240229-v1:0"
        - to:
            uri: log:response

and you can then send to the direct endpoint something like

Java-only: uses ProducerTemplate test API with AWS SDK GuardrailConfiguration objects
        final Exchange result = template.send("direct:converse_dynamic_guardrails", exchange -> {
            // Create a conversation message
            List<software.amazon.awssdk.services.bedrockruntime.model.Message> messages = new ArrayList<>();
            messages.add(software.amazon.awssdk.services.bedrockruntime.model.Message.builder()
                    .role(software.amazon.awssdk.services.bedrockruntime.model.ConversationRole.USER)
                    .content(software.amazon.awssdk.services.bedrockruntime.model.ContentBlock
                            .fromText("What is the capital of France?"))
                    .build());

            exchange.getMessage().setHeader("CamelAwsBedrockConverseMessages", messages);

            // Configure guardrail via header (can be dynamic per message)
            software.amazon.awssdk.services.bedrockruntime.model.GuardrailConfiguration guardrailConfig
                    = software.amazon.awssdk.services.bedrockruntime.model.GuardrailConfiguration.builder()
                            .guardrailIdentifier("abc123xyz")  // Can be determined at runtime
                            .guardrailVersion("DRAFT")
                            .trace(software.amazon.awssdk.services.bedrockruntime.model.GuardrailTrace.ENABLED)
                            .build();
            exchange.getMessage().setHeader("CamelAwsBedrockGuardrailConfig", guardrailConfig);
        });

        String response = result.getMessage().getBody(String.class);
        System.out.println("Protected response: " + response);
  • Converse Stream with Guardrails: Apply guardrails to streaming conversations.

  • Java

  • XML

  • YAML

from("direct:stream_with_guardrails")
    .to("aws-bedrock://test?useDefaultCredentialsProvider=true&region=us-east-1&operation=converseStream&modelId=anthropic.claude-3-sonnet-20240229-v1:0&guardrailIdentifier=abc123xyz&guardrailVersion=DRAFT")
    .to("log:response");
<route>
  <from uri="direct:stream_with_guardrails"/>
  <to uri="aws-bedrock://test?useDefaultCredentialsProvider=true&amp;region=us-east-1&amp;operation=converseStream&amp;modelId=anthropic.claude-3-sonnet-20240229-v1:0&amp;guardrailIdentifier=abc123xyz&amp;guardrailVersion=DRAFT"/>
  <to uri="log:response"/>
</route>
- route:
    from:
      uri: direct:stream_with_guardrails
      steps:
        - to:
            uri: aws-bedrock://test
            parameters:
              useDefaultCredentialsProvider: true
              region: us-east-1
              operation: converseStream
              modelId: "anthropic.claude-3-sonnet-20240229-v1:0"
              guardrailIdentifier: abc123xyz
              guardrailVersion: DRAFT
        - to:
            uri: log:response

and you can then send to the direct endpoint something like

Java-only: uses ProducerTemplate test API with AWS SDK objects
        final Exchange result = template.send("direct:stream_with_guardrails", exchange -> {
            List<software.amazon.awssdk.services.bedrockruntime.model.Message> messages = new ArrayList<>();
            messages.add(software.amazon.awssdk.services.bedrockruntime.model.Message.builder()
                    .role(software.amazon.awssdk.services.bedrockruntime.model.ConversationRole.USER)
                    .content(software.amazon.awssdk.services.bedrockruntime.model.ContentBlock
                            .fromText("Tell me a story about space exploration"))
                    .build());

            exchange.getMessage().setHeader("CamelAwsBedrockConverseMessages", messages);
            exchange.getMessage().setHeader("CamelAwsBedrockStreamOutputMode", "complete");
        });

        String streamedResponse = result.getMessage().getBody(String.class);
        System.out.println("Guardrail-protected stream response: " + streamedResponse);
  • Apply Guardrail: Validate content against a guardrail without invoking a model.

  • Java

  • XML

  • YAML

from("direct:validate_content")
    .to("aws-bedrock://test?useDefaultCredentialsProvider=true&region=us-east-1&operation=applyGuardrail&guardrailIdentifier=abc123xyz&guardrailVersion=DRAFT")
    .to("log:validation_result");
<route>
  <from uri="direct:validate_content"/>
  <to uri="aws-bedrock://test?useDefaultCredentialsProvider=true&amp;region=us-east-1&amp;operation=applyGuardrail&amp;guardrailIdentifier=abc123xyz&amp;guardrailVersion=DRAFT"/>
  <to uri="log:validation_result"/>
</route>
- route:
    from:
      uri: direct:validate_content
      steps:
        - to:
            uri: aws-bedrock://test
            parameters:
              useDefaultCredentialsProvider: true
              region: us-east-1
              operation: applyGuardrail
              guardrailIdentifier: abc123xyz
              guardrailVersion: DRAFT
        - to:
            uri: log:validation_result

and you can then send to the direct endpoint something like

Java-only: uses ProducerTemplate test API with AWS SDK GuardrailContentBlock objects
        final Exchange result = template.send("direct:validate_content", exchange -> {
            // Create content blocks to check
            List<software.amazon.awssdk.services.bedrockruntime.model.GuardrailContentBlock> content
                    = new ArrayList<>();
            content.add(software.amazon.awssdk.services.bedrockruntime.model.GuardrailContentBlock.builder()
                    .text(software.amazon.awssdk.services.bedrockruntime.model.GuardrailTextBlock.builder()
                            .text("This is the content I want to validate before sending to the model.")
                            .build())
                    .build());

            exchange.getMessage().setHeader("CamelAwsBedrockGuardrailContent", content);
            exchange.getMessage().setHeader("CamelAwsBedrockGuardrailSource", "INPUT");
        });

        // Get the action result (GUARDRAIL_INTERVENED or NONE)
        String action = result.getMessage().getBody(String.class);

        if ("GUARDRAIL_INTERVENED".equals(action)) {
            System.out.println("Content was blocked by guardrail!");

            // Get the assessments to see why it was blocked
            List<?> assessments = result.getMessage().getHeader("CamelAwsBedrockGuardrailAssessments", List.class);
            System.out.println("Reasons: " + assessments);

            // Get the filtered output
            List<?> outputs = result.getMessage().getHeader("CamelAwsBedrockGuardrailOutput", List.class);
            System.out.println("Filtered content: " + outputs);
        } else {
            System.out.println("Content passed guardrail validation");
        }
  • Apply Guardrail with POJO Request: Use the SDK request object directly for maximum control.

  • Java

  • XML

  • YAML

from("direct:validate_pojo")
    .to("aws-bedrock://test?useDefaultCredentialsProvider=true&region=us-east-1&operation=applyGuardrail&pojoRequest=true")
    .to("log:validation_result");
<route>
  <from uri="direct:validate_pojo"/>
  <to uri="aws-bedrock://test?useDefaultCredentialsProvider=true&amp;region=us-east-1&amp;operation=applyGuardrail&amp;pojoRequest=true"/>
  <to uri="log:validation_result"/>
</route>
- route:
    from:
      uri: direct:validate_pojo
      steps:
        - to:
            uri: aws-bedrock://test
            parameters:
              useDefaultCredentialsProvider: true
              region: us-east-1
              operation: applyGuardrail
              pojoRequest: true
        - to:
            uri: log:validation_result

and you can then send to the direct endpoint something like

Java-only: uses ProducerTemplate test API with AWS SDK ApplyGuardrailRequest POJO
        final Exchange result = template.send("direct:validate_pojo", exchange -> {
            // Create content blocks
            List<software.amazon.awssdk.services.bedrockruntime.model.GuardrailContentBlock> content
                    = new ArrayList<>();
            content.add(software.amazon.awssdk.services.bedrockruntime.model.GuardrailContentBlock.builder()
                    .text(software.amazon.awssdk.services.bedrockruntime.model.GuardrailTextBlock.builder()
                            .text("User-generated content to validate")
                            .build())
                    .build());

            // Build the complete request object
            software.amazon.awssdk.services.bedrockruntime.model.ApplyGuardrailRequest request
                    = software.amazon.awssdk.services.bedrockruntime.model.ApplyGuardrailRequest.builder()
                            .guardrailIdentifier("abc123xyz")
                            .guardrailVersion("DRAFT")
                            .source(software.amazon.awssdk.services.bedrockruntime.model.GuardrailContentSource.INPUT)
                            .content(content)
                            .build();

            exchange.getMessage().setBody(request);
        });

        String action = result.getMessage().getBody(String.class);
        System.out.println("Validation result: " + action);
  • Content Moderation Pipeline: Combine guardrails with model invocation in a pipeline.

  • Java

  • XML

  • YAML

from("direct:moderated_conversation")
    .to("aws-bedrock://validate?useDefaultCredentialsProvider=true&region=us-east-1&operation=applyGuardrail&guardrailIdentifier=abc123xyz")
    .choice()
        .when(simple("${body} == 'GUARDRAIL_INTERVENED'"))
            .log("Input blocked by guardrail")
            .setBody(constant("Sorry, I cannot process this request."))
        .otherwise()
            .to("aws-bedrock://converse?useDefaultCredentialsProvider=true&region=us-east-1&operation=converse&modelId=anthropic.claude-3-sonnet-20240229-v1:0&guardrailIdentifier=abc123xyz")
            .log("Model response: ${body}")
    .end()
    .to("mock:result");
<route>
  <from uri="direct:moderated_conversation"/>
  <to uri="aws-bedrock://validate?useDefaultCredentialsProvider=true&amp;region=us-east-1&amp;operation=applyGuardrail&amp;guardrailIdentifier=abc123xyz"/>
  <choice>
    <when>
      <simple>${body} == 'GUARDRAIL_INTERVENED'</simple>
      <log message="Input blocked by guardrail"/>
      <setBody><constant>Sorry, I cannot process this request.</constant></setBody>
    </when>
    <otherwise>
      <to uri="aws-bedrock://converse?useDefaultCredentialsProvider=true&amp;region=us-east-1&amp;operation=converse&amp;modelId=anthropic.claude-3-sonnet-20240229-v1:0&amp;guardrailIdentifier=abc123xyz"/>
      <log message="Model response: ${body}"/>
    </otherwise>
  </choice>
  <to uri="mock:result"/>
</route>
- route:
    from:
      uri: direct:moderated_conversation
      steps:
        - to:
            uri: aws-bedrock://validate
            parameters:
              useDefaultCredentialsProvider: true
              region: us-east-1
              operation: applyGuardrail
              guardrailIdentifier: abc123xyz
        - choice:
            when:
              - simple: "${body} == 'GUARDRAIL_INTERVENED'"
                steps:
                  - log: "Input blocked by guardrail"
                  - setBody:
                      constant: "Sorry, I cannot process this request."
            otherwise:
              steps:
                - to:
                    uri: aws-bedrock://converse
                    parameters:
                      useDefaultCredentialsProvider: true
                      region: us-east-1
                      operation: converse
                      modelId: "anthropic.claude-3-sonnet-20240229-v1:0"
                      guardrailIdentifier: abc123xyz
                - log: "Model response: ${body}"
        - to:
            uri: mock:result