Skip to content

Commit 3489c9f

Browse files
authored
feat(agents-insights): use model icons from platformicons (#94176)
1 parent eb83c8f commit 3489c9f

File tree

9 files changed

+64
-107
lines changed

9 files changed

+64
-107
lines changed

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -144,7 +144,7 @@
144144
"moment-timezone": "0.5.44",
145145
"papaparse": "^5.3.2",
146146
"peggy": "^4.1.1",
147-
"platformicons": "^8.0.6",
147+
"platformicons": "^8.0.7",
148148
"po-catalog-loader": "2.1.0",
149149
"prettier": "3.6.0",
150150
"prismjs": "^1.30.0",

pnpm-lock.yaml

Lines changed: 5 additions & 5 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

static/app/icons/iconClaude.tsx

Lines changed: 0 additions & 14 deletions
This file was deleted.

static/app/icons/iconGemini.tsx

Lines changed: 0 additions & 14 deletions
This file was deleted.

static/app/icons/iconOpenAI.tsx

Lines changed: 0 additions & 14 deletions
This file was deleted.

static/app/icons/index.tsx

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,6 @@ export {IconCheckmark} from './iconCheckmark';
1313
export {IconChevron} from './iconChevron';
1414
export {IconCircle} from './iconCircle';
1515
export {IconCircleFill} from './iconCircleFill';
16-
export {IconClaude} from './iconClaude';
1716
export {IconClock} from './iconClock';
1817
export {IconClose} from './iconClose';
1918
export {IconCode} from './iconCode';
@@ -42,7 +41,6 @@ export {IconFix} from './iconFix';
4241
export {IconFlag} from './iconFlag';
4342
export {IconFocus} from './iconFocus';
4443
export {IconGeneric} from './iconGeneric';
45-
export {IconGemini} from './iconGemini';
4644
export {IconGithub} from './iconGithub';
4745
export {IconGitlab} from './iconGitlab';
4846
export {IconGlobe} from './iconGlobe';
@@ -77,7 +75,6 @@ export {IconNext} from './iconNext';
7775
export {IconNot} from './iconNot';
7876
export {IconNumber} from './iconNumber';
7977
export {IconOpen} from './iconOpen';
80-
export {IconOpenAI} from './iconOpenAI';
8178
export {IconPanel} from './iconPanel';
8279
export {IconPause} from './iconPause';
8380
export {IconPin} from './iconPin';
Lines changed: 27 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1,32 +1,37 @@
1-
import {getModelProvider} from './modelName';
1+
import {getModelPlatform} from './modelName';
22

3-
// Test suite for getModelProvider function
4-
describe('getModelProvider Function', () => {
5-
it('returns provider for known modelId', () => {
6-
expect(getModelProvider('gpt-3')).toBe('openai');
7-
expect(getModelProvider('gpt-3.5')).toBe('openai');
8-
expect(getModelProvider('gpt-4o')).toBe('openai');
9-
expect(getModelProvider('gpt-4o-mini')).toBe('openai');
10-
expect(getModelProvider('o1-mini')).toBe('openai');
11-
expect(getModelProvider('o3')).toBe('openai');
12-
expect(getModelProvider('o4')).toBe('openai');
3+
// Test suite for getModelPlatform function
4+
describe('getModelPlatform Function', () => {
5+
it('returns platform for known modelId', () => {
6+
expect(getModelPlatform('gpt-3')).toBe('openai');
7+
expect(getModelPlatform('gpt-3.5')).toBe('openai');
8+
expect(getModelPlatform('gpt-4o')).toBe('openai');
9+
expect(getModelPlatform('gpt-4o-mini')).toBe('openai');
10+
expect(getModelPlatform('o1-mini')).toBe('openai');
11+
expect(getModelPlatform('o3')).toBe('openai');
12+
expect(getModelPlatform('o4')).toBe('openai');
1313

14-
expect(getModelProvider('gemini-2.5')).toBe('google');
15-
expect(getModelProvider('claude-3.5-sonnet')).toBe('anthropic');
14+
expect(getModelPlatform('gemini-2.5')).toBe('google');
15+
expect(getModelPlatform('gemma-7b')).toBe('google');
16+
expect(getModelPlatform('claude-3.5-sonnet')).toBe('anthropic-claude');
17+
expect(getModelPlatform('deepseek-coder')).toBe('deepseek');
18+
expect(getModelPlatform('grok-beta')).toBe('grok');
19+
expect(getModelPlatform('groq-llama')).toBe('groq');
20+
expect(getModelPlatform('mistral-7b')).toBe('mistral');
21+
expect(getModelPlatform('perplexity-sonar')).toBe('perplexity');
1622
});
1723

1824
it('returns null for unknown modelId', () => {
19-
expect(getModelProvider('DeepSeek R1')).toBeNull();
20-
expect(getModelProvider('Sonar')).toBeNull();
21-
expect(getModelProvider('Llama 3.1')).toBeNull();
22-
expect(getModelProvider('Qwen 2.5')).toBeNull();
23-
expect(getModelProvider('Mistral')).toBeNull();
25+
expect(getModelPlatform('unknown-model')).toBeNull();
26+
expect(getModelPlatform('Llama 3.1')).toBeNull();
27+
expect(getModelPlatform('Qwen 2.5')).toBeNull();
28+
expect(getModelPlatform('random-ai-model')).toBeNull();
2429
});
2530

2631
it('returns provider when provider is explicitly provided', () => {
27-
expect(getModelProvider('some-model', 'openai')).toBe('openai');
28-
expect(getModelProvider('some-model', 'google')).toBe('google');
29-
expect(getModelProvider('some-model', 'anthropic')).toBe('anthropic');
30-
expect(getModelProvider('some-model', 'unknown')).toBeNull();
32+
expect(getModelPlatform('some-model', 'openai')).toBe('openai');
33+
expect(getModelPlatform('some-model', 'google')).toBe('google');
34+
expect(getModelPlatform('some-model', 'anthropic')).toBe('anthropic');
35+
expect(getModelPlatform('some-model', 'unknown-provider')).toBe('unknown-provider');
3136
});
3237
});

static/app/views/insights/agentMonitoring/components/modelName.tsx

Lines changed: 30 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -1,54 +1,51 @@
1+
import {PlatformIcon} from 'platformicons';
2+
13
import {Flex} from 'sentry/components/core/layout';
2-
import {IconClaude} from 'sentry/icons/iconClaude';
3-
import {IconGemini} from 'sentry/icons/iconGemini';
4-
import {IconOpenAI} from 'sentry/icons/iconOpenAI';
5-
import type {SVGIconProps} from 'sentry/icons/svgIcon';
64
import {space} from 'sentry/styles/space';
75

86
interface ModelNameProps {
97
modelId: string;
108
provider?: string;
9+
size?: number;
1110
}
1211

13-
export function ModelName({modelId, provider}: ModelNameProps) {
14-
const modelProvider = getModelProvider(modelId, provider);
15-
16-
const ModelIcon = modelProvider ? providerIconMap[modelProvider] : null;
12+
export function ModelName({modelId, provider, size = 16}: ModelNameProps) {
13+
const platform = getModelPlatform(modelId, provider);
1714

1815
return (
1916
<Flex gap={space(1)}>
20-
<div>{ModelIcon && <ModelIcon size="md" color="textColor" />}</div>
17+
<div>
18+
<PlatformIcon platform={platform ?? 'unknown'} size={size} />
19+
</div>
2120
<div>{modelId}</div>
2221
</Flex>
2322
);
2423
}
2524

26-
const providerIconMap: Record<KnownProvider, React.ComponentType<SVGIconProps>> = {
27-
openai: IconOpenAI,
28-
google: IconGemini,
29-
anthropic: IconClaude,
30-
};
31-
32-
type KnownProvider = 'openai' | 'google' | 'anthropic';
25+
export function getModelPlatform(modelId: string, provider?: string) {
26+
if (provider) {
27+
return provider;
28+
}
3329

34-
export function getModelProvider(modelId: string, provider?: string) {
3530
const lowerCaseModelId = modelId.toLowerCase();
36-
if (provider && provider in providerIconMap) {
37-
return provider as KnownProvider;
38-
}
39-
if (
40-
lowerCaseModelId.includes('gpt') ||
41-
lowerCaseModelId.includes('o1') ||
42-
lowerCaseModelId.includes('o3') ||
43-
lowerCaseModelId.includes('o4')
44-
) {
45-
return 'openai';
46-
}
47-
if (lowerCaseModelId.includes('gemma') || lowerCaseModelId.includes('gemini')) {
48-
return 'google';
49-
}
50-
if (lowerCaseModelId.includes('claude')) {
51-
return 'anthropic';
31+
32+
const providerMap = [
33+
{keywords: ['gpt', 'o1', 'o3', 'o4'], platform: 'openai'},
34+
{keywords: ['gemma', 'gemini'], platform: 'google'},
35+
{keywords: ['claude'], platform: 'anthropic-claude'},
36+
{keywords: ['deepseek'], platform: 'deepseek'},
37+
{keywords: ['grok'], platform: 'grok'},
38+
{keywords: ['groq'], platform: 'groq'},
39+
{keywords: ['mistral'], platform: 'mistral'},
40+
{keywords: ['perplexity'], platform: 'perplexity'},
41+
];
42+
43+
const matchedProvider = providerMap.find(({keywords}) =>
44+
keywords.some(keyword => lowerCaseModelId.includes(keyword))
45+
);
46+
47+
if (matchedProvider) {
48+
return matchedProvider.platform;
5249
}
5350

5451
return null;

static/app/views/insights/agentMonitoring/components/modelsTable.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -190,7 +190,7 @@ const BodyCell = memo(function BodyCell({
190190
case 'model':
191191
return (
192192
<ModelCell to={exploreUrl}>
193-
<ModelName modelId={dataRow.model} />
193+
<ModelName modelId={dataRow.model} size={18} />
194194
</ModelCell>
195195
);
196196
case 'count()':

0 commit comments

Comments
 (0)