diff --git a/apps/mana/apps/web/src/lib/modules/companion/components/CompanionChat.svelte b/apps/mana/apps/web/src/lib/modules/companion/components/CompanionChat.svelte index 0f0d486a2..7e78c5dba 100644 --- a/apps/mana/apps/web/src/lib/modules/companion/components/CompanionChat.svelte +++ b/apps/mana/apps/web/src/lib/modules/companion/components/CompanionChat.svelte @@ -9,6 +9,13 @@ import { marked } from 'marked'; import { PaperPlaneRight, Robot, User, Lightning, CircleNotch } from '@mana/shared-icons'; import { getLocalLlmStatus } from '@mana/local-llm'; + import { + llmSettingsState, + updateLlmSettings, + ALL_TIERS, + tierLabel, + type LlmTier, + } from '@mana/shared-llm'; import { chatStore } from '../stores/chat.svelte'; import { runCompanionChat } from '../engine'; import { useMessages } from '../queries'; @@ -52,6 +59,31 @@ return null; }); + // ── AI Tier selector ──────────────────────────── + // The orchestrator picks the first enabled tier from allowedTiers. + // Showing a dropdown that sets taskOverrides['companion.chat'] + // gives the user fine-grained control per-task without changing + // global settings. + const llmSettings = $derived(llmSettingsState.current); + let currentTier = $derived( + llmSettings.taskOverrides['companion.chat'] ?? 'auto' + ); + + function onTierChange(tier: LlmTier | 'auto') { + const overrides = { ...llmSettings.taskOverrides }; + if (tier === 'auto') { + delete overrides['companion.chat']; + } else { + overrides['companion.chat'] = tier; + } + updateLlmSettings({ taskOverrides: overrides }); + } + + function tierDisplay(tier: LlmTier | 'auto'): string { + if (tier === 'auto') return 'Auto'; + return tierLabel(tier); + } + async function scrollToBottom() { await tick(); messagesEndEl?.scrollIntoView({ behavior: 'smooth' }); @@ -121,6 +153,25 @@
+
+ KI-Modus: + +
+
{#each messages.value as msg (msg.id)}