@standardagents/builder 0.13.0 → 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.
@@ -793,6 +793,7 @@ interface LogData {
793
793
  * User's Env interface should extend this or include these bindings.
794
794
  */
795
795
  interface Env extends ThreadEnv {
796
+ CEREBRAS_API_KEY?: string;
796
797
  OPENAI_API_KEY?: string;
797
798
  ANTHROPIC_API_KEY?: string;
798
799
  OPENROUTER_API_KEY?: string;
package/dist/index.d.ts CHANGED
@@ -1,6 +1,6 @@
1
1
  export { AgentPluginOptions, agentbuilder } from './plugin.js';
2
- import { T as ThreadEnv, a as ThreadMetadata, F as FileRecord, b as FlowState, M as Message, c as FileStats, G as GrepResult, A as AttachmentRef, d as MessageContent, E as Env, e as ThreadInstance } from './index-T0gR5l-G.js';
3
- export { k as Agent, j as BuilderThreadEndpointHandler, B as Controller, h as ControllerContext, n as FlowResult, q as ImageContentPart, I as ImageMetadata, L as LLMResponse, r as MultimodalContent, R as RequestContext, S as StorageBackend, o as TelemetryEvent, p as TextContentPart, i as ThreadEndpointContext, l as ToolCall, m as ToolResult, g as createThreadEndpointHandler, f as defineController } from './index-T0gR5l-G.js';
2
+ import { T as ThreadEnv, a as ThreadMetadata, F as FileRecord, b as FlowState, M as Message, c as FileStats, G as GrepResult, A as AttachmentRef, d as MessageContent, E as Env, e as ThreadInstance } from './index-D8PIt3cR.js';
3
+ export { k as Agent, j as BuilderThreadEndpointHandler, B as Controller, h as ControllerContext, n as FlowResult, q as ImageContentPart, I as ImageMetadata, L as LLMResponse, r as MultimodalContent, R as RequestContext, S as StorageBackend, o as TelemetryEvent, p as TextContentPart, i as ThreadEndpointContext, l as ToolCall, m as ToolResult, g as createThreadEndpointHandler, f as defineController } from './index-D8PIt3cR.js';
4
4
  import { SubagentRegistryEntry, QueueMessageInput, ModelDefinition as ModelDefinition$1, ToolArgs, PromptTextPart, PromptEnvPart, VariableDefinition, SubpromptConfig as SubpromptConfig$1, PromptToolConfig as PromptToolConfig$1, SubagentToolConfig as SubagentToolConfig$1, ReasoningConfig, SideConfig as SideConfig$1, LLMProviderInterface, ContentPart, TextPart, ImagePart, FilePart, NamespaceContext, DefinitionLoader } from '@standardagents/spec';
5
5
  export { AgentType, DefinitionLoader, GlobalNamespaceContext, HookSignatures, ImageContent, ModelCapabilities, ModelProvider, NamespaceContext, PackageSignature, PackedExports, PackedMeta, PackedMetadata, PackedNamespaceContext, PromptInput, PromptTextPart, ProviderAssistantMessage, ProviderError, ProviderErrorCode, ProviderFactory, ProviderFactoryConfig, ProviderFinishReason, ProviderGeneratedImage, ProviderMessage, ProviderMessageContent, ModelCapabilities as ProviderModelCapabilities, ProviderReasoningDetail, ProviderRequest, ProviderResponse, ProviderStreamChunk, ProviderSystemMessage, ProviderTool, ProviderToolCallPart, ProviderToolMessage, ProviderToolResultContent, ProviderUsage, ProviderUserMessage, ReasoningConfig, StructuredPrompt, TextContent, Tool, ToolArgs, ToolArgsNode, ToolArgsRawShape, ToolContent, belongsToPackage, defineAgent, defineHook, defineModel, definePrompt, defineTool, isPacked, isVisibleInNamespace, mapReasoningLevel } from '@standardagents/spec';
6
6
  import { DurableObject } from 'cloudflare:workers';
package/dist/index.js CHANGED
@@ -662,6 +662,7 @@ var init_ProviderRegistry = __esm({
662
662
  */
663
663
  getApiKeyForProvider(providerName, env) {
664
664
  const apiKeyEnvVarMap = {
665
+ cerebras: "CEREBRAS_API_KEY",
665
666
  openai: "OPENAI_API_KEY",
666
667
  openrouter: "OPENROUTER_API_KEY",
667
668
  anthropic: "ANTHROPIC_API_KEY",
@@ -12289,14 +12290,65 @@ function formatSessionBinding(binding) {
12289
12290
  return `{ ${parts.join(", ")} }`;
12290
12291
  }
12291
12292
 
12293
+ // src/providers/catalog.ts
12294
+ var FIRST_PARTY_PROVIDERS = [
12295
+ {
12296
+ name: "cerebras",
12297
+ package: "@standardagents/cerebras",
12298
+ label: "Cerebras",
12299
+ envKey: "CEREBRAS_API_KEY"
12300
+ },
12301
+ {
12302
+ name: "openai",
12303
+ package: "@standardagents/openai",
12304
+ label: "OpenAI",
12305
+ envKey: "OPENAI_API_KEY"
12306
+ },
12307
+ {
12308
+ name: "openrouter",
12309
+ package: "@standardagents/openrouter",
12310
+ label: "OpenRouter",
12311
+ envKey: "OPENROUTER_API_KEY"
12312
+ }
12313
+ ];
12314
+ function humanizeProviderName(name) {
12315
+ return name.split(/[-_]/g).filter(Boolean).map((part) => part.charAt(0).toUpperCase() + part.slice(1)).join(" ");
12316
+ }
12317
+ function packageToCustomProvider(pkg) {
12318
+ const name = pkg.split("/").pop() || pkg;
12319
+ return {
12320
+ name,
12321
+ package: pkg,
12322
+ label: humanizeProviderName(name),
12323
+ envKey: `${name.toUpperCase().replace(/-/g, "_")}_API_KEY`,
12324
+ isCustom: true
12325
+ };
12326
+ }
12327
+ function buildInstalledProviderCatalog(customProviderPackages = []) {
12328
+ const providers = [...FIRST_PARTY_PROVIDERS];
12329
+ const seen = new Set(providers.map((provider) => provider.name));
12330
+ for (const pkg of customProviderPackages) {
12331
+ const provider = packageToCustomProvider(pkg);
12332
+ if (seen.has(provider.name)) continue;
12333
+ providers.push(provider);
12334
+ seen.add(provider.name);
12335
+ }
12336
+ return providers;
12337
+ }
12338
+ function buildProviderPackageMap(customProviderPackages = []) {
12339
+ return Object.fromEntries(
12340
+ buildInstalledProviderCatalog(customProviderPackages).map((provider) => [
12341
+ provider.name,
12342
+ {
12343
+ name: provider.name,
12344
+ package: provider.package
12345
+ }
12346
+ ])
12347
+ );
12348
+ }
12349
+
12292
12350
  // src/sdk/persistence/index.ts
12293
- var PROVIDER_PACKAGE_MAP = {
12294
- openai: { name: "openai", package: "@standardagents/openai" },
12295
- openrouter: { name: "openrouter", package: "@standardagents/openrouter" },
12296
- anthropic: { name: "anthropic", package: "@standardagents/anthropic" },
12297
- google: { name: "google", package: "@standardagents/google" },
12298
- test: { name: "test", package: "@standardagents/builder/test" }
12299
- };
12351
+ var defaultProviderPackageMap = buildProviderPackageMap();
12300
12352
  function nameToFilename(name) {
12301
12353
  return name.replace(/[/\\]/g, "__").replace(/[:*?"<>|.]/g, "_").replace(/-/g, "_");
12302
12354
  }
@@ -12308,7 +12360,7 @@ function modelExists(modelsDir, name) {
12308
12360
  const filePath = getModelFilePath(modelsDir, name);
12309
12361
  return fs4__default.existsSync(filePath);
12310
12362
  }
12311
- async function saveModel(modelsDir, data, overwrite = false) {
12363
+ async function saveModel(modelsDir, data, overwrite = false, providerPackageMap = defaultProviderPackageMap) {
12312
12364
  try {
12313
12365
  if (!fs4__default.existsSync(modelsDir)) {
12314
12366
  fs4__default.mkdirSync(modelsDir, { recursive: true });
@@ -12320,11 +12372,11 @@ async function saveModel(modelsDir, data, overwrite = false) {
12320
12372
  error: `Model file already exists: ${filePath}. Use update to modify existing models.`
12321
12373
  };
12322
12374
  }
12323
- const providerInfo = PROVIDER_PACKAGE_MAP[data.provider];
12375
+ const providerInfo = providerPackageMap[data.provider];
12324
12376
  if (!providerInfo) {
12325
12377
  return {
12326
12378
  success: false,
12327
- error: `Unknown provider '${data.provider}'. Must be one of: ${Object.keys(PROVIDER_PACKAGE_MAP).join(", ")}`
12379
+ error: `Unknown provider '${data.provider}'. Must be one of: ${Object.keys(providerPackageMap).join(", ")}`
12328
12380
  };
12329
12381
  }
12330
12382
  const content = generateModelFile(data, {
@@ -12387,7 +12439,7 @@ function transformModelData(data) {
12387
12439
  }
12388
12440
  return transformed;
12389
12441
  }
12390
- function validateModelData(data) {
12442
+ function validateModelDataWithProviders(data, providerPackageMap) {
12391
12443
  const errors = {};
12392
12444
  if (!data.name || typeof data.name !== "string") {
12393
12445
  errors["name"] = "Model name is required";
@@ -12395,7 +12447,7 @@ function validateModelData(data) {
12395
12447
  if (!data.provider || typeof data.provider !== "string") {
12396
12448
  errors["provider"] = "Provider is required";
12397
12449
  } else {
12398
- const validProviders = Object.keys(PROVIDER_PACKAGE_MAP);
12450
+ const validProviders = Object.keys(providerPackageMap);
12399
12451
  if (!validProviders.includes(data.provider)) {
12400
12452
  errors["provider"] = `Invalid provider '${data.provider}'. Must be one of: ${validProviders.join(", ")}`;
12401
12453
  }
@@ -16185,6 +16237,8 @@ function agentbuilder(options = {}) {
16185
16237
  const agentsDir = options.agentsDir ? path8__default.resolve(process.cwd(), options.agentsDir) : path8__default.resolve(process.cwd(), "agents/agents");
16186
16238
  const effectsDir = options.effectsDir ? path8__default.resolve(process.cwd(), options.effectsDir) : path8__default.resolve(process.cwd(), "agents/effects");
16187
16239
  const outputDir = path8__default.resolve(process.cwd(), ".agents");
16240
+ const installedProviders = buildInstalledProviderCatalog(options.providers || []);
16241
+ const installedProviderPackageMap = buildProviderPackageMap(options.providers || []);
16188
16242
  const typeGenConfig = {
16189
16243
  modelsDir,
16190
16244
  promptsDir,
@@ -17156,18 +17210,7 @@ export const effectNames = ${JSON.stringify(effects.filter((e) => !e.error).map(
17156
17210
  `;
17157
17211
  }
17158
17212
  if (id === RESOLVED_VIRTUAL_PROVIDERS_ID) {
17159
- const firstPartyProviders = [
17160
- { name: "openai", package: "@standardagents/openai", label: "OpenAI", envKey: "OPENAI_API_KEY" },
17161
- { name: "openrouter", package: "@standardagents/openrouter", label: "OpenRouter", envKey: "OPENROUTER_API_KEY" }
17162
- ];
17163
- const customProviders = (options.providers || []).map((pkg) => ({
17164
- name: pkg.split("/").pop() || pkg,
17165
- package: pkg,
17166
- label: pkg.split("/").pop() || pkg,
17167
- envKey: `${(pkg.split("/").pop() || pkg).toUpperCase().replace(/-/g, "_")}_API_KEY`,
17168
- isCustom: true
17169
- }));
17170
- const allProviders = [...firstPartyProviders, ...customProviders];
17213
+ const allProviders = installedProviders;
17171
17214
  return `// Virtual providers module - lists available LLM provider packages
17172
17215
  export const providers = ${JSON.stringify(allProviders, null, 2)};
17173
17216
 
@@ -17606,7 +17649,7 @@ export class DurableAgentBuilder extends _BaseDurableAgentBuilder {
17606
17649
  try {
17607
17650
  const rawBody = await parseRequestBody(req);
17608
17651
  const body = transformModelData(rawBody);
17609
- const fieldErrors = validateModelData(body);
17652
+ const fieldErrors = validateModelDataWithProviders(body, installedProviderPackageMap);
17610
17653
  if (fieldErrors) {
17611
17654
  res.statusCode = 400;
17612
17655
  res.setHeader("Content-Type", "application/json");
@@ -17619,7 +17662,7 @@ export class DurableAgentBuilder extends _BaseDurableAgentBuilder {
17619
17662
  res.end(JSON.stringify({ error: `Model '${body.name}' already exists. Use PUT to update.` }));
17620
17663
  return;
17621
17664
  }
17622
- const result = await saveModel(modelsDir, body, false);
17665
+ const result = await saveModel(modelsDir, body, false, installedProviderPackageMap);
17623
17666
  if (result.success) {
17624
17667
  await reloadModelsModule(server);
17625
17668
  await reloadRouterModule(server);
@@ -17651,7 +17694,7 @@ export class DurableAgentBuilder extends _BaseDurableAgentBuilder {
17651
17694
  const body = transformModelData(rawBody);
17652
17695
  const newName = body.name;
17653
17696
  const isNameChange = newName && newName !== urlModelName;
17654
- const fieldErrors = validateModelData(body);
17697
+ const fieldErrors = validateModelDataWithProviders(body, installedProviderPackageMap);
17655
17698
  if (fieldErrors) {
17656
17699
  res.statusCode = 400;
17657
17700
  res.setHeader("Content-Type", "application/json");
@@ -17669,7 +17712,7 @@ export class DurableAgentBuilder extends _BaseDurableAgentBuilder {
17669
17712
  }
17670
17713
  updatedPrompts = await updateModelReferencesInPrompts(promptsDir, urlModelName, newName);
17671
17714
  }
17672
- const result = await saveModel(modelsDir, body, true);
17715
+ const result = await saveModel(modelsDir, body, true, installedProviderPackageMap);
17673
17716
  if (result.success) {
17674
17717
  await reloadModelsModule(server);
17675
17718
  if (updatedPrompts.length > 0) {