@@ -41,7 +32,7 @@ export default function ModelSizeFilter() {
setValueMax(Number(e[1]))
}}
min={0}
- max={100}
+ max={max}
step={1}
/>
@@ -55,7 +46,7 @@ export default function ModelSizeFilter() {
type="text"
className="mt-1 h-8 w-[60px] p-2"
min={0}
- max={100}
+ max={max}
value={inputingMinValue ? value : normalizeTextValue(value)}
textAlign="left"
onFocus={(e) => setInputingMinValue(true)}
@@ -75,7 +66,7 @@ export default function ModelSizeFilter() {
// E.g. anything changes that trigger onValueChanged
// Which is incorrect
if (
- Number(e.target.value) > 100 ||
+ Number(e.target.value) > max ||
Number(e.target.value) < 0 ||
Number.isNaN(Number(e.target.value))
)
@@ -91,7 +82,7 @@ export default function ModelSizeFilter() {
type="text"
className="mt-1 h-8 w-[60px] p-2"
min={0}
- max={100}
+ max={max}
value={inputingMaxValue ? valueMax : normalizeTextValue(valueMax)}
textAlign="left"
onFocus={(e) => setInputingMaxValue(true)}
@@ -99,7 +90,7 @@ export default function ModelSizeFilter() {
setInputingMaxValue(false)
const numericValue = e.target.value.replace(/\D/g, '')
const value = Number(numericValue)
- setValueMax(value > 100 ? 100 : value)
+ setValueMax(value > max ? max : value)
}}
onChange={(e) => {
// Passthru since it validates again onBlur
@@ -111,7 +102,7 @@ export default function ModelSizeFilter() {
// E.g. anything changes that trigger onValueChanged
// Which is incorrect
if (
- Number(e.target.value) > 100 ||
+ Number(e.target.value) > max ||
Number(e.target.value) < 0 ||
Number.isNaN(Number(e.target.value))
)
diff --git a/web/screens/Hub/index.tsx b/web/screens/Hub/index.tsx
index 88106d6d0..c8d48fd4d 100644
--- a/web/screens/Hub/index.tsx
+++ b/web/screens/Hub/index.tsx
@@ -35,6 +35,7 @@ import {
import ModelList from '@/screens/Hub/ModelList'
+import { toGigabytes } from '@/utils/converter'
import { extractModelRepo } from '@/utils/modelSource'
import { fuzzySearch } from '@/utils/search'
@@ -110,6 +111,14 @@ const HubScreen = () => {
const [maxModelSizeFilter, setMaxModelSizeFilter] =
useAtom(hubModelSizeMaxAtom)
+ const largestModel =
+ sources &&
+ sources
+ .flatMap((model) => model.models)
+ .reduce((max, model) => (model.size > max.size ? model : max), {
+ size: 0,
+ })
+
const searchedModels = useMemo(
() =>
searchValue.length
@@ -135,7 +144,7 @@ const HubScreen = () => {
!minModelSizeFilter ||
model.models.some((e) => e.size >= minModelSizeFilter * (1 << 30))
const matchesMaxSize =
- maxModelSizeFilter === 100 ||
+ maxModelSizeFilter === largestModel?.size ||
model.models.some((e) => e.size <= maxModelSizeFilter * (1 << 30))
return isCompatible && matchesCtxLen && matchesMinSize && matchesMaxSize
@@ -169,6 +178,19 @@ const HubScreen = () => {
}
}, [modelDetail, sources, setModelDetail, addModelSource])
+ useEffect(() => {
+ if (largestModel) {
+ setMaxModelSizeFilter(
+ Number(
+ toGigabytes(Number(largestModel?.size), {
+ hideUnit: true,
+ toFixed: 0,
+ })
+ )
+ )
+ }
+ }, [largestModel])
+
useEffect(() => {
if (selectedModel) {
// Try add the model source again to update it's data
@@ -403,7 +425,7 @@ const HubScreen = () => {
0 && 'visible'
)}
>
@@ -414,7 +436,10 @@ const HubScreen = () => {
) : (
- <>
+
{searchedModels.map((model) => (
{
))}
- >
+
)}