Skip to content

Commit de1ac9a

Browse files
improvement(models): system to blacklist models (#1687)
* improvment(models): system to blacklist models * move base models endpoint to right place * remove tngtech models too
1 parent 728a4c8 commit de1ac9a

File tree

11 files changed

+94
-24
lines changed

11 files changed

+94
-24
lines changed
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
import { NextResponse } from 'next/server'
2+
import { getBaseModelProviders } from '@/providers/utils'
3+
4+
export async function GET() {
5+
try {
6+
const allModels = Object.keys(getBaseModelProviders())
7+
return NextResponse.json({ models: allModels })
8+
} catch (error) {
9+
return NextResponse.json({ models: [], error: 'Failed to fetch models' }, { status: 500 })
10+
}
11+
}

apps/sim/app/api/providers/openrouter/models/route.ts

Lines changed: 13 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,19 @@
11
import { type NextRequest, NextResponse } from 'next/server'
22
import { createLogger } from '@/lib/logs/console/logger'
3+
import { filterBlacklistedModels } from '@/providers/utils'
34

45
const logger = createLogger('OpenRouterModelsAPI')
56

67
export const dynamic = 'force-dynamic'
78

9+
interface OpenRouterModel {
10+
id: string
11+
}
12+
13+
interface OpenRouterResponse {
14+
data: OpenRouterModel[]
15+
}
16+
817
export async function GET(_request: NextRequest) {
918
try {
1019
const response = await fetch('https://openrouter.ai/api/v1/models', {
@@ -20,20 +29,13 @@ export async function GET(_request: NextRequest) {
2029
return NextResponse.json({ models: [] })
2130
}
2231

23-
const data = await response.json()
24-
const models = Array.isArray(data?.data)
25-
? Array.from(
26-
new Set(
27-
data.data
28-
.map((m: any) => m?.id)
29-
.filter((id: unknown): id is string => typeof id === 'string' && id.length > 0)
30-
.map((id: string) => `openrouter/${id}`)
31-
)
32-
)
33-
: []
32+
const data = (await response.json()) as OpenRouterResponse
33+
const allModels = Array.from(new Set(data.data?.map((model) => `openrouter/${model.id}`) ?? []))
34+
const models = filterBlacklistedModels(allModels)
3435

3536
logger.info('Successfully fetched OpenRouter models', {
3637
count: models.length,
38+
filtered: allModels.length - models.length,
3739
})
3840

3941
return NextResponse.json({ models })

apps/sim/blocks/blocks/agent.ts

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@ import type { BlockConfig } from '@/blocks/types'
55
import { AuthMode } from '@/blocks/types'
66
import {
77
getAllModelProviders,
8-
getBaseModelProviders,
98
getHostedModels,
109
getMaxTemperature,
1110
getProviderIcon,
@@ -164,9 +163,9 @@ Create a system prompt appropriately detailed for the request, using clear langu
164163
required: true,
165164
options: () => {
166165
const providersState = useProvidersStore.getState()
166+
const baseModels = providersState.providers.base.models
167167
const ollamaModels = providersState.providers.ollama.models
168168
const openrouterModels = providersState.providers.openrouter.models
169-
const baseModels = Object.keys(getBaseModelProviders())
170169
const allModels = Array.from(new Set([...baseModels, ...ollamaModels, ...openrouterModels]))
171170

172171
return allModels.map((model) => {

apps/sim/blocks/blocks/evaluator.ts

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@ import type { BlockConfig, ParamType } from '@/blocks/types'
55
import type { ProviderId } from '@/providers/types'
66
import {
77
getAllModelProviders,
8-
getBaseModelProviders,
98
getHostedModels,
109
getProviderIcon,
1110
providers,
@@ -189,9 +188,9 @@ export const EvaluatorBlock: BlockConfig<EvaluatorResponse> = {
189188
required: true,
190189
options: () => {
191190
const providersState = useProvidersStore.getState()
191+
const baseModels = providersState.providers.base.models
192192
const ollamaModels = providersState.providers.ollama.models
193193
const openrouterModels = providersState.providers.openrouter.models
194-
const baseModels = Object.keys(getBaseModelProviders())
195194
const allModels = Array.from(new Set([...baseModels, ...ollamaModels, ...openrouterModels]))
196195

197196
return allModels.map((model) => {

apps/sim/blocks/blocks/guardrails.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import { ShieldCheckIcon } from '@/components/icons'
22
import { isHosted } from '@/lib/environment'
33
import type { BlockConfig } from '@/blocks/types'
4-
import { getBaseModelProviders, getHostedModels, getProviderIcon } from '@/providers/utils'
4+
import { getHostedModels, getProviderIcon } from '@/providers/utils'
55
import { useProvidersStore } from '@/stores/providers/store'
66
import type { ToolResponse } from '@/tools/types'
77

@@ -99,9 +99,9 @@ export const GuardrailsBlock: BlockConfig<GuardrailsResponse> = {
9999
required: true,
100100
options: () => {
101101
const providersState = useProvidersStore.getState()
102+
const baseModels = providersState.providers.base.models
102103
const ollamaModels = providersState.providers.ollama.models
103104
const openrouterModels = providersState.providers.openrouter.models
104-
const baseModels = Object.keys(getBaseModelProviders())
105105
const allModels = Array.from(new Set([...baseModels, ...ollamaModels, ...openrouterModels]))
106106

107107
return allModels.map((model) => {

apps/sim/blocks/blocks/router.ts

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@ import { AuthMode, type BlockConfig } from '@/blocks/types'
44
import type { ProviderId } from '@/providers/types'
55
import {
66
getAllModelProviders,
7-
getBaseModelProviders,
87
getHostedModels,
98
getProviderIcon,
109
providers,
@@ -136,9 +135,9 @@ export const RouterBlock: BlockConfig<RouterResponse> = {
136135
required: true,
137136
options: () => {
138137
const providersState = useProvidersStore.getState()
138+
const baseModels = providersState.providers.base.models
139139
const ollamaModels = providersState.providers.ollama.models
140140
const openrouterModels = providersState.providers.openrouter.models
141-
const baseModels = Object.keys(getBaseModelProviders())
142141
const allModels = Array.from(new Set([...baseModels, ...ollamaModels, ...openrouterModels]))
143142

144143
return allModels.map((model) => {

apps/sim/blocks/blocks/translate.ts

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@ import { isHosted } from '@/lib/environment'
33
import { AuthMode, type BlockConfig } from '@/blocks/types'
44
import {
55
getAllModelProviders,
6-
getBaseModelProviders,
76
getHostedModels,
87
getProviderIcon,
98
providers,
@@ -61,9 +60,9 @@ export const TranslateBlock: BlockConfig = {
6160
required: true,
6261
options: () => {
6362
const providersState = useProvidersStore.getState()
63+
const baseModels = providersState.providers.base.models
6464
const ollamaModels = providersState.providers.ollama.models
6565
const openrouterModels = providersState.providers.openrouter.models
66-
const baseModels = Object.keys(getBaseModelProviders())
6766
const allModels = Array.from(new Set([...baseModels, ...ollamaModels, ...openrouterModels]))
6867

6968
return allModels.map((model) => {

apps/sim/lib/env.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,7 @@ export const env = createEnv({
7979
OLLAMA_URL: z.string().url().optional(), // Ollama local LLM server URL
8080
ELEVENLABS_API_KEY: z.string().min(1).optional(), // ElevenLabs API key for text-to-speech in deployed chat
8181
SERPER_API_KEY: z.string().min(1).optional(), // Serper API key for online search
82+
DEEPSEEK_MODELS_ENABLED: z.boolean().optional().default(false), // Enable Deepseek models in UI (defaults to false for compliance)
8283

8384
// Azure Configuration - Shared credentials with feature-specific models
8485
AZURE_OPENAI_ENDPOINT: z.string().url().optional(), // Shared Azure OpenAI service endpoint

apps/sim/providers/utils.ts

Lines changed: 55 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import { getEnv, isTruthy } from '@/lib/env'
12
import { isHosted } from '@/lib/environment'
23
import { createLogger } from '@/lib/logs/console/logger'
34
import { anthropicProvider } from '@/providers/anthropic'
@@ -129,8 +130,8 @@ export async function updateOpenRouterProviderModels(models: string[]): Promise<
129130
}
130131

131132
export function getBaseModelProviders(): Record<string, ProviderId> {
132-
return Object.entries(providers)
133-
.filter(([providerId]) => providerId !== 'ollama')
133+
const allProviders = Object.entries(providers)
134+
.filter(([providerId]) => providerId !== 'ollama' && providerId !== 'openrouter')
134135
.reduce(
135136
(map, [providerId, config]) => {
136137
config.models.forEach((model) => {
@@ -140,6 +141,20 @@ export function getBaseModelProviders(): Record<string, ProviderId> {
140141
},
141142
{} as Record<string, ProviderId>
142143
)
144+
145+
return filterBlacklistedModelsFromProviderMap(allProviders)
146+
}
147+
148+
function filterBlacklistedModelsFromProviderMap(
149+
providerMap: Record<string, ProviderId>
150+
): Record<string, ProviderId> {
151+
const filtered: Record<string, ProviderId> = {}
152+
for (const [model, providerId] of Object.entries(providerMap)) {
153+
if (!isModelBlacklisted(model)) {
154+
filtered[model] = providerId
155+
}
156+
}
157+
return filtered
143158
}
144159

145160
export function getAllModelProviders(): Record<string, ProviderId> {
@@ -197,6 +212,44 @@ export function getProviderModels(providerId: ProviderId): string[] {
197212
return getProviderModelsFromDefinitions(providerId)
198213
}
199214

215+
interface ModelBlacklist {
216+
models: string[]
217+
prefixes: string[]
218+
envOverride?: string
219+
}
220+
221+
const MODEL_BLACKLISTS: ModelBlacklist[] = [
222+
{
223+
models: ['deepseek-chat', 'deepseek-v3', 'deepseek-r1'],
224+
prefixes: ['openrouter/deepseek', 'openrouter/tngtech'],
225+
envOverride: 'DEEPSEEK_MODELS_ENABLED',
226+
},
227+
]
228+
229+
function isModelBlacklisted(model: string): boolean {
230+
const lowerModel = model.toLowerCase()
231+
232+
for (const blacklist of MODEL_BLACKLISTS) {
233+
if (blacklist.envOverride && isTruthy(getEnv(blacklist.envOverride))) {
234+
continue
235+
}
236+
237+
if (blacklist.models.includes(lowerModel)) {
238+
return true
239+
}
240+
241+
if (blacklist.prefixes.some((prefix) => lowerModel.startsWith(prefix))) {
242+
return true
243+
}
244+
}
245+
246+
return false
247+
}
248+
249+
export function filterBlacklistedModels(models: string[]): string[] {
250+
return models.filter((model) => !isModelBlacklisted(model))
251+
}
252+
200253
/**
201254
* Get provider icon for a given model
202255
*/

apps/sim/stores/providers/store.ts

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,11 @@ import type { ProviderConfig, ProviderName, ProvidersStore } from './types'
66
const logger = createLogger('ProvidersStore')
77

88
const PROVIDER_CONFIGS: Record<ProviderName, ProviderConfig> = {
9+
base: {
10+
apiEndpoint: '/api/providers/base/models',
11+
dedupeModels: true,
12+
updateFunction: () => {},
13+
},
914
ollama: {
1015
apiEndpoint: '/api/providers/ollama/models',
1116
updateFunction: updateOllamaProviderModels,
@@ -42,6 +47,7 @@ const fetchProviderModels = async (provider: ProviderName): Promise<string[]> =>
4247

4348
export const useProvidersStore = create<ProvidersStore>((set, get) => ({
4449
providers: {
50+
base: { models: [], isLoading: false },
4551
ollama: { models: [], isLoading: false },
4652
openrouter: { models: [], isLoading: false },
4753
},
@@ -120,6 +126,7 @@ export const useProvidersStore = create<ProvidersStore>((set, get) => ({
120126
if (typeof window !== 'undefined') {
121127
setTimeout(() => {
122128
const store = useProvidersStore.getState()
129+
store.fetchModels('base')
123130
store.fetchModels('ollama')
124131
store.fetchModels('openrouter')
125132
}, 1000)

0 commit comments

Comments
 (0)