@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.
- package/README.md +96 -0
- package/binding.gyp +75 -0
- package/dist/ds4-language-model.d.ts +71 -0
- package/dist/ds4-language-model.d.ts.map +1 -0
- package/dist/ds4-language-model.js +888 -0
- package/dist/ds4-language-model.js.map +1 -0
- package/dist/ds4-provider.d.ts +13 -0
- package/dist/ds4-provider.d.ts.map +1 -0
- package/dist/ds4-provider.js +20 -0
- package/dist/ds4-provider.js.map +1 -0
- package/dist/index.d.ts +4 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +4 -0
- package/dist/index.js.map +1 -0
- package/dist/native-binding.d.ts +42 -0
- package/dist/native-binding.d.ts.map +1 -0
- package/dist/native-binding.js +157 -0
- package/dist/native-binding.js.map +1 -0
- package/ds4/LICENSE +22 -0
- package/ds4/ds4.c +18268 -0
- package/ds4/ds4.h +196 -0
- package/ds4/ds4_gpu.h +804 -0
- package/ds4/ds4_metal.m +14657 -0
- package/ds4/metal/argsort.metal +266 -0
- package/ds4/metal/bin.metal +192 -0
- package/ds4/metal/concat.metal +62 -0
- package/ds4/metal/cpy.metal +57 -0
- package/ds4/metal/dense.metal +1121 -0
- package/ds4/metal/dsv4_hc.metal +861 -0
- package/ds4/metal/dsv4_kv.metal +227 -0
- package/ds4/metal/dsv4_misc.metal +1088 -0
- package/ds4/metal/dsv4_rope.metal +155 -0
- package/ds4/metal/flash_attn.metal +1426 -0
- package/ds4/metal/get_rows.metal +54 -0
- package/ds4/metal/glu.metal +36 -0
- package/ds4/metal/moe.metal +1737 -0
- package/ds4/metal/norm.metal +153 -0
- package/ds4/metal/repeat.metal +52 -0
- package/ds4/metal/set_rows.metal +55 -0
- package/ds4/metal/softmax.metal +241 -0
- package/ds4/metal/sum_rows.metal +102 -0
- package/ds4/metal/unary.metal +312 -0
- package/native/binding.cpp +621 -0
- package/package.json +66 -0
- package/scripts/postinstall.cjs +13 -0
- 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"}
|