@standardagents/builder 0.13.0-next.c55f029 → 0.13.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/dist/plugin.d.ts CHANGED
@@ -11,7 +11,7 @@ interface AgentPluginOptions {
11
11
  effectsDir?: string;
12
12
  /**
13
13
  * Additional provider packages to expose in the UI.
14
- * First-party providers (@standardagents/openai, @standardagents/openrouter) are always included.
14
+ * First-party providers (@standardagents/cerebras, @standardagents/openai, @standardagents/openrouter) are always included.
15
15
  * @example ['my-custom-provider', '@company/custom-openai']
16
16
  */
17
17
  providers?: string[];
package/dist/plugin.js CHANGED
@@ -1382,14 +1382,65 @@ function formatSessionBinding(binding) {
1382
1382
  return `{ ${parts.join(", ")} }`;
1383
1383
  }
1384
1384
 
1385
+ // src/providers/catalog.ts
1386
+ var FIRST_PARTY_PROVIDERS = [
1387
+ {
1388
+ name: "cerebras",
1389
+ package: "@standardagents/cerebras",
1390
+ label: "Cerebras",
1391
+ envKey: "CEREBRAS_API_KEY"
1392
+ },
1393
+ {
1394
+ name: "openai",
1395
+ package: "@standardagents/openai",
1396
+ label: "OpenAI",
1397
+ envKey: "OPENAI_API_KEY"
1398
+ },
1399
+ {
1400
+ name: "openrouter",
1401
+ package: "@standardagents/openrouter",
1402
+ label: "OpenRouter",
1403
+ envKey: "OPENROUTER_API_KEY"
1404
+ }
1405
+ ];
1406
+ function humanizeProviderName(name) {
1407
+ return name.split(/[-_]/g).filter(Boolean).map((part) => part.charAt(0).toUpperCase() + part.slice(1)).join(" ");
1408
+ }
1409
+ function packageToCustomProvider(pkg) {
1410
+ const name = pkg.split("/").pop() || pkg;
1411
+ return {
1412
+ name,
1413
+ package: pkg,
1414
+ label: humanizeProviderName(name),
1415
+ envKey: `${name.toUpperCase().replace(/-/g, "_")}_API_KEY`,
1416
+ isCustom: true
1417
+ };
1418
+ }
1419
+ function buildInstalledProviderCatalog(customProviderPackages = []) {
1420
+ const providers = [...FIRST_PARTY_PROVIDERS];
1421
+ const seen = new Set(providers.map((provider) => provider.name));
1422
+ for (const pkg of customProviderPackages) {
1423
+ const provider = packageToCustomProvider(pkg);
1424
+ if (seen.has(provider.name)) continue;
1425
+ providers.push(provider);
1426
+ seen.add(provider.name);
1427
+ }
1428
+ return providers;
1429
+ }
1430
+ function buildProviderPackageMap(customProviderPackages = []) {
1431
+ return Object.fromEntries(
1432
+ buildInstalledProviderCatalog(customProviderPackages).map((provider) => [
1433
+ provider.name,
1434
+ {
1435
+ name: provider.name,
1436
+ package: provider.package
1437
+ }
1438
+ ])
1439
+ );
1440
+ }
1441
+
1385
1442
  // src/sdk/persistence/index.ts
1386
- var PROVIDER_PACKAGE_MAP = {
1387
- openai: { name: "openai", package: "@standardagents/openai" },
1388
- openrouter: { name: "openrouter", package: "@standardagents/openrouter" },
1389
- anthropic: { name: "anthropic", package: "@standardagents/anthropic" },
1390
- google: { name: "google", package: "@standardagents/google" },
1391
- test: { name: "test", package: "@standardagents/builder/test" }
1392
- };
1443
+ var defaultProviderPackageMap = buildProviderPackageMap();
1393
1444
  function nameToFilename(name) {
1394
1445
  return name.replace(/[/\\]/g, "__").replace(/[:*?"<>|.]/g, "_").replace(/-/g, "_");
1395
1446
  }
@@ -1401,7 +1452,7 @@ function modelExists(modelsDir, name) {
1401
1452
  const filePath = getModelFilePath(modelsDir, name);
1402
1453
  return fs4__default.existsSync(filePath);
1403
1454
  }
1404
- async function saveModel(modelsDir, data, overwrite = false) {
1455
+ async function saveModel(modelsDir, data, overwrite = false, providerPackageMap = defaultProviderPackageMap) {
1405
1456
  try {
1406
1457
  if (!fs4__default.existsSync(modelsDir)) {
1407
1458
  fs4__default.mkdirSync(modelsDir, { recursive: true });
@@ -1413,11 +1464,11 @@ async function saveModel(modelsDir, data, overwrite = false) {
1413
1464
  error: `Model file already exists: ${filePath}. Use update to modify existing models.`
1414
1465
  };
1415
1466
  }
1416
- const providerInfo = PROVIDER_PACKAGE_MAP[data.provider];
1467
+ const providerInfo = providerPackageMap[data.provider];
1417
1468
  if (!providerInfo) {
1418
1469
  return {
1419
1470
  success: false,
1420
- error: `Unknown provider '${data.provider}'. Must be one of: ${Object.keys(PROVIDER_PACKAGE_MAP).join(", ")}`
1471
+ error: `Unknown provider '${data.provider}'. Must be one of: ${Object.keys(providerPackageMap).join(", ")}`
1421
1472
  };
1422
1473
  }
1423
1474
  const content = generateModelFile(data, {
@@ -1480,7 +1531,7 @@ function transformModelData(data) {
1480
1531
  }
1481
1532
  return transformed;
1482
1533
  }
1483
- function validateModelData(data) {
1534
+ function validateModelDataWithProviders(data, providerPackageMap) {
1484
1535
  const errors = {};
1485
1536
  if (!data.name || typeof data.name !== "string") {
1486
1537
  errors["name"] = "Model name is required";
@@ -1488,7 +1539,7 @@ function validateModelData(data) {
1488
1539
  if (!data.provider || typeof data.provider !== "string") {
1489
1540
  errors["provider"] = "Provider is required";
1490
1541
  } else {
1491
- const validProviders = Object.keys(PROVIDER_PACKAGE_MAP);
1542
+ const validProviders = Object.keys(providerPackageMap);
1492
1543
  if (!validProviders.includes(data.provider)) {
1493
1544
  errors["provider"] = `Invalid provider '${data.provider}'. Must be one of: ${validProviders.join(", ")}`;
1494
1545
  }
@@ -5274,6 +5325,8 @@ function agentbuilder(options = {}) {
5274
5325
  const agentsDir = options.agentsDir ? path8__default.resolve(process.cwd(), options.agentsDir) : path8__default.resolve(process.cwd(), "agents/agents");
5275
5326
  const effectsDir = options.effectsDir ? path8__default.resolve(process.cwd(), options.effectsDir) : path8__default.resolve(process.cwd(), "agents/effects");
5276
5327
  const outputDir = path8__default.resolve(process.cwd(), ".agents");
5328
+ const installedProviders = buildInstalledProviderCatalog(options.providers || []);
5329
+ const installedProviderPackageMap = buildProviderPackageMap(options.providers || []);
5277
5330
  const typeGenConfig = {
5278
5331
  modelsDir,
5279
5332
  promptsDir,
@@ -6245,18 +6298,7 @@ export const effectNames = ${JSON.stringify(effects.filter((e) => !e.error).map(
6245
6298
  `;
6246
6299
  }
6247
6300
  if (id === RESOLVED_VIRTUAL_PROVIDERS_ID) {
6248
- const firstPartyProviders = [
6249
- { name: "openai", package: "@standardagents/openai", label: "OpenAI", envKey: "OPENAI_API_KEY" },
6250
- { name: "openrouter", package: "@standardagents/openrouter", label: "OpenRouter", envKey: "OPENROUTER_API_KEY" }
6251
- ];
6252
- const customProviders = (options.providers || []).map((pkg) => ({
6253
- name: pkg.split("/").pop() || pkg,
6254
- package: pkg,
6255
- label: pkg.split("/").pop() || pkg,
6256
- envKey: `${(pkg.split("/").pop() || pkg).toUpperCase().replace(/-/g, "_")}_API_KEY`,
6257
- isCustom: true
6258
- }));
6259
- const allProviders = [...firstPartyProviders, ...customProviders];
6301
+ const allProviders = installedProviders;
6260
6302
  return `// Virtual providers module - lists available LLM provider packages
6261
6303
  export const providers = ${JSON.stringify(allProviders, null, 2)};
6262
6304
 
@@ -6695,7 +6737,7 @@ export class DurableAgentBuilder extends _BaseDurableAgentBuilder {
6695
6737
  try {
6696
6738
  const rawBody = await parseRequestBody(req);
6697
6739
  const body = transformModelData(rawBody);
6698
- const fieldErrors = validateModelData(body);
6740
+ const fieldErrors = validateModelDataWithProviders(body, installedProviderPackageMap);
6699
6741
  if (fieldErrors) {
6700
6742
  res.statusCode = 400;
6701
6743
  res.setHeader("Content-Type", "application/json");
@@ -6708,7 +6750,7 @@ export class DurableAgentBuilder extends _BaseDurableAgentBuilder {
6708
6750
  res.end(JSON.stringify({ error: `Model '${body.name}' already exists. Use PUT to update.` }));
6709
6751
  return;
6710
6752
  }
6711
- const result = await saveModel(modelsDir, body, false);
6753
+ const result = await saveModel(modelsDir, body, false, installedProviderPackageMap);
6712
6754
  if (result.success) {
6713
6755
  await reloadModelsModule(server);
6714
6756
  await reloadRouterModule(server);
@@ -6740,7 +6782,7 @@ export class DurableAgentBuilder extends _BaseDurableAgentBuilder {
6740
6782
  const body = transformModelData(rawBody);
6741
6783
  const newName = body.name;
6742
6784
  const isNameChange = newName && newName !== urlModelName;
6743
- const fieldErrors = validateModelData(body);
6785
+ const fieldErrors = validateModelDataWithProviders(body, installedProviderPackageMap);
6744
6786
  if (fieldErrors) {
6745
6787
  res.statusCode = 400;
6746
6788
  res.setHeader("Content-Type", "application/json");
@@ -6758,7 +6800,7 @@ export class DurableAgentBuilder extends _BaseDurableAgentBuilder {
6758
6800
  }
6759
6801
  updatedPrompts = await updateModelReferencesInPrompts(promptsDir, urlModelName, newName);
6760
6802
  }
6761
- const result = await saveModel(modelsDir, body, true);
6803
+ const result = await saveModel(modelsDir, body, true, installedProviderPackageMap);
6762
6804
  if (result.success) {
6763
6805
  await reloadModelsModule(server);
6764
6806
  if (updatedPrompts.length > 0) {