"use client"; import { useState } from "react"; import { useQuery, useMutation, useQueryClient } from "@tanstack/react-query"; import { Settings, Cpu, RefreshCw, CheckCircle, XCircle, Play } from "lucide-react"; import { settingsAPI, adminAPI } from "@/lib/api"; const LLM_PROVIDERS = [ { value: "openai", label: "OpenAI (GPT-4o)", hint: "Requires OPENAI_API_KEY in .env" }, { value: "anthropic", label: "Anthropic (Claude)", hint: "Requires ANTHROPIC_API_KEY in .env" }, { value: "gemini", label: "Google Gemini", hint: "Requires GEMINI_API_KEY in .env" }, { value: "ollama", label: "Ollama (Local)", hint: "Requires Ollama running on host" }, ]; export default function SettingsPage() { const qc = useQueryClient(); const { data: settings, isLoading } = useQuery({ queryKey: ["settings"], queryFn: () => settingsAPI.get(), }); const updateSetting = useMutation({ mutationFn: ({ key, value }: { key: string; value: string }) => settingsAPI.update(key, value), onSuccess: () => qc.invalidateQueries({ queryKey: ["settings"] }), }); const [testResult, setTestResult] = useState<{ status: string; detail?: string; summary_preview?: string; provider?: string } | null>(null); const [testing, setTesting] = useState(false); const [taskIds, setTaskIds] = useState>({}); const testLLM = async () => { setTesting(true); setTestResult(null); try { const result = await settingsAPI.testLLM(); setTestResult(result); } catch (e: unknown) { setTestResult({ status: "error", detail: e instanceof Error ? e.message : String(e) }); } finally { setTesting(false); } }; const trigger = async (name: string, fn: () => Promise<{ task_id: string }>) => { const result = await fn(); setTaskIds((prev) => ({ ...prev, [name]: result.task_id })); }; if (isLoading) return
Loading settings...
; return (

Settings

Configure LLM provider and system settings

{/* LLM Provider */}

LLM Provider

Current: {settings?.llm_provider} / {settings?.llm_model}

{LLM_PROVIDERS.map(({ value, label, hint }) => ( ))}
{testResult && (
{testResult.status === "ok" ? ( <> {testResult.provider}/{testResult.summary_preview?.slice(0, 50)}... ) : ( <> {testResult.detail} )}
)}
{/* Polling Settings */}

Data Sources

Congress.gov Poll Interval
How often to check for new bills
NewsAPI.org
100 requests/day free tier
{settings?.newsapi_enabled ? "Configured" : "Not configured"}
Google Trends
Zeitgeist scoring via pytrends
{settings?.pytrends_enabled ? "Enabled" : "Disabled"}
{/* Manual Controls */}

Manual Controls

{Object.entries(taskIds).map(([name, id]) => (

{name}: task {id} queued

))}
); }