- backend/coach: routing zu Sonnet (default) / Haiku / Groq Llama je nach sessionData.llmProvider. sort:latency für Anthropic-Modelle (-30..58% TTFB). - frontend: LlmProviderToggle (Sonnet/Haiku/Groq pills), llmProvider.ts Storage-Helper. sosStream.ts schickt llmProvider im /sos-session-Body. - bench: SosTtsBenchmark sammelt Marker (req->session, lyra-ttfb, lyra-done, tts-fired/headers/body/file, audio-loaded, first-audio); Output als console.table. - ops: backend/scripts/llm-bench.sh + Python-Variante für realistic SOS-Prompt. - speak-cartesia + speak-elevenlabs Endpoints (waren ungetracked, jetzt mit drin).
61 lines
1.6 KiB
TypeScript
61 lines
1.6 KiB
TypeScript
import { Pressable, Text, View } from 'react-native';
|
|
import { TTS_PROVIDER_LABEL, type TtsProvider, useTtsProvider } from '../../lib/ttsProvider';
|
|
|
|
const PROVIDERS: TtsProvider[] = ['openai', 'gemini', 'elevenlabs', 'cartesia', 'google-cloud'];
|
|
|
|
export function TtsProviderToggle() {
|
|
const [current, set] = useTtsProvider();
|
|
return (
|
|
<View
|
|
style={{
|
|
flexDirection: 'row',
|
|
alignItems: 'center',
|
|
justifyContent: 'center',
|
|
gap: 6,
|
|
paddingHorizontal: 12,
|
|
paddingVertical: 6,
|
|
}}
|
|
>
|
|
<Text
|
|
style={{
|
|
fontSize: 9,
|
|
color: '#9ca3af',
|
|
textTransform: 'uppercase',
|
|
letterSpacing: 0.5,
|
|
marginRight: 4,
|
|
}}
|
|
>
|
|
TTS
|
|
</Text>
|
|
{PROVIDERS.map((p) => {
|
|
const active = p === current;
|
|
return (
|
|
<Pressable
|
|
key={p}
|
|
onPress={() => { void set(p); }}
|
|
hitSlop={6}
|
|
style={{
|
|
paddingHorizontal: 10,
|
|
paddingVertical: 4,
|
|
borderRadius: 999,
|
|
backgroundColor: active ? '#1f2937' : '#e5e7eb',
|
|
borderWidth: 1.5,
|
|
borderColor: active ? '#1f2937' : '#9ca3af',
|
|
}}
|
|
>
|
|
<Text
|
|
style={{
|
|
fontSize: 10,
|
|
fontFamily: 'Nunito_700Bold',
|
|
color: active ? '#ffffff' : '#374151',
|
|
}}
|
|
>
|
|
{TTS_PROVIDER_LABEL[p]}
|
|
</Text>
|
|
</Pressable>
|
|
);
|
|
})}
|
|
</View>
|
|
);
|
|
}
|