@drax/ai-back 3.16.0 → 3.17.1

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,97 @@
1
+ import {z} from "zod";
2
+ import {CommonController} from "@drax/common-back";
3
+ import AiProviderFactory from "../factory/AiProviderFactory.js";
4
+ import AIPermissions from "../permissions/AIPermissions.js";
5
+ import type {IPromptParams} from "../interfaces/IAIProvider.js";
6
+
7
+ const PromptImageSchema = z.object({
8
+ url: z.string().min(1),
9
+ detail: z.enum(["auto", "low", "high"]).optional(),
10
+ })
11
+
12
+ const PromptContentPartSchema = z.discriminatedUnion("type", [
13
+ z.object({
14
+ type: z.literal("text"),
15
+ text: z.string(),
16
+ }),
17
+ z.object({
18
+ type: z.literal("image"),
19
+ imageUrl: z.string().min(1),
20
+ detail: z.enum(["auto", "low", "high"]).optional(),
21
+ }),
22
+ ])
23
+
24
+ const PromptMessageSchema = z.object({
25
+ role: z.enum(["user", "assistant", "system"]),
26
+ content: z.union([
27
+ z.string(),
28
+ z.array(PromptContentPartSchema),
29
+ ]),
30
+ })
31
+
32
+ const PromptMemorySchema = z.object({
33
+ key: z.string().min(1),
34
+ value: z.string(),
35
+ })
36
+
37
+ const PromptInputFileSchema = z.object({
38
+ filename: z.string().optional(),
39
+ filepath: z.string().optional(),
40
+ size: z.number().nullable().optional(),
41
+ mimetype: z.string().optional(),
42
+ url: z.string().optional(),
43
+ })
44
+
45
+ const GenericPromptRequestSchema = z.object({
46
+ systemPrompt: z.string().min(1),
47
+ userInput: z.string().optional(),
48
+ userImages: z.array(PromptImageSchema).optional(),
49
+ inputFiles: z.array(PromptInputFileSchema).optional(),
50
+ userContent: z.array(PromptContentPartSchema).optional(),
51
+ history: z.array(PromptMessageSchema).optional(),
52
+ memory: z.array(PromptMemorySchema).optional(),
53
+ memoryHeader: z.string().optional(),
54
+ knowledgeBase: z.array(z.string()).optional(),
55
+ knowledgeBaseHeader: z.string().optional(),
56
+ jsonSchema: z.record(z.string(), z.any()).or(z.array(z.any())).optional(),
57
+ model: z.string().optional(),
58
+ operationTitle: z.string().optional(),
59
+ operationGroup: z.string().optional(),
60
+ })
61
+
62
+ class AIGenericController extends CommonController {
63
+
64
+ async prompt(request, reply) {
65
+ try {
66
+ request.rbac.assertPermission(AIPermissions.Prompt)
67
+
68
+ const input = GenericPromptRequestSchema.parse(request.body ?? {})
69
+ const aiProvider = AiProviderFactory.instance()
70
+ const promptInput: IPromptParams = {
71
+ ...(input as IPromptParams),
72
+ operationTitle: input.operationTitle ?? "generic-ai-prompt",
73
+ operationGroup: input.operationGroup ?? "generic-ai-prompt",
74
+ ip: request.ip,
75
+ userAgent: request.headers["user-agent"],
76
+ tenant: request.rbac?.tenantId ?? null,
77
+ user: request.rbac?.userId ?? null,
78
+ }
79
+
80
+ const response = await aiProvider.prompt(promptInput)
81
+
82
+ return reply.send(response)
83
+ } catch (e: any) {
84
+ if (e?.name === "ZodError") {
85
+ return reply.status(400).send({
86
+ message: e?.message || "AI prompt validation error",
87
+ })
88
+ }
89
+
90
+ this.handleError(e, reply)
91
+ }
92
+ }
93
+
94
+ }
95
+
96
+ export default AIGenericController;
97
+ export {AIGenericController};
@@ -4,7 +4,7 @@ import OpenAiProviderFactory from "./OpenAiProviderFactory.js";
4
4
  class AiProviderFactory {
5
5
  private static singleton: IAIProvider;
6
6
 
7
- public static instance(provider: string): IAIProvider {
7
+ public static instance(provider: string = 'OpenAi'): IAIProvider {
8
8
  if (!AiProviderFactory.singleton) {
9
9
  switch (provider) {
10
10
  case 'OpenAi':
package/src/index.ts CHANGED
@@ -4,13 +4,18 @@ import AILogModel from "./models/AILogModel.js";
4
4
  import AILogMongoRepository from "./repository/mongo/AILogMongoRepository.js";
5
5
  import AILogSqliteRepository from "./repository/sqlite/AILogSqliteRepository.js";
6
6
  import {OpenAiProviderFactory} from "./factory/OpenAiProviderFactory.js";
7
+ import {AiProviderFactory} from "./factory/AiProviderFactory.js";
7
8
  import AILogServiceFactory from "./factory/services/AILogServiceFactory.js";
8
9
  import {OpenAiProvider} from "./providers/OpenAiProvider.js";
9
10
  import {KnowledgeService} from "./services/KnowledgeService.js";
10
11
  import {AILogService} from "./services/AILogService.js";
11
12
  import AILogPermissions from "./permissions/AILogPermissions.js";
13
+ import AIPermissions from "./permissions/AIPermissions.js";
12
14
  import AILogController from "./controllers/AILogController.js";
15
+ import AICrudController from "./controllers/AICrudController.js";
16
+ import AIGenericController from "./controllers/AIGenericController.js";
13
17
  import AILogRoutes from "./routes/AILogRoutes.js";
18
+ import AIRoutes from "./routes/AIRoutes.js";
14
19
  import type {IAILogRepository} from "./interfaces/IAILogRepository.js";
15
20
  import type {
16
21
  IAIProvider,
@@ -48,11 +53,16 @@ export {
48
53
  AILogMongoRepository,
49
54
  AILogSqliteRepository,
50
55
  OpenAiProviderFactory,
56
+ AiProviderFactory,
51
57
  AILogServiceFactory,
52
58
  OpenAiProvider,
53
59
  KnowledgeService,
54
60
  AILogService,
55
61
  AILogPermissions,
62
+ AIPermissions,
56
63
  AILogController,
64
+ AICrudController,
65
+ AIGenericController,
57
66
  AILogRoutes,
67
+ AIRoutes
58
68
  }
@@ -0,0 +1,11 @@
1
+
2
+ enum AIPermissions {
3
+
4
+ Prompt = "ai:prompt",
5
+ PromptCrud = "ai:promptCrud",
6
+
7
+ }
8
+
9
+ export { AIPermissions };
10
+ export default AIPermissions;
11
+
@@ -0,0 +1,18 @@
1
+
2
+ import AICrudController from "../controllers/AICrudController.js";
3
+ import AIGenericController from "../controllers/AIGenericController.js";
4
+
5
+
6
+ async function AiFastifyRoutes(fastify, options) {
7
+
8
+ const crudController: AICrudController = new AICrudController()
9
+ const genericController: AIGenericController = new AIGenericController()
10
+
11
+ fastify.post('/api/ai/prompt/crud', (req,rep) => crudController.prompt(req,rep))
12
+ fastify.post('/api/ai/prompt/generic', (req,rep) => genericController.prompt(req,rep))
13
+
14
+
15
+ }
16
+
17
+ export default AiFastifyRoutes;
18
+ export {AiFastifyRoutes}