@@ -3066,6 +3066,7 @@ func (a *App) handleProviderAddFormInput(msg tea.KeyMsg) (tea.Model, tea.Cmd) {
30663066 a .providerAddForm .ModelSource = a .providerAddForm .ModelSources [currentIdx ]
30673067 clampProviderAddStep (a .providerAddForm )
30683068 } else if currentProviderAddField (a .providerAddForm ) == providerAddFieldChatAPIMode {
3069+ previousMode := a .providerAddForm .ChatAPIMode
30693070 currentIdx := 0
30703071 for i , mode := range a .providerAddForm .ChatAPIModes {
30713072 if mode == a .providerAddForm .ChatAPIMode {
@@ -3075,6 +3076,7 @@ func (a *App) handleProviderAddFormInput(msg tea.KeyMsg) (tea.Model, tea.Cmd) {
30753076 }
30763077 currentIdx = (currentIdx - 1 + len (a .providerAddForm .ChatAPIModes )) % len (a .providerAddForm .ChatAPIModes )
30773078 a .providerAddForm .ChatAPIMode = a .providerAddForm .ChatAPIModes [currentIdx ]
3079+ syncProviderAddOpenAICompatModeDefaults (a .providerAddForm , previousMode )
30783080 clampProviderAddStep (a .providerAddForm )
30793081 }
30803082 return a , nil
@@ -3106,6 +3108,7 @@ func (a *App) handleProviderAddFormInput(msg tea.KeyMsg) (tea.Model, tea.Cmd) {
31063108 a .providerAddForm .ModelSource = a .providerAddForm .ModelSources [currentIdx ]
31073109 clampProviderAddStep (a .providerAddForm )
31083110 } else if currentProviderAddField (a .providerAddForm ) == providerAddFieldChatAPIMode {
3111+ previousMode := a .providerAddForm .ChatAPIMode
31093112 currentIdx := 0
31103113 for i , mode := range a .providerAddForm .ChatAPIModes {
31113114 if mode == a .providerAddForm .ChatAPIMode {
@@ -3115,6 +3118,7 @@ func (a *App) handleProviderAddFormInput(msg tea.KeyMsg) (tea.Model, tea.Cmd) {
31153118 }
31163119 currentIdx = (currentIdx + 1 ) % len (a .providerAddForm .ChatAPIModes )
31173120 a .providerAddForm .ChatAPIMode = a .providerAddForm .ChatAPIModes [currentIdx ]
3121+ syncProviderAddOpenAICompatModeDefaults (a .providerAddForm , previousMode )
31183122 clampProviderAddStep (a .providerAddForm )
31193123 }
31203124 return a , nil
@@ -3231,6 +3235,20 @@ func providerAddDefaultOpenAICompatChatEndpointPath(chatAPIMode string) string {
32313235 return "/chat/completions"
32323236}
32333237
3238+ // syncProviderAddOpenAICompatModeDefaults 在切换 chat_api_mode 时同步默认 chat endpoint,避免默认值错配。
3239+ func syncProviderAddOpenAICompatModeDefaults (form * providerAddFormState , previousMode string ) {
3240+ if form == nil || provider .NormalizeProviderDriver (form .Driver ) != provider .DriverOpenAICompat {
3241+ return
3242+ }
3243+
3244+ currentPath := strings .TrimSpace (form .ChatEndpointPath )
3245+ previousDefaultPath := providerAddDefaultOpenAICompatChatEndpointPath (previousMode )
3246+ if currentPath != "" && currentPath != previousDefaultPath {
3247+ return
3248+ }
3249+ form .ChatEndpointPath = providerAddDefaultOpenAICompatChatEndpointPath (form .ChatAPIMode )
3250+ }
3251+
32343252// providerAddDefaultBaseURL 返回 provider add 表单的驱动默认 base URL。
32353253func providerAddDefaultBaseURL (driver string ) string {
32363254 switch provider .NormalizeProviderDriver (driver ) {
@@ -3419,11 +3437,19 @@ func parseProviderAddManualModelsJSON(raw string) ([]providertypes.ModelDescript
34193437 }
34203438
34213439 descriptors := make ([]providertypes.ModelDescriptor , 0 , len (models ))
3440+ seen := make (map [string ]struct {}, len (models ))
34223441 for _ , model := range models {
34233442 descriptor := providertypes.ModelDescriptor {
3424- ID : strings .TrimSpace (model .ID ),
3425- Name : strings .TrimSpace (model .Name ),
3443+ ID : strings .TrimSpace (model .ID ),
3444+ Name : strings .TrimSpace (model .Name ),
3445+ ContextWindow : config .ManualModelOptionalIntUnset ,
3446+ MaxOutputTokens : config .ManualModelOptionalIntUnset ,
3447+ }
3448+ key := provider .NormalizeKey (descriptor .ID )
3449+ if _ , exists := seen [key ]; exists {
3450+ return nil , fmt .Errorf ("parse manual model json: models.id %q is duplicated" , descriptor .ID )
34263451 }
3452+ seen [key ] = struct {}{}
34273453 if model .ContextWindow != nil {
34283454 if * model .ContextWindow <= 0 {
34293455 return nil , fmt .Errorf ("parse manual model json: models.context_window must be greater than 0" )
@@ -3438,7 +3464,7 @@ func parseProviderAddManualModelsJSON(raw string) ([]providertypes.ModelDescript
34383464 }
34393465 descriptors = append (descriptors , descriptor )
34403466 }
3441- return config . NormalizeCustomProviderModels ( descriptors )
3467+ return descriptors , nil
34423468}
34433469
34443470// sanitizeProviderAddInputRunes 过滤 provider 表单输入中的控制字符,避免不可见字符污染配置字段。
0 commit comments