require('dotenv').config(); const { OpenAI } = require('openai'); const db = require('./db'); const openai = new OpenAI({ apiKey: process.env.OPENAI_API_KEY, }); async function getAiSuggestion(item) { try { const prompt = ` Bạn là một chuyên gia thẩm định hàng hoá điện tử trên eBay. Hãy kiểm tra các thông tin dưới đây để trả lời 3 câu hỏi: 1. Item có bị ảo / lừa đảo (fake) không? 2. Seller có uy tín không? (so sánh feedback score, percent) 3. Dữ liệu hiện tại đã đúng sản phẩm chưa? (Part Number, Specs) THÔNG TIN TÌM KIẾM: - Part Number: ${item.partNumber} - Specs mục tiêu: ${item.specs} THÔNG TIN EBAY (Tìm được): - Tiêu đề: ${item.title} - Seller: ${item.seller_username} (Score: ${item.seller_feedback_score}, Positive: ${item.seller_feedback_percent}%) - Price: ${item.price} - Phân tích JSON chi tiết từ API: ${item.detail_response ? JSON.stringify(item.detail_response).substring(0, 1500) : 'Không có dữ liệu chi tiết'} YÊU CẦU ĐẦU RA (Quan trọng!): Chỉ đưa ra kết luận DUY NHẤT 1 câu ngắn gọn. (Ví dụ: "Hãy mua ngay, seller uy tín và đúng chuẩn sản phẩm." HOẶC "Cẩn thận, seller ít feedback và tiêu đề không rõ ràng.") Khong giải thích dài dòng! `; const response = await openai.chat.completions.create({ model: "gpt-4o-mini", messages: [ { role: "system", content: "Bạn là trợ lý AI chuyên thẩm định eBay. Chỉ trả về 1 câu ngắn gọn." }, { role: "user", content: prompt } ], max_tokens: 100, temperature: 0.3 }); return { suggestion: response.choices[0].message.content.trim(), usage: response.usage.total_tokens }; } catch (error) { console.error(`AI Error for item ${item.id}:`, error.message); return { suggestion: "Lỗi khi gọi AI.", usage: 0 }; } } async function runAiSuggestions() { console.log("Bat dau chay AI Suggestions..."); const items = db.getMissingAiSuggestionItems(); console.log(`Tim thay ${items.length} item can check AI.`); let totalTokens = 0; const batchSize = 10; for (let i = 0; i < items.length; i += batchSize) { const batch = items.slice(i, i + batchSize); const results = await Promise.all(batch.map(async item => { console.log(`Dang check AI cho item: ${item.id}`); const { suggestion, usage } = await getAiSuggestion(item); db.updateAiSuggestion(item.id, suggestion); console.log(`Ket qua AI cho ${item.id}: ${suggestion} (Tokens: ${usage})`); return usage; })); totalTokens += results.reduce((a, b) => a + b, 0); // Minimal delay between batches to respect rate limits if (i + batchSize < items.length) { await new Promise(r => setTimeout(r, 500)); } } console.log(`Hoan thanh AI Suggestions. Total tokens: ${totalTokens}`); return totalTokens; } module.exports = { runAiSuggestions, getAiSuggestion }; // Allow standalone run if (require.main === module) { runAiSuggestions().catch(console.error); }