LibreChat একটা self-hosted chat application। OpenAI-compatible provider এতে যোগ করতে হয় librechat.yaml নামের file-এ, custom endpoint হিসেবে। base URL https://tokens.bd/v1 দিয়ে একটা custom endpoint বানালে LibreChat Tokens-এ Chat Completions request পাঠায়। Custom endpoint দিয়ে LibreChat Anthropic Messages API-র সাথেও কথা বলতে পারে, সেটা শেষের দিকে আছে।
এই গাইড LibreChat-এর documentation দেখে লেখা, 11 অক্টোবর 2026-এ মিলিয়ে দেখা হয়েছে। তখন সবচেয়ে নতুন release ছিল v0.8.8, আর তার repository-র librechat.example.yaml config version: 1.3.17 ব্যবহার করে। মিলিয়ে দেখা হয়েছে documentation-এর সাথে, কোনো live LibreChat install-এ শুরু থেকে শেষ পর্যন্ত চালিয়ে দেখা হয়নি।
শুরুর আগে#
- একটা Tokens key। Dashboard থেকে বানিয়ে নিন। spend cap আর allowed models-এর কথা আছে API keys পেজে।
- এমন LibreChat install, যেখানে
librechat.yamlআর.envedit করা যায়, এবং restart করা যায়। - model catalog থেকে একটা model id। এই গাইডে
deepseek/deepseek-v4.1-flashব্যবহার করা হয়েছে। Id-র চেহারাprovider/model।
.env-এ key যোগ করুন#
LibreChat-এর documentation বলে, key librechat.yaml-এ না লিখে .env থেকে ${VAR_NAME} দিয়ে ধরতে। LibreChat project-এর root-এ থাকা .env file-এ key-টা যোগ করুন:
TOKENS_API_KEY=tok_live_your_key.env যেন git-এ না যায়। Config-এর প্রতিটা ${...} reference-এর জন্য এখানে একটা মিল থাকা চাই। না থাকলে endpoint তবুও দেখা যায়, কিন্তু message পাঠানোর সময় Missing API Key for <endpoint> error আসে।
librechat.yaml-এ endpoint যোগ করুন#
.env-এর পাশে librechat.yaml বানান (অথবা .env-এ CONFIG_PATH-এ তার পুরো path দিন), তারপর endpoints.custom-এর নিচে Tokens যোগ করুন:
version: 1.3.17
cache: true
endpoints:
custom:
- name: 'Tokens'
apiKey: '${TOKENS_API_KEY}'
baseURL: 'https://tokens.bd/v1'
models:
default: ['deepseek/deepseek-v4.1-flash']
fetch: true
titleConvo: true
titleModel: 'deepseek/deepseek-v4.1-flash'
modelDisplayLabel: 'Tokens'আগে থেকেই librechat.yaml থাকলে শুধু - name: 'Tokens' block-টা বিদ্যমান endpoints.custom list-এর নিচে বসান, আর আপনার নিজের version যেমন আছে তেমনই রাখুন।
LibreChat-এর reference অনুযায়ী প্রতিটা field কী করে:
name: আবশ্যক, আর unique হতে হবে (বড়-ছোট হাতের অক্ষর না দেখে মেলানো হয়)। Endpoint selector-এ এটাই title হয়ে দেখা যায়।apiKeyআরbaseURL: দুটোই আবশ্যক।${TOKENS_API_KEY}মানটা.envথেকে পড়ে। LibreChatuser_provided-ও মানে, তখন প্রতিটা user interface-এ নিজের key টাইপ করে। Key সরাসরি file-এ plain text-এ লেখা সম্ভব, কিন্তু docs তা করতে বারণ করে।models: আবশ্যক।defaultএকটা ফাঁকা-নয় এমন list, আর fetch ব্যর্থ হলে এটাই ভরসা।fetch: trueদিলে LibreChat endpoint-এর কাছ থেকে model list চেয়ে নেয়।titleConvoআরtitleModel: conversation-এর title চালু করে, আর কোন model title লিখবে তা ঠিক করে। নিচে দেখুন, কারণ এর ডিফল্ট Tokens-এর কোনো model নয়।modelDisplayLabel: response-এর পাশে যে নাম দেখা যায়।
name, baseURL, apiKey বা models না থাকলে বা বানান ভুল হলে, অথবা models-এ fetch: true আর default list কোনোটাই না থাকলে, LibreChat entry-টা কোনো শব্দ না করেই বাদ দেয়। File-এর যেকোনো জায়গায় schema error থাকলে server থেমে যায়, আর সব custom endpoint বন্ধ হয়ে যায়। LibreChat না উঠলে docker compose logs api দেখুন।
Docker: file mount করুন#
Mount না করলে Docker container librechat.yaml দেখতেই পায় না। docker-compose.override.yml.example copy করে docker-compose.override.yml বানান, তারপর api service-এর নিচে যে bind mount ./librechat.yaml-কে /app/librechat.yaml-এ map করে, তার comment তুলে দিন। Compose override file-টা আপনা থেকেই docker-compose.yml-এর সাথে merge করে নেয়।
librechat.yaml বা .env যা-ই বদলান, পরে restart করুন:
docker compose down && docker compose up -dDocker ছাড়া local install হলে process বন্ধ করে npm run backend চালান। তারপর LibreChat খুলে endpoint selector-এ Tokens আছে কিনা দেখুন।
Model আর id-র slash#
fetch: true থাকলে দরকারের সময় LibreChat endpoint-এর model list চায়। Tokens GET https://tokens.bd/v1/models-এর উত্তরে শুধু আপনার key যে model-গুলো চালাতে পারে সেগুলো পাঠায়। তাই key-তে allowed-models list থাকলে শুধু সেগুলোই দেখা যায়। LibreChat-এর docs সতর্ক করে, endpoint দেরিতে সাড়া দিলে fetch করার কারণে প্রথমবার ব্যবহার ধীর হতে পারে। default ভরসা হিসেবে থেকেই যায়।
তার বদলে নির্দিষ্ট একটা list বেঁধে দিতে চাইলে fetch: false দিন আর যে id-গুলো চান সেগুলো লিখুন:
models:
default: ['deepseek/deepseek-v4.1-flash', 'provider/another-model']
fetch: falseprovider/another-model-এর জায়গায় catalog থেকে একটা আসল id বসান।
Model id-র slash নিয়ে LibreChat-এর documentation-এ বিশেষ কিছু বলা নেই। তাদের নিজের OpenRouter উদাহরণে id দেখতে meta-llama/llama-3-70b-instruct-এর মতো, আর সেগুলো default ও titleModel-এ সাধারণ string হিসেবেই বসানো। এখানেও একই নিয়ম: পুরো Tokens id লিখুন, provider/model।
ঠিকমতো চলছে কিনা যাচাই করুন#
- Endpoint selector-এ Tokens বেছে একটা model নিন।
- "Reply with OK" পাঠান। Response stream হয়ে আসবে, আর request-টা আপনার Tokens usage-এ দেখা যাবে।
LibreChat-এর বাইরে key পরীক্ষা করতে:
curl -s https://tokens.bd/v1/chat/completions \
-H "Authorization: Bearer $TOKENS_API_KEY" \
-H "Content-Type: application/json" \
-d '{"model": "deepseek/deepseek-v4.1-flash", "max_tokens": 16, "messages": [{"role": "user", "content": "Reply with OK"}]}'Streaming আর tool calling#
Chat response Server-Sent Events হিসেবে stream হয়, Tokens সেটা পাস করে দেয় (Streaming)। LibreChat-এর custom-endpoint পেজে agent বা tool calling নিয়ে কিছু নেই, তাই custom endpoint-এ LibreChat কীভাবে tool ব্যবহার করে তা এই গাইডে বলা হয়নি। যে feature tool definition পাঠায় সেটা ব্যবহার করলে model-কে tool calling support করতে হবে। দেখুন Tool calling আর Choosing a model।
Upstream কোনো request parameter ফিরিয়ে দিলে Tokens 400 invalid_request ফেরত দেয়। তখন LibreChat-এ dropParams আছে, request থেকে একটা ডিফল্ট parameter সরানোর জন্য (যেমন dropParams: ['stop']), আর addParams আছে একটা parameter যোগ বা override করার জন্য। কোন parameter reject হচ্ছে তা আগে দেখে নিন, তারপরই এগুলো ব্যবহার করুন।
Chat title-এ credit খরচ হয়: সস্তা একটা titleModel দিন#
titleConvo true থাকলে LibreChat প্রতিটা conversation-এর নাম দিতে একটা বাড়তি request পাঠায়। LibreChat-এর reference থেকে দুটো সেটিং মনে রাখার:
titleConvo-র ডিফল্টfalse। Title request একদম না চাইলে এটা তেমনই রাখুন।titleModel-এর ডিফল্টgpt-3.5-turbo। ওটা Tokens-এর model নয়, তাইtitleConvo: trueদিয়েtitleModelনা দিলে title request 404model_not_foundদিয়ে fail করে।
titleModel-এ দিন একটা ছোট, দ্রুত Tokens model, user যে model-এ chat করছে সেটা নয়:
titleConvo: true
titleModel: 'provider/cheap-model-id'catalog থেকে একটা সস্তা model বসান। current_model মানটাও চলে, তখন conversation-এর নিজের model-ই ব্যবহার হয়। User বড় model-এ chat করলে সেটাই সবচেয়ে দামি পথ।
ওই model-টা key-র allowed-models list-এ রাখুন। নইলে সাধারণ chat চলবে, কিন্তু title fail করবে 403 model_not_allowed_on_key দিয়ে।
তার বদলে Anthropic Messages API ব্যবহার করুন#
যে model-গুলোতে /v1/messages দিয়ে পৌঁছাতে চান, তার জন্য LibreChat provider: 'anthropic' দিয়ে custom endpoint support করে। তাদের docs বলে, এটা শুধু সেইসব endpoint-এর জন্য, যেগুলো native Anthropic Messages API চালায়। ওপরের entry-র মতো OpenAI-compatible gateway-র জন্য provider বাদ দিতে হয়। Tokens দুটোই serve করে। এই provider-এর baseURL হলো API root, /v1/messages path নয়, তাই সেটা https://tokens.bd:
- name: 'Tokens Messages'
provider: 'anthropic'
apiKey: '${TOKENS_API_KEY}'
baseURL: 'https://tokens.bd'
headers:
anthropic-version: '2023-06-01'
models:
default: ['deepseek/deepseek-v4.1-flash']
fetch: false
titleConvo: true
titleModel: 'provider/cheap-model-id'এই provider-এ models.fetch কাজ করে না, তাই প্রতিটা model models.default-এ লিখতে হবে। anthropic-version header এসেছে LibreChat-এর নিজের Anthropic উদাহরণ থেকে। Tokens key নেয় x-api-key-তে অথবা Bearer token হিসেবে (Authentication), আর format আছে Messages-এ। বেশির ভাগ মানুষের শুধু প্রথম entry-টাই লাগে।
Shared server-এ চালানো#
.env-এ একটাই key রাখলে এক LibreChat instance-এর সব user একটাই Tokens account-এর খরচ করে, আর তার rate ও concurrency limit ভাগ করে নেয় (Rate limits)। শুধু এই instance-এর জন্য একটা key বানান, monthly spend cap আর allowed-models list সহ (API keys), আর list-এ আপনার titleModel-ও রাখুন। আরেকটা উপায় apiKey: 'user_provided': তখন প্রত্যেক user interface-এ নিজের Tokens key দেয়, ফলে প্রত্যেকের usage আর cap আলাদা থাকে। LibreChat সেই key-গুলো encrypt করে রাখে।
যা Tokens দিয়ে যায় না#
Tokens chat serve করে। Image, audio আর file endpoint 404 unsupported_endpoint দেয়, আর embeddings চলে শুধু embedding model-এর জন্য (Models and usage)। LibreChat-এর যে feature-গুলো এসব চায়, সেগুলো অন্য provider-এ রাখুন।
সমস্যা হলে#
Endpoint selector-এ Tokens নেই। LibreChat পরিষ্কার error না দিয়েই entry বাদ দেয়। name, baseURL, apiKey আর models-এ বানান ভুল আছে কিনা, block-টা endpoints.custom-এর নিচে ঠিকমতো indent করা কিনা, অন্য কোনো endpoint-এর একই নাম কিনা, আর Docker librechat.yaml mount করেছে কিনা দেখুন। প্রতিটা পরিবর্তনের পর restart করুন।
LibreChat চালু হচ্ছে না। File-এ schema error থাকলে custom endpoint বন্ধ হয়ে যায় আর server থেমে যায়। docker compose logs api পড়ুন।
Missing API Key for Tokens, বা 401 missing_api_key / invalid_api_key। TOKENS_API_KEY .env-এ নেই, অথবা container restart হয়নি, অথবা key ভুল বা rotate হয়ে গেছে। Rotate করলে পুরনো secret সাথে সাথে বন্ধ হয়ে যায়।
404 model_not_found। Id পুরো Tokens id নয়, অথবা title model এখনও ডিফল্ট gpt-3.5-turbo। Id মিলিয়ে দেখুন GET https://tokens.bd/v1/models দিয়ে।
403 model_not_allowed_on_key। Model-টা, প্রায়ই titleModel, key-র allowed list-এ নেই।
402 insufficient_credits, 403 monthly_spend_cap_exceeded। Credit শেষ, অথবা key তার cap ছুঁয়ে ফেলেছে। দেখুন billing।
429 rate_limited বা concurrency_limit। এক key-তে অনেক user বা অনেক request। Retry-After পর্যন্ত অপেক্ষা করুন। প্রতিটা নতুন chat-এ title-এর জন্য একটা করে বাড়তি request যায়।
প্রতিটা request-এ 404। baseURL হতে হবে https://tokens.bd/v1, /v1 পর্যন্ত, তার পরে কিছু নয়। শুধু directEndpoint: true দিলে অন্য কথা: LibreChat-এর reference বলে তখন baseURL সরাসরি completions-এর পুরো URL হিসেবে ব্যবহার হয়।
সব code-এর তালিকা আছে Errors-এ, আর আরও সমাধান Troubleshooting-এ।
সূত্র: LibreChat documentation, Custom Endpoints quick start, librechat.yaml আর custom endpoint object reference, সাথে LibreChat repository-র librechat.example.yaml, 11 অক্টোবর 2026-এ দেখা।