@drax/ai-back 3.40.0 → 3.41.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.
@@ -0,0 +1,9 @@
1
+ var DeepSeekConfig;
2
+ (function (DeepSeekConfig) {
3
+ DeepSeekConfig["DeepSeekApiKey"] = "DEEPSEEK_API_KEY";
4
+ DeepSeekConfig["DeepSeekModel"] = "DEEPSEEK_MODEL";
5
+ DeepSeekConfig["DeepSeekBaseUrl"] = "DEEPSEEK_BASE_URL";
6
+ DeepSeekConfig["DeepSeekVisionModel"] = "DEEPSEEK_VISION_MODEL";
7
+ })(DeepSeekConfig || (DeepSeekConfig = {}));
8
+ export default DeepSeekConfig;
9
+ export { DeepSeekConfig };
@@ -1,6 +1,7 @@
1
1
  import OpenAiProviderFactory from "./OpenAiProviderFactory.js";
2
2
  import GoogleAiProviderFactory from "./GoogleAiProviderFactory.js";
3
3
  import OllamaAiProviderFactory from "./OllamaAiProviderFactory.js";
4
+ import DeepSeekProviderFactory from "./DeepSeekProviderFactory.js";
4
5
  class AiProviderFactory {
5
6
  static instance(provider = 'OpenAi') {
6
7
  if (!AiProviderFactory.singletons[provider]) {
@@ -14,6 +15,9 @@ class AiProviderFactory {
14
15
  case 'OllamaAi':
15
16
  AiProviderFactory.singletons[provider] = OllamaAiProviderFactory.instance();
16
17
  break;
18
+ case 'DeepSeek':
19
+ AiProviderFactory.singletons[provider] = DeepSeekProviderFactory.instance();
20
+ break;
17
21
  default:
18
22
  throw new Error(`Unsupported AI provider: ${provider}`);
19
23
  }
@@ -0,0 +1,14 @@
1
+ import { DraxConfig } from "@drax/common-back";
2
+ import DeepSeekConfig from "../config/DeepSeekConfig.js";
3
+ import DeepSeekProvider from "../providers/DeepSeekProvider.js";
4
+ import AILogServiceFactory from "./services/AILogServiceFactory.js";
5
+ class DeepSeekProviderFactory {
6
+ static instance() {
7
+ if (!DeepSeekProviderFactory.singleton) {
8
+ DeepSeekProviderFactory.singleton = new DeepSeekProvider(DraxConfig.getOrLoad(DeepSeekConfig.DeepSeekApiKey), DraxConfig.getOrLoad(DeepSeekConfig.DeepSeekModel), DraxConfig.getOrLoad(DeepSeekConfig.DeepSeekBaseUrl, "string", "https://api.deepseek.com"), DraxConfig.getOrLoad(DeepSeekConfig.DeepSeekVisionModel), AILogServiceFactory.instance);
9
+ }
10
+ return DeepSeekProviderFactory.singleton;
11
+ }
12
+ }
13
+ export default DeepSeekProviderFactory;
14
+ export { DeepSeekProviderFactory };
package/dist/index.js CHANGED
@@ -1,6 +1,7 @@
1
1
  import { OpenAiConfig } from "./config/OpenAiConfig.js";
2
2
  import { GoogleAiConfig } from "./config/GoogleAiConfig.js";
3
3
  import { OllamaAiConfig } from "./config/OllamaAiConfig.js";
4
+ import { DeepSeekConfig } from "./config/DeepSeekConfig.js";
4
5
  import { AILogSchema, AILogBaseSchema } from "./schemas/AILogSchema.js";
5
6
  import AILogModel from "./models/AILogModel.js";
6
7
  import AILogMongoRepository from "./repository/mongo/AILogMongoRepository.js";
@@ -8,12 +9,14 @@ import AILogSqliteRepository from "./repository/sqlite/AILogSqliteRepository.js"
8
9
  import { OpenAiProviderFactory } from "./factory/OpenAiProviderFactory.js";
9
10
  import { GoogleAiProviderFactory } from "./factory/GoogleAiProviderFactory.js";
10
11
  import { OllamaAiProviderFactory } from "./factory/OllamaAiProviderFactory.js";
12
+ import { DeepSeekProviderFactory } from "./factory/DeepSeekProviderFactory.js";
11
13
  import { AiProviderFactory } from "./factory/AiProviderFactory.js";
12
14
  import { DraxAgentFactory } from "./factory/DraxAgentFactory.js";
13
15
  import AILogServiceFactory from "./factory/services/AILogServiceFactory.js";
14
16
  import { OpenAiProvider } from "./providers/OpenAiProvider.js";
15
17
  import { GoogleAiProvider } from "./providers/GoogleAiProvider.js";
16
18
  import { OllamaAiProvider } from "./providers/OllamaAiProvider.js";
19
+ import { DeepSeekProvider } from "./providers/DeepSeekProvider.js";
17
20
  import { BuilderTool } from "./tools/BuilderTool.js";
18
21
  import { KnowledgeService } from "./services/KnowledgeService.js";
19
22
  import { AILogService } from "./services/AILogService.js";
@@ -31,7 +34,7 @@ import AIRoutes from "./routes/AIRoutes.js";
31
34
  import DraxAgentRoutes from "./routes/DraxAgentRoutes.js";
32
35
  import AgentSessionRoutes from "./routes/AgentSessionRoutes.js";
33
36
  import { DraxAgent } from "./agents/DraxAgent.js";
34
- export { OpenAiConfig, GoogleAiConfig, OllamaAiConfig, AILogSchema, AILogBaseSchema, AILogModel, AILogMongoRepository, AILogSqliteRepository, OpenAiProviderFactory, GoogleAiProviderFactory, OllamaAiProviderFactory, AiProviderFactory, DraxAgentFactory, AILogServiceFactory, OpenAiProvider, GoogleAiProvider, OllamaAiProvider, BuilderTool,
37
+ export { OpenAiConfig, GoogleAiConfig, OllamaAiConfig, DeepSeekConfig, AILogSchema, AILogBaseSchema, AILogModel, AILogMongoRepository, AILogSqliteRepository, OpenAiProviderFactory, GoogleAiProviderFactory, OllamaAiProviderFactory, DeepSeekProviderFactory, AiProviderFactory, DraxAgentFactory, AILogServiceFactory, OpenAiProvider, GoogleAiProvider, OllamaAiProvider, DeepSeekProvider, BuilderTool,
35
38
  //Service
36
39
  KnowledgeService, AILogService,
37
40
  //Permissions
@@ -0,0 +1,34 @@
1
+ import OpenAI from "openai";
2
+ import OpenAiProvider from "./OpenAiProvider.js";
3
+ class DeepSeekProvider extends OpenAiProvider {
4
+ constructor(apiKey, model, baseUrl = "https://api.deepseek.com", visionModel, aiLogService) {
5
+ if (!apiKey) {
6
+ throw new Error("DeepSeek apiKey required");
7
+ }
8
+ if (!model) {
9
+ throw new Error("DeepSeek model required");
10
+ }
11
+ super(apiKey, model, visionModel, aiLogService);
12
+ if (!baseUrl) {
13
+ throw new Error("DeepSeek baseUrl required");
14
+ }
15
+ this._baseUrl = baseUrl;
16
+ }
17
+ get client() {
18
+ if (!this._client) {
19
+ this._client = new OpenAI({
20
+ apiKey: this._apiKey,
21
+ baseURL: this._baseUrl,
22
+ });
23
+ }
24
+ return this._client;
25
+ }
26
+ buildLogPayload(input, params) {
27
+ return {
28
+ ...super.buildLogPayload(input, params),
29
+ provider: "deepseek",
30
+ };
31
+ }
32
+ }
33
+ export default DeepSeekProvider;
34
+ export { DeepSeekProvider };
package/package.json CHANGED
@@ -3,7 +3,7 @@
3
3
  "publishConfig": {
4
4
  "access": "public"
5
5
  },
6
- "version": "3.40.0",
6
+ "version": "3.41.0",
7
7
  "description": "Ai utils",
8
8
  "main": "dist/index.js",
9
9
  "types": "types/index.d.ts",
@@ -46,5 +46,5 @@
46
46
  "typescript": "^5.9.3",
47
47
  "vitest": "^3.0.8"
48
48
  },
49
- "gitHead": "1165402155066a0da2db001923dd138ec774f8f7"
49
+ "gitHead": "21f6bdb9f6cc6da6c74dee8aef275d8f88755dd4"
50
50
  }
@@ -0,0 +1,14 @@
1
+
2
+ enum DeepSeekConfig {
3
+
4
+ DeepSeekApiKey = "DEEPSEEK_API_KEY",
5
+ DeepSeekModel = "DEEPSEEK_MODEL",
6
+ DeepSeekBaseUrl = "DEEPSEEK_BASE_URL",
7
+ DeepSeekVisionModel = "DEEPSEEK_VISION_MODEL",
8
+
9
+ }
10
+
11
+
12
+ export default DeepSeekConfig;
13
+
14
+ export {DeepSeekConfig}
@@ -2,6 +2,7 @@ import type {IAIProvider} from "../interfaces/IAIProvider"
2
2
  import OpenAiProviderFactory from "./OpenAiProviderFactory.js";
3
3
  import GoogleAiProviderFactory from "./GoogleAiProviderFactory.js";
4
4
  import OllamaAiProviderFactory from "./OllamaAiProviderFactory.js";
5
+ import DeepSeekProviderFactory from "./DeepSeekProviderFactory.js";
5
6
 
6
7
  class AiProviderFactory {
7
8
  private static singletons: Record<string, IAIProvider> = {};
@@ -18,6 +19,9 @@ class AiProviderFactory {
18
19
  case 'OllamaAi':
19
20
  AiProviderFactory.singletons[provider] = OllamaAiProviderFactory.instance()
20
21
  break;
22
+ case 'DeepSeek':
23
+ AiProviderFactory.singletons[provider] = DeepSeekProviderFactory.instance()
24
+ break;
21
25
  default:
22
26
  throw new Error(`Unsupported AI provider: ${provider}`);
23
27
  }
@@ -0,0 +1,27 @@
1
+ import {DraxConfig} from "@drax/common-back";
2
+ import DeepSeekConfig from "../config/DeepSeekConfig.js";
3
+ import type {IAIProvider} from "../interfaces/IAIProvider"
4
+ import DeepSeekProvider from "../providers/DeepSeekProvider.js";
5
+ import AILogServiceFactory from "./services/AILogServiceFactory.js";
6
+
7
+ class DeepSeekProviderFactory {
8
+ private static singleton: IAIProvider;
9
+
10
+ public static instance(): IAIProvider {
11
+ if (!DeepSeekProviderFactory.singleton) {
12
+ DeepSeekProviderFactory.singleton = new DeepSeekProvider(
13
+ DraxConfig.getOrLoad(DeepSeekConfig.DeepSeekApiKey),
14
+ DraxConfig.getOrLoad(DeepSeekConfig.DeepSeekModel),
15
+ DraxConfig.getOrLoad(DeepSeekConfig.DeepSeekBaseUrl, "string", "https://api.deepseek.com"),
16
+ DraxConfig.getOrLoad(DeepSeekConfig.DeepSeekVisionModel),
17
+ AILogServiceFactory.instance
18
+ );
19
+ }
20
+ return DeepSeekProviderFactory.singleton;
21
+ }
22
+ }
23
+
24
+ export default DeepSeekProviderFactory
25
+ export {
26
+ DeepSeekProviderFactory
27
+ }
package/src/index.ts CHANGED
@@ -1,6 +1,7 @@
1
1
  import {OpenAiConfig} from "./config/OpenAiConfig.js";
2
2
  import {GoogleAiConfig} from "./config/GoogleAiConfig.js";
3
3
  import {OllamaAiConfig} from "./config/OllamaAiConfig.js";
4
+ import {DeepSeekConfig} from "./config/DeepSeekConfig.js";
4
5
  import {AILogSchema, AILogBaseSchema} from "./schemas/AILogSchema.js";
5
6
  import AILogModel from "./models/AILogModel.js";
6
7
  import AILogMongoRepository from "./repository/mongo/AILogMongoRepository.js";
@@ -8,12 +9,14 @@ import AILogSqliteRepository from "./repository/sqlite/AILogSqliteRepository.js"
8
9
  import {OpenAiProviderFactory} from "./factory/OpenAiProviderFactory.js";
9
10
  import {GoogleAiProviderFactory} from "./factory/GoogleAiProviderFactory.js";
10
11
  import {OllamaAiProviderFactory} from "./factory/OllamaAiProviderFactory.js";
12
+ import {DeepSeekProviderFactory} from "./factory/DeepSeekProviderFactory.js";
11
13
  import {AiProviderFactory} from "./factory/AiProviderFactory.js";
12
14
  import {DraxAgentFactory} from "./factory/DraxAgentFactory.js";
13
15
  import AILogServiceFactory from "./factory/services/AILogServiceFactory.js";
14
16
  import {OpenAiProvider} from "./providers/OpenAiProvider.js";
15
17
  import {GoogleAiProvider} from "./providers/GoogleAiProvider.js";
16
18
  import {OllamaAiProvider} from "./providers/OllamaAiProvider.js";
19
+ import {DeepSeekProvider} from "./providers/DeepSeekProvider.js";
17
20
  import {BuilderTool} from "./tools/BuilderTool.js";
18
21
  import {KnowledgeService} from "./services/KnowledgeService.js";
19
22
  import {AILogService} from "./services/AILogService.js";
@@ -104,6 +107,7 @@ export {
104
107
  OpenAiConfig,
105
108
  GoogleAiConfig,
106
109
  OllamaAiConfig,
110
+ DeepSeekConfig,
107
111
  AILogSchema,
108
112
  AILogBaseSchema,
109
113
  AILogModel,
@@ -112,12 +116,14 @@ export {
112
116
  OpenAiProviderFactory,
113
117
  GoogleAiProviderFactory,
114
118
  OllamaAiProviderFactory,
119
+ DeepSeekProviderFactory,
115
120
  AiProviderFactory,
116
121
  DraxAgentFactory,
117
122
  AILogServiceFactory,
118
123
  OpenAiProvider,
119
124
  GoogleAiProvider,
120
125
  OllamaAiProvider,
126
+ DeepSeekProvider,
121
127
  BuilderTool,
122
128
  //Service
123
129
  KnowledgeService,
@@ -0,0 +1,58 @@
1
+ import OpenAI from "openai";
2
+ import type {IAILogBase} from "@drax/ai-share";
3
+ import type {IPromptParams} from "../interfaces/IAIProvider.js";
4
+ import type {AILogService} from "../services/AILogService.js";
5
+ import OpenAiProvider from "./OpenAiProvider.js";
6
+
7
+ class DeepSeekProvider extends OpenAiProvider{
8
+ protected _baseUrl: string
9
+
10
+ constructor(apiKey: string, model: string, baseUrl: string = "https://api.deepseek.com", visionModel?: string, aiLogService?: AILogService) {
11
+ if (!apiKey) {
12
+ throw new Error("DeepSeek apiKey required")
13
+ }
14
+ if (!model) {
15
+ throw new Error("DeepSeek model required")
16
+ }
17
+
18
+ super(apiKey, model, visionModel, aiLogService)
19
+
20
+ if (!baseUrl) {
21
+ throw new Error("DeepSeek baseUrl required")
22
+ }
23
+
24
+ this._baseUrl = baseUrl
25
+ }
26
+
27
+ get client(){
28
+ if(!this._client){
29
+ this._client = new OpenAI({
30
+ apiKey: this._apiKey,
31
+ baseURL: this._baseUrl,
32
+ });
33
+ }
34
+
35
+ return this._client
36
+ }
37
+
38
+ protected buildLogPayload(input: IPromptParams, params: {
39
+ model: string,
40
+ systemPrompt: string,
41
+ startedAt: Date,
42
+ endedAt?: Date,
43
+ inputTokens?: number,
44
+ outputTokens?: number,
45
+ tokens?: number,
46
+ output?: unknown,
47
+ success: boolean,
48
+ errorMessage?: string,
49
+ }): IAILogBase {
50
+ return {
51
+ ...super.buildLogPayload(input, params),
52
+ provider: "deepseek",
53
+ }
54
+ }
55
+ }
56
+
57
+ export default DeepSeekProvider
58
+ export {DeepSeekProvider}
@@ -0,0 +1,146 @@
1
+ import {describe, expect, test} from "vitest";
2
+ import {AiProviderFactory, DeepSeekProvider} from "../src";
3
+ import {IPromptTool} from "../src/interfaces/IAIProvider";
4
+
5
+ describe("DeepSeekProvider Test", () => {
6
+
7
+ test("DeepSeek prompt uses OpenAI-compatible chat completions", async () => {
8
+ let request: any
9
+
10
+ class MockedDeepSeekProvider extends DeepSeekProvider {
11
+ constructor() {
12
+ super("test-key", "deepseek-chat")
13
+ this._client = {
14
+ chat: {
15
+ completions: {
16
+ create: async (payload: any) => {
17
+ request = payload
18
+ return {
19
+ choices: [{message: {content: "Buenos Aires"}}],
20
+ usage: {
21
+ total_tokens: 8,
22
+ prompt_tokens: 6,
23
+ completion_tokens: 2
24
+ }
25
+ }
26
+ }
27
+ }
28
+ }
29
+ }
30
+ }
31
+ }
32
+
33
+ const deepSeek = new MockedDeepSeekProvider()
34
+
35
+ const r = await deepSeek.prompt({
36
+ systemPrompt: "You are an AI assistant.",
37
+ userInput: "What is the capital of Argentina?"
38
+ })
39
+
40
+ expect(r.output).toBe("Buenos Aires")
41
+ expect(request.model).toBe("deepseek-chat")
42
+ expect(request.messages[1]).toEqual({
43
+ role: "user",
44
+ content: "What is the capital of Argentina?"
45
+ })
46
+ })
47
+
48
+ test("DeepSeek prompt executes tools through OpenAI-compatible tool calls", async () => {
49
+ const requests: any[] = []
50
+ const weatherTool: IPromptTool = {
51
+ name: "get_weather",
52
+ description: "Get weather for a city",
53
+ parameters: {
54
+ type: "object",
55
+ properties: {
56
+ city: {type: "string"}
57
+ },
58
+ required: ["city"],
59
+ additionalProperties: false
60
+ },
61
+ execute: async ({city}) => ({city, temperature: 21})
62
+ }
63
+
64
+ class MockedDeepSeekProvider extends DeepSeekProvider {
65
+ constructor() {
66
+ super("test-key", "deepseek-chat")
67
+ this._client = {
68
+ chat: {
69
+ completions: {
70
+ create: async (payload: any) => {
71
+ requests.push(payload)
72
+
73
+ if(requests.length === 1){
74
+ return {
75
+ choices: [{
76
+ message: {
77
+ role: "assistant",
78
+ content: null,
79
+ tool_calls: [{
80
+ id: "call_123",
81
+ type: "function",
82
+ function: {
83
+ name: "get_weather",
84
+ arguments: "{\"city\":\"Buenos Aires\"}"
85
+ }
86
+ }]
87
+ }
88
+ }],
89
+ usage: {
90
+ total_tokens: 15,
91
+ prompt_tokens: 10,
92
+ completion_tokens: 5
93
+ }
94
+ }
95
+ }
96
+
97
+ return {
98
+ choices: [{message: {role: "assistant", content: "21 grados"}}],
99
+ usage: {
100
+ total_tokens: 9,
101
+ prompt_tokens: 7,
102
+ completion_tokens: 2
103
+ }
104
+ }
105
+ }
106
+ }
107
+ }
108
+ }
109
+ }
110
+ }
111
+
112
+ const deepSeek = new MockedDeepSeekProvider()
113
+ const r = await deepSeek.prompt({
114
+ systemPrompt: "You are an AI assistant.",
115
+ userInput: "How is the weather in Buenos Aires?",
116
+ tools: [weatherTool]
117
+ })
118
+
119
+ expect(r.output).toBe("21 grados")
120
+ expect(r.tokens).toBe(24)
121
+ expect(requests[0].tools).toEqual([{
122
+ type: "function",
123
+ function: {
124
+ name: "get_weather",
125
+ description: "Get weather for a city",
126
+ parameters: weatherTool.parameters
127
+ }
128
+ }])
129
+ expect(requests[1].messages[3]).toEqual({
130
+ role: "tool",
131
+ tool_call_id: "call_123",
132
+ content: "{\"city\":\"Buenos Aires\",\"temperature\":21}"
133
+ })
134
+ })
135
+
136
+ test("AiProviderFactory supports DeepSeek option", () => {
137
+ process.env.DEEPSEEK_API_KEY = "test-key"
138
+ process.env.DEEPSEEK_MODEL = "deepseek-chat"
139
+ process.env.DEEPSEEK_BASE_URL = "https://api.deepseek.com"
140
+ process.env.DEEPSEEK_VISION_MODEL = "deepseek-chat"
141
+ process.env.DRAX_DB_ENGINE = "mongo"
142
+
143
+ const deepSeek = AiProviderFactory.instance("DeepSeek")
144
+ expect(deepSeek).toBeInstanceOf(DeepSeekProvider)
145
+ })
146
+ })