כשהשירות WizzoAI פעיל באתר, כל טופס באדמין מקבל יכולות AI בלי שורת קוד: כפתור כתיבה בשדות טקסט, יצירת תמונה בשדות קובץ, וכפתור "יצירה עם AI" ברשימות. הדף מסביר מה מופעל אוטומטית, איך מתאימים או מכבים כל חלק, ואיך קוראים ל-LLM מהקוד של הפאנל שלכם עם wizzo_ai.
כל מה שבדף דורש ש-market_service::is_active("wizzoai") יחזיר אמת. באתר בלי השירות לא מוצג שום כפתור ולא מבוצעת שום קריאה.
AI בשדה טקסט#
FormInput_Text ו-FormInput_Textarea מקבלים AI אוטומטית כש-CONFIG::$system_type == "admin", ו-Form::$allow_ai אמת, והשדה לא כובה במפורש. כדי לשנות את התנהגות השדה קוראים ל-ai() על ה-input:
$title = new FormInput_Text("title");
$title->title = "כותרת";
$title->table = "content";
$title->group = "content";
$title->ai([
"prompt" => "כתוב כותרת חדשותית קצרה",
"num_words" => 12,
"fields" => ["subtitle", "text"], // שדות נוספים שיצורפו כהקשר
"versions" => 3, // כמה הצעות להציג
"suggestions" => ["shorter" => true, "seo" => true],
]);
$title->Must();
$frmForm->push($title);
$internal = new FormInput_Textarea("internal_note");
$internal->ai_disable(); // בלי AI בשדה הזה
$frmForm->push($internal);
הגדרות ai($m_settings = [])#
| מפתח | ברירת מחדל | משמעות |
|---|---|---|
fields | [] | שמות שדות אחרים בטופס שהערך שלהם נשלח למודל כהקשר |
prompt | false | פרומפט בסיס |
num_words | false | אורך מבוקש במילים |
versions | 1 | מספר גרסאות שמוצגות לבחירה |
suggestions | shorter, longer, detailed, simple, clickbait פעילים; formal, casual, seo כבויים | כפתורי "שפר" מהירים |
allow_edit_prompt | true | האם המשתמש יכול לערוך את הפרומפט לפני שליחה |
show_preview | true | תצוגה מקדימה לפני הכנסה לשדה |
model, provider | ריק | מודל וספק מסוימים. ריק פירושו ברירת המחדל של WizzoAI |
הערך ב-suggestions מחליף את מפת ברירת המחדל כולה (array_merge שטוח), לכן ציינו את כל הכפתורים שאתם רוצים.
הדפדפן קורא ישירות לשרת ה-stream של WizzoAI עם מפתח האתר, ולא דרך ה-PHP. מסיבה זו המפתח נחשף לדפדפן של המנהל, ראו את ההערה ב-צ'אט AI.
כיבוי כללי#
Form::$allow_ai = false; // לפני בניית הטפסים: אין AI בכל הטפסים של הבקשה
כיבוי ברמת הטופס משפיע גם על יצירת התמונות בשדות הקובץ ועל כפתורי ה-AI בשדה ה-SEO.
יצירת תמונה בשדה קובץ#
בשדה FormInput_drop נוסף אוטומטית כפתור יצירת תמונה. לכוונון קוראים ל-ai_image():
$image = new FormInput_drop("image");
$image->title = "תמונה ראשית";
$image->ai_image([
"context_fields" => ["title", "subtitle"], // משמשים לבניית פרומפט אוטומטי
"default_prompt" => "צילום מערכתי נקי, תאורה טבעית",
"image_size" => "wide", // או 1024x1024, 1792x1024, 1024x1792
]);
$frmForm->push($image);
| מפתח | ברירת מחדל | משמעות |
|---|---|---|
quick_button | true | כפתור יצירה מהירה לפי ההקשר |
advanced_button | true | כפתור יצירה מתקדמת |
context_fields | [] | שדות שמהם נבנה הפרומפט |
default_prompt | ריק | פרומפט בסיס |
image_size | wide | גודל |
model, provider | ריק | כמו בטקסט |
התמונה שנוצרת נשמרת ב-STORAGE דרך {admin}/ai_chat/save_image (פירוט).
יצירת רשומות עם AI#
בראש רשימת פאנל (panel_table) אפשר להציג כפתור "יצירה עם AI". הפעלה:
$lstListManager->btn_add_url = CONFIG::$admin_url . "/Pages/insert";
$lstListManager->ai_insert_enabled = true; // מציג את הכפתור
// או: מספיק לקבוע פרומפט בסיס כדי להפעיל אותו כשהשירות פעיל
$lstListManager->ai_insert_default_prompt = "כתבו עמוד שירות בטון מקצועי";
הזרימה בצד השרת, POST /system/ai_insert_api/create (מנהלים בלבד):
- הקלט:
{insert_url, items_count (1 עד 10), instructions, files[], generate_images}. - השרת פונה ל-
insert_urlעם הכותרתAI-Form-Discovery: 1ועוגיית המנהל, ומקבל את תיאור שדות הטופס. - קבצים שהועלו נשמרים זמנית, ותמונות מנותחות במודל.
- לכל פריט נבנה פרומפט שמתאר את השדות (חובה, אופציונלי, אפשרויות בחירה), ונשלח למודל בבקשה לקבל JSON.
- כל רשומה נשמרת בשליחת הטופס עצמו עם הכותרת
AI-Form-Insert: 1, כך שכל הוולידציות, ה-mcp_writeוההרשאות של הטופס חלות. מזהה הרשומה חוזר בכותרתAI-New-ID. - עם
generate_images: trueנוצרות תמונות לשדות תמונה ריקים.
התשובה: {success, created_count, created_ids, edit_urls, ai_data}. ai_data הוא הפלט הגולמי של המודל, ומיועד לבדיקה.
הרשומות נוצרות במצב שהטופס קובע. טופס שמפרסם כברירת מחדל יפרסם גם את תוכן ה-AI. בדקו את ברירות המחדל של הפאנל לפני שמאפשרים יצירה המונית.
טופס "ידידותי ל-AI"#
השדות שלכם משתתפים ב-discovery וב-insert דרך שלוש מתודות של FormInput: mcp_write($value) מנרמל את מה שהמודל שולח לפורמט ש-get_results() מצפה לו, mcp_skip_absent($id) מונע מחיקת ערך קיים כשהשדה לא נשלח בעדכון פרוגרמטי, ו-api_schema() מתאר את השדה. שדות מורכבים חדשים צריכים לממש אותן. פירוט ב-שדות טופס.
ייבוא מאקסל#
ייבוא אקסל זמין ברשימות של panel_table ($lstListManager->excel_import_enabled, פעיל כברירת מחדל). הוא לא משתמש במודל, והוא מופיע כאן כי הוא חולק את מנגנון ה-insert:
| שלב | POST /system/excel_import_api/<action> | מה קורה |
|---|---|---|
| קריאה | process (multipart: excel_file, insert_url) | PhpSpreadsheet קורא את הגיליון ומחזיר נתונים ועמודות למיפוי |
| ייבוא | import (JSON: excel_data, field_mappings, skip_first_row, insert_url) | כל שורה מאומתת לפי סוג השדה ונשמרת דרך הטופס |
field_mappings ממפה עמודה בגיליון לשם שדה בטופס. שתי הפעולות למנהלים בלבד.
כדי להגביל ייבוא לבעלי הרשאה: $lstListManager->excel_import_enabled = ADMIN::has_perms("products_import");. שימו לב שזה מסתיר את הכפתור, אבל נקודת ה-API עצמה דורשת רק מנהל.
קריאה למודל מהקוד: wizzo_ai#
$this->load->library("wizzo_ai");
כל המתודות סטטיות. הקריאה הולכת ל-https://stream.ai.wizzo.media/api/<action> עם מפתח ה-WizzoAI של האתר.
| חתימה | מחזיר | זורק? |
|---|---|---|
ai($prompt, $settings = []) | מחרוזת (עם json: true: מחרוזת JSON), או false | כן |
ai_full($prompt, $settings = []) | תשובה מלאה: data, input_tokens, output_tokens, cached_tokens, wizzo_tokens | כן |
json($prompt, $settings = []) | מערך מפוענח או null | לא (עם return_error: true מקבלים ["__error" => ...]) |
image($prompt, $settings = []), ai_image(...) | data של התמונה: בדרך כלל מערך כתובות, לפעמים data: URI, או false | כן |
ai_image_full($prompt, $settings = []) | התשובה המלאה | כן |
embed($text, $options = []) | וקטור מספרי או null | לא |
get_available_models() | [{id, name, provider, features_images}], או [] | כן (כשהקריאה נכשלת) |
get_prompt($sysname, $vars = []) | ["content", "model"] או false | לא |
get_usage_info() | נתוני שימוש, או false | לא |
הגדרות שנתמכות ב-$settings של ai, ai_full ו-json: type (תווית לשימוש, לדוחות), json, json_schema, image_input, system_msg, model, provider, temperature, top_p, presence_penalty, frequency_penalty, max_tokens, reasoning_effort (none, minimal, low, medium, high, xhigh, למודלי reasoning בלבד). בתמונות: type, image_size (ברירת מחדל 1024x1024), image_input, model, provider.
ai(), ai_full(), ai_image() ו-ai_image_full() זורקות Exception כשאין מפתח API, כש-cURL נכשל, כשה-HTTP שונה מ-200 או כש-JSON לא תקין. עטפו אותן ב-try/catch בקוד שרץ בבקשת משתמש. json() ו-embed() בולעות שגיאות ומחזירות null.$this->load->library("wizzo_ai");
try {
$out = wizzo_ai::json("החזר JSON עם title ו-tags עבור הטקסט: " . $text, [
"type" => "my_feature",
"json_schema" => '{"title":"","tags":[""]}',
"reasoning_effort" => "low",
]);
} catch (Exception $e) {
$out = null;
}
$p = wizzo_ai::get_prompt("storage_ai_search", ["q" => $q]); // שורה בטבלה CRM_ai_prompts
if ($p) {
$tags = wizzo_ai::ai($p["content"], ["model" => $p["model"], "type" => "storage_ai_search"]);
}
הערה: json_schema כאן הוא דוגמת JSON בפורמט הבית, לא JSON Schema רשמי.
פרומפטים מנוהלים#
הטבלה CRM_ai_prompts (sysname, content, model, version) וגרסאותיה ב-CRM_ai_prompts_versions נערכות בפאנל ai_prompts. get_prompt מחליפה {$name} בערכי $vars. כל שמירה שמשנה תוכן או מודל יוצרת גרסה חדשה (נשמרות 10 אחרונות).