dsh configuration: API key, model ও endpoint সেটআপ
Linux-এ dsh-এর configuration কোথায় থাকে, DeepSeek API key বা local Ollama endpoint কীভাবে যুক্ত করবেন, এবং প্রতিটি mode-এ আপনার system থেকে ঠিক কী বাইরে যায় তা জানুন।
dsh তার configuration যেখানে সংরক্ষণ করে
dsh (DeepSeek Harness) তার configuration একটি directory-তে সংরক্ষণ করে: $DSH_HOME। এর default হলো ~/.dsh। Web UI-তে আপনি যা সেট করেন, তা সেখানে plain file হিসেবে লেখা হয়। ওই directory অন্য server-এ copy করলে নতুন system-টি আগেরটির মতো আচরণ করবে।
আপনি যে চারটি path ব্যবহার করবেন, সেগুলোতেই সব configuration থাকে।
~/.dsh/settings.yaml-এ হাতে লেখা এবং UI-তে লেখা settings থাকে। এর মধ্যে provider ও model route-ও রয়েছে।~/.dsh/.credentials.yaml-এ secrets থাকে। Settings-এ credential-এর শুধু একটি reference থাকে, তাই key value নিজেই একটি file-এ সংরক্ষিত থাকে।~/.dsh/profiles/-এ named profile থাকে এবং~/.dsh/storages/-এ saved session থাকে।~/.dsh/cordis.patch.ymlআপনার নিজস্ব patch layer। প্রতিটি profile-এর জন্য এটি built-in configuration-এর ওপর প্রয়োগ করা হয়।
DeepSeek 17 August 2026-এ harness-টিকে MIT-licensed developer preview হিসেবে ঘোষণা করে। README-তে বলা হয়েছে, compatibility-breaking change আসবে। এই guide-এর field name ও path August 2026 পর্যন্ত repository documentation-এর সঙ্গে মেলে। কোনো guide থেকে configuration copy করার আগে, এই guide-সহ, ইনস্টল করা version-এর documentation-এর সঙ্গে এগুলো মিলিয়ে নিন। কারণ preview version-গুলোর মধ্যে release পরিবর্তনের সময় নাম বদলাতে পারে।
প্রথম output পাওয়ার ন্যূনতম সৎ পথ
dsh চালাতে 22 line-এর Node.js 22.19 বা পরবর্তী সংস্করণ, অথবা 24 বা তার পরের সংস্করণ প্রয়োজন। Node 23 এই পরিসরের বাইরে। প্রথমে version পরীক্ষা করুন, কারণ version না মিললে startup-এর সময় ব্যর্থতা ঘটে এবং error-টি package নষ্ট হওয়ার মতো মনে হয়।
node -v
npx @deepseek-ai/dsh webnpx npm registry থেকে package download করে http://127.0.0.1:3080-এ Web UI চালু করে। এটি loopback address-এ bind করে। তাই firewall অনুমতি দিলেও অন্য কোনো machine থেকে port-এ পৌঁছানো যায় না। VPS-এ 3080 Internet-এর জন্য খুলে দেওয়ার বদলে SSH দিয়ে forward করুন।
ssh -N -L 3080:127.0.0.1:3080 you@your-serverআপনার laptop-এ http://127.0.0.1:3080 খুলুন। এরপর Settings এবং Models-এ যান। DeepSeek card-এ একটি API key field আছে। platform.deepseek.com থেকে key paste করে save করুন। কোনো restart ছাড়াই model route সঙ্গে সঙ্গে ব্যবহারযোগ্য হয়ে যায়। কারণ চলমান server credential সংরক্ষণ করে এবং reference-টি runtime-এ resolve করে। remote server-এ dsh Web UI-তে পৌঁছানো-এ tunnel এবং reverse proxy ব্যবহারের বিষয়টি ব্যাখ্যা করা হয়েছে। VPS-এ DeepSeek Harness install করা-এ এই guide-এ ধরা server preparation ব্যাখ্যা করা হয়েছে।
save করার পরে app কী তৈরি করেছে তা দেখুন।
ls -la ~/.dsh
stat -c '%a %n' ~/.dsh/.credentials.yamlআপনার settings.yaml, .credentials.yaml এবং profiles/ দেখা উচিত। stat যদি 600 ছাড়া অন্য কোনো mode দেখায়, তাহলে chmod 600 ~/.dsh/.credentials.yaml চালান। group-readable বা world-readable credentials file থাকলে server-এর অন্য সব account আপনার key পেয়ে যেতে পারে।
browser ছাড়া প্রথমবার চালানোর জন্য একটি command-ই যথেষ্ট।
npx @deepseek-ai/dsh --profile headless "summarise the files in this directory"headless profile একটি single session চালায় এবং চূড়ান্ত উত্তর print করে।
Environment variable অথবা config file
dsh-কে key দেওয়ার দুটি উপায় আছে। এগুলো পরস্পরের বিকল্প নয়।
একটি catalog provider (DeepSeek, Anthropic, OpenAI এবং built-in তালিকার অন্যান্য provider) Models page-এর মাধ্যমে key গ্রহণ করে। মানটি ~/.dsh/.credentials.yaml-এ সংরক্ষিত হয়, আর আপনার settings-এ শুধু তার reference থাকে। সংরক্ষণ করার পরে Web UI আর key দেখায় না।
এর পরিবর্তে একটি custom provider apiKeyEnv ব্যবহার করে environment variable-এর নাম নির্ধারণ করতে পারে। ~/.dsh/settings.yaml-এর জন্য documentation-এ এই কাঠামোটিই দেওয়া আছে।
llm-pi-ai:
providers:
my-gateway:
apiKeyEnv: GATEWAY_API_KEY
api: openai-completions
baseURL: https://gateway.example/v1
models:
- id: legacy-chat
- id: vision-preview
input: [text, image]প্রথমে Web UI-এর মাধ্যমে একটি provider যোগ করুন। এরপর ~/.dsh/settings.yaml খুলে সেখানে লেখা কাঠামোটি copy করুন। Developer preview চলাকালে nesting-ই সবচেয়ে বেশি পরিবর্তিত হতে পারে। অ্যাপ যে file-টি সদ্য লিখেছে, সেটিই সর্বদা বর্তমান কাঠামো দেখায়।
apiKeyEnv dsh process-এর environment থেকে পড়ে, আপনার login shell থেকে নয়। Interactive session-এ export করা key systemd unit দেখতে পায় না। তাই হাতে dsh web লিখে যে config কাজ করে, service-এর অধীনে সেটিই MISSING_CREDENTIAL ফেরত দেয়। Unit-এর জন্য আলাদা file দিন।
[Service]
EnvironmentFile=/etc/dsh/dsh.envFile-টির mode 600 রাখুন এবং service যে user হিসেবে চলে, সেই user-এর মালিকানায় রাখুন।
মডেল নির্বাচন এবং যে ID-এর নাম পরিবর্তন করা যায় না
কনফিগার করা প্রতিটি provider মডেল picker-এ দেখা যায়। কোনো model নির্বাচন করলে সেটিই নতুন session-এর default হয়ে যায়। আগে থেকে থাকা session-এ সংরক্ষিত model অপরিবর্তিত থাকে। তাই model পরিবর্তন করলে পুরোনো conversation নতুন করে লেখা হয় না।
Provider ID স্থায়ী। Request, সংরক্ষিত session, model default এবং credential reference—সবই এই ID ব্যবহার করে। তাই এটি rename করার কোনো button নেই। ID পরিবর্তন করতে হলে নতুন provider তৈরি করে পুরোনোটি মুছে ফেলতে হবে। এমন একটি নাম বেছে নিন যা দীর্ঘমেয়াদে ব্যবহার করতে পারবেন: local-ollama, test2 নয়।
আপনি আলাদাভাবে উল্লেখ না করলে model শুধু text সমর্থন করে। কোনো model entry-তে image সমর্থন ঘোষণা করতে input: [text, image] যোগ করুন। Catalog কোনো model সম্পর্কে তথ্য না দিলে fallback হিসেবে route level-এ defaultInput সেট করুন। DeepSeek-এর নিজস্ব chat-completions route শুধু text সমর্থন করে এবং অন্যভাবে কনফিগার করা যায় না। তাই ওই route-এ সংযুক্ত image কোনো কিছু পাঠানোর আগেই প্রত্যাখ্যাত হয়।
dsh-কে একটি local endpoint-এর দিকে নির্দেশ করুন, যাতে আপনার code এই box-এই থাকে
Ollama একটি OpenAI-compatible API http://127.0.0.1:11434/v1-এ চালু করে। dsh একটি custom provider-এর মাধ্যমে যেকোনো OpenAI-compatible base URL-এ কথা বলতে পারে। তাই মাঝখানে অতিরিক্ত কোনো স্তর ছাড়াই দুটিকে সংযুক্ত করা যায়। প্রথমে model server সেট আপ করুন: VPS-এ Ollama দিয়ে একটি LLM self-host করা-এ installation এবং model pull করার পদ্ধতি রয়েছে।
dsh ব্যবহারের আগে endpoint উত্তর দিচ্ছে কি না নিশ্চিত করুন।
ollama list
curl -s http://127.0.0.1:11434/v1/modelsollama list আপনার pull করা প্রতিটি model-এর সঠিক tag দেখায়। ওই string কপি করুন। curl একই model-গুলো JSON হিসেবে ফেরত দেয়। Empty list-এর অর্থ হলো Ollama চলছে, কিন্তু কোনো model pull করা নেই। Connection refused-এর অর্থ হলো Ollama চলছে না, অথবা 11434-এ listen করছে না।
এখন provider যোগ করুন। Ollama একটি API key field প্রয়োজন করে, কিন্তু এর value উপেক্ষা করে। তাই যেকোনো non-empty string কাজ করবে।
llm-pi-ai:
providers:
local-ollama:
apiKeyEnv: OLLAMA_API_KEY
api: openai-completions
baseURL: http://127.0.0.1:11434/v1
models:
- id: <the exact tag printed by ollama list>যেখানে dsh process এটি দেখতে পাবে, সেখানে variable-টি export করুন।
sudo install -d -m 700 /etc/dsh
printf 'OLLAMA_API_KEY=ollama\n' | sudo tee /etc/dsh/dsh.env
sudo chmod 600 /etc/dsh/dsh.envএই ধরনের প্রায় সব প্রচেষ্টার ব্যর্থতা তিনটি কারণে হয়। MISSING_CREDENTIAL-এর অর্থ হলো dsh apiKeyEnv-এ নির্দিষ্ট variable পড়তে পারেনি। তাই আপনার terminal-এর environment নয়, process-টির environment পরীক্ষা করুন। UNKNOWN_MODEL-এর অর্থ হলো id-এর মান configured model-এর সঙ্গে মেলে না। তাই ollama list-এর সঙ্গে character by character তুলনা করুন, colon-এর পরের tag-সহ। Available model আনতে গিয়ে 401 error হলে তা model discovery থেকে এসেছে। এই কাজটি আপনার base URL-এ GET /models call করে। যে endpoint ওই path serve করে না, সেখানে model-গুলোর নাম হাতে লিখে দিতে হবে।
Base URL নিয়েও একটি সাধারণ ভুল হয়। এতে /v1 বাদ দিন। না হলে request এমন path-এ যাবে যা Ollama serve করে না। ফলে call 404 error ফেরত দেবে এবং model কখনো চলবে না। এই suffix OpenAI-compatible surface-এর অংশ, শুধু অতিরিক্ত লেখা নয়।
Ollama অন্য machine-এ চললে সেই machine-এর address base URL হবে। তখন আপনার prompt plain HTTP-এর মাধ্যমে cleartext-এ network পার হবে। এটিকে একই host-এ রাখুন, অথবা TLS (transport layer security) ও authentication-এর আড়ালে চালান: exposed Ollama endpoint সুরক্ষিত করা।
প্রতিটি মোডে মেশিন থেকে কী বের হয়
DeepSeek key ব্যবহার করলে প্রতিটি request DeepSeek-এর API-তে যায়। সেই request-এর সঙ্গে আপনার prompt, agent উত্তর দেওয়ার জন্য যে file-গুলোর বিষয়বস্তু পড়েছে, agent চালানো command-গুলোর output এবং agent অন্তর্ভুক্ত করার সিদ্ধান্ত নেওয়া যেকোনো tool result যায়। agent কোনো file খুললে আপনার source code-ও সেই payload-এর অংশ থাকে। Hosted model এভাবেই কাজ করে। তাই agent কোন directory-তে শুরু করছেন, তা বিবেচনা করা জরুরি।
অন্য কোনো catalog provider বা company gateway ব্যবহার করলে একই payload সেই vendor-এর কাছে যায়। Base URL দেখলেই সঠিক গন্তব্য জানা যায়।
Local endpoint ব্যবহার করলে model request 127.0.0.1:11434-এ যায় এবং একই machine-এ থাকে। আপনার code-এর কোনো অংশ model vendor-এর কাছে পৌঁছায় না। তবু 3 ধরনের data network পার হয়। npx npm registry থেকে package download করে। Agent চালানো যেকোনো tool নিজে Internet-এ পৌঁছাতে পারে। এর মধ্যে আপনার সংযুক্ত MCP (model context protocol) server-ও রয়েছে। VPS-এ MCP server চালানো বিষয়টি বিস্তারিতভাবে ব্যাখ্যা করে। Telemetry চালু করলে সেটিও network পার হয়।
আপনি opt in না করা পর্যন্ত telemetry বন্ধ থাকে। DSH_TELEMETRY_MODE হলো consent switch। এই variable unset, empty বা unrecognised হলে তার মান DISABLED হিসেবে গণ্য হয়। এই অবস্থায় dsh কোনো OpenTelemetry (OTel) provider, processor বা exporter তৈরি করে না। তাই fresh profile কোনো telemetry network request-ই করে না। FEEDBACK_ONLY feedback-triggered session log sharing চালু করে। FULL launcher reporting-এরও অনুমতি দেয়। Session feed session content, tool data, prompt এবং workspace path export করতে পারে। তাই FULL-কে আপনার কাজ DeepSeek-এ পাঠানোর সমতুল্য হিসেবে বিবেচনা করুন।
Mode string সঠিকভাবে সেট করার ওপর নির্ভর না করে সম্পূর্ণভাবে বন্ধ করতে DSH_TELEMETRY_DISABLED=1 সেট করুন। যেকোনো non-empty value authoritative opt-out হিসেবে কাজ করে। Run শুরু হওয়ার আগেই এটি পড়া হয়। তাই project code session চলাকালে এটি আবার চালু করতে পারে না। Default collector address হলো harness-telemetry.deepseeksvc.com। নিজের firewall log পড়ার সময় এই নামটি জানা কাজে লাগে।
Setting-কে বিশ্বাস না করে যাচাই করুন। কোনো task চলাকালে process-টি ধরে রাখা outbound connection-এর তালিকা দেখুন।
sudo ss -tnp | grep -i nodeLocal-model mode-এ loopback connection 11434 দেখা উচিত এবং public address-এ কোনো connection থাকা উচিত নয়। অন্য কিছু দেখা গেলে এগিয়ে যাওয়ার আগে সেটির পরিচয় যাচাই করুন। Coding agent কীভাবে data বাইরে পাঠায় একই পরীক্ষা অন্য harness-এর ক্ষেত্রেও চালায় এবং ফলাফল কীভাবে পড়তে হয় তা ব্যাখ্যা করে।
যেখানে secret রাখা উচিত নয়
- Shell history-তে।
export DEEPSEEK_API_KEY=sk-...cleartext হিসেবে~/.bash_history-এ লেখা হয় এবং key rotate করার পরেও সেখানে থেকে যায়।HISTCONTROL=ignorespaceসেট করা থাকলে command-এর আগে একটি space দিন। অথবা shell এড়িয়ে value সরাসরি mode 600-সহ একটি file-এ লিখুন। - Committed dotfile-এ। আপনি যদি dotfile git-এ রাখেন, তাহলে
~/.bashrcবা~/.zshrc-এ থাকা একটি key মাত্রgit addদূরে public repository-তে পৌঁছে যেতে পারে। push করার আগে ওই repository-তেgit grep -I -n 'sk-'চালান। settings.yaml-এ। custom provider-এর জন্যapiKeyEnvব্যবহার করুন, যাতে file-এ secret-এর বদলে একটি variable name থাকে। Config file issue report এবং support chat-এ paste করা হয়। Credentials file করা হয় না।env-এর output এবং terminal screenshot-এ। যে command পুরো environment print করে, সেটি key-ও সঙ্গে print করে।- Backup-এ।
~/.dshbackup করা গুরুত্বপূর্ণ, কিন্তু এর ভেতরের.credentials.yamlএকটি সক্রিয় secret। ওই file বাদ দিন অথবা archive encrypt করুন।
এই নিয়মগুলো শুধু dsh-এর জন্য নয়। একই server-এর container দিকের একই সমস্যাটি Compose env file-এ secret না রাখার বিষয়টি-তে ব্যাখ্যা করা হয়েছে।
Developer preview ব্যবহারের বাস্তব ব্যবস্থাপনা
আপনি যে version পরীক্ষা করেছেন, সেটি নির্দিষ্ট করে রাখুন। কারণ preview একটি patch release-এ configuration key পরিবর্তন করতে পারে, এবং তখন আপনার provider configuration load করতে ব্যর্থ হতে পারে। Credentials file বাদ দিয়ে settings.yaml এবং cordis.patch.yml version control-এ রাখুন। এতে upgrade-এর পরে কী পরিবর্তিত হয়েছে তা দেখা যায়।
কোনো profile প্রত্যাশামতো কাজ না করলে দুটি flag সহায়ক। --dump-default-config boot না করেই composed default configuration দেখায়। একইভাবে --dump-config আপনার profile-এর জন্য composed configuration দেখায়। দুটি output তুলনা করলে আপনার patch layer আসলে কী পরিবর্তন করেছে তা বোঝা যায়। হাতে layer পড়ার চেয়ে এটি দ্রুত।
dsh --profile web --dump-configUpgrade-এর পরে কিছু নষ্ট হলে প্রথমে এটি চালান। Release-এর মধ্যে স্থান পরিবর্তন করা key dump-এ missing branch হিসেবে দেখা যায়। তখন reinstall না করে একটি line edit করলেই সমস্যা ঠিক করা যায়।
FAQ
dsh আমার DeepSeek API key কোথায় সংরক্ষণ করে?
$DSH_HOME/.credentials.yaml-এ। আপনি নিজে DSH_HOME সেট না করলে এটি ~/.dsh/.credentials.yaml হয়। Models page সেখানে key লিখে রাখে, আর আপনার settings-এ শুধু সেটির reference থাকে। তাই secret একটি ফাইলেই থাকে। stat -c '%a %n' ~/.dsh/.credentials.yaml দিয়ে mode পরীক্ষা করুন। mode 600-এর চেয়ে বেশি permissive হলে এটি 600 সেট করুন। apiKeyEnv ব্যবহার করে environment variable-এর নাম নির্ধারণ করলে custom provider পুরো file ব্যবহারের প্রয়োজন এড়াতে পারে।
DeepSeek API-এর পরিবর্তে dsh-কে local model ব্যবহার করাব কীভাবে?
আপনার local OpenAI-compatible endpoint-এর base URL দিয়ে একটি custom provider যোগ করুন। Ollama-এর জন্য সেটি http://127.0.0.1:11434/v1। সেখানে api: openai-completions এবং ollama list থেকে হুবহু কপি করা model id ব্যবহার করুন। Ollama একটি API key value প্রয়োজন বলে ধরে, কিন্তু সেটি উপেক্ষা করে। তাই যেকোনো non-empty string কাজ করবে। dsh config সম্পাদনা করার আগে curl -s http://127.0.0.1:11434/v1/models দিয়ে endpoint-এর উত্তর পরীক্ষা করুন। কারণ বন্ধ endpoint এবং ভুল config একই ধরনের error তৈরি করতে পারে।
dsh কি default অবস্থায় আমার code কোথাও পাঠায়?
Hosted model ব্যবহার করলে পাঠায়। আপনার prompt এবং agent যে file-গুলোর contents পড়েছে, সেগুলো vendor-এর API request-এর অংশ থাকে। Local endpoint ব্যবহার করলে request loopback-এ যায় এবং machine-এর মধ্যেই থাকে। Telemetry আলাদা feed, এবং default অবস্থায় এটি বন্ধ থাকে। DSH_TELEMETRY_MODE unset থাকলে DISABLED-এ resolve হয়, এবং সেই অবস্থায় কোনো exporter তৈরি হয় না। Run শুরু হওয়ার আগে পড়া হয় এমন opt-out সেট করতে DSH_TELEMETRY_DISABLED=1 নির্ধারণ করুন।
আমার variable সেট করা থাকা সত্ত্বেও dsh কেন MISSING_CREDENTIAL দেখায়?
কারণ dsh apiKeyEnv-এ নির্ধারিত variable-টি নিজের process environment থেকে পড়ে। আপনার shell-এ exported variable systemd service, অন্য user-এর session বা variable export করার আগে শুরু হওয়া কোনো process-এ পৌঁছায় না। Unit-এর জন্য mode 600 সহ একটি EnvironmentFile-এ value রাখুন, অথবা dsh যে একই shell থেকে শুরু করেন সেখানে variable export করুন। চলমান process আসলে কী ধরে রেখেছে, তা sudo tr '\0' '\n' < /proc/$(pgrep -f dsh | head -1)/environ দিয়ে নিশ্চিত করুন।
dsh-এর জন্য কোন Node.js version প্রয়োজন?
22 line-এর জন্য Node.js 22.19 বা পরবর্তী version, অথবা 24 এবং তার পরের version প্রয়োজন। Node 23 supported range-এর বাইরে। অন্য কিছু করার আগে node -v চালান। কারণ unsupported runtime-এর startup failure-কে broken install মনে হতে পারে। এতে runtime-এর পরিবর্তে অনেকে package পুনরায় install করতে শুরু করেন।