Skip to content

হারনেস ইঞ্জিনিয়ারিং ১০১: কোডিং এজেন্ট আসলে কীভাবে কাজ করে ​

এজেন্ট হারনেস কী? ​

একটি ল্যাঙ্গুয়েজ মডেল নিজে থেকে এজেন্ট নয়। তাকে কাজের এজেন্ট বানায় তার চারপাশের সফটওয়্যার, আর সেই পুরো সফটওয়্যারটাই এজেন্ট হারনেস। Martin Fowler-এর সাইটে এক আর্টিকেলে Thoughtworks-এর Birgitta Böckeler কথাটা এক লাইনে বলে দিয়েছেন: এজেন্ট = মডেল + হারনেস।

মডেলটা আপনি ভাড়া নেন। বাকি সবই হারনেস: যে লুপ তাকে দিয়ে একটানা কাজ করিয়ে নেয়, যেসব টুল সে কল করতে পারে, তার কনটেক্সট উইন্ডোতে কী ঢুকবে, তাকে কী কী করতে দেওয়া হবে, আর কেউ মেনে নেওয়ার আগে তার কাজ কীভাবে যাচাই হবে।

হারনেসআপনার বানানো অংশকনটেক্সট যায়পরের অ্যাকশনঅনুমতি পেলেচালায়আউটপুট, এক্সিট কোডফলাফল যোগ হয়এজেন্ট লুপপ্রতি ধাপে এক পাক, যতক্ষণ নাকাজ শেষ হয় বা সে হাল ছাড়েটাস্ককনটেক্সটমেমরি, কমপ্যাকশনমডেলপরের অ্যাকশন বাছেগার্ডরেইলঅনুমতি আছে কি?টুলশেল, API, ফাইলবাস্তব দুনিয়ারিপো, সার্ভিস, ইন্টারনেটযাচাইএক্সিট কোড, হুক
প্রতি ধাপে লুপের এক পাক। হারনেসের বাইরে থাকে শুধু মডেল আর বাস্তব দুনিয়া: মডেল যা দেখে আর যা ছোঁয়ার অনুমতি পায়, সবই কারও না কারও বানানো কোনো অংশের ভেতর দিয়ে যায়। প্রতি পাকে যা ফেরত আসে, তা ফিডব্যাক: আউটপুট, একটি এক্সিট কোড, হুকগুলো যা জানায়। আসল টেস্ট চালানোটা বেশিরভাগ সময় মডেলের নিজের সিদ্ধান্ত, নয়তো কোনো হুক তাকে চালাতে বাধ্য করে।

হারনেস আর ফ্রেমওয়ার্কও এক জিনিস নয়, যদিও দুটি প্রায়ই গুলিয়ে যায়। LangChain, Microsoft Agent Framework আর OpenAI Agents SDK হলো ফ্রেমওয়ার্ক, মানে এজেন্ট বানানোর যন্ত্রাংশের বাক্স। সেই যন্ত্রাংশ জুড়ে যে তৈরি রানটাইম দাঁড়ায়, সেটি হারনেস। Claude Code একটি হারনেস। Codex CLI-ও তাই। তবে সীমারেখাটা ঝাপসা হয়ে আসছে, কারণ বেশ কয়েকটি ফ্রেমওয়ার্ক এখন নিজেদের একটি রেডিমেড হারনেসও সঙ্গে দিয়ে দেয়।

হারনেস কেন গুরুত্বপূর্ণ ​

একটি পরীক্ষার কথা বলি। আমার মনে হয়, এটি আরও অনেকের জানা দরকার। একটি মডেল নিন, আর তাকে SWE-bench Verified থেকে বাগ ফিক্সের ১৬৯টি সত্যিকারের টাস্ক দিন। মডেলের ওয়েট, টাস্ক, কনটেক্সট উইন্ডো, সব হুবহু এক রাখুন। বদলান শুধু মডেলের চারপাশে চলা কোডটুকু। পুরোপুরি সমাধান হওয়া টাস্কের সংখ্যা ৪৩ থেকে উঠে যায় ৭২-এ।

ফলাফলটা আগস্টে arXiv-এ আসা একটি পেপারের। এই লেখা কী নিয়ে, সেই প্রশ্নের সবচেয়ে ছোট উত্তরও আমার কাছে এটিই। দুই রানেই মডেল ছিল হুবহু এক। হারনেস ছিল আলাদা।

আজকাল আমার কাজের দিনের বেশিরভাগটা কাটে এজেন্ট নিয়ে। কখনো এজেন্ট বানাই, কখনো সেগুলো দিয়ে কোড লেখাই। তবু লোকে এখনো প্রথমেই জানতে চায়, কোন মডেল নেবে। প্রতি কোয়ার্টারে এই প্রশ্নের গুরুত্ব একটু করে কমছে। ফ্রন্টিয়ার মডেলগুলো এখন এত কাছাকাছি যে ফলাফলের বড় অংশ ঠিক করে দেয় সেগুলোকে ঘিরে থাকা সফটওয়্যার: একটি টাস্কে খরচ কত পড়বে, এজেন্ট কাজটা শেষ করতে পারবে কি না, আর সে যা ফেরত দেবে তার ওপর ভরসা করা যাবে কি না। এই সফটওয়্যারটাই হারনেস। আর এটি ডিজাইন করার কাজকে লোকে এখন বলতে শুরু করেছে হারনেস ইঞ্জিনিয়ারিং।

প্রম্পট, কনটেক্সট, হারনেস ​

এখানে পৌঁছাতে তিনটি ধাপ লেগেছে। প্রতিটি নতুন ধাপ আগেরটিকে ভেতরে রেখে তার চারপাশে আরেকটি স্তর জুড়েছে।

হারনেস ইঞ্জিনিয়ারিং, ২০২৬কেমন পরিবেশ বানাতে হবেটুল, লুপ, পারমিশন, চেক যোগ হয়কনটেক্সট ইঞ্জিনিয়ারিং, ২০২৪ থেকে ২০২৫মডেলকে কী দেখাতে হবেরিট্রিভাল, মেমরি, কমপ্যাকশন যোগ হয়প্রম্পট ইঞ্জিনিয়ারিং, ২০২২ থেকে ২০২৩মডেলকে কী বলতে হবেশুধু নির্দেশগুলো
কোনোটিই বাদ পড়েনি। প্রম্পট আর কনটেক্সট এখনো জরুরি, শুধু এখন সেগুলো হারনেসের ভেতরে তার দুটি অংশ হয়ে আছে।

প্রম্পট ইঞ্জিনিয়ারিংয়ের মাথাব্যথা ছিল শব্দ নিয়ে। কনটেক্সট ইঞ্জিনিয়ারিংয়ের প্রশ্ন ছিল, সেই শব্দের সঙ্গে মডেলের সামনে আর কী রাখা হবে: রিট্রিভ করা ডকুমেন্ট, মেমরি, দশ টার্ন আগে কী হয়েছিল তার সারাংশ। হারনেস ইঞ্জিনিয়ারিং এই দুটিকেই নেয়। তারপর যোগ করে বাকি সবকিছু, যা পেলে মডেল শুধু কথা বলে না, কাজও করতে পারে।

ত্রিশ লাইনে পুরো লুপ ​

হারনেস বোঝার সবচেয়ে সহজ উপায় হলো নিজে একটি লিখে ফেলা। নিচে সিউডোকোডে একটি কোডিং এজেন্টের মূল অংশ দিলাম। সরল করা হয়েছে ঠিকই, তবে আমি যত সত্যিকারের হারনেসের কোড পড়েছি, সবগুলোর গড়ন এমনই।

python
def run_agent(task, model, tools, limits):
    context = [system_prompt(), project_memory(), task]

    for step in range(limits.max_steps):
        if count_tokens(context) > limits.window * 0.8:
            context = compact(context)          # summarize old turns

        reply = model.generate(context, tools=tools.schemas())

        if reply.is_done:
            report = verify(reply)              # run tests, linters, a reviewer
            if report.passed:
                return reply
            context.append(report.as_feedback())
            continue

        for call in reply.tool_calls:
            if not policy.allows(call):
                result = ask_human(call) or "denied by policy"
            else:
                result = tools.run(call)        # most of the time: a shell command
            context.append(trim(result))        # keep the lines that matter

        if same_command_failed(context, times=3):
            context.append("That failed three times. Try a different approach.")

    return stop_and_report(context)

এবার গুনে দেখুন, মডেলকে ডাকা হয়েছে কয়টি লাইনে। মাত্র একটিতে: model.generate। বাকি সব হারনেস, আর প্রতিটি লাইনের পেছনে কাউকে না কাউকে একটি সিদ্ধান্ত নিতে হয়েছে। কমপ্যাক্ট কখন করবেন? ৪,০০০ লাইনের টেস্ট লগের কতটুকু মডেল দেখতে পাবে? git push --force নিয়ে policy.allows কী বলবে? এর যেকোনো একটি উত্তর বদলালেই একই মডেল অন্য এক এজেন্টের মতো আচরণ করবে।

অংশগুলো, একে একে ​

লুপ ​

প্ল্যান, অ্যাকশন, ফল দেখা, তারপর আবার। মূল অংশটা সত্যিই এতটুকু: Mario Zechner-এর Pi এজেন্টের পুরো সিস্টেম প্রম্পট আর টুল ডেফিনিশন মিলিয়ে ১,০০০ টোকেনও হয় না। কঠিন কাজটা লুপের চারপাশে। কখন থামবে। কখন মানুষকে জিজ্ঞেস করবে। এজেন্ট একই ব্যর্থ কমান্ড পঞ্চমবার চালালে কী করা হবে। ওপরের same_command_failed লাইনটা ঠিক এই শেষ পরিস্থিতির জন্যই।

টুল ​

এজেন্ট যা কিছু ছোঁয়, টুল দিয়েই ছোঁয়। কোডিং এজেন্টের বেলায় এর মানে ফাইল পড়া ও এডিট করা, কমান্ড চালানো, রিপোতে সার্চ করা। সাপোর্ট এজেন্টের বেলায় টিকিট সিস্টেম আর নলেজ বেস।

টুলের ডিজাইন যতটা ভাবা হয়, তার চেয়ে অনেক বেশি গুরুত্বপূর্ণ। যে টুল ১০,০০০ লাইনের লগ ঢেলে দেয়, সেটি কনটেক্সট ভাসিয়ে দেয়। যে টুল এররের আশপাশের ২০টি লাইন ফেরত দেয়, সেটি মডেলকে ভাবার সুযোগ দেয়। MCP আসার পর টুল জুড়ে দেওয়া সহজ হয়ে গেছে। তাই এখন আসল কাজ হলো কম টুল বেছে নেওয়া, আর সেগুলো কী ফেরত দেবে তা গুছিয়ে দেওয়া। বাস্তবে কোডিং এজেন্টের বেশিরভাগ কাজ করে একটিই টুল। সেটি নিয়ে নিচে আলাদা একটি সেকশন আছে।

কনটেক্সট ​

সবচেয়ে কম মনোযোগ পাওয়া স্তর এটিই। প্রতিটি লম্বা টাস্ক একসময় কনটেক্সটের সীমায় গিয়ে ঠেকে। সেই মুহূর্তে হারনেস কী করে, তার ওপরই নির্ভর করে এজেন্ট কাজটা শেষ করতে পারবে কি না।

০৮০%উইন্ডোর সীমাটাস্কের শুরুতেঅনেক জায়গা ফাঁকাধাপ ৯৮০% দাগে পৌঁছায়ট্রাঙ্কেটপুরনো আউটপুট ছাঁটাকমপ্যাক্টপুরনো টার্নের সারাংশকোনোটিই নাউইন্ডো ভরা, টাস্ক শেষপ্রম্পট, মেমরি, টাস্কটুল কল ও ফলাফলছাঁটা আউটপুটসারাংশ
প্রতিটি টুল কল একটি করে ব্লক যোগ করে। ৮০% দাগে পৌঁছালে হারনেসকে জায়গা খালি করতে হয়, হয় পুরনো আউটপুট ছেঁটে, নয়তো পুরনো টার্নগুলোকে একটি সারাংশে গুটিয়ে এনে। কোনোটিই না করলে উইন্ডো যেখানে ফুরায়, টাস্কও সেখানে থামে, কাজ শেষ হোক বা না হোক।

আগে যে পেপারের কথা বলেছিলাম, আগস্টের "Same Model, Different Harness", এ বিষয়ে এর চেয়ে পরিষ্কার প্রমাণ আমি দেখিনি। দুই রানেই ছিল একই মডেল ওয়েট, SWE-bench Verified-এর একই ১৬৯টি টাস্ক, একই কনটেক্সট ক্যাপাসিটি আর একই রান প্রোটোকল। নতুন হারনেস শুধু দুটি কাজ অন্যভাবে করেছিল। উইন্ডো ভরতে থাকলে পুরনো টুল রেজাল্টগুলোকে ধাপে ধাপে ছোট করত। আর এজেন্টকে একই ব্যর্থ কমান্ড বারবার চালাতে দেখলে তাকে অন্য কিছু চেষ্টা করতে বলত।

একই মডেল, ১৬৯টি টাস্ক, ২০ হাজার টোকেনের উইন্ডোকন্ট্রোল হারনেস৪৩টি সমাধাননতুন হারনেস৭২টি সমাধানমোট ১৬৯টি টাস্কের অনুপাতে২৬২ হাজার টোকেনের উইন্ডোতে SWE-bench Verified-এ ব্যবধান প্রায় মিলিয়ে গেছে।
হারনেস ছোট কনটেক্সট উইন্ডোটা কীভাবে সামলেছে, পুরো লাভটা এসেছে সেখান থেকেই। মডেলকে জায়গা দিলে এই পলিসিতে আর তেমন কিছু আসে যায় না। প্রোডাকশনে এটি জরুরি হওয়ার কারণও এটিই: সেখানে প্রতিটি টোকেনের জন্য টাকা গুনতে হয়।

সাধারণত যেসব কৌশল কাজে লাগানো হয়:

কৌশলকী করে
কমপ্যাকশনটোকেন বেশি হয়ে গেলে পুরনো টার্নগুলোর সারাংশ বানায়
ট্রাঙ্কেশনপুরনো টুল আউটপুট ছেঁটে ফেলে, সাম্প্রতিকগুলো পুরোটা রাখে
মেমরি ফাইলপ্রতিটি সেশনের শুরুতে লোড হওয়া নোট, যেমন প্রজেক্টের CLAUDE.md বা AGENTS.md
সাব-এজেন্টপাশের কোনো কাজকে আলাদা, নতুন কনটেক্সট দেয় আর ফেরত আনে শুধু উত্তরটা
কনটেক্সট রিসেটউইন্ডো পুরো খালি করে লিখে রাখা একটি হ্যান্ডঅফ ফাইল থেকে নতুন সেশন শুরু করে

শেষ সারিটি বাকিগুলোর চেয়ে নতুন, আর এর পেছনের কারণটা আন্দাজ করা কঠিন। লম্বা সময় ধরে চলা অ্যাপ বানাতে গিয়ে Anthropic-এর টিম দেখেছে, "শুধু কমপ্যাকশন যথেষ্ট ছিল না"। উইন্ডো ভরে আসতে থাকলে মডেলের মধ্যে এমন একটি জিনিস দেখা দিত, যার নাম তারা দিয়েছে কনটেক্সট অ্যাংজাইটি: সীমা এগিয়ে আসছে টের পেয়ে কাজ আগেভাগে গুটিয়ে ফেলা। শুধু সারাংশ দিয়ে চালিয়ে গেলে মডেল ঠিকই টের পায় যে জায়গা ফুরিয়ে আসছে। তার চেয়ে গোছানো একটি হ্যান্ডঅফ লিখে রেখে পুরোপুরি রিসেট করাটা বেশি কাজে দিয়েছে।

গার্ডরেইল ​

যে এজেন্ট কমান্ড চালাতে পারে, সে জিনিসপত্র মুছেও ফেলতে পারে। প্রতিটি হারনেস একটি স্পেকট্রামের কোথাও না কোথাও নিজের জায়গা বেছে নেয়। পাশাপাশি সাজিয়ে দেখার পর বুঝলাম, জায়গাগুলো যতটা ভেবেছিলাম, তার চেয়ে বেশি আলাদা:

  • সবকিছুর আগে জিজ্ঞেস করা। Cline-এর ডিফল্ট এটিই: প্রতিটি অ্যাকশন আপনার অনুমোদনের জন্য অপেক্ষা করে।
  • সিদ্ধান্ত ক্লাসিফায়ারের হাতে। Claude Code-এর auto mode (Pro, Max আর Team প্ল্যানে শুরুর মোড এটিই) আর Cursor-এর Auto-review, দুটিতেই প্রতিবার আপনাকে জিজ্ঞেস না করে দ্বিতীয় একটি মডেল অ্যাকশনগুলো রিভিউ করে।
  • চারপাশে দেয়াল তোলা। Codex CLI ডিফল্টভাবে OS-লেভেলের স্যান্ডবক্সে চলে, শুধু ওয়ার্কস্পেসের ভেতরে, নেটওয়ার্ক বন্ধ রেখে।
  • ব্যবহারকারীর ওপর ভরসা। Pi-তে কোনো স্যান্ডবক্স নেই, পারমিশন প্রম্পটও নেই। যিনি এটি বানিয়েছেন, তিনি একে বলেন "পুরোদস্তুর YOLO মোড", আর কনটেইনারের ভেতরে চালানোর পরামর্শ দেন।

এগুলোর কোনোটিই ভুল নয়। কোনটি ঠিক, তা নির্ভর করে একটি ভুলের দাম কত হতে পারে তার ওপর। আর সেই প্রশ্ন টুল নিয়ে নয়, আপনার মেশিন আর আপনার ডেটা নিয়ে।

যাচাই ​

এই স্তরটা থাকলে এজেন্টের লেখা প্রতিটি লাইন না পড়েও তার ওপর ভরসা করা যায়। Böckeler এটিকে দুই ধরনের নিয়ন্ত্রণে ভাগ করেছেন। গাইড কাজের আগে এজেন্টকে পথ দেখায়: নির্দেশনা, কনভেনশন, উদাহরণ। সেন্সর কাজের পরে ফলাফলের দিকে নজর রাখে আর এজেন্টকে নিজের ভুল শোধরাতে সাহায্য করে: টেস্ট, লিন্টার, টাইপ চেকার, রিভিউ এজেন্ট। সিউডোকোডে project_memory() একটি গাইড, আর verify() একটি সেন্সর।

এই পথের একেবারে শেষ মাথায় আছে OpenAI-এর পোস্ট "Harness engineering: leveraging Codex in an agent-first world"। তিনজন ইঞ্জিনিয়ার নিয়ে শুরু হওয়া একটি টিম একটি ইন্টারনাল বেটা শিপ করেছে, যাতে হাতে লেখা কোড একটি লাইনও নেই। ততদিনে প্রায় ১,৫০০টি পুল রিকোয়েস্ট মার্জ হয়ে গেছে। অ্যাপ্লিকেশন, টেস্ট, CI কনফিগারেশন আর ডকস, সবই লিখেছে Codex। মানুষেরা বানিয়েছেন হারনেস: চেক, কাঠামো আর ফিডব্যাক লুপ, যা এজেন্টকে ঠিক পথে রেখেছে।

মুশকিল হলো, নিজের কাজের বিচারক হিসেবে এজেন্ট একেবারেই ভালো নয়। Anthropic-এর ওই পোস্টেই কথাটা সোজাসুজি বলা আছে: নিজেদের বানানো জিনিস মূল্যায়ন করতে বললে এজেন্টরা "আত্মবিশ্বাসের সঙ্গে কাজটার প্রশংসা করতে থাকে", অথচ একজন মানুষ দেখেই বুঝতে পারেন কাজটা মাঝারি মানের। তাদের সমাধান ছিল কাজটা তিনটি এজেন্টের মধ্যে ভাগ করে দেওয়া। একটি এজেন্ট প্ল্যানার হিসেবে স্পেক লেখে, আরেকটি জেনারেটর হিসেবে অ্যাপ বানায়, আর আলাদা একটি ইভ্যালুয়েটর Playwright দিয়ে চলমান অ্যাপটা টেস্ট করে। টেস্টের মানদণ্ড ঠিক করা থাকে কোড লেখা শুরুর আগেই। একা একটি এজেন্টের লেগেছিল ২০ মিনিট আর ৯ ডলার। পুরো হারনেসে লেগেছিল ছয় ঘণ্টা আর ২০০ ডলার, কিন্তু ফলাফল হয়েছিল অনেক ভালো। যাচাই নিজে নিজে হয় না। কাউকে সেটি হারনেসের ভেতরে বানিয়ে দিতে হয়, কখনো কখনো আস্ত একটি দ্বিতীয় এজেন্ট হিসেবে, যার একমাত্র কাজ খুঁত ধরা।

এক্সটেনসিবিলিটি ​

ভালো হারনেসের আচরণ বদলাতে সেটি ফর্ক করতে হয় না। Claude Code-এ ৩০টির বেশি লাইফসাইকেল হুক ইভেন্ট আছে, যেগুলোতে স্ক্রিপ্ট জুড়ে দেওয়া যায়। সঙ্গে আছে স্কিল, প্লাগইন, সাব-এজেন্ট আর MCP সার্ভার। টিমের নিজস্ব কনভেনশনগুলো বসে এখানেই।

প্রথম দিনেই যোগ করার মতো একটি সত্যিকারের হুক দেখুন। প্রতিটি ফাইল এডিটের পর এটি বদলে যাওয়া ফাইলটার ওপর ফরম্যাটার চালায়:

json
{
  "hooks": {
    "PostToolUse": [
      {
        "matcher": "Edit|Write",
        "hooks": [
          {
            "type": "command",
            "command": "jq -r '.tool_input.file_path' | xargs npx prettier --write"
          }
        ]
      }
    ]
  }
}

কমান্ডটা খেয়াল করুন। হারনেস ইভেন্টটা JSON আকারে স্ট্যান্ডার্ড ইনপুটে পাঠায়, jq সেখান থেকে একটি ফিল্ড বের করে আনে, আর xargs সেটি আরেকটি প্রোগ্রামের হাতে তুলে দেয়। এটি একটি ইউনিক্স পাইপলাইন, আর এটি কাকতালীয় নয়।

কাজের বড় অংশটা কেন শেল করে ​

আমার প্রথম চাকরি ছিল লিনাক্স সার্ভার অ্যাডমিনিস্ট্রেশনের। তখন আমাকে সবচেয়ে বেশি টানত একটি ব্যাপার: এক লাইনে কত কিছু করে ফেলা যায়। কয়েকটি ছোট প্রোগ্রাম পরপর জুড়ে দিলেই যে কাজ শুনে মনে হয় পুরো বিকেল লাগবে, টাইপ করা শেষ হওয়ার আগেই সেটি শেষ। এরকম একটি লাইন দেখেই শেলের প্রেমে পড়েছিলাম:

bash
grep "Failed password" /var/log/auth.log | awk '{print $(NF-3)}' | sort | uniq -c | sort -rn | head

এটি সার্ভারে SSH ব্রুট-ফোর্সের চেষ্টা করা প্রতিটি IP অ্যাড্রেস বের করে, কে কতবার চেষ্টা করেছে গুনে, বেশি থেকে কম ক্রমে সাজিয়ে দেয়। পাঁচটি প্রোগ্রাম মিলে কাজটা করে, অথচ কেউ কারও সম্পর্কে কিছুই জানে না। কোডিং এজেন্টকে কাজ করতে দেখলে আমার ঠিক সেই অনুভূতিটাই হয়। সে একই ধরনের টুল হাতে নেয়, আর ক্রমটাও মোটামুটি আমার মতোই:

bash
$ rg -n "InvoiceTotal" src/
$ sed -n '118,160p' src/billing/invoice.ts
$ npm test -- invoice
$ git diff --stat

আমার মতে কোডিং এজেন্টের কাজ করার ক্ষমতার বেশিরভাগটা আসলে এখান থেকেই আসে। মডেলকে একটিই টুল দিন, একটি শেল, আর তার সঙ্গে মেশিনের সব প্রোগ্রাম সে পেয়ে যায়। কাউকে search_code বা run_tests নামে টুল বানাতে হয়নি। rg আর npm test আগে থেকেই ছিল, পেছনে কয়েক দশকের ডকুমেন্টেশন নিয়ে।

মডেলকমান্ডআউটপুট, এক্সিট কোডbashএকটিই টুলrg, grepকোড খোঁজাfind, lsকী আছে দেখাcat, sedফাইলের একটি অংশ পড়াgitহিস্ট্রি, ডিফ, আনডুnpm test, pytestকাজ যাচাইcurlAPI-র সঙ্গে কথাdocker, kubectlসার্ভিস চালানোpsql, jqডেটা কোয়েরি
টুল একটিই, আর তার সঙ্গে চলে আসে মেশিনের প্রতিটি প্রোগ্রাম। আলোর বিন্দুটা ওপরের চারটি কমান্ড একই ক্রমে আবার চালিয়ে দেখায়। প্রতিবার ফেরত আসে সাধারণ টেক্সট আর একটি এক্সিট কোড। মডেল সেটি সরাসরি পড়তে পারে, মাঝখানে কোনো অ্যাডাপ্টার লাগে না।

আমার মনে হয়, চারটি কারণে শেল একটি ল্যাঙ্গুয়েজ মডেলের সঙ্গে এত ভালো মানিয়ে যায়।

প্রথমত, শেলের ভাষা টেক্সট। Doug McIlroy ১৯৭৮ সালে Bell System Technical Journal-এ নিয়মটা লিখে রেখে গেছেন: "ধরে নিন, প্রতিটি প্রোগ্রামের আউটপুট অন্য কোনো প্রোগ্রামের ইনপুট হবে, যে প্রোগ্রামের কথা এখনো কেউ জানে না।" Bell Labs-এ তখন কেউ ল্যাঙ্গুয়েজ মডেলের কথা ভাবছিলেন না। তবু আপনার আউটপুট পড়ছে একটি অজানা প্রোগ্রাম, ল্যাঙ্গুয়েজ মডেলের বর্ণনা হিসেবে এটি মন্দ নয়।

দ্বিতীয়ত, মডেলগুলো শেল আগে থেকেই চেনে। পঞ্চাশ বছরের man পেজ, শেল স্ক্রিপ্ট, README আর ফোরামের উত্তর ট্রেনিং ডেটায় আছে। Pi কেন মাত্র চারটি টুল (read, write, edit আর bash) নিয়ে আসে, সেটি বোঝাতে গিয়ে Zechner সোজাসাপ্টা বলেছেন: "মডেলরা bash চালাতে জানে।"

তৃতীয়ত, প্রতিটি কমান্ড ফলাফল জানিয়ে দেয়। এক্সিট কোড 0 নাকি 0 নয়, এটুকুই বিনা খরচের একটি সেন্সর। কেউ আলাদা করে যাচাইয়ের স্তর না লিখলেও এজেন্ট জানে টেস্ট পাস করল কি না।

চতুর্থত, প্রোগ্রামগুলো একটির সঙ্গে আরেকটি জোড়া লাগে। একটি পাইপ দুটি ছোট টুলকে তখনই তৃতীয় একটি টুল বানিয়ে ফেলে, তাই প্রতিটি কাজের জন্য হারনেসের আলাদা টুল লাগে না।

ইউনিক্সের আরেকটি অংশ এখানে চুপচাপ কাজ করে যাচ্ছে: ফাইলসিস্টেম। হারনেসের গঠন নিয়ে LangChain-এর লেখায় একে বলা হয়েছে "সম্ভবত হারনেসের সবচেয়ে মৌলিক প্রিমিটিভ"। কনটেক্সট শেষ হওয়ার সঙ্গে সঙ্গে মডেল সবকিছু ভুলে যায়। ফাইল ভোলে না। একটি প্রোগ্রেস নোট, একটি ফিচার লিস্ট, একটি git লগ: লম্বা টাস্ক এভাবেই এক সেশন থেকে পরের সেশনে টিকে থাকে। কাজটা করছে ফাইল আর git, পঞ্চাশ বছর ধরে ঠিক যে কাজ তারা করে আসছে।

ভেন্ডররাও উল্টো দিক থেকে এসে একই সিদ্ধান্তে পৌঁছেছে। Anthropic তাদের Claude Agent SDK-এর পেছনের ডিজাইন নীতি বলেছে এভাবে: "আপনার এজেন্টদের একটি কম্পিউটার দেওয়া, যাতে তারা মানুষের মতো কাজ করতে পারে"। Claude Code যিনি বানিয়েছেন, সেই Boris Cherny বলেছেন, শুরুর দিকের ভার্সনগুলোতে লোকাল ভেক্টর ডেটাবেসসহ RAG ব্যবহার হতো। পরে টিম সাধারণ এজেন্টিক সার্চে চলে যায় (মডেল নিজেই grep আর এ ধরনের টুল চালায়), কারণ সেটি ভালো কাজ করছিল। তাঁর নিজের কথাতেই, সিদ্ধান্তটা কোনো বেঞ্চমার্ক থেকে আসেনি, এসেছিল মূলত টিমের ভেতরের অনুভূতি থেকে। তবে শিপ করা হয়েছে এটিই। Vercel তাদের একটি ইন্টারনাল ডেটা এজেন্টকে ছেঁটে প্রায় একটিমাত্র bash টুলে নামিয়ে এনেছিল, আর জানিয়েছিল সেটি ৩৭% কম টোকেনে ৩.৫ গুণ দ্রুত চলছে। সংখ্যাটা মাত্র পাঁচটি টেস্ট কোয়েরি থেকে, তাই একে পাকা পরিমাপ নয়, একটি ইঙ্গিত হিসেবে দেখুন।

তবে শেলের সীমাবদ্ধতাও আছে, আর সেগুলো জেনে রাখা ভালো। শেল দিয়ে ওয়েব অ্যাপে ক্লিক করে ঘোরা যায় না, তাই GUI-র কাজে এখনো ব্রাউজার বা computer-use টুল লাগে। যে SaaS প্রোডাক্টের CLI নেই, তার সঙ্গে কাজ করতে হয় API বা MCP সার্ভার দিয়ে। আর যে শেল npm test চালায়, সেই একই শেল rm -rf-ও চালাতে পারে। গার্ডরেইলের সেকশনটা আদৌ আছে এ কারণেই।

কোডিং এজেন্টের তুলনা ​

যে হারনেসগুলো নিয়ে আমাকে সবচেয়ে বেশি প্রশ্ন করা হয়, সেপ্টেম্বর ২০২৬-এ সেগুলোর অবস্থা নিচে দিলাম। ডিফল্টগুলো দ্রুত বদলায়, তাই কোনো ঘরের তথ্যের ওপর ভরসা করার আগে ডকস দেখে নিন।

এজেন্টওপেন সোর্সমডেলডিফল্ট সুরক্ষাবিল্ট-ইন টুল
Claude Codeনাশুধু ClaudePro, Max ও Team-এ ক্লাসিফায়ার, নইলে জিজ্ঞেস করে৪০+, মূল টুল Read, Edit, Grep, Glob, Bash
Codex CLIApache 2.0ডিফল্টে OpenAI, কনফিগ দিয়ে অন্যগুলোওOS স্যান্ডবক্স, শুধু ওয়ার্কস্পেস, নেটওয়ার্ক বন্ধমূলত শেল, সঙ্গে apply_patch
Gemini CLIApache 2.0শুধু Geminiস্যান্ডবক্স নেই, শেল কমান্ড আর ফাইল লেখার আগে অনুমতি চায়প্রায় ২০টি, তার মধ্যে শেল আর grep
Cursorনাঅনেক প্রোভাইডারশেল চলে স্যান্ডবক্সে, বাকিটা দেখে ক্লাসিফায়ারসার্চ, রিড, এডিট, শেল, ব্রাউজার
OpenHandsMITLiteLLM দিয়ে প্রায় যেকোনোওয়েব অ্যাপে Docker স্যান্ডবক্স, CLI-তে আগে জিজ্ঞেস করেটার্মিনাল, ফাইল এডিটর, টাস্ক ট্র্যাকার
AiderApache 2.0প্রায় যেকোনো, লোকাল মডেলওস্যান্ডবক্স নেই, প্রতিটি এডিট git-এ কমিট করে, কমান্ডের আগে জিজ্ঞেস করেটুল লুপ নেই: এডিট ফরম্যাট আর রিপো ম্যাপ
ClineApache 2.0অনেক, লোকাল মডেলওপ্রতিটি অ্যাকশনের আগে জিজ্ঞেস করে৭টি, সার্চের জন্য ripgrep
PiMIT১৫+ প্রোভাইডারস্যান্ডবক্স নেই, অনুমতিও চায় না৪টি: read, write, edit, bash

শেষ কলামটা ওপর থেকে নিচে পড়ুন। যে হারনেসগুলো শেলের ওপর সবচেয়ে বেশি নির্ভর করে, সেগুলোতে টুলের সংখ্যা সবচেয়ে কম। আর বড় তিনটির মধ্যে সবচেয়ে শেলনির্ভর Codex, স্যান্ডবক্সের ব্যাপারেও সবচেয়ে কড়া। দুটি জিনিস ইচ্ছে করেই একসঙ্গে রাখা হয়েছে। দলছুট শুধু Aider: টুল কলিং আসার আগে থেকেই এটি আছে, আর এখনো এডিট ফরম্যাট আর রিপোর একটি ম্যাপ দিয়ে কাজ করে। এটি মনে করিয়ে দেয়, আমার সিউডোকোডের লুপটা অনেকগুলো ডিজাইনের মধ্যে একটি মাত্র।

কোডের বাইরে ​

প্রথম ডায়াগ্রামের কোনো কিছুই শুধু সফটওয়্যারের জন্য নয়। Microsoft Agent Framework এপ্রিল ২০২৬-এ 1.0-তে পৌঁছেছে, আর জুনে Build-এ এটির সঙ্গে এসেছে একটি বিল্ট-ইন হারনেস: শেল আর ফাইল অ্যাক্সেস, টুল অনুমোদন, ফাইলভিত্তিক মেমরি আর স্বয়ংক্রিয় কনটেক্সট কমপ্যাকশন। LangChain Deep Agents আর OpenAI Agents SDK-তেও একই ধরনের অংশ আছে।

কোড ছেড়ে বেরোলে মূলত একটিই সারি বদলায়:

কোডিং এজেন্টসাধারণ এজেন্ট
লুপএকইএকই
টুলশেল, git, ফাইলAPI, ব্রাউজার, ইমেইল, CRM
কনটেক্সটরিপো, ডিফডকুমেন্ট, টিকিট, চ্যাট হিস্ট্রি
গার্ডরেইলস্যান্ডবক্সপাঠানো, পেমেন্ট আর ডিলিটে অনুমোদন
যাচাইটেস্ট, আগে থেকেই আছেইভ্যাল, রুব্রিক, মানুষের রিভিউ

রিসার্চ এজেন্টের কোনো টেস্ট স্যুট নেই। সাপোর্ট এজেন্ট একটি উত্তরের ওপর npm test চালাতে পারে না। যে এক্সিট কোডের কারণে কোডিং এজেন্টকে যাচাই করা এত সহজ, সেটি এখানে নেই। তাই সাধারণ হারনেসকে নিজের সেন্সর নিজেকেই বানাতে হয়: অতীতের সত্যিকারের কেস থেকে বানানো ইভ্যালুয়েশন সেট, রুব্রিক ধরে রিভিউ করা এজেন্ট, আর কিছু ধাপ যেখানে একজন মানুষ অনুমোদন দেন। কোডের বাইরে এজেন্ট বানালে আপনার সময়টা এখানেই দেওয়া উচিত। এসব এজেন্ট ব্যর্থ হয় ঠিক এখানেই, আর সাধারণত ব্যর্থ হয় চুপচাপ। প্রোডাকশনে এই নীরব ব্যর্থতাগুলো দেখতে কেমন, তা নিয়ে আমার আলাদা একটি লেখা আছে।

হারনেস কীভাবে বিচার করবেন ​

তৈরি একটি বেছে নিন বা নিজেই বানান, মাপবেন শুধু মডেল নয়, পুরো স্ট্যাক:

  1. প্রতিটি শেষ হওয়া টাস্কের খরচ, প্রতি টোকেনের খরচ নয়।
  2. পাবলিক লিডারবোর্ডে নয়, আপনার নিজের টাস্কে সাফল্যের হার।
  3. লম্বা টাস্ক: শেষ করতে পারে, নাকি মাঝপথে আটকে যায়?
  4. সেফটি মডেল: কী ভাঙতে পারে, আর অনুমোদন দেয় কে?
  5. মানানসই কি না: আপনার টুল আর কনভেনশনের সঙ্গে চলে কি?

খরচটাকেই লোকে সবচেয়ে কম করে ধরে। Artificial Analysis মে ২০২৬-এ যখন তাদের Coding Agent Index চালু করে, তখন তাদের পরীক্ষা করা মডেল আর হারনেসের জোড়াগুলোতে প্রতি টাস্কের খরচ ছিল ০.০৭ ডলার থেকে ২.২৬ ডলার পর্যন্ত। এই ফারাকের বেশিরভাগটা মডেলের কারণে। তবে পথে মডেল কত টোকেন খরচ করবে, সেটি ঠিক করে দেয় হারনেস।

এজেন্ট যে মেশিনে চলে, সেটিও সংখ্যা বদলে দেয়। Anthropic-এর ইঞ্জিনিয়ারিং টিম একই Claude মডেলকে একই হারনেসে, Terminal-Bench 2.0-এর একই টাস্কে চালিয়েছিল। সবচেয়ে কম আর সবচেয়ে বেশি কনটেইনার রিসোর্সের মধ্যে ফলাফলে ফারাক দাঁড়িয়েছিল ৬ পার্সেন্টেজ পয়েন্ট। তাই তুলনাটা চালান সেই ইনফ্রাস্ট্রাকচারে, যেটি আপনি সত্যিই ব্যবহার করবেন।

সামনে কী আসছে ​

হারনেসের ওপরে আরেকটি স্তর দেখা দিতে শুরু করেছে। জুন ২০২৬-এ Databricks ওপেন সোর্স করেছে Omnigent, যাকে তারা বলছে "মেটা-হারনেস"। এটি Claude Code, Codex, Pi বা আপনার নিজের এজেন্টের ওপরে বসে, আর এক জায়গা থেকে সেগুলোকে মিলিয়ে চালানো ও নিয়ন্ত্রণ করার সুযোগ দেয়। ধারণাটা টিকে গেলে হারনেস হয়ে যাবে বদলে ফেলা যায় এমন একটি কম্পোনেন্ট, যেমন একটি ডেটাবেস সরিয়ে আরেকটি বসানো যায়।

আজকের হারনেসের কিছু অংশ মডেলের ভেতরেও ঢুকে যাবে। এ নিয়ে আমার পড়া সবচেয়ে ভালো লাইনটা Anthropic-এর ওই পোস্টেরই: "হারনেসের প্রতিটি কম্পোনেন্টের ভেতরে একটি অনুমান লুকিয়ে থাকে, মডেল নিজে থেকে কী পারে না সে বিষয়ে।" আমার সিউডোকোডের same_command_failed চেক ধরে নেয়, মডেল টের পাবে না যে সে একই জায়গায় ঘুরপাক খাচ্ছে। কমপ্যাকশন ধরে নেয়, লম্বা একটি টাস্ক সে এক উইন্ডোতে ধরে রাখতে পারবে না। মডেল যত ভালো হবে, এর কিছু অনুমান আর খাটবে না, আর সেগুলোর ওপর দাঁড় করানো অংশগুলোও বাদ দেওয়া যাবে।

যে অংশটা সরবে বলে আমার মনে হয় না, সেটি পারমিশনের সীমানা। মডেল নিজের ভুল ধরতে শিখতে পারে। কিন্তু আপনার প্রোডাকশন সার্ভারে সে কী মুছতে পারবে, সেই সিদ্ধান্ত আপনারই থাকবে, লেখা থাকবে হারনেসে, ঠিক যেমন এসবের অনেক আগে লেখা থাকত sudoers ফাইলে।

নিজের টিমের জন্য হারনেসটা কেমন হওয়া উচিত, তা নিয়ে ভাবছেন? যোগাযোগ পাতায় আমার ক্যালেন্ডার আছে।

সূত্র ​