Per Iniziare
Copy a setup prompt with the install steps and the full markdown guide for this plugin.
Set up this Capacitor plugin in the project.
Use the package manager already used by the project.
Install these package(s): `@capgo/capacitor-llm`
Run the required Capacitor sync/update step after installation.
Read this markdown guide for the full setup steps: https://raw.githubusercontent.com/Cap-go/website/refs/heads/main/apps/docs/src/content/docs/it/docs/plugins/llm/getting-started.mdx
Use that guide for platform-specific steps, native file edits, permissions, config changes, imports, and usage setup.
If that guide references other docs pages, read them too.
Installazione
Section titled “Installazione”npm install @capgo/capacitor-llmnpx cap syncyarn add @capgo/capacitor-llmnpx cap syncpnpm add @capgo/capacitor-llmnpx cap syncbun add @capgo/capacitor-llmnpx cap syncConfigurazione Piattaforma
Section titled “Configurazione Piattaforma”Configurazione iOS
Section titled “Configurazione iOS”- iOS 26.0+: Usa Apple Intelligence per impostazione predefinita (nessun modello necessario) - Raccomandato
- iOS < 26.0: Richiede modelli personalizzati MediaPipe (sperimentale, potrebbe avere problemi di compatibilità)
Per modelli personalizzati su versioni iOS più vecchie, posiziona i file del modello nel bundle della tua app iOS tramite “Copy Bundle Resources” di Xcode.
Configurazione Android
Section titled “Configurazione Android”Posiziona i file del modello nella cartella assets Android:
android/app/src/main/assets/Hai bisogno di entrambi i file per Android:
- File
.task(modello principale) - File
.litertlm(file companion)
Scarica da Kaggle Gemma models → scheda “LiteRT (formerly TFLite)“
Modelli Raccomandati
Section titled “Modelli Raccomandati”Per Android (Modelli Gemma-3)
Section titled “Per Android (Modelli Gemma-3)”- Gemma 3 270M - Il più piccolo, più efficiente per mobile (~240-400MB) - Raccomandato
- Gemma 3 1B - Modello di generazione testo più grande (~892MB-1.5GB)
Scarica da Kaggle Gemma models → Clicca scheda “LiteRT (formerly TFLite)“
Per iOS
Section titled “Per iOS”- Apple Intelligence (iOS 26.0+) - Integrato, nessun download necessario - Raccomandato
- Gemma-2 2B (sperimentale) - Potrebbe avere problemi di compatibilità con formato
.task
Per modelli iOS personalizzati, scarica da Hugging Face MediaPipe models
Utilizzo
Section titled “Utilizzo”Importa il plugin e inizializza:
import { CapgoLLM } from '@capgo/capacitor-llm';import { Capacitor } from '@capacitor/core';
// Controlla se LLM è prontoconst { readiness } = await CapgoLLM.getReadiness();console.log('Prontezza LLM:', readiness);
// Imposta il modello in base alla piattaformaconst platform = Capacitor.getPlatform();if (platform === 'ios') { // iOS: Usa Apple Intelligence (predefinito) await CapgoLLM.setModel({ path: 'Apple Intelligence' });} else { // Android: Usa modello MediaPipe await CapgoLLM.setModel({ path: '/android_asset/gemma-3-270m-it-int8.task' });}
// Crea una sessione chatconst { id: chatId } = await CapgoLLM.createChat();
// Ascolta risposte AICapgoLLM.addListener('textFromAi', (event) => { console.log('Risposta AI:', event.text);});
// Ascolta completamentoCapgoLLM.addListener('aiFinished', (event) => { console.log('AI ha completato la risposta');});
// Invia un messaggioawait CapgoLLM.sendMessage({ chatId, message: 'Ciao! Come stai oggi?'});Funzionalità Avanzate
Section titled “Funzionalità Avanzate”Scarica Modelli
Section titled “Scarica Modelli”// Scarica un modello da URLawait CapgoLLM.downloadModel({ url: 'https://example.com/model.task', filename: 'model.task'});
// Per Android, scarica sia file .task che .litertlmawait CapgoLLM.downloadModel({ url: 'https://example.com/gemma-3-270m-it-int8.task', companionUrl: 'https://example.com/gemma-3-270m-it-int8.litertlm', filename: 'gemma-3-270m-it-int8.task'});
// Ascolta progresso downloadCapgoLLM.addListener('downloadProgress', (event) => { console.log(`Progresso download: ${event.progress}%`); console.log(`Scaricati: ${event.downloadedBytes} / ${event.totalBytes}`);});Gestione Modelli
Section titled “Gestione Modelli”// Imposta un modello specifico con configurazioneawait CapgoLLM.setModel({ path: '/android_asset/gemma-3-270m-it-int8.task', maxTokens: 2048, topk: 40, temperature: 0.8});
// Controlla prontezzaconst { readiness } = await CapgoLLM.getReadiness();if (readiness === 'ready') { // Il modello è caricato e pronto}
// Ascolta cambiamenti di prontezzaCapgoLLM.addListener('readinessChange', (event) => { console.log('Prontezza cambiata:', event.readiness);});Metodi API
Section titled “Metodi API”createChat()
Section titled “createChat()”Crea una nuova sessione chat.
const { id: chatId } = await CapgoLLM.createChat();Ritorna: Promise<{ id: string; instructions?: string }>
sendMessage(…)
Section titled “sendMessage(…)”Invia un messaggio all’LLM.
await CapgoLLM.sendMessage({ chatId: 'chat-id', message: 'Com\'è il tempo?'});| Param | Type | Description |
|---|---|---|
chatId | string | ID sessione chat |
message | string | Messaggio da inviare |
getReadiness()
Section titled “getReadiness()”Controlla se l’LLM è pronto all’uso.
const { readiness } = await CapgoLLM.getReadiness();Ritorna: Promise<{ readiness: string }>
Valori possibili:
ready- Il modello è caricato e prontoloading- Il modello sta caricandonot_ready- Modello non ancora caricatoerror- Errore nel caricamento del modello
setModel(…)
Section titled “setModel(…)”Imposta la configurazione del modello.
// iOS: Usa Apple Intelligence (raccomandato)await CapgoLLM.setModel({ path: 'Apple Intelligence'});
// iOS: Usa modello MediaPipe personalizzato (sperimentale)await CapgoLLM.setModel({ path: 'Gemma2-2B-IT_multi-prefill-seq_q8_ekv1280', modelType: 'task', maxTokens: 1280});
// Android: Usa modello MediaPipeawait CapgoLLM.setModel({ path: '/android_asset/gemma-3-270m-it-int8.task', maxTokens: 2048, topk: 40, temperature: 0.8});| Param | Type | Description |
|---|---|---|
path | string | Percorso modello o “Apple Intelligence” per sistema iOS |
modelType | string | Opzionale: Tipo file modello (es. “task”, “bin”) |
maxTokens | number | Opzionale: Token massimi gestiti dal modello |
topk | number | Opzionale: Numero di token considerati ad ogni passo |
temperature | number | Opzionale: Casualità nella generazione (0.0-1.0) |
randomSeed | number | Opzionale: Seed casuale per generazione |
downloadModel(…)
Section titled “downloadModel(…)”Scarica un modello da URL e salva nella memoria del dispositivo.
await CapgoLLM.downloadModel({ url: 'https://example.com/gemma-3-270m-it-int8.task', companionUrl: 'https://example.com/gemma-3-270m-it-int8.litertlm', filename: 'gemma-3-270m-it-int8.task'});| Param | Type | Description |
|---|---|---|
url | string | URL da cui scaricare |
companionUrl | string | Opzionale: URL per file companion (.litertlm) |
filename | string | Opzionale: Nome file con cui salvare |
Ritorna: Promise<{ path: string; companionPath?: string }>
Eventi
Section titled “Eventi”textFromAi
Section titled “textFromAi”Attivato quando AI genera testo (risposta streaming).
CapgoLLM.addListener('textFromAi', (event) => { console.log('Testo AI:', event.text); console.log('ID Chat:', event.chatId); console.log('È chunk:', event.isChunk);});Dati Evento:
text(string) - Chunk di testo incrementale da AIchatId(string) - ID sessione chatisChunk(boolean) - Se questo è un chunk completo o dati streaming parziali
aiFinished
Section titled “aiFinished”Attivato quando AI completa la risposta.
CapgoLLM.addListener('aiFinished', (event) => { console.log('Completato per chat:', event.chatId);});Dati Evento:
chatId(string) - ID sessione chat
downloadProgress
Section titled “downloadProgress”Attivato durante il download del modello per riportare il progresso.
CapgoLLM.addListener('downloadProgress', (event) => { console.log('Progresso:', event.progress, '%'); console.log('Scaricati:', event.downloadedBytes, '/', event.totalBytes);});Dati Evento:
progress(number) - Percentuale di download completata (0-100)downloadedBytes(number) - Byte scaricati finoratotalBytes(number) - Byte totali da scaricare
readinessChange
Section titled “readinessChange”Attivato quando lo stato di prontezza dell’LLM cambia.
CapgoLLM.addListener('readinessChange', (event) => { console.log('Prontezza cambiata a:', event.readiness);});Dati Evento:
readiness(string) - Il nuovo stato di prontezza
Esempio Completo
Section titled “Esempio Completo”import { CapgoLLM } from '@capgo/capacitor-llm';import { Capacitor } from '@capacitor/core';
class AIService { private chatId: string | null = null; private messageBuffer: string = '';
async initialize() { // Configura modello in base alla piattaforma const platform = Capacitor.getPlatform();
if (platform === 'ios') { // iOS: Usa Apple Intelligence (raccomandato) await CapgoLLM.setModel({ path: 'Apple Intelligence' }); } else { // Android: Usa modello MediaPipe await CapgoLLM.setModel({ path: '/android_asset/gemma-3-270m-it-int8.task', maxTokens: 2048, topk: 40, temperature: 0.8 }); }
// Attendi che il modello sia pronto let isReady = false; while (!isReady) { const { readiness } = await CapgoLLM.getReadiness(); if (readiness === 'ready') { isReady = true; } else if (readiness === 'error') { throw new Error('Impossibile caricare il modello'); } await new Promise(resolve => setTimeout(resolve, 500)); }
// Crea sessione chat const { id } = await CapgoLLM.createChat(); this.chatId = id;
// Configura listener di eventi this.setupListeners(); }
private setupListeners() { CapgoLLM.addListener('textFromAi', (event) => { if (event.chatId === this.chatId) { this.messageBuffer += event.text; this.onTextReceived(event.text); } });
CapgoLLM.addListener('aiFinished', (event) => { if (event.chatId === this.chatId) { this.onMessageComplete(this.messageBuffer); this.messageBuffer = ''; } }); }
async sendMessage(message: string) { if (!this.chatId) { throw new Error('Chat non inizializzata'); }
await CapgoLLM.sendMessage({ chatId: this.chatId, message }); }
onTextReceived(text: string) { // Aggiorna UI con testo streaming console.log('Ricevuto:', text); }
onMessageComplete(fullMessage: string) { // Gestisci messaggio completo console.log('Messaggio completo:', fullMessage); }}
// Utilizzoconst ai = new AIService();await ai.initialize();await ai.sendMessage('Parlami di AI');Supporto Piattaforma
Section titled “Supporto Piattaforma”| Piattaforma | Supportato | Requisiti |
|---|---|---|
| iOS | ✅ | iOS 13.0+ (26.0+ per Apple Intelligence) |
| Android | ✅ | API 24+ |
| Web | ❌ | Non supportato |
Migliori Pratiche
Section titled “Migliori Pratiche”-
Selezione Modello: Scegli modelli basati sulle capacità del dispositivo
- Usa 270M per la maggior parte dei dispositivi mobile
- Usa 1B per dispositivi di fascia alta con più RAM
- Testa prestazioni sui dispositivi target
-
Gestione Memoria: Cancella sessioni chat quando hai finito
// Crea nuova chat per nuove conversazioniconst { id } = await CapacitorLLM.createChat(); -
Gestione Errori: Controlla sempre la prontezza prima dell’uso
const { readiness } = await CapacitorLLM.getReadiness();if (readiness !== 'ready') {// Gestisci stato non pronto} -
UI Streaming: Aggiorna UI incrementalmente con testo streaming
- Mostra testo man mano che arriva tramite
onAiText - Segna come completo con
onAiCompletion
- Mostra testo man mano che arriva tramite
-
Download Modello: Scarica modelli durante la configurazione dell’app, non al primo utilizzo
// Durante l'inizializzazione dell'appawait CapacitorLLM.downloadModel({url: 'https://your-cdn.com/model.task',filename: 'model.task'});
Risoluzione dei Problemi
Section titled “Risoluzione dei Problemi”Modello non carica
Section titled “Modello non carica”- Verifica che il file del modello sia nella posizione corretta
- Controlla che il formato del modello corrisponda alla piattaforma (.gguf per iOS, .task per Android)
- Assicurati di avere sufficiente spazio di archiviazione sul dispositivo
Prestazioni scarse
Section titled “Prestazioni scarse”- Prova modello più piccolo (270M invece di 1B)
- Chiudi altre app per liberare memoria
- Testa su dispositivo reale, non simulatore
Nessuna risposta
Section titled “Nessuna risposta”- Controlla che lo stato di prontezza sia ‘ready’
- Verifica che i listener di eventi siano configurati prima di inviare messaggi
- Controlla la console per errori