Engineering Notes

Engineering Notes

Thoughts and Ideas on AI by Muthukrishnan

Building a Research Assistant with Windsurfs Cascade Agent

30 Dec 2025

Windsurf is an AI-powered IDE that goes beyond code completion. Its Cascade feature is a full coding agent that understands your entire project, generates code across multiple files, runs commands, and debugs issues—all from natural language instructions.

In this article, we’ll use Windsurf to build a research assistant application, demonstrating how Cascade handles complex, multi-file development tasks.

What Makes Windsurf Different

Traditional AI coding tools like GitHub Copilot are reactive—they complete the line you’re writing. Windsurf’s Cascade is proactive:

Setting Up Windsurf

Download from windsurf.com and install. Windsurf is free for basic use, with a Pro tier at $15/month for heavier usage.

On first launch:

  1. Sign in with GitHub or email
  2. Open your project folder
  3. Press Cmd+L (Mac) or Ctrl+L (Windows/Linux) to open Cascade

Building the Research Assistant

We’ll build a CLI research assistant that:

Step 1: Project Setup

Open Cascade and type:

Create a Python project structure for a research assistant CLI.
Include:
- src/research_assistant/main.py (entry point)
- src/research_assistant/search.py (web search module)
- src/research_assistant/summarizer.py (content summarization)
- src/research_assistant/utils.py (helper functions)
- requirements.txt
- README.md

Use click for the CLI framework.

Cascade will:

  1. Create all the files and folders
  2. Set up the package structure with __init__.py files
  3. Add proper imports between modules
  4. Generate a requirements.txt with dependencies

You’ll see the changes appear in your editor, with a diff view showing what’s being created.

Continue the conversation:

Implement the search.py module. It should:
- Use the Tavily API for web search
- Accept a query string and number of results
- Return a list of SearchResult objects with title, url, and snippet
- Handle rate limiting and errors gracefully

Add the Tavily SDK to requirements.txt.

Cascade generates something like:

# src/research_assistant/search.py
from dataclasses import dataclass
from tavily import TavilyClient
import os

@dataclass
class SearchResult:
    title: str
    url: str
    snippet: str
    score: float

class WebSearcher:
    def __init__(self, api_key: str | None = None):
        self.api_key = api_key or os.getenv("TAVILY_API_KEY")
        if not self.api_key:
            raise ValueError("TAVILY_API_KEY not set")
        self.client = TavilyClient(api_key=self.api_key)

    def search(self, query: str, num_results: int = 5) -> list[SearchResult]:
        try:
            response = self.client.search(
                query=query,
                max_results=num_results,
                include_answer=False
            )
            return [
                SearchResult(
                    title=r["title"],
                    url=r["url"],
                    snippet=r["content"][:500],
                    score=r.get("score", 0.0)
                )
                for r in response["results"]
            ]
        except Exception as e:
            print(f"Search error: {e}")
            return []

Step 3: Building the Summarizer

Now implement summarizer.py. It should:
- Use OpenAI's API to summarize web content
- Take a list of SearchResults and create a coherent summary
- Include inline citations like [1], [2]
- Return both the summary and a list of sources

Make it async for better performance.

Cascade writes the summarizer and updates the imports.

Step 4: Wiring It Together

Update main.py to:
- Parse CLI arguments using click (topic, output file, num sources)
- Call the searcher and summarizer
- Save output as markdown with a sources section
- Show a progress spinner during search/summarize

Also add a --verbose flag for debugging.

Step 5: Testing and Debugging

Here’s where Cascade shines. Ask it to run the code:

Run the research assistant with the topic "quantum computing breakthroughs 2025"

Cascade executes the command in the terminal. If there’s an error:

Error: ModuleNotFoundError: No module named 'tavily'

Cascade automatically:

  1. Identifies the missing dependency
  2. Runs pip install tavily-python
  3. Re-runs the command

If there’s a code error, it analyzes the traceback and fixes it:

I see an AttributeError in summarizer.py line 45. The OpenAI client
expects 'messages' not 'prompt'. Let me fix that.

Step 6: Refinement

Once basic functionality works, iterate:

The summary is too long. Limit it to 300 words maximum.
Also add a --format option to choose between markdown and plain text.
Add error handling for when the API rate limit is hit.
Implement exponential backoff with a maximum of 3 retries.
Write unit tests for the search module using pytest.
Mock the Tavily API responses.

Cascade handles each request, modifying the appropriate files.

Advanced Cascade Techniques

Multi-Step Tasks

For complex tasks, break them into steps:

I want to add a caching layer. Let's do this step by step:
1. First, show me how you'd structure the cache module
2. Wait for my approval before implementing

Cascade will outline the approach and wait for confirmation.

Context from Documentation

If you have API docs or specs:

Here's the API specification for the data source:
[paste OpenAPI spec or documentation]

Implement a client module that covers all endpoints.

Debugging Production Issues

Paste error logs directly:

Users are reporting this error in production:

KeyError: 'results' in search.py line 28

The query was "AI safety research papers". Can you identify
possible causes and fix it?

Cascade analyzes the code path, identifies edge cases, and implements fixes.

Tips for Effective Cascade Usage

1. Be Specific

Bad: “Make the code better” Good: “Refactor the search function to use async/await and add retry logic”

2. Provide Context

This is a FastAPI backend that will be deployed on AWS Lambda.
We need cold start times under 500ms. Generate the handler module
with this constraint in mind.

3. Review Before Accepting

Cascade shows diffs before applying changes. Review them carefully—AI can introduce subtle bugs.

4. Use Checkpoints

Before major changes:

Before we refactor the database layer, let me commit the current state.

Then make a git commit as a restore point.

5. Iterate Incrementally

Instead of one massive prompt, build up:

Start with a minimal working version, then we'll add features.

Limitations

Cascade isn’t magic:

Use Cascade as an accelerator, not a replacement for engineering judgment.

Windsurf vs Cursor vs Cline

FeatureWindsurfCursorCline
Project awarenessFullFullFull
Multi-file editsYesYesYes
Command executionNativeYesYes
Self-debuggingYesPartialYes
Pricing$15/mo$20/moFree (BYOK)
Standalone IDEYesYesVS Code extension

Windsurf’s edge is its polish—the UI is smoother, and the agent feels more coherent across long sessions.

What We Built

In about 30 minutes of Cascade interaction, we created:

The key insight: Cascade handles the boilerplate so you can focus on design decisions and edge cases.

What’s Next

As AI coding agents evolve, the developer role shifts from writing code to:

Windsurf and tools like it are the beginning of this shift. The developers who thrive will be those who learn to collaborate effectively with their AI pair programmer.


Try It Yourself

Copy this prompt into your AI coding agent to build this project:

Build a research assistant CLI in Python that:
1. Takes a research topic as input
2. Searches the web using the Tavily API
3. Summarizes findings using OpenAI with inline citations [1], [2]
4. Saves results to markdown with a sources section

Use click for CLI arguments, dataclasses for SearchResult objects, and async
for the summarizer. Include error handling with retry logic. Structure the
project with separate modules: main.py, search.py, summarizer.py, utils.py.
● Intelligence at Every Action

AI Native
Project Management

Stop using tools that bolt on AI as an afterthought. Jovis is built AI-first — smart routing, proactive monitoring, and intelligent workflows from the ground up.