diff --git a/apps/sim/app/workspace/[workspaceId]/settings/components/byok/byok.tsx b/apps/sim/app/workspace/[workspaceId]/settings/components/byok/byok.tsx index b5df541858..d3d52b81d8 100644 --- a/apps/sim/app/workspace/[workspaceId]/settings/components/byok/byok.tsx +++ b/apps/sim/app/workspace/[workspaceId]/settings/components/byok/byok.tsx @@ -1,8 +1,8 @@ 'use client' -import { useState } from 'react' +import { useMemo, useState } from 'react' import { createLogger } from '@sim/logger' -import { Eye, EyeOff } from 'lucide-react' +import { Eye, EyeOff, Search } from 'lucide-react' import { useParams } from 'next/navigation' import { Button, @@ -30,6 +30,7 @@ import { PerplexityIcon, SerperIcon, } from '@/components/icons' +import { Input } from '@/components/ui' import { BYOKKeySkeleton } from '@/app/workspace/[workspaceId]/settings/components/byok/byok-skeleton' import { type BYOKKey, @@ -164,6 +165,7 @@ export function BYOK() { const upsertKey = useUpsertBYOKKey() const deleteKey = useDeleteBYOKKey() + const [searchTerm, setSearchTerm] = useState('') const [editingProvider, setEditingProvider] = useState(null) const [apiKeyInput, setApiKeyInput] = useState('') const [showApiKey, setShowApiKey] = useState(false) @@ -171,6 +173,18 @@ export function BYOK() { const [deleteConfirmProvider, setDeleteConfirmProvider] = useState(null) + const filteredProviders = useMemo(() => { + if (!searchTerm.trim()) return PROVIDERS + const searchLower = searchTerm.toLowerCase() + return PROVIDERS.filter( + (p) => + p.name.toLowerCase().includes(searchLower) || + p.description.toLowerCase().includes(searchLower) + ) + }, [searchTerm]) + + const showNoResults = searchTerm.trim() && filteredProviders.length === 0 + const getKeyForProvider = (providerId: BYOKProviderId): BYOKKey | undefined => { return keys.find((k) => k.providerId === providerId) } @@ -219,6 +233,22 @@ export function BYOK() { return ( <>
+
+
+ + setSearchTerm(e.target.value)} + disabled={isLoading} + className='h-auto flex-1 border-0 bg-transparent p-0 font-base leading-none placeholder:text-[var(--text-tertiary)] focus-visible:ring-0 focus-visible:ring-offset-0' + /> +
+
+

Use your own API keys for hosted model providers.

@@ -232,7 +262,7 @@ export function BYOK() {
) : (
- {PROVIDERS.map((provider) => { + {filteredProviders.map((provider) => { const existingKey = getKeyForProvider(provider.id) const Icon = provider.icon @@ -274,6 +304,11 @@ export function BYOK() {
) })} + {showNoResults && ( +
+ No providers found matching "{searchTerm}" +
+ )} )}