אופרטור הוא צומת שמבצע פעולה דטרמיניסטית: ללא LLM, ללא אקראיות. לכל קלט נתון, הפלט הוא צפוי.
מדוע להשתמש בהם
כל לוגיקה שניתן לכתוב במפורש חייבת להיות כתובה כך. LLM שמחשב סכום או מעצב תאריך הוא anti-pattern: הוא איטי יותר, יקר יותר, ועלול לטעות.
כלל מעשי: אם אתם יודעים לכתוב את הפונקציה ב-5 שורות Python, זה אופרטור — לא agent.
סוגים זמינים
webhook_action (קריאת HTTP)
מבצע קריאת HTTP יוצאת. תצורה:
- URL, method, headers ופרמטרי שאילתה (עם placeholders מהקונטקסט)
- Body:
none,json,form,raw,multipart, אוmapper(body שמורכב על ידי שפת המיפוי, ראו להלן) - אימות:
bearer,basic,api_key_header(header מותאם) אוoauth2(ראו להלן) - סטטוסי HTTP מקובלים, זמן המתנה מרבי, ומספר ניסיונות חוזרים (
retry_count, 0 כברירת מחדל, backoff מעריכי) - מפתח הפלט שאליו התגובה מתפרסמת
database_query / database_manage
database_query קורא שורות מבסיס no-code של betool או מבסיס חיצוני (Postgres, MySQL, MongoDB) הרשום ב-יישומים ← מסדי נתונים ← חיבורים: סינון where, חיפוש טקסט מלא, הגבלה. database_manage כותב אליו (create או update), כשהתוכן מורכב על ידי שפת המיפוי.
file_transform
ממיר קובץ. Transformers מסופקים:
pdf_extract_text— טקסט הניתן לבחירה מתוך PDF (ללא OCR: PDF סרוק אינו מחזיר טקסט)pdf_split— פיצול PDFpdf_to_images— רינדור עמודי PDF כתמונותxlsx_to_json/xls_to_json— קריאת חוברת Excel כשורות JSONunzip— חילוץ ארכיון
file_link (קישורי הורדה)
מוסר קבצים לצד שלישי באמצעות קישור, בלי להכניס את תוכנם לזרימה: עבור כל קובץ ברשימה מהקונטקסט (קבצי הורדה, קבצים מצורפים שהתקבלו, התמונות של ביקורת…), הצומת קישורי הורדה מפיק קישור הורדה חתום בעל תוקף מוגבל. שלב הבא מרכיב את מה שהנמען מקבל: תגובה של webhook נכנס, אימייל…
| הגדרה | תפקיד |
|---|---|
רשימת הקבצים לקישור (input_path) | היכן לקרוא את הרשימה בזרימה — כל רשומה נושאת path (מפתח הקובץ באחסון הארגון) ואופציונלית שם קובץ. חובה. |
תיקיות משנה מותרות (path_scope) | אופציונלי: מגביל את הקבצים הניתנים לחתימה לתיקיות משנה מסוימות באחסון הארגון. |
| תוקף הקישורים | 15 דקות כברירת מחדל, מדקה אחת עד 24 שעות. |
מספר קבצים מרבי (max_files) | 20 כברירת מחדל, 100 לכל היותר. |
מפתח פלט (output_key) | ברירת מחדל linked.files. |
הפלט מכיל files (כל רשומה מקורית, מועשרת ב-url וב-expires_at), file_count, failed, requested ו-ttl_seconds.
- לעולם לא מחוץ לארגון שלכם: קובץ מחוץ לאחסון שלו נדחה.
- הקיום נבדק לפני החתימה: קובץ חסר לעולם אינו נחתם.
- שום דבר לא מושמט: קובץ שלא קושר (מחוץ לתחום, לא נמצא, מעבר לתקרה, חתימה בלתי אפשרית) מופיע ב-
failedעם הסיבה. - הקישורים נוצרים מחדש בכל ביצוע, וכל קישור שהונפק מתועד ביומן.
הקישור הוא קישור נושא (bearer): כל מי שמחזיק בו מוריד את הקובץ עד שתוקפו פג. שמרו על תוקף קצר, ומלאו את תיקיות המשנה המותרות ברגע שהרשימה מגיעה מנתון שניתן לשנותו (שורה בטבלה) — אחרת כל מי שיכול לכתוב את הנתון הזה יוכל לגרום לחתימת קישור לכל קובץ של הארגון.
compute
חישובים דטרמיניסטיים על נתוני הקונטקסט. פעולות מסופקות:
column_stats— לכל עמודה ברשימת שורות, כמה מהן שוות לערך נתון (count,total,pct)compose_text— הרכבת טקסט מתבנית ומערכים בזרימהregex_extract— חילוץ ערכים באמצעות ביטוי רגולריselect_by_substring— חלוקת רשימה לקבוצות לפי פרדיקטים «מכיל / אינו מכיל»list_compare— עקביות של מספר רשימות לפי מפתח צירmulti_source_compliance— ביקורת התאמה רב-ממדית ומרובת מקורותcontact_extract— כתובות אימייל ומספרי טלפון שנמצאו בטקסט, עם מקורםfree_slots— חלונות זמן פנויים המוסקים מתקופות תפוסותurl_expand— הרכבת URL מבסיסים ונתיבים
שפת מיפוי
זה אינו צומת: זו השפה שמרכיבה payload פלט מנתוני הקונטקסט (פונקציות $now, $uuid, $concat…). היא משמשת ל-body mapper של webhook_action, לתוכן שנכתב על ידי database_manage ולמשתנים של שיחה יוצאת phone_call.
data_to_file
מפיק קובץ Excel (.xlsx) מנתוני הקונטקסט — רשימת שורות, טבלה, או מספר רשימות (גיליון לכל אחת). אפשרויות: שם הקובץ (ניתן ל-templating), שם הגיליון, בחירת העמודות וסדרן, שורת כותרת. הקובץ נשמר באחסון של הארגון שלכם, מוכן לשליחה באימייל או להעלאה ל-Drive.
מטעמי אבטחה, תאים שמתחילים ב-=, +, - או @ נכתבים כטקסט כברירת מחדל (ללא הזרקת נוסחה). כאשר מגבלות Excel מחייבות חיתוך, הקובץ מסומן כקטוע.
web_fetch
קורא דף אינטרנט אחד או יותר ומפרסם את הטקסט הקריא שלהם בקונטקסט (ברירת מחדל web.pages). הגדרות: מספר דפים, מקביליות, זמן קצוב, גודל מקסימלי. פסיקת robots.txt מחושבת ומדווחת תמיד; היא מוחלת רק אם הפעלתם אותה (respect_robots).
דפים המרונדרים אך ורק באמצעות JavaScript אינם מורצים: רק ה-HTML המוגש נקרא. דף שנכשל מדווח בתוצאה, מבלי להכשיל את ה-pipeline.
בצד ה-agent, שני tools מקבילים:
web_scrape.fetch_page— קורא דף (כותרת, טקסט, קישורי אימייל וטלפון שנמצאו).web_search.search— חיפוש ברשת דרך מנוע SearXNG המתארח בפלטפורמה עצמה: עד 5 תוצאות (כותרת, URL, תקציר).
כל קריאות הרשת עוברות דרך אותה הגנת anti-SSRF: כתובות פנימיות, פרטיות וכתובות metadata של ענן נדחות לאחר רזולוציית DNS, והפניות נבדקות מחדש בכל קפיצה.
code_step
כאשר לוגיקה דטרמיניסטית חורגת ממה ש-compute יכול לעשות, שלב קוד מבצע קוד מותאם ב-sandbox של Starlark — ניתן לעריכה ישירה, מורץ מרגע השמירה, ותחום ב-allowlist של tools. ראו שלבי קוד.
אימות וסודות
אופרטורים שמתחברים למערכת חיצונית (HTTP, DB) מפנים לחשבון הרשום בארגון. ה-credentials אינם גלויים ב-pipeline עצמו — רק שם חשבון.
כתוצאה מכך: שינוי סיסמה אינו מצריך עריכה מחדש של כל pipeline.
כאשר סוד מוזן ישירות בצומת (טוקן bearer, סיסמת basic או ערך api_key_header של webhook_action, סיסמה של PDF או ארכיון מוצפנים עבור file_transform), הוא מוסתר מרגע שמירתו: העורך, ה-API וכלי ה-MCP מציגים רק סמן. ראו העורך החזותי, סעיף סודות.
OAuth2 יוצא (client_credentials)
עבור APIs שדורשים אסימון OAuth2 (ענן ארגוני, ERP, ספקים צד שלישי), operator HTTP תומך במצב oauth2. אתם רושמים credential OAuth2 בארגון — token_url, client_id, client_secret, scope — והצומת מפנה אליו רק עם מזהה שאינו סודי.
בזמן הקריאה, betool מקבל אסימון ומשתמש בו כל עוד הוא תקף; הוא מרענן אותו באופן עצלני עם פקיעתו, ללא משימת רקע. ה-client_secret אינו מוחזר בקריאה על-ידי API הניהול (רק אינדיקטור יש סוד נחשף), והאסימון שמתקבל מוצב ב-Authorization: Bearer … על הבקשה היוצאת.
שינוי הסוד לאחר rotation בצד הספק אינו מצריך עריכה מחדש של pipeline: הקריאה הבאה מרעננת אוטומטית.
אידמפוטנטיות
כל אופרטור שמייצר תופעת לוואי (POST HTTP, INSERT DB, שליחת אימייל) חייב להיות אידמפוטנטי בצד היעד. פרקטיקה מומלצת:
- לכלול
idempotency_keyב-payload (בדרך כללexchange_id). - לבדוק בצד היעד האם המפתח כבר טופל.
מלבד הניסיונות החוזרים שאתם מגדירים במפורש ב-webhook_action (retry_count), betool אינו מנסה מחדש אוטומטית אופרטור שנכשל: על ה-pipeline שלכם לתזמר את אסטרטגיית ה-retry. בנוסף, webhook_action מוגן מפני שליחה כפולה בעת re-dispatch פנימי: בקשה שכבר נמסרה עם סטטוס מקובל אינה נשלחת שוב.