@@ -1393,6 +1393,55 @@ func TestSaveAndLoadCustomProviderPersistsGenerateControls(t *testing.T) {
13931393 }
13941394}
13951395
1396+ func TestSaveAndLoadCustomProviderPreservesExplicitZeroGenerateRetries (t * testing.T ) {
1397+ t .Parallel ()
1398+
1399+ baseDir := t .TempDir ()
1400+ const providerName = "zero-retry-provider"
1401+ err := SaveCustomProviderWithModels (baseDir , SaveCustomProviderInput {
1402+ Name : providerName ,
1403+ Driver : provider .DriverOpenAICompat ,
1404+ BaseURL : "https://llm.example.com/v1" ,
1405+ APIKeyEnv : "ZERO_RETRY_PROVIDER_API_KEY" ,
1406+ ModelSource : ModelSourceDiscover ,
1407+ DiscoveryEndpointPath : provider .DiscoveryEndpointPathModels ,
1408+ GenerateMaxRetries : 0 ,
1409+ GenerateMaxRetriesSet : true ,
1410+ GenerateIdleTimeoutSec : 420 ,
1411+ })
1412+ if err != nil {
1413+ t .Fatalf ("SaveCustomProviderWithModels() error = %v" , err )
1414+ }
1415+
1416+ data , err := os .ReadFile (filepath .Join (baseDir , providersDirName , providerName , customProviderConfigName ))
1417+ if err != nil {
1418+ t .Fatalf ("ReadFile() error = %v" , err )
1419+ }
1420+ content := string (data )
1421+ if ! strings .Contains (content , "generate_max_retries: 0" ) {
1422+ t .Fatalf ("expected generate_max_retries: 0 to be persisted, got %q" , content )
1423+ }
1424+
1425+ cfg , err := loadCustomProvider (filepath .Join (baseDir , providersDirName , providerName ))
1426+ if err != nil {
1427+ t .Fatalf ("loadCustomProvider() error = %v" , err )
1428+ }
1429+ if ! cfg .GenerateMaxRetriesSet {
1430+ t .Fatal ("expected explicit zero retry setting to remain marked as configured" )
1431+ }
1432+ runtimeCfg , err := cfg .Resolve ()
1433+ if err != nil {
1434+ t .Fatalf ("Resolve() error = %v" , err )
1435+ }
1436+ providerRuntimeCfg , err := runtimeCfg .ToRuntimeConfig ()
1437+ if err != nil {
1438+ t .Fatalf ("ToRuntimeConfig() error = %v" , err )
1439+ }
1440+ if providerRuntimeCfg .GenerateMaxRetries != 0 {
1441+ t .Fatalf ("expected explicit zero retry setting to disable retries, got %d" , providerRuntimeCfg .GenerateMaxRetries )
1442+ }
1443+ }
1444+
13961445func TestSaveCustomProviderOmitsDefaultGenerateControlsWhenUnset (t * testing.T ) {
13971446 t .Parallel ()
13981447
@@ -1423,6 +1472,43 @@ func TestSaveCustomProviderOmitsDefaultGenerateControlsWhenUnset(t *testing.T) {
14231472 }
14241473}
14251474
1475+ func TestLoadCustomProviderUsesDefaultGenerateRetriesWhenUnset (t * testing.T ) {
1476+ t .Parallel ()
1477+
1478+ baseDir := t .TempDir ()
1479+ const providerName = "default-retry-provider"
1480+ err := SaveCustomProviderWithModels (baseDir , SaveCustomProviderInput {
1481+ Name : providerName ,
1482+ Driver : provider .DriverOpenAICompat ,
1483+ BaseURL : "https://llm.example.com/v1" ,
1484+ APIKeyEnv : "DEFAULT_RETRY_PROVIDER_API_KEY" ,
1485+ ModelSource : ModelSourceDiscover ,
1486+ DiscoveryEndpointPath : provider .DiscoveryEndpointPathModels ,
1487+ })
1488+ if err != nil {
1489+ t .Fatalf ("SaveCustomProviderWithModels() error = %v" , err )
1490+ }
1491+
1492+ cfg , err := loadCustomProvider (filepath .Join (baseDir , providersDirName , providerName ))
1493+ if err != nil {
1494+ t .Fatalf ("loadCustomProvider() error = %v" , err )
1495+ }
1496+ if cfg .GenerateMaxRetriesSet {
1497+ t .Fatal ("expected omitted generate_max_retries to remain unset" )
1498+ }
1499+ resolved , err := cfg .Resolve ()
1500+ if err != nil {
1501+ t .Fatalf ("Resolve() error = %v" , err )
1502+ }
1503+ runtimeCfg , err := resolved .ToRuntimeConfig ()
1504+ if err != nil {
1505+ t .Fatalf ("ToRuntimeConfig() error = %v" , err )
1506+ }
1507+ if runtimeCfg .GenerateMaxRetries != provider .DefaultGenerateMaxRetries {
1508+ t .Fatalf ("expected omitted generate_max_retries to use default %d, got %d" , provider .DefaultGenerateMaxRetries , runtimeCfg .GenerateMaxRetries )
1509+ }
1510+ }
1511+
14261512func TestLoaderRejectsCustomProviderGenerateStartTimeoutField (t * testing.T ) {
14271513 t .Parallel ()
14281514
0 commit comments