API Prompt dans les extensions Chrome

Publié le 11 novembre 2024

L'API Prompt pour les extensions est désormais disponible en phase d'évaluation de l'origine. Vous pouvez ainsi créer des extensions Chrome qui utilisent Gemini Nano, notre modèle de langage le plus efficace, dans le navigateur.

L'API Prompt présente de nombreux cas d'utilisation avec les extensions Chrome. Voici quelques exemples :

  • Événements d'agenda instantanés Développez une extension Chrome qui extrait automatiquement les détails des événements à partir de pages Web afin que les utilisateurs puissent créer des entrées d'agenda en quelques étapes seulement.
  • Extraction fluide des contacts Créez une extension qui extrait les coordonnées de sites Web pour permettre aux utilisateurs de contacter plus facilement une entreprise ou d'ajouter des informations à leur liste de contacts.
  • Filtrage du contenu dynamique. Créez une extension Chrome qui analyse les articles d'actualité et floute ou masque automatiquement le contenu en fonction de sujets définis par l'utilisateur.

Il ne s'agit là que de quelques exemples, mais nous avons hâte de découvrir vos créations.

Disponibilité

  • Rejoignez la phase d'évaluation de l'API Prompt pour les origines, qui s'exécute dans Chrome 131 à 136, pour créer des extensions avec cette API. Si vous ne connaissez pas les tests d'origine, sachez qu'il s'agit de programmes limités dans le temps, ouverts à tous les développeurs, qui offrent un accès anticipé aux fonctionnalités expérimentales de la plate-forme. Les développeurs peuvent tester, recueillir les commentaires des utilisateurs et itérer en vue d'un futur lancement.
    • Bien que des limites d'utilisation puissent s'appliquer, vous pouvez intégrer ces fonctionnalités pour effectuer des tests en direct et recueillir les commentaires des utilisateurs. L'objectif est d'informer les futures itérations de cette API, car nous nous efforçons de la rendre plus disponible.
  • Rejoignez le programme Preview anticipé pour découvrir en avant-première les nouvelles API d'IA intégrées et participer aux discussions sur notre liste de diffusion.

Participer à l'essai de l'origine

Pour utiliser l'API Prompt dans les extensions Chrome, ajoutez l'autorisation "aiLanguageModelOriginTrial" à votre fichier manifest.json comme indiqué dans l'extrait suivant, ainsi que toute autre autorisation dont votre extension pourrait avoir besoin.

Pour inscrire votre extension à la phase d'évaluation, utilisez l'URL chrome-extension://YOUR_EXTENSION_ID comme origine Web. Exemple : chrome-extension://ljjhjaakmncibonnjpaoglbhcjeolhkk.

S'inscrire à l'essai Chrome Origin

L'ID d'extension est créé de manière dynamique. Toutefois, une fois qu'un ID lui est attribué, vous pouvez le forcer à rester stable en ajoutant la propriété key au fichier manifeste.

Une fois que vous vous êtes inscrit à l'essai d'origine, vous recevez un jeton généré, que vous devez transmettre dans un tableau en tant que valeur du champ trial_tokens dans le fichier manifeste. Consultez l'extrait pour en savoir plus.

{
  "permissions": ["aiLanguageModelOriginTrial"],
  "trial_tokens": ["GENERATED_TOKEN"],
}

Utiliser l'API Prompt

Une fois que vous avez demandé l'autorisation d'utiliser l'API Prompt, vous pouvez créer votre extension. Deux nouvelles fonctions d'extension sont disponibles dans l'espace de noms chrome.aiOriginTrial.languageModel:

  • capabilities() pour vérifier les capacités du modèle et s'il est disponible.
  • create() pour démarrer une session de modèle de langage.

Téléchargement du modèle

L'API Prompt utilise le modèle Gemini Nano dans Chrome. Bien que l'API soit intégrée à Chrome, le modèle est téléchargé séparément la première fois qu'une extension utilise l'API.

Pour déterminer si le modèle est prêt à l'emploi, appelez la fonction chrome.aiOriginTrial.languageModel.capabilities() asynchrone. Elle renvoie un objet AILanguageModelCapabilities avec un champ available pouvant prendre trois valeurs possibles:

  • 'no': le navigateur actuel est compatible avec l'API Prompt, mais il ne peut pas être utilisé pour le moment. Plusieurs raisons peuvent expliquer ce problème, comme un espace disque insuffisant pour télécharger le modèle.
  • 'readily': le navigateur actuel est compatible avec l'API Prompt et peut être utilisé immédiatement.
  • 'after-download': le navigateur actuel est compatible avec l'API Prompt, mais doit d'abord télécharger le modèle.

Pour déclencher le téléchargement du modèle et créer la session du modèle de langage, appelez la fonction chrome.aiOriginTrial.languageModel.create() asynchrone. Si la réponse à capabilities() était 'after-download', il est recommandé d'écouter la progression du téléchargement. Vous pouvez ainsi informer l'utilisateur si le téléchargement prend un certain temps.

const session = await chrome.aiOriginTrial.languageModel.create({
  monitor(m) {
    m.addEventListener("downloadprogress", (e) => {
      console.log(`Downloaded ${e.loaded} of ${e.total} bytes.`);
    });
  },
});

Fonctionnalités du modèle

La fonction capabilities() vous informe également des fonctionnalités du modèle de langage. Outre available, l'objet AILanguageModelCapabilities obtenu comporte également les champs suivants:

  • defaultTopK: valeur par défaut des top-K (par défaut: 3).
  • maxTopK: valeur top-K maximale (8).
  • defaultTemperature: température par défaut (1.0). La température doit être comprise entre 0.0 et 2.0.
await chrome.aiOriginTrial.languageModel.capabilities();
// {available: 'readily', defaultTopK: 3, maxTopK: 8, defaultTemperature: 1}

Créer une session

Une fois que vous vous êtes assuré que l'API Prompt peut s'exécuter, créez une session avec la fonction create(), qui vous permet ensuite d'envoyer une requête au modèle avec les fonctions prompt() ou promptStreaming().

Options de session

Chaque session peut être personnalisée avec topK et temperature à l'aide d'un objet d'options facultatif. Les valeurs par défaut de ces paramètres sont renvoyées par chrome.aiOriginTrial.languageModel.capabilities().

const capabilities = await chrome.aiOriginTrial.languageModel.capabilities();
// Initializing a new session must either specify both `topK` and
// `temperature` or neither of them.
const slightlyHighTemperatureSession = await chrome.aiOriginTrial.languageModel.create({
  temperature: Math.max(capabilities.defaultTemperature * 1.2, 2.0),
  topK: capabilities.defaultTopK,
});

L'objet d'options facultatif de la fonction create() prend également un champ signal, qui vous permet de transmettre un AbortSignal pour détruire la session.

const controller = new AbortController();
stopButton.onclick = () => controller.abort();

const session = await chrome.aiOriginTrial.languageModel.create({
  signal: controller.signal,
})
Requêtes système

Les requêtes système vous permettent de fournir un contexte au modèle de langage.

const session = await chrome.aiOriginTrial.languageModel.create({
  systemPrompt: 'You are a helpful and friendly assistant.',
});
await session.prompt('What is the capital of Italy?');
// 'The capital of Italy is Rome.'

Requêtes initiales

Avec les invites initiales, vous pouvez fournir au modèle de langage du contexte sur les interactions précédentes, par exemple pour permettre à l'utilisateur de reprendre une session stockée après le redémarrage du navigateur.

const session = await chrome.aiOriginTrial.languageModel.create({
  initialPrompts: [
    { role: 'system', content: 'You are a helpful and friendly assistant.' },
    { role: 'user', content: 'What is the capital of Italy?' },
    { role: 'assistant', content: 'The capital of Italy is Rome.'},
    { role: 'user', content: 'What language is spoken there?' },
    { role: 'assistant', content: 'The official language of Italy is Italian. [...]' }
  ]
});

Informations concernant la session

Une session de modèle de langage donnée a un nombre maximal de jetons qu'elle peut traiter. Vous pouvez vérifier l'utilisation et la progression vers cette limite en utilisant les propriétés suivantes sur l'objet de session:

console.log(`${session.tokensSoFar}/${session.maxTokens}
(${session.tokensLeft} left)`);

Persistance de session

Chaque session suit le contexte de la conversation. Les interactions précédentes sont prises en compte pour les interactions futures jusqu'à ce que la fenêtre de contexte de la session soit pleine.

const session = await chrome.aiOriginTrial.languageModel.create({
  systemPrompt: 'You are a friendly, helpful assistant specialized in clothing choices.'
});

const result1 = await session.prompt(
  'What should I wear today? It is sunny and I am unsure between a t-shirt and a polo.'
);
console.log(result1);

const result2 = await session.prompt(
  'That sounds great, but oh no, it is actually going to rain! New advice?'
);
console.log(result2);

Cloner une session

Pour préserver les ressources, vous pouvez cloner une session existante à l'aide de la fonction clone(). Le contexte de la conversation est réinitialisé, mais l'invite initiale ou les invites système restent intactes. La fonction clone() utilise un objet d'options facultatif avec un champ signal, qui vous permet de transmettre un AbortSignal pour détruire la session clonée.

const controller = new AbortController();
stopButton.onclick = () => controller.abort();

const clonedSession = await session.clone({
  signal: controller.signal,
});

Interroger le modèle

Vous pouvez envoyer une requête au modèle avec les fonctions prompt() ou promptStreaming().

Sortie hors flux

Si vous attendez un résultat court, vous pouvez utiliser la fonction prompt(), qui renvoie la réponse une fois qu'elle est disponible.

// Start by checking if it's possible to create a session based on the
// availability of the model, and the characteristics of the device.
const {available, defaultTemperature, defaultTopK, maxTopK } =
  await chrome.aiOriginTrial.languageModel.capabilities();

if (available !== 'no') {
  const session = await chrome.aiOriginTrial.languageModel.create();

  // Prompt the model and wait for the whole result to come back.
  const result = await session.prompt('Write me a poem!');
  console.log(result);
}

Sortie en flux continu

Si vous attendez une réponse plus longue, vous devez utiliser la fonction promptStreaming(), qui vous permet d'afficher des résultats partiels à mesure qu'ils proviennent du modèle.

const {available, defaultTemperature, defaultTopK, maxTopK } =
  await chrome.aiOriginTrial.languageModel.capabilities();

if (available !== 'no') {
  const session = await chrome.aiOriginTrial.languageModel.create();

  // Prompt the model and stream the result:
  const stream = session.promptStreaming('Write me an extra-long poem!');
  for await (const chunk of stream) {
    console.log(chunk);
  }
}

promptStreaming() renvoie un ReadableStream dont les segments se construisent successivement les uns sur les autres. Par exemple, "Hello,", "Hello world,", "Hello world I am,", "Hello world I am an AI.". Ce comportement n'est pas intentionnel. Nous avons l'intention de nous aligner sur les autres API de streaming de la plate-forme, où les fragments sont des parties successives d'un même long flux. Cela signifie que la sortie sera une séquence comme "Hello", " world", " I am", " an AI".

Pour l'instant, vous pouvez implémenter les éléments suivants pour obtenir le comportement souhaité. Cela fonctionne avec le comportement standard et non standard.

let result = '';
let previousChunk = '';

for await (const chunk of stream) {
  const newChunk = chunk.startsWith(previousChunk)
      ? chunk.slice(previousChunk.length) : chunk;
  console.log(newChunk);
  result += newChunk;
  previousChunk = chunk;
}
console.log(result);

Arrêter l'exécution d'une requête

prompt() et promptStreaming() acceptent un deuxième paramètre facultatif avec un champ signal, qui vous permet d'arrêter l'exécution des invites.

const controller = new AbortController();
stopButton.onclick = () => controller.abort();

const result = await session.prompt(
  'Write me a poem!',
  { signal: controller.signal }
);

Arrêter une session

Appelez destroy() pour libérer des ressources si vous n'avez plus besoin d'une session. Lorsqu'une session est détruite, elle ne peut plus être utilisée et toute exécution en cours est interrompue. Vous pouvez conserver la session si vous avez l'intention d'interroger le modèle souvent, car la création d'une session peut prendre un certain temps.

await session.prompt(
  'You are a friendly, helpful assistant specialized in clothing choices.'
);

session.destroy();

// The promise is rejected with an error explaining that
// the session is destroyed.
await session.prompt(
  'What should I wear today? It is sunny and I am unsure
  between a t-shirt and a polo.'
);

Démo

Pour tester l'API Prompt dans les extensions Chrome, installez l'extension de démonstration. Le code source de l'extension est disponible sur GitHub.

Interface de démonstration de l'API Prompt

Participer et partager des commentaires

Commencez à tester l'API Prompt dès maintenant dans vos extensions Chrome en participant à l'essai d'origine et en nous faisant part de vos commentaires. Vos réponses peuvent avoir un impact direct sur la création et la mise en œuvre des futures versions de cette API et de toutes les API d'IA intégrées.