Skip to content

Commit 69b3d9a

Browse files
authored
Merge branch 'ggml-org:master' into master
2 parents 6ab959e + 2f68ce7 commit 69b3d9a

File tree

16 files changed

+1128
-517
lines changed

16 files changed

+1128
-517
lines changed

tools/mtmd/clip-impl.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -154,8 +154,8 @@ enum projector_type {
154154
PROJECTOR_TYPE_LFM2,
155155
PROJECTOR_TYPE_KIMIVL,
156156
PROJECTOR_TYPE_LIGHTONOCR,
157-
PROJECTOR_TYPE_UNKNOWN,
158157
PROJECTOR_TYPE_COGVLM,
158+
PROJECTOR_TYPE_UNKNOWN,
159159
};
160160

161161
static std::map<projector_type, std::string> PROJECTOR_TYPE_NAMES = {

tools/mtmd/clip.cpp

Lines changed: 430 additions & 330 deletions
Large diffs are not rendered by default.

tools/server/public/index.html.gz

2.17 KB
Binary file not shown.

tools/server/webui/src/lib/components/app/chat/ChatMessages/ChatMessageAssistant.svelte

Lines changed: 61 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,16 @@
33
import { useProcessingState } from '$lib/hooks/use-processing-state.svelte';
44
import { isLoading } from '$lib/stores/chat.svelte';
55
import { fade } from 'svelte/transition';
6-
import { Check, Copy, Package, X } from '@lucide/svelte';
6+
import {
7+
Check,
8+
Copy,
9+
Package,
10+
X,
11+
Gauge,
12+
Clock,
13+
WholeWord,
14+
ChartNoAxesColumn
15+
} from '@lucide/svelte';
716
import { Button } from '$lib/components/ui/button';
817
import { Checkbox } from '$lib/components/ui/checkbox';
918
import { INPUT_CLASSES } from '$lib/constants/input-classes';
@@ -76,8 +85,8 @@
7685
let displayedModel = $derived((): string | null => {
7786
if (!currentConfig.showModelInfo) return null;
7887
79-
if (currentConfig.modelSelectorEnabled) {
80-
return message.model ?? null;
88+
if (message.model) {
89+
return message.model;
8190
}
8291
8392
return serverModel;
@@ -160,22 +169,58 @@
160169
</div>
161170
{/if}
162171

163-
{#if displayedModel()}
164-
<span class="mt-6 mb-4 inline-flex items-center gap-1 text-xs text-muted-foreground">
165-
<Package class="h-3.5 w-3.5" />
172+
<div class="info my-6 grid gap-4">
173+
{#if displayedModel()}
174+
<span class="inline-flex items-center gap-2 text-xs text-muted-foreground">
175+
<span class="inline-flex items-center gap-1">
176+
<Package class="h-3.5 w-3.5" />
166177

167-
<span>Model used:</span>
178+
<span>Model used:</span>
179+
</span>
168180

169-
<button
170-
class="inline-flex cursor-pointer items-center gap-1 rounded-sm bg-muted-foreground/15 px-1.5 py-0.75"
171-
onclick={handleCopyModel}
172-
>
173-
{displayedModel()}
181+
<button
182+
class="inline-flex cursor-pointer items-center gap-1 rounded-sm bg-muted-foreground/15 px-1.5 py-0.75"
183+
onclick={handleCopyModel}
184+
>
185+
{displayedModel()}
174186

175-
<Copy class="ml-1 h-3 w-3 " />
176-
</button>
177-
</span>
178-
{/if}
187+
<Copy class="ml-1 h-3 w-3 " />
188+
</button>
189+
</span>
190+
{/if}
191+
192+
{#if currentConfig.showMessageStats && message.timings && message.timings.predicted_n && message.timings.predicted_ms}
193+
{@const tokensPerSecond = (message.timings.predicted_n / message.timings.predicted_ms) * 1000}
194+
<span class="inline-flex items-center gap-2 text-xs text-muted-foreground">
195+
<span class="inline-flex items-center gap-1">
196+
<ChartNoAxesColumn class="h-3.5 w-3.5" />
197+
198+
<span>Statistics:</span>
199+
</span>
200+
201+
<div class="inline-flex flex-wrap items-center gap-2 text-xs text-muted-foreground">
202+
<span
203+
class="inline-flex items-center gap-1 rounded-sm bg-muted-foreground/15 px-1.5 py-0.75"
204+
>
205+
<Gauge class="h-3 w-3" />
206+
{tokensPerSecond.toFixed(2)} tokens/s
207+
</span>
208+
<span
209+
class="inline-flex items-center gap-1 rounded-sm bg-muted-foreground/15 px-1.5 py-0.75"
210+
>
211+
<WholeWord class="h-3 w-3" />
212+
{message.timings.predicted_n} tokens
213+
</span>
214+
<span
215+
class="inline-flex items-center gap-1 rounded-sm bg-muted-foreground/15 px-1.5 py-0.75"
216+
>
217+
<Clock class="h-3 w-3" />
218+
{(message.timings.predicted_ms / 1000).toFixed(2)}s
219+
</span>
220+
</div>
221+
</span>
222+
{/if}
223+
</div>
179224

180225
{#if message.timestamp && !isEditing}
181226
<ChatMessageActions

tools/server/webui/src/lib/components/app/chat/ChatSettings/ChatSettingsDialog.svelte

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,11 @@
5252
{ value: 'dark', label: 'Dark', icon: Moon }
5353
]
5454
},
55+
{
56+
key: 'showMessageStats',
57+
label: 'Show message generation statistics',
58+
type: 'checkbox'
59+
},
5560
{
5661
key: 'showTokensPerSecond',
5762
label: 'Show tokens per second',
Lines changed: 93 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,93 @@
1+
<script lang="ts">
2+
import { Dialog as DialogPrimitive } from 'bits-ui';
3+
import XIcon from '@lucide/svelte/icons/x';
4+
5+
interface Props {
6+
open: boolean;
7+
code: string;
8+
language: string;
9+
onOpenChange?: (open: boolean) => void;
10+
}
11+
12+
let { open = $bindable(), code, language, onOpenChange }: Props = $props();
13+
14+
let iframeRef = $state<HTMLIFrameElement | null>(null);
15+
16+
$effect(() => {
17+
if (!iframeRef) return;
18+
19+
if (open) {
20+
iframeRef.srcdoc = code;
21+
} else {
22+
iframeRef.srcdoc = '';
23+
}
24+
});
25+
26+
function handleOpenChange(nextOpen: boolean) {
27+
open = nextOpen;
28+
onOpenChange?.(nextOpen);
29+
}
30+
</script>
31+
32+
<DialogPrimitive.Root {open} onOpenChange={handleOpenChange}>
33+
<DialogPrimitive.Portal>
34+
<DialogPrimitive.Overlay class="code-preview-overlay" />
35+
36+
<DialogPrimitive.Content class="code-preview-content">
37+
<iframe
38+
bind:this={iframeRef}
39+
title="Preview {language}"
40+
sandbox="allow-scripts"
41+
class="code-preview-iframe"
42+
></iframe>
43+
44+
<DialogPrimitive.Close
45+
class="code-preview-close absolute top-4 right-4 border-none bg-transparent text-white opacity-70 mix-blend-difference transition-opacity hover:opacity-100 focus-visible:ring-0 focus-visible:ring-offset-0 focus-visible:outline-none disabled:pointer-events-none [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-8"
46+
aria-label="Close preview"
47+
>
48+
<XIcon />
49+
<span class="sr-only">Close preview</span>
50+
</DialogPrimitive.Close>
51+
</DialogPrimitive.Content>
52+
</DialogPrimitive.Portal>
53+
</DialogPrimitive.Root>
54+
55+
<style lang="postcss">
56+
:global(.code-preview-overlay) {
57+
position: fixed;
58+
inset: 0;
59+
background-color: transparent;
60+
z-index: 100000;
61+
}
62+
63+
:global(.code-preview-content) {
64+
position: fixed;
65+
inset: 0;
66+
top: 0 !important;
67+
left: 0 !important;
68+
width: 100dvw;
69+
height: 100dvh;
70+
margin: 0;
71+
padding: 0;
72+
border: none;
73+
border-radius: 0;
74+
background-color: transparent;
75+
box-shadow: none;
76+
display: block;
77+
overflow: hidden;
78+
transform: none !important;
79+
z-index: 100001;
80+
}
81+
82+
:global(.code-preview-iframe) {
83+
display: block;
84+
width: 100dvw;
85+
height: 100dvh;
86+
border: 0;
87+
}
88+
89+
:global(.code-preview-close) {
90+
position: absolute;
91+
z-index: 100002;
92+
}
93+
</style>

0 commit comments

Comments
 (0)