@arikusi/deepseek-mcp-server 1.0.2 → 1.1.0
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/CHANGELOG.md +142 -79
- package/LICENSE +21 -21
- package/README.md +469 -354
- package/dist/config.d.ts +42 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +63 -0
- package/dist/config.js.map +1 -0
- package/dist/cost.d.ts +24 -0
- package/dist/cost.d.ts.map +1 -0
- package/dist/cost.js +34 -0
- package/dist/cost.js.map +1 -0
- package/dist/deepseek-client.d.ts +2 -3
- package/dist/deepseek-client.d.ts.map +1 -1
- package/dist/deepseek-client.js +72 -13
- package/dist/deepseek-client.js.map +1 -1
- package/dist/index.js +517 -38
- package/dist/index.js.map +1 -1
- package/dist/schemas.d.ts +258 -0
- package/dist/schemas.d.ts.map +1 -0
- package/dist/schemas.js +56 -0
- package/dist/schemas.js.map +1 -0
- package/dist/types.d.ts +57 -1
- package/dist/types.d.ts.map +1 -1
- package/package.json +69 -63
package/dist/config.d.ts
ADDED
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Centralized Configuration
|
|
3
|
+
* Loads and validates configuration from environment variables
|
|
4
|
+
*/
|
|
5
|
+
import { z } from 'zod';
|
|
6
|
+
declare const ConfigSchema: z.ZodObject<{
|
|
7
|
+
apiKey: z.ZodString;
|
|
8
|
+
baseUrl: z.ZodDefault<z.ZodString>;
|
|
9
|
+
showCostInfo: z.ZodDefault<z.ZodBoolean>;
|
|
10
|
+
requestTimeout: z.ZodDefault<z.ZodNumber>;
|
|
11
|
+
maxRetries: z.ZodDefault<z.ZodNumber>;
|
|
12
|
+
}, "strip", z.ZodTypeAny, {
|
|
13
|
+
apiKey: string;
|
|
14
|
+
baseUrl: string;
|
|
15
|
+
showCostInfo: boolean;
|
|
16
|
+
requestTimeout: number;
|
|
17
|
+
maxRetries: number;
|
|
18
|
+
}, {
|
|
19
|
+
apiKey: string;
|
|
20
|
+
baseUrl?: string | undefined;
|
|
21
|
+
showCostInfo?: boolean | undefined;
|
|
22
|
+
requestTimeout?: number | undefined;
|
|
23
|
+
maxRetries?: number | undefined;
|
|
24
|
+
}>;
|
|
25
|
+
export type Config = z.infer<typeof ConfigSchema>;
|
|
26
|
+
/**
|
|
27
|
+
* Load configuration from environment variables.
|
|
28
|
+
* Validates with Zod and caches the result.
|
|
29
|
+
* Exits process if validation fails (e.g., missing API key).
|
|
30
|
+
*/
|
|
31
|
+
export declare function loadConfig(): Config;
|
|
32
|
+
/**
|
|
33
|
+
* Get the cached configuration.
|
|
34
|
+
* Throws if loadConfig() hasn't been called yet.
|
|
35
|
+
*/
|
|
36
|
+
export declare function getConfig(): Config;
|
|
37
|
+
/**
|
|
38
|
+
* Reset cached configuration (for testing).
|
|
39
|
+
*/
|
|
40
|
+
export declare function resetConfig(): void;
|
|
41
|
+
export {};
|
|
42
|
+
//# sourceMappingURL=config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,QAAA,MAAM,YAAY;;;;;;;;;;;;;;;;;;EAMhB,CAAC;AAEH,MAAM,MAAM,MAAM,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,YAAY,CAAC,CAAC;AAIlD;;;;GAIG;AACH,wBAAgB,UAAU,IAAI,MAAM,CA8BnC;AAED;;;GAGG;AACH,wBAAgB,SAAS,IAAI,MAAM,CAKlC;AAED;;GAEG;AACH,wBAAgB,WAAW,IAAI,IAAI,CAElC"}
|
package/dist/config.js
ADDED
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Centralized Configuration
|
|
3
|
+
* Loads and validates configuration from environment variables
|
|
4
|
+
*/
|
|
5
|
+
import { z } from 'zod';
|
|
6
|
+
const ConfigSchema = z.object({
|
|
7
|
+
apiKey: z.string().min(1, 'DEEPSEEK_API_KEY is required'),
|
|
8
|
+
baseUrl: z.string().url().default('https://api.deepseek.com'),
|
|
9
|
+
showCostInfo: z.boolean().default(true),
|
|
10
|
+
requestTimeout: z.number().positive().default(60000),
|
|
11
|
+
maxRetries: z.number().min(0).max(10).default(2),
|
|
12
|
+
});
|
|
13
|
+
let cachedConfig = null;
|
|
14
|
+
/**
|
|
15
|
+
* Load configuration from environment variables.
|
|
16
|
+
* Validates with Zod and caches the result.
|
|
17
|
+
* Exits process if validation fails (e.g., missing API key).
|
|
18
|
+
*/
|
|
19
|
+
export function loadConfig() {
|
|
20
|
+
const raw = {
|
|
21
|
+
apiKey: process.env.DEEPSEEK_API_KEY || '',
|
|
22
|
+
baseUrl: process.env.DEEPSEEK_BASE_URL || 'https://api.deepseek.com',
|
|
23
|
+
showCostInfo: process.env.SHOW_COST_INFO !== 'false',
|
|
24
|
+
requestTimeout: process.env.REQUEST_TIMEOUT
|
|
25
|
+
? parseInt(process.env.REQUEST_TIMEOUT, 10)
|
|
26
|
+
: 60000,
|
|
27
|
+
maxRetries: process.env.MAX_RETRIES
|
|
28
|
+
? parseInt(process.env.MAX_RETRIES, 10)
|
|
29
|
+
: 2,
|
|
30
|
+
};
|
|
31
|
+
const result = ConfigSchema.safeParse(raw);
|
|
32
|
+
if (!result.success) {
|
|
33
|
+
console.error('Error: Configuration validation failed');
|
|
34
|
+
const issues = result.error.issues;
|
|
35
|
+
for (const issue of issues) {
|
|
36
|
+
console.error(` - ${issue.path.join('.')}: ${issue.message}`);
|
|
37
|
+
}
|
|
38
|
+
if (!raw.apiKey) {
|
|
39
|
+
console.error('Please set your DeepSeek API key:');
|
|
40
|
+
console.error(' export DEEPSEEK_API_KEY="your-api-key-here"');
|
|
41
|
+
}
|
|
42
|
+
process.exit(1);
|
|
43
|
+
}
|
|
44
|
+
cachedConfig = result.data;
|
|
45
|
+
return cachedConfig;
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Get the cached configuration.
|
|
49
|
+
* Throws if loadConfig() hasn't been called yet.
|
|
50
|
+
*/
|
|
51
|
+
export function getConfig() {
|
|
52
|
+
if (!cachedConfig) {
|
|
53
|
+
throw new Error('Config not loaded. Call loadConfig() first.');
|
|
54
|
+
}
|
|
55
|
+
return cachedConfig;
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Reset cached configuration (for testing).
|
|
59
|
+
*/
|
|
60
|
+
export function resetConfig() {
|
|
61
|
+
cachedConfig = null;
|
|
62
|
+
}
|
|
63
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,MAAM,YAAY,GAAG,CAAC,CAAC,MAAM,CAAC;IAC5B,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,EAAE,8BAA8B,CAAC;IACzD,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,0BAA0B,CAAC;IAC7D,YAAY,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC;IACvC,cAAc,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC;IACpD,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;CACjD,CAAC,CAAC;AAIH,IAAI,YAAY,GAAkB,IAAI,CAAC;AAEvC;;;;GAIG;AACH,MAAM,UAAU,UAAU;IACxB,MAAM,GAAG,GAAG;QACV,MAAM,EAAE,OAAO,CAAC,GAAG,CAAC,gBAAgB,IAAI,EAAE;QAC1C,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,iBAAiB,IAAI,0BAA0B;QACpE,YAAY,EAAE,OAAO,CAAC,GAAG,CAAC,cAAc,KAAK,OAAO;QACpD,cAAc,EAAE,OAAO,CAAC,GAAG,CAAC,eAAe;YACzC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,eAAe,EAAE,EAAE,CAAC;YAC3C,CAAC,CAAC,KAAK;QACT,UAAU,EAAE,OAAO,CAAC,GAAG,CAAC,WAAW;YACjC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,WAAW,EAAE,EAAE,CAAC;YACvC,CAAC,CAAC,CAAC;KACN,CAAC;IAEF,MAAM,MAAM,GAAG,YAAY,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;IAE3C,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;QACpB,OAAO,CAAC,KAAK,CAAC,wCAAwC,CAAC,CAAC;QACxD,MAAM,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC;QACnC,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;YAC3B,OAAO,CAAC,KAAK,CAAC,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;QACjE,CAAC;QACD,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC;YAChB,OAAO,CAAC,KAAK,CAAC,mCAAmC,CAAC,CAAC;YACnD,OAAO,CAAC,KAAK,CAAC,+CAA+C,CAAC,CAAC;QACjE,CAAC;QACD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,YAAY,GAAG,MAAM,CAAC,IAAI,CAAC;IAC3B,OAAO,YAAY,CAAC;AACtB,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,SAAS;IACvB,IAAI,CAAC,YAAY,EAAE,CAAC;QAClB,MAAM,IAAI,KAAK,CAAC,6CAA6C,CAAC,CAAC;IACjE,CAAC;IACD,OAAO,YAAY,CAAC;AACtB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,WAAW;IACzB,YAAY,GAAG,IAAI,CAAC;AACtB,CAAC"}
|
package/dist/cost.d.ts
ADDED
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Cost Calculation Module
|
|
3
|
+
* Handles pricing and cost formatting for DeepSeek API requests
|
|
4
|
+
*/
|
|
5
|
+
/** DeepSeek pricing per 1M tokens (USD) */
|
|
6
|
+
export declare const PRICING: {
|
|
7
|
+
readonly 'deepseek-chat': {
|
|
8
|
+
readonly prompt: 0.14;
|
|
9
|
+
readonly completion: 0.28;
|
|
10
|
+
};
|
|
11
|
+
readonly 'deepseek-reasoner': {
|
|
12
|
+
readonly prompt: 0.55;
|
|
13
|
+
readonly completion: 2.19;
|
|
14
|
+
};
|
|
15
|
+
};
|
|
16
|
+
/**
|
|
17
|
+
* Calculate cost for a request based on token usage
|
|
18
|
+
*/
|
|
19
|
+
export declare function calculateCost(promptTokens: number, completionTokens: number, model: string): number;
|
|
20
|
+
/**
|
|
21
|
+
* Format cost as readable USD string
|
|
22
|
+
*/
|
|
23
|
+
export declare function formatCost(cost: number): string;
|
|
24
|
+
//# sourceMappingURL=cost.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cost.d.ts","sourceRoot":"","sources":["../src/cost.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,2CAA2C;AAC3C,eAAO,MAAM,OAAO;;;;;;;;;CASV,CAAC;AAEX;;GAEG;AACH,wBAAgB,aAAa,CAC3B,YAAY,EAAE,MAAM,EACpB,gBAAgB,EAAE,MAAM,EACxB,KAAK,EAAE,MAAM,GACZ,MAAM,CASR;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAK/C"}
|
package/dist/cost.js
ADDED
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Cost Calculation Module
|
|
3
|
+
* Handles pricing and cost formatting for DeepSeek API requests
|
|
4
|
+
*/
|
|
5
|
+
/** DeepSeek pricing per 1M tokens (USD) */
|
|
6
|
+
export const PRICING = {
|
|
7
|
+
'deepseek-chat': {
|
|
8
|
+
prompt: 0.14,
|
|
9
|
+
completion: 0.28,
|
|
10
|
+
},
|
|
11
|
+
'deepseek-reasoner': {
|
|
12
|
+
prompt: 0.55,
|
|
13
|
+
completion: 2.19,
|
|
14
|
+
},
|
|
15
|
+
};
|
|
16
|
+
/**
|
|
17
|
+
* Calculate cost for a request based on token usage
|
|
18
|
+
*/
|
|
19
|
+
export function calculateCost(promptTokens, completionTokens, model) {
|
|
20
|
+
const modelPricing = PRICING[model] || PRICING['deepseek-chat'];
|
|
21
|
+
const promptCost = (promptTokens / 1_000_000) * modelPricing.prompt;
|
|
22
|
+
const completionCost = (completionTokens / 1_000_000) * modelPricing.completion;
|
|
23
|
+
return promptCost + completionCost;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Format cost as readable USD string
|
|
27
|
+
*/
|
|
28
|
+
export function formatCost(cost) {
|
|
29
|
+
if (cost < 0.01) {
|
|
30
|
+
return `$${cost.toFixed(4)}`;
|
|
31
|
+
}
|
|
32
|
+
return `$${cost.toFixed(2)}`;
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=cost.js.map
|
package/dist/cost.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cost.js","sourceRoot":"","sources":["../src/cost.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,2CAA2C;AAC3C,MAAM,CAAC,MAAM,OAAO,GAAG;IACrB,eAAe,EAAE;QACf,MAAM,EAAE,IAAI;QACZ,UAAU,EAAE,IAAI;KACjB;IACD,mBAAmB,EAAE;QACnB,MAAM,EAAE,IAAI;QACZ,UAAU,EAAE,IAAI;KACjB;CACO,CAAC;AAEX;;GAEG;AACH,MAAM,UAAU,aAAa,CAC3B,YAAoB,EACpB,gBAAwB,EACxB,KAAa;IAEb,MAAM,YAAY,GAChB,OAAO,CAAC,KAA6B,CAAC,IAAI,OAAO,CAAC,eAAe,CAAC,CAAC;IAErE,MAAM,UAAU,GAAG,CAAC,YAAY,GAAG,SAAS,CAAC,GAAG,YAAY,CAAC,MAAM,CAAC;IACpE,MAAM,cAAc,GAClB,CAAC,gBAAgB,GAAG,SAAS,CAAC,GAAG,YAAY,CAAC,UAAU,CAAC;IAE3D,OAAO,UAAU,GAAG,cAAc,CAAC;AACrC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,UAAU,CAAC,IAAY;IACrC,IAAI,IAAI,GAAG,IAAI,EAAE,CAAC;QAChB,OAAO,IAAI,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC;IAC/B,CAAC;IACD,OAAO,IAAI,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC;AAC/B,CAAC"}
|
|
@@ -5,15 +5,14 @@
|
|
|
5
5
|
import type { ChatCompletionParams, ChatCompletionResponse } from './types.js';
|
|
6
6
|
export declare class DeepSeekClient {
|
|
7
7
|
private client;
|
|
8
|
-
|
|
9
|
-
constructor(apiKey: string);
|
|
8
|
+
constructor();
|
|
10
9
|
/**
|
|
11
10
|
* Create a chat completion (non-streaming)
|
|
12
11
|
*/
|
|
13
12
|
createChatCompletion(params: ChatCompletionParams): Promise<ChatCompletionResponse>;
|
|
14
13
|
/**
|
|
15
14
|
* Create a streaming chat completion
|
|
16
|
-
* Returns the full text after streaming completes
|
|
15
|
+
* Returns the full text after streaming completes (buffered)
|
|
17
16
|
*/
|
|
18
17
|
createStreamingChatCompletion(params: ChatCompletionParams): Promise<ChatCompletionResponse>;
|
|
19
18
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"deepseek-client.d.ts","sourceRoot":"","sources":["../src/deepseek-client.ts"],"names":[],"mappings":"AAAA;;;GAGG;
|
|
1
|
+
{"version":3,"file":"deepseek-client.d.ts","sourceRoot":"","sources":["../src/deepseek-client.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,OAAO,KAAK,EACV,oBAAoB,EACpB,sBAAsB,EAEvB,MAAM,YAAY,CAAC;AAEpB,qBAAa,cAAc;IACzB,OAAO,CAAC,MAAM,CAAS;;IAavB;;OAEG;IACG,oBAAoB,CACxB,MAAM,EAAE,oBAAoB,GAC3B,OAAO,CAAC,sBAAsB,CAAC;IAkElC;;;OAGG;IACG,6BAA6B,CACjC,MAAM,EAAE,oBAAoB,GAC3B,OAAO,CAAC,sBAAsB,CAAC;IAyHlC;;OAEG;IACG,cAAc,IAAI,OAAO,CAAC,OAAO,CAAC;CAazC"}
|
package/dist/deepseek-client.js
CHANGED
|
@@ -3,16 +3,16 @@
|
|
|
3
3
|
* Wrapper around OpenAI SDK for DeepSeek API
|
|
4
4
|
*/
|
|
5
5
|
import OpenAI from 'openai';
|
|
6
|
+
import { getConfig } from './config.js';
|
|
6
7
|
export class DeepSeekClient {
|
|
7
8
|
client;
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
if (!apiKey) {
|
|
11
|
-
throw new Error('DeepSeek API key is required');
|
|
12
|
-
}
|
|
9
|
+
constructor() {
|
|
10
|
+
const config = getConfig();
|
|
13
11
|
this.client = new OpenAI({
|
|
14
|
-
apiKey,
|
|
15
|
-
baseURL:
|
|
12
|
+
apiKey: config.apiKey,
|
|
13
|
+
baseURL: config.baseUrl,
|
|
14
|
+
timeout: config.requestTimeout,
|
|
15
|
+
maxRetries: config.maxRetries,
|
|
16
16
|
});
|
|
17
17
|
}
|
|
18
18
|
/**
|
|
@@ -20,7 +20,9 @@ export class DeepSeekClient {
|
|
|
20
20
|
*/
|
|
21
21
|
async createChatCompletion(params) {
|
|
22
22
|
try {
|
|
23
|
-
|
|
23
|
+
// Build request params - using 'any' for OpenAI SDK compatibility
|
|
24
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
25
|
+
const requestParams = {
|
|
24
26
|
model: params.model,
|
|
25
27
|
messages: params.messages,
|
|
26
28
|
temperature: params.temperature ?? 1.0,
|
|
@@ -30,7 +32,14 @@ export class DeepSeekClient {
|
|
|
30
32
|
presence_penalty: params.presence_penalty,
|
|
31
33
|
stop: params.stop,
|
|
32
34
|
stream: false,
|
|
33
|
-
}
|
|
35
|
+
};
|
|
36
|
+
if (params.tools?.length) {
|
|
37
|
+
requestParams.tools = params.tools;
|
|
38
|
+
}
|
|
39
|
+
if (params.tool_choice !== undefined) {
|
|
40
|
+
requestParams.tool_choice = params.tool_choice;
|
|
41
|
+
}
|
|
42
|
+
const response = await this.client.chat.completions.create(requestParams);
|
|
34
43
|
const choice = response.choices[0];
|
|
35
44
|
if (!choice) {
|
|
36
45
|
throw new Error('No response from DeepSeek API');
|
|
@@ -39,6 +48,15 @@ export class DeepSeekClient {
|
|
|
39
48
|
const reasoning_content = 'reasoning_content' in choice.message
|
|
40
49
|
? choice.message.reasoning_content
|
|
41
50
|
: undefined;
|
|
51
|
+
// Extract tool_calls if present
|
|
52
|
+
const tool_calls = choice.message.tool_calls?.map((tc) => ({
|
|
53
|
+
id: tc.id,
|
|
54
|
+
type: 'function',
|
|
55
|
+
function: {
|
|
56
|
+
name: tc.function.name,
|
|
57
|
+
arguments: tc.function.arguments,
|
|
58
|
+
},
|
|
59
|
+
}));
|
|
42
60
|
return {
|
|
43
61
|
content: choice.message.content || '',
|
|
44
62
|
reasoning_content,
|
|
@@ -49,6 +67,7 @@ export class DeepSeekClient {
|
|
|
49
67
|
total_tokens: response.usage?.total_tokens || 0,
|
|
50
68
|
},
|
|
51
69
|
finish_reason: choice.finish_reason || 'stop',
|
|
70
|
+
tool_calls: tool_calls?.length ? tool_calls : undefined,
|
|
52
71
|
};
|
|
53
72
|
}
|
|
54
73
|
catch (error) {
|
|
@@ -58,11 +77,13 @@ export class DeepSeekClient {
|
|
|
58
77
|
}
|
|
59
78
|
/**
|
|
60
79
|
* Create a streaming chat completion
|
|
61
|
-
* Returns the full text after streaming completes
|
|
80
|
+
* Returns the full text after streaming completes (buffered)
|
|
62
81
|
*/
|
|
63
82
|
async createStreamingChatCompletion(params) {
|
|
64
83
|
try {
|
|
65
|
-
|
|
84
|
+
// Build request params - using 'any' for OpenAI SDK compatibility
|
|
85
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
86
|
+
const requestParams = {
|
|
66
87
|
model: params.model,
|
|
67
88
|
messages: params.messages,
|
|
68
89
|
temperature: params.temperature ?? 1.0,
|
|
@@ -72,7 +93,14 @@ export class DeepSeekClient {
|
|
|
72
93
|
presence_penalty: params.presence_penalty,
|
|
73
94
|
stop: params.stop,
|
|
74
95
|
stream: true,
|
|
75
|
-
}
|
|
96
|
+
};
|
|
97
|
+
if (params.tools?.length) {
|
|
98
|
+
requestParams.tools = params.tools;
|
|
99
|
+
}
|
|
100
|
+
if (params.tool_choice !== undefined) {
|
|
101
|
+
requestParams.tool_choice = params.tool_choice;
|
|
102
|
+
}
|
|
103
|
+
const stream = await this.client.chat.completions.create(requestParams);
|
|
76
104
|
let fullContent = '';
|
|
77
105
|
let reasoningContent = '';
|
|
78
106
|
let modelName = params.model;
|
|
@@ -82,6 +110,8 @@ export class DeepSeekClient {
|
|
|
82
110
|
completion_tokens: 0,
|
|
83
111
|
total_tokens: 0,
|
|
84
112
|
};
|
|
113
|
+
// Tool calls accumulation (index-based)
|
|
114
|
+
const toolCallsMap = new Map();
|
|
85
115
|
// Collect all chunks
|
|
86
116
|
for await (const chunk of stream) {
|
|
87
117
|
const choice = chunk.choices[0];
|
|
@@ -92,9 +122,31 @@ export class DeepSeekClient {
|
|
|
92
122
|
fullContent += choice.delta.content;
|
|
93
123
|
}
|
|
94
124
|
// Collect reasoning content (for deepseek-reasoner)
|
|
95
|
-
if ('reasoning_content' in choice.delta) {
|
|
125
|
+
if ('reasoning_content' in (choice.delta || {})) {
|
|
96
126
|
reasoningContent += choice.delta.reasoning_content || '';
|
|
97
127
|
}
|
|
128
|
+
// Accumulate tool_calls deltas
|
|
129
|
+
if (choice.delta?.tool_calls) {
|
|
130
|
+
for (const tc of choice.delta.tool_calls) {
|
|
131
|
+
const existing = toolCallsMap.get(tc.index);
|
|
132
|
+
if (existing) {
|
|
133
|
+
if (tc.function?.name)
|
|
134
|
+
existing.function.name += tc.function.name;
|
|
135
|
+
if (tc.function?.arguments)
|
|
136
|
+
existing.function.arguments += tc.function.arguments;
|
|
137
|
+
}
|
|
138
|
+
else {
|
|
139
|
+
toolCallsMap.set(tc.index, {
|
|
140
|
+
id: tc.id || '',
|
|
141
|
+
type: 'function',
|
|
142
|
+
function: {
|
|
143
|
+
name: tc.function?.name || '',
|
|
144
|
+
arguments: tc.function?.arguments || '',
|
|
145
|
+
},
|
|
146
|
+
});
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
}
|
|
98
150
|
// Get finish reason
|
|
99
151
|
if (choice.finish_reason) {
|
|
100
152
|
finishReason = choice.finish_reason;
|
|
@@ -108,12 +160,19 @@ export class DeepSeekClient {
|
|
|
108
160
|
usage = chunk.usage;
|
|
109
161
|
}
|
|
110
162
|
}
|
|
163
|
+
// Convert tool calls map to sorted array
|
|
164
|
+
const toolCalls = toolCallsMap.size > 0
|
|
165
|
+
? Array.from(toolCallsMap.entries())
|
|
166
|
+
.sort(([a], [b]) => a - b)
|
|
167
|
+
.map(([, tc]) => tc)
|
|
168
|
+
: undefined;
|
|
111
169
|
return {
|
|
112
170
|
content: fullContent,
|
|
113
171
|
reasoning_content: reasoningContent || undefined,
|
|
114
172
|
model: modelName,
|
|
115
173
|
usage,
|
|
116
174
|
finish_reason: finishReason,
|
|
175
|
+
tool_calls: toolCalls,
|
|
117
176
|
};
|
|
118
177
|
}
|
|
119
178
|
catch (error) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"deepseek-client.js","sourceRoot":"","sources":["../src/deepseek-client.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,MAAM,MAAM,QAAQ,CAAC;
|
|
1
|
+
{"version":3,"file":"deepseek-client.js","sourceRoot":"","sources":["../src/deepseek-client.ts"],"names":[],"mappings":"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"}
|