@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.
- package/dist/config/DeepSeekConfig.js +9 -0
- package/dist/factory/AiProviderFactory.js +4 -0
- package/dist/factory/DeepSeekProviderFactory.js +14 -0
- package/dist/index.js +4 -1
- package/dist/providers/DeepSeekProvider.js +34 -0
- package/package.json +2 -2
- package/src/config/DeepSeekConfig.ts +14 -0
- package/src/factory/AiProviderFactory.ts +4 -0
- package/src/factory/DeepSeekProviderFactory.ts +27 -0
- package/src/index.ts +6 -0
- package/src/providers/DeepSeekProvider.ts +58 -0
- package/test/DeepSeekProvider.test.ts +146 -0
- package/tsconfig.tsbuildinfo +1 -1
- package/types/config/DeepSeekConfig.d.ts +9 -0
- package/types/config/DeepSeekConfig.d.ts.map +1 -0
- package/types/factory/AiProviderFactory.d.ts.map +1 -1
- package/types/factory/DeepSeekProviderFactory.d.ts +8 -0
- package/types/factory/DeepSeekProviderFactory.d.ts.map +1 -0
- package/types/index.d.ts +11 -2
- package/types/index.d.ts.map +1 -1
- package/types/providers/DeepSeekProvider.d.ts +24 -0
- package/types/providers/DeepSeekProvider.d.ts.map +1 -0
|
@@ -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.
|
|
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": "
|
|
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
|
+
})
|