סוכן לעדכוני הוצאות לתורמים · AfifAI
מקרה בוחן · הנדסת AI · 2026

סוכן Teams שהופך הוצאות בכרטיס לעדכון לתורמים

אנשי כספים בעמותות שואלים ב־⁠Teams או ב־⁠Microsoft 365 Copilot: ”כמה הוצאנו ברבעון שעבר?”, ”למי יש כרטיסים?”, ”תכתוב עדכון לתורמים על Q1”. הסוכן שולף את נתוני הכרטיסים של הארגון עצמו, עושה את החשבון בקוד, וכותב טבלה או מייל של שלוש פסקאות לתורמים, רק על בסיס המספרים האלה.

TypeScriptBot Framework (CloudAdapter)Azure Bot ServiceAzure OpenAI gpt-4oModel Context ProtocolAdaptive CardsApp Service
לקוח
חברת פינטק אמריקאית לכרטיסים נטענים וניהול הוצאות, שמשרתת עמותות (חסוי)
התפקיד שלי
ראש צוות, ארכיטקט ומפתח בפועל
שלב
סוכן עובד ב־⁠Azure, מותקן ב־⁠Teams וב־⁠Copilot, מאי 2026
סטטוס
אב־טיפוס
במבט אחד
פחות מדקהלעדכון הוצאות לתורמים, במקום ≈60 דקות של ייצוא, תיוג וכתיבה ידנית (הערכה)
3 עד 1סבבי בקשות לסיכום הוצאות: פרופיל, תגים ועסקאות נשלפים במקביל
501 עד 200התגובה לפעילויות invoke של Copilot, שגרמו לו לסמן את הסוכן כתקול
2מסלולי נתונים, ה־⁠REST API ושרת ה־⁠MCP של הפלטפורמה, עם מתג הגדרה אחד
0מספרים שנשארים למודל. סכומים, קטגוריות והוצאות מובילות מחושבים בקוד
6כוונות, שמסווגות במצב JSON בטמפרטורה 0
7סבבי פריסה ב־⁠3 ימים, מה־⁠build הראשון ועד חבילת Teams עובדת

מספרים שמסומנים ”הערכה” הם הערכות הנדסיות שצריך לאמת מול המשתמשים. כל השאר נספרו מהקוד ומקבצי הפריסה.

הבעיה

הנתונים היו בפלטפורמת הכרטיסים. הסיפור לתורמים לא.

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

ספקית הכרטיסים רצתה שזה יהיה זמין איפה שהצוות כבר עובד, ב־⁠Teams וב־⁠Copilot, בלי שהיא תחזיק הרשאה משותפת לחשבון של כל לקוח, ובלי שמודל שפה ”יעריך” אפילו מספר אחד.

מה הובלתי

הסוכן, מקצה לקצה

  • תכננתי את הסוכן: זרימת הפנייה, מודל הטוקנים, סט הכוונות והחלוקה בין קוד למודל.
  • כתבתי את רוב קוד ה־⁠TypeScript: ה־⁠host של Bot Framework, לקוחות הנתונים ל־⁠REST ול־⁠MCP, מנתח התקופות, האגרגטור והפרומפטים.
  • אבחנתי מלוגים של App Service את התקלות הייחודיות ל־⁠Copilot (פעילויות invoke, session affinity) ותיקנתי אותן.
  • ארזתי ופרסתי: App Service, Azure Bot Service ומניפסט Teams עם custom engine agent.
מה בניתי

סוכן קטן עם חלוקת עבודה קפדנית

ארכיטקטורה

הקוד מחשב, המודל כותב

התרשים רחב מהמסך: החליקו הצידה לצפייה בכולו →

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

החלטות תכנון

להרחיק את החשבון מהמודל

אגרגציה דטרמיניסטית

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

כל משתמש מביא טוקן משלו

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

שני מסלולי נתונים, מתג אחד

ה־⁠REST API היה מוכן. שרת ה־⁠MCP של הספקית היה הכיוון האסטרטגי. שני המסלולים יושבים מאחורי אותן פונקציות, והגדרה אחת בוחרת ביניהם. המחיר: שני מבני תשובה לנרמל.

צורת התשובה לפי הבקשה

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

יומן הנדסי

מה נשבר, ואיך גיליתי

רוב הבעיות הופיעו רק בתוך Teams ו־⁠Copilot, לא בבדיקות מקומיות. מבחר:

Copilot

Copilot סימן את הסוכן כתקול

Copilot ו־⁠Teams שולחים פעילויות invoke לצד הודעות. בלי handler, ה־⁠adapter החזיר 501 Not Implemented, ו־⁠Copilot התייחס לסוכן כפגום.

תשובת invokeResponse מפורשת עם 200 לפעילויות invoke, אישור שקט לאירועים, ו־⁠error handler שאף פעם לא זורק בפניות שאינן הודעה.

MCP

ה־⁠session של MCP נעלם בין קריאות

שרת ה־⁠MCP רץ מאחורי load balancer. כל קריאה אחרי initialize נחתה על instance אחר ואיבדה את ה־⁠session.

שומרים כל Set-Cookie (כולל עוגיית ה־⁠affinity) ושולחים אותם בחזרה בכל קריאה. מפענחים גם frames של SSE (”data:”) וגם תשובות JSON רגילות.

MCP

איזה כלי מחזיר עסקאות?

שם הכלי של העסקאות עוד לא היה סגור בצד השרת, ושם שגוי חזר כשגיאת כלי ולא כחריגה.

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

איכות נתונים

הוצאות בלי תג עיוותו את הקטגוריות

לחלק מהעסקאות לא היה תג, והסכומים לפי קטגוריה לא התיישבו בשקט עם הסכום הכולל.

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

תאריכים

”תסכם את ההוצאות שלנו” בלי תקופה

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

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

הקשר

”ומה עם הרבעון שעבר?”

שאלות המשך לא היו מובנות בלי הפנייה הקודמת.

המסווג כותב מחדש כל הודעה כך שתעמוד בפני עצמה, על בסיס 10 הפניות האחרונות, לפני הניתוב.

נסו בעצמכם

פניות, מהטוקן ועד המייל לתורמים

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

תוצאה

איפה זה עומד

מדדלפניאחרימקור
עדכון הוצאות לתורמיםייצוא, תיוג, סיכום וכתיבה, ≈60 דק׳שאלה אחת, פחות מדקההערכה
סבבי בקשות לסיכום3 ברצף1 במקבילנגזר
טיפול ב־⁠invoke של Copilot501, הסוכן סומן כתקול200, מאושרקוד
מספרים שהמודל מחשבאפשרי0, הכל בקודקוד
זיהוי הרשאה שגויהבאמצע שאלהבחיבור, עם הודעה מה לעשותקוד
סבבי פריסה עד חבילה עובדת—7 ב־⁠3 ימיםקבצי פריסה

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

  • סוכן עובד על App Service ו־⁠Azure Bot Service, מותקן ב־⁠Teams וב־⁠Microsoft 365 Copilot (חבילת Teams v1.0.3).
  • שישה סוגי שאלות: פרופיל, תגים, בעלי כרטיסים, סיכום הוצאות, רשימת עסקאות, עזרה.
  • שני מסלולי הנתונים עובדים, ה־⁠REST API ושרת ה־⁠MCP.
  • נרטיבים של שלוש פסקאות שמוכנים לתורמים, וטבלאות ממוינות לפי תאריך, מאותם נתונים.
  • הצעדים הבאים: העברת הטוקנים וההיסטוריה לאחסון משותף ומאובטח, שאילתות יתרה כשה־⁠API יחשוף אותן, וטסטים אוטומטיים לאגרגטור ולמנתח התקופות.
טכנולוגיות

טכנולוגיות

סוכן
TypeScript, Node.js, Bot Framework CloudAdapter, Express
AI
Azure OpenAI gpt-4o (מסווג במצב JSON, כותב מבוסס נתונים)
נתונים
REST API של פלטפורמת ההוצאות, Model Context Protocol (JSON-RPC, SSE)
ערוצים
Azure Bot Service, Microsoft Teams, Microsoft 365 Copilot (custom engine agent)
ממשק
Adaptive Cards (קלט טוקן מוסתר)
אירוח
Azure App Service, מניפסט Teams 1.22

שיחת אבחון חינם · 30 דקות · ללא התחייבות

הביאו תהליך אחד. קבלו תוכנית ומספר לשפר.

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

לשיחת אבחון חינםafif.mansour@gmail.com

נפתח מייל מוכן מראש · מענה תוך יום עסקים

ה־AI קורא. הקוד סופר.

כל הפרויקטים