Prompt API

פורסם: 20 במאי 2025, עדכון אחרון: 21 ביולי 2025

הסבר פיתוח אתרים תוספים הסטטוס של Chrome המטרה
GitHub גרסת מקור לניסיון בגרסת מקור לניסיון Chrome 138 תצוגה כוונה להתנסות

בעזרת Prompt API, אתם יכולים לשלוח בקשות בשפה טבעית אל Gemini Nano בדפדפן.

יש הרבה דרכים להשתמש ב-Prompt API באפליקציית אינטרנט או באתר. לדוגמה, אפשר ליצור:

  • חיפוש מבוסס-AI: תשובות לשאלות על סמך התוכן של דף אינטרנט.
  • פידים של חדשות בהתאמה אישית: יצירת פיד שמסווג באופן דינמי מאמרים לקטגוריות ומאפשר למשתמשים לסנן את התוכן הזה.

אלה רק כמה אפשרויות, ואנחנו סקרנים לראות מה יהיו התוצרים שלכם.

בדיקת דרישות החומרה

הדרישות הבאות חלות על מפתחים ועל משתמשים שמפעילים תכונות באמצעות ממשקי ה-API האלה ב-Chrome. בדפדפנים אחרים עשויות להיות דרישות הפעלה שונות.

ממשקי ה-API של כלי זיהוי השפה והתרגום פועלים ב-Chrome במחשב. ממשקי ה-API האלה לא פועלים במכשירים ניידים. ממשקי Prompt API,‏ Summarizer API,‏ Writer API ו-Rewriter API פועלים ב-Chrome כשמתקיימים התנאים הבאים:

  • מערכת הפעלה: Windows 10 או Windows 11;‏ macOS מגרסה 13 ואילך (Ventura ואילך);‏ Linux; או ChromeOS (מגרסה 16389.0.0 ואילך) במכשירי [Chromebook Plus](https://www.google.com/chromebook/chromebookplus/). ממשקי ה-API שמשתמשים ב-Gemini Nano עדיין לא תומכים ב-Chrome ל-Android, ל-iOS ול-ChromeOS במכשירים שאינם Chromebook Plus.
  • אחסון: לפחות 22 GB של שטח פנוי בכרך שמכיל את פרופיל Chrome.
  • מעבד גרפי (GPU): יותר מ-4 GB של VRAM.
  • רשת: נתונים ללא הגבלה או חיבור ללא מדידה.

הגודל המדויק של Gemini Nano עשוי להשתנות כשהדפדפן מעדכן את המודל. כדי לראות את הגודל הנוכחי, נכנסים אל chrome://on-device-internals ועוברים אל סטטוס המודל. פותחים את נתיב הקובץ שמופיע ברשימה כדי לקבוע את גודל המודל.

שימוש ב-Prompt API

ה-Prompt API משתמש במודל Gemini Nano ב-Chrome. ה-API מובנה ב-Chrome, אבל המודל מורד בנפרד בפעם הראשונה שמקור משתמש ב-API.

כדי לקבוע אם המודל מוכן לשימוש, מתקשרים אל LanguageModel.availability(). אם התשובה ל-availability() הייתה downloadable, צריך להמתין להתקדמות ההורדה ולעדכן את המשתמש, כי ההורדה עשויה להימשך זמן מה.

const availability = await LanguageModel.availability();

כדי להפעיל את ההורדה וליצור מופע של מודל השפה, צריך לבדוק אם יש הפעלת משתמש. לאחר מכן, קוראים לפונקציה LanguageModel.create() האסינכרונית.

const session = await LanguageModel.create({
  monitor(m) {
    m.addEventListener('downloadprogress', (e) => {
      console.log(`Downloaded ${e.loaded * 100}%`);
    });
  },
});

פרמטרים של מודל

הפונקציה params() מודיעה לכם על הפרמטרים של מודל השפה. האובייקט כולל את השדות הבאים:

await LanguageModel.params();
// {defaultTopK: 3, maxTopK: 128, defaultTemperature: 1, maxTemperature: 2}

יצירת סשן

אחרי שה-Prompt API יכול לפעול, יוצרים סשן באמצעות הפונקציה create().

אפשר להתאים אישית כל סשן באמצעות topK ו-temperature באמצעות אובייקט אופציונלי של אפשרויות. ערכי ברירת המחדל של הפרמטרים האלה מוחזרים מ-LanguageModel.params().

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

אובייקט האפשרויות האופציונלי של הפונקציה create() כולל גם את השדה signal, שמאפשר להעביר AbortSignal כדי להרוס את הסשן.

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

const session = await LanguageModel.create({
  signal: controller.signal,
});

הוספת הקשר באמצעות הנחיות ראשוניות

בעזרת הנחיות ראשוניות, אתם יכולים לספק למודל השפה הקשר לגבי אינטראקציות קודמות, למשל כדי לאפשר למשתמש להמשיך סשן שנשמר אחרי הפעלה מחדש של הדפדפן.

const session = await 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. [...]',
    },
  ],
});

הגבלת התשובות באמצעות קידומת

אתם יכולים להוסיף "assistant" תפקיד, בנוסף לתפקידים הקודמים, כדי להרחיב על התשובות הקודמות של המודל. לדוגמה:

const followup = await session.prompt([
  {
    role: "user",
    content: "I'm nervous about my presentation tomorrow"
  },
  {
    role: "assistant",
    content: "Presentations are tough!"
  }
]);

במקרים מסוימים, במקום לבקש תשובה חדשה, יכול להיות שתרצו למלא מראש חלק מההודעה עם תגובת "assistant"-תפקיד. ההנחיה הזו יכולה לעזור למודל השפה להשתמש בפורמט תשובה ספציפי. כדי לעשות את זה, מוסיפים את prefix: true להודעה האחרונה "assistant"-role. לדוגמה:

const characterSheet = await session.prompt([
  {
    role: 'user',
    content: 'Create a TOML character sheet for a gnome barbarian',
  },
  {
    role: 'assistant',
    content: '```toml\n',
    prefix: true,
  },
]);

צירוף הודעות

יכול להיות שההסקה תימשך זמן מה, במיוחד כשמזינים הנחיות עם קלט רב-אופני. כדאי לשלוח הנחיות מוגדרות מראש כדי לאכלס את הסשן, כדי שהמודל יוכל להתחיל לעבד את ההנחיות מוקדם יותר.

אמנם initialPrompts שימושיים בזמן יצירת הסשן, אבל אפשר להשתמש בשיטה append() בנוסף לשיטות prompt() או promptStreaming() כדי לתת הנחיות נוספות מבוססות הקשר אחרי שהסשן נוצר.

לדוגמה:

const session = await LanguageModel.create({
  initialPrompts: [
    {
      role: 'system',
      content:
        'You are a skilled analyst who correlates patterns across multiple images.',
    },
  ],
  expectedInputs: [{ type: 'image' }],
});

fileUpload.onchange = async () => {
  await session.append([
    {
      role: 'user',
      content: [
        {
          type: 'text',
          value: `Here's one image. Notes: ${fileNotesInput.value}`,
        },
        { type: 'image', value: fileUpload.files[0] },
      ],
    },
  ]);
};

analyzeButton.onclick = async (e) => {
  analysisResult.textContent = await session.prompt(userQuestionInput.value);
};

ההבטחה שמוחזרת על ידי append() מתקיימת אחרי שההנחיה מאומתת, מעובדת ומצורפת לסשן. ההבטחה נדחית אם אי אפשר לצרף את ההנחיה.

המשכיות של סשנים ומגבלות

בכל סשן נשמר ההקשר של השיחה. אינטראקציות קודמות נלקחות בחשבון באינטראקציות עתידיות עד שחלון ההקשר של הסשן מתמלא.

const session = await LanguageModel.create({
  initialPrompts: [
    {
      role: 'system',
      content:
        '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);

לכל סשן יש מספר מקסימלי של טוקנים שהוא יכול לעבד. כדי לבדוק את ההתקדמות שלכם לקראת המגבלה הזו, תוכלו להיעזר בנתונים הבאים:

console.log(`${session.inputUsage}/${session.inputQuota}`);

העברת סכימת JSON

מוסיפים את השדה responseConstraint לשיטה prompt() או promptStreaming() כדי להעביר סכימת JSON כערך. אחר כך תוכלו להשתמש בפלט מובנה עם Prompt API.

בדוגמה הבאה, סכמת ה-JSON מוודאת שהמודל ישיב עם true או false כדי לסווג אם הודעה מסוימת היא בנושא קדרות.

const session = await LanguageModel.create();

const schema = {
  "type": "boolean"
};

const post = "Mugs and ramen bowls, both a bit smaller than intended, but that
happens with reclaim. Glaze crawled the first time around, but pretty happy
with it after refiring.";

const result = await session.prompt(
  `Is this post about pottery?\n\n${post}`,
  {
    responseConstraint: schema,
  }
);
console.log(JSON.parse(result));
// true

ההטמעה יכולה לכלול סכימת JSON או ביטוי רגולרי כחלק מההודעה שנשלחת למודל. הפעולה הזו משתמשת בחלק ממכסת הקלט. כדי למדוד כמה מהמכסה של נתוני הקלט ישמשו, מעבירים את האפשרות responseConstraint אל session.measureInputUsage().

כדי להימנע מההתנהגות הזו, אפשר להשתמש באפשרות omitResponseConstraintInput. אם אתם עושים את זה, מומלץ לכלול בהנחיה כמה הנחיות:

const result = await session.prompt(`
  Summarize this feedback into a rating between 0-5. Only output a JSON
  object { rating }, with a single property whose value is a number:
  The food was delicious, service was excellent, will recommend.
`, { responseConstraint: schema, omitResponseConstraintInput: true });

שיבוט של סשן

כדי לשמור משאבים, אפשר לשכפל סשן קיים באמצעות הפונקציה clone(). ההקשר של השיחה מאופס, אבל הפרומפט הראשוני נשאר ללא שינוי. הפונקציה clone() מקבלת אובייקט אופציונלי של אפשרויות עם שדה signal, שמאפשר להעביר AbortSignal כדי להרוס את הסשן המשוכפל.

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

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

הנחיית המודל

אפשר להנחות את המודל באמצעות הפונקציות prompt() או promptStreaming().

פלט שלא מועבר בסטרימינג

אם אתם מצפים לתוצאה קצרה, אתם יכולים להשתמש בפונקציה prompt() שמחזירה את התגובה ברגע שהיא זמינה.

// 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 { defaultTemperature, maxTemperature, defaultTopK, maxTopK } =
  await LanguageModel.params();

const available = await LanguageModel.availability();

if (available !== 'unavailable') {
  const session = await 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);
}

פלט בסטרימינג

אם אתם מצפים לתשובה ארוכה יותר, כדאי להשתמש בפונקציה promptStreaming(), שמאפשרת להציג תוצאות חלקיות כשהן מגיעות מהמודל. הפונקציה promptStreaming() מחזירה ReadableStream.

const { defaultTemperature, maxTemperature, defaultTopK, maxTopK } =
  await LanguageModel.params();

const available = await LanguageModel.availability();
if (available !== 'unavailable') {
  const session = await 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);
  }
}

הפסקת ההנחיות

הפונקציות prompt() ו-promptStreaming() מקבלות פרמטר שני אופציונלי עם שדה signal, שמאפשר לכם להפסיק את הפעלת ההנחיות.

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

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

סיום סשן

אם אתם לא צריכים יותר את הסשן, אתם יכולים להתקשר למספר destroy() כדי לפנות משאבים. כשסשן נמחק, אי אפשר להשתמש בו יותר, וכל ביצוע שמתבצע בזמן המחיקה מבוטל. אם אתם מתכוונים להנחות את המודל לעיתים קרובות, כדאי להשאיר את הסשן פעיל כי יצירת סשן יכולה לקחת זמן.

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 choosing between a t-shirt
  and a polo."
);

יכולות מולטי-מודאליות

גרסת המקור לניסיון של Prompt API תומכת בקלט של אודיו ותמונות. ה-API מחזיר פלט טקסט.

היכולות האלה מאפשרות לכם:

  • המשתמשים יכולים לתמלל הודעות קוליות שנשלחו באפליקציית צ'אט.
  • מתאר תמונה שהועלתה לאתר לשימוש בכיתוב או בטקסט חלופי.
const session = await LanguageModel.create({
  // { type: 'text' } only required when including expected input languages.
  expectedInputs: [{ type: 'audio' }, { type: 'image' }],
});

const referenceImage = await (await fetch('/reference-image.jpeg')).blob();
const userDrawnImage = document.querySelector('canvas');

const response1 = await session.prompt([
  {
    role: 'user',
    content: [
      {
        type: 'text',
        value:
          'Give an artistic critique of how well the second image matches the first:',
      },
      { type: 'image', value: referenceImage },
      { type: 'image', value: userDrawnImage },
    ],
  },
]);

console.log(response1);

const audioBlob = await captureMicrophoneInput({ seconds: 10 });

const response2 = await session.prompt([
  {
    role: 'user',
    content: [
      { type: 'text', value: 'My response to your critique:' },
      { type: 'audio', value: audioBlob },
    ],
  },
]);

במאמר Mediarecorder Audio Prompt יש הדגמה לשימוש ב-Prompt API עם קלט אודיו, ובמאמר Canvas Image Prompt יש הדגמה לשימוש ב-Prompt API עם קלט תמונה.

אסטרטגיית ביצועים

אנחנו עדיין מפתחים את Prompt API לאינטרנט. בזמן שאנחנו מפתחים את ה-API הזה, מומלץ לעיין בשיטות המומלצות שלנו בנושא ניהול סשנים כדי להשיג ביצועים אופטימליים.

מדיניות הרשאות, מסגרות iframe ו-Web Workers

כברירת מחדל, Prompt API זמין רק לחלונות ברמה העליונה ול-iframe מאותו מקור. אפשר להעניק גישה ל-API ל-iframes ממקורות שונים באמצעות מאפיין allow="" Permission Policy:

<!--
  The hosting site at https://main.example.com can grant a cross-origin iframe
  at https://cross-origin.example.com/ access to the Prompt API by
  setting the `allow="language-model"` attribute.
-->
<iframe src="https://cross-origin.example.com/" allow="language-model"></iframe>

נכון לעכשיו, Prompt API לא זמין ב-Web Workers, בגלל המורכבות של יצירת מסמך אחראי לכל worker כדי לבדוק את סטטוס מדיניות ההרשאות.

השתתפות ושיתוף משוב

המשוב שלכם יכול להשפיע ישירות על האופן שבו נפתח ונחיל גרסאות עתידיות של ה-API הזה ושל כל ממשקי ה-API המובנים של AI.