Voice Center — אפיון מלא
1. סקירה
המוצרים שלנו לרוב חופפים פונקציונלית למה ש-AgenTeam עושים. הבידול האמיתי הוא בעיקר ארבעה ענפים:
- רוחב היצע — אנחנו מוכרים 4 מוצרים מדורגים (מהפשוט לעמוק), הם מוכרים "פלטפורמה" אחת גנרית
- איכות עברית — Grok Voice עם prompt-engineering מותאם עברית (לעומת OpenAI Realtime שלהם)
- זרימת הצטרפות — URL/PDF/Word → סוכן אוטומטית
- סליקה ישראלית — Tranzila ישיר, self-serve מלא מהקליק הראשון
בלי ליפול לרומאנטיקה של "killer feature" — מציאת בידול בולט אחד היא קשה. הנכס שלנו הוא execution + רוחב + עברית + תמחור.
ארבעת המוצרים (מסודרים מהפשוט לעמוק)
1. שירות הודעות
הכי פשוט בעולם. כל לקוח מקבל "הגעת ל-X, אני לא זמין כרגע, השאר הודעה". AI מתנהג יפה, לוקח פרטים, שולח אימייל/SMS לבעל העסק.
2. מזכירה דיגיטלית
עונה, מסננת, מתאמת פגישות, מעבירה לנציג כשצריך. Voice Realtime + tools.
3. סוכן מכירות
נכנסות ויוצאות. Hardcoded pitch, מעביר מהר מאוד לנציג אנושי כשמתעניינים.
4. צ׳אט לאתר
פחות מעניין כרגע — דורש מהלקוח להדביק widget לאתר. נחמד כ-upsell אבל לא כניסה ראשית.
מה השונה מ-AgenTeam (בכנות)
| ממד | AgenTeam | Voice Center |
|---|---|---|
| היצע מוצרים | "פלטפורמה" אחת גנרית — הלקוח צריך להבין מה לבנות | 4 מוצרים נפרדים — קונה את מה שמתאים לו |
| סטאק קולי | OpenAI Realtime (alloy/echo — הוכח מהקוד) | xAI Grok Voice + Pipecat (עברית טובה יותר — אומת) |
| גרסת ניסיון | אין | 30 דקות חינם + מספר זמני |
מסמכים נוספים
שני מסמכי הרקע שעמדו בבסיס האפיון הזה:
- סקירה טכנית מעמיקה של agenteam.co — מיפוי 13 הדפים, ניתוח הסטאק, הוכחות מהקוד, כרטיס ציונים
- מסמך הקונספט הראשוני — הגרסה המוקדמת לפני שנכנסו לעובי הקורה
2. מה גילינו על AgenTeam
חקרתי את ה-bundles של הדשבורד שלהם (הורדה ישירה מ-Vercel). הסטאק שלהם חשוף בקוד.
1.1 הסטאק הקולי — OpenAI לבד
AgentDetail-B9uX-zwn.js (86KB) — voice='alloy' מופיע כקול ברירת מחדל. alloy זה שם ייחודי של OpenAI TTS (6 קולות: alloy/echo/fable/onyx/nova/shimmer).
0.25–1.5 — בדיוק הטווח של OpenAI TTS.
realtime מופיעה ב-AgentDetail — מצביע על שימוש ב-OpenAI Realtime API (gpt-realtime model — WebSocket יחיד ל-STT+LLM+TTS).
1.2 אין שום זרימת URL → סקרייפ → סוכן
מיפיתי את כל ה-chunks של הדשבורד מה-bundle. אלה כל ה-routes שקיימים:
Dashboard · AdminDashboard · AgentManagement · AgentDetail · AgentRunner RealtimeCall · CheckVoiceBot · CheckChatbot · PhoneNumbers · BillingPage BillingHistory · Settings* · Resources · ApiDocs · VerifyEmailPage
מה אין: UrlImport, Wizard, Scraper, WebsiteAnalyzer, OnboardingWizard, AgentBuilder, Templates — אפס.
"You are a helpful AI assistant." — הגנרי ביותר שיש. אין תבניות לפי תעשייה, אין wizard, אין סקרייפר.
הסרטונים ב-YouTube שלהם (וידאתי דרך oEmbed API):
- "יצירת סוכן בינה מלאכותית שמאשר הגעה לאירועים"
- "יצירת סוכן מכירות מבוסס בינה מלאכותית"
- "יצירת סוכן בינה מלאכותית שמנהל יומן פגישות"
שלושתם מסבירים איך לכתוב prompt ידנית, לא איך לסרוק URL.
1.3 ה-API שלהם — Plain CRUD
GET /companies POST /agents ← אתה שולח system_prompt PATCH /agents/:id POST /agents/:id/leads PATCH /agents/:id/leads/:id
אין POST /agents/from-url, אין /scrape, אין /generate. הכל manual flow.
1.5 מיפוי ה-Routes של AgenTeam (לבחינה)
| Route | תפקיד | מה אנחנו לוקחים |
|---|---|---|
| / | שיווק | בסיס מבני אבל מחליף מסר |
| /product | סקירת מוצר | מחלקים ל-3 דפי מוצר (secretary, messaging, sales) |
| /pricing | 3 חבילות | 4 חבילות + Trial — עם Tranzila checkout |
| /records | 5 הקלטות + 3 צ׳אטים | 20+ הקלטות לפי תעשייה |
| /api-docs | תיעוד CRUD מעולה | נשכפל + MCP server + AI Context Pack |
| /check-voice-bot | "בחר חברה" — דל | WebRTC live demo, בלי הרשמה |
| /agent-tutorials | 3 YouTube | Knowledge base + ספריית פלייבוקים |
3. הקונספט
הבעיה האמיתית של SOHO/SMB/SME ישראלי: לא "אין AI" — אלא מאבדים פניות כי אין מי שיענה. שיחות אחרי שעות, לידים לא הוחזרו, פגישות לא אושרו. זה פדיון אבוד.
הפתרון: שלוחה דיגיטלית 24/7 שעובדת כמו עובד שכיר — אבל פחות משכר מינימום ליום. הלקוח לא קונה "מודל שפה". הוא קונה נציג עבודה בענן.
הסטוריטלינג השיווקי: מחשבון "פניות אבודות" על הומפייג ("כמה שיחות החמצת החודש?"), לא דיבור על "GPT-4" או "Realtime API".
ארבעת המוצרים — מהפשוט לעמוק
1. שירות הודעות (Smart Voicemail) — הכי פשוט בעולם
AI עונה לשיחה, פותח עם hardcoded פר-לקוח: "הגעת למרפאה של ד״ר זימן / מוסך יהלומי. כרגע לא זמין, רוצה להשאיר הודעה?" לוקח פרטים, מתעד, שולח SMS/אימייל לבעל העסק עם סיכום. בלי tools מורכבים, בלי קביעת פגישות, בלי שום דבר. זה ה-MVP האמיתי וה-entry point החינמי-כמעט.
2. מזכירה דיגיטלית
עונה, מסננת, מתאמת פגישות בזמן אמת (Google Calendar), מעבירה לנציג כשצריך, שולחת SMS אישור. פלייבוק מותאם למרפאות / משרדי עו"ד / קליניקות.
3. סוכן מכירות (נכנסות + יוצאות)
Hardcoded pitch עם 2-3 שורות מידע על המוצר. מעביר מהר מאוד לנציג אנושי ברגע שהשיחה הופכת רצינית. לא מנסה לסגור עסקאות בעצמו — מתפקיד כ-pre-qualifier.
4. צ׳אט לאתר (Lower priority)
Widget שמדביקים לאתר. דורש מהלקוח גישה לקוד האתר שלו → פחות מתאים ל-SOHO בלי מפתחים. נכנס לרודמאפ אבל לא מוצר entry-level.
מה המערכת באמת עושה (מאחורי הקלעים)
- זיהוי — מי המתקשר? במאגר? לקוח חוזר? עם היסטוריה?
- הקשר — מה הוא קנה? מה הוא ביקש קודם? מה מצב הפגישה?
- החלטה — על בסיס system_prompt + ההקשר → מה להגיד עכשיו
- פעולה — לא רק לדבר: function calling (book_appointment, send_sms, escalate_to_human, query_inventory)
- תיעוד — כל מילה, כל פעולה, כל תוצאה → DB → CRM webhook
- המשך — 24h לפני פגישה → תזכורת. לא ענה → SMS. עדיין לא → outbound call.
4. זרימת Onboarding: URL/PDF → סוכן חי
זרימת ההצטרפות הסטנדרטית של המוצר. הלקוח מביא URL של האתר שלו (או PDF/Word), המערכת סורקת, מחלצת מידע, ובונה את ה-system_prompt אוטומטית. בלי זה אין self-serve.
הזרימה — מקצה לקצה
5. Scrape Cascade — איך סורקים URL
הקסקדה מטפלת ב-3 רמות של "קושי" באתרים. כל שלב מנסה — אם נכשל (timeout / block / חסר תוכן) → עובר לבא בתור.
4.1 לוגיקת ה-cascade (פסאודו)
async def scrape_with_cascade(url, max_pages=15):
# Stage 1: Firecrawl (fast, hosted, ~$0.001/page)
try:
result = await firecrawl.crawl(url, limit=max_pages, formats=["markdown","html"])
if validate(result, min_chars=500):
return {"source": "firecrawl", "pages": result}
except Exception: pass
# Stage 2: CloakBrowser (anti-bot, local)
try:
pages = await cloakbrowser_crawl(url, max_pages)
if validate(pages, min_chars=500):
return {"source": "cloakbrowser", "pages": pages}
except Exception: pass
# Stage 3: Playwright (last resort)
pages = await playwright_crawl(url, max_pages)
return {"source": "playwright", "pages": pages}
4.2 בחירת הדפים החשובים (לא "כל האתר")
10-15 דפים זה התקרה. לוגיקת priority:
- Always:
/,/about,/contact - Pricing/Services:
/pricing,/services,/products - FAQ:
/faq,/help - Footer links שאינם משפטיים
- Top items בתפריט ראשי
- דיסקרימינטור: מקסימום 15 דפים, מעדיפים דפים עם >500 chars טקסט
מה לא סורקים: /privacy, /terms, /accessibility, blog posts (אלא אם כן יש <10 דפים בסה"כ).
4.3 מקור חלופי: PDF / Word / Text
| סוג | טיפול |
|---|---|
| PyMuPDF / pdfplumber → טקסט גולמי → אותו pipeline כמו scraped pages | |
| DOCX | python-docx → טקסט |
| Plain text | הלקוח מדביק ל-textarea — מדלגים על Stages 1-3 |
4.4 ולידציה
- אם פחות מ-500 תווים סה"כ — שגיאה ידידותית: "לא הצלחנו לקרוא את האתר. אפשר להעלות מסמך?"
- אם זוהתה שפה זרה לא נתמכת — אזהרה: "האתר באנגלית — הסוכן יוצב לאנגלית. רוצה לעבור לעברית?"
- אם זוהה שהאתר ב-Hebrew אבל מערפל RTL/encoding — UTF-8 normalization בכפיה
4.5 עלויות משוערות
| שלב | עלות לסריקה (15 דפים) |
|---|---|
| Firecrawl | ~$0.015 |
| CloakBrowser | אפסי (local) |
| Playwright | אפסי (local) |
| LLM extraction call | ~$0.03 |
| LLM compose call | ~$0.03 |
| סה"כ לסקרייפ אחד | ~$0.02 = 7 אגורות |
בעלות אונבורדינג של פחות מ-7 אגורות לסקרייפ ובחירה של $0 חבילת trial, ROI הצדדי מוצדק בקלות.
6. Prompt Generator — איך מייצרים system_prompt (ללא RAG)
5.1 בחירת המודלים — מאי 2026
| שלב | מודל | למה |
|---|---|---|
| חילוץ JSON מ-markdown | Claude Opus 4.7 / GPT-5.4 / Grok 4 | structured output, עברית מצוינת, JSON mode |
| חיבור system_prompt סופי | Claude Opus 4.7 / GPT-5.4 / Grok 4 | איכות מקסימלית — ה-prompt משמש בכל שיחה |
| קריאת PDF/Word | Claude Opus 4.7 (vision) / GPT-5.4 (vision) | vision-capable, הופך מסמך ישירות ל-markdown — אותו model handles everything |
5.2 התהליך המלא
מ-PDF/Word: Claude Opus 4.7 (vision) → markdown נקי.
מטקסט: השארה כפי שהוא.
פלט:
{ business_name, description, services[], hours, contact, faqs[], pricing? }structured output mode כדי שלא יחזיר טקסט חופשי.
פלט: system_prompt טקסט מוכן ב-עברית/אנגלית/ערבית/רוסית (לפי בחירה).
POST /IncomingPhoneNumbers עם VoiceUrl שמצביע על endpoint שלנו עם tenant_id.
5.3 מבנה ה-system_prompt שיווצר
[PERSONA]
שמך {agent_name}. אתה {role} של {business_name}.
אתה מדבר {language} בטון {tone}. אנושי, סבלני, קצר בתשובות.
[BUSINESS CONTEXT]
{business_name} הוא {one_line_description}.
- כתובת: {address}
- שעות פעילות: {hours}
- טלפון נציג אנושי לחירום: {fallback_phone}
[SERVICES / PRODUCTS]
{extracted_services_bullets}
[FAQ]
{extracted_faqs}
[PLAYBOOK: messaging|secretary|sales]
{playbook_template_content}
[GUARDRAILS]
- אל תמציא מחירים שלא מצוינים → "אני אתאם נציג שיחזור אליך".
- אל תיתן ייעוץ משפטי/רפואי בשם העסק.
- אם לא ברור — escalate_to_human().
[TOOLS] (משתנים פר-מוצר)
messaging: take_message, send_sms_summary
secretary: book_appointment, send_sms, escalate, take_message
sales: send_sms, escalate, send_brochure
[CLOSING]
תמיד סיים בסיכום ברור.
5.4 עלות אונבורדינג פר-לקוח (אומדן)
| שלב | עלות משוערת |
|---|---|
| Scrape cascade (15 עמודים) | ~$0.015 |
| Opus 4.7 extraction call | ~$0.03 |
| Opus 4.7 compose call | ~$0.03 |
| PDF vision (אם יש) | ~$0.01 לעמוד |
| סה"כ | ~$0.08-0.15 (30-55 אגורות) |
עלות חד פעמית פר onboarding. זניחה.
7. Voice Stack — Pipecat + xAI Grok (קיים)
voice-agent-grok שלך. עבור ל-Voice Center
אנחנו לא בונים מחדש את ה-pipeline הקולי — אנחנו עוטפים אותו ב-multi-tenancy.
Option A (primary) — xAI Grok Voice
grok-voice-think-fast-1.0 — עברית נבדקה ואומתה. realtime API יחיד שמטפל ב-STT+LLM+TTS.
Option B (fallback) — OpenAI Realtime
במקרים שבהם Grok חורק (לדוגמה: דובר עם מבטא חזק, עברית טכנית של מקצוע מסוים, או downtime של xAI) —
אותה ארכיטקטורת Pipecat תומכת ב-swap ל-gpt-realtime של OpenAI. זה גם מה שהוכחנו ש-AgenTeam משתמשים בו.
ה-config של ה-tenant יכיל שדה realtime_provider: "xai" | "openai" ואפשר לשנות בלי downtime.
6.1 איך זה עובד היום (voice-agent-grok)
6.2 מה צריך להוסיף כדי שזה יעבוד multi-tenant
- Tenant resolver בכל webhook — לזהות איזה tenant לפי המספר שמתקשרים אליו.
- Per-tenant config loader — system_prompt + voice + tools + business_hours מ-DB.
- Tool registry — כל tenant יכול להפעיל/לבטל כלים (book_appointment, send_sms, ...).
- Call recording ל-S3/R2 פר tenant (עם הסכמה ברורה לחוק הפרטיות).
- Transcript pipeline — אחרי שיחה: שמירה ב-DB + webhook ל-CRM של הלקוח.
6.3 קולות זמינים (כבר נבדקו)
| קול | מגדר | הערה |
|---|---|---|
| Ara | נשי | חם, ידידותי — ברירת מחדל מומלצת למזכירה |
| Eve | נשי | נמרץ — מתאים למכירות |
| Leo | נשי (לפי בדיקה) | שונה מהתיעוד הרשמי של xAI |
| Sal | זכר | פורמלי |
| Rex | זכר | אנרגטי |
* HD mode זמין דרך preset xai_realtime_hd ב-output_rate=48kHz.
6.4 עברית — מה צריך לדעת
- ה-system prompt צריך הנחיה להעריך כוונה ולא לבקש לחזור כדי לפצות על שגיאות STT.
- הקובץ
app/prompts.pyב-voice-agent-grok כבר מכיל את ה-Hebrew appendix המתאים.
6.5 התאמות נדרשות ל-voice-agent-grok
app/ ├── agent.py # ← הוסף tenant_id param ├── main.py # ← webhook resolves tenant from number ├── prompts.py # ← load from DB instead of hardcoded ├── voices.py # ← unchanged ├── config.py # ← add TenantConfig dataclass ├── tenants/ # ← NEW │ ├── resolver.py # phone → tenant_id │ └── config_loader.py # DB query ├── tools/ # ← NEW │ ├── book_appointment.py │ ├── send_sms.py │ └── escalate.py ├── call_logger.py # ← add S3 upload per-tenant └── rag/ # ← REMOVE / disable (no RAG)
8. ארכיטקטורה כוללת
7.1 פירוט שירותים
Onboarding Service
FastAPI server נפרד שמטפל רק ב-flow של הצטרפות. רץ ב-Railway/Fly. מתקשר ל:
- Firecrawl API (חיצוני)
- CloakBrowser (binary מקומי)
- Playwright (binary מקומי)
- Anthropic / OpenAI / xAI API
- DB (לאחסון התוצאות)
Voice Agent Service
זהו voice-agent-grok הקיים + multi-tenancy. רץ באותו cluster.
- Pipecat orchestration
- xAI Grok realtime client
- Twilio webhooks
- WebSocket לדפדפן (test)
7.2 hosting מומלץ
| שכבה | מקום | למה |
|---|---|---|
| Marketing site (Next.js) | Vercel | SSG/ISR, CDN, יומן הקצאות גמיש |
| Tenant Dashboard (React/Vite) | Cloudflare Pages | זול, מהיר, אין vendor lock-in |
| Voice/Onboarding services | Fly.io או Railway | קרוב גיאוגרפית ל-Twilio EU. תמיכה ב-WebSocket persistent. |
| PostgreSQL | Neon / Supabase | Serverless Postgres. RLS multi-tenant מובנה. |
| Redis | Upstash | Serverless. Pay-per-request. |
| Files | Cloudflare R2 | אין egress fees — חשוב לקבצי אודיו. |
9. מודל נתונים
Tenant
├── id, name, business_name, created_at
├── owner_user_id
├── subscription (plan, status, tranzila_token, next_charge_at)
├── usage_meters (minutes_used, sms_sent, current_month)
└── settings (timezone, language, business_hours_json)
User (גישה למחשב, יכול לנהל את ה-Tenant)
├── id, tenant_id, email, name, role (owner|admin|viewer)
└── auth (google_oauth | email_pw, password_hash)
Source (חומר גלם להפקת ה-prompt)
├── id, tenant_id, type (url|pdf|docx|text), url_or_filename
├── scrape_status, scrape_method (firecrawl|cloakbrowser|playwright)
├── raw_markdown[] ← 15 דפים שנשמרו ב-R2
└── extracted_json ← {business_name, services[], hours, ...}
Agent
├── id, tenant_id, name, persona_id, playbook_id (secretary|messaging|sales)
├── system_prompt (text - generated)
├── voice (Ara|Eve|Sal|Leo|Rex)
├── language (he|en)
├── voice_speed (0.5-1.5)
├── tools_enabled[] (book_appointment, send_sms, escalate, ...)
├── business_hours_json
└── source_id ← reference to Source
PhoneNumber
├── id, tenant_id, twilio_sid, phone_e164
├── linked_agent_id, country, monthly_cost
└── status (active|suspended)
Contact (CRM-like - האנשים שמתקשרים אליך)
├── id, tenant_id, phone_e164, name, email, tags[]
└── first_seen_at, last_seen_at
Conversation (thread יחיד לאיש קשר, חוצה ערוצים)
├── id, tenant_id, contact_id, agent_id
├── started_at, last_activity_at, status
└── summary (auto-generated after each event)
Call
├── id, conversation_id, twilio_call_sid
├── direction (inbound|outbound), duration_sec
├── recording_url ← Supabase Storage (mp3/wav)
├── transcript_url ← Supabase Storage (JSON timestamped)
├── transcript_text ← short flat text for search/index
├── outcome (appointment_booked|escalated|hung_up|...)
├── extracted_fields_json (name, intent, contact info from call)
└── tools_used[] (which functions the agent called)
Message (SMS / WhatsApp)
├── id, conversation_id, channel (sms|whatsapp)
├── direction, body, sent_at, delivered_at, status
└── twilio_message_sid
Event (פגישה / משימה / תזכורת)
├── id, conversation_id, contact_id
├── type (appointment|callback|reminder)
├── scheduled_at, status, calendar_event_id (Google)
└── created_by_call_id
Campaign (outbound — קמפיין שיחות יוצאות)
├── id, tenant_id, name, agent_id
├── target_contacts[] (CSV upload)
├── schedule (cron expression), status
└── stats (calls_made, connected, converted)
Integration
├── id, tenant_id, type (hubspot|monday|salesforce|generic_webhook)
├── credentials_encrypted, webhook_url
└── events_subscribed[] (call_ended|appointment_booked|...)
ApiKey
├── id, tenant_id, name, key_hash (prefix only stored)
├── created_at, last_used_at, revoked_at
└── scopes[]
8.1 הקלטות, תמלולים, ודשבורד
כל שיחה נשמרת מלאה: אודיו (mp3/wav) + תמלול עם timestamps (JSON). הקלטות יוצאות אוטומטית מ-Pipecat ל-Supabase Storage בסיום שיחה. Bucket פר-tenant (RLS).
בדשבורד הלקוח:
- רשימת כל השיחות (תאריך, משך, מתקשר, outcome) — מסוננת לפי tenant_id דרך RLS
- כל שורה ניתנת לפתיחה: נגן אודיו + תמלול גלילה + פעולות שבוצעו (function calls) + הודעות SMS/WA הקשורות
- חיפוש טקסטואלי על transcript_text
- סינון לפי outcome, agent, תאריך, מספר
- הורדה: mp3 + תמלול PDF (כפתור)
חוק: בתחילת שיחה הסוכן יודיע "שיחה זו עשויה להיות מוקלטת" (חוק הגנת הפרטיות התשמ"א).
8.2 הבדל קונספטואלי מ-AgenTeam
| AgenTeam | Voice Center | |
|---|---|---|
| מרכז המודל | Agent → Lead → Calls | Contact → Conversation (multi-channel) |
| Multi-channel | אין thread אחד | Conversation מכיל Calls + Messages + Events |
| Source | אין — system_prompt ידני | Source נשמר → ניתן לרענן את ה-prompt |
| Playbook | אין | playbook_id מצרף לתבנית |
10. Tranzila — תשלום ומסחר (דרך API, לא iFrame)
Tranzila היא ספק הסליקה הישראלי המוביל ל-SMB. תומך באשראי, ביט, Apple Pay, הוראת קבע, ובעיקר — סליקה חוזרת (recurring billing) עם TOKEF — קריטית למודל SaaS חודשי.
אנחנו עובדים מול ה-API שלהם ישירות, לא דרך iFrame. כלומר הטופס הוויזואלי נבנה אצלנו (עיצוב משלנו, חוויה משלנו), והנתונים נשלחים ל-Tranzila ב-API call ישיר. זה מה שעבד אצלנו בעבר ויעבוד שוב.
10.1 זרימת רכישה (API-first)
tenant.subscription.tranzila_tokef + transaction_id ראשון.10.2 ניהול מנויים — Tranzila לבד מספיק לחלוטין
שיקול חשוב: Tranzila כן מנהלת מנויים — דרך מודל ה-TOKEF + הוראת קבע (HK). זה לא Stripe Subscriptions, אבל זה עובד מצוין ל-SMB ישראלי. עשינו את זה לבד בעבר בהצלחה.
הדרך:
- TOKEF — טוקן ייחודי לכל לקוח. שומרים ב-DB. כל קריאה ל-API של Tranzila עם הטוקן הזה = חיוב הכרטיס המקורי בלי לראות פרטים.
- Cron חודשי שלנו → שולף את כל ה-tenants הפעילים → קריאה ל-Tranzila API לכל אחד.
- Logic של retry, suspend, dunning — אצלנו ב-DB. שורות פשוטות בקוד.
אין סיבה להוסיף עוד שכבה (כמו Clerk Billing או Stripe) בשביל ניהול מנויים בסיסי. Tranzila מספיקה לבד.
10.3 חיוב חוזר חודשי
Cron daily @ 02:00 UTC ├─ SELECT tenants WHERE next_charge_at <= NOW() AND status = active ├─ FOR EACH tenant: │ ├─ POST Tranzila API with TOKEF + plan_price │ ├─ IF success → next_charge_at += 30 days, reset usage_meters │ └─ IF fail → status = past_due, send email, retry @ +1, +3, +7 days └─ IF still failing after 7 days → suspend tenant (disable Twilio webhook)
10.4 חיוב Overage (תוספת דקות / הודעות)
בסוף החודש, אם הלקוח חרג ממכסת הדקות או הודעות:
- חישוב:
extra_minutes × ₪X + extra_sms × ₪Y - חיוב נפרד דרך Tranzila עם אותו TOKEF
חשבונית דיגיטלית — לא דרך Tranzila. מבוצע דרך Finbot (אינטגרציה נפרדת, מחוץ ל-scope של הטאב הזה).
10.5 אז מה לגבי Clerk?
Clerk הוא שירות auth+users מעולה. אנחנו יכולים להשתמש בו ל-auth (התחברות, הרשמה, Google OAuth, ניהול sessions, MFA) — וזה יחסוך לנו לבנות את כל מערכת ההזדהות מאפס.
אבל Clerk Billing מתבסס על Stripe, לא על Tranzila. אז:
- ✅ Clerk ל-auth + ניהול משתמשים (אופציה רצינית)
- ❌ Clerk Billing — לא רלוונטי, אנחנו עם Tranzila
- ✅ Tranzila ל-תשלום + מנויים ישירות מול ה-API שלהם
שתי השכבות נפרדות וזה תקין: Clerk.userId → ה-Tenant אצלנו ב-DB → tenant.tranzila_tokef.
אפשר גם בלי Clerk (לבנות auth לבד) — תלוי אם רוצים לחסוך 2-3 שבועות פיתוח של auth flows.
החלטה נדחית: בודקים את ה-pricing של Clerk לפי הצורך. ל-MVP אפשר אוף ה-shelf JWT auth.
10.6 PaymentProvider abstraction (לעתיד)
אם בעתיד נרצה Stripe ללקוחות בינלאומיים — נעצב מ-day 1 שכבת PaymentProvider מופשטת:
interface PaymentProvider {
charge(token, amount): { success, transaction_id }
createToken(card_data): { token }
refund(transaction_id, amount?): { success }
}
class TranzilaProvider implements PaymentProvider { ... }
class StripeProvider implements PaymentProvider { ... } // future
11. מבנה האתר השיווקי
10.1 דפי ליבה
| Route | תפקיד | הערה |
|---|---|---|
/ | דף הבית | Hero + Lost Revenue Calculator + 3 מוצרים |
/secretary | מזכירה דיגיטלית | דף נחיתה ייעודי |
/messaging | שירות הודעות חכם | דף נחיתה ייעודי |
/sales-agent | סוכן מכירות AI | דף נחיתה ייעודי |
/try | "דבר עם הסוכן עכשיו" | WebRTC live demo, ללא הרשמה |
/playbooks | ספריית פלייבוקים | 10+ תעשיות עם הקלטות |
/playbooks/[industry] | פלייבוק בודד | עם דוגמאות שיחה + מחיר חבילה |
/pricing | תמחור | Tranzila checkout מובנה |
/case-studies | מקרים אמיתיים | עם מספרים: ROI, calls handled, conversions |
/integrations | אינטגרציות | HubSpot, monday, Google Calendar, ... |
/api | תיעוד API | + MCP server + AI Context Pack |
/blog | תוכן SEO | חסר אצל המתחרים |
/about, /contact | סטנדרט | |
/login, /signup | אימות | Google OAuth + Email/Password |
/privacy, /terms | משפטי | חובה |
10.2 דשבורד הלקוח
| Route | תפקיד |
|---|---|
/dashboard | KPIs: שיחות החודש, המרות, צריכת דקות, פגישות שנקבעו |
/dashboard/onboarding | Wizard 12 שלבי URL→Agent (טאב 3) |
/dashboard/agents | רשימת הסוכנים |
/dashboard/agents/[id] | עריכת agent — system_prompt + voice + tools |
/dashboard/agents/[id]/test | WebRTC live test לדפדפן |
/dashboard/agents/[id]/refresh | "רענן מהאתר" — סקרייפ מחדש |
/dashboard/conversations | היסטוריית שיחות חוצת-ערוצים |
/dashboard/conversations/[id] | שיחה בודדת: תמלול, audio player, פעולות שבוצעו |
/dashboard/contacts | CRM פנימי |
/dashboard/campaigns | קמפיינים יוצאים |
/dashboard/integrations | חיבור CRM/Calendar/Webhooks |
/dashboard/billing | חבילה, חשבוניות, צריכה |
/dashboard/api-keys | ניהול מפתחות API |
/dashboard/settings | פרופיל, צוות, אבטחה |
10.3 דף בית — סקציות מומלצות
- Hero — H1 ("השלוחה הדיגיטלית שלא תפסיק לעבוד") + Lost Revenue Calculator interactive
- 3 מוצרים — מזכירה / הודעות / מכירות
- "דבר עם הסוכן עכשיו" — WebRTC button → demo session
- How it works (URL→Agent) — אנימציה 4 שלבים
- פלייבוקים לפי תעשייה — 6 כרטיסים גדולים עם דוגמאות
- Social proof — לוגואים + ציטוטים + 3 הקלטות אמיתיות
- Pricing teaser — 3 חבילות + Trial
- FAQ — 10+ שאלות, לא 3 כמו AgenTeam
- CTA סופי — "התחל ב-15 דקות"
12. אסטרטגיית תמחור
| חבילה | מחיר חודשי | דקות | SMS/WA | מספרים | סוכנים | לקהל |
|---|---|---|---|---|---|---|
| Trial | ₪0 (7 ימים) | 30 | 50 | מספר זמני | 1 | טעימה |
| Starter | ₪249 | 120 | 200 | 1 | 1 | עסק בודד |
| Business פופולרי | ₪549 | 400 | 800 | 1 | 3 | מספר תפקידים |
| Scale | ₪1,290 | 1,200 | 3,000 | 3 | 10 | SME עם מספר ענפים |
* כל החבילות ממוקדות SOHO / SMB / SME. אין יעד-לקוח Enterprise בשלב הזה.
11.1 ההיגיון מול AgenTeam
| חבילה | AgenTeam | Voice Center | היתרון |
|---|---|---|---|
| Entry | ₪200 / 60min | ₪249 / 120min + 200 SMS | פי-2 דקות + הודעות |
| Mid | ₪450 / 180min | ₪549 / 400min + 800 SMS + 3 agents | פי-2 דקות + הודעות + multi-agent |
| Top | ₪700 / 300min | ₪1,290 / 1,200min + 3,000 SMS | חבילה גדולה ל-SME שלהם אין |
11.2 חיוב Overage
- דקות נוספות: ₪2 לדקה (פחות מ-₪3.3 שלהם)
- SMS נוסף: ₪0.20 (עברית UCS-2)
- WhatsApp נוסף: ₪0.10
- מספר נוסף: ₪29/חודש
11.3 הנחות
- שנתי → 20% הנחה (חודשיים חינם)
- סוכנויות → 30% הנחה ב-Scale ומעלה, white-label אופציונלי
- הפניות → חודש חינם פר הפניה מוצלחת
11.4 עלויות תשתית פר לקוח (אומדן גס + מה זה עולה ללקוח)
| פריט | עלות לנו | מה זה ללקוח (בחבילת Business) |
|---|---|---|
| Twilio number | ~$1/חודש | כלול במחיר החבילה |
| Twilio minutes | ~$0.01/דקה | 400 דקות כלולות; מעבר → ~₪0.50/דקה ללקוח |
| xAI Grok Voice | ~$0.05/דקה | כלול (חלק מהשירות) |
| SMS / WhatsApp | ~$0.04/הודעה | 800 הודעות כלולות; מעבר → ~₪0.15/הודעה ללקוח |
| Hosting + DB pro-rata | זניח | כלול |
| Tranzila עמלות סליקה | ~1.5-2.5% מכל חיוב | מוטמע במחיר החבילה |
| סה"כ עלות תשתית | ~$30-40 ללקוח/חודש | חבילה ב-₪549 |
* האומדנים צריכים אימות מול מחירונים עדכניים. תשואה גולמית סבירה אחרי עלויות תשתית — לפני שיווק, פיתוח, ותמיכה.
13. מסלול בנייה — לפי 3 רולים במקביל
חוזי API משותפים (כל הצוותים מסכימים מראש)
- Database schema — מוגדר ב-OpenAPI/SQL לפני שמתחילים. מצורף ב-טאב 8.
- Auth tokens — JWT עם tenant_id + user_id. אותו פורמט בכל מקום.
- Webhooks ל-CRM — JSON envelope קבוע:
{event, tenant_id, timestamp, payload} - Tenant config endpoint —
GET /api/internal/tenants/:id/agent-configמחזיר את כל מה שצריך לטעון סוכן (system_prompt, voice, tools).
🅰️ Track A — Backend + Payments + Onboarding (איש אחד)
Phase A1 — Core Backend
- Database schema (Postgres + Supabase)
- Auth: Email/Password + Google OAuth
- Tenant model + JWT
- Tranzila integration: iFrame checkout + webhook + טוקן ל-recurring
- Cron חודשי לחיוב חוזר
Phase A2 — Onboarding Service
- Scrape cascade: Firecrawl → CloakBrowser → Playwright
- PDF/Word ingestion: Claude Opus 4.7 vision → markdown
- LLM extraction (Sonnet 4.6) → JSON
- LLM compose (Opus 4.7) → system_prompt
- Twilio API: subaccount create, number search, number purchase, webhook bind
Phase A3 — Public API + Integrations
- API מתועד (כמו AgenTeam) + AI Context Pack
- Webhooks ל-CRMs (HubSpot, monday)
- חשבוניות (Green Invoice/iCount)
- Overage billing (חישוב + חיוב נוסף בסוף חודש)
🅱️ Track B — Voice Agent (1-2 אנשים)
Phase B1 — Multi-Tenant Wrap
- הרחבה של
voice-agent-grokהקיים - Resolver: tenant_id ← phone number (ממופה דרך Twilio webhook)
- Config loader: שולף system_prompt + voice + tools מ-DB
- RAG הסרה (לא צריך)
- שמירת תמלול + audio ל-Supabase Storage
Phase B2 — Tools + Playbooks
- Tool:
take_message(למוצר Messaging — לוקח פרטים, שולח SMS/אימייל לבעלים) - Tool:
book_appointment(Google Calendar) - Tool:
send_sms(Twilio Messaging) - Tool:
escalate_to_human(מעביר למספר הנציג) - Tool:
end_call - תמיכה רב-לשונית: he / en / ar / ru (מה ש-Grok תומך)
Phase B3 — Outbound + Scheduler
- Outbound caller (Twilio outbound + Pipecat)
- Cron scheduler: תזכורות 24h/1h, retries לשיחות שלא נענו
- Cascade קוסט-ערוצים: לא ענה לקול → SMS → WhatsApp
- Call analytics: outcome detection, duration stats
🅲 Track C — UI/UX (איש אחד)
Phase C1 — Marketing Site
- Next.js: Home + 4 דפי מוצר + Pricing + Contact + Legal
- "מחשבון פניות אבודות" אינטראקטיבי ב-Hero
- SEO + JSON-LD + sitemap
- RTL מלא + responsive
Phase C2 — Onboarding Wizard
- Wizard מודרך (URL/PDF/Word → אישור → choose playbook → choose voice)
- Loading screen חכם תוך כדי scrape (מה קורה ברקע)
- Preview של ה-extracted JSON בטופס נערך
- "דבר עם הסוכן עכשיו" — WebRTC לפני תשלום
- Tranzila iFrame embed
Phase C3 — Tenant Dashboard
- רשימת שיחות + תמלול + audio player
- Contact list (CRM-לייט)
- הגדרות סוכן (עריכת system_prompt, voice, tools)
- Billing page (חבילה, חשבוניות, צריכה)
- Settings (פרופיל, צוות, integrations)
סדר תלויות (מי מחכה למי)
- C1 (Marketing site) יכול להיבנות מ-day-1 במקביל לכולם — לא תלוי בכלום.
- B1 (Multi-tenant wrap) דורש את DB schema מ-A1 → תלות קלה.
- C2 (Wizard) דורש את ה-onboarding endpoints מ-A2 → תלוי ב-A2.
- C3 (Dashboard) דורש את ה-CRUD מ-A1+A2 ואת ה-call data מ-B1+B2.
- B3 (Outbound) אחרון — דורש הכל לעבוד תחילה.
14. שאלות פתוחות + החלטות שנסגרו
✅ נסגרו
| נושא | החלטה |
|---|---|
| מודלים ל-prompt generation | Claude Opus 4.7 primary, GPT-5.4 / Grok 4 כ-fallback. אין Gemini בכלל. |
| קריאת PDF/Word | אותם מודלים — Claude Opus 4.7 (vision) או GPT-5.4 (vision). לא Gemini. |
| Voice realtime primary | xAI Grok Voice (אומת בעברית) |
| Voice realtime fallback | OpenAI Realtime (אם Grok חורק או downtime) |
| RAG | אין. הכל ב-system_prompt. אם לקוח Enterprise יבקש — בנייה ידנית ע"י המתכנת. |
| Firecrawl | OK להתחיל עם חינמי (500 calls/חודש), משדרגים ב-need basis. |
| שמירת אודיו | Supabase Storage. הודעת "שיחה מוקלטת" בתחילת שיחה (חוק הגנת פרטיות). |
| Data Residency | לא רלוונטי כרגע — ישראל/EU בעתיד. |
| White-label | לא עכשיו — פוקוס SOHO/SMB ישירות. |
| WebRTC demo cost | על חשבוננו. rate limiting פר-IP. |
| שם הסוכן | הלקוח בוחר באונבורדינג. ברירת מחדל: "תמיר" / "נועה" / "אלמוג". |
| Hosting | שרת שלנו. החלטה ספציפית (Hetzner/AWS/וכו') — לא רלוונטי לאפיון. |
| שפות | עברית + ערבית + רוסית + אנגלית — לפי מה ש-Grok תומך. עברית primary. |
⚠️ שאלות פתוחות רציניות
1. PBX / Multi-line customers (שאלה רצינית)
מה עושים עם לקוח עם 4-12 קווים נכנסים (מרפאה גדולה, סוכנות נדל"ן)? Twilio תומך SIP Trunking אבל זה דורש:
- או BYOC (Bring Your Own Carrier) — הלקוח מעביר את כל הקווים שלו ל-Twilio (מורכב, כרוך בהעברת מספרים)
- או SIP Trunk הדדי — חיבור Twilio ל-3CX/Asterisk של הלקוח (דורש קונפיגורציה ידנית)
- או Forwarding — הלקוח מגדיר העברת שיחה ממרכזיה לקיימת למספר Twilio שלנו (פשוט, אבל מחייב ניתוב לוגי בצד שלנו)
המלצה ל-MVP: תמיכה רק ב-forwarding (פשוט). PBX/SIP יבוא בשלב מאוחר כשנגדיר קהל יעד SME ספציפי.
2. תמחור - האם ₪2 לדקה overage יעבוד?
הלקוח חושש שאף אחד לא ישלם ₪2/דקה. AgenTeam ב-Pro עומדים על ~₪2.33/דקה — אבל הם עוסקים בעיקר במכירה אנושית, לא self-serve. ל-self-serve העיניים של הלקוח על המחיר חדות יותר. צריך:
- אולי חבילות גדולות יותר במחירים אחידים (1,500₪ ל-700 דקות במקום overage)
- שקיפות: התראה ב-80% צריכה
- אופציה לקנות "block" של 500 דקות תוך-חודשי ב-₪900 (₪1.8/דקה — זול יותר מ-overage רגיל)
3. שם מותג + דומיין
"Voice Center" זה codename. צריך לבחור שם שיווקי. אופציות: Sokenet, AgentLine, Voxa, Mishrad, Helper.co.il, Snahala, Voicy. זמינות .co.il / .com / .ai חייבת להיבדק + סימני מסחר.
4. "עורך סוכן ויזואלי" — מה זה אומר?
התכוונתי ל-workflow editor דמוי Make/n8n — drag&drop של בלוקים: "if customer says X → call tool Y → say Z". זה scope גדול. החלופה הפשוטה ל-MVP: טופס פשוט עם רשימת tools פעילים (checkboxes) + textarea אחד ל-custom instructions. שווה לדון אם בכלל נחוץ.
5. WhatsApp Business — תהליך הצטרפות
Twilio WhatsApp דורש אישור Meta (1-7 ימים, ידני) פר-לקוח. זה ייצור חוויה לא חלקה במהלך onboarding. אופציות: (א) להציע WhatsApp כ"upgrade" בנפרד אחרי שהלקוח כבר משלם; (ב) להשתמש ב-shared sender של Twilio (לא ממותג של הלקוח).
15. Latency & Redis — הסבר בגובה העיניים
טאב זה נכתב למי שלא מתכנת — מסביר למה השרת חייב להגיב מהר בשיחה קולית, מה התפקיד של Redis, ומה ההבדל בינה לבין מסד הנתונים הראשי.
למה Latency נמוך זה קריטי בשיחה קולית?
בשיחת טלפון, שתיקה ארוכה היא אסון. אדם שמתקשר מצפה לשמוע תשובה תוך 800ms-1.2 שניות אחרי שסיים לדבר. מעבר ל-2 שניות → תחושת "המערכת לא עובדת", המתקשר חוזר על עצמו, או שואל "הלו?" — והסוכן עונה תוך כדי. תוצאה: שיחה הופכת לבלגן.
בצ׳אט-טקסטואלי אנשים סובלניים יותר — שניה-שתיים של "מקליד..." זה בסדר. בקול, אין מקום לטעויות.
תקציב הזמן של הסוכן (סך הכל ~1 שנייה)
| שלב | זמן |
|---|---|
| המתקשר סיים לדבר → STT מעבד | ~150ms |
| זיהוי המתקשר + טעינת ההקשר | ~80ms ← Redis קריטי כאן |
| LLM חושב ומחזיר תשובה | ~500ms |
| TTS מתחיל לדבר (streaming) | ~150ms |
| סה"כ עד שהמתקשר שומע | ~880ms |
אם שלב הזיהוי לוקח 200ms במקום 80 — סך הכל מגיע ל-1s+, מורגש. אם הוא לוקח 500ms (DB lookup רגיל בלי cache) — נכנסים לאזור "זה לא עובד".
הסתכלות High-Level על הארכיטקטורה
Redis ו-Postgres — האנלוגיה של המשרד
📦 Postgres — ארון התיוק
כל פרטי הלקוחות, השיחות, ההיסטוריה. מסודר, אמין, נשמר לנצח. אבל לפתוח תיק בארון לוקח זמן — חיפוש, שליפה, פתיחה. כל פעם שצריך משהו, הולכים לארון.
זה ה-DB הראשי שלנו. מתארחים ב-Supabase.
📋 Redis — הפתק על השולחן
ליד היד. תוך פחות משנייה. לא בשביל לשמור לנצח — בשביל "ביד". רושמים עליו את הדברים שצריך כרגע ומיד.
זיכרון בזיכרון (RAM) — מהיר אקסטרים, אבל אם מכבים — נמחק.
תרחיש: מה קורה כשמישהו מתקשר
בלי Redis
- אדם מחייג למוסך
- השרת רץ לארון התיוק → "מי זה? מה ההיסטוריה?" → 200ms
- אדם שומע שתיקה ארוכה עד שהסוכן עונה
- תחושת "זה לא עובד טוב"
עם Redis
- אדם מחייג למוסך
- השרת מסתכל על הפתק → "אה, זה דני, היה כאן שלשום עם הסוברו" → 2ms
- הסוכן עונה מיד: "שלום דני, הסוברו עוד מטרידה?"
- תחושת קסם
3 השימושים של Redis אצלנו
1. זיכרון מהיר (Cache)
פרטי לקוחות שהתקשרו לאחרונה, שעות פתיחה של עסקים, הגדרות סוכן (system_prompt + voice) — דברים שהשרת משתמש בהם בכל שיחה. במקום ללכת לארון בכל פעם, יש "העתק" על הפתק.
2. רשימת משימות (Queue)
כשבעל עסק לוחץ "סרוק את האתר שלי" — הסקרייפ לא קורה מיד. הוא לוקח 30-60 שניות. השרת לא יכול להחזיק את המסך תקוע — אז הוא רושם על פתק: "צריך לסרוק את XYZ" וממשיך לטפל בלקוח. עובד אחר במשרד (background worker) בודק את הפתקים ועובד עליהם ברקע.
דוגמאות: סקרייפ אתרים, תמלולים אחרי שיחה, סנכרון עם CRM, שליחת תזכורות בעוד 24 שעות.
3. ספירה (Rate Limiting)
"כמה שיחות עשה הלקוח הזה החודש?" — אם נצטרך לספור בכל פעם בארון התיוק, זה לוקח זמן. הפתק מחזיק מונה שמתעדכן תוך שנייה. גם הגנה: אם מישהו מנסה לנצל לרעה את ה-API שלנו — הפתק סופר כמה בקשות בדקה ומפסיק אותו.
איפה מתארחים
| אופציה | למי מתאים |
|---|---|
| Upstash (מומלץ) | שירות ענן — נרשמים, מקבלים כתובת + סיסמה, מדביקים בקוד. 5 דקות, חינם להתחלה (10K commands ביום). |
| Railway Redis | אם הכל בלאו הכי על Railway. ~$5/חודש. |
| שרת שלנו | דורש ניהול, גיבויים, מוניטור. לא מומלץ בהתחלה. |
האם חיוני מיום-1?
טכנית — לא הכרחי לחלוטין. אפשר להתחיל בלי, המוצר יעבוד.
מעשית — כדאי מאוד מההתחלה:
- תוך שבועיים, כשיש 50+ שיחות במקביל, אנשים ירגישו ש"זה איטי" — ויעופו
- BullMQ (לעבודות ברקע — תזכורות, סקרייפ, סנכרון) דורש Redis כתשתית
- Upstash זה 5 דקות הקמה וחינמי בשלב הראשון — אין סיבה אמיתית לוותר
ההמלצה: Upstash מיום-1, פשוט.
RAG ו-Redis — איך זה משתלב?
RAG ו-Redis הם שני דברים שונים לחלוטין. אבל הם משתלבים יפה. RAG עוזר ל-LLM למצוא מידע רלוונטי. Redis עוזר ל-RAG לרוץ מהר. הם לא מתחרים — הם משלימים.
3 כלים, 3 מטרות שונות
| כלי | מה הוא עושה | אנלוגיה |
|---|---|---|
| Postgres | אחסון מסודר לנצח | 📦 ארון תיוק |
| Redis | זיכרון מהיר לדברים שצריך עכשיו | 📋 פתק על השולחן |
| Vector DB | חיפוש "מה דומה לשאלה הזו?" — לב ה-RAG | 📚 ספרן חכם שמוצא פרק רלוונטי |
ה-Vector DB יכול להיות pgvector (תוסף של Postgres — הכי נפוץ ל-MVP), או שירות נפרד
כמו Pinecone / Weaviate. Redis היא לא Vector DB (אם כי קיים Redis Stack שמשלב את שניהם).
איך RAG עובד בשיחה אמיתית (בלי Redis)
1. לקוח שואל "כמה עולה ערעור?"
↓
2. ה-LLM שולח את השאלה ל-Retriever
↓
3. Retriever מחשב embedding לשאלה (~300ms)
↓
4. מחפש ב-Vector DB chunks דומים (~100ms)
↓
5. מקבל top-5 פרקים רלוונטיים
↓
6. שולח ל-LLM: [שאלה + 5 פרקים] → תשובה
↓
7. הסוכן עונה
סה"כ ~400ms על שלבי RAG. בלי Redis — בכל שיחה.
4 דרכים לשלב Redis ב-RAG
1. קאש על שאלות חוזרות (הפשוט והאפקטיבי ביותר)
"מה שעות הפתיחה?" — לקוחות שואלים 20 פעם בשבוע. שאלה זהה → Redis מחזיר תשובה מוכנה ב-2ms. חוסך גם embedding, גם חיפוש, גם קריאה ל-LLM.
שמירה: מפתח = hash של השאלה. ערך = התשובה המוכנה. TTL שעה-יום.
2. קאש על embeddings
אותה מילה/ביטוי חוזרים בהרבה שאלות שונות. במקום לחשב embedding מאפס בכל פעם — שולפים מ-Redis.
שמירה: מפתח = hash של הטקסט. ערך = הוקטור (1536 מספרים).
3. קאש על תוצאות retrieval
שאלות דומות אך לא זהות ("כמה עולה ערעור?" / "מה המחיר של ערעור?") → אחרי החיפוש הראשון, שומרים את ה-top-5 chunks. חיפוש semantic זה השלב הכבד אחרי ה-LLM, וקאש כאן משמעותי.
4. Redis בתור Vector DB עצמה (מתקדם)
Redis Stack כולל RediSearch + Vector Similarity Search — אפשר לעשות RAG שלם
בתוכה. רלוונטי כשיש אלפי שאילתות בדקה, או כשרוצים hosting אחד פחות. ל-MVP זה מיותר —
pgvector מספיק.
הסטאק המומלץ עם הכל ביחד
┌──────────────────────────────────────────────┐ │ שאלה מהמתקשר │ │ ↓ │ │ 1. בדוק Redis ── יש תשובה מוכנה? ── יש → החזר│ │ ↓ אין │ │ 2. embedding ── יש בקאש? ── יש → דלג │ │ ↓ אין │ │ 3. pgvector חיפוש → top-5 chunks │ │ ↓ │ │ 4. שמור תוצאות ב-Redis (TTL שעה) │ │ ↓ │ │ 5. שלח ל-Grok עם הקונטקסט │ │ ↓ │ │ 6. שמור תשובה סופית ב-Redis (TTL 5 דקות) │ └──────────────────────────────────────────────┘
איזה דפוס מתי?
| נפח שיחות | המלצה |
|---|---|
| פחות מ-10 במקביל | pgvector בלבד. אל תקאש כלום. פשוט. |
| 10-100 במקביל | pgvector + Redis לקאש שאלות חוזרות (דפוס #1 בלבד) |
| 100+ במקביל | כל 4 הדפוסים. אולי גם לעבור ל-Redis Stack כ-Vector DB |
למה לא Cloudflare KV?
שאלה לגיטימית — Cloudflare KV הוא ה-key-value store של Cloudflare. אבל הוא לא תחליף ל-Redis. הסיבות:
| ממד | Cloudflare KV | Redis (Upstash/Railway) |
|---|---|---|
| Latency קריאה | 10-50ms | 1-5ms |
| עקביות | Eventually consistent (~60s propagation) | Strong (מיידי) |
| Atomic INCR (לספירה) | ❌ | ✅ |
| Queue / BullMQ | ❌ | ✅ |
| Pub/Sub | ❌ | ✅ |
| TTL | ✅ | ✅ |
| חינמי | 100K reads/יום | 500K commands/חודש (Upstash) |
4 סיבות שזה לא יעבוד
- Latency גבוה מדי — 10-50ms פר קריאה זה לא מתאים לשיחה קולית (חייבים מתחת ל-10ms)
- BullMQ דורש Redis אמיתי — ה-Queue layer של עבודות ברקע (סקרייפ, תזכורות, סנכרון) לא יעבוד על KV. נצטרך לכתוב queue משלנו = חודש עבודה.
- Rate Limiting נשבר — בלי INCR אטומי, שני workers יכולים לקרוא+לכתוב במקביל ולסטות מהמספר הנכון.
- הסרבר רץ ב-Railway/Fly, לא ב-CF Workers — היתרון של KV הוא קרבה ל-Workers. אם השרת שלנו לא ב-CF — אנחנו מאבדים את היתרון.
מתי כן Cloudflare KV?
- Feature flags גלובליים
- Config סטטי שמשתנה לעיתים רחוקות
- Session tokens (אם השרת רץ ב-CF Workers — שזה לא המקרה שלנו)
אם בעתיד נשכתב הכל ל-Cloudflare Workers + Durable Objects, יש שיחה אחרת. ל-MVP — לא רלוונטי.
Upstash vs Railway — איפה לארח את Redis?
שני האפשרויות העיקריות. שניהם טובים. הנה ההשוואה אחרי בדיקה מעודכנת (מאי 2026):
Upstash Redis (Serverless)
- API תואם Redis לחלוטין (drop-in)
- חינמי: 500K commands/חודש + 256MB (עודכן ב-2025)
- Pay-as-you-go מעבר לחינמי: $0.20 ל-100K commands
- אזורים גלובליים — קרבה גיאוגרפית טובה
- אין שרת לנהל, אין גיבויים, אין מוניטור
- 5 דקות הקמה (לוחצים Create → מקבלים URL + סיסמה)
- אינטגרציות רשמיות ל-Vercel / Cloudflare / Railway
מתי: רוב המקרים. במיוחד כשהשירותים מפוזרים בין ספקים.
Railway Redis (Self-managed addon)
- One-click — נכנסים לפרויקט Railway → "Add Service" → Redis
- תמחור usage-based: ~$0.014/GB-hour RAM + $0.25/GB-חודש storage
- תוכנית Hobby (₪19/$5 חודש) — $5 קרדיט שמכסה Redis קטן בקלות
- אותו cluster כמו השרת — latency פנימי נמוך מאוד
- אין free tier ייעודי — אבל הקרדיט של Hobby עוטף את זה
- לא serverless — תמיד פועל, גם בלי traffic
מתי: אם השרת ראשי בלאו הכי ב-Railway, רוצים stack מאוחד אחד.
ההמלצה הסופית
Upstash Redis — בעיקר בגלל:
- החינמי גמיש יותר: 500K commands בחודש זה ~16K ביום. ב-MVP זה יותר ממספיק לעשרות לקוחות הראשונים בלי לשלם בכלל.
- בלי vendor lock-in: אם נעבור מ-Railway ל-Fly.io או לאחר — Upstash נשארת אותו דבר. Railway Redis קשור לפלטפורמה.
- Serverless = שקט נפשי: אין מה לנהל, אין מה לעדכן. בעיה? הם פותרים.
- אינטגרציה מעולה עם Cloudflare: גם אם נשתמש ב-CF Workers בחלק מהזרימות בעתיד, Upstash עובד באופן רשמי איתם.
Railway Redis הוא ברירת מחדל סבירה אם הכל ממילא רץ ב-Railway. רגע ההחלטה: אם השרת הראשי שם, הקרדיט של ה-Hobby plan ($5 שלא תנצל ממילא) מכסה Redis קטן בלי תשלום נוסף — וזה גם הגיוני.
אסור: Cloudflare KV ל-Voice Center. הוא לא תחליף ל-Redis במקרה שלנו.
16. Twilio Concurrency — שיחות מקבילות, PBX, ו-SIP Trunk
הטאב הזה עונה על השאלה הקריטית: אם 10 שיחות מגיעות בו-זמנית למספר אחד שקנינו ב-Twilio, מה קורה? האם הסוכן עונה לכולן? או רק לאחת? וגם את התרחיש ההפוך — 10 יוצאות במקביל.
1. שיחות נכנסות — האם מספר אחד מטפל ב-N שיחות במקביל?
כן. ללא הגבלה פר-מספר.
מספר טלפון ב-Twilio הוא לא "קו" במובן המסורתי. הוא identifier ש-Twilio משתמשת בו כדי לנתב שיחות. כל שיחה נכנסת יוצרת session נפרד: webhook נפרד, WebSocket נפרד, instance נפרד של הסוכן בצד שלנו. שיחה לא חוסמת שיחה.
דוגמה ממקרה אמיתי: מרפאה עם 5 קווים פיזיים → המרכזיה שלהם (3CX/Asterisk/Bezeq) מפנה את כולם למספר Twilio אחד שלנו → 5 לקוחות יכולים לחייג במקביל, כל אחד מקבל סוכן שלו, אין חוסם.
מה כן יכול להגביל?
| מקור | הגבלה | טיפול |
|---|---|---|
| Twilio account-level concurrency | Trial: 1. Paid default: ~100 שיחות במקביל בכל החשבון | פותחים תיקט ל-Twilio להעלאה, עד אלפים |
| קיבולת השרת שלנו | תלוי ב-vCPU/RAM. Pipecat WS לוקח ~100MB RAM פר שיחה | scale horizontal — עוד workers, או larger VM |
| קיבולת ה-LLM (Grok) | Rate limit פר API key — נמדד ב-tokens/min | multiple keys, או upgrade plan |
| PSTN carrier בצד הלקוח | המרכזיה של הלקוח אולי לא מעבירה 50 שיחות במקביל | לא בעיה שלנו — של ספק הטלפוניה שלהם |
2. שיחות יוצאות — האם מספר אחד יכול לחייג 10 במקביל?
כן. אותו עקרון. נשלחות 10 קריאות API POST /Calls במקביל, כל אחת
משתמשת באותו From number, וכולן רצות בו-זמנית. כל אחת היא session נפרד.
שמיים: 10 קמפיינים יוצאים מאותו מספר, 10 instances של הסוכן רצים במקביל, כל אחד שיחה שונה.
מה כן עלול לחורק?
- Caller ID זהה לכל הנמענים — 10 נמענים שונים יראו את אותו מספר. אם 3 מהם חוזרים בו-זמנית, זה inbound רגיל (לא בעיה). אבל אם מבחינה שיווקית רוצים שכל קמפיין יראה מספר שונה — צריך כמה מספרים.
- Anti-spam מצד carriers — בארה"ב יש "STIR/SHAKEN" שעלול לתייג מספר שמחייג להרבה אנשים כ-spam. בישראל פחות. עדיין: לפזר על 2-3 מספרים זה healthy לקמפיינים גדולים.
- Twilio account concurrency limit — אם החשבון מוגבל ל-100 ויש לך 80 נכנסות + 30 יוצאות → תהיה חסימה ב-10.
3. מתי צריך SIP Trunk?
SIP Trunk זה פרוטוקול שמחבר מערכות טלפוניה דרך IP. בהקשר שלנו, יש כמה תרחישים:
🔹 תרחיש A: לקוח עם PBX קיים (3CX / Asterisk / Bezeq Centrex)
הלקוח כבר משלם על מרכזיה והוא לא רוצה להחליף אותה. רוצה רק חלק מהשיחות לעבור לסוכן AI.
הפתרון הפשוט (Forwarding):
- הלקוח מגדיר במרכזיה: "אם אף אחד לא ענה תוך 3 צלצולים → העבר למספר Twilio שלנו"
- או: "כל השיחות אחרי שעות העבודה → העבר ל-Twilio"
- או: "בחר 1 לדבר עם סוכן AI → העבר ל-Twilio"
אין צורך ב-SIP Trunk. זה רק call forwarding רגיל בצד הלקוח. עובד לכל גודל.
🔹 תרחיש B: לקוח רוצה להחליף מרכזיה לגמרי
לקוח עם 20 עובדים שמתעב את ה-3CX, רוצה ש-Voice Center יהיה המרכזיה החדשה — כולל ניתוב לעובדים פנימיים.
הפתרון (BYOC / SIP Trunk):
- מעבירים את המספרים הקיימים ל-Twilio (number porting — 2-4 שבועות)
- או מחברים SIP Trunk מ-Twilio לקיים
- בונים IVR + ניתוב פנימי
זה לא MVP. זה מוצר נפרד שיכול לבוא הרבה יותר מאוחר.
🔹 תרחיש C: נפחי שיחות עצומים (100+ במקביל)
קמפיין מכירות אגרסיבי, מוקד שירות גדול. ה-account concurrency limit של Twilio מתחיל להפריע.
הפתרון:
- SIP Trunk עם הקצאת "channels" קבועים (10 / 50 / 100 / 500)
- מבטיח קיבולת מוסכמת
- תמחור מבוסס channel + שיחה, לא רק שיחה
גם זה לא MVP. רלוונטי כשיש לקוח קונקרטי שצריך את זה.
4. השורה התחתונה ל-Voice Center
ב-MVP אנחנו לא נוגעים ב-SIP Trunk בכלל.
- כל לקוח מקבל מספר Twilio רגיל
- הוא מגדיר במרכזיה שלו forwarding למספר שלנו (לשעות, לאחר שעות, או תמיד — ההחלטה שלו)
- Twilio מטפל ב-שיחות מקבילות אוטומטית, ללא הגבלה ברמת המספר
- אם נגיע ל-100+ שיחות במקביל בחשבון — נפנה ל-Twilio להעלאת ה-cap
SIP Trunk וניהול מרכזיה הם מוצר נפרד שאפשר להציע אחר כך — לאחר ש-MVP אמיתי באוויר ויש לקוחות שמבקשים שיחזירו את כל ה-PBX שלהם.
5. תשובה לשאלות הספציפיות
| השאלה | התשובה |
|---|---|
| הלקוח יש 8 קווים שמופנים לקו אחד שלנו. Twilio יענה לכולם במקביל? | כן. אם 8 חייגו בו-זמנית — 8 instances של הסוכן רצים במקביל, כל אחד שיחה נפרדת. |
| אפשר להפעיל 10 סוכנים יוצאים על קו אחד במקביל? | כן. מספר אחד יכול לבצע 10 שיחות יוצאות מקבילות. ה-API לא מגביל את זה. |
| אז מתי בכל זאת נדרש SIP Trunk? | רק כש: (א) הלקוח רוצה להעביר את כל מרכזייתו אלינו, או (ב) יש לו 100+ שיחות במקביל באופן קבוע. שני התרחישים לא רלוונטיים ל-MVP. |
| מספר Twilio מטפל בכל פעם בשיחה אחת? | לא. זו תפיסה שגויה ממרכזיות מסורתיות. ב-VoIP/Twilio, מספר הוא ID לניתוב — לא "קו" פיזי. |