diff --git a/packages/app/src/components/inference/utils/tooltip-utils.test.ts b/packages/app/src/components/inference/utils/tooltip-utils.test.ts
index daa48b26..f3814bad 100644
--- a/packages/app/src/components/inference/utils/tooltip-utils.test.ts
+++ b/packages/app/src/components/inference/utils/tooltip-utils.test.ts
@@ -524,6 +524,21 @@ describe('generateOverlayTooltipContent', () => {
expect(standardZh).toContain('投机解码: 关闭');
});
+ it('labels Kimi-K3 speculative decoding "DSpark" rather than the generic MTP', () => {
+ const html = generateOverlayTooltipContent(
+ overlayConfig({
+ data: pt({
+ benchmark_type: 'agentic_traces',
+ model: 'Kimi-K3',
+ spec_decoding: 'mtp',
+ }),
+ }),
+ );
+
+ expect(html).toContain('Speculative Decoding: DSpark');
+ expect(html).not.toContain('Speculative Decoding: MTP');
+ });
+
it('hides stale CPU cache hits for unofficial overlays without offload', () => {
const html = generateOverlayTooltipContent(
overlayConfig({
diff --git a/packages/constants/src/framework-aliases.test.ts b/packages/constants/src/framework-aliases.test.ts
index 3acee7b0..469ef3cc 100644
--- a/packages/constants/src/framework-aliases.test.ts
+++ b/packages/constants/src/framework-aliases.test.ts
@@ -31,6 +31,10 @@ describe('MODEL_SPEC_METHOD_LABELS', () => {
it('maps MiniMax-M3 mtp to "M3 EAGLE"', () => {
expect(MODEL_SPEC_METHOD_LABELS['MiniMax-M3']?.mtp).toBe('M3 EAGLE');
});
+
+ it('maps Kimi-K3 mtp to "DSpark"', () => {
+ expect(MODEL_SPEC_METHOD_LABELS['Kimi-K3']?.mtp).toBe('DSpark');
+ });
});
describe('resolveFrameworkPartLabel', () => {
@@ -38,6 +42,10 @@ describe('resolveFrameworkPartLabel', () => {
expect(resolveFrameworkPartLabel('MiniMax-M3', 'mtp')).toBe('M3 EAGLE');
});
+ it('renders K3 mtp as "DSpark"', () => {
+ expect(resolveFrameworkPartLabel('Kimi-K3', 'mtp')).toBe('DSpark');
+ });
+
it('keeps the generic MTP label for other models', () => {
expect(resolveFrameworkPartLabel('DeepSeek-R1-0528', 'mtp')).toBe('MTP');
});
@@ -46,6 +54,10 @@ describe('resolveFrameworkPartLabel', () => {
expect(resolveFrameworkPartLabel(undefined, 'mtp')).toBe('MTP');
});
+ it('keeps the generic MTP label for sibling Kimi models', () => {
+ expect(resolveFrameworkPartLabel('Kimi-K2.5', 'mtp')).toBe('MTP');
+ });
+
it('falls back to FRAMEWORK_LABELS for non-overridden parts even for M3', () => {
expect(resolveFrameworkPartLabel('MiniMax-M3', 'vllm')).toBe('vLLM');
});
diff --git a/packages/constants/src/framework-aliases.ts b/packages/constants/src/framework-aliases.ts
index 076f5cb2..902ddf22 100644
--- a/packages/constants/src/framework-aliases.ts
+++ b/packages/constants/src/framework-aliases.ts
@@ -55,12 +55,13 @@ export const FRAMEWORK_LABELS: Record = {
* Per-model display overrides for hwKey suffix parts (framework / spec_method
* tokens), keyed by frontend display model name → token → label.
*
- * M3's speculative-decoding runs are ingested under the generic `mtp` token but
- * actually use EAGLE, so for MiniMax-M3 the suffix reads "EAGLE" while every
- * other model keeps the generic "MTP" label.
+ * Some models are ingested under the generic `mtp` token but ship a
+ * differently-named method: M3 uses EAGLE, and K3 uses DSpark. Those models get
+ * their own label while every other model keeps the generic "MTP" label.
*/
export const MODEL_SPEC_METHOD_LABELS: Record> = {
'MiniMax-M3': { mtp: 'M3 EAGLE' },
+ 'Kimi-K3': { mtp: 'DSpark' },
};
/**