avinash241/llm-analysis-tds-agent
LLM Analysis - Autonomous Quiz Solver Agent
  
An intelligent, autonomous agent built with LangGraph and LangChain that solves data-related quizzes involving web scraping, data processing, analysis, and visualization tasks. The system uses Google's Gemini 2.5 Flash model to orchestrate tool usage and make decisions.
๐ Table of Contents
- Overview
- Architecture
- Features
- Project Structure
- Installation
- Configuration
- Usage
- API Endpoints
- Tools & Capabilities
- Docker Deployment
- How It Works
- License
๐ Overview
This project was developed for the TDS (Tools in Data Science) course project, where the objective is to build an application that can autonomously solve multi-step quiz tasks involving:
- Data sourcing: Scraping websites, calling APIs, downloading files
- Data preparation: Cleaning text, PDFs, and various data formats
- Data analysis: Filtering, aggregating, statistical analysis, ML models
- Data visualization: Generating charts, narratives, and presentations
The system receives quiz URLs via a REST API, navigates through multiple quiz pages, solves each task using LLM-powered reasoning and specialized tools, and submits answers back to the evaluation server.
๐๏ธ Architecture
The project uses a LangGraph state machine architecture with the following components:
โโโโโโโโโโโโโโโ
โ FastAPI โ โ Receives POST requests with quiz URLs
โ Server โ
โโโโโโโโฌโโโโโโโ
โ
โผ
โโโโโโโโโโโโโโโ
โ Agent โ โ LangGraph orchestrator with Gemini 2.5 Flash
โ (LLM) โ
โโโโโโโโฌโโโโโโโ
โ
โโโโโโโโโโโโโโฌโโโโโโโโโโโโโฌโโโโโโโโโโโโโโฌโโโโโโโโโโโโโโโ
โผ โผ โผ โผ โผ
[Scraper] [Downloader] [Code Exec] [POST Req] [Add Deps]Key Components:
- FastAPI Server (
main.py): Handles incoming POST requests, validates secrets, and triggers the agent - LangGraph Agent (
agent.py): State machine that coordinates tool usage and decision-making - Tools Package (
tools/): Modular tools for different capabilities - LLM: Google Gemini 2.5 Flash with rate limiting (9 requests per minute)
โจ Features
- โ Autonomous multi-step problem solving: Chains together multiple quiz pages
- โ Dynamic JavaScript rendering: Uses Playwright for client-side rendered pages
- โ Code generation & execution: Writes and runs Python code for data tasks
- โ Flexible data handling: Downloads files, processes PDFs, CSVs, images, etc.
- โ Self-installing dependencies: Automatically adds required Python packages
- โ Robust error handling: Retries failed attempts within time limits
- โ Docker containerization: Ready for deployment on HuggingFace Spaces or cloud platforms
- โ Rate limiting: Respects API quotas with exponential backoff
๐ Project Structure
LLM-Analysis-TDS-Project-2/
โโโ agent.py # LangGraph state machine & orchestration
โโโ main.py # FastAPI server with /solve endpoint
โโโ pyproject.toml # Project dependencies & configuration
โโโ Dockerfile # Container image with Playwright
โโโ .env # Environment variables (not in repo)
โโโ tools/
โ โโโ __init__.py
โ โโโ web_scraper.py # Playwright-based HTML renderer
โ โโโ code_generate_and_run.py # Python code executor
โ โโโ download_file.py # File downloader
โ โโโ send_request.py # HTTP POST tool
โ โโโ add_dependencies.py # Package installer
โโโ README.md๐ฆ Installation
Prerequisites
- Python 3.12 or higher
- uv package manager (recommended) or pip
- Git
Step 1: Clone the Repository
git clone https://github.com/saivijayragav/LLM-Analysis-TDS-Project-2.git
cd LLM-Analysis-TDS-Project-2Step 2: Install Dependencies
Option A: Using uv (Recommended)
Ensure you have uv installed, then sync the project:
# Install uv if you haven't already
pip install uv
# Sync dependencies
uv sync
uv run playwright install chromiumStart the FastAPI server:
uv run main.pyThe server will start at ``http://0.0.0.0:7860``.
Option B: Using pip
# Create virtual environment
python -m venv venv
.\venv\Scripts\activate # Windows
# source venv/bin/activate # macOS/Linux
# Install dependencies
pip install -e .
# Install Playwright browsers
playwright install chromiumโ๏ธ Configuration
Environment Variables
Create a .env file in the project root:
# Your credentials from the Google Form submission
EMAIL=your.email@example.com
SECRET=your_secret_string
# Google Gemini API Key
GOOGLE_API_KEY=your_gemini_api_key_hereGetting a Gemini API Key
- Visit Google AI Studio
- Create a new API key
- Copy it to your
.envfile
๐ Usage
Local Development
Start the FastAPI server:
# If using uv
uv run main.py
# If using standard Python
python main.pyThe server will start on http://0.0.0.0:7860
Testing the Endpoint
Send a POST request to test your setup:
curl -X POST http://localhost:7860/solve \
-H "Content-Type: application/json" \
-d '{
"email": "your.email@example.com",
"secret": "your_secret_string",
"url": "https://tds-llm-analysis.s-anand.net/demo"
}'Expected response:
{
"status": "ok"
}The agent will run in the background and solve the quiz chain autonomously.
๐ API Endpoints
POST /solve
Receives quiz tasks and triggers the autonomous agent.
Request Body:
{
"email": "your.email@example.com",
"secret": "your_secret_string",
"url": "https://example.com/quiz-123"
}Responses:
GET /healthz
Health check endpoint for monitoring.
Response:
{
"status": "ok",
"uptime_seconds": 3600
}๐ ๏ธ Tools & Capabilities
The agent has access to the following tools:
1. Web Scraper (get_rendered_html)
- Uses Playwright to render JavaScript-heavy pages
- Waits for network idle before extracting content
- Returns fully rendered HTML for parsing
2. File Downloader (download_file)
- Downloads files (PDFs, CSVs, images, etc.) from direct URLs
- Saves files to
LLMFiles/directory - Returns the saved filename
3. Code Executor (run_code)
- Executes arbitrary Python code in an isolated subprocess
- Returns stdout, stderr, and exit code
- Useful for data processing, analysis, and visualization
4. POST Request (post_request)
- Sends JSON payloads to submission endpoints
- Includes automatic error handling and response parsing
- Prevents resubmission if answer is incorrect and time limit exceeded
5. Dependency Installer (add_dependencies)
- Dynamically installs Python packages as needed
- Uses
uv addfor fast package resolution - Enables the agent to adapt to different task requirements
๐ณ Docker Deployment
Build the Image
docker build -t llm-analysis-agent .Run the Container
docker run -p 7860:7860 \
-e EMAIL="your.email@example.com" \
-e SECRET="your_secret_string" \
-e GOOGLE_API_KEY="your_api_key" \
llm-analysis-agentDeploy to HuggingFace Spaces
- Create a new Space with Docker SDK
- Push this repository to your Space
- Add secrets in Space settings:
EMAILSECRETGOOGLE_API_KEY- The Space will automatically build and deploy
๐ง How It Works
1. Request Reception
- FastAPI receives a POST request with quiz URL
- Validates the secret against environment variables
- Returns 200 OK and starts the agent in the background
2. Agent Initialization
- LangGraph creates a state machine with two nodes:
agentandtools - The initial state contains the quiz URL as a user message
3. Task Loop
The agent follows this loop:
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ 1. LLM analyzes current state โ
โ - Reads quiz page instructions โ
โ - Plans tool usage โ
โโโโโโโโโโโโโโโโโโโฌโโโโโโโโโโโโโโโโโโโโโโโโ
โผ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ 2. Tool execution โ
โ - Scrapes page / downloads files โ
โ - Runs analysis code โ
โ - Submits answer โ
โโโโโโโโโโโโโโโโโโโฌโโโโโโโโโโโโโโโโโโโโโโโโ
โผ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ 3. Response evaluation โ
โ - Checks if answer is correct โ
โ - Extracts next quiz URL (if exists) โ
โโโโโโโโโโโโโโโโโโโฌโโโโโโโโโโโโโโโโโโโโโโโโ
โผ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ 4. Decision โ
โ - If new URL exists: Loop to step 1 โ
โ - If no URL: Return "END" โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ4. State Management
- All messages (user, assistant, tool) are stored in state
- The LLM uses full history to make informed decisions
- Recursion limit set to 200 to handle long quiz chains
5. Completion
- Agent returns "END" when no new URL is provided
- Background task completes
- Logs indicate success or failure
๐ Key Design Decisions
- LangGraph over Sequential Execution: Allows flexible routing and complex decision-making
- Background Processing: Prevents HTTP timeouts for long-running quiz chains
- Tool Modularity: Each tool is independent and can be tested/debugged separately
- Rate Limiting: Prevents API quota exhaustion (9 req/min for Gemini)
- Code Execution: Dynamically generates and runs Python for complex data tasks
- Playwright for Scraping: Handles JavaScript-rendered pages that
requestscannot - uv for Dependencies: Fast package resolution and installation
๐ License
This project is licensed under the MIT License. See the LICENSE file for details.
Author: Sai Vijay Ragav Course: Tools in Data Science (TDS) Institution: IIT Madras
For questions or issues, please open an issue on the GitHub repository.
