20738f3623
Replace the legacy React UI with the new Svelte-based one. Introduce a Playground in the UI to quickly test out text, image, text to speech and speech to text models behind llama-swap.
Key Changes
New Svelte UI (ui-svelte/)
- Multi-tab Playground with Chat, Image Generation, Audio Transcription, and Speech interfaces
- Chat: message editing/regeneration, markdown rendering with LaTeX math support, image attachments, code syntax highlighting
- Image: size selector, download/fullscreen viewing
- Audio: transcription with peer support
- Speech: voice caching with manual refresh, download button
- Responsive mobile layout with collapsible navigation
- XSS fixes and accessibility improvements
Proxy Improvements
- Add gzip/brotli compression for UI static assets (proxy/ui_compress.go)
- Add GET /v1/audio/voices?model={model} endpoint for voice listing
- Add peer support for /v1/audio/transcriptions
25 lines
655 B
TypeScript
25 lines
655 B
TypeScript
import type { Model } from "./types";
|
|
|
|
export interface GroupedModels {
|
|
local: Model[];
|
|
peersByProvider: Record<string, Model[]>;
|
|
}
|
|
|
|
export function groupModels(models: Model[]): GroupedModels {
|
|
const available = models.filter((m) => !m.unlisted);
|
|
const local = available.filter((m) => !m.peerID);
|
|
const peerModels = available.filter((m) => m.peerID);
|
|
|
|
const peersByProvider = peerModels.reduce(
|
|
(acc, model) => {
|
|
const peerId = model.peerID || "unknown";
|
|
if (!acc[peerId]) acc[peerId] = [];
|
|
acc[peerId].push(model);
|
|
return acc;
|
|
},
|
|
{} as Record<string, Model[]>
|
|
);
|
|
|
|
return { local, peersByProvider };
|
|
}
|