# LibreChat-কে Tokens-এর সাথে যুক্ত করুন

> LibreChat-এ Tokens যোগ করুন librechat.yaml-এর custom endpoint হিসেবে: base URL, .env থেকে key, model list, সস্তা title model, Docker mount আর error সমাধান।

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](/docs/api-keys) পেজে।
- এমন LibreChat install, যেখানে `librechat.yaml` আর `.env` edit করা যায়, এবং restart করা যায়।
- [model catalog](/models) থেকে একটা 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-টা যোগ করুন:

```bash title=".env"
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 যোগ করুন:

```yaml title="librechat.yaml"
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` থেকে পড়ে। LibreChat `user_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 করুন:

```bash
docker compose down && docker compose up -d
```

Docker ছাড়া 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-গুলো চান সেগুলো লিখুন:

```yaml
      models:
        default: ['deepseek/deepseek-v4.1-flash', 'provider/another-model']
        fetch: false
```

`provider/another-model`-এর জায়গায় catalog থেকে একটা আসল id বসান।

Model id-র slash নিয়ে LibreChat-এর documentation-এ বিশেষ কিছু বলা নেই। তাদের নিজের OpenRouter উদাহরণে id দেখতে `meta-llama/llama-3-70b-instruct`-এর মতো, আর সেগুলো `default` ও `titleModel`-এ সাধারণ string হিসেবেই বসানো। এখানেও একই নিয়ম: পুরো Tokens id লিখুন, `provider/model`।

## ঠিকমতো চলছে কিনা যাচাই করুন

1. Endpoint selector-এ **Tokens** বেছে একটা model নিন।
2. "Reply with OK" পাঠান। Response stream হয়ে আসবে, আর request-টা আপনার Tokens [usage](/dashboard/usage)-এ দেখা যাবে।

LibreChat-এর বাইরে key পরীক্ষা করতে:

```bash
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](/docs/streaming))। LibreChat-এর custom-endpoint পেজে agent বা tool calling নিয়ে কিছু নেই, তাই custom endpoint-এ LibreChat কীভাবে tool ব্যবহার করে তা এই গাইডে বলা হয়নি। যে feature tool definition পাঠায় সেটা ব্যবহার করলে model-কে tool calling support করতে হবে। দেখুন [Tool calling](/docs/tool-calling) আর [Choosing a model](/docs/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 404 `model_not_found` দিয়ে fail করে।

`titleModel`-এ দিন একটা ছোট, দ্রুত Tokens model, user যে model-এ chat করছে সেটা নয়:

```yaml
      titleConvo: true
      titleModel: 'provider/cheap-model-id'
```

[catalog](/models) থেকে একটা সস্তা 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`:

```yaml title="librechat.yaml (second entry under endpoints.custom)"
    - 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](/docs/authentication)), আর format আছে [Messages](/docs/messages)-এ। বেশির ভাগ মানুষের শুধু প্রথম entry-টাই লাগে।

## Shared server-এ চালানো

`.env`-এ একটাই key রাখলে এক LibreChat instance-এর সব user একটাই Tokens account-এর খরচ করে, আর তার rate ও concurrency limit ভাগ করে নেয় ([Rate limits](/docs/rate-limits))। শুধু এই instance-এর জন্য একটা key বানান, monthly spend cap আর allowed-models list সহ ([API keys](/docs/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](/docs/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](/dashboard/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](/docs/errors)-এ, আর আরও সমাধান [Troubleshooting](/docs/troubleshooting)-এ।

সূত্র: LibreChat documentation, [Custom Endpoints quick start](https://www.librechat.ai/docs/quick_start/custom_endpoints), [librechat.yaml](https://www.librechat.ai/docs/configuration/librechat_yaml) আর [custom endpoint object reference](https://www.librechat.ai/docs/configuration/librechat_yaml/object_structure/custom_endpoint), সাথে LibreChat repository-র `librechat.example.yaml`, 11 অক্টোবর 2026-এ দেখা।

---
Page: https://tokens.bd/bn/docs/librechat
