Lições
Lista as lições do assistente de IA e aprova, rejeita ou desativa cada uma.
Uma lição é uma regra que o assistente de IA da loja aprendeu a partir dos próprios erros (veja a visão geral). Use a lista para ver o que está em teste, o que espera aprovação e o que está valendo, e use as três ações para decidir. Aprovar uma lição a torna ativa por 90 dias; rejeitar a descarta; desativar tira do ar uma lição que estava valendo.
/api/v1/admin/ai-learning/lessonsAdminLista as lições da loja e as globais
Devolve as lições da sua loja mais as globais. Não há paginação.
Parâmetros de consulta
statusstringcandidatetestingactivepending_approvalrejectedretiredactive,pending_approval). Valores desconhecidos são ignorados; sem filtro válido, vêm todos.scopestringstoreglobalExemplo de requisição (listar)
curl "$BASE_URL/api/v1/admin/ai-learning/lessons?status=pending_approval" \
-H "Authorization: Bearer $TOKEN"Resposta (listar)
{
"auto_promote": false,
"lessons": [
{
"id": 62,
"scope": "store",
"text": "Quando o cliente pedir o status de um pedido, informe o status atual e não prometa prazos que não constam no pedido.",
"pattern_key": "prazo_nao_prometido",
"status": "pending_approval",
"evidence_count": 12,
"distinct_customers": 9,
"examples": ["Prometeu entrega em 2 dias sem constar no pedido: informe só o prazo do pedido."],
"eval_result": {
"fixed": 4,
"total": 5,
"regressions": 0,
"latency_delta_pct": -1.2,
"baseline_passed": 6,
"suite_total": 6,
"rate_before": 0.07,
"gate": "ok",
"evaluated_at": "2026-10-11T06:57:49Z"
},
"prevented_errors": 0,
"created_at": "2026-10-09T06:56:24Z",
"promoted_at": null,
"can_manage": true
}
]
}Campos da resposta
auto_promotebooleantrue se a loja ativa sozinha as lições aprovadas no teste.lessonsarrayLições. Cada item tem:
idintegerscopestringstoreglobalstore: vale só para esta loja. global: vale para todas as lojas e só a equipe da plataforma administra.textstringpattern_keystringstatusstringcandidatetestingpending_approvalactiverejectedretiredevidence_countintegerdistinct_customersintegerexamplesarray[].eval_resultobjectnull se ainda não foi testada. Traz fixed/total (casos corrigidos de quantos), regressions (casos que pioraram), latency_delta_pct (variação do tempo de resposta, em %), baseline_passed/suite_total (verificações que já passavam), rate_before (taxa de erro antes), gate, note e evaluated_at (RFC 3339).prevented_errorsintegercreated_atstringpromoted_atstringnull se nunca ficou.approved_bystringretired_reasonstringexpires_atstringcan_managebooleantrue se você pode aprovar, rejeitar ou desativar esta lição. Em lição global só é true para a equipe da plataforma.Erros (listar)
| Status | Quando | Corpo de exemplo |
|---|---|---|
| 401 | Token ausente, inválido ou expirado. | {"error":"invalid or expired token"} |
| 500 | Falha ao consultar. | {"error":"..."} |
/api/v1/admin/ai-learning/lessons/{id}/approveAdminAprova uma lição
Muda uma lição de pending_approval para active, registra quem aprovou e define a expiração em 90 dias. Exige o privilégio manage_settings.
Parâmetros de caminho
idintegerobrigatórioExemplo de requisição (aprovar)
curl -X POST "$BASE_URL/api/v1/admin/ai-learning/lessons/62/approve" \
-H "Authorization: Bearer $TOKEN"Resposta (aprovar)
{ "lesson": {
"id": 62,
"scope": "store",
"text": "Quando o cliente pedir o status de um pedido, informe o status atual e não prometa prazos que não constam no pedido.",
"pattern_key": "prazo_nao_prometido",
"status": "active",
"evidence_count": 12,
"distinct_customers": 9,
"examples": ["Prometeu entrega em 2 dias sem constar no pedido: informe só o prazo do pedido."],
"eval_result": {
"fixed": 4,
"total": 5,
"regressions": 0,
"latency_delta_pct": -1.2,
"baseline_passed": 6,
"suite_total": 6,
"rate_before": 0.07,
"gate": "ok",
"evaluated_at": "2026-10-11T06:57:49Z"
},
"prevented_errors": 3,
"created_at": "2026-10-09T06:56:24Z",
"promoted_at": "2026-10-10T12:00:00Z",
"approved_by": "dono@minhaloja.example.com",
"expires_at": "2027-01-08T12:00:00Z",
"can_manage": true
} }Devolve a lição já no novo estado, no mesmo formato da listagem.
Erros (aprovar)
| Status | Quando | Corpo de exemplo |
|---|---|---|
| 400 | id não é um número inteiro positivo. | {"error":"invalid id"} |
| 401 | Token ausente, inválido ou expirado. | {"error":"invalid or expired token"} |
| 403 | Sem o privilégio manage_settings. | {"error":"insufficient privileges","required":"manage_settings"} |
| 403 | Lição global e a conta não é da equipe da plataforma. | {"error":"only a platform admin manages global lessons"} |
| 404 | Lição inexistente, ou de outra loja. | {"error":"lesson not found"} |
| 409 | A lição não está em pending_approval. | {"error":"action not allowed in this status"} |
| 500 | Falha interna ao gravar. | {"error":"..."} |
/api/v1/admin/ai-learning/lessons/{id}/rejectAdminRejeita uma lição
Muda uma lição de candidate, testing ou pending_approval para rejected. Sem reason, o motivo gravado é rejeitada pelo dono. Exige manage_settings.
Parâmetros de caminho
idintegerobrigatórioCorpo da requisição
reasonstringretired_reason. Opcional. Sem ele fica um texto padrão.Exemplo de requisição (rejeitar)
curl -X POST "$BASE_URL/api/v1/admin/ai-learning/lessons/62/reject" \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{ "reason": "Regra já coberta por outra lição." }'Resposta (rejeitar)
{ "lesson": {
"id": 62,
"scope": "store",
"text": "Quando o cliente pedir o status de um pedido, informe o status atual e não prometa prazos que não constam no pedido.",
"pattern_key": "prazo_nao_prometido",
"status": "rejected",
"evidence_count": 12,
"distinct_customers": 9,
"examples": ["Prometeu entrega em 2 dias sem constar no pedido: informe só o prazo do pedido."],
"eval_result": {
"fixed": 4,
"total": 5,
"regressions": 0,
"latency_delta_pct": -1.2,
"baseline_passed": 6,
"suite_total": 6,
"rate_before": 0.07,
"gate": "ok",
"evaluated_at": "2026-10-11T06:57:49Z"
},
"prevented_errors": 0,
"created_at": "2026-10-09T06:56:24Z",
"promoted_at": null,
"approved_by": "dono@minhaloja.example.com",
"retired_reason": "Regra já coberta por outra lição.",
"can_manage": true
} }Devolve a lição já no novo estado, no mesmo formato da listagem.
Erros (rejeitar)
| Status | Quando | Corpo de exemplo |
|---|---|---|
| 400 | id não é um número inteiro positivo. | {"error":"invalid id"} |
| 401 | Token ausente, inválido ou expirado. | {"error":"invalid or expired token"} |
| 403 | Sem o privilégio manage_settings. | {"error":"insufficient privileges","required":"manage_settings"} |
| 403 | Lição global e a conta não é da equipe da plataforma. | {"error":"only a platform admin manages global lessons"} |
| 404 | Lição inexistente, ou de outra loja. | {"error":"lesson not found"} |
| 409 | A lição não está em candidate, testing nem pending_approval. | {"error":"action not allowed in this status"} |
| 500 | Falha interna ao gravar. | {"error":"..."} |
/api/v1/admin/ai-learning/lessons/{id}/retireAdminDesativa uma lição
Muda uma lição de active para retired: o assistente deixa de segui-la. Sem reason, o motivo gravado é desativada pelo dono. Exige manage_settings.
Parâmetros de caminho
idintegerobrigatórioCorpo da requisição
reasonstringretired_reason. Opcional. Sem ele fica um texto padrão.Exemplo de requisição (desativar)
curl -X POST "$BASE_URL/api/v1/admin/ai-learning/lessons/62/retire" \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{ "reason": "Regra já coberta por outra lição." }'Resposta (desativar)
{ "lesson": {
"id": 62,
"scope": "store",
"text": "Quando o cliente pedir o status de um pedido, informe o status atual e não prometa prazos que não constam no pedido.",
"pattern_key": "prazo_nao_prometido",
"status": "retired",
"evidence_count": 12,
"distinct_customers": 9,
"examples": ["Prometeu entrega em 2 dias sem constar no pedido: informe só o prazo do pedido."],
"eval_result": {
"fixed": 4,
"total": 5,
"regressions": 0,
"latency_delta_pct": -1.2,
"baseline_passed": 6,
"suite_total": 6,
"rate_before": 0.07,
"gate": "ok",
"evaluated_at": "2026-10-11T06:57:49Z"
},
"prevented_errors": 3,
"created_at": "2026-10-09T06:56:24Z",
"promoted_at": "2026-10-10T12:00:00Z",
"approved_by": "dono@minhaloja.example.com",
"retired_reason": "Regra já coberta por outra lição.",
"expires_at": "2027-01-08T12:00:00Z",
"can_manage": true
} }Devolve a lição já no novo estado, no mesmo formato da listagem.
Erros (desativar)
| Status | Quando | Corpo de exemplo |
|---|---|---|
| 400 | id não é um número inteiro positivo. | {"error":"invalid id"} |
| 401 | Token ausente, inválido ou expirado. | {"error":"invalid or expired token"} |
| 403 | Sem o privilégio manage_settings. | {"error":"insufficient privileges","required":"manage_settings"} |
| 403 | Lição global e a conta não é da equipe da plataforma. | {"error":"only a platform admin manages global lessons"} |
| 404 | Lição inexistente, ou de outra loja. | {"error":"lesson not found"} |
| 409 | A lição não está em active. | {"error":"action not allowed in this status"} |
| 500 | Falha interna ao gravar. | {"error":"..."} |