@@ -18,6 +18,15 @@ extension RemoteProviderConfigurationSheet {
1818 llmProviderForPicker == . codex
1919 }
2020
21+ var isStepFunLLMProvider : Bool {
22+ llmProviderForPicker == . stepFun
23+ }
24+
25+ var supportsStepFunReasoningEffort : Bool {
26+ isStepFunLLMProvider &&
27+ resolvedModelValue ( ) . trimmingCharacters ( in: . whitespacesAndNewlines) . lowercased ( ) == " step-3.5-flash-2603 "
28+ }
29+
2130 var usesOpenAIResponsesOptions : Bool {
2231 isOpenAILLMProvider
2332 }
@@ -143,9 +152,12 @@ extension RemoteProviderConfigurationSheet {
143152 }
144153
145154 var shouldShowGenerationThinking : Bool {
155+ if isStepFunLLMProvider {
156+ return generationThinkingModeMenuOptions. count > 1
157+ }
146158 guard let capabilities = generationCapabilities else { return false }
147159 return capabilities. supportsThinkingToggle ||
148- capabilities. supportsThinkingEffort ||
160+ ( capabilities. supportsThinkingEffort && ( !isStepFunLLMProvider || supportsStepFunReasoningEffort ) ) ||
149161 capabilities. supportsThinkingBudget
150162 }
151163
@@ -165,13 +177,20 @@ extension RemoteProviderConfigurationSheet {
165177 }
166178
167179 var generationThinkingModeMenuOptions : [ SettingsMenuOption < String > ] {
180+ if isStepFunLLMProvider {
181+ var options = [ SettingsMenuOption ( value: LLMThinkingMode . off. rawValue, title: AppLocalization . localizedString ( " Off " ) ) ]
182+ if supportsStepFunReasoningEffort {
183+ options. append ( SettingsMenuOption ( value: LLMThinkingMode . effort. rawValue, title: AppLocalization . localizedString ( " Effort " ) ) )
184+ }
185+ return options
186+ }
168187 guard let capabilities = generationCapabilities else { return [ ] }
169188 var options = [ SettingsMenuOption ( value: LLMThinkingMode . providerDefault. rawValue, title: AppLocalization . localizedString ( " Default " ) ) ]
170189 if capabilities. supportsThinkingToggle {
171190 options. append ( SettingsMenuOption ( value: LLMThinkingMode . off. rawValue, title: AppLocalization . localizedString ( " Off " ) ) )
172191 options. append ( SettingsMenuOption ( value: LLMThinkingMode . on. rawValue, title: AppLocalization . localizedString ( " On " ) ) )
173192 }
174- if capabilities. supportsThinkingEffort {
193+ if capabilities. supportsThinkingEffort && ( !isStepFunLLMProvider || supportsStepFunReasoningEffort ) {
175194 options. append ( SettingsMenuOption ( value: LLMThinkingMode . effort. rawValue, title: AppLocalization . localizedString ( " Effort " ) ) )
176195 }
177196 if capabilities. supportsThinkingBudget {
@@ -182,12 +201,15 @@ extension RemoteProviderConfigurationSheet {
182201
183202 var generationThinkingModeSelectedTitle : String {
184203 generationThinkingModeMenuOptions. first ( where: { $0. value == generationThinkingMode } ) ? . title
185- ?? AppLocalization . localizedString ( " Default " )
204+ ?? ( isStepFunLLMProvider ? AppLocalization . localizedString ( " Off " ) : AppLocalization . localizedString ( " Default " ) )
186205 }
187206
188207 var sanitizedGenerationThinkingMode : LLMThinkingMode {
189208 let mode = LLMThinkingMode ( rawValue: generationThinkingMode) ?? . providerDefault
190209 let supportedValues = Set ( generationThinkingModeMenuOptions. map ( \. value) )
210+ if isStepFunLLMProvider, !supportedValues. contains ( mode. rawValue) {
211+ return . off
212+ }
191213 return supportedValues. contains ( mode. rawValue) ? mode : . providerDefault
192214 }
193215
@@ -197,6 +219,8 @@ extension RemoteProviderConfigurationSheet {
197219 values = OpenAIReasoningEffort . supportedCases ( forModel: resolvedModelValue ( ) )
198220 . filter { $0 != . automatic }
199221 . map ( \. rawValue)
222+ } else if isStepFunLLMProvider {
223+ values = supportsStepFunReasoningEffort ? [ " low " , " high " ] : [ ]
200224 } else if isOllamaLLMProvider {
201225 values = [
202226 OllamaThinkMode . low. rawValue,
@@ -273,6 +297,9 @@ extension RemoteProviderConfigurationSheet {
273297 }
274298 let capabilities = LLMProviderCapabilityRegistry . capabilities ( for: provider)
275299 var settings = LLMGenerationSettings ( )
300+ if isStepFunLLMProvider {
301+ settings. thinking = . off
302+ }
276303 settings. maxOutputTokens = capabilities. supportsMaxOutputTokens ? parsedOptionalInt ( generationMaxOutputTokensText) : nil
277304 settings. temperature = capabilities. supportsTemperature ? parsedOptionalDouble ( generationTemperatureText) : nil
278305 settings. topP = capabilities. supportsTopP ? parsedOptionalDouble ( generationTopPText) : nil
@@ -281,9 +308,11 @@ extension RemoteProviderConfigurationSheet {
281308 settings. seed = capabilities. supportsSeed ? parsedOptionalInt ( generationSeedText) : nil
282309 settings. stop = capabilities. supportsStopSequences ? parsedStopSequences ( ) : [ ]
283310 if capabilities. supportsPenalties {
284- settings. presencePenalty = parsedOptionalDouble ( generationPresencePenaltyText)
285311 settings. frequencyPenalty = parsedOptionalDouble ( generationFrequencyPenaltyText)
286- settings. repetitionPenalty = parsedOptionalDouble ( generationRepetitionPenaltyText)
312+ if !isStepFunLLMProvider {
313+ settings. presencePenalty = parsedOptionalDouble ( generationPresencePenaltyText)
314+ settings. repetitionPenalty = parsedOptionalDouble ( generationRepetitionPenaltyText)
315+ }
287316 }
288317 if capabilities. supportsLogprobs {
289318 settings. logprobs = generationLogprobsEnabled
@@ -653,9 +682,11 @@ extension RemoteProviderConfigurationSheet {
653682 doubleFields. append ( ( generationMinPText, AppLocalization . localizedString ( " Min P " ) ) )
654683 }
655684 if capabilities. supportsPenalties {
656- doubleFields. append ( ( generationPresencePenaltyText, AppLocalization . localizedString ( " Presence Penalty " ) ) )
657685 doubleFields. append ( ( generationFrequencyPenaltyText, AppLocalization . localizedString ( " Frequency Penalty " ) ) )
658- doubleFields. append ( ( generationRepetitionPenaltyText, AppLocalization . localizedString ( " Repetition Penalty " ) ) )
686+ if !isStepFunLLMProvider {
687+ doubleFields. append ( ( generationPresencePenaltyText, AppLocalization . localizedString ( " Presence Penalty " ) ) )
688+ doubleFields. append ( ( generationRepetitionPenaltyText, AppLocalization . localizedString ( " Repetition Penalty " ) ) )
689+ }
659690 }
660691 for (text, fieldName) in doubleFields where !text. trimmingCharacters ( in: . whitespacesAndNewlines) . isEmpty {
661692 guard Double ( text. trimmingCharacters ( in: . whitespacesAndNewlines) ) != nil else {
0 commit comments