89 lines
3.1 KiB
JavaScript
89 lines
3.1 KiB
JavaScript
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);
|
|
}
|