This is an automated email from the ASF dual-hosted git repository. acosentino pushed a commit to branch haiku-claude-support in repository https://gitbox.apache.org/repos/asf/camel.git
commit db759ec1e602e12a5da86e0e7826de24d33e9361 Author: Andrea Cosentino <anco...@gmail.com> AuthorDate: Wed Apr 3 13:23:32 2024 +0200 CAMEL-20642 - Camel-AWS-Bedrock: Support Anthropic Haiku model Signed-off-by: Andrea Cosentino <anco...@gmail.com> --- .../component/aws2/bedrock/BedrockModels.java | 3 +- .../aws2/bedrock/runtime/BedrockProducer.java | 2 +- .../runtime/integration/BedrockProducerIT.java | 44 ++++++++++++++++++++++ 3 files changed, 47 insertions(+), 2 deletions(-) diff --git a/components/camel-aws/camel-aws-bedrock/src/main/java/org/apache/camel/component/aws2/bedrock/BedrockModels.java b/components/camel-aws/camel-aws-bedrock/src/main/java/org/apache/camel/component/aws2/bedrock/BedrockModels.java index d8d9bf561a9..ecbf2966a9d 100644 --- a/components/camel-aws/camel-aws-bedrock/src/main/java/org/apache/camel/component/aws2/bedrock/BedrockModels.java +++ b/components/camel-aws/camel-aws-bedrock/src/main/java/org/apache/camel/component/aws2/bedrock/BedrockModels.java @@ -27,7 +27,8 @@ public enum BedrockModels { ANTROPHIC_CLAUDE_INSTANT_V1("anthropic.claude-instant-v1"), ANTROPHIC_CLAUDE_V2("anthropic.claude-v2"), ANTROPHIC_CLAUDE_V2_1("anthropic.claude-v2:1"), - ANTROPHIC_CLAUDE_V3("anthropic.claude-3-sonnet-20240229-v1:0"); + ANTROPHIC_CLAUDE_V3("anthropic.claude-3-sonnet-20240229-v1:0"), + ANTROPHIC_CLAUDE_HAIKU_V3("anthropic.claude-3-haiku-20240307-v1:0"); public final String model; diff --git a/components/camel-aws/camel-aws-bedrock/src/main/java/org/apache/camel/component/aws2/bedrock/runtime/BedrockProducer.java b/components/camel-aws/camel-aws-bedrock/src/main/java/org/apache/camel/component/aws2/bedrock/runtime/BedrockProducer.java index e553972684f..98f48abbcd1 100644 --- a/components/camel-aws/camel-aws-bedrock/src/main/java/org/apache/camel/component/aws2/bedrock/runtime/BedrockProducer.java +++ b/components/camel-aws/camel-aws-bedrock/src/main/java/org/apache/camel/component/aws2/bedrock/runtime/BedrockProducer.java @@ -249,7 +249,7 @@ public class BedrockProducer extends DefaultProducer { throw new RuntimeException(e); } } - case "anthropic.claude-3-sonnet-20240229-v1:0" -> { + case "anthropic.claude-3-sonnet-20240229-v1:0", "anthropic.claude-3-haiku-20240307-v1:0" -> { try { setAnthropicV3Text(result, message); } catch (JsonProcessingException e) { diff --git a/components/camel-aws/camel-aws-bedrock/src/test/java/org/apache/camel/component/aws2/bedrock/runtime/integration/BedrockProducerIT.java b/components/camel-aws/camel-aws-bedrock/src/test/java/org/apache/camel/component/aws2/bedrock/runtime/integration/BedrockProducerIT.java index b0a9bb36346..85600c4d4a2 100644 --- a/components/camel-aws/camel-aws-bedrock/src/test/java/org/apache/camel/component/aws2/bedrock/runtime/integration/BedrockProducerIT.java +++ b/components/camel-aws/camel-aws-bedrock/src/test/java/org/apache/camel/component/aws2/bedrock/runtime/integration/BedrockProducerIT.java @@ -336,6 +336,44 @@ class BedrockProducerIT extends CamelTestSupport { MockEndpoint.assertIsSatisfied(context); } + @Test + public void testInvokeAnthropicV3HaikuModel() throws InterruptedException { + + result.expectedMessageCount(1); + final Exchange result = template.send("direct:send_anthropic_v3_haiku_model", exchange -> { + ObjectMapper mapper = new ObjectMapper(); + ObjectNode rootNode = mapper.createObjectNode(); + + ArrayNode messages = mapper.createArrayNode(); + + ObjectNode element = mapper.createObjectNode(); + element.putIfAbsent("role", new TextNode("user")); + + ArrayNode content = mapper.createArrayNode(); + + ObjectNode textContent = mapper.createObjectNode(); + + textContent.putIfAbsent("type", new TextNode("text")); + textContent.putIfAbsent("text", new TextNode("Can you tell the history of Mayflower?")); + + content.add(textContent); + + element.putIfAbsent("content", content); + + messages.add(element); + + rootNode.putIfAbsent("messages", messages); + rootNode.putIfAbsent("max_tokens", new IntNode(1000)); + rootNode.putIfAbsent("anthropic_version", new TextNode("bedrock-2023-05-31")); + + exchange.getMessage().setBody(mapper.writer().writeValueAsString(rootNode)); + exchange.getMessage().setHeader(BedrockConstants.MODEL_CONTENT_TYPE, "application/json"); + exchange.getMessage().setHeader(BedrockConstants.MODEL_ACCEPT_CONTENT_TYPE, "application/json"); + }); + + MockEndpoint.assertIsSatisfied(context); + } + @Override protected RouteBuilder createRouteBuilder() { return new RouteBuilder() { @@ -403,6 +441,12 @@ class BedrockProducerIT extends CamelTestSupport { + BedrockModels.ANTROPHIC_CLAUDE_V3.model) .log("Completions: ${body}") .to(result); + + from("direct:send_anthropic_v3_haiku_model") + .to("aws-bedrock:label?accessKey=RAW({{aws.manual.access.key}})&secretKey=RAW({{aws.manual.secret.key}}®ion=us-east-1&operation=invokeTextModel&modelId=" + + BedrockModels.ANTROPHIC_CLAUDE_HAIKU_V3.model) + .log("Completions: ${body}") + .to(result); } }; }