תיעוד

אופרטורים דטרמיניסטיים

צמתי פעולה שאינם עוברים דרך LLM — HTTP, DB, טרנספורמציות, חישובים — כולל ניהול סודות ואידמפוטנטיות.

אופרטור הוא צומת שמבצע פעולה דטרמיניסטית: ללא 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 — פיצול PDF
  • pdf_to_images — רינדור עמודי PDF כתמונות
  • xlsx_to_json / xls_to_json — קריאת חוברת Excel כשורות JSON
  • unzip — חילוץ ארכיון

מוסר קבצים לצד שלישי באמצעות קישור, בלי להכניס את תוכנם לזרימה: עבור כל קובץ ברשימה מהקונטקסט (קבצי הורדה, קבצים מצורפים שהתקבלו, התמונות של ביקורת…), הצומת קישורי הורדה מפיק קישור הורדה חתום בעל תוקף מוגבל. שלב הבא מרכיב את מה שהנמען מקבל: תגובה של 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 פנימי: בקשה שכבר נמסרה עם סטטוס מקובל אינה נשלחת שוב.