@exulu/backend 1.35.0 → 1.36.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.
package/CHANGELOG.md CHANGED
@@ -1,6 +1,6 @@
1
- # [1.35.0](https://github.com/Qventu/exulu-backend/compare/v1.34.1...v1.35.0) (2025-11-18)
1
+ ## [1.36.1](https://github.com/Qventu/exulu-backend/compare/v1.36.0...v1.36.1) (2025-11-19)
2
2
 
3
3
 
4
- ### Features
4
+ ### Bug Fixes
5
5
 
6
- * add Google Vertex AI agent support and enhance embedder configuration system ([9668c10](https://github.com/Qventu/exulu-backend/commit/9668c1093e9bc00f64a4a0b2e1137625ca0b2396))
6
+ * issue with upsert ([37c1805](https://github.com/Qventu/exulu-backend/commit/37c1805ff14d3c1aacc116760d8b905db8a2ce6c))
package/dist/index.cjs CHANGED
@@ -3958,7 +3958,8 @@ type PageInfo {
3958
3958
  schedule: source.config?.schedule,
3959
3959
  queue: queueName,
3960
3960
  retries: source.config?.retries,
3961
- backoff: source.config?.backoff
3961
+ backoff: source.config?.backoff,
3962
+ params: source.config?.params
3962
3963
  }
3963
3964
  };
3964
3965
  }));
@@ -4013,7 +4014,8 @@ type PageInfo {
4013
4014
  schedule: source.config?.schedule,
4014
4015
  queue: queueName,
4015
4016
  retries: source.config?.retries,
4016
- backoff: source.config?.backoff
4017
+ backoff: source.config?.backoff,
4018
+ params: source.config?.params
4017
4019
  }
4018
4020
  };
4019
4021
  }));
@@ -4270,6 +4272,13 @@ type ContextSourceConfig {
4270
4272
  queue: String
4271
4273
  retries: Int
4272
4274
  backoff: ContextSourceBackoff
4275
+ params: [ContextSourceParam!]
4276
+ }
4277
+
4278
+ type ContextSourceParam {
4279
+ name: String!
4280
+ description: String!
4281
+ default: String
4273
4282
  }
4274
4283
 
4275
4284
  type ContextSourceBackoff {
@@ -5898,7 +5907,13 @@ var ExuluContext = class {
5898
5907
  }
5899
5908
  ).returning("id");
5900
5909
  if (upsert) {
5901
- mutation.onConflict().merge();
5910
+ if (item.external_id) {
5911
+ mutation.onConflict("external_id").merge();
5912
+ } else if (item.id) {
5913
+ mutation.onConflict("id").merge();
5914
+ } else {
5915
+ throw new Error("Either id or external_id must be provided for upsert");
5916
+ }
5902
5917
  }
5903
5918
  const results = await mutation;
5904
5919
  if (!results[0]) {
@@ -6074,14 +6089,13 @@ var ExuluContext = class {
6074
6089
  table.text("description");
6075
6090
  table.text("tags");
6076
6091
  table.boolean("archived").defaultTo(false);
6077
- table.text("external_id");
6092
+ table.text("external_id").unique();
6078
6093
  table.text("created_by");
6079
6094
  table.text("ttl");
6080
6095
  table.text("rights_mode").defaultTo(this.configuration?.defaultRightsMode ?? "private");
6081
6096
  table.integer("textlength");
6082
6097
  table.text("source");
6083
6098
  table.timestamp("embeddings_updated_at");
6084
- table.unique(["id", "external_id"]);
6085
6099
  for (const field of this.fields) {
6086
6100
  let { type, name, unique } = field;
6087
6101
  if (!type || !name) {
@@ -8119,24 +8133,41 @@ var claudeSonnet45Agent = new ExuluAgent2({
8119
8133
 
8120
8134
  // src/templates/agents/google/vertex/index.ts
8121
8135
  var import_google_vertex = require("@ai-sdk/google-vertex");
8122
- var wrapperJsonGoogleAuth = `{
8123
- "project": "project-name",
8124
- "location": "europe-west1",
8125
- "googleAuthOptions": {
8126
- "credentials": {
8127
- "type": "service_account",
8128
- "project_id": "XX-XXXX",
8129
- "private_key_id": "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
8130
- "private_key": "-----BEGIN PRIVATE KEY-----
8131
- .... your private key ....
8132
- -----END PRIVATE KEY-----
8133
- ",
8134
- "client_email": "xxxx@xxxx.gserviceaccount.com",
8135
- "client_id": "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
8136
- "universe_domain": "googleapis.com"
8137
- }
8138
- }
8139
- }`;
8136
+ var import_google_vertex2 = require("@ai-sdk/google-vertex");
8137
+ var vertexAuthenticationInformation = `
8138
+ ### Vertex Authentication Setup (Google Auth)
8139
+
8140
+ Vertex uses **Google Auth**. To authenticate, follow these steps:
8141
+
8142
+ 1. Visit the Google Cloud Credentials page:
8143
+ **[https://console.cloud.google.com/apis/credentials](https://console.cloud.google.com/apis/credentials)**
8144
+
8145
+ 2. Create a **Service Account**.
8146
+
8147
+ 3. Navigate to **Keys** \u2192 **Add Key** \u2192 **Create new key** \u2192 select **JSON**.
8148
+
8149
+ 4. Download the generated JSON key file.
8150
+
8151
+ 5. Copy the **entire contents** of the JSON file into an **encrypted authentication variable** in your IMP Agent Instance, using a structure like this:
8152
+
8153
+ \`\`\`json
8154
+ {
8155
+ "project": "project-name",
8156
+ "location": "europe-west1",
8157
+ "googleAuthOptions": {
8158
+ "credentials": {
8159
+ "type": "service_account",
8160
+ "project_id": "XX-XXXX",
8161
+ "private_key_id": "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
8162
+ "private_key": "-----BEGIN PRIVATE KEY-----.....-----END PRIVATE KEY-----",
8163
+ "client_email": "xxxx@xxxx.gserviceaccount.com",
8164
+ "client_id": "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
8165
+ "universe_domain": "googleapis.com"
8166
+ }
8167
+ }
8168
+ }
8169
+ \`\`\`
8170
+ `;
8140
8171
  var vertexGemini25FlashAgent = new ExuluAgent2({
8141
8172
  id: `default_vertex_gemini_2_5_flash_agent`,
8142
8173
  name: `GEMINI-2.5-FLASH`,
@@ -8150,10 +8181,7 @@ var vertexGemini25FlashAgent = new ExuluAgent2({
8150
8181
  audio: [".mpeg", ".mp3", ".m4a", ".wav", ".mp4"],
8151
8182
  video: [".mp4", ".mpeg"]
8152
8183
  },
8153
- authenticationInformation: `Vertex uses Google Auth, to authenticate you need to visit
8154
- https://console.cloud.google.com/apis/credentials, create a service account, go to 'keys'
8155
- and download the resulting JSON file, and copy the contents of the JSON file into an
8156
- encrypted authentication variable in your IMP Agent Instance like this: ${wrapperJsonGoogleAuth}.`,
8184
+ authenticationInformation: vertexAuthenticationInformation,
8157
8185
  maxContextLength: 1048576,
8158
8186
  config: {
8159
8187
  name: `GEMINI-2.5-FLASH`,
@@ -8171,8 +8199,46 @@ var vertexGemini25FlashAgent = new ExuluAgent2({
8171
8199
  if (!googleAuthPayload.location) {
8172
8200
  throw new Error("Location not set in authentication json for Google Vertex Gemini 2.5 Flash agent, should be for example 'europe-west1'");
8173
8201
  }
8174
- const vertex = (0, import_google_vertex.createVertex)(googleAuthPayload);
8175
- const model = vertex("gemini-2.5-flash");
8202
+ const vertex2 = (0, import_google_vertex.createVertex)(googleAuthPayload);
8203
+ const model = vertex2("gemini-2.5-flash");
8204
+ return model;
8205
+ }
8206
+ }
8207
+ }
8208
+ });
8209
+ var vertexGemini3ProAgent = new ExuluAgent2({
8210
+ id: `default_vertex_gemini_3_pro_agent`,
8211
+ name: `GEMINI-3-PRO`,
8212
+ provider: "vertex",
8213
+ description: `Google Vertex Gemini 3 Pro model. Very high intelligence and capability. Moderately Fast.`,
8214
+ type: "agent",
8215
+ capabilities: {
8216
+ text: true,
8217
+ images: [".png", ".jpg", ".jpeg", ".webp"],
8218
+ files: [".pdf", ".txt"],
8219
+ audio: [".mpeg", ".mp3", ".m4a", ".wav", ".mp4"],
8220
+ video: [".mp4", ".mpeg"]
8221
+ },
8222
+ authenticationInformation: vertexAuthenticationInformation,
8223
+ maxContextLength: 1048576,
8224
+ config: {
8225
+ name: `GEMINI-3-PRO`,
8226
+ instructions: "",
8227
+ model: {
8228
+ create: ({ apiKey }) => {
8229
+ console.log("[EXULU] apiKey", apiKey);
8230
+ if (!apiKey) {
8231
+ throw new Error("Auth credentials not found for Google Vertex agent, make sure you have set the provider api key to a valid google authentication json.");
8232
+ }
8233
+ const googleAuthPayload = JSON.parse(apiKey || "{}");
8234
+ if (!googleAuthPayload) {
8235
+ throw new Error("API key not found for Google Vertex Gemini 3 Pro agent.");
8236
+ }
8237
+ if (!googleAuthPayload.location) {
8238
+ throw new Error("Location not set in authentication json for Google Vertex Gemini 3 Pro agent, should be for example 'europe-west1'");
8239
+ }
8240
+ const vertex2 = (0, import_google_vertex.createVertex)(googleAuthPayload);
8241
+ const model = vertex2("gemini-3-pro-preview");
8176
8242
  return model;
8177
8243
  }
8178
8244
  }
@@ -9593,6 +9659,7 @@ var ExuluApp = class {
9593
9659
  claudeSonnet4Agent,
9594
9660
  claudeOpus4Agent,
9595
9661
  vertexGemini25FlashAgent,
9662
+ vertexGemini3ProAgent,
9596
9663
  claudeSonnet45Agent,
9597
9664
  gpt5MiniAgent,
9598
9665
  gpt5agent,
@@ -11332,7 +11399,8 @@ var ExuluDefaultAgents = {
11332
11399
  sonnet45: claudeSonnet45Agent
11333
11400
  },
11334
11401
  google: {
11335
- vertexGemini25Flash: vertexGemini25FlashAgent
11402
+ vertexGemini25Flash: vertexGemini25FlashAgent,
11403
+ vertexGemini3Pro: vertexGemini3ProAgent
11336
11404
  },
11337
11405
  openai: {
11338
11406
  gpt5Mini: gpt5MiniAgent,
package/dist/index.d.cts CHANGED
@@ -570,6 +570,11 @@ type ExuluContextSource = {
570
570
  type: 'exponential' | 'linear';
571
571
  delay: number;
572
572
  };
573
+ params?: {
574
+ name: string;
575
+ description: string;
576
+ default?: string;
577
+ }[];
573
578
  };
574
579
  execute: (inputs: any) => Promise<Item[]>;
575
580
  };
@@ -1610,6 +1615,7 @@ declare const ExuluDefaultAgents: {
1610
1615
  };
1611
1616
  google: {
1612
1617
  vertexGemini25Flash: ExuluAgent;
1618
+ vertexGemini3Pro: ExuluAgent;
1613
1619
  };
1614
1620
  openai: {
1615
1621
  gpt5Mini: ExuluAgent;
package/dist/index.d.ts CHANGED
@@ -570,6 +570,11 @@ type ExuluContextSource = {
570
570
  type: 'exponential' | 'linear';
571
571
  delay: number;
572
572
  };
573
+ params?: {
574
+ name: string;
575
+ description: string;
576
+ default?: string;
577
+ }[];
573
578
  };
574
579
  execute: (inputs: any) => Promise<Item[]>;
575
580
  };
@@ -1610,6 +1615,7 @@ declare const ExuluDefaultAgents: {
1610
1615
  };
1611
1616
  google: {
1612
1617
  vertexGemini25Flash: ExuluAgent;
1618
+ vertexGemini3Pro: ExuluAgent;
1613
1619
  };
1614
1620
  openai: {
1615
1621
  gpt5Mini: ExuluAgent;
package/dist/index.js CHANGED
@@ -3906,7 +3906,8 @@ type PageInfo {
3906
3906
  schedule: source.config?.schedule,
3907
3907
  queue: queueName,
3908
3908
  retries: source.config?.retries,
3909
- backoff: source.config?.backoff
3909
+ backoff: source.config?.backoff,
3910
+ params: source.config?.params
3910
3911
  }
3911
3912
  };
3912
3913
  }));
@@ -3961,7 +3962,8 @@ type PageInfo {
3961
3962
  schedule: source.config?.schedule,
3962
3963
  queue: queueName,
3963
3964
  retries: source.config?.retries,
3964
- backoff: source.config?.backoff
3965
+ backoff: source.config?.backoff,
3966
+ params: source.config?.params
3965
3967
  }
3966
3968
  };
3967
3969
  }));
@@ -4218,6 +4220,13 @@ type ContextSourceConfig {
4218
4220
  queue: String
4219
4221
  retries: Int
4220
4222
  backoff: ContextSourceBackoff
4223
+ params: [ContextSourceParam!]
4224
+ }
4225
+
4226
+ type ContextSourceParam {
4227
+ name: String!
4228
+ description: String!
4229
+ default: String
4221
4230
  }
4222
4231
 
4223
4232
  type ContextSourceBackoff {
@@ -5865,7 +5874,13 @@ var ExuluContext = class {
5865
5874
  }
5866
5875
  ).returning("id");
5867
5876
  if (upsert) {
5868
- mutation.onConflict().merge();
5877
+ if (item.external_id) {
5878
+ mutation.onConflict("external_id").merge();
5879
+ } else if (item.id) {
5880
+ mutation.onConflict("id").merge();
5881
+ } else {
5882
+ throw new Error("Either id or external_id must be provided for upsert");
5883
+ }
5869
5884
  }
5870
5885
  const results = await mutation;
5871
5886
  if (!results[0]) {
@@ -6041,14 +6056,13 @@ var ExuluContext = class {
6041
6056
  table.text("description");
6042
6057
  table.text("tags");
6043
6058
  table.boolean("archived").defaultTo(false);
6044
- table.text("external_id");
6059
+ table.text("external_id").unique();
6045
6060
  table.text("created_by");
6046
6061
  table.text("ttl");
6047
6062
  table.text("rights_mode").defaultTo(this.configuration?.defaultRightsMode ?? "private");
6048
6063
  table.integer("textlength");
6049
6064
  table.text("source");
6050
6065
  table.timestamp("embeddings_updated_at");
6051
- table.unique(["id", "external_id"]);
6052
6066
  for (const field of this.fields) {
6053
6067
  let { type, name, unique } = field;
6054
6068
  if (!type || !name) {
@@ -8086,24 +8100,41 @@ var claudeSonnet45Agent = new ExuluAgent2({
8086
8100
 
8087
8101
  // src/templates/agents/google/vertex/index.ts
8088
8102
  import { createVertex } from "@ai-sdk/google-vertex";
8089
- var wrapperJsonGoogleAuth = `{
8090
- "project": "project-name",
8091
- "location": "europe-west1",
8092
- "googleAuthOptions": {
8093
- "credentials": {
8094
- "type": "service_account",
8095
- "project_id": "XX-XXXX",
8096
- "private_key_id": "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
8097
- "private_key": "-----BEGIN PRIVATE KEY-----
8098
- .... your private key ....
8099
- -----END PRIVATE KEY-----
8100
- ",
8101
- "client_email": "xxxx@xxxx.gserviceaccount.com",
8102
- "client_id": "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
8103
- "universe_domain": "googleapis.com"
8104
- }
8105
- }
8106
- }`;
8103
+ import "@ai-sdk/google-vertex";
8104
+ var vertexAuthenticationInformation = `
8105
+ ### Vertex Authentication Setup (Google Auth)
8106
+
8107
+ Vertex uses **Google Auth**. To authenticate, follow these steps:
8108
+
8109
+ 1. Visit the Google Cloud Credentials page:
8110
+ **[https://console.cloud.google.com/apis/credentials](https://console.cloud.google.com/apis/credentials)**
8111
+
8112
+ 2. Create a **Service Account**.
8113
+
8114
+ 3. Navigate to **Keys** \u2192 **Add Key** \u2192 **Create new key** \u2192 select **JSON**.
8115
+
8116
+ 4. Download the generated JSON key file.
8117
+
8118
+ 5. Copy the **entire contents** of the JSON file into an **encrypted authentication variable** in your IMP Agent Instance, using a structure like this:
8119
+
8120
+ \`\`\`json
8121
+ {
8122
+ "project": "project-name",
8123
+ "location": "europe-west1",
8124
+ "googleAuthOptions": {
8125
+ "credentials": {
8126
+ "type": "service_account",
8127
+ "project_id": "XX-XXXX",
8128
+ "private_key_id": "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
8129
+ "private_key": "-----BEGIN PRIVATE KEY-----.....-----END PRIVATE KEY-----",
8130
+ "client_email": "xxxx@xxxx.gserviceaccount.com",
8131
+ "client_id": "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
8132
+ "universe_domain": "googleapis.com"
8133
+ }
8134
+ }
8135
+ }
8136
+ \`\`\`
8137
+ `;
8107
8138
  var vertexGemini25FlashAgent = new ExuluAgent2({
8108
8139
  id: `default_vertex_gemini_2_5_flash_agent`,
8109
8140
  name: `GEMINI-2.5-FLASH`,
@@ -8117,10 +8148,7 @@ var vertexGemini25FlashAgent = new ExuluAgent2({
8117
8148
  audio: [".mpeg", ".mp3", ".m4a", ".wav", ".mp4"],
8118
8149
  video: [".mp4", ".mpeg"]
8119
8150
  },
8120
- authenticationInformation: `Vertex uses Google Auth, to authenticate you need to visit
8121
- https://console.cloud.google.com/apis/credentials, create a service account, go to 'keys'
8122
- and download the resulting JSON file, and copy the contents of the JSON file into an
8123
- encrypted authentication variable in your IMP Agent Instance like this: ${wrapperJsonGoogleAuth}.`,
8151
+ authenticationInformation: vertexAuthenticationInformation,
8124
8152
  maxContextLength: 1048576,
8125
8153
  config: {
8126
8154
  name: `GEMINI-2.5-FLASH`,
@@ -8138,8 +8166,46 @@ var vertexGemini25FlashAgent = new ExuluAgent2({
8138
8166
  if (!googleAuthPayload.location) {
8139
8167
  throw new Error("Location not set in authentication json for Google Vertex Gemini 2.5 Flash agent, should be for example 'europe-west1'");
8140
8168
  }
8141
- const vertex = createVertex(googleAuthPayload);
8142
- const model = vertex("gemini-2.5-flash");
8169
+ const vertex2 = createVertex(googleAuthPayload);
8170
+ const model = vertex2("gemini-2.5-flash");
8171
+ return model;
8172
+ }
8173
+ }
8174
+ }
8175
+ });
8176
+ var vertexGemini3ProAgent = new ExuluAgent2({
8177
+ id: `default_vertex_gemini_3_pro_agent`,
8178
+ name: `GEMINI-3-PRO`,
8179
+ provider: "vertex",
8180
+ description: `Google Vertex Gemini 3 Pro model. Very high intelligence and capability. Moderately Fast.`,
8181
+ type: "agent",
8182
+ capabilities: {
8183
+ text: true,
8184
+ images: [".png", ".jpg", ".jpeg", ".webp"],
8185
+ files: [".pdf", ".txt"],
8186
+ audio: [".mpeg", ".mp3", ".m4a", ".wav", ".mp4"],
8187
+ video: [".mp4", ".mpeg"]
8188
+ },
8189
+ authenticationInformation: vertexAuthenticationInformation,
8190
+ maxContextLength: 1048576,
8191
+ config: {
8192
+ name: `GEMINI-3-PRO`,
8193
+ instructions: "",
8194
+ model: {
8195
+ create: ({ apiKey }) => {
8196
+ console.log("[EXULU] apiKey", apiKey);
8197
+ if (!apiKey) {
8198
+ throw new Error("Auth credentials not found for Google Vertex agent, make sure you have set the provider api key to a valid google authentication json.");
8199
+ }
8200
+ const googleAuthPayload = JSON.parse(apiKey || "{}");
8201
+ if (!googleAuthPayload) {
8202
+ throw new Error("API key not found for Google Vertex Gemini 3 Pro agent.");
8203
+ }
8204
+ if (!googleAuthPayload.location) {
8205
+ throw new Error("Location not set in authentication json for Google Vertex Gemini 3 Pro agent, should be for example 'europe-west1'");
8206
+ }
8207
+ const vertex2 = createVertex(googleAuthPayload);
8208
+ const model = vertex2("gemini-3-pro-preview");
8143
8209
  return model;
8144
8210
  }
8145
8211
  }
@@ -9560,6 +9626,7 @@ var ExuluApp = class {
9560
9626
  claudeSonnet4Agent,
9561
9627
  claudeOpus4Agent,
9562
9628
  vertexGemini25FlashAgent,
9629
+ vertexGemini3ProAgent,
9563
9630
  claudeSonnet45Agent,
9564
9631
  gpt5MiniAgent,
9565
9632
  gpt5agent,
@@ -11299,7 +11366,8 @@ var ExuluDefaultAgents = {
11299
11366
  sonnet45: claudeSonnet45Agent
11300
11367
  },
11301
11368
  google: {
11302
- vertexGemini25Flash: vertexGemini25FlashAgent
11369
+ vertexGemini25Flash: vertexGemini25FlashAgent,
11370
+ vertexGemini3Pro: vertexGemini3ProAgent
11303
11371
  },
11304
11372
  openai: {
11305
11373
  gpt5Mini: gpt5MiniAgent,
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@exulu/backend",
3
3
  "author": "Qventu Bv.",
4
- "version": "1.35.0",
4
+ "version": "1.36.1",
5
5
  "main": "./dist/index.js",
6
6
  "private": false,
7
7
  "publishConfig": {
@@ -67,7 +67,7 @@
67
67
  "@opentelemetry/sdk-node": "^0.203.0",
68
68
  "@opentelemetry/semantic-conventions": "^1.36.0",
69
69
  "@opentelemetry/winston-transport": "^0.14.1",
70
- "ai": "^5.0.56",
70
+ "ai": "^5.0.95",
71
71
  "apollo-server": "^3.13.0",
72
72
  "bcryptjs": "^3.0.2",
73
73
  "body-parser": "^2.2.0",
@@ -24,6 +24,11 @@ export interface Context {
24
24
  schedule?: string
25
25
  queue?: string
26
26
  retries?: number
27
+ params?: {
28
+ name: string,
29
+ description: string,
30
+ default: string
31
+ }[]
27
32
  backoff?: {
28
33
  type: 'exponential' | 'linear'
29
34
  delay: number