This is a LangGraph-based web research assistant that runs fully locally. It accepts a research topic, then enters a loop: an LLM (Ollama or LMStudio) generates a web search query, a configurable search API (DuckDuckGo, Tavily, Perplexity, or SearXNG) fetches results, the same LLM summarizes the findings and reflects on knowledge gaps to generate follow-up queries. After a configurable number of iterations, it produces a final markdown summary with deduplicated source citations. The architecture is a clean state graph with six nodes and conditional routing, all orchestrated via LangGraph's compile and run mechanism. It is deployed as a LangGraph dev server or via Docker. The codebase demonstrates solid LangGraph patterns, proper separation of concerns (configuration, state, utilities, prompts, graph definition), and a smart abstraction for switching between JSON mode and tool calling for structured LLM output. Notable craft includes the `generate_search_query_with_structured_output` helper that cleanly handles fallback and the `ChatLMStudio` adapter for LMStudio's OpenAI-compatible API.