From f1a7801e9e6a7e4a5310622951dfba3ba3acd047 Mon Sep 17 00:00:00 2001 From: StevenSu Date: Sat, 28 Oct 2023 18:49:09 +0800 Subject: [PATCH] feat: add amazonbedrock (#718) * add amazonbedrock AI provider Signed-off-by: Su Wei * add amazonbedrock, change model list to const var Signed-off-by: Su Wei * update iai config and auth cmd, add providerRegion Signed-off-by: Wei Su * fix filename wrong Signed-off-by: Wei Su * chore: added some doc info Signed-off-by: Alex Jones --------- Signed-off-by: Su Wei Signed-off-by: Wei Su Signed-off-by: Alex Jones Co-authored-by: Wei Su Co-authored-by: Aris Boutselis Co-authored-by: Alex Jones --- README.md | 43 +++++++++ cmd/auth/add.go | 16 ++-- cmd/auth/auth.go | 13 +-- images/bedrock.png | Bin 0 -> 80914 bytes pkg/ai/amazonbedrock.go | 196 ++++++++++++++++++++++++++++++++++++++++ pkg/ai/iai.go | 20 ++-- 6 files changed, 270 insertions(+), 18 deletions(-) create mode 100644 images/bedrock.png create mode 100644 pkg/ai/amazonbedrock.go diff --git a/README.md b/README.md index 5b676f478b..847d44c6ee 100644 --- a/README.md +++ b/README.md @@ -14,6 +14,8 @@ It has SRE experience codified into its analyzers and helps to pull out the most relevant information to enrich it with AI. +_Out of the box integration with OpenAI, Azure, Cohere, Amazon Bedrock and local models._ + K8sGPT - K8sGPT gives Kubernetes Superpowers to everyone | Product Hunt @@ -359,6 +361,45 @@ k8sgpt analyze --explain --backend cohere +
+Amazon Bedrock provider + + +Prerequisites +Bedrock API access is needed. + + + +As illustrated below, you will need to enable this in the [AWS Console](https://eu-central-1.console.aws.amazon.com/bedrock/home?region=eu-central-1#/modelaccess) + +In addition to this you will need to set the follow local environmental variables: + + +``` +- AWS_ACCESS_KEY +- AWS_SECRET_ACCESS_KEY +- AWS_DEFAULT_REGION +``` + + +``` +k8sgpt auth add --backend amazonbedrock --model anthropic.claude-v2 +``` + +TODO: Currently access key will be requested in the CLI, you can enter anything into this. + +#### Usage + +``` +k8sgpt analyze -e -b amazonbedrock + +0 argocd/argocd-application-controller(argocd-application-controller) +- Error: StatefulSet uses the service argocd/argocd-application-controller which does not exist. + + You're right, I don't have enough context to determine if a StatefulSet is correctly configured to use a non-existent service. A StatefulSet manages Pods with persistent storage, and the Pods are created from the same spec. The service name referenced in the StatefulSet configuration would need to match an existing Kubernetes service for the Pods to connect to. Without more details on the specific StatefulSet and environment, I can't confirm whether the configuration is valid or not. +``` +
+
Setting a new default AI provider @@ -376,6 +417,8 @@ Active: Unused: > localai > noopai +> amazonbedrock +> cohere ``` diff --git a/cmd/auth/add.go b/cmd/auth/add.go index fcae197152..89ca4da73f 100644 --- a/cmd/auth/add.go +++ b/cmd/auth/add.go @@ -41,6 +41,7 @@ var addCmd = &cobra.Command{ _ = cmd.MarkFlagRequired("engine") _ = cmd.MarkFlagRequired("baseurl") } + }, Run: func(cmd *cobra.Command, args []string) { @@ -103,12 +104,13 @@ var addCmd = &cobra.Command{ // create new provider object newProvider := ai.AIProvider{ - Name: backend, - Model: model, - Password: password, - BaseURL: baseURL, - Engine: engine, - Temperature: temperature, + Name: backend, + Model: model, + Password: password, + BaseURL: baseURL, + Engine: engine, + Temperature: temperature, + ProviderRegion: providerRegion, } if providerIndex == -1 { @@ -140,4 +142,6 @@ func init() { addCmd.Flags().Float32VarP(&temperature, "temperature", "t", 0.7, "The sampling temperature, value ranges between 0 ( output be more deterministic) and 1 (more random)") // add flag for azure open ai engine/deployment name addCmd.Flags().StringVarP(&engine, "engine", "e", "", "Azure AI deployment name") + //add flag for amazonbedrock region name + addCmd.Flags().StringVarP(&providerRegion, "providerRegion", "r", "", "Provider Region name") } diff --git a/cmd/auth/auth.go b/cmd/auth/auth.go index b64f54f5c6..b66f027a0a 100644 --- a/cmd/auth/auth.go +++ b/cmd/auth/auth.go @@ -19,12 +19,13 @@ import ( ) var ( - backend string - password string - baseURL string - model string - engine string - temperature float32 + backend string + password string + baseURL string + model string + engine string + temperature float32 + providerRegion string ) var configAI ai.AIConfiguration diff --git a/images/bedrock.png b/images/bedrock.png new file mode 100644 index 0000000000000000000000000000000000000000..501a01701f7f1579eca6aafe260189df1492d3d9 GIT binary patch literal 80914 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 DnQ+m3 literal 0 HcmV?d00001 diff --git a/pkg/ai/amazonbedrock.go b/pkg/ai/amazonbedrock.go new file mode 100644 index 0000000000..732d4e7bb4 --- /dev/null +++ b/pkg/ai/amazonbedrock.go @@ -0,0 +1,196 @@ +package ai + +import ( + "context" + "encoding/base64" + "encoding/json" + "fmt" + "strings" + + "github.com/fatih/color" + + "github.com/k8sgpt-ai/k8sgpt/pkg/cache" + "github.com/k8sgpt-ai/k8sgpt/pkg/util" + + "github.com/aws/aws-sdk-go/aws" + "github.com/aws/aws-sdk-go/aws/session" + "github.com/aws/aws-sdk-go/service/bedrockruntime" +) + +// AmazonBedRockClient represents the client for interacting with the Amazon Bedrock service. +type AmazonBedRockClient struct { + client *bedrockruntime.BedrockRuntime + language string + model string + temperature float32 +} + +// InvokeModelResponseBody represents the response body structure from the model invocation. +type InvokeModelResponseBody struct { + Completion string `json:"completion"` + Stop_reason string `json:"stop_reason"` +} + +// Amazon BedRock support region list US East (N. Virginia),US West (Oregon),Asia Pacific (Singapore),Asia Pacific (Tokyo),Europe (Frankfurt) +// https://docs.aws.amazon.com/bedrock/latest/userguide/what-is-bedrock.html#bedrock-regions +const BEDROCK_DEFAULT_REGION = "us-east-1" // default use us-east-1 region + +const ( + US_East_1 = "us-east-1" + US_West_2 = "us-west-2" + AP_Southeast_1 = "ap-southeast-1" + AP_Northeast_1 = "ap-northeast-1" + EU_Central_1 = "eu-central-1" +) + +var BEDROCKER_SUPPORTED_REGION = []string{ + US_East_1, + US_West_2, + AP_Southeast_1, + AP_Northeast_1, + EU_Central_1, +} + +const ( + ModelAnthropicClaudeV2 = "anthropic.claude-v2" + ModelAnthropicClaudeV1 = "anthropic.claude-v1" + ModelAnthropicClaudeInstantV1 = "anthropic.claude-instant-v1" +) + +var BEDROCK_MODELS = []string{ + ModelAnthropicClaudeV2, + ModelAnthropicClaudeV1, + ModelAnthropicClaudeInstantV1, +} + +// GetModelOrDefault check config model +func GetModelOrDefault(model string) string { + + // Check if the provided model is in the list + for _, m := range BEDROCK_MODELS { + if m == model { + return model // Return the provided model + } + } + + // Return the default model if the provided model is not in the list + return BEDROCK_MODELS[0] +} + +// GetModelOrDefault check config region +func GetRegionOrDefault(region string) string { + + // Check if the provided model is in the list + for _, m := range BEDROCKER_SUPPORTED_REGION { + if m == region { + return region // Return the provided model + } + } + + // Return the default model if the provided model is not in the list + return BEDROCK_DEFAULT_REGION +} + +// Configure configures the AmazonBedRockClient with the provided configuration and language. +func (a *AmazonBedRockClient) Configure(config IAIConfig, language string) error { + + // Create a new AWS session + providerRegion := GetRegionOrDefault(config.GetProviderRegion()) + + sess, err := session.NewSession(&aws.Config{ + Region: aws.String(providerRegion), + }) + + if err != nil { + return err + } + + // Create a new BedrockRuntime client + a.client = bedrockruntime.New(sess) + a.language = language + a.model = GetModelOrDefault(config.GetModel()) + a.temperature = config.GetTemperature() + + return nil +} + +// GetCompletion sends a request to the model for generating completion based on the provided prompt. +func (a *AmazonBedRockClient) GetCompletion(ctx context.Context, prompt string, promptTmpl string) (string, error) { + + // Prepare the input data for the model invocation + request := map[string]interface{}{ + "prompt": fmt.Sprintf("\n\nHuman: %s \n\nAssistant:", prompt), + "max_tokens_to_sample": 1024, + "temperature": a.temperature, + "top_p": 0.9, + } + + body, err := json.Marshal(request) + if err != nil { + return "", err + } + + // Build the parameters for the model invocation + params := &bedrockruntime.InvokeModelInput{ + Body: body, + ModelId: aws.String(a.model), + ContentType: aws.String("application/json"), + Accept: aws.String("application/json"), + } + // Invoke the model + resp, err := a.client.InvokeModelWithContext(ctx, params) + + if err != nil { + return "", err + } + // Parse the response body + output := &InvokeModelResponseBody{} + err = json.Unmarshal(resp.Body, output) + if err != nil { + return "", err + } + return output.Completion, nil +} + +// Parse generates a completion for the provided prompt using the Amazon Bedrock model. +func (a *AmazonBedRockClient) Parse(ctx context.Context, prompt []string, cache cache.ICache, promptTmpl string) (string, error) { + inputKey := strings.Join(prompt, " ") + // Check for cached data + cacheKey := util.GetCacheKey(a.GetName(), a.language, inputKey) + + if !cache.IsCacheDisabled() && cache.Exists(cacheKey) { + response, err := cache.Load(cacheKey) + if err != nil { + return "", err + } + + if response != "" { + output, err := base64.StdEncoding.DecodeString(response) + if err != nil { + color.Red("error decoding cached data: %v", err) + return "", nil + } + return string(output), nil + } + } + + response, err := a.GetCompletion(ctx, inputKey, promptTmpl) + + if err != nil { + return "", err + } + + err = cache.Store(cacheKey, base64.StdEncoding.EncodeToString([]byte(response))) + + if err != nil { + color.Red("error storing value to cache: %v", err) + return "", nil + } + + return response, nil +} + +// GetName returns the name of the AmazonBedRockClient. +func (a *AmazonBedRockClient) GetName() string { + return "amazonbedrock" +} diff --git a/pkg/ai/iai.go b/pkg/ai/iai.go index b8172d161b..430e04ca4e 100644 --- a/pkg/ai/iai.go +++ b/pkg/ai/iai.go @@ -26,6 +26,7 @@ var ( &LocalAIClient{}, &NoOpAIClient{}, &CohereClient{}, + &AmazonBedRockClient{}, } Backends = []string{ "openai", @@ -33,6 +34,7 @@ var ( "azureopenai", "noopai", "cohere", + "amazonbedrock", } ) @@ -49,6 +51,7 @@ type IAIConfig interface { GetBaseURL() string GetEngine() string GetTemperature() float32 + GetProviderRegion() string } func NewClient(provider string) IAI { @@ -67,12 +70,13 @@ type AIConfiguration struct { } type AIProvider struct { - Name string `mapstructure:"name"` - Model string `mapstructure:"model"` - Password string `mapstructure:"password" yaml:"password,omitempty"` - BaseURL string `mapstructure:"baseurl" yaml:"baseurl,omitempty"` - Engine string `mapstructure:"engine" yaml:"engine,omitempty"` - Temperature float32 `mapstructure:"temperature" yaml:"temperature,omitempty"` + Name string `mapstructure:"name"` + Model string `mapstructure:"model"` + Password string `mapstructure:"password" yaml:"password,omitempty"` + BaseURL string `mapstructure:"baseurl" yaml:"baseurl,omitempty"` + Engine string `mapstructure:"engine" yaml:"engine,omitempty"` + Temperature float32 `mapstructure:"temperature" yaml:"temperature,omitempty"` + ProviderRegion string `mapstructure:"providerregion" yaml:"providerregion,omitempty"` } func (p *AIProvider) GetBaseURL() string { @@ -94,6 +98,10 @@ func (p *AIProvider) GetTemperature() float32 { return p.Temperature } +func (p *AIProvider) GetProviderRegion() string { + return p.ProviderRegion +} + func NeedPassword(backend string) bool { return backend != "localai" }