פוסט זה עוסק בגבולות הלקוח והפלטפורמה העומדים בבסיס חוויית המשתמש והאינטראקציות עם Ask DoorDash: כיצד עברנו מקרוסלות של האקתון למודל הנוכחי, כיצד אובייקט אחד משרת שלושה קוראים, וכיצד ההקשר והמצב נשמרים עקביים ככל שהצרכנים מתקדמים בתוך DoorDash. הפוסט ממשיך "בניית DoorDash Assistant: סקירה הנדסית" ולסקירות המעמיקות שלנו בניית Ask DoorDash (חלק 2): בינה, בניית Ask DoorDash (חלק 3): הערכה, ו בניית Ask DoorDash (חלק 4): פלטפורמה לבניית והתפתחות סוכנים.
Ask DoorDash הופך בקשות כמו "הכן לי ארוחת ערב ב-60 דולר ל-10 אנשים", "עזור לי להכין טאקו עוף" ו"חטיפים לשבוע" לרשימות קניות שניתן לערוך. השירות מייצר רשימה הכוללת מוצרים שניתן לרכוש, מחירים, תמונות, אפשרויות שליטה בכמויות וכפתורים פשוטים להחלפת כל פריט ולביצוע התשלום. במקרה של בקשות ממסעדות, מוצגים חנויות ומנות שמתחברות לתהליך הקנייה המקורי. שתי הפונקציונליות פועלות על אותו מנגנון לקוח ופלטפורמה. פוסט זה מתמקד במקרה השימוש של מצרכי מכולת, שכן הוא מעמיד את האתגר הגדול ביותר בכל המורכבויות העיקריות הכרוכות ביצירת ממשק אינטואיטיבי לקניות מונחות סוכן. רשימות מצרכי מכולת מכילות בדרך כלל עשרה או עשרים פריטים, עוברות מספר סבבי תיקונים, ועליהן להתמודד בקלות עם אילוצים של הצרכן, כגון תקציב והגבלות תזונתיות.
מפגשי משתמשים מחודש יולי 2026 הראו כי במפגשים הקשורים לקניות במכולת, שבהם הוצגה רשימת קניות, ביצעו הצרכנים בממוצע קרוב לשתי אינטראקציות עם ממשק המשתמש כל אחד. כ-שליש מאותם מפגשים המשיכו ליישום הרשימה בעגלת הקניות. העוזר לוקח את הכוונה הכללית של הצרכנים ומצמצם אותה. התוצאה היא רכיבים מובנים, המאפשרים לצרכנים לבצע חידוד מדויק. עריכות פשוטות מעדכנות באופן מיידי את האובייקט הסמכותי, בעוד ששינויים הדורשים חשיבה מפעילים תור חדש של הסוכן.
כדי ליצור חווית קנייה שיתופית ויעילה בין הצרכן לסוכן, על סוכני הקניות להשתלב בממשק אינטראקטיבי המבוסס על נתוני מסחר בזמן אמת ועל ההקשר הנוכחי של הצרכן באפליקציה. כאשר צרכן קונה באפליקציה, הוא מצפה לראות במבט אחד פריטים אמיתיים שניתן לרכוש. טקסט יכול לתאר את הסביבה הזו, אך רכיבים אינטראקטיביים מבוססי תמונות מאפשרים לצרכנים ממש לנווט בתוכה. גם ההקשר חשוב. לצרכנים הפותחים את DoorDash יש ציפיות שונות מאלה שיש להם מאפליקציית צ'אט כללית. הם קונים באמצעות גלישה, ועוברים בין חנויות ודפים במקום לתאר את מה שהם רוצים. לפגוש אותם במקום שבו הם נמצאים הוא חלק חיוני בפאזל.
לדברים גדולים יש התחלות קטנות
עוזר הקניות של DoorDash התחיל כפרויקט בהאקתון. ידענו מההתחלה ששילוב רכיבים קיימים של DoorDash יהיה מרכיב מרכזי בכל מה שנבנה. הגרסאות הראשונות הסתמכו במידה רבה על קרוסלות: תחילה רשימה של חנויות אפשריות בקרבת מקום, ולאחר מכן קרוסלה של תוצאות חיפוש עבור כל פריט שהנציג חיפש. הן הוצגו בתוך הטקסט, כשכל אחת מהן צמודה למונח החיפוש שלה. התוצאה הייתה, למעשה, תמליל צ'אט שאליו הודבקו תוצאות מסחריות.
מבחינה פונקציונלית, זה היה דומה למה שאנו משווקים כיום. מבחינת חוויית המשתמש, זה היה פחות מלוטש, וכדאי לעבור על הפרטים.
לאחר שמצא קבוצה של חנויות, העוזר שאל איזו מהן כדאי לבדוק והמתין עד שהתשובה תוקלד. כל קרוסלה ייצגה פריט בודד שהצרכן היה זקוק לו, ובחירת אפשרות מתוכה הוסיפה את הפריט לעגלה. כל אחת מהן נפתחה כשהאפשרויות פרושות על פני הרוחב המלא והבחירה עדיין פתוחה. לפיכך, הכנת קניות לשבוע פירושה לעבור על הרשימה בחירה אחת בכל פעם, ללא אפשרות לאשר קבוצת פריטים בבת אחת.
מאחורי כל זה עמד כשל אחד שהשפיע בשני הכיוונים: הממשק נבנה בעיקר כדי להציג את עבודתו של העוזר. בראש כל קרוסלה הופיע השאילתה שיצרה אותה, והמועמדים הוצגו בסדר שבו נאספו. מונחי החיפוש וערכות התוצאות הגולמיות הם חומר הגלם של הסוכן. הצגת התוצאות באופן ישיר היא המקבילה בממשק להדפסת עקבות הערימה. העוזר נכנע לממשק באותה קלות, ועבד על פריט אחד בכל פעם, משום שערימה של קרוסלות לכל פריט הייתה מה שהמסך יכול היה להציג. כל אחד מהם תוכנן סביב המגבלות של האחר, ולא סביב הצרכן.
הלקח לא היה ששימוש חוזר ברכיבים קיימים הוא דבר שגוי; דווקא ההיכרות איתם היא הסיבה שבגללה העוזר מרגיש כמו DoorDash. פשוט בנינו עבורם את המכל הלא נכון. המכל הוא זה שקובע את סדר הופעתם, את מה שנמצא לצדם, ואת מה שהצרכן יכול לעשות איתם. מעל לכל, הצרכן זקוק למשטח קנייה ולא לממשק שיחה. בנינו ממשק שיחה שבמקרה הכיל רכיבי קנייה. השימוש החוזר ברכיבים סיפק לנו את אוצר המילים. הרכבתו למשטח קנייה הייתה החלק הקשה יותר.
מה שכן שרד את ההאקתון היה הבסיס: אותה תשתית סטרימינג שהוקמה אז היא זו שעליה פועלת החוויה כיום. בינתיים, שכבת הפענוח שהפכה את תוצאות הכלים לממשק המשתמש לא החזיקה מעמד. העוזר כבר לא מציג כלל את תוצאות הכלים. במקום זאת, השקענו זמן בבניית ארכיטקטורת ארטפקטים המפרידה בין דרישות הצרכנים לדרישות האחסון והסוכנים. במילים אחרות: הפסקנו לפענח את חומר העבודה של הסוכן לצורך תצוגה והתחלנו לבנות סביב הצרכים של הרכיבים השונים ושל צרכני המערכת.

איור 1: אותה בקשה לקניות במכולת, בהפרש של שנה. התוצר של ההאקתון הציג קרוסלה לכל פריט, כשבראש כל אחת מהן הופיע השאילתה שהובילה ליצירתה; הבחירה הושארה בידי הצרכן. כיום, העוזר מציג כל רשימה ככרטיס בשיחה, כשהפריטים המובילים כבר נבחרו מראש.
חפץ אחד, שלוש עדשות
לרשימת קניות יש שלושה קוראים: השירות שאוחסן אותה, הסוכן שעורך אותה, והאדם שעורך את הקניות. כל אחד מהם צריך לראות מידע שונה. ההפרדה ביניהם היא זו שמאפשרת לעריכה של הצרכן להופיע באופן מיידי ולהישאר סמכותית, מבלי לדרוש סיבוב נוסף של המודל.
הפורמט המאוחסן הוא מערכת התיעוד: בלוק JSON המוחזק כאובייקט ב-Managed Agent Services, כפי שתואר בפוסט על הפלטפורמה. הוא חייב להיות שלם, והוא העותק המוסמך היחיד.
הסוכן אינו קורא את ה"בלוב" הזה באופן ישיר. רשימת קניות אינטראקטיבית מכילה פרטים רבים יותר ממה שהמודל זקוק לו ברוב פעולות ההמשך. חזרה על כל שם מוצר, מחיר, כמות, תחליף ופרט מטא-נתונים של התצוגה בכל תור תתחרה במה שהצרכן ביקש בפועל. לכן, כאשר סוכן מוציא "ווידג'ט", מה שנשאר בהקשר השיחה הוא סיכום תמציתי: החנות, ותוכן הרשימה. כאשר תור בשיחה דורש מצב מדויק, הסוכן קורא את האובייקט ומקבל בחזרה תצוגה מצומצמת, שממנה הוסרו נתוני המטא-נתונים של התצוגה. תצוגה זו חד-משמעית וקטנה מספיק כדי לעבד אותה ביעילות. רשימה ממוצעת תופסת בין 40 ל-60 KB בפורמט JSON. מה שנשאר בהקשר השיחה הוא שורה אחת של כ-240 תווים, קטנה פי 250 בערך.
מה שהצרכן רואה שונה שוב, והוא לובש יותר מצורה אחת. בשיחה, הרשימה מוצגת כווידג'ט קומפקטי: החנות, שם הרשימה, זמן ההגעה המשוער, כמה תמונות של פריטים וכפתור "הוסף לעגלה" המציג את הסכום הכולל המשוער. זה מספיק כדי להעריך את הרשימה במבט חטוף מבלי לצאת מהצ'אט. כפתור "הצג רשימה" פותח את תצוגת המסך המלא, המציגה את הרשימה המלאה ואת כל הדרוש כדי לעבור עליה בפירוט. שתי התצוגות בנויות כך שניתן להבין אותן מיד ולבצע פעולות ישירות.
פרט אחד ממחיש עד כמה הדעות הללו שונות זו מזו. כאשר הסוכן בוחר מוצר עבור פריט ברשימה, הוא שומר את שאר המוצרים שהתאימו לאותו חיפוש, והצרכן יכול לעבור ביניהם בלחיצה אחת. הוא שומר עשרה מועמדים לכל פריט, ול-99.7% מהפריטים יש מספיק תוצאות תואמות כדי למלא את הרשימה הזו, כך שכמעט כל שורה בתצוגה של הצרכן כוללת בחירה אחת ותשע חלופות מאחוריה. תצוגת הצרכן מציגה את כל החלופות הללו. תצוגת הסוכן אינה מציגה אף אחת מהן, מכיוון שהבחירה ביניהן היא תפקידו של הצרכן (אלא אם כן מתבקש העוזר במפורש לעשות זאת).

להישאר עם הרגליים על הקרקע
כאשר העגלה מכילה יוגורט פטל, לחיצה על "המלצות לשילובים בעגלה" מציגה שתי הצעות: גרנולה, "כי היא משתלבת עם היוגורט שלך", ואוכמניות, "כדי להוסיף פירות ליוגורט שלך" (ראו איור 3). המקרה המנוגד כבר קיים במוצר שלנו, באותו מסך: דף העגלה כולל קרוסלה של פריטים משלימים המציעה פריטים שהצרכן עשוי לרצות להוסיף, ללא נימוק נלווה. סוכן העגלה שלנו היה יכול להחזיר בדיוק את זה – רשימה של פריטים סבירים. ייתכן בהחלט שהפריטים היו זהים בכל מקרה. ההנמקה היא זו שמבהירה לצרכן שההצעה הייתה מבוססת על היגיון ולא רק סבירה, ומכיוון שכל רכיב הוא גם מקום לפעולה, להבחנה הזו יש משמעות מעשית.
זה מה שהקשר למציאות מספק: ההבדל בין חווית קנייה משכנעת לבין גימיק. אם התפוקה של העוזר אינה מוחשית, לצרכנים אין סיבה של ממש לעבור מחוויית האפליקציה העשירה ש-DoorDash כבר מספקת. הטקסט עדיין עושה את העבודה, אך בתפקיד משני. בכוונה שילבנו את ההיגיון העומד מאחורי העוזר בתוך הווידג'טים ומסביבם, במקום להציג את תאי הפריטים בדיוק כפי שהם מופיעים במקומות אחרים באפליקציה.
הבסיס חייב להיות תקף גם ברמת הנתונים, ובנקודה זו העבודה מתחלקת. הסוכן בוחר סוג תוכן נתמך ומספק את נתוני המסחר עבורו; לקוח ה-iOS אחראי על התצוגה והאינטראקציה, וממפה תוכן זה לרכיבי מערכת העיצוב המקורית של DoorDash. בקשה למכולת מייצרת רשימת קניות הניתנת לעריכה, הכוללת כמויות, תחליפים וסכום ביניים. בקשה למסעדה יכולה לייצר כרטיסי חנות, כרטיסי פריטים או הצעות לעגלת הקניות.
החלוקה הזו היא הבסיס לנתונים עצמם. ערכי המסחר בווידג'ט אינם נלקחים מהמודל. מחירים, מלאי, שעות פתיחה של החנות ותכולת עגלת הקניות נקראים מאותן מערכות רישום שהאפליקציה כולה משתמשת בהן, ולכן מחיר המוצג ב-Ask תואם למחיר המופיע בדף החנות באותו הרגע. תוכן מסוג מסוים (typed) מספק גם לשרת וללקוח הסכם יציב. תמיכה בווידג'ט חדש דורשת יותר משינוי מיידי. הסוכן צריך לדעת מתי להשתמש בו ומה להכניס לתוכו, והלקוח זקוק לסכימה שמית בנוסף לקוד הדרוש לפיענוח ולרינדור שלה. מעבר לכך, ווידג'ט חדש מגיע לצרכן באמצעות אותו מנגנון שיחה וסטרימינג כמו כל ווידג'ט אחר.

ווידג'טים כערוצי קלט/פלט
כל ווידג'ט חדש ששילבנו תרם לכך שהעוזר ייראה פונקציונלי יותר. הסיבה לכך קשורה לא פחות לתשומות מאשר לפלטים. ישנו גבול אחד המנחה את כולם: עריכה דטרמיניסטית נשארת בצד הלקוח ומוחלת ישירות על הארטיפקט, בעוד ששינוי הדורש שיקול דעת מפעיל תור של הסוכן. הדוגמאות שלהלן מסודרות לפי המיקום שבו עובר קו הגבול הזה.
הגרסה שהוכנה בהאקתון שאלה את הצרכן איזו חנות הוא רוצה, ואז המתינה עד שיקליד את התשובה. לא הייתה לה שום דרך לבחור בעצמה; כיום הבחירה הזו מתבצעת באופן אוטומטי. עדיין יש שפע של שאלות אחרות שדורשות את מעורבות הצרכן, והקלדה ישירה עשויה להיות דרך לא יעילה לאיסוף התשובות. הזנת טקסט היא מגבלה של תהליך חד-הליכי: הצרכן אולי יודע את כל התשובות, אך יכול לספק אותן רק בקצב שבו הוא מקליד או מדבר.
זה המקום שבו הווידג'טים מוכיחים את ערכם. לצרכן עשויות להיות עשר פעולות שצריך לבצע ברשימת הקניות, וכל אחת מהן פשוטה. כל פעולה בפני עצמה היא דבר של מה בכך; אך כאשר מתארים אותן במילים, הן הופכות למשימה מורכבת. זהו ההבדל בין להסתכל מעבר לכתפו של מישהו ולומר לו על אילו כפתורים ללחוץ, לבין ללחוץ על הכפתורים בעצמך.
שאלות הבהרה מובנות הן הדוגמה הברורה ביותר, והדפוס לקוח מתחום תכנות הסוכנים: הכלי AskUserQuestion של Claude Code מבצע את אותה המשימה עבור מפתחים. אנו מספקים ווידג'ט שמפריע לצרכן עם סדרה קצרה של שאלות (בחירה מרובה ובחירה מרובת אפשרויות), ומאפשר לו לכוון את השיחה בנקודות פתוחות באמת. זה הפך לעמוד תווך מרכזי במודל האינטראקציה בסוכן המכולת, וכעת הוא מיושם גם בסוכן המסעדות כדי לפשט את אותו סוג של אינטראקציה. אנו משלבים את הכלי בפלטפורמת הזיכרון הצרכנית שלנו, שמצמצמת את האפשרויות באופן משמעותי, אך עדיין נותרים פערי ידע הדורשים קלט מצד הצרכן. אין מנוס משאלות. אך אנו יכולים לשאול באופן שקל ויעיל לצרכן לענות עליו.
תצוגת הרשימה במלוא העמוד היא המקום שבו שיתוף הפעולה בין קלט לפלט מתממש. הצרכן יכול לשנות את כמות הפריט, למחוק פריט, להחליף פריט באחת החלופות שהעוזר מצא לצדו, ולהוסיף את הרשימה הסופית לעגלת הקניות שלו. כל אחת מהפעולות הללו משפיעה ישירות על האובייקט. אף אחת מהן אינה מחייבת את העוזר לפעול בשם הצרכן, ואף אחת מהן אינה כרוכה בסיבוב הלוך ושוב של מודל שפה גדול (LLM). מקרה ההחלפה מנצל טוב יותר את מערכי המועמדים שנבנו בהאקתון. החלופות שביניהן הצרכן בוחר הן המועמדים האחרים שהעוזר איתר בעת בחירת הפריט. רשימת כל האפשרויות העומדות לרשות הצרכן מילאה בעבר קרוסלה. כעת הן נמצאות במרחק נגיעה אחת מההחלטה, במקום להיות פזורות לפני הצרכן כשאלה פתוחה.
שינוי החנות הוא היוצא מן הכלל, והיוצא מן הכלל הוא החלק המעניין. זה אינו שינוי של הרשימה הקיימת. זה מתפתח לבקשה מהעוזר, שבונה מחדש את הרשימה בחנות החלופית. אינטראקציה זו נדירה גם היא: היא הייתה הפעולה הראשונה ב-0.1% מהפעמים שבהן המשתמשים היו מעורבים, וזה בערך מה שהיינו מצפים לו אם הקו היה נמתח במקום הנכון בערך. אם מציבים את הקו במקום הלא נכון, הצרכן או שמחכה שהעוזר יבצע פעולה שהוא היה יכול לבצע בלחיצה אחת, או שמקליד את דרכו דרך פעולה שהייתה יכולה להרוויח מהשיקול הדעת של העוזר.
החפץ מאפשר את הפיצול בצורה בטוחה, ושני הצדדים כותבים אליו באופן שונה. שינוי בכמות, הסרה או החלפה עוברים במסלול הקצר: הלקוח מעדכן את הרשימה במקום, והעריכה מופיעה מיד. לעומת זאת, שינוי באחסון מפעיל תור של סוכן, מכיוון שיש להתאים מחדש את הרשימה כולה לקטלוג אחר. עדכון של הסוכן אינו מחליף את מה שהיה שם; הוא מייצר רשימה חדשה הנגזרת מהרשימה הקודמת.
התוצאה היא שעריכה ישירה היא הקובעת. לפני שתור מסוים משנה את הרשימה, הסוכן קורא את הרשימה הנוכחית במקום לעבוד על סמך התמליל; לפיכך, אם הצרכן מסיר את חלב השיבולת-שועל, התור הבא מתחיל מרשימה שבה אין חלב שיבולת-שועל.
ההתנהגות שנמדדה באותה תקופה מראה היכן עובר הקו הזה. מיד לאחר הבקשה הראשונה, כמעט שלושה רבעים מהפעולות הבאות הראשונות בוצעו באמצעות רכיב. מההודעה השנייה ואילך המגמה מתהפכת, והפעולות הבאות שהוקלדו מהוות את הרוב בכל רמת עומק שנמדדה. פקדי השליטה מטפלים בשיפורים המיידיים והמבניים; השפה תופסת את מקומם כאשר השינוי גדול יותר או קשה יותר לביטוי באמצעות הקשה.

כל גרסת עריכה של עוזר נשארת פעילה
כאשר העוזר מתקן רשימת קניות, הגרסה שהוא מחליף נשארת על המסך וניתן להמשיך להשתמש בה.
זו לא הייתה היישום הראשון שלנו. הגרסה הראשונה הסתירה רשימות שהוחלפו: ברגע שהגיעה גרסה חדשה, לא היה אפשר עוד להציג או לערוך את הרשימה שקדמה לה. רשימה אחת עדכנית, בלי בלגן. זה נראה כמו התנהגות מסודרת יותר. אבל בפועל, זה גרם לכך שהשינוי נראה כמו תהליך יקר. אם בקשת שינוי עלולה למחוק רשימה שהיית מרוצה ממנה, הצעד הבטוח הוא להפסיק לבקש, וזה פוגע בכל הרעיון של זרימת עבודה שיתופית.
לכן, כל עדכון עוזר מייצר כעת תוצר חדש הנגזר מהקודם, וכל אחד מהם נשאר במקום שבו נוצר בשיחה. אם גוללים לאחור, כל הגרסאות הקודמות עדיין שם, עדיין פעילות: הצרכן יכול לפתוח רשימה קודמת, לערוך אותה או להוסיף אותה לעגלת הקניות שלו במקום הרשימה העדכנית ביותר. בקשת שינוי אינה כרוכה בעלות כלשהי, שכן מה שהיה לו לפני רגע נמצא במרחק גלילה אחת בלבד.
לא כל רשימה שהעוזר בונה הופכת לגרסה שהצרכן רואה. כאשר הוא מרכיב רשימת מועמדים ומגיע למסקנה שהחנות אינה מחזיקה את המוצרים המבוקשים, הרשימה הזו לעולם לא מוצגת. הצרכן מקבל הודעה טקסטואלית המציינת כי בחנות חסרים פריטים וכי רשימה חדשה נמצאת בדרך. זהו אחד המקרים הבודדים שבהם הטקסט עושה את העבודה באופן ישיר, וזו הסיבה העומדת מאחורי כל השאר בפוסט זה: האינטראקציה משמשת לפשט, והטקסט משמש להסביר.
כאשר רשימה הופכת לעגלת קניות
עוזר שעורך את עגלת הקניות באופן ישיר יכול להסיר פריט שהצרכן רצה, או להוסיף פריט שהוא מעולם לא אישר, מבלי שיידרש לכך. טעות אחת בלבד מספיקה כדי לאבד את אמונו של הצרכן, משום שהטעות מתרחשת בשקט ומשפיעה על הפריט שעבורו הוא עומד לשלם.
לכן, במקום זאת, אנו מציגים רשימת קניות כהצעה. היא יכולה להכיל עשרות פריטים ולעבור מספר סבבי תיקון, בין אם מדובר בהסרת פריט מהמזווה שכבר נמצא ברשות הצרכן, שינוי כמות, החלפת מוצר או יצירת גרסה חדשה לחלק מהמתכון – וכל זאת מבלי לגעת בעגלת הקניות. כדי לאשר את הרשימה נדרשת לחיצה מפורשת על "הוסף לעגלה", שהיא המבנה הפשוט ביותר שמצאנו, המעניק לצרכן שליטה אמיתית מבלי לחייב אותו לפקח על כל שלב.
עדיין יש ליישר את ההבדלים בין שני הפריטים, והבחירה המעניינת היא מי יעשה זאת. העוזר סורק את תכולת העגלה תוך כדי יצירת הרשימה, אך הוא אינו מתאים את הרשימה באופן אוטומטי: אם מתכון דורש שני בננות, הרשימה תציין שתיים, בין אם יש כבר ארבע בעגלה ובין אם לאו. יצירת הרשימה בהתאם לבקשה המדויקת, ויישורה מול תכולת העגלה כצעד נפרד, מאפשרת לרכז את ההחלטה במקום אחד.
שלב זה מתרחש בעת ביצוע ה-commit. כאשר הרשימה ועגלת הקניות חופפות, מוצגים לצרכן הפריטים הכפולים, והוא בוחר אם להחליף את הכמויות הללו או להוסיף עליהן. זהו רגע קצר, אך ברגעים קטנים כאלה נקבעת האמון – או הולכת לאיבוד.
העברת הקשר ברחבי DoorDash
לא די בכך שהעוזר יהיה זמין במיקום אחד; הוא חייב להיות נגיש מכל מקום באפליקציה. פתיחת העוזר היא כבר סימן חזק לכוונה, אך זהו סימן מעורפל. צרכן באותו רגע עשוי להזמין ממסעדה אהובה, לקנות מצרכים לשבוע, לחפש זוג אוזניות חדש או לחפש תמיכה בהזמנה קודמת. צרכן שהגיע לחנות מכולת מסוימת משדר איתות חד הרבה יותר: סביר להניח שהוא מתכוון להרכיב עגלת קניות באותה חנות. העברת ההקשר הזה לעוזר היא מה שמאפשר לו להתמקד בכוונה הסבירה במקום לשאול.
מערכת ה-scope שתכננו למטרה זו משתרעת על פני הלקוח והשער. הלקוח מצרף לכל בקשה מרכיבים מרכזיים של הקשר הכניסה: הנושא שתחתו נכנס הצרכן (מכולת, מסעדה), החנות שהוא בוחן וכמה מזהים קשורים. השער משתמש בנושא כדי להחליט לאיזה סוכן להפנות את התור, ובשאר הפרטים כדי לספק לכלים את המזהים הדרושים להם.
Scope הוא במכוון מערך שטוח של זוגות מפתח-ערך, ולא סכימה טיפוסית, והלקוח הוא זה שמחליט מה ייכלל בו. מפתחות שלא זוהו מועברים הלאה במקום להידחות, כך שמשטח חדש יכול להתחיל לשלוח הקשר מבלי להמתין לשינוי ב-Gateway. היוצא מן הכלל הוא הנושא עצמו: הוספת נושא חדש פירושה ללמד את ה-Gateway לאיזה סוכן הוא צריך לנתב אותו. לכן, בעוד שמשטח חדש הוא זול, תחום חדש אינו כזה.
הנושא הוא גם החלק הרלוונטי אך ורק להודעה הראשונה בהקשר נתון. הדבר מספק לעוזר בסיס יציב לעבודה מבלי להיות מגביל יתר על המידה, וזה מה שמאפשר למשתמשים לצאת מההקשר כאשר הם בוחרים בכך במפורש. משתמש המשתמש בעוזר בתוך מסעדה יכול לצאת לחלוטין מההקשר של המסעדה על-ידי בקשה: "מצא לי מתכון למנה הזו, והכן לי עגלת קניות, כדי שאוכל להכין אותה בבית". בקשה זו אינה חינמית, אך העלות היא "קפיצה" בתוך התהליך ולא מבוי סתום: הסוכן של המסעדה צריך לזהות את הבקשה ככזו שאינה בתחום אחריותו ולהחזיר אותה לפני שסוכן אחר ייקח אותה.
במקרים מסוימים, תחומים (scopes) יכולים גם לאפשר לנו לדלג על המודל לחלוטין. קחו לדוגמה את נקודת הכניסה "להזמין מחדש את העגלה האחרונה שלי". אפשר פשוט לשלוח את הביטוי הזה לעוזר כהודעה, ואף על פי שזה יעבוד, צירוף תחום מאפשר לנו להיות מדויקים יותר. המקרה של "הזמנה מחדש" הוא למעשה דטרמיניסטי, ולכן אנו יכולים לעקוף את ה-LLM ולהחזיר רשימת קניות כמעט באופן מיידי. התוצאה היא ווידג'ט רגיל של רשימת קניות: הצרכן יכול לשנות כמויות, להחליף מוצרים או לבקש מהעוזר לערוך אותה בצ'אט, בדיוק כפי שהיה עושה עם כל רשימה אחרת. שימו לב שהעקיפה תקפה רק אם החנות עדיין מחזיקה את כל הפריטים שהיו בעגלת הקניות הקודמת; אם פריט כלשהו אינו זמין, הבקשה מועברת לסוכן המכולת, אשר בונה מחדש את הרשימה באותו אופן שבו היה עושה זאת על סמך בקשה שהוקלדה.
הגדרת ההיקף היא גם זו שמאפשרת שיחה רציפה אחת לאורך כל מושב האפליקציה, אך היא פועלת רק משום שההיקף, קישור הסוכן ומצב המושב נשמרים בנפרד. אנו מתייחסים להיקף כאל הקשר לכל תור. ה"הצמדה", שתוארה קודם בסדרת הפוסטים בבלוג, שומרת על תורים עוקבים עם הנציג שפתר את התור הקודם. הן ההצמדה והן התמליל (השיחה עצמה) נשמרים במסגרת הצ'אט ולא במסגרת ההיקף, כך שצרכן שעובר מחנות אחת לאחרת מכוון מחדש את ההצמדה לנציג מתחום חדש מבלי לאבד את תוכן השיחה. מספר נציגים מתמחים בתחומי משנה, והמערכת כולה ממשיכה להתנהג כעוזר אחד.

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


































