DeepSeek Harness einrichten: API Key, Base URL und Modelle
Verbinde DeepSeek Harness über das headless-Profil mit BetterToken. Konfiguriere API Key, Base URL und Protokoll und prüfe den Dateizugriff.
Verbinde DeepSeek Harness (dsh) über einen eigenen Provider im Profil headless mit BetterToken. In macOS-Tests verarbeitete @deepseek-ai/dsh@0.2.1-rc.2 Textanfragen und Tool-Aufrufe zum Lesen von Dateien bei jeder der folgenden Kombinationen in allen 3 Versuchen: Chat Completions mit einem GPT-Modell, Responses mit einem GPT-Modell, Anthropic Messages mit einem Claude-Modell und Anthropic Messages mit einem GPT-Modell.
Wichtige Einstellungen
| Feld | Wert |
|---|---|
| API Key | BetterToken API Key aus der Umgebungsvariable, deren Name in apiKeyEnv steht |
| Base URL | https://bettertoken.ai/v1 — Chat Completions / Responses |
| Base URL für Anthropic Messages | https://bettertoken.ai, ohne /v1 |
| Modell | YOUR_MODEL_ID |
| Konfigurationsdatei | $DSH_HOME/profiles/headless/cordis.patch.yml (DSH_HOME ist standardmäßig ~/.dsh) |
Voraussetzungen
- Node.js 24.9 oder neuer, wie in den offiziellen Upgrade-Hinweisen zu rc.2 angegeben
- Ein BetterToken API Key: registrieren und Key erhalten
- Eine Model ID aus der model plaza
Installation
Starte die hier getestete Version ohne globale Installation:
npx @deepseek-ai/dsh@0.2.1-rc.2 --helpZum Testzeitpunkt verwies das npm-Tag latest auf 0.2.1-rc.2, einen Release Candidate. Andere Tags wie next wurden nicht getestet.
Manuelle Einrichtung
Exportiere den API Key und ersetze dabei YOUR_API_KEY:
export BETTERTOKEN_API_KEY="YOUR_API_KEY"Erstelle ~/.dsh/profiles/headless/cordis.patch.yml. Die Datei enthält eine Liste von Cordis-Patches. Ersetze beide Werte YOUR_MODEL_ID durch dieselbe exakte Model ID:
Chat Completions
- id: llm-pi-ai config: providers: bettertoken: api: openai-completions baseURL: https://bettertoken.ai/v1 apiKeyEnv: BETTERTOKEN_API_KEY retryPolicy: mode: normal maxRetries: 2 models: - id: YOUR_MODEL_ID- id: agent-default-model config: provider: bettertoken model: YOUR_MODEL_IDResponses
- id: llm-pi-ai config: providers: bettertoken: api: openai-responses baseURL: https://bettertoken.ai/v1 apiKeyEnv: BETTERTOKEN_API_KEY retryPolicy: mode: normal maxRetries: 2 models: - id: YOUR_MODEL_ID- id: agent-default-model config: provider: bettertoken model: YOUR_MODEL_IDAnthropic Messages
- id: llm-pi-ai config: providers: bettertoken: api: anthropic-messages baseURL: https://bettertoken.ai apiKeyEnv: BETTERTOKEN_API_KEY retryPolicy: mode: normal maxRetries: 2 models: - id: YOUR_MODEL_ID- id: agent-default-model config: provider: bettertoken model: YOUR_MODEL_IDapiKeyEnv enthält den Namen einer Umgebungsvariable, weder den API Key selbst noch einen Ausdruck wie ${...}. Ein eigener Provider benötigt api, baseURL und mindestens einen Eintrag unter models; pro Eintrag ist nur die Modell-id erforderlich. Wenn llm-pi-ai bereits konfiguriert ist, kopiere die Provider, die du behalten möchtest, in dasselbe config, da ein neuer Eintrag den vorhandenen ersetzt.
Das Feld api akzeptiert für eigene Provider nur openai-completions, openai-responses und anthropic-messages. Die Anthropic Base URL ist die Website-Wurzel, da der Client /v1/messages selbst anhängt.
Um die Syntax ohne Modellanfrage zu prüfen, führe npx @deepseek-ai/dsh@0.2.1-rc.2 --profile headless --dump-config aus.
Verbindung prüfen
Führe im selben Terminal Folgendes aus:
npx @deepseek-ai/dsh@0.2.1-rc.2 --profile headless --json "Reply with only: OK"--json gibt pro Zeile ein JSON-Ereignis aus. Prüfe, ob der Exit-Code 0 lautet, turn_end.reason ein reguläres Ende anzeigt und das Feld text im letzten final-Ereignis gleich OK ist. Auch ein fehlgeschlagener Lauf kann ein leeres final-Ereignis ausgeben; das Ereignis allein belegt keinen Erfolg.
Um den Dateizugriff zu prüfen, erstelle sample.txt in einem leeren Verzeichnis und führe dort denselben Befehl mit dem Prompt Read sample.txt using a tool. Reply with only its exact contents. aus. Prüfe, ob die Ausgabe einen tool_call, einen tool_result mit dem Dateiinhalt und einen übereinstimmenden final-Text enthält.
Modell wechseln
Ändere beide Werte YOUR_MODEL_ID in eine andere exakte Model ID. Wenn das neue Modell ein anderes Protokoll verwendet, etwa ein Claude-Modell über Anthropic Messages, ändere api und baseURL zusammen. Um die vom Gateway gelieferten Modelle aufzulisten, nutze Fetch available models für einen eigenen Provider in der Weboberfläche von DeepSeek Harness. Im Test lieferte derselbe Dienst zur Modellerkennung die BetterToken-Modellliste für alle drei Protokolle.
Häufige Fehler
| Symptom | Was du prüfen solltest |
|---|---|
MISSING_CREDENTIAL, Exit-Code 1 und keine Anfrage im Dashboard | Der Prozess hat die in apiKeyEnv angegebene Variable nicht erhalten. Exportiere sie im Terminal, aus dem du dsh startest, und prüfe die Schreibweise. Diese Prüfung erfolgt lokal. |
Das Profil headless ignoriert einen in der Weboberfläche gespeicherten Key | Das Profil headless liest Zugangsdaten ausschließlich in dieser Reihenfolge: aus der Startumgebung, aus .env im aktuellen Verzeichnis und aus .env unter DSH_HOME. |
404 mit einem Anfragepfad, der auf /v1/v1/messages endet | Die Anthropic-baseURL endet auf /v1. Verwende https://bettertoken.ai. |
| Modell nicht gefunden | Kopiere die Model ID erneut aus der model plaza und verwende sie an beiden Stellen. |
| Viele Wiederholungen nach einem Fehler | Ohne retryPolicy versucht der Adapter standardmäßig 5 Wiederholungen. Setze maxRetries ausdrücklich wie in den Beispielen. |
| Fehler wegen der Node.js-Version | Verwende Node.js 24.9 oder neuer. |
Weitere Informationen
Technische Details
Im Test lauteten die tatsächlichen Anfragepfade für die drei api-Werte /v1/chat/completions, /v1/responses und /v1/messages. dsh sendet über den konfigurierten Provider und das Modell außerdem automatisch eine Anfrage für den Sitzungstitel. Eine Aufgabe kann daher mehrere Anfragen auslösen. Der Client ergänzte standardmäßige Ausgabelimits, etwa 32768 Tokens für die Hauptanfrage; diese waren nicht in der Konfiguration gesetzt.
Die Felder input und contextWindow in einem Modelleintrag sind Angaben für den Client. Sie fragen die Limits des Gateways weder ab noch bestätigen sie diese. Bildeingaben wurden nicht getestet. Die Tests fanden ausschließlich unter macOS statt.

