Fluxo de Decisão de Roteamento
O Floopy tem várias camadas que podem decidir qual provedor e modelo atendem uma requisição: o corpo da requisição, headers, prompts, testes A/B, Smart Selector, regras de roteamento, Smart Cost e roteamento por feedback. Configure várias delas e elas vão discordar.
Esta página é o critério de desempate. Ela lista cada camada na ordem em que executa, diz o que cada uma pode sobrescrever e responde diretamente: se tudo estiver configurado ao mesmo tempo, o que de fato é chamado?
A resposta curta
Seção intitulada “A resposta curta”A lista de targets da regra de roteamento decide o (provedor, modelo) final. Tudo acima — corpo da requisição, headers, prompts, Smart Selector — alimenta essa decisão, mas uma regra de roteamento despacha os seus próprios targets, e o modelo do target é o que vai para o provedor.
Duas coisas sobrescrevem a lista de targets:
- Smart Cost, quando troca o modelo, vira o target primário e os targets da regra viram fallbacks dele.
- O loop de agente MCP, quando ativo, assume o despacho por completo.
Se não houver regra de roteamento, não há targets, e o modelo resolvido acima (corpo da requisição, prompt ou modelo padrão do provedor) é o usado.
As camadas, em ordem
Seção intitulada “As camadas, em ordem”Cada camada executa depois da anterior, então uma camada posterior sobrescreve a anterior.
| # | Camada | Sobrescreve | Vence de |
|---|---|---|---|
| 1 | model do corpo da requisição | — | Nada. É o valor inicial. |
| 2 | Header floopy-model-override | O modelo do corpo | Camada 1 |
| 3 | Smart Selector | Modelo e provedor | Camadas 1–2 e o teste A/B |
| 4 | Teste A/B (floopy-ab-test) | Só o prompt, não o modelo | Nada no modelo. Perde para o Smart Selector. |
| 5 | Prompt (floopy-prompt-id) | Modelo e provedor, se o prompt os definir | Camadas 1–2 |
| 6 | prompt_overwrite | Devolve o controle ao cliente | Cancela a camada 5 |
| 7 | Modelo padrão do provedor | Usado só se nada acima definiu um modelo | Apenas a camada 1 |
| 8 | Smart Cost | Tudo acima | Camadas 1–7 e a regra de roteamento |
| 9 | Targets da regra de roteamento | O modelo efetivamente despachado | Camadas 1–7 |
| 10 | Loop de agente MCP | O despacho inteiro | Tudo |
1–2. Corpo da requisição e floopy-model-override
Seção intitulada “1–2. Corpo da requisição e floopy-model-override”O model do corpo da requisição é o ponto de partida. O header floopy-model-override o substitui por completo, antes de qualquer outra coisa — nada depois dele chega a ver o valor original.
3–4. Smart Selector vence o teste A/B
Seção intitulada “3–4. Smart Selector vence o teste A/B”Os dois escolhem uma variante, mas não são equivalentes:
- O Smart Selector pode definir modelo e provedor.
- Um teste A/B só troca qual prompt é usado. Ele nunca define um modelo.
Quando os dois estão configurados, o Smart Selector vence e o teste A/B não é consultado.
5–6. Prompt e prompt_overwrite
Seção intitulada “5–6. Prompt e prompt_overwrite”Um prompt pode carregar seu próprio modelo e provedor, que sobrescrevem o corpo da requisição.
O prompt_overwrite inverte isso: devolve o controle ao cliente, então o modelo do corpo da requisição vence o do prompt. Ele também faz o provedor do prompt ser descartado.
Ele é definido no prompt pelo dashboard, e o header floopy-prompt-overwrite sobrescreve essa coluna nos dois sentidos — uma requisição pode forçá-lo a ligado para um prompt que o tem desligado, e vice-versa.
7. Modelo padrão do provedor
Seção intitulada “7. Modelo padrão do provedor”Usado só quando nada acima resolveu um modelo. É um piso, não um override.
8. Smart Cost
Seção intitulada “8. Smart Cost”O Smart Cost classifica a complexidade do prompt e, nos níveis simples e moderado, troca por um modelo mais barato entre os provedores que você configurou na regra.
Quando ele troca, a escolha dele vira o target primário da regra, e os seus targets configurados ficam atrás como fallbacks — então uma troca que falha ainda degrada para a sua lista em vez de dar erro.
Um prompt complexo ignora o Smart Cost por completo e deixa a sua estratégia configurada intacta. Ou seja: o Smart Cost é dono do nível barato, e a sua estratégia de roteamento — inclusive o roteamento por feedback — é dona de tudo que o Smart Cost recusar.
9. Targets da regra de roteamento
Seção intitulada “9. Targets da regra de roteamento”É aqui que o modelo é finalmente decidido. Uma regra de roteamento despacha os próprios targets, e cada target carrega seu próprio (provedor, modelo). Qualquer que seja o target escolhido pela estratégia, é o modelo daquele target que vai para o provedor — o modelo resolvido nas camadas 1–7 é substituído.
Dentro da regra, a estratégia escolhe qual target:
- O roteamento por feedback, se o seu plano o habilita, substitui inteiramente a estratégia configurada na regra. Uma regra definida como
weightednão se comportará como weighted para uma organização em roteamento por feedback. - Caso contrário, roda a estratégia da própria regra:
fallback,round-robin,weightedoulatency-based.
Se um target é pulado (sem API key, provedor desconhecido, circuit breaker aberto) ou falha, o próximo é tentado.
10. Loop de agente MCP
Seção intitulada “10. Loop de agente MCP”Se o seu plano tem MCP outbound e a organização tem ao menos um servidor outbound habilitado, a requisição entra no loop de agente em vez da cadeia normal de estratégias. Envie floopy-mcp-disabled para desativar por requisição.
O quadro completo
Seção intitulada “O quadro completo”flowchart TD
A[Modelo do corpo da requisição] --> B{Header floopy-model-override?}
B -->|sim| C[Modelo do header substitui]
B -->|não| D[Mantém o modelo do corpo]
C --> E{Smart Selector?}
D --> E
E -->|sim| F[Smart Selector define modelo + provedor<br/>Teste A/B é ignorado]
E -->|não| G{Teste A/B?}
G -->|sim| H[Troca só o prompt<br/>modelo inalterado]
G -->|não| I[Sem variante]
F --> J{Prompt resolvido?}
H --> J
I --> J
J -->|sim| K{prompt_overwrite?}
J -->|não| L{Modelo ainda vazio?}
K -->|false| M[Modelo + provedor do prompt vencem]
K -->|true| N[Modelo da requisição vence<br/>provedor do prompt descartado]
M --> O
N --> O
L -->|sim| P[Modelo padrão do provedor]
L -->|não| O[Modelo resolvido]
P --> O
O --> Q{Agente MCP ativo?}
Q -->|sim| R[Loop de agente assume o despacho]
Q -->|não| S{Existe regra de roteamento?}
S -->|não| T[Cascata legada<br/>o modelo resolvido é despachado]
S -->|sim| U{Smart Cost habilitado<br/>e prompt não complexo?}
U -->|sim| V[Modelo mais barato vira target PRIMÁRIO<br/>targets configurados viram fallbacks<br/>estratégia fixada em fallback]
U -->|não| W{Roteamento por feedback?}
W -->|sim| X[Pontua os targets, ignora a estratégia da regra<br/>explora conforme o orçamento de exploração]
W -->|não| Y[Estratégia da regra:<br/>fallback / round-robin / weighted / latency]
V --> Z
X --> Z
Y --> Z[Despacha o target<br/>MODELO DO TARGET substitui o modelo resolvido]
Z --> AA{Target OK?}
AA -->|pulado ou falhou| AB[Tenta o próximo target]
AB --> Z
AA -->|sucesso| AC[Resposta]
T --> AC
R --> ACExemplo prático: tudo configurado ao mesmo tempo
Seção intitulada “Exemplo prático: tudo configurado ao mesmo tempo”Chega uma requisição com:
- corpo
model: "gpt-4o" - header
floopy-model-override: gpt-4o-mini - um prompt cujo modelo é
claude-sonnet-5, comprompt_overwrite = false - uma regra de roteamento com targets
[openai/gpt-4o, anthropic/claude-3], estratégiaweighted - Smart Cost habilitado, com
openai/gpt-4o-miniconfigurado para o nível simples - a organização em um plano com roteamento por feedback
O que acontece:
- O header substitui o modelo do corpo →
gpt-4o-mini. - O prompt define o modelo →
claude-sonnet-5(prompt_overwriteé false, então o prompt vence). - O prompt é simples, então o Smart Cost troca por
openai/gpt-4o-minie o torna o target primário. Os targets da regra viram fallbacks, e a estratégia é fixada em fallback. openai/gpt-4o-minié chamado. Se falhar, tenta-seopenai/gpt-4o, depoisanthropic/claude-3.
Repare no que não aconteceu: weighted nunca rodou, o roteamento por feedback nunca rodou, e nem gpt-4o nem claude-sonnet-5 foram chamados. O Smart Cost recusa em um prompt complexo — e só então o roteamento por feedback pontuaria os dois targets da regra e escolheria entre eles.
O orçamento de exploração
Seção intitulada “O orçamento de exploração”O roteamento por feedback e o Smart Cost nem sempre escolhem o modelo de melhor pontuação — isso significaria nunca testar mais nada, e um modelo que perde uma vez perderia para sempre, porque nunca é despachado e portanto nunca coleta os dados que o fariam vencer.
Uma fração do tráfego explora. Um sorteio por requisição, semeado pelo id da requisição, para que a decisão seja reproduzível:
| Fatia do tráfego | Faixa | Quais modelos |
|---|---|---|
taxa_de_exploração × fatia_não_testados | Explorar não testados | Modelos com histórico insuficiente para pontuar. Ignora a nota mínima. |
taxa_de_exploração − a fatia acima | Explorar | Modelos que passam da nota mínima. |
| o restante | Explotar | O modelo de melhor pontuação. |
A fatia de não testados sai de dentro do orçamento de exploração, ela não é somada a ele. Com uma taxa de exploração de 20% e uma fatia de não testados de 50%, os modelos não testados recebem 10% de todo o tráfego e a exploração pontuada recebe os outros 10%. A exploração total continua sendo 20%.
Por que modelos não testados ignoram a nota mínima
Seção intitulada “Por que modelos não testados ignoram a nota mínima”Um modelo sem histórico não tem nota de qualidade, então a barreira o julgaria pelo benchmark estático — e um modelo sem benchmark publicado recebe um valor neutro padrão que fica abaixo da nota mínima usual. Ele seria filtrado antes que a exploração pudesse testá-lo, e assim nunca conquistaria a nota que o deixaria passar. A própria barreira é o que o manteria não testado.
Defina a fatia de não testados como 0% para desativar isso e explorar apenas modelos que já passam da nota mínima.
Os dois valores são configurados em Roteamento → Por feedback no dashboard, e a porcentagem efetiva sobre o tráfego total aparece abaixo do slider.
Referência rápida de headers
Seção intitulada “Referência rápida de headers”| Header | Efeito | Vence de |
|---|---|---|
floopy-model-override | Substitui o modelo da requisição | O corpo da requisição |
floopy-provider | Força o provedor (só sem regra de roteamento) | O catálogo de modelos |
floopy-prompt-id | Seleciona um prompt | — |
floopy-prompt-overwrite | Força prompt_overwrite ligado ou desligado | A coluna do próprio prompt |
floopy-routing-rule | Troca a regra de roteamento | A regra da API key. Aplicado depois do Smart Cost. |
floopy-ab-test | Roda um teste A/B | Perde para o Smart Selector |
floopy-smart-select | Roda o Smart Selector | Vence testes A/B |
floopy-mcp-disabled | Pula o loop de agente MCP | A configuração MCP da organização |
Relacionados
Seção intitulada “Relacionados”- Estratégias de roteamento — como fallback, round-robin, weighted e latency-based distribuem o tráfego
- Smart Cost Routing
- Roteamento por feedback
- Prompts
- Explicando uma decisão — pergunte ao gateway por que ele escolheu o que escolheu, para uma requisição específica