From 867bce1907f5dd3387128b72c694e98091d55554 Mon Sep 17 00:00:00 2001 From: lif <1835304752@qq.com> Date: Mon, 5 Jan 2026 20:05:17 +0800 Subject: [PATCH] feat: add Groq as LLM provider (#1600) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Add Groq as a new AI backend provider. Groq provides an OpenAI-compatible API, so this implementation reuses the existing OpenAI client library with Groq's API endpoint. Closes #1269 🤖 Generated with [Claude Code](https://claude.com/claude-code) Signed-off-by: majiayu000 <1835304752@qq.com> Co-authored-by: Claude Opus 4.5 --- SUPPORTED_MODELS.md | 3 ++ pkg/ai/groq.go | 102 ++++++++++++++++++++++++++++++++++++++++++++ pkg/ai/iai.go | 2 + 3 files changed, 107 insertions(+) create mode 100644 pkg/ai/groq.go diff --git a/SUPPORTED_MODELS.md b/SUPPORTED_MODELS.md index 7ad34944..aff895ab 100644 --- a/SUPPORTED_MODELS.md +++ b/SUPPORTED_MODELS.md @@ -75,6 +75,9 @@ K8sGPT supports a variety of AI/LLM providers (backends). Some providers have a - **Supported Models:** - ibm/granite-13b-chat-v2 +### Groq +- **Model:** User-configurable (any model supported by Groq, e.g., `llama-3.3-70b-versatile`, `mixtral-8x7b-32768`) + --- For more details on configuring each provider and model, refer to the official K8sGPT documentation and the provider's own documentation. \ No newline at end of file diff --git a/pkg/ai/groq.go b/pkg/ai/groq.go new file mode 100644 index 00000000..0e8ce984 --- /dev/null +++ b/pkg/ai/groq.go @@ -0,0 +1,102 @@ +/* +Copyright 2023 The K8sGPT Authors. +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package ai + +import ( + "context" + "errors" + "net/http" + "net/url" + + "github.com/sashabaranov/go-openai" +) + +const groqAIClientName = "groq" + +// Default Groq API endpoint (OpenAI-compatible) +const groqAPIBaseURL = "https://api.groq.com/openai/v1" + +type GroqClient struct { + nopCloser + + client *openai.Client + model string + temperature float32 + topP float32 +} + +func (c *GroqClient) Configure(config IAIConfig) error { + token := config.GetPassword() + defaultConfig := openai.DefaultConfig(token) + proxyEndpoint := config.GetProxyEndpoint() + + baseURL := config.GetBaseURL() + if baseURL != "" { + defaultConfig.BaseURL = baseURL + } else { + defaultConfig.BaseURL = groqAPIBaseURL + } + + transport := &http.Transport{} + if proxyEndpoint != "" { + proxyUrl, err := url.Parse(proxyEndpoint) + if err != nil { + return err + } + transport.Proxy = http.ProxyURL(proxyUrl) + } + + customHeaders := config.GetCustomHeaders() + defaultConfig.HTTPClient = &http.Client{ + Transport: &OpenAIHeaderTransport{ + Origin: transport, + Headers: customHeaders, + }, + } + + client := openai.NewClientWithConfig(defaultConfig) + if client == nil { + return errors.New("error creating Groq client") + } + c.client = client + c.model = config.GetModel() + c.temperature = config.GetTemperature() + c.topP = config.GetTopP() + return nil +} + +func (c *GroqClient) GetCompletion(ctx context.Context, prompt string) (string, error) { + resp, err := c.client.CreateChatCompletion(ctx, openai.ChatCompletionRequest{ + Model: c.model, + Messages: []openai.ChatCompletionMessage{ + { + Role: "user", + Content: prompt, + }, + }, + Temperature: c.temperature, + MaxTokens: maxToken, + PresencePenalty: presencePenalty, + FrequencyPenalty: frequencyPenalty, + TopP: c.topP, + }) + if err != nil { + return "", err + } + return resp.Choices[0].Message.Content, nil +} + +func (c *GroqClient) GetName() string { + return groqAIClientName +} diff --git a/pkg/ai/iai.go b/pkg/ai/iai.go index e1e7169c..243fa546 100644 --- a/pkg/ai/iai.go +++ b/pkg/ai/iai.go @@ -34,6 +34,7 @@ var ( &OCIGenAIClient{}, &CustomRestClient{}, &IBMWatsonxAIClient{}, + &GroqClient{}, } Backends = []string{ openAIClientName, @@ -50,6 +51,7 @@ var ( ociClientName, CustomRestClientName, ibmWatsonxAIClientName, + groqAIClientName, } )