feat(sos): tier-based LLM-Default — Free/Pro=Groq, Legend=Haiku

Backend (sos-stream.get.ts): wenn sessionData.llmProvider === 'auto'
oder undefined, resolved zu plan-based default via profile.plan:
- legend → openrouter-haiku (Anthropic warm + sort:latency)
- pro/free → groq-llama (sachlich + schnell, ~157ms TTFB)

Frontend (llmProvider.ts): DEFAULT_PROVIDER = 'auto', neue Pill 'Auto'
in LlmProviderToggle. Explicit-Toggles (Sonnet/Haiku/Groq) sind
debug-overrides die plan-logic bypassen.
This commit is contained in:
chahinebrini 2026-05-07 04:15:31 +02:00
parent 4e5f8e6c93
commit 355166c194
3 changed files with 20 additions and 5 deletions

View File

@ -1,7 +1,7 @@
import { Pressable, Text, View } from 'react-native';
import { LLM_PROVIDER_LABEL, type LlmProvider, useLlmProvider } from '../../lib/llmProvider';
const PROVIDERS: LlmProvider[] = ['openrouter-sonnet', 'openrouter-haiku', 'groq-llama'];
const PROVIDERS: LlmProvider[] = ['auto', 'openrouter-sonnet', 'openrouter-haiku', 'groq-llama'];
export function LlmProviderToggle() {
const [current, set] = useLlmProvider();

View File

@ -6,12 +6,15 @@
import AsyncStorage from '@react-native-async-storage/async-storage';
import { useEffect, useState } from 'react';
export type LlmProvider = 'openrouter-sonnet' | 'openrouter-haiku' | 'groq-llama';
export type LlmProvider = 'auto' | 'openrouter-sonnet' | 'openrouter-haiku' | 'groq-llama';
const STORAGE_KEY = 'rebreak-sos-llm-provider';
const DEFAULT_PROVIDER: LlmProvider = 'openrouter-sonnet';
// Default 'auto' → backend wählt nach plan: Pro=Groq, Legend=Haiku, Free=Groq.
// Explicit-Toggles (Sonnet/Haiku/Groq) sind debug-overrides und bypassen plan-logic.
const DEFAULT_PROVIDER: LlmProvider = 'auto';
export const LLM_PROVIDER_LABEL: Record<LlmProvider, string> = {
auto: 'Auto',
'openrouter-sonnet': 'Sonnet',
'openrouter-haiku': 'Haiku',
'groq-llama': 'Groq',
@ -24,7 +27,9 @@ export async function loadLlmProvider(): Promise<LlmProvider> {
if (cached) return cached;
const raw = await AsyncStorage.getItem(STORAGE_KEY).catch(() => null);
cached =
raw === 'openrouter-haiku' || raw === 'groq-llama' ? raw : DEFAULT_PROVIDER;
raw === 'auto' || raw === 'openrouter-sonnet' || raw === 'openrouter-haiku' || raw === 'groq-llama'
? raw
: DEFAULT_PROVIDER;
return cached;
}

View File

@ -152,7 +152,17 @@ export default defineEventHandler(async (event) => {
// LLM-Routing: client schickt llmProvider via /sos-session-Body (Toggle).
// Default openrouter-sonnet. sort:latency bei Anthropic über OR spart 30-58% TTFB
// (server-curl-bench gemessen). Groq bypasst OpenRouter-Hop für ~157ms TTFB.
const llmProvider = sessionData.llmProvider ?? "openrouter-sonnet";
// Tier-based LLM: Pro=Groq (sachlich+schnell), Legend=Haiku 4.5 (warm+fast),
// Free=Groq (kostenkontrolle). User kann via Toggle override (debug);
// 'auto' (oder undefined) → plan-based default.
const userToggle = sessionData.llmProvider;
let llmProvider: string;
if (userToggle && userToggle !== "auto") {
llmProvider = userToggle;
} else {
const plan = ((profile as any)?.plan ?? "free").toLowerCase();
llmProvider = plan === "legend" ? "openrouter-haiku" : "groq-llama";
}
let upstreamUrl: string;
let upstreamKey: string | undefined;
let upstreamModel: string;