diff --git a/backend/crates/api/src/routes/usage.rs b/backend/crates/api/src/routes/usage.rs index 4f13ccc..75ddf66 100644 --- a/backend/crates/api/src/routes/usage.rs +++ b/backend/crates/api/src/routes/usage.rs @@ -47,12 +47,32 @@ pub async fn get_usage( ctx.workspace_id ).fetch_one(&app.db).await.unwrap_or(Some(0)).unwrap_or(0); + // Tokens reais: soma prompt/completion das interacoes do workspace. + // (query_scalar nao-macro = checado em runtime; nao depende do cache .sqlx) + let total_tokens_input: i64 = sqlx::query_scalar( + "SELECT COALESCE(SUM(prompt_tokens), 0)::bigint + FROM training_interactions WHERE workspace_id = $1", + ) + .bind(ctx.workspace_id) + .fetch_one(&app.db) + .await + .unwrap_or(0); + + let total_tokens_output: i64 = sqlx::query_scalar( + "SELECT COALESCE(SUM(completion_tokens), 0)::bigint + FROM training_interactions WHERE workspace_id = $1", + ) + .bind(ctx.workspace_id) + .fetch_one(&app.db) + .await + .unwrap_or(0); + Ok(Json(UsageResponse { workspace_id: ctx.workspace_id.to_string(), period: "last_30_days".into(), total_requests: interactions, - total_tokens_input: 0, // TODO: somar prompt_tokens - total_tokens_output: 0, // TODO: somar completion_tokens + total_tokens_input, + total_tokens_output, total_documents: documents, total_interactions: interactions, })) diff --git a/docs/roadmap_v1.md b/docs/roadmap_v1.md index b0dd109..99c2404 100644 --- a/docs/roadmap_v1.md +++ b/docs/roadmap_v1.md @@ -91,7 +91,8 @@ ao wirar os órfãos. Separei os itens em "seguros" (PR #2) e "refactor" (PR ded | Ticket | Descrição | Status | |---|---|---| | TKT-041 | Swagger real | ⏳ | -| TKT-042/044 | usage_tracker + `/usage` | ⏳ | +| TKT-042 | `/usage` tokens reais | ✅ feito — soma `prompt_tokens`/`completion_tokens` de `training_interactions` (antes `0 // TODO`); query runtime-checked (sem cache .sqlx); SQL validado no schema | +| TKT-044 | `usage_tracker` middleware | ⏳ | | TKT-043 | rotas documents/training na api-public | ⏳ | | TKT-045/046 | CD (GHCR) + security scans | ⏳ | | TKT-047/048 | WebSocket + e-mails (`lettre`) | ⏸️ (SMTP→pendência) |