@lgrammel/ds4-provider 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (46) hide show
  1. package/README.md +96 -0
  2. package/binding.gyp +75 -0
  3. package/dist/ds4-language-model.d.ts +71 -0
  4. package/dist/ds4-language-model.d.ts.map +1 -0
  5. package/dist/ds4-language-model.js +888 -0
  6. package/dist/ds4-language-model.js.map +1 -0
  7. package/dist/ds4-provider.d.ts +13 -0
  8. package/dist/ds4-provider.d.ts.map +1 -0
  9. package/dist/ds4-provider.js +20 -0
  10. package/dist/ds4-provider.js.map +1 -0
  11. package/dist/index.d.ts +4 -0
  12. package/dist/index.d.ts.map +1 -0
  13. package/dist/index.js +4 -0
  14. package/dist/index.js.map +1 -0
  15. package/dist/native-binding.d.ts +42 -0
  16. package/dist/native-binding.d.ts.map +1 -0
  17. package/dist/native-binding.js +157 -0
  18. package/dist/native-binding.js.map +1 -0
  19. package/ds4/LICENSE +22 -0
  20. package/ds4/ds4.c +18268 -0
  21. package/ds4/ds4.h +196 -0
  22. package/ds4/ds4_gpu.h +804 -0
  23. package/ds4/ds4_metal.m +14657 -0
  24. package/ds4/metal/argsort.metal +266 -0
  25. package/ds4/metal/bin.metal +192 -0
  26. package/ds4/metal/concat.metal +62 -0
  27. package/ds4/metal/cpy.metal +57 -0
  28. package/ds4/metal/dense.metal +1121 -0
  29. package/ds4/metal/dsv4_hc.metal +861 -0
  30. package/ds4/metal/dsv4_kv.metal +227 -0
  31. package/ds4/metal/dsv4_misc.metal +1088 -0
  32. package/ds4/metal/dsv4_rope.metal +155 -0
  33. package/ds4/metal/flash_attn.metal +1426 -0
  34. package/ds4/metal/get_rows.metal +54 -0
  35. package/ds4/metal/glu.metal +36 -0
  36. package/ds4/metal/moe.metal +1737 -0
  37. package/ds4/metal/norm.metal +153 -0
  38. package/ds4/metal/repeat.metal +52 -0
  39. package/ds4/metal/set_rows.metal +55 -0
  40. package/ds4/metal/softmax.metal +241 -0
  41. package/ds4/metal/sum_rows.metal +102 -0
  42. package/ds4/metal/unary.metal +312 -0
  43. package/native/binding.cpp +621 -0
  44. package/package.json +66 -0
  45. package/scripts/postinstall.cjs +13 -0
  46. package/scripts/vendor-ds4.cjs +67 -0
package/README.md ADDED
@@ -0,0 +1,96 @@
1
+ # @lgrammel/ds4-provider
2
+
3
+ AI SDK provider for running DeepSeek V4 Flash locally through
4
+ [DwarfStar 4](https://github.com/antirez/ds4). The package bundles the DS4
5
+ native sources and builds the Node.js addon on install; you only need to provide
6
+ a compatible GGUF model file.
7
+
8
+ ## Getting Started
9
+
10
+ Install the package and the AI SDK:
11
+
12
+ ```sh
13
+ pnpm add @lgrammel/ds4-provider ai
14
+ ```
15
+
16
+ Install requirements:
17
+
18
+ - Node.js 18 or newer.
19
+ - A working native build toolchain for `node-gyp`.
20
+ - A DS4-compatible DeepSeek V4 Flash GGUF.
21
+
22
+ Download a model using DS4's downloader:
23
+
24
+ ```sh
25
+ git clone https://github.com/antirez/ds4.git
26
+ cd ds4
27
+ ./download_model.sh q2-imatrix
28
+ ```
29
+
30
+ The DS4 project recommends `q2-imatrix` for 96/128 GB RAM machines and
31
+ `q4-imatrix` for machines with at least 256 GB RAM. The script downloads from
32
+ `https://huggingface.co/antirez/deepseek-v4-gguf` and creates
33
+ `./ds4flash.gguf`.
34
+
35
+ Point the provider at the downloaded file:
36
+
37
+ ```sh
38
+ export DS4_MODEL_PATH=/path/to/ds4/ds4flash.gguf
39
+ ```
40
+
41
+ ## Agent TUI Example
42
+
43
+ Install the example dependencies:
44
+
45
+ ```sh
46
+ pnpm add @lgrammel/ds4-provider @lgrammel/agent-tui ai zod dotenv
47
+ pnpm add -D tsx typescript @types/node
48
+ ```
49
+
50
+ Create `agent.ts`:
51
+
52
+ ```ts
53
+ import "dotenv/config";
54
+
55
+ import { runAgentTUI } from "@lgrammel/agent-tui";
56
+ import { ds4 } from "@lgrammel/ds4-provider";
57
+ import { ToolLoopAgent, tool } from "ai";
58
+ import { z } from "zod";
59
+
60
+ const model = ds4({
61
+ modelId: "deepseek-v4-flash",
62
+ modelPath: process.env.DS4_MODEL_PATH ?? "./ds4flash.gguf",
63
+ contextSize: Number(process.env.DS4_CONTEXT_SIZE ?? 32768),
64
+ });
65
+
66
+ await runAgentTUI({
67
+ name: "DS4 Agent",
68
+ agent: new ToolLoopAgent({
69
+ model,
70
+ instructions: "You are a concise local coding agent.",
71
+ tools: {
72
+ localTime: tool({
73
+ description: "Get the current local time.",
74
+ inputSchema: z.object({}),
75
+ execute: () => ({ time: new Date().toLocaleString() }),
76
+ }),
77
+ },
78
+ }),
79
+ reasoning: "auto-collapsed",
80
+ contextSize: Number(process.env.DS4_CONTEXT_SIZE ?? 32768),
81
+ });
82
+ ```
83
+
84
+ Run it:
85
+
86
+ ```sh
87
+ DS4_MODEL_PATH=/path/to/ds4/ds4flash.gguf pnpm tsx agent.ts
88
+ ```
89
+
90
+ ## Credit
91
+
92
+ This package is a Node.js / AI SDK integration for
93
+ [DwarfStar 4](https://github.com/antirez/ds4), the local inference engine by
94
+ Salvatore Sanfilippo (`antirez`) for DeepSeek V4 Flash. DS4 provides the native
95
+ runtime, model format expectations, Metal/CUDA work, and GGUF download flow; this
96
+ package only wraps that engine for use from JavaScript.
package/binding.gyp ADDED
@@ -0,0 +1,75 @@
1
+ {
2
+ "targets": [
3
+ {
4
+ "target_name": "ds4_binding",
5
+ "sources": [
6
+ "native/binding.cpp",
7
+ "ds4/ds4.c"
8
+ ],
9
+ "include_dirs": [
10
+ "<!@(node -p \"require('node-addon-api').include\")",
11
+ "ds4"
12
+ ],
13
+ "dependencies": [
14
+ "<!(node -p \"require('node-addon-api').gyp\")"
15
+ ],
16
+ "defines": [
17
+ "NAPI_DISABLE_CPP_EXCEPTIONS"
18
+ ],
19
+ "cflags": [
20
+ "-O3",
21
+ "-ffast-math",
22
+ "-Wall",
23
+ "-Wextra"
24
+ ],
25
+ "cflags_cc": [
26
+ "-std=c++17",
27
+ "-O3",
28
+ "-Wall",
29
+ "-Wextra"
30
+ ],
31
+ "conditions": [
32
+ [
33
+ "OS=='mac'",
34
+ {
35
+ "sources": [
36
+ "ds4/ds4_metal.m"
37
+ ],
38
+ "xcode_settings": {
39
+ "CLANG_ENABLE_OBJC_ARC": "YES",
40
+ "OTHER_CFLAGS": [
41
+ "-O3",
42
+ "-ffast-math",
43
+ "-mcpu=native"
44
+ ],
45
+ "OTHER_CPLUSPLUSFLAGS": [
46
+ "-std=c++17"
47
+ ]
48
+ },
49
+ "libraries": [
50
+ "-framework Foundation",
51
+ "-framework Metal"
52
+ ]
53
+ }
54
+ ],
55
+ [
56
+ "OS!='mac'",
57
+ {
58
+ "defines": [
59
+ "DS4_NO_GPU",
60
+ "_GNU_SOURCE"
61
+ ],
62
+ "cflags": [
63
+ "-march=native",
64
+ "-fno-finite-math-only"
65
+ ],
66
+ "libraries": [
67
+ "-lm",
68
+ "-pthread"
69
+ ]
70
+ }
71
+ ]
72
+ ]
73
+ }
74
+ ]
75
+ }
@@ -0,0 +1,71 @@
1
+ import type { LanguageModelV4, LanguageModelV4CallOptions, LanguageModelV4Content, LanguageModelV4FinishReason, LanguageModelV4GenerateResult, LanguageModelV4Message, LanguageModelV4StreamResult, LanguageModelV4ToolCall } from "@ai-sdk/provider";
2
+ import { type ChatMessage } from "./native-binding.js";
3
+ export interface DS4ProviderSettings {
4
+ /**
5
+ * Path to a DS4-compatible GGUF model.
6
+ */
7
+ modelPath: string;
8
+ /**
9
+ * Optional MTP GGUF file path.
10
+ */
11
+ mtpPath?: string;
12
+ /**
13
+ * AI SDK model id.
14
+ *
15
+ * @default "deepseek-v4-flash"
16
+ */
17
+ modelId?: string;
18
+ contextSize?: number;
19
+ threads?: number;
20
+ backend?: "metal" | "cuda" | "cpu";
21
+ mtpDraftTokens?: number;
22
+ mtpMargin?: number;
23
+ warmWeights?: boolean;
24
+ quality?: boolean;
25
+ /**
26
+ * Show native DS4 startup logs on stderr.
27
+ *
28
+ * @default false
29
+ */
30
+ debug?: boolean;
31
+ topK?: number;
32
+ minP?: number;
33
+ seed?: number;
34
+ }
35
+ export interface DS4LanguageModelConfig extends DS4ProviderSettings {
36
+ modelId: string;
37
+ }
38
+ interface ToolParseResult {
39
+ content: LanguageModelV4Content[];
40
+ finishReason?: LanguageModelV4FinishReason;
41
+ toolCalls: LanguageModelV4ToolCall[];
42
+ toolDsml?: string;
43
+ }
44
+ export declare class DS4LanguageModel implements LanguageModelV4 {
45
+ private readonly config;
46
+ readonly specificationVersion = "v4";
47
+ readonly provider = "ds4";
48
+ readonly modelId: string;
49
+ readonly supportedUrls: {};
50
+ private readonly topK?;
51
+ private readonly minP?;
52
+ private readonly seed?;
53
+ private readonly toolReplay;
54
+ private readonly toolReplayIds;
55
+ private modelHandle;
56
+ private initPromise;
57
+ constructor(config: DS4LanguageModelConfig);
58
+ doGenerate(options: LanguageModelV4CallOptions): Promise<LanguageModelV4GenerateResult>;
59
+ doStream(options: LanguageModelV4CallOptions): Promise<LanguageModelV4StreamResult>;
60
+ dispose(): Promise<void>;
61
+ private ensureModelLoaded;
62
+ private buildGenerateOptions;
63
+ private createStream;
64
+ private runWithAbortSignal;
65
+ private convertMessages;
66
+ private rememberToolCalls;
67
+ }
68
+ export declare function convertMessages(messages: LanguageModelV4Message[], options?: Pick<LanguageModelV4CallOptions, "toolChoice" | "tools">, toolReplay?: ReadonlyMap<string, string>, toolReplayIds?: ReadonlyMap<string, string[]>): ChatMessage[];
69
+ export declare function parseGeneratedContent(text: string, initialInReasoning?: boolean): ToolParseResult;
70
+ export {};
71
+ //# sourceMappingURL=ds4-language-model.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ds4-language-model.d.ts","sourceRoot":"","sources":["../src/ds4-language-model.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,eAAe,EACf,0BAA0B,EAC1B,sBAAsB,EACtB,2BAA2B,EAC3B,6BAA6B,EAC7B,sBAAsB,EAEtB,2BAA2B,EAC3B,uBAAuB,EAGxB,MAAM,kBAAkB,CAAC;AAE1B,OAAO,EAOL,KAAK,WAAW,EAIjB,MAAM,qBAAqB,CAAC;AAE7B,MAAM,WAAW,mBAAmB;IAClC;;OAEG;IACH,SAAS,EAAE,MAAM,CAAC;IAClB;;OAEG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB;;;;OAIG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,OAAO,GAAG,MAAM,GAAG,KAAK,CAAC;IACnC,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB;;;;OAIG;IACH,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,sBAAuB,SAAQ,mBAAmB;IACjE,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,UAAU,eAAe;IACvB,OAAO,EAAE,sBAAsB,EAAE,CAAC;IAClC,YAAY,CAAC,EAAE,2BAA2B,CAAC;IAC3C,SAAS,EAAE,uBAAuB,EAAE,CAAC;IACrC,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAYD,qBAAa,gBAAiB,YAAW,eAAe;IAc1C,OAAO,CAAC,QAAQ,CAAC,MAAM;IAbnC,QAAQ,CAAC,oBAAoB,QAAQ;IACrC,QAAQ,CAAC,QAAQ,SAAS;IAC1B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,aAAa,KAAM;IAE5B,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAS;IAC/B,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAS;IAC/B,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAS;IAC/B,OAAO,CAAC,QAAQ,CAAC,UAAU,CAA6B;IACxD,OAAO,CAAC,QAAQ,CAAC,aAAa,CAA+B;IAC7D,OAAO,CAAC,WAAW,CAAuB;IAC1C,OAAO,CAAC,WAAW,CAA8B;gBAEpB,MAAM,EAAE,sBAAsB;IAOrD,UAAU,CAAC,OAAO,EAAE,0BAA0B,GAAG,OAAO,CAAC,6BAA6B,CAAC;IA0BvF,QAAQ,CAAC,OAAO,EAAE,0BAA0B,GAAG,OAAO,CAAC,2BAA2B,CAAC;IAyBnF,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;YAOhB,iBAAiB;IAgC/B,OAAO,CAAC,oBAAoB;IAkC5B,OAAO,CAAC,YAAY;YA+IN,kBAAkB;IA6ChC,OAAO,CAAC,eAAe;IAOvB,OAAO,CAAC,iBAAiB;CAa1B;AAED,wBAAgB,eAAe,CAC7B,QAAQ,EAAE,sBAAsB,EAAE,EAClC,OAAO,GAAE,IAAI,CAAC,0BAA0B,EAAE,YAAY,GAAG,OAAO,CAAM,EACtE,UAAU,CAAC,EAAE,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,EACxC,aAAa,CAAC,EAAE,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,GAC5C,WAAW,EAAE,CA4Cf;AAmGD,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,MAAM,EAAE,kBAAkB,UAAQ,GAAG,eAAe,CAsB/F"}