Jump to content

Recommended Posts

I am trying to use ChatGPT as the chatbot for my Magento 2 website, and I want to pass product data to it. To do this, I collected all the products and stored them in a JSON file, which I then read to embed the data in the `systemRoleContent` of the system role. However, the issue I am facing is that the JSON file is quite large.

{
"bot_response": "Error: ChatBot Error: Unexpected API response structure: {\n    \"error\": {\n        \"message\": \"Request too large for gpt-4o on tokens per min (TPM): Limit 30000, Requested 501140. The input or output tokens must be reduced in order to run successfully. Visit https://platform.openai.com/account/rate-limits to learn more.\",\n        \"type\": \"tokens\",\n        \"param\": null,\n        \"code\": \"rate_limit_exceeded\"\n    }\n}\n"
}

I noticed that there is a function that needs to be added to the API configuration, which allows you to run a query to select products based on keywords found in their names or descriptions that match keywords in the user’s message. The challenge is that users initially may not know the names of the products; they come to the chatbot to discover them. How can I address this issue?  

This is the code that I am working with right now:

<?php



namespace MetaCares\Chatbot\Model;



use Magento\Framework\App\ObjectManager;



class ChatBot

{

    private $authorization;

    private $endpoint;

    private $conversationHistory = [];

    private $productsFile;

    private $fetchingDateFile;

    private $didFetchProducts = false;



    public function __construct()

    {

        $this->authorization = 'sk-proj-';

        $this->endpoint = 'https://api.openai.com/v1/chat/completions';



        $this->productsFile = __DIR__ . '/products.json';

        $this->fetchingDateFile = __DIR__ . '/fetching_date.json';



        $currentTime = time();

        $timeDifferenceSeconds = 24 * 3600;



        if (!file_exists($this->fetchingDateFile)) {

            file_put_contents($this->fetchingDateFile, json_encode(['last_fetch_time' => 0]));

        }



        $fetchingData = json_decode(file_get_contents($this->fetchingDateFile), true);

        $lastFetchTime = $fetchingData['last_fetch_time'] ?? 0;



        if ($currentTime - $lastFetchTime > $timeDifferenceSeconds) {

            $products = $this->fetchProductsUsingModel();

            $productsJson = json_encode($products);

            file_put_contents($this->productsFile, $productsJson);

            $fetchingData['last_fetch_time'] = $currentTime;

            file_put_contents($this->fetchingDateFile, json_encode($fetchingData));

            $this->didFetchProducts = true;

        }



        $jsonSampleData = file_get_contents($this->productsFile);



        $systemRoleContent = <<<EOT

Nom:

    Meta Cares Bot

Description

    BOT Meta Cares répond aux questions sur les produits du site et fournit des conseils santé fiables.

    Tu aides les clients de Meta Cares à faire des choix éclairés tout en offrant un accompagnement personnalisé, sécurisé et adapté à leurs besoins.



catalogue Meta Cares

{$jsonSampleData}



Liste des Sites Référencés :

- PubMed : [https://pubmed.ncbi.nlm.nih.gov/](https://pubmed.ncbi.nlm.nih.gov/)

- ScienceDirect : [https://www.sciencedirect.com/](https://www.sciencedirect.com/)

---

- Génération dimages DALL·E : Désactivée



EOT;



        $this->conversationHistory[] = [

            'role' => 'system',

            'content' => $systemRoleContent

        ];



        if (session_status() == PHP_SESSION_NONE) {

            session_start();

        }

        if (isset($_SESSION['chat_history'])) {

            $this->conversationHistory = $_SESSION['chat_history'];

        }

    }



    public function fetchProductsUsingModel(): array

    {

        return $products;

    }



    private function getCategoryNames(array $categoryIds): array

    {

        return $categoryNames;

    }



    public function sendMessage(string $message): array

    {

        try {

            $this->conversationHistory[] = [

                'role' => 'user',

                'content' => $message

            ];



            $data = [

                'model' => 'gpt-4o',

                'messages' => array_map(function ($msg) {

                    return [

                        'role' => $msg['role'] === 'bot' ? 'assistant' : $msg['role'],

                        'content' => $msg['content']

                    ];

                }, $this->conversationHistory)

            ];



            $response = $this->makeApiRequest($data);

            $arrResult = json_decode($response, true);



            if (json_last_error() !== JSON_ERROR_NONE) {

                throw new \Exception('Invalid API response format');

            }



            if (!isset($arrResult['choices']) || !isset($arrResult['choices'][0]['message']['content'])) {

                throw new \Exception('Unexpected API response structure: ' . $response);

            }



            $assistantResponse = $arrResult['choices'][0]['message']['content'];

            $this->conversationHistory[] = [

                'role' => 'bot',

                'content' => $assistantResponse

            ];



            $_SESSION['chat_history'] = $this->conversationHistory;

            return [

                "conversationHistory" => $_SESSION['chat_history'],

                'didFetchProducts' => $this->didFetchProducts,

                'response' => $assistantResponse,

            ];

        } catch (\Exception $e) {

            throw new \Exception('ChatBot Error: ' . $e->getMessage());

        }

    }



    private function makeApiRequest(array $data): string

    {

        $ch = curl_init();

        curl_setopt_array($ch, [

            CURLOPT_URL => $this->endpoint,

            CURLOPT_POST => true,

            CURLOPT_POSTFIELDS => json_encode($data),

            CURLOPT_HTTPHEADER => [

                'Content-Type: application/json',

                'Authorization: Bearer ' . $this->authorization,

            ],

            CURLOPT_RETURNTRANSFER => true,

            CURLOPT_SSL_VERIFYPEER => false,

            CURLOPT_SSL_VERIFYHOST => 0

        ]);



        $response = curl_exec($ch);



        if (curl_errno($ch)) {

            $error = curl_error($ch);

            curl_close($ch);

            throw new \Exception('API request failed: ' . $error);

        }



        curl_close($ch);

        return $response;

    }

}

 

Edited by stufflhd
On 1/6/2025 at 9:03 PM, stufflhd said:

I am trying to use ChatGPT as the chatbot for my Magento 2 website, and I want to pass product data to it. To do this, I collected all the products and stored them in a JSON file, which I then read to embed the data in the `systemRoleContent` of the system role. However, the issue I am facing is that the JSON file is quite large.

{
"bot_response": "Error: ChatBot Error: Unexpected API response structure: {\n    \"error\": {\n        \"message\": \"Request too large for gpt-4o on tokens per min (TPM): Limit 30000, Requested 501140. The input or output tokens must be reduced in order to run successfully. Visit https://platform.openai.com/account/rate-limits to learn more.\",\n        \"type\": \"tokens\",\n        \"param\": null,\n        \"code\": \"rate_limit_exceeded\"\n    }\n}\n"
}

I noticed that there is a function that needs to be added to the API configuration, which allows you to run a query to select products based on keywords found in their names or descriptions that match keywords in the user’s message. The challenge is that users initially may not know the names of the products; they come to the chatbot to discover them. How can I address this issue?  

This is the code that I am working with right now:

<?php



namespace MetaCares\Chatbot\Model;



use Magento\Framework\App\ObjectManager;



class ChatBot

{

    private $authorization;

    private $endpoint;

    private $conversationHistory = [];

    private $productsFile;

    private $fetchingDateFile;

    private $didFetchProducts = false;



    public function __construct()

    {

        $this->authorization = 'sk-proj-';

        $this->endpoint = 'https://api.openai.com/v1/chat/completions';



        $this->productsFile = __DIR__ . '/products.json';

        $this->fetchingDateFile = __DIR__ . '/fetching_date.json';



        $currentTime = time();

        $timeDifferenceSeconds = 24 * 3600;



        if (!file_exists($this->fetchingDateFile)) {

            file_put_contents($this->fetchingDateFile, json_encode(['last_fetch_time' => 0]));

        }



        $fetchingData = json_decode(file_get_contents($this->fetchingDateFile), true);

        $lastFetchTime = $fetchingData['last_fetch_time'] ?? 0;



        if ($currentTime - $lastFetchTime > $timeDifferenceSeconds) {

            $products = $this->fetchProductsUsingModel();

            $productsJson = json_encode($products);

            file_put_contents($this->productsFile, $productsJson);

            $fetchingData['last_fetch_time'] = $currentTime;

            file_put_contents($this->fetchingDateFile, json_encode($fetchingData));

            $this->didFetchProducts = true;

        }



        $jsonSampleData = file_get_contents($this->productsFile);



        $systemRoleContent = <<<EOT

Nom:

    Meta Cares Bot

Description

    BOT Meta Cares répond aux questions sur les produits du site et fournit des conseils santé fiables.

    Tu aides les clients de Meta Cares à faire des choix éclairés tout en offrant un accompagnement personnalisé, sécurisé et adapté à leurs besoins.



catalogue Meta Cares

{$jsonSampleData}



Liste des Sites Référencés :

- PubMed : [https://pubmed.ncbi.nlm.nih.gov/](https://pubmed.ncbi.nlm.nih.gov/)

- ScienceDirect : [https://www.sciencedirect.com/](https://www.sciencedirect.com/)

---

- Génération dimages DALL·E : Désactivée



EOT;



        $this->conversationHistory[] = [

            'role' => 'system',

            'content' => $systemRoleContent

        ];



        if (session_status() == PHP_SESSION_NONE) {

            session_start();

        }

        if (isset($_SESSION['chat_history'])) {

            $this->conversationHistory = $_SESSION['chat_history'];

        }

    }



    public function fetchProductsUsingModel(): array

    {

        return $products;

    }



    private function getCategoryNames(array $categoryIds): array

    {

        return $categoryNames;

    }



    public function sendMessage(string $message): array

    {

        try {

            $this->conversationHistory[] = [

                'role' => 'user',

                'content' => $message

            ];



            $data = [

                'model' => 'gpt-4o',

                'messages' => array_map(function ($msg) {

                    return [

                        'role' => $msg['role'] === 'bot' ? 'assistant' : $msg['role'],

                        'content' => $msg['content']

                    ];

                }, $this->conversationHistory)

            ];



            $response = $this->makeApiRequest($data);

            $arrResult = json_decode($response, true);



            if (json_last_error() !== JSON_ERROR_NONE) {

                throw new \Exception('Invalid API response format');

            }



            if (!isset($arrResult['choices']) || !isset($arrResult['choices'][0]['message']['content'])) {

                throw new \Exception('Unexpected API response structure: ' . $response);

            }



            $assistantResponse = $arrResult['choices'][0]['message']['content'];

            $this->conversationHistory[] = [

                'role' => 'bot',

                'content' => $assistantResponse

            ];



            $_SESSION['chat_history'] = $this->conversationHistory;

            return [

                "conversationHistory" => $_SESSION['chat_history'],

                'didFetchProducts' => $this->didFetchProducts,

                'response' => $assistantResponse,

            ];

        } catch (\Exception $e) {

            throw new \Exception('ChatBot Error: ' . $e->getMessage());

        }

    }



    private function makeApiRequest(array $data): string

    {

        $ch = curl_init();

        curl_setopt_array($ch, [

            CURLOPT_URL => $this->endpoint,

            CURLOPT_POST => true,

            CURLOPT_POSTFIELDS => json_encode($data),

            CURLOPT_HTTPHEADER => [

                'Content-Type: application/json',

                'Authorization: Bearer ' . $this->authorization,

            ],

            CURLOPT_RETURNTRANSFER => true,

            CURLOPT_SSL_VERIFYPEER => false,

            CURLOPT_SSL_VERIFYHOST => 0

        ]);



        $response = curl_exec($ch);



        if (curl_errno($ch)) {

            $error = curl_error($ch);

            curl_close($ch);

            throw new \Exception('API request failed: ' . $error);

        }



        curl_close($ch);

        return $response;

    }

}

 

The root cause of the problem lies in the fetchProductsUsingModel method, which is expected to return an array of products but does not define or initialize the $products variable. This oversight will result in a Notice: Undefined variable error when the method is invoked.

public function fetchProductsUsingModel(): array
{
    // Assuming you have a model to fetch products, replace this with actual fetching logic
    $products = []; // Initialize the products array

    // Example logic to fetch products (this should be replaced with actual implementation)
    // $products = $this->productRepository->getList($searchCriteria)->getItems();

    return $products; // Return the fetched products
}

Make sure to replace the placeholder logic with the actual implementation that retrieves products from your Magento store.

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.