Skip to content

Commit 2280b47

Browse files
author
Theodore Li
committed
Revert agent changes
1 parent d7a124a commit 2280b47

File tree

3 files changed

+71
-35
lines changed

3 files changed

+71
-35
lines changed

apps/sim/lib/api-key/byok.ts

Lines changed: 9 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,8 @@ import { db } from '@sim/db'
22
import { workspaceBYOKKeys } from '@sim/db/schema'
33
import { createLogger } from '@sim/logger'
44
import { and, eq } from 'drizzle-orm'
5+
import { getRotatingApiKey } from '@/lib/core/config/api-keys'
56
import { isHosted } from '@/lib/core/config/feature-flags'
6-
import { getHostedKeyRateLimiter } from '@/lib/core/rate-limiter'
77
import { decryptSecret } from '@/lib/core/security/encryption'
88
import { getHostedModels } from '@/providers/models'
99
import { useProvidersStore } from '@/stores/providers/store'
@@ -97,41 +97,15 @@ export async function getApiKeyWithBYOK(
9797
logger.debug('No BYOK key found, falling back', { provider, model, workspaceId })
9898

9999
if (isModelHosted) {
100-
const envKeyPrefix = isGeminiModel ? 'GEMINI_API_KEY' : `${provider.toUpperCase()}_API_KEY`
101-
const rateLimiter = getHostedKeyRateLimiter()
102-
const acquireResult = await rateLimiter.acquireKey(
103-
provider,
104-
envKeyPrefix,
105-
{ mode: 'per_request', requestsPerMinute: 100 },
106-
workspaceId
107-
)
108-
109-
if (acquireResult.success) {
110-
logger.info('Using hosted key via rate limiter', {
111-
provider,
112-
model,
113-
workspaceId,
114-
envVarName: acquireResult.envVarName,
115-
})
116-
return { apiKey: acquireResult.key!, isBYOK: false }
117-
}
118-
119-
if (acquireResult.billingActorRateLimited) {
120-
const error = new Error(acquireResult.error || `Rate limit exceeded for ${provider}`)
121-
;(error as any).status = 429
122-
;(error as any).retryAfterMs = acquireResult.retryAfterMs
123-
throw error
124-
}
125-
126-
logger.warn('No hosted keys available via rate limiter', {
127-
provider,
128-
model,
129-
error: acquireResult.error,
130-
})
131-
if (userProvidedKey) {
132-
return { apiKey: userProvidedKey, isBYOK: false }
100+
try {
101+
const serverKey = getRotatingApiKey(isGeminiModel ? 'gemini' : provider)
102+
return { apiKey: serverKey, isBYOK: false }
103+
} catch (_error) {
104+
if (userProvidedKey) {
105+
return { apiKey: userProvidedKey, isBYOK: false }
106+
}
107+
throw new Error(`No API key available for ${provider} ${model}`)
133108
}
134-
throw new Error(`No API key available for ${provider} ${model}`)
135109
}
136110
}
137111
}

apps/sim/providers/utils.ts

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import type OpenAI from 'openai'
33
import type { ChatCompletionChunk } from 'openai/resources/chat/completions'
44
import type { CompletionUsage } from 'openai/resources/completions'
55
import { env } from '@/lib/core/config/env'
6+
import { isHosted } from '@/lib/core/config/feature-flags'
67
import {
78
buildCanonicalIndex,
89
type CanonicalGroup,
@@ -37,6 +38,7 @@ import {
3738
updateOllamaModels as updateOllamaModelsInDefinitions,
3839
} from '@/providers/models'
3940
import type { ProviderId, ProviderToolConfig } from '@/providers/types'
41+
import { useProvidersStore } from '@/stores/providers/store'
4042
import { mergeToolParameters } from '@/tools/params'
4143

4244
const logger = createLogger('ProviderUtils')
@@ -715,6 +717,60 @@ export function shouldBillModelUsage(model: string): boolean {
715717
return hostedModels.some((hostedModel) => model.toLowerCase() === hostedModel.toLowerCase())
716718
}
717719

720+
/**
721+
* Get an API key for a specific provider, handling rotation and fallbacks
722+
* For use server-side only
723+
*/
724+
export function getApiKey(provider: string, model: string, userProvidedKey?: string): string {
725+
const hasUserKey = !!userProvidedKey
726+
727+
const isOllamaModel =
728+
provider === 'ollama' || useProvidersStore.getState().providers.ollama.models.includes(model)
729+
if (isOllamaModel) {
730+
return 'empty'
731+
}
732+
733+
const isVllmModel =
734+
provider === 'vllm' || useProvidersStore.getState().providers.vllm.models.includes(model)
735+
if (isVllmModel) {
736+
return userProvidedKey || 'empty'
737+
}
738+
739+
const isBedrockModel = provider === 'bedrock' || model.startsWith('bedrock/')
740+
if (isBedrockModel) {
741+
return 'bedrock-uses-own-credentials'
742+
}
743+
744+
const isOpenAIModel = provider === 'openai'
745+
const isClaudeModel = provider === 'anthropic'
746+
const isGeminiModel = provider === 'google'
747+
748+
if (isHosted && (isOpenAIModel || isClaudeModel || isGeminiModel)) {
749+
const hostedModels = getHostedModels()
750+
const isModelHosted = hostedModels.some((m) => m.toLowerCase() === model.toLowerCase())
751+
752+
if (isModelHosted) {
753+
try {
754+
const { getRotatingApiKey } = require('@/lib/core/config/api-keys')
755+
const serverKey = getRotatingApiKey(isGeminiModel ? 'gemini' : provider)
756+
return serverKey
757+
} catch (_error) {
758+
if (hasUserKey) {
759+
return userProvidedKey!
760+
}
761+
762+
throw new Error(`No API key available for ${provider} ${model}`)
763+
}
764+
}
765+
}
766+
767+
if (!hasUserKey) {
768+
throw new Error(`API key is required for ${provider} ${model}`)
769+
}
770+
771+
return userProvidedKey!
772+
}
773+
718774
/**
719775
* Prepares tool configuration for provider requests with consistent tool usage control behavior
720776
*

apps/sim/tools/browser_use/run_task.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import { createLogger } from '@sim/logger'
22
import { getMaxExecutionTimeout } from '@/lib/core/execution-limits'
3+
import { trackPlatformEvent } from '@/lib/core/telemetry'
34
import type { BrowserUseRunTaskParams, BrowserUseRunTaskResponse } from '@/tools/browser_use/types'
45
import type { ToolConfig, ToolResponse } from '@/tools/types'
56

@@ -294,6 +295,11 @@ export const runTaskTool: ToolConfig<BrowserUseRunTaskParams, BrowserUseRunTaskR
294295
logger.warn(
295296
`Unknown Browser Use model "${model}", using default step cost $${DEFAULT_STEP_COST}`
296297
)
298+
trackPlatformEvent('platform.hosted_key.unknown_model_cost', {
299+
'tool.id': 'browser_use_run_task',
300+
'model.name': model,
301+
'cost.default_step_cost': DEFAULT_STEP_COST,
302+
})
297303
}
298304
const stepCost = knownCost ?? DEFAULT_STEP_COST
299305
const stepCount = output.steps.length

0 commit comments

Comments
 (0)