Parallel Research Assistant - Persistent, Multi-API Agent
Persistent Parallel research agent combining Search, Extract, and Task APIs with SQLite-backed sessions, history, and user memory across follow-up turns.
A research assistant you can come back to. It combines Parallel's Search, Extract, and Task APIs with Agno persistence: a SQLite-backed session, conversation history, and user memory.
"""
Parallel Research Assistant - Persistent, Multi-API Agent
=========================================================
A research assistant you can come back to. It combines all of Parallel's
agent APIs (Search, Extract, Task) with Agno persistence: a SQLite-backed
session, conversation history, and user memory.
Ask a question, then a follow-up - the assistant remembers what you are
working on and what it already found.
Prerequisites:
- pip install parallel-web
- export PARALLEL_API_KEY=<your-api-key>
"""
from agno.agent import Agent
from agno.db.sqlite import SqliteDb
from agno.models.openai import OpenAIResponses
from agno.tools.parallel import ParallelTools
# ---------------------------------------------------------------------------
# Setup - persistence and tools
# ---------------------------------------------------------------------------
# SqliteDb gives the assistant a place to store sessions and memories.
db = SqliteDb(db_file="tmp/parallel_assistant.db")
# Search + Extract + Task in a single toolkit.
research_tools = ParallelTools(
enable_search=True,
enable_extract=True,
enable_task=True,
default_processor="base",
)
# ---------------------------------------------------------------------------
# Create the Agent
# ---------------------------------------------------------------------------
assistant = Agent(
name="Research Assistant",
model=OpenAIResponses(id="gpt-5.4"),
tools=[research_tools],
db=db,
add_history_to_context=True,
num_history_runs=5,
update_memory_on_run=True,
markdown=True,
instructions=[
"You are a research assistant.",
"Use Search for quick facts, Extract to read specific URLs, and the "
"Task API for deep research that needs citations.",
"Remember what the user is researching across the conversation.",
],
)
# ---------------------------------------------------------------------------
# Run the Agent
# ---------------------------------------------------------------------------
if __name__ == "__main__":
user_id = "researcher@example.com"
session_id = "parallel-research-session"
# First turn - establish the topic.
assistant.print_response(
"I'm evaluating web-research APIs for an agent we're building. "
"Start by finding the main options.",
stream=True,
user_id=user_id,
session_id=session_id,
)
# Follow-up - the assistant remembers the context from the first turn.
assistant.print_response(
"Of those, which support deep research with citations?",
stream=True,
user_id=user_id,
session_id=session_id,
)The two turns share the explicit user and session IDs below. Reuse both IDs to continue that conversation after restarting the script; choose a new session ID for a new conversation and a distinct user ID for another user. History is stored in SQLite, while memory extraction and the relevance of recalled facts depend on the model.
Run the Example
Set up your virtual environment
uv venv --python 3.12
source .venv/bin/activateInstall dependencies
uv pip install -U agno openai parallel-web sqlalchemyExport your API keys
export OPENAI_API_KEY="your_openai_api_key_here"
export PARALLEL_API_KEY="your_parallel_api_key_here"Run the example
Save the code above as research_assistant.py, then run:
python research_assistant.pyFull source: cookbook/integrations/parallel/04_research_assistant.py