(premium bool, builderMode bool, rtInfo waveobj.ObjRTInfo, aiModeName string)
| 72 | } |
| 73 | |
| 74 | func getWaveAISettings(premium bool, builderMode bool, rtInfo waveobj.ObjRTInfo, aiModeName string) (*uctypes.AIOptsType, error) { |
| 75 | maxTokens := DefaultMaxTokens |
| 76 | if builderMode { |
| 77 | maxTokens = BuilderMaxTokens |
| 78 | } |
| 79 | if rtInfo.WaveAIMaxOutputTokens > 0 { |
| 80 | maxTokens = rtInfo.WaveAIMaxOutputTokens |
| 81 | } |
| 82 | aiMode, config, err := resolveAIMode(aiModeName, premium) |
| 83 | if err != nil { |
| 84 | return nil, err |
| 85 | } |
| 86 | if config.WaveAICloud && !telemetry.IsTelemetryEnabled() { |
| 87 | return nil, fmt.Errorf("Wave AI cloud modes require telemetry to be enabled") |
| 88 | } |
| 89 | apiToken := config.APIToken |
| 90 | if apiToken == "" && config.APITokenSecretName != "" { |
| 91 | secret, exists, err := secretstore.GetSecret(config.APITokenSecretName) |
| 92 | if err != nil { |
| 93 | return nil, fmt.Errorf("failed to retrieve secret %s: %w", config.APITokenSecretName, err) |
| 94 | } |
| 95 | secret = strings.TrimSpace(secret) |
| 96 | if !exists || secret == "" { |
| 97 | return nil, fmt.Errorf("secret %s not found or empty", config.APITokenSecretName) |
| 98 | } |
| 99 | apiToken = secret |
| 100 | } |
| 101 | |
| 102 | var baseUrl string |
| 103 | if config.Endpoint != "" { |
| 104 | baseUrl = config.Endpoint |
| 105 | } else { |
| 106 | return nil, fmt.Errorf("no ai:endpoint configured for AI mode %s", aiMode) |
| 107 | } |
| 108 | |
| 109 | thinkingLevel := config.ThinkingLevel |
| 110 | if thinkingLevel == "" { |
| 111 | thinkingLevel = uctypes.ThinkingLevelMedium |
| 112 | } |
| 113 | verbosity := config.Verbosity |
| 114 | if verbosity == "" { |
| 115 | verbosity = uctypes.VerbosityLevelMedium // default to medium |
| 116 | } |
| 117 | opts := &uctypes.AIOptsType{ |
| 118 | Provider: config.Provider, |
| 119 | APIType: config.APIType, |
| 120 | Model: config.Model, |
| 121 | MaxTokens: maxTokens, |
| 122 | ThinkingLevel: thinkingLevel, |
| 123 | Verbosity: verbosity, |
| 124 | AIMode: aiMode, |
| 125 | Endpoint: baseUrl, |
| 126 | ProxyURL: config.ProxyURL, |
| 127 | Capabilities: config.Capabilities, |
| 128 | WaveAIPremium: config.WaveAIPremium, |
| 129 | } |
| 130 | if apiToken != "" { |
| 131 | opts.APIToken = apiToken |
no test coverage detected