// app/(app)/models/page.tsx async function getModels() { try { const res = await fetch('http://localhost:11434/api/tags', { next: { revalidate: 60 } }) if (!res.ok) return [] const data = await res.json() return data.models || [] } catch { return [] } } const MODEL_META: Record = { 'qwen': { provider: 'Alibaba', icon: '๐ŸŒŠ', desc: 'Powerful multilingual reasoning' }, 'deepseek': { provider: 'DeepSeek', icon: '๐Ÿ”ต', desc: 'Advanced code & reasoning' }, 'llama': { provider: 'Meta', icon: '๐Ÿฆ™', desc: 'Open-source foundation model' }, 'mistral': { provider: 'Mistral AI', icon: '๐ŸŒซ๏ธ', desc: 'Efficient European model' }, 'phi': { provider: 'Microsoft', icon: '๐Ÿ”ท', desc: 'Small language model' }, 'gemma': { provider: 'Google', icon: '๐Ÿ’Ž', desc: 'Google open model' }, } function getModelMeta(name: string) { for (const [key, meta] of Object.entries(MODEL_META)) { if (name.toLowerCase().includes(key)) return meta } return { provider: 'Unknown', icon: '๐Ÿค–', desc: 'AI language model' } } export default async function ModelsPage() { const models = await getModels() return (

Model Catalog

{models.length > 0 ? `${models.length} models loaded in Ollama` : 'Connect Ollama to see local models'}

{models.length === 0 ? (
๐Ÿฆ™

No models found. Start Ollama and pull a model:

ollama pull qwen2.5:7b
) : (
{models.map((m: any) => { const meta = getModelMeta(m.name) const sizeGB = m.size ? (m.size / 1e9).toFixed(1) : '?' return (
{meta.icon}
{m.name}
{meta.provider} ยท {meta.desc}
{sizeGB} GB ยท {m.details?.parameter_size || '?'} params
) })}
)}
) }