import React, { useState } from "react"; import { AlertCircle, ExternalLink, Loader2 } from "lucide-react"; import { Button } from "@/components/ui/button"; import { Input } from "@/components/ui/input"; import { useApi } from "@/contexts/ApiContext"; import { useHfAuth } from "@/contexts/HfAuthContext"; const HfAuthBanner: React.FC = () => { const { auth, refetch } = useHfAuth(); const { baseUrl, fetchWithHeaders } = useApi(); const [token, setToken] = useState(""); const [submitting, setSubmitting] = useState(false); const [error, setError] = useState(null); if (auth.status === "authenticated" || auth.status === "loading") { return null; } const handleSave = async () => { const trimmed = token.trim(); if (!trimmed) return; setSubmitting(true); setError(null); try { const r = await fetchWithHeaders(`${baseUrl}/hf-auth/login`, { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify({ token: trimmed }), }); if (!r.ok) { const body = await r.json().catch(() => ({})); throw new Error(body.detail || `HTTP ${r.status}`); } setToken(""); await refetch(); } catch (e) { setError(e instanceof Error ? e.message : String(e)); } finally { setSubmitting(false); } }; return (

Hugging Face access required for cloud training

Create a token at{" "} huggingface.co/settings/tokens {" "}with Write access (so trained policies can upload to your account), then paste it below.

{ e.preventDefault(); handleSave(); }} className="flex gap-2" > setToken(e.target.value)} className="bg-slate-900 border-slate-600 text-white placeholder:text-slate-500" disabled={submitting} autoComplete="off" />
{error && (

{error}

)}
); }; export default HfAuthBanner;