فلو: فریمورک هارنس برای ساخت ایجنتهای هوش مصنوعی
خلاصهٔ کاملتر
هر ایجنت هوش مصنوعی در اصل یه حلقه (loop) سادهست: مدل وضعیت فعلی رو میخونه، تصمیم میگیره چی بشه، گاهی یه ابزار فراخوانی میکنه، نتیجه برمیگرده و دوباره مدل تصمیم میگیره — تا وقتی که کار تموم بشه. اون بخشی که ابزارها رو اجرا میکنه، تاریخچه رو نگه میداره و میدونه کِی باید بایسته، هارنس (harness) نام داره.
ابزارهای موجود مثل Claude Code یا Codex به ترمینال محدودن و قابلیت سفارشیسازی کمی دارن. از طرفی ساختن هارنس از صفر هم خیلی پرزحمته. فلو (Flue) اومده این وسط رو پر کنه: یه فریمورک هارنس برنامهپذیر که primitive های درستی در اختیارت میذاره — نه اونقدر کم که مجبور بشی همه چیز رو خودت بسازی، نه اونقدر زیاد که همه چیز از پیش تعریفشده باشه.
در فلو هر ایجنت یه name و یه ID داره. همون ID تعیین میکنه کجا state ذخیره بشه: روی Cloudflare این یعنی یه Durable Object اختصاصی، روی Node یعنی یه in-memory store یا یه custom session store که خودت وصل کردی. فایلها و تاریخچهی مکالمه بین درخواستها و دپلویها باقی میمونن.
State داخل یه ایجنت دو لایهی تو در تو داره. یه session یه thread مکالمهست — چند session میتونن داخل یه ایجنت زندگی کنن، فایلها رو مشترک استفاده کنن ولی هر کدوم تاریخچهی پیامهای جداگانهای داشته باشن. یه task هم یه ایجنت فرزنده داخل یه session که برای سپردن یه زیرمسئله به context جداگانه به کار میاد.
ساختار پروژهی فلو خیلی سبکه: یه فایل TypeScript برای تعریف trigger ها و فراخوانی مدل، و یه فایل Markdown به اسم AGENTS.md که دستورالعمل رفتاری ایجنت رو داره. همین که agent رو به یه دایرکتوری دیگه point کنی، رفتارش عوض میشه — بدون تغییر کد، بدون config file اضافه. برای افزودن سرویسهای third-party هم نیازی به نصب پکیج نیست؛ با flue add | opencode یه recipe مستقیم توی coding agent جاری میشه و adapter موردنیاز رو مینویسه.
مهمترین ویژگی فلو اینه که کدِ ایجنت یه بار نوشته میشه و روی هر target اجرا میشه: webhook handler، scheduled job، یا CLI. فریمورک خودش plumbing رو (session store، request adapter، environment binding) بر اساس محیط اجرا تنظیم میکنه. چیزی که تغییر نمیکنه: کدِ ایجنت، فایل AGENTS.md، skill ها و امضای ابزارها.
نکات کلیدی:
- هر ایجنت = مدل + هارنس؛ فلو اون هارنس رو برنامهپذیر میکنه
- State با ID ایجنت scope میشه؛ روی Cloudflare با Durable Object، روی Node با in-memory store
- Session = thread مکالمه؛ Task = ایجنت فرزند برای زیرمسئلهها
- ساختار پروژه: یه فایل TypeScript سبک + یه فایل AGENTS.md
- یه بار بنویس، هر جا اجرا کن — بدون تغییر در کد ایجنت




