La funzionalità di analisi del profilo permette agli utenti di caricare documenti (CV, LinkedIn export PDF, etc.) e testo libero per ottenere un'analisi automatica tramite Claude AI che estrae informazioni strutturate come:
- Ruolo professionale
- Seniority level
- Settori di esperienza
- Skills e competenze tecniche
- Esperienze lavorative
- Educazione
- Progetti personali
- Ottieni una API key da Anthropic Console
- Aggiungi la key al file
.env.local(crea il file se non esiste):
ANTHROPIC_API_KEY=sk-ant-your-api-key-hereEsegui la migrazione Prisma per aggiungere la tabella profile_analyses:
npm run db:push
# oppure per creare una migrazione
npm run db:migrateLa directory uploads/ è già creata e configurata nel .gitignore. I file caricati saranno salvati qui.
- Naviga alla pagina
/onboarding(o/[locale]/onboardingcon il tuo locale) - Carica uno o più documenti:
- PDF (consigliato per LinkedIn export)
- DOC/DOCX
- TXT
- Massimo 5 file, 10MB ciascuno
- Opzionalmente, aggiungi informazioni extra nel campo di testo libero
- Clicca "Analyze Profile" e attendi l'analisi (può richiedere 10-30 secondi)
- I risultati saranno salvati nel database e visualizzati a schermo
Carica file e testo per l'analisi.
Body (FormData):
files: File[] - Array di file (max 5)freeText: string (optional) - Testo libero
Response:
{
"success": true,
"data": {
"id": "...",
"userId": "...",
"role": "Senior Full Stack Developer",
"seniority": "Senior",
"sectors": ["FinTech", "E-commerce"],
"skills": [...],
"workExperiences": [...],
"education": [...],
"personalProjects": [...],
"analysisStatus": "completed",
...
}
}Recupera tutte le analisi dell'utente autenticato.
Response:
{
"success": true,
"data": [...]
}├── prisma/
│ └── schema.prisma # Schema DB con ProfileAnalysis model
├── lib/
│ ├── anthropic.ts # Client Claude AI e logica di analisi
│ ├── file-processing.ts # Gestione upload e estrazione testo da PDF
│ └── validations/
│ └── profile-analysis.ts # Zod schemas per validazione
├── app/
│ ├── api/
│ │ └── analyze-profile/
│ │ └── route.ts # API endpoint
│ └── [locale]/(protected)/
│ └── onboarding/
│ └── page.tsx # UI per upload e analisi
├── components/ui/
│ └── file-upload.tsx # Componente drag-n-drop per upload
└── uploads/ # Directory per file caricati (gitignored)
model ProfileAnalysis {
id String @id @default(cuid())
userId String
user User @relation(...)
// Dati analizzati
role String?
seniority String?
sectors String[]
skills Json?
workExperiences Json?
education Json?
personalProjects Json?
additionalData Json? // Campo flessibile per info future
// Dati originali
uploadedFiles String[]
freeText String?
// Metadata
analysisStatus String @default("pending")
errorMessage String?
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
}- Upload: L'utente carica file e/o testo tramite la UI
- Salvataggio: I file sono salvati in
/uploads/con naming{userId}_{timestamp}_{filename} - Preparazione: I file PDF sono convertiti in base64, i file di testo sono decodificati
- Analisi: I documenti sono inviati direttamente a Claude API (PDF nativo supportato!)
- Parsing: La risposta JSON di Claude è validata con Zod
- Salvataggio DB: I dati analizzati sono salvati in PostgreSQL
- Display: I risultati sono mostrati all'utente
Nota importante: Claude supporta nativamente la lettura di PDF, quindi non è necessario estrarre manualmente il testo. Questo rende il processo più accurato e affidabile, specialmente per PDF complessi con tabelle, formattazione, ecc.
Per aggiungere nuovi campi all'analisi:
- Aggiorna lo schema Zod in
lib/validations/profile-analysis.ts:
export const llmAnalysisOutputSchema = z.object({
// ... campi esistenti
newField: z.string().optional(),
});-
Aggiorna il prompt in
lib/anthropic.tsper includere il nuovo campo nell'output JSON richiesto -
Se necessario, aggiungi una colonna al DB in
prisma/schema.prismaoppure usa il campoadditionalData(JSON flessibile)
In lib/anthropic.ts, cambia il modello:
const message = await anthropic.messages.create({
model: "claude-3-5-haiku-20241022", // Modello attualmente in uso
// ...
});Modello attuale: claude-3-5-haiku-20241022 (più economico e veloce)
Altri modelli disponibili:
claude-3-5-haiku-20241022✓ (in uso - più economico, ottimo per task strutturati)claude-3-5-sonnet-20241022(bilanciato - più accurato per analisi complesse)claude-3-opus-20240229(più potente ma più costoso)
Nota: Haiku è ottimo per questo use case perché l'analisi di CV è un task ben definito con output JSON strutturato. Se noti che la qualità non è sufficiente, puoi passare a Sonnet.
In lib/validations/profile-analysis.ts:
export const MAX_FILE_SIZE = 10 * 1024 * 1024; // 10MB
export const MAX_FILES = 5;- Claude potrebbe non aver restituito JSON valido
- Controlla i log della console per vedere la risposta raw
- Potrebbe essere necessario migliorare il prompt per essere più specifico
- Assicurati che il PDF non sia corrotto
- Claude ha un limite di dimensione per i PDF (~32MB per file)
- PDF scansionati (solo immagini) potrebbero dare risultati meno accurati
- Se il PDF è molto grande, considera di dividerlo in sezioni più piccole
- Aumenta
MAX_FILE_SIZEse necessario - Considera di usare storage cloud (S3, Cloudinary) per file grandi invece del filesystem locale
Possibili miglioramenti futuri:
- Upload diretto da URL (LinkedIn profile URL)
- Analisi incrementale (aggiornamento invece di rianalisi completa)
- Supporto per altri formati (Excel, CSV per analizzare esperienze strutturate)
- Dashboard per visualizzare e confrontare analisi multiple
- Export dei dati analizzati in formato JSON/PDF
- Migrazione a storage cloud (Uploadthing, S3, Vercel Blob)
- Processing asincrono con job queue per file molto grandi
- Supporto per immagini (screenshot di profili LinkedIn/portfolio)
- Analisi multi-lingue con auto-detection