מדריך אינטגרציית AI

מדריך אינטגרציית AI

מדריך זה מספק תיעוד מקיף למערכת המשנה של AI ב-WooAI Chatbot Pro. הוא מכסה את הארכיטקטורה מרובת הספקים, מערכת הכלים, הנדסת prompts, ותבניות הרחבה למפתחים בכירים המשלבים או מרחיבים את יכולות ה-AI.

בעיות ומגבלות ידועות

לפני שאתם צוללים פנימה, הנה על מה אנחנו עדיין עובדים:

בעיה סטטוס פתרון זמני
Gemini לפעמים מחזיר content ריק בבדיקה אנחנו מנסים 3 פעמים, בדרך כלל עובד
streaming של Claude לא מיושם מתוכנן ל-0.3.0 השתמשו במצב ללא streaming
function_call של OpenAI הוכרז כמיושן TODO: מעבר ל-tools API עדיין עובד, רק אזהרות בלוגים
ספירת tokens לא מדויקת לשפות שאינן אנגלית לא יתוקן (מגבלת tiktoken) הוסיפו ~20% לקירילית

בכנות: התחלנו עם OpenAI בלבד, ואז הוספנו את Claude ו-Gemini.
שכבת ההפשטה עובדת אבל לא מושלמת. PRs יתקבלו בברכה אם אתם רוצים לנקות את זה.


1. סקירת ארכיטקטורה

מערכת המשנה של AI עוקבת אחר תבנית תזמור מרובת ספקים עם fallback חכם, המאפשרת מעבר חלק בין ספקי AI תוך שמירה על חוזי API עקביים.

קומפוננטות ליבה

AIOrchestrator (Singleton)
    |
    +-- Providers (AIProviderInterface)
    |       +-- GeminiProvider
    |       +-- OpenAIProvider
    |       +-- ClaudeProvider
    |
    +-- ToolRegistry (Singleton)
    |       +-- SearchProductsTool
    |       +-- AddToCartTool
    |       +-- CreateCheckoutTool
    |
    +-- PromptBuilder

עקרונות עיצוב

  1. הפשטת ספקים: כל הספקים מיישמים את AIProviderInterface, המאפשר התנהגות פולימורפית
  2. תזמור Singleton: AIOrchestrator::instance() מבטיח נקודה יחידה לניהול ספקים
  3. שרשרת Fallback: עדיפות ניתנת להגדרה עם מעבר אוטומטי בשגיאות או הגבלות קצב
  4. הרחבת כלים: רישום כלים מבוסס תוספים דרך ToolRegistry

זרימת נתונים

הודעת משתמש
    |
    v
MessageHandler --> PromptBuilder (הרכבת קונטקסט)
    |
    v
AIOrchestrator --> בחירת ספק (לפי סדר עדיפות)
    |
    v
קריאת API לספק --> פענוח תגובה
    |
    v
ToolRegistry --> הרצת כלי (אם זוהה function_call)
    |
    v
תגובה ל-Frontend

2. AIProviderInterface

כל ספקי ה-AI חייבים ליישם את חוזה AIProviderInterface המוגדר ב-/includes/AI/AIProviderInterface.php.

חוזה הממשק

namespace WooAIChatbotAI;

interface AIProviderInterface {
    /**
     * יצירת תגובת AI מהודעות שיחה.
     *
     * @param array $messages מערך אובייקטי הודעות עם 'role' ו-'content'.
     * @param array $context  קונטקסט נוסף (מוצרים, עגלה, כלים וכו').
     * @return array|WP_Error תגובה עם 'content', 'tokens', 'model'.
     */
    public function generate_response( $messages, $context = array() );

    /**
     * פורמט הודעות לדרישות API ספציפיות לספק.
     *
     * @param array $messages פורמט הודעות פנימי.
     * @return array הודעות בפורמט הספק.
     */
    public function format_messages( $messages );

    /**
     * אימות מפתח API עם קריאת API מינימלית.
     *
     * @return bool|WP_Error True אם תקין, WP_Error אחרת.
     */
    public function validate_api_key();

    /**
     * קבלת מודלים זמינים עבור ספק זה.
     *
     * @return array מזהי מודלים עם שמות תצוגה.
     */
    public function get_models();

    /**
     * קבלת שם ספק קריא לאדם.
     *
     * @return string שם הספק (למשל 'OpenAI', 'Google Gemini').
     */
    public function get_provider_name();

    /**
     * בדיקה אם הספק מוגדר וזמין.
     *
     * @return bool True אם קיים מפתח API והספק מוכן.
     */
    public function is_available();
}

מבנה תגובה

כל הספקים חייבים להחזיר תגובות בפורמט מנורמל זה:

[
    'content'  => 'טקסט תגובת AI',
    'tokens'   => 150,                    // סה"כ tokens שנוצלו
    'model'    => 'gpt-4o-mini',          // מזהה מודל
    'provider' => 'openai',               // נוסף ע"י orchestrator
    'duration' => 1250.5,                 // מילישניות (נוסף ע"י orchestrator)
    // אופציונלי לקריאת פונקציות:
    'function_call' => [
        'name'      => 'search_products',
        'arguments' => '{"query": "מזרן"}'
    ]
]

3. ספקי AI

ספק Claude

קובץ: /includes/AI/Providers/class-claude-provider.php

Claude משתמש ב-Messages API של Anthropic עם פורמט הודעות ייחודי בו system prompts מועברים בנפרד.

תצורת API

private const API_BASE_URL = 'https://api.anthropic.com/v1';
private const API_VERSION = '2023-06-01';
private const DEFAULT_MODEL = 'claude-3-5-sonnet-20241022';

מודלים נתמכים

מזהה מודל תיאור
claude-3-5-sonnet-20241022 הכי מסוגל, ביצועים מאוזנים
claude-3-5-haiku-20241022 מהיר וחסכוני
claude-3-opus-20240229 Legacy, יכולת גבוהה ביותר
claude-3-sonnet-20240229 Legacy, מאוזן

פורמט הודעות

Claude דורש system prompts כפרמטר נפרד:

public function format_messages( $messages ) {
    $system   = '';
    $formatted = [];

    foreach ( $messages as $message ) {
        if ( 'system' === $message['role'] && empty( $system ) ) {
            $system = $message['content'];
            continue;
        }
        if ( in_array( $message['role'], ['user', 'assistant'], true ) ) {
            $formatted[] = [
                'role'    => $message['role'],
                'content' => $message['content'],
            ];
        }
    }

    return [
        'system'   => $system,
        'messages' => $formatted,
    ];
}

מטען בקשה

$payload = [
    'model'       => 'claude-3-5-sonnet-20241022',
    'max_tokens'  => 1000,
    'temperature' => 0.7,
    'system'      => $system_prompt,
    'messages'    => $formatted_messages,
];

ספק OpenAI

קובץ: /includes/AI/Providers/class-openai-provider.php

OpenAI מספק גם chat completions וגם embeddings, מה שהופך אותו לחיוני ליישומי RAG.

תצורת API

private const API_BASE_URL = 'https://api.openai.com/v1';
private const DEFAULT_MODEL = 'gpt-4o-mini';
private const DEFAULT_EMBEDDING_MODEL = 'text-embedding-3-small';

מודלים נתמכים

מזהה מודל שימוש
gpt-4o הכי מסוגל, multimodal
gpt-4o-mini איזון עלות/ביצועים
gpt-4-turbo יכולת גבוהה עם ראייה
gpt-3.5-turbo מהיר, חסכוני

יצירת Embeddings

OpenAI מקבל עדיפות לבקשות embedding בזכות מודלי embedding מעולים:

public function generate_embedding( $messages ) {
    $text = $messages[0]['content'];

    $payload = [
        'model' => 'text-embedding-3-small',
        'input' => $text,
    ];

    $response = $this->client->post( '/embeddings', ['json' => $payload] );

    return [
        'embedding' => $body['data'][0]['embedding'],
        'tokens'    => $body['usage']['total_tokens'],
        'model'     => $this->embedding_model,
    ];
}

פורמט קריאת פונקציות

OpenAI משתמש ב-tool_calls מובנים בתגובות:

// מבנה תגובה
[
    'choices' => [
        [
            'message' => [
                'tool_calls' => [
                    [
                        'id' => 'call_abc123',
                        'function' => [
                            'name' => 'search_products',
                            'arguments' => '{"query":"laptop"}'
                        ]
                    ]
                ]
            ]
        ]
    ]
]

ספק Gemini

קובץ: /includes/AI/Providers/GeminiProvider.php

Gemini של Google משתמש במבנה API שונה עם contents ו-parts.

תצורת API

private const API_BASE_URL = 'https://generativelanguage.googleapis.com/v1beta/';
private const DEFAULT_MODEL = 'gemini-2.5-flash-lite';

מודלים נתמכים

מזהה מודל תיאור
gemini-2.5-flash-lite ערך טוב ביותר, מהיר
gemini-2.0-flash ביצועים יציבים
gemini-2.5-flash יכולות פרימיום

פורמט הודעות

Gemini משתמש בתפקידי user/model עם מבנה parts:

public function format_messages( $messages ) {
    $formatted = [];

    foreach ( $messages as $message ) {
        $role = 'assistant' === $message['role'] ? 'model' : 'user';

        $formatted[] = [
            'role'  => $role,
            'parts' => [
                ['text' => $message['content']]
            ],
        ];
    }

    return $formatted;
}

פורמט הצהרת פונקציות

Gemini דורש כלים בפורמט function_declarations:

private function format_tools_for_gemini( $tools ) {
    $function_declarations = [];

    foreach ( $tools as $tool ) {
        if ( isset( $tool['function'] ) ) {
            $function_declarations[] = $tool['function'];
        }
    }

    return [
        ['function_declarations' => $function_declarations]
    ];
}

תגובת קריאת פונקציה

Gemini מחזיר קריאות פונקציה בצורה שונה:

// מבנה תגובה
[
    'candidates' => [
        [
            'content' => [
                'parts' => [
                    [
                        'functionCall' => [
                            'name' => 'search_products',
                            'args' => ['query' => 'מזרן']
                        ]
                    ]
                ]
            ]
        ]
    ]
]

4. AI Orchestrator

קובץ: /includes/AI/class-ai-orchestrator.php

ה-orchestrator הוא המתאם המרכזי לכל פעולות ה-AI, מיישם תבנית singleton עם ניהול ספקים מקיף.

קבלת Instance

$orchestrator = WooAIChatbotAIAIOrchestrator::instance();

תצורת עדיפות ספקים

העדיפות מוגדרת דרך משתנה סביבה או transient של WordPress:

# .env
AI_PROVIDER_PRIORITY=gemini,openai,claude
// שינוי עדיפות תכנותי
$orchestrator->set_primary_provider( 'openai' );

יצירת תגובה עם Fallback

public function generate_response( $messages, $context = [] ) {
    // תעדוף OpenAI לבקשות embedding
    if ( $context['embedding'] ?? false ) {
        $priority_order = array_merge(
            ['openai'],
            array_diff( $this->priority, ['openai'] )
        );
    }

    foreach ( $priority_order as $provider_name ) {
        $provider = $this->get_provider( $provider_name );

        if ( ! $provider || ! $provider->is_available() ) {
            continue;
        }

        $response = $provider->generate_response( $messages, $context );

        if ( ! is_wp_error( $response ) ) {
            $this->record_usage( $provider_name, true, $duration );
            $response['provider'] = $provider_name;
            return $response;
        }

        // טיפול בהגבלת קצב עם ניסיון חוזר
        if ( 'rate_limit_exceeded' === $response->get_error_code() ) {
            sleep( 5 );
            $retry = $provider->generate_response( $messages, $context );
            if ( ! is_wp_error( $retry ) ) {
                return $retry;
            }
        }
    }

    return new WP_Error( 'all_providers_failed', 'All AI providers failed.' );
}

אסטרטגיית הגבלת קצב

כל ספק מיישם exponential backoff:

// בתגובת 429 (Rate Limit)
sleep( self::RETRY_DELAY * $attempts ); // 2s, 4s, 6s...

סטטיסטיקות שימוש

$stats = $orchestrator->get_usage_stats();
// מחזיר:
[
    'openai' => [
        'total'        => 150,
        'success'      => 145,
        'failure'      => 5,
        'success_rate' => 96.67,
        'avg_time'     => 1250.5
    ]
]

אסטרטגיית מטמון

Transients משמשים למטמון עם תפוגה של 24 שעות:

  • woo_ai_chatbot_usage_stats – סטטיסטיקות שימוש בספקים
  • woo_ai_chatbot_provider_priority – סדר עדיפות במטמון
  • woo_ai_chatbot_provider_switches – מעקב אחר שרשרת fallback

5. Prompt Builder

קובץ: /includes/AI/class-prompt-builder.php

PromptBuilder בונה system prompts מקיפים עם קונטקסט WooCommerce, נתוני משתמש, והוראות כלים.

בניית System Prompts

$builder = new WooAIChatbotAIPromptBuilder();

$context = [
    'products' => $search_results,
    'cart' => [
        'items' => [...],
        'total' => '$150.00'
    ],
    'user' => [
        'name' => 'יוחנן',
        'orders_count' => 5
    ],
    'current_product' => $product_data,
    'recently_viewed' => [123, 456, 789]
];

$system_prompt = $builder->build_system_prompt( $context );

שכבות הזרקת קונטקסט

  1. קונטקסט חנות: שם החנות, URL, locale
  2. קונטקסט משתמש: שם, אימייל, היסטוריית הזמנות, הוצאות
  3. קונטקסט עגלה: פריטים, כמויות, סכומים
  4. קונטקסט מוצר: מוצר העמוד הנוכחי, נצפו לאחרונה
  5. קונטקסט כלים: הגדרות פונקציות זמינות
  6. כללי שפה: זיהוי רב-לשוני ותגובה

הרכבת קונטקסט WooCommerce

public function build_context_from_session( $session ) {
    $context = [];

    // קונטקסט משתמש
    if ( is_user_logged_in() ) {
        $user = wp_get_current_user();
        $context['user'] = [
            'id'           => $user->ID,
            'name'         => $user->display_name,
            'orders_count' => wc_get_customer_order_count( $user->ID ),
            'total_spent'  => wc_get_customer_total_spent( $user->ID ),
        ];
    }

    // קונטקסט עגלה
    if ( WC()->cart ) {
        $context['cart'] = [
            'items'    => $this->format_cart_items(),
            'subtotal' => WC()->cart->get_subtotal(),
            'total'    => WC()->cart->get_total( 'edit' ),
        ];
    }

    return $context;
}

ייצוא פורמט כלים של OpenAI

$openai_tools = $builder->get_openai_tools();
// מחזיר סכמת function-calling של OpenAI:
[
    [
        'type' => 'function',
        'function' => [
            'name' => 'search_products',
            'description' => 'חיפוש מוצרים...',
            'parameters' => [
                'type' => 'object',
                'properties' => [...],
                'required' => []
            ]
        ]
    ]
]

6. מערכת כלים

מערכת הכלים מאפשרת למודלי AI לבצע פעולות מובנות בתוך WooCommerce.

ToolInterface

קובץ: /includes/AI/Tools/class-tool-interface.php

namespace WooAIChatbotAITools;

interface ToolInterface {
    /**
     * מזהה כלי ייחודי המשמש את ה-AI.
     */
    public function get_name();

    /**
     * סכמת פונקציה תואמת OpenAI.
     */
    public function get_schema();

    /**
     * הרצת כלי עם פרמטרים מאומתים.
     */
    public function execute( $params );

    /**
     * אימות פרמטרים לפני הרצה.
     */
    public function validate_params( $params );
}

Tool Registry

קובץ: /includes/AI/class-tool-registry.php

$registry = WooAIChatbotAIToolRegistry::instance();

// רישום כלי מותאם
$registry->register_tool( new MyCustomTool() );

// הרצת כלי
$result = $registry->execute_tool( 'search_products', ['query' => 'laptop'] );

// קבלת כל סכמות הכלים ל-AI
$schemas = $registry->get_tool_schemas();

SearchProductsTool

קובץ: /includes/AI/Tools/class-search-products-tool.php

מחפש מוצרי WooCommerce עם חיפוש טקסט מלא, סינון קטגוריות, וטווחי מחירים.

סכמה:

[
    'type' => 'function',
    'function' => [
        'name' => 'search_products',
        'description' => 'חיפוש מוצרי WooCommerce...',
        'parameters' => [
            'properties' => [
                'query'     => ['type' => 'string'],
                'category'  => ['type' => 'string'],
                'min_price' => ['type' => 'number'],
                'max_price' => ['type' => 'number'],
                'in_stock'  => ['type' => 'boolean'],
                'limit'     => ['type' => 'integer', 'minimum' => 1, 'maximum' => 20],
                'sort'      => ['type' => 'string']  // 'relevance', 'price_asc', 'price_desc'
            ],
            'required' => []
        ]
    ]
]

תגובה:

[
    'products' => [
        [
            'id' => 123,
            'name' => 'מזרן פרימיום',
            'price' => '599.00',
            'price_formatted' => '$599.00',
            'in_stock' => true,
            'categories' => ['מזרנים', 'חדר שינה'],
            'permalink' => 'https://...',
            'image_url' => 'https://...',
            'variations' => [...],  // למוצרים משתנים
            'attributes' => [...]
        ]
    ],
    'count' => 5,
    'query' => ['query' => 'מזרן', 'limit' => 5]
]

AddToCartTool

קובץ: /includes/AI/Tools/class-add-to-cart-tool.php

מוסיף מוצרים לעגלה עם תמיכה בכמות ווריאציות.

סכמה:

[
    'function' => [
        'name' => 'add_to_cart',
        'parameters' => [
            'properties' => [
                'product_id'   => ['type' => 'integer'],
                'quantity'     => ['type' => 'integer', 'minimum' => 1, 'maximum' => 100],
                'variation_id' => ['type' => 'integer']
            ],
            'required' => ['product_id']
        ]
    ]
]

CreateCheckoutTool

קובץ: /includes/AI/Tools/class-create-checkout-tool.php

יוצר סשנים של checkout עם מספר פריטים ותמיכה בקופונים.

סכמה:

[
    'function' => [
        'name' => 'create_checkout',
        'parameters' => [
            'properties' => [
                'items' => [
                    'type' => 'array',
                    'items' => [
                        'properties' => [
                            'product_id' => ['type' => 'integer'],
                            'quantity' => ['type' => 'integer'],
                            'variation_id' => ['type' => 'integer']
                        ]
                    ]
                ],
                'coupon_code' => ['type' => 'string'],
                'clear_cart' => ['type' => 'boolean']
            ],
            'required' => ['items']
        ]
    ]
]

הוספת כלים מותאמים

  1. צרו מחלקת כלי המיישמת את ToolInterface:
namespace WooAIChatbotAITools;

class GetOrderStatusTool implements ToolInterface {

    public function get_name() {
        return 'get_order_status';
    }

    public function get_schema() {
        return [
            'type' => 'function',
            'function' => [
                'name' => 'get_order_status',
                'description' => 'קבלת סטטוס הזמנות לקוח',
                'parameters' => [
                    'type' => 'object',
                    'properties' => [
                        'order_id' => [
                            'type' => 'integer',
                            'description' => 'מזהה הזמנה ספציפי'
                        ]
                    ],
                    'required' => []
                ]
            ]
        ];
    }

    public function validate_params( $params ) {
        if ( isset( $params['order_id'] ) && ! is_numeric( $params['order_id'] ) ) {
            return new WP_Error( 'invalid_order_id', 'Order ID must be numeric' );
        }
        return true;
    }

    public function execute( $params ) {
        $order_id = $params['order_id'] ?? null;

        if ( $order_id ) {
            $order = wc_get_order( $order_id );
            if ( ! $order ) {
                return new WP_Error( 'order_not_found', 'Order not found' );
            }
            return [
                'order_id' => $order_id,
                'status'   => $order->get_status(),
                'total'    => $order->get_total(),
                'date'     => $order->get_date_created()->format( 'Y-m-d' )
            ];
        }

        // החזרת הזמנות אחרונות למשתמש הנוכחי
        return $this->get_recent_orders();
    }
}
  1. רשמו ב-ToolRegistry:
add_action( 'init', function() {
    $registry = WooAIChatbotAIToolRegistry::instance();
    $registry->register_tool( new WooAIChatbotAIToolsGetOrderStatusTool() );
});

7. אינטגרציית RAG

התוסף תומך ב-Retrieval-Augmented Generation באמצעות embeddings ואחסון וקטורי Supabase.

זרימת חיפוש סמנטי

שאילתת משתמש
    |
    v
OpenAI Embeddings API --> וקטור שאילתה (1536 מימדים)
    |
    v
Supabase pgvector --> חיפוש דמיון קוסינוס
    |
    v
תוצאות מוצרים Top-K --> הזרקת קונטקסט
    |
    v
ספק AI --> תגובה משופרת

יצירת Embeddings

// דרך orchestrator (מעדיף אוטומטית OpenAI)
$result = $orchestrator->generate_response(
    [['role' => 'user', 'content' => 'מזרן נוח']],
    ['embedding' => true]
);

$vector = $result['embedding'];  // מערך float ב-1536 מימדים

דירוג רלוונטיות קונטקסט

מוצרים מדורגים לפי דמיון קוסינוס לוקטור השאילתה. תוצאות מובילות מוזרקות ל-system prompt דרך PromptBuilder::add_product_context().

אינטגרציית Supabase

חיפוש דמיון וקטורי משתמש בהרחבת pgvector:

SELECT *, 1 - (embedding <=> query_embedding) AS similarity
FROM products_embeddings
WHERE 1 - (embedding <=> query_embedding) > 0.7
ORDER BY similarity DESC
LIMIT 5;

8. הוספת ספק חדש

שלב 1: יצירת מחלקת ספק

namespace WooAIChatbotAIProviders;

use WooAIChatbotAIAIProviderInterface;
use GuzzleHttpClient;
use WP_Error;

class MistralProvider implements AIProviderInterface {

    private const API_BASE_URL = 'https://api.mistral.ai/v1';
    private const DEFAULT_MODEL = 'mistral-large-latest';

    private $client;
    private $api_key;
    private $model;

    public function __construct() {
        $settings = get_option( 'woo_ai_chatbot_settings', [] );
        $this->api_key = $settings['mistral_api_key'] ?? '';
        $this->model = self::DEFAULT_MODEL;

        $this->client = new Client([
            'base_uri' => self::API_BASE_URL,
            'timeout' => 30,
            'headers' => [
                'Authorization' => 'Bearer ' . $this->api_key,
                'Content-Type' => 'application/json'
            ]
        ]);
    }

    public function generate_response( $messages, $context = [] ) {
        if ( ! $this->is_available() ) {
            return new WP_Error( 'mistral_unavailable', 'Mistral not configured' );
        }

        $formatted = $this->format_messages( $messages );

        $payload = [
            'model' => $this->model,
            'messages' => $formatted,
            'temperature' => 0.7,
            'max_tokens' => 1000
        ];

        // הוספת כלים אם סופקו
        if ( ! empty( $context['tools'] ) ) {
            $payload['tools'] = $context['tools'];
        }

        try {
            $response = $this->client->post( '/chat/completions', ['json' => $payload] );
            $body = json_decode( $response->getBody(), true );

            return [
                'content' => $body['choices'][0]['message']['content'],
                'tokens' => $body['usage']['total_tokens'],
                'model' => $this->model
            ];
        } catch ( Exception $e ) {
            return new WP_Error( 'mistral_error', $e->getMessage() );
        }
    }

    public function format_messages( $messages ) {
        // Mistral משתמש באותו פורמט כמו OpenAI
        return array_map( function( $msg ) {
            return [
                'role' => $msg['role'],
                'content' => $msg['content']
            ];
        }, $messages );
    }

    public function validate_api_key() {
        // בקשת אימות מינימלית
    }

    public function get_models() {
        return [
            'mistral-large-latest' => 'Mistral Large',
            'mistral-small-latest' => 'Mistral Small'
        ];
    }

    public function get_provider_name() {
        return 'Mistral AI';
    }

    public function is_available() {
        return ! empty( $this->api_key );
    }
}

שלב 2: רישום ב-Orchestrator

שנו את AIOrchestrator::initialize_providers():

$mistral_key = $settings['mistral_api_key'] ?? '';
if ( ! empty( $mistral_key ) ) {
    require_once __DIR__ . '/Providers/class-mistral-provider.php';
    $this->providers['mistral'] = new WooAIChatbotAIProvidersMistralProvider();
}

שלב 3: עדכון עדיפות

AI_PROVIDER_PRIORITY=gemini,mistral,openai,claude

9. טיפול בשגיאות

קודי שגיאה של ספקים

קוד תיאור פעולה
rate_limit_exceeded תגובת 429 ניסיון חוזר אחרי השהייה, אז fallback
invalid_api_key תגובת 401 דלג על ספק, רשום שגיאה
provider_unavailable אין מפתח API מוגדר עבור לספק הבא
all_providers_failed כל הספקים מוצו החזר שגיאה למשתמש

לוגיקת ניסיון חוזר

// טיפול בהגבלת קצב עם exponential backoff
if ( 429 === $status_code && $attempts < self::MAX_RETRIES ) {
    sleep( self::RETRY_DELAY * $attempts );
    continue;
}

התנהגות Fallback

כאשר ספק נכשל:

  1. השגיאה נרשמת עם קונטקסט מלא
  2. סטטיסטיקות שימוש מתעדכנות (record_usage())
  3. הספק הבא בשרשרת העדיפות מנוסה
  4. אחרי כישלון כל הספקים, הודעת שגיאה מפורטת מוחזרת

לוגינג

כל הספקים משתמשים ב-Monolog עם handler קבצים מתגלגל:

$this->logger->error( 'API request failed', [
    'provider' => 'gemini',
    'status_code' => 429,
    'attempt' => 2,
    'error' => $e->getMessage()
]);

מיקום לוג: /logs/chatbot.log עם שמירה של 7 ימים.

תגובת שגיאה מובנית

return new WP_Error(
    'all_providers_failed',
    'All AI providers failed to generate a response.',
    [
        'attempts' => [
            ['provider' => 'gemini', 'error' => 'Rate limit', 'code' => 429],
            ['provider' => 'openai', 'error' => 'Invalid key', 'code' => 401]
        ],
        'duration' => 5200,
        'tried' => ['gemini', 'openai', 'claude']
    ]
);

סיכום

מערכת המשנה של AI ב-WooAI Chatbot Pro מספקת ארכיטקטורה חזקה וניתנת להרחבה לאינטגרציית AI מרובת ספקים:

  • הפשטת ספקים דרך AIProviderInterface מאפשרת מעבר חלק בין ספקים
  • תבנית Orchestrator עם fallback אוטומטי מבטיחה זמינות גבוהה
  • מערכת כלים מאפשרת להרחיב יכולות AI עם פעולות WooCommerce
  • הנדסת prompts דרך PromptBuilder מספקת תגובות עקביות וקונטקסטואליות
  • תמיכת RAG דרך embeddings משפרת את דיוק גילוי המוצרים

לשאלות או תרומות, עיינו ב-repository של התוסף ב-GitHub או צרו קשר עם צוות הפיתוח.