Pular para o conteúdo

Constraints API

A Constraints API é como um cliente coloca uma coleira na otimização da Floopy. Dois endpoints — GET para ler o conjunto atual, PUT para substituí-lo.

A semântica é full-replace: uma chave ausente no PUT cai para o default da plataforma. Não há PATCH.

Authorization: Bearer <your-floopy-api-key>
  • Permissão: read_permission para GET, write_permission para PUT.
  • Apenas plano Pro.
  • Estamos liberando esse endpoint por organização enquanto validamos a qualidade. Fale com o suporte caso sua organização ainda não esteja habilitada.

Lê o conjunto atual de constraints, com os defaults da plataforma exibidos ao lado.

GET https://api.floopy.ai/v1/constraints
{
"max_regression": { "value": 0.02, "window": "rolling_24h" },
"max_cost_increase": { "value": 0.05, "window": "rolling_24h" },
"confidence_threshold": 0.6,
"min_samples_before_promotion": 50,
"max_outcome_variance": 0.4,
"max_cost_drop_without_validation": 0.8,
"require_shadow_before_live": true,
"defaults": {
"max_regression": 0.05,
"max_cost_increase": 0.10,
"confidence_threshold": 0.0
}
}
FieldTypeDescription
max_regressionobject | nullCap na queda rolante de qualidade composta vs. baseline. null significa “use default da plataforma”.
max_regression.valuenumber[0, 0.5]. Teto de queda fracionária (ex.: 0.02 = 2%).
max_regression.windowstringrolling_24h ou rolling_7d.
max_cost_increaseobject | nullCap no aumento rolante de custo vs. baseline. value [0, 5.0].
confidence_thresholdnumber | nullConfiança mínima do roteador para sair da baseline, [0.0, 1.0]. null ou 0.0 desabilita o gate. Veja a metodologia de Confidence.
min_samples_before_promotioninteger | nullAmostras historicas minimas em um candidato para que ele possa vencer. [1, 100_000]. null desabilita o portao.
max_outcome_variancenumber | nullVariancia rolante maxima de resultados que o router tolera em um candidato. (0.0, 1.0]. null desabilita.
max_cost_drop_without_validationnumber | nullQueda fracionaria maxima de custo permitida sem um experimento shadow aprovado na janela de validade. (0.0, 1.0]. null desabilita.
require_shadow_before_liveboolean | nullQuando true, nenhum candidato e 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, configuravel por workspace — fale com o suporte).
defaultsobjectDefaults da plataforma que preenchem qualquer chave não definida.

Os quatro novos campos (min_samples_before_promotion, max_outcome_variance, max_cost_drop_without_validation, require_shadow_before_live) estao documentados ponta a ponta na pagina de feature de Constraints.

StatusCodeQuando
403read_permission / plan_requiredPermissão ou flag de plano ausente.
5xxinternalFalha upstream.
Terminal window
curl -s -H "Authorization: Bearer $FLOOPY_API_KEY" \
"https://api.floopy.ai/v1/constraints" | jq .

Substitui o conjunto de constraints. Limite do body: 4 KiB.

PUT https://api.floopy.ai/v1/constraints
{
"max_regression": { "value": 0.02, "window": "rolling_24h" },
"max_cost_increase": { "value": 0.05, "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
}
FieldTypeRequiredConstraints
max_regressionobjectNovalue [0, 0.5], windowrolling_24h/rolling_7d. Omita para cair para o default 0.05.
max_cost_increaseobjectNovalue [0, 5.0], mesmo enum de window. Omita para cair para o default 0.10.
confidence_thresholdnumberNo[0.0, 1.0]. Omita para desabilitar (0.0).
min_samples_before_promotionintegerNo[1, 100_000]. Definir 0 e rejeitado com 400 out_of_range_min_samples_before_promotion. Omita para desabilitar.
max_outcome_variancenumberNo(0.0, 1.0], estritamente maior que zero. is_finite() exigido. Omita para desabilitar.
max_cost_drop_without_validationnumberNo(0.0, 1.0], estritamente maior que zero. is_finite() exigido. Omita para desabilitar.
require_shadow_before_livebooleanNoOmita ou defina false para desabilitar.

O body é deny_unknown_fields — chaves desconhecidas retornam 400 unknown_field. Semântica full-replace: qualquer chave omitida do body do PUT é definida com o default da plataforma, e não preservada. Todo campo numerico passa por is_finite()NaN, +Inf e -Inf sao rejeitados com 400 out_of_range_<field>.

  • max_regression — quando a regressão esperada de um candidato excede o cap, o candidato é filtrado com reason: "constraint_max_regression".
  • max_cost_increase — quando o aumento rolante de custo esperado de um candidato excede o cap, o candidato é filtrado com reason: "constraint_max_cost_increase".
  • confidence_threshold — quando o confidence do roteador está abaixo do threshold, a estratégia cai para a baseline e emite reason: "constraint_confidence_below_threshold" para todo outro candidato.
  • min_samples_before_promotion — um candidato com menos amostras historicas que isso e filtrado com reason: "constraint_min_samples".
  • max_outcome_variance — um candidato cuja variancia rolante de resultados ultrapassa esse cap e filtrado com reason: "constraint_high_variance".
  • max_cost_drop_without_validation — um candidato cuja queda fracionaria esperada de custo vs. baseline ultrapassa esse cap e filtrado com reason: "constraint_cost_drop_requires_validation" a menos que exista um experimento shadow aprovado na janela de validade.
  • require_shadow_before_live — quando true, qualquer candidato sem experimento shadow aprovado na janela de validade e filtrado com reason: "constraint_shadow_required". O cache (constraint_shadow_pass:{org}:{provider}:{model}) e DEL-ado proativamente em rollback para que um caminho de recuperacao rode quente.

Constraints compoem. O router roda todo portao em todo candidato nesta ordem fixa: max_cost_increase, max_regression, confidence_threshold, min_samples_before_promotion, max_outcome_variance, max_cost_drop_without_validation, require_shadow_before_live. A primeira rejeicao vence e e o que aparece na linha de auditoria.

Retorna o estado pós-escrita, formato idêntico ao GET.

StatusCodeQuando
400body_too_largeO body excede 4 KiB.
400unknown_fieldChave desconhecida no nível superior.
400out_of_range_<field>Valor de campo fora do intervalo documentado.
403write_permission / plan_requiredPermissão ou flag de plano ausente.
5xxinternalFalha upstream.
Terminal window
curl -s -X PUT \
-H "Authorization: Bearer $FLOOPY_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"max_regression": {"value": 0.02, "window": "rolling_24h"},
"max_cost_increase": {"value": 0.05, "window": "rolling_24h"},
"confidence_threshold": 0.6
}' \
"https://api.floopy.ai/v1/constraints"

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. Os metadados do evento de auditoria carregam hashes SHA-256 de before e after, então o próprio log de auditoria não duplica os valores brutos das constraints.