Skip to main content
Glama
use-comparison-chat.ts5.68 kB
// This file is deprecated and will be removed in the future. "use client" import type React from "react" import { useState, useCallback, useEffect } from "react" import { type CreateMessage, type Message, useChat } from "@ai-sdk/react" import type { Source } from "@/lib/types" import { nanoid } from "@/lib/nanoid" export interface SearchSuggestion { term: string confidence?: number reasoning?: string } export function useComparisonChat() { const [sharedInput, setSharedInput] = useState("") const [googleSources, setGoogleSources] = useState<Source[]>([]) const [openaiSources, setOpenaiSources] = useState<Source[]>([]) const [googleSearchSuggestions, setGoogleSearchSuggestions] = useState<SearchSuggestion[]>([]) const [searchSuggestionsReasoning, setSearchSuggestionsReasoning] = useState<string>("") const [searchSuggestionsConfidence, setSearchSuggestionsConfidence] = useState<number | null>(null) const [isGoogleActive, setIsGoogleActive] = useState(true) const [isOpenAIActive, setIsOpenAIActive] = useState(true) const { messages: googleMessages, isLoading: isGoogleLoading, stop: stopGoogle, data: googleData, append: appendGoogle, setMessages: setGoogleMessages, } = useChat({ api: "/api/chat/google", id: "google-search-chat", generateId: nanoid, experimental_throttle: 50, }) const { messages: openaiMessages, isLoading: isOpenAILoading, stop: stopOpenAI, data: openaiData, append: appendOpenAI, } = useChat({ api: "/api/chat/openai", id: "openai-search-chat", generateId: nanoid, experimental_throttle: 50, }) useEffect(() => { if (googleData && Array.isArray(googleData)) { for (const item of googleData) { if (item && typeof item === "object" && "type" in item) { if (item.type === "sources" && "sources" in item && Array.isArray(item.sources)) { setGoogleSources(item.sources as Source[]) } if (item.type === "searchSuggestions") { if ("searchSuggestions" in item && Array.isArray(item.searchSuggestions)) { const suggestions = item.searchSuggestions.map((term) => ({ term })) setGoogleSearchSuggestions(suggestions as SearchSuggestion[]) if ("confidence" in item && typeof item.confidence === "number") { setSearchSuggestionsConfidence(item.confidence) } if ("reasoning" in item && typeof item.reasoning === "string") { setSearchSuggestionsReasoning(item.reasoning) } } } if (item.type === "cleaned-text" && "text" in item && typeof item.text === "string") { setGoogleMessages((prevMessages) => { const newMessages = [...prevMessages] for (let i = newMessages.length - 1; i >= 0; i--) { if (newMessages[i].role === "assistant") { newMessages[i] = { ...newMessages[i], content: item.text as string, } break } } return newMessages }) } } } } }, [googleData, setGoogleMessages]) useEffect(() => { if (openaiData && Array.isArray(openaiData)) { for (const item of openaiData) { if (item && typeof item === "object" && "type" in item && item.type === "sources") { if ("sources" in item && Array.isArray(item.sources)) { setOpenaiSources(item.sources as Source[]) return } } } } }, [openaiData]) const handleInputChange = useCallback((e: React.ChangeEvent<HTMLTextAreaElement>) => { setSharedInput(e.target.value) }, []) const handleSearchSuggestionClick = useCallback((suggestion: string) => { setSharedInput(suggestion) }, []) const toggleGoogleActive = useCallback(() => { setIsGoogleActive((prev) => !prev) }, []) const toggleOpenAIActive = useCallback(() => { setIsOpenAIActive((prev) => !prev) }, []) const handleSubmit = useCallback( async (e?: React.FormEvent) => { e?.preventDefault() if (!sharedInput.trim()) return if (!isGoogleActive && !isOpenAIActive) return setGoogleSources([]) setOpenaiSources([]) setGoogleSearchSuggestions([]) setSearchSuggestionsReasoning("") setSearchSuggestionsConfidence(null) const userMessage = { role: "user", content: sharedInput } as Message | CreateMessage const appendPromises = [] if (isGoogleActive) { appendPromises.push(appendGoogle(userMessage)) } if (isOpenAIActive) { appendPromises.push(appendOpenAI(userMessage)) } await Promise.all(appendPromises) setSharedInput("") }, [sharedInput, isGoogleActive, isOpenAIActive, appendGoogle, appendOpenAI], ) const stopGenerating = useCallback(() => { if (isGoogleActive && isGoogleLoading) { stopGoogle() } if (isOpenAIActive && isOpenAILoading) { stopOpenAI() } }, [isGoogleActive, isOpenAIActive, isGoogleLoading, isOpenAILoading, stopGoogle, stopOpenAI]) return { googleMessages, openaiMessages, googleSources, openaiSources, googleSearchSuggestions, searchSuggestionsReasoning, searchSuggestionsConfidence, isGoogleLoading, isOpenAILoading, isGoogleActive, isOpenAIActive, toggleGoogleActive, toggleOpenAIActive, input: sharedInput, handleInputChange, handleSearchSuggestionClick, handleSubmit, stopGenerating, } }

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/myeong-ga/research-agent-mcp-0.36-pro-preview-06-01'

If you have feedback or need assistance with the MCP directory API, please join our Discord server