From fd8b325ddab9180ed981b7396f4ec30a398512ee Mon Sep 17 00:00:00 2001 From: sedanah-m Date: Tue, 25 Aug 2026 14:47:40 -0700 Subject: [PATCH 1/8] fix: clean-up chat & text-generation features. --- ai/ai-samples/src/features/chat/index.tsx | 35 +++--- .../src/features/text-generation/index.tsx | 104 ++++++++++++++---- 2 files changed, 98 insertions(+), 41 deletions(-) diff --git a/ai/ai-samples/src/features/chat/index.tsx b/ai/ai-samples/src/features/chat/index.tsx index 3843f5a98..c1f6d953c 100644 --- a/ai/ai-samples/src/features/chat/index.tsx +++ b/ai/ai-samples/src/features/chat/index.tsx @@ -12,44 +12,37 @@ export default function ChatView() { const [input, setInput] = useState(''); const [loading, setLoading] = useState(false); const [error, setError] = useState(null); - - // Use a ref to hold the active chat session from the Firebase AI SDK. - // This prevents the session from being recreated on every React render. const chatSessionRef = useRef(null); - - // Initialize the chat when the component mounts useEffect(() => { handleResetChat(); }, []); - const handleResetChat = () => { - try { - chatSessionRef.current = startNewChat(); - setError(null); - } catch (err: any) { - setError(err.message || 'Failed to initialize chat session. Please check your Firebase configuration.'); - } - setMessages([]); - setInput(''); - }; + const handleResetChat = () => { + try { + chatSessionRef.current = startNewChat(); + setError(null); + } catch (err: unknown) { + const errorMessage = err instanceof Error + ? err.message + : 'Failed to initialize chat session. Please check your Firebase configuration.'; + setError(errorMessage); + } + setMessages([]); + setInput(''); +}; const handleSendMessage = async (e: React.FormEvent) => { e.preventDefault(); if (!input.trim() || !chatSessionRef.current) return; const userMessage = input.trim(); - setInput(''); // Clear input immediately + setInput(''); setError(null); setLoading(true); - - // Optimistically add user message to UI setMessages((prev) => [...prev, { role: 'user', text: userMessage }]); try { - // Call framework-agnostic service layer const responseText = await sendChatMessage(chatSessionRef.current, userMessage); - - // Add model response to UI setMessages((prev) => [...prev, { role: 'model', text: responseText }]); } catch (err: any) { setError(err.message || 'Failed to send message. Check console for details.'); diff --git a/ai/ai-samples/src/features/text-generation/index.tsx b/ai/ai-samples/src/features/text-generation/index.tsx index 7cf7034a6..23e29d77e 100644 --- a/ai/ai-samples/src/features/text-generation/index.tsx +++ b/ai/ai-samples/src/features/text-generation/index.tsx @@ -1,49 +1,113 @@ import { useState } from 'react'; -import { generateText } from './service'; +import { + generateText, + streamText, + generateWithSystemInstruction +} from './service'; export default function TextGeneration() { const [prompt, setPrompt] = useState(''); + const cleanPrompt = prompt.trim(); + const [systemInstruction, setSystemInstruction] = useState(''); + const [useStreaming, setUseStreaming] = useState(true); const [response, setResponse] = useState(''); const [loading, setLoading] = useState(false); const [error, setError] = useState(null); const handleGenerate = async () => { - if (!prompt.trim()) return; + if (!cleanPrompt) return; setLoading(true); setError(null); setResponse(''); try { - // Direct call to the decoupled logic service - const text = await generateText(prompt); - setResponse(text); - } catch (err: any) { - setError(err.message || 'An unexpected error occurred'); + if (useStreaming) { + await streamText(cleanPrompt, (chunk) => { + setResponse((prev) => prev + chunk); + }); + } else if (systemInstruction.trim()) { + const text = await generateWithSystemInstruction(systemInstruction, prompt); + setResponse(text); + } else { + const text = await generateText(prompt); + setResponse(text); + } + } catch (err: unknown) { + const errorMessage = err instanceof Error + ? err.message + : 'An unexpected error occurred'; + + setError(errorMessage); } finally { setLoading(false); } }; - return (

Text Generation

-