העוזרים האישיים שרצים על מכונות בענן הם באמת יכולים להיות נפלאים והסטטוסים בלינקדאין באמת מעוררים קנאה אבל גם חשש גדול. מעבר לעלות המשמעותית, יש גם את שאלות האבטחה שכתבתי עליהן כבר (למשל בפוסט על כרטיס האשראי) וגם את עניין השליטה. אין לי בעיה לבקש משימות מאייג׳נט שיש לו גישה רק כאשר אני רוצה. אבל מה שמפחיד הוא שגרוק בוט, אינסטינקט וחבריהם רוצים מייל, יומן, כרטיסי אשראי ורצים על מחשב בענן גם כשאתם ישנים.
אבל אפשר להריץ גרוק (או מודלים אחרים) על רספברי פיי ברשת הביתית שיעבדו בדיוק כמו האייג׳נטים העצמאיים אבל לתת לכם את השליטה. זה מעולה למתכנתים שיודעים מה הם עושים ולא נבהלים ממילים כמו secret manager, cron ולבנות את הגארדרייל ושירותים.
כבר כתבתי מה קורה כשסוכן מקבל כרטיס אשראי ואחר כך גם רעיונות. שלושת הדברים המלחיצים הם: גישה למידע פרטי, אפשרות לצאת החוצה ופעולה בלי בן אדם שמורה או שמחליט. נוסיף לזה גם את עניין העלות. אין בקרה או מחירון והרבה פעמים דווקא לפני פעולה חשובה גרוקבוט דורש עוד כסף. אז מה הפתרון? אני מריץ את האייג׳נט על המכונה שלי עם הכלים שלי ועם ההכוונה שלי. ככה אני מסיר את אי הודאות, חוסך הרבה כסף וגם פותח יכולות אחרות שלגרוק בוט ולבוטים אחרים אין.
אני אדגים על גרוק CLI אבל זה יכול לעבוד גם על קלוד כמובן וכל כלי CLI אחר.
גרוק CLI על הרספברי פיי
גרוק CLI הוא תוכנה רגילה. כמו שאפשר להתקין אותה על מק או חלונות אפשר להתקין אותה על רספברי פיי. הכי מצחיק זה שאתם יכולים לתת לגרוק CLI לעשות את זה אם יש לכם גישת SSH לרספברי (אמור להיות). אחרי ההתקנה עושים אותנטיקציה ו… זהו. מתחברים לחשבון, ומכאן יש על המכונה שלכם סוכן. המודל עצמו הוא גרוק (אפשר להחליף אותו) והוא כלול בחבילה של גרוק CLI ורץ בקונטקסט של המכונה. אבל זה לא לפטופ או מחשב אישי אלא מכונה עצמאית.
רק חשוב שאת החיבור הראשוני לחשבון אי אפשר לעשות רק דרך הרספברי פיי כי אין עליו דפדפן. מריצים אותו מה-CLI שלכם במק או בלינוקס או בחלונות (בטרמינל דובר לינוקסית) ככה:
curl -fsSL https://x.ai/cli/install.sh | bash
~/.grok/bin/grok login --device-code
הפקודה מדפיסה כתובת וקוד. פותחים אותם במחשב שיש בו דפדפן, מאשרים, וחוזרים. המתקין שם את התוכנה ב-~/.grok/bin/grok.
עכשיו יש לנו CLI במכונה, אפשר לדבר איתו מאיפה שנוח
לי באופן אישי הכי טוב מהטרמינל ומהאתר. אבל אפשר בכל דרך. כל מה שצריך זה לבקש.
מהטרמינל. נכנסים ב-SSH ומקלידים grok. או שסקריפט קורא לה עם משפט אחד:
~/.grok/bin/grok -p "תסכם את הקובץ הזה בחמש שורות"
מאתר. לפעולות ספציפיות אפשר לבנות אתר קטן שזמין ברשת הפנימית בלבד ומוגן על ידי סיסמה. יש שם חיווי וכפתור וכל מה שצריך לעשות זה ללחוץ ומאחורי הקלעים קורים דברים: פרומפט, פקודות, ווטאבר והתשובה חוזרת לדפדפן. אני אסביר עוד מעט למה זה טוב.
מווטסאפ. בדיוק כמו בבוטים אחרים. מבקשים מגרוק CLI להתחבר לווטסאפ. מחברים גשר. הודעה נכנסת, הסקריפט מריץ את אותה פקודה, והתשובה חוזרת לצ'אט. לגרוק לא משנה מי הקליד. משנה לו הטקסט והגישה שפתחתם לו על המכונה.
סקריפטים וסקריפט לדוגמה
אני אתן דוגמה מפתה, נוסח עדות המשפיענים. סקריפט שבודק כל חשבונית שמגיעה אלי, מעלה אותן לרואה החשבון אבל גם מתריע אם יש עליה בדמי השימוש הקבועים. ממש כמו גרוק בוט. הסקריפט הזה עלה על חשבונית של חברת הגז שניסתה לתקוע לי עלייה בדמי השימוש הקבועים. נכון, זה סכום של 10 שקלים לחודש (עשרים ש״ח לחשבון דו חודשי) אבל 10 שקלים לחודש זה 120 ש״ח בשנה ש… וואלה? מתאים לי שיהיו אצלי. מייל אחד לשירות הלקוחות (המייל לא הופיע באתר, גרוק מצא אותו) שראיתי ואישרתי ונגמר הסיפור. לא רק שהורידו את מה שניסו להעלות, הורידו לפי הממוצע באיזור שלנו שגרוק הביא. כלומר לא רק שנחסכת ממני עבודה ידנית מתישה, גם יש מישהו שבוחן כל חשבונית בשבע עיניים ומכין את המכתב המתאים לשירות הלקוחות.
אז איך עשיתי את זה? זה דרש תכנון ומחשבה אבל התוצאה הסופית היתה גם אפקטיבית מאד במחיר וגם נתנה לי שליטה מלאה בכל שלב ובנוסף גם איפשרה לי לשמור על הססמאות היקרות שלי קרוב לחזה.
אז ברגע שיש לי grok CLI זה אומר שאני יכול להפעיל אותו מסקריפט וזה מעולה. למה? כי עכשיו אני יכול לבנות פייפליינים בקלות על מכונה ולהפעיל אותם לפי דרישה או לפי טריגרים אחרים. למשל, פייפליין של חשבוניות שמופעל כאשר מייל של חשבונית נכנס. אני רוצה קודם כל שהחשבונית תעלה לחשבונית הירוקה ולגוגל דרייב, אחר כך, אני רוצה סריקה של החשבונית לראות ש:
- אין אותיות קטנות של ״בחודש הבא המחיר יעלה בזיליון אחוז״.
- החשבונית תואמת לחשבוניות קודמות שיש לי.
אני יכול לבנות פייפליין גם חסכוני, גם שיעשה בדיוק מה שאני רוצה וגם עם בקרה. במקרה הזה, ההפרדה בכל סקריפט היא בין פעולות דטרמניסטיות לכאלו שלא. מה זה דטרמניסטי? בלי LLM בכלל. סקריפט רגיל. למה זה טוב? כי לסקריפט רגיל אין עלות חוץ מעלות החשמל, אין לו שיקול דעת ואני יודע מצוין מה הפלט שלו.
למשל במקרה של הסקריפט שלי היא קלה. החלק הראשון של שאיבת המיילים של החשבונית, ההעלאה והכל הם דטרמניסטיים. החלק של הניתוח הוא לא.
החלק הדטרמניסטי
יש לי תיבת מייל יעודית לחשבוניות אבל זה יכול להיות גם למייל האישי שלי בתנאי שיש לי פילטר ששם תגיות ל״חשבונית״ לפי כתובת השולח. יכול לחבר את הסקריפט שלי כדי שיבצע משיכה יזומה (נקרא Polling) באמצעות ה-API הרשמי של ג'ימייל. הסקריפט המקומי רץ כל הזמן על הרספברי ופונה ל-API כל פרק זמן מוגדר ויבצע שאילתת חיפוש להודעות המכילות את התגית הספציפית. מוצא? מעולה, שואב את החשבונית. אפשר גם ברגע השאיבה לשנות את התגית ל״חשבונית טופל״. אחרי שהוא שואב את החשבונית, הוא לוקח את ה-PDF ומעלה לחשבונית הירוקה עם ה-API המאד נוח שלהם ולגוגל דרייב. הכל כאן ללא LLM.
בשלב הזה הסקריפט מוריד מהחשבונית הירוקה כמה שילמנו לספק של החשבונית ב-12 החודשים האחרונים.
רגע רגע, מה עם הסודות?
במקרה הזה אצלי הסודות יושבים ב-Bitwarden Secrets Manager, כתבתי עליו בעבר בפרויקט אחד. הפקודה bws run מריצה תהליך ומזריקה לו את כל הפרויקט לסביבה. המפתח נשאר בזיכרון של הסקריפט, לכל אורך הקריאה לשירות, ואז נמחק. הוא לא נכתב לפרומפט (גם אין בשלב הזה), לא ל-JSON שהמודל רואה, ולא ללוג. המודל מקבל את הנתונים. את המפתח הוא לא מקבל.
החלק הלא דטרמניסטי – זה של ה-LLM
המידע נכנס לאן שצריך? הוא כבר זמין. זה הרגע להפעיל את Grok CLI ולבצע את השאילתה. במקרה הזה? שתי שאלות פשוטות:
- האם יש אותיות קטנות?
- האם המחיר של החשבונית תואם למחיר ששילמנו ב-12 החודשים האחרונים?
אני מבקש מהמודל בגדול true או false. זה הכל. לא חפירות. רק כן או לא. אני יכול גם לבקש ממנו הערכת אחוזים (מומלץ לא לתת לו חופש אלא 0,30,60,100 או משהו בסגנון). אני גם משתמש במודל זול יחסית. לא צריך פה reasoning גבוה או מחשבה.
במידה וכן (או למשל בוודאות של מעל 50 אחוז), אז מופעלת פקודה נוספת שמערבת מודל רציני יותר שיבדוק שוב ובמידת הצורך ימצא את המייל של שירות הלקוחות, ינסח מייל עם כל הנתונים (למשל: מספר לקוח, כתובת, המחיר הקודם ששילמנו) שדורש הנחה. בשלב הזה אני מעדיף שלא ישלח לבד אבל בהחלט אפשר להפעיל פרוסס כזה.
שימו לב כמה כסף נחסך פה וכמה כוח יש לי בתהליך הזה. התהליך הדטרמניסטי קורה בלי טעויות ובלי לסמוך על LLM. מי שכתב את כל הקוד שלו ויתחזק אותו במידה ויש תקלות זה אייג׳נט הקידוד שלי. אבל לסקריפט הדטרמניסטי אין שיקול דעת. הטוקנים נשפכים רק איפה שצריך שיקול דעת. בגרוק בוט וחבריהם, ישפכו מלא טוקנים רק על הפעולות שבכלל לא צריך ואז יש חיובים או פריצת מסגרות וחיוב לשדרוג.
הערה: ההבדל בין API ל-CLI
שימו לב לעוד משהו משמעותי: אני לא משתמש פה בגרוק API אלא בגרוק CLI. יש לזה משמעות קריטית
קריאה ל-API של xAI, עם מפתח משלכם, מחויבת לפי טוקנים. זה המחירון. נכון לנובמבר 2026, ל-grok-4.6 ול-grok-4.7, למיליון טוקנים:
| גודל הפרומפט | קלט | פלט |
|---|---|---|
| מתחת ל-200 אלף | $2 | $6 |
| מ-200 אלף ומעלה | $4 | $12 |
מעל 200 אלף כל הבקשה עוברת לתעריף הגבוה, לא רק מה שעבר את הקו. טוקני חשיבה נספרים כפלט, והפלט עולה פי שלושה מהקלט. זה משהו קריטי לזכור.
גרוק CLI שמחובר לחשבון, כמו זה שרץ אצלי על הפיי, לא מוציא חשבונית כזאת. הוא כלול בחבילה. אותם טוקנים נספרים בתוך המכסה של החבילה, לא כשורה נפרדת בכרטיס האשראי.
הערה נוספת: עברית
כולם זוכרים שעברית עולה הרבה יותר טוקנים, נכון? אולי שווה פוסט נפרד. חשוב שההוראות וגם הקלט – איפה שאפשר שיהיה באנגלית. עברית נשארת רק איפה שהנתון עצמו בעברית, למשל שם הספק כמו שהוא כתוב בחשבונית הירוקה.
ומכאן השמים הם הגבול!
נתתי פה דוגמה לסקריפט שלי שעושה בדיוק מה שגרוק בוט עושה אבל בתשלום הרבה יותר נמוך ובשליטה מלאה שלי. אני זה שקובע מתי הוא ירוץ (כל הזמן, פעם ביום). אבל זה ממש לא סקריפט אחד. אלא כמה. אפשר לחבר אליו כל דבר שהמכונה רואה. קובץ, תיקייה, סקריפט, API, שירות ברשת הביתית וגם ווטסאפ אם חיברתם. אפשר להפעיל את זה ביד מהטרמינל, מכפתור באתר, או מהודעה בטלפון.
החבילה כבר כוללת את המודל. הפיי כבר דולק. מה שנשאר הוא תהליך: מה מותר לו לקרוא, איזה סוד הוא לא מקבל, ואיזו תשובה חוזרת בצורה שהקוד יודע לקרוא.
אתן דוגמה נוספת של סקריפט שאני מפעיל… פעם בחודשיים. אבל חוסך לי המון כאב ראש.
דוגמה נוספת: סקריפט בדיקת חשבוניות
בישראל מדווחים מע"מ בזוגות חודשים. ינואר–פברואר, מרץ–אפריל, וכן הלאה. לקראת הדוח אני רוצה לדעת אם החשבונות הקבועים הגיעו: הנהלת חשבונות, חשמל, ארנונה, מים, גז, רמי לוי, 019, תחבורה ציבורית. ארנונה ומים פעם בתקופה. השאר פעמיים. אני עושה את זה עם אתר פנימי שרץ על המכונה של רספברי שמריצה גם את גרוק CLI
אפשר היה לחפש את ההוצאות שמקבלים מהחשבונית הירוקה עם grep. בפועל השם במערכת לא זהה לשם שכתבתם. "בזק-ג'ן" היא חשמל, והיא לא מופיעה ברשימת המילים. "בוקיפרס" ו"הנהלת חשבונות" הן אותו בית עסק. את הספירה הקוד עושה. את הזיהוי שואלים פעם אחת את גרוק.
כל המערכת רצה על אתר אינטרנט פנימי.
הרשימה של ההוצאות הקבועות היא קובץ טקסט. אפשר לערוך אותו גם דרך האתר:
2 | Bookkeeper | בוקיפרס, Bookeepers, הנהלת חשבונות, רואה חשבון
2 | Electricity (Bezeq Energy) | בזק אנרג'י, בזק אנרגי, Bezeq Energy
1 | City tax (Arnona) | ארנונה
1 | Water | מים
2 | Gas | גז
2 | Rami Levy communication | רמי לוי, Rami Levy
2 | 019 | 019
2 | Hop-on | הופאון, הופ און, Hop-on, Hop On
המספר הוא המינימום. מה שאחרי הקו האחרון הוא השמות שהמודל מחפש.
העמוד שולף את ההוצאות מהחשבונית ירוקה. כאן נכנס ביטוורדן כמו בדוגמה הקודמת: מהפרויקט נלקחים רק שני מפתחות, GREEN_INVOICE_API_KEY ו-GREEN_INVOICE_API_SECRET. המפתחות משמשים לקריאה אחת, ואז נמחקים מהזיכרון. החשבונית הירוקה מסננת לפי תאריך דיווח, לא לפי תאריך המסמך, אז את זה הקוד כבר יודע ולא שואלים את המודל.
אופטימיזציה על הקלט
לפני שהנתונים מגיעים לגרוק הם עוברים דיאטה. מסמך הוצאה מלא כולל כתובת, טלפון, מייל ושורות פנימיות. למודל נשארים השדות שאפשר להתאים לפיהם. על טוקנייזר o200k שבו השתמשתי כדי לבצע הערכה, מסמך אחד ירד מ-172 טוקנים ל-70. על שלושים מסמכים, ובעברית, זה מה ששומר על המכסה של החבילה וגם משאיר בחוץ פרטים שאין סיבה לשלוח.
def slim_expense(item: dict) -> dict:
return {
"id": str(_lookup(item, "id") or ""),
"number": str(_lookup(item, "number") or ""),
"date": str(_lookup(item, "date") or ""),
"reportingDate": str(_lookup(item, "reportingDate") or ""),
"supplier": _supplier_name(item),
"description": str(_lookup(item, "description") or ""),
"amount": _lookup(item, "amount"),
"currency": str(_lookup(item, "currency") or ""),
}
ועכשיו יש לי את כל הנתונים לפרומפט. הפרומפט קצר בכוונה. השאלה בשורה הראשונה מכוערת, וזה בסדר. מה שחייב להיות מדויק זה צורת התשובה, כי את הצורה הזו העמוד מפענח לבד לוי ירוק או לאיקס אדום. אין קריאה שנייה למודל כדי לצייר את העמוד.
QUESTION = "Are the required recurring invoices present in the Green Invoice data?"
def build_prompt(start, end, must_have_text, document) -> str:
payload = json.dumps(document, ensure_ascii=False, indent=2)
return (
f"{QUESTION}\n\n"
"This is a bi-monthly tax report. Each must-have line is a recurring "
"expense, and the number is how many times it must appear. Match on "
"supplier and description, using date and reportingDate. Answer only "
"from the JSON in this message.\n\n"
"Write every bill in this exact shape.\n"
"**Label** — N matches, minimum M, meets the minimum.\n"
"- supplier, date, amount\n"
"**Label** — N matches, minimum M, short. Why it is short, on that same line.\n"
"- supplier, date, amount\n"
"End with **Overall: yes.** or **Overall: no.**\n\n"
f"Period: {start.isoformat()} to {end.isoformat()}\n\n"
f"Must-have list:\n{must_have_text.strip()}\n\n"
f"Expenses JSON:\n{payload}\n"
)
זה פלט לדוגמה שמוצג בדף ה-HTML באתר הפנימי והוא יודע לרנדר אותו למשהו שקל לראות. שימו לב כמה הפלט רזה ומסכן.
**Electricity (Bezeq Energy)** — 1 match, minimum 2, short. Only one bill is in the period.
- בזק אנרג'י, 2026-08-19, 1300 ILS
**City tax (Arnona)** — 1 match, minimum 1, meets the minimum.
- עירייה, 2026-08-04, 900 ILS
**Overall: no.**
העמוד מריץ את ה-CLI פעם אחת, בלי כלים, בלי חשיבה. זול ממש. למרות שאני משתמש ב-grok CLI, אני עדיין לא צריך אותו חזק. לא לשכוח שגם ל-CLI יש מגבלת שימוש. התשובה המבוקשת היא ספירה, לא מחקר.
subprocess.Popen(
[
str(grok_bin),
"--prompt-file", prompt_file.name,
"--verbatim",
"--no-plan",
"--disable-web-search",
"--no-subagents",
"--reasoning-effort", "low",
"--max-turns", "1",
"--disallowed-tools", DISALLOWED_TOOLS,
"--output-format", "plain",
],
start_new_session=True,
)
התשובה נשמרת לקובץ. רענון של העמוד קורא את הקובץ ומצייר את הוי ואת האיקס. גרוק נקרא שוב רק כשלוחצים על בדיקה.
זה התהליך כולו. קובץ של חשבונות, שני מפתחות מביטוורדן, JSON רזה, פרומפט אחד, ותשובה שהעמוד יודע להציג. את אותו דפוס אפשר לשים על כל דבר אחר בבית: מהטרמינל, מכפתור, או מהודעה בווטסאפ.
וככה זה גם לפרוססים אחרים. אבל אני בשליטה מלאה על התהליך ואני בחבילה הבסיסית של גרוק, כן?
סיכום
כשמדברים על לדעת לעבוד עם AI, הכוונה היא לאו דווקא להשתמש בכלים הכי יקרים ולשפוך ערימות של כסף כדי לכתוב פוסט בלינקדאין. כל אחד יכול לבקש מגרוקבוט לבדוק לו את החשבוניות ואז לקבל חשבון של 1200 ש״ח בסוף התהליך. או לחלופין לקבל תוצאות לא אחידות או (הכי גרוע) לחשוש ולהיות מופתע בגלל סודות וססמאות שנתנו לבוט. פה הכל בשליטה מלאה שלי ואני יכול לשנות את מה שבא לי. כולל את סוג המודל. כמו למשל להשתמש במודלים אחרים כולל מקומיים וכולל כאלו שאין להם גארדריילס.
וכמובן שכמו כל דבר בחיים. יש מינוסים: צריך לתחזק את הסקריפט הדטרמניסטי. לפעמים יש שינויים קלים בשם השולח למשל, או שהחשבונית פתאום לא מצורפת למייל אלא צריך להוריד אותה בקישור ושאר שינויים קלים. אבל הקוד היום הוא זול.







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