Install
$ agentstack add skill-squadcodercom-squadcoder-hebrew-chatbot-builder ✓ scanned · ✓ verified, works with Claude Code, Cursor, and more.
Security review
✓ PassedNo issues found. Passed automated security review. · v0.1.0 How review works →
- ✓ Prompt-injection patterns
- ✓ Secret / credential exfiltration
- ✓ Dangerous shell & filesystem operations
- ✓ Untrusted network calls
- ✓ Known-malicious package signatures
What it can access
- ● Network access Used
- ✓ Filesystem access No
- ✓ Shell / process execution No
- ✓ Environment & secrets No
- ✓ Dynamic code execution No
From automated source analysis of v0.1.0. “Used” means the capability is present in the source — more access means more to trust, not that it’s unsafe.
Verified badge
Passed review? Show it. Paste this badge into your README, it links to the public security report.
Reliability & compatibility
Declared compatibility
Compatibility is declared by the source manifest. End-to-end runtime verification is coming, see below.
We're building live execution health for every listing: tool-call success rate, median latency, uptime, and last-checked timestamps, measured, not self-reported. It isn't live yet, so we don't show numbers we can't stand behind.
How agent discovery & health will work →About
Hebrew Chatbot Builder
Build production-ready conversational AI chatbots with native Hebrew support. This skill covers platform integrations (WhatsApp, Telegram, web), Hebrew language patterns, RTL UI components, and conversation flow design for Hebrew speakers.
Instructions
Follow this procedure when building a Hebrew chatbot:
- Identify the platform/channel. Confirm whether the bot runs on WhatsApp Business API, Telegram, an embedded web widget, or several at once. Each has a different scaffold and message model.
- Confirm formal or informal register. Ask the user whether the audience expects informal Hebrew ("דוגרי", recommended for most consumer bots) or formal Hebrew (government, banking, legal). This decision shapes every response string.
- Ask the gender-handling strategy. Decide between asking the user's gender early and remembering it, using gender-neutral phrasing throughout, or slash notation ("את/ה"). See the Gender-Aware Responses section.
- Scaffold via the relevant bundled script. Use
scripts/whatsapp-webhook-handler.pyfor WhatsApp orscripts/telegram-bot-scaffold.pyfor Telegram as the starting point, then adapt the Hebrew response templates and conversation flows. - Wire entity extraction. Add
extract_israeli_entities()(or an equivalent) so the bot recognizes Israeli phone numbers, NIS amounts, dates, and Teudat Zehut from free-text Hebrew input. - Verify RTL rendering. For web widgets, set
dir="rtl"on the outermost container and test on a real device. For WhatsApp and Telegram, verify Hebrew text and interactive buttons render correctly on both iOS and Android.
Examples
Example 1: WhatsApp order-status bot in Hebrew
User says: "Build a WhatsApp bot in Hebrew that lets customers check their order status."
Actions:
- Identify the channel: WhatsApp Business Cloud API.
- Confirm informal register (consumer audience) and gender-neutral phrasing for broad reach.
- Start from
scripts/whatsapp-webhook-handler.py, which already includes webhook verification, signature checks, and Hebrew response templates. - Wire an interactive button menu ("בדיקת הזמנה", "שאלות נפוצות", "דבר/י עם נציג") and a
waiting_order_numberstate that validates the order number and looks it up. - Submit a Hebrew
order_confirmation_hetemplate via Meta Business Suite for proactive outbound updates.
Result: A working webhook handler that greets users in Hebrew, routes button replies, and answers order-status queries.
Example 2: Add an RTL Hebrew web chat widget to an existing site
User says: "Add a Hebrew chat widget to my website with proper RTL layout."
Actions:
- Identify the channel: embedded web widget.
- Confirm informal register and slash notation for CTAs.
- Use the RTL Chat Bubble Layout CSS and the
MessageBubble/detectDirectioncomponents from the Web Chat Widget section. - Set
dir="rtl"on the outermost chat container element (not only in CSS) and adddirection: rtlto the input field. - Verify alignment in browser DevTools: user bubbles on the right, bot bubbles on the left, timestamps on the trailing side.
Result: A chat widget that renders Hebrew naturally, handles mixed Hebrew/English messages per-bubble, and does not break when a parent framework sets direction: ltr.
Hebrew Conversation Design
Formal vs Informal Register
Hebrew has distinct formal and informal registers. Choose based on your audience:
Informal (recommended for most consumer bots):
- Use second person singular: את/ה (you)
- Shorter sentences
- Colloquial expressions: "מה קורה?", "אין בעיה", "סבבה"
Formal (recommended for government, banking, legal):
- Use second person plural or passive voice
- Full sentences with proper grammar
- Formal expressions: "כיצד נוכל לסייע?", "בבקשה המתן/י"
Gender-Aware Responses
Hebrew verbs and adjectives are gender-inflected. Handle this gracefully:
Strategy 1: Ask early and remember
Bot: "היי! לפני שנתחיל, איך לפנות אליך?"
Options: [זכר] [נקבה] [לא משנה לי]
Strategy 2: Use gender-neutral phrasing
-- Instead of: "אתה/את מוזמן/מוזמנת להמשיך"
-- Use: "ניתן להמשיך" or "אפשר להמשיך"
-- Instead of: "רוצה/רוצה לראות?"
-- Use: "לראות עוד אפשרויות?"
Strategy 3: Slash notation (common in Israeli tech)
"את/ה מוזמן/ת לבדוק את האפשרויות"
Hebrew Date/Time Formatting in Chat
# Date formats for chat messages
# Israeli standard: DD/MM/YYYY or DD.MM.YYYY
# In conversation: "יום שלישי, 14 במרץ" (Tuesday, March 14)
# Time format: 24-hour clock is standard in Israel
# "בשעה 14:30" (at 14:30), not "2:30 PM"
# Relative time in Hebrew
RELATIVE_TIME_HE = {
"just_now": "עכשיו",
"minutes_ago": "לפני {n} דקות",
"hours_ago": "לפני {n} שעות",
"yesterday": "אתמול",
"days_ago": "לפני {n} ימים",
"today": "היום",
"tomorrow": "מחר",
}
WhatsApp Business API Integration
Setup via Cloud API
The WhatsApp Cloud API (Meta's official API) is the recommended approach for Israeli businesses:
- Create a Meta Business Account at business.facebook.com
- Set up a WhatsApp Business Account in Meta Business Suite
- Create an App in Meta Developers and add WhatsApp product
- Get a phone number: Israeli numbers (+972) are supported
- Generate an access token for API calls
Message Templates (Hebrew)
WhatsApp requires pre-approved templates for outbound messages. Submit Hebrew templates via the Meta Business Suite:
# Template example: Order confirmation
# Template name: order_confirmation_he
# Language: he
# Body: "שלום {{1}}, ההזמנה שלך מספר {{2}} התקבלה בהצלחה. סכום: ₪{{3}}. צפי למשלוח: {{4}}."
import requests
def send_template_message(phone_number: str, template_data: dict):
"""Send a WhatsApp template message in Hebrew."""
url = f"https://graph.facebook.com/v25.0/{PHONE_NUMBER_ID}/messages"
payload = {
"messaging_product": "whatsapp",
"to": phone_number, # E.164 format: 972501234567
"type": "template",
"template": {
"name": "order_confirmation_he",
"language": {"code": "he"},
"components": [
{
"type": "body",
"parameters": [
{"type": "text", "text": template_data["customer_name"]},
{"type": "text", "text": template_data["order_id"]},
{"type": "text", "text": template_data["amount"]},
{"type": "text", "text": template_data["delivery_date"]},
]
}
]
}
}
headers = {
"Authorization": f"Bearer {ACCESS_TOKEN}",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
return response.json()
Interactive Messages
WhatsApp supports interactive buttons and lists, which work well with Hebrew:
def send_interactive_buttons(phone_number: str):
"""Send interactive buttons in Hebrew."""
payload = {
"messaging_product": "whatsapp",
"to": phone_number,
"type": "interactive",
"interactive": {
"type": "button",
"body": {
"text": "איך אפשר לעזור לך היום?"
},
"action": {
"buttons": [
{
"type": "reply",
"reply": {"id": "check_order", "title": "בדיקת הזמנה"}
},
{
"type": "reply",
"reply": {"id": "support", "title": "תמיכה טכנית"}
},
{
"type": "reply",
"reply": {"id": "hours", "title": "שעות פעילות"}
}
]
}
}
}
return send_whatsapp_message(payload)
def send_interactive_list(phone_number: str):
"""Send an interactive list in Hebrew."""
payload = {
"messaging_product": "whatsapp",
"to": phone_number,
"type": "interactive",
"interactive": {
"type": "list",
"body": {
"text": "בחר/י את הנושא שמעניין אותך:"
},
"action": {
"button": "לרשימת האפשרויות",
"sections": [
{
"title": "שירותים",
"rows": [
{"id": "pricing", "title": "מחירון", "description": "צפייה במחירים עדכניים"},
{"id": "catalog", "title": "קטלוג", "description": "עיון במוצרים שלנו"},
{"id": "branches", "title": "סניפים", "description": "מציאת הסניף הקרוב"}
]
},
{
"title": "תמיכה",
"rows": [
{"id": "faq", "title": "שאלות נפוצות", "description": "תשובות לשאלות שכיחות"},
{"id": "human", "title": "נציג אנושי", "description": "שיחה עם נציג"}
]
}
]
}
}
}
return send_whatsapp_message(payload)
Webhook Handling
from flask import Flask, request, jsonify
import hmac
import hashlib
app = Flask(__name__)
VERIFY_TOKEN = "your_verify_token"
APP_SECRET = "your_app_secret"
@app.route("/webhook", methods=["GET"])
def verify_webhook():
"""Handle WhatsApp webhook verification."""
mode = request.args.get("hub.mode")
token = request.args.get("hub.verify_token")
challenge = request.args.get("hub.challenge")
if mode == "subscribe" and token == VERIFY_TOKEN:
return challenge, 200
return "Forbidden", 403
@app.route("/webhook", methods=["POST"])
def handle_webhook():
"""Process incoming WhatsApp messages."""
# Verify signature
signature = request.headers.get("X-Hub-Signature-256", "")
body = request.get_data()
expected = "sha256=" + hmac.new(
APP_SECRET.encode(), body, hashlib.sha256
).hexdigest()
if not hmac.compare_digest(signature, expected):
return "Invalid signature", 403
data = request.get_json()
for entry in data.get("entry", []):
for change in entry.get("changes", []):
if change["field"] == "messages":
for message in change["value"].get("messages", []):
handle_incoming_message(message)
return jsonify({"status": "ok"}), 200
def handle_incoming_message(message: dict):
"""Process a single incoming message."""
sender = message["from"] # Phone number
msg_type = message["type"]
if msg_type == "text":
text = message["text"]["body"]
# Process Hebrew text
process_hebrew_input(sender, text)
elif msg_type == "interactive":
# Handle button/list replies
if "button_reply" in message["interactive"]:
button_id = message["interactive"]["button_reply"]["id"]
handle_button_click(sender, button_id)
elif "list_reply" in message["interactive"]:
list_id = message["interactive"]["list_reply"]["id"]
handle_list_selection(sender, list_id)
Telegram Bot Integration
BotFather Setup
- Open @BotFather on Telegram
- Send
/newbotand follow prompts - Set Hebrew description:
/setdescriptionthen send Hebrew text - Set Hebrew commands menu:
/setcommands
start - התחל שיחה
help - עזרה
menu - תפריט ראשי
order - הזמנה חדשה
status - סטטוס הזמנה
language - שפה / Language
Hebrew Inline Keyboards
from telegram import InlineKeyboardButton, InlineKeyboardMarkup, Update
from telegram.ext import Application, CommandHandler, CallbackQueryHandler
async def start(update: Update, context):
"""Send a Hebrew welcome message with inline keyboard."""
keyboard = [
[
InlineKeyboardButton("הזמנה חדשה", callback_data="new_order"),
InlineKeyboardButton("בדיקת סטטוס", callback_data="check_status"),
],
[
InlineKeyboardButton("שאלות נפוצות", callback_data="faq"),
InlineKeyboardButton("דבר/י עם נציג", callback_data="human_agent"),
],
[
InlineKeyboardButton("English", callback_data="lang_en"),
],
]
reply_markup = InlineKeyboardMarkup(keyboard)
await update.message.reply_text(
"שלום! 👋\n\n"
"אני הבוט של [שם העסק]. איך אפשר לעזור?",
reply_markup=reply_markup,
)
async def button_handler(update: Update, context):
"""Handle inline keyboard button presses."""
query = update.callback_query
await query.answer() # Acknowledge the button press
if query.data == "new_order":
await query.edit_message_text("מעולה! בוא/י נתחיל הזמנה.\n\nמה תרצה/י להזמין?")
elif query.data == "check_status":
await query.edit_message_text("שלח/י לי את מספר ההזמנה ואבדוק עבורך.")
elif query.data == "faq":
await show_faq(query)
elif query.data == "human_agent":
await query.edit_message_text(
"מעביר אותך לנציג אנושי.\n"
"שעות הפעילות שלנו: א'-ה' 9:00-17:00\n"
"נציג יחזור אליך בהקדם."
)
elif query.data == "lang_en":
await query.edit_message_text("Switching to English. How can I help you?")
# Build the application
app = Application.builder().token("YOUR_BOT_TOKEN").build()
app.add_handler(CommandHandler("start", start))
app.add_handler(CallbackQueryHandler(button_handler))
Group Bot Permissions
For Hebrew group bots, set appropriate permissions:
# In BotFather:
# /setjoingroups - Enable/disable joining groups
# /setprivacy - Set privacy mode (recommended: enabled, bot only sees commands)
# Handle group messages differently
async def handle_message(update: Update, context):
chat_type = update.effective_chat.type
if chat_type in ("group", "supergroup"):
# In groups, only respond to commands or mentions
if update.message.text and (
update.message.text.startswith("/") or
f"@{context.bot.username}" in update.message.text
):
await process_group_command(update, context)
else:
# In private chat, respond to all messages
await process_private_message(update, context)
Web Chat Widget
RTL Chat Bubble Layout
/* RTL Chat Container */
.chat-container {
direction: rtl;
display: flex;
flex-direction: column;
height: 100vh;
font-family: 'Heebo', 'Assistant', sans-serif;
}
/* Message area */
.chat-messages {
flex: 1;
overflow-y: auto;
padding: 16px;
display: flex;
flex-direction: column;
gap: 8px;
}
/* Message bubble base */
.message-bubble {
max-width: 75%;
padding: 10px 14px;
border-radius: 16px;
font-size: 14px;
line-height: 1.6;
word-wrap: break-word;
}
/* User message (right side in RTL) */
.message-user {
align-self: flex-start; /* In RTL, flex-start is right */
background-color: #dcf8c6;
border-bottom-right-radius: 4px; /* Tail on right for RTL */
color: #111;
}
/* Bot message (left side in RTL) */
.message-bot {
align-self: flex-end; /* In RTL, flex-end is left */
background-color: #fff;
border-bottom-left-radius: 4px; /* Tail on left for RTL */
color: #111;
box-shadow: 0 1px 2px rgba(0, 0, 0, 0.1);
}
/* Timestamp */
.message-time {
font-size: 11px;
color: #999;
margin-top: 4px;
text-align: left; /* Time on the trailing side */
}
/* Input area */
.chat-input-container {
display: flex;
gap: 8px;
padding: 12px 16px;
border-top: 1px solid #e0e0e0;
background: #fff;
}
.chat-input {
flex: 1;
padding: 10px 14px;
border: 1px solid #ddd;
border-radius: 24px;
font-size: 14px;
direction: rtl;
text-align: right;
font-family: inheri
…
## Source & license
This open-source skill is cataloged on AgentStack and links to its original source — we do not rehost the code.
- **Author:** [squadcodercom](https://github.com/squadcodercom)
- **Source:** [squadcodercom/squadcoder](https://github.com/squadcodercom/squadcoder)
- **License:** MIT
- **Homepage:** https://squadcoder.com
Install and usage instructions live in the source repository linked above.
Reviews
No reviews yet, be the first.
Write a review
Versions
- v0.1.0 Imported from the upstream source.