تصور کنید نویسندهای باشید که به جای جنگیدن با پنجرههای جداگانه و کپی-پیستهای مکرر، دستیاری دارد که دقیقاً میداند مکاننما (Cursor) کجاست و همانجا متن را اصلاح میکند. این تجربه، تفاوت میان یک چتبات ساده و یک عامل (Agent) — شبیه به دستیاری که فقط توصیه نمیکند، بلکه خودش دست به قلم میشود — در محیط ویرایشگر است. در واقع، یک توسعهدهنده موفق شده است «DEV Community Buddy» را از یک چتبات غیرفعال در نوار کناری به یک عامل فعال تبدیل کند که قادر به دستکاری مستقیم ویرایشگر است. این رویکرد بخشی از تغییر گستردهتر در دنیای نرمافزار است که در آن توسعهدهندگان از کدنویسی مستقیم به سمت تفویض اختیار به عاملهای هوشمند حرکت میکنند.
به گزارش مستندات این پروژه، این توسعهدهنده با ادغام YourGPT Copilot SDK در یک نمونه محلی از پلتفرم Forem (زیرساخت متنباز DEV.to)، توانسته است محدودیتهای نسخه بتأی رسمی DEV Community Buddy را دور بزند. در نسخه رسمی، اگرچه راهنماییهای مفیدی برای نوشتن ارائه میشود، اما جریان کاری نویسنده را تکه تکه میکند: نویسنده باید سؤال خود را در یک پنل کناری بپرسد و سپس پاسخ را به صورت دستی کپی کرده و در پیشنویس خود جایگذاری کند. دستیار رسمی میتوانست توضیح دهد که چگونه یک کار را انجام دهیم، اما نمیتوانست آن کار را در داخل جریان نوشتن اجرا کند. همچنین مشخص نبود که دستیار به کدام بخش از پیشنویس دسترسی دارد، بافت (Context) گفتگو تا چه زمانی باقی میماند یا اینکه آیا جلسه گفتگو مربوط به پست فعلی است یا خیر.
علاوه بر این، باز کردن دستیار باعث کاهش فضای ویرایشگر میشد و رابط کاربری جداگانهای ایجاد میکرد که با تجربه نوشتن در رقابت بود. این اصطکاک در مرحله نهایی صیقل دادن مقاله، یک «گلوگاه» ایجاد میکند. برای حل این مشکل، توسعهدهنده از ماهیت متنباز Forem استفاده کرد تا شکاف بین پیشنهادات هوش مصنوعی و وضعیت واقعی محصول را پر کند. نوآوری اصلی در اینجا، استفاده از الگوی «ابزار-کلاینت» (Client-Tool Pattern) است؛ جایی که مدل هوش مصنوعی تصمیم میگیرد «چه» چیزی باید تغییر کند، اما مدیریتکنندههای (Handlers) سمت محصول تعیین میکنند که این تغییر «چگونه» و به صورت امن روی DOM (مدل شیء سند) اعمال شود. هدف نهایی، ساخت دستیاری است که بتواند بافت فعلی نوشته را بخواند، متنهای انتخابشده را بازنویسی کند، مارکداون درج نماید، تگها را پیشنهاد دهد و تغییرات تایید شده را بدون نیاز به کپی-پیست دستی اعمال کند.
ادغام مستقیم با ویرایشگر
این کوپایلت جدید وضعیت زنده مقاله را بهطور کامل درک میکند؛ این وضعیت شامل عنوان، تگها، محتوای بدنه و مختصات دقیق مکاننمای کاربر است. طبق بررسیهای فنی، مدل مستقیماً صفحه را دستکاری نمیکند تا از خرابیهای احتمالی جلوگیری شود، بلکه از مجموعهای از ابزارهای کنترلشده استفاده میکند تا Forem مسئولیت اعتبارسنجی و اعمال هر تغییر را بر عهده داشته باشد. این امر یک تفکیک مسئولیت شفاف ایجاد میکند: مدل قصد کاربر را تفسیر میکند، ابزارهای کلاینت اقدامات مجاز را نمایش میدهند و مدیریتکنندههای Forem رابط کاربری واقعی را بهروز میکنند. چنین ساختاری یادآور ابزارهای پیشرفتهای است که مانند Silent Architect، توانمندی خود در مدیریت تسکها را با کاهش زمان تکمیل عملیات اثبات کردهاند.
ابزارهای کلیدی عملیاتی که در این نسخه پیاده شدهاند عبارتاند از:
- ویرایش آگاه از انتخاب (Selection-Aware Editing): با هایلایت کردن متن، یک تولبار متنی با گزینههای «بازنویسی» (Rewrite)، «کوتاهسازی» (Shorten) یا «غلطگیری» (Proofread) ظاهر میشود. سیستم محدوده انتخاب را ذخیره میکند؛ مدل نسخه بهبودیافته را برمیگرداند و ابزار
apply_selection_editدقیقاً همان محدوده را جایگزین میکند. این مکانیسم مانع از آن میشود که یک ویرایش کوچک به طور تصادفی کل پیشنویس را تغییر دهد. - اتوماسیون ساختار: ابزار
generate_tldrبه طور خودکار یک بخش فرمتشده با عنوان «## TL;DR» در ابتدای پست درج میکند. همچنین ابزارinsert_into_bodyاجازه میدهد مارکداون در موقعیت مکاننما، ابتدا یا انتهای مقاله قرار گیرد. - جریانهای کاری رسانه: کوپایلت میتواند سینتکس Mermaid را به تصاویر PNG تبدیل کند (از طریق رندر و آپلود). همچنین قادر است یک تصویر کاور تولید کرده و آن را مستقیماً به جریان انتشار متصل کند، بنابراین از تولید صرفِ پرامپت فراتر رفته و جریان کاری کاربردی را تکمیل میکند.
- مدیریت متادیتا: ابزارهای
set_article_titleوfill_tagsفیلدهای خاص فرم بهروز میکنند. ابزارfill_tagsتا چهار تگ مرتبط را از طریق رابط کاربری موجود در Forem (Chip Interface) انتخاب میکند. این سیستم مانع از خطای رایج هوش مصنوعی میشود که عنوان را به عنوان سرتیتر H1 در داخل بدنه قرار دهد، زیرا سیستم بهطور صریح علامت#ابتدایی را از متون درجشده در بدنه حذف میکند. - گسترش پیشنویس: ابزارهایی مانند «نوشتن مقدمه» یا «طرحبندی بخشهای باقیمانده» محتوا را بهطور طبیعی در موقعیت مکاننما درج میکنند، در حالی که ویژگی «ادامه دادن به نوشتن» بر اساس وضعیت فعلی پیشنویس، مقاله را گسترش میدهد.
- کنترل کیفیت: ابزار «غلطگیری این بخش» دستور زبان، املای کلمات و وضوح متن را در جای خود اصلاح میکند بدون اینکه بقیه پیشنویس را جایگزین کند. همچنین میتواند از طریق ابزار «افزودن استنادات» (Add citations)، منابع مرتبط را با فرمت صحیح پیدا و درج کند.

رفتارها و محدودیتهای ویرایشگر
برای اطمینان از اینکه هوش مصنوعی جریان نوشتن را مختل نمیکند، توسعهدهنده رفتارهای خاصی را پیاده کرده است که نحوه تعامل کوپایلت با سند را کنترل میکند:
- حفظ محدوده (Range Preservation): ویرایشگر محدوده انتخابشده را قبل از اینکه فوکوس به کوپایلت منتقل شود، ذخیره میکند. این کار تضمین میکند که پس از پردازش درخواست توسط AI، دقیقاً متن درست جایگزین شود.
- جلوگیری از H1: همانطور که ذکر شد، سیستم بهطور صریح یک H1 ابتدایی را از محتوای تولید شده برای بدنه حذف میکند. این مورد حیاتی است زیرا DEV عنوان را در یک فیلد مجزا ذخیره میکند و تکرار آن در بدنه باعث ایجاد چیدمان (Layout) ضعیف میشود.
- اجرای تک-عملیاتی (Single-Action Execution): هر اکشن تنها یکبار در هر درخواست اعمال میشود. این کار از باگهای رایج هوش مصنوعی مانند تکرار متن، تگهای تکراری یا درجهای unplanned جلوگیری میکند.
- حفظ رابط کاربری: با استفاده از رابط کاربری واقعی تگها (Tag Chip) به جای تزریق ساده متن، کوپایلت الگوهای اعتبارسنجی و تعاملی موجود در Forem را حفظ میکند.
معماری فنی
این پیادهسازی بر پایه یک استک سهلایه شامل Runtime نود-جیاس (Node.js)، پروکسی ریلز (Rails) برای احراز هویت و YourGPT Copilot SDK (نسخههای ۲.۵.x) بنا شده است. توسعهدهنده از مدل Gemini 3.6-flash به عنوان مدل اصلی استفاده کرده و برای مدیریت محدودیتهای نرخ درخواست (خطاهای ۴۲۹) که در تيرهای رایگان رایج است، مدلهای جایگزینی مانند gemini-3.5-flash-lite ، gemini-3.5-flash و gemini-flash-lite-latest را تعریف نموده است.
برای حفظ پایداری، معماری از تفکیک شدید مسئولیتها پیروی میکند:
- پرامپت سیستمی (System Prompt): شخصیت (Persona) و قوانین سطح بالای محصول (مثلاً عنوان نباید H1 در بدنه باشد) را تعریف میکند. این بخش فقط شامل شخصیت و قوانین است و برای صرفهجویی در توکن (Token) و افزایش دقت در انتخاب ابزار، کاتالوگ طولانی ابزارها در آن قرار نگرفته است.
- ریزپردازش بدنه (Body Payload): هر درخواست شامل یک اسنپشات زنده از وضعیت فعلی مقاله (
article_state) از طریق یک تابعbody()است. این کار تضمین میکند که AI همیشه بدون نیاز به فراخوانی ابزار «خواندن پیشنویس» در هر سلام و احوالپرسی، از بافت متن آگاه باشد. - مدیریتکنندهها (Handlers): این توابع «مهارتهای» واقعی برای تغییرات DOM را فراهم میکنند. آنها قصد مدل را اعتبارسنجی کرده و بهروزرسانی را انجام میدهند، در حالی که تضمین میکنند اعتبارنامههای حساس مانند کلیدهای API در فرآیند Node/Server باقی مانده و هرگز در معرض کلاینت قرار نگیرند.
- زمان اجرا (Runtime): به جای متن ساده، از SSE (رویدادهای ارسالی سرور) رسمی استفاده میکند. یک کنترلر ریلز (
/api/copilot) کاربر را احراز هویت کرده، بررسیهای Session و CSRF را اعمال میکند و درخواست را به Runtime نود در آدرسhttp://127.0.0.1:3101/api/copilot/streamپروکسی میکند.

راهاندازی محلی و پیکربندی
برای بازسازی این محیط در یک نمونه محلی Forem، پیشنیازمندهای و پیکربندیهای زیر مورد نیاز است:
- محیط: Ruby, Postgres, Redis, Node 20 و Yarn.
- وابستگیها: نصب
@yourgpt/copilot-sdk،@yourgpt/llm-sdkو کتابخانهopenaiاز طریق yarn. - متغیرهای محیطی:
GOOGLE_API_KEY: کلید ارائهدهنده برای Gemini.COPILOT_MODEL: تنظیم شده رویgemini-3.6-flash.COPILOT_RUNTIME_URL: اشاره به فرآیند محلی نود (http://127.0.0.1:3101/api/copilot/stream).COPILOT_RUNTIME_PORT: مقدار ۳۱۰۱.
- اجرای Runtime: زمان اجرا با دستور
yarn copilot:runtimeآغاز میشود و بررسی سلامت (Health Check) از طریق دستورcurl -s http://127.0.0.1:3101/healthتأیید میگردد.
جزئیات پیادهسازی
برای دستیابی به حس روان در عملکرد کوپایلت، چندین پیکربندی فنی خاص اعمال شده است:
- نصب فرانتاند:
CopilotProviderحتی زمانی که داک بسته است، متصل (Mounted) میماند. این کار اجازه میدهد ابزارهای انتخاب، تابعsendMessageرا بدون اینکه کاربر ابتدا پنل را باز کند، فعال کنند. - جمعآوری وضعیت: وضعیت مقاله (
article_state) از طریق تابعcollectArticleState()جمعآوری شده و در ویژگیbodyپرووایدر ارسال میشود تا AI در هر نوبت از عنوان و محتوای فعلی بدنه آگاه باشد. - طرحوارههای ابزار (Tool Schemas): استفاده از JSON Schema در
inputSchemaتضمین میکند که مدل آرگومانها را در فرمت درست ارسال کند. برای مثال،set_article_titleیک رشته ساده میطلبد، در حالی کهinsert_into_bodyبه یک موقعیت (شروع، انتها یا مکاننما) نیاز دارد. - لایهبندی UI: یک لانچر شناور (آواتار + نشان BETA) در پایین سمت راست قرار دارد. هنگام باز شدن، یک داک با ارتفاع کامل (حدود ۴۰۰ پیکسل) با استایل
csdk-theme-modernرا نمایش میدهد. - ادغام SDK: این راهکار از
CopilotProviderبا مقدارmaxIterationsبرابر با ۱۲ و هدرهای سفارشی شاملX-CSRF-Tokenبرای حفظ امنیت جلسه استفاده میکند.
حل چالشهای «حلقه عاملی»
این پروژه چندین چالش غیربدیهی در ساخت کوپایلتهای AI را برجسته میکند. یکی از مسائل بحرانی، «امضای تفکر» (Thought Signature) مورد نیاز Gemini 3.x برای پیگیری ابزارها بود. چون Gemini انتظار دارد این امضاها در فراخوانی توابع برای نوبتهای بعدی وجود داشته باشند، توسعهدهنده مجبور شد امضاها را بر اساس ID فراخوانی ابزار در حین استریمینگ کش کرده و در درخواست بعدی دوباره متصل کند تا از خطاهای ۴۰۰ جلوگیری شود.
علاوه بر این، توسعهدهنده منطقی را برای جلوگیری از «حلقههای تکرار» (Retry Loops) پیاده کرد که در آن محدوده انتخابشده پس از اولین ویرایش موفق، پاک میشود. این کار تضمین میکند AI یک تغییر واحد را مکرراً روی یک بلوک متن اعمال نکند. سایر انتخابهای محصولی که تجربه کاربری را بهبود بخشیدند شامل استفاده از رابط واقعی تگها برای حفظ اعتبارسنجی Forem و نمایش پیامهای تولبار فرمتینگ را به گونهای که فقط برچسب عملیات و متن نقلشده از انتخاب را نشان دهد، میباشد.
مسیرهای توسعه در آینده
نویسنده پیشنهاد میکند که همین معماری میتواند فراتر از ویرایشگر نوشتهها گسترش یابد. با جایگزینی article_state با اشیاء بافت متفاوت و مجموعهابزارهای جدید، همین Runtime میتواند سطوح دیگر را تغذیه کند:
- کوپایلتهای آماری: با استفاده از
stats_state(محدوده ۳۰ روزه، مجموع بازدیدها، پستهای برتر و سری تاریخ/بازدید) برای توضیح اعداد عملکرد و پیشنهاد موضوعات جدید برای نوشتن. ابزارهای نمونه شاملget_stats_snapshot،list_top_postsوopen_post_analyticsاست. این ابزار میتواند پاسخ دهد چرا بازدیدها تغییر کردهاند یا کدام پستها باید به یک سری تبدیل شوند. - عاملهای لیست خواندنیها: بهرهگیری از APIهای جستجو، ذخیره و دنبال کردن برای ساخت صفهای شخصی از پستهای واقعی. این کار مستلزم ابزارهایی مثل
search_posts،pin_reading_itemوfollow_tagاست تا به جای لینکهای توهمی (Hallucinated)، URLهای واقعی پیشنهاد دهد. این عامل میتواند بر اساس تاریخچه کاربر، یک «لیست خواندنی آخر هفته» تولید کند. - دستیار تنظیمات حساب: اجازه دادن به کاربران برای بهروزرسانی ترجیحات اعلانها یا فیلدهای پروفایل. این سطح نیازمند محدودیتهای سختگیرانهتری است و به صورت پیشفرض از الگوی
navigate + explainاستفاده میکند و برای تغییرات تخریبی مانندrevoke_sessionیاupdate_notification_prefنیاز به تاییدیه دارد. این ابزار میتواند به کاربران کمک کند نویز ایمیلی را کاهش داده یا پروفایل عمومی خود را تکمیل کنند.
قوانین گسترش سیستم
برای حفظ یکپارچگی سیستم در حین رشد، توسعهدهنده مجموعهای از قوانین راهنما را پیشنهاد کرد:
- دسترسی مستقیم به وضعیت: دادههای زنده را در تابع
body()نگه دارید به جای اینکه یک ابزار اجباری برای «خواندن همه» بسازید تا از هدر رفتن نوبتهای ابزار جلوگیری شود. - همراستایی مجوزها: اطمینان حاصل کنید که ابزارها فقط عملیاتی را انجام دهند که کاربر در حال حاضر در رابط کاربری اجازه انجام آنها را دارد.
- ایجاز در توصیفات: توصیفات ابزارها را بسیار کوتاه (یک جمله) نگه دارید تا دقت مدل در انتخاب ابزار بهبود یابد.
- پاکیزگی UI: دستورات داخلی ابزارها را از حباب چت قابل مشاهده توسط کاربر خارج کنید تا رابط کاربری تمیز باقی بماند.
- امنیت در اولویت: از قرار دادن اسرار—مانند رمزهای عبور یا IDهای خام جلسه—در بافت مدل خودداری کنید. فقط از فلگهای ایمن مانند «2FA روشن/خاموش» استفاده کنید.
این تغییر رویکرد از «چت در کنار محصول» به «محصول قابل عملیاتی توسط AI» نشاندهنده حرکت به سمت هوش مصنوعی نتیجه-محور (Outcome-oriented) است. به جای ارائه پاسخ، ابزار، وظایف تکمیلشده را ارائه میدهد. این تغییر پارادایم، دقیقاً همان چیزی است که در تحلیل تغییر نقش توسعهدهندگان ارشد از نویسندگی کد به ارکستراسیون سیستمهای AI مورد بحث قرار گرفته است.
اگر در حال ساخت یک رابط کاربری عاملی (Agentic Interface) هستید، فوریترین درس در اینجا این است که اولویت را به یک شیء وضعیت زنده در هر درخواست بدهید، به جای اینکه تنها به AI تکیه کنید تا تاریخچه را از طریق گفتگو حفظ کند. درس بزرگتر این است که در حالی که یک پنل چت پاسخ میدهد، متصل کردن یک کوپایلت به وضعیت واقعی محصول و ابزارهای کنترلشده، نتایج (Outcomes) واقعی خلق میکند.
گام بعدی شما
- اگر در حال ساخت ابزارهای AI هستید، به جای تکیه بر حافظه مدل، یک شیء وضعیت زنده (Live State Object) را در هر درخواست ارسال کنید.
- برای کاهش خطا در انتخاب ابزار، توصیفات توابع خود را به یک جمله کوتاه محدود کنید.
- معماری «جداسازی تصمیم از اجرا» (Decision vs Execution) را برای عملیات حساس روی مرورگر پیاده کنید.
اما تأثیر این رویکرد بر هزینههای استنتاج در مقیاس سازمانی متفاوت است — در تحلیل ما درباره بهینهسازی هزینههای GPU بخوانید.




گفتگو