Progress Monitoring
everyrow operations typically take 1–10+ minutes depending on dataset size and operation type. Both the Python SDK and the MCP tools provide progress monitoring and a session URL where you can watch tables update in real-time.
What to Expect
Web UI
Every operation is part of a session, which you can view at https://futuresearch.ai/sessions/<session_id>. You can open it in your browser to see:
- Real-time progress for each row
- Web searches each agent ran and the pages it read
- Explanation for each result, including links to sources
- Data visualizations
Python SDK
To see progress updates while a task is running, use the print_progress callback:
from everyrow import print_progress
result = await task.await_result(on_progress=print_progress)
Output:
0/10 0% | 10 running
2/10 20% | 8 running
4/10 40% | 6 running
6/10 60% | 4 running
8/10 80% | 2 running
10/10 100%
You can also provide a custom on_progress callback for programmatic progress handling (see below).
MCP Tools
When you run an everyrow operation via MCP:
- The tool returns immediately with a session URL
- Progress updates appear every few seconds during execution
- Results are saved as a CSV file when the operation completes
- If you've installed the plugin, a desktop notification (macOS and Linux) tells you when it's done
The workflow:
everyrow_agent → start the operation, get a task_id and session URL
everyrow_progress → check status (blocks for a few seconds, then returns progress)
everyrow_progress → check again (the agent loops automatically)
everyrow_results → download results when complete
The agents handle the polling loop automatically. You'll see progress in the conversation like:
Running: 20/50 complete, 30 running (45s elapsed)
And when it finishes:
Completed: 50/50 (0 failed) in 100s
...
Saved 50 rows to /path/to/output.csv
Python SDK Progress
For printing progress updates as a task runs, use the provided print_progress callback:
from everyrow import print_progress
result = await task.await_result(on_progress=print_progress)
Or provide a custom callback:
from everyrow.generated.models import TaskProgressInfo
def my_progress_handler(progress: TaskProgressInfo):
print(f"{progress.completed}/{progress.total} done, {progress.failed} failed")
result = await task.await_result(on_progress=my_progress_handler)
The callback receives a TaskProgressInfo object and only fires when the progress snapshot changes.