fix(provision): reconcile channel pricing and hosted access

This commit is contained in:
phamnazage-jpg
2026-05-20 22:09:40 +08:00
parent 83ee216a4d
commit ca1d448cc0
27 changed files with 1344 additions and 154 deletions

View File

@@ -157,6 +157,7 @@ func validateProviders(providers []ProviderManifest) error {
seen := make(map[string]struct{}, len(providers))
for _, provider := range providers {
providerID := strings.TrimSpace(provider.ProviderID)
missingDefaultModel := firstMissingDefaultModel(provider.DefaultModels, provider.ChannelTemplate.ModelMapping)
switch {
case providerID == "":
return fmt.Errorf("provider manifest: provider_id is required")
@@ -180,6 +181,10 @@ func validateProviders(providers []ProviderManifest) error {
return fmt.Errorf("provider %q: channel_template.name is required", providerID)
case len(provider.ChannelTemplate.ModelMapping) == 0:
return fmt.Errorf("provider %q: channel_template.model_mapping must not be empty", providerID)
case !containsProviderModel(provider.ChannelTemplate.ModelMapping, provider.SmokeTestModel):
return fmt.Errorf("provider %q: channel_template.model_mapping must include smoke_test_model %q", providerID, provider.SmokeTestModel)
case missingDefaultModel != "":
return fmt.Errorf("provider %q: channel_template.model_mapping must cover default_models, missing %q", providerID, missingDefaultModel)
case strings.TrimSpace(provider.PlanTemplate.Name) == "":
return fmt.Errorf("provider %q: plan_template.name is required", providerID)
case provider.PlanTemplate.ValidityDays <= 0:
@@ -247,3 +252,29 @@ func contains(items []string, target string) bool {
}
return false
}
func containsProviderModel(modelMapping map[string]string, target string) bool {
trimmedTarget := strings.TrimSpace(target)
if trimmedTarget == "" {
return false
}
for sourceModel, mappedModel := range modelMapping {
if strings.TrimSpace(sourceModel) == trimmedTarget || strings.TrimSpace(mappedModel) == trimmedTarget {
return true
}
}
return false
}
func firstMissingDefaultModel(defaultModels []string, modelMapping map[string]string) string {
for _, model := range defaultModels {
trimmedModel := strings.TrimSpace(model)
if trimmedModel == "" {
continue
}
if !containsProviderModel(modelMapping, trimmedModel) {
return trimmedModel
}
}
return ""
}