Агенты для автаматызаціі прыёмніка без абмежэнняў з Node.js
Створыце агента для керавання прыглухаром з чысткімі межамі інструментаў, заходамі безпекі та можлівасцю логавання.
У гэтым керавані практычна адбудовваецца рабочы маршрут для: «Як створыць АІ-агента для автоматызацыі прыгледчыка без обмежэнняў, выкорыстоўваючы Node.js, Playwright, Bright Data і Gemini». Акцэнт ставіцца на кантракты, пераконтроўваннія і код, які можна падставіць у репазітарый без неабязковасці з’ясоўвання намеру. Для загальнага адгледжэння, перш чым зменяць код, неабходна задаць вхідныя даны, адпаведальнага за крок і критэрыя завершэння. Аперацыёныя працавнікі должны магчымае перазапускаць крок з вядомай точкі контролю, не падозрываючы прыхованы стан. Спрыяйце гэтаму этапу як кантракту межа вхіднымі данымі і падтверджанымі выходнымі рэзультатамі. Даць назвы артыфактам, задаць пераконтроўваннія на успех і адмовіцца ад беззвучнага частковага завершэння.
Введенне
Для вступу неабяжна ўзначыць інпуты, адпаведальную за крок і критэрыі завершэння пры змяне коду. Аперацыйныя працавнікі должны магчыма ўвайсці крок з вядомага пункта контролю, не спрабоўваючы здагадвацца пра схованы стан. Запісвайце час выконання і витраты праза функцыйнае рэзультат. Відкрытыя даны з самага пачатку запобегаюць неспакоўным рахункам, калі процес пераходзіць з дэмовай среды ў спяльную. Строга абмежвайце схемы інструментоў. Шырокія параметры у вільнай формату прабуджаюць рызык ін’екцый і робяць аудыты дорогімі.
await page.goto(url)
await page.click(selector)
await page.type(selector, text)
Што мы ствараем
Для таго, каму мы ствараем, пярэд змінайом код неабходна ясная дэфініцыя вхідных даных, адпаведальнага за крок і крэтарыяў завершэння. Аперацыйныя працавнікі должны магчымае перазапускаць крок з вядомай точкі контролю, не прабуючы спадарацца прыватны стан.
Абавяжучыя умовы
Як прабэральныя умовы, перад зменайом коду неабходна ўзначыць вхідныя даны, адпаведальнага за крок і критэрыя завершэння. Аператары должны магчымаць перзапуск кроку з вядомай точкі контролю, не спрабоўваючы здогадвацца пра схованы стан. Неабходна задокументаваць як шлях успеху, так і шлях вярнення да нормальнага стану. Перапрыбуткі, людзкія перакрыцця і обробка некоректных паведамленняў є частью продукту, а не етапамі далейшай налады. Жорсткая прымыканасць схемаў інструментаў. Шырокія параметры у вигляде вольнага тексту спрыяюць атакам на ввод данных і робяць аудыты дорогімі. Як прабэральныя умовы, перад зменайом коду неабходна ўзначыць вхідныя даны, адпаведальнага за крок і критэрыя завершэння. Аператары должны магчымаць перзапуск кроку з вядомай точкі контролю, не спрабоўваючы здагадвацца пра схованы стан. Спрыяйце цэму этапу як кантракту між вхіднымі данымі і перакананымі выходнымі рэзультатамі. Даўце назвы артыфактам, узначыць критэрыі успеху і не прабоўваць прыймаць часткова завершаныя рэзультаты без паведамлення.
Стварэнне проекту Sikki
Для проекту Building Sikki неабяжна прадзеўдзіць вхідныя даны, абавесцелювальніка крока і крэтыяры завершэння пры змены коду. Аперацыйныя працавнікі павінны магчымае перзапускаць крок з вядомай точкі контролю, не прабуючы выявіць схованы стан. Запісваюць час выконання і витраты праза функцыйнальныя рэзултаты. Відразлівасць на раннім этапе запобегае неспакоўным рахункам, калі процес пераходзіць з дэмаверсіі ў спяльныя среды. Точка контролю пасля дорогіх вызоў модэлю, каб перапрыбутак не прабіў занова застаўляць вартасць за тую ж работу.
Крок 1: Стварыць проект
Для першага: падчас стварэння проекту неабяжна вказаць параметры, адміністратара першага крока і критэрыя завершэння пры перадзеіснавленні коду. Аператары должны магчымаць перзапуск крока з вядомай точкі контролю, не прабуючы спадарацца прыватны стан. Конфігурацыю трэба залічыць пазнаходзяцца за межамі коду прыемлі. Файлы сяродавішняе сераўісу, хранальнікі секрэтных дадзеных і флагі функцыйяў должны быць аднароджаны ў аднам месца, куда аператары можуць адбавляць контроль, не чытаючы весь ланцуг задач. Неабяжна ствараць точку контролю пасля дорогіх вызоў модэлю, каб перзапуск не веліў зарабляць плату знова за тую ж работу.
mkdir sikki-agent
cd sikki-agent
npm init -y
npm pkg set type=module
npm install playwright
npm install @google/genai
npm install dotenv
npm install chalk
npm install ora
sikki-agent
index.js
.env
screenshots/
reports/
package.json
Першы крок: Атрыманне ключа API Gemini
Для 2-го крока: «Атрымак ключа Gemini API», неабяжна практыкаваць заданні, адпаведнага власніка крока і крэтыяры выходу пры перадзеіснавленні коду. Аператары должны магчымаць перзапуск крока з вядомай точкі контролю без неабяжнага вычыслення захаванага стану. Неабяжна задокументаваць шлях успеху і шлях вярнення. Перазапускі, людзкія перакрыцці і обробка некоректных паведамленняў ёсць часткай продукту, а не пасляднім дапрацоўкам. Зробіце точку контролю пасля дорогіх вызоў модэлю, каб перазапуск не практыкуваў плату за тую ж работу. Для 2-го крока: «Атрымак ключа Gemini API», неабяжна практыкаваць заданні, адпаведнага власніка крока і крэтыяры выходу пры перадзеіснавленні коду. Аператары должны магчымаць перзапуск крока з вядомай точкі контролю без неабяжнага вычыслення захаванага стану. Спрыяйце гэтаму этапу як кантракту межа заданнямі і падтверджанымі выходамі. Дайце назву артыфактам, практыкаваць перакрыцці успеху і адмовіцеся ад тыхнай частковай завершэння без паведамлення.
GEMINI_API_KEY = your_gemini_api_key
BRIGHT_WS_ENDPOINT = //i will show you later
Шаг 3: Адаптаванне інфраструктуры прыгледчыка Bright Data Cloud
Для шага 3: Адаптаванне інфраструктуры прыгледчыка Bright Data Cloud неабяжна пазначыць параметры, адпаведальнага за шаг і крэтыя завершэння пры гэтам, перш чым змяніць код. Аператары должны магчымае перадзеісцаваць шаг з вядомай точкі контролю, не падозрываючы схованы стан. Запісваць час выконання і витраты разам з функцыйнальнымі рэзултатамі. Раннія відкрытасць запобегае неспакоўным рахункам, калі процес пераходзіць з дэмовай среды ў спакульную. Раздзеляць планаванне і выконання задач. Планавальнік пропануе; выконаваць здзейснія змены; пераканальнік пераканаеся, чы рэзултаты адпавядаюць цілям.
BRIGHT_WS_ENDPOINT = "your_endpoint"
chromium.launch()
chromium.connectOverCDP()
Шаг 4: Падключэнне Playwright да Bright Data
Для крока 4: падчынення Playwright да Bright Data, перш чым зменяць код, неабходна ясная прызначэння вхідных дадзеных, адміністратара крока і крэтэрыяў завершэння. Аператары должны магчымае перзапускіць крок з вядомай точкі контролю, не падозрываючы схованы стан. Конфігурацыю трэба залічыць пазначкай ад коду прыемліка. Файлы сераўнавання сяродовішча, храненні секрэтных дадзеных і флагі функцияў павінны знаходзіцца ў аднам месцы, якое аператары можаць пераглядаць, не чытаяўшы весь ланцуг. Неабходна раздзеліць планаванне ад выконання інструменту. Планавальнік прызначае паслядовасць; выконавальнік яе рэалізуе; пераканальнік пераглядае рынукты проты цялевых показначэнняў.
import { chromium }
from "playwright";
const BRIGHT_WS_ENDPOINT = "your_endpoint"
const browser =
await chromium.connectOverCDP(BRIGHT_WS_ENDPOINT
);
const page =
await browser.newPage();
await page.goto(
"https://cnn.com"
);
console.log(
await page.title()
);
Больш дакладна пра агента SIKKI перад яго рэалізацыяй
Для глэбокага анаізу SIKKI Agent пры практычным выкарыстоўванні неабходна перад зменай коду адзначыць вхідныя даны, адпаведальнага за крок і крэтыярыя завершэння. Аперацыёныя працавнікі должны магчымае перадзначыць крок з вядомай точкі контролю, не падозрываючы прыхованы стан. Неабходна аддзекаваць як шлях успеху, так і шлях вярнення да нормальнага стану. Перапрыбуткі, людзкія перакрыцця і обробка некоректных паведамленняў ёсць часткай продукту, а не пасляднім дапрацоўкам. Разлучыце планаванне і выкарыстоўванне інструментаў. Планавальнік прымечвае варыянты; выкарыстоўвальнік іх рэалізуе; пераканальнік пераглядае рынкты проты цялей. Для глэбокага анаізу SIKKI Agent пры практычным выкарыстоўванні неабходна перад зменай коду адзначыць вхідныя даны, адпаведальнага за крок і крэтыярыя завершэння. Аперацыёныя працавнікі должны магчымае перадзначыць крок з вядомай точкі контролю, не падозрываючы прыхованы стан. Спрыяце гэтам этапу як кантракту межа вхіднымі данымі і перакананымі выходнымі рынктамі. Даць назвы артыфактам, адзначыць крэтыярыі успеху і не прымаць частковыя рашэнні без адпаведных падтверджэнняў.
Завершэнне.SIKKI – гэта не скрапер
У прыкладзе SIKKI – гэта не скрапер трэба пазначыць вхідныя даны, адпаведальнага за крок і критэрыя завершэння пры змены коду. Аператары должны магчымаць перзапуск кроку з вядомай точкі контролю, не спрабоўваючы здагадвацца пра схованы стан. Запісвайце час і вартасць праза функцыональныя рэзултаты. Відразліва візуалізацыя запобегае неспакоўным рахункам, калі парадокс переходзіць з дэмовай среды ў спяльную. Строга абмежвайце схемы інструментаў. Шырокія аргументы у вільным тексте спрыяюць втручанню і робяць аудыты дорогімі.
ProductPriceAcer Nitro V$899ASUS TUF$949MSI Thin$979
Архітектура SIKKI
Для архітектуры, якая стоўчы за SIKKI, неабходна прадзефінаваць вхідныя даны, абавесць крока та критэрыі завершэння перад змянай коду. Аперацыяныя працоўнікі должны магчыма было перзапускаць крок з вядомай точкі контролю, не падозрываючы прыхованы стан. Конфігурацыю трэба знаходзіць за межамі коду прыемлівання. Файлы сераўнавальнага сераўса, хранілішчы секрэтных данных та флагі функцый должны быць у аднам месца, якое працоўнікі можуць аудытаваць, не чытаючы весь ланцуг задач. Шаблоны інструментаў трэба строго абмежыць. Широкія параметры у вигляде вольнага тексту спрыяюць втручанню ззовні та робяць аудыты даскладнымі.
SIKKI
Strategic Intelligence Commerce Kernel
┌──────────────────────────────┐
│ Browser Layer │
│ Playwright + Bright Data │
└──────────────────────────────┘
│
▼
┌──────────────────────────────┐
│ Extraction Layer │
│ Product │
│ Price │
│ Rating │
│ Seller │
│ Availability │
└──────────────────────────────┘
│
▼
┌──────────────────────────────┐
│ AI Layer │
│ Gemini │
└──────────────────────────────┘
│
▼
┌──────────────────────────────┐
│ Analysis Layer │
│ Cheapest Products │
│ Market Average │
│ Competitor Comparison │
│ Trend Analysis │
└──────────────────────────────┘
│
▼
Markdown / CSV
Dashboard Export
Стварэнне шара выкарыстоўвання данных
Для стварэння шара выкарыстоўвання паказаныя інфармацыі, адначасова зменяючы код, неабходна прадзефінаваць вхідныя даны, адпаведальную особу за выкананне крока і критэрыя завершэння. Аператары должны магчымае перзапускати крок з вядомай точкі контролю, не прабуючы спадарожваць схованы стан. Неабходна аддзеўнаваць дакументацыю як пра стандартны ход роботы, так і пра способы вярнення да нормальнага стану. Перапрыбуткі, людзкі контроль і обработка некоректных паведамленняў є часткай продукту, а не етапамі далейшага доўнелення. Шчыльна прыкрепіце схемы інструментаў. Шырокія параметры у вигляде вольнага тексту спрыяюць атакам і робяць аудыты даскладнымі. Для стварэння шара выкарыстоўвання паказаныя інфармацыі, адначасова зменяючы код, неабходна прадзефінаваць вхідныя даны, адпаведальную особу за выкананне крока і критэрыя завершэння. Аператары должны магчымае перзапускати крок з вядомай точкі контролю, не прабуючы спадарожваць схованы стан. Спрыяйце тлумачэнню гэтага этапу як даговору між вхіднымі данымі і перакананымі выходнымі рэзультатамі. Даўце назвы элементам, прадзефінаваць критэрыя успеху і не прабывайце прыймаць часткова завершаныя рэзультаты без паведамлення.
const products = await page.evaluate(() => {const items = [];
document.querySelectorAll('[data-component-type="s-search-result"]')
.forEach(card => {
const title =
card.querySelector('h2 span')?.innerText;
const price =
card.querySelector('.a-price .a-offscreen')
?.innerText;
const rating =
card.querySelector('.a-icon-alt')
?.innerText;
const link =
card.querySelector('h2 a')
?.href;
if(title && price){
items.push({
title,
price,
rating,
link
});
}
});
return items;
});
console.log(products);
[
{
title: "Acer Nitro V Gaming Laptop",
price: "$899",
rating: "4.5 out of 5 stars",
link: "https://..."
},
{
title: "ASUS TUF Gaming A15",
price: "$949",
rating: "4.4 out of 5 stars",
link: "https://..."
}
]
Стварэнне „мозга“ для SIKKI
Ёнколі трэба даець SIKKI «мозг», неабходна ўзначэнне вхідных дадзеных, адпаведальнага за крок і крэтарыяў завершэння працы перад зменым коду. Аперацыйныя працавнікі должны магчымае запускаць крок з вядомай точкі контролю, не падозрываючы прыхованы стан. Запісваць трэба час выконання і витраты праза функцыйнае рэзультат. Відкрытыя інформацыі з самага пачатку запобегаюць неспакоўным рахункам, калі працэс пераходзіць з дэмавай версіі ў спяльныя сераўыры. Трэба стварыць точку контролю пасля дорогіх вызоў модэлю, каб перапрыцёк не прабіў зноў за тую ж работу.
const prompt = `You are an ecommerce analyst.
Analyze the following products.
${JSON.stringify(products)}
Return:
1. Cheapest product
2. Average price
3. Best rated product
4. Summary of the market
5. Recommendation
`;
Стварэнне фінальнага агента SIKKI
Для стварэння фінальнага агента SIKKI неабяжна пазначыць вхідныя даны, адпаведальнага за крок і критэрыі завершэння пры перадзеяванні коду. Аператары должны магчымаць перзапуск кроку з вядомай точкі контролю, не прабуючы спадароўваць схованы стан. Конфігурацыю трэба залічыць параду ад коду прыкладнення. Файлы сераўнавання, хранільнікі секрэтных дадзеных і флагі функцыйяў должны знаходзіцца ў аднам месцы, якое аператары можаць пераглядаць, не чытаяўшы весь граф. Зробіце точку контролю пасля дорогіх вызоў модэлю, каб перапрынцыпаванне не прабівала зноў абліковаць аднойчы выконаную роботу.
Крок 1: Стварыць файл агента
Для першага: падчырывайце Файл Агента, задаце вхідныя даны, адміністратара крока і крэтырыя для завершэння пры перадзмене коду. Аператары должны магчымаць перзапуск крока з вядомай точкі контролю без адгадвання захаванага стану. Дакументавайце як шлях успеху, так і шлях вярнення. Перапрыбуткі, людзкіе перакрыцця і обробка некоректных паведамленняў ёсць часткай продукту, а не пасляднім дапрацоўкам. Ствараюце точку контролю пасля дорогіх вызоў модэлю, каб перапрыбутак не прабіў зноў за тую ж работу. Для першага: падчырывайце Файл Агента, задаце вхідныя даны, адміністратара крока і крэтырыя для завершэння пры перадзмене коду. Аператары должны магчымаць перзапуск крока з вядомай точкі контролю без адгадвання захаванага стану. Спрыяйце гэтаму этапу як кантракту межа вхіднымі данымі і перакананымі выходнымі рэзультатамі. Даўце назвы артыфактам, задаце перакананні на успех і адмовіцеся ад тыхняга частковага завершэння без паведамлення.
import "dotenv/config"; //to use environment variables from .env file
import fs from "fs"; //to read and write files
import { chromium } from "playwright";
import { GoogleGenAI } from "@google/genai";
//api keys and endpoints from environment variables
const BRIGHT_WS_ENDPOINT = process.env.BRIGHT_WS_ENDPOINT;
const GEMINI_API_KEY = process.env.GEMINI_API_KEY;
//initialize the GoogleGenAI client with the Gemini API key
const ai = new GoogleGenAI({
apiKey: GEMINI_API_KEY,
});
//the prompt to send to the Gemini API
const prompt = "Write a short introduction to the Gemini API.";
const response = await ai.models.generateContent({
model: "gemini-2.5-flash",
contents: prompt,
});
console.log(response.text);
Шаг 2: Налаштаванне Playwright для з’єднання з WebSocket-сервісам Bright Data
Для шагу 2: Налаштаванне Playwright для з’єднання з WebSocket-сервісам Bright Data неабяжна пазначыць параметры вводу, адміністратара шагу і критэрыя завершэння пры перадзмене коду. Аперацыйныя працавнікі должны магчымае перадзначыць шаг з вядомай точкі контролю, не спрабоўваючы здогадвацца пра схованы стан. Запісвайце час выконання і вартасць разам з рэзультатамі функцыяналу. Ранняя візуабільнае інформацыя запобегае неспакоўным рахункам, калі процес пераходзіць з дэмовай среды ў спакульную. Раздзеляйце планаванне і выконання інструментам. Планавальнік пропануе; выконавацель вносить змяны; пераканальнік пераглядае рэзультаты за адносам да цялевых показнікаў.
//setup Playwright to connect to Bright Data's WebSocket endpoint and navigate to Amazon search results for "gaming laptop"
async function main(){
const browser = await chromium.connectOverCDP(BRIGHT_WS_ENDPOINT);
const page = await browser.newPage();
const query = "gaming laptop";
const searchUrl = `https://www.amazon.com/s?k=${encodeURIComponent(query)}`;
console.log("Navigating Bright Data Playwright to:", searchUrl);
await page.goto(searchUrl, { waitUntil: "domcontentloaded" });
const title = await page.title();
console.log("Amazon search page title:", title);
console.log("Bright Data navigation complete for query:", query);
await browser.close();
}
main();
Шаг 3: Адзычэнне інформацыі пра продукт
Для трэцьяго крока: выкарыстоўвання інфармацыі пра продукт, неабходна пазначыць вхідныя даны, адпаведальнага за крок і критэрыя завершэння пры змены коду. Аперацыйныя працавнікі должны магчымае перадзеўваць крок з вядомай точкі контролю, не спрабоўваючы здогадвацца пра схованы стан. Конфігурацыю трэба залічыць параду ад коду прыкладнення. Файлы сераўіса, хранільнікі секрэтных дадзеных і флагі функцыяй должны знаходзіцца ў аднам месцы, якое працавнікі можуць пераглядаць, не чытаючы весь граф. Неабходна раздзеліць планаванне ад выконання інструментаў. Планавальнік пропануе; выконавацель вносить змяны; пераканальнік пераглядае рэзультаты за адносам да цялі.
// Playwright to connect to Bright Data's WebSocket endpoint and navigate to Amazon search results for "gaming laptop"
async function main(){
const browser = await chromium.connectOverCDP(BRIGHT_WS_ENDPOINT);
const page = await browser.newPage();
const query = "gaming laptop";
const searchUrl = `https://www.amazon.com/s?k=${encodeURIComponent(query)}`;
console.log("Navigating Bright Data Playwright to:", searchUrl);
await page.goto(searchUrl, { waitUntil: "domcontentloaded" });
const products = await page.evaluate(() => {
const data = [];
document
.querySelectorAll('[data-component-type="s-search-result"]')
.forEach((card) => {
const title = card.querySelector("h2 span")?.innerText;
const price = card.querySelector(".a-price .a-offscreen")?.innerText;
const rating = card.querySelector(".a-icon-alt")?.innerText;
if (title && price) {
data.push({
title,
price,
rating,
});
}
});
return data;
});
console.log("Step 3: Extract Product Information");
console.log(products);
const title = await page.title();
console.log("Amazon search page title:", title);
console.log("Bright Data navigation complete for query:", query);
await browser.close();
}
main();
Чэтвёрты крок: папросіць Gemini аналізаваць рынак
Для крока 4: прагніце, каб Gemini аналізав рынак, і перш чым зменяць код, задаце вхідныя даны, адміністратара крока і критэрыя завершэння. Аперацыйныя працавнікі должны магчымаць перзапуск крока з вядомай точкі контролю без адгадвання захаванага стану. Запісваце адночасна шлях успеху і шлях вярнення. Перапрыбуткі, людзкіе контралі і обработка некоректных паведамленняў ёсцю часткая продукту, а не паслядніе доработкі. Разлучыце планаванне ад выконання інструментамі. Планавальнік прымець рашэння; выконаваць зменяе даны; пераканальнік пераглядае рэзультаты за адносам да цялевага рэзультата. Для крока 4: прагніце, каб Gemini аналізав рынак, і перш чым зменяць код, задаце вхідныя даны, адміністратара крока і критэрыя завершэння. Аперацыйныя працавнікі должны магчымаць перзапуск крока з вядомай точкі контролю без адгадвання захаванага стану. Спрыяце гэтам этапу як кантракту межа вхіднымі данымі і паверанымі выходнымі рэзультатамі. Даце назвы артыфактам, задаце перакананні на успех і адмовіцеся ад бяспечнага частковага завершэння.
const prompt = `You are an ecommerce analyst.
Analyze these products:
${JSON.stringify(products)}
Return:
1. Cheapest Product
2. Average Market Price
3. Best Rated Product
4. Competitor Comparison
5. Final Recommendation
`;
const result = await model.generateContent(prompt);
const analysis =
result.response.text();
### 3. Best Rated Product
There are three products tied for the highest rating of **5.0 out of 5 stars**:
1. **HP OMEN 16" Gaming Laptop Computer** (Intel Ultra 9 285H, NVIDIA GeForce RTX 5070 8GB, 16GB DDR5, 1TB PCIe SSD, 144Hz IPS WUXGA Display) at **$1,745.99**
2. **HP OMEN 16 Slim RTX 5070 Gaming Laptop** (Intel Ultra 9 285H, NVIDIA RTX 5070, 32GB DDR5, 1TB SSD, 16" FHD+ Anti-Glare) at **$1,929.00**
3. **ASUS ROG Strix G16 Gaming Laptop** (Intel Core i7 14650HX, NVIDIA RTX 5060, 32 GB DDR5 RAM, 1 TB SSD, 16" FHD+ LED Display, & Gaming Accessories) at **$1,999.99**
**Analysis:** It's noteworthy that two HP OMEN laptops achieved perfect ratings, both featuring high-end Ultra 9 CPUs and RTX 5070 GPUs.
This suggests strong customer satisfaction with HP's premium gaming line.
The ASUS ROG Strix G16 also achieved a 5.0 rating,
despite having a slightly lower-tier GPU (RTX 5060) than the
HP OMENs in this bracket, possibly due to the included
"Gaming Accessories" and overall perceived value.
The Alienware product has no rating, so it cannot be considered here.
Шаг 5: Экспорт адаптацы рынку Sikki
Для шага 5: Экспорт адаптацы рынку Sikki неабяжна пазначыць параметры вводу, адпаведальнага за шаг і крэтыя завершэння пры перадзеіснавленні коду. Аператары должны магчымаць перзапуск шага з вядомай точкі контролю без неабяжнага вычыслення схованых станоў. Запісваць трэба час выконання і витраты разам з функцыйнальнымі рэзултатамі. Вялікі відкрыты прыем літэраў спрыяе можлівасці внесення зловершэнняў і робіць аудыты дорогімі.
const report = `
# SIKKI Market Report
## Search Query
${query}
## Products
${JSON.stringify(products, null, 2)}
## Gemini Analysis
${analysis}
Generated: ${new Date().toISOString()}
`;
fs.writeFileSync(reportPath, report, "utf8");
import "dotenv/config"; // use environment variables from .env file
import fs from "fs";
import { chromium } from "playwright";
import { GoogleGenAI } from "@google/genai";
const BRIGHT_WS_ENDPOINT = process.env.BRIGHT_WS_ENDPOINT;
const GEMINI_API_KEY = process.env.GEMINI_API_KEY;
if (!BRIGHT_WS_ENDPOINT) {
throw new Error("Missing BRIGHT_WS_ENDPOINT environment variable.");
}
if (!GEMINI_API_KEY) {
throw new Error("Missing GEMINI_API_KEY environment variable.");
}
const ai = new GoogleGenAI({
apiKey: GEMINI_API_KEY,
});
async function retryWithBackoff(fn, maxRetries = 5, initialDelayMs = 2000) {
for (let attempt = 1; attempt <= maxRetries; attempt++) {
try {
return await fn();
} catch (error) {
const errorMsg = error?.message || error?.status || JSON.stringify(error);
if (attempt === maxRetries) {
console.error(`Final attempt failed. Error: ${errorMsg}`);
throw error;
}
const delayMs = initialDelayMs * Math.pow(2, attempt - 1);
console.log(`Attempt ${attempt} failed: ${errorMsg}`);
console.log(`Retrying in ${delayMs}ms... (${attempt}/${maxRetries})`);
await new Promise((resolve) => setTimeout(resolve, delayMs));
}
}
}
async function main() {
let browser;
try {
browser = await chromium.connectOverCDP(BRIGHT_WS_ENDPOINT);
const page = await browser.newPage();
const query = "gaming laptop";
const searchUrl = `https://www.amazon.com/s?k=${encodeURIComponent(query)}`;
console.log("Connecting Playwright to Bright Data...");
console.log("Navigating to:", searchUrl);
await page.goto(searchUrl, { waitUntil: "domcontentloaded" });
const products = await page.evaluate(() => {
const data = [];
document
.querySelectorAll('[data-component-type="s-search-result"]')
.forEach((card) => {
const title = card.querySelector("h2 span")?.innerText;
const price = card.querySelector(".a-price .a-offscreen")?.innerText;
const rating = card.querySelector(".a-icon-alt")?.innerText;
if (title && price) {
data.push({
title,
price,
rating,
});
}
});
return data;
});
console.log(`Extracted ${products.length} products.`);
const analysisPrompt = `You are an ecommerce analyst.
Analyze these products:
${JSON.stringify(products)}
Return:
1. Cheapest Product
2. Average Market Price
3. Best Rated Product
4. Competitor Comparison
5. Final Recommendation
`;
console.log("Sending products to Gemini for analysis (with retry logic)...");
const analysisResult = await retryWithBackoff(async () => {
return await ai.models.generateContent({
model: "gemini-2.5-flash",
contents: analysisPrompt,
});
}, 5, 2000);
const analysis = analysisResult.text || "No analysis text returned.";
const report = `# SIKKI Market Report
## Search Query
${query}
## Products
${JSON.stringify(products, null, 2)}
## Gemini Analysis
${analysis}
Generated: ${new Date().toISOString()}
`;
fs.writeFileSync("sikki-report.md", report, "utf8");
console.log("Step 5: Export the Results");
console.log("Report generated: sikki-report.md");
console.log("Final analysis saved. Open sikki-report.md to review the result.");
await browser.close();
} catch (error) {
console.error("Error:", error.message || error);
if (browser) {
await browser.close().catch(() => {});
}
process.exit(1);
}
}
main();
Шаг 6: Навучэнне SIKKI аблікаванню доказаў
Для 6-го крока: «Навучыць SIKKI зафіксаваць доказы» — перш чым зменяць код, неабходна ясная вакаляванне вхідных дадзеных, адміністратара крока і крэтэрыяў завершэння. Аперацыёныя працавнікі должны магчыма ўвайсці крок з вядомай точкі перапытку без неабясненага адгадвання скрытых станоў. Конфігурацыю трэба залічыць параду ад коду прыкладнення. Файлы сераўіса, хранільнікі секрэтных дадзеных і флагі функцыйяў должны знаходзіцца ў аднам месцы, якое працавнікі можуць пераглядаць, не чытаючы весь граф.
const searchScreenshot = path.join(screenshotDir, "search-results.png");
await page.screenshot({ path: searchScreenshot, fullPage: true });
const summaryPath = path.join(screenshotDir, "top-product-summary.png");
await cards[0].screenshot({ path: summaryPath });
7-й крок: Зафіксаваць кожную сторанку продукту
Для крока 7: Зберагаючы кожную сторанцу продукту, праймераньце параметры вводу, адміністратара крока і крэтырыя выходу пры зміне коду. Аператары должны магчымаць перзапуск крока з вядомай точкі контролю без адгадвання захаванага стану. Дакументавайце як шлях успеху, так і шлях вярнення. Перапрыбуткі, людзкія перакрыцця і обработка некоректных паведамленняў ёсць часткай продукту, а не пасляднім дапрацоўкам. Строго прыгэруйце схемы інструментаў. Шырокія параметры у вільным тексте спрыяюць атакам і робяць аудыты дорогімі. Для крока 7: Зберагаючы кожную сторанцу продукту, праймераньце параметры вводу, адміністратара крока і крэтырыя выходу пры зміне коду. Аператары должны магчымаць перзапуск крока з вядомай точкі контролю без адгадвання захаванага стану. Спрыяйце гэтаму этапу як кантракту межа параметрамі вводу і перакананымі выходамі. Даўце назвы артыфактам, праймераньце перакрыцці успеху і адмовіцеся ад тыхоўскага частковага завершэння.
const normalized = normalizeAmazonUrl(p.url, p.title);
await retryWithBackoff(async () =>
await page.goto(normalized, { waitUntil: "domcontentloaded", timeout: 120000 }),
3,
1500
);
await page.waitForTimeout(800);
await page.screenshot({ path: outPath, fullPage: true });
Крок 8: Стварыць экспорт у формате CSV
Для 8-го крока: стварыць экспорт у формате CSV, задаць параметры вводу, адпаведнага власніка крока і критэрыя завершэння пры зміне коду. Аператары должны магчымаць перзапуск крока з вядомай точкі контролю, не падозрываючы прыхованы стан. Запісваць час выконання і витраты праз адны ряд з функцыйнальнымі рэзултатамі. Відразы ведаць прычыны дапамагае ухіліцца ад неспакоўных рахунков, калі процес пераходзіць з дэмаверсіі ў спяльныя среды. Застаўляць точку контролю пасля дорогіх вызоў модэлю, каб перзапуск не прыносіў дадатковых витатаў за тую ж работу.
const csvLines = ["TITLE,PRICE,RATING,URL"];
enriched.forEach((p) => {
const safe = (s) => `"${String(s || "").replace(/"/g, '""')}"`;
csvLines.push([safe(p.title), safe(p.price), safe(p.rating || ""), safe(p.url || "")].join(","));
});
fs.writeFileSync(csvPath, csvLines.join("\n"), "utf8");
9-й крок: Стварыць статыстыку на панелі керування
Для 9-го крока: «Стварыць падсумак дашборда», неабяжна з’явіць вялічыны вхідных дадзеных, адпаведнага адпаведальнага за крок і крэтарыя завершэння працы перад змінайом коду. Аператары должны магчымаць перзапуск крока з вядомай точкі контролю, не прабуючы спадароўваць сустоянне, якое залишылася непазначанае. Конфігурацыю трэба залічыць пазнаходзяцца за межамі коду прыемленае. Файлы сяродавішняе сераўісу, хранілішчы секрэтных дадзеных і флагі функцый належаць у аднам месца, якое аператары можаць пераглядаць, не чытаяўшы весь ланцуг задач. Заставіць точку контролю пасля дорогіх вызоў модэлю, каб перапрынцыпаванне не прабівало зноў абліковаць аднойчы выконаную роботу.
const priced = enriched.filter((p) => !isNaN(p.priceValue));
const cheapestObj = priced.length ? priced.reduce((a, b) => (a.priceValue <= b.priceValue ? a : b)) : null;
const avgPriceVal = priced.length ? (priced.reduce((s, p) => s + p.priceValue, 0) / priced.length).toFixed(2) : “N/A”;
const bestRatedObj = enriched.slice().sort((a, b) => {
const ra = parseFloat((a.rating || “”).split(“ “)[0]) || 0;
const rb = parseFloat((b.rating || “”).split(“ “)[0]) || 0;
return rb — ra;
})[0] || null;
const dashboard = [];
dashboard.push(“==================================”);
dashboard.push(“SIKKI MARKET DASHBOARD”);
dashboard.push(“==================================”);
dashboard.push(`Query: ${query}`);
dashboard.push(`Products Extracted: ${enriched.length}`);
dashboard.push(`Cheapest Product: ${cheapestObj ? `${cheapestObj.title} | ${cheapestObj.price}` : “N/A”}`);
dashboard.push(`Average Price: ${avgPriceVal === “N/A” ? “N/A” : `${avgPriceVal}`}`);
dashboard.push(`Best Rated: ${bestRatedObj ? `${bestRatedObj.title} | ${bestRatedObj.rating || “N/A”}` : “N/A”}`);
dashboard.push(“\nTop 5 Products:”);
enriched.slice(0, 5).forEach((p, i) => {
dashboard.push(`${i + 1}. ${p.title} | ${p.price} | ${p.rating || “N/A”} | ${p.url || “N/A”}`);
});
fs.writeFileSync(dashboardPath, dashboard.join(“\n”), “utf8”);
Куды працаваць далей
Для таго, куды працавац далей, перад змінайом код неабяжна визначыць параметры, адміністратара крока і критэрыя завершэння. Аператары должны магчымаць перзапуск крока з вядомай точкі контролю, не падозрываючы схованы стан. Неабяжна задокументаваць як шлях успеху, так і шлях вярнення да нормы. Перапрыбуткі, людзкія перакрыцця і обробка некоректных паведамленняў ёсць часткай продукту, а не пасляднім дапрацоўкам. Ствараць точку контролю пасля дорогіх вызоў модэлю, каб перапрыбутак не прабіў зноў рахування за тую ж работу. Для таго, куды працавац далей, перад змінайом код неабяжна визначыць параметры, адміністратара крока і критэрыя завершэння. Аператары должны магчымаць перзапуск крока з вядомай точкі контролю, не падозрываючы схованы стан. Спрыяць гэтаму этапу як кантракту межа параметрамі і перакананымі выходнымі даннымі. Даць назву артыфактам, визначыць перакананні на успех і не прабачаць бяспечнага частковага завершэння.
Заключэнне
Для заключэння, перш чым зменяць код, неабходна ясная ваказка пра вхідныя даны, адпаведальнага за крок і критэрыя завершэння. Аперацыйныя працавікі должны магчыме быць перадзваны крок з вядомага пункта контролю без неабясненняя схованага стану.
Чэк-ліст для аперацый
Для чэк-ліста для аперацый таксама неабходна ясная ваказка пра вхідныя даны, адпаведальнага за крок і критэрыя завершэння перш чым зменяць код. Аперацыйныя працавікі должны магчыме быць перадзваны крок з вядомага пункта контролю без неабясненняя схованага стану.
Валідзіце маленькія, тэставаныя елементы замест большых скрыптов. Калі крок не выйшоў, прычына нехацкага рэзультата должна быць адночы прызначаная конкрэтнаму элементу, а не сложным ланцоўкам задач.
Контрольныя точкі пасля дорогіх вызоў модэлей, каб перапрытак не практыкаваў падатак знову за тую ж работу.
З’ясавайце межы ціклу запуску: што блакуе нить працы і што чакае на ядро.
Напісце кароткі посібнік: як зменяць кантрольныя ключы, як спрачыслаць чергу, як відклікнуць пасляльнія змяны.
Зберагаюце настройкі пазыроўна ад коду прыемліка. Файлы сераўнавання, храненні секрэтных дадзенаў і флагі функцыйяй должны знаходзіцца ў аднам месцы, куды аператары можаць адбавіць аудыт без чытання всей структуры.
Перад павышэнням версіі стека заморозьце існуючыя версіі, зафіксуйце ідеальны транскрыпт для критычнага шляху і паказваце крокі відклікнення. У спадзяльных сераўнаваннях неабходны ліміты частоты вызоў, пераказкі прыналежнасці і чыстае вялоўнік для змены секрэтных дадзенаў. Валіце простую надзяйнасць працы над крэатывнымі, але разовымі дэманстрацыямі.