API
Avalie prompts, trave regressão no CI e sirva versões de produção via HTTP. Aberta a todos os planos.
Autenticação
Toda requisição precisa de uma API key no header Authorization.
Authorization: Bearer pe_live_your_key_herePlanos & quota
A Eval API é aberta a todos os planos. Cada plano tem uma quota managed mensal (avaliações rodadas na nossa infra). BYOK não consome quota.
| Plano | Quota managed/mês | Modos |
|---|---|---|
| free | 10 | lint |
| basic | 30 | lint |
| pro | 75 | lint + full |
| team | 250 | lint + full |
| BYOK | ilimitado (sua chave) | lint + full em qualquer plano |
Endpoint
https://prompt-eval.com/api/v1/evalBody da requisição
json{
"prompt": "Your prompt text here",
"mode": "lint",
"language": "en"
}Parâmetros
| Parâmetro | Tipo | Obrig. | Padrão | Descrição |
|---|---|---|---|---|
| prompt | string | Sim | — | O prompt a avaliar (10–20.000 caracteres) |
| mode | string | Não | "lint" | "lint" ou "full" (full precisa de Pro/Team ou BYOK) |
| language | string | Não | "en" | "en" ou "pt" — idioma da análise |
| min_score | integer | Não | seu limite / 75 | Bar do campo pass |
| fail_on_conflict | boolean | Não | false | Reprova se houver contradição |
| baseline_slug | string | Não | — | Trava regressão vs a versão de produção do slug (Pro+) |
| max_drop | number | Não | 0 | Queda de score tolerada vs baseline |
| provider_key | string | Não | — | BYOK — chave Anthropic (prefira o header X-Provider-Key) |
Restrições
prompt mínimo: 10 caracteres · prompt máximo: 20.000 caracteres
Resposta
mode "lint" (padrão)
json{
"mode": "lint",
"score": 74,
"dimensions": {
"clarity": 68,
"specificity": 81,
"structure": 77,
"robustness": 70
},
"conflicts": [
{ "a": "Be concise", "b": "Explain in full detail", "type": "contradiction" }
],
"benchmark": { "top_percent": 22, "total": 1840 },
"pass": false,
"min_score": 75,
"meta": {
"prompt_chars": 1240,
"evaluated_at": "2026-06-04T14:32:00Z",
"plan": "pro",
"byok": false,
"calls_month": 12,
"quota_month": 75,
"quota_remaining": 63
}
}Campos da resposta
| Campo | Tipo | Descrição |
|---|---|---|
| mode | string | "lint" ou "full" (ecoa o modo usado) |
| score | integer | Score geral de qualidade, 0–100 |
| dimensions.clarity | integer | Clareza da instrução |
| dimensions.specificity | integer | Precisão do output esperado |
| dimensions.structure | integer | Organização lógica do prompt |
| dimensions.robustness | integer | Resistência a casos extremos |
| conflicts | object[] | Conflitos detectados: { a, b, type }. type: contradiction | tension | redundancy |
| benchmark | object | null | { top_percent, total } — percentil vs todas as avaliações; null até ter dados |
| pass | boolean | Veredito do gate de CI (ver seção) |
| min_score | integer | O limite efetivamente usado |
| meta.plan | string | Plano da key |
| meta.byok | boolean | Se rodou com chave própria |
| meta.calls_month | integer | Chamadas managed neste mês |
| meta.quota_month | integer | Quota managed do plano |
| meta.quota_remaining | integer | Quota managed restante |
mode "full" — adiciona grafo, problemas, recomendações e prompt melhorado
json{
"mode": "full",
"score": 74,
"dimensions": { "clarity": 68, "specificity": 81, "structure": 77, "robustness": 70 },
"conflicts": [ /* ... */ ],
"benchmark": { "top_percent": 22, "total": 1840 },
"pass": false,
"min_score": 75,
"graph": { "nodes": [ /* ... */ ], "edges": [ /* ... */ ] },
"problems": {
"critical": ["Output format is underspecified."],
"warnings": ["Persona may conflict with the tone constraint."]
},
"recommendations": [
"Add an explicit output-format section with an example.",
"Reconcile the tone constraint with the persona."
],
"improved_prompt": "You are a customer support agent...",
"meta": { "plan": "pro", "byok": false, "calls_month": 13, "quota_month": 75, "quota_remaining": 62 }
}| Campo | Tipo | Descrição |
|---|---|---|
| graph | object | { nodes, edges } — grafo de instruções do prompt |
| problems.critical | string[] | Problemas críticos |
| problems.warnings | string[] | Avisos |
| recommendations | string[] | Melhorias acionáveis |
| improved_prompt | string | Versão reescrita do prompt |
| regression | object | Presente só quando baseline_slug é passado (ver gate) |
Gate de CI (campo pass)
O campo pass é o veredito booleano pra usar no CI. É true quando TODAS as condições abaixo são satisfeitas:
Regressão vs produção
Passe baseline_slug para comparar o score atual com a versão em PRODUÇÃO daquele slug (Pro+, precisa de slug + versão de produção). max_drop define a queda tolerada (0 = qualquer queda reprova). O objeto regression vem na resposta:
json"regression": {
"baseline": { "slug": "support-agent" },
"baseline_score": 82,
"current_score": 74,
"delta": -8,
"max_drop": 0,
"regressed": true
}Erros
| Status | Código | Quando acontece |
|---|---|---|
| 400 | Bad Request | prompt ausente/curto, mode/language inválido, provider_key malformada |
| 401 | Unauthorized | API key ausente/revogada, ou chave BYOK rejeitada |
| 402 | Quota Exhausted | Quota managed do mês esgotada (resposta traz CTA de upgrade) |
| 403 | Forbidden | mode "full" sem Pro/Team e sem BYOK |
| 404 | Not Found | baseline_slug sem prompt ou sem versão de produção |
| 413 | Payload Too Large | Prompt acima de 20.000 caracteres |
| 422 | Unprocessable | Versão de produção do baseline ainda sem score |
| 429 | Too Many Requests | Rate limit de 5 req/min atingido |
| 500 | Server Error | Falha na avaliação — tente novamente |
Todos os erros retornam um corpo JSON:
json{ "error": "machine_code", "message": "Human-readable description." }BYOK — sua própria chave
Envie o header X-Provider-Key com uma chave Anthropic (sk-ant-...). A inferência roda na sua chave: não consome quota managed, custo zero pra você no nosso lado, e destrava o mode full em qualquer plano (inclusive free).
bash# BYOK: run on your own Anthropic key.
# No managed quota is consumed, and it unlocks "full" on any plan.
curl -X POST https://prompt-eval.com/api/v1/eval \
-H "Authorization: Bearer pe_live_your_key_here" \
-H "X-Provider-Key: sk-ant-your-anthropic-key" \
-H "Content-Type: application/json" \
-d '{ "prompt": "You are a customer support agent...", "mode": "full" }'Exemplos
bashcurl -X POST https://prompt-eval.com/api/v1/eval \
-H "Authorization: Bearer pe_live_your_key_here" \
-H "Content-Type: application/json" \
-d '{
"prompt": "You are a customer support agent. Answer clearly and concisely. Always end by asking if there is anything else you can help with.",
"mode": "lint"
}'Integração com CI/CD
O jeito recomendado é a GitHub Action oficial — ela monta a requisição, reprova o build por score, conflito ou regressão, e renderiza um resumo no job.
yaml# .github/workflows/prompt-check.yml
name: Prompt Check
on:
pull_request:
paths: ['prompts/**'] # adjust to your prompts directory
jobs:
eval:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: FranciscoFerreiraff/prompteval-action@v1
with:
api_key: ${{ secrets.PROMPTEVAL_API_KEY }}
prompt_file: prompts/support-agent.md
min_score: 75
fail_on_conflict: true
baseline_slug: support-agent # gate regression vs productionPrompts API (serving)
Busca a versão em produção de um prompt pelo slug. Sem chamada à IA — leitura pura da biblioteca. Seguro pra chamar a cada requisição. Pro+.
https://prompt-eval.com/api/v1/prompts/{slug}Exemplos
bashcurl https://prompt-eval.com/api/v1/prompts/customer-support \
-H "Authorization: Bearer pe_live_your_key_here"Mitigação de risco
O Supabase tem SLA de 99,9% — isso significa até ~8h de indisponibilidade por ano. Não deixe sua aplicação parar por causa disso.
Sem fallback — para se a API cair
python# ❌ NÃO faça isso — você depende 100% do PromptEval em produção
def handle_request(user_input):
prompt = get_from_prompteval("customer-support") # falha se a API cair
return call_llm(prompt, user_input)Com fallback — nunca para de funcionar
python# ✅ Faça isso — fallback local garante uptime
FALLBACK_PROMPT = "You are a helpful assistant..." # versão hardcoded de emergência
def handle_request(user_input):
try:
prompt = get_from_prompteval("customer-support")
except Exception:
prompt = FALLBACK_PROMPT # nunca para de funcionar
return call_llm(prompt, user_input)javascript// ✅ JavaScript — fallback local
const FALLBACK_PROMPT = "You are a helpful assistant...";
async function getPrompt(slug) {
try {
const res = await fetch(
`https://prompt-eval.com/api/v1/prompts/${slug}`,
{ headers: { Authorization: `Bearer ${process.env.PROMPTEVAL_API_KEY}` } }
);
if (!res.ok) throw new Error(`HTTP ${res.status}`);
const data = await res.json();
return data.content;
} catch {
return FALLBACK_PROMPT; // nunca para de funcionar
}
}Resposta — 200
json{
"slug": "customer-support",
"name": "Customer Support Agent",
"version": 3,
"content": "You are a customer support agent...",
"score": 82,
"production_set_at": "2026-05-14T10:00:00Z"
}| Campo | Tipo | Descrição |
|---|---|---|
| slug | string | Slug definido na biblioteca |
| name | string | Nome do prompt na biblioteca |
| version | integer | Número da versão em produção |
| content | string | Conteúdo do prompt (use como system prompt) |
| score | integer | null | Score da versão (0–100), ou null se não avaliada |
| production_set_at | string | ISO 8601 — quando foi marcado como produção |
Erros
| Status | Quando acontece |
|---|---|
| 400 | Slug com formato inválido na URL |
| 401 | API key ausente, malformada ou revogada |
| 403 | Key válida, mas conta não está no plano Pro/Team |
| 404 | Slug não encontrado, ou prompt sem versão em produção |
| 405 | Método não permitido (use GET) |
Precisa de quota maior? Fale com a gente — temos planos customizados pra times de alto volume. → francisco@prompt-eval.com
Faltou algo na documentação? Abra uma issue ou envie um feedback →