L'API Prompt nelle estensioni di Chrome

Data di pubblicazione: 11 novembre 2024

L'API Prompt per le estensioni è ora disponibile in una prova dell'origine, quindi puoi creare estensioni di Chrome che utilizzano Gemini Nano, il nostro modello linguistico più efficiente, nel browser.

Esistono molti casi d'uso per l'API Prompt con le estensioni di Chrome. Ecco alcuni esempi:

  • Eventi di calendario istantanei. Sviluppare un'estensione di Chrome che estragga automaticamente i dettagli degli eventi dalle pagine web, in modo che gli utenti possano creare voci di calendario in pochi passaggi.
  • Estrazione dei contatti senza problemi. Crea un'estensione che estrae i dati di contatto dai siti web, consentendo agli utenti di contattare più facilmente un'attività o aggiungere dettagli al loro elenco di contatti.
  • Filtro dei contenuti dinamici. Crea un'estensione per Chrome che analizza gli articoli di notizie e sfoca o nasconde automaticamente i contenuti in base a argomenti definiti dall'utente.

Queste sono solo alcune possibilità, ma non vediamo l'ora di scoprire cosa creerai.

Disponibilità

  • Partecipa alla prova dell'origine dell'API Prompt, eseguita in Chrome 131-136, per creare estensioni con questa API. Se non hai mai provato le prove dell'origine, si tratta di programmi a tempo limitato aperti a tutti gli sviluppatori che offrono l'accesso in anteprima alle funzionalità sperimentali della piattaforma. Gli sviluppatori possono testare, raccogliere feedback degli utenti e eseguire l'iterazione in vista di un lancio futuro.
    • Sebbene possano esserci limiti di utilizzo, puoi integrare queste funzionalità per i test in tempo reale e raccogliere il feedback degli utenti. L'obiettivo è fornire informazioni sulle future versioni di questa API, man mano che lavoriamo per una maggiore disponibilità.
  • Partecipa al programma di anteprima per dare un'occhiata in anteprima alle nuove API di IA integrate e per accedere alla discussione sulla nostra mailing list.

Partecipare alla prova dell'origine

Per utilizzare l'API Prompt nelle estensioni di Chrome, aggiungi l'autorizzazione "aiLanguageModelOriginTrial" al file manifest.json come indicato nel seguente estratto, insieme a eventuali altre autorizzazioni necessarie per l'estensione.

Per registrare l'estensione per la prova dell'origine, utilizza l'URLchrome-extension://YOUR_EXTENSION_ID come Origine web. Ad esempio, chrome-extension://ljjhjaakmncibonnjpaoglbhcjeolhkk.

Registrazione alla versione di prova di Chrome Origin

L'ID dell'estensione viene creato in modo dinamico. Una volta assegnato, puoi forzare l'ID a rimanere stabile aggiungendo la proprietà key al manifest.

Dopo aver effettuato la registrazione per la prova originale, ricevi un token generato, che devi passare in un array come valore del campo trial_tokens nel file manifest.

{
  "manifest_version": 3,
  "name": "YOUR_EXTENSION_NAME",
  "permissions": ["aiLanguageModelOriginTrial"],
  "trial_tokens": ["GENERATED_TOKEN"],
}

Aggiungere il supporto a localhost

Per accedere all'API Prompt su localhost durante la prova dell'origine, devi aggiornare Chrome all'ultima versione. A tale scopo, procedi nel seguente modo:

  1. Apri Chrome su una di queste piattaforme: Windows, Mac o Linux.
  2. Vai a chrome://flags/#optimization-guide-on-device-model.
  3. Seleziona BypassPerfRequirement abilitato.
    • In questo modo vengono ignorati i controlli delle prestazioni che potrebbero impedirti di scaricare Gemini Nano sul tuo dispositivo.
  4. Fai clic su Riavvia o riavvia Chrome.

Utilizzare l'API Prompt

Dopo aver richiesto l'autorizzazione per utilizzare l'API Prompt, puoi creare l'estensione. Nello spazio dei nomi chrome.aiOriginTrial.languageModel sono disponibili due nuove funzioni di estensione:

  • capabilities() per verificare le funzionalità del modello e se è disponibile.
  • create() per avviare una sessione del modello linguistico.

Download del modello

L'API Prompt utilizza il modello Gemini Nano in Chrome. Sebbene l'API sia integrata in Chrome, il modello viene scaricato separatamente la prima volta che un'estensione utilizza l'API.

Per determinare se il modello è pronto per l'uso, chiama la funzione asincrona chrome.aiOriginTrial.languageModel.capabilities(). Restituisce un oggetto AILanguageModelCapabilities con un campo available che può assumere tre possibili valori:

  • 'no': il browser corrente supporta l'API Prompt, ma al momento non può essere utilizzato. Ciò potrebbe essere dovuto a una serie di motivi, ad esempio a uno spazio su disco insufficiente per scaricare il modello.
  • 'readily': il browser corrente supporta l'API Prompt e può essere utilizzato subito.
  • 'after-download': il browser corrente supporta l'API Prompt, ma deve prima scaricare il modello.

Per attivare il download del modello e creare la sessione del modello linguistico, chiama la funzione chrome.aiOriginTrial.languageModel.create() asincrona. Se la risposta a capabilities() è 'after-download', è buona prassi monitorare l'avanzamento del download. In questo modo, puoi informare l'utente nel caso in cui il download richieda del tempo.

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

Funzionalità del modello

La funzione capabilities() ti informa anche sulle funzionalità del modello linguistico. Oltre a available, l'oggetto AILanguageModelCapabilities risultante contiene anche i seguenti campi:

  • defaultTopK: il valore predefinito top-K (predefinito: 3).
  • maxTopK: il valore top-K massimo (8).
  • defaultTemperature: la temperatura predefinita (1.0). La temperatura deve essere compresa tra 0.0 e 2.0.
await chrome.aiOriginTrial.languageModel.capabilities();
// {available: 'readily', defaultTopK: 3, maxTopK: 8, defaultTemperature: 1}

Creare una sessione

Dopo aver verificato che l'API Prompt può essere eseguita, crea una sessione con la funzione create(), che ti consente di chiedere al modello di rispondere con le funzioni prompt() o promptStreaming().

Opzioni sessione

Ogni sessione può essere personalizzata con topK e temperature utilizzando un oggetto opzionale options. I valori predefiniti per questi parametri vengono restituiti da 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'oggetto opzionale options della funzione create() accetta anche un campo signal, che ti consente di passare un AbortSignal per distruggere la sessione.

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

const session = await chrome.aiOriginTrial.languageModel.create({
  signal: controller.signal,
})
Prompt di sistema

Con i prompt di sistema, puoi fornire al modello linguistico un contesto.

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.'

Prompt iniziali

Con i prompt iniziali, puoi fornire al modello linguistico il contesto delle interazioni precedenti, ad esempio per consentire all'utente di riprendere una sessione memorizzata dopo il riavvio del browser.

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. [...]' }
  ]
});

Informazioni sessione

Una determinata sessione del modello linguistico ha un numero massimo di token che può elaborare. Puoi controllare l'utilizzo e i progressi verso questo limite utilizzando le seguenti proprietà nell'oggetto sessione:

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

Persistenza della sessione

Ogni sessione tiene traccia del contesto della conversazione. Le interazioni precedenti vengono prese in considerazione per le interazioni future finché la finestra del contesto della sessione non è completa.

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. 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);

Clonare una sessione

Per preservare le risorse, puoi clonare una sessione esistente con la funzione clone(). Il contesto della conversazione viene reimpostato, ma il prompt iniziale o i prompt di sistema rimarranno invariati. La funzione clone() accetta un oggetto opzionale options con un campo signal, che ti consente di passare un AbortSignal per distruggere la sessione clonata.

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

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

Chiedi al modello

Puoi richiedere informazioni al modello con le funzioni prompt() o promptStreaming().

Output non in streaming

Se prevedi un risultato breve, puoi utilizzare la funzione prompt() che restituisce la risposta quando è disponibile.

// 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);
}

Output streaming

Se prevedi una risposta più lunga, devi utilizzare la funzione promptStreaming(), che ti consente di mostrare i risultati parziali man mano che vengono inviati dal modello.

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() restituisce un ReadableStream i cui chunk si basano progressivamente uno sull'altro. Ad esempio, "Hello,", "Hello world,", "Hello world I am,", "Hello world I am an AI.". Questo non è il comportamento previsto. Abbiamo intenzione di allinearci alle altre API di streaming sulla piattaforma, in cui i chunk sono parti successive di un unico stream lungo. Ciò significa che l'output sarà una sequenza come "Hello", " world", " I am", " an AI".

Per il momento, per ottenere il comportamento previsto, puoi implementare quanto segue. Questo funziona sia con il comportamento standard che con quello 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);

Interrompere l'esecuzione di un prompt

Sia prompt() che promptStreaming() accettano un secondo parametro facoltativo con un campo signal, che ti consente di interrompere l'esecuzione dei prompt.

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

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

Terminare una sessione

Chiama destroy() per liberare le risorse se non hai più bisogno di una sessione. Quando una sessione viene distrutta, non può più essere utilizzata ed eventuali esecuzioni in corso vengono interrotte. Ti consigliamo di conservare la sessione se intendi chiedere spesso al modello di eseguire un'azione, poiché la creazione di una sessione può richiedere del tempo.

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.'
);

Demo

Per testare l'API Prompt nelle estensioni di Chrome, installa l'estensione demo. Il codice sorgente dell'estensione è disponibile su GitHub.

Interfaccia demo per l'API Prompt

Partecipare e condividere feedback

Inizia a testare l'API Prompt nelle tue estensioni di Chrome partecipando alla prova dell'origine e condividi il tuo feedback. Il tuo contributo può influire direttamente sul modo in cui sviluppiamo e implementiamo le versioni future di questa API e di tutte le API di IA integrate.