Pular para o conteúdo
Entrar Começar

API Reference

O gateway Floopy expõe uma API compatível com OpenAI. Aponte qualquer SDK da OpenAI para o gateway alterando a baseURL, e seu código existente funciona sem modificações.

POST https://api.floopy.ai/v1/chat/completions

Inclua sua API key do Floopy no header Authorization:

Authorization: Bearer <your-floopy-api-key>
{
"model": "gpt-4o",
"messages": [
{ "role": "system", "content": "You are a helpful assistant." },
{ "role": "user", "content": "Hello!" }
],
"temperature": 0.7,
"max_tokens": 1000,
"stream": false,
"inputs": { "name": "Alice" }
}
CampoTipoObrigatórioDescrição
modelstringSimID do modelo (ex.: "gpt-4o"). Separado por vírgulas para fallback: "gpt-4o,claude-sonnet-4-6"
messagesarraySimArray de objetos de mensagem com role ("system", "user", "assistant") e content (string)
temperaturenumberNão0.0-2.0. Controla a aleatoriedade. Padrão: padrão do modelo
max_tokensintegerNãoMáximo de tokens na resposta
top_pnumberNão0.0-1.0. Limite de nucleus sampling
frequency_penaltynumberNão-2.0 a 2.0. Reduz repetição de tokens
presence_penaltynumberNão-2.0 a 2.0. Incentiva novos tópicos
stoparrayNãoStrings que interrompem a geração quando encontradas
reasoning_effortstringNão"low", "medium", "high". Apenas para modelos o1/o3
response_formatobjectNãoModo JSON: {"type": "json_object"}
streambooleanNãoHabilita streaming SSE. Padrão: false
inputsobjectNãoPares chave-valor para substituição de variáveis em templates de prompt. Removido antes do envio ao provider
{
"id": "chatcmpl-abc123",
"object": "chat.completion",
"created": 1717000000,
"model": "gpt-4o",
"choices": [
{
"index": 0,
"message": { "role": "assistant", "content": "Hello! How can I help?" },
"finish_reason": "stop"
}
],
"usage": {
"prompt_tokens": 12,
"completion_tokens": 8,
"total_tokens": 20
}
}

Quando stream: true, o gateway retorna Server-Sent Events (SSE). Cada evento contém um chunk:

data: {"id":"chatcmpl-abc123","object":"chat.completion.chunk","created":1717000000,"model":"gpt-4o","choices":[{"index":0,"delta":{"content":"Hello"},"finish_reason":null}]}

O stream termina com:

data: [DONE]

O gateway adiciona estes headers a toda resposta:

HeaderDescriçãoExemplo
Floopy-ProviderO provider que atendeu a requisiçãoOpenAI
Floopy-ModelO modelo que processou a requisiçãogpt-4o
Floopy-Fallback-UsedSe um provider de fallback foi usado porque o primário estava indisponíveltrue
Floopy-Reasoning-TokensNúmero de reasoning tokens usados (modelos DeepSeek)150
Floopy-Queue-TimeTempo que a requisição ficou na fila do provider, em segundos (Groq)0.5
Floopy-Prompt-TimeTempo gasto processando o prompt, em segundos (Groq)0.2
Floopy-Completion-TimeTempo gasto gerando o completion, em segundos (Groq)1.3

Erros padrão retornam um corpo JSON:

{
"error": {
"type": "error",
"code": "ERROR_CODE",
"message": "Human-readable description"
}
}

Erros de rate limit (429) incluem um header Retry-After com o número de segundos a aguardar.

Erros de limite mensal incluem campos adicionais:

{
"error": {
"type": "error",
"code": "MONTHLY_LIMIT_EXCEEDED",
"message": "Monthly request limit reached",
"limit": 100000,
"used": 100000,
"reset_at": "2025-02-01T00:00:00Z"
}
}

Consulte Troubleshooting para uma lista completa de códigos de erro e como resolvê-los.

Envie feedback no nível de sessão para melhorar a qualidade do roteamento. Autenticado com a mesma API key usada para requisições de chat.

POST https://api.floopy.ai/v1/feedback
{
"session_id": "sess_abc123",
"score": 8,
"useful": true
}
CampoTipoObrigatórioDescrição
session_idstringSimO ID da sessão enviado no header floopy-session-id durante as requisições de chat
scoreintegerSimScore NPS de 0 a 10. 0-6 = detrator, 7-8 = passivo, 9-10 = promotor
usefulbooleanSimSe a conversa foi útil para o usuário final

Retorna 200 OK com um objeto JSON vazio em caso de sucesso.

{}

Consulte Feedback para detalhes sobre como o feedback impulsiona a otimização de roteamento.

Endpoint de embeddings compatível com a API da OpenAI. Encaminha para o provider configurado para o modelo solicitado. Atualmente roteia através de providers OpenAI-compatíveis (OpenAI, Mistral, Together, Groq, DeepInfra, Nebius, Fireworks, Cohere, Azure, etc.). Anthropic não expõe API de embeddings; Bedrock, Gemini e Vertex são reservados para evolução futura.

POST /v1/embeddings

Mesmo Bearer token do chat completions:

Authorization: Bearer <FLOOPY_API_KEY>
{
"model": "text-embedding-3-small",
"input": "The quick brown fox jumps over the lazy dog"
}

input pode ser uma única string ou um array de strings para gerar embeddings em lote:

{
"model": "text-embedding-3-small",
"input": ["primeiro texto", "segundo texto", "terceiro texto"]
}
CampoTipoObrigatórioDescrição
modelstringSimID do modelo de embedding (ex.: text-embedding-3-small, text-embedding-3-large)
inputstring ou string[]SimTexto(s) a vetorizar
dimensionsintegerNãoTamanho do vetor de saída quando o modelo suporta (ex.: OpenAI text-embedding-3-*)
encoding_formatstringNãofloat (padrão) ou base64
userstringNãoIdentificador livre do chamador — repassado ao provider para analytics
{
"object": "list",
"data": [
{
"object": "embedding",
"embedding": [0.0123, -0.0456, 0.0789, "..."],
"index": 0
}
],
"model": "text-embedding-3-small",
"usage": {
"prompt_tokens": 9,
"total_tokens": 9
}
}

Para inputs em lote, data contém uma entrada por input na ordem da requisição.

curl

Terminal window
curl https://api.floopy.ai/v1/embeddings \
-H "Authorization: Bearer $FLOOPY_API_KEY" \
-H "Content-Type: application/json" \
-d '{"model":"text-embedding-3-small","input":"hello"}'

Python (SDK OpenAI)

from openai import OpenAI
client = OpenAI(api_key=os.environ["FLOOPY_API_KEY"], base_url="https://api.floopy.ai/v1")
resp = client.embeddings.create(model="text-embedding-3-small", input="hello")
print(resp.data[0].embedding[:5])

JavaScript (SDK OpenAI)

import OpenAI from "openai";
const client = new OpenAI({ apiKey: process.env.FLOOPY_API_KEY, baseURL: "https://api.floopy.ai/v1" });
const resp = await client.embeddings.create({ model: "text-embedding-3-small", input: "hello" });
console.log(resp.data[0].embedding.slice(0, 5));

Envelope de erro compatível com OpenAI. Quando nenhum provider configurado para a organização suporta o modelo de embedding solicitado, o gateway retorna 400 com:

{
"error": {
"message": "The model `claude-3-5-sonnet` does not exist or you do not have access to it.",
"type": "invalid_request_error",
"code": "model_not_found",
"param": "model"
}
}

Outros modos de falha (auth, rate limit, 5xx do provider) reusam o mesmo formato de erro de /v1/chat/completions.

Use estes endpoints para monitorar o status do gateway e suas dependências.

EndpointDescrição
GET /healthProbe de liveness (sempre 200)
GET /health/readyProbe de readiness (verifica Redis, ClickHouse, Qdrant)
GET /health/redisVerificação de conectividade com Redis
GET /health/clickhouseVerificação de conectividade com ClickHouse
GET /health/qdrantVerificação de conectividade com Qdrant
GET /health/providersEstado do circuit breaker por provider