@ai-sdk/deepseek 0.1.0 → 0.1.2
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 +22 -0
- package/dist/index.d.mts +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +59 -3
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +57 -1
- package/dist/index.mjs.map +1 -1
- package/package.json +4 -4
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,27 @@
|
|
|
1
1
|
# @ai-sdk/deepseek
|
|
2
2
|
|
|
3
|
+
## 0.1.2
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- ed012d2: feat (provider/deepseek): extract cache usage as provide metadata
|
|
8
|
+
- Updated dependencies [ed012d2]
|
|
9
|
+
- Updated dependencies [3a58a2e]
|
|
10
|
+
- @ai-sdk/openai-compatible@0.1.2
|
|
11
|
+
- @ai-sdk/provider-utils@2.1.2
|
|
12
|
+
- @ai-sdk/provider@1.0.6
|
|
13
|
+
|
|
14
|
+
## 0.1.1
|
|
15
|
+
|
|
16
|
+
### Patch Changes
|
|
17
|
+
|
|
18
|
+
- 0a699f1: feat: add reasoning token support
|
|
19
|
+
- Updated dependencies [e7a9ec9]
|
|
20
|
+
- Updated dependencies [0a699f1]
|
|
21
|
+
- @ai-sdk/provider-utils@2.1.1
|
|
22
|
+
- @ai-sdk/openai-compatible@0.1.1
|
|
23
|
+
- @ai-sdk/provider@1.0.5
|
|
24
|
+
|
|
3
25
|
## 0.1.0
|
|
4
26
|
|
|
5
27
|
### Minor Changes
|
package/dist/index.d.mts
CHANGED
|
@@ -3,7 +3,7 @@ import { FetchFunction } from '@ai-sdk/provider-utils';
|
|
|
3
3
|
import { OpenAICompatibleChatSettings } from '@ai-sdk/openai-compatible';
|
|
4
4
|
export { OpenAICompatibleErrorData as DeepSeekErrorData } from '@ai-sdk/openai-compatible';
|
|
5
5
|
|
|
6
|
-
type DeepSeekChatModelId = 'deepseek-chat' | (string & {});
|
|
6
|
+
type DeepSeekChatModelId = 'deepseek-chat' | 'deepseek-reasoner' | (string & {});
|
|
7
7
|
interface DeepSeekChatSettings extends OpenAICompatibleChatSettings {
|
|
8
8
|
}
|
|
9
9
|
|
package/dist/index.d.ts
CHANGED
|
@@ -3,7 +3,7 @@ import { FetchFunction } from '@ai-sdk/provider-utils';
|
|
|
3
3
|
import { OpenAICompatibleChatSettings } from '@ai-sdk/openai-compatible';
|
|
4
4
|
export { OpenAICompatibleErrorData as DeepSeekErrorData } from '@ai-sdk/openai-compatible';
|
|
5
5
|
|
|
6
|
-
type DeepSeekChatModelId = 'deepseek-chat' | (string & {});
|
|
6
|
+
type DeepSeekChatModelId = 'deepseek-chat' | 'deepseek-reasoner' | (string & {});
|
|
7
7
|
interface DeepSeekChatSettings extends OpenAICompatibleChatSettings {
|
|
8
8
|
}
|
|
9
9
|
|
package/dist/index.js
CHANGED
|
@@ -28,14 +28,69 @@ module.exports = __toCommonJS(src_exports);
|
|
|
28
28
|
// src/deepseek-provider.ts
|
|
29
29
|
var import_openai_compatible = require("@ai-sdk/openai-compatible");
|
|
30
30
|
var import_provider = require("@ai-sdk/provider");
|
|
31
|
+
var import_provider_utils2 = require("@ai-sdk/provider-utils");
|
|
32
|
+
|
|
33
|
+
// src/deepseek-metadata-extractor.ts
|
|
31
34
|
var import_provider_utils = require("@ai-sdk/provider-utils");
|
|
35
|
+
var import_zod = require("zod");
|
|
36
|
+
var buildDeepseekMetadata = (usage) => {
|
|
37
|
+
var _a, _b;
|
|
38
|
+
return usage == null ? void 0 : {
|
|
39
|
+
deepseek: {
|
|
40
|
+
promptCacheHitTokens: (_a = usage.prompt_cache_hit_tokens) != null ? _a : NaN,
|
|
41
|
+
promptCacheMissTokens: (_b = usage.prompt_cache_miss_tokens) != null ? _b : NaN
|
|
42
|
+
}
|
|
43
|
+
};
|
|
44
|
+
};
|
|
45
|
+
var deepSeekMetadataExtractor = {
|
|
46
|
+
extractMetadata: ({ parsedBody }) => {
|
|
47
|
+
const parsed = (0, import_provider_utils.safeValidateTypes)({
|
|
48
|
+
value: parsedBody,
|
|
49
|
+
schema: deepSeekResponseSchema
|
|
50
|
+
});
|
|
51
|
+
return !parsed.success || parsed.value.usage == null ? void 0 : buildDeepseekMetadata(parsed.value.usage);
|
|
52
|
+
},
|
|
53
|
+
createStreamExtractor: () => {
|
|
54
|
+
let usage;
|
|
55
|
+
return {
|
|
56
|
+
processChunk: (chunk) => {
|
|
57
|
+
var _a, _b;
|
|
58
|
+
const parsed = (0, import_provider_utils.safeValidateTypes)({
|
|
59
|
+
value: chunk,
|
|
60
|
+
schema: deepSeekStreamChunkSchema
|
|
61
|
+
});
|
|
62
|
+
if (parsed.success && ((_b = (_a = parsed.value.choices) == null ? void 0 : _a[0]) == null ? void 0 : _b.finish_reason) === "stop" && parsed.value.usage) {
|
|
63
|
+
usage = parsed.value.usage;
|
|
64
|
+
}
|
|
65
|
+
},
|
|
66
|
+
buildMetadata: () => buildDeepseekMetadata(usage)
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
};
|
|
70
|
+
var deepSeekUsageSchema = import_zod.z.object({
|
|
71
|
+
prompt_cache_hit_tokens: import_zod.z.number().nullish(),
|
|
72
|
+
prompt_cache_miss_tokens: import_zod.z.number().nullish()
|
|
73
|
+
});
|
|
74
|
+
var deepSeekResponseSchema = import_zod.z.object({
|
|
75
|
+
usage: deepSeekUsageSchema.nullish()
|
|
76
|
+
});
|
|
77
|
+
var deepSeekStreamChunkSchema = import_zod.z.object({
|
|
78
|
+
choices: import_zod.z.array(
|
|
79
|
+
import_zod.z.object({
|
|
80
|
+
finish_reason: import_zod.z.string().nullish()
|
|
81
|
+
})
|
|
82
|
+
).nullish(),
|
|
83
|
+
usage: deepSeekUsageSchema.nullish()
|
|
84
|
+
});
|
|
85
|
+
|
|
86
|
+
// src/deepseek-provider.ts
|
|
32
87
|
function createDeepSeek(options = {}) {
|
|
33
88
|
var _a;
|
|
34
|
-
const baseURL = (0,
|
|
89
|
+
const baseURL = (0, import_provider_utils2.withoutTrailingSlash)(
|
|
35
90
|
(_a = options.baseURL) != null ? _a : "https://api.deepseek.com/v1"
|
|
36
91
|
);
|
|
37
92
|
const getHeaders = () => ({
|
|
38
|
-
Authorization: `Bearer ${(0,
|
|
93
|
+
Authorization: `Bearer ${(0, import_provider_utils2.loadApiKey)({
|
|
39
94
|
apiKey: options.apiKey,
|
|
40
95
|
environmentVariableName: "DEEPSEEK_API_KEY",
|
|
41
96
|
description: "DeepSeek API key"
|
|
@@ -48,7 +103,8 @@ function createDeepSeek(options = {}) {
|
|
|
48
103
|
url: ({ path }) => `${baseURL}${path}`,
|
|
49
104
|
headers: getHeaders,
|
|
50
105
|
fetch: options.fetch,
|
|
51
|
-
defaultObjectGenerationMode: "json"
|
|
106
|
+
defaultObjectGenerationMode: "json",
|
|
107
|
+
metadataExtractor: deepSeekMetadataExtractor
|
|
52
108
|
});
|
|
53
109
|
};
|
|
54
110
|
const provider = (modelId, settings) => createLanguageModel(modelId, settings);
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/deepseek-provider.ts"],"sourcesContent":["export { createDeepSeek, deepseek } from './deepseek-provider';\nexport type {\n DeepSeekProvider,\n DeepSeekProviderSettings,\n} from './deepseek-provider';\nexport type { OpenAICompatibleErrorData as DeepSeekErrorData } from '@ai-sdk/openai-compatible';\n","import { OpenAICompatibleChatLanguageModel } from '@ai-sdk/openai-compatible';\nimport {\n LanguageModelV1,\n NoSuchModelError,\n ProviderV1,\n} from '@ai-sdk/provider';\nimport {\n FetchFunction,\n loadApiKey,\n withoutTrailingSlash,\n} from '@ai-sdk/provider-utils';\nimport {\n DeepSeekChatModelId,\n DeepSeekChatSettings,\n} from './deepseek-chat-settings';\n\nexport interface DeepSeekProviderSettings {\n /**\nDeepSeek API key.\n*/\n apiKey?: string;\n /**\nBase URL for the API calls.\n*/\n baseURL?: string;\n /**\nCustom headers to include in the requests.\n*/\n headers?: Record<string, string>;\n /**\nCustom fetch implementation. You can use it as a middleware to intercept requests,\nor to provide a custom fetch implementation for e.g. testing.\n*/\n fetch?: FetchFunction;\n}\n\nexport interface DeepSeekProvider extends ProviderV1 {\n /**\nCreates a DeepSeek model for text generation.\n*/\n (\n modelId: DeepSeekChatModelId,\n settings?: DeepSeekChatSettings,\n ): LanguageModelV1;\n\n /**\nCreates a DeepSeek model for text generation.\n*/\n languageModel(\n modelId: DeepSeekChatModelId,\n settings?: DeepSeekChatSettings,\n ): LanguageModelV1;\n\n /**\nCreates a DeepSeek chat model for text generation.\n*/\n chat(\n modelId: DeepSeekChatModelId,\n settings?: DeepSeekChatSettings,\n ): LanguageModelV1;\n}\n\nexport function createDeepSeek(\n options: DeepSeekProviderSettings = {},\n): DeepSeekProvider {\n const baseURL = withoutTrailingSlash(\n options.baseURL ?? 'https://api.deepseek.com/v1',\n );\n const getHeaders = () => ({\n Authorization: `Bearer ${loadApiKey({\n apiKey: options.apiKey,\n environmentVariableName: 'DEEPSEEK_API_KEY',\n description: 'DeepSeek API key',\n })}`,\n ...options.headers,\n });\n\n const createLanguageModel = (\n modelId: DeepSeekChatModelId,\n settings: DeepSeekChatSettings = {},\n ) => {\n return new OpenAICompatibleChatLanguageModel(modelId, settings, {\n provider: `deepseek.chat`,\n url: ({ path }) => `${baseURL}${path}`,\n headers: getHeaders,\n fetch: options.fetch,\n defaultObjectGenerationMode: 'json',\n });\n };\n\n const provider = (\n modelId: DeepSeekChatModelId,\n settings?: DeepSeekChatSettings,\n ) => createLanguageModel(modelId, settings);\n\n provider.languageModel = createLanguageModel;\n provider.chat = createLanguageModel;\n provider.textEmbeddingModel = (modelId: string) => {\n throw new NoSuchModelError({ modelId, modelType: 'textEmbeddingModel' });\n };\n\n return provider as DeepSeekProvider;\n}\n\nexport const deepseek = createDeepSeek();\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACAA,+BAAkD;AAClD,sBAIO;AACP,
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/deepseek-provider.ts","../src/deepseek-metadata-extractor.ts"],"sourcesContent":["export { createDeepSeek, deepseek } from './deepseek-provider';\nexport type {\n DeepSeekProvider,\n DeepSeekProviderSettings,\n} from './deepseek-provider';\nexport type { OpenAICompatibleErrorData as DeepSeekErrorData } from '@ai-sdk/openai-compatible';\n","import { OpenAICompatibleChatLanguageModel } from '@ai-sdk/openai-compatible';\nimport {\n LanguageModelV1,\n NoSuchModelError,\n ProviderV1,\n} from '@ai-sdk/provider';\nimport {\n FetchFunction,\n loadApiKey,\n withoutTrailingSlash,\n} from '@ai-sdk/provider-utils';\nimport {\n DeepSeekChatModelId,\n DeepSeekChatSettings,\n} from './deepseek-chat-settings';\nimport { deepSeekMetadataExtractor } from './deepseek-metadata-extractor';\n\nexport interface DeepSeekProviderSettings {\n /**\nDeepSeek API key.\n*/\n apiKey?: string;\n /**\nBase URL for the API calls.\n*/\n baseURL?: string;\n /**\nCustom headers to include in the requests.\n*/\n headers?: Record<string, string>;\n /**\nCustom fetch implementation. You can use it as a middleware to intercept requests,\nor to provide a custom fetch implementation for e.g. testing.\n*/\n fetch?: FetchFunction;\n}\n\nexport interface DeepSeekProvider extends ProviderV1 {\n /**\nCreates a DeepSeek model for text generation.\n*/\n (\n modelId: DeepSeekChatModelId,\n settings?: DeepSeekChatSettings,\n ): LanguageModelV1;\n\n /**\nCreates a DeepSeek model for text generation.\n*/\n languageModel(\n modelId: DeepSeekChatModelId,\n settings?: DeepSeekChatSettings,\n ): LanguageModelV1;\n\n /**\nCreates a DeepSeek chat model for text generation.\n*/\n chat(\n modelId: DeepSeekChatModelId,\n settings?: DeepSeekChatSettings,\n ): LanguageModelV1;\n}\n\nexport function createDeepSeek(\n options: DeepSeekProviderSettings = {},\n): DeepSeekProvider {\n const baseURL = withoutTrailingSlash(\n options.baseURL ?? 'https://api.deepseek.com/v1',\n );\n const getHeaders = () => ({\n Authorization: `Bearer ${loadApiKey({\n apiKey: options.apiKey,\n environmentVariableName: 'DEEPSEEK_API_KEY',\n description: 'DeepSeek API key',\n })}`,\n ...options.headers,\n });\n\n const createLanguageModel = (\n modelId: DeepSeekChatModelId,\n settings: DeepSeekChatSettings = {},\n ) => {\n return new OpenAICompatibleChatLanguageModel(modelId, settings, {\n provider: `deepseek.chat`,\n url: ({ path }) => `${baseURL}${path}`,\n headers: getHeaders,\n fetch: options.fetch,\n defaultObjectGenerationMode: 'json',\n metadataExtractor: deepSeekMetadataExtractor,\n });\n };\n\n const provider = (\n modelId: DeepSeekChatModelId,\n settings?: DeepSeekChatSettings,\n ) => createLanguageModel(modelId, settings);\n\n provider.languageModel = createLanguageModel;\n provider.chat = createLanguageModel;\n provider.textEmbeddingModel = (modelId: string) => {\n throw new NoSuchModelError({ modelId, modelType: 'textEmbeddingModel' });\n };\n\n return provider as DeepSeekProvider;\n}\n\nexport const deepseek = createDeepSeek();\n","import { MetadataExtractor } from '@ai-sdk/openai-compatible';\nimport { safeValidateTypes } from '@ai-sdk/provider-utils';\nimport { z } from 'zod';\n\nconst buildDeepseekMetadata = (\n usage: z.infer<typeof deepSeekUsageSchema> | undefined,\n) => {\n return usage == null\n ? undefined\n : {\n deepseek: {\n promptCacheHitTokens: usage.prompt_cache_hit_tokens ?? NaN,\n promptCacheMissTokens: usage.prompt_cache_miss_tokens ?? NaN,\n },\n };\n};\n\nexport const deepSeekMetadataExtractor: MetadataExtractor = {\n extractMetadata: ({ parsedBody }: { parsedBody: unknown }) => {\n const parsed = safeValidateTypes({\n value: parsedBody,\n schema: deepSeekResponseSchema,\n });\n\n return !parsed.success || parsed.value.usage == null\n ? undefined\n : buildDeepseekMetadata(parsed.value.usage);\n },\n\n createStreamExtractor: () => {\n let usage: z.infer<typeof deepSeekUsageSchema> | undefined;\n\n return {\n processChunk: (chunk: unknown) => {\n const parsed = safeValidateTypes({\n value: chunk,\n schema: deepSeekStreamChunkSchema,\n });\n\n if (\n parsed.success &&\n parsed.value.choices?.[0]?.finish_reason === 'stop' &&\n parsed.value.usage\n ) {\n usage = parsed.value.usage;\n }\n },\n buildMetadata: () => buildDeepseekMetadata(usage),\n };\n },\n};\n\nconst deepSeekUsageSchema = z.object({\n prompt_cache_hit_tokens: z.number().nullish(),\n prompt_cache_miss_tokens: z.number().nullish(),\n});\n\nconst deepSeekResponseSchema = z.object({\n usage: deepSeekUsageSchema.nullish(),\n});\n\nconst deepSeekStreamChunkSchema = z.object({\n choices: z\n .array(\n z.object({\n finish_reason: z.string().nullish(),\n }),\n )\n .nullish(),\n usage: deepSeekUsageSchema.nullish(),\n});\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACAA,+BAAkD;AAClD,sBAIO;AACP,IAAAA,yBAIO;;;ACTP,4BAAkC;AAClC,iBAAkB;AAElB,IAAM,wBAAwB,CAC5B,UACG;AANL;AAOE,SAAO,SAAS,OACZ,SACA;AAAA,IACE,UAAU;AAAA,MACR,uBAAsB,WAAM,4BAAN,YAAiC;AAAA,MACvD,wBAAuB,WAAM,6BAAN,YAAkC;AAAA,IAC3D;AAAA,EACF;AACN;AAEO,IAAM,4BAA+C;AAAA,EAC1D,iBAAiB,CAAC,EAAE,WAAW,MAA+B;AAC5D,UAAM,aAAS,yCAAkB;AAAA,MAC/B,OAAO;AAAA,MACP,QAAQ;AAAA,IACV,CAAC;AAED,WAAO,CAAC,OAAO,WAAW,OAAO,MAAM,SAAS,OAC5C,SACA,sBAAsB,OAAO,MAAM,KAAK;AAAA,EAC9C;AAAA,EAEA,uBAAuB,MAAM;AAC3B,QAAI;AAEJ,WAAO;AAAA,MACL,cAAc,CAAC,UAAmB;AAjCxC;AAkCQ,cAAM,aAAS,yCAAkB;AAAA,UAC/B,OAAO;AAAA,UACP,QAAQ;AAAA,QACV,CAAC;AAED,YACE,OAAO,aACP,kBAAO,MAAM,YAAb,mBAAuB,OAAvB,mBAA2B,mBAAkB,UAC7C,OAAO,MAAM,OACb;AACA,kBAAQ,OAAO,MAAM;AAAA,QACvB;AAAA,MACF;AAAA,MACA,eAAe,MAAM,sBAAsB,KAAK;AAAA,IAClD;AAAA,EACF;AACF;AAEA,IAAM,sBAAsB,aAAE,OAAO;AAAA,EACnC,yBAAyB,aAAE,OAAO,EAAE,QAAQ;AAAA,EAC5C,0BAA0B,aAAE,OAAO,EAAE,QAAQ;AAC/C,CAAC;AAED,IAAM,yBAAyB,aAAE,OAAO;AAAA,EACtC,OAAO,oBAAoB,QAAQ;AACrC,CAAC;AAED,IAAM,4BAA4B,aAAE,OAAO;AAAA,EACzC,SAAS,aACN;AAAA,IACC,aAAE,OAAO;AAAA,MACP,eAAe,aAAE,OAAO,EAAE,QAAQ;AAAA,IACpC,CAAC;AAAA,EACH,EACC,QAAQ;AAAA,EACX,OAAO,oBAAoB,QAAQ;AACrC,CAAC;;;ADPM,SAAS,eACd,UAAoC,CAAC,GACnB;AAjEpB;AAkEE,QAAM,cAAU;AAAA,KACd,aAAQ,YAAR,YAAmB;AAAA,EACrB;AACA,QAAM,aAAa,OAAO;AAAA,IACxB,eAAe,cAAU,mCAAW;AAAA,MAClC,QAAQ,QAAQ;AAAA,MAChB,yBAAyB;AAAA,MACzB,aAAa;AAAA,IACf,CAAC,CAAC;AAAA,IACF,GAAG,QAAQ;AAAA,EACb;AAEA,QAAM,sBAAsB,CAC1B,SACA,WAAiC,CAAC,MAC/B;AACH,WAAO,IAAI,2DAAkC,SAAS,UAAU;AAAA,MAC9D,UAAU;AAAA,MACV,KAAK,CAAC,EAAE,KAAK,MAAM,GAAG,OAAO,GAAG,IAAI;AAAA,MACpC,SAAS;AAAA,MACT,OAAO,QAAQ;AAAA,MACf,6BAA6B;AAAA,MAC7B,mBAAmB;AAAA,IACrB,CAAC;AAAA,EACH;AAEA,QAAM,WAAW,CACf,SACA,aACG,oBAAoB,SAAS,QAAQ;AAE1C,WAAS,gBAAgB;AACzB,WAAS,OAAO;AAChB,WAAS,qBAAqB,CAAC,YAAoB;AACjD,UAAM,IAAI,iCAAiB,EAAE,SAAS,WAAW,qBAAqB,CAAC;AAAA,EACzE;AAEA,SAAO;AACT;AAEO,IAAM,WAAW,eAAe;","names":["import_provider_utils"]}
|
package/dist/index.mjs
CHANGED
|
@@ -7,6 +7,61 @@ import {
|
|
|
7
7
|
loadApiKey,
|
|
8
8
|
withoutTrailingSlash
|
|
9
9
|
} from "@ai-sdk/provider-utils";
|
|
10
|
+
|
|
11
|
+
// src/deepseek-metadata-extractor.ts
|
|
12
|
+
import { safeValidateTypes } from "@ai-sdk/provider-utils";
|
|
13
|
+
import { z } from "zod";
|
|
14
|
+
var buildDeepseekMetadata = (usage) => {
|
|
15
|
+
var _a, _b;
|
|
16
|
+
return usage == null ? void 0 : {
|
|
17
|
+
deepseek: {
|
|
18
|
+
promptCacheHitTokens: (_a = usage.prompt_cache_hit_tokens) != null ? _a : NaN,
|
|
19
|
+
promptCacheMissTokens: (_b = usage.prompt_cache_miss_tokens) != null ? _b : NaN
|
|
20
|
+
}
|
|
21
|
+
};
|
|
22
|
+
};
|
|
23
|
+
var deepSeekMetadataExtractor = {
|
|
24
|
+
extractMetadata: ({ parsedBody }) => {
|
|
25
|
+
const parsed = safeValidateTypes({
|
|
26
|
+
value: parsedBody,
|
|
27
|
+
schema: deepSeekResponseSchema
|
|
28
|
+
});
|
|
29
|
+
return !parsed.success || parsed.value.usage == null ? void 0 : buildDeepseekMetadata(parsed.value.usage);
|
|
30
|
+
},
|
|
31
|
+
createStreamExtractor: () => {
|
|
32
|
+
let usage;
|
|
33
|
+
return {
|
|
34
|
+
processChunk: (chunk) => {
|
|
35
|
+
var _a, _b;
|
|
36
|
+
const parsed = safeValidateTypes({
|
|
37
|
+
value: chunk,
|
|
38
|
+
schema: deepSeekStreamChunkSchema
|
|
39
|
+
});
|
|
40
|
+
if (parsed.success && ((_b = (_a = parsed.value.choices) == null ? void 0 : _a[0]) == null ? void 0 : _b.finish_reason) === "stop" && parsed.value.usage) {
|
|
41
|
+
usage = parsed.value.usage;
|
|
42
|
+
}
|
|
43
|
+
},
|
|
44
|
+
buildMetadata: () => buildDeepseekMetadata(usage)
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
};
|
|
48
|
+
var deepSeekUsageSchema = z.object({
|
|
49
|
+
prompt_cache_hit_tokens: z.number().nullish(),
|
|
50
|
+
prompt_cache_miss_tokens: z.number().nullish()
|
|
51
|
+
});
|
|
52
|
+
var deepSeekResponseSchema = z.object({
|
|
53
|
+
usage: deepSeekUsageSchema.nullish()
|
|
54
|
+
});
|
|
55
|
+
var deepSeekStreamChunkSchema = z.object({
|
|
56
|
+
choices: z.array(
|
|
57
|
+
z.object({
|
|
58
|
+
finish_reason: z.string().nullish()
|
|
59
|
+
})
|
|
60
|
+
).nullish(),
|
|
61
|
+
usage: deepSeekUsageSchema.nullish()
|
|
62
|
+
});
|
|
63
|
+
|
|
64
|
+
// src/deepseek-provider.ts
|
|
10
65
|
function createDeepSeek(options = {}) {
|
|
11
66
|
var _a;
|
|
12
67
|
const baseURL = withoutTrailingSlash(
|
|
@@ -26,7 +81,8 @@ function createDeepSeek(options = {}) {
|
|
|
26
81
|
url: ({ path }) => `${baseURL}${path}`,
|
|
27
82
|
headers: getHeaders,
|
|
28
83
|
fetch: options.fetch,
|
|
29
|
-
defaultObjectGenerationMode: "json"
|
|
84
|
+
defaultObjectGenerationMode: "json",
|
|
85
|
+
metadataExtractor: deepSeekMetadataExtractor
|
|
30
86
|
});
|
|
31
87
|
};
|
|
32
88
|
const provider = (modelId, settings) => createLanguageModel(modelId, settings);
|
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/deepseek-provider.ts"],"sourcesContent":["import { OpenAICompatibleChatLanguageModel } from '@ai-sdk/openai-compatible';\nimport {\n LanguageModelV1,\n NoSuchModelError,\n ProviderV1,\n} from '@ai-sdk/provider';\nimport {\n FetchFunction,\n loadApiKey,\n withoutTrailingSlash,\n} from '@ai-sdk/provider-utils';\nimport {\n DeepSeekChatModelId,\n DeepSeekChatSettings,\n} from './deepseek-chat-settings';\n\nexport interface DeepSeekProviderSettings {\n /**\nDeepSeek API key.\n*/\n apiKey?: string;\n /**\nBase URL for the API calls.\n*/\n baseURL?: string;\n /**\nCustom headers to include in the requests.\n*/\n headers?: Record<string, string>;\n /**\nCustom fetch implementation. You can use it as a middleware to intercept requests,\nor to provide a custom fetch implementation for e.g. testing.\n*/\n fetch?: FetchFunction;\n}\n\nexport interface DeepSeekProvider extends ProviderV1 {\n /**\nCreates a DeepSeek model for text generation.\n*/\n (\n modelId: DeepSeekChatModelId,\n settings?: DeepSeekChatSettings,\n ): LanguageModelV1;\n\n /**\nCreates a DeepSeek model for text generation.\n*/\n languageModel(\n modelId: DeepSeekChatModelId,\n settings?: DeepSeekChatSettings,\n ): LanguageModelV1;\n\n /**\nCreates a DeepSeek chat model for text generation.\n*/\n chat(\n modelId: DeepSeekChatModelId,\n settings?: DeepSeekChatSettings,\n ): LanguageModelV1;\n}\n\nexport function createDeepSeek(\n options: DeepSeekProviderSettings = {},\n): DeepSeekProvider {\n const baseURL = withoutTrailingSlash(\n options.baseURL ?? 'https://api.deepseek.com/v1',\n );\n const getHeaders = () => ({\n Authorization: `Bearer ${loadApiKey({\n apiKey: options.apiKey,\n environmentVariableName: 'DEEPSEEK_API_KEY',\n description: 'DeepSeek API key',\n })}`,\n ...options.headers,\n });\n\n const createLanguageModel = (\n modelId: DeepSeekChatModelId,\n settings: DeepSeekChatSettings = {},\n ) => {\n return new OpenAICompatibleChatLanguageModel(modelId, settings, {\n provider: `deepseek.chat`,\n url: ({ path }) => `${baseURL}${path}`,\n headers: getHeaders,\n fetch: options.fetch,\n defaultObjectGenerationMode: 'json',\n });\n };\n\n const provider = (\n modelId: DeepSeekChatModelId,\n settings?: DeepSeekChatSettings,\n ) => createLanguageModel(modelId, settings);\n\n provider.languageModel = createLanguageModel;\n provider.chat = createLanguageModel;\n provider.textEmbeddingModel = (modelId: string) => {\n throw new NoSuchModelError({ modelId, modelType: 'textEmbeddingModel' });\n };\n\n return provider as DeepSeekProvider;\n}\n\nexport const deepseek = createDeepSeek();\n"],"mappings":";AAAA,SAAS,yCAAyC;AAClD;AAAA,EAEE;AAAA,OAEK;AACP;AAAA,EAEE;AAAA,EACA;AAAA,OACK;
|
|
1
|
+
{"version":3,"sources":["../src/deepseek-provider.ts","../src/deepseek-metadata-extractor.ts"],"sourcesContent":["import { OpenAICompatibleChatLanguageModel } from '@ai-sdk/openai-compatible';\nimport {\n LanguageModelV1,\n NoSuchModelError,\n ProviderV1,\n} from '@ai-sdk/provider';\nimport {\n FetchFunction,\n loadApiKey,\n withoutTrailingSlash,\n} from '@ai-sdk/provider-utils';\nimport {\n DeepSeekChatModelId,\n DeepSeekChatSettings,\n} from './deepseek-chat-settings';\nimport { deepSeekMetadataExtractor } from './deepseek-metadata-extractor';\n\nexport interface DeepSeekProviderSettings {\n /**\nDeepSeek API key.\n*/\n apiKey?: string;\n /**\nBase URL for the API calls.\n*/\n baseURL?: string;\n /**\nCustom headers to include in the requests.\n*/\n headers?: Record<string, string>;\n /**\nCustom fetch implementation. You can use it as a middleware to intercept requests,\nor to provide a custom fetch implementation for e.g. testing.\n*/\n fetch?: FetchFunction;\n}\n\nexport interface DeepSeekProvider extends ProviderV1 {\n /**\nCreates a DeepSeek model for text generation.\n*/\n (\n modelId: DeepSeekChatModelId,\n settings?: DeepSeekChatSettings,\n ): LanguageModelV1;\n\n /**\nCreates a DeepSeek model for text generation.\n*/\n languageModel(\n modelId: DeepSeekChatModelId,\n settings?: DeepSeekChatSettings,\n ): LanguageModelV1;\n\n /**\nCreates a DeepSeek chat model for text generation.\n*/\n chat(\n modelId: DeepSeekChatModelId,\n settings?: DeepSeekChatSettings,\n ): LanguageModelV1;\n}\n\nexport function createDeepSeek(\n options: DeepSeekProviderSettings = {},\n): DeepSeekProvider {\n const baseURL = withoutTrailingSlash(\n options.baseURL ?? 'https://api.deepseek.com/v1',\n );\n const getHeaders = () => ({\n Authorization: `Bearer ${loadApiKey({\n apiKey: options.apiKey,\n environmentVariableName: 'DEEPSEEK_API_KEY',\n description: 'DeepSeek API key',\n })}`,\n ...options.headers,\n });\n\n const createLanguageModel = (\n modelId: DeepSeekChatModelId,\n settings: DeepSeekChatSettings = {},\n ) => {\n return new OpenAICompatibleChatLanguageModel(modelId, settings, {\n provider: `deepseek.chat`,\n url: ({ path }) => `${baseURL}${path}`,\n headers: getHeaders,\n fetch: options.fetch,\n defaultObjectGenerationMode: 'json',\n metadataExtractor: deepSeekMetadataExtractor,\n });\n };\n\n const provider = (\n modelId: DeepSeekChatModelId,\n settings?: DeepSeekChatSettings,\n ) => createLanguageModel(modelId, settings);\n\n provider.languageModel = createLanguageModel;\n provider.chat = createLanguageModel;\n provider.textEmbeddingModel = (modelId: string) => {\n throw new NoSuchModelError({ modelId, modelType: 'textEmbeddingModel' });\n };\n\n return provider as DeepSeekProvider;\n}\n\nexport const deepseek = createDeepSeek();\n","import { MetadataExtractor } from '@ai-sdk/openai-compatible';\nimport { safeValidateTypes } from '@ai-sdk/provider-utils';\nimport { z } from 'zod';\n\nconst buildDeepseekMetadata = (\n usage: z.infer<typeof deepSeekUsageSchema> | undefined,\n) => {\n return usage == null\n ? undefined\n : {\n deepseek: {\n promptCacheHitTokens: usage.prompt_cache_hit_tokens ?? NaN,\n promptCacheMissTokens: usage.prompt_cache_miss_tokens ?? NaN,\n },\n };\n};\n\nexport const deepSeekMetadataExtractor: MetadataExtractor = {\n extractMetadata: ({ parsedBody }: { parsedBody: unknown }) => {\n const parsed = safeValidateTypes({\n value: parsedBody,\n schema: deepSeekResponseSchema,\n });\n\n return !parsed.success || parsed.value.usage == null\n ? undefined\n : buildDeepseekMetadata(parsed.value.usage);\n },\n\n createStreamExtractor: () => {\n let usage: z.infer<typeof deepSeekUsageSchema> | undefined;\n\n return {\n processChunk: (chunk: unknown) => {\n const parsed = safeValidateTypes({\n value: chunk,\n schema: deepSeekStreamChunkSchema,\n });\n\n if (\n parsed.success &&\n parsed.value.choices?.[0]?.finish_reason === 'stop' &&\n parsed.value.usage\n ) {\n usage = parsed.value.usage;\n }\n },\n buildMetadata: () => buildDeepseekMetadata(usage),\n };\n },\n};\n\nconst deepSeekUsageSchema = z.object({\n prompt_cache_hit_tokens: z.number().nullish(),\n prompt_cache_miss_tokens: z.number().nullish(),\n});\n\nconst deepSeekResponseSchema = z.object({\n usage: deepSeekUsageSchema.nullish(),\n});\n\nconst deepSeekStreamChunkSchema = z.object({\n choices: z\n .array(\n z.object({\n finish_reason: z.string().nullish(),\n }),\n )\n .nullish(),\n usage: deepSeekUsageSchema.nullish(),\n});\n"],"mappings":";AAAA,SAAS,yCAAyC;AAClD;AAAA,EAEE;AAAA,OAEK;AACP;AAAA,EAEE;AAAA,EACA;AAAA,OACK;;;ACTP,SAAS,yBAAyB;AAClC,SAAS,SAAS;AAElB,IAAM,wBAAwB,CAC5B,UACG;AANL;AAOE,SAAO,SAAS,OACZ,SACA;AAAA,IACE,UAAU;AAAA,MACR,uBAAsB,WAAM,4BAAN,YAAiC;AAAA,MACvD,wBAAuB,WAAM,6BAAN,YAAkC;AAAA,IAC3D;AAAA,EACF;AACN;AAEO,IAAM,4BAA+C;AAAA,EAC1D,iBAAiB,CAAC,EAAE,WAAW,MAA+B;AAC5D,UAAM,SAAS,kBAAkB;AAAA,MAC/B,OAAO;AAAA,MACP,QAAQ;AAAA,IACV,CAAC;AAED,WAAO,CAAC,OAAO,WAAW,OAAO,MAAM,SAAS,OAC5C,SACA,sBAAsB,OAAO,MAAM,KAAK;AAAA,EAC9C;AAAA,EAEA,uBAAuB,MAAM;AAC3B,QAAI;AAEJ,WAAO;AAAA,MACL,cAAc,CAAC,UAAmB;AAjCxC;AAkCQ,cAAM,SAAS,kBAAkB;AAAA,UAC/B,OAAO;AAAA,UACP,QAAQ;AAAA,QACV,CAAC;AAED,YACE,OAAO,aACP,kBAAO,MAAM,YAAb,mBAAuB,OAAvB,mBAA2B,mBAAkB,UAC7C,OAAO,MAAM,OACb;AACA,kBAAQ,OAAO,MAAM;AAAA,QACvB;AAAA,MACF;AAAA,MACA,eAAe,MAAM,sBAAsB,KAAK;AAAA,IAClD;AAAA,EACF;AACF;AAEA,IAAM,sBAAsB,EAAE,OAAO;AAAA,EACnC,yBAAyB,EAAE,OAAO,EAAE,QAAQ;AAAA,EAC5C,0BAA0B,EAAE,OAAO,EAAE,QAAQ;AAC/C,CAAC;AAED,IAAM,yBAAyB,EAAE,OAAO;AAAA,EACtC,OAAO,oBAAoB,QAAQ;AACrC,CAAC;AAED,IAAM,4BAA4B,EAAE,OAAO;AAAA,EACzC,SAAS,EACN;AAAA,IACC,EAAE,OAAO;AAAA,MACP,eAAe,EAAE,OAAO,EAAE,QAAQ;AAAA,IACpC,CAAC;AAAA,EACH,EACC,QAAQ;AAAA,EACX,OAAO,oBAAoB,QAAQ;AACrC,CAAC;;;ADPM,SAAS,eACd,UAAoC,CAAC,GACnB;AAjEpB;AAkEE,QAAM,UAAU;AAAA,KACd,aAAQ,YAAR,YAAmB;AAAA,EACrB;AACA,QAAM,aAAa,OAAO;AAAA,IACxB,eAAe,UAAU,WAAW;AAAA,MAClC,QAAQ,QAAQ;AAAA,MAChB,yBAAyB;AAAA,MACzB,aAAa;AAAA,IACf,CAAC,CAAC;AAAA,IACF,GAAG,QAAQ;AAAA,EACb;AAEA,QAAM,sBAAsB,CAC1B,SACA,WAAiC,CAAC,MAC/B;AACH,WAAO,IAAI,kCAAkC,SAAS,UAAU;AAAA,MAC9D,UAAU;AAAA,MACV,KAAK,CAAC,EAAE,KAAK,MAAM,GAAG,OAAO,GAAG,IAAI;AAAA,MACpC,SAAS;AAAA,MACT,OAAO,QAAQ;AAAA,MACf,6BAA6B;AAAA,MAC7B,mBAAmB;AAAA,IACrB,CAAC;AAAA,EACH;AAEA,QAAM,WAAW,CACf,SACA,aACG,oBAAoB,SAAS,QAAQ;AAE1C,WAAS,gBAAgB;AACzB,WAAS,OAAO;AAChB,WAAS,qBAAqB,CAAC,YAAoB;AACjD,UAAM,IAAI,iBAAiB,EAAE,SAAS,WAAW,qBAAqB,CAAC;AAAA,EACzE;AAEA,SAAO;AACT;AAEO,IAAM,WAAW,eAAe;","names":[]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@ai-sdk/deepseek",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.2",
|
|
4
4
|
"license": "Apache-2.0",
|
|
5
5
|
"sideEffects": false,
|
|
6
6
|
"main": "./dist/index.js",
|
|
@@ -19,9 +19,9 @@
|
|
|
19
19
|
}
|
|
20
20
|
},
|
|
21
21
|
"dependencies": {
|
|
22
|
-
"@ai-sdk/openai-compatible": "0.1.
|
|
23
|
-
"@ai-sdk/provider": "1.0.
|
|
24
|
-
"@ai-sdk/provider-utils": "2.1.
|
|
22
|
+
"@ai-sdk/openai-compatible": "0.1.2",
|
|
23
|
+
"@ai-sdk/provider": "1.0.6",
|
|
24
|
+
"@ai-sdk/provider-utils": "2.1.2"
|
|
25
25
|
},
|
|
26
26
|
"devDependencies": {
|
|
27
27
|
"@types/node": "^18",
|