@drax/ai-back 3.42.0 → 3.43.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.
Files changed (36) hide show
  1. package/dist/agents/DraxAgent.js +2 -0
  2. package/dist/controllers/AIGenericController.js +22 -0
  3. package/dist/controllers/DraxAgentController.js +22 -0
  4. package/dist/index.js +2 -1
  5. package/dist/providers/ai/GoogleAiProvider.js +4 -1
  6. package/dist/providers/ai/OllamaAiProvider.js +4 -1
  7. package/dist/providers/ai/OpenAiProvider.js +4 -1
  8. package/dist/services/PromptAudioService.js +68 -0
  9. package/package.json +3 -3
  10. package/src/agents/DraxAgent.ts +2 -0
  11. package/src/controllers/AIGenericController.ts +24 -0
  12. package/src/controllers/DraxAgentController.ts +24 -0
  13. package/src/index.ts +8 -0
  14. package/src/interfaces/IAIProvider.ts +38 -1
  15. package/src/interfaces/IDraxAgent.ts +4 -0
  16. package/src/providers/ai/GoogleAiProvider.ts +4 -1
  17. package/src/providers/ai/OllamaAiProvider.ts +4 -1
  18. package/src/providers/ai/OpenAiProvider.ts +4 -1
  19. package/src/services/PromptAudioService.ts +87 -0
  20. package/test/DraxAgent.test.ts +64 -0
  21. package/test/PromptAudioService.test.ts +115 -0
  22. package/tsconfig.tsbuildinfo +1 -1
  23. package/types/agents/DraxAgent.d.ts.map +1 -1
  24. package/types/controllers/AIGenericController.d.ts.map +1 -1
  25. package/types/controllers/DraxAgentController.d.ts.map +1 -1
  26. package/types/index.d.ts +4 -3
  27. package/types/index.d.ts.map +1 -1
  28. package/types/interfaces/IAIProvider.d.ts +32 -1
  29. package/types/interfaces/IAIProvider.d.ts.map +1 -1
  30. package/types/interfaces/IDraxAgent.d.ts +3 -1
  31. package/types/interfaces/IDraxAgent.d.ts.map +1 -1
  32. package/types/providers/ai/GoogleAiProvider.d.ts.map +1 -1
  33. package/types/providers/ai/OllamaAiProvider.d.ts.map +1 -1
  34. package/types/providers/ai/OpenAiProvider.d.ts.map +1 -1
  35. package/types/services/PromptAudioService.d.ts +9 -0
  36. package/types/services/PromptAudioService.d.ts.map +1 -0
@@ -144,6 +144,70 @@ describe("DraxAgent", () => {
144
144
  ]);
145
145
  });
146
146
 
147
+ test("passes audioResponse to provider and returns prompt audio", async () => {
148
+ class AudioMockProvider extends MockProvider {
149
+ async prompt(input: IPromptParams): Promise<IPromptResponse> {
150
+ this.requests.push(input);
151
+
152
+ return {
153
+ output: "respuesta hablada",
154
+ tokens: 10,
155
+ inputTokens: 6,
156
+ outputTokens: 4,
157
+ time: 12,
158
+ audio: {
159
+ audio: Buffer.from("audio").toString("base64"),
160
+ contentType: "audio/mpeg",
161
+ encoding: "base64",
162
+ meta: {
163
+ provider: "elevenlabs",
164
+ model: "eleven_multilingual_v2",
165
+ voiceId: "voice-1",
166
+ size: 5,
167
+ time: 20,
168
+ },
169
+ },
170
+ };
171
+ }
172
+ }
173
+
174
+ const provider = new AudioMockProvider();
175
+ const agent = new DraxAgent().configure({
176
+ provider,
177
+ systemPrompt: "Sos un asistente.",
178
+ sessionService: false,
179
+ toolBuilders: undefined,
180
+ tools: undefined,
181
+ });
182
+
183
+ const response = await agent.sendMessage({
184
+ userId: "user-1",
185
+ message: "Hola",
186
+ audioResponse: {
187
+ provider: "ElevenLabs",
188
+ languageCode: "es",
189
+ },
190
+ });
191
+
192
+ expect(provider.requests[0].audioResponse).toEqual({
193
+ provider: "ElevenLabs",
194
+ languageCode: "es",
195
+ });
196
+ expect(response.message).toBe("respuesta hablada");
197
+ expect(response.audio).toEqual({
198
+ audio: Buffer.from("audio").toString("base64"),
199
+ contentType: "audio/mpeg",
200
+ encoding: "base64",
201
+ meta: {
202
+ provider: "elevenlabs",
203
+ model: "eleven_multilingual_v2",
204
+ voiceId: "voice-1",
205
+ size: 5,
206
+ time: 20,
207
+ },
208
+ });
209
+ });
210
+
147
211
  test("returns a navigation path from tool execution metadata", async () => {
148
212
  const provider = new MockProvider();
149
213
  const agent = new DraxAgent().configure({
@@ -0,0 +1,115 @@
1
+ import {afterEach, describe, expect, test, vi} from "vitest";
2
+ import {PromptAudioService, TTSProviderFactory} from "../src";
3
+
4
+ describe("PromptAudioService Test", () => {
5
+
6
+ afterEach(() => {
7
+ vi.restoreAllMocks()
8
+ })
9
+
10
+ test("does not generate audio when audioResponse is not requested", async () => {
11
+ const instanceSpy = vi.spyOn(TTSProviderFactory, "instance")
12
+
13
+ const audio = await PromptAudioService.build({
14
+ systemPrompt: "You are an assistant.",
15
+ }, "Hola")
16
+
17
+ expect(audio).toBeUndefined()
18
+ expect(instanceSpy).not.toHaveBeenCalled()
19
+ })
20
+
21
+ test("generates base64 prompt audio with default ElevenLabs provider", async () => {
22
+ const textToSpeech = vi.fn(async () => ({
23
+ audio: Buffer.from("audio-bytes"),
24
+ contentType: "audio/mpeg",
25
+ size: 11,
26
+ time: 25,
27
+ provider: "elevenlabs",
28
+ model: "eleven_multilingual_v2",
29
+ voiceId: "voice-1",
30
+ outputFormat: "mp3_44100_128",
31
+ }))
32
+ const instanceSpy = vi.spyOn(TTSProviderFactory, "instance").mockReturnValue({
33
+ textToSpeech,
34
+ })
35
+
36
+ const audio = await PromptAudioService.build({
37
+ systemPrompt: "You are an assistant.",
38
+ audioResponse: true,
39
+ operationTitle: "prompt-title",
40
+ operationGroup: "prompt-group",
41
+ ip: "127.0.0.1",
42
+ userAgent: "vitest",
43
+ tenant: "tenant-1",
44
+ user: "user-1",
45
+ }, "Hola mundo")
46
+
47
+ expect(instanceSpy).toHaveBeenCalledWith("ElevenLabs")
48
+ expect(textToSpeech).toHaveBeenCalledWith({
49
+ text: "Hola mundo",
50
+ voiceId: undefined,
51
+ model: undefined,
52
+ outputFormat: undefined,
53
+ voiceSettings: undefined,
54
+ previousText: undefined,
55
+ nextText: undefined,
56
+ languageCode: undefined,
57
+ seed: undefined,
58
+ operationTitle: "prompt-title",
59
+ operationGroup: "prompt-group",
60
+ ip: "127.0.0.1",
61
+ userAgent: "vitest",
62
+ tenant: "tenant-1",
63
+ user: "user-1",
64
+ })
65
+ expect(audio).toEqual({
66
+ audio: Buffer.from("audio-bytes").toString("base64"),
67
+ contentType: "audio/mpeg",
68
+ encoding: "base64",
69
+ meta: {
70
+ provider: "elevenlabs",
71
+ model: "eleven_multilingual_v2",
72
+ voiceId: "voice-1",
73
+ outputFormat: "mp3_44100_128",
74
+ size: 11,
75
+ time: 25,
76
+ },
77
+ })
78
+ })
79
+
80
+ test("supports custom TTS provider params", async () => {
81
+ const textToSpeech = vi.fn(async () => ({
82
+ audio: Buffer.from("custom-audio"),
83
+ contentType: "audio/ogg",
84
+ size: 12,
85
+ time: 31,
86
+ provider: "custom",
87
+ model: "custom-model",
88
+ voiceId: "voice-2",
89
+ }))
90
+ const instanceSpy = vi.spyOn(TTSProviderFactory, "instance").mockReturnValue({
91
+ textToSpeech,
92
+ })
93
+
94
+ await PromptAudioService.build({
95
+ systemPrompt: "You are an assistant.",
96
+ audioResponse: {
97
+ provider: "CustomTTS",
98
+ voiceId: "voice-2",
99
+ model: "custom-model",
100
+ languageCode: "es",
101
+ operationTitle: "tts-title",
102
+ },
103
+ }, {message: "Hola"})
104
+
105
+ expect(instanceSpy).toHaveBeenCalledWith("CustomTTS")
106
+ expect(textToSpeech).toHaveBeenCalledWith(expect.objectContaining({
107
+ text: "{\"message\":\"Hola\"}",
108
+ voiceId: "voice-2",
109
+ model: "custom-model",
110
+ languageCode: "es",
111
+ operationTitle: "tts-title",
112
+ }))
113
+ })
114
+
115
+ })