From 70d6fa0cee320219f5bd5b01f708a3f28dd071d2 Mon Sep 17 00:00:00 2001 From: Kalyan Palla Date: Sat, 14 Feb 2026 18:02:36 -0800 Subject: [PATCH 01/16] Add CLAUDE.md documentation for Claude Code Provides comprehensive guidance on RAG architecture, development commands, and important conventions. Emphasizes using uv for all dependency management. Co-Authored-By: Claude Sonnet 4.5 --- CLAUDE.md | 205 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 205 insertions(+) create mode 100644 CLAUDE.md diff --git a/CLAUDE.md b/CLAUDE.md new file mode 100644 index 000000000..c663afc1e --- /dev/null +++ b/CLAUDE.md @@ -0,0 +1,205 @@ +# CLAUDE.md + +This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository. + +## Project Overview + +This is a Retrieval-Augmented Generation (RAG) chatbot system that answers questions about DeepLearning.AI course materials. It uses ChromaDB for vector storage, Anthropic's Claude API with tool calling, and provides a web interface for conversational queries. + +## Development Commands + +**IMPORTANT**: This project uses `uv` as the package manager. Always use `uv` to run the server and manage all dependencies. Do NOT use `pip` directly for any dependency management tasks. + +### Setup +```bash +# Install dependencies (uses uv package manager) +uv sync + +# Set up environment variables +cp .env.example .env +# Edit .env and add your ANTHROPIC_API_KEY +``` + +### Running the Application +```bash +# Quick start (recommended) +./run.sh + +# Manual start (from project root) +cd backend && uv run uvicorn app:app --reload --port 8000 + +# Access points +# - Web UI: http://localhost:8000 +# - API docs: http://localhost:8000/docs +``` + +### Adding Course Documents +Place text files in the `docs/` folder. Files are automatically loaded on server startup. See "Document Format Requirements" below. + +## Architecture + +### RAG Pipeline Flow + +The system implements a **tool-based RAG architecture** where Claude decides when to search: + +``` +User Query → FastAPI → RAGSystem → AIGenerator → Claude API + ↓ + (Claude calls tool) + ↓ + SearchTool → VectorStore → ChromaDB + ↓ + (search results returned) + ↓ + Claude synthesizes response + ↓ + SessionManager stores history + ↓ + Return answer + sources +``` + +**Key architectural decision**: Claude has search as a *callable tool*, not an always-on feature. The system prompt instructs Claude to call `search_course_content` when needed, making searches contextual rather than automatic. + +### Dual Collection Strategy + +ChromaDB uses **two separate collections** with different purposes: + +1. **`course_catalog`** (vector_store.py:51) + - Purpose: Fuzzy matching of course names for search filtering + - Documents: Course titles only + - Metadata: Full course info (instructor, links, lesson metadata) + - IDs: Course title (serves as unique identifier) + - Usage: When user specifies a course name, semantic search finds the best match + +2. **`course_content`** (vector_store.py:52) + - Purpose: Actual semantic search of course material + - Documents: Text chunks with enriched context + - Metadata: `{course_title, lesson_number, chunk_index}` + - IDs: `"{course_title_snake_case}_{chunk_index}"` + - Usage: Primary search collection for answering queries + +This separation enables fuzzy course name matching (e.g., "MCP" → "MCP: Build Rich-Context AI Apps") before searching content. + +### Component Relationships + +**rag_system.py** is the orchestration layer that: +- Coordinates all components (VectorStore, AIGenerator, SearchTool, SessionManager) +- Manages document ingestion and deduplication +- Handles query flow from input to response + +**ai_generator.py** handles Claude API interactions: +- Builds API requests with system prompt, history, and tool definitions +- Processes tool calls from Claude +- Extracts responses and sources from Claude's output +- Uses temperature=0 for deterministic responses + +**session_manager.py** maintains conversation state: +- Thread-safe session storage with dict-based in-memory storage +- Automatically trims history to last `MAX_HISTORY` exchanges (default: 2) +- Each session tracks conversation context for multi-turn queries + +### Text Chunking Strategy + +**document_processor.py:25-91** implements sentence-aware chunking: + +1. **Sentence splitting** using regex that handles abbreviations (Mr., Dr., etc.) +2. **Chunk building** up to 800 characters per chunk +3. **Overlap calculation** - 100 characters shared between consecutive chunks by counting backwards from chunk end +4. **Context enrichment** - First chunk of each lesson prefixed with `"Lesson N content: ..."`, last lesson chunks include course title + +This preserves semantic boundaries and context across chunk boundaries. + +## Document Format Requirements + +Course documents must follow this structure: + +``` +Course Title: [title] +Course Link: [url] +Course Instructor: [name] + +Lesson 0: [title] +Lesson Link: [url] +[content...] + +Lesson 1: [title] +Lesson Link: [url] +[content...] +``` + +**Processing behavior**: +- Lines 1-3: Metadata extraction with regex matching +- Remaining lines: Parsed for `^Lesson\s+(\d+):\s*(.+)$` markers +- Content between lesson markers becomes lesson content +- Lesson links (optional) must appear immediately after lesson headers +- If no lesson markers found, entire file treated as single document + +## Configuration + +All configuration in **backend/config.py** as a dataclass: + +- `CHUNK_SIZE`: 800 characters (sentence-aware, not hard cutoff) +- `CHUNK_OVERLAP`: 100 characters between chunks +- `MAX_RESULTS`: 5 search results per query +- `MAX_HISTORY`: 2 conversation exchanges retained +- `EMBEDDING_MODEL`: "all-MiniLM-L6-v2" (384-dimensional embeddings) +- `ANTHROPIC_MODEL`: "claude-sonnet-4-20250514" +- `CHROMA_PATH`: "./chroma_db" (persistent vector storage) + +## Important Patterns + +### Document Deduplication +**rag_system.py:76** checks existing course titles before processing. If a course with the same title already exists in the vector store, it's skipped. To reload a course, clear the vector store first. + +### Tool Definition +**search_tools.py** defines the `search_course_content` tool with three parameters: +- `query` (required): What to search for +- `course_name` (optional): Fuzzy-matched against course_catalog +- `lesson_number` (optional): Filter to specific lesson + +The system prompt instructs Claude to use this tool strategically, not for every query. + +### Search Filtering +**vector_store.py:118-133** builds ChromaDB filters: +- Both course + lesson: `{"$and": [{"course_title": "..."}, {"lesson_number": N}]}` +- Course only: `{"course_title": "..."}` +- Lesson only: `{"lesson_number": N}` +- Neither: No filter (search all content) + +### Session Management +Sessions are created implicitly if no `session_id` is provided. Frontend passes `session_id` back to maintain conversation context. Sessions are stored in-memory (lost on restart). + +## Key Files + +- **app.py**: FastAPI application, startup document loading, API endpoints +- **rag_system.py**: Main orchestration, coordinates all components +- **vector_store.py**: ChromaDB wrapper, dual collection management, search logic +- **ai_generator.py**: Claude API integration, tool call handling +- **document_processor.py**: Metadata extraction, chunking algorithm +- **search_tools.py**: Tool definitions for Claude function calling +- **session_manager.py**: Conversation history management +- **config.py**: Centralized configuration +- **models.py**: Pydantic data models (Course, Lesson, CourseChunk) + +## Frontend + +Vanilla JavaScript application (frontend/) with no framework dependencies: +- **index.html**: Chat UI structure +- **script.js**: API communication, message handling +- **style.css**: Responsive styling + +Frontend communicates with backend via `/api/query` POST endpoint, receives responses with `{answer, sources, session_id}`. + +## Extending the System + +### Adding New Course Sources +Place files in `docs/` folder matching the required format. Supported extensions: `.txt`, `.pdf`, `.docx`. Server automatically loads on startup. + +### Modifying Chunking Behavior +Edit `CHUNK_SIZE` and `CHUNK_OVERLAP` in config.py. Larger chunks provide more context but reduce granularity. More overlap improves context preservation but increases storage. + +### Changing Search Results +Modify `MAX_RESULTS` in config.py to return more/fewer chunks per search. More results give Claude more context but increase token usage. + +### Adjusting Conversation Memory +Change `MAX_HISTORY` in config.py. Higher values retain more context but increase token costs. Each exchange = 2 messages (user + assistant). From f3a88607157e6aa87c715dd3ecf905c37c46e772 Mon Sep 17 00:00:00 2001 From: Kalyan Palla Date: Sat, 14 Feb 2026 18:41:08 -0800 Subject: [PATCH 02/16] Add clickable source citations with lesson links Transform source citations from plain text to clickable links that open lesson videos in new tabs. Links are embedded invisibly - users see only "Course Title - Lesson X" as clickable blue text. Backend changes: - Modified search_tools.py to retrieve lesson links from vector store - Changed sources from List[str] to List[Dict] with text and optional link - Updated QueryResponse model to accept Union[str, Dict] for compatibility Frontend changes: - Enhanced script.js to render tags with target="_blank" - Added source-link CSS styling with hover and focus states - Maintained backward compatibility for string sources Gracefully handles missing links by displaying as plain text. Co-Authored-By: Claude Sonnet 4.5 --- backend/app.py | 4 ++-- backend/search_tools.py | 36 +++++++++++++++++++++++++----------- frontend/script.js | 20 +++++++++++++++++++- frontend/style.css | 23 +++++++++++++++++++++++ 4 files changed, 69 insertions(+), 14 deletions(-) diff --git a/backend/app.py b/backend/app.py index 5a69d741d..78c6e8a1b 100644 --- a/backend/app.py +++ b/backend/app.py @@ -6,7 +6,7 @@ from fastapi.staticfiles import StaticFiles from fastapi.middleware.trustedhost import TrustedHostMiddleware from pydantic import BaseModel -from typing import List, Optional +from typing import List, Optional, Dict, Union import os from config import config @@ -43,7 +43,7 @@ class QueryRequest(BaseModel): class QueryResponse(BaseModel): """Response model for course queries""" answer: str - sources: List[str] + sources: List[Union[str, Dict[str, str]]] # Support both strings and dicts session_id: str class CourseStats(BaseModel): diff --git a/backend/search_tools.py b/backend/search_tools.py index adfe82352..768c4cebc 100644 --- a/backend/search_tools.py +++ b/backend/search_tools.py @@ -88,29 +88,43 @@ def execute(self, query: str, course_name: Optional[str] = None, lesson_number: def _format_results(self, results: SearchResults) -> str: """Format search results with course and lesson context""" formatted = [] - sources = [] # Track sources for the UI - + sources = [] # Track sources for the UI (now as dictionaries) + for doc, meta in zip(results.documents, results.metadata): course_title = meta.get('course_title', 'unknown') lesson_num = meta.get('lesson_number') - + # Build context header header = f"[{course_title}" if lesson_num is not None: header += f" - Lesson {lesson_num}" header += "]" - - # Track source for the UI - source = course_title + + # Track source for the UI - now as a dictionary + source_text = course_title if lesson_num is not None: - source += f" - Lesson {lesson_num}" - sources.append(source) - + source_text += f" - Lesson {lesson_num}" + + # Create source dictionary with text and optional link + source_dict = {"text": source_text} + + # Try to get lesson link if lesson number exists + if lesson_num is not None: + lesson_link = self.store.get_lesson_link(course_title, lesson_num) + if lesson_link: + source_dict["link"] = lesson_link + else: + # Try to get course link if no lesson number + course_link = self.store.get_course_link(course_title) + if course_link: + source_dict["link"] = course_link + + sources.append(source_dict) formatted.append(f"{header}\n{doc}") - + # Store sources for retrieval self.last_sources = sources - + return "\n\n".join(formatted) class ToolManager: diff --git a/frontend/script.js b/frontend/script.js index 562a8a363..839cca125 100644 --- a/frontend/script.js +++ b/frontend/script.js @@ -122,10 +122,28 @@ function addMessage(content, type, sources = null, isWelcome = false) { let html = `
${displayContent}
`; if (sources && sources.length > 0) { + // Format sources - handle both string and object formats + const formattedSources = sources.map(source => { + // Handle legacy string format (backward compatibility) + if (typeof source === 'string') { + return escapeHtml(source); + } + // Handle new object format with optional link + if (typeof source === 'object' && source.text) { + const text = escapeHtml(source.text); + if (source.link) { + // Create clickable link that opens in new tab + return `
${text}`; + } + return text; + } + return ''; + }).filter(s => s); // Remove empty strings + html += `
Sources -
${sources.join(', ')}
+
${formattedSources.join(', ')}
`; } diff --git a/frontend/style.css b/frontend/style.css index 825d03675..3c9854a08 100644 --- a/frontend/style.css +++ b/frontend/style.css @@ -245,6 +245,29 @@ header h1 { color: var(--text-secondary); } +/* Source link styling */ +.sources-content .source-link { + color: var(--primary-color); + text-decoration: none; + transition: all 0.2s ease; + border-bottom: 1px solid transparent; +} + +.sources-content .source-link:hover { + color: var(--primary-hover); + border-bottom-color: var(--primary-color); +} + +.sources-content .source-link:focus { + outline: 2px solid var(--primary-color); + outline-offset: 2px; + border-radius: 2px; +} + +.sources-content .source-link:visited { + color: #8b5cf6; /* Purple tint for visited links */ +} + /* Markdown formatting styles */ .message-content h1, .message-content h2, From ab0b58a9d6aedaede689f3fb954bcad15f55ed73 Mon Sep 17 00:00:00 2001 From: Kalyan Palla Date: Sat, 14 Feb 2026 21:46:34 -0800 Subject: [PATCH 03/16] Add '+ NEW CHAT' button to clear conversations Add a new chat button to the sidebar that allows users to clear the current conversation and start fresh without page reload. The button is positioned above the Courses section and matches the styling of existing sidebar elements. Changes: - Add NEW CHAT button to sidebar with matching uppercase styling - Implement session cleanup on both frontend and backend - Add /api/session/clear endpoint for proper memory management - Auto-focus input field after clearing for better UX - Clear chat messages and reset session state when clicked Co-Authored-By: Claude Sonnet 4.5 --- backend/app.py | 13 ++++++++ frontend/index.html | 8 +++++ frontend/script.js | 43 ++++++++++++++++++++++++++ frontend/style.css | 75 ++++++++++++++++++++++++++++++++++++++++++--- 4 files changed, 135 insertions(+), 4 deletions(-) diff --git a/backend/app.py b/backend/app.py index 78c6e8a1b..aa7fbd84a 100644 --- a/backend/app.py +++ b/backend/app.py @@ -51,6 +51,10 @@ class CourseStats(BaseModel): total_courses: int course_titles: List[str] +class ClearSessionRequest(BaseModel): + """Request model for clearing a session""" + session_id: str + # API Endpoints @app.post("/api/query", response_model=QueryResponse) @@ -85,6 +89,15 @@ async def get_course_stats(): except Exception as e: raise HTTPException(status_code=500, detail=str(e)) +@app.post("/api/session/clear") +async def clear_session(request: ClearSessionRequest): + """Clear a conversation session""" + try: + rag_system.session_manager.clear_session(request.session_id) + return {"status": "success", "message": f"Session {request.session_id} cleared"} + except Exception as e: + raise HTTPException(status_code=500, detail=str(e)) + @app.on_event("startup") async def startup_event(): """Load initial documents on startup""" diff --git a/frontend/index.html b/frontend/index.html index f8e25a62f..1262761d1 100644 --- a/frontend/index.html +++ b/frontend/index.html @@ -19,6 +19,14 @@

Course Materials Assistant

+ +
+ +
+
diff --git a/frontend/script.js b/frontend/script.js index 839cca125..e49f1cfe4 100644 --- a/frontend/script.js +++ b/frontend/script.js @@ -38,6 +38,14 @@ function setupEventListeners() { sendMessage(); }); }); + + // New chat button + const newChatButton = document.getElementById('newChatButton'); + if (newChatButton) { + newChatButton.addEventListener('click', () => { + createNewSession(); + }); + } } @@ -165,9 +173,44 @@ function escapeHtml(text) { // Removed removeMessage function - no longer needed since we handle loading differently async function createNewSession() { + // Store old session ID for potential backend cleanup + const oldSessionId = currentSessionId; + + // Reset session state currentSessionId = null; + + // Clear UI chatMessages.innerHTML = ''; + + // Add welcome message addMessage('Welcome to the Course Materials Assistant! I can help you with questions about courses, lessons and specific content. What would you like to know?', 'assistant', null, true); + + // Focus input for immediate use + if (chatInput) { + chatInput.focus(); + } + + // Clear backend session if one existed + if (oldSessionId) { + clearBackendSession(oldSessionId); + } +} + +async function clearBackendSession(sessionId) { + if (!sessionId) return; + + try { + await fetch(`${API_URL}/session/clear`, { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + body: JSON.stringify({ session_id: sessionId }) + }); + } catch (error) { + // Silent fail - session will be garbage collected eventually + console.warn('Failed to clear backend session:', error); + } } // Load course statistics diff --git a/frontend/style.css b/frontend/style.css index 3c9854a08..069dbdde4 100644 --- a/frontend/style.css +++ b/frontend/style.css @@ -250,22 +250,43 @@ header h1 { color: var(--primary-color); text-decoration: none; transition: all 0.2s ease; - border-bottom: 1px solid transparent; + padding: 0.25rem 0.5rem; + border-radius: 4px; + background: rgba(59, 130, 246, 0.08); + border: 1px solid rgba(59, 130, 246, 0.2); + display: inline-block; + margin: 0.15rem 0.2rem; + font-weight: 500; } .sources-content .source-link:hover { - color: var(--primary-hover); - border-bottom-color: var(--primary-color); + color: #ffffff; + background: var(--primary-color); + border-color: var(--primary-color); + transform: translateY(-1px); + box-shadow: 0 2px 8px rgba(59, 130, 246, 0.3); } .sources-content .source-link:focus { outline: 2px solid var(--primary-color); outline-offset: 2px; - border-radius: 2px; + border-radius: 4px; } .sources-content .source-link:visited { color: #8b5cf6; /* Purple tint for visited links */ + background: rgba(139, 92, 246, 0.08); + border-color: rgba(139, 92, 246, 0.2); +} + +.sources-content .source-link:visited:hover { + color: #ffffff; + background: #8b5cf6; + border-color: #8b5cf6; +} + +.sources-content .source-link:active { + transform: translateY(0); } /* Markdown formatting styles */ @@ -624,6 +645,52 @@ details[open] .suggested-header::before { text-transform: none; } +/* New Chat Button */ +.new-chat-button { + width: 100%; + padding: 0.75rem 1rem; + background: var(--background); + border: 1px solid var(--border-color); + border-radius: 8px; + color: var(--text-secondary); + font-size: 0.875rem; + font-weight: 600; + cursor: pointer; + transition: all 0.2s ease; + text-align: left; + display: flex; + align-items: center; + gap: 0.5rem; + text-transform: uppercase; + letter-spacing: 0.5px; +} + +.new-chat-icon { + font-size: 1.25rem; + font-weight: 700; + color: var(--primary-color); +} + +.new-chat-text { + flex: 1; +} + +.new-chat-button:hover { + background: var(--surface-hover); + border-color: var(--primary-color); + color: var(--primary-color); + transform: translateX(2px); +} + +.new-chat-button:focus { + outline: none; + box-shadow: 0 0 0 3px var(--focus-ring); +} + +.new-chat-button:active { + transform: translateX(0); +} + /* Suggested Questions in Sidebar */ .suggested-items { display: flex; From 4cb524a50962695d6cab690f9f61b5c3c8918a80 Mon Sep 17 00:00:00 2001 From: Kalyan Palla Date: Sat, 14 Feb 2026 23:11:21 -0800 Subject: [PATCH 04/16] Add course outline tool with structured formatting - Added get_course_outline() method to VectorStore for retrieving complete course structures - Created CourseOutlineTool with bullet-point formatted output - Registered outline tool alongside search tool in RAGSystem - Updated AI system prompt to return outline results without synthesis Co-Authored-By: Claude Sonnet 4.5 --- backend/ai_generator.py | 30 ++++++++++++------- backend/rag_system.py | 4 ++- backend/search_tools.py | 66 ++++++++++++++++++++++++++++++++++++++++- backend/vector_store.py | 38 +++++++++++++++++++++++- 4 files changed, 124 insertions(+), 14 deletions(-) diff --git a/backend/ai_generator.py b/backend/ai_generator.py index 0363ca90c..35a2bddb7 100644 --- a/backend/ai_generator.py +++ b/backend/ai_generator.py @@ -5,21 +5,29 @@ class AIGenerator: """Handles interactions with Anthropic's Claude API for generating responses""" # Static system prompt to avoid rebuilding on each call - SYSTEM_PROMPT = """ You are an AI assistant specialized in course materials and educational content with access to a comprehensive search tool for course information. + SYSTEM_PROMPT = """ You are an AI assistant specialized in course materials and educational content with access to comprehensive tools for course information. -Search Tool Usage: -- Use the search tool **only** for questions about specific course content or detailed educational materials -- **One search per query maximum** -- Synthesize search results into accurate, fact-based responses -- If search yields no results, state this clearly without offering alternatives +Tool Usage: +- You have two tools available: + 1. search_course_content: Search within course materials for specific content + 2. get_course_outline: Get complete course outline with all lessons +- Use search_course_content for questions about specific topics or content +- Use get_course_outline for questions about course structure, lesson lists, or "what's in this course" +- **One tool call per query maximum** +- If a tool yields no results, state this clearly without offering alternatives Response Protocol: -- **General knowledge questions**: Answer using existing knowledge without searching -- **Course-specific questions**: Search first, then answer +- **General knowledge questions**: Answer using existing knowledge without tools +- **Course outline questions**: + - Use get_course_outline to retrieve lesson lists + - Return the tool output EXACTLY as formatted - do not add summaries, context, or additional information + - Present the complete structured list without modification +- **Course-specific content questions**: + - Use search_course_content first + - Synthesize search results into accurate, fact-based responses - **No meta-commentary**: - - Provide direct answers only — no reasoning process, search explanations, or question-type analysis - - Do not mention "based on the search results" - + - Provide direct answers only — no reasoning process, tool explanations, or question-type analysis + - Do not mention "based on the tool results" All responses must be: 1. **Brief, Concise and focused** - Get to the point quickly diff --git a/backend/rag_system.py b/backend/rag_system.py index 50d848c8e..1a79eb748 100644 --- a/backend/rag_system.py +++ b/backend/rag_system.py @@ -4,7 +4,7 @@ from vector_store import VectorStore from ai_generator import AIGenerator from session_manager import SessionManager -from search_tools import ToolManager, CourseSearchTool +from search_tools import ToolManager, CourseSearchTool, CourseOutlineTool from models import Course, Lesson, CourseChunk class RAGSystem: @@ -22,7 +22,9 @@ def __init__(self, config): # Initialize search tools self.tool_manager = ToolManager() self.search_tool = CourseSearchTool(self.vector_store) + self.outline_tool = CourseOutlineTool(self.vector_store) self.tool_manager.register_tool(self.search_tool) + self.tool_manager.register_tool(self.outline_tool) def add_course_document(self, file_path: str) -> Tuple[Course, int]: """ diff --git a/backend/search_tools.py b/backend/search_tools.py index 768c4cebc..919f2a486 100644 --- a/backend/search_tools.py +++ b/backend/search_tools.py @@ -141,7 +141,71 @@ def register_tool(self, tool: Tool): raise ValueError("Tool must have a 'name' in its definition") self.tools[tool_name] = tool - + +class CourseOutlineTool(Tool): + """Tool for retrieving complete course outlines and lesson lists""" + + def __init__(self, vector_store: VectorStore): + self.store = vector_store + self.last_sources = [] # Track sources for consistency + + def get_tool_definition(self) -> Dict[str, Any]: + """Return Anthropic tool definition for this tool""" + return { + "name": "get_course_outline", + "description": "Get the complete outline of a course including title, link, and all lessons with their numbers and titles", + "input_schema": { + "type": "object", + "properties": { + "course_title": { + "type": "string", + "description": "Course title or partial name (e.g., 'MCP', 'Introduction to AI')" + } + }, + "required": ["course_title"] + } + } + + def execute(self, course_title: str) -> str: + """ + Execute the outline retrieval tool. + + Args: + course_title: Course name to get outline for + + Returns: + Formatted course outline or error message + """ + outline = self.store.get_course_outline(course_title) + + if not outline: + return f"No course found matching '{course_title}'" + + # Store source for the UI + self.last_sources = [{ + "text": outline["course_title"], + "link": outline["course_link"] + }] + + return self._format_outline(outline) + + def _format_outline(self, outline: Dict[str, Any]) -> str: + """Format course outline for Claude""" + formatted = [ + outline['course_title'], + f"Course Link: {outline['course_link']}", + "", + "Course Outline:" + ] + + for lesson in outline['lessons']: + lesson_num = lesson['lesson_number'] + lesson_title = lesson['lesson_title'] + formatted.append(f"• Lesson {lesson_num}: {lesson_title}") + + return "\n".join(formatted) + + def get_tool_definitions(self) -> list: """Get all tool definitions for Anthropic tool calling""" return [tool.get_tool_definition() for tool in self.tools.values()] diff --git a/backend/vector_store.py b/backend/vector_store.py index 390abe71c..3fe1e3089 100644 --- a/backend/vector_store.py +++ b/backend/vector_store.py @@ -264,4 +264,40 @@ def get_lesson_link(self, course_title: str, lesson_number: int) -> Optional[str return None except Exception as e: print(f"Error getting lesson link: {e}") - \ No newline at end of file + return None + + def get_course_outline(self, course_name: str) -> Optional[Dict[str, Any]]: + """ + Get the complete outline of a course including all lessons. + + Args: + course_name: Course name or partial name (fuzzy matching supported) + + Returns: + Dictionary with course_title, course_link, and lessons list, or None if not found + """ + import json + + # Resolve course name using fuzzy matching + course_title = self._resolve_course_name(course_name) + if not course_title: + return None + + try: + # Get course metadata by ID (title is the ID) + results = self.course_catalog.get(ids=[course_title]) + if results and 'metadatas' in results and results['metadatas']: + metadata = results['metadatas'][0] + lessons_json = metadata.get('lessons_json') + + if lessons_json: + lessons = json.loads(lessons_json) + return { + "course_title": metadata.get('title'), + "course_link": metadata.get('course_link'), + "lessons": lessons + } + return None + except Exception as e: + print(f"Error getting course outline: {e}") + return None From c329f21bf1c1a3b92769eb4c632c8694b62f5277 Mon Sep 17 00:00:00 2001 From: Kalyan Palla Date: Sun, 15 Feb 2026 20:36:11 -0800 Subject: [PATCH 05/16] outline updated --- CLAUDE.md | 4 +- Outline-not_what_I_want.png | Bin 0 -> 58423 bytes Screenshot.png | Bin 0 -> 164010 bytes backend/ai_generator.py | 207 ++++++++++++++++++++++-------------- backend/app.py | 4 +- backend/rag_system.py | 32 +++--- backend/search_tools.py | 113 ++++++++++++++++---- backend/vector_store.py | 1 - frontend/index.html | 2 +- frontend/style.css | 20 ++-- 10 files changed, 252 insertions(+), 131 deletions(-) create mode 100644 Outline-not_what_I_want.png create mode 100644 Screenshot.png diff --git a/CLAUDE.md b/CLAUDE.md index c663afc1e..7162cce15 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -8,8 +8,6 @@ This is a Retrieval-Augmented Generation (RAG) chatbot system that answers quest ## Development Commands -**IMPORTANT**: This project uses `uv` as the package manager. Always use `uv` to run the server and manage all dependencies. Do NOT use `pip` directly for any dependency management tasks. - ### Setup ```bash # Install dependencies (uses uv package manager) @@ -198,7 +196,7 @@ Place files in `docs/` folder matching the required format. Supported extensions ### Modifying Chunking Behavior Edit `CHUNK_SIZE` and `CHUNK_OVERLAP` in config.py. Larger chunks provide more context but reduce granularity. More overlap improves context preservation but increases storage. -### Changing Search Results +### Changing Search Results1 Modify `MAX_RESULTS` in config.py to return more/fewer chunks per search. More results give Claude more context but increase token usage. ### Adjusting Conversation Memory diff --git a/Outline-not_what_I_want.png b/Outline-not_what_I_want.png new file mode 100644 index 0000000000000000000000000000000000000000..ba55b1946177083c00b2d59308d1e2a75eb9f791 GIT binary patch literal 58423 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 literal 0 HcmV?d00001 diff --git a/Screenshot.png b/Screenshot.png new file mode 100644 index 0000000000000000000000000000000000000000..ac897c8ba2e8170863b8d9a836f9b394bbef8abe GIT binary patch literal 164010 zcmbrlWmFtN*DZ`|a0~7hEChEL+yjK*5FCO9cL)~TT?c{%2<{#{IKkaD*x&;UGvDNS z?)$Fq{=PqE&Fbpu>gwsLQ~T__PxN~YMI0;&ECd7u9AzarZ3G0Q3LK&Vf|hM1$mk1@X}8Mq@L;12xzAda~FutGq9l`6~0 zeDEgC5D?~4EtSR`*gWQAWo@4FccW|UUJE|XJv;#i5X=-&XW|8o-ltA43)YXhZ6 zp`j{Rt?x({HhWS=#G%xO{hI&j08CcLNm&i!J1F-i<}9@i!MA%uG5)XT|J)*&c&&xS z>?v`F8dY^1i?EbI?|*L%8Ni??*rk^L`LARB#MO^b+s|$s|Gf;01j_tIFynuEfp-VN ztHAjG9dDAn3H{$O0wTO4Vm=xCpC|h9e#fMULH~d6^T9{&$NzolrfpwCmv=JFLv}#0 z>JrRg__>i8*5YyQay8wSKanAXL{c1-qkcRNat zdU`!wRMj-fA96=8g?cB2Zd`V|d(#y!J-R2hI$=@=mk})?V*mpZV^l z!#%}ezujR`x!#%eY44av!ne=ujlFdK4H`xXsp7itm7W1B^R8BWCh*`hWNZR_uMY

x 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
gp7K&vpd)Io(W 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 *2K9AV=Ex8(2R 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 literal 0 HcmV?d00001 diff --git a/backend/ai_generator.py b/backend/ai_generator.py index 0363ca90c..f94d149f1 100644 --- a/backend/ai_generator.py +++ b/backend/ai_generator.py @@ -1,25 +1,39 @@ +from typing import Any, Dict, List, Optional + import anthropic -from typing import List, Optional, Dict, Any + class AIGenerator: """Handles interactions with Anthropic's Claude API for generating responses""" - + # Static system prompt to avoid rebuilding on each call - SYSTEM_PROMPT = """ You are an AI assistant specialized in course materials and educational content with access to a comprehensive search tool for course information. + SYSTEM_PROMPT = """ You are an AI assistant specialized in course materials and educational content with access to search tools for course information. + +Available Tools: +- **Content Search Tool**: Use for questions about specific course content or detailed educational materials +- **Course Outline Tool**: Use for questions about course structure, lesson lists, or course overviews + +Tool Usage Guidelines: +- Use content search for detailed questions about specific topics or lessons +- Use course outline tool for questions about course structure, lesson titles, or complete course overviews +- **You can make up to 2 rounds of tool calls to gather comprehensive information** +- Use multiple rounds for complex queries that require information gathering then refinement +- Synthesize tool results into accurate, fact-based responses +- If tools yield no results, state this clearly without offering alternatives -Search Tool Usage: -- Use the search tool **only** for questions about specific course content or detailed educational materials -- **One search per query maximum** -- Synthesize search results into accurate, fact-based responses -- If search yields no results, state this clearly without offering alternatives +Course Outline Responses: +When using the course outline tool, always include: +- Course title +- Course link (if available) +- Complete lesson list with lesson numbers and titles +- Present information in a clear, structured format Response Protocol: - **General knowledge questions**: Answer using existing knowledge without searching -- **Course-specific questions**: Search first, then answer +- **Course-specific questions**: Use appropriate tool first, then answer - **No meta-commentary**: - Provide direct answers only — no reasoning process, search explanations, or question-type analysis - - Do not mention "based on the search results" - + - Do not mention "based on the search results" or "using the tool" All responses must be: 1. **Brief, Concise and focused** - Get to the point quickly @@ -28,108 +42,141 @@ class AIGenerator: 4. **Example-supported** - Include relevant examples when they aid understanding Provide only the direct answer to what was asked. """ - + def __init__(self, api_key: str, model: str): self.client = anthropic.Anthropic(api_key=api_key) self.model = model - + # Pre-build base API parameters - self.base_params = { - "model": self.model, - "temperature": 0, - "max_tokens": 800 - } - - def generate_response(self, query: str, - conversation_history: Optional[str] = None, - tools: Optional[List] = None, - tool_manager=None) -> str: + self.base_params = {"model": self.model, "temperature": 0, "max_tokens": 800} + + def generate_response( + self, + query: str, + conversation_history: Optional[str] = None, + tools: Optional[List] = None, + tool_manager=None, + ) -> str: """ Generate AI response with optional tool usage and conversation context. - + Supports up to 2 sequential rounds of tool calling. + Args: query: The user's question or request conversation_history: Previous messages for context tools: Available tools the AI can use tool_manager: Manager to execute tools - + Returns: Generated response as string """ - + # Build system content efficiently - avoid string ops when possible system_content = ( f"{self.SYSTEM_PROMPT}\n\nPrevious conversation:\n{conversation_history}" - if conversation_history + if conversation_history else self.SYSTEM_PROMPT ) - - # Prepare API call parameters efficiently - api_params = { + + # Start with initial messages + messages = [{"role": "user", "content": query}] + + # Execute up to 2 rounds of tool calling + for round_num in range(2): + # Prepare API call parameters + api_params = { + **self.base_params, + "messages": messages, + "system": system_content, + } + + # Add tools if available + if tools: + api_params["tools"] = tools + api_params["tool_choice"] = {"type": "auto"} + + # Get response from Claude + response = self.client.messages.create(**api_params) + + # Handle tool execution if needed + if response.stop_reason == "tool_use" and tool_manager: + messages, should_continue, direct_result = self._handle_tool_execution( + response, messages, tool_manager + ) + if direct_result is not None: + return direct_result + if not should_continue: + break + else: + # No tool use, return direct response + return response.content[0].text + + # After max rounds, make final call without tools to get response + final_params = { **self.base_params, - "messages": [{"role": "user", "content": query}], - "system": system_content + "messages": messages, + "system": system_content, } - - # Add tools if available - if tools: - api_params["tools"] = tools - api_params["tool_choice"] = {"type": "auto"} - - # Get response from Claude - response = self.client.messages.create(**api_params) - - # Handle tool execution if needed - if response.stop_reason == "tool_use" and tool_manager: - return self._handle_tool_execution(response, api_params, tool_manager) - - # Return direct response - return response.content[0].text - - def _handle_tool_execution(self, initial_response, base_params: Dict[str, Any], tool_manager): + + final_response = self.client.messages.create(**final_params) + return final_response.content[0].text + + def _handle_tool_execution(self, initial_response, messages: List, tool_manager): """ - Handle execution of tool calls and get follow-up response. - + Handle execution of tool calls and update message history. + Args: initial_response: The response containing tool use requests - base_params: Base API parameters + messages: Current message history tool_manager: Manager to execute tools - + Returns: - Final response text after tool execution + Tuple of (updated_messages, should_continue, direct_result) + direct_result is non-None when the tool output should be returned as-is """ - # Start with existing messages - messages = base_params["messages"].copy() - # Add AI's tool use response messages.append({"role": "assistant", "content": initial_response.content}) - + # Execute all tool calls and collect results tool_results = [] for content_block in initial_response.content: if content_block.type == "tool_use": - tool_result = tool_manager.execute_tool( - content_block.name, - **content_block.input - ) - - tool_results.append({ - "type": "tool_result", - "tool_use_id": content_block.id, - "content": tool_result - }) - + try: + tool_result = tool_manager.execute_tool( + content_block.name, **content_block.input + ) + + tool_results.append( + { + "type": "tool_result", + "tool_use_id": content_block.id, + "content": tool_result, + } + ) + + # Return outline tool results directly to avoid summarization + if content_block.name == "get_course_outline": + if tool_results: + messages.append({"role": "user", "content": tool_results}) + return messages, False, tool_result + + except Exception as e: + # Tool execution failed, stop rounds + tool_results.append( + { + "type": "tool_result", + "tool_use_id": content_block.id, + "content": f"Error: Tool execution failed - {str(e)}", + } + ) + # Add tool results and signal to stop + if tool_results: + messages.append({"role": "user", "content": tool_results}) + return messages, False, None + # Add tool results as single message if tool_results: messages.append({"role": "user", "content": tool_results}) - - # Prepare final API call without tools - final_params = { - **self.base_params, - "messages": messages, - "system": base_params["system"] - } - - # Get final response - final_response = self.client.messages.create(**final_params) - return final_response.content[0].text \ No newline at end of file + + # Continue with next round + return messages, True, None diff --git a/backend/app.py b/backend/app.py index aa7fbd84a..4644c971b 100644 --- a/backend/app.py +++ b/backend/app.py @@ -67,7 +67,7 @@ async def query_documents(request: QueryRequest): session_id = rag_system.session_manager.create_session() # Process query using RAG system - answer, sources = rag_system.query(request.query, session_id) + answer, sources, source_links = rag_system.query(request.query, session_id) return QueryResponse( answer=answer, @@ -129,4 +129,4 @@ async def get_response(self, path: str, scope): # Serve static files for the frontend -app.mount("/", StaticFiles(directory="../frontend", html=True), name="static") \ No newline at end of file +app.mount("/", DevStaticFiles(directory="../frontend", html=True), name="static") \ No newline at end of file diff --git a/backend/rag_system.py b/backend/rag_system.py index 50d848c8e..0ef933c88 100644 --- a/backend/rag_system.py +++ b/backend/rag_system.py @@ -1,10 +1,11 @@ from typing import List, Tuple, Optional, Dict import os +import re from document_processor import DocumentProcessor from vector_store import VectorStore from ai_generator import AIGenerator from session_manager import SessionManager -from search_tools import ToolManager, CourseSearchTool +from search_tools import ToolManager, CourseSearchTool, CourseOutlineTool from models import Course, Lesson, CourseChunk class RAGSystem: @@ -22,7 +23,9 @@ def __init__(self, config): # Initialize search tools self.tool_manager = ToolManager() self.search_tool = CourseSearchTool(self.vector_store) + self.outline_tool = CourseOutlineTool(self.vector_store) self.tool_manager.register_tool(self.search_tool) + self.tool_manager.register_tool(self.outline_tool) def add_course_document(self, file_path: str) -> Tuple[Course, int]: """ @@ -106,42 +109,43 @@ def query(self, query: str, session_id: Optional[str] = None) -> Tuple[str, List Args: query: User's question session_id: Optional session ID for conversation context - + Returns: - Tuple of (response, sources list - empty for tool-based approach) + Tuple of (response, sources list, source_links list) """ # Create prompt for the AI with clear instructions prompt = f"""Answer this question about course materials: {query}""" - + # Get conversation history if session exists history = None if session_id: history = self.session_manager.get_conversation_history(session_id) - + # Generate response using AI with tools response = self.ai_generator.generate_response( query=prompt, conversation_history=history, tools=self.tool_manager.get_tool_definitions(), - tool_manager=self.tool_manager + tool_manager=self.tool_manager, ) - - # Get sources from the search tool + + # Get sources and source links from the search tool sources = self.tool_manager.get_last_sources() + source_links = self.tool_manager.get_last_source_links() # Reset sources after retrieving them self.tool_manager.reset_sources() - + # Update conversation history if session_id: self.session_manager.add_exchange(session_id, query, response) - - # Return response with sources from tool searches - return response, sources - + + # Return response with sources and links from tool searches + return response, sources, source_links + def get_course_analytics(self) -> Dict: """Get analytics about the course catalog""" return { "total_courses": self.vector_store.get_course_count(), - "course_titles": self.vector_store.get_existing_course_titles() + "course_titles": self.vector_store.get_existing_course_titles(), } \ No newline at end of file diff --git a/backend/search_tools.py b/backend/search_tools.py index 768c4cebc..ac22df856 100644 --- a/backend/search_tools.py +++ b/backend/search_tools.py @@ -88,7 +88,8 @@ def execute(self, query: str, course_name: Optional[str] = None, lesson_number: def _format_results(self, results: SearchResults) -> str: """Format search results with course and lesson context""" formatted = [] - sources = [] # Track sources for the UI (now as dictionaries) + sources = [] # Track sources for the UI + source_links = [] # Track lesson links for the UI for doc, meta in zip(results.documents, results.metadata): course_title = meta.get('course_title', 'unknown') @@ -100,33 +101,99 @@ def _format_results(self, results: SearchResults) -> str: header += f" - Lesson {lesson_num}" header += "]" - # Track source for the UI - now as a dictionary - source_text = course_title + # Track source for the UI + source = course_title if lesson_num is not None: - source_text += f" - Lesson {lesson_num}" + source += f" - Lesson {lesson_num}" + sources.append(source) - # Create source dictionary with text and optional link - source_dict = {"text": source_text} - - # Try to get lesson link if lesson number exists + # Get lesson link if available + lesson_link = None if lesson_num is not None: lesson_link = self.store.get_lesson_link(course_title, lesson_num) - if lesson_link: - source_dict["link"] = lesson_link - else: - # Try to get course link if no lesson number - course_link = self.store.get_course_link(course_title) - if course_link: - source_dict["link"] = course_link - - sources.append(source_dict) + source_links.append(lesson_link) + formatted.append(f"{header}\n{doc}") # Store sources for retrieval self.last_sources = sources + self.last_source_links = source_links return "\n\n".join(formatted) + +class CourseOutlineTool(Tool): + """Tool for retrieving complete course outlines and lesson lists""" + + def __init__(self, vector_store: VectorStore): + self.store = vector_store + + def get_tool_definition(self) -> Dict[str, Any]: + """Return Anthropic tool definition for this tool""" + return { + "name": "get_course_outline", + "description": "Get the complete outline of a course including title, link, and all lessons with their numbers and titles", + "input_schema": { + "type": "object", + "properties": { + "course_name": { + "type": "string", + "description": "Course title (partial matches work, e.g. 'MCP', 'Introduction')", + } + }, + "required": ["course_name"], + }, + } + + def execute(self, course_name: str) -> str: + """ + Execute the outline retrieval tool. + + Args: + course_name: Course name to get outline for + + Returns: + Formatted course outline or error message + """ + # Resolve course name using vector store's existing method + course_title = self.store._resolve_course_name(course_name) + if not course_title: + return f"No course found matching '{course_name}'" + + # Get course metadata + try: + results = self.store.course_catalog.get(ids=[course_title]) + if not results or not results["metadatas"]: + return f"Course metadata not found for '{course_title}'" + + metadata = results["metadatas"][0] + + # Parse lessons from JSON + import json + + lessons_json = metadata.get("lessons_json") + if not lessons_json: + return f"No lesson information available for '{course_title}'" + + lessons = json.loads(lessons_json) + + # Format the outline + outline = [] + outline.append(f"**Course Title:** {metadata.get('title', course_title)}") + outline.append(f"**Course Link:** {metadata.get('course_link', 'N/A')}") + outline.append(f"**Total Lessons:** {len(lessons)}") + outline.append("\n**Lesson Outline:**") + + for lesson in lessons: + lesson_num = lesson.get("lesson_number", "N/A") + lesson_title = lesson.get("lesson_title", "N/A") + outline.append(f"Lesson {lesson_num}: {lesson_title}") + + return "\n".join(outline) + + except Exception as e: + return f"Error retrieving course outline: {str(e)}" + class ToolManager: """Manages available tools for the AI""" @@ -161,8 +228,18 @@ def get_last_sources(self) -> list: return tool.last_sources return [] + def get_last_source_links(self) -> list: + """Get source links from the last search operation""" + # Check all tools for last_source_links attribute + for tool in self.tools.values(): + if hasattr(tool, "last_source_links") and tool.last_source_links: + return tool.last_source_links + return [] + def reset_sources(self): """Reset sources from all tools that track sources""" for tool in self.tools.values(): if hasattr(tool, 'last_sources'): - tool.last_sources = [] \ No newline at end of file + tool.last_sources = [] + if hasattr(tool, "last_source_links"): + tool.last_source_links = [] \ No newline at end of file diff --git a/backend/vector_store.py b/backend/vector_store.py index 390abe71c..5a99f1e04 100644 --- a/backend/vector_store.py +++ b/backend/vector_store.py @@ -264,4 +264,3 @@ def get_lesson_link(self, course_title: str, lesson_number: int) -> Optional[str return None except Exception as e: print(f"Error getting lesson link: {e}") - \ No newline at end of file diff --git a/frontend/index.html b/frontend/index.html index 1262761d1..7df3e9aa9 100644 --- a/frontend/index.html +++ b/frontend/index.html @@ -7,7 +7,7 @@ Course Materials Assistant - +

diff --git a/frontend/style.css b/frontend/style.css index 069dbdde4..7478104d3 100644 --- a/frontend/style.css +++ b/frontend/style.css @@ -648,15 +648,14 @@ details[open] .suggested-header::before { /* New Chat Button */ .new-chat-button { width: 100%; - padding: 0.75rem 1rem; - background: var(--background); - border: 1px solid var(--border-color); - border-radius: 8px; + padding: 0.5rem 0; + background: none; + border: none; color: var(--text-secondary); font-size: 0.875rem; font-weight: 600; cursor: pointer; - transition: all 0.2s ease; + transition: color 0.2s ease; text-align: left; display: flex; align-items: center; @@ -667,8 +666,8 @@ details[open] .suggested-header::before { .new-chat-icon { font-size: 1.25rem; - font-weight: 700; - color: var(--primary-color); + font-weight: 400; + color: var(--text-secondary); } .new-chat-text { @@ -676,19 +675,16 @@ details[open] .suggested-header::before { } .new-chat-button:hover { - background: var(--surface-hover); - border-color: var(--primary-color); color: var(--primary-color); - transform: translateX(2px); } .new-chat-button:focus { outline: none; - box-shadow: 0 0 0 3px var(--focus-ring); + color: var(--primary-color); } .new-chat-button:active { - transform: translateX(0); + color: var(--primary-color); } /* Suggested Questions in Sidebar */ From 673fc73dde621ad2caf7c34fae62db1bd1c7c536 Mon Sep 17 00:00:00 2001 From: kp1729 Date: Sun, 15 Feb 2026 20:58:16 -0800 Subject: [PATCH 06/16] Fix duplicate CourseOutlineTool class breaking ToolManager Removed duplicate CourseOutlineTool class that was inserted into ToolManager during merge, causing get_tool_definitions and other methods to be misplaced. Co-Authored-By: Claude Opus 4.6 --- backend/search_tools.py | 69 ++--------------------------------------- 1 file changed, 2 insertions(+), 67 deletions(-) diff --git a/backend/search_tools.py b/backend/search_tools.py index 7d94a900a..1d8b027ca 100644 --- a/backend/search_tools.py +++ b/backend/search_tools.py @@ -196,10 +196,10 @@ def execute(self, course_name: str) -> str: class ToolManager: """Manages available tools for the AI""" - + def __init__(self): self.tools = {} - + def register_tool(self, tool: Tool): """Register any tool that implements the Tool interface""" tool_def = tool.get_tool_definition() @@ -208,71 +208,6 @@ def register_tool(self, tool: Tool): raise ValueError("Tool must have a 'name' in its definition") self.tools[tool_name] = tool - -class CourseOutlineTool(Tool): - """Tool for retrieving complete course outlines and lesson lists""" - - def __init__(self, vector_store: VectorStore): - self.store = vector_store - self.last_sources = [] # Track sources for consistency - - def get_tool_definition(self) -> Dict[str, Any]: - """Return Anthropic tool definition for this tool""" - return { - "name": "get_course_outline", - "description": "Get the complete outline of a course including title, link, and all lessons with their numbers and titles", - "input_schema": { - "type": "object", - "properties": { - "course_title": { - "type": "string", - "description": "Course title or partial name (e.g., 'MCP', 'Introduction to AI')" - } - }, - "required": ["course_title"] - } - } - - def execute(self, course_title: str) -> str: - """ - Execute the outline retrieval tool. - - Args: - course_title: Course name to get outline for - - Returns: - Formatted course outline or error message - """ - outline = self.store.get_course_outline(course_title) - - if not outline: - return f"No course found matching '{course_title}'" - - # Store source for the UI - self.last_sources = [{ - "text": outline["course_title"], - "link": outline["course_link"] - }] - - return self._format_outline(outline) - - def _format_outline(self, outline: Dict[str, Any]) -> str: - """Format course outline for Claude""" - formatted = [ - outline['course_title'], - f"Course Link: {outline['course_link']}", - "", - "Course Outline:" - ] - - for lesson in outline['lessons']: - lesson_num = lesson['lesson_number'] - lesson_title = lesson['lesson_title'] - formatted.append(f"• Lesson {lesson_num}: {lesson_title}") - - return "\n".join(formatted) - - def get_tool_definitions(self) -> list: """Get all tool definitions for Anthropic tool calling""" return [tool.get_tool_definition() for tool in self.tools.values()] From 9694cfb015c7bfe896d6d8a7c708a8d749e43798 Mon Sep 17 00:00:00 2001 From: kp1729 Date: Sun, 15 Feb 2026 21:32:32 -0800 Subject: [PATCH 07/16] Fix empty content and API error crashes in AIGenerator Add _extract_text() to safely handle empty API responses instead of crashing with IndexError on response.content[0].text. Wrap Anthropic API calls to catch AuthenticationError and APIError, re-raising as RuntimeError with descriptive context for the 500 handler. Add 25 diagnostic tests covering search tools, AI generator tool calling, and RAG query pipeline. Co-Authored-By: Claude Opus 4.6 --- backend/ai_generator.py | 29 ++- backend/search_tools.py | 20 +- backend/tests/__init__.py | 0 backend/tests/conftest.py | 6 + backend/tests/helpers.py | 67 +++++++ backend/tests/test_ai_generator.py | 264 ++++++++++++++++++++++++++ backend/tests/test_rag_integration.py | 117 ++++++++++++ backend/tests/test_search_tools.py | 118 ++++++++++++ pyproject.toml | 1 + uv.lock | 38 +++- 10 files changed, 646 insertions(+), 14 deletions(-) create mode 100644 backend/tests/__init__.py create mode 100644 backend/tests/conftest.py create mode 100644 backend/tests/helpers.py create mode 100644 backend/tests/test_ai_generator.py create mode 100644 backend/tests/test_rag_integration.py create mode 100644 backend/tests/test_search_tools.py diff --git a/backend/ai_generator.py b/backend/ai_generator.py index 607d1e80b..b415fd123 100644 --- a/backend/ai_generator.py +++ b/backend/ai_generator.py @@ -95,7 +95,12 @@ def generate_response( api_params["tool_choice"] = {"type": "auto"} # Get response from Claude - response = self.client.messages.create(**api_params) + try: + response = self.client.messages.create(**api_params) + except anthropic.AuthenticationError as e: + raise RuntimeError(f"Anthropic API authentication failed: {e}") from e + except anthropic.APIError as e: + raise RuntimeError(f"Anthropic API error: {e}") from e # Handle tool execution if needed if response.stop_reason == "tool_use" and tool_manager: @@ -108,7 +113,7 @@ def generate_response( break else: # No tool use, return direct response - return response.content[0].text + return self._extract_text(response) # After max rounds, make final call without tools to get response final_params = { @@ -117,8 +122,24 @@ def generate_response( "system": system_content, } - final_response = self.client.messages.create(**final_params) - return final_response.content[0].text + try: + final_response = self.client.messages.create(**final_params) + except anthropic.AuthenticationError as e: + raise RuntimeError(f"Anthropic API authentication failed: {e}") from e + except anthropic.APIError as e: + raise RuntimeError(f"Anthropic API error: {e}") from e + + return self._extract_text(final_response) + + @staticmethod + def _extract_text(response) -> str: + """Safely extract text from an API response, handling empty content.""" + if not response.content: + return "I'm sorry, I wasn't able to generate a response. Please try again." + for block in response.content: + if hasattr(block, "text"): + return block.text + return "I'm sorry, I wasn't able to generate a response. Please try again." def _handle_tool_execution(self, initial_response, messages: List, tool_manager): """ diff --git a/backend/search_tools.py b/backend/search_tools.py index 1d8b027ca..8677bd3b0 100644 --- a/backend/search_tools.py +++ b/backend/search_tools.py @@ -177,19 +177,21 @@ def execute(self, course_name: str) -> str: lessons = json.loads(lessons_json) - # Format the outline - outline = [] - outline.append(f"**Course Title:** {metadata.get('title', course_title)}") - outline.append(f"**Course Link:** {metadata.get('course_link', 'N/A')}") - outline.append(f"**Total Lessons:** {len(lessons)}") - outline.append("\n**Lesson Outline:**") - + # Format the outline with proper markdown + header = ( + f"**Course Title:** {metadata.get('title', course_title)}\n\n" + f"**Course Link:** {metadata.get('course_link', 'N/A')}\n\n" + f"**Total Lessons:** {len(lessons)}\n\n" + f"**Lesson Outline:**\n" + ) + + lesson_lines = [] for lesson in lessons: lesson_num = lesson.get("lesson_number", "N/A") lesson_title = lesson.get("lesson_title", "N/A") - outline.append(f"Lesson {lesson_num}: {lesson_title}") + lesson_lines.append(f"- **Lesson {lesson_num}:** {lesson_title}") - return "\n".join(outline) + return header + "\n".join(lesson_lines) except Exception as e: return f"Error retrieving course outline: {str(e)}" diff --git a/backend/tests/__init__.py b/backend/tests/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/backend/tests/conftest.py b/backend/tests/conftest.py new file mode 100644 index 000000000..facfd5f45 --- /dev/null +++ b/backend/tests/conftest.py @@ -0,0 +1,6 @@ +import sys +import os + +# Add backend and tests directories to path so imports work +sys.path.insert(0, os.path.join(os.path.dirname(__file__), "..")) +sys.path.insert(0, os.path.dirname(__file__)) diff --git a/backend/tests/helpers.py b/backend/tests/helpers.py new file mode 100644 index 000000000..9e3e9dcfa --- /dev/null +++ b/backend/tests/helpers.py @@ -0,0 +1,67 @@ +"""Shared test helpers and factories.""" + +import sys +import os +from dataclasses import dataclass +from unittest.mock import MagicMock + +# Add backend to path so imports work +sys.path.insert(0, os.path.join(os.path.dirname(__file__), "..")) + +from vector_store import SearchResults + + +@dataclass +class MockConfig: + ANTHROPIC_API_KEY: str = "test-key" + ANTHROPIC_MODEL: str = "claude-sonnet-4-20250514" + EMBEDDING_MODEL: str = "all-MiniLM-L6-v2" + CHUNK_SIZE: int = 800 + CHUNK_OVERLAP: int = 100 + MAX_RESULTS: int = 5 + MAX_HISTORY: int = 2 + CHROMA_PATH: str = "./test_chroma_db" + + +def make_search_results(documents=None, metadata=None, distances=None, error=None): + """Factory for SearchResults objects.""" + if error: + return SearchResults.empty(error) + return SearchResults( + documents=documents or [], + metadata=metadata or [], + distances=distances or [], + error=None, + ) + + +def make_valid_search_results(n=2): + """Create valid search results with n items.""" + docs = [f"Content about topic {i}" for i in range(n)] + meta = [ + {"course_title": f"Course {i}", "lesson_number": i + 1, "chunk_index": i} + for i in range(n) + ] + dists = [0.1 * (i + 1) for i in range(n)] + return SearchResults(documents=docs, metadata=meta, distances=dists) + + +def make_anthropic_response(content_blocks, stop_reason="end_turn"): + """Factory for mock Anthropic API responses.""" + mock_response = MagicMock() + mock_response.stop_reason = stop_reason + + blocks = [] + for block in content_blocks: + mock_block = MagicMock() + mock_block.type = block["type"] + if block["type"] == "text": + mock_block.text = block["text"] + elif block["type"] == "tool_use": + mock_block.id = block["id"] + mock_block.name = block["name"] + mock_block.input = block["input"] + blocks.append(mock_block) + + mock_response.content = blocks + return mock_response diff --git a/backend/tests/test_ai_generator.py b/backend/tests/test_ai_generator.py new file mode 100644 index 000000000..434078d54 --- /dev/null +++ b/backend/tests/test_ai_generator.py @@ -0,0 +1,264 @@ +"""Tests for AIGenerator tool calling and response handling.""" + +import pytest +import anthropic +from unittest.mock import MagicMock, patch, call +from helpers import make_anthropic_response +from ai_generator import AIGenerator + + +@pytest.fixture +def generator(): + with patch("ai_generator.anthropic.Anthropic"): + gen = AIGenerator(api_key="test-key", model="claude-sonnet-4-20250514") + return gen + + +@pytest.fixture +def tool_manager(): + tm = MagicMock() + tm.execute_tool.return_value = "Tool result: content about topic" + return tm + + +@pytest.fixture +def sample_tools(): + return [ + { + "name": "search_course_content", + "description": "Search course materials", + "input_schema": { + "type": "object", + "properties": {"query": {"type": "string"}}, + "required": ["query"], + }, + } + ] + + +class TestDirectResponses: + def test_direct_text_response(self, generator, sample_tools): + """When Claude returns text (no tools), returns text directly.""" + response = make_anthropic_response( + [{"type": "text", "text": "Hello, I can help!"}], + stop_reason="end_turn", + ) + generator.client.messages.create.return_value = response + + result = generator.generate_response(query="hi", tools=sample_tools) + + assert result == "Hello, I can help!" + + def test_empty_content_returns_fallback(self, generator, sample_tools): + """When response.content is empty, returns a fallback message instead of crashing.""" + response = make_anthropic_response([], stop_reason="end_turn") + response.content = [] # explicitly empty + generator.client.messages.create.return_value = response + + result = generator.generate_response(query="test", tools=sample_tools) + + assert "able to generate a response" in result.lower() + + +class TestToolCalling: + def test_tool_use_calls_tool_manager( + self, generator, tool_manager, sample_tools + ): + """When Claude returns tool_use, calls tool_manager.execute_tool().""" + # Round 1: tool_use + tool_response = make_anthropic_response( + [ + { + "type": "tool_use", + "id": "t1", + "name": "search_course_content", + "input": {"query": "neural networks"}, + } + ], + stop_reason="tool_use", + ) + # Round 2: final text + text_response = make_anthropic_response( + [{"type": "text", "text": "Neural networks are..."}], + stop_reason="end_turn", + ) + generator.client.messages.create.side_effect = [ + tool_response, + text_response, + ] + + generator.generate_response( + query="what are neural networks", + tools=sample_tools, + tool_manager=tool_manager, + ) + + tool_manager.execute_tool.assert_called_once_with( + "search_course_content", query="neural networks" + ) + + def test_tool_use_then_synthesis( + self, generator, tool_manager, sample_tools + ): + """Round 1: tool_use -> execute -> Round 2: Claude synthesizes answer.""" + tool_response = make_anthropic_response( + [ + { + "type": "tool_use", + "id": "t1", + "name": "search_course_content", + "input": {"query": "transformers"}, + } + ], + stop_reason="tool_use", + ) + synthesis_response = make_anthropic_response( + [{"type": "text", "text": "Transformers use attention mechanisms."}], + stop_reason="end_turn", + ) + generator.client.messages.create.side_effect = [ + tool_response, + synthesis_response, + ] + + result = generator.generate_response( + query="explain transformers", + tools=sample_tools, + tool_manager=tool_manager, + ) + + assert result == "Transformers use attention mechanisms." + assert generator.client.messages.create.call_count == 2 + + def test_course_outline_returns_directly( + self, generator, tool_manager, sample_tools + ): + """get_course_outline tool result is returned directly without synthesis.""" + outline_result = "**Course Title:** MCP\n- Lesson 1: Intro" + tool_manager.execute_tool.return_value = outline_result + + tool_response = make_anthropic_response( + [ + { + "type": "tool_use", + "id": "t1", + "name": "get_course_outline", + "input": {"course_name": "MCP"}, + } + ], + stop_reason="tool_use", + ) + generator.client.messages.create.return_value = tool_response + + result = generator.generate_response( + query="outline of MCP", + tools=sample_tools, + tool_manager=tool_manager, + ) + + assert result == outline_result + # Should NOT make a second API call for synthesis + assert generator.client.messages.create.call_count == 1 + + def test_tool_execution_exception_handled( + self, generator, tool_manager, sample_tools + ): + """When tool_manager raises, error is caught and loop breaks.""" + tool_manager.execute_tool.side_effect = RuntimeError("Tool crashed") + + tool_response = make_anthropic_response( + [ + { + "type": "tool_use", + "id": "t1", + "name": "search_course_content", + "input": {"query": "test"}, + } + ], + stop_reason="tool_use", + ) + # After exception, a final synthesis call is made (no tools) + final_response = make_anthropic_response( + [{"type": "text", "text": "I encountered an error."}], + stop_reason="end_turn", + ) + generator.client.messages.create.side_effect = [ + tool_response, + final_response, + ] + + result = generator.generate_response( + query="test", tools=sample_tools, tool_manager=tool_manager + ) + + # The function should still return (error is handled in _handle_tool_execution) + assert isinstance(result, str) + + def test_api_exception_wrapped_as_runtime_error(self, generator, sample_tools): + """When client.messages.create() raises APIError, it's wrapped as RuntimeError with context.""" + generator.client.messages.create.side_effect = anthropic.APIError( + message="rate limit exceeded", + request=MagicMock(), + body=None, + ) + + with pytest.raises(RuntimeError, match="Anthropic API error"): + generator.generate_response(query="test", tools=sample_tools) + + def test_auth_exception_wrapped_with_context(self, generator, sample_tools): + """When client.messages.create() raises AuthenticationError, it's wrapped with auth context.""" + generator.client.messages.create.side_effect = anthropic.AuthenticationError( + message="invalid api key", + response=MagicMock(status_code=401, headers={}), + body=None, + ) + + with pytest.raises(RuntimeError, match="authentication failed"): + generator.generate_response(query="test", tools=sample_tools) + + def test_two_rounds_of_tool_calls( + self, generator, tool_manager, sample_tools + ): + """Loop executes up to 2 tool rounds before final synthesis call.""" + tool_response_1 = make_anthropic_response( + [ + { + "type": "tool_use", + "id": "t1", + "name": "search_course_content", + "input": {"query": "round 1"}, + } + ], + stop_reason="tool_use", + ) + tool_response_2 = make_anthropic_response( + [ + { + "type": "tool_use", + "id": "t2", + "name": "search_course_content", + "input": {"query": "round 2"}, + } + ], + stop_reason="tool_use", + ) + final_response = make_anthropic_response( + [{"type": "text", "text": "Final answer after 2 rounds."}], + stop_reason="end_turn", + ) + generator.client.messages.create.side_effect = [ + tool_response_1, + tool_response_2, + final_response, + ] + + result = generator.generate_response( + query="complex question", + tools=sample_tools, + tool_manager=tool_manager, + ) + + assert result == "Final answer after 2 rounds." + # 2 tool rounds + 1 final synthesis = 3 API calls + assert generator.client.messages.create.call_count == 3 + assert tool_manager.execute_tool.call_count == 2 diff --git a/backend/tests/test_rag_integration.py b/backend/tests/test_rag_integration.py new file mode 100644 index 000000000..79ec2a835 --- /dev/null +++ b/backend/tests/test_rag_integration.py @@ -0,0 +1,117 @@ +"""Tests for RAG system query pipeline with mocked dependencies.""" + +import pytest +from unittest.mock import MagicMock, patch + + +class TestRAGQueryPipeline: + """Test the full query pipeline with mocked external dependencies.""" + + @pytest.fixture + def mock_deps(self): + """Set up mocked RAG system with all dependencies mocked.""" + with ( + patch("rag_system.DocumentProcessor"), + patch("rag_system.VectorStore"), + patch("rag_system.AIGenerator"), + patch("rag_system.SessionManager"), + patch("rag_system.CourseSearchTool"), + patch("rag_system.CourseOutlineTool"), + patch("rag_system.ToolManager") as mock_tm_cls, + ): + from rag_system import RAGSystem + from helpers import MockConfig + + config = MockConfig() + rag = RAGSystem(config) + + # rag.tool_manager is now a MagicMock instance + rag.ai_generator.generate_response.return_value = ( + "This is the answer." + ) + rag.tool_manager.get_last_sources.return_value = [ + "Course A - Lesson 1" + ] + rag.tool_manager.get_last_source_links.return_value = [ + "https://example.com/1" + ] + rag.session_manager.get_conversation_history.return_value = None + + yield rag + + def test_query_returns_response_and_sources(self, mock_deps): + """Happy path: returns (answer, sources, source_links) tuple.""" + rag = mock_deps + + response, sources, source_links = rag.query("What is MCP?") + + assert response == "This is the answer." + assert sources == ["Course A - Lesson 1"] + assert source_links == ["https://example.com/1"] + + def test_query_passes_tools_to_generator(self, mock_deps): + """get_tool_definitions() is passed to ai_generator.generate_response().""" + rag = mock_deps + rag.tool_manager.get_tool_definitions.return_value = [ + {"name": "search_course_content"} + ] + + rag.query("test question") + + call_kwargs = rag.ai_generator.generate_response.call_args + assert call_kwargs.kwargs["tools"] == [ + {"name": "search_course_content"} + ] + + def test_query_passes_tool_manager(self, mock_deps): + """tool_manager instance is passed to generator for tool dispatch.""" + rag = mock_deps + + rag.query("test question") + + call_kwargs = rag.ai_generator.generate_response.call_args + assert call_kwargs.kwargs["tool_manager"] is rag.tool_manager + + def test_query_collects_sources_after_response(self, mock_deps): + """Sources retrieved via get_last_sources() after generation.""" + rag = mock_deps + + rag.query("test") + + gen_call_order = rag.ai_generator.generate_response.call_args_list + src_call_order = rag.tool_manager.get_last_sources.call_args_list + assert len(gen_call_order) == 1 + assert len(src_call_order) == 1 + + def test_query_resets_sources(self, mock_deps): + """reset_sources() called after source collection.""" + rag = mock_deps + + rag.query("test") + + rag.tool_manager.reset_sources.assert_called_once() + + def test_query_exception_propagates_to_caller(self, mock_deps): + """When generator raises, exception propagates (no try/except in query()).""" + rag = mock_deps + rag.ai_generator.generate_response.side_effect = Exception( + "API auth failed" + ) + + with pytest.raises(Exception, match="API auth failed"): + rag.query("test question") + + def test_query_with_session_passes_history(self, mock_deps): + """Session history is passed as conversation_history parameter.""" + rag = mock_deps + rag.session_manager.get_conversation_history.return_value = ( + "User: hi\nAssistant: hello" + ) + + rag.query("follow up question", session_id="session_1") + + call_kwargs = rag.ai_generator.generate_response.call_args + assert ( + call_kwargs.kwargs["conversation_history"] + == "User: hi\nAssistant: hello" + ) diff --git a/backend/tests/test_search_tools.py b/backend/tests/test_search_tools.py new file mode 100644 index 000000000..87dd88106 --- /dev/null +++ b/backend/tests/test_search_tools.py @@ -0,0 +1,118 @@ +"""Tests for CourseSearchTool.execute() and ToolManager dispatch.""" + +import pytest +from unittest.mock import MagicMock, patch +from helpers import make_search_results, make_valid_search_results +from search_tools import CourseSearchTool, ToolManager +from vector_store import SearchResults + + +@pytest.fixture +def mock_store(): + store = MagicMock() + store.get_lesson_link = MagicMock(return_value="https://example.com/lesson") + return store + + +@pytest.fixture +def search_tool(mock_store): + return CourseSearchTool(mock_store) + + +@pytest.fixture +def tool_manager(search_tool): + tm = ToolManager() + tm.register_tool(search_tool) + return tm + + +class TestCourseSearchToolExecute: + def test_execute_returns_formatted_results(self, search_tool, mock_store): + """Valid search results are formatted as [Course - Lesson N]\\ncontent.""" + results = make_valid_search_results(2) + mock_store.search.return_value = results + + output = search_tool.execute(query="test query") + + assert "[Course 0 - Lesson 1]" in output + assert "Content about topic 0" in output + assert "[Course 1 - Lesson 2]" in output + assert "Content about topic 1" in output + + def test_execute_populates_sources(self, search_tool, mock_store): + """last_sources and last_source_links are populated after execution.""" + results = make_valid_search_results(2) + mock_store.search.return_value = results + + search_tool.execute(query="test query") + + assert len(search_tool.last_sources) == 2 + assert "Course 0 - Lesson 1" in search_tool.last_sources + assert len(search_tool.last_source_links) == 2 + + def test_execute_error_from_search(self, search_tool, mock_store): + """When SearchResults.error is set, execute returns the error string.""" + mock_store.search.return_value = make_search_results( + error="No course found matching 'xyz'" + ) + + output = search_tool.execute(query="test", course_name="xyz") + + assert "No course found matching 'xyz'" in output + + def test_execute_empty_results(self, search_tool, mock_store): + """When no documents found, returns 'No relevant content found'.""" + mock_store.search.return_value = make_search_results() + + output = search_tool.execute(query="nonexistent topic") + + assert "No relevant content found" in output + + def test_execute_empty_with_filters(self, search_tool, mock_store): + """Empty results with course_name/lesson filters include filter info.""" + mock_store.search.return_value = make_search_results() + + output = search_tool.execute( + query="topic", course_name="MCP", lesson_number=3 + ) + + assert "in course 'MCP'" in output + assert "in lesson 3" in output + + def test_execute_exception_propagates(self, search_tool, mock_store): + """When store.search() raises, exception propagates (not caught).""" + mock_store.search.side_effect = RuntimeError("DB connection failed") + + with pytest.raises(RuntimeError, match="DB connection failed"): + search_tool.execute(query="test") + + def test_tool_definition_schema(self, search_tool): + """Tool definition has correct name, required params, schema.""" + defn = search_tool.get_tool_definition() + + assert defn["name"] == "search_course_content" + assert defn["input_schema"]["required"] == ["query"] + assert "query" in defn["input_schema"]["properties"] + assert "course_name" in defn["input_schema"]["properties"] + assert "lesson_number" in defn["input_schema"]["properties"] + + +class TestToolManager: + def test_dispatches_correctly(self, tool_manager, mock_store): + """ToolManager.execute_tool dispatches to the right tool.""" + mock_store.search.return_value = make_valid_search_results(1) + + result = tool_manager.execute_tool( + "search_course_content", query="test query" + ) + + mock_store.search.assert_called_once_with( + query="test query", course_name=None, lesson_number=None + ) + assert "[Course 0 - Lesson 1]" in result + + def test_unknown_tool_returns_error(self, tool_manager): + """Unknown tool name returns error string, not exception.""" + result = tool_manager.execute_tool("nonexistent_tool", query="test") + + assert "not found" in result.lower() diff --git a/pyproject.toml b/pyproject.toml index 3f05e2de0..1344b49a6 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -12,4 +12,5 @@ dependencies = [ "uvicorn==0.35.0", "python-multipart==0.0.20", "python-dotenv==1.1.1", + "pytest>=8.0", ] diff --git a/uv.lock b/uv.lock index 9ae65c557..c06a7c150 100644 --- a/uv.lock +++ b/uv.lock @@ -1,5 +1,5 @@ version = 1 -revision = 2 +revision = 3 requires-python = ">=3.13" [[package]] @@ -470,6 +470,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/a4/ed/1f1afb2e9e7f38a545d628f864d562a5ae64fe6f7a10e28ffb9b185b4e89/importlib_resources-6.5.2-py3-none-any.whl", hash = "sha256:789cfdc3ed28c78b67a06acb8126751ced69a3d5f79c095a98298cd8a760ccec", size = 37461, upload-time = "2025-01-03T18:51:54.306Z" }, ] +[[package]] +name = "iniconfig" +version = "2.3.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/72/34/14ca021ce8e5dfedc35312d08ba8bf51fdd999c576889fc2c24cb97f4f10/iniconfig-2.3.0.tar.gz", hash = "sha256:c76315c77db068650d49c5b56314774a7804df16fee4402c1f19d6d15d8c4730", size = 20503, upload-time = "2025-10-18T21:55:43.219Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/cb/b1/3846dd7f199d53cb17f49cba7e651e9ce294d8497c8c150530ed11865bb8/iniconfig-2.3.0-py3-none-any.whl", hash = "sha256:f631c04d2c48c52b84d0d0549c99ff3859c98df65b3101406327ecc7d53fbf12", size = 7484, upload-time = "2025-10-18T21:55:41.639Z" }, +] + [[package]] name = "jinja2" version = "3.1.6" @@ -1038,6 +1047,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/89/c7/5572fa4a3f45740eaab6ae86fcdf7195b55beac1371ac8c619d880cfe948/pillow-11.3.0-cp314-cp314t-win_arm64.whl", hash = "sha256:79ea0d14d3ebad43ec77ad5272e6ff9bba5b679ef73375ea760261207fa8e0aa", size = 2512835, upload-time = "2025-07-01T09:15:50.399Z" }, ] +[[package]] +name = "pluggy" +version = "1.6.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f9/e2/3e91f31a7d2b083fe6ef3fa267035b518369d9511ffab804f839851d2779/pluggy-1.6.0.tar.gz", hash = "sha256:7dcc130b76258d33b90f61b658791dede3486c3e6bfb003ee5c9bfb396dd22f3", size = 69412, upload-time = "2025-05-15T12:30:07.975Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/54/20/4d324d65cc6d9205fabedc306948156824eb9f0ee1633355a8f7ec5c66bf/pluggy-1.6.0-py3-none-any.whl", hash = "sha256:e920276dd6813095e9377c0bc5566d94c932c33b27a3e3945d8389c374dd4746", size = 20538, upload-time = "2025-05-15T12:30:06.134Z" }, +] + [[package]] name = "posthog" version = "5.4.0" @@ -1207,6 +1225,22 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/5a/dc/491b7661614ab97483abf2056be1deee4dc2490ecbf7bff9ab5cdbac86e1/pyreadline3-3.5.4-py3-none-any.whl", hash = "sha256:eaf8e6cc3c49bcccf145fc6067ba8643d1df34d604a1ec0eccbf7a18e6d3fae6", size = 83178, upload-time = "2024-09-19T02:40:08.598Z" }, ] +[[package]] +name = "pytest" +version = "9.0.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "colorama", marker = "sys_platform == 'win32'" }, + { name = "iniconfig" }, + { name = "packaging" }, + { name = "pluggy" }, + { name = "pygments" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/d1/db/7ef3487e0fb0049ddb5ce41d3a49c235bf9ad299b6a25d5780a89f19230f/pytest-9.0.2.tar.gz", hash = "sha256:75186651a92bd89611d1d9fc20f0b4345fd827c41ccd5c299a868a05d70edf11", size = 1568901, upload-time = "2025-12-06T21:30:51.014Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/3b/ab/b3226f0bd7cdcf710fbede2b3548584366da3b19b5021e74f5bde2a8fa3f/pytest-9.0.2-py3-none-any.whl", hash = "sha256:711ffd45bf766d5264d487b917733b453d917afd2b0ad65223959f59089f875b", size = 374801, upload-time = "2025-12-06T21:30:49.154Z" }, +] + [[package]] name = "python-dateutil" version = "2.9.0.post0" @@ -1555,6 +1589,7 @@ dependencies = [ { name = "anthropic" }, { name = "chromadb" }, { name = "fastapi" }, + { name = "pytest" }, { name = "python-dotenv" }, { name = "python-multipart" }, { name = "sentence-transformers" }, @@ -1566,6 +1601,7 @@ requires-dist = [ { name = "anthropic", specifier = "==0.58.2" }, { name = "chromadb", specifier = "==1.0.15" }, { name = "fastapi", specifier = "==0.116.1" }, + { name = "pytest", specifier = ">=8.0" }, { name = "python-dotenv", specifier = "==1.1.1" }, { name = "python-multipart", specifier = "==0.0.20" }, { name = "sentence-transformers", specifier = "==5.0.0" }, From 4b88ae4024ebbb7dbd6b6dffc04d59372652e554 Mon Sep 17 00:00:00 2001 From: kp1729 Date: Sun, 15 Feb 2026 22:21:44 -0800 Subject: [PATCH 08/16] Refactor AIGenerator for multi-round tool calling with robust error handling Extract _call_api() helper, execute all parallel tools before flow control, add DIRECT_RETURN_TOOLS/MAX_TOOL_ROUNDS constants, and reorganize tests for multi-round, parallel, and partial-failure scenarios. Co-Authored-By: Claude Opus 4.6 --- .claude/settings.local.json | 12 ++ Outline-not_what_I_want.png | Bin 58423 -> 0 bytes Screenshot.png | Bin 164010 -> 0 bytes backend-tool-refactor.md | 0 backend/ai_generator.py | 122 ++++++++------ backend/tests/test_ai_generator.py | 257 +++++++++++++++++++++++------ 6 files changed, 288 insertions(+), 103 deletions(-) create mode 100644 .claude/settings.local.json delete mode 100644 Outline-not_what_I_want.png delete mode 100644 Screenshot.png create mode 100644 backend-tool-refactor.md diff --git a/.claude/settings.local.json b/.claude/settings.local.json new file mode 100644 index 000000000..2c73fc716 --- /dev/null +++ b/.claude/settings.local.json @@ -0,0 +1,12 @@ +{ + "permissions": { + "allow": [ + "Bash(git add:*)", + "Bash(git push:*)", + "Bash(git pull:*)", + "Bash(echo:*)", + "Bash(uv run -m pytest:*)", + "Bash(git commit:*)" + ] + } +} diff --git a/Outline-not_what_I_want.png b/Outline-not_what_I_want.png deleted file mode 100644 index ba55b1946177083c00b2d59308d1e2a75eb9f791..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 58423 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 diff --git a/Screenshot.png b/Screenshot.png deleted file mode 100644 index ac897c8ba2e8170863b8d9a836f9b394bbef8abe..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 164010 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 *2K9AV=Ex8(2R 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 diff --git a/backend-tool-refactor.md b/backend-tool-refactor.md new file mode 100644 index 000000000..e69de29bb diff --git a/backend/ai_generator.py b/backend/ai_generator.py index b415fd123..88a4b59cc 100644 --- a/backend/ai_generator.py +++ b/backend/ai_generator.py @@ -6,6 +6,9 @@ class AIGenerator: """Handles interactions with Anthropic's Claude API for generating responses""" + MAX_TOOL_ROUNDS = 2 + DIRECT_RETURN_TOOLS = frozenset({"get_course_outline"}) + # Static system prompt to avoid rebuilding on each call SYSTEM_PROMPT = """ You are an AI assistant specialized in course materials and educational content with access to comprehensive tools for course information. @@ -17,7 +20,9 @@ class AIGenerator: - Use search_course_content for detailed questions about specific topics or lessons - Use get_course_outline for questions about course structure, lesson lists, or "what's in this course" - **You can make up to 2 rounds of tool calls to gather comprehensive information** -- Use multiple rounds for complex queries that require information gathering then refinement + - Round 1: Initial search to gather relevant information + - Round 2: Refine or search additional context (different course, narrower lesson, related term) + - Most queries need only 1 tool call. Use a second only when the first result is insufficient. - Synthesize tool results into accurate, fact-based responses - If tools yield no results, state this clearly without offering alternatives @@ -49,6 +54,15 @@ def __init__(self, api_key: str, model: str): # Pre-build base API parameters self.base_params = {"model": self.model, "temperature": 0, "max_tokens": 800} + def _call_api(self, **params): + """Make an Anthropic API call with standardized error handling.""" + try: + return self.client.messages.create(**params) + except anthropic.AuthenticationError as e: + raise RuntimeError(f"Anthropic API authentication failed: {e}") from e + except anthropic.APIError as e: + raise RuntimeError(f"Anthropic API error: {e}") from e + def generate_response( self, query: str, @@ -58,7 +72,7 @@ def generate_response( ) -> str: """ Generate AI response with optional tool usage and conversation context. - Supports up to 2 sequential rounds of tool calling. + Supports up to MAX_TOOL_ROUNDS sequential rounds of tool calling. Args: query: The user's question or request @@ -80,8 +94,8 @@ def generate_response( # Start with initial messages messages = [{"role": "user", "content": query}] - # Execute up to 2 rounds of tool calling - for round_num in range(2): + # Execute up to MAX_TOOL_ROUNDS rounds of tool calling + for round_num in range(self.MAX_TOOL_ROUNDS): # Prepare API call parameters api_params = { **self.base_params, @@ -94,13 +108,7 @@ def generate_response( api_params["tools"] = tools api_params["tool_choice"] = {"type": "auto"} - # Get response from Claude - try: - response = self.client.messages.create(**api_params) - except anthropic.AuthenticationError as e: - raise RuntimeError(f"Anthropic API authentication failed: {e}") from e - except anthropic.APIError as e: - raise RuntimeError(f"Anthropic API error: {e}") from e + response = self._call_api(**api_params) # Handle tool execution if needed if response.stop_reason == "tool_use" and tool_manager: @@ -122,13 +130,7 @@ def generate_response( "system": system_content, } - try: - final_response = self.client.messages.create(**final_params) - except anthropic.AuthenticationError as e: - raise RuntimeError(f"Anthropic API authentication failed: {e}") from e - except anthropic.APIError as e: - raise RuntimeError(f"Anthropic API error: {e}") from e - + final_response = self._call_api(**final_params) return self._extract_text(final_response) @staticmethod @@ -145,6 +147,10 @@ def _handle_tool_execution(self, initial_response, messages: List, tool_manager) """ Handle execution of tool calls and update message history. + Executes ALL tool calls before deciding flow control. This ensures the + Anthropic API receives tool_result blocks for every tool_use block, even + if some tools fail. + Args: initial_response: The response containing tool use requests messages: Current message history @@ -157,46 +163,54 @@ def _handle_tool_execution(self, initial_response, messages: List, tool_manager) # Add AI's tool use response messages.append({"role": "assistant", "content": initial_response.content}) - # Execute all tool calls and collect results + # Execute ALL tool calls and collect results tool_results = [] + direct_return_result = None + has_error = False + for content_block in initial_response.content: - if content_block.type == "tool_use": - try: - tool_result = tool_manager.execute_tool( - content_block.name, **content_block.input - ) - - tool_results.append( - { - "type": "tool_result", - "tool_use_id": content_block.id, - "content": tool_result, - } - ) - - # Return outline tool results directly to avoid summarization - if content_block.name == "get_course_outline": - if tool_results: - messages.append({"role": "user", "content": tool_results}) - return messages, False, tool_result - - except Exception as e: - # Tool execution failed, stop rounds - tool_results.append( - { - "type": "tool_result", - "tool_use_id": content_block.id, - "content": f"Error: Tool execution failed - {str(e)}", - } - ) - # Add tool results and signal to stop - if tool_results: - messages.append({"role": "user", "content": tool_results}) - return messages, False, None - - # Add tool results as single message + if content_block.type != "tool_use": + continue + + try: + tool_result = tool_manager.execute_tool( + content_block.name, **content_block.input + ) + + tool_results.append( + { + "type": "tool_result", + "tool_use_id": content_block.id, + "content": tool_result, + } + ) + + # Mark outline results for direct return (but keep executing remaining tools) + if content_block.name in self.DIRECT_RETURN_TOOLS: + direct_return_result = tool_result + + except Exception as e: + has_error = True + tool_results.append( + { + "type": "tool_result", + "tool_use_id": content_block.id, + "content": f"Error: Tool execution failed - {str(e)}", + "is_error": True, + } + ) + + # Add all tool results as single message if tool_results: messages.append({"role": "user", "content": tool_results}) + # Direct return takes priority (e.g. course outline) + if direct_return_result is not None: + return messages, False, direct_return_result + + # Stop rounds if any tool failed + if has_error: + return messages, False, None + # Continue with next round return messages, True, None diff --git a/backend/tests/test_ai_generator.py b/backend/tests/test_ai_generator.py index 434078d54..12f75cc35 100644 --- a/backend/tests/test_ai_generator.py +++ b/backend/tests/test_ai_generator.py @@ -36,7 +36,7 @@ def sample_tools(): ] -class TestDirectResponses: +class TestNoToolUsage: def test_direct_text_response(self, generator, sample_tools): """When Claude returns text (no tools), returns text directly.""" response = make_anthropic_response( @@ -60,12 +60,11 @@ def test_empty_content_returns_fallback(self, generator, sample_tools): assert "able to generate a response" in result.lower() -class TestToolCalling: +class TestSingleToolRound: def test_tool_use_calls_tool_manager( self, generator, tool_manager, sample_tools ): """When Claude returns tool_use, calls tool_manager.execute_tool().""" - # Round 1: tool_use tool_response = make_anthropic_response( [ { @@ -77,7 +76,6 @@ def test_tool_use_calls_tool_manager( ], stop_reason="tool_use", ) - # Round 2: final text text_response = make_anthropic_response( [{"type": "text", "text": "Neural networks are..."}], stop_reason="end_turn", @@ -160,105 +158,266 @@ def test_course_outline_returns_directly( # Should NOT make a second API call for synthesis assert generator.client.messages.create.call_count == 1 - def test_tool_execution_exception_handled( + +class TestMultiRoundToolCalling: + def test_two_rounds_of_tool_calls( self, generator, tool_manager, sample_tools ): - """When tool_manager raises, error is caught and loop breaks.""" - tool_manager.execute_tool.side_effect = RuntimeError("Tool crashed") - - tool_response = make_anthropic_response( + """Loop executes up to 2 tool rounds before final synthesis call.""" + tool_response_1 = make_anthropic_response( [ { "type": "tool_use", "id": "t1", "name": "search_course_content", - "input": {"query": "test"}, + "input": {"query": "round 1"}, + } + ], + stop_reason="tool_use", + ) + tool_response_2 = make_anthropic_response( + [ + { + "type": "tool_use", + "id": "t2", + "name": "search_course_content", + "input": {"query": "round 2"}, } ], stop_reason="tool_use", ) - # After exception, a final synthesis call is made (no tools) final_response = make_anthropic_response( - [{"type": "text", "text": "I encountered an error."}], + [{"type": "text", "text": "Final answer after 2 rounds."}], stop_reason="end_turn", ) generator.client.messages.create.side_effect = [ - tool_response, + tool_response_1, + tool_response_2, final_response, ] result = generator.generate_response( - query="test", tools=sample_tools, tool_manager=tool_manager + query="complex question", + tools=sample_tools, + tool_manager=tool_manager, ) - # The function should still return (error is handled in _handle_tool_execution) - assert isinstance(result, str) - - def test_api_exception_wrapped_as_runtime_error(self, generator, sample_tools): - """When client.messages.create() raises APIError, it's wrapped as RuntimeError with context.""" - generator.client.messages.create.side_effect = anthropic.APIError( - message="rate limit exceeded", - request=MagicMock(), - body=None, - ) + assert result == "Final answer after 2 rounds." + # 2 tool rounds + 1 final synthesis = 3 API calls + assert generator.client.messages.create.call_count == 3 + assert tool_manager.execute_tool.call_count == 2 - with pytest.raises(RuntimeError, match="Anthropic API error"): - generator.generate_response(query="test", tools=sample_tools) + def test_messages_accumulate_across_rounds( + self, generator, tool_manager, sample_tools + ): + """2nd API call's messages kwarg contains tool results from round 1.""" + tool_manager.execute_tool.return_value = "Result from round 1" - def test_auth_exception_wrapped_with_context(self, generator, sample_tools): - """When client.messages.create() raises AuthenticationError, it's wrapped with auth context.""" - generator.client.messages.create.side_effect = anthropic.AuthenticationError( - message="invalid api key", - response=MagicMock(status_code=401, headers={}), - body=None, + tool_response_1 = make_anthropic_response( + [ + { + "type": "tool_use", + "id": "t1", + "name": "search_course_content", + "input": {"query": "round 1"}, + } + ], + stop_reason="tool_use", + ) + text_response = make_anthropic_response( + [{"type": "text", "text": "Synthesized answer."}], + stop_reason="end_turn", ) + generator.client.messages.create.side_effect = [ + tool_response_1, + text_response, + ] - with pytest.raises(RuntimeError, match="authentication failed"): - generator.generate_response(query="test", tools=sample_tools) + generator.generate_response( + query="test query", + tools=sample_tools, + tool_manager=tool_manager, + ) - def test_two_rounds_of_tool_calls( + # The 2nd API call should have accumulated messages + second_call_kwargs = generator.client.messages.create.call_args_list[1][1] + msgs = second_call_kwargs["messages"] + + # Should be: user query, assistant tool_use, user tool_result + assert len(msgs) == 3 + assert msgs[0] == {"role": "user", "content": "test query"} + assert msgs[1]["role"] == "assistant" + assert msgs[2]["role"] == "user" + # The tool_result content should contain our result + tool_result_content = msgs[2]["content"] + assert len(tool_result_content) == 1 + assert tool_result_content[0]["type"] == "tool_result" + assert tool_result_content[0]["content"] == "Result from round 1" + + def test_parallel_tool_calls_all_executed( self, generator, tool_manager, sample_tools ): - """Loop executes up to 2 tool rounds before final synthesis call.""" - tool_response_1 = make_anthropic_response( + """When Claude calls 2 tools in one response, both execute.""" + tool_manager.execute_tool.side_effect = ["Result A", "Result B"] + + parallel_response = make_anthropic_response( [ { "type": "tool_use", "id": "t1", "name": "search_course_content", - "input": {"query": "round 1"}, - } + "input": {"query": "topic A"}, + }, + { + "type": "tool_use", + "id": "t2", + "name": "search_course_content", + "input": {"query": "topic B"}, + }, ], stop_reason="tool_use", ) - tool_response_2 = make_anthropic_response( + synthesis_response = make_anthropic_response( + [{"type": "text", "text": "Combined answer."}], + stop_reason="end_turn", + ) + generator.client.messages.create.side_effect = [ + parallel_response, + synthesis_response, + ] + + result = generator.generate_response( + query="compare topics", + tools=sample_tools, + tool_manager=tool_manager, + ) + + assert result == "Combined answer." + assert tool_manager.execute_tool.call_count == 2 + tool_manager.execute_tool.assert_any_call( + "search_course_content", query="topic A" + ) + tool_manager.execute_tool.assert_any_call( + "search_course_content", query="topic B" + ) + + # Verify both results sent back to API + second_call_msgs = generator.client.messages.create.call_args_list[1][1]["messages"] + tool_results_msg = second_call_msgs[-1]["content"] + assert len(tool_results_msg) == 2 + assert tool_results_msg[0]["content"] == "Result A" + assert tool_results_msg[1]["content"] == "Result B" + + def test_parallel_tools_one_fails_still_returns_all_results( + self, generator, tool_manager, sample_tools + ): + """One tool fails -> error sent for that tool, successful result still included.""" + tool_manager.execute_tool.side_effect = [ + "Success result", + RuntimeError("Tool B crashed"), + ] + + parallel_response = make_anthropic_response( [ + { + "type": "tool_use", + "id": "t1", + "name": "search_course_content", + "input": {"query": "good query"}, + }, { "type": "tool_use", "id": "t2", "name": "search_course_content", - "input": {"query": "round 2"}, - } + "input": {"query": "bad query"}, + }, ], stop_reason="tool_use", ) final_response = make_anthropic_response( - [{"type": "text", "text": "Final answer after 2 rounds."}], + [{"type": "text", "text": "Partial answer with error context."}], stop_reason="end_turn", ) generator.client.messages.create.side_effect = [ - tool_response_1, - tool_response_2, + parallel_response, final_response, ] result = generator.generate_response( - query="complex question", + query="multi tool query", tools=sample_tools, tool_manager=tool_manager, ) - assert result == "Final answer after 2 rounds." - # 2 tool rounds + 1 final synthesis = 3 API calls - assert generator.client.messages.create.call_count == 3 + assert isinstance(result, str) + # Both tools were attempted assert tool_manager.execute_tool.call_count == 2 + + # Verify both results (success + error) sent back to API + second_call_msgs = generator.client.messages.create.call_args_list[1][1]["messages"] + tool_results_msg = second_call_msgs[-1]["content"] + assert len(tool_results_msg) == 2 + # First tool succeeded + assert tool_results_msg[0]["content"] == "Success result" + assert "is_error" not in tool_results_msg[0] + # Second tool has error + assert "Error" in tool_results_msg[1]["content"] + assert tool_results_msg[1]["is_error"] is True + + +class TestErrorHandling: + def test_tool_execution_exception_handled( + self, generator, tool_manager, sample_tools + ): + """When tool_manager raises, error is caught and loop breaks.""" + tool_manager.execute_tool.side_effect = RuntimeError("Tool crashed") + + tool_response = make_anthropic_response( + [ + { + "type": "tool_use", + "id": "t1", + "name": "search_course_content", + "input": {"query": "test"}, + } + ], + stop_reason="tool_use", + ) + # After exception, a final synthesis call is made (no tools) + final_response = make_anthropic_response( + [{"type": "text", "text": "I encountered an error."}], + stop_reason="end_turn", + ) + generator.client.messages.create.side_effect = [ + tool_response, + final_response, + ] + + result = generator.generate_response( + query="test", tools=sample_tools, tool_manager=tool_manager + ) + + # The function should still return (error is handled in _handle_tool_execution) + assert isinstance(result, str) + + def test_api_exception_wrapped_as_runtime_error(self, generator, sample_tools): + """When client.messages.create() raises APIError, it's wrapped as RuntimeError with context.""" + generator.client.messages.create.side_effect = anthropic.APIError( + message="rate limit exceeded", + request=MagicMock(), + body=None, + ) + + with pytest.raises(RuntimeError, match="Anthropic API error"): + generator.generate_response(query="test", tools=sample_tools) + + def test_auth_exception_wrapped_with_context(self, generator, sample_tools): + """When client.messages.create() raises AuthenticationError, it's wrapped with auth context.""" + generator.client.messages.create.side_effect = anthropic.AuthenticationError( + message="invalid api key", + response=MagicMock(status_code=401, headers={}), + body=None, + ) + + with pytest.raises(RuntimeError, match="authentication failed"): + generator.generate_response(query="test", tools=sample_tools) From 28726ca9bd4d437e00a40b2704af0ffc9dcccf7b Mon Sep 17 00:00:00 2001 From: kp1729 Date: Sun, 15 Feb 2026 22:43:58 -0800 Subject: [PATCH 09/16] Add API endpoint tests, pytest config, and shared test fixtures - Add test_api_endpoints.py with 10 tests covering /api/query, /api/courses, and /api/session/clear endpoints using a standalone test app to avoid static file mount issues - Enhance conftest.py with shared fixtures (mock_config, mock_rag_system, mock_vector_store) - Add pytest.ini_options in pyproject.toml for testpaths and pythonpath - Add httpx dependency for FastAPI TestClient Co-Authored-By: Claude Opus 4.6 --- backend/tests/conftest.py | 37 ++++++ backend/tests/test_api_endpoints.py | 172 ++++++++++++++++++++++++++++ pyproject.toml | 9 ++ uv.lock | 2 + 4 files changed, 220 insertions(+) create mode 100644 backend/tests/test_api_endpoints.py diff --git a/backend/tests/conftest.py b/backend/tests/conftest.py index facfd5f45..1cdf8ab3c 100644 --- a/backend/tests/conftest.py +++ b/backend/tests/conftest.py @@ -4,3 +4,40 @@ # Add backend and tests directories to path so imports work sys.path.insert(0, os.path.join(os.path.dirname(__file__), "..")) sys.path.insert(0, os.path.dirname(__file__)) + +import pytest +from unittest.mock import MagicMock, patch +from helpers import MockConfig, make_valid_search_results + + +@pytest.fixture +def mock_config(): + """Shared MockConfig instance.""" + return MockConfig() + + +@pytest.fixture +def mock_rag_system(): + """A MagicMock standing in for RAGSystem with pre-wired sub-components.""" + rag = MagicMock() + rag.session_manager.create_session.return_value = "test-session-123" + rag.query.return_value = ( + "This is a test answer.", + ["Source A", "Source B"], + ["http://example.com/a", "http://example.com/b"], + ) + rag.get_course_analytics.return_value = { + "total_courses": 2, + "course_titles": ["Course A", "Course B"], + } + return rag + + +@pytest.fixture +def mock_vector_store(): + """A MagicMock standing in for VectorStore.""" + store = MagicMock() + store.get_course_count.return_value = 2 + store.get_existing_course_titles.return_value = ["Course A", "Course B"] + store.search.return_value = make_valid_search_results(2) + return store diff --git a/backend/tests/test_api_endpoints.py b/backend/tests/test_api_endpoints.py new file mode 100644 index 000000000..f7259a47b --- /dev/null +++ b/backend/tests/test_api_endpoints.py @@ -0,0 +1,172 @@ +"""Tests for FastAPI API endpoints. + +Because the production app.py mounts static files from ../frontend (which +doesn't exist in the test environment), we define a lightweight test app that +mirrors the endpoint logic and wires in a mock RAGSystem. +""" + +import pytest +from unittest.mock import MagicMock +from fastapi import FastAPI, HTTPException +from fastapi.testclient import TestClient +from pydantic import BaseModel +from typing import List, Optional, Dict, Union + + +# --------------------------------------------------------------------------- +# Pydantic models (duplicated from app.py to avoid import side-effects) +# --------------------------------------------------------------------------- + +class QueryRequest(BaseModel): + query: str + session_id: Optional[str] = None + + +class QueryResponse(BaseModel): + answer: str + sources: List[Union[str, Dict[str, str]]] + session_id: str + + +class CourseStats(BaseModel): + total_courses: int + course_titles: List[str] + + +class ClearSessionRequest(BaseModel): + session_id: str + + +# --------------------------------------------------------------------------- +# Test app factory +# --------------------------------------------------------------------------- + +def _create_test_app(rag_system: MagicMock) -> FastAPI: + """Build a minimal FastAPI app with the same endpoints as production.""" + test_app = FastAPI() + + @test_app.post("/api/query", response_model=QueryResponse) + async def query_documents(request: QueryRequest): + try: + session_id = request.session_id + if not session_id: + session_id = rag_system.session_manager.create_session() + answer, sources, _links = rag_system.query(request.query, session_id) + return QueryResponse(answer=answer, sources=sources, session_id=session_id) + except Exception as e: + raise HTTPException(status_code=500, detail=str(e)) + + @test_app.get("/api/courses", response_model=CourseStats) + async def get_course_stats(): + try: + analytics = rag_system.get_course_analytics() + return CourseStats( + total_courses=analytics["total_courses"], + course_titles=analytics["course_titles"], + ) + except Exception as e: + raise HTTPException(status_code=500, detail=str(e)) + + @test_app.post("/api/session/clear") + async def clear_session(request: ClearSessionRequest): + try: + rag_system.session_manager.clear_session(request.session_id) + return {"status": "success", "message": f"Session {request.session_id} cleared"} + except Exception as e: + raise HTTPException(status_code=500, detail=str(e)) + + return test_app + + +# --------------------------------------------------------------------------- +# Fixtures +# --------------------------------------------------------------------------- + +@pytest.fixture +def client(mock_rag_system): + """TestClient wired to the mock RAG system.""" + app = _create_test_app(mock_rag_system) + return TestClient(app) + + +# --------------------------------------------------------------------------- +# /api/query +# --------------------------------------------------------------------------- + +class TestQueryEndpoint: + def test_query_with_session_id(self, client, mock_rag_system): + resp = client.post("/api/query", json={"query": "What is RAG?", "session_id": "s1"}) + assert resp.status_code == 200 + data = resp.json() + assert data["answer"] == "This is a test answer." + assert data["sources"] == ["Source A", "Source B"] + assert data["session_id"] == "s1" + mock_rag_system.query.assert_called_once_with("What is RAG?", "s1") + + def test_query_creates_session_when_missing(self, client, mock_rag_system): + resp = client.post("/api/query", json={"query": "Hello"}) + assert resp.status_code == 200 + data = resp.json() + assert data["session_id"] == "test-session-123" + mock_rag_system.session_manager.create_session.assert_called_once() + + def test_query_returns_dict_sources(self, client, mock_rag_system): + mock_rag_system.query.return_value = ( + "Answer", + [{"title": "Lesson 1", "link": "http://example.com"}], + [], + ) + resp = client.post("/api/query", json={"query": "test"}) + assert resp.status_code == 200 + assert resp.json()["sources"] == [{"title": "Lesson 1", "link": "http://example.com"}] + + def test_query_missing_body_returns_422(self, client): + resp = client.post("/api/query", json={}) + assert resp.status_code == 422 + + def test_query_rag_error_returns_500(self, client, mock_rag_system): + mock_rag_system.query.side_effect = RuntimeError("boom") + resp = client.post("/api/query", json={"query": "fail", "session_id": "s1"}) + assert resp.status_code == 500 + assert "boom" in resp.json()["detail"] + + +# --------------------------------------------------------------------------- +# /api/courses +# --------------------------------------------------------------------------- + +class TestCoursesEndpoint: + def test_get_courses(self, client): + resp = client.get("/api/courses") + assert resp.status_code == 200 + data = resp.json() + assert data["total_courses"] == 2 + assert data["course_titles"] == ["Course A", "Course B"] + + def test_courses_error_returns_500(self, client, mock_rag_system): + mock_rag_system.get_course_analytics.side_effect = RuntimeError("db down") + resp = client.get("/api/courses") + assert resp.status_code == 500 + assert "db down" in resp.json()["detail"] + + +# --------------------------------------------------------------------------- +# /api/session/clear +# --------------------------------------------------------------------------- + +class TestClearSessionEndpoint: + def test_clear_session_success(self, client, mock_rag_system): + resp = client.post("/api/session/clear", json={"session_id": "s1"}) + assert resp.status_code == 200 + data = resp.json() + assert data["status"] == "success" + mock_rag_system.session_manager.clear_session.assert_called_once_with("s1") + + def test_clear_session_missing_id_returns_422(self, client): + resp = client.post("/api/session/clear", json={}) + assert resp.status_code == 422 + + def test_clear_session_error_returns_500(self, client, mock_rag_system): + mock_rag_system.session_manager.clear_session.side_effect = KeyError("no session") + resp = client.post("/api/session/clear", json={"session_id": "bad"}) + assert resp.status_code == 500 diff --git a/pyproject.toml b/pyproject.toml index 1344b49a6..9b7cd031e 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -13,4 +13,13 @@ dependencies = [ "python-multipart==0.0.20", "python-dotenv==1.1.1", "pytest>=8.0", + "httpx>=0.27.0", +] + +[tool.pytest.ini_options] +testpaths = ["backend/tests"] +pythonpath = ["backend"] +filterwarnings = [ + "ignore::DeprecationWarning", + "ignore:resource_tracker:UserWarning", ] diff --git a/uv.lock b/uv.lock index c06a7c150..14b05200b 100644 --- a/uv.lock +++ b/uv.lock @@ -1589,6 +1589,7 @@ dependencies = [ { name = "anthropic" }, { name = "chromadb" }, { name = "fastapi" }, + { name = "httpx" }, { name = "pytest" }, { name = "python-dotenv" }, { name = "python-multipart" }, @@ -1601,6 +1602,7 @@ requires-dist = [ { name = "anthropic", specifier = "==0.58.2" }, { name = "chromadb", specifier = "==1.0.15" }, { name = "fastapi", specifier = "==0.116.1" }, + { name = "httpx", specifier = ">=0.27.0" }, { name = "pytest", specifier = ">=8.0" }, { name = "python-dotenv", specifier = "==1.1.1" }, { name = "python-multipart", specifier = "==0.0.20" }, From 8106958f35b1cb5859e7b1a1bc16fd58aea243fb Mon Sep 17 00:00:00 2001 From: kp1729 Date: Sun, 15 Feb 2026 22:44:11 -0800 Subject: [PATCH 10/16] Add black formatter and apply consistent code formatting Set up black as a dev dependency with project configuration, create scripts/quality.sh for running format checks and tests, and apply black formatting across all 11 Python source files. Co-Authored-By: Claude Opus 4.6 --- backend/app.py | 42 +++-- backend/config.py | 19 +- backend/document_processor.py | 151 ++++++++-------- backend/models.py | 20 ++- backend/rag_system.py | 79 +++++---- backend/search_tools.py | 66 +++---- backend/session_manager.py | 33 ++-- backend/tests/test_ai_generator.py | 20 +-- backend/tests/test_rag_integration.py | 19 +- backend/tests/test_search_tools.py | 8 +- backend/vector_store.py | 246 ++++++++++++++------------ pyproject.toml | 9 + scripts/quality.sh | 68 +++++++ uv.lock | 86 +++++++++ 14 files changed, 548 insertions(+), 318 deletions(-) create mode 100644 scripts/quality.sh diff --git a/backend/app.py b/backend/app.py index 4644c971b..352ee097c 100644 --- a/backend/app.py +++ b/backend/app.py @@ -1,4 +1,5 @@ import warnings + warnings.filterwarnings("ignore", message="resource_tracker: There appear to be.*") from fastapi import FastAPI, HTTPException @@ -16,10 +17,7 @@ app = FastAPI(title="Course Materials RAG System", root_path="") # Add trusted host middleware for proxy -app.add_middleware( - TrustedHostMiddleware, - allowed_hosts=["*"] -) +app.add_middleware(TrustedHostMiddleware, allowed_hosts=["*"]) # Enable CORS with proper settings for proxy app.add_middleware( @@ -34,29 +32,39 @@ # Initialize RAG system rag_system = RAGSystem(config) + # Pydantic models for request/response class QueryRequest(BaseModel): """Request model for course queries""" + query: str session_id: Optional[str] = None + class QueryResponse(BaseModel): """Response model for course queries""" + answer: str sources: List[Union[str, Dict[str, str]]] # Support both strings and dicts session_id: str + class CourseStats(BaseModel): """Response model for course statistics""" + total_courses: int course_titles: List[str] + class ClearSessionRequest(BaseModel): """Request model for clearing a session""" + session_id: str + # API Endpoints + @app.post("/api/query", response_model=QueryResponse) async def query_documents(request: QueryRequest): """Process a query and return response with sources""" @@ -65,18 +73,15 @@ async def query_documents(request: QueryRequest): session_id = request.session_id if not session_id: session_id = rag_system.session_manager.create_session() - + # Process query using RAG system answer, sources, source_links = rag_system.query(request.query, session_id) - - return QueryResponse( - answer=answer, - sources=sources, - session_id=session_id - ) + + return QueryResponse(answer=answer, sources=sources, session_id=session_id) except Exception as e: raise HTTPException(status_code=500, detail=str(e)) + @app.get("/api/courses", response_model=CourseStats) async def get_course_stats(): """Get course analytics and statistics""" @@ -84,11 +89,12 @@ async def get_course_stats(): analytics = rag_system.get_course_analytics() return CourseStats( total_courses=analytics["total_courses"], - course_titles=analytics["course_titles"] + course_titles=analytics["course_titles"], ) except Exception as e: raise HTTPException(status_code=500, detail=str(e)) + @app.post("/api/session/clear") async def clear_session(request: ClearSessionRequest): """Clear a conversation session""" @@ -98,6 +104,7 @@ async def clear_session(request: ClearSessionRequest): except Exception as e: raise HTTPException(status_code=500, detail=str(e)) + @app.on_event("startup") async def startup_event(): """Load initial documents on startup""" @@ -105,11 +112,14 @@ async def startup_event(): if os.path.exists(docs_path): print("Loading initial documents...") try: - courses, chunks = rag_system.add_course_folder(docs_path, clear_existing=False) + courses, chunks = rag_system.add_course_folder( + docs_path, clear_existing=False + ) print(f"Loaded {courses} courses with {chunks} chunks") except Exception as e: print(f"Error loading documents: {e}") + # Custom static file handler with no-cache headers for development from fastapi.staticfiles import StaticFiles from fastapi.responses import FileResponse @@ -126,7 +136,7 @@ async def get_response(self, path: str, scope): response.headers["Pragma"] = "no-cache" response.headers["Expires"] = "0" return response - - + + # Serve static files for the frontend -app.mount("/", DevStaticFiles(directory="../frontend", html=True), name="static") \ No newline at end of file +app.mount("/", DevStaticFiles(directory="../frontend", html=True), name="static") diff --git a/backend/config.py b/backend/config.py index d9f6392ef..7379e7133 100644 --- a/backend/config.py +++ b/backend/config.py @@ -5,25 +5,26 @@ # Load environment variables from .env file load_dotenv() + @dataclass class Config: """Configuration settings for the RAG system""" + # Anthropic API settings ANTHROPIC_API_KEY: str = os.getenv("ANTHROPIC_API_KEY", "") ANTHROPIC_MODEL: str = "claude-sonnet-4-20250514" - + # Embedding model settings EMBEDDING_MODEL: str = "all-MiniLM-L6-v2" - + # Document processing settings - CHUNK_SIZE: int = 800 # Size of text chunks for vector storage - CHUNK_OVERLAP: int = 100 # Characters to overlap between chunks - MAX_RESULTS: int = 5 # Maximum search results to return - MAX_HISTORY: int = 2 # Number of conversation messages to remember - + CHUNK_SIZE: int = 800 # Size of text chunks for vector storage + CHUNK_OVERLAP: int = 100 # Characters to overlap between chunks + MAX_RESULTS: int = 5 # Maximum search results to return + MAX_HISTORY: int = 2 # Number of conversation messages to remember + # Database paths CHROMA_PATH: str = "./chroma_db" # ChromaDB storage location -config = Config() - +config = Config() diff --git a/backend/document_processor.py b/backend/document_processor.py index 266e85904..32c6648ae 100644 --- a/backend/document_processor.py +++ b/backend/document_processor.py @@ -3,81 +3,84 @@ from typing import List, Tuple from models import Course, Lesson, CourseChunk + class DocumentProcessor: """Processes course documents and extracts structured information""" - + def __init__(self, chunk_size: int, chunk_overlap: int): self.chunk_size = chunk_size self.chunk_overlap = chunk_overlap - + def read_file(self, file_path: str) -> str: """Read content from file with UTF-8 encoding""" try: - with open(file_path, 'r', encoding='utf-8') as file: + with open(file_path, "r", encoding="utf-8") as file: return file.read() except UnicodeDecodeError: # If UTF-8 fails, try with error handling - with open(file_path, 'r', encoding='utf-8', errors='ignore') as file: + with open(file_path, "r", encoding="utf-8", errors="ignore") as file: return file.read() - - def chunk_text(self, text: str) -> List[str]: """Split text into sentence-based chunks with overlap using config settings""" - + # Clean up the text - text = re.sub(r'\s+', ' ', text.strip()) # Normalize whitespace - + text = re.sub(r"\s+", " ", text.strip()) # Normalize whitespace + # Better sentence splitting that handles abbreviations # This regex looks for periods followed by whitespace and capital letters # but ignores common abbreviations - sentence_endings = re.compile(r'(? self.chunk_size and current_chunk: break - + current_chunk.append(sentence) current_size += total_addition - + # Add chunk if we have content if current_chunk: - chunks.append(' '.join(current_chunk)) - + chunks.append(" ".join(current_chunk)) + # Calculate overlap for next chunk - if hasattr(self, 'chunk_overlap') and self.chunk_overlap > 0: + if hasattr(self, "chunk_overlap") and self.chunk_overlap > 0: # Find how many sentences to overlap overlap_size = 0 overlap_sentences = 0 - + # Count backwards from end of current chunk for k in range(len(current_chunk) - 1, -1, -1): - sentence_len = len(current_chunk[k]) + (1 if k < len(current_chunk) - 1 else 0) + sentence_len = len(current_chunk[k]) + ( + 1 if k < len(current_chunk) - 1 else 0 + ) if overlap_size + sentence_len <= self.chunk_overlap: overlap_size += sentence_len overlap_sentences += 1 else: break - + # Move start position considering overlap next_start = i + len(current_chunk) - overlap_sentences i = max(next_start, i + 1) # Ensure we make progress @@ -87,14 +90,12 @@ def chunk_text(self, text: str) -> List[str]: else: # No sentences fit, move to next i += 1 - - return chunks - - + return chunks - - def process_course_document(self, file_path: str) -> Tuple[Course, List[CourseChunk]]: + def process_course_document( + self, file_path: str + ) -> Tuple[Course, List[CourseChunk]]: """ Process a course document with expected format: Line 1: Course Title: [title] @@ -104,47 +105,51 @@ def process_course_document(self, file_path: str) -> Tuple[Course, List[CourseCh """ content = self.read_file(file_path) filename = os.path.basename(file_path) - - lines = content.strip().split('\n') - + + lines = content.strip().split("\n") + # Extract course metadata from first three lines course_title = filename # Default fallback course_link = None instructor_name = "Unknown" - + # Parse course title from first line if len(lines) >= 1 and lines[0].strip(): - title_match = re.match(r'^Course Title:\s*(.+)$', lines[0].strip(), re.IGNORECASE) + title_match = re.match( + r"^Course Title:\s*(.+)$", lines[0].strip(), re.IGNORECASE + ) if title_match: course_title = title_match.group(1).strip() else: course_title = lines[0].strip() - + # Parse remaining lines for course metadata for i in range(1, min(len(lines), 4)): # Check first 4 lines for metadata line = lines[i].strip() if not line: continue - + # Try to match course link - link_match = re.match(r'^Course Link:\s*(.+)$', line, re.IGNORECASE) + link_match = re.match(r"^Course Link:\s*(.+)$", line, re.IGNORECASE) if link_match: course_link = link_match.group(1).strip() continue - + # Try to match instructor - instructor_match = re.match(r'^Course Instructor:\s*(.+)$', line, re.IGNORECASE) + instructor_match = re.match( + r"^Course Instructor:\s*(.+)$", line, re.IGNORECASE + ) if instructor_match: instructor_name = instructor_match.group(1).strip() continue - + # Create course object with title as ID course = Course( title=course_title, course_link=course_link, - instructor=instructor_name if instructor_name != "Unknown" else None + instructor=instructor_name if instructor_name != "Unknown" else None, ) - + # Process lessons and create chunks course_chunks = [] current_lesson = None @@ -152,108 +157,114 @@ def process_course_document(self, file_path: str) -> Tuple[Course, List[CourseCh lesson_link = None lesson_content = [] chunk_counter = 0 - + # Start processing from line 4 (after metadata) start_index = 3 if len(lines) > 3 and not lines[3].strip(): start_index = 4 # Skip empty line after instructor - + i = start_index while i < len(lines): line = lines[i] - + # Check for lesson markers (e.g., "Lesson 0: Introduction") - lesson_match = re.match(r'^Lesson\s+(\d+):\s*(.+)$', line.strip(), re.IGNORECASE) - + lesson_match = re.match( + r"^Lesson\s+(\d+):\s*(.+)$", line.strip(), re.IGNORECASE + ) + if lesson_match: # Process previous lesson if it exists if current_lesson is not None and lesson_content: - lesson_text = '\n'.join(lesson_content).strip() + lesson_text = "\n".join(lesson_content).strip() if lesson_text: # Add lesson to course lesson = Lesson( lesson_number=current_lesson, title=lesson_title, - lesson_link=lesson_link + lesson_link=lesson_link, ) course.lessons.append(lesson) - + # Create chunks for this lesson chunks = self.chunk_text(lesson_text) for idx, chunk in enumerate(chunks): # For the first chunk of each lesson, add lesson context if idx == 0: - chunk_with_context = f"Lesson {current_lesson} content: {chunk}" + chunk_with_context = ( + f"Lesson {current_lesson} content: {chunk}" + ) else: chunk_with_context = chunk - + course_chunk = CourseChunk( content=chunk_with_context, course_title=course.title, lesson_number=current_lesson, - chunk_index=chunk_counter + chunk_index=chunk_counter, ) course_chunks.append(course_chunk) chunk_counter += 1 - + # Start new lesson current_lesson = int(lesson_match.group(1)) lesson_title = lesson_match.group(2).strip() lesson_link = None - + # Check if next line is a lesson link if i + 1 < len(lines): next_line = lines[i + 1].strip() - link_match = re.match(r'^Lesson Link:\s*(.+)$', next_line, re.IGNORECASE) + link_match = re.match( + r"^Lesson Link:\s*(.+)$", next_line, re.IGNORECASE + ) if link_match: lesson_link = link_match.group(1).strip() i += 1 # Skip the link line so it's not added to content - + lesson_content = [] else: # Add line to current lesson content lesson_content.append(line) - + i += 1 - + # Process the last lesson if current_lesson is not None and lesson_content: - lesson_text = '\n'.join(lesson_content).strip() + lesson_text = "\n".join(lesson_content).strip() if lesson_text: lesson = Lesson( lesson_number=current_lesson, title=lesson_title, - lesson_link=lesson_link + lesson_link=lesson_link, ) course.lessons.append(lesson) - + chunks = self.chunk_text(lesson_text) for idx, chunk in enumerate(chunks): # For any chunk of each lesson, add lesson context & course title - + chunk_with_context = f"Course {course_title} Lesson {current_lesson} content: {chunk}" - + course_chunk = CourseChunk( content=chunk_with_context, course_title=course.title, lesson_number=current_lesson, - chunk_index=chunk_counter + chunk_index=chunk_counter, ) course_chunks.append(course_chunk) chunk_counter += 1 - + # If no lessons found, treat entire content as one document if not course_chunks and len(lines) > 2: - remaining_content = '\n'.join(lines[start_index:]).strip() + remaining_content = "\n".join(lines[start_index:]).strip() if remaining_content: chunks = self.chunk_text(remaining_content) for chunk in chunks: course_chunk = CourseChunk( content=chunk, course_title=course.title, - chunk_index=chunk_counter + chunk_index=chunk_counter, ) course_chunks.append(course_chunk) chunk_counter += 1 - + return course, course_chunks diff --git a/backend/models.py b/backend/models.py index 7f7126fa3..12ae8113e 100644 --- a/backend/models.py +++ b/backend/models.py @@ -1,22 +1,28 @@ from typing import List, Dict, Optional from pydantic import BaseModel + class Lesson(BaseModel): """Represents a lesson within a course""" + lesson_number: int # Sequential lesson number (1, 2, 3, etc.) - title: str # Lesson title + title: str # Lesson title lesson_link: Optional[str] = None # URL link to the lesson + class Course(BaseModel): """Represents a complete course with its lessons""" - title: str # Full course title (used as unique identifier) + + title: str # Full course title (used as unique identifier) course_link: Optional[str] = None # URL link to the course instructor: Optional[str] = None # Course instructor name (optional metadata) - lessons: List[Lesson] = [] # List of lessons in this course + lessons: List[Lesson] = [] # List of lessons in this course + class CourseChunk(BaseModel): """Represents a text chunk from a course for vector storage""" - content: str # The actual text content - course_title: str # Which course this chunk belongs to - lesson_number: Optional[int] = None # Which lesson this chunk is from - chunk_index: int # Position of this chunk in the document \ No newline at end of file + + content: str # The actual text content + course_title: str # Which course this chunk belongs to + lesson_number: Optional[int] = None # Which lesson this chunk is from + chunk_index: int # Position of this chunk in the document diff --git a/backend/rag_system.py b/backend/rag_system.py index 0ef933c88..c1322a9f2 100644 --- a/backend/rag_system.py +++ b/backend/rag_system.py @@ -8,104 +8,123 @@ from search_tools import ToolManager, CourseSearchTool, CourseOutlineTool from models import Course, Lesson, CourseChunk + class RAGSystem: """Main orchestrator for the Retrieval-Augmented Generation system""" - + def __init__(self, config): self.config = config - + # Initialize core components - self.document_processor = DocumentProcessor(config.CHUNK_SIZE, config.CHUNK_OVERLAP) - self.vector_store = VectorStore(config.CHROMA_PATH, config.EMBEDDING_MODEL, config.MAX_RESULTS) - self.ai_generator = AIGenerator(config.ANTHROPIC_API_KEY, config.ANTHROPIC_MODEL) + self.document_processor = DocumentProcessor( + config.CHUNK_SIZE, config.CHUNK_OVERLAP + ) + self.vector_store = VectorStore( + config.CHROMA_PATH, config.EMBEDDING_MODEL, config.MAX_RESULTS + ) + self.ai_generator = AIGenerator( + config.ANTHROPIC_API_KEY, config.ANTHROPIC_MODEL + ) self.session_manager = SessionManager(config.MAX_HISTORY) - + # Initialize search tools self.tool_manager = ToolManager() self.search_tool = CourseSearchTool(self.vector_store) self.outline_tool = CourseOutlineTool(self.vector_store) self.tool_manager.register_tool(self.search_tool) self.tool_manager.register_tool(self.outline_tool) - + def add_course_document(self, file_path: str) -> Tuple[Course, int]: """ Add a single course document to the knowledge base. - + Args: file_path: Path to the course document - + Returns: Tuple of (Course object, number of chunks created) """ try: # Process the document - course, course_chunks = self.document_processor.process_course_document(file_path) - + course, course_chunks = self.document_processor.process_course_document( + file_path + ) + # Add course metadata to vector store for semantic search self.vector_store.add_course_metadata(course) - + # Add course content chunks to vector store self.vector_store.add_course_content(course_chunks) - + return course, len(course_chunks) except Exception as e: print(f"Error processing course document {file_path}: {e}") return None, 0 - - def add_course_folder(self, folder_path: str, clear_existing: bool = False) -> Tuple[int, int]: + + def add_course_folder( + self, folder_path: str, clear_existing: bool = False + ) -> Tuple[int, int]: """ Add all course documents from a folder. - + Args: folder_path: Path to folder containing course documents clear_existing: Whether to clear existing data first - + Returns: Tuple of (total courses added, total chunks created) """ total_courses = 0 total_chunks = 0 - + # Clear existing data if requested if clear_existing: print("Clearing existing data for fresh rebuild...") self.vector_store.clear_all_data() - + if not os.path.exists(folder_path): print(f"Folder {folder_path} does not exist") return 0, 0 - + # Get existing course titles to avoid re-processing existing_course_titles = set(self.vector_store.get_existing_course_titles()) - + # Process each file in the folder for file_name in os.listdir(folder_path): file_path = os.path.join(folder_path, file_name) - if os.path.isfile(file_path) and file_name.lower().endswith(('.pdf', '.docx', '.txt')): + if os.path.isfile(file_path) and file_name.lower().endswith( + (".pdf", ".docx", ".txt") + ): try: # Check if this course might already exist # We'll process the document to get the course ID, but only add if new - course, course_chunks = self.document_processor.process_course_document(file_path) - + course, course_chunks = ( + self.document_processor.process_course_document(file_path) + ) + if course and course.title not in existing_course_titles: # This is a new course - add it to the vector store self.vector_store.add_course_metadata(course) self.vector_store.add_course_content(course_chunks) total_courses += 1 total_chunks += len(course_chunks) - print(f"Added new course: {course.title} ({len(course_chunks)} chunks)") + print( + f"Added new course: {course.title} ({len(course_chunks)} chunks)" + ) existing_course_titles.add(course.title) elif course: print(f"Course already exists: {course.title} - skipping") except Exception as e: print(f"Error processing {file_name}: {e}") - + return total_courses, total_chunks - - def query(self, query: str, session_id: Optional[str] = None) -> Tuple[str, List[str]]: + + def query( + self, query: str, session_id: Optional[str] = None + ) -> Tuple[str, List[str]]: """ Process a user query using the RAG system with tool-based search. - + Args: query: User's question session_id: Optional session ID for conversation context @@ -148,4 +167,4 @@ def get_course_analytics(self) -> Dict: return { "total_courses": self.vector_store.get_course_count(), "course_titles": self.vector_store.get_existing_course_titles(), - } \ No newline at end of file + } diff --git a/backend/search_tools.py b/backend/search_tools.py index 8677bd3b0..d1a606eae 100644 --- a/backend/search_tools.py +++ b/backend/search_tools.py @@ -5,12 +5,12 @@ class Tool(ABC): """Abstract base class for all tools""" - + @abstractmethod def get_tool_definition(self) -> Dict[str, Any]: """Return Anthropic tool definition for this tool""" pass - + @abstractmethod def execute(self, **kwargs) -> str: """Execute the tool with given parameters""" @@ -19,11 +19,11 @@ def execute(self, **kwargs) -> str: class CourseSearchTool(Tool): """Tool for searching course content with semantic course name matching""" - + def __init__(self, vector_store: VectorStore): self.store = vector_store self.last_sources = [] # Track sources from last search - + def get_tool_definition(self) -> Dict[str, Any]: """Return Anthropic tool definition for this tool""" return { @@ -33,46 +33,49 @@ def get_tool_definition(self) -> Dict[str, Any]: "type": "object", "properties": { "query": { - "type": "string", - "description": "What to search for in the course content" + "type": "string", + "description": "What to search for in the course content", }, "course_name": { "type": "string", - "description": "Course title (partial matches work, e.g. 'MCP', 'Introduction')" + "description": "Course title (partial matches work, e.g. 'MCP', 'Introduction')", }, "lesson_number": { "type": "integer", - "description": "Specific lesson number to search within (e.g. 1, 2, 3)" - } + "description": "Specific lesson number to search within (e.g. 1, 2, 3)", + }, }, - "required": ["query"] - } + "required": ["query"], + }, } - - def execute(self, query: str, course_name: Optional[str] = None, lesson_number: Optional[int] = None) -> str: + + def execute( + self, + query: str, + course_name: Optional[str] = None, + lesson_number: Optional[int] = None, + ) -> str: """ Execute the search tool with given parameters. - + Args: query: What to search for course_name: Optional course filter lesson_number: Optional lesson filter - + Returns: Formatted search results or error message """ - + # Use the vector store's unified search interface results = self.store.search( - query=query, - course_name=course_name, - lesson_number=lesson_number + query=query, course_name=course_name, lesson_number=lesson_number ) - + # Handle errors if results.error: return results.error - + # Handle empty results if results.is_empty(): filter_info = "" @@ -81,10 +84,10 @@ def execute(self, query: str, course_name: Optional[str] = None, lesson_number: if lesson_number: filter_info += f" in lesson {lesson_number}" return f"No relevant content found{filter_info}." - + # Format and return results return self._format_results(results) - + def _format_results(self, results: SearchResults) -> str: """Format search results with course and lesson context""" formatted = [] @@ -92,8 +95,8 @@ def _format_results(self, results: SearchResults) -> str: source_links = [] # Track lesson links for the UI for doc, meta in zip(results.documents, results.metadata): - course_title = meta.get('course_title', 'unknown') - lesson_num = meta.get('lesson_number') + course_title = meta.get("course_title", "unknown") + lesson_num = meta.get("lesson_number") # Build context header header = f"[{course_title}" @@ -196,6 +199,7 @@ def execute(self, course_name: str) -> str: except Exception as e: return f"Error retrieving course outline: {str(e)}" + class ToolManager: """Manages available tools for the AI""" @@ -213,19 +217,19 @@ def register_tool(self, tool: Tool): def get_tool_definitions(self) -> list: """Get all tool definitions for Anthropic tool calling""" return [tool.get_tool_definition() for tool in self.tools.values()] - + def execute_tool(self, tool_name: str, **kwargs) -> str: """Execute a tool by name with given parameters""" if tool_name not in self.tools: return f"Tool '{tool_name}' not found" - + return self.tools[tool_name].execute(**kwargs) - + def get_last_sources(self) -> list: """Get sources from the last search operation""" # Check all tools for last_sources attribute for tool in self.tools.values(): - if hasattr(tool, 'last_sources') and tool.last_sources: + if hasattr(tool, "last_sources") and tool.last_sources: return tool.last_sources return [] @@ -240,7 +244,7 @@ def get_last_source_links(self) -> list: def reset_sources(self): """Reset sources from all tools that track sources""" for tool in self.tools.values(): - if hasattr(tool, 'last_sources'): + if hasattr(tool, "last_sources"): tool.last_sources = [] if hasattr(tool, "last_source_links"): - tool.last_source_links = [] \ No newline at end of file + tool.last_source_links = [] diff --git a/backend/session_manager.py b/backend/session_manager.py index a5a96b1a1..9e17f346b 100644 --- a/backend/session_manager.py +++ b/backend/session_manager.py @@ -1,61 +1,66 @@ from typing import Dict, List, Optional from dataclasses import dataclass + @dataclass class Message: """Represents a single message in a conversation""" - role: str # "user" or "assistant" + + role: str # "user" or "assistant" content: str # The message content + class SessionManager: """Manages conversation sessions and message history""" - + def __init__(self, max_history: int = 5): self.max_history = max_history self.sessions: Dict[str, List[Message]] = {} self.session_counter = 0 - + def create_session(self) -> str: """Create a new conversation session""" self.session_counter += 1 session_id = f"session_{self.session_counter}" self.sessions[session_id] = [] return session_id - + def add_message(self, session_id: str, role: str, content: str): """Add a message to the conversation history""" if session_id not in self.sessions: self.sessions[session_id] = [] - + message = Message(role=role, content=content) self.sessions[session_id].append(message) - + # Keep conversation history within limits if len(self.sessions[session_id]) > self.max_history * 2: - self.sessions[session_id] = self.sessions[session_id][-self.max_history * 2:] - + self.sessions[session_id] = self.sessions[session_id][ + -self.max_history * 2 : + ] + def add_exchange(self, session_id: str, user_message: str, assistant_message: str): """Add a complete question-answer exchange""" self.add_message(session_id, "user", user_message) self.add_message(session_id, "assistant", assistant_message) - + def get_conversation_history(self, session_id: Optional[str]) -> Optional[str]: """Get formatted conversation history for a session""" if not session_id or session_id not in self.sessions: return None - + messages = self.sessions[session_id] if not messages: return None - + # Format messages for context formatted_messages = [] for msg in messages: formatted_messages.append(f"{msg.role.title()}: {msg.content}") - + return "\n".join(formatted_messages) - + def clear_session(self, session_id: str): """Clear all messages from a session""" if session_id in self.sessions: - self.sessions[session_id] = [] \ No newline at end of file + self.sessions[session_id] = [] diff --git a/backend/tests/test_ai_generator.py b/backend/tests/test_ai_generator.py index 12f75cc35..1769c71ab 100644 --- a/backend/tests/test_ai_generator.py +++ b/backend/tests/test_ai_generator.py @@ -61,9 +61,7 @@ def test_empty_content_returns_fallback(self, generator, sample_tools): class TestSingleToolRound: - def test_tool_use_calls_tool_manager( - self, generator, tool_manager, sample_tools - ): + def test_tool_use_calls_tool_manager(self, generator, tool_manager, sample_tools): """When Claude returns tool_use, calls tool_manager.execute_tool().""" tool_response = make_anthropic_response( [ @@ -95,9 +93,7 @@ def test_tool_use_calls_tool_manager( "search_course_content", query="neural networks" ) - def test_tool_use_then_synthesis( - self, generator, tool_manager, sample_tools - ): + def test_tool_use_then_synthesis(self, generator, tool_manager, sample_tools): """Round 1: tool_use -> execute -> Round 2: Claude synthesizes answer.""" tool_response = make_anthropic_response( [ @@ -160,9 +156,7 @@ def test_course_outline_returns_directly( class TestMultiRoundToolCalling: - def test_two_rounds_of_tool_calls( - self, generator, tool_manager, sample_tools - ): + def test_two_rounds_of_tool_calls(self, generator, tool_manager, sample_tools): """Loop executes up to 2 tool rounds before final synthesis call.""" tool_response_1 = make_anthropic_response( [ @@ -302,7 +296,9 @@ def test_parallel_tool_calls_all_executed( ) # Verify both results sent back to API - second_call_msgs = generator.client.messages.create.call_args_list[1][1]["messages"] + second_call_msgs = generator.client.messages.create.call_args_list[1][1][ + "messages" + ] tool_results_msg = second_call_msgs[-1]["content"] assert len(tool_results_msg) == 2 assert tool_results_msg[0]["content"] == "Result A" @@ -354,7 +350,9 @@ def test_parallel_tools_one_fails_still_returns_all_results( assert tool_manager.execute_tool.call_count == 2 # Verify both results (success + error) sent back to API - second_call_msgs = generator.client.messages.create.call_args_list[1][1]["messages"] + second_call_msgs = generator.client.messages.create.call_args_list[1][1][ + "messages" + ] tool_results_msg = second_call_msgs[-1]["content"] assert len(tool_results_msg) == 2 # First tool succeeded diff --git a/backend/tests/test_rag_integration.py b/backend/tests/test_rag_integration.py index 79ec2a835..41ad8463d 100644 --- a/backend/tests/test_rag_integration.py +++ b/backend/tests/test_rag_integration.py @@ -26,12 +26,8 @@ def mock_deps(self): rag = RAGSystem(config) # rag.tool_manager is now a MagicMock instance - rag.ai_generator.generate_response.return_value = ( - "This is the answer." - ) - rag.tool_manager.get_last_sources.return_value = [ - "Course A - Lesson 1" - ] + rag.ai_generator.generate_response.return_value = "This is the answer." + rag.tool_manager.get_last_sources.return_value = ["Course A - Lesson 1"] rag.tool_manager.get_last_source_links.return_value = [ "https://example.com/1" ] @@ -59,9 +55,7 @@ def test_query_passes_tools_to_generator(self, mock_deps): rag.query("test question") call_kwargs = rag.ai_generator.generate_response.call_args - assert call_kwargs.kwargs["tools"] == [ - {"name": "search_course_content"} - ] + assert call_kwargs.kwargs["tools"] == [{"name": "search_course_content"}] def test_query_passes_tool_manager(self, mock_deps): """tool_manager instance is passed to generator for tool dispatch.""" @@ -94,9 +88,7 @@ def test_query_resets_sources(self, mock_deps): def test_query_exception_propagates_to_caller(self, mock_deps): """When generator raises, exception propagates (no try/except in query()).""" rag = mock_deps - rag.ai_generator.generate_response.side_effect = Exception( - "API auth failed" - ) + rag.ai_generator.generate_response.side_effect = Exception("API auth failed") with pytest.raises(Exception, match="API auth failed"): rag.query("test question") @@ -112,6 +104,5 @@ def test_query_with_session_passes_history(self, mock_deps): call_kwargs = rag.ai_generator.generate_response.call_args assert ( - call_kwargs.kwargs["conversation_history"] - == "User: hi\nAssistant: hello" + call_kwargs.kwargs["conversation_history"] == "User: hi\nAssistant: hello" ) diff --git a/backend/tests/test_search_tools.py b/backend/tests/test_search_tools.py index 87dd88106..ce6da52a6 100644 --- a/backend/tests/test_search_tools.py +++ b/backend/tests/test_search_tools.py @@ -72,9 +72,7 @@ def test_execute_empty_with_filters(self, search_tool, mock_store): """Empty results with course_name/lesson filters include filter info.""" mock_store.search.return_value = make_search_results() - output = search_tool.execute( - query="topic", course_name="MCP", lesson_number=3 - ) + output = search_tool.execute(query="topic", course_name="MCP", lesson_number=3) assert "in course 'MCP'" in output assert "in lesson 3" in output @@ -102,9 +100,7 @@ def test_dispatches_correctly(self, tool_manager, mock_store): """ToolManager.execute_tool dispatches to the right tool.""" mock_store.search.return_value = make_valid_search_results(1) - result = tool_manager.execute_tool( - "search_course_content", query="test query" - ) + result = tool_manager.execute_tool("search_course_content", query="test query") mock_store.search.assert_called_once_with( query="test query", course_name=None, lesson_number=None diff --git a/backend/vector_store.py b/backend/vector_store.py index 3fe1e3089..c14e2f03c 100644 --- a/backend/vector_store.py +++ b/backend/vector_store.py @@ -5,73 +5,88 @@ from models import Course, CourseChunk from sentence_transformers import SentenceTransformer + @dataclass class SearchResults: """Container for search results with metadata""" + documents: List[str] metadata: List[Dict[str, Any]] distances: List[float] error: Optional[str] = None - + @classmethod - def from_chroma(cls, chroma_results: Dict) -> 'SearchResults': + def from_chroma(cls, chroma_results: Dict) -> "SearchResults": """Create SearchResults from ChromaDB query results""" return cls( - documents=chroma_results['documents'][0] if chroma_results['documents'] else [], - metadata=chroma_results['metadatas'][0] if chroma_results['metadatas'] else [], - distances=chroma_results['distances'][0] if chroma_results['distances'] else [] + documents=( + chroma_results["documents"][0] if chroma_results["documents"] else [] + ), + metadata=( + chroma_results["metadatas"][0] if chroma_results["metadatas"] else [] + ), + distances=( + chroma_results["distances"][0] if chroma_results["distances"] else [] + ), ) - + @classmethod - def empty(cls, error_msg: str) -> 'SearchResults': + def empty(cls, error_msg: str) -> "SearchResults": """Create empty results with error message""" return cls(documents=[], metadata=[], distances=[], error=error_msg) - + def is_empty(self) -> bool: """Check if results are empty""" return len(self.documents) == 0 + class VectorStore: """Vector storage using ChromaDB for course content and metadata""" - + def __init__(self, chroma_path: str, embedding_model: str, max_results: int = 5): self.max_results = max_results # Initialize ChromaDB client self.client = chromadb.PersistentClient( - path=chroma_path, - settings=Settings(anonymized_telemetry=False) + path=chroma_path, settings=Settings(anonymized_telemetry=False) ) - + # Set up sentence transformer embedding function - self.embedding_function = chromadb.utils.embedding_functions.SentenceTransformerEmbeddingFunction( - model_name=embedding_model + self.embedding_function = ( + chromadb.utils.embedding_functions.SentenceTransformerEmbeddingFunction( + model_name=embedding_model + ) ) - + # Create collections for different types of data - self.course_catalog = self._create_collection("course_catalog") # Course titles/instructors - self.course_content = self._create_collection("course_content") # Actual course material - + self.course_catalog = self._create_collection( + "course_catalog" + ) # Course titles/instructors + self.course_content = self._create_collection( + "course_content" + ) # Actual course material + def _create_collection(self, name: str): """Create or get a ChromaDB collection""" return self.client.get_or_create_collection( - name=name, - embedding_function=self.embedding_function + name=name, embedding_function=self.embedding_function ) - - def search(self, - query: str, - course_name: Optional[str] = None, - lesson_number: Optional[int] = None, - limit: Optional[int] = None) -> SearchResults: + + def search( + self, + query: str, + course_name: Optional[str] = None, + lesson_number: Optional[int] = None, + limit: Optional[int] = None, + ) -> SearchResults: """ Main search interface that handles course resolution and content search. - + Args: query: What to search for in course content course_name: Optional course name/title to filter by lesson_number: Optional lesson number to filter by limit: Maximum results to return - + Returns: SearchResults object with documents and metadata """ @@ -81,104 +96,111 @@ def search(self, course_title = self._resolve_course_name(course_name) if not course_title: return SearchResults.empty(f"No course found matching '{course_name}'") - + # Step 2: Build filter for content search filter_dict = self._build_filter(course_title, lesson_number) - + # Step 3: Search course content # Use provided limit or fall back to configured max_results search_limit = limit if limit is not None else self.max_results - + try: results = self.course_content.query( - query_texts=[query], - n_results=search_limit, - where=filter_dict + query_texts=[query], n_results=search_limit, where=filter_dict ) return SearchResults.from_chroma(results) except Exception as e: return SearchResults.empty(f"Search error: {str(e)}") - + def _resolve_course_name(self, course_name: str) -> Optional[str]: """Use vector search to find best matching course by name""" try: - results = self.course_catalog.query( - query_texts=[course_name], - n_results=1 - ) - - if results['documents'][0] and results['metadatas'][0]: + results = self.course_catalog.query(query_texts=[course_name], n_results=1) + + if results["documents"][0] and results["metadatas"][0]: # Return the title (which is now the ID) - return results['metadatas'][0][0]['title'] + return results["metadatas"][0][0]["title"] except Exception as e: print(f"Error resolving course name: {e}") - + return None - - def _build_filter(self, course_title: Optional[str], lesson_number: Optional[int]) -> Optional[Dict]: + + def _build_filter( + self, course_title: Optional[str], lesson_number: Optional[int] + ) -> Optional[Dict]: """Build ChromaDB filter from search parameters""" if not course_title and lesson_number is None: return None - + # Handle different filter combinations if course_title and lesson_number is not None: - return {"$and": [ - {"course_title": course_title}, - {"lesson_number": lesson_number} - ]} - + return { + "$and": [ + {"course_title": course_title}, + {"lesson_number": lesson_number}, + ] + } + if course_title: return {"course_title": course_title} - + return {"lesson_number": lesson_number} - + def add_course_metadata(self, course: Course): """Add course information to the catalog for semantic search""" import json course_text = course.title - + # Build lessons metadata and serialize as JSON string lessons_metadata = [] for lesson in course.lessons: - lessons_metadata.append({ - "lesson_number": lesson.lesson_number, - "lesson_title": lesson.title, - "lesson_link": lesson.lesson_link - }) - + lessons_metadata.append( + { + "lesson_number": lesson.lesson_number, + "lesson_title": lesson.title, + "lesson_link": lesson.lesson_link, + } + ) + self.course_catalog.add( documents=[course_text], - metadatas=[{ - "title": course.title, - "instructor": course.instructor, - "course_link": course.course_link, - "lessons_json": json.dumps(lessons_metadata), # Serialize as JSON string - "lesson_count": len(course.lessons) - }], - ids=[course.title] + metadatas=[ + { + "title": course.title, + "instructor": course.instructor, + "course_link": course.course_link, + "lessons_json": json.dumps( + lessons_metadata + ), # Serialize as JSON string + "lesson_count": len(course.lessons), + } + ], + ids=[course.title], ) - + def add_course_content(self, chunks: List[CourseChunk]): """Add course content chunks to the vector store""" if not chunks: return - + documents = [chunk.content for chunk in chunks] - metadatas = [{ - "course_title": chunk.course_title, - "lesson_number": chunk.lesson_number, - "chunk_index": chunk.chunk_index - } for chunk in chunks] + metadatas = [ + { + "course_title": chunk.course_title, + "lesson_number": chunk.lesson_number, + "chunk_index": chunk.chunk_index, + } + for chunk in chunks + ] # Use title with chunk index for unique IDs - ids = [f"{chunk.course_title.replace(' ', '_')}_{chunk.chunk_index}" for chunk in chunks] - - self.course_content.add( - documents=documents, - metadatas=metadatas, - ids=ids - ) - + ids = [ + f"{chunk.course_title.replace(' ', '_')}_{chunk.chunk_index}" + for chunk in chunks + ] + + self.course_content.add(documents=documents, metadatas=metadatas, ids=ids) + def clear_all_data(self): """Clear all data from both collections""" try: @@ -189,43 +211,46 @@ def clear_all_data(self): self.course_content = self._create_collection("course_content") except Exception as e: print(f"Error clearing data: {e}") - + def get_existing_course_titles(self) -> List[str]: """Get all existing course titles from the vector store""" try: # Get all documents from the catalog results = self.course_catalog.get() - if results and 'ids' in results: - return results['ids'] + if results and "ids" in results: + return results["ids"] return [] except Exception as e: print(f"Error getting existing course titles: {e}") return [] - + def get_course_count(self) -> int: """Get the total number of courses in the vector store""" try: results = self.course_catalog.get() - if results and 'ids' in results: - return len(results['ids']) + if results and "ids" in results: + return len(results["ids"]) return 0 except Exception as e: print(f"Error getting course count: {e}") return 0 - + def get_all_courses_metadata(self) -> List[Dict[str, Any]]: """Get metadata for all courses in the vector store""" import json + try: results = self.course_catalog.get() - if results and 'metadatas' in results: + if results and "metadatas" in results: # Parse lessons JSON for each course parsed_metadata = [] - for metadata in results['metadatas']: + for metadata in results["metadatas"]: course_meta = metadata.copy() - if 'lessons_json' in course_meta: - course_meta['lessons'] = json.loads(course_meta['lessons_json']) - del course_meta['lessons_json'] # Remove the JSON string version + if "lessons_json" in course_meta: + course_meta["lessons"] = json.loads(course_meta["lessons_json"]) + del course_meta[ + "lessons_json" + ] # Remove the JSON string version parsed_metadata.append(course_meta) return parsed_metadata return [] @@ -238,29 +263,30 @@ def get_course_link(self, course_title: str) -> Optional[str]: try: # Get course by ID (title is the ID) results = self.course_catalog.get(ids=[course_title]) - if results and 'metadatas' in results and results['metadatas']: - metadata = results['metadatas'][0] - return metadata.get('course_link') + if results and "metadatas" in results and results["metadatas"]: + metadata = results["metadatas"][0] + return metadata.get("course_link") return None except Exception as e: print(f"Error getting course link: {e}") return None - + def get_lesson_link(self, course_title: str, lesson_number: int) -> Optional[str]: """Get lesson link for a given course title and lesson number""" import json + try: # Get course by ID (title is the ID) results = self.course_catalog.get(ids=[course_title]) - if results and 'metadatas' in results and results['metadatas']: - metadata = results['metadatas'][0] - lessons_json = metadata.get('lessons_json') + if results and "metadatas" in results and results["metadatas"]: + metadata = results["metadatas"][0] + lessons_json = metadata.get("lessons_json") if lessons_json: lessons = json.loads(lessons_json) # Find the lesson with matching number for lesson in lessons: - if lesson.get('lesson_number') == lesson_number: - return lesson.get('lesson_link') + if lesson.get("lesson_number") == lesson_number: + return lesson.get("lesson_link") return None except Exception as e: print(f"Error getting lesson link: {e}") @@ -286,16 +312,16 @@ def get_course_outline(self, course_name: str) -> Optional[Dict[str, Any]]: try: # Get course metadata by ID (title is the ID) results = self.course_catalog.get(ids=[course_title]) - if results and 'metadatas' in results and results['metadatas']: - metadata = results['metadatas'][0] - lessons_json = metadata.get('lessons_json') + if results and "metadatas" in results and results["metadatas"]: + metadata = results["metadatas"][0] + lessons_json = metadata.get("lessons_json") if lessons_json: lessons = json.loads(lessons_json) return { - "course_title": metadata.get('title'), - "course_link": metadata.get('course_link'), - "lessons": lessons + "course_title": metadata.get("title"), + "course_link": metadata.get("course_link"), + "lessons": lessons, } return None except Exception as e: diff --git a/pyproject.toml b/pyproject.toml index 1344b49a6..589914ec9 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -14,3 +14,12 @@ dependencies = [ "python-dotenv==1.1.1", "pytest>=8.0", ] + +[dependency-groups] +dev = [ + "black>=24.0", +] + +[tool.black] +line-length = 88 +target-version = ["py313"] diff --git a/scripts/quality.sh b/scripts/quality.sh new file mode 100644 index 000000000..50a32db7b --- /dev/null +++ b/scripts/quality.sh @@ -0,0 +1,68 @@ +#!/bin/bash +# Run code quality checks for the project + +set -e + +PROJECT_ROOT="$(cd "$(dirname "$0")/.." && pwd)" +cd "$PROJECT_ROOT" + +# Colors for output +GREEN='\033[0;32m' +RED='\033[0;31m' +YELLOW='\033[1;33m' +NC='\033[0m' # No Color + +usage() { + echo "Usage: $0 [command]" + echo "" + echo "Commands:" + echo " format Run black to format all Python files" + echo " check Run black in check mode (no changes, exit 1 if unformatted)" + echo " test Run pytest" + echo " all Run all checks (check + test)" + echo "" + echo "If no command is given, 'all' is used." +} + +run_format() { + echo -e "${YELLOW}Formatting code with black...${NC}" + uv run --group dev black backend/ main.py + echo -e "${GREEN}Formatting complete.${NC}" +} + +run_check() { + echo -e "${YELLOW}Checking formatting with black...${NC}" + if uv run --group dev black --check backend/ main.py; then + echo -e "${GREEN}All files are properly formatted.${NC}" + else + echo -e "${RED}Some files need formatting. Run '$0 format' to fix.${NC}" + return 1 + fi +} + +run_test() { + echo -e "${YELLOW}Running tests...${NC}" + uv run pytest backend/tests/ -v + echo -e "${GREEN}Tests passed.${NC}" +} + +run_all() { + run_check + run_test + echo -e "${GREEN}All quality checks passed.${NC}" +} + +COMMAND="${1:-all}" + +case "$COMMAND" in + format) run_format ;; + check) run_check ;; + test) run_test ;; + all) run_all ;; + -h|--help) usage ;; + *) + echo -e "${RED}Unknown command: $COMMAND${NC}" + usage + exit 1 + ;; +esac diff --git a/uv.lock b/uv.lock index c06a7c150..af7c7306e 100644 --- a/uv.lock +++ b/uv.lock @@ -110,6 +110,33 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/a9/cf/45fb5261ece3e6b9817d3d82b2f343a505fd58674a92577923bc500bd1aa/bcrypt-4.3.0-cp39-abi3-win_amd64.whl", hash = "sha256:e53e074b120f2877a35cc6c736b8eb161377caae8925c17688bd46ba56daaa5b", size = 152799, upload-time = "2025-02-28T01:23:53.139Z" }, ] +[[package]] +name = "black" +version = "26.1.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "click" }, + { name = "mypy-extensions" }, + { name = "packaging" }, + { name = "pathspec" }, + { name = "platformdirs" }, + { name = "pytokens" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/13/88/560b11e521c522440af991d46848a2bde64b5f7202ec14e1f46f9509d328/black-26.1.0.tar.gz", hash = "sha256:d294ac3340eef9c9eb5d29288e96dc719ff269a88e27b396340459dd85da4c58", size = 658785, upload-time = "2026-01-18T04:50:11.993Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/79/04/fa2f4784f7237279332aa735cdfd5ae2e7730db0072fb2041dadda9ae551/black-26.1.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:ba1d768fbfb6930fc93b0ecc32a43d8861ded16f47a40f14afa9bb04ab93d304", size = 1877781, upload-time = "2026-01-18T04:59:39.054Z" }, + { url = "https://files.pythonhosted.org/packages/cf/ad/5a131b01acc0e5336740a039628c0ab69d60cf09a2c87a4ec49f5826acda/black-26.1.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:2b807c240b64609cb0e80d2200a35b23c7df82259f80bef1b2c96eb422b4aac9", size = 1699670, upload-time = "2026-01-18T04:59:41.005Z" }, + { url = "https://files.pythonhosted.org/packages/da/7c/b05f22964316a52ab6b4265bcd52c0ad2c30d7ca6bd3d0637e438fc32d6e/black-26.1.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:1de0f7d01cc894066a1153b738145b194414cc6eeaad8ef4397ac9abacf40f6b", size = 1775212, upload-time = "2026-01-18T04:59:42.545Z" }, + { url = "https://files.pythonhosted.org/packages/a6/a3/e8d1526bea0446e040193185353920a9506eab60a7d8beb062029129c7d2/black-26.1.0-cp313-cp313-win_amd64.whl", hash = "sha256:91a68ae46bf07868963671e4d05611b179c2313301bd756a89ad4e3b3db2325b", size = 1409953, upload-time = "2026-01-18T04:59:44.357Z" }, + { url = "https://files.pythonhosted.org/packages/c7/5a/d62ebf4d8f5e3a1daa54adaab94c107b57be1b1a2f115a0249b41931e188/black-26.1.0-cp313-cp313-win_arm64.whl", hash = "sha256:be5e2fe860b9bd9edbf676d5b60a9282994c03fbbd40fe8f5e75d194f96064ca", size = 1217707, upload-time = "2026-01-18T04:59:45.719Z" }, + { url = "https://files.pythonhosted.org/packages/6a/83/be35a175aacfce4b05584ac415fd317dd6c24e93a0af2dcedce0f686f5d8/black-26.1.0-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:9dc8c71656a79ca49b8d3e2ce8103210c9481c57798b48deeb3a8bb02db5f115", size = 1871864, upload-time = "2026-01-18T04:59:47.586Z" }, + { url = "https://files.pythonhosted.org/packages/a5/f5/d33696c099450b1274d925a42b7a030cd3ea1f56d72e5ca8bbed5f52759c/black-26.1.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:b22b3810451abe359a964cc88121d57f7bce482b53a066de0f1584988ca36e79", size = 1701009, upload-time = "2026-01-18T04:59:49.443Z" }, + { url = "https://files.pythonhosted.org/packages/1b/87/670dd888c537acb53a863bc15abbd85b22b429237d9de1b77c0ed6b79c42/black-26.1.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:53c62883b3f999f14e5d30b5a79bd437236658ad45b2f853906c7cbe79de00af", size = 1767806, upload-time = "2026-01-18T04:59:50.769Z" }, + { url = "https://files.pythonhosted.org/packages/fe/9c/cd3deb79bfec5bcf30f9d2100ffeec63eecce826eb63e3961708b9431ff1/black-26.1.0-cp314-cp314-win_amd64.whl", hash = "sha256:f016baaadc423dc960cdddf9acae679e71ee02c4c341f78f3179d7e4819c095f", size = 1433217, upload-time = "2026-01-18T04:59:52.218Z" }, + { url = "https://files.pythonhosted.org/packages/4e/29/f3be41a1cf502a283506f40f5d27203249d181f7a1a2abce1c6ce188035a/black-26.1.0-cp314-cp314-win_arm64.whl", hash = "sha256:66912475200b67ef5a0ab665011964bf924745103f51977a78b4fb92a9fc1bf0", size = 1245773, upload-time = "2026-01-18T04:59:54.457Z" }, + { url = "https://files.pythonhosted.org/packages/e4/3d/51bdb3ecbfadfaf825ec0c75e1de6077422b4afa2091c6c9ba34fbfc0c2d/black-26.1.0-py3-none-any.whl", hash = "sha256:1054e8e47ebd686e078c0bb0eaf31e6ce69c966058d122f2c0c950311f9f3ede", size = 204010, upload-time = "2026-01-18T04:50:09.978Z" }, +] + [[package]] name = "build" version = "1.2.2.post1" @@ -667,6 +694,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/43/e3/7d92a15f894aa0c9c4b49b8ee9ac9850d6e63b03c9c32c0367a13ae62209/mpmath-1.3.0-py3-none-any.whl", hash = "sha256:a0b2b9fe80bbcd81a6647ff13108738cfb482d481d826cc0e02f5b35e5c88d2c", size = 536198, upload-time = "2023-03-07T16:47:09.197Z" }, ] +[[package]] +name = "mypy-extensions" +version = "1.1.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/a2/6e/371856a3fb9d31ca8dac321cda606860fa4548858c0cc45d9d1d4ca2628b/mypy_extensions-1.1.0.tar.gz", hash = "sha256:52e68efc3284861e772bbcd66823fde5ae21fd2fdb51c62a211403730b916558", size = 6343, upload-time = "2025-04-22T14:54:24.164Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/79/7b/2c79738432f5c924bef5071f933bcc9efd0473bac3b4aa584a6f7c1c8df8/mypy_extensions-1.1.0-py3-none-any.whl", hash = "sha256:1be4cccdb0f2482337c4743e60421de3a356cd97508abadd57d47403e94f5505", size = 4963, upload-time = "2025-04-22T14:54:22.983Z" }, +] + [[package]] name = "networkx" version = "3.5" @@ -992,6 +1028,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/20/12/38679034af332785aac8774540895e234f4d07f7545804097de4b666afd8/packaging-25.0-py3-none-any.whl", hash = "sha256:29572ef2b1f17581046b3a2227d5c611fb25ec70ca1ba8554b24b0e69331a484", size = 66469, upload-time = "2025-04-19T11:48:57.875Z" }, ] +[[package]] +name = "pathspec" +version = "1.0.4" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/fa/36/e27608899f9b8d4dff0617b2d9ab17ca5608956ca44461ac14ac48b44015/pathspec-1.0.4.tar.gz", hash = "sha256:0210e2ae8a21a9137c0d470578cb0e595af87edaa6ebf12ff176f14a02e0e645", size = 131200, upload-time = "2026-01-27T03:59:46.938Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ef/3c/2c197d226f9ea224a9ab8d197933f9da0ae0aac5b6e0f884e2b8d9c8e9f7/pathspec-1.0.4-py3-none-any.whl", hash = "sha256:fb6ae2fd4e7c921a165808a552060e722767cfa526f99ca5156ed2ce45a5c723", size = 55206, upload-time = "2026-01-27T03:59:45.137Z" }, +] + [[package]] name = "pillow" version = "11.3.0" @@ -1047,6 +1092,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/89/c7/5572fa4a3f45740eaab6ae86fcdf7195b55beac1371ac8c619d880cfe948/pillow-11.3.0-cp314-cp314t-win_arm64.whl", hash = "sha256:79ea0d14d3ebad43ec77ad5272e6ff9bba5b679ef73375ea760261207fa8e0aa", size = 2512835, upload-time = "2025-07-01T09:15:50.399Z" }, ] +[[package]] +name = "platformdirs" +version = "4.9.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/1b/04/fea538adf7dbbd6d186f551d595961e564a3b6715bdf276b477460858672/platformdirs-4.9.2.tar.gz", hash = "sha256:9a33809944b9db043ad67ca0db94b14bf452cc6aeaac46a88ea55b26e2e9d291", size = 28394, upload-time = "2026-02-16T03:56:10.574Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/48/31/05e764397056194206169869b50cf2fee4dbbbc71b344705b9c0d878d4d8/platformdirs-4.9.2-py3-none-any.whl", hash = "sha256:9170634f126f8efdae22fb58ae8a0eaa86f38365bc57897a6c4f781d1f5875bd", size = 21168, upload-time = "2026-02-16T03:56:08.891Z" }, +] + [[package]] name = "pluggy" version = "1.6.0" @@ -1271,6 +1325,30 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/45/58/38b5afbc1a800eeea951b9285d3912613f2603bdf897a4ab0f4bd7f405fc/python_multipart-0.0.20-py3-none-any.whl", hash = "sha256:8a62d3a8335e06589fe01f2a3e178cdcc632f3fbe0d492ad9ee0ec35aab1f104", size = 24546, upload-time = "2024-12-16T19:45:44.423Z" }, ] +[[package]] +name = "pytokens" +version = "0.4.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/b6/34/b4e015b99031667a7b960f888889c5bd34ef585c85e1cb56a594b92836ac/pytokens-0.4.1.tar.gz", hash = "sha256:292052fe80923aae2260c073f822ceba21f3872ced9a68bb7953b348e561179a", size = 23015, upload-time = "2026-01-30T01:03:45.924Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/cb/dc/08b1a080372afda3cceb4f3c0a7ba2bde9d6a5241f1edb02a22a019ee147/pytokens-0.4.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:8bdb9d0ce90cbf99c525e75a2fa415144fd570a1ba987380190e8b786bc6ef9b", size = 160720, upload-time = "2026-01-30T01:03:13.843Z" }, + { url = "https://files.pythonhosted.org/packages/64/0c/41ea22205da480837a700e395507e6a24425151dfb7ead73343d6e2d7ffe/pytokens-0.4.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5502408cab1cb18e128570f8d598981c68a50d0cbd7c61312a90507cd3a1276f", size = 254204, upload-time = "2026-01-30T01:03:14.886Z" }, + { url = "https://files.pythonhosted.org/packages/e0/d2/afe5c7f8607018beb99971489dbb846508f1b8f351fcefc225fcf4b2adc0/pytokens-0.4.1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:29d1d8fb1030af4d231789959f21821ab6325e463f0503a61d204343c9b355d1", size = 268423, upload-time = "2026-01-30T01:03:15.936Z" }, + { url = "https://files.pythonhosted.org/packages/68/d4/00ffdbd370410c04e9591da9220a68dc1693ef7499173eb3e30d06e05ed1/pytokens-0.4.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:970b08dd6b86058b6dc07efe9e98414f5102974716232d10f32ff39701e841c4", size = 266859, upload-time = "2026-01-30T01:03:17.458Z" }, + { url = "https://files.pythonhosted.org/packages/a7/c9/c3161313b4ca0c601eeefabd3d3b576edaa9afdefd32da97210700e47652/pytokens-0.4.1-cp313-cp313-win_amd64.whl", hash = "sha256:9bd7d7f544d362576be74f9d5901a22f317efc20046efe2034dced238cbbfe78", size = 103520, upload-time = "2026-01-30T01:03:18.652Z" }, + { url = "https://files.pythonhosted.org/packages/8f/a7/b470f672e6fc5fee0a01d9e75005a0e617e162381974213a945fcd274843/pytokens-0.4.1-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:4a14d5f5fc78ce85e426aa159489e2d5961acf0e47575e08f35584009178e321", size = 160821, upload-time = "2026-01-30T01:03:19.684Z" }, + { url = "https://files.pythonhosted.org/packages/80/98/e83a36fe8d170c911f864bfded690d2542bfcfacb9c649d11a9e6eb9dc41/pytokens-0.4.1-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:97f50fd18543be72da51dd505e2ed20d2228c74e0464e4262e4899797803d7fa", size = 254263, upload-time = "2026-01-30T01:03:20.834Z" }, + { url = "https://files.pythonhosted.org/packages/0f/95/70d7041273890f9f97a24234c00b746e8da86df462620194cef1d411ddeb/pytokens-0.4.1-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:dc74c035f9bfca0255c1af77ddd2d6ae8419012805453e4b0e7513e17904545d", size = 268071, upload-time = "2026-01-30T01:03:21.888Z" }, + { url = "https://files.pythonhosted.org/packages/da/79/76e6d09ae19c99404656d7db9c35dfd20f2086f3eb6ecb496b5b31163bad/pytokens-0.4.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:f66a6bbe741bd431f6d741e617e0f39ec7257ca1f89089593479347cc4d13324", size = 271716, upload-time = "2026-01-30T01:03:23.633Z" }, + { url = "https://files.pythonhosted.org/packages/79/37/482e55fa1602e0a7ff012661d8c946bafdc05e480ea5a32f4f7e336d4aa9/pytokens-0.4.1-cp314-cp314-win_amd64.whl", hash = "sha256:b35d7e5ad269804f6697727702da3c517bb8a5228afa450ab0fa787732055fc9", size = 104539, upload-time = "2026-01-30T01:03:24.788Z" }, + { url = "https://files.pythonhosted.org/packages/30/e8/20e7db907c23f3d63b0be3b8a4fd1927f6da2395f5bcc7f72242bb963dfe/pytokens-0.4.1-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:8fcb9ba3709ff77e77f1c7022ff11d13553f3c30299a9fe246a166903e9091eb", size = 168474, upload-time = "2026-01-30T01:03:26.428Z" }, + { url = "https://files.pythonhosted.org/packages/d6/81/88a95ee9fafdd8f5f3452107748fd04c24930d500b9aba9738f3ade642cc/pytokens-0.4.1-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:79fc6b8699564e1f9b521582c35435f1bd32dd06822322ec44afdeba666d8cb3", size = 290473, upload-time = "2026-01-30T01:03:27.415Z" }, + { url = "https://files.pythonhosted.org/packages/cf/35/3aa899645e29b6375b4aed9f8d21df219e7c958c4c186b465e42ee0a06bf/pytokens-0.4.1-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d31b97b3de0f61571a124a00ffe9a81fb9939146c122c11060725bd5aea79975", size = 303485, upload-time = "2026-01-30T01:03:28.558Z" }, + { url = "https://files.pythonhosted.org/packages/52/a0/07907b6ff512674d9b201859f7d212298c44933633c946703a20c25e9d81/pytokens-0.4.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:967cf6e3fd4adf7de8fc73cd3043754ae79c36475c1c11d514fc72cf5490094a", size = 306698, upload-time = "2026-01-30T01:03:29.653Z" }, + { url = "https://files.pythonhosted.org/packages/39/2a/cbbf9250020a4a8dd53ba83a46c097b69e5eb49dd14e708f496f548c6612/pytokens-0.4.1-cp314-cp314t-win_amd64.whl", hash = "sha256:584c80c24b078eec1e227079d56dc22ff755e0ba8654d8383b2c549107528918", size = 116287, upload-time = "2026-01-30T01:03:30.912Z" }, + { url = "https://files.pythonhosted.org/packages/c6/78/397db326746f0a342855b81216ae1f0a32965deccfd7c830a2dbc66d2483/pytokens-0.4.1-py3-none-any.whl", hash = "sha256:26cef14744a8385f35d0e095dc8b3a7583f6c953c2e3d269c7f82484bf5ad2de", size = 13729, upload-time = "2026-01-30T01:03:45.029Z" }, +] + [[package]] name = "pyyaml" version = "6.0.2" @@ -1596,6 +1674,11 @@ dependencies = [ { name = "uvicorn" }, ] +[package.dev-dependencies] +dev = [ + { name = "black" }, +] + [package.metadata] requires-dist = [ { name = "anthropic", specifier = "==0.58.2" }, @@ -1608,6 +1691,9 @@ requires-dist = [ { name = "uvicorn", specifier = "==0.35.0" }, ] +[package.metadata.requires-dev] +dev = [{ name = "black", specifier = ">=24.0" }] + [[package]] name = "sympy" version = "1.14.0" From 7eab2743a646cc1cada885834dd81b5ed4107c12 Mon Sep 17 00:00:00 2001 From: kp1729 Date: Sun, 15 Feb 2026 22:46:52 -0800 Subject: [PATCH 11/16] Add dark/light theme toggle with full CSS variable system - Add sun/moon toggle button (fixed top-right) with smooth icon rotation - Implement complete light theme via CSS custom properties on data-theme attribute - Prevent FOUC with inline head script that applies theme before first paint - Respect OS prefers-color-scheme when no saved preference exists - Persist user choice in localStorage, update on toggle and OS change - Add color-scheme property and meta tag for native browser chrome adaptation - Add Firefox scrollbar support (scrollbar-color) alongside WebKit pseudo-elements - Add themed ::selection, error/success messages, source links, code blocks - Replace all hardcoded colors with CSS variables for full theme coverage - Add .no-transitions suppression class to prevent animations on page load - Add Ctrl+Shift+L keyboard shortcut and dynamic aria-label on toggle button - Ensure WCAG AA contrast ratios on all text-on-background combinations - Document all changes in frontend-changes.md Co-Authored-By: Claude Opus 4.6 --- frontend-changes.md | 165 +++++++++++++++++++++++++++++ frontend/index.html | 36 ++++++- frontend/script.js | 76 +++++++++++++- frontend/style.css | 246 +++++++++++++++++++++++++++++++++++++------- 4 files changed, 483 insertions(+), 40 deletions(-) create mode 100644 frontend-changes.md diff --git a/frontend-changes.md b/frontend-changes.md new file mode 100644 index 000000000..3371786fd --- /dev/null +++ b/frontend-changes.md @@ -0,0 +1,165 @@ +# Frontend Changes + +## Change 1: Dark/Light Theme Toggle Button + +### Summary +Added a theme toggle button (sun/moon icons) in the top-right corner that switches between dark and light modes with smooth CSS transitions. User preference is persisted via `localStorage`. + +### Files Changed + +#### `frontend/index.html` +- Added a `

Course Materials Assistant

Ask questions about courses, instructors, and content

@@ -84,6 +116,6 @@

Course Materials Assistant

- + \ No newline at end of file diff --git a/frontend/script.js b/frontend/script.js index e49f1cfe4..ce410f51c 100644 --- a/frontend/script.js +++ b/frontend/script.js @@ -15,7 +15,8 @@ document.addEventListener('DOMContentLoaded', () => { sendButton = document.getElementById('sendButton'); totalCourses = document.getElementById('totalCourses'); courseTitles = document.getElementById('courseTitles'); - + + initTheme(); setupEventListeners(); createNewSession(); loadCourseStats(); @@ -39,6 +40,12 @@ function setupEventListeners() { }); }); + // Theme toggle + const themeToggle = document.getElementById('themeToggle'); + if (themeToggle) { + themeToggle.addEventListener('click', toggleTheme); + } + // New chat button const newChatButton = document.getElementById('newChatButton'); if (newChatButton) { @@ -213,6 +220,73 @@ async function clearBackendSession(sessionId) { } } +// Theme Toggle +function initTheme() { + // Theme was already applied by the inline

x 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
gp7K&vpd)Io(W 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