"use client"; import { useEffect, useState } from "react"; import { Card } from "@/components/ui/card"; import { Tabs, TabsList, TabsTrigger } from "@/components/ui/tabs"; import { Input } from "@/components/ui/input"; import { Label } from "@/components/ui/label"; import { Button } from "@/components/ui/button"; import GameComponent from "@/components/game-component"; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue, } from "@/components/ui/select"; import { API_BASE } from "@/lib/constants"; import { VirtualizedCombobox } from "./ui/virtualized-combobox"; export default function PlayTab({ startArticle, destinationArticle, }: { startArticle?: string; destinationArticle?: string; }) { const [player, setPlayer] = useState<"me" | "model">("me"); const [selectedModel, setSelectedModel] = useState(); const [maxHops, setMaxHops] = useState(20); const [isGameStarted, setIsGameStarted] = useState(false); const [startPage, setStartPage] = useState(startArticle || "Dogs"); const [targetPage, setTargetPage] = useState(destinationArticle || "Canada"); const [maxTokens, setMaxTokens] = useState(1024); const [maxLinks, setMaxLinks] = useState(200); const [isServerConnected, setIsServerConnected] = useState(false); const [modelList, setModelList] = useState<{id: string, name: string, author: string, likes: number, trendingScore: number}[]>([]); const [allArticles, setAllArticles] = useState([]); // Server connection check useEffect(() => { fetchAvailableModels(); const checkServerConnection = async () => { try { const response = await fetch(API_BASE + "/health"); setIsServerConnected(response.ok); } catch { setIsServerConnected(false); } }; // Check immediately and then every 30 seconds checkServerConnection(); const interval = setInterval(checkServerConnection, 30000); return () => clearInterval(interval); }, []); useEffect(() => { const fetchAllArticles = async () => { const response = await fetch(`${API_BASE}/get_all_articles`); const data = await response.json(); setAllArticles(data); }; fetchAllArticles(); }, []); const handleStartGame = () => { setIsGameStarted(true); }; const handleResetGame = () => { setIsGameStarted(false); }; const handlePlayerChange = (value: string) => { setPlayer(value as "me" | "model"); }; const fetchAvailableModels = async () => { const response = await fetch( "https://huggingface.co/api/models?inference_provider=all&pipeline_tag=text-generation" ); const models = await response.json() const filteredModels = models.filter((m: any) => m.tags.includes('text-generation')) const modelList = filteredModels.map((m: any) => ({ id: m.id, likes: m.likes, trendingScore: m.trendingScore, author: m.id.split('/')[0], name: m.id.split('/')[1], })); console.log("got model list", modelList); setModelList(modelList); } return (
{!isGameStarted ? (
Me Model
setStartPage(value)} // searchPlaceholder="e.g. Dogs" />
setTargetPage(value)} // searchPlaceholder="e.g. Canada" />
{player === "model" && (
setMaxTokens(Number.parseInt(e.target.value)) } min={1} max={10000} />
setMaxLinks(Number.parseInt(e.target.value))} min={1} max={1000} />
)}
) : ( )}
); }