@standardagents/builder 0.16.0 → 0.17.0-next.a4b7340

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.
@@ -874,11 +874,38 @@ var init_TestProvider = __esm({
874
874
  }
875
875
  });
876
876
 
877
+ // src/agents/providers/platform-routing.ts
878
+ function stringEnv(value) {
879
+ return typeof value === "string" && value.trim() ? value.trim() : void 0;
880
+ }
881
+ function resolvePlatformRouting(providerName, env2) {
882
+ const apiKey = stringEnv(env2.STANDARD_AGENTS_API_KEY) ?? stringEnv(env2.PLATFORM_API_KEY);
883
+ if (!apiKey) return null;
884
+ const origin = (stringEnv(env2.STANDARD_AGENTS_PROXY_URL) ?? stringEnv(env2.PLATFORM_ENDPOINT) ?? stringEnv(env2.STANDARD_AGENTS_API_URL) ?? DEFAULT_PLATFORM_PROXY_ORIGIN).replace(/\/+$/, "");
885
+ const provider = providerName.toLowerCase();
886
+ const basePath = PROVIDER_BASE_PATHS[provider] ?? "";
887
+ return {
888
+ apiKey,
889
+ origin,
890
+ baseUrl: `${origin}/v1/proxy/${encodeURIComponent(provider)}${basePath}`
891
+ };
892
+ }
893
+ var DEFAULT_PLATFORM_PROXY_ORIGIN, PROVIDER_BASE_PATHS;
894
+ var init_platform_routing = __esm({
895
+ "src/agents/providers/platform-routing.ts"() {
896
+ DEFAULT_PLATFORM_PROXY_ORIGIN = "https://proxy.standardagents.ai";
897
+ PROVIDER_BASE_PATHS = {
898
+ cloudflare: "/ai/v1"
899
+ };
900
+ }
901
+ });
902
+
877
903
  // src/agents/providers/ProviderRegistry.ts
878
904
  var ProviderRegistryImpl, ProviderRegistry;
879
905
  var init_ProviderRegistry = __esm({
880
906
  "src/agents/providers/ProviderRegistry.ts"() {
881
907
  init_TestProvider();
908
+ init_platform_routing();
882
909
  ProviderRegistryImpl = class {
883
910
  providerCache = /* @__PURE__ */ new Map();
884
911
  providerOverrideFn = null;
@@ -950,6 +977,19 @@ var init_ProviderRegistry = __esm({
950
977
  return this.cacheAndReturn(modelName, overrideProvider, modelDef, overrideFingerprint);
951
978
  }
952
979
  }
980
+ const routing = resolvePlatformRouting(providerName, env2);
981
+ if (routing) {
982
+ const config = {
983
+ apiKey: routing.apiKey,
984
+ baseUrl: routing.baseUrl
985
+ };
986
+ const fingerprint = this.getProviderFingerprint(`platform:${providerName}`, modelDef, config);
987
+ const cached = this.providerCache.get(modelName);
988
+ if (cached?.fingerprint === fingerprint) {
989
+ return this.buildResult(cached.provider, modelDef);
990
+ }
991
+ return this.cacheAndReturn(modelName, providerFactory(config), modelDef, fingerprint);
992
+ }
953
993
  throw new Error(`No API key found for provider: ${providerName}. Set the provider key or STANDARD_AGENTS_API_KEY.`);
954
994
  }
955
995
  buildResult(provider, modelDef) {
@@ -962,7 +1002,7 @@ var init_ProviderRegistry = __esm({
962
1002
  getProviderFingerprint(providerName, modelDef, config) {
963
1003
  return JSON.stringify({
964
1004
  providerName,
965
- baseUrl: modelDef.providerOptions?.baseUrl ?? null,
1005
+ baseUrl: config?.baseUrl ?? modelDef.providerOptions?.baseUrl ?? null,
966
1006
  apiKey: config?.apiKey ?? null,
967
1007
  accountId: config?.accountId ?? null
968
1008
  });
@@ -12783,6 +12823,9 @@ var init_CloudflareProvider = __esm({
12783
12823
  if (accountScopedMatch) {
12784
12824
  return `${accountScopedMatch[1]}/ai/models/search`;
12785
12825
  }
12826
+ if (baseUrl.endsWith("/ai/v1")) {
12827
+ return `${baseUrl.slice(0, -"/ai/v1".length)}/ai/models/search`;
12828
+ }
12786
12829
  throw new ProviderError(
12787
12830
  "Cloudflare model discovery requires CLOUDFLARE_ACCOUNT_ID or an account-scoped baseUrl.",
12788
12831
  "invalid_request"
@@ -61688,7 +61731,7 @@ async function getPlatformIdentity(env2) {
61688
61731
  const endpoint = platformEndpoint(env2);
61689
61732
  const verifiedAccount = await fetchPlatformAccount(endpoint, token);
61690
61733
  const account = verifiedAccount ?? await fallbackAccountForToken(token);
61691
- const username = sanitizeUsername(`standard-agents-${account.slug}`);
61734
+ const username = sanitizeUsername(account.slug);
61692
61735
  return {
61693
61736
  connected: true,
61694
61737
  verified: verifiedAccount !== null,
@@ -61716,11 +61759,17 @@ async function createPlatformLocalSession(env2) {
61716
61759
  const username = identity.user.username;
61717
61760
  let user = await agentBuilder.getUserByUsername(username);
61718
61761
  if (!user) {
61719
- user = await agentBuilder.createUser({
61720
- username,
61721
- password_hash: await hashPassword(crypto.randomUUID()),
61722
- role: "admin"
61723
- });
61762
+ const legacyUsername = sanitizeUsername(`standard-agents-${identity.account.slug}`);
61763
+ const legacyUser = legacyUsername !== username ? await agentBuilder.getUserByUsername(legacyUsername) : null;
61764
+ if (legacyUser) {
61765
+ user = await agentBuilder.updateUser(legacyUser.id, { username }) ?? legacyUser;
61766
+ } else {
61767
+ user = await agentBuilder.createUser({
61768
+ username,
61769
+ password_hash: await hashPassword(crypto.randomUUID()),
61770
+ role: "admin"
61771
+ });
61772
+ }
61724
61773
  }
61725
61774
  const token = generateUserToken();
61726
61775
  const tokenHash = await hashToken(token);
@@ -62830,7 +62879,17 @@ var index_get_default2 = defineController2(async ({ req, env: env2 }) => {
62830
62879
  const agentBuilderId = env2.AGENT_BUILDER.idFromName("singleton");
62831
62880
  const agentBuilder = env2.AGENT_BUILDER.get(agentBuilderId);
62832
62881
  const users = await agentBuilder.listUsers();
62833
- return Response.json({ users });
62882
+ let platformUsername = null;
62883
+ const platformEnv = env2;
62884
+ if (hasPlatformApiKey(platformEnv)) {
62885
+ const identity = await getPlatformIdentity(platformEnv).catch(() => null);
62886
+ platformUsername = identity?.user.username ?? null;
62887
+ }
62888
+ const usersWithSource = users.map((user) => ({
62889
+ ...user,
62890
+ source: platformUsername && user.username === platformUsername ? "standard_agents" : "local"
62891
+ }));
62892
+ return Response.json({ users: usersWithSource });
62834
62893
  } catch (error) {
62835
62894
  console.error("List users error:", error);
62836
62895
  return Response.json(
@@ -64160,6 +64219,7 @@ var instance_patch_default = defineController2(async ({ req, env: env2 }) => {
64160
64219
  });
64161
64220
 
64162
64221
  // src/api/models/available.post.ts
64222
+ init_platform_routing();
64163
64223
  var UUID_LIKE_MODEL_ID = /^[0-9a-f]{8}-[0-9a-f]{4}-[1-8][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i;
64164
64224
  var CLOUDFLARE_PROVIDER_MODEL_ID = /^@cf\//i;
64165
64225
  function isOpaqueModelId(modelId) {
@@ -64263,15 +64323,16 @@ var available_post_default = defineController2(async ({ req, env: env2 }) => {
64263
64323
  );
64264
64324
  }
64265
64325
  const apiKey = env2[config.envKey];
64266
- if (!apiKey && provider !== "openrouter") {
64326
+ const platformRouting = apiKey ? null : resolvePlatformRouting(provider, env2);
64327
+ if (!apiKey && !platformRouting && provider !== "openrouter") {
64267
64328
  return Response.json(
64268
- { error: `API key not configured for ${provider}. Set ${config.envKey} environment variable.` },
64329
+ { error: `API key not configured for ${provider}. Set ${config.envKey} or STANDARD_AGENTS_API_KEY.` },
64269
64330
  { status: 401 }
64270
64331
  );
64271
64332
  }
64272
64333
  try {
64273
64334
  const factory = await config.getFactory();
64274
- const providerConfig = config.getConfig?.(env2, apiKey || "") || { apiKey: apiKey || "" };
64335
+ const providerConfig = platformRouting ? { apiKey: platformRouting.apiKey, baseUrl: platformRouting.baseUrl } : config.getConfig?.(env2, apiKey || "") || { apiKey: apiKey || "" };
64275
64336
  const providerInstance = factory(providerConfig);
64276
64337
  if (!providerInstance.getModels && !providerInstance.getModelsPage) {
64277
64338
  return Response.json({ models: [], hasNextPage: false });