@dnax/core 0.13.5 → 0.13.7

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/app/hono.ts CHANGED
@@ -238,7 +238,7 @@ function HonoInstance(): typeof app {
238
238
  action: action,
239
239
  c: c,
240
240
  isAuth: c.var?._v?.isAuth || false,
241
- rest: new useRest({ tenant_id: tenant_id }),
241
+ rest: new useRest({ tenant_id: tenant_id, c: c }),
242
242
  session: session as any,
243
243
  });
244
244
  }
@@ -353,6 +353,7 @@ function HonoInstance(): typeof app {
353
353
 
354
354
  const rest = new useRest({
355
355
  tenant_id: c.var["tenant-id"],
356
+ c: c,
356
357
  });
357
358
 
358
359
  // Controlle action
@@ -363,14 +364,20 @@ function HonoInstance(): typeof app {
363
364
  // Exec service
364
365
  if (action == "execService") {
365
366
  if (!service) return fn.error("Service not found", 404);
366
- response = await service.fx({
367
- io: Cfg.io,
368
- data: body?.data || {},
369
- rest: rest,
370
- error: fn.error,
371
- session: sessionStorage(),
372
- isAuth: c.var?._v?.isAuth || false,
373
- });
367
+ let fx = service.exec || service.fx;
368
+ if (fx) {
369
+ response = await fx({
370
+ io: Cfg.io,
371
+ data: body?.data || {},
372
+ rest: rest,
373
+ error: fn.error,
374
+ session: sessionStorage(),
375
+ isAuth: c.var?._v?.isAuth || false,
376
+ });
377
+ } else {
378
+ c?.status(404);
379
+ return c.json({ message: "Service's function not found" });
380
+ }
374
381
 
375
382
  return c.json(response);
376
383
  }
@@ -555,6 +555,8 @@ class useRest {
555
555
  })
556
556
  .toArray();
557
557
 
558
+ result.docs = toJson(result.docs);
559
+
558
560
  if (col?.hooks?.afterFind && useHook) {
559
561
  await col.hooks.afterFind({
560
562
  sharedData: sharedData,
@@ -572,8 +574,9 @@ class useRest {
572
574
  });
573
575
  }
574
576
 
575
- let resultDocs = toJson(result.docs);
576
- if (typeof options?.elementAt == "number") {
577
+ let resultDocs = toJson([...(result?.docs || [])]);
578
+
579
+ if (typeof options?.elementAt == "number" && options?.elementAt) {
577
580
  resultDocs = resultDocs[options?.elementAt] ?? null;
578
581
  }
579
582
  return resolve(resultDocs);
package/index.ts CHANGED
@@ -4,10 +4,11 @@ import { toBson } from "./driver/mongo/utils";
4
4
  import { runApp } from "./app";
5
5
  import Joi from "joi";
6
6
  import define from "./define";
7
- import moment from "moment";
8
7
  import * as utils from "./utils";
9
8
  import { searchEngine } from "./lib/orama";
10
9
  import { dataCache } from "./lib/bento";
10
+ import { ai } from "./lib/ai";
11
+ import { crypt } from "./lib/crypto";
11
12
 
12
13
  /**
13
14
  * v is internal data validation and based of Joi validation.
@@ -16,4 +17,4 @@ import { dataCache } from "./lib/bento";
16
17
  */
17
18
  const v = Joi;
18
19
 
19
- export { runApp, define, utils, useRest, v, searchEngine, dataCache };
20
+ export { runApp, define, utils, useRest, v, dataCache, ai, crypt };
@@ -0,0 +1,21 @@
1
+ import { Ollama } from "./provider/ollama";
2
+ import { CohereClient } from "./provider/cohere";
3
+ import { Mistral } from "./provider/mistral";
4
+ import { OpenAI } from "./provider/openai";
5
+ import { Groq } from "./provider/groq";
6
+ import { Agent } from "./lib/Agent";
7
+ import { Space } from "./lib/Space";
8
+ import { Task } from "./lib/Task";
9
+
10
+ const ai = {
11
+ Ollama,
12
+ CohereClient,
13
+ Mistral,
14
+ OpenAI,
15
+ Groq,
16
+ Agent,
17
+ Space,
18
+ Task,
19
+ };
20
+
21
+ export { ai };
@@ -0,0 +1,159 @@
1
+ import { Groq } from "groq-sdk";
2
+ import { CohereClient } from "../provider/cohere";
3
+ import { OpenAI } from "../provider/openai";
4
+ import { Mistral } from "../provider/mistral";
5
+ type outputFunction = (content: any) => Promise<any>;
6
+
7
+ type AgentOptions = {
8
+ config: {
9
+ provider: "groq" | "cohere" | "openai" | "mistral";
10
+ model: string;
11
+ apiKey: string;
12
+ token?: string;
13
+ };
14
+ name?: string;
15
+ role: string;
16
+ goal: string;
17
+ backstory: string;
18
+ tools?: any[];
19
+ temperature?: number;
20
+ max_tokens?: number;
21
+ output_format?: "string" | "json";
22
+ fn: (
23
+ ctx: {
24
+ instruction: string;
25
+ data: object | any;
26
+ chat_history: any[];
27
+ activities: any[];
28
+ },
29
+ ai?: {
30
+ groq?: InstanceType<typeof Groq>;
31
+ cohere?: InstanceType<typeof CohereClient>;
32
+ openai?: InstanceType<typeof OpenAI>;
33
+ mistral?: InstanceType<typeof Mistral>;
34
+ }
35
+ ) => Promise<any>;
36
+ };
37
+
38
+ export type AgentType = InstanceType<typeof Agent>;
39
+
40
+ class Agent {
41
+ public cfg: AgentOptions;
42
+ #groq?: InstanceType<typeof Groq>;
43
+ #cohere?: InstanceType<typeof CohereClient>;
44
+ #openai?: InstanceType<typeof OpenAI>;
45
+ #mistral?: InstanceType<typeof Mistral>;
46
+ constructor(cfg: AgentOptions) {
47
+ this.cfg = cfg;
48
+
49
+ // Init default value
50
+ if (!this.cfg.temperature) this.cfg.temperature = 0.5;
51
+
52
+ // set groq client
53
+ if (cfg.config.provider === "groq") {
54
+ this.#groq = new Groq({
55
+ apiKey: cfg.config.apiKey,
56
+ });
57
+ }
58
+
59
+ // set cohere client
60
+ if (cfg.config.provider === "cohere") {
61
+ this.#cohere = new CohereClient({
62
+ token: cfg.config.apiKey || cfg.config.token,
63
+ });
64
+ }
65
+
66
+ // set openai client
67
+ if (cfg.config.provider === "openai") {
68
+ this.#openai = new OpenAI({
69
+ apiKey: cfg.config.apiKey,
70
+ });
71
+ }
72
+
73
+ // set mistral client
74
+ if (cfg.config.provider === "mistral") {
75
+ this.#mistral = new Mistral({
76
+ apiKey: cfg.config.apiKey,
77
+ });
78
+ }
79
+ }
80
+
81
+ async exec(
82
+ instruction: string,
83
+ data?: object
84
+ ): Promise<string | object | null | Array<any>> {
85
+ const messages: any = [];
86
+ var response: any = null;
87
+
88
+ return new Promise(async (resolve, reject) => {
89
+ try {
90
+ // Groq AI
91
+ if (this.#groq) {
92
+ response = await this.#groq.chat.completions.create({
93
+ messages: messages,
94
+ model: this.cfg.config.model,
95
+
96
+ temperature: Number(this?.cfg?.temperature),
97
+ tools: this.cfg?.tools || [],
98
+ response_format: {
99
+ type: this.cfg.output_format == "json" ? "json_object" : "text",
100
+ },
101
+ });
102
+ }
103
+
104
+ // Cohere AI
105
+ if (this.#cohere) {
106
+ response = await this.#cohere.chat({
107
+ chatHistory: messages,
108
+ message: instruction,
109
+ model: this.cfg.config.model,
110
+ temperature: Number(this?.cfg?.temperature),
111
+ preamble: this.cfg?.backstory || "",
112
+ maxTokens: Number(this?.cfg?.max_tokens),
113
+
114
+ tools: this.cfg?.tools || [],
115
+ responseFormat: {
116
+ type: this.cfg.output_format == "json" ? "json_object" : "text",
117
+ },
118
+ });
119
+ }
120
+
121
+ // OpenAI AI
122
+ if (this.#openai) {
123
+ response = await this.#openai.chat.completions.create({
124
+ max_tokens: Number(this?.cfg?.max_tokens),
125
+ messages: messages,
126
+ model: this.cfg.config.model,
127
+ temperature: Number(this?.cfg?.temperature),
128
+ tools: this.cfg?.tools || [],
129
+
130
+ response_format: {
131
+ type: this.cfg.output_format == "json" ? "json_object" : "text",
132
+ },
133
+ });
134
+ }
135
+
136
+ // Mistral AI
137
+ if (this.#mistral) {
138
+ response = await this.#mistral.chat.complete({
139
+ messages: messages,
140
+ model: this.cfg.config.model,
141
+ temperature: Number(this?.cfg?.temperature),
142
+ tools: this.cfg?.tools || [],
143
+ maxTokens: Number(this?.cfg?.max_tokens),
144
+ responseFormat: {
145
+ type: this.cfg.output_format == "json" ? "json_object" : "text",
146
+ },
147
+ });
148
+ }
149
+
150
+ resolve(response);
151
+ } catch (error) {
152
+ console?.error(error);
153
+ reject(error);
154
+ }
155
+ });
156
+ }
157
+ }
158
+
159
+ export { Agent };
@@ -0,0 +1,34 @@
1
+ import type { TaskType } from "./Task";
2
+ import type { AgentType } from "./Agent";
3
+ type SpaceOptions = {
4
+ name: string;
5
+ tasks: TaskType[];
6
+ agents: AgentType[];
7
+ arbitrator?: AgentType;
8
+ evaluators?: AgentType[];
9
+ summarizers?: AgentType[];
10
+ };
11
+
12
+ type responseType = {
13
+ task_name: string;
14
+ response: string;
15
+ };
16
+
17
+ class Space {
18
+ #tasks: TaskType[];
19
+ #agents: AgentType[];
20
+ #summarizers?: AgentType[];
21
+ #evaluator?: AgentType;
22
+ #arbitrator?: AgentType;
23
+ #activities?: any[];
24
+ constructor(cfg: SpaceOptions) {
25
+ this.#tasks = cfg.tasks;
26
+ this.#agents = cfg.agents;
27
+ this.#summarizers = cfg.summarizers;
28
+ this.#evaluator = cfg.evaluator;
29
+ this.#arbitrator = cfg.arbitrator;
30
+ }
31
+ run(content: string, data?: object) {}
32
+ }
33
+
34
+ export { Space };
@@ -0,0 +1,19 @@
1
+ import type { AgentType } from "./Agent";
2
+ export type TaskType = InstanceType<typeof Task>;
3
+ type TaskOptions = {
4
+ title?: string;
5
+ description: string;
6
+ expected_output: string;
7
+ output_format: "string" | "json" | boolean;
8
+ tools?: any[];
9
+ agent?: AgentType;
10
+ };
11
+ class Task {
12
+ public cfg: TaskOptions;
13
+ constructor(cfg: TaskOptions) {
14
+ this.cfg = cfg;
15
+ }
16
+ exec(instruction: string, data?: object) {}
17
+ }
18
+
19
+ export { Task };
@@ -0,0 +1,3 @@
1
+ import { CohereClient } from "cohere-ai";
2
+
3
+ export { CohereClient };
@@ -0,0 +1,3 @@
1
+ import { Groq } from "groq-sdk";
2
+
3
+ export { Groq };
@@ -0,0 +1,3 @@
1
+ import { Mistral } from "@mistralai/mistralai";
2
+
3
+ export { Mistral };
@@ -0,0 +1,3 @@
1
+ import { Ollama } from "ollama";
2
+
3
+ export { Ollama };
@@ -0,0 +1,3 @@
1
+ import OpenAI from "openai";
2
+
3
+ export { OpenAI };
package/lib/crypto.ts ADDED
@@ -0,0 +1,68 @@
1
+ import crypto from "node:crypto";
2
+
3
+ class AES {
4
+ #key;
5
+ constructor(
6
+ options: {
7
+ secretKey: string;
8
+ } = {
9
+ secretKey: "",
10
+ }
11
+ ) {
12
+ // Crée une clé de 256 bits (32 octets) en utilisant un hachage SHA-256 de la clé secrète fournie
13
+ this.#key = crypto.createHash("sha256").update(options.secretKey).digest();
14
+ }
15
+
16
+ // Fonction de chiffrement
17
+ encrypt(data: string | object) {
18
+ let dataEncoding = JSON.stringify(data);
19
+ const iv = crypto.randomBytes(12); // Génère un IV de 12 octets pour AES-GCM
20
+
21
+ // Crée un objet de chiffrement avec AES-256-GCM, la clé et l'IV
22
+ const cipher = crypto.createCipheriv("aes-256-gcm", this.#key, iv);
23
+
24
+ // Chiffre le message et convertit le texte chiffré en hexadécimal
25
+ let encrypted = cipher.update(dataEncoding, "utf8", "hex");
26
+ encrypted += cipher.final("hex");
27
+
28
+ // Récupère l'authTag pour l'intégrité
29
+ const authTag = cipher.getAuthTag().toString("hex");
30
+
31
+ // Retourne l'IV, l'authTag et le texte chiffré en format hexadécimal
32
+ return iv.toString("hex") + ":" + authTag + ":" + encrypted;
33
+ }
34
+
35
+ // Fonction de déchiffrement
36
+ decrypt(data: string) {
37
+ let encryptedData = data;
38
+ const [iv, authTag, ciphertext] = encryptedData.split(":");
39
+
40
+ /* const iv = Buffer.from(encryptedData.slice(0, 24), "hex");
41
+ const authTag = Buffer.from(encryptedData.slice(24, 56), "hex");
42
+ const ciphertext = encryptedData.slice(56); // Extrait les données chiffrées
43
+ */
44
+ // Crée un objet de déchiffrement avec AES-256-GCM, la clé et l'IV
45
+ const decipher = crypto.createDecipheriv(
46
+ "aes-256-gcm",
47
+ this.#key,
48
+ Buffer.from(iv, "hex")
49
+ );
50
+
51
+ // Définit l'authTag pour vérifier l'intégrité
52
+ decipher.setAuthTag(Buffer.from(authTag, "hex"));
53
+
54
+ // Déchiffre le texte chiffré et convertit en UTF-8
55
+ let decrypted = decipher.update(ciphertext, "hex", "utf8");
56
+ decrypted += decipher.final("utf8");
57
+
58
+ return JSON.parse(decrypted); // Retourne le message déchiffré
59
+ }
60
+ }
61
+
62
+ const message = "Bonjour, comment ça va ?";
63
+
64
+ const crypt = {
65
+ AES,
66
+ };
67
+
68
+ export { crypt };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@dnax/core",
3
- "version": "0.13.5",
3
+ "version": "0.13.7",
4
4
  "module": "index.ts",
5
5
  "type": "module",
6
6
  "bin": {
@@ -20,6 +20,7 @@
20
20
  "@clack/prompts": "^0.7.0",
21
21
  "@colors/colors": "^1.6.0",
22
22
  "@lukeed/ms": "^2.0.2",
23
+ "@mistralai/mistralai": "^1.3.0",
23
24
  "@orama/orama": "^2.0.23",
24
25
  "@types/dot-object": "^2.1.6",
25
26
  "@types/jsonwebtoken": "^9.0.6",
@@ -27,6 +28,7 @@
27
28
  "boxen": "^7.1.1",
28
29
  "chokidar": "^3.6.0",
29
30
  "clean-deep": "^3.4.0",
31
+ "cohere-ai": "^7.14.0",
30
32
  "collect.js": "^4.36.1",
31
33
  "consola": "^3.2.3",
32
34
  "cookie": "^0.6.0",
@@ -35,6 +37,7 @@
35
37
  "find-open-port": "^2.0.3",
36
38
  "fs-extra": "^11.2.0",
37
39
  "generate-unique-id": "^2.0.3",
40
+ "groq-sdk": "^0.7.0",
38
41
  "hono": "^4.6.3",
39
42
  "joi": "^17.13.3",
40
43
  "json-joy": "^16.8.0",
@@ -44,6 +47,8 @@
44
47
  "moment": "^2.30.1",
45
48
  "mongodb": "^6.8.0",
46
49
  "nodemailer": "^6.9.14",
50
+ "ollama": "^0.5.9",
51
+ "openai": "^4.71.1",
47
52
  "radash": "^12.1.0",
48
53
  "sharp": "^0.33.5",
49
54
  "signaldb": "^0.18.0",
package/tsconfig.json CHANGED
@@ -1,27 +1,27 @@
1
1
  {
2
2
  "compilerOptions": {
3
3
  // Enable latest features
4
- "lib": ["ESNext", "DOM"],
4
+ "lib": [
5
+ "ESNext",
6
+ "DOM"
7
+ ],
5
8
  "target": "ESNext",
6
9
  "module": "ESNext",
7
10
  "moduleDetection": "force",
8
11
  "jsx": "react-jsx",
9
12
  "allowJs": true,
10
-
11
13
  // Bundler mode
12
14
  "moduleResolution": "bundler",
13
15
  "allowImportingTsExtensions": true,
14
16
  "verbatimModuleSyntax": true,
15
17
  "noEmit": true,
16
-
17
18
  // Best practices
18
19
  "strict": true,
19
20
  "skipLibCheck": true,
20
21
  "noFallthroughCasesInSwitch": true,
21
-
22
22
  // Some stricter flags (disabled by default)
23
23
  "noUnusedLocals": false,
24
24
  "noUnusedParameters": false,
25
25
  "noPropertyAccessFromIndexSignature": false
26
26
  }
27
- }
27
+ }
package/types/index.ts CHANGED
@@ -164,6 +164,7 @@ export type sessionCtx = {
164
164
  token?: string;
165
165
  _v?: object;
166
166
  role?: string | null | undefined;
167
+ expireIn?: string;
167
168
  }) => void;
168
169
  get: () => {
169
170
  state: object;
@@ -185,7 +186,6 @@ export type hooksCtx = (ctx: {
185
186
  update?: updateParams;
186
187
  pipeline?: Array<object>;
187
188
  sharedData?: any;
188
- store?: any;
189
189
  action?: Actions;
190
190
  c?: Context;
191
191
  rest: InstanceType<typeof useRest>;
@@ -470,6 +470,7 @@ export type Endpoint = endpointCtx;
470
470
 
471
471
  export type Service = {
472
472
  /**
473
+ * @internal
473
474
  * Dont touch it automatically generated
474
475
  */
475
476
  tenant_id?: string;
@@ -482,7 +483,27 @@ export type Service = {
482
483
  * @param ctx
483
484
  * @returns
484
485
  */
485
- fx: (ctx: {
486
+ fx?: (ctx: {
487
+ /**
488
+ * Incomming data [payload]
489
+ */
490
+ data: object;
491
+ /**
492
+ * Local rest linked to current tenant
493
+ */
494
+ rest: InstanceType<typeof useRest>;
495
+ error: typeof fn.error;
496
+ /**
497
+ * Session of request
498
+ */
499
+ session: sessionCtx;
500
+ /**
501
+ * authenticated user or no
502
+ */
503
+ isAuth: boolean;
504
+ io: Io;
505
+ }) => any;
506
+ exec?: (ctx: {
486
507
  /**
487
508
  * Incomming data [payload]
488
509
  */