ספריית סקריפטים
סקריפטים ואוטומציות מוכנים — workflows ל-n8n, קוד Python לקריאת מודלים ו-RAG, ופקודות Shell. העתק, הורד, והרץ אצלך. הכל בחינם.
איך משתמשים
כל סקריפט ניתן להעתקה או להורדה כקובץ מוכן (.json / .py / .sh).
החלף YOUR_API_KEY ופרטים בסוגריים [כך] בשלך.
workflows של n8n מייבאים דרך Import from File; Python/Shell מריצים ישירות.
OPENAI_API_KEY) או בקובץ .env. מזהי המודלים בדוגמאות נכונים לאוגוסט 2026 וייתכן שיתעדכנו.
מה יש כאן ומה אין
שמונה סקריפטים שרצים כמו שהם אחרי שמחליפים מפתח ופרטים בסוגריים. הם נבחרו לפי מה שחוזר הכי הרבה בשאלות ולא לפי מה שמרשים: קריאה בסיסית למודל, עיבוד תיקייה שלמה, שאלה על מסמכים, זרימה שמגיבה לאירוע, ומשהו מתוזמן. אם אתם בונים משהו ראשון, סביר שהוא אחד מאלה או צירוף של שניים.
ומה שאין כאן במכוון: קוד מוכן לייצור. אין טיפול מלא בשגיאות, אין ניסיונות חוזרים מבוקרים, ואין תיעוד. זה לא חיסרון — סקריפט של עשר שורות שמוכיח שהרעיון עובד שווה יותר ממאה שורות שמטפלות במקרי קצה של משהו שעוד לא ידוע אם צריך אותו. מה להוסיף כשמגיעים לשם מפורט בהמשך העמוד.
איזה סקריפט לקחת
שלוש השפות כאן אינן מתחרות — הן מתאימות למצבים שונים, וההחלטה הנכונה חוסכת שעות:
- n8n — כשהתהליך מחבר בין כמה מערכות ומישהו שאינו מפתח צריך להיות מסוגל לראות אותו ולשנות אותו. גם כשהוא צריך לרוץ מתוזמן בלי שרת משלכם.
- Python — כשיש לוגיקה אמיתית, עיבוד קבצים, או משהו שצריך להשתלב בקוד קיים. כמעט תמיד גם הדרך המהירה ביותר לבדוק רעיון.
- Shell — לבדיקה חד-פעמית ולאבחון. לא לבנות עליו מערכת.
וההמלצה שחוסכת את רוב הטעויות: התחילו בפייתון גם אם הסוף יהיה ב-n8n. קל בהרבה להבין למה משהו לא עובד בעשר שורות קוד מאשר בתוך זרימה ויזואלית, ואחרי שהלוגיקה ברורה ההעברה מהירה.
מפתחות, סודות, וטעות אחת שעולה כסף
כל סקריפט כאן צריך מפתח API, וזה המקום שבו הכי קל לעשות נזק אמיתי. מפתח הוא סיסמה עם חיוב מצורף — מי שמשיג אותו יכול להריץ על החשבון שלכם עד שתשימו לב.
- אף פעם לא בתוך הקוד. משתנה סביבה או קובץ
.envשאינו נכנס ל-git. הסקריפטים כאן כתובים כך בכוונה. - לא בהיסטוריית השל. פקודת
curlעם המפתח בתוכה נשמרת בקובץ ההיסטוריה ונשארת שם. - לא בצילום מסך ולא בהדבקה לצ׳אט. זו הדרך הנפוצה ביותר שבה מפתחות דולפים, והיא לא דורשת שום תוקף.
- מפתח נפרד לכל שימוש, עם תקרת הוצאה. כמעט כל ספק מאפשר להגדיר מגבלה חודשית. חמש דקות עכשיו מול חשבון מפתיע בעוד חודש.
ואם מפתח כבר דלף — לבטל אותו אצל הספק, לא רק למחוק מהקוד. מפתח שנמחק מקובץ וממשיך להיות תקף הוא מפתח פעיל בידי מי שראה אותו.
n8n Workflows
{
"name": "Webhook to AI Reply",
"nodes": [
{ "parameters": { "httpMethod": "POST", "path": "ai-reply" },
"name": "Webhook", "type": "n8n-nodes-base.webhook",
"typeVersion": 1, "position": [400, 300] },
{ "parameters": { "url": "https://api.openai.com/v1/chat/completions",
"method": "POST", "sendHeaders": true,
"headerParameters": { "parameters": [
{ "name": "Authorization", "value": "Bearer YOUR_API_KEY" },
{ "name": "Content-Type", "value": "application/json" } ] },
"sendBody": true, "specifyBody": "json",
"jsonBody": "={\"model\":\"gpt-5.6\",\"messages\":[{\"role\":\"user\",\"content\":$json.body.message}]}" },
"name": "OpenAI", "type": "n8n-nodes-base.httpRequest",
"typeVersion": 4, "position": [640, 300] },
{ "parameters": { "respondWith": "json",
"responseBody": "={{ $json.choices[0].message.content }}" },
"name": "Respond", "type": "n8n-nodes-base.respondToWebhook",
"typeVersion": 1, "position": [880, 300] }
],
"connections": {
"Webhook": { "main": [[{ "node": "OpenAI", "type": "main", "index": 0 }]] },
"OpenAI": { "main": [[{ "node": "Respond", "type": "main", "index": 0 }]] }
}
}
מתי זה מתאים: כשמשהו חיצוני צריך לקבל תשובה מ-AI — טופס באתר, אפליקציה, או מערכת אחרת שיודעת לשלוח בקשת HTTP. זו הזרימה הבסיסית ביותר, וכמעט כל דבר מורכב יותר מתחיל ממנה.
מה לשנות: את path (הכתובת שתיווצר), את מזהה המודל, ואת הנחיית המערכת — כרגע אין כזו, ושווה להוסיף אחת שמגדירה טון ושפה.
איפה זה נשבר: ה-webhook פתוח לכל מי שיודע את הכתובת. לפני שמחברים אותו למשהו אמיתי — הוסיפו בדיקת טוקן בכותרת, והגבילו קצב. אחרת מישהו יריץ לכם את החשבון.
{
"name": "Daily Digest to Email",
"nodes": [
{ "parameters": { "rule": { "interval": [{ "field": "cronExpression", "expression": "0 8 * * *" }] } },
"name": "Every day 08:00", "type": "n8n-nodes-base.scheduleTrigger",
"typeVersion": 1, "position": [400, 300] },
{ "parameters": { "url": "[YOUR_DATA_SOURCE_URL]" },
"name": "Fetch Data", "type": "n8n-nodes-base.httpRequest",
"typeVersion": 4, "position": [640, 300] },
{ "parameters": { "url": "https://api.openai.com/v1/chat/completions",
"method": "POST", "sendHeaders": true,
"headerParameters": { "parameters": [
{ "name": "Authorization", "value": "Bearer YOUR_API_KEY" } ] },
"sendBody": true, "specifyBody": "json",
"jsonBody": "={\"model\":\"gpt-5.6\",\"messages\":[{\"role\":\"user\",\"content\":\"סכם ל-5 נקודות: \"+ $json.data}]}" },
"name": "Summarize", "type": "n8n-nodes-base.httpRequest",
"typeVersion": 4, "position": [880, 300] },
{ "parameters": { "toEmail": "[YOUR_EMAIL]", "subject": "סיכום יומי",
"text": "={{ $json.choices[0].message.content }}" },
"name": "Send Email", "type": "n8n-nodes-base.emailSend",
"typeVersion": 2, "position": [1120, 300] }
],
"connections": {
"Every day 08:00": { "main": [[{ "node": "Fetch Data", "type": "main", "index": 0 }]] },
"Fetch Data": { "main": [[{ "node": "Summarize", "type": "main", "index": 0 }]] },
"Summarize": { "main": [[{ "node": "Send Email", "type": "main", "index": 0 }]] }
}
}
מתי זה מתאים: נקודת הפתיחה לכל דבר בפייתון. אם אתם בודקים רעיון — התחילו כאן, לא בפריימוורק.
מה לשנות: את הנחיית המערכת ואת הבקשה. שימו לב שהמפתח נקרא ממשתנה סביבה ולא כתוב בקוד — כך זה צריך להישאר.
איפה זה נשבר: הקוד הזה מניח שהקריאה מצליחה. בשימוש אמיתי הוסיפו try/except, תקרת ניסיונות חוזרים, וטיפול במקרה שהתשובה נקטעה כי נגמרו הטוקנים — שנראה בלוג כמו תשובה קצרה ולא כמו תקלה.
מתי זה מתאים: לכל דיווח תקופתי שמישהו מייצר ידנית — סיכום פניות, מה קרה אתמול במערכת, ליקוט נתונים ממקור אחד למייל אחד.
מה לשנות: את שעת התזמון, את מקור הנתונים, ואת נמען המייל. ובעיקר — את ההנחיה, כי סיכום טוב תלוי בה הרבה יותר מאשר במודל.
איפה זה נשבר: תזמון רץ גם כשאין מה לדווח, ואז מגיע מייל ריק כל בוקר עד שמפסיקים לקרוא אותו. הוסיפו תנאי שמדלג כשאין נתונים. ושימו לב שהגדרת "ימי עסקים" ברוב הכלים היא שני עד שישי — בישראל זה צריך תיקון ידני.
Python — AI
# pip install openai | export OPENAI_API_KEY="sk-..."
from openai import OpenAI
client = OpenAI() # reads OPENAI_API_KEY from env
resp = client.chat.completions.create(
model="gpt-5.6",
messages=[
{"role": "system", "content": "ענה בעברית, תמציתי."},
{"role": "user", "content": "[הבקשה שלך כאן]"},
],
)
print(resp.choices[0].message.content)
מתי זה מתאים: כשיש תיקייה של קבצים שצריך לעבור על כולם — לסווג, לחלץ שדות, לסכם. זה הדפוס שמחזיר הכי הרבה ערך בעסק קטן.
מה לשנות: את הנתיב, את סוג הקבצים, ואת מה שמבקשים מכל קובץ.
איפה זה נשבר: שלושה דברים, וכולם בגלל שזה רץ בלולאה. עלות — מאה קבצים הם מאה קריאות, חשבו את זה לפני שמריצים על אלף. קובץ אחד שנכשל מפיל את כולם, אלא אם תפסתם שגיאה בתוך הלולאה והמשכתם. ואין המשכיות — אם זה נופל באמצע, ההרצה הבאה מתחילה מההתחלה. שמרו מה כבר עובד.
מתי זה מתאים: אותו תפקיד, ספק אחר. שווה להכיר את שניהם כי המעבר ביניהם הוא שאלה של כמה שורות, וזה מה שמונע נעילה לספק אחד.
מה לשנות: מזהה המודל ו-max_tokens, שכאן הוא פרמטר חובה ולא ברירת מחדל.
שווה לדעת: הנחיית המערכת עוברת כפרמטר נפרד ולא כהודעה ברשימה. זה ההבדל המעשי הראשון שנתקלים בו כשמעבירים קוד בין הספקים.
# pip install anthropic | export ANTHROPIC_API_KEY="sk-ant-..."
import anthropic
client = anthropic.Anthropic()
msg = client.messages.create(
model="claude-sonnet-4-6",
max_tokens=1024,
messages=[{"role": "user", "content": "[הבקשה שלך כאן]"}],
)
print(msg.content[0].text)
מתי זה מתאים: כשהתוכן לא אמור לעזוב את המחשב, או כשרוצים לנסות בלי לשלם. זו גם הדרך המהירה ביותר להבין מה מודל קטן מסוגל לעשות.
מה לשנות: את שם המודל וגודלו, לפי הזיכרון שיש לכם.
שווה לדעת: Ollama חושף API תואם-OpenAI, כך שקוד שכתבתם מול ספק בענן עובר אליו בשינוי כתובת בלבד. זו הדרך הנכונה להשוות — אותו מערך שאלות, שתי כתובות. ובעברית שווה לבדוק לפני שמתחייבים: הפער בין מודל מקומי לענן גדול כאן יותר מאשר באנגלית.
מתי זה מתאים: כשרוצים לשאול שאלות על מסמכים שלכם והתשובות חייבות לבוא מהם ולא מהידע הכללי של המודל.
מה לשנות: את מקור המסמכים, את גודל הקטעים, ואת מספר הקטעים שנשלפים.
איפה זה נשבר: כמעט תמיד בשליפה ולא במודל. אם התשובה גרועה, בדקו קודם אם הקטע הנכון בכלל נשלף — לרוב מתברר שלא, והאשם הוא החלוקה לקטעים. ההרחבה: RAG וRAG מתקדם.
# עיבוד כל קובצי הטקסט בתיקייה עם מודל זול
import os, glob
from openai import OpenAI
client = OpenAI()
for path in glob.glob("input/*.txt"):
text = open(path, encoding="utf-8").read()
resp = client.chat.completions.create(
model="gpt-5.6", # לנפח גדול שקול מודל זול יותר
messages=[{"role": "user", "content": f"סכם ב-3 נקודות:\n{text}"}],
)
out = path.replace("input/", "output/")
os.makedirs("output", exist_ok=True)
open(out, "w", encoding="utf-8").write(resp.choices[0].message.content)
print("done:", out)
מתי זה מתאים: לבדיקה מהירה שהמפתח עובד ושהחיבור תקין, בלי להתקין כלום. זה גם הכלי הראשון לאבחון כשמשהו עובד אצל חבר ולא אצלכם.
מה לשנות: את המודל ואת תוכן ההודעה. את המפתח קחו ממשתנה סביבה — $OPENAI_API_KEY — ולא כטקסט בפקודה, אחרת הוא נשמר בהיסטוריית השל.
איפה זה נשבר: קוד תשובה 401 הוא מפתח שגוי, 429 הוא חריגה ממכסה או מקצב, ו-400 הוא בדרך כלל JSON לא תקין בגוף הבקשה — לרוב מרכאות בעברית שנדבקו מעורך טקסט.
# RAG מינימלי: embed -> retrieve -> answer
from openai import OpenAI
import numpy as np
client = OpenAI()
docs = ["[מסמך 1]", "[מסמך 2]", "[מסמך 3]"]
def embed(texts):
r = client.embeddings.create(model="text-embedding-3-small", input=texts)
return np.array([e.embedding for e in r.data])
doc_vecs = embed(docs)
def ask(question):
q = embed([question])[0]
sims = doc_vecs @ q
top = docs[int(sims.argmax())] # הקטע הרלוונטי ביותר
r = client.chat.completions.create(
model="gpt-5.6",
messages=[{"role": "system", "content": f"ענה רק לפי:\n{top}\nאם אין תשובה - אמור 'לא יודע'."},
{"role": "user", "content": question}],
)
return r.choices[0].message.content
print(ask("[השאלה שלך]"))
Shell / CLI
# התקן Ollama מ- https://ollama.com , ואז:
ollama run qwen3 # צ'אט אינטראקטיבי, רץ מקומית בחינם
# או דרך ה-API המקומי (פורט 11434):
curl http://localhost:11434/api/generate -d '{
"model": "qwen3",
"prompt": "כתוב פונקציית Python שמחזירה מספרי פיבונאצ׳י",
"stream": false
}'
export OPENAI_API_KEY="sk-..."
curl https://api.openai.com/v1/chat/completions \
-H "Authorization: Bearer $OPENAI_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "gpt-5.6",
"messages": [{"role": "user", "content": "[הבקשה שלך]"}]
}'
לחבר בין הסקריפטים
הסקריפטים כאן בודדים בכוונה, אבל רוב מה ששימושי באמת הוא שילוב של שניים-שלושה. ארבעה צירופים שחוזרים:
- אצווה + פלט מובנה. לעבור על תיקיית חשבוניות ולהוציא מכל אחת שדות לטבלה. זה הצירוף שמחזיר הכי הרבה ערך בעסק קטן, והוא שני סקריפטים במקום אחד.
- Webhook + RAG. טופס באתר ששואל שאלה, והתשובה מגיעה מהמסמכים שלכם ולא מהידע הכללי של המודל. זה בוט התמיכה בגרסתו המינימלית.
- מתוזמן + סיכום. לאסוף מה שהצטבר ביממה ולשלוח דוח אחד. הכי קל להקים והכי מהר מוכיח את עצמו.
- מודל מקומי + אצווה. כשיש הרבה קבצים והתוכן רגיש — אין תשלום לכל קריאה, והתוכן לא עוזב את המכונה.
וכשמחברים, יש כלל אחד ששווה לאמץ מההתחלה: שלב אחד, אחריות אחת. סקריפט שקורא קבצים, שולח למודל, מנרמל תאריכים וכותב למסד נתונים הוא סקריפט שאי אפשר לאבחן כשהוא נכשל. ארבעה שלבים נפרדים שמעבירים נתונים ביניהם לוקחים אותו זמן לכתוב ופי כמה פחות זמן לתקן.
מה ללמוד אחרי שהריצו
הסקריפטים האלה מכסים את השלב שבו מבינים שזה עובד. מכאן, שלושה כיוונים לפי מה שנתקלתם בו:
- התשובות לא מדויקות מספיק — הבעיה כמעט תמיד בשליפה ולא במודל. המשך בRAG.
- רוצים שהמערכת גם תבצע ולא רק תענה — Tool Use, ואחריו סוכני AI.
- עובד אבל אין דרך לדעת אם שינוי שיפר — Evals. זה השלב שהכי קל לדחות והכי מהר מחזיר.
לחשב כמה זה יעלה, לפני שמריצים
הסקריפטים כאן זולים להרצה בודדת ולא זולים בלולאה, וההפרש מתגלה מאוחר. חשבון גס לפני הרצה ראשונה על נפח אמיתי שווה יותר מכל אופטימיזציה אחר כך:
- ספרו קריאות, לא קבצים. מאה קבצים עם שני שלבים כל אחד הם מאתיים קריאות. סקריפט שמנסה שוב פעמיים בכישלון יכול להגיע לשלוש מאות.
- הכניסה עולה יותר מהיציאה. לא לטוקן, אלא בסך הכול — התשובה קצרה וההקשר ארוך. לכן קיצור ההנחיה או צמצום הטקסט שנשלח משפיעים הרבה יותר מהגבלת אורך התשובה.
- בעברית המספר גבוה יותר. אותו תוכן נשבר ליותר טוקנים, כך שהערכה שנעשתה לפי מספר מילים תצא נמוכה מדי.
- הריצו על עשרה פריטים קודם. תראו את העלות בפועל בלוח הבקרה של הספק, הכפילו, ורק אז הריצו על הכול.
ושתי דרכים פשוטות להוזיל בלי לוותר על כלום: מודל קטן יותר לשלבים הקלים — סיווג וחילוץ שדות לא צריכים את המודל החזק ביותר — ומטמון על קלט חוזר, שבעיבוד אצווה על קבצים דומים חוסך יותר משנדמה.
כשזה לא עובד — סדר בדיקה
רוב התקלות בסקריפטים האלה הן אחת מחמש, והן מסודרות כאן מהנפוצה לנדירה:
- 401 או "invalid api key". המפתח לא נטען. בדקו שמשתנה הסביבה באמת קיים בטרמינל שממנו אתם מריצים — לא זה שהגדרתם בחלון אחר.
- 429. חריגה ממכסה או מקצב. אם זה בלולאה, הוסיפו השהיה קצרה בין קריאות; אם זה מיד בקריאה הראשונה, בדקו יתרה בחשבון.
- 400. כמעט תמיד JSON לא תקין — ולרוב מרכאות טיפוגרפיות שנדבקו מעורך טקסט, או תו בעברית בתוך מחרוזת שלא קודדה נכון.
- התשובה נקטעת באמצע. נגמרו הטוקנים. זה נראה בפלט כמו תשובה קצרה ולא כמו שגיאה, ולכן קל לפספס — בדקו את סיבת הסיום ולא רק את התוכן.
- עובד אצל מישהו אחר ולא אצלכם. גרסת ספרייה. הצמידו גרסאות בקובץ דרישות במקום להתקין את האחרונה.
והכלל שמעל כולם: הדפיסו את מה שאתם שולחים בפועל, לא את מה שהתכוונתם לשלוח. ברוב המקרים ההבדל בין השניים הוא כל התקלה.
איך להפוך סקריפט למשהו שאפשר להפעיל
כל מה שכאן הוא נקודת פתיחה שרצה, ולא קוד מוכן לייצור. ההבדל הוא ארבעה דברים, ואפשר להוסיף אותם בסדר הזה:
- טיפול בשגיאות. כל קריאה לרשת נכשלת לפעמים. תפסו את השגיאה, החזירו אותה כתוצאה ולא כקריסה, והגבילו את מספר הניסיונות החוזרים — אחרת קלט בעייתי אחד שורף תקציב בלולאה.
- פלט מובנה. אם התשובה נכנסת לשלב הבא ולא לעיני אדם, בקשו JSON עם סכמה ולא טקסט חופשי. ואז זכרו את הכלל: סכמה מבטיחה צורה, לא אמת — בדיקת סבירות על הערכים נשארת באחריותכם.
- תיעוד. לשמור מה נשלח ומה חזר, לא רק שהקריאה בוצעה. כשמשהו ייצא שגוי, זה יהיה ההבדל בין חקירה של דקה לחקירה של יום.
- אישור אנושי על מה שלא הפיך. לשלוח, למחוק, לחייב. בגרסה הראשונה שיעצור ויציג — לא שיבצע.
מה שונה כשהתוכן בעברית
רוב הסקריפטים בתחום נכתבו ונבדקו על אנגלית, וארבעה דברים מתנהגים אחרת:
- אותו טקסט נשבר ליותר טוקנים. העלות גבוהה יותר ממה שחישוב לפי מילים מראה, וחלון ההקשר מתמלא מהר יותר. בעיבוד אצווה זה מצטבר.
- קידוד. בפייתון פתחו קבצים עם
encoding="utf-8"במפורש; ברירת המחדל של המערכת עלולה להיות אחרת ולהפוך טקסט לג׳יבריש בשקט. - מרכאות מעורכי טקסט. הדבקה של JSON מ-Word או ממסמך עברי מביאה איתה מרכאות טיפוגרפיות שנראות זהות ושוברות את הבקשה. זו הסיבה הנפוצה ביותר לשגיאה 400 שנראית בלתי מוסברת.
- הנחיה מפורשת לשפה. בלי שורה שאומרת "ענה בעברית", מודל שקיבל שאלה קצרה בעברית עלול לענות באנגלית.
ופרט אחרון על מזהי המודלים בדוגמאות: הם מתיישנים. בקוד אמיתי קחו אותם ממשתנה סביבה במקום לקבע אותם, כך שהחלפת מודל תהיה שינוי הגדרה ולא מסע בין קבצים.
רוצה יותר?
הספרייה מתעדכנת דו-שבועית עם סקריפטים חדשים. את הפרומפטים תמצא בספריית הפרומפטים, ואת ההסבר המלא במדריך n8n.