Pular para o conteúdo

Constraints

Constraints sao como o cliente coloca uma coleira na otimizacao da Floopy. Sao declarativos — voce os define em codigo via PUT /v1/constraints ou no dashboard em /routing/constraints. Sao non-LLM — toda checagem e uma comparacao numerica ou booleana, sem chamadas extras a provedores no caminho quente. E sao auditaveis — toda mudanca e registrada com hash SHA-256 de before e after no log de auditoria.

No v2 o conjunto e de nove campos, agrupados em tres secoes: limites de qualidade, limites de custo e portoes de promocao.

Quando um candidato viola um constraint, ele e filtrado com um motivo tipado que aparece em filtered[].reason no audit row e tambem no texto de explicacao. Nao ha override silencioso.

Limitam o custo de qualidade que o router esta disposto a pagar por um candidato mais barato ou de maior confianca.

CampoFaixaO que limita
max_regressionvalue [0, 0.5], windowrolling_24h / rolling_7dA queda rolante de qualidade composta vs. baseline que o router tolera.
max_outcome_variance(0.0, 1.0]A variancia de resultados que o router tolera em um candidato antes de recusar rota-lo.

max_outcome_variance e novo no v2. Estritamente maior que zero — definir exatamente 0.0 e rejeitado com 400 out_of_range_max_outcome_variance porque e inalcancavel na pratica e quase certamente uma configuracao errada.

Limitam quanto o router pode mover em custo sem forcar validacao extra.

CampoFaixaO que limita
max_cost_increasevalue [0, 5.0], windowrolling_24h / rolling_7dO aumento rolante de custo vs. baseline que o router tolera.
max_cost_drop_without_validation(0.0, 1.0]Uma queda fracionaria de custo acima desse tamanho e tratada como suspeita — o router se recusa a promover o candidato ate que a validacao em shadow tenha aprovado.

max_cost_drop_without_validation e novo no v2. A intuicao: um candidato que de repente parece 90 % mais barato que a baseline e mais provavel de ser uma queda de qualidade do que um almoco gratis. Definir max_cost_drop_without_validation = 0.5 significa “se a historia de economia ultrapassa 50 %, prove em shadow primeiro.”

Limitam quando o router pode promover um candidato acima do trafego baseline.

CampoFaixaO que limita
confidence_threshold[0.0, 1.0]A confidence minima para o router se afastar da baseline. null ou 0.0 desativa o portao.
min_samples_before_promotion[1, 100_000]O numero minimo de amostras historicas em um candidato para que ele possa vencer. Definir 0 e rejeitado.
require_shadow_before_livebooleanQuando true, nenhum candidato pode ser promovido a trafego live em uma rota ate que aquele (provider, model) tenha pelo menos um experimento shadow concluido na janela de validade (default 30 dias).

min_samples_before_promotion, max_outcome_variance, max_cost_drop_without_validation e require_shadow_before_live sao os quatro novos campos lancados no v2.

A janela de validade para require_shadow_before_live tem default de 30 dias e e configuravel por workspace — fale com o suporte para ajustar.

Quando o router rejeita um candidato por violacao de constraint, filtered[].reason no audit row carrega um motivo tipado. O enum fechado e:

ReasonConstraint
constraint_max_regressionmax_regression
constraint_max_cost_increasemax_cost_increase
constraint_confidence_below_thresholdconfidence_threshold
constraint_min_samplesmin_samples_before_promotion
constraint_high_variancemax_outcome_variance
constraint_cost_drop_requires_validationmax_cost_drop_without_validation
constraint_shadow_requiredrequire_shadow_before_live

A ordem em que os constraints sao avaliados e fixa — quando mais de um teria rejeitado o candidato, a auditoria mostra o primeiro que disparou. A ordem e: max_cost_increase, max_regression, confidence_threshold, min_samples_before_promotion, max_outcome_variance, max_cost_drop_without_validation, require_shadow_before_live.

”Quero limitar regressoes de qualidade em 2 %, sem excecoes.”

Seção intitulada “”Quero limitar regressoes de qualidade em 2 %, sem excecoes.””
{
"max_regression": { "value": 0.02, "window": "rolling_24h" }
}

Qualquer candidato cuja queda rolante de 24 h em qualidade composta vs. baseline ultrapasse 2 pontos percentuais e filtrado com reason: "constraint_max_regression". Todo o resto e com o router.

”Quero pelo menos 50 amostras historicas antes do candidato vencer.”

Seção intitulada “”Quero pelo menos 50 amostras historicas antes do candidato vencer.””
{
"min_samples_before_promotion": 50
}

Um candidato com n_samples < 50 e filtrado com reason: "constraint_min_samples". O painel lateral de decisao no dashboard renderiza a contagem samples de evidence para o cliente verificar o portao.

”Recuso trocar por algo que parece 80 % mais barato sem antes um experimento shadow.”

Seção intitulada “”Recuso trocar por algo que parece 80 % mais barato sem antes um experimento shadow.””
{
"max_cost_drop_without_validation": 0.8,
"require_shadow_before_live": true
}

Qualquer candidato cuja queda fracionaria esperada de custo vs. baseline ultrapasse 0.8 e filtrado com reason: "constraint_cost_drop_requires_validation" a menos que tenha um experimento shadow aprovado na janela de validade. Os dois constraints funcionam juntos: require_shadow_before_live exige que toda promocao passe por shadow; max_cost_drop_without_validation exige que especificamente o caminho de economia suspeita passe por shadow mesmo que o operador nao tenha ligado o portao geral.

”Nao escolha um modelo cujos resultados recentes estejam por todo lado.”

Seção intitulada “”Nao escolha um modelo cujos resultados recentes estejam por todo lado.””
{
"max_outcome_variance": 0.4
}

Um candidato cuja variancia rolante de resultados ultrapasse 0.4 e filtrado com reason: "constraint_high_variance". Util em rotas onde consistencia importa mais que uma resposta perfeita ocasional.

”Nunca rotear para fora da baseline abaixo de 70 % de confianca.”

Seção intitulada “”Nunca rotear para fora da baseline abaixo de 70 % de confianca.””
{
"confidence_threshold": 0.7
}

O router cai para a baseline sempre que confidence < 0.7 e emite reason: "constraint_confidence_below_threshold" para todos os outros candidatos. Veja Metodologia de Confianca para o que confidence mede.

{
"max_regression": { "value": 0.02, "window": "rolling_24h" },
"max_cost_increase": { "value": 0.10, "window": "rolling_24h" },
"confidence_threshold": 0.7,
"min_samples_before_promotion": 50,
"max_outcome_variance": 0.4,
"max_cost_drop_without_validation": 0.8,
"require_shadow_before_live": true
}

Constraints compoem. O router roda todo portao em todo candidato; a primeira rejeicao vence.

Todo constraint numerico passa por is_finite()NaN, +Inf e -Inf sao rejeitados com 400 out_of_range_<field>. Os dois campos no intervalo unitario aberto a esquerda (max_outcome_variance, max_cost_drop_without_validation) sao estritamente maior que zero. min_samples_before_promotion e rejeitado fora de [1, 100_000]. O cap de body em PUT /v1/constraints e 4 KiB.

Esses limites tambem vivem como CHECK constraints na tabela organization_constraints, entao uma linha mal-configurada nao chega ao banco.

Todo PUT bem-sucedido grava uma linha em constraint_changes com o snapshot before, o snapshot after, o actor_api_key_id e o timestamp. O metadata do evento de auditoria carrega hashes SHA-256 de before e after, entao o log de auditoria nao duplica os valores brutos dos constraints.

Todos os nove campos estao apenas no plano Pro. Em planos Free a pagina /routing/constraints e renderizada ausente (nao como aba travada) e a API retorna 403 plan_required.