AI בטפסים, ביצירה ובייבוא

איך שדות טופס מקבלים כפתור AI, איך מפעילים ומכבים אותו, יצירת רשומות עם AI מרשימת פאנל, ייבוא אקסל, והספרייה wizzo_ai לקריאה למודל מהקוד.

⏱ 7 דק' קריאה 1252 מילים ערוך דף זה ב-GitHub

כשהשירות 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[]שמות שדות אחרים בטופס שהערך שלהם נשלח למודל כהקשר
promptfalseפרומפט בסיס
num_wordsfalseאורך מבוקש במילים
versions1מספר גרסאות שמוצגות לבחירה
suggestionsshorter, longer, detailed, simple, clickbait פעילים; formal, casual, seo כבוייםכפתורי "שפר" מהירים
allow_edit_prompttrueהאם המשתמש יכול לערוך את הפרומפט לפני שליחה
show_previewtrueתצוגה מקדימה לפני הכנסה לשדה
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_buttontrueכפתור יצירה מהירה לפי ההקשר
advanced_buttontrueכפתור יצירה מתקדמת
context_fields[]שדות שמהם נבנה הפרומפט
default_promptריקפרומפט בסיס
image_sizewideגודל
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 (מנהלים בלבד):

  1. הקלט: {insert_url, items_count (1 עד 10), instructions, files[], generate_images}.
  2. השרת פונה ל-insert_url עם הכותרת AI-Form-Discovery: 1 ועוגיית המנהל, ומקבל את תיאור שדות הטופס.
  3. קבצים שהועלו נשמרים זמנית, ותמונות מנותחות במודל.
  4. לכל פריט נבנה פרומפט שמתאר את השדות (חובה, אופציונלי, אפשרויות בחירה), ונשלח למודל בבקשה לקבל JSON.
  5. כל רשומה נשמרת בשליחת הטופס עצמו עם הכותרת AI-Form-Insert: 1, כך שכל הוולידציות, ה-mcp_write וההרשאות של הטופס חלות. מזהה הרשומה חוזר בכותרת AI-New-ID.
  6. עם 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 אחרונות).

ראו גם#

מצאתם טעות או חוסר? תקנו את הדף או פתחו Issue בריפו. התיעוד נכתב מתוך הקוד של ליבה 5.0.115.