fix: quota auto_tag consommé 1x par application réelle, pas à chaque frappe
Some checks failed
CI / Lint, Unit Tests & Build (push) Successful in 5m33s
CI / Deploy production (on server) (push) Failing after 18s

- Route /api/ai/tags: supprime l'incrément sur les suggestions (UI only)
  → chaque keystroke (debounce 1.5s) ne consommait plus de quota
- notes.ts: incrément unique quand des labels IA sont réellement appliqués
  en background (syncNoteLabels)
- PRO limit: 200 → 500 auto_tag/mois (200 était trop bas)

Avant: écrire une note 5min = ~20 incréments pour UNE note
Après: 1 incrément uniquement si des labels sont effectivement appliqués

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
This commit is contained in:
Antigravity
2026-05-29 13:17:40 +00:00
parent 4218470830
commit 1e00b01bc3
3 changed files with 6 additions and 2 deletions

View File

@@ -11,6 +11,7 @@ import { embeddingService } from '@/lib/ai/services/embedding.service'
import { syncNoteLinksForNote } from '@/lib/notes/sync-note-links'
import { getSystemConfig, getConfigNumber, getConfigBoolean, SEARCH_DEFAULTS } from '@/lib/config'
import { contextualAutoTagService } from '@/lib/ai/services/contextual-auto-tag.service'
import { incrementUsageAsync } from '@/lib/entitlements'
import { semanticSearchService } from '@/lib/ai/services/semantic-search.service'
import { getAISettings } from '@/app/actions/ai-settings'
import {
@@ -508,6 +509,8 @@ export async function createNote(data: {
}
const merged = [...new Set([...existingNames, ...appliedLabels])]
await syncNoteLabels(noteId, merged, notebookId ?? null, userId)
// Incrémenter le quota une seule fois par sauvegarde où des labels IA sont appliqués
incrementUsageAsync(userId, 'auto_tag')
if (!data.skipRevalidation) {
revalidatePath('/home')
}

View File

@@ -83,7 +83,8 @@ export async function POST(req: NextRequest) {
session.user.id,
(provider) => provider.generateTags(content, language),
);
if (!usedByok) incrementUsageAsync(session.user.id, 'auto_tag');
// Ne pas incrémenter ici — ce sont des suggestions UI (déclenchées à chaque keystroke)
// Le quota est compté uniquement lors de l'application réelle des labels (voir notes.ts)
return NextResponse.json({ tags });
} catch (err) {
console.error('[/api/ai/tags] legacy tagging failed:', err)

View File

@@ -84,7 +84,7 @@ const TIER_LIMITS: Record<SubscriptionTier, Record<string, number | 'unlimited'>
},
PRO: {
semantic_search: 100,
auto_tag: 200,
auto_tag: 500,
auto_title: 200,
reformulate: 50,
chat: 50,