Commencer
Installation
Section titled “Installation”npm install @capgo/capacitor-llmnpx cap syncyarn add @capgo/capacitor-llmnpx cap syncpnpm add @capgo/capacitor-llmnpx cap syncbun add @capgo/capacitor-llmnpx cap syncConfiguration de la plateforme
Section titled “Configuration de la plateforme”Configuration iOS
Section titled “Configuration iOS”- iOS 26.0+ : Utilise Apple Intelligence par défaut (aucun modèle nécessaire) - Recommandé
- iOS < 26.0 : Nécessite des modèles personnalisés MediaPipe (expérimental, peut avoir des problèmes de compatibilité)
Pour les modèles personnalisés sur les anciennes versions iOS, placez les fichiers de modèle dans votre bundle d’application iOS via “Copy Bundle Resources” de Xcode.
Configuration Android
Section titled “Configuration Android”Placez les fichiers de modèle dans votre dossier assets Android :
android/app/src/main/assets/Vous avez besoin des deux fichiers pour Android :
- Fichier
.task(modèle principal) - Fichier
.litertlm(fichier compagnon)
Téléchargez depuis Kaggle Gemma models → onglet “LiteRT (formerly TFLite)“
Modèles recommandés
Section titled “Modèles recommandés”Pour Android (Modèles Gemma-3)
Section titled “Pour Android (Modèles Gemma-3)”- Gemma 3 270M - Le plus petit, le plus efficace pour mobile (~240-400MB) - Recommandé
- Gemma 3 1B - Modèle de génération de texte plus grand (~892MB-1.5GB)
Téléchargez depuis Kaggle Gemma models → Cliquez sur l’onglet “LiteRT (formerly TFLite)“
Pour iOS
Section titled “Pour iOS”- Apple Intelligence (iOS 26.0+) - Intégré, aucun téléchargement nécessaire - Recommandé
- Gemma-2 2B (expérimental) - Peut avoir des problèmes de compatibilité avec le format
.task
Pour les modèles iOS personnalisés, téléchargez depuis Hugging Face MediaPipe models
Utilisation
Section titled “Utilisation”Importez le plugin et initialisez :
import { CapgoLLM } from '@capgo/capacitor-llm';import { Capacitor } from '@capacitor/core';
// Vérifier si LLM est prêtconst { readiness } = await CapgoLLM.getReadiness();console.log('Disponibilité LLM:', readiness);
// Définir le modèle selon la plateformeconst platform = Capacitor.getPlatform();if (platform === 'ios') { // iOS : Utiliser Apple Intelligence (par défaut) await CapgoLLM.setModel({ path: 'Apple Intelligence' });} else { // Android : Utiliser le modèle MediaPipe await CapgoLLM.setModel({ path: '/android_asset/gemma-3-270m-it-int8.task' });}
// Créer une session de chatconst { id: chatId } = await CapgoLLM.createChat();
// Écouter les réponses de l'IACapgoLLM.addListener('textFromAi', (event) => { console.log('Réponse de l\'IA:', event.text);});
// Écouter la complétionCapgoLLM.addListener('aiFinished', (event) => { console.log('L\'IA a terminé sa réponse');});
// Envoyer un messageawait CapgoLLM.sendMessage({ chatId, message: 'Bonjour ! Comment vas-tu aujourd\'hui ?'});Fonctionnalités avancées
Section titled “Fonctionnalités avancées”Télécharger des modèles
Section titled “Télécharger des modèles”// Télécharger un modèle depuis une URLawait CapgoLLM.downloadModel({ url: 'https://example.com/model.task', filename: 'model.task'});
// Pour Android, télécharger les deux fichiers .task et .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'});
// Écouter la progression du téléchargementCapgoLLM.addListener('downloadProgress', (event) => { console.log(`Progression du téléchargement : ${event.progress}%`); console.log(`Téléchargé : ${event.downloadedBytes} / ${event.totalBytes}`);});Gestion des modèles
Section titled “Gestion des modèles”// Définir un modèle spécifique avec configurationawait CapgoLLM.setModel({ path: '/android_asset/gemma-3-270m-it-int8.task', maxTokens: 2048, topk: 40, temperature: 0.8});
// Vérifier la disponibilitéconst { readiness } = await CapgoLLM.getReadiness();if (readiness === 'ready') { // Le modèle est chargé et prêt}
// Écouter les changements de disponibilitéCapgoLLM.addListener('readinessChange', (event) => { console.log('Disponibilité changée:', event.readiness);});Méthodes API
Section titled “Méthodes API”createChat()
Section titled “createChat()”Créer une nouvelle session de chat.
const { id: chatId } = await CapgoLLM.createChat();Retourne : Promise<{ id: string; instructions?: string }>
sendMessage(…)
Section titled “sendMessage(…)”Envoyer un message au LLM.
await CapgoLLM.sendMessage({ chatId: 'chat-id', message: 'Quel temps fait-il ?'});| Param | Type | Description |
|---|---|---|
chatId | string | ID de session de chat |
message | string | Message à envoyer |
getReadiness()
Section titled “getReadiness()”Vérifier si le LLM est prêt à être utilisé.
const { readiness } = await CapgoLLM.getReadiness();Retourne : Promise<{ readiness: string }>
Valeurs possibles :
ready- Le modèle est chargé et prêtloading- Le modèle est en cours de chargementnot_ready- Le modèle n’est pas encore chargéerror- Erreur lors du chargement du modèle
setModel(…)
Section titled “setModel(…)”Définir la configuration du modèle.
// iOS : Utiliser Apple Intelligence (recommandé)await CapgoLLM.setModel({ path: 'Apple Intelligence'});
// iOS : Utiliser un modèle MediaPipe personnalisé (expérimental)await CapgoLLM.setModel({ path: 'Gemma2-2B-IT_multi-prefill-seq_q8_ekv1280', modelType: 'task', maxTokens: 1280});
// Android : Utiliser le modèle MediaPipeawait CapgoLLM.setModel({ path: '/android_asset/gemma-3-270m-it-int8.task', maxTokens: 2048, topk: 40, temperature: 0.8});| Param | Type | Description |
|---|---|---|
path | string | Chemin du modèle ou “Apple Intelligence” pour le système iOS |
modelType | string | Optionnel : Type de fichier de modèle (par ex., “task”, “bin”) |
maxTokens | number | Optionnel : Nombre maximum de tokens gérés par le modèle |
topk | number | Optionnel : Nombre de tokens considérés à chaque étape |
temperature | number | Optionnel : Aléatoire dans la génération (0.0-1.0) |
randomSeed | number | Optionnel : Graine aléatoire pour la génération |
downloadModel(…)
Section titled “downloadModel(…)”Télécharger un modèle depuis une URL et enregistrer dans le stockage de l’appareil.
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 de téléchargement |
companionUrl | string | Optionnel : URL pour le fichier compagnon (.litertlm) |
filename | string | Optionnel : Nom de fichier pour enregistrer |
Retourne : Promise<{ path: string; companionPath?: string }>
Événements
Section titled “Événements”textFromAi
Section titled “textFromAi”Déclenché lorsque l’IA génère du texte (réponse en streaming).
CapgoLLM.addListener('textFromAi', (event) => { console.log('Texte de l\'IA:', event.text); console.log('ID de chat:', event.chatId); console.log('Est un chunk:', event.isChunk);});Données d’événement :
text(string) - Fragment de texte incrémental de l’IAchatId(string) - ID de session de chatisChunk(boolean) - Si c’est un chunk complet ou des données de streaming partiel
aiFinished
Section titled “aiFinished”Déclenché lorsque l’IA termine sa réponse.
CapgoLLM.addListener('aiFinished', (event) => { console.log('Terminé pour le chat:', event.chatId);});Données d’événement :
chatId(string) - ID de session de chat
downloadProgress
Section titled “downloadProgress”Déclenché pendant le téléchargement du modèle pour signaler la progression.
CapgoLLM.addListener('downloadProgress', (event) => { console.log('Progression:', event.progress, '%'); console.log('Téléchargé:', event.downloadedBytes, '/', event.totalBytes);});Données d’événement :
progress(number) - Pourcentage du téléchargement terminé (0-100)downloadedBytes(number) - Octets téléchargés jusqu’à présenttotalBytes(number) - Total d’octets à télécharger
readinessChange
Section titled “readinessChange”Déclenché lorsque le statut de disponibilité du LLM change.
CapgoLLM.addListener('readinessChange', (event) => { console.log('Disponibilité changée en:', event.readiness);});Données d’événement :
readiness(string) - Le nouveau statut de disponibilité
Exemple complet
Section titled “Exemple complet”import { CapgoLLM } from '@capgo/capacitor-llm';import { Capacitor } from '@capacitor/core';
class AIService { private chatId: string | null = null; private messageBuffer: string = '';
async initialize() { // Configurer le modèle selon la plateforme const platform = Capacitor.getPlatform();
if (platform === 'ios') { // iOS : Utiliser Apple Intelligence (recommandé) await CapgoLLM.setModel({ path: 'Apple Intelligence' }); } else { // Android : Utiliser le modèle MediaPipe await CapgoLLM.setModel({ path: '/android_asset/gemma-3-270m-it-int8.task', maxTokens: 2048, topk: 40, temperature: 0.8 }); }
// Attendre que le modèle soit prêt let isReady = false; while (!isReady) { const { readiness } = await CapgoLLM.getReadiness(); if (readiness === 'ready') { isReady = true; } else if (readiness === 'error') { throw new Error('Échec du chargement du modèle'); } await new Promise(resolve => setTimeout(resolve, 500)); }
// Créer une session de chat const { id } = await CapgoLLM.createChat(); this.chatId = id;
// Configurer les écouteurs d'événements 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 initialisé'); }
await CapgoLLM.sendMessage({ chatId: this.chatId, message }); }
onTextReceived(text: string) { // Mettre à jour l'interface avec le texte en streaming console.log('Reçu:', text); }
onMessageComplete(fullMessage: string) { // Gérer le message complet console.log('Message complet:', fullMessage); }}
// Utilisationconst ai = new AIService();await ai.initialize();await ai.sendMessage('Parle-moi de l\'IA');Support des plateformes
Section titled “Support des plateformes”| Plateforme | Pris en charge | Exigences |
|---|---|---|
| iOS | ✅ | iOS 13.0+ (26.0+ pour Apple Intelligence) |
| Android | ✅ | API 24+ |
| Web | ❌ | Non pris en charge |
Bonnes pratiques
Section titled “Bonnes pratiques”-
Sélection du modèle : Choisissez les modèles en fonction des capacités de l’appareil
- Utilisez 270M pour la plupart des appareils mobiles
- Utilisez 1B pour les appareils haut de gamme avec plus de RAM
- Testez les performances sur les appareils cibles
-
Gestion de la mémoire : Effacez les sessions de chat lorsque c’est terminé
// Créer un nouveau chat pour de nouvelles conversationsconst { id } = await CapacitorLLM.createChat(); -
Gestion des erreurs : Vérifiez toujours la disponibilité avant utilisation
const { readiness } = await CapacitorLLM.getReadiness();if (readiness !== 'ready') {// Gérer l'état non prêt} -
Interface de streaming : Mettez à jour l’interface de manière incrémentale avec le texte en streaming
- Affichez le texte au fur et à mesure qu’il arrive via
onAiText - Marquez comme complet avec
onAiCompletion
- Affichez le texte au fur et à mesure qu’il arrive via
-
Téléchargement du modèle : Téléchargez les modèles lors de la configuration de l’application, pas lors de la première utilisation
// Pendant l'initialisation de l'applicationawait CapacitorLLM.downloadModel({url: 'https://your-cdn.com/model.task',filename: 'model.task'});
Dépannage
Section titled “Dépannage”Le modèle ne se charge pas
Section titled “Le modèle ne se charge pas”- Vérifiez que le fichier de modèle est au bon emplacement
- Vérifiez que le format du modèle correspond à la plateforme (.gguf pour iOS, .task pour Android)
- Assurez-vous d’un stockage suffisant sur l’appareil
Mauvaises performances
Section titled “Mauvaises performances”- Essayez un modèle plus petit (270M au lieu de 1B)
- Fermez les autres applications pour libérer de la mémoire
- Testez sur un appareil réel, pas un simulateur
Aucune réponse
Section titled “Aucune réponse”- Vérifiez que le statut de disponibilité est ‘ready’
- Vérifiez que les écouteurs d’événements sont configurés avant d’envoyer des messages
- Vérifiez la console pour les erreurs