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:
parent
4e5f8e6c93
commit
355166c194
@ -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();
|
||||
|
||||
@ -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;
|
||||
}
|
||||
|
||||
|
||||
@ -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;
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user