| 1 | package config |
| 2 | |
| 3 | import ( |
| 4 | "fmt" |
| 5 | "sort" |
| 6 | "strings" |
| 7 | ) |
| 8 | |
| 9 | func renderModelOverrides(m map[string]ProviderModelOverride) string { |
| 10 | keys := make([]string, 0, len(m)) |
| 11 | for k, ov := range m { |
| 12 | if k == "" || modelOverrideEmpty(ov) { |
| 13 | continue |
| 14 | } |
| 15 | keys = append(keys, k) |
| 16 | } |
| 17 | sort.Strings(keys) |
| 18 | var b strings.Builder |
| 19 | b.WriteString("{ ") |
| 20 | for i, k := range keys { |
| 21 | if i > 0 { |
| 22 | b.WriteString(", ") |
| 23 | } |
| 24 | fmt.Fprintf(&b, "%q = %s", k, renderModelOverride(m[k])) |
| 25 | } |
| 26 | b.WriteString(" }") |
| 27 | return b.String() |
| 28 | } |
| 29 | |
| 30 | func renderModelOverride(ov ProviderModelOverride) string { |
| 31 | var parts []string |
| 32 | if ov.ReasoningDefaults != "" { |
| 33 | parts = append(parts, fmt.Sprintf("reasoning_defaults = %q", ov.ReasoningDefaults)) |
| 34 | } |
| 35 | if ov.ReasoningProtocol != "" { |
| 36 | parts = append(parts, fmt.Sprintf("reasoning_protocol = %q", ov.ReasoningProtocol)) |
| 37 | } |
| 38 | if len(ov.SupportedEfforts) > 0 { |
| 39 | parts = append(parts, "supported_efforts = "+renderStringArray(ov.SupportedEfforts)) |
| 40 | } |
| 41 | if ov.DefaultEffort != "" { |
| 42 | parts = append(parts, fmt.Sprintf("default_effort = %q", ov.DefaultEffort)) |
| 43 | } |
| 44 | if ov.Vision != nil { |
| 45 | parts = append(parts, fmt.Sprintf("vision = %t", *ov.Vision)) |
| 46 | } |
| 47 | if ov.ContextWindow > 0 { |
| 48 | parts = append(parts, fmt.Sprintf("context_window = %d", ov.ContextWindow)) |
| 49 | } |
| 50 | if ov.MaxOutputTokens != 0 { |
| 51 | parts = append(parts, fmt.Sprintf("max_output_tokens = %d", ov.MaxOutputTokens)) |
| 52 | } |
| 53 | return "{ " + strings.Join(parts, ", ") + " }" |
| 54 | } |
| 55 | |
| 56 | func modelOverrideEmpty(ov ProviderModelOverride) bool { |
| 57 | return ov.ReasoningProtocol == "" && len(ov.SupportedEfforts) == 0 && ov.DefaultEffort == "" && ov.Vision == nil && ov.ContextWindow <= 0 && ov.MaxOutputTokens == 0 |
| 58 | } |
| 59 |