SSD Nodes Learn Hosting plans →
गाइड Matt Connorलेखक: Matt Connor · अपडेट किया गया: 2026-08-25

dsh configuration: API keys और models कैसे सेट करें

Linux पर dsh config फ़ाइलों का स्थान जानें। DeepSeek API key या Ollama endpoint को सही तरीके से कॉन्फ़िगर करने का तरीका समझें और देखें कि कौन सा डेटा आपके सिस्टम से बाहर जाता है।

dsh अपनी configuration कहाँ रखता है

dsh (DeepSeek Harness) अपनी configuration को एक directory में रखता है: $DSH_HOME, जो डिफ़ॉल्ट रूप से ~/.dsh होती है। Web UI में आप जो कुछ भी सेट करते हैं, वह वहाँ plain files के रूप में लिखा जाता है। उस directory को किसी दूसरे सर्वर पर copy करें और नया सर्वर पुराने सर्वर की तरह ही काम करने लगेगा।

चार paths में वह सब कुछ होता है जिसे आप इस्तेमाल करेंगे।

  • ~/.dsh/settings.yaml में हाथ से लिखी गई और UI द्वारा लिखी गई settings होती हैं, जिसमें आपके provider और model routes शामिल हैं।
  • ~/.dsh/.credentials.yaml में secrets होते हैं। Settings में केवल credential का reference होता है, इसलिए key की वास्तविक value एक ही file में रहती है।
  • ~/.dsh/profiles/ में named profiles होते हैं, और ~/.dsh/storages/ में saved sessions होते हैं।
  • ~/.dsh/cordis.patch.yml आपकी अपनी patch layer है। इसे हर profile के लिए built-in configuration के ऊपर लागू किया जाता है।

DeepSeek ने 17 August 2026 को MIT-licensed developer preview के रूप में इस harness की घोषणा की थी, और README में उल्लेख है कि इसमें compatibility तोड़ने वाले बदलाव होंगे। इस guide में दिए गए field names और paths अगस्त 2026 तक की repository documentation से मेल खाते हैं। किसी भी guide से config copy करने से पहले, अपनी install की गई version की docs के साथ उन्हें verify करें, क्योंकि preview version में releases के बीच नाम बदल दिए जाते हैं।

शुरुआती आउटपुट के लिए न्यूनतम आवश्यकताएं

dsh को Node.js 22.19 या उसके बाद का 22 वर्ज़न, या 24 और उससे ऊपर का वर्ज़न चाहिए। Node 23 इस रेंज से बाहर है। पहले वर्ज़न की जाँच करें, क्योंकि वर्ज़न मेल न खाने पर स्टार्टअप विफल हो जाता है और त्रुटि (error) ऐसी दिखती है जैसे पैकेज खराब हो।

node -v
npx @deepseek-ai/dsh web

npx पैकेज को npm रजिस्ट्री से डाउनलोड करता है और http://127.0.0.1:3080 पर Web UI शुरू करता है। यह loopback एड्रेस को bind करता है, जिसका अर्थ है कि यदि आपका firewall अनुमति भी दे, तब भी यह पोर्ट किसी अन्य मशीन से एक्सेस नहीं किया जा सकता। VPS पर, 3080 को इंटरनेट के लिए खोलने के बजाय इसे SSH के माध्यम से forward करें। यदि वह प्रिंट किया गया URL भ्रमित करने वाला है, तो dsh उस एड्रेस पर क्यों शुरू होता है यह बताता है कि loopback bind क्या सुरक्षित करता है और क्या नहीं।

ssh -N -L 3080:127.0.0.1:3080 you@your-server

अपने लैपटॉप पर http://127.0.0.1:3080 खोलें, फिर Settings और Models पर जाएं। DeepSeek कार्ड में एक API key फील्ड है। platform.deepseek.com से key पेस्ट करें और उसे save करें। मॉडल रूट तुरंत उपयोग योग्य हो जाता है, बिना किसी रीस्टार्ट के, क्योंकि चल रहा सर्वर क्रेडेंशियल को स्टोर करता है और रेफरेंस को लाइव रिज़ॉल्व करता है। रिमोट सर्वर पर dsh Web UI तक पहुँचना टनल और reverse proxy के मामले को कवर करता है, और VPS पर DeepSeek Harness इंस्टॉल करना उस सर्वर तैयारी को कवर करता है जिसे यह गाइड मानकर चलती है।

सेव करने के बाद, देखें कि ऐप ने क्या बनाया है।

ls -la ~/.dsh
stat -c '%a %n' ~/.dsh/.credentials.yaml

आपको settings.yaml, .credentials.yaml और profiles/ दिखाई देना चाहिए। यदि stat, 600 के अलावा कोई अन्य मोड प्रिंट करता है, तो chmod 600 ~/.dsh/.credentials.yaml चलाएं। एक group-readable या world-readable क्रेडेंशियल फ़ाइल आपकी key को बॉक्स पर मौजूद हर दूसरे अकाउंट को दे देती है।

बिना ब्राउज़र के पहली बार चलाने के लिए, एक कमांड पर्याप्त है।

npx @deepseek-ai/dsh --profile headless "summarise the files in this directory"

headless प्रोफाइल एक सिंगल सेशन चलाता है और अंतिम उत्तर प्रिंट करता है।

Environment variables या config file

dsh को key देने के दो तरीके हैं, और वे एक-दूसरे के स्थान पर इस्तेमाल नहीं किए जा सकते।

एक catalog provider (DeepSeek, Anthropic, OpenAI, और बाकी built-in सूची) अपनी key Models पेज के माध्यम से लेता है। मान ~/.dsh/.credentials.yaml में जाता है, और आपकी settings में केवल इसका एक reference रहता है। इसे save करने के बाद Web UI कभी भी key को दोबारा नहीं दिखाता।

एक custom provider इसके बजाय एक environment variable का नाम दे सकता है, apiKeyEnv के साथ। यह वह प्रारूप है जो documentation ~/.dsh/settings.yaml के लिए देती है।

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 खोलें और उसके द्वारा लिखी गई structure को copy करें। Developer preview के दौरान nesting वह हिस्सा है जिसके बदलने की संभावना सबसे अधिक है, और app द्वारा अभी लिखी गई file हमेशा current होती है।

apiKeyEnv को dsh process के environment से पढ़ा जाता है, न कि आपके login shell से। एक interactive session में export की गई key एक systemd unit के लिए अदृश्य होती है, इसलिए वही config जो आपके द्वारा हाथ से dsh web टाइप करने पर काम करती है, service के अंतर्गत MISSING_CREDENTIAL return करती है। unit को उसकी अपनी file दें।

[Service]
EnvironmentFile=/etc/dsh/dsh.env

उस file को mode 600 पर रखें, जिसका owner वही user हो जिसके रूप में service चलती है।

मॉडल का चयन, और वह ID जिसे आप रीनेम नहीं कर सकते

प्रत्येक कॉन्फ़िगर किया गया provider मॉडल पिकर में दिखाई देता है। किसी मॉडल को चुनने पर वह नए सत्रों (sessions) के लिए डिफ़ॉल्ट बन जाता है। जो सत्र पहले से मौजूद हैं, उनमें वही मॉडल रिकॉर्ड रहता है, इसलिए स्विच करने से पुरानी बातचीत दोबारा नहीं लिखी जाती।

Provider ID स्थायी होती है। अनुरोध, सहेजे गए सत्र, मॉडल डिफ़ॉल्ट और क्रेडेंशियल संदर्भ सभी इसी की ओर इशारा करते हैं, इसलिए इसमें रीनेम करने का कोई बटन नहीं है। इसे बदलने का मतलब है एक नया provider बनाना और पुराने को हटाना। ऐसा नाम चुनें जिसके साथ आप काम कर सकें: local-ollama न कि test2।

मॉडल केवल टेक्स्ट-ओनली होते हैं जब तक कि आप अन्यथा घोषित न करें। इमेज सपोर्ट घोषित करने के लिए मॉडल प्रविष्टि में input: [text, image] जोड़ें, या उन मॉडलों के लिए फॉलबैक के रूप में रूट स्तर पर defaultInput सेट करें जिनका कैटलॉग में वर्णन नहीं है। DeepSeek का अपना chat-completions रूट केवल टेक्स्ट-ओनली है और इसे अन्यथा कॉन्फ़िगर नहीं किया जा सकता है, इसलिए उस रूट से जुड़ी किसी भी इमेज को कुछ भी भेजने से पहले ही अस्वीकार कर दिया जाता है।

dsh को स्थानीय endpoint पर निर्देशित करें ताकि आपका कोड बॉक्स पर ही रहे

Ollama, http://127.0.0.1:11434/v1 पर एक OpenAI-compatible API प्रदान करता है। dsh एक कस्टम प्रदाता के माध्यम से किसी भी OpenAI-compatible base URL से बात करता है, इसलिए दोनों के बीच कुछ भी रखे बिना वे आपस में जुड़ जाते हैं। पहले मॉडल सर्वर सेट करें: Ollama के साथ VPS पर LLM को self-host करना में इंस्टॉलेशन और मॉडल पुल करने की प्रक्रिया शामिल है।

dsh को छूने से पहले पुष्टि करें कि endpoint प्रतिक्रिया दे रहा है।

ollama list
curl -s http://127.0.0.1:11434/v1/models

ollama list आपके द्वारा पुल किए गए प्रत्येक मॉडल का सटीक टैग प्रिंट करता है। उस स्ट्रिंग को कॉपी करें। curl उन्हीं मॉडलों को JSON के रूप में लौटाता है। खाली सूची का मतलब है कि Ollama चल रहा है लेकिन कोई मॉडल पुल नहीं किया गया है। Connection refused का मतलब है कि Ollama नहीं चल रहा है, या 11434 पोर्ट पर listening नहीं कर रहा है।

अब प्रदाता जोड़ें। Ollama को एक API key फ़ील्ड की आवश्यकता होती है और यह उसके मान (value) को अनदेखा कर देता है, इसलिए कोई भी गैर-खाली स्ट्रिंग काम करेगी।

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 प्रक्रिया इसे देख सके।

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

तीन विफलताएं (failures) इस प्रयास की लगभग हर समस्या को कवर करती हैं। MISSING_CREDENTIAL का मतलब है कि dsh, apiKeyEnv द्वारा नामित वेरिएबल को पढ़ नहीं सका, इसलिए टर्मिनल के वातावरण के बजाय प्रक्रिया के वातावरण की जाँच करें। UNKNOWN_MODEL का मतलब है कि id किसी कॉन्फ़िगर किए गए मॉडल से मेल नहीं खाता है, इसलिए इसकी तुलना ollama list से अक्षर-दर-अक्षर करें, जिसमें कोलन के बाद का टैग भी शामिल है। उपलब्ध मॉडल लाते समय 401 एरर मॉडल डिस्कवरी से आता है, जो आपके base URL पर GET /models को कॉल करता है; जो endpoints उस पाथ को सर्व नहीं करते, उनके मॉडलों को मैन्युअल रूप से टाइप करना पड़ता है।

एक और समस्या base URL है। इसे /v1 के बिना छोड़ें तो अनुरोध उन पाथ्स पर चले जाते हैं जिन्हें Ollama सर्व नहीं करता, इसलिए कॉल 404 के रूप में वापस आती है और मॉडल कभी नहीं चलता। यह सफ़िक्स OpenAI-compatible इंटरफ़ेस का हिस्सा है, न कि कोई सजावट।

यदि Ollama किसी अलग मशीन पर चलता है, तो उस मशीन का पता base URL बन जाता है, और आपके प्रॉम्प्ट्स तब plain HTTP पर नेटवर्क के माध्यम से cleartext में जाते हैं। इसे उसी होस्ट पर रखें, या इसे TLS (transport layer security) और ऑथेंटिकेशन के पीछे रखें: exposed Ollama endpoint को सुरक्षित करना।

प्रत्येक मोड में मशीन से क्या बाहर जाता है

DeepSeek key के साथ, प्रत्येक request DeepSeek की API पर जाती है। उस request में आपका prompt, उन फाइलों की सामग्री जिन्हें agent ने उत्तर देने के लिए पढ़ा, उसके द्वारा चलाए गए commands का output, और कोई भी tool result शामिल होता है जिसे उसने जोड़ने का निर्णय लिया। जब भी agent किसी फाइल को खोलता है, तो आपका source code उस payload के भीतर होता है। एक hosted model इसी तरह काम करता है, और यही कारण है कि आपको यह सोचना चाहिए कि आप किस directory में agent को start करते हैं।

किसी अन्य catalog provider या company gateway के साथ, वही payload उस vendor के पास जाता है। Base URL आपको ठीक-ठीक बताता है कि वह कहाँ है।

Local endpoint के साथ, model request 127.0.0.1:11434 पर जाती है और मशीन पर ही रहती है। आपके code का कोई भी हिस्सा model vendor तक नहीं पहुँचता है। फिर भी तीन चीजें network से होकर गुजरती हैं। npx npm registry से package download करता है। agent द्वारा चलाया गया कोई भी tool अपने आप internet तक पहुँच सकता है, जिसमें वे MCP (model context protocol) servers भी शामिल हैं जिन्हें आपने connect किया है, जिसे running MCP servers on a VPS विस्तार से कवर करता है। एक plugin भी उसी श्रेणी में आता है, क्योंकि उसे install करने पर किसी अन्य लेखक का code आपके agent की permissions के साथ चलता है, इसलिए checking what a plugin can reach before you install it करना उचित है। और telemetry, यदि आप इसे चालू करते हैं।

Telemetry तब तक बंद रहती है जब तक आप opt in नहीं करते। DSH_TELEMETRY_MODE consent switch है, और unset, empty या unrecognised values का परिणाम DISABLED होता है। उस स्थिति में dsh कोई OpenTelemetry (OTel) provider, processor या exporter नहीं बनाता है, इसलिए एक नया profile कोई भी telemetry network request नहीं करता है। FEEDBACK_ONLY feedback-triggered session log sharing के लिए opt in करता है। FULL launcher reporting की भी अनुमति देता है। Session feed session content, tool data, prompts और workspace paths को export कर सकता है, इसलिए FULL को अपने काम को DeepSeek भेजने के समान मानें।

एक hard stop के लिए जो mode string को सही करने पर निर्भर नहीं है, DSH_TELEMETRY_DISABLED=1 set करें। कोई भी non-empty value एक आधिकारिक opt-out है, और इसे run शुरू होने से पहले पढ़ा जाता है, इसलिए project code इसे session के बीच में वापस चालू नहीं कर सकता है। Default collector address harness-telemetry.deepseeksvc.com है, जो आपके firewall logs को पढ़ते समय जानने के लिए एक उपयोगी नाम है।

सेटिंग पर भरोसा करने के बजाय उसे verify करें। एक task चलते समय, उन outbound connections की सूची देखें जो process ने बनाए हैं।

sudo ss -tnp | grep -i node

Local-model mode में आपको 11434 पर loopback connection देखना चाहिए और किसी public address पर कोई connection नहीं होना चाहिए। आगे बढ़ने से पहले किसी भी अन्य चीज़ की पहचान करना उचित है। What a coding agent sends home अन्य harnesses के खिलाफ वही जाँच चलाता है और बताता है कि result को कैसे पढ़ा जाए।

जहाँ secrets को नहीं रखना चाहिए

  • Shell history। export DEEPSEEK_API_KEY=sk-... को ~/.bash_history में cleartext के रूप में लिखा जाता है, और key को rotate करने के बाद भी यह लंबे समय तक वहीं रहता है। जब HISTCONTROL=ignorespace set हो, तो command के आगे एक space लगाएँ, या shell को छोड़कर सीधे mode 600 वाली file में value लिखें।
  • Committed dotfiles। यदि आप dotfiles को git में रखते हैं, तो ~/.bashrc या ~/.zshrc में मौजूद key एक git add की दूरी पर public repository में जा सकती है। push करने से पहले उस repository में git grep -I -n 'sk-' चलाएँ।
  • settings.yaml। Custom providers के लिए apiKeyEnv का उपयोग करें ताकि file में secret के बजाय variable name रहे। Config files को अक्सर issue reports और support chats में paste किया जाता है, जबकि credentials files को नहीं।
  • env का output और terminal screenshots। जो कुछ भी पूरे environment को print करता है, वह key को भी साथ में print कर देता है।
  • Backups। ~/.dsh का backup लेना जरूरी है, और इसके अंदर मौजूद .credentials.yaml एक live secret है। उस file को exclude करें, या archive को encrypt करें।

ये नियम केवल dsh तक सीमित नहीं हैं, और Compose env files से secrets को बाहर रखना उसी सर्वर के container side पर भी यही समस्या हल करता है।

Developer preview के साथ काम करना

जिस version का आपने परीक्षण किया है उसे pin करें, क्योंकि preview version में patch release के दौरान कोई config key बदल सकती है, जिससे आपका provider load होने में विफल हो सकता है। यदि pin किया गया install start होने से मना कर दे, या npx आपको बार-बार ऐसा build दे रहा हो जिसे आपने नहीं मांगा था, तो preview द्वारा उत्पन्न install और version संबंधी त्रुटियां लेख में npx cache और आपके Node के साथ आने वाले npm के बारे में जानकारी दी गई है। settings.yaml और cordis.patch.yml को version control में रखें, और credentials file को exclude कर दें, ताकि आप देख सकें कि upgrade के बाद क्या बदलाव हुए हैं।

जब कोई profile सही ढंग से काम न करे, तो दो flags मददगार होते हैं। --dump-default-config बिना boot किए composed default configuration को print करता है, और --dump-config उसी तरह आपकी profile के लिए composed configuration को print करता है। इन दोनों की तुलना करने से पता चलता है कि आपकी patch layer ने वास्तव में क्या बदला है, जो कि layers को मैन्युअल रूप से पढ़ने की तुलना में अधिक तेज़ है।

dsh --profile web --dump-config

जब upgrade के बाद कुछ खराब हो जाए, तो सबसे पहले इसे चलाएं। releases के बीच बदली गई कोई key dump में missing branch के रूप में दिखाई देगी, और इसका समाधान reinstall करने के बजाय केवल एक लाइन का संपादन (edit) करना है।

FAQ

dsh मेरी DeepSeek API key कहाँ store करता है?

यह $DSH_HOME/.credentials.yaml में store होती है, जो कि ~/.dsh/.credentials.yaml होता है जब तक कि आप स्वयं DSH_HOME सेट न करें। Models पेज key को वहीं लिखता है, और आपकी settings में केवल उसका reference रहता है, इसलिए secret एक ही file में सुरक्षित रहता है। stat -c '%a %n' ~/.dsh/.credentials.yaml के साथ mode की जाँच करें और यदि यह 600 से कम सुरक्षित है, तो इसे 600 पर सेट करें। एक custom provider का उपयोग करके आप apiKeyEnv के साथ environment variable का नाम देकर file के उपयोग से पूरी तरह बच सकते हैं।

मैं dsh को DeepSeek API के बजाय local model का उपयोग करने के लिए कैसे configure करूँ?

एक custom provider जोड़ें जिसका base URL आपका local OpenAI-compatible endpoint हो। Ollama के लिए यह http://127.0.0.1:11434/v1 है, जिसमें api: openai-completions और model id का उपयोग करें जिसे ठीक वैसे ही लिखें जैसे ollama list में दिया गया है। Ollama को एक API key value की आवश्यकता होती है, लेकिन वह इसे ignore कर देता है, इसलिए कोई भी non-empty string काम करेगी। dsh config को edit करने से पहले पुष्टि करें कि endpoint curl -s http://127.0.0.1:11434/v1/models के साथ response दे रहा है, क्योंकि एक dead endpoint और गलत config समान error उत्पन्न करते हैं।

क्या dsh डिफ़ॉल्ट रूप से मेरा code कहीं भेजता है?

hosted model के साथ, हाँ। आपका prompt और उन files की सामग्री जिन्हें agent ने पढ़ा है, उस vendor को भेजे जाने वाले API request का हिस्सा होते हैं। local endpoint के साथ, वह request loopback पर ही रहता है और machine पर ही बना रहता है। Telemetry एक अलग feed है और यह डिफ़ॉल्ट रूप से बंद रहती है: DSH_TELEMETRY_MODE unset होने पर DISABLED के रूप में resolve होता है, और उस स्थिति में कोई exporter नहीं बनाया जाता है। run शुरू होने से पहले opt-out के लिए DSH_TELEMETRY_DISABLED=1 सेट करें।

जब मेरा variable सेट है, तो dsh MISSING_CREDENTIAL क्यों दिखाता है?

क्योंकि dsh apiKeyEnv द्वारा नामित variable को अपनी process environment से पढ़ता है। आपके shell में export किया गया variable किसी systemd service, किसी अन्य user के session, या आपके द्वारा export करने से पहले शुरू की गई process तक नहीं पहुँचता है। value को unit के लिए 600 mode वाली EnvironmentFile file में रखें, या उसी shell में export करें जहाँ से dsh शुरू होता है। sudo tr '\0' '\n' < /proc/$(pgrep -f dsh | head -1)/environ के साथ पुष्टि करें कि चल रही process में वास्तव में क्या value है।

dsh को कौन सा Node.js version चाहिए?

Node.js 22.19 या 22 line का बाद का version, या 24 और उससे ऊपर। Node 23 समर्थित range से बाहर है। किसी भी अन्य कार्य से पहले node -v चलाएँ, क्योंकि unsupported runtime के कारण startup failure होने पर ऐसा लगता है कि installation broken है और लोग runtime के बजाय package को ही reinstall करने लगते हैं।