From 6daa39994c808886355f0fa3d9343fba8833f1c0 Mon Sep 17 00:00:00 2001 From: Aleksander Grygier Date: Sun, 25 Jan 2026 00:32:37 +0100 Subject: [PATCH] refactor: Naming & Enums --- .../lib/components/app/chat/ChatForm/ChatForm.svelte | 4 ++-- .../lib/components/ui/tooltip/tooltip-content.svelte | 10 +++++----- .../server/webui/src/lib/constants/processing-info.ts | 7 +++++++ tools/server/webui/src/lib/enums/chat.ts | 8 ++++++++ tools/server/webui/src/lib/enums/files.ts | 7 +++++++ tools/server/webui/src/lib/enums/index.ts | 5 +++-- .../webui/src/lib/hooks/use-processing-state.svelte.ts | 3 ++- .../src/lib/markdown/resolve-attachment-images.ts | 4 +++- tools/server/webui/src/lib/services/chat.service.ts | 6 ++++-- tools/server/webui/src/lib/utils/attachment-display.ts | 4 ++-- .../webui/src/lib/utils/convert-files-to-extra.ts | 4 ++-- 11 files changed, 45 insertions(+), 17 deletions(-) diff --git a/tools/server/webui/src/lib/components/app/chat/ChatForm/ChatForm.svelte b/tools/server/webui/src/lib/components/app/chat/ChatForm/ChatForm.svelte index 72e21b75c0..fe4cc6da15 100644 --- a/tools/server/webui/src/lib/components/app/chat/ChatForm/ChatForm.svelte +++ b/tools/server/webui/src/lib/components/app/chat/ChatForm/ChatForm.svelte @@ -8,7 +8,7 @@ } from '$lib/components/app'; import { INPUT_CLASSES } from '$lib/constants/css-classes'; import { SETTING_CONFIG_DEFAULT } from '$lib/constants/settings-config'; - import { MimeTypeText } from '$lib/enums'; + import { MimeTypeText, SpecialFileType } from '$lib/enums'; import { config } from '$lib/stores/settings.svelte'; import { modelOptions, selectedModelId } from '$lib/stores/models.svelte'; import { isRouterMode } from '$lib/stores/server.svelte'; @@ -189,7 +189,7 @@ id: placeholderId, name: promptName, size: 0, - type: 'mcp-prompt', + type: SpecialFileType.MCP_PROMPT, file: new File([], 'loading'), isLoading: true, mcpPrompt: { diff --git a/tools/server/webui/src/lib/components/ui/tooltip/tooltip-content.svelte b/tools/server/webui/src/lib/components/ui/tooltip/tooltip-content.svelte index 8161187f5f..011d492f3d 100644 --- a/tools/server/webui/src/lib/components/ui/tooltip/tooltip-content.svelte +++ b/tools/server/webui/src/lib/components/ui/tooltip/tooltip-content.svelte @@ -9,11 +9,11 @@ side = 'top', children, arrowClasses, - usePortal = true, + noPortal = false, ...restProps }: TooltipPrimitive.ContentProps & { arrowClasses?: string; - usePortal?: boolean; + noPortal?: boolean; } = $props(); const contentClass = $derived( @@ -52,10 +52,10 @@ {/snippet} -{#if usePortal} +{#if noPortal} + {@render tooltipContent()} +{:else} {@render tooltipContent()} -{:else} - {@render tooltipContent()} {/if} diff --git a/tools/server/webui/src/lib/constants/processing-info.ts b/tools/server/webui/src/lib/constants/processing-info.ts index 726439211b..2c3f7dc534 100644 --- a/tools/server/webui/src/lib/constants/processing-info.ts +++ b/tools/server/webui/src/lib/constants/processing-info.ts @@ -1 +1,8 @@ export const PROCESSING_INFO_TIMEOUT = 2000; + +/** + * Statistics units labels + */ +export const STATS_UNITS = { + TOKENS_PER_SECOND: 't/s' +} as const; diff --git a/tools/server/webui/src/lib/enums/chat.ts b/tools/server/webui/src/lib/enums/chat.ts index d38b29fe17..ee4a2ed649 100644 --- a/tools/server/webui/src/lib/enums/chat.ts +++ b/tools/server/webui/src/lib/enums/chat.ts @@ -5,6 +5,14 @@ export enum ChatMessageStatsView { SUMMARY = 'summary' } +/** + * Reasoning format options for API requests. + */ +export enum ReasoningFormat { + NONE = 'none', + AUTO = 'auto' +} + /** * Message roles for chat messages. */ diff --git a/tools/server/webui/src/lib/enums/files.ts b/tools/server/webui/src/lib/enums/files.ts index a4f079d405..a82f27ca68 100644 --- a/tools/server/webui/src/lib/enums/files.ts +++ b/tools/server/webui/src/lib/enums/files.ts @@ -11,6 +11,13 @@ export enum FileTypeCategory { TEXT = 'text' } +/** + * Special file types for internal use (not MIME types) + */ +export enum SpecialFileType { + MCP_PROMPT = 'mcp-prompt' +} + // Specific file type enums for each category export enum FileTypeImage { JPEG = 'jpeg', diff --git a/tools/server/webui/src/lib/enums/index.ts b/tools/server/webui/src/lib/enums/index.ts index 1e51b57331..81d88b30e7 100644 --- a/tools/server/webui/src/lib/enums/index.ts +++ b/tools/server/webui/src/lib/enums/index.ts @@ -2,7 +2,7 @@ export { AttachmentType } from './attachment'; export { AgenticSectionType } from './agentic'; -export { ChatMessageStatsView, MessageRole, MessageType } from './chat'; +export { ChatMessageStatsView, MessageRole, MessageType, ReasoningFormat } from './chat'; export { FileTypeCategory, @@ -17,7 +17,8 @@ export { MimeTypeApplication, MimeTypeAudio, MimeTypeImage, - MimeTypeText + MimeTypeText, + SpecialFileType } from './files'; export { MCPConnectionPhase, MCPLogLevel, MCPTransportType, HealthCheckStatus } from './mcp'; diff --git a/tools/server/webui/src/lib/hooks/use-processing-state.svelte.ts b/tools/server/webui/src/lib/hooks/use-processing-state.svelte.ts index b06aead8ea..25ad766e8c 100644 --- a/tools/server/webui/src/lib/hooks/use-processing-state.svelte.ts +++ b/tools/server/webui/src/lib/hooks/use-processing-state.svelte.ts @@ -1,5 +1,6 @@ import { activeProcessingState } from '$lib/stores/chat.svelte'; import { config } from '$lib/stores/settings.svelte'; +import { STATS_UNITS } from '$lib/constants/processing-info'; export interface LiveProcessingStats { tokensProcessed: number; @@ -163,7 +164,7 @@ export function useProcessingState(): UseProcessingStateReturn { } if (stateToUse.tokensPerSecond && stateToUse.tokensPerSecond > 0) { - details.push(`${stateToUse.tokensPerSecond.toFixed(1)} t/s`); + details.push(`${stateToUse.tokensPerSecond.toFixed(1)} ${STATS_UNITS.TOKENS_PER_SECOND}`); } if (stateToUse.speculative) { diff --git a/tools/server/webui/src/lib/markdown/resolve-attachment-images.ts b/tools/server/webui/src/lib/markdown/resolve-attachment-images.ts index 0e5845e4f6..abce51d47c 100644 --- a/tools/server/webui/src/lib/markdown/resolve-attachment-images.ts +++ b/tools/server/webui/src/lib/markdown/resolve-attachment-images.ts @@ -1,6 +1,7 @@ import type { Root as HastRoot } from 'hast'; import { visit } from 'unist-util-visit'; import type { DatabaseMessage, DatabaseMessageExtraImageFile } from '$lib/types/database'; +import { AttachmentType } from '$lib/enums'; /** * Rehype plugin to resolve attachment image sources. @@ -19,7 +20,8 @@ export function rehypeResolveAttachmentImages(options: { message?: DatabaseMessa // Find matching attachment const attachment = options.message?.extra?.find( - (a): a is DatabaseMessageExtraImageFile => a.type === 'IMAGE' && a.name === src + (a): a is DatabaseMessageExtraImageFile => + a.type === AttachmentType.IMAGE && a.name === src ); // Replace with base64 URL if found diff --git a/tools/server/webui/src/lib/services/chat.service.ts b/tools/server/webui/src/lib/services/chat.service.ts index ec1036ace1..f61d712187 100644 --- a/tools/server/webui/src/lib/services/chat.service.ts +++ b/tools/server/webui/src/lib/services/chat.service.ts @@ -1,6 +1,6 @@ import { getJsonHeaders } from '$lib/utils'; import { AGENTIC_REGEX } from '$lib/constants/agentic'; -import { AttachmentType, MessageRole } from '$lib/enums'; +import { AttachmentType, MessageRole, ReasoningFormat } from '$lib/enums'; import type { ApiChatMessageContentPart } from '$lib/types/api'; import type { DatabaseMessageExtraMcpPrompt } from '$lib/types'; @@ -169,7 +169,9 @@ export class ChatService { requestBody.model = options.model; } - requestBody.reasoning_format = disableReasoningParsing ? 'none' : 'auto'; + requestBody.reasoning_format = disableReasoningParsing + ? ReasoningFormat.NONE + : ReasoningFormat.AUTO; if (temperature !== undefined) requestBody.temperature = temperature; if (max_tokens !== undefined) { diff --git a/tools/server/webui/src/lib/utils/attachment-display.ts b/tools/server/webui/src/lib/utils/attachment-display.ts index 1ca920bce7..de80c9b28c 100644 --- a/tools/server/webui/src/lib/utils/attachment-display.ts +++ b/tools/server/webui/src/lib/utils/attachment-display.ts @@ -1,4 +1,4 @@ -import { AttachmentType, FileTypeCategory } from '$lib/enums'; +import { AttachmentType, FileTypeCategory, SpecialFileType } from '$lib/enums'; import { getFileTypeCategory, getFileTypeCategoryByExtension, isImageFile } from '$lib/utils'; export interface AttachmentDisplayItemsOptions { @@ -10,7 +10,7 @@ export interface AttachmentDisplayItemsOptions { * Check if an uploaded file is an MCP prompt */ function isMcpPromptUpload(file: ChatUploadedFile): boolean { - return file.type === 'mcp-prompt' && !!file.mcpPrompt; + return file.type === SpecialFileType.MCP_PROMPT && !!file.mcpPrompt; } /** diff --git a/tools/server/webui/src/lib/utils/convert-files-to-extra.ts b/tools/server/webui/src/lib/utils/convert-files-to-extra.ts index ac4810357a..f589af46dd 100644 --- a/tools/server/webui/src/lib/utils/convert-files-to-extra.ts +++ b/tools/server/webui/src/lib/utils/convert-files-to-extra.ts @@ -1,7 +1,7 @@ import { convertPDFToImage, convertPDFToText } from './pdf-processing'; import { isSvgMimeType, svgBase64UrlToPngDataURL } from './svg-to-png'; import { isWebpMimeType, webpBase64UrlToPngDataURL } from './webp-to-png'; -import { FileTypeCategory, AttachmentType } from '$lib/enums'; +import { FileTypeCategory, AttachmentType, SpecialFileType } from '$lib/enums'; import { config, settingsStore } from '$lib/stores/settings.svelte'; import { modelsStore } from '$lib/stores/models.svelte'; import { getFileTypeCategory } from '$lib/utils'; @@ -38,7 +38,7 @@ export async function parseFilesToMessageExtras( const emptyFiles: string[] = []; for (const file of files) { - if (file.type === 'mcp-prompt' && file.mcpPrompt) { + if (file.type === SpecialFileType.MCP_PROMPT && file.mcpPrompt) { extras.push({ type: AttachmentType.MCP_PROMPT, name: file.name,