Skip to content

Commit 082ac8e

Browse files
committed
This adds a Single Action Example showing how to use Bedrock-Converse with Anthropic Claude.
1 parent ab7e5c8 commit 082ac8e

File tree

7 files changed

+271
-8
lines changed

7 files changed

+271
-8
lines changed

Diff for: gov2/bedrock-runtime/actions/converse.go

+52
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
2+
// SPDX-License-Identifier: Apache-2.0
3+
4+
package actions
5+
6+
// snippet-start:[gov2.bedrock-runtime.Converse.complete]
7+
// snippet-start:[gov2.bedrock-runtime.Converse.struct]
8+
9+
import (
10+
"context"
11+
"github.com/aws/aws-sdk-go-v2/aws"
12+
"github.com/aws/aws-sdk-go-v2/service/bedrockruntime"
13+
"github.com/aws/aws-sdk-go-v2/service/bedrockruntime/types"
14+
)
15+
16+
// ConverseWrapper encapsulates Amazon Bedrock actions used in the examples.
17+
// It contains a Bedrock Runtime client that is used to invoke Bedrock.
18+
type ConverseWrapper struct {
19+
BedrockRuntimeClient *bedrockruntime.Client
20+
}
21+
22+
// snippet-end:[gov2.bedrock-runtime.Converse.struct]
23+
24+
// snippet-start:[gov2.bedrock-runtime.ConverseClaude]
25+
26+
func (wrapper ConverseWrapper) ConverseClaude(ctx context.Context, prompt string) (string, error) {
27+
var content = types.ContentBlockMemberText{
28+
Value: prompt,
29+
}
30+
var message = types.Message{
31+
Content: []types.ContentBlock{&content},
32+
Role: "user",
33+
}
34+
modelId := "anthropic.claude-3-haiku-20240307-v1:0"
35+
var converseInput = bedrockruntime.ConverseInput{
36+
ModelId: aws.String(modelId),
37+
Messages: []types.Message{message},
38+
}
39+
response, err := wrapper.BedrockRuntimeClient.Converse(ctx, &converseInput)
40+
if err != nil {
41+
ProcessError(err, modelId)
42+
}
43+
44+
responseText, _ := response.Output.(*types.ConverseOutputMemberMessage)
45+
responseContentBlock := responseText.Value.Content[0]
46+
text, _ := responseContentBlock.(*types.ContentBlockMemberText)
47+
return text.Value, nil
48+
49+
}
50+
51+
// snippet-end:[gov2.bedrock-runtime.ConverseClaude]
52+
// snippet-end:[gov2.bedrock-runtime.Converse.complete]

Diff for: gov2/bedrock-runtime/actions/converse_test.go

+82
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,82 @@
1+
// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
2+
// SPDX-License-Identifier: Apache-2.0
3+
4+
// Unit tests for the bedrock runtime actions.
5+
6+
package actions
7+
8+
import (
9+
"context"
10+
"github.com/aws/aws-sdk-go-v2/aws"
11+
"github.com/aws/aws-sdk-go-v2/service/bedrockruntime"
12+
"github.com/aws/aws-sdk-go-v2/service/bedrockruntime/types"
13+
"github.com/awsdocs/aws-doc-sdk-examples/gov2/bedrock-runtime/stubs"
14+
"github.com/awsdocs/aws-doc-sdk-examples/gov2/testtools"
15+
"log"
16+
"testing"
17+
)
18+
19+
const CONVERSE_CLAUDE_MODEL_ID = "anthropic.claude-3-haiku-20240307-v1:0"
20+
const CONVERSE_PROMPT = "Converse test prompt"
21+
22+
func CallConverseActions(sdkConfig aws.Config) {
23+
defer func() {
24+
if r := recover(); r != nil {
25+
log.Println(r)
26+
}
27+
}()
28+
29+
client := bedrockruntime.NewFromConfig(sdkConfig)
30+
wrapper := ConverseWrapper{client}
31+
ctx := context.Background()
32+
33+
claudeCompletion, err := wrapper.ConverseClaude(ctx, CONVERSE_PROMPT)
34+
if err != nil {
35+
panic(err)
36+
}
37+
log.Println(claudeCompletion)
38+
39+
log.Printf("Thanks for watching!")
40+
}
41+
42+
func TestConverse(t *testing.T) {
43+
scenTest := ConverseActionsTest{}
44+
testtools.RunScenarioTests(&scenTest, t)
45+
}
46+
47+
type ConverseActionsTest struct{}
48+
49+
func stubConverse(modelId string) testtools.Stub {
50+
var content = types.ContentBlockMemberText{
51+
Value: CONVERSE_PROMPT,
52+
}
53+
var message = types.Message{
54+
Content: []types.ContentBlock{&content},
55+
Role: "user",
56+
}
57+
var resultContent = types.ContentBlockMemberText{
58+
Value: "A proper result",
59+
}
60+
var result = types.Message{
61+
Content: []types.ContentBlock{&resultContent},
62+
Role: "user",
63+
}
64+
return stubs.StubConverse(stubs.StubConverseParams{
65+
ModelId: modelId,
66+
Messages: []types.Message{message},
67+
Result: result,
68+
RaiseErr: nil,
69+
})
70+
}
71+
func (scenTest *ConverseActionsTest) SetupDataAndStubs() []testtools.Stub {
72+
var stubList []testtools.Stub
73+
stubList = append(stubList, stubConverse(CONVERSE_CLAUDE_MODEL_ID))
74+
75+
return stubList
76+
}
77+
78+
func (scenTest *ConverseActionsTest) RunSubTest(stubber *testtools.AwsmStubber) {
79+
CallConverseActions(*stubber.SdkConfig)
80+
}
81+
82+
func (scenTest *ConverseActionsTest) Cleanup() {}

Diff for: gov2/bedrock-runtime/cmd/main.go

+7
Original file line numberDiff line numberDiff line change
@@ -20,12 +20,14 @@ import (
2020
//
2121
// `-scenario` can be one of the following:
2222
//
23+
// - `converse` - Runs a scenario that shows how to use the converse command
2324
// - `invokemodels` - Runs a scenario that shows how to invoke various image and text
2425
// generation models on Amazon Bedrock.
2526
func main() {
2627

2728
scenarioMap := map[string]func(ctx context.Context, sdkConfig aws.Config){
2829
"invokemodels": runInvokeModelsScenario,
30+
"converse": runConverseScenario,
2931
}
3032
choices := make([]string, len(scenarioMap))
3133
choiceIndex := 0
@@ -61,3 +63,8 @@ func runInvokeModelsScenario(ctx context.Context, sdkConfig aws.Config) {
6163
scenario := scenarios.NewInvokeModelsScenario(sdkConfig, demotools.NewQuestioner())
6264
scenario.Run(ctx)
6365
}
66+
67+
func runConverseScenario(ctx context.Context, sdkConfig aws.Config) {
68+
scenario := scenarios.NewConverseScenario(sdkConfig, demotools.NewQuestioner())
69+
scenario.Run(ctx)
70+
}

Diff for: gov2/bedrock-runtime/go.mod

+10-8
Original file line numberDiff line numberDiff line change
@@ -1,28 +1,30 @@
11
module github.com/awsdocs/aws-doc-sdk-examples/gov2/bedrock-runtime
22

3-
go 1.21
3+
go 1.22
4+
5+
toolchain go1.22.2
46

57
require (
6-
github.com/aws/aws-sdk-go-v2 v1.30.5
8+
github.com/aws/aws-sdk-go-v2 v1.36.3
79
github.com/aws/aws-sdk-go-v2/config v1.27.33
8-
github.com/aws/aws-sdk-go-v2/service/bedrockruntime v1.16.2
10+
github.com/aws/aws-sdk-go-v2/service/bedrockruntime v1.26.1
911
github.com/awsdocs/aws-doc-sdk-examples/gov2/demotools v0.0.0-20240907001412-a9375541143b
10-
github.com/awsdocs/aws-doc-sdk-examples/gov2/testtools v0.0.0-20240907001412-a9375541143b
12+
github.com/awsdocs/aws-doc-sdk-examples/gov2/testtools v0.0.0-20250401185104-e9ddacfbb4a0
1113
)
1214

1315
require (
14-
github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.6.4 // indirect
16+
github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.6.10 // indirect
1517
github.com/aws/aws-sdk-go-v2/credentials v1.17.32 // indirect
1618
github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.13 // indirect
17-
github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.17 // indirect
18-
github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.17 // indirect
19+
github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.34 // indirect
20+
github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.34 // indirect
1921
github.com/aws/aws-sdk-go-v2/internal/ini v1.8.1 // indirect
2022
github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.11.4 // indirect
2123
github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.11.19 // indirect
2224
github.com/aws/aws-sdk-go-v2/service/sso v1.22.7 // indirect
2325
github.com/aws/aws-sdk-go-v2/service/ssooidc v1.26.7 // indirect
2426
github.com/aws/aws-sdk-go-v2/service/sts v1.30.7 // indirect
25-
github.com/aws/smithy-go v1.20.4 // indirect
27+
github.com/aws/smithy-go v1.22.3 // indirect
2628
golang.org/x/sys v0.25.0 // indirect
2729
golang.org/x/term v0.24.0 // indirect
2830
)

Diff for: gov2/bedrock-runtime/go.sum

+14
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,11 @@
11
github.com/aws/aws-sdk-go-v2 v1.30.5 h1:mWSRTwQAb0aLE17dSzztCVJWI9+cRMgqebndjwDyK0g=
22
github.com/aws/aws-sdk-go-v2 v1.30.5/go.mod h1:CT+ZPWXbYrci8chcARI3OmI/qgd+f6WtuLOoaIA8PR0=
3+
github.com/aws/aws-sdk-go-v2 v1.36.3 h1:mJoei2CxPutQVxaATCzDUjcZEjVRdpsiiXi2o38yqWM=
4+
github.com/aws/aws-sdk-go-v2 v1.36.3/go.mod h1:LLXuLpgzEbD766Z5ECcRmi8AzSwfZItDtmABVkRLGzg=
35
github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.6.4 h1:70PVAiL15/aBMh5LThwgXdSQorVr91L127ttckI9QQU=
46
github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.6.4/go.mod h1:/MQxMqci8tlqDH+pjmoLu1i0tbWCUP1hhyMRuFxpQCw=
7+
github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.6.10 h1:zAybnyUQXIZ5mok5Jqwlf58/TFE7uvd3IAsa1aF9cXs=
8+
github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.6.10/go.mod h1:qqvMj6gHLR/EXWZw4ZbqlPbQUyenf4h82UQUlKc+l14=
59
github.com/aws/aws-sdk-go-v2/config v1.27.33 h1:Nof9o/MsmH4oa0s2q9a0k7tMz5x/Yj5k06lDODWz3BU=
610
github.com/aws/aws-sdk-go-v2/config v1.27.33/go.mod h1:kEqdYzRb8dd8Sy2pOdEbExTTF5v7ozEXX0McgPE7xks=
711
github.com/aws/aws-sdk-go-v2/credentials v1.17.32 h1:7Cxhp/BnT2RcGy4VisJ9miUPecY+lyE9I8JvcZofn9I=
@@ -10,12 +14,18 @@ github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.13 h1:pfQ2sqNpMVK6xz2RbqLEL0
1014
github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.13/go.mod h1:NG7RXPUlqfsCLLFfi0+IpKN4sCB9D9fw/qTaSB+xRoU=
1115
github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.17 h1:pI7Bzt0BJtYA0N/JEC6B8fJ4RBrEMi1LBrkMdFYNSnQ=
1216
github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.17/go.mod h1:Dh5zzJYMtxfIjYW+/evjQ8uj2OyR/ve2KROHGHlSFqE=
17+
github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.34 h1:ZK5jHhnrioRkUNOc+hOgQKlUL5JeC3S6JgLxtQ+Rm0Q=
18+
github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.34/go.mod h1:p4VfIceZokChbA9FzMbRGz5OV+lekcVtHlPKEO0gSZY=
1319
github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.17 h1:Mqr/V5gvrhA2gvgnF42Zh5iMiQNcOYthFYwCyrnuWlc=
1420
github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.17/go.mod h1:aLJpZlCmjE+V+KtN1q1uyZkfnUWpQGpbsn89XPKyzfU=
21+
github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.34 h1:SZwFm17ZUNNg5Np0ioo/gq8Mn6u9w19Mri8DnJ15Jf0=
22+
github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.34/go.mod h1:dFZsC0BLo346mvKQLWmoJxT+Sjp+qcVR1tRVHQGOH9Q=
1523
github.com/aws/aws-sdk-go-v2/internal/ini v1.8.1 h1:VaRN3TlFdd6KxX1x3ILT5ynH6HvKgqdiXoTxAF4HQcQ=
1624
github.com/aws/aws-sdk-go-v2/internal/ini v1.8.1/go.mod h1:FbtygfRFze9usAadmnGJNc8KsP346kEe+y2/oyhGAGc=
1725
github.com/aws/aws-sdk-go-v2/service/bedrockruntime v1.16.2 h1:hmzsX43PIJ8x+dwJwruqMjE2F8tZuCQMxVz9Vn0EZkc=
1826
github.com/aws/aws-sdk-go-v2/service/bedrockruntime v1.16.2/go.mod h1:emMKL0OTFG+l9pW11RMgfvJRxZ5e093OS1o102YEGoA=
27+
github.com/aws/aws-sdk-go-v2/service/bedrockruntime v1.26.1 h1:nTOWCzqT20Muat5amktS5NwATkp6AWBTMYweQMtXvBk=
28+
github.com/aws/aws-sdk-go-v2/service/bedrockruntime v1.26.1/go.mod h1:0b5Rq7rUvSQFYHI1UO0zFTV/S6j6DUyuykXA80C+YOI=
1929
github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.11.4 h1:KypMCbLPPHEmf9DgMGw51jMj77VfGPAN2Kv4cfhlfgI=
2030
github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.11.4/go.mod h1:Vz1JQXliGcQktFTN/LN6uGppAIRoLBR2bMvIMP0gOjc=
2131
github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.11.19 h1:rfprUlsdzgl7ZL2KlXiUAoJnI/VxfHCvDFr2QDFj6u4=
@@ -28,10 +38,14 @@ github.com/aws/aws-sdk-go-v2/service/sts v1.30.7 h1:NKTa1eqZYw8tiHSRGpP0VtTdub/8
2838
github.com/aws/aws-sdk-go-v2/service/sts v1.30.7/go.mod h1:NXi1dIAGteSaRLqYgarlhP/Ij0cFT+qmCwiJqWh/U5o=
2939
github.com/aws/smithy-go v1.20.4 h1:2HK1zBdPgRbjFOHlfeQZfpC4r72MOb9bZkiFwggKO+4=
3040
github.com/aws/smithy-go v1.20.4/go.mod h1:irrKGvNn1InZwb2d7fkIRNucdfwR8R+Ts3wxYa/cJHg=
41+
github.com/aws/smithy-go v1.22.3 h1:Z//5NuZCSW6R4PhQ93hShNbyBbn8BWCmCVCt+Q8Io5k=
42+
github.com/aws/smithy-go v1.22.3/go.mod h1:t1ufH5HMublsJYulve2RKmHDC15xu1f26kHCp/HgceI=
3143
github.com/awsdocs/aws-doc-sdk-examples/gov2/demotools v0.0.0-20240907001412-a9375541143b h1:hht3uw0tZ+rQrgtecFzVsuPmssyIBlqhWWpnui9wuQA=
3244
github.com/awsdocs/aws-doc-sdk-examples/gov2/demotools v0.0.0-20240907001412-a9375541143b/go.mod h1:iBzksyiv5HVU+cymGDQbbvcecca+rsARJlDFL8np8oE=
3345
github.com/awsdocs/aws-doc-sdk-examples/gov2/testtools v0.0.0-20240907001412-a9375541143b h1:UmPy4pArM7SIhTX2Xn5bhOkgI9onSUQ1Y9fxgDJ3pHU=
3446
github.com/awsdocs/aws-doc-sdk-examples/gov2/testtools v0.0.0-20240907001412-a9375541143b/go.mod h1:9Oj/8PZn3D5Ftp/Z1QWrIEFE0daERMqfJawL9duHRfc=
47+
github.com/awsdocs/aws-doc-sdk-examples/gov2/testtools v0.0.0-20250401185104-e9ddacfbb4a0 h1:8wIrkz0/gDLjtTmDbRDMvxkM9Uk5ZMVa1kLKY+j5Plg=
48+
github.com/awsdocs/aws-doc-sdk-examples/gov2/testtools v0.0.0-20250401185104-e9ddacfbb4a0/go.mod h1:9Oj/8PZn3D5Ftp/Z1QWrIEFE0daERMqfJawL9duHRfc=
3549
golang.org/x/sys v0.25.0 h1:r+8e+loiHxRqhXVl6ML1nO3l1+oFoWbnlu2Ehimmi34=
3650
golang.org/x/sys v0.25.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
3751
golang.org/x/term v0.24.0 h1:Mh5cbb+Zk2hqqXNO7S1iTjEphVL+jb8ZWaqh/g+JWkM=

Diff for: gov2/bedrock-runtime/scenarios/scenario_converse.go

+72
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
1+
// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
2+
// SPDX-License-Identifier: Apache-2.0
3+
4+
package scenarios
5+
6+
// snippet-start:[gov2.bedrock-runtime.Scenario_Converse]
7+
8+
import (
9+
"context"
10+
"log"
11+
"strings"
12+
13+
"github.com/aws/aws-sdk-go-v2/aws"
14+
"github.com/aws/aws-sdk-go-v2/service/bedrockruntime"
15+
"github.com/awsdocs/aws-doc-sdk-examples/gov2/bedrock-runtime/actions"
16+
"github.com/awsdocs/aws-doc-sdk-examples/gov2/demotools"
17+
)
18+
19+
// ConverseScenario demonstrates how to use the Amazon Bedrock Runtime client
20+
// to Converse with Anthropic Claude
21+
type ConverseScenario struct {
22+
sdkConfig aws.Config
23+
questioner demotools.IQuestioner
24+
converseWrapper actions.ConverseWrapper
25+
}
26+
27+
// NewConverseScenario constructs a ConverseScenario instance from a configuration.
28+
// It uses the specified config to get a Bedrock Runtime client and create wrappers for the
29+
// actions used in the scenario.
30+
func NewConverseScenario(sdkConfig aws.Config, questioner demotools.IQuestioner) ConverseScenario {
31+
client := bedrockruntime.NewFromConfig(sdkConfig)
32+
return ConverseScenario{
33+
sdkConfig: sdkConfig,
34+
questioner: questioner,
35+
converseWrapper: actions.ConverseWrapper{BedrockRuntimeClient: client},
36+
}
37+
}
38+
39+
// Run runs the interactive scenario.
40+
func (scenario ConverseScenario) Run(ctx context.Context) {
41+
defer func() {
42+
if r := recover(); r != nil {
43+
log.Printf("Something went wrong with the demo: %v\n", r)
44+
}
45+
}()
46+
47+
log.Println(strings.Repeat("=", 77))
48+
log.Println("Welcome to the Amazon Bedrock Runtime model invocation demo.")
49+
log.Println(strings.Repeat("=", 77))
50+
51+
log.Printf("First, let's invoke a few large-language models using the synchronous client:\n\n")
52+
53+
text2textPrompt := "In one paragraph, who are you?"
54+
55+
log.Println(strings.Repeat("-", 77))
56+
log.Printf("Invoking Claude with prompt: %v\n", text2textPrompt)
57+
scenario.ConverseClaude(ctx, text2textPrompt)
58+
59+
log.Println(strings.Repeat("=", 77))
60+
log.Println("Thanks for watching!")
61+
log.Println(strings.Repeat("=", 77))
62+
}
63+
64+
func (scenario ConverseScenario) ConverseClaude(ctx context.Context, prompt string) {
65+
completion, err := scenario.converseWrapper.ConverseClaude(ctx, prompt)
66+
if err != nil {
67+
panic(err)
68+
}
69+
log.Printf("\nClaude : %v\n", strings.TrimSpace(completion))
70+
}
71+
72+
// snippet-end:[gov2.bedrock-runtime.Scenario_Converse]

Diff for: gov2/bedrock-runtime/stubs/converse_stubs.go

+34
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
2+
// SPDX-License-Identifier: Apache-2.0
3+
4+
// Defines stubs used for unit testing the Bedrock Runtime actions.
5+
6+
package stubs
7+
8+
import (
9+
"github.com/aws/aws-sdk-go-v2/aws"
10+
"github.com/aws/aws-sdk-go-v2/service/bedrockruntime"
11+
"github.com/aws/aws-sdk-go-v2/service/bedrockruntime/types"
12+
"github.com/awsdocs/aws-doc-sdk-examples/gov2/testtools"
13+
)
14+
15+
type StubConverseParams struct {
16+
ModelId string
17+
Messages []types.Message
18+
Result types.Message
19+
RaiseErr *testtools.StubError
20+
}
21+
22+
func StubConverse(params StubConverseParams) testtools.Stub {
23+
return testtools.Stub{
24+
OperationName: "Converse",
25+
Input: &bedrockruntime.ConverseInput{
26+
ModelId: aws.String(params.ModelId),
27+
Messages: params.Messages,
28+
},
29+
Output: &bedrockruntime.ConverseOutput{
30+
Output: &types.ConverseOutputMemberMessage{Value: params.Result},
31+
},
32+
Error: params.RaiseErr,
33+
}
34+
}

0 commit comments

Comments
 (0)