























@@ -0,0 +1,309 @@
1+---
2+summary: "Run OpenClaw through ds4, a local DeepSeek V4 Flash OpenAI-compatible server"
3+read_when:
4+ - You want to run OpenClaw against antirez/ds4
5+ - You want a local DeepSeek V4 Flash backend with tool calls
6+ - You need the OpenClaw config for ds4-server
7+title: "ds4"
8+---
9+10+[ds4](https://github.com/antirez/ds4) serves DeepSeek V4 Flash from a local
11+Metal backend with an OpenAI-compatible `/v1` API. OpenClaw connects to ds4
12+through the generic `openai-completions` provider family.
13+14+ds4 is not a bundled OpenClaw provider plugin. Configure it under
15+`models.providers.ds4`, then select `ds4/deepseek-v4-flash`.
16+17+- Provider id: `ds4`
18+- Plugin: none
19+- API: OpenAI-compatible Chat Completions (`openai-completions`)
20+- Suggested base URL: `http://127.0.0.1:18000/v1`
21+- Model id: `deepseek-v4-flash`
22+- Tool calls: supported through OpenAI-style `tools` and `tool_calls`
23+- Reasoning: DeepSeek-style `thinking` and `reasoning_effort`
24+25+## Requirements
26+27+- macOS with Metal support.
28+- A working ds4 checkout with `ds4-server` and the DeepSeek V4 Flash GGUF file.
29+- Enough memory for the context you choose. Larger `--ctx` values allocate more
30+ KV memory when the server starts.
31+32+<Warning>
33+OpenClaw agent turns include tool schemas and workspace context. A tiny context
34+such as `--ctx 4096` can pass direct curl tests but fail full agent runs with
35+`500 prompt exceeds context`. Use at least `--ctx 32768` for agent and tool
36+smoke tests. Use `--ctx 393216` only when you have enough memory and want ds4
37+Think Max behavior.
38+</Warning>
39+40+## Quickstart
41+42+<Steps>
43+<Step title="Start ds4-server">
44+Replace `<DS4_DIR>` with your ds4 checkout path.
45+46+```bash
47+<DS4_DIR>/ds4-server \
48+ --model <DS4_DIR>/ds4flash.gguf \
49+ --host 127.0.0.1 \
50+ --port 18000 \
51+ --ctx 32768 \
52+ --tokens 128
53+```
54+55+</Step>
56+<Step title="Verify the OpenAI-compatible endpoint">
57+```bash
58+curl http://127.0.0.1:18000/v1/models
59+```
60+61+The response should include `deepseek-v4-flash`.
62+63+</Step>
64+<Step title="Add the OpenClaw provider config">
65+Add the config from [Full config](#full-config), then run a one-shot model
66+check:
67+68+```bash
69+openclaw infer model run \
70+ --local \
71+ --model ds4/deepseek-v4-flash \
72+ --thinking off \
73+ --prompt "Reply with exactly: openclaw-ds4-ok" \
74+ --json
75+```
76+77+</Step>
78+</Steps>
79+80+## Full config
81+82+Use this config when ds4 is already running on `127.0.0.1:18000`.
83+84+```json5
85+{
86+ agents: {
87+ defaults: {
88+ model: { primary: "ds4/deepseek-v4-flash" },
89+ models: {
90+"ds4/deepseek-v4-flash": {
91+ alias: "DS4 local",
92+ },
93+ },
94+ },
95+ },
96+ models: {
97+ mode: "merge",
98+ providers: {
99+ ds4: {
100+ baseUrl: "http://127.0.0.1:18000/v1",
101+ apiKey: "ds4-local",
102+ api: "openai-completions",
103+ timeoutSeconds: 300,
104+ models: [
105+ {
106+ id: "deepseek-v4-flash",
107+ name: "DeepSeek V4 Flash (ds4)",
108+ reasoning: true,
109+ input: ["text"],
110+ cost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0 },
111+ contextWindow: 32768,
112+ maxTokens: 128,
113+ compat: {
114+ supportsUsageInStreaming: true,
115+ supportsReasoningEffort: true,
116+ maxTokensField: "max_tokens",
117+ supportsStrictMode: false,
118+ thinkingFormat: "deepseek",
119+ supportedReasoningEfforts: ["low", "medium", "high", "xhigh"],
120+ },
121+ },
122+ ],
123+ },
124+ },
125+ },
126+}
127+```
128+129+Keep `contextWindow` aligned with the `ds4-server --ctx` value. Keep `maxTokens`
130+aligned with `--tokens` unless you intentionally want OpenClaw to request less
131+output than the server default.
132+133+## On-demand startup
134+135+OpenClaw can start ds4 only when a `ds4/...` model is selected. Add
136+`localService` to the same provider entry:
137+138+```json5
139+{
140+ models: {
141+ providers: {
142+ ds4: {
143+ baseUrl: "http://127.0.0.1:18000/v1",
144+ apiKey: "ds4-local",
145+ api: "openai-completions",
146+ timeoutSeconds: 300,
147+ localService: {
148+ command: "<DS4_DIR>/ds4-server",
149+ args: [
150+"--model",
151+"<DS4_DIR>/ds4flash.gguf",
152+"--host",
153+"127.0.0.1",
154+"--port",
155+"18000",
156+"--ctx",
157+"32768",
158+"--tokens",
159+"128",
160+ ],
161+ cwd: "<DS4_DIR>",
162+ healthUrl: "http://127.0.0.1:18000/v1/models",
163+ readyTimeoutMs: 300000,
164+ idleStopMs: 0,
165+ },
166+ models: [
167+ {
168+ id: "deepseek-v4-flash",
169+ name: "DeepSeek V4 Flash (ds4)",
170+ reasoning: true,
171+ input: ["text"],
172+ cost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0 },
173+ contextWindow: 32768,
174+ maxTokens: 128,
175+ compat: {
176+ supportsUsageInStreaming: true,
177+ supportsReasoningEffort: true,
178+ maxTokensField: "max_tokens",
179+ supportsStrictMode: false,
180+ thinkingFormat: "deepseek",
181+ supportedReasoningEfforts: ["low", "medium", "high", "xhigh"],
182+ },
183+ },
184+ ],
185+ },
186+ },
187+ },
188+}
189+```
190+191+`command` must be an absolute executable path. Shell lookup and `~` expansion are
192+not used. See [Local model services](/gateway/local-model-services) for every
193+`localService` field.
194+195+## Think Max
196+197+ds4 applies Think Max only when both conditions are true:
198+199+- `ds4-server` starts with `--ctx 393216` or higher.
200+- The request uses `reasoning_effort: "max"` or the equivalent ds4 effort field.
201+202+If you run that large context, update both the server flags and OpenClaw model
203+metadata:
204+205+```json5
206+{
207+ contextWindow: 393216,
208+ maxTokens: 384000,
209+ compat: {
210+ supportsUsageInStreaming: true,
211+ supportsReasoningEffort: true,
212+ maxTokensField: "max_tokens",
213+ supportsStrictMode: false,
214+ thinkingFormat: "deepseek",
215+ supportedReasoningEfforts: ["low", "medium", "high", "xhigh", "max"],
216+ },
217+}
218+```
219+220+## Test
221+222+Start with a direct HTTP check:
223+224+```bash
225+curl http://127.0.0.1:18000/v1/chat/completions \
226+ -H 'content-type: application/json' \
227+ -d '{"model":"deepseek-v4-flash","messages":[{"role":"user","content":"Reply with exactly: ds4-ok"}],"max_tokens":16,"stream":false,"thinking":{"type":"disabled"}}'
228+```
229+230+Then test OpenClaw model routing:
231+232+```bash
233+openclaw infer model run \
234+ --local \
235+ --model ds4/deepseek-v4-flash \
236+ --thinking off \
237+ --prompt "Reply with exactly: openclaw-ds4-ok" \
238+ --json
239+```
240+241+For a full agent and tool-call smoke, use a context of at least 32768:
242+243+```bash
244+openclaw agent \
245+ --local \
246+ --session-id ds4-tool-smoke \
247+ --model ds4/deepseek-v4-flash \
248+ --thinking off \
249+ --message "Use the shell command pwd once, then reply exactly: tool-ok <output>" \
250+ --json \
251+ --timeout 240
252+```
253+254+Expected result:
255+256+- `executionTrace.winnerProvider` is `ds4`
257+- `executionTrace.winnerModel` is `deepseek-v4-flash`
258+- `toolSummary.calls` is at least `1`
259+- `finalAssistantVisibleText` starts with `tool-ok`
260+261+## Troubleshooting
262+263+<AccordionGroup>
264+<Accordion title="curl /v1/models cannot connect">
265+ds4 is not running or not bound to the host and port in `baseUrl`. Start
266+`ds4-server`, then retry:
267+268+```bash
269+curl http://127.0.0.1:18000/v1/models
270+```
271+272+</Accordion>
273+274+<Accordion title="500 prompt exceeds context">
275+The configured `--ctx` is too small for the OpenClaw turn. Raise
276+`ds4-server --ctx`, then update `models.providers.ds4.models[].contextWindow`
277+to match. Full agent turns with tools need substantially more context than a
278+direct one-message curl request.
279+</Accordion>
280+281+<Accordion title="Think Max does not activate">
282+ds4 only uses Think Max when `--ctx` is at least `393216` and the request
283+asks for `reasoning_effort: "max"`. Smaller contexts fall back to high
284+reasoning.
285+</Accordion>
286+287+<Accordion title="The first request is slow">
288+ds4 has a cold Metal residency and model warmup phase. Use
289+`localService.readyTimeoutMs: 300000` when OpenClaw starts the server on
290+demand.
291+</Accordion>
292+</AccordionGroup>
293+294+## Related
295+296+<CardGroup cols={2}>
297+<Card title="Local model services" href="/gateway/local-model-services" icon="play">
298+Start local model servers on demand before model requests.
299+</Card>
300+<Card title="Local models" href="/gateway/local-models" icon="server">
301+Choose and operate local model backends.
302+</Card>
303+<Card title="Model providers" href="/concepts/model-providers" icon="layers">
304+Configure provider refs, auth, and failover.
305+</Card>
306+<Card title="DeepSeek" href="/providers/deepseek" icon="brain">
307+Native DeepSeek provider behavior and thinking controls.
308+</Card>
309+</CardGroup>
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。