BxGPT প্রোগ্রামিং (ডিবাগিং, ব্যাখ্যা, রিফ্যাক্টরিং, আর্কিটেকচার) ও সাধারণ প্রশ্নের জন্য একটি চ্যাট সহকারী। একটি Next.js অ্যাপ একই সার্ভারে Ollama-তে চলা ওপেন-ওয়েট মডেল (Qwen2.5-Coder 7B) থেকে টোকেন ধরে ধরে উত্তর স্ট্রিম করে। কোনো অ্যাকাউন্ট লাগে না, কথোপকথনের ইতিহাস ভিজিটরের ব্রাউজারেই থাকে এবং মডেল API কখনো ইন্টারনেটে উন্মুক্ত হয় না।
সমস্যা
হোস্টেড AI সহকারীরা প্রতিটি কথোপকথন তৃতীয় পক্ষের কাছে পাঠায়, আর সেলফ-হোস্টিং সাধারণত GPU ধরে নেয়। লক্ষ্য ছিল GPU ছাড়া একটি ৮ GB, ৪ vCPU-র শেয়ার্ড VPS-এ একটি ব্যক্তিগত, সবার জন্য খোলা সহকারী চালানো, যা লোডের মধ্যেও সাড়া দেয় এবং ব্যর্থ হলেও সুন্দরভাবে সামলায়।
পদ্ধতি
Nginx TLS সামলে লুপব্যাকে একটি স্ট্যান্ডঅ্যালোন Next.js সার্ভারে প্রক্সি করে, যা লুপব্যাকেই Ollama-র সঙ্গে কথা বলে। প্রতিটি চ্যাট রিকোয়েস্ট অরিজিন চেক, Zod স্কিমা, মডেল অ্যালাউ-লিস্ট ও প্রতি-IP রেট লিমিট পার হয়ে একমাত্র ইনফারেন্স স্লটের জন্য একটি সীমিত কিউতে অপেক্ষা করে। ইতিহাস কনটেক্সট উইন্ডোতে মানানসই করে ছাঁটা হয়, টোকেন NDJSON হিসেবে স্ট্রিম হয় এবং ক্লায়েন্ট সংযোগ বিচ্ছিন্ন করলে আপস্ট্রিমে জেনারেশন থেমে যায়। মডেল RAM-এ লোড থাকে, রিস্টার্টের পর ওয়ার্ম-আপ ইউনিট আবার লোড করে এবং systemd মেমরি ও CPU সীমিত রাখে যাতে একই সার্ভারের অন্য সাইটগুলো চলতে থাকে।
- অপেক্ষমাণ, মডেল লোড ও চিন্তার ধাপসহ টোকেন ধরে ধরে স্ট্রিমিং
- GFM টেবিল, সিনট্যাক্স-হাইলাইটেড কোড ও কপি বাটনসহ Markdown
- থামানো (বাটন বা Esc), পুনরায় তৈরি ও বিঘ্নিত উত্তরের পর আবার চেষ্টা
- লোকাল কথোপকথন ইতিহাস: নাম বদল, ফিল্টার, মুছে ফেলা ও Markdown হিসেবে এক্সপোর্ট
- থিম, মডেল, টেম্পারেচার, উত্তরের দৈর্ঘ্য ও কাস্টম নির্দেশনার সেটিংস, সার্ভারে প্রয়োগ করা
- Ollama থেকে প্রতিটি উত্তরের পরিসংখ্যান (টোকেন, টোকেন/সেকেন্ড, সময়) ও লাইভ মডেল স্ট্যাটাস
- চালু প্রম্পট বক্স, লাইভ স্ট্যাটাস ও সার্ভার কনফিগ থেকে পড়া স্পেক শিটসহ ল্যান্ডিং পেজ
- ৩২০ px থেকে রেসপনসিভ, কিবোর্ডে ব্যবহারযোগ্য এবং দুই থিমেই axe দিয়ে যাচাই করা
app/ landing, /chat, /privacy, /terms, API, sitemap, OG image
api/chat|health|models route handlers (logic lives in lib/server)
components/
chat/ workspace, transcript, composer, sidebar, settings
site/ landing header/footer/prompt/status
lib/
config/server.ts Zod-validated environment
ollama/ HTTP adapter + typed errors
inference/limiter.ts concurrency limiter with bounded queue
security/ rate limiter, client key, origin check
chat/ system prompt, context-window fitting
server/ chat handler, health, model catalog
client/ browser storage, stream reader
tests/unit|integration|e2e + Ollama mock
scripts/ deploy, rollback, warm-up, monitor, verifybrowser ──POST /api/chat──▶ Nginx (TLS, coarse rate limit, no buffering)
└▶ Next.js route handler
1. origin check (CSRF) → 403
2. body size + JSON + Zod schema → 400 / 413
3. model allow-list → 400
4. per-IP rate limit + 1 active → 429
5. trim history to num_ctx → 413
6. Ollama up, model installed → 503
7. queue full? → 503
── stream starts (NDJSON) ──
8. wait for an inference slot
9. relay tokens from Ollama
10. timeouts → error event
11. client disconnect → abort upstream
12. release slot, log metadata (never content)চ্যালেঞ্জ
- • ৭B মডেল (লোড হলে প্রায় ৪.৮ GB), Node.js, Nginx ও অন্য সাইটগুলোকে আউট-অফ-মেমরি কিল ছাড়াই ৮ GB RAM-এ জায়গা দেওয়া।
- • সীমিত কিউ, প্রতি-IP লিমিট এবং প্রথম-টোকেন, নিষ্ক্রিয়তা ও মোট টাইমআউট দিয়ে একটি CPU ইনফারেন্স স্লট সব ভিজিটরের জন্য ন্যায্য রাখা।
- • ব্যর্থ বা বাতিল জেনারেশন পুনরুদ্ধারযোগ্য রাখা: আংশিক লেখা থেকে যায়, উত্তরটি বিঘ্নিত হিসেবে চিহ্নিত হয় এবং আবার চেষ্টার সুযোগ দেওয়া হয়।
যা শিখেছি
- • CPU-তে মেমরি ব্যান্ডউইথই গতি ঠিক করে, তাই সৎ UI অবস্থা (অপেক্ষমাণ, মডেল লোড হচ্ছে) কাঁচা গতির মতোই গুরুত্বপূর্ণ।
- • ওয়ার্ম-আপে চ্যাট রিকোয়েস্টের মতো একই কনটেক্সট সাইজ ব্যবহার করতে হয়, নইলে Ollama মডেল আবার লোড করে এবং ওয়ার্ম-আপ বৃথা যায়।
- • স্টেট ব্রাউজারে রাখলে একটি ডেটাবেস চালানো, সুরক্ষিত রাখা ও ব্যাকআপ নেওয়ার ঝামেলা থাকে না।