Dify একটা open-source platform, যেটা দিয়ে LLM app, chatbot, agent আর workflow বানানো যায়। Dify-তে model provider মানে একেকটা plugin। এর OpenAI-API-compatible provider যেকোনো base URL-এ OpenAI Chat Completions request পাঠাতে পারে, আর Tokens-এর জন্য সেই URL হলো https://tokens.bd/v1। Tokens-এর প্রতিটা model আপনাকে Dify-তে নিজে হাতে, custom model হিসেবে যোগ করতে হবে।
এই গাইড মিলিয়ে দেখা হয়েছে Dify 1.17.1 (প্রকাশ 10 সেপ্টেম্বর 2026) আর OpenAI-API-compatible plugin-এর 0.0.68 version দিয়ে, অক্টোবর 2026-এ। দেখার উৎস ছিল Dify-র documentation আর langgenius/dify-official-plugins repository-তে plugin-এর source। মানে documentation আর source দেখে যাচাই করা হয়েছে, আসল Tokens key দিয়ে শুরু থেকে শেষ পর্যন্ত চালিয়ে দেখা হয়নি।
শুরুর আগে#
- একটা Tokens key। spend cap দিয়ে key বানানোর কথা আছে API keys পেজে।
- model catalog থেকে একটা model ID। এই গাইডে
deepseek/deepseek-v4.1-flashব্যবহার করা হয়েছে। - model-এর catalog পেজ থেকে context window আর সর্বোচ্চ output-এর মান।
GET /v1/modelsএই দুটো দেয় না (Models and usage), অথচ Dify দুটোই চায়। - একটা Dify workspace, যেখানে আপনি owner বা admin। Dify শুধু এই দুই role-কে model provider ম্যানেজ করতে দেয়।
Provider plugin install করুন#
Dify-তে Integrations খুলে Model Provider-এ যান, তারপর Marketplace থেকে OpenAI-API-compatible install করুন। Dify-র documentation অনুযায়ী plugin তিন জায়গা থেকে আনা যায়: Marketplace, public GitHub repository, আর local .zip file upload।
Tokens-এর model যোগ করুন#
OpenAI-API-compatible provider-এর card খুলে Add Model-এ ক্লিক করুন। Dify-র documentation বলছে, কোনো provider-এর তালিকায় নেই এমন model যোগ করার উপায় হলো Add Model। একই নাম আর type-এর model আগে থেকে থাকলে Dify নতুন একটা duplicate বানায় না, বরং নতুন key-টা সেই model-এই জুড়ে দেয়।
এবার form পূরণ করুন। নিচের label-গুলো plugin-এর 0.0.68 source থেকে নেওয়া, আপনার Dify version-এ শব্দ একটু অন্যরকম হতে পারে।
| Field | যা বসাবেন |
|---|---|
| Model Type | LLM |
| Model Name | deepseek/deepseek-v4.1-flash |
| Model display name (optional) | Dify-তে যে নামে দেখতে চান, যেমন DeepSeek V4.1 Flash |
| API Key | আপনার Tokens key |
| API Base URL | https://tokens.bd/v1 |
| model name for API endpoint (optional) | ফাঁকা রাখুন (নিচে দেখুন) |
| Completion mode | Chat |
| Model context size | model-এর catalog পেজে দেওয়া context window |
| Upper bound for max tokens | model-এর catalog পেজে দেওয়া সর্বোচ্চ output |
| Function Call Type | tool support করে এমন model-এ Tool Call (নিচে Tool calling দেখুন) |
| Stream function calling | stream করা tool call চাইলে এবং model support করলে Support |
| Vision Support | শুধু যে model image নেয় তার জন্য Support |
form save করুন। save করার সময় Dify credentials যাচাই করে, আর plugin সেটা করে endpoint-এ ছোট একটা chat request পাঠিয়ে। form save হয়ে গেলে বুঝবেন key, address আর model name ঠিক আছে।
form নিয়ে কয়েকটা কথা:
- API Base URL। plugin-এর placeholder হলো
https://api.openai.com/v1, মানে address শেষ হয়/v1দিয়ে।chat/completionsplugin নিজেই জুড়ে নেয়, আপনি জুড়বেন না। কোনো কোনো third-party গাইডে এই field-কে "API endpoint URL" বলা হয়। - form-এ key দেওয়া optional, কিন্তু Tokens-এ key সবসময় লাগে। না দিলে 401
missing_api_keyপাবেন। - Model context size আর Upper bound for max tokens, দুটোরই default 4096। default রেখে দিলে model যা-ই পারুক, Dify নিজের দিক থেকে লম্বা prompt আর output আটকে দেবে। দুটোই catalog পেজ দেখে বসান।
- Include Usage in Stream plugin-এ default-এ চালু থাকে। চালু রাখুন: এতে Dify stream-এর মধ্যেই token count চায়। Tokens এটা support করে (Streaming)।
- প্রতিটা model আলাদা করে যোগ করুন। plugin endpoint থেকে model-এর তালিকা আনে না। Dify-তে যে যে Tokens model বাছতে চান, প্রত্যেকটার জন্য Add Model আবার করুন।
Slash-ওয়ালা model ID#
Tokens-এর ID দেখতে provider/model-এর মতো। model name-এ slash চলে কিনা, সেটা Dify-র documentation বলে না, আর plugin-এর Model Name placeholder-এ লেখা আছে "Enter full model name"। plugin model name-টা endpoint-এ হুবহু পাঠায়। তবে model name for API endpoint ভরা থাকলে সে তার বদলে ওই মান পাঠায়।
- আগে Model Name-এ পুরো ID দিয়ে চেষ্টা করুন।
- Dify নামটা না নিলে Model Name-এ একটা ছোট নাম দিন, যেমন
tokens-flash, আর model name for API endpoint-এ পুরো Tokens ID বসান। এই দ্বিতীয় field ঠিক এই কাজের জন্যই আছে: Dify যে নাম দেখায় আর endpoint যে নাম চায়, দুটো আলাদা হতে পারে।
যেভাবেই করুন, Tokens-এ যে মান পৌঁছায় সেটা অবশ্যই পুরো ID হতে হবে, নইলে 404 model_not_found আসবে।
ঠিকমতো চলছে কিনা যাচাই করুন#
আগে curl দিয়ে key আর model পরীক্ষা করে নিন।
export TOKENS_API_KEY=tok_live_your_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"}]}'তারপর Dify-তে একটা app বানান, যে model যোগ করেছেন সেটা বেছে নিন, আর preview-তে একটা message পাঠান। Request-টা আপনার Tokens Dashboard-এর usage analytics-এ দেখা যাবে।
Tool calling#
Dify-র Agent node আর agent app tool নিয়ে কাজ করে। Dify দুই ধরনের agent strategy দেয়:
- Function Calling model-এর নিজস্ব tool calling ব্যবহার করে, আর tool-এর বিবরণ পাঠায়
toolsparameter-এ। Dify বলছে, এটা ব্যবহার করলে model যে function calling support করে তা নিশ্চিত করে নিন। - ReAct এর বদলে structured prompt দিয়ে model-কে পথ দেখায়। যে model-এ native tool calling নেই, তার জন্য Dify এটা সুপারিশ করে।
custom model-এর ক্ষেত্রে Dify-কে জানানোর জায়গা হলো Add Model form-এর Function Call Type। এর default Not Support। কোন option কী করে, তা plugin-এর source থেকে জানা যায়।
- Tool Call OpenAI-র
toolsformat-এ পাঠায়। Tokens-এর Tool calling পেজের সাথে এটাই মেলে। - Function Call পাঠায় পুরনো
functionsformat-এ। Tokens-এর documentation-এ এটা নেই, তাই ব্যবহার করবেন না। - Not Support কোনো tool-এর বিবরণই পাঠায় না, তাই ওই model-এ Function Calling strategy চলতেই পারে না।
কোনো model Not Support-এ রেখে Function Calling strategy বাছলে কী হয়, তা Dify-র documentation-এ নেই। তাই পরীক্ষা করে দেখার চেয়ে আগেই ঠিকমতো set করে দিন।
তবু tool calling-এর জন্য model-কেও তা support করতে হবে। model catalog-এ model-এর পেজ দেখুন, আর সাহায্য পাবেন Choosing a model পেজে।
Dify Cloud আর self-hosted#
দুই ক্ষেত্রেই সেটআপ একই। তফাত শুধু এটুকু যে Tokens-এ request কোথা থেকে যায়: Dify Cloud-এ যায় Dify-র server থেকে, self-hosted হলে আপনার নিজের deployment থেকে। Tokens একটা public HTTPS address, তাই self-hosted Dify থেকে সেখানে বাইরে যাওয়ার (outbound) অনুমতি থাকতে হবে। আপনি কোনটা ব্যবহার করছেন, তা Tokens-এর দিকে জানানোর কিছু নেই।
- Dify-র AI credits Dify-র নিজের billing। এটা দিয়ে Tokens-এর model-এর খরচ মেটে না। Tokens-এর usage-এর বিল যায় আপনার Tokens অ্যাকাউন্টে।
- self-hosted Dify-তে Dify-র বাইরে Marketplace খুলে plugin install করলে আগে Install Preference-এর নিচে আপনার deployment-এর URL set করে নিন।
Dify-র documentation থেকে যা নিশ্চিত হওয়া যায়নি: self-hosted plugin daemon-এর network-সংক্রান্ত শর্ত, আর Dify Cloud-এর কোনো plan custom model provider সীমিত করে কিনা। Dify-র self-hosting documentation আর নিজের plan দেখে নিন।
পেছনে কীসে credit খরচ হয়#
Dify যত request কোনো Tokens model-এ পাঠায়, সবকটার খরচ ওই key-তে ধরা হয়।
- workflow-র প্রতিটা LLM node প্রতি run-এ একটা request। কয়েকটা LLM node থাকলে, কিংবা কোনোটা iteration বা loop-এর ভেতরে থাকলে, প্রতি পাকে একটা করে request হয়।
- agent প্রতিটা tool-এর ফল পাওয়ার পর model-কে আবার call করে। Dify-র documentation Max Iterations-কে বর্ণনা করেছে অসীম loop ঠেকানোর একটা নিরাপত্তা-সীমা হিসেবে, আর সহজ কাজে 3 থেকে 5, জটিল research-এ 10 থেকে 15 রাখতে বলেছে। কাজ চলে যায় এমন সবচেয়ে কম মান রাখুন।
- প্রতি রাউন্ডে পুরো কথোপকথন আবার পাঠানো হয়, তাই প্রতি রাউন্ডে input token বাড়তে থাকে।
- আর কোন feature নিজে থেকে model call করে, তা Dify-র documentation-এ তালিকা করা নেই। আপনার app-এর কোন feature model ব্যবহার করে, আর কোন model, তা app আর workspace-এর সেটিংসে দেখে নিন।
Dify-র জন্য আলাদা একটা key নিন, তাতে মাসিক spend cap আর allowed models-এর তালিকা দিন (API keys)। cap-এ পৌঁছে গেলে বিল বাড়তে থাকার বদলে request 403 monthly_spend_cap_exceeded দিয়ে fail করবে।
সীমা আর যা এখানে নেই#
- এই পেজ শুধু LLM model নিয়ে। plugin-এ text embedding, rerank, speech আর text-to-speech type-ও আছে। কিন্তু Tokens-এর embeddings endpoint শুধু embedding model-এর জন্য কাজ করে, আর Tokens-এ কোনো audio endpoint নেই (Models and usage), তাই বাকিগুলো এখানে আলোচনার বাইরে।
- plugin-এ API Type নামে একটা setting আছে, যাতে Responses API-র option আছে। এটা Chat Completions-এই রাখুন। Tokens-এ Responses তখনই চলে যখন upstream সেটা support করে (Responses API)।
- Dify-র built-in model provider, যেমন তার OpenAI provider, এখানে ব্যবহার হয় না।
সমস্যা হলে#
model save করতে গেলে credentials error আসছে। message-এ Tokens-এর পাঠানো status code আর response body থাকে, ওটা পড়ুন। 401 invalid_api_key মানে key ভুল বা revoke করা। 404 মানে API Base URL বা model name ভুল। ওপরের curl test-এর সাথে মিলিয়ে দেখুন।
প্রতিটা request-এ 404। API Base URL ঠিক https://tokens.bd/v1 কিনা দেখুন। /v1 লাগবে, আর /chat/completions জুড়বেন না।
404 model_not_found। Tokens-এ যে model name পৌঁছাচ্ছে সেটা পুরো ID নয়। Model Name আর "model name for API endpoint" GET /v1/models-এর সাথে মিলিয়ে দেখুন।
403 model_not_allowed_on_key। key-র allowed models-এর তালিকায় এই model নেই। তালিকার কোনো model নিন, অথবা অন্য key ব্যবহার করুন।
Agent node model-টা নিচ্ছে না, বা কখনো tool call করছে না। model-এ Function Call Type-কে Tool Call করুন, অথবা agent-কে ReAct strategy-তে নিয়ে যান। তারপরও tool call না হলে model-টা সম্ভবত tool use-এর জন্য ঠিক নয়।
400 invalid_request, আর message-এ user field-এর কথা। plugin-এ User Identity Support নামে একটা setting আছে, যেটা বলে endpoint ঐচ্ছিক top-level user parameter নেয় কিনা। এটা Not Support করে দিলে field-টা আর যাবে না।
লম্বা prompt কেটে যাচ্ছে, বা output আগেই থেমে যাচ্ছে। Model context size আর Upper bound for max tokens দেখুন। দুটোর default 4096।
429 rate_limited, concurrency_limit বা window_exhausted। Retry-After-এ লেখা সেকেন্ড অপেক্ষা করুন, অথবা Rate limits দেখুন। 402 insufficient_credits হলে billing-এ গিয়ে টাকা যোগ করুন।
সব code-এর তালিকা আছে Errors পেজে। support-এ যোগাযোগ করলে একই call curl দিয়ে চালিয়ে তার x-tokens-request-id header সাথে দিন।
সূত্র: Dify Model Providers, Integrations আর self-hosted Integrations পেজ, Agent node, OpenAI-API-compatible plugin-এর source আর README (version 0.0.68) আর Dify plugin SDK-র OpenAI-compatible model class, অক্টোবর 2026-এ দেখা।