Passa al contenuto principale

Endpoint: Analisi e Classificazione

Riferimento degli endpoint per l'analisi di contenuti, documenti PDF, CV e dati tabellari, l'OCR, la classificazione tramite catalogo Similarity, l'editor PDF, i template di analisi e l'integrazione con Askme Desk.

Tutte le richieste utilizzano l'URL base https://ai.askme.it/api/v2 e gli header descritti in Autenticazione (X-Api-Key, X-Source-App, X-External-Id opzionale).

Classificazione operativa

La classificazione operativa dei testi (triage, instradamento) passa dagli endpoint del catalogo Similarity (sezione 3), non da un endpoint di classificazione generico.

1. Analisi

Job di analisi orchestrati: contenuto testuale, PDF, CV, dati strutturati.

Modello di esecuzione: ogni POST /analysis/<tipo> accetta il body, restituisce 202 Accepted con un job in stato pending e schedula l'elaborazione asincrona. Il risultato si ottiene interrogando GET /analysis/{id}. Per i tipi che lo supportano sono disponibili anche le varianti /sync che attendono il completamento (200 OK).

Header opzionale Idempotency-Key: se ripetuto entro la finestra di idempotenza, restituisce lo stesso job invece di crearne uno nuovo.

Opzioni comuni (options)

Tutti i body POST espongono un campo opzionale options:

CampoTipoDefaultDescrizione
modelstringOverride del modello LLM (es. claude-haiku-4-5-20251001).
temperaturefloat (0.0–2.0)Sampling temperature.
max_tokensint (1–128000)Limite token risposta.
languagestringHint lingua (it, en, ecc.).
output_formatstringjsonjson, html, markdown.
guardrailsboolfalseAbilita controlli PII/injection/toxicity.
confidence_checkboolfalseAbilita validazione qualità risultato.
webhook_idintWebhook (registrato con /webhooks, vedi Endpoint: Knowledge Base) da notificare a fine job.

Inoltre tutti i body accettano:

CampoTipoDescrizione
template_idintID di un template di analisi (sezione 6): il suo input_config viene fuso col body.
namestring (max 255)Nome visualizzato del job.

POST /analysis/content

Analisi testuale generica (sentiment, entità, parole chiave, riassunto).

Attributi richiesta

CampoInTipoObbligatorioDefaultDescrizione
textbodystring (1–200000)Testo da analizzare.
custom_instructionsbodystring (max 4000)NoIstruzioni aggiuntive per il prompt.
max_charsbodyint (100–200000)No20000Troncamento prima dell'invio al modello.
template_id, name, optionsbodyNo(vedi sopra).

Esempio richiesta

curl -X POST "https://ai.askme.it/api/v2/analysis/content" \
-H "X-Api-Key: amai_xxxxxxxxxxxxxxxx" \
-H "X-Source-App: api_direct" \
-H "Idempotency-Key: 2c9e5c0e-..." \
-H "Content-Type: application/json" \
-d '{
"name": "Analisi recensione",
"text": "Il prodotto è arrivato con un giorno di ritardo ma il servizio clienti è stato ottimo.",
"options": { "language": "it" }
}'

Esempio risposta (202 Accepted)

{
"id": 88102,
"tenant_id": "acme",
"type": "content",
"status": "pending",
"input_config": {
"name": "Analisi recensione",
"text": "Il prodotto è arrivato con un giorno di ritardo...",
"max_chars": 20000,
"source_app": "api_direct"
},
"result": null,
"error_message": null,
"created_by": "user-uuid",
"started_at": null,
"completed_at": null,
"created_at": "2026-04-30T11:00:00Z"
}

L'endpoint POST /analysis/content/sync ha lo stesso body ma attende il completamento e risponde 200 OK con il result popolato.


POST /analysis/pdf

Analisi di un documento PDF tramite LLM. Opzionalmente crea una KB temporanea e un agente per la modalità chat-with-doc.

Attributi richiesta

CampoInTipoObbligatorioDefaultDescrizione
filenamebodystring (max 512)Nome del file (determina nome KB/agente).
file_contentbodystring base64Sì*Contenuto PDF in base64. *Esattamente uno tra file_content e file_path.
file_pathbodystringSì*Path su object storage di un file già caricato.
custom_promptbodystring (max 8000)NoIstruzioni libere per l'analisi.
agent_idbodyintNoAgente di fallback per il prompt.
temp_agent_namebodystring (max 512)NoNome dell'agente temporaneo (richiesto in alcune lingue).
create_kb_agentbodyboolNofalseSe true, crea KB+agente temporanei con il documento per la chat.
skip_analysisbodyboolNofalseSalta lo step di analisi LLM e crea solo KB+agente. Richiede create_kb_agent=true.
template_id, name, optionsbodyNo(vedi sopra).

Esempio richiesta

curl -X POST "https://ai.askme.it/api/v2/analysis/pdf" \
-H "X-Api-Key: amai_xxxxxxxxxxxxxxxx" \
-H "X-Source-App: api_direct" \
-F "[email protected]" \
-F 'options={"language":"it","create_kb_agent":true,"skip_analysis":false}'

Esempio risposta (202 Accepted)

{
"id": 88103,
"tenant_id": "acme",
"type": "pdf",
"status": "pending",
"input_config": {
"filename": "policy.pdf",
"create_kb_agent": true,
"skip_analysis": false,
"source_app": "api_direct"
},
"result": null,
"created_at": "2026-04-30T11:05:00Z"
}

Errori specifici

CodiceSignificato
422file_contentfile_path forniti, oppure entrambi; oppure skip_analysis=true senza create_kb_agent=true.

L'endpoint /analysis/pdf/sync esegue in modo sincrono. Il polling dello stato è disponibile su GET /analysis/{job_id}/status:

curl -s "https://ai.askme.it/api/v2/analysis/88103/status" \
-H "X-Api-Key: amai_xxxxxxxxxxxxxxxx" \
-H "X-Source-App: api_direct"

Quando status == "completed", il dettaglio (GET /analysis/{job_id}) include result.response con la risposta dell'LLM.


POST /analysis/cv

Scoring di un CV rispetto alle job position configurate dal tenant.

Attributi richiesta

CampoInTipoObbligatorioDescrizione
file_contentbodystring base64CV (PDF o DOCX) in base64.
filenamebodystring (max 512)Nome file con estensione (determina il parser).
job_position_idbodyintNoLimita lo scoring a una posizione. Se omesso, valuta contro tutte le posizioni del tenant.
cv_prompt_idbodyintNoOverride del prompt CV. Default: prompt configurato dal tenant (sezione 5).
template_id, name, optionsbodyNo(vedi sopra).

L'endpoint /analysis/cv/sync esegue in modo sincrono.


POST /analysis/data

Analisi su dati tabellari (CSV/XLSX letti come lista di dict).

Attributi richiesta

CampoInTipoObbligatorioDescrizione
databodyobject[] (1–10000)Righe come { colonna: valore }.
columnsbodystring[]NoSottoinsieme di colonne da analizzare (default: tutte).
custom_promptbodystring (max 4000)NoIstruzioni LLM aggiuntive.
agent_idbodyintNoAgente di fallback per il prompt.
template_id, name, optionsbodyNo(vedi sopra).

GET /analysis

Elenca i job di analisi del tenant.

Attributi richiesta

CampoInTipoDefaultDescrizione
offsetqueryint0Paginazione.
limitqueryint (1–200)50Page size.
statusquerystringpending, running, completed, failed.
typequerystringcontent, pdf, cv, data, ocr.

Esempio risposta (200 OK)

{
"items": [
{
"id": 88102,
"tenant_id": "acme",
"type": "content",
"status": "completed",
"input_config": { "name": "Analisi recensione", "source_app": "api_direct" },
"error_message": null,
"created_by": "user-uuid",
"started_at": "2026-04-30T11:00:01Z",
"completed_at": "2026-04-30T11:00:08Z",
"created_at": "2026-04-30T11:00:00Z"
}
],
"total": 1,
"offset": 0,
"limit": 50
}

GET /analysis/{analysis_id}

Dettaglio del job, incluso result (struttura specifica per tipo).

Esempio risposta (200 OK, content analysis completata)

{
"id": 88102,
"tenant_id": "acme",
"type": "content",
"status": "completed",
"input_config": { "text": "...", "source_app": "api_direct" },
"result": {
"summary": "Il cliente segnala un ritardo ma riconosce la qualità del servizio.",
"sentiment": { "label": "neutral", "score": 0.62 },
"keywords": ["ritardo", "servizio clienti"],
"entities": [{ "text": "servizio clienti", "type": "department" }],
"language": "it"
},
"error_message": null,
"started_at": "2026-04-30T11:00:01Z",
"completed_at": "2026-04-30T11:00:08Z",
"created_at": "2026-04-30T11:00:00Z"
}

GET /analysis/{analysis_id}/status

Solo lo stato del job (no result). Adatto al polling frequente.

Esempio risposta (200 OK)

{
"id": 88102,
"type": "content",
"status": "running",
"started_at": "2026-04-30T11:00:01Z",
"completed_at": null,
"error_message": null
}

DELETE /analysis/{analysis_id}

Soft-delete del job. Risposta 204.


2. OCR

POST /analysis/ocr

Estrazione di testo da immagini o PDF scansionati. Multipart/form-data (non JSON).

Attributi richiesta

CampoInTipoObbligatorioDefaultDescrizione
fileform-datafileImmagine o PDF (max 50 MB).
languageform-datastringNoitaLingua Tesseract: ita, eng, fra, deu, spa.
template_idform-dataintNoTemplate OCR.
webhook_idform-dataintNoWebhook di notifica a completamento.

Esempio richiesta

curl -X POST "https://ai.askme.it/api/v2/analysis/ocr" \
-H "X-Api-Key: amai_xxxxxxxxxxxxxxxx" \
-H "X-Source-App: api_direct" \
-F "[email protected]" \
-F "language=ita"

Errori specifici

CodiceSignificato
400Tipo MIME non supportato o file vuoto.
413File oltre 50 MB.

3. Classificazione (catalogo Similarity)

La classificazione di testi avviene attraverso il catalogo Similarity: si costruisce un indice a partire da esempi (con o senza etichette) e poi si classificano nuovi testi rispetto a quell'indice. Tutti gli endpoint sono prefissati da /api/v2/analysis/catalogs.

POST /analysis/catalogs/build

Avvia la build di un catalogo. Risposta 202 Accepted: la build è asincrona, con polling sullo stato del catalogo.

Attributi richiesta

CampoInTipoObbligatorioDefaultDescrizione
namebodystring (1–100)Nome del catalogo.
modebodystringsupervised (richiede label_path su almeno una coppia) o unsupervised.
thresholdbodyfloat (0.0–1.0)No0.6Soglia minima di similarità per accettare un candidato.
pairsbodyobject[]Lista non vuota di coppie. Ogni elemento: ticket (string, obbligatorio), response (string), label_path (string[]).

Esempio richiesta (supervisionato, cURL)

curl -X POST "https://ai.askme.it/api/v2/analysis/catalogs/build" \
-H "X-Api-Key: amai_xxxxxxxxxxxxxxxx" \
-H "X-Source-App: api_direct" \
-H "Content-Type: application/json" \
-d '{
"name": "Triage richieste clienti",
"mode": "supervised",
"threshold": 0.6,
"pairs": [
{ "ticket": "Vorrei sapere quando arriva il pacco", "label_path": ["spedizione"] },
{ "ticket": "Il prodotto è arrivato rotto", "label_path": ["reso"] },
{ "ticket": "Posso modificare l'\''indirizzo di consegna?", "label_path": ["modifica ordine"] }
]
}'

Esempio richiesta (Python, httpx)

import httpx

client = httpx.Client(
base_url="https://ai.askme.it/api/v2",
headers={"X-Api-Key": "amai_xxxxxxxxxxxxxxxx", "X-Source-App": "api_direct"},
timeout=30.0,
)

resp = client.post("/analysis/catalogs/build", json={
"name": "Triage richieste",
"mode": "supervised",
"threshold": 0.6,
"pairs": [
{"ticket": "Vorrei sapere quando arriva il pacco", "label_path": ["spedizione"]},
{"ticket": "Il prodotto è arrivato rotto", "label_path": ["reso"]},
{"ticket": "Posso modificare l'indirizzo di consegna?", "label_path": ["modifica ordine"]},
{"ticket": "Vorrei un preventivo per la versione enterprise", "label_path": ["vendita"]},
],
})
resp.raise_for_status()
catalog_id = resp.json()["id"]

Esempio risposta (202 Accepted)

{
"id": 14,
"tenant_id": "c9fe50b1-be08-...",
"name": "Triage richieste clienti",
"mode": "supervised",
"status": "queued",
"refinement_status": "templates_refined",
"embedding_model": "text-embedding-3-small",
"threshold": 0.6,
"template_count": 0,
"created_by": "...",
"created_at": "2026-04-30T12:00:00Z"
}

Polling sullo stato:

curl "https://ai.askme.it/api/v2/analysis/catalogs/14" \
-H "X-Api-Key: amai_xxxxxxxxxxxxxxxx" -H "X-Source-App: api_direct"

Quando status == "ready" il catalogo è pronto.

Errori specifici

CodiceSignificato
400pairs vuoto; oppure mode=supervised senza alcuna coppia con label_path.

GET /analysis/catalogs

Lista paginata dei cataloghi del tenant.

Query

CampoTipoDefaultDescrizione
offsetint0Indice del primo elemento.
limitint (1–200)50Numero di elementi.
statusstringFiltro per stato: queued, building, ready, failed, cancelled.
modestringsupervised o unsupervised.

GET /analysis/catalogs/{catalog_id}

Dettaglio del catalogo, inclusa la lista dei templates (esempi rappresentativi). Da usare per esplorare i cluster nei cataloghi non supervisionati o le etichette in quelli supervisionati.

DELETE /analysis/catalogs/{catalog_id}

Elimina il catalogo. Può essere invocata anche su un catalogo in stato building: la cancellazione interrompe la build.


POST /analysis/catalogs/classify

Classifica uno o più testi rispetto a un catalogo ready e restituisce i candidati top-N con punteggio di similarità.

Attributi richiesta

CampoInTipoObbligatorioDefaultDescrizione
catalog_idbodyintID del catalogo.
textsbodystring[]Testi da classificare.
top_nbodyint (1–10)No3Numero di candidati per testo.
threshold_overridebodyfloat (0.0–1.0)NoSovrascrive la soglia del catalogo per questa chiamata.

Esempio richiesta (cURL)

curl -X POST "https://ai.askme.it/api/v2/analysis/catalogs/classify" \
-H "X-Api-Key: amai_xxxxxxxxxxxxxxxx" \
-H "X-Source-App: api_direct" \
-H "Content-Type: application/json" \
-d '{
"catalog_id": 14,
"texts": ["Quando arriva il mio ordine?", "L'\''articolo che ho ricevuto è difettoso"],
"top_n": 3
}'

Esempio richiesta (Python, httpx)

resp = client.post("/analysis/catalogs/classify", json={
"catalog_id": catalog_id,
"texts": [
"Quando arriva il mio ordine?",
"L'articolo è difettoso, vorrei restituirlo",
],
"top_n": 3,
})
resp.raise_for_status()
for result in resp.json()["results"]:
print(result["text"], "->", result["best_label_path"], result["verdict"])

Esempio risposta

{
"catalog_id": 14,
"catalog_name": "Triage richieste clienti",
"catalog_mode": "supervised",
"refinement_status": "templates_refined",
"total_texts": 2,
"processing_time_seconds": 0.42,
"threshold_used": 0.6,
"top_n": 3,
"results": [
{
"text": "Quando arriva il mio ordine?",
"candidates": [
{ "label_path": ["spedizione"], "similarity": 0.91, "template_id": 22, "template_text": "Vorrei sapere quando arriva il pacco" }
],
"best_label_path": ["spedizione"],
"best_similarity": 0.91,
"verdict": "strong"
}
],
"distribution": { "spedizione": 1, "reso": 1 }
}

verdict è uno di strong, medium, weak, none ed è calcolato sul punteggio del primo candidato e sul delta con il secondo.


GET /analysis/catalogs/queue-status

Stato della coda di build (depth, in-flight, dead-letter).

POST /analysis/catalogs/{catalog_id}/requeue

Rilancia un catalogo in stato failed o cancelled.

POST /analysis/catalogs/{catalog_id}/refine-labels

Affina i nomi dei cluster (solo cataloghi non supervisionati) con un passaggio LLM.

POST /analysis/catalogs/{catalog_id}/refine-templates

Seleziona i template più rappresentativi per ciascun cluster.

PATCH /analysis/catalogs/{catalog_id}/templates/{template_id}

Modifica manualmente testo o label_path di un singolo template.

Body

CampoTipoDescrizione
textstringNuovo testo del template.
label_pathstring[]Nuova etichetta.

DELETE /analysis/catalogs/{catalog_id}/templates/{template_id}

Rimuove un template dal catalogo.


4. Editor PDF

note

Riferimento sintetico derivato dall'inventario delle funzionalità; parametri di dettaglio ed esempi saranno aggiunti in un aggiornamento successivo.

EndpointMetodoDescrizione
/analysis/pdf/editPOSTModifica un PDF esistente secondo istruzioni fornite.
/analysis/pdf/smart-editPOSTModifica guidata da LLM di sezioni specifiche del PDF.
/analysis/pdf/fieldsPOSTEstrazione dei campi compilabili di un modulo PDF.

5. Posizioni CV e prompt

note

Riferimento sintetico derivato dall'inventario delle funzionalità; parametri di dettaglio ed esempi saranno aggiunti in un aggiornamento successivo.

EndpointMetodoDescrizione
/analysis/cv-promptGET, PUTPrompt di default utilizzato da POST /analysis/cv per il tenant.
/analysis/job-positionsGET, POST, PUT, DELETEGestione delle posizioni lavorative usate come riferimento per lo scoring dei CV.

6. Template di analisi

note

Riferimento sintetico derivato dall'inventario delle funzionalità; parametri di dettaglio ed esempi saranno aggiunti in un aggiornamento successivo.

EndpointMetodoDescrizione
/templatesGET, POST, PUT, DELETEGestione dei template di analisi, referenziabili tramite template_id nei body POST /analysis/*.

7. Report

note

Riferimento sintetico derivato dall'inventario delle funzionalità; parametri di dettaglio ed esempi saranno aggiunti in un aggiornamento successivo.

EndpointMetodoDescrizione
/reportsGET, POSTGestione dei report generati a partire dai job di analisi.
/reports/{id}/downloadGETDownload del report generato.

8. Integrazione con Askme Desk

Per integratori Askme Desk

Gli endpoint seguenti supportano l'integrazione tra Askme AI e Askme Desk (creazione richieste, classificazione dei ticket) e sono tipicamente consumati dal workflow del chatbot o dal middleware di integrazione, non da integrazioni dirette del cliente finale. Riferimento sintetico derivato dall'inventario delle funzionalità.

EndpointMetodoDescrizione
/desk/suggestionsPOSTGenera suggerimenti di risposta per un ticket Askme Desk.
/desk/workflow/generatePOSTGenera una proposta di workflow a partire da una descrizione.
/desk/extract-attributesPOSTEstrae attributi strutturati da un ticket.
/desk/classify-triplePOSTClassificazione su tripla categoria/sottocategoria/motivazione.
/desk/classifications/{id}GETDettaglio di una classificazione eseguita.

Pagine correlate