Skip to content

Commit a2f3145

Browse files
committed
improvement(models): derive provider colors/resellers from definitions, reorient FAQs to agent builder
Dynamic data: - Add `color` and `isReseller` fields to ProviderDefinition interface - Move brand colors for all 10 providers into their definitions - Mark 6 reseller providers (Azure, Bedrock, Vertex, OpenRouter, Fireworks) - consts.ts now derives color map from MODEL_CATALOG_PROVIDERS - model-comparison-charts derives RESELLER_PROVIDERS from catalog - Fix deepseek name: Deepseek → DeepSeek; remove now-redundant PROVIDER_NAME_OVERRIDES and getProviderDisplayName from utils - Add color/isReseller fields to CatalogProvider; clean up duplicate providerDisplayName in searchText array FAQs: - Replace all 4 main-page FAQs with 5 agent-builder-oriented ones covering model selection, context windows, pricing, tool use, and how to use models in a Sim agent workflow - buildProviderFaqs: add conditional tool use FAQ per provider - buildModelFaqs: add bestFor FAQ (conditional on field presence); improve context window answer to explain agent implications; tighten capabilities answer wording
1 parent e302343 commit a2f3145

File tree

5 files changed

+127
-91
lines changed

5 files changed

+127
-91
lines changed
Lines changed: 5 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,9 @@
1-
export const PROVIDER_COLORS: Record<string, string> = {
2-
anthropic: '#D97757',
3-
openai: '#E8E8E8',
4-
google: '#4285F4',
5-
xai: '#555555',
6-
mistral: '#F7D046',
7-
groq: '#F55036',
8-
cerebras: '#6D5BF7',
9-
deepseek: '#4D6BFE',
10-
fireworks: '#FF6D3A',
11-
bedrock: '#FF9900',
12-
}
1+
import { MODEL_CATALOG_PROVIDERS } from '@/app/(landing)/models/utils'
132

14-
const DEFAULT_COLOR = '#888888'
3+
const colorMap = new Map(
4+
MODEL_CATALOG_PROVIDERS.filter((p) => p.color).map((p) => [p.id, p.color as string])
5+
)
156

167
export function getProviderColor(providerId: string): string {
17-
return PROVIDER_COLORS[providerId] ?? DEFAULT_COLOR
8+
return colorMap.get(providerId) ?? '#888888'
189
}

apps/sim/app/(landing)/models/components/model-comparison-charts.tsx

Lines changed: 3 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -12,14 +12,9 @@ import {
1212
} from '@/app/(landing)/models/utils'
1313

1414
/** Providers that host other providers' models — deprioritized to avoid duplicates. */
15-
const RESELLER_PROVIDERS = new Set([
16-
'azure-openai',
17-
'azure-anthropic',
18-
'bedrock',
19-
'vertex',
20-
'openrouter',
21-
'fireworks',
22-
])
15+
const RESELLER_PROVIDERS = new Set(
16+
MODEL_CATALOG_PROVIDERS.filter((p) => p.isReseller).map((p) => p.id)
17+
)
2318

2419
const PROVIDER_ICON_MAP: Record<string, ComponentType<{ className?: string }>> = (() => {
2520
const map: Record<string, ComponentType<{ className?: string }>> = {}

apps/sim/app/(landing)/models/page.tsx

Lines changed: 13 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -22,24 +22,29 @@ const baseUrl = getBaseUrl()
2222

2323
const faqItems = [
2424
{
25-
question: 'What is the Sim AI models directory?',
25+
question: 'Which AI models are best for building agents and automated workflows?',
2626
answer:
27-
'The Sim AI models directory is a public catalog of the language models and providers tracked inside Sim. It shows provider coverage, model IDs, pricing per one million tokens, context windows, and supported capabilities such as reasoning controls, structured outputs, and deep research.',
27+
'The most important factors for agent tasks are reliable tool use (function calling), a large enough context window to track conversation history and tool outputs, and consistent instruction following. In Sim, OpenAI GPT-4.1, Anthropic Claude Sonnet, and Google Gemini 2.5 Pro are popular choices — each supports tool use, structured outputs, and context windows of 128K tokens or more. For cost-sensitive or high-throughput agents, Groq and Cerebras offer significantly faster inference at lower cost.',
2828
},
2929
{
30-
question: 'Can I compare models from multiple providers in one place?',
30+
question: 'What does context window size mean when running an AI agent?',
3131
answer:
32-
'Yes. This page organizes every tracked model by provider and lets you search across providers, model names, and capabilities. You can quickly compare OpenAI, Anthropic, Google, xAI, Mistral, Groq, Cerebras, Fireworks, Bedrock, and more from a single directory.',
32+
'The context window is the total number of tokens a model can process in a single call, including your system prompt, conversation history, tool call results, and any documents you pass in. For agents running multi-step tasks, context fills up quickly — each tool result and each retrieved document adds tokens. A 128K-token context window fits roughly 300 pages of text; models like Gemini 2.5 Pro support up to 1M tokens, enough to hold an entire codebase in a single pass.',
3333
},
3434
{
35-
question: 'Are these model prices shown per million tokens?',
35+
question: 'Are model prices shown per million tokens?',
3636
answer:
37-
'Yes. Input, cached input, and output prices on this page are shown per one million tokens based on the provider metadata tracked in Sim.',
37+
'Yes. Input, cached input, and output prices are all listed per one million tokens, matching how providers bill through their APIs. For agents that chain multiple calls, costs compound quickly — an agent completing 100 turns at 10K tokens each consumes roughly 1M tokens per session. Cached input pricing applies when a provider supports prompt caching, where a repeated prefix like a system prompt is billed at a reduced rate.',
3838
},
3939
{
40-
question: 'Does Sim support providers with dynamic model catalogs too?',
40+
question: 'Which AI models support tool use and function calling?',
4141
answer:
42-
'Yes. Some providers such as OpenRouter, Fireworks, Ollama, and vLLM load their model lists dynamically at runtime. Those providers are still shown here even when their full public model list is not hard-coded into the catalog.',
42+
'Tool use — also called function calling — lets an agent invoke external APIs, query databases, run code, or take any action you define. In Sim, all first-party models from OpenAI, Anthropic, Google, Mistral, Groq, Cerebras, and xAI support tool use. Look for the Tool Use capability tag on any model card in this directory to confirm support.',
43+
},
44+
{
45+
question: 'How do I add a model to a Sim agent workflow?',
46+
answer:
47+
'Open any workflow in Sim, add an Agent block, and select your provider and model from the model picker inside that block. Every model listed in this directory is available in the Agent block. Swapping models takes one click and does not affect the rest of your workflow, making it straightforward to test different models on the same task without rebuilding anything.',
4348
},
4449
]
4550

apps/sim/app/(landing)/models/utils.ts

Lines changed: 42 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -13,12 +13,6 @@ const PROVIDER_PREFIXES: Record<string, string[]> = {
1313
vllm: ['vllm/'],
1414
}
1515

16-
const PROVIDER_NAME_OVERRIDES: Record<string, string> = {
17-
deepseek: 'DeepSeek',
18-
vllm: 'vLLM',
19-
xai: 'xAI',
20-
}
21-
2216
const TOKEN_REPLACEMENTS: Record<string, string> = {
2317
ai: 'AI',
2418
aws: 'AWS',
@@ -127,6 +121,8 @@ export interface CatalogProvider {
127121
defaultModel: string
128122
defaultModelDisplayName: string
129123
icon?: ComponentType<{ className?: string }>
124+
color?: string
125+
isReseller: boolean
130126
contextInformationAvailable: boolean
131127
providerCapabilityTags: string[]
132128
modelCount: number
@@ -419,10 +415,6 @@ function buildModelSummary(
419415
return parts.filter(Boolean).join(' ')
420416
}
421417

422-
function getProviderDisplayName(providerId: string, providerName: string): string {
423-
return PROVIDER_NAME_OVERRIDES[providerId] ?? providerName
424-
}
425-
426418
function computeModelRelevanceScore(model: CatalogModel): number {
427419
return (
428420
(model.capabilities.reasoningEffort ? 10 : 0) +
@@ -439,7 +431,7 @@ function compareModelsByRelevance(a: CatalogModel, b: CatalogModel): number {
439431

440432
const rawProviders = Object.values(PROVIDER_DEFINITIONS).map((provider) => {
441433
const providerSlug = slugify(provider.id)
442-
const providerDisplayName = getProviderDisplayName(provider.id, provider.name)
434+
const providerDisplayName = provider.name
443435
const providerCapabilityTags = buildCapabilityTags(provider.capabilities ?? {})
444436

445437
const models: CatalogModel[] = provider.models.map((model) => {
@@ -509,14 +501,15 @@ const rawProviders = Object.values(PROVIDER_DEFINITIONS).map((provider) => {
509501
defaultModel: provider.defaultModel,
510502
defaultModelDisplayName,
511503
icon: provider.icon,
504+
color: provider.color,
505+
isReseller: provider.isReseller ?? false,
512506
contextInformationAvailable: provider.contextInformationAvailable !== false,
513507
providerCapabilityTags,
514508
modelCount: models.length,
515509
models,
516510
featuredModels,
517511
searchText: [
518512
provider.name,
519-
providerDisplayName,
520513
provider.id,
521514
provider.description,
522515
provider.defaultModel,
@@ -633,7 +626,13 @@ export function buildProviderFaqs(provider: CatalogProvider): CatalogFaq[] {
633626
const cheapestModel = getCheapestProviderModel(provider)
634627
const largestContextModel = getLargestContextProviderModel(provider)
635628

636-
return [
629+
const toolUseModels = provider.models.filter(
630+
(m) =>
631+
m.capabilities.toolUsageControl !== undefined ||
632+
provider.providerCapabilityTags.includes('Tool Use')
633+
)
634+
635+
const faqs: CatalogFaq[] = [
637636
{
638637
question: `What ${provider.name} models are available in Sim?`,
639638
answer: `Sim currently tracks ${provider.modelCount} ${provider.name} model${provider.modelCount === 1 ? '' : 's'} including ${provider.models
@@ -664,10 +663,27 @@ export function buildProviderFaqs(provider: CatalogProvider): CatalogFaq[] {
664663
: `Context window details are not fully available for every ${provider.name} model in the public catalog.`,
665664
},
666665
]
666+
667+
if (toolUseModels.length > 0) {
668+
faqs.push({
669+
question: `Which ${provider.name} models support tool use and function calling in Sim?`,
670+
answer:
671+
toolUseModels.length === provider.modelCount
672+
? `All ${provider.name} models in Sim support tool use and function calling, allowing agents to invoke external APIs, query databases, and run custom actions.`
673+
: `${toolUseModels
674+
.slice(0, 5)
675+
.map((m) => m.displayName)
676+
.join(
677+
', '
678+
)}${toolUseModels.length > 5 ? ', and others' : ''} support tool use and function calling in Sim, enabling agents to invoke external APIs and run custom actions.`,
679+
})
680+
}
681+
682+
return faqs
667683
}
668684

669685
export function buildModelFaqs(provider: CatalogProvider, model: CatalogModel): CatalogFaq[] {
670-
return [
686+
const faqs: CatalogFaq[] = [
671687
{
672688
question: `What is ${model.displayName}?`,
673689
answer: `${model.displayName} is a ${provider.name} model available in Sim. ${model.summary}`,
@@ -679,17 +695,26 @@ export function buildModelFaqs(provider: CatalogProvider, model: CatalogModel):
679695
{
680696
question: `What is the context window for ${model.displayName}?`,
681697
answer: model.contextWindow
682-
? `${model.displayName} supports a listed context window of ${formatTokenCount(model.contextWindow)} tokens in Sim.`
698+
? `${model.displayName} supports a context window of ${formatTokenCount(model.contextWindow)} tokens in Sim. In an agent workflow, this determines how much conversation history, tool outputs, and retrieved documents the model can hold in a single call.`
683699
: `A public context window value is not currently tracked for ${model.displayName}.`,
684700
},
685701
{
686702
question: `What capabilities does ${model.displayName} support?`,
687703
answer:
688704
model.capabilityTags.length > 0
689-
? `${model.displayName} supports ${model.capabilityTags.join(', ')}.`
690-
: `${model.displayName} is available in Sim, but no extra public capability flags are currently tracked for this model.`,
705+
? `${model.displayName} supports the following capabilities in Sim: ${model.capabilityTags.join(', ')}.`
706+
: `${model.displayName} supports standard text generation in Sim. No additional capability flags such as tool use or structured outputs are currently tracked for this model.`,
691707
},
692708
]
709+
710+
if (model.bestFor) {
711+
faqs.push({
712+
question: `What is ${model.displayName} best used for?`,
713+
answer: `${model.bestFor} When used in a Sim workflow, it can be selected in any Agent block from the model picker.`,
714+
})
715+
}
716+
717+
return faqs
693718
}
694719

695720
export function buildModelCapabilityFacts(model: CatalogModel): CapabilityFact[] {

0 commit comments

Comments
 (0)