IronBee Express: ایجنت مرورگری که بدون LLM تصمیم میگیره
خلاصهٔ کاملتر
تیم IronBee تو این مقاله توضیح میده چطور IronBee Express رو ساختن؛ یه ایجنت مرورگر که مثلاً وارد یه فروشگاه دمو میشه، یه iPhone 15 Pro میخره و صبر میکنه تا وضعیت سفارش COMPLETED بشه. این کار ۹ اکشن و ۶.۷ ثانیه طول کشید و هزینهی کل تصمیمگیریها ۰.۰۰۰۵۴ دلار بود. نکتهی اصلی اینه که تو این حلقه هیچ LLMی نیست و همهی تصمیمها رو Jev میگیره.
Jev یه مدل از TypeSafe هست که نقش classifier داره، یعنی متن نمینویسه و فقط از بین چند گزینهی تعریفشده یکی رو انتخاب میکنه و برای هر گزینه یه احتمال برمیگردونه. به گفتهی نویسنده همین سه مزیت داره: هر تصمیم حدود ۳۰۰ میلیثانیهست، ورودی ۰.۰۴۲ دلار برای هر میلیون توکنه و خروجی مجانیه، و چون جواب همیشه یکی از کلیدهای فرستادهشدهست، مدل نمیتونه selector یا اسکریپت از خودش بسازه. یعنی ایجنت فقط روی چیزی کلیک میکنه که واقعاً رو صفحه بوده.
برای اینکه هر قدم فقط یه رفتوبرگشت شبکه لازم داشته باشه، همهی سؤالها (چه کاری، روی کدوم المنت، با چه مقداری) با هم تو یه درخواست فرستاده میشن و فقط جواب مربوط به عملیاتی که انتخاب شده استفاده میشه:
const answers = await engine.ask(state, questions); // one request
const op = validateChoice(answers.operation, operations); // must be a key we offered
const head = heads[op.choice]; // e.g. "type_text_target"
const target = validateChoice(answers[head], offeredIds); // only the chosen head is checkedاین طراحی عوارض هم داشت: سؤالها همدیگه رو نمیبینن و یه بار شمارهی کارت تو فیلد PIN تایپ شد. یه یافتهی جالب دیگهی تیم این بود که اضافه کردن قانون به instructions کار رو بدتر کرد (مثلاً میانهی زمان Google Flights از ۸.۱۱ به ۹.۶۶ ثانیه رسید)، ولی نوشتن راهنمایی داخل متن خود گزینه جواب داد. مثلاً بعد از دو WAIT بینتیجه، متن گزینهی WAIT عوض میشه و تعداد انتظارهای پشتسرهم از ۸ به حداکثر ۳ رسید.
Express اصلاً assertion نداره و خود Jev قاضی اجراست. وقتی ایجنت DONE میگه، Jev صفحه و همهی پاسخهای API رو میخونه، تشخیص میده هدف انجام شده، هنوز نه، یا شکست خورده، و به یه شاهد مشخص اشاره میکنه. تو مثال اول مقاله صفحه پیغام موفقیت نشون میداد، ولی بدنهی پاسخ API سفارش رو به خاطر کمبود موجودی FAILED زده بود و Jev همینو گرفت. نویسنده خطاهای Jev رو هم آورده، مثل یه سفارش Kindle که با احتمال 0.51 اشتباهی پاس شد.
اجراهای موفق ضبط میشن و دفعهی بعد بدون هیچ تصمیم Jev دوباره پخش میشن؛ مثلاً چکاوت از ۶.۸ ثانیه به حدود ۱.۷ ثانیه رسید. اگه سایت عوض شده باشه Jev از همون قدم ادامه میده، ولی اگه اپ واقعاً خراب باشه تست خودش رو «درست» نمیکنه، یعنی باگ واقعی پنهون نمیمونه. LLM فقط وقتی وارد میشه که Jev گیر کرده، باید مقداری نوشته بشه که کسی نداده، یا شکست باید با چند جمله توضیح داده بشه.
نکات کلیدی:
- هر تصمیم Jev حدود ۳۰۰ میلیثانیه طول میکشه که حدود ۲۱۵ میلیثانیهش رفتوبرگشت از ترکیه تا سرورهای Oregon هست.
- یه اجرای ۲۰ اکشنی با ۲۳ فراخوانی Jev کلاً ۰.۰۰۴۲ دلار خرج داشت.
- باز نگه داشتن کانکشن HTTP/2 با undici اولین تصمیم رو از حدود ۱۰۰۰ به ۳۰۰ میلیثانیه رسوند.
- تو تست ۱۳۰ تایی replay روی ۱۱ نوع تغییر سایت، بعد از اصلاحات همهی ۱۳۰ اجرا درست تموم شدن.
- پروژه روی GitHub با لایسنس Elastic License 2.0 منتشر شده و Node.js 22، Chrome و کلید API از TypeSafe لازم داره.




