-
Notifications
You must be signed in to change notification settings - Fork 21
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
1 parent
5563af9
commit 68e2c50
Showing
21 changed files
with
1,015 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,39 @@ | ||
using System.Text.Json; | ||
using System.Text.Json.Nodes; | ||
using Amazon.BedrockRuntime; | ||
using Amazon.BedrockRuntime.Model; | ||
using Temporalio.Activities; | ||
|
||
namespace TemporalioSamples.Bedrock.Basic; | ||
|
||
public class BedrockActivities(IAmazonBedrockRuntime bedrock) | ||
{ | ||
public record PromptArgs(string Prompt); | ||
|
||
public record PromptResult(string Response); | ||
|
||
[Activity] | ||
public async Task<PromptResult> PromptBedrockAsync(PromptArgs args) | ||
{ | ||
var body = JsonSerializer.Serialize(new | ||
{ | ||
prompt = args.Prompt, | ||
max_gen_len = 512, | ||
temperature = 0.1, | ||
top_p = 0.2, | ||
}); | ||
|
||
var request = new InvokeModelRequest | ||
{ | ||
ModelId = "meta.llama3-1-70b-instruct-v1:0", | ||
Accept = "application/json", | ||
ContentType = "application/json", | ||
Body = new MemoryStream(System.Text.Encoding.UTF8.GetBytes(body)), | ||
}; | ||
|
||
var response = await bedrock.InvokeModelAsync(request); | ||
var modelResponse = await JsonNode.ParseAsync(response.Body); | ||
var responseText = modelResponse?["generation"]?.ToString() ?? string.Empty; | ||
return new(responseText); | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,29 @@ | ||
using Microsoft.Extensions.Logging; | ||
using Temporalio.Workflows; | ||
|
||
namespace TemporalioSamples.Bedrock.Basic; | ||
|
||
[Workflow] | ||
public class BedrockWorkflow | ||
{ | ||
public record WorkflowArgs(string Prompt); | ||
|
||
public record WorkflowResult(string Response); | ||
|
||
[WorkflowRun] | ||
public async Task<WorkflowResult> RunAsync(WorkflowArgs args) | ||
{ | ||
Workflow.Logger.LogInformation("Prompt: {Prompt}", args.Prompt); | ||
|
||
var promptResult = await Workflow.ExecuteActivityAsync( | ||
(BedrockActivities activities) => activities.PromptBedrockAsync(new(args.Prompt)), | ||
new() | ||
{ | ||
StartToCloseTimeout = TimeSpan.FromSeconds(20), | ||
}); | ||
|
||
Workflow.Logger.LogInformation("Response:\n{Response}", promptResult.Response); | ||
|
||
return new(promptResult.Response); | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,69 @@ | ||
using Amazon.BedrockRuntime; | ||
using Microsoft.Extensions.DependencyInjection; | ||
using Microsoft.Extensions.Hosting; | ||
using Microsoft.Extensions.Logging; | ||
using Temporalio.Client; | ||
using Temporalio.Extensions.Hosting; | ||
using TemporalioSamples.Bedrock.Basic; | ||
|
||
async Task RunWorkerAsync() | ||
{ | ||
var builder = Host.CreateApplicationBuilder(args); | ||
|
||
builder.Logging. | ||
SetMinimumLevel(LogLevel.Information). | ||
AddSimpleConsole(options => options.SingleLine = true); | ||
|
||
builder.Services.AddSingleton<IAmazonBedrockRuntime>(_ => new AmazonBedrockRuntimeClient()); | ||
|
||
builder.Services. | ||
AddHostedTemporalWorker(clientTargetHost: "localhost:7233", clientNamespace: "default", taskQueue: "basic-bedrock-task-queue"). | ||
AddSingletonActivities<BedrockActivities>(). | ||
AddWorkflow<BedrockWorkflow>(); | ||
|
||
var app = builder.Build(); | ||
await app.RunAsync(); | ||
} | ||
|
||
async Task SendMessageAsync() | ||
{ | ||
var prompt = args.ElementAtOrDefault(1); | ||
if (prompt is null) | ||
{ | ||
Console.WriteLine("Usage: dotnet run send-message '<prompt>'"); | ||
Console.WriteLine("Example: dotnet run send-message 'What animals are marsupials?'"); | ||
return; | ||
} | ||
|
||
var client = await CreateClientAsync(); | ||
var workflowId = "basic-bedrock-workflow"; | ||
|
||
// Start the workflow | ||
var result = await client.ExecuteWorkflowAsync( | ||
(BedrockWorkflow workflow) => | ||
workflow.RunAsync(new(prompt)), | ||
new WorkflowOptions(workflowId, "basic-bedrock-task-queue")); | ||
|
||
Console.WriteLine($"Result: {result.Response}"); | ||
} | ||
|
||
async Task<ITemporalClient> CreateClientAsync() => | ||
await TemporalClient.ConnectAsync(new("localhost:7233") | ||
{ | ||
LoggerFactory = LoggerFactory.Create(builder => | ||
builder. | ||
AddSimpleConsole(options => options.TimestampFormat = "[HH:mm:ss] "). | ||
SetMinimumLevel(LogLevel.Information)), | ||
}); | ||
|
||
switch (args.ElementAtOrDefault(0)) | ||
{ | ||
case "worker": | ||
await RunWorkerAsync(); | ||
break; | ||
case "send-message": | ||
await SendMessageAsync(); | ||
break; | ||
default: | ||
throw new ArgumentException("Must pass 'worker' or 'send-message' as the single argument"); | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,10 @@ | ||
# Basic Amazon Bedrock workflow | ||
|
||
A basic Bedrock workflow. Starts a workflow with a prompt, generates a response and ends the workflow. | ||
|
||
To run, first see `Bedrock` [README.md](../README.md) for prerequisites specific to this sample. Once set up, run the following from this directory: | ||
|
||
1. Run the worker: `dotnet run worker` | ||
2. In another terminal run the client with a prompt: | ||
|
||
e.g. `dotnet run send-message 'What animals are marsupials?'` |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,11 @@ | ||
<Project Sdk="Microsoft.NET.Sdk"> | ||
|
||
<PropertyGroup> | ||
<OutputType>Exe</OutputType> | ||
</PropertyGroup> | ||
|
||
<ItemGroup> | ||
<PackageReference Include="AWSSDK.BedrockRuntime" Version="3.7.401.11" /> | ||
</ItemGroup> | ||
|
||
</Project> |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,39 @@ | ||
using System.Text.Json; | ||
using System.Text.Json.Nodes; | ||
using Amazon.BedrockRuntime; | ||
using Amazon.BedrockRuntime.Model; | ||
using Temporalio.Activities; | ||
|
||
namespace TemporalioSamples.Bedrock.Entity; | ||
|
||
public class BedrockActivities(IAmazonBedrockRuntime bedrock) | ||
{ | ||
public record PromptArgs(string Prompt); | ||
|
||
public record PromptResult(string Response); | ||
|
||
[Activity] | ||
public async Task<PromptResult> PromptBedrockAsync(PromptArgs args) | ||
{ | ||
var body = JsonSerializer.Serialize(new | ||
{ | ||
prompt = args.Prompt, | ||
max_gen_len = 512, | ||
temperature = 0.1, | ||
top_p = 0.2, | ||
}); | ||
|
||
var request = new InvokeModelRequest | ||
{ | ||
ModelId = "meta.llama3-1-70b-instruct-v1:0", | ||
Accept = "application/json", | ||
ContentType = "application/json", | ||
Body = new MemoryStream(System.Text.Encoding.UTF8.GetBytes(body)), | ||
}; | ||
|
||
var response = await bedrock.InvokeModelAsync(request); | ||
var modelResponse = await JsonNode.ParseAsync(response.Body); | ||
var responseText = modelResponse?["generation"]?.ToString() ?? string.Empty; | ||
return new(responseText); | ||
} | ||
} |
Oops, something went wrong.