@@ -6,24 +6,28 @@ import (
66 "strings"
77 "time"
88
9+ "path/filepath"
10+
911 "github.com/briandowns/spinner"
1012 "github.com/fatih/color"
11- "github.com/spf13/cobra"
1213 "github.com/helmcode/kubectl-ai/pkg/analyzer"
1314 "github.com/helmcode/kubectl-ai/pkg/formatter"
1415 "github.com/helmcode/kubectl-ai/pkg/k8s"
16+ "github.com/helmcode/kubectl-ai/pkg/llm"
17+ "github.com/spf13/cobra"
1518 "k8s.io/client-go/util/homedir"
16- "path/filepath"
1719)
1820
1921var (
20- kubeconfig string
21- namespace string
22- kubeContext string
23- resources []string
22+ kubeconfig string
23+ namespace string
24+ kubeContext string
25+ resources []string
2426 allResources bool
2527 outputFormat string
26- verbose bool
28+ verbose bool
29+ llmProvider string
30+ llmModel string
2731)
2832
2933func NewDebugCmd () * cobra.Command {
@@ -54,24 +58,20 @@ Examples:
5458 }
5559
5660 cmd .Flags ().StringVarP (& namespace , "namespace" , "n" , "default" , "Kubernetes namespace" )
57- cmd .Flags ().StringVar (& kubeContext , "context" , "" , "Kubeconfig context (overrides current-context)" )
61+ cmd .Flags ().StringVar (& kubeContext , "context" , "" , "Kubeconfig context (overrides current-context)" )
5862 cmd .Flags ().StringSliceVarP (& resources , "resource" , "r" , []string {}, "Resources to analyze (e.g., deployment/nginx, pod/nginx-xxx)" )
5963 cmd .Flags ().BoolVar (& allResources , "all" , false , "Analyze all resources in the namespace" )
6064 cmd .Flags ().StringVarP (& outputFormat , "output" , "o" , "human" , "Output format (human, json, yaml)" )
6165 cmd .Flags ().BoolVarP (& verbose , "verbose" , "v" , false , "Verbose output" )
66+ cmd .Flags ().StringVar (& llmProvider , "provider" , "" , "LLM provider (claude, openai). Defaults to auto-detect from env" )
67+ cmd .Flags ().StringVar (& llmModel , "model" , "" , "LLM model to use (overrides default)" )
6268
6369 return cmd
6470}
6571
6672func runDebug (cmd * cobra.Command , args []string ) error {
6773 problem := args [0 ]
6874
69- // Validate that we have API key
70- apiKey := os .Getenv ("ANTHROPIC_API_KEY" )
71- if apiKey == "" {
72- return fmt .Errorf ("ANTHROPIC_API_KEY environment variable not set" )
73- }
74-
7575 // Validate inputs
7676 if ! allResources && len (resources ) == 0 {
7777 return fmt .Errorf ("either specify resources with -r or use --all flag" )
@@ -87,9 +87,9 @@ func runDebug(cmd *cobra.Command, args []string) error {
8787
8888 // Expand home symbol in kubeconfig if needed
8989 if strings .HasPrefix (kubeconfig , "~/" ) {
90- if homeDir , err := os .UserHomeDir (); err == nil {
91- kubeconfig = filepath .Join (homeDir , kubeconfig [2 :])
92- }
90+ if homeDir , err := os .UserHomeDir (); err == nil {
91+ kubeconfig = filepath .Join (homeDir , kubeconfig [2 :])
92+ }
9393 }
9494
9595 // Initialize K8s client
@@ -113,10 +113,27 @@ func runDebug(cmd *cobra.Command, args []string) error {
113113 s .Stop ()
114114 printSuccess (fmt .Sprintf ("Gathered %d resources" , len (resourcesData )))
115115
116+ s .Suffix = " Initializing AI client..."
117+ s .Start ()
118+
119+ // Initialize LLM client using factory
120+ llmClient , err := llm .CreateFromEnv (llmProvider , llmModel )
121+ if err != nil {
122+ s .Stop ()
123+ return fmt .Errorf ("failed to initialize LLM client: %w" , err )
124+ }
125+
126+ s .Stop ()
127+ printSuccess ("AI client initialized" )
128+
129+ // Show LLM provider and model info
130+ printLLMInfo (llmClient )
131+ fmt .Println ()
132+
116133 s .Suffix = " Analyzing with AI..."
117134 s .Start ()
118135
119- aiAnalyzer := analyzer .New ( apiKey )
136+ aiAnalyzer := analyzer .NewWithLLM ( llmClient )
120137 analysis , err := aiAnalyzer .Analyze (problem , resourcesData )
121138 if err != nil {
122139 s .Stop ()
@@ -146,6 +163,24 @@ func printHeader(problem string) {
146163 fmt .Println ()
147164}
148165
166+ func printLLMInfo (llmClient llm.LLM ) {
167+ // Get provider and model info from the LLM client
168+ provider := "unknown"
169+ model := "unknown"
170+
171+ // Type assertion to get provider and model information
172+ switch client := llmClient .(type ) {
173+ case * llm.Claude :
174+ provider = "claude"
175+ model = client .GetModel ()
176+ case * llm.OpenAI :
177+ provider = "openai"
178+ model = client .GetModel ()
179+ }
180+
181+ fmt .Printf ("🤖 LLM Provider: %s (%s)\n " , provider , model )
182+ }
183+
149184func printSuccess (msg string ) {
150185 green := color .New (color .FgGreen )
151186 green .Printf ("✓ %s\n " , msg )
@@ -154,4 +189,4 @@ func printSuccess(msg string) {
154189func printError (msg string ) {
155190 red := color .New (color .FgRed )
156191 red .Printf ("✗ %s\n " , msg )
157- }
192+ }
0 commit comments