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.
Autenticação e gating (ambos os endpoints)
Seção intitulada “Autenticação e gating (ambos os endpoints)”Authorization: Bearer <your-floopy-api-key>- Permissão:
read_permissionparaGET,write_permissionparaPUT. - 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.
GET /v1/constraints
Seção intitulada “GET /v1/constraints”Lê o conjunto atual de constraints, com os defaults da plataforma exibidos ao lado.
Endpoint
Seção intitulada “Endpoint”GET https://api.floopy.ai/v1/constraintsResposta (200)
Seção intitulada “Resposta (200)”{ "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 }}| Field | Type | Description |
|---|---|---|
max_regression | object | null | Cap na queda rolante de qualidade composta vs. baseline. null significa “use default da plataforma”. |
max_regression.value | number | [0, 0.5]. Teto de queda fracionária (ex.: 0.02 = 2%). |
max_regression.window | string | rolling_24h ou rolling_7d. |
max_cost_increase | object | null | Cap no aumento rolante de custo vs. baseline. value [0, 5.0]. |
confidence_threshold | number | null | Confianç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_promotion | integer | null | Amostras historicas minimas em um candidato para que ele possa vencer. [1, 100_000]. null desabilita o portao. |
max_outcome_variance | number | null | Variancia rolante maxima de resultados que o router tolera em um candidato. (0.0, 1.0]. null desabilita. |
max_cost_drop_without_validation | number | null | Queda fracionaria maxima de custo permitida sem um experimento shadow aprovado na janela de validade. (0.0, 1.0]. null desabilita. |
require_shadow_before_live | boolean | null | Quando 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). |
defaults | object | Defaults 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.
| Status | Code | Quando |
|---|---|---|
403 | read_permission / plan_required | Permissão ou flag de plano ausente. |
5xx | internal | Falha upstream. |
Exemplo curl
Seção intitulada “Exemplo curl”curl -s -H "Authorization: Bearer $FLOOPY_API_KEY" \ "https://api.floopy.ai/v1/constraints" | jq .PUT /v1/constraints
Seção intitulada “PUT /v1/constraints”Substitui o conjunto de constraints. Limite do body: 4 KiB.
Endpoint
Seção intitulada “Endpoint”PUT https://api.floopy.ai/v1/constraintsRequest body
Seção intitulada “Request body”{ "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}| Field | Type | Required | Constraints |
|---|---|---|---|
max_regression | object | No | value [0, 0.5], window ∈ rolling_24h/rolling_7d. Omita para cair para o default 0.05. |
max_cost_increase | object | No | value [0, 5.0], mesmo enum de window. Omita para cair para o default 0.10. |
confidence_threshold | number | No | [0.0, 1.0]. Omita para desabilitar (0.0). |
min_samples_before_promotion | integer | No | [1, 100_000]. Definir 0 e rejeitado com 400 out_of_range_min_samples_before_promotion. Omita para desabilitar. |
max_outcome_variance | number | No | (0.0, 1.0], estritamente maior que zero. is_finite() exigido. Omita para desabilitar. |
max_cost_drop_without_validation | number | No | (0.0, 1.0], estritamente maior que zero. is_finite() exigido. Omita para desabilitar. |
require_shadow_before_live | boolean | No | Omita 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>.
Semântica
Seção intitulada “Semântica”max_regression— quando a regressão esperada de um candidato excede o cap, o candidato é filtrado comreason: "constraint_max_regression".max_cost_increase— quando o aumento rolante de custo esperado de um candidato excede o cap, o candidato é filtrado comreason: "constraint_max_cost_increase".confidence_threshold— quando oconfidencedo roteador está abaixo do threshold, a estratégia cai para a baseline e emitereason: "constraint_confidence_below_threshold"para todo outro candidato.min_samples_before_promotion— um candidato com menos amostras historicas que isso e filtrado comreason: "constraint_min_samples".max_outcome_variance— um candidato cuja variancia rolante de resultados ultrapassa esse cap e filtrado comreason: "constraint_high_variance".max_cost_drop_without_validation— um candidato cuja queda fracionaria esperada de custo vs. baseline ultrapassa esse cap e filtrado comreason: "constraint_cost_drop_requires_validation"a menos que exista um experimento shadow aprovado na janela de validade.require_shadow_before_live— quandotrue, qualquer candidato sem experimento shadow aprovado na janela de validade e filtrado comreason: "constraint_shadow_required". O cache (constraint_shadow_pass:{org}:{provider}:{model}) eDEL-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.
Resposta (200)
Seção intitulada “Resposta (200)”Retorna o estado pós-escrita, formato idêntico ao GET.
| Status | Code | Quando |
|---|---|---|
400 | body_too_large | O body excede 4 KiB. |
400 | unknown_field | Chave desconhecida no nível superior. |
400 | out_of_range_<field> | Valor de campo fora do intervalo documentado. |
403 | write_permission / plan_required | Permissão ou flag de plano ausente. |
5xx | internal | Falha upstream. |
Exemplo curl
Seção intitulada “Exemplo curl”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"Trilha de auditoria
Seção intitulada “Trilha de auditoria”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.
Veja também
Seção intitulada “Veja também”- POST /v1/routing/explain — verifique uma mudança de constraint antes de aplicá-la.
- Metodologia de Confidence — contra o que
confidence_thresholdrealmente compara.