/* * StreamTestView.tsx * Zyquo Cloud Web * * Author: Simon-Pierre Boucher * Mail: contact@spboucher.ai * * Phase 2 gate: a bare test view that renders a REAL streaming completion * token-by-token against any configured provider, using a key from * localStorage. Reached via #stream-test. Superseded by the real chat UI in * Phase 4 but kept for verification (Phase 7 drives it programmatically). */ import { useRef, useState } from 'react' import { cheapestModel, findModel, modelsFor } from '../providers/catalog' import { clientFor } from '../providers/registry' import { ProviderError } from '../providers/types' import { getKey, configuredProviders } from '../storage/keys' import { BUILT_IN_PROVIDERS, type Provider } from '../types' export default function StreamTestView() { const [provider, setProvider] = useState('openai') const [modelID, setModelID] = useState('') const [prompt, setPrompt] = useState('Count from 1 to 10, one number per line.') const [output, setOutput] = useState('') const [reasoning, setReasoning] = useState('') const [status, setStatus] = useState('idle') const [tokens, setTokens] = useState('') const abortRef = useRef(null) const run = async () => { const key = getKey(provider) if (!key) { setStatus(`no key for ${provider} in localStorage`) return } const model = (modelID !== '' ? findModel(provider, modelID) : undefined) ?? cheapestModel(provider) ?? modelsFor(provider)[0] if (!model) { setStatus('no model') return } setOutput('') setReasoning('') setTokens('') setStatus(`streaming ${model.id}…`) const controller = new AbortController() abortRef.current = controller try { const client = clientFor(model) const events = client.streamChat( { model, messages: [ { id: 't1', role: 'user', text: prompt, createdAt: Date.now(), }, ], parameters: { maxTokens: 256 }, stream: true, }, key, controller.signal ) for await (const event of events) { if (event.type === 'textDelta') setOutput((prev) => prev + event.text) else if (event.type === 'reasoningDelta') setReasoning((prev) => prev + event.text) else if (event.type === 'usage') setTokens(`${event.usage.inputTokens}→${event.usage.outputTokens} tok`) else if (event.type === 'finished') setStatus(`finished (${event.reason ?? 'n/a'})`) } } catch (err) { setStatus(err instanceof ProviderError ? `${err.kind}: ${err.message}` : String(err)) } finally { abortRef.current = null } } return (

Zyquo Cloud Web — stream test

configured: {configuredProviders().join(', ') || '(none)'}

setModelID(e.target.value)} style={{ width: 260 }} /> setPrompt(e.target.value)} style={{ width: 320 }} />

status: {status}

{tokens}

{reasoning !== '' && (
          {reasoning}
        
)}
        {output}
      
) }