@exulu/backend 1.26.0 → 1.27.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/CHANGELOG.md CHANGED
@@ -1,14 +1,6 @@
1
- # [1.26.0](https://github.com/Qventu/exulu-backend/compare/v1.25.5...v1.26.0) (2025-10-12)
2
-
3
-
4
- ### Bug Fixes
5
-
6
- * add github token to actions ([d328d2d](https://github.com/Qventu/exulu-backend/commit/d328d2d6557d9db016cbd09db918b06c78354f7a))
7
- * merged evals feature to main ([5b58fb9](https://github.com/Qventu/exulu-backend/commit/5b58fb9dcb509e528d0ca29e53686acb14b6c843))
1
+ # [1.27.0](https://github.com/Qventu/exulu-backend/compare/v1.26.0...v1.27.0) (2025-10-14)
8
2
 
9
3
 
10
4
  ### Features
11
5
 
12
- * add dynamic file fields to context items, list files api and much more ([0a8d7cb](https://github.com/Qventu/exulu-backend/commit/0a8d7cb0dc75979486558a5b4be672dec1e7b2fd))
13
- * evals ([19aaebd](https://github.com/Qventu/exulu-backend/commit/19aaebde4f068f9440d6ba5177e03328ee7634be))
14
- * file processors ([caef87b](https://github.com/Qventu/exulu-backend/commit/caef87b25b3bfd4ae684cbbf7d4507c77528b4ae))
6
+ * default agents and ability to import theme ([ac49c74](https://github.com/Qventu/exulu-backend/commit/ac49c742e68c172a7011766166050b907a2020a3))
package/dist/index.cjs CHANGED
@@ -1256,6 +1256,31 @@ var rbacSchema = {
1256
1256
  }
1257
1257
  ]
1258
1258
  };
1259
+ var platformConfigurationsSchema = {
1260
+ type: "platform_configurations",
1261
+ name: {
1262
+ plural: "platform_configurations",
1263
+ singular: "platform_configuration"
1264
+ },
1265
+ fields: [
1266
+ {
1267
+ name: "config_key",
1268
+ type: "text",
1269
+ required: true,
1270
+ unique: true,
1271
+ index: true
1272
+ },
1273
+ {
1274
+ name: "config_value",
1275
+ type: "json",
1276
+ required: true
1277
+ },
1278
+ {
1279
+ name: "description",
1280
+ type: "text"
1281
+ }
1282
+ ]
1283
+ };
1259
1284
  var addCoreFields = (schema) => {
1260
1285
  schema.fields.forEach((field) => {
1261
1286
  if (field.type === "file") {
@@ -1297,7 +1322,8 @@ var coreSchemas = {
1297
1322
  evalRunsSchema: () => addCoreFields(evalRunsSchema),
1298
1323
  variablesSchema: () => addCoreFields(variablesSchema),
1299
1324
  rbacSchema: () => addCoreFields(rbacSchema),
1300
- workflowTemplatesSchema: () => addCoreFields(workflowTemplatesSchema)
1325
+ workflowTemplatesSchema: () => addCoreFields(workflowTemplatesSchema),
1326
+ platformConfigurationsSchema: () => addCoreFields(platformConfigurationsSchema)
1301
1327
  };
1302
1328
  }
1303
1329
  };
@@ -1608,6 +1634,7 @@ ${enumValues}
1608
1634
  fields.push(" streaming: Boolean");
1609
1635
  fields.push(" capabilities: AgentCapabilities");
1610
1636
  fields.push(" maxContextLength: Int");
1637
+ fields.push(" provider: String");
1611
1638
  fields.push(" slug: String");
1612
1639
  fields.push(" evals: [AgentEvalFunction]");
1613
1640
  }
@@ -2300,7 +2327,8 @@ var backendAgentFields = [
2300
2327
  "rateLimit",
2301
2328
  "streaming",
2302
2329
  "capabilities",
2303
- "maxContextLength"
2330
+ "maxContextLength",
2331
+ "provider"
2304
2332
  ];
2305
2333
  var removeAgentFields = (requestedFields) => {
2306
2334
  const filtered = requestedFields.filter((field) => !backendAgentFields.includes(field));
@@ -2365,6 +2393,9 @@ var addAgentFields = async (requestedFields, agents, result, tools, user) => {
2365
2393
  if (requestedFields.includes("maxContextLength")) {
2366
2394
  result.maxContextLength = backend?.maxContextLength || 0;
2367
2395
  }
2396
+ if (requestedFields.includes("provider")) {
2397
+ result.provider = backend?.provider || "";
2398
+ }
2368
2399
  if (requestedFields.includes("evals")) {
2369
2400
  result.evals = backend?.evals?.map((evalFunc) => ({
2370
2401
  id: evalFunc.id,
@@ -3461,6 +3492,7 @@ type Provider {
3461
3492
  name: String!
3462
3493
  description: String
3463
3494
  providerName: String
3495
+ provider: String
3464
3496
  modelName: String
3465
3497
  type: EnumProviderType!
3466
3498
  }
@@ -4215,6 +4247,7 @@ var ExuluAgent2 = class {
4215
4247
  // The ID is used for storing references to agents so it is important it does not change.
4216
4248
  id;
4217
4249
  name;
4250
+ provider;
4218
4251
  description = "";
4219
4252
  slug = "";
4220
4253
  type;
@@ -4226,11 +4259,12 @@ var ExuluAgent2 = class {
4226
4259
  // private memory: Memory | undefined; // TODO do own implementation
4227
4260
  model;
4228
4261
  capabilities;
4229
- constructor({ id, name, description, config, rateLimit, capabilities, type, maxContextLength, evals }) {
4262
+ constructor({ id, name, description, config, rateLimit, capabilities, type, maxContextLength, evals, provider }) {
4230
4263
  this.id = id;
4231
4264
  this.name = name;
4232
4265
  this.description = description;
4233
4266
  this.rateLimit = rateLimit;
4267
+ this.provider = provider;
4234
4268
  this.config = config;
4235
4269
  this.type = type;
4236
4270
  this.maxContextLength = maxContextLength;
@@ -5409,6 +5443,7 @@ var {
5409
5443
  testCasesSchema: testCasesSchema2,
5410
5444
  evalSetsSchema: evalSetsSchema2,
5411
5445
  evalRunsSchema: evalRunsSchema2,
5446
+ platformConfigurationsSchema: platformConfigurationsSchema2,
5412
5447
  agentSessionsSchema: agentSessionsSchema2,
5413
5448
  agentMessagesSchema: agentMessagesSchema2,
5414
5449
  rolesSchema: rolesSchema2,
@@ -5482,6 +5517,7 @@ var createExpressRoutes = async (app, agents, tools, contexts, config, tracer) =
5482
5517
  agentsSchema2(),
5483
5518
  projectsSchema2(),
5484
5519
  evalRunsSchema2(),
5520
+ platformConfigurationsSchema2(),
5485
5521
  evalSetsSchema2(),
5486
5522
  testCasesSchema2(),
5487
5523
  agentSessionsSchema2(),
@@ -5730,6 +5766,22 @@ Mood: friendly and intelligent.
5730
5766
  authenticated: true
5731
5767
  });
5732
5768
  });
5769
+ app.get("/theme", async (req, res) => {
5770
+ const { db: db4 } = await postgresClient();
5771
+ const themeConfig = await db4.from("platform_configurations").where({ config_key: "theme_config" }).first();
5772
+ if (!themeConfig) {
5773
+ res.status(200).json({
5774
+ theme: {
5775
+ light: {},
5776
+ dark: {}
5777
+ }
5778
+ });
5779
+ return;
5780
+ }
5781
+ res.status(200).json({
5782
+ theme: themeConfig.config_value
5783
+ });
5784
+ });
5733
5785
  app.get("/config", async (req, res) => {
5734
5786
  res.status(200).json({
5735
5787
  MCP: {
@@ -6379,33 +6431,76 @@ ${code}`
6379
6431
  // src/registry/index.ts
6380
6432
  var import_express8 = __toESM(require("express"), 1);
6381
6433
 
6382
- // src/templates/agents/claude-sonnet-4.ts
6434
+ // src/templates/agents/anthropic/claude.ts
6383
6435
  var import_anthropic = require("@ai-sdk/anthropic");
6436
+ var claudeOpus4Agent = new ExuluAgent2({
6437
+ id: `default_claude_4_opus_agent`,
6438
+ name: `CLAUDE-OPUS-4`,
6439
+ provider: "anthropic",
6440
+ description: `Previous Anthropic flagship model. Very high intelligence and capability. Moderately Fast.`,
6441
+ type: "agent",
6442
+ capabilities: {
6443
+ text: true,
6444
+ images: [".png", ".jpg", ".jpeg", ".webp"],
6445
+ files: [".pdf", ".docx", ".xlsx", ".xls", ".csv", ".pptx", ".ppt", ".json"],
6446
+ audio: [],
6447
+ video: []
6448
+ },
6449
+ evals: [],
6450
+ maxContextLength: 2e5,
6451
+ config: {
6452
+ name: `CLAUDE-OPUS-4`,
6453
+ instructions: "",
6454
+ model: {
6455
+ create: ({ apiKey }) => {
6456
+ const anthropic = (0, import_anthropic.createAnthropic)({
6457
+ apiKey
6458
+ });
6459
+ return anthropic.languageModel("claude-opus-4-0");
6460
+ }
6461
+ // todo add a field of type string that adds a dropdown list from which the user can select the model
6462
+ // todo for each model, check which provider is used, and require the admin to add one or multiple
6463
+ // API keys for the provider (which we can then auto-rotate).
6464
+ // todo also add custom fields for rate limiting, so the admin can set custom rate limits for the agent
6465
+ // and allow him/her to decide if the rate limit is per user or per agent.
6466
+ // todo finally allow switching on or off immutable audit logs on the agent. Which then enables OTEL
6467
+ // and stores the logs into the pre-defined storage.
6468
+ }
6469
+ }
6470
+ });
6384
6471
  var claudeSonnet4Agent = new ExuluAgent2({
6385
6472
  id: `claude_code_agent`,
6386
- name: `Claude Code Agent`,
6387
- description: `Claude Code agent, enabling the creation of multiple Claude Code Agent instances with different configurations (rate limits, functions, etc).`,
6473
+ name: `CLAUDE-SONNET-4`,
6474
+ provider: "anthropic",
6475
+ description: `High intelligence and balanced performance, used a lot for agentic coding tasks. Anthropic provides a newer 4.5 model that is more powerful and faster.`,
6388
6476
  type: "agent",
6477
+ capabilities: {
6478
+ text: true,
6479
+ images: [".png", ".jpg", ".jpeg", ".webp"],
6480
+ files: [".pdf", ".docx", ".xlsx", ".xls", ".csv", ".pptx", ".ppt", ".json"],
6481
+ audio: [],
6482
+ video: []
6483
+ },
6484
+ evals: [],
6485
+ maxContextLength: 2e5,
6389
6486
  config: {
6390
- name: `Default Claude Code agent`,
6391
- instructions: "You are a coding assistant.",
6487
+ name: `CLAUDE-SONNET-4`,
6488
+ instructions: "",
6392
6489
  model: {
6393
6490
  create: ({ apiKey }) => {
6394
6491
  const anthropic = (0, import_anthropic.createAnthropic)({
6395
6492
  apiKey
6396
6493
  });
6397
- return anthropic.languageModel("claude-sonnet-4-20250514");
6494
+ return anthropic.languageModel("claude-sonnet-4-0");
6398
6495
  }
6399
6496
  }
6400
6497
  }
6401
6498
  });
6402
-
6403
- // src/templates/agents/claude-opus-4.ts
6404
- var import_anthropic2 = require("@ai-sdk/anthropic");
6405
- var claudeOpus4Agent = new ExuluAgent2({
6406
- id: `default_claude_4_opus_agent`,
6407
- name: `Default Claude 4 Opus anthropic provider`,
6408
- description: `Basic agent claude 4 opus agent you can use to chat with.`,
6499
+ var claudeSonnet45Agent = new ExuluAgent2({
6500
+ id: `claude_code_agent`,
6501
+ name: `CLAUDE-SONNET-4.5`,
6502
+ provider: "anthropic",
6503
+ description: `Best Anthropic model for complex agents and coding. Highest intelligence across most tasks with exceptional agent and coding capabilities`,
6409
6504
  type: "agent",
6410
6505
  capabilities: {
6411
6506
  text: true,
@@ -6417,32 +6512,82 @@ var claudeOpus4Agent = new ExuluAgent2({
6417
6512
  evals: [],
6418
6513
  maxContextLength: 2e5,
6419
6514
  config: {
6420
- name: `Default agent`,
6421
- instructions: "You are a helpful assistant.",
6515
+ name: `CLAUDE-SONNET-4.5`,
6516
+ instructions: "",
6422
6517
  model: {
6423
6518
  create: ({ apiKey }) => {
6424
- const anthropic = (0, import_anthropic2.createAnthropic)({
6519
+ const anthropic = (0, import_anthropic.createAnthropic)({
6425
6520
  apiKey
6426
6521
  });
6427
- return anthropic.languageModel("claude-4-opus-20250514");
6522
+ return anthropic.languageModel("claude-sonnet-4-5");
6428
6523
  }
6429
- // todo add a field of type string that adds a dropdown list from which the user can select the model
6430
- // todo for each model, check which provider is used, and require the admin to add one or multiple
6431
- // API keys for the provider (which we can then auto-rotate).
6432
- // todo also add custom fields for rate limiting, so the admin can set custom rate limits for the agent
6433
- // and allow him/her to decide if the rate limit is per user or per agent.
6434
- // todo finally allow switching on or off immutable audit logs on the agent. Which then enables OTEL
6435
- // and stores the logs into the pre-defined storage.
6436
6524
  }
6437
6525
  }
6438
6526
  });
6439
6527
 
6440
- // src/templates/agents/gpt-5.ts
6528
+ // src/templates/agents/openai/gpt.ts
6441
6529
  var import_openai2 = require("@ai-sdk/openai");
6530
+ var gpt5proAgent = new ExuluAgent2({
6531
+ id: `default_gpt_5_pro_agent`,
6532
+ provider: "openai",
6533
+ name: `GPT-5-PRO`,
6534
+ description: `GPT-5 pro uses more compute to think harder and provide consistently better answers. GPT-5 pro is available in the Responses API only to enable support for multi-turn model interactions before responding to API requests, and other advanced API features in the future. Since GPT-5 pro is designed to tackle tough problems, some requests may take several minutes to finish. To avoid timeouts, try using background mode. As our most advanced reasoning model, GPT-5 pro defaults to (and only supports) reasoning.effort: high. GPT-5 pro does not support code interpreter.`,
6535
+ type: "agent",
6536
+ capabilities: {
6537
+ text: true,
6538
+ images: [".png", ".jpg", ".jpeg", ".webp"],
6539
+ files: [".pdf", ".docx", ".xlsx", ".xls", ".csv", ".pptx", ".ppt", ".json"],
6540
+ audio: [],
6541
+ video: []
6542
+ },
6543
+ evals: [],
6544
+ maxContextLength: 4e5,
6545
+ config: {
6546
+ name: `GPT-5-PRO`,
6547
+ instructions: "",
6548
+ model: {
6549
+ create: ({ apiKey }) => {
6550
+ const openai = (0, import_openai2.createOpenAI)({
6551
+ apiKey
6552
+ });
6553
+ return openai.languageModel("gpt-5-pro");
6554
+ }
6555
+ }
6556
+ }
6557
+ });
6558
+ var gpt5CodexAgent = new ExuluAgent2({
6559
+ id: `default_gpt_5_codex_agent`,
6560
+ provider: "openai",
6561
+ name: `GPT-5-CODEX`,
6562
+ description: `GPT-5-Codex is a version of GPT-5 optimized for agentic coding tasks in Codex or similar environments. It's available in the Responses API only and the underlying model snapshot will be regularly updated. If you want to learn more about prompting GPT-5-Codex, refer to the OpenAI dedicated guide.`,
6563
+ type: "agent",
6564
+ capabilities: {
6565
+ text: true,
6566
+ images: [".png", ".jpg", ".jpeg", ".webp"],
6567
+ files: [".pdf", ".docx", ".xlsx", ".xls", ".csv", ".pptx", ".ppt", ".json"],
6568
+ audio: [],
6569
+ video: []
6570
+ },
6571
+ evals: [],
6572
+ maxContextLength: 4e5,
6573
+ config: {
6574
+ name: `GPT-5-CODEX`,
6575
+ instructions: "",
6576
+ model: {
6577
+ create: ({ apiKey }) => {
6578
+ const openai = (0, import_openai2.createOpenAI)({
6579
+ apiKey
6580
+ });
6581
+ return openai.languageModel("gpt-5-codex");
6582
+ }
6583
+ }
6584
+ }
6585
+ });
6442
6586
  var gpt5MiniAgent = new ExuluAgent2({
6443
6587
  id: `default_gpt_5_mini_agent`,
6444
- name: `Default GPT 5 Mini OpenAI provider`,
6445
- description: `Basic agent gpt 5 mini agent you can use to chat with.`,
6588
+ provider: "openai",
6589
+ name: `GPT-5-MINI`,
6590
+ description: `GPT-5 mini is a faster, more cost-efficient version of GPT-5. It's great for well-defined tasks and precise prompts.`,
6446
6591
  type: "agent",
6447
6592
  capabilities: {
6448
6593
  text: true,
@@ -6452,10 +6597,10 @@ var gpt5MiniAgent = new ExuluAgent2({
6452
6597
  video: []
6453
6598
  },
6454
6599
  evals: [],
6455
- maxContextLength: 128e3,
6600
+ maxContextLength: 4e5,
6456
6601
  config: {
6457
- name: `Default agent`,
6458
- instructions: "You are a helpful assistant.",
6602
+ name: `GPT-5-MINI`,
6603
+ instructions: "",
6459
6604
  model: {
6460
6605
  create: ({ apiKey }) => {
6461
6606
  const openai = (0, import_openai2.createOpenAI)({
@@ -6475,8 +6620,9 @@ var gpt5MiniAgent = new ExuluAgent2({
6475
6620
  });
6476
6621
  var gpt5agent = new ExuluAgent2({
6477
6622
  id: `default_gpt_5_agent`,
6478
- name: `Default GPT 5 OpenAI provider`,
6479
- description: `Basic agent gpt 5 agent you can use to chat with.`,
6623
+ provider: "openai",
6624
+ name: `GPT-5`,
6625
+ description: `GPT-5 is the flagship model for coding, reasoning, and agentic tasks across domains.`,
6480
6626
  type: "agent",
6481
6627
  capabilities: {
6482
6628
  text: true,
@@ -6486,10 +6632,10 @@ var gpt5agent = new ExuluAgent2({
6486
6632
  video: []
6487
6633
  },
6488
6634
  evals: [],
6489
- maxContextLength: 128e3,
6635
+ maxContextLength: 4e5,
6490
6636
  config: {
6491
- name: `Default agent`,
6492
- instructions: "You are a helpful assistant.",
6637
+ name: `GPT-5`,
6638
+ instructions: "",
6493
6639
  model: {
6494
6640
  create: ({ apiKey }) => {
6495
6641
  const openai = (0, import_openai2.createOpenAI)({
@@ -6507,6 +6653,146 @@ var gpt5agent = new ExuluAgent2({
6507
6653
  }
6508
6654
  }
6509
6655
  });
6656
+ var gpt5NanoAgent = new ExuluAgent2({
6657
+ id: `default_gpt_5_nano_agent`,
6658
+ provider: "openai",
6659
+ name: `GPT-5-NANO`,
6660
+ description: `GPT-5 Nano is the fastest, cheapest version of GPT-5. It's great for summarization and classification tasks. .`,
6661
+ type: "agent",
6662
+ capabilities: {
6663
+ text: true,
6664
+ images: [".png", ".jpg", ".jpeg", ".webp"],
6665
+ files: [".pdf", ".docx", ".xlsx", ".xls", ".csv", ".pptx", ".ppt", ".json"],
6666
+ audio: [],
6667
+ video: []
6668
+ },
6669
+ evals: [],
6670
+ maxContextLength: 4e5,
6671
+ config: {
6672
+ name: `GPT-5-NANO`,
6673
+ instructions: "",
6674
+ model: {
6675
+ create: ({ apiKey }) => {
6676
+ const openai = (0, import_openai2.createOpenAI)({
6677
+ apiKey
6678
+ });
6679
+ return openai.languageModel("gpt-5-nano");
6680
+ }
6681
+ }
6682
+ }
6683
+ });
6684
+ var gpt41Agent = new ExuluAgent2({
6685
+ id: `default_gpt_4_1_agent`,
6686
+ provider: "openai",
6687
+ name: `GPT-4.1`,
6688
+ description: `GPT-4.1 excels at instruction following and tool calling, with broad knowledge across domains. It features a 1M token context window, and low latency without a reasoning step. Note that we recommend starting with GPT-5 for complex tasks`,
6689
+ type: "agent",
6690
+ capabilities: {
6691
+ text: true,
6692
+ images: [".png", ".jpg", ".jpeg", ".webp"],
6693
+ files: [".pdf", ".docx", ".xlsx", ".xls", ".csv", ".pptx", ".ppt", ".json"],
6694
+ audio: [],
6695
+ video: []
6696
+ },
6697
+ evals: [],
6698
+ maxContextLength: 1047576,
6699
+ config: {
6700
+ name: `GPT-4.1`,
6701
+ instructions: "",
6702
+ model: {
6703
+ create: ({ apiKey }) => {
6704
+ const openai = (0, import_openai2.createOpenAI)({
6705
+ apiKey
6706
+ });
6707
+ return openai.languageModel("gpt-4.1");
6708
+ }
6709
+ }
6710
+ }
6711
+ });
6712
+ var gpt41MiniAgent = new ExuluAgent2({
6713
+ id: `default_gpt_4_1_mini_agent`,
6714
+ provider: "openai",
6715
+ name: `GPT-4.1-MINI`,
6716
+ description: `GPT-4.1 mini excels at instruction following and tool calling. It features a 1M token context window, and low latency without a reasoning step.`,
6717
+ type: "agent",
6718
+ capabilities: {
6719
+ text: true,
6720
+ images: [".png", ".jpg", ".jpeg", ".webp"],
6721
+ files: [".pdf", ".docx", ".xlsx", ".xls", ".csv", ".pptx", ".ppt", ".json"],
6722
+ audio: [],
6723
+ video: []
6724
+ },
6725
+ evals: [],
6726
+ maxContextLength: 1047576,
6727
+ config: {
6728
+ name: `GPT-4.1-MINI`,
6729
+ instructions: "",
6730
+ model: {
6731
+ create: ({ apiKey }) => {
6732
+ const openai = (0, import_openai2.createOpenAI)({
6733
+ apiKey
6734
+ });
6735
+ return openai.languageModel("gpt-4.1-mini");
6736
+ }
6737
+ }
6738
+ }
6739
+ });
6740
+ var gpt4oAgent = new ExuluAgent2({
6741
+ id: `default_gpt_4o_agent`,
6742
+ provider: "openai",
6743
+ name: `GPT-4O`,
6744
+ description: `Basic agent gpt 4o agent you can use to chat with.`,
6745
+ type: "agent",
6746
+ capabilities: {
6747
+ text: true,
6748
+ images: [".png", ".jpg", ".jpeg", ".webp"],
6749
+ files: [".pdf", ".docx", ".xlsx", ".xls", ".csv", ".pptx", ".ppt", ".json"],
6750
+ audio: [],
6751
+ video: []
6752
+ },
6753
+ evals: [],
6754
+ maxContextLength: 128e3,
6755
+ config: {
6756
+ name: `Default agent`,
6757
+ instructions: "You are a helpful assistant.",
6758
+ model: {
6759
+ create: ({ apiKey }) => {
6760
+ const openai = (0, import_openai2.createOpenAI)({
6761
+ apiKey
6762
+ });
6763
+ return openai.languageModel("gpt-4o");
6764
+ }
6765
+ }
6766
+ }
6767
+ });
6768
+ var gpt4oMiniAgent = new ExuluAgent2({
6769
+ id: `default_gpt_4o_mini_agent`,
6770
+ provider: "openai",
6771
+ name: `GPT-4O-MINI`,
6772
+ description: `GPT-4o mini (\u201Co\u201D for \u201Comni\u201D) is a fast, affordable small model for focused tasks. It accepts both text and image inputs, and produces text outputs (including Structured Outputs). It is ideal for fine-tuning, and model outputs from a larger model like GPT-4o can be distilled to GPT-4o-mini to produce similar results at lower cost and latency.`,
6773
+ type: "agent",
6774
+ capabilities: {
6775
+ text: true,
6776
+ images: [".png", ".jpg", ".jpeg", ".webp"],
6777
+ files: [".pdf", ".docx", ".xlsx", ".xls", ".csv", ".pptx", ".ppt", ".json"],
6778
+ audio: [],
6779
+ video: []
6780
+ },
6781
+ evals: [],
6782
+ maxContextLength: 128e3,
6783
+ config: {
6784
+ name: `GPT-4O-MINI`,
6785
+ instructions: "",
6786
+ model: {
6787
+ create: ({ apiKey }) => {
6788
+ const openai = (0, import_openai2.createOpenAI)({
6789
+ apiKey
6790
+ });
6791
+ return openai.languageModel("gpt-4o-mini");
6792
+ }
6793
+ }
6794
+ }
6795
+ });
6510
6796
 
6511
6797
  // src/registry/index.ts
6512
6798
  var import_api4 = require("@opentelemetry/api");
@@ -6619,8 +6905,16 @@ var ExuluApp = class {
6619
6905
  this._agents = [
6620
6906
  claudeSonnet4Agent,
6621
6907
  claudeOpus4Agent,
6908
+ claudeSonnet45Agent,
6622
6909
  gpt5MiniAgent,
6623
6910
  gpt5agent,
6911
+ gpt5proAgent,
6912
+ gpt5CodexAgent,
6913
+ gpt5NanoAgent,
6914
+ gpt41Agent,
6915
+ gpt41MiniAgent,
6916
+ gpt4oAgent,
6917
+ gpt4oMiniAgent,
6624
6918
  ...agents ?? []
6625
6919
  ];
6626
6920
  this._config = config;
@@ -8066,6 +8360,7 @@ var {
8066
8360
  evalSetsSchema: evalSetsSchema3,
8067
8361
  evalRunsSchema: evalRunsSchema3,
8068
8362
  agentSessionsSchema: agentSessionsSchema3,
8363
+ platformConfigurationsSchema: platformConfigurationsSchema3,
8069
8364
  agentMessagesSchema: agentMessagesSchema3,
8070
8365
  rolesSchema: rolesSchema3,
8071
8366
  usersSchema: usersSchema3,
@@ -8104,6 +8399,7 @@ var up = async function(knex) {
8104
8399
  testCasesSchema3(),
8105
8400
  evalSetsSchema3(),
8106
8401
  evalRunsSchema3(),
8402
+ platformConfigurationsSchema3(),
8107
8403
  statisticsSchema3(),
8108
8404
  projectsSchema3(),
8109
8405
  rbacSchema3(),
@@ -8317,11 +8613,19 @@ var ExuluDefaultContexts = {
8317
8613
  var ExuluDefaultAgents = {
8318
8614
  anthropic: {
8319
8615
  opus4: claudeOpus4Agent,
8320
- sonnet4: claudeSonnet4Agent
8616
+ sonnet4: claudeSonnet4Agent,
8617
+ sonnet45: claudeSonnet45Agent
8321
8618
  },
8322
8619
  openai: {
8323
8620
  gpt5Mini: gpt5MiniAgent,
8324
- gpt5: gpt5agent
8621
+ gpt5: gpt5agent,
8622
+ gpt5pro: gpt5proAgent,
8623
+ gpt5Codex: gpt5CodexAgent,
8624
+ gpt5Nano: gpt5NanoAgent,
8625
+ gpt41: gpt41Agent,
8626
+ gpt41Mini: gpt41MiniAgent,
8627
+ gpt4o: gpt4oAgent,
8628
+ gpt4oMini: gpt4oMiniAgent
8325
8629
  }
8326
8630
  };
8327
8631
  var ExuluVariables = {
package/dist/index.d.cts CHANGED
@@ -193,6 +193,7 @@ interface ExuluAgentParams {
193
193
  description: string;
194
194
  config?: ExuluAgentConfig | undefined;
195
195
  maxContextLength?: number;
196
+ provider: string;
196
197
  capabilities?: {
197
198
  text: boolean;
198
199
  images: imageTypes[];
@@ -260,6 +261,7 @@ declare class ExuluEval {
260
261
  declare class ExuluAgent {
261
262
  id: string;
262
263
  name: string;
264
+ provider: string;
263
265
  description: string;
264
266
  slug: string;
265
267
  type: "agent";
@@ -280,7 +282,7 @@ declare class ExuluAgent {
280
282
  audio: string[];
281
283
  video: string[];
282
284
  };
283
- constructor({ id, name, description, config, rateLimit, capabilities, type, maxContextLength, evals }: ExuluAgentParams);
285
+ constructor({ id, name, description, config, rateLimit, capabilities, type, maxContextLength, evals, provider }: ExuluAgentParams);
284
286
  get providerName(): string;
285
287
  get modelName(): string;
286
288
  tool: (instance: string, agents: ExuluAgent[]) => Promise<ExuluTool | null>;
@@ -1436,10 +1438,18 @@ declare const ExuluDefaultAgents: {
1436
1438
  anthropic: {
1437
1439
  opus4: ExuluAgent;
1438
1440
  sonnet4: ExuluAgent;
1441
+ sonnet45: ExuluAgent;
1439
1442
  };
1440
1443
  openai: {
1441
1444
  gpt5Mini: ExuluAgent;
1442
1445
  gpt5: ExuluAgent;
1446
+ gpt5pro: ExuluAgent;
1447
+ gpt5Codex: ExuluAgent;
1448
+ gpt5Nano: ExuluAgent;
1449
+ gpt41: ExuluAgent;
1450
+ gpt41Mini: ExuluAgent;
1451
+ gpt4o: ExuluAgent;
1452
+ gpt4oMini: ExuluAgent;
1443
1453
  };
1444
1454
  };
1445
1455
  declare const ExuluVariables: {
package/dist/index.d.ts CHANGED
@@ -193,6 +193,7 @@ interface ExuluAgentParams {
193
193
  description: string;
194
194
  config?: ExuluAgentConfig | undefined;
195
195
  maxContextLength?: number;
196
+ provider: string;
196
197
  capabilities?: {
197
198
  text: boolean;
198
199
  images: imageTypes[];
@@ -260,6 +261,7 @@ declare class ExuluEval {
260
261
  declare class ExuluAgent {
261
262
  id: string;
262
263
  name: string;
264
+ provider: string;
263
265
  description: string;
264
266
  slug: string;
265
267
  type: "agent";
@@ -280,7 +282,7 @@ declare class ExuluAgent {
280
282
  audio: string[];
281
283
  video: string[];
282
284
  };
283
- constructor({ id, name, description, config, rateLimit, capabilities, type, maxContextLength, evals }: ExuluAgentParams);
285
+ constructor({ id, name, description, config, rateLimit, capabilities, type, maxContextLength, evals, provider }: ExuluAgentParams);
284
286
  get providerName(): string;
285
287
  get modelName(): string;
286
288
  tool: (instance: string, agents: ExuluAgent[]) => Promise<ExuluTool | null>;
@@ -1436,10 +1438,18 @@ declare const ExuluDefaultAgents: {
1436
1438
  anthropic: {
1437
1439
  opus4: ExuluAgent;
1438
1440
  sonnet4: ExuluAgent;
1441
+ sonnet45: ExuluAgent;
1439
1442
  };
1440
1443
  openai: {
1441
1444
  gpt5Mini: ExuluAgent;
1442
1445
  gpt5: ExuluAgent;
1446
+ gpt5pro: ExuluAgent;
1447
+ gpt5Codex: ExuluAgent;
1448
+ gpt5Nano: ExuluAgent;
1449
+ gpt41: ExuluAgent;
1450
+ gpt41Mini: ExuluAgent;
1451
+ gpt4o: ExuluAgent;
1452
+ gpt4oMini: ExuluAgent;
1443
1453
  };
1444
1454
  };
1445
1455
  declare const ExuluVariables: {
package/dist/index.js CHANGED
@@ -1205,6 +1205,31 @@ var rbacSchema = {
1205
1205
  }
1206
1206
  ]
1207
1207
  };
1208
+ var platformConfigurationsSchema = {
1209
+ type: "platform_configurations",
1210
+ name: {
1211
+ plural: "platform_configurations",
1212
+ singular: "platform_configuration"
1213
+ },
1214
+ fields: [
1215
+ {
1216
+ name: "config_key",
1217
+ type: "text",
1218
+ required: true,
1219
+ unique: true,
1220
+ index: true
1221
+ },
1222
+ {
1223
+ name: "config_value",
1224
+ type: "json",
1225
+ required: true
1226
+ },
1227
+ {
1228
+ name: "description",
1229
+ type: "text"
1230
+ }
1231
+ ]
1232
+ };
1208
1233
  var addCoreFields = (schema) => {
1209
1234
  schema.fields.forEach((field) => {
1210
1235
  if (field.type === "file") {
@@ -1246,7 +1271,8 @@ var coreSchemas = {
1246
1271
  evalRunsSchema: () => addCoreFields(evalRunsSchema),
1247
1272
  variablesSchema: () => addCoreFields(variablesSchema),
1248
1273
  rbacSchema: () => addCoreFields(rbacSchema),
1249
- workflowTemplatesSchema: () => addCoreFields(workflowTemplatesSchema)
1274
+ workflowTemplatesSchema: () => addCoreFields(workflowTemplatesSchema),
1275
+ platformConfigurationsSchema: () => addCoreFields(platformConfigurationsSchema)
1250
1276
  };
1251
1277
  }
1252
1278
  };
@@ -1557,6 +1583,7 @@ ${enumValues}
1557
1583
  fields.push(" streaming: Boolean");
1558
1584
  fields.push(" capabilities: AgentCapabilities");
1559
1585
  fields.push(" maxContextLength: Int");
1586
+ fields.push(" provider: String");
1560
1587
  fields.push(" slug: String");
1561
1588
  fields.push(" evals: [AgentEvalFunction]");
1562
1589
  }
@@ -2249,7 +2276,8 @@ var backendAgentFields = [
2249
2276
  "rateLimit",
2250
2277
  "streaming",
2251
2278
  "capabilities",
2252
- "maxContextLength"
2279
+ "maxContextLength",
2280
+ "provider"
2253
2281
  ];
2254
2282
  var removeAgentFields = (requestedFields) => {
2255
2283
  const filtered = requestedFields.filter((field) => !backendAgentFields.includes(field));
@@ -2314,6 +2342,9 @@ var addAgentFields = async (requestedFields, agents, result, tools, user) => {
2314
2342
  if (requestedFields.includes("maxContextLength")) {
2315
2343
  result.maxContextLength = backend?.maxContextLength || 0;
2316
2344
  }
2345
+ if (requestedFields.includes("provider")) {
2346
+ result.provider = backend?.provider || "";
2347
+ }
2317
2348
  if (requestedFields.includes("evals")) {
2318
2349
  result.evals = backend?.evals?.map((evalFunc) => ({
2319
2350
  id: evalFunc.id,
@@ -3410,6 +3441,7 @@ type Provider {
3410
3441
  name: String!
3411
3442
  description: String
3412
3443
  providerName: String
3444
+ provider: String
3413
3445
  modelName: String
3414
3446
  type: EnumProviderType!
3415
3447
  }
@@ -4183,6 +4215,7 @@ var ExuluAgent2 = class {
4183
4215
  // The ID is used for storing references to agents so it is important it does not change.
4184
4216
  id;
4185
4217
  name;
4218
+ provider;
4186
4219
  description = "";
4187
4220
  slug = "";
4188
4221
  type;
@@ -4194,11 +4227,12 @@ var ExuluAgent2 = class {
4194
4227
  // private memory: Memory | undefined; // TODO do own implementation
4195
4228
  model;
4196
4229
  capabilities;
4197
- constructor({ id, name, description, config, rateLimit, capabilities, type, maxContextLength, evals }) {
4230
+ constructor({ id, name, description, config, rateLimit, capabilities, type, maxContextLength, evals, provider }) {
4198
4231
  this.id = id;
4199
4232
  this.name = name;
4200
4233
  this.description = description;
4201
4234
  this.rateLimit = rateLimit;
4235
+ this.provider = provider;
4202
4236
  this.config = config;
4203
4237
  this.type = type;
4204
4238
  this.maxContextLength = maxContextLength;
@@ -5377,6 +5411,7 @@ var {
5377
5411
  testCasesSchema: testCasesSchema2,
5378
5412
  evalSetsSchema: evalSetsSchema2,
5379
5413
  evalRunsSchema: evalRunsSchema2,
5414
+ platformConfigurationsSchema: platformConfigurationsSchema2,
5380
5415
  agentSessionsSchema: agentSessionsSchema2,
5381
5416
  agentMessagesSchema: agentMessagesSchema2,
5382
5417
  rolesSchema: rolesSchema2,
@@ -5450,6 +5485,7 @@ var createExpressRoutes = async (app, agents, tools, contexts, config, tracer) =
5450
5485
  agentsSchema2(),
5451
5486
  projectsSchema2(),
5452
5487
  evalRunsSchema2(),
5488
+ platformConfigurationsSchema2(),
5453
5489
  evalSetsSchema2(),
5454
5490
  testCasesSchema2(),
5455
5491
  agentSessionsSchema2(),
@@ -5698,6 +5734,22 @@ Mood: friendly and intelligent.
5698
5734
  authenticated: true
5699
5735
  });
5700
5736
  });
5737
+ app.get("/theme", async (req, res) => {
5738
+ const { db: db4 } = await postgresClient();
5739
+ const themeConfig = await db4.from("platform_configurations").where({ config_key: "theme_config" }).first();
5740
+ if (!themeConfig) {
5741
+ res.status(200).json({
5742
+ theme: {
5743
+ light: {},
5744
+ dark: {}
5745
+ }
5746
+ });
5747
+ return;
5748
+ }
5749
+ res.status(200).json({
5750
+ theme: themeConfig.config_value
5751
+ });
5752
+ });
5701
5753
  app.get("/config", async (req, res) => {
5702
5754
  res.status(200).json({
5703
5755
  MCP: {
@@ -6347,33 +6399,76 @@ ${code}`
6347
6399
  // src/registry/index.ts
6348
6400
  import express2 from "express";
6349
6401
 
6350
- // src/templates/agents/claude-sonnet-4.ts
6402
+ // src/templates/agents/anthropic/claude.ts
6351
6403
  import { createAnthropic } from "@ai-sdk/anthropic";
6404
+ var claudeOpus4Agent = new ExuluAgent2({
6405
+ id: `default_claude_4_opus_agent`,
6406
+ name: `CLAUDE-OPUS-4`,
6407
+ provider: "anthropic",
6408
+ description: `Previous Anthropic flagship model. Very high intelligence and capability. Moderately Fast.`,
6409
+ type: "agent",
6410
+ capabilities: {
6411
+ text: true,
6412
+ images: [".png", ".jpg", ".jpeg", ".webp"],
6413
+ files: [".pdf", ".docx", ".xlsx", ".xls", ".csv", ".pptx", ".ppt", ".json"],
6414
+ audio: [],
6415
+ video: []
6416
+ },
6417
+ evals: [],
6418
+ maxContextLength: 2e5,
6419
+ config: {
6420
+ name: `CLAUDE-OPUS-4`,
6421
+ instructions: "",
6422
+ model: {
6423
+ create: ({ apiKey }) => {
6424
+ const anthropic = createAnthropic({
6425
+ apiKey
6426
+ });
6427
+ return anthropic.languageModel("claude-opus-4-0");
6428
+ }
6429
+ // todo add a field of type string that adds a dropdown list from which the user can select the model
6430
+ // todo for each model, check which provider is used, and require the admin to add one or multiple
6431
+ // API keys for the provider (which we can then auto-rotate).
6432
+ // todo also add custom fields for rate limiting, so the admin can set custom rate limits for the agent
6433
+ // and allow him/her to decide if the rate limit is per user or per agent.
6434
+ // todo finally allow switching on or off immutable audit logs on the agent. Which then enables OTEL
6435
+ // and stores the logs into the pre-defined storage.
6436
+ }
6437
+ }
6438
+ });
6352
6439
  var claudeSonnet4Agent = new ExuluAgent2({
6353
6440
  id: `claude_code_agent`,
6354
- name: `Claude Code Agent`,
6355
- description: `Claude Code agent, enabling the creation of multiple Claude Code Agent instances with different configurations (rate limits, functions, etc).`,
6441
+ name: `CLAUDE-SONNET-4`,
6442
+ provider: "anthropic",
6443
+ description: `High intelligence and balanced performance, used a lot for agentic coding tasks. Anthropic provides a newer 4.5 model that is more powerful and faster.`,
6356
6444
  type: "agent",
6445
+ capabilities: {
6446
+ text: true,
6447
+ images: [".png", ".jpg", ".jpeg", ".webp"],
6448
+ files: [".pdf", ".docx", ".xlsx", ".xls", ".csv", ".pptx", ".ppt", ".json"],
6449
+ audio: [],
6450
+ video: []
6451
+ },
6452
+ evals: [],
6453
+ maxContextLength: 2e5,
6357
6454
  config: {
6358
- name: `Default Claude Code agent`,
6359
- instructions: "You are a coding assistant.",
6455
+ name: `CLAUDE-SONNET-4`,
6456
+ instructions: "",
6360
6457
  model: {
6361
6458
  create: ({ apiKey }) => {
6362
6459
  const anthropic = createAnthropic({
6363
6460
  apiKey
6364
6461
  });
6365
- return anthropic.languageModel("claude-sonnet-4-20250514");
6462
+ return anthropic.languageModel("claude-sonnet-4-0");
6366
6463
  }
6367
6464
  }
6368
6465
  }
6369
6466
  });
6370
-
6371
- // src/templates/agents/claude-opus-4.ts
6372
- import { createAnthropic as createAnthropic2 } from "@ai-sdk/anthropic";
6373
- var claudeOpus4Agent = new ExuluAgent2({
6374
- id: `default_claude_4_opus_agent`,
6375
- name: `Default Claude 4 Opus anthropic provider`,
6376
- description: `Basic agent claude 4 opus agent you can use to chat with.`,
6467
+ var claudeSonnet45Agent = new ExuluAgent2({
6468
+ id: `claude_code_agent`,
6469
+ name: `CLAUDE-SONNET-4.5`,
6470
+ provider: "anthropic",
6471
+ description: `Best Anthropic model for complex agents and coding. Highest intelligence across most tasks with exceptional agent and coding capabilities`,
6377
6472
  type: "agent",
6378
6473
  capabilities: {
6379
6474
  text: true,
@@ -6385,32 +6480,82 @@ var claudeOpus4Agent = new ExuluAgent2({
6385
6480
  evals: [],
6386
6481
  maxContextLength: 2e5,
6387
6482
  config: {
6388
- name: `Default agent`,
6389
- instructions: "You are a helpful assistant.",
6483
+ name: `CLAUDE-SONNET-4.5`,
6484
+ instructions: "",
6390
6485
  model: {
6391
6486
  create: ({ apiKey }) => {
6392
- const anthropic = createAnthropic2({
6487
+ const anthropic = createAnthropic({
6393
6488
  apiKey
6394
6489
  });
6395
- return anthropic.languageModel("claude-4-opus-20250514");
6490
+ return anthropic.languageModel("claude-sonnet-4-5");
6396
6491
  }
6397
- // todo add a field of type string that adds a dropdown list from which the user can select the model
6398
- // todo for each model, check which provider is used, and require the admin to add one or multiple
6399
- // API keys for the provider (which we can then auto-rotate).
6400
- // todo also add custom fields for rate limiting, so the admin can set custom rate limits for the agent
6401
- // and allow him/her to decide if the rate limit is per user or per agent.
6402
- // todo finally allow switching on or off immutable audit logs on the agent. Which then enables OTEL
6403
- // and stores the logs into the pre-defined storage.
6404
6492
  }
6405
6493
  }
6406
6494
  });
6407
6495
 
6408
- // src/templates/agents/gpt-5.ts
6496
+ // src/templates/agents/openai/gpt.ts
6409
6497
  import { createOpenAI } from "@ai-sdk/openai";
6498
+ var gpt5proAgent = new ExuluAgent2({
6499
+ id: `default_gpt_5_pro_agent`,
6500
+ provider: "openai",
6501
+ name: `GPT-5-PRO`,
6502
+ description: `GPT-5 pro uses more compute to think harder and provide consistently better answers. GPT-5 pro is available in the Responses API only to enable support for multi-turn model interactions before responding to API requests, and other advanced API features in the future. Since GPT-5 pro is designed to tackle tough problems, some requests may take several minutes to finish. To avoid timeouts, try using background mode. As our most advanced reasoning model, GPT-5 pro defaults to (and only supports) reasoning.effort: high. GPT-5 pro does not support code interpreter.`,
6503
+ type: "agent",
6504
+ capabilities: {
6505
+ text: true,
6506
+ images: [".png", ".jpg", ".jpeg", ".webp"],
6507
+ files: [".pdf", ".docx", ".xlsx", ".xls", ".csv", ".pptx", ".ppt", ".json"],
6508
+ audio: [],
6509
+ video: []
6510
+ },
6511
+ evals: [],
6512
+ maxContextLength: 4e5,
6513
+ config: {
6514
+ name: `GPT-5-PRO`,
6515
+ instructions: "",
6516
+ model: {
6517
+ create: ({ apiKey }) => {
6518
+ const openai = createOpenAI({
6519
+ apiKey
6520
+ });
6521
+ return openai.languageModel("gpt-5-pro");
6522
+ }
6523
+ }
6524
+ }
6525
+ });
6526
+ var gpt5CodexAgent = new ExuluAgent2({
6527
+ id: `default_gpt_5_codex_agent`,
6528
+ provider: "openai",
6529
+ name: `GPT-5-CODEX`,
6530
+ description: `GPT-5-Codex is a version of GPT-5 optimized for agentic coding tasks in Codex or similar environments. It's available in the Responses API only and the underlying model snapshot will be regularly updated. If you want to learn more about prompting GPT-5-Codex, refer to the OpenAI dedicated guide.`,
6531
+ type: "agent",
6532
+ capabilities: {
6533
+ text: true,
6534
+ images: [".png", ".jpg", ".jpeg", ".webp"],
6535
+ files: [".pdf", ".docx", ".xlsx", ".xls", ".csv", ".pptx", ".ppt", ".json"],
6536
+ audio: [],
6537
+ video: []
6538
+ },
6539
+ evals: [],
6540
+ maxContextLength: 4e5,
6541
+ config: {
6542
+ name: `GPT-5-CODEX`,
6543
+ instructions: "",
6544
+ model: {
6545
+ create: ({ apiKey }) => {
6546
+ const openai = createOpenAI({
6547
+ apiKey
6548
+ });
6549
+ return openai.languageModel("gpt-5-codex");
6550
+ }
6551
+ }
6552
+ }
6553
+ });
6410
6554
  var gpt5MiniAgent = new ExuluAgent2({
6411
6555
  id: `default_gpt_5_mini_agent`,
6412
- name: `Default GPT 5 Mini OpenAI provider`,
6413
- description: `Basic agent gpt 5 mini agent you can use to chat with.`,
6556
+ provider: "openai",
6557
+ name: `GPT-5-MINI`,
6558
+ description: `GPT-5 mini is a faster, more cost-efficient version of GPT-5. It's great for well-defined tasks and precise prompts.`,
6414
6559
  type: "agent",
6415
6560
  capabilities: {
6416
6561
  text: true,
@@ -6420,10 +6565,10 @@ var gpt5MiniAgent = new ExuluAgent2({
6420
6565
  video: []
6421
6566
  },
6422
6567
  evals: [],
6423
- maxContextLength: 128e3,
6568
+ maxContextLength: 4e5,
6424
6569
  config: {
6425
- name: `Default agent`,
6426
- instructions: "You are a helpful assistant.",
6570
+ name: `GPT-5-MINI`,
6571
+ instructions: "",
6427
6572
  model: {
6428
6573
  create: ({ apiKey }) => {
6429
6574
  const openai = createOpenAI({
@@ -6443,8 +6588,9 @@ var gpt5MiniAgent = new ExuluAgent2({
6443
6588
  });
6444
6589
  var gpt5agent = new ExuluAgent2({
6445
6590
  id: `default_gpt_5_agent`,
6446
- name: `Default GPT 5 OpenAI provider`,
6447
- description: `Basic agent gpt 5 agent you can use to chat with.`,
6591
+ provider: "openai",
6592
+ name: `GPT-5`,
6593
+ description: `GPT-5 is the flagship model for coding, reasoning, and agentic tasks across domains.`,
6448
6594
  type: "agent",
6449
6595
  capabilities: {
6450
6596
  text: true,
@@ -6454,10 +6600,10 @@ var gpt5agent = new ExuluAgent2({
6454
6600
  video: []
6455
6601
  },
6456
6602
  evals: [],
6457
- maxContextLength: 128e3,
6603
+ maxContextLength: 4e5,
6458
6604
  config: {
6459
- name: `Default agent`,
6460
- instructions: "You are a helpful assistant.",
6605
+ name: `GPT-5`,
6606
+ instructions: "",
6461
6607
  model: {
6462
6608
  create: ({ apiKey }) => {
6463
6609
  const openai = createOpenAI({
@@ -6475,6 +6621,146 @@ var gpt5agent = new ExuluAgent2({
6475
6621
  }
6476
6622
  }
6477
6623
  });
6624
+ var gpt5NanoAgent = new ExuluAgent2({
6625
+ id: `default_gpt_5_nano_agent`,
6626
+ provider: "openai",
6627
+ name: `GPT-5-NANO`,
6628
+ description: `GPT-5 Nano is the fastest, cheapest version of GPT-5. It's great for summarization and classification tasks. .`,
6629
+ type: "agent",
6630
+ capabilities: {
6631
+ text: true,
6632
+ images: [".png", ".jpg", ".jpeg", ".webp"],
6633
+ files: [".pdf", ".docx", ".xlsx", ".xls", ".csv", ".pptx", ".ppt", ".json"],
6634
+ audio: [],
6635
+ video: []
6636
+ },
6637
+ evals: [],
6638
+ maxContextLength: 4e5,
6639
+ config: {
6640
+ name: `GPT-5-NANO`,
6641
+ instructions: "",
6642
+ model: {
6643
+ create: ({ apiKey }) => {
6644
+ const openai = createOpenAI({
6645
+ apiKey
6646
+ });
6647
+ return openai.languageModel("gpt-5-nano");
6648
+ }
6649
+ }
6650
+ }
6651
+ });
6652
+ var gpt41Agent = new ExuluAgent2({
6653
+ id: `default_gpt_4_1_agent`,
6654
+ provider: "openai",
6655
+ name: `GPT-4.1`,
6656
+ description: `GPT-4.1 excels at instruction following and tool calling, with broad knowledge across domains. It features a 1M token context window, and low latency without a reasoning step. Note that we recommend starting with GPT-5 for complex tasks`,
6657
+ type: "agent",
6658
+ capabilities: {
6659
+ text: true,
6660
+ images: [".png", ".jpg", ".jpeg", ".webp"],
6661
+ files: [".pdf", ".docx", ".xlsx", ".xls", ".csv", ".pptx", ".ppt", ".json"],
6662
+ audio: [],
6663
+ video: []
6664
+ },
6665
+ evals: [],
6666
+ maxContextLength: 1047576,
6667
+ config: {
6668
+ name: `GPT-4.1`,
6669
+ instructions: "",
6670
+ model: {
6671
+ create: ({ apiKey }) => {
6672
+ const openai = createOpenAI({
6673
+ apiKey
6674
+ });
6675
+ return openai.languageModel("gpt-4.1");
6676
+ }
6677
+ }
6678
+ }
6679
+ });
6680
+ var gpt41MiniAgent = new ExuluAgent2({
6681
+ id: `default_gpt_4_1_mini_agent`,
6682
+ provider: "openai",
6683
+ name: `GPT-4.1-MINI`,
6684
+ description: `GPT-4.1 mini excels at instruction following and tool calling. It features a 1M token context window, and low latency without a reasoning step.`,
6685
+ type: "agent",
6686
+ capabilities: {
6687
+ text: true,
6688
+ images: [".png", ".jpg", ".jpeg", ".webp"],
6689
+ files: [".pdf", ".docx", ".xlsx", ".xls", ".csv", ".pptx", ".ppt", ".json"],
6690
+ audio: [],
6691
+ video: []
6692
+ },
6693
+ evals: [],
6694
+ maxContextLength: 1047576,
6695
+ config: {
6696
+ name: `GPT-4.1-MINI`,
6697
+ instructions: "",
6698
+ model: {
6699
+ create: ({ apiKey }) => {
6700
+ const openai = createOpenAI({
6701
+ apiKey
6702
+ });
6703
+ return openai.languageModel("gpt-4.1-mini");
6704
+ }
6705
+ }
6706
+ }
6707
+ });
6708
+ var gpt4oAgent = new ExuluAgent2({
6709
+ id: `default_gpt_4o_agent`,
6710
+ provider: "openai",
6711
+ name: `GPT-4O`,
6712
+ description: `Basic agent gpt 4o agent you can use to chat with.`,
6713
+ type: "agent",
6714
+ capabilities: {
6715
+ text: true,
6716
+ images: [".png", ".jpg", ".jpeg", ".webp"],
6717
+ files: [".pdf", ".docx", ".xlsx", ".xls", ".csv", ".pptx", ".ppt", ".json"],
6718
+ audio: [],
6719
+ video: []
6720
+ },
6721
+ evals: [],
6722
+ maxContextLength: 128e3,
6723
+ config: {
6724
+ name: `Default agent`,
6725
+ instructions: "You are a helpful assistant.",
6726
+ model: {
6727
+ create: ({ apiKey }) => {
6728
+ const openai = createOpenAI({
6729
+ apiKey
6730
+ });
6731
+ return openai.languageModel("gpt-4o");
6732
+ }
6733
+ }
6734
+ }
6735
+ });
6736
+ var gpt4oMiniAgent = new ExuluAgent2({
6737
+ id: `default_gpt_4o_mini_agent`,
6738
+ provider: "openai",
6739
+ name: `GPT-4O-MINI`,
6740
+ description: `GPT-4o mini (\u201Co\u201D for \u201Comni\u201D) is a fast, affordable small model for focused tasks. It accepts both text and image inputs, and produces text outputs (including Structured Outputs). It is ideal for fine-tuning, and model outputs from a larger model like GPT-4o can be distilled to GPT-4o-mini to produce similar results at lower cost and latency.`,
6741
+ type: "agent",
6742
+ capabilities: {
6743
+ text: true,
6744
+ images: [".png", ".jpg", ".jpeg", ".webp"],
6745
+ files: [".pdf", ".docx", ".xlsx", ".xls", ".csv", ".pptx", ".ppt", ".json"],
6746
+ audio: [],
6747
+ video: []
6748
+ },
6749
+ evals: [],
6750
+ maxContextLength: 128e3,
6751
+ config: {
6752
+ name: `GPT-4O-MINI`,
6753
+ instructions: "",
6754
+ model: {
6755
+ create: ({ apiKey }) => {
6756
+ const openai = createOpenAI({
6757
+ apiKey
6758
+ });
6759
+ return openai.languageModel("gpt-4o-mini");
6760
+ }
6761
+ }
6762
+ }
6763
+ });
6478
6764
 
6479
6765
  // src/registry/index.ts
6480
6766
  import { trace } from "@opentelemetry/api";
@@ -6587,8 +6873,16 @@ var ExuluApp = class {
6587
6873
  this._agents = [
6588
6874
  claudeSonnet4Agent,
6589
6875
  claudeOpus4Agent,
6876
+ claudeSonnet45Agent,
6590
6877
  gpt5MiniAgent,
6591
6878
  gpt5agent,
6879
+ gpt5proAgent,
6880
+ gpt5CodexAgent,
6881
+ gpt5NanoAgent,
6882
+ gpt41Agent,
6883
+ gpt41MiniAgent,
6884
+ gpt4oAgent,
6885
+ gpt4oMiniAgent,
6592
6886
  ...agents ?? []
6593
6887
  ];
6594
6888
  this._config = config;
@@ -8034,6 +8328,7 @@ var {
8034
8328
  evalSetsSchema: evalSetsSchema3,
8035
8329
  evalRunsSchema: evalRunsSchema3,
8036
8330
  agentSessionsSchema: agentSessionsSchema3,
8331
+ platformConfigurationsSchema: platformConfigurationsSchema3,
8037
8332
  agentMessagesSchema: agentMessagesSchema3,
8038
8333
  rolesSchema: rolesSchema3,
8039
8334
  usersSchema: usersSchema3,
@@ -8072,6 +8367,7 @@ var up = async function(knex) {
8072
8367
  testCasesSchema3(),
8073
8368
  evalSetsSchema3(),
8074
8369
  evalRunsSchema3(),
8370
+ platformConfigurationsSchema3(),
8075
8371
  statisticsSchema3(),
8076
8372
  projectsSchema3(),
8077
8373
  rbacSchema3(),
@@ -8285,11 +8581,19 @@ var ExuluDefaultContexts = {
8285
8581
  var ExuluDefaultAgents = {
8286
8582
  anthropic: {
8287
8583
  opus4: claudeOpus4Agent,
8288
- sonnet4: claudeSonnet4Agent
8584
+ sonnet4: claudeSonnet4Agent,
8585
+ sonnet45: claudeSonnet45Agent
8289
8586
  },
8290
8587
  openai: {
8291
8588
  gpt5Mini: gpt5MiniAgent,
8292
- gpt5: gpt5agent
8589
+ gpt5: gpt5agent,
8590
+ gpt5pro: gpt5proAgent,
8591
+ gpt5Codex: gpt5CodexAgent,
8592
+ gpt5Nano: gpt5NanoAgent,
8593
+ gpt41: gpt41Agent,
8594
+ gpt41Mini: gpt41MiniAgent,
8595
+ gpt4o: gpt4oAgent,
8596
+ gpt4oMini: gpt4oMiniAgent
8293
8597
  }
8294
8598
  };
8295
8599
  var ExuluVariables = {
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@exulu/backend",
3
3
  "author": "Qventu Bv.",
4
- "version": "1.26.0",
4
+ "version": "1.27.0",
5
5
  "main": "./dist/index.js",
6
6
  "private": false,
7
7
  "publishConfig": {
@@ -49,8 +49,9 @@
49
49
  "typescript": "^5.8.3"
50
50
  },
51
51
  "dependencies": {
52
- "@ai-sdk/anthropic": "^2.0.17",
53
- "@ai-sdk/openai": "^2.0.27",
52
+ "@ai-sdk/anthropic": "^2.0.27",
53
+ "@ai-sdk/google-vertex": "^3.0.45",
54
+ "@ai-sdk/openai": "^2.0.49",
54
55
  "@anthropic-ai/sdk": "^0.56.0",
55
56
  "@as-integrations/express5": "^1.0.0",
56
57
  "@aws-sdk/client-s3": "^3.338.0",