מדריך אינטגרציית 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
עקרונות עיצוב
- הפשטת ספקים: כל הספקים מיישמים את
AIProviderInterface, המאפשר התנהגות פולימורפית - תזמור Singleton:
AIOrchestrator::instance()מבטיח נקודה יחידה לניהול ספקים - שרשרת Fallback: עדיפות ניתנת להגדרה עם מעבר אוטומטי בשגיאות או הגבלות קצב
- הרחבת כלים: רישום כלים מבוסס תוספים דרך
ToolRegistry
זרימת נתונים
User Message
|
v
MessageHandler --> PromptBuilder (Context Assembly)
|
v
AIOrchestrator --> Provider Selection (Priority Order)
|
v
Provider API Call --> Response Parsing
|
v
ToolRegistry --> Tool Execution (if function_call detected)
|
v
Response to Frontend
2. AIProviderInterface
כל ספקי ה-AI חייבים ליישם את חוזה AIProviderInterface המוגדר ב-/includes/AI/AIProviderInterface.php.
חוזה הממשק
namespace WooAIChatbotAI;
interface AIProviderInterface {
/**
* Generate AI response from conversation messages.
*
* @param array $messages Array of message objects with 'role' and 'content'.
* @param array $context Additional context (products, cart, tools, etc.).
* @return array|WP_Error Response with 'content', 'tokens', 'model'.
*/
public function generate_response( $messages, $context = array() );
/**
* Format messages for provider-specific API requirements.
*
* @param array $messages Internal message format.
* @return array Provider-formatted messages.
*/
public function format_messages( $messages );
/**
* Validate API key with minimal API call.
*
* @return bool|WP_Error True if valid, WP_Error otherwise.
*/
public function validate_api_key();
/**
* Get available models for this provider.
*
* @return array Model identifiers with display names.
*/
public function get_models();
/**
* Get human-readable provider name.
*
* @return string Provider name (e.g., 'OpenAI', 'Google Gemini').
*/
public function get_provider_name();
/**
* Check if provider is configured and available.
*
* @return bool True if API key exists and provider is ready.
*/
public function is_available();
}
מבנה תגובה
כל הספקים חייבים להחזיר תגובות בפורמט מנורמל זה:
[
'content' => 'AI response text',
'tokens' => 150, // Total tokens used
'model' => 'gpt-4o-mini', // Model identifier
'provider' => 'openai', // Added by orchestrator
'duration' => 1250.5, // Milliseconds (added by orchestrator)
// Optional for function calling:
'function_call' => [
'name' => 'search_products',
'arguments' => '{"query": "mattress"}'
]
]
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 מובנים בתגובות:
// Response structure
[
'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 מחזיר קריאות פונקציה בצורה שונה:
// Response structure
[
'candidates' => [
[
'content' => [
'parts' => [
[
'functionCall' => [
'name' => 'search_products',
'args' => ['query' => 'mattress']
]
]
]
]
]
]
]
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
// Programmatic priority change
$orchestrator->set_primary_provider( 'openai' );
יצירת תגובה עם Fallback
public function generate_response( $messages, $context = [] ) {
// Prioritize OpenAI for embedding requests
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;
}
// Handle rate limiting with retry
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:
// On 429 (Rate Limit) response
sleep( self::RETRY_DELAY * $attempts ); // 2s, 4s, 6s...
סטטיסטיקות שימוש
$stats = $orchestrator->get_usage_stats();
// Returns:
[
'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' => 'John',
'orders_count' => 5
],
'current_product' => $product_data,
'recently_viewed' => [123, 456, 789]
];
$system_prompt = $builder->build_system_prompt( $context );
שכבות הזרקת קונטקסט
- קונטקסט חנות: שם החנות, URL, locale
- קונטקסט משתמש: שם, אימייל, היסטוריית הזמנות, הוצאות
- קונטקסט עגלה: פריטים, כמויות, סכומים
- קונטקסט מוצר: מוצר העמוד הנוכחי, נצפו לאחרונה
- קונטקסט כלים: הגדרות פונקציות זמינות
- כללי שפה: זיהוי רב-לשוני ותגובה
הרכבת קונטקסט WooCommerce
public function build_context_from_session( $session ) {
$context = [];
// User 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 ),
];
}
// Cart context
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();
// Returns OpenAI function-calling schema:
[
[
'type' => 'function',
'function' => [
'name' => 'search_products',
'description' => 'Search for products...',
'parameters' => [
'type' => 'object',
'properties' => [...],
'required' => []
]
]
]
]
6. מערכת כלים
מערכת הכלים מאפשרת למודלי AI לבצע פעולות מובנות בתוך WooCommerce.
ToolInterface
קובץ: /includes/AI/Tools/class-tool-interface.php
namespace WooAIChatbotAITools;
interface ToolInterface {
/**
* Unique tool identifier used by AI.
*/
public function get_name();
/**
* OpenAI-compatible function schema.
*/
public function get_schema();
/**
* Execute tool with validated parameters.
*/
public function execute( $params );
/**
* Validate parameters before execution.
*/
public function validate_params( $params );
}
Tool Registry
קובץ: /includes/AI/class-tool-registry.php
$registry = WooAIChatbotAIToolRegistry::instance();
// Register custom tool
$registry->register_tool( new MyCustomTool() );
// Execute tool
$result = $registry->execute_tool( 'search_products', ['query' => 'laptop'] );
// Get all tool schemas for AI
$schemas = $registry->get_tool_schemas();
SearchProductsTool
קובץ: /includes/AI/Tools/class-search-products-tool.php
מחפש מוצרי WooCommerce עם חיפוש טקסט מלא, סינון קטגוריות, וטווחי מחירים.
סכמה:
[
'type' => 'function',
'function' => [
'name' => 'search_products',
'description' => 'Search for WooCommerce products...',
'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' => 'Premium Mattress',
'price' => '599.00',
'price_formatted' => '$599.00',
'in_stock' => true,
'categories' => ['Mattresses', 'Bedroom'],
'permalink' => 'https://...',
'image_url' => 'https://...',
'variations' => [...], // For variable products
'attributes' => [...]
]
],
'count' => 5,
'query' => ['query' => 'mattress', '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']
]
]
]
הוספת כלים מותאמים
- צרו מחלקת כלי המיישמת את
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' => 'Get status of customer orders',
'parameters' => [
'type' => 'object',
'properties' => [
'order_id' => [
'type' => 'integer',
'description' => 'Specific order ID'
]
],
'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 recent orders for current user
return $this->get_recent_orders();
}
}
- רשמו ב-
ToolRegistry:
add_action( 'init', function() {
$registry = WooAIChatbotAIToolRegistry::instance();
$registry->register_tool( new WooAIChatbotAIToolsGetOrderStatusTool() );
});
7. אינטגרציית RAG
התוסף תומך ב-Retrieval-Augmented Generation באמצעות embeddings ואחסון וקטורי Supabase.
זרימת חיפוש סמנטי
User Query
|
v
OpenAI Embeddings API --> Query Vector (1536 dimensions)
|
v
Supabase pgvector --> Cosine Similarity Search
|
v
Top-K Product Results --> Context Injection
|
v
AI Provider --> Enhanced Response
יצירת Embeddings
// Via orchestrator (automatically prioritizes OpenAI)
$result = $orchestrator->generate_response(
[['role' => 'user', 'content' => 'comfortable mattress']],
['embedding' => true]
);
$vector = $result['embedding']; // 1536-dimensional float array
דירוג רלוונטיות קונטקסט
מוצרים מדורגים לפי דמיון קוסינוס לוקטור השאילתה. תוצאות מובילות מוזרקות ל-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
];
// Add tools if provided
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 uses same format as OpenAI
return array_map( function( $msg ) {
return [
'role' => $msg['role'],
'content' => $msg['content']
];
}, $messages );
}
public function validate_api_key() {
// Minimal validation request
}
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 |
כל הספקים מוצו | החזר שגיאה למשתמש |
לוגיקת ניסיון חוזר
// Rate limit handling with exponential backoff
if ( 429 === $status_code && $attempts < self::MAX_RETRIES ) {
sleep( self::RETRY_DELAY * $attempts );
continue;
}
התנהגות Fallback
כאשר ספק נכשל:
- השגיאה נרשמת עם קונטקסט מלא
- סטטיסטיקות שימוש מתעדכנות (
record_usage()) - הספק הבא בשרשרת העדיפות מנוסה
- אחרי כישלון כל הספקים, הודעת שגיאה מפורטת מוחזרת
לוגינג
כל הספקים משתמשים ב-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 משפרת את דיוק גילוי המוצרים
לשאלות או תמיכה, צרו קשר עם צוות הפיתוח.