resolveConfiguredModelOverride returns ok when a usable override is resolved. In hard failure mode, ok is also true for configured but unusable overrides so callers can distinguish them from unset or malformed values.
( ctx context.Context, overrideContext string, raw string, ownerID uuid.UUID, resolveModelConfig modelOverrideConfigResolver, resolveProviderKeys modelOverrideProviderKeysResolver, failureMode modelOverrideFailureMode, )
| 191 | // resolved. In hard failure mode, ok is also true for configured but unusable |
| 192 | // overrides so callers can distinguish them from unset or malformed values. |
| 193 | func (p *Server) resolveConfiguredModelOverride( |
| 194 | ctx context.Context, |
| 195 | overrideContext string, |
| 196 | raw string, |
| 197 | ownerID uuid.UUID, |
| 198 | resolveModelConfig modelOverrideConfigResolver, |
| 199 | resolveProviderKeys modelOverrideProviderKeysResolver, |
| 200 | failureMode modelOverrideFailureMode, |
| 201 | ) (database.ChatModelConfig, bool, error) { |
| 202 | trimmed := strings.TrimSpace(raw) |
| 203 | if trimmed == "" { |
| 204 | return database.ChatModelConfig{}, false, nil |
| 205 | } |
| 206 | configuredModelConfigID, err := uuid.Parse(trimmed) |
| 207 | if err != nil { |
| 208 | p.logger.Info(ctx, |
| 209 | "invalid model override, ignoring", |
| 210 | slog.F("override_context", overrideContext), |
| 211 | slog.F("raw_model_config_id", trimmed), |
| 212 | slog.Error(err), |
| 213 | ) |
| 214 | return database.ChatModelConfig{}, false, nil |
| 215 | } |
| 216 | |
| 217 | modelConfig, providerName, err := resolveModelConfig( |
| 218 | ctx, |
| 219 | configuredModelConfigID, |
| 220 | ) |
| 221 | if err != nil { |
| 222 | if failureMode == modelOverrideFailureModeHard { |
| 223 | label := modelOverrideErrorLabel(overrideContext) |
| 224 | switch { |
| 225 | case errors.Is(err, sql.ErrNoRows): |
| 226 | return database.ChatModelConfig{}, true, xerrors.Errorf( |
| 227 | "%s model override is unavailable: %s", |
| 228 | label, |
| 229 | configuredModelConfigID, |
| 230 | ) |
| 231 | case errors.Is(err, errInvalidModelOverrideMetadata): |
| 232 | return database.ChatModelConfig{}, true, xerrors.Errorf( |
| 233 | "%s model override metadata is invalid for %s: %w", |
| 234 | label, |
| 235 | configuredModelConfigID, |
| 236 | err, |
| 237 | ) |
| 238 | default: |
| 239 | return database.ChatModelConfig{}, true, xerrors.Errorf( |
| 240 | "resolve %s model override %s: %w", |
| 241 | label, |
| 242 | configuredModelConfigID, |
| 243 | err, |
| 244 | ) |
| 245 | } |
| 246 | } |
| 247 | |
| 248 | switch { |
| 249 | case errors.Is(err, sql.ErrNoRows): |
| 250 | p.logger.Info(ctx, |